diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.spec.ts b/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.spec.ts index fd0a46d6d38f19e9dfac67bf3ec798431ff503a8..4f360a0d0461623bb0eab626ce9954405594229b 100644 --- a/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.spec.ts +++ b/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.spec.ts @@ -2,6 +2,7 @@ import { Experiment } from '../../../../models/experiment/experiment.model'; import { HeatMapResult } from '../../../../models/result/heat-map-result.model'; import handlers from '..'; import { BarChartResult } from '../../../../models/result/bar-chart-result.model'; +import { Domain } from '../../../../models/domain.model'; const createExperiment = (): Experiment => ({ id: 'dummy-id', @@ -24,6 +25,16 @@ const createExperiment = (): Experiment => ({ results: [], }); +const domain: Domain = { + id: 'dummy-id', + groups: [], + rootGroup: { + id: 'dummy-id', + }, + datasets: [{ id: 'desd-synthdata', label: 'Dead Synthdata' }], + variables: [], +}; + const data = [ { n_obs: 920, @@ -80,7 +91,7 @@ const data = [ describe('PCA result handler', () => { it('Test PCA handler with regular data (no edge cases)', () => { const exp = createExperiment(); - handlers(exp, data, null); + handlers(exp, data, domain); expect(exp.results.length).toBeGreaterThanOrEqual(2); exp.results.forEach((result) => { diff --git a/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.ts b/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.ts index 89c24254270f488810f2df8828c9526c7a00a4e3..23884d9a71a456cabc1eedb13d14aa3eeb92fc34 100644 --- a/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.ts +++ b/api/src/engine/connectors/exareme/handlers/algorithms/PCA.handler.ts @@ -1,3 +1,4 @@ +import { Variable } from 'src/engine/models/variable.model'; import { Domain } from '../../../../models/domain.model'; import { Experiment } from '../../../../models/experiment/experiment.model'; import { BarChartResult } from '../../../../models/result/bar-chart-result.model'; @@ -18,18 +19,13 @@ export default class PCAHandler extends BaseHandler { ); } - handle(exp: Experiment, data: any, domain?: Domain): void { - if (!this.canHandle(exp.algorithm.name, data)) - return this.next?.handle(exp, data, domain); - - const extractedData = data[0]; - - const barChar: BarChartResult = { + private getBarChartResult(data: any): BarChartResult { + const barChart: BarChartResult = { name: 'Eigen values', - barValues: extractedData['eigenvalues'], + barValues: data['eigenvalues'], xAxis: { label: 'Dimensions', - categories: exp.variables.map((_, i) => i + 1).map(String), + categories: data['eigenvalues'].map((_: unknown, i: number) => i + 1), }, hasConnectedBars: true, yAxis: { @@ -37,17 +33,18 @@ export default class PCAHandler extends BaseHandler { }, }; - if (barChar.barValues && barChar.barValues.length > 0) - exp.results.push(barChar); + return barChart; + } - const matrix = extractedData['eigenvectors'] as number[][]; + private getHeatMapResult(data: any, variables: Variable[]): HeatMapResult { + const matrix = data['eigenvectors'] as number[][]; const heatMapChart: HeatMapResult = { name: 'Eigen vectors', matrix, heatMapStyle: HeatMapStyle.BUBBLE, yAxis: { - categories: exp.variables, + categories: variables.map((v) => v.label ?? v.id), }, xAxis: { categories: [...Array(matrix.length).keys()] @@ -62,8 +59,27 @@ export default class PCAHandler extends BaseHandler { ); } + return heatMapChart; + } + + handle(exp: Experiment, data: any, domain: Domain): void { + if (!this.canHandle(exp.algorithm.name, data)) + return this.next?.handle(exp, data, domain); + + const extractedData = data[0]; + + const variables = + exp.variables + ?.map((v) => domain.variables.find((v2) => v2.id === v) ?? { id: v }) + .filter((v) => v) ?? []; + + const barChart = this.getBarChartResult(extractedData); + if (barChart.barValues && barChart.barValues.length > 0) + exp.results.push(barChart); + + const heatMapChart = this.getHeatMapResult(extractedData, variables); if (heatMapChart.matrix) exp.results.push(heatMapChart); - this.next?.handle(exp, data); + this.next?.handle(exp, data, domain); } }