UNPKG

@decidables/detectable-elements

Version:

detectable-elements: Web Components for visualizing Signal Detection Theory

183 lines (167 loc) 5.34 kB
import {html} from 'lit'; import '@decidables/decidables-elements/spinner'; import SDTMath from '@decidables/detectable-math'; import SDTEquation from './sdt-equation'; /* SDTEquationHrFar2C element <sdt-equation-hrfar2c> Attributes: Hit Rate; False Alarm Rate; d'; */ export default class SDTEquationHrFar2C extends SDTEquation { static get properties() { return { unequal: { attribute: 'unequal', type: Boolean, reflect: true, }, hr: { attribute: 'hit-rate', type: Number, reflect: true, }, far: { attribute: 'false-alarm-rate', type: Number, reflect: true, }, s: { attribute: 's', type: Number, reflect: true, }, c: { attribute: false, type: Number, reflect: false, }, }; } constructor() { super(); this.unequal = false; this.hr = 0; this.far = 0; this.s = 1; this.alignState(); } alignState() { this.c = SDTMath.hrFar2C(this.hr, this.far, this.s); } sendEvent() { this.dispatchEvent(new CustomEvent('sdt-equation-hrfar2c-change', { detail: { hr: this.hr, far: this.far, s: this.s, c: this.c, }, bubbles: true, })); } hrInput(event) { this.hr = parseFloat(event.target.value); this.alignState(); this.sendEvent(); } farInput(event) { this.far = parseFloat(event.target.value); this.alignState(); this.sendEvent(); } sInput(event) { this.s = parseFloat(event.target.value); this.alignState(); this.sendEvent(); } willUpdate() { this.alignState(); } render() { let hr; let far; let s; let c; if (this.numeric) { hr = html` <decidables-spinner class="hr bottom" ?disabled=${!this.interactive} min="0" max="1" step=".001" .value="${this.hr}" @input=${this.hrInput.bind(this)}> <var>Hit Rate</var> </decidables-spinner> `; far = html` <decidables-spinner class="far bottom" ?disabled=${!this.interactive} min="0" max="1" step=".001" .value="${this.far}" @input=${this.farInput.bind(this)}> <var>False Alarm Rate</var> </decidables-spinner> `; s = html` <decidables-spinner class="s bottom" ?disabled=${!this.interactive} min="0" step=".001" .value="${this.s}" @input=${this.sInput.bind(this)}> <var class="math-var">σ</var> </decidables-spinner> `; c = html` <decidables-spinner class="c bottom" disabled step=".001" .value="${+this.c.toFixed(3)}"> <var class="math-var">c</var> </decidables-spinner> `; } else { hr = html`<var class="hr">Hit Rate</var>`; far = html`<var class="far">False Alarm Rate</var>`; s = html`<var class="math-var s">σ</var>`; c = html`<var class="math-var c">c</var>`; } let equation; if (this.unequal) { equation = html` <tr> <td rowspan="2"> ${c}<span class="equals">=</span><span class="bracket tight">(</span> </td> <td class="underline bottom"> <span>1</span><span class="plus tight">+</span><span>${s}<sup class="exp">2</sup></span> </td> <td rowspan="2"> <span class="bracket tight">)<sup class="exp">−½</sup></span><span class="bracket tight">(</span> </td> <td class="underline bottom"> <span class="minus tight"></span>${s} </td> <td rowspan="2"> <span class="bracket tight">)</span><span class="bracket">[</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${hr}<span class="paren tight">)</span><span class="plus">+</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${far}<span class="paren tight">)</span><span class="bracket">]</span> </td> </tr> <tr> <td> <span>2</span> </td> <td> <span><span>1</span><span class="plus">+</span>${s}</span> </td> </tr>`; } else { equation = html` <tr> <td rowspan="2"> ${c}<span class="equals">=</span> </td> <td class="underline"> <span class="minus tight"></span><span class="bracket tight">[</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${hr}<span class="paren tight">)</span><span class="plus">+</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${far}<span class="paren tight">)</span><span class="bracket tight">]</span> </td> </tr> <tr> <td> <span>2</span> </td> </tr>`; } return html` <div class="holder"> <table class="equation"> <tbody> ${equation} </tbody> </table> </div>`; } } customElements.define('sdt-equation-hrfar2c', SDTEquationHrFar2C);