File

components/spectra-data/spectra-data.component.ts

Description

Component with tables for spectra data.

Metadata

Index

Properties
Methods

Constructor

constructor(service: AppService, mathService: MathService, spectraPlotsService: SpectraPlotsService)
Parameters :
Name Type Optional
service AppService No
mathService MathService No
spectraPlotsService SpectraPlotsService No

Methods

serviceResponsesToTableData
serviceResponsesToTableData(options: ServiceResponsesToTableDataOptions)

Convert service responses to table data.

Parameters :
Name Type Optional Description
options ServiceResponsesToTableDataOptions No

The options

Returns : {}
serviceResponseToTableData
serviceResponseToTableData(options: ServiceResponseToTableDataOptions)

Convert a service response to table data.

Parameters :
Name Type Optional Description
options ServiceResponseToTableDataOptions No

The options

Returns : TableData[]
spectraImtRow
spectraImtRow(serviceResponses: ServiceResponses)

Returns the IMTs for the table.

Parameters :
Name Type Optional Description
serviceResponses ServiceResponses No

The service responses

Returns : TableData

Properties

Private models
Default value : `${this.service.formGroup.getRawValue().model}-${this.service.formGroup.getRawValue().modelCompare}`

Model values

spectraComponentsFilename
Default value : `spectra-components-${this.models}.csv`

Filename for hazard components export CSV

spectraComponentsTableData
Default value : computed(() => { const serviceResponses = this.service.serviceResponses(); if (serviceResponses.modelA === null || serviceResponses.modelB === null) { return []; } const imts = this.spectraImtRow(serviceResponses); const spectraFilter = (spectra: Spectra) => spectra.sourceType !== SourceType.TOTAL; return [ imts, ...this.serviceResponsesToTableData({ availableModels: this.service.availableModels(), name: (modelInfo: Parameter, spectra: Spectra) => `${modelInfo.display} - ${sourceTypeToCapitalCase( spectra.sourceType, )}`, returnPeriod: this.service.formGroup.getRawValue().returnPeriod, serviceResponses: this.service.serviceResponses(), spectraFilter, }), ]; })

Table data for response spectra components

spectraDiffFilename
Default value : `spectra-%-diff-${this.models}.csv`

Filename for hazard difference export CSV

spectraDiffTableData
Type : Signal<TableData[]>
Default value : computed(() => { const serviceResponses = this.service.serviceResponses(); if (serviceResponses.modelA === null || serviceResponses.modelB === null) { return []; } const spectraDiff = this.spectraPlotsService.spectraPercentDifference( serviceResponses, this.service.formGroup.getRawValue().returnPeriod, ); return [ this.spectraImtRow(serviceResponses), { td: spectraDiff.percentDifference, th: 'Percent Difference', }, ]; })

Table data for response spectra difference

spectraFilename
Default value : `spectra-compare-${this.models}.csv`

Filename for hazard export CSV

spectraTotalTableData
Default value : computed(() => { const serviceResponses = this.service.serviceResponses(); if (serviceResponses.modelA === null || serviceResponses.modelB === null) { return []; } const imts = this.spectraImtRow(serviceResponses); const spectraFilter = (spectra: Spectra) => spectra.sourceType === SourceType.TOTAL; return [ imts, ...this.serviceResponsesToTableData({ availableModels: this.service.availableModels(), name: (modelInfo: Parameter) => modelInfo.display, returnPeriod: this.service.formGroup.getRawValue().returnPeriod, serviceResponses, spectraFilter, }), ]; })

Table data for response spectra

import {Component, computed, Signal} from '@angular/core';
import {MatAccordion} from '@angular/material/expansion';
import {TableData} from '@ghsc/nshmp-lib-ng/nshmp';
import {
  SourceType,
  sourceTypeToCapitalCase,
} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/model';
import {Parameter} from '@ghsc/nshmp-utils-ts/libs/nshmp-ws-utils/metadata';

import {
  ServiceResponse,
  ServiceResponses,
  Spectra,
} from '../../models/state.model';
import {AppService} from '../../services/app.service';
import {MathService} from '../../services/math.service';
import {SpectraPlotsService} from '../../services/spectra-plots.service';
import {TableDataPanelComponent} from '../table-data-panel/table-data-panel.component';

/**
 * Options for converting service response to table data.
 */
interface ServiceResponseToTableDataOptions extends ToTableDataOptions {
  /** A service response */
  serviceResponse: ServiceResponse;
}

/**
 * Options for converting service responses to table data.
 */
interface ServiceResponsesToTableDataOptions extends ToTableDataOptions {
  /** The service responses */
  serviceResponses: ServiceResponses;
}

/**
 * Options for converting to table data.
 */
interface ToTableDataOptions {
  /** Currently available models */
  availableModels: Parameter[];
  /** Function to return the name of the data */
  name: (modelInfo: Parameter, spectra: Spectra) => string;
  /** Return period value */
  returnPeriod: number;
  /** Function to filter the response spectra data */
  spectraFilter: (spectra: Spectra) => boolean;
}

/**
 * Component with tables for spectra data.
 */
@Component({
  imports: [MatAccordion, TableDataPanelComponent],
  selector: 'app-spectra-data',
  styleUrl: './spectra-data.component.scss',
  templateUrl: './spectra-data.component.html',
})
export class SpectraDataComponent {
  /** Model values */
  private models = `${this.service.formGroup.getRawValue().model}-${this.service.formGroup.getRawValue().modelCompare}`;

