From 8ef39e1e9bd250e8feb487e345f292e67df70f67 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Mon, 24 Feb 2025 14:20:01 -0700
Subject: [PATCH] handle common x values

---
 .../app/gmm/spectra/services/app.service.ts   | 66 ++++++++++++-------
 1 file changed, 42 insertions(+), 24 deletions(-)

diff --git a/projects/nshmp-apps/src/app/gmm/spectra/services/app.service.ts b/projects/nshmp-apps/src/app/gmm/spectra/services/app.service.ts
index 5daf999a3..41e3a34c1 100644
--- a/projects/nshmp-apps/src/app/gmm/spectra/services/app.service.ts
+++ b/projects/nshmp-apps/src/app/gmm/spectra/services/app.service.ts
@@ -29,7 +29,6 @@ import {
 import {Maths} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/calc';
 import {
   GmmGroupType,
-  GmmSeries,
   GmmSpectraResponse,
   GmmSpectraUsage,
   GmmSpectraUsageParameters,
@@ -511,6 +510,20 @@ export class AppService
     });
   }
 
+  private commonXValues(serviceResponses: GmmSpectraResponse[]): number[] {
+    const xValues = serviceResponses
+      .map(serviceResponse =>
+        serviceResponse.response.means.data.map(data => data.data.sa.xs),
+      )
+      .reduce((prev, curr) => [...prev, ...curr])
+      .reduce((prev, curr) => {
+        return [...prev, ...curr.filter(p => !prev.includes(p))];
+      })
+      .sort((a, b) => a - b);
+
+    return xValues;
+  }
+
   private handleServiceResponses(serviceResponses: GmmSpectraResponse[]): void {
     const means = serviceResponses.map(s => s.response.means);
     const sigmas = serviceResponses.map(s => s.response.sigmas);
@@ -638,20 +651,11 @@ export class AppService
    * @param xUnit X axis unit
    * @param yUnit Y axis unit
    */
-  private plotInfo(
-    gmmSeries: GmmSeries<SpectraData, TreeValues>[],
-    xUnit: string,
-    yUnit: string,
-  ) {
-    let hoverTemplate: string[] = [];
-    let symbol: string[] = [];
-
-    if (gmmSeries.length > 0) {
-      hoverTemplate = gmmSeries[0].data.sa.xs.map(
-        () => `%{x} ${xUnit}, %{y} ${yUnit}`,
-      );
-      symbol = gmmSeries[0].data.sa.xs.map(() => 'circle');
-    }
+  private plotInfo(commonXValues: number[], xUnit: string, yUnit: string) {
+    const hoverTemplate = commonXValues.map(
+      () => `%{x} ${xUnit}, %{y} ${yUnit}`,
+    );
+    const symbol = commonXValues.map(() => 'circle');
 
     return {
       hoverTemplate,
@@ -680,17 +684,29 @@ export class AppService
     const sigmaPlot = state.plots.get(gmmUtils.PlotType.SIGMA);
     const formValues = form.getRawValue();
 
-    const xValues = state.serviceResponses
+    const xValues = this.commonXValues(state.serviceResponses);
+
+    const hasPga = state.serviceResponses
       .map(serviceResponse =>
-        serviceResponse.response.means.data.map(data => data.data.sa.xs),
+        serviceResponse.response.means.data.map(data => data.data.pga),
       )
       .reduce((prev, curr) => [...prev, ...curr])
-      .reduce((prev, curr) => {
-        return [...prev, ...curr.filter(p => !prev.includes(p))];
-      })
-      .sort((a, b) => a - b);
+      .some(x => x !== null);
+
+    const hasPgv = state.serviceResponses
+      .map(serviceResponse =>
+        serviceResponse.response.means.data.map(data => data.data.pgv),
+      )
+      .reduce((prev, curr) => [...prev, ...curr])
+      .some(x => x !== null);
 
-    console.log(xValues);
+    if (hasPga) {
+      xValues.splice(0, 0, gmmUtils.XS_PGA);
+    }
+
+    if (hasPgv) {
+      xValues.splice(0, 0, gmmUtils.XS_PGV);
+    }
 
     const responses = this.toGmmResponses(state.serviceResponses);
     const gmmPlots = gmmUtils.spectraResponsesToPlots({
@@ -724,12 +740,14 @@ export class AppService
   private toGmmResponses(
     responses: GmmSpectraResponse[],
   ): gmmUtils.GmmResponse<SpectraData, TreeValues>[] {
+    const commonXValues = this.commonXValues(responses);
+
     const gmmResponses = responses.map(serviceResponse => {
       const means = serviceResponse.response.means;
       const sigmas = serviceResponse.response.sigmas;
 
-      const meanData = this.plotInfo(means.data, 's', 'g');
-      const sigmaData = this.plotInfo(sigmas.data, 's', '𝞂');
+      const meanData = this.plotInfo(commonXValues, 's', 'g');
+      const sigmaData = this.plotInfo(commonXValues, 's', '𝞂');
 
       const gmmResponse: gmmUtils.GmmResponse<SpectraData, TreeValues> = {
         input: serviceResponse.request.input,
-- 
GitLab