  /** Filename for hazard components export CSV */
  spectraComponentsFilename = `spectra-components-${this.models}.csv`;

  /** Filename for hazard difference export CSV */
  spectraDiffFilename = `spectra-%-diff-${this.models}.csv`;

  /** Filename for hazard export CSV */
  spectraFilename = `spectra-compare-${this.models}.csv`;

  /** Table data for response spectra components */
  spectraComponentsTableData = computed(() => {
    const serviceResponses = this.service.serviceResponses();

    if (serviceResponses.modelA === null || serviceResponses.modelB === null) {
      return [];
    }

    const imts = this.spectraImtRow(serviceResponses);

    const spectraFilter = (spectra: Spectra) =>
      spectra.sourceType !== SourceType.TOTAL;

    return [
      imts,
      ...this.serviceResponsesToTableData({
        availableModels: this.service.availableModels(),
        name: (modelInfo: Parameter, spectra: Spectra) =>
          `${modelInfo.display} - ${sourceTypeToCapitalCase(
            spectra.sourceType,
          )}`,
        returnPeriod: this.service.formGroup.getRawValue().returnPeriod,
        serviceResponses: this.service.serviceResponses(),
        spectraFilter,
      }),
    ];
  });

  /** Table data for response spectra difference */
  spectraDiffTableData: Signal<TableData[]> = computed(() => {
    const serviceResponses = this.service.serviceResponses();

    if (serviceResponses.modelA === null || serviceResponses.modelB === null) {
      return [];
    }

    const spectraDiff = this.spectraPlotsService.spectraPercentDifference(
      serviceResponses,
      this.service.formGroup.getRawValue().returnPeriod,
    );

    return [
      this.spectraImtRow(serviceResponses),
      {
        td: spectraDiff.percentDifference,
        th: 'Percent Difference',
      },
    ];
  });

  /** Table data for response spectra */
  spectraTotalTableData = computed(() => {
    const serviceResponses = this.service.serviceResponses();

    if (serviceResponses.modelA === null || serviceResponses.modelB === null) {
      return [];
    }

    const imts = this.spectraImtRow(serviceResponses);

    const spectraFilter = (spectra: Spectra) =>
      spectra.sourceType === SourceType.TOTAL;

    return [
      imts,
      ...this.serviceResponsesToTableData({
        availableModels: this.service.availableModels(),
        name: (modelInfo: Parameter) => modelInfo.display,
        returnPeriod: this.service.formGroup.getRawValue().returnPeriod,
        serviceResponses,
        spectraFilter,
      }),
    ];
  });

  constructor(
    private service: AppService,
    private mathService: MathService,
    private spectraPlotsService: SpectraPlotsService,
  ) {}

  /**
   * Returns the IMTs for the table.
   *
   * @param serviceResponses The service responses
   */
  spectraImtRow(serviceResponses: ServiceResponses): TableData {
    const spectraA = serviceResponses.modelA.spectra.find(
      spectra => spectra.sourceType === SourceType.TOTAL,
    );
    const spectraB = serviceResponses.modelB.spectra.find(
      spectra => spectra.sourceType === SourceType.TOTAL,
    );

    const imtsA = spectraA.responseSpectra.imts;
    const imtsB = spectraB.responseSpectra.imts;

    return {
      td: imtsA.length >= imtsB.length ? imtsA : imtsB,
      th: 'IMT',
    };
  }

  /**
   * Convert a service response to table data.
   *
   * @param options The options
   */
  serviceResponseToTableData(
    options: ServiceResponseToTableDataOptions,
  ): TableData[] {
    return options.serviceResponse.spectra
      .filter(options.spectraFilter)
      .map(spectra => {
        const returnPeriodSpectra =
          spectra.responseSpectra.responseSpectrum.find(
            spectrum => spectrum.returnPeriod === options.returnPeriod,
          );

        const modelInfo = this.mathService.getModelInfo(
          options.serviceResponse.model,
          options.availableModels,
        );

        return {
          td: returnPeriodSpectra.values,
          th: options.name(modelInfo, spectra),
        };
      });
  }

  /**
   * Convert service responses to table data.
   *
   * @param options The options
   */
  serviceResponsesToTableData(options: ServiceResponsesToTableDataOptions) {
    return [
      ...this.serviceResponseToTableData({
        ...options,
        serviceResponse: options.serviceResponses.modelA,
      }),
      ...this.serviceResponseToTableData({
        ...options,
        serviceResponse: options.serviceResponses.modelB,
      }),
    ];
  }
}
<div class="grid-container-widescreen-xl margin-y-3">
  <mat-accordion multi>
    <app-table-data-panel
      [filename]="spectraFilename"
      [tableData]="spectraTotalTableData()"
      panelTitle="Response Spectra: Total"
    />

    <app-table-data-panel
      [filename]="spectraDiffFilename"
      [tableData]="spectraDiffTableData()"
      panelTitle="Response Spectra: Percent Difference"
    />

    <app-table-data-panel
      [filename]="spectraComponentsFilename"
      [tableData]="spectraComponentsTableData()"
      panelTitle="Response Spectra: Components"
    />
  </mat-accordion>
</div>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""