From f423da270331b7226a6cdfb51a7a567b71a3ed8b Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 28 Oct 2025 17:50:07 -0400 Subject: [PATCH 01/10] add draft dimensionality reduction compute --- .../plugins/dimensionalityReduction.tsx | 171 ++++++++++++++++++ .../components/computations/plugins/index.ts | 2 + 2 files changed, 173 insertions(+) create mode 100644 packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx new file mode 100644 index 0000000000..566f7280ae --- /dev/null +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx @@ -0,0 +1,171 @@ +import { useFindEntityAndVariableCollection } from '../../..'; +import { VariableCollectionDescriptor } from '../../../types/variable'; +import { scatterplotVisualization } from '../../visualizations/implementations/ScatterplotVisualization'; +import { ComputationConfigProps, ComputationPlugin } from '../Types'; +import { partial } from 'lodash'; +import { + useConfigChangeHandler, + assertComputationWithConfig, + isNotAbsoluteAbundanceVariableCollection, + partialToCompleteCodec, +} from '../Utils'; +import * as t from 'io-ts'; +import { Computation } from '../../../types/visualization'; +import SingleSelect from '@veupathdb/coreui/lib/components/inputs/SingleSelect'; +import { useMemo } from 'react'; +import ScatterBetadivSVG from '../../visualizations/implementations/selectorIcons/ScatterBetadivSVG'; +import { ComputationStepContainer } from '../ComputationStepContainer'; +import './Plugins.scss'; +import { makeClassNameHelper } from '@veupathdb/wdk-client/lib/Utils/ComponentUtils'; +import { VariableCollectionSingleSelect } from '../../variableSelectors/VariableCollectionSingleSelect'; +import { IsEnabledInPickerParams } from '../../visualizations/VisualizationTypes'; +import { entityTreeToArray } from '../../../utils/study-metadata'; + +const cx = makeClassNameHelper('AppStepConfigurationContainer'); + +export type DimensionalityReductionConfig = t.TypeOf< + typeof DimensionalityReductionConfig +>; +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const DimensionalityReductionConfig = t.partial({ + collectionVariable: VariableCollectionDescriptor, +}); + +const CompleteDimensionalityReductionConfig = partialToCompleteCodec( + DimensionalityReductionConfig +); + +export const plugin: ComputationPlugin = { + configurationComponent: DimensionalityReductionConfiguration, + configurationDescriptionComponent: + DimensionalityReductionConfigDescriptionComponent, + createDefaultConfiguration: () => ({}), + isConfigurationComplete: CompleteDimensionalityReductionConfig.is, + visualizationPlugins: { + scatterplot: scatterplotVisualization + .withOptions({ + getComputedXAxisDetails(config) { + if ( + DimensionalityReductionConfig.is(config) && + config.collectionVariable + ) { + return { + entityId: config.collectionVariable.entityId, + placeholderDisplayName: 'PCA Axis 1', + variableId: 'Axis1', + }; + } + }, + getComputedYAxisDetails(config) { + if ( + DimensionalityReductionConfig.is(config) && + config.collectionVariable + ) { + return { + entityId: config.collectionVariable.entityId, + placeholderDisplayName: 'PCA Axis 2', + variableId: 'Axis2', + }; + } + }, + hideShowMissingnessToggle: true, + hideTrendlines: true, + hideFacetInputs: true, + hideLogScale: true, + returnPointIds: false, + }) + .withSelectorIcon(ScatterBetadivSVG), + }, + isEnabledInPicker: isEnabledInPicker, + studyRequirements: + 'These visualizations are only available for studies with compatible assay data.', +}; + +function DimensionalityReductionConfigDescriptionComponent({ + computation, +}: { + computation: Computation; +}) { + const findEntityAndVariableCollection = useFindEntityAndVariableCollection(); + assertComputationWithConfig(computation, DimensionalityReductionConfig); + const { configuration } = computation.descriptor; + const collectionVariable = + 'collectionVariable' in configuration + ? configuration.collectionVariable + : undefined; + const updatedCollectionVariable = + findEntityAndVariableCollection(collectionVariable); + + return ( +
+

+ Data:{' '} + + {updatedCollectionVariable ? ( + `${updatedCollectionVariable.entity.displayName} > ${updatedCollectionVariable.variableCollection.displayName}` + ) : ( + Not selected + )} + +

+
+ ); +} + +export function DimensionalityReductionConfiguration( + props: ComputationConfigProps +) { + const { + computationAppOverview, + computation, + analysisState, + visualizationId, + } = props; + assertComputationWithConfig(computation, DimensionalityReductionConfig); + const configuration = computation.descriptor.configuration; + + const changeConfigHandler = useConfigChangeHandler( + analysisState, + computation, + visualizationId + ); + + return ( + +
+
+ Data + { + if (typeof value === 'string') return; + changeConfigHandler('collectionVariable', value); + }} + collectionPredicate={isNotAbsoluteAbundanceVariableCollection} + /> +
+
+
+ ); +} + +// Beta div's only requirement of the study is that it contains +// at least one collection +function isEnabledInPicker({ + studyMetadata, +}: IsEnabledInPickerParams): boolean { + if (!studyMetadata) return false; + const entities = entityTreeToArray(studyMetadata.rootEntity); + + // Ensure there are collections in this study. Otherwise, disable app + const studyHasCollections = entities.some( + (entity) => !!entity.collections?.length + ); + + return studyHasCollections; +} diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts b/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts index 58053638d3..a3d3186995 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts @@ -11,10 +11,12 @@ import { plugin as correlationassayassay } from './correlationAssayAssay'; // mb import { plugin as correlation } from './correlation'; // genomics (- vb) import { plugin as selfcorrelation } from './selfCorrelation'; import { plugin as xyrelationships } from './xyRelationships'; +import { plugin as dimensionalityreduction } from './dimensionalityReduction'; export const plugins: Record = { abundance, alphadiv, betadiv, + dimensionalityreduction, differentialabundance, correlationassaymetadata, correlationassayassay, From f844bbb7a75edd69ccc14586b4267c530c1974a3 Mon Sep 17 00:00:00 2001 From: asizemore Date: Wed, 29 Oct 2025 13:24:34 -0400 Subject: [PATCH 02/10] working pca plot --- .../computations/plugins/dimensionalityReduction.tsx | 5 +++-- .../implementations/ScatterplotVisualization.tsx | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx index 566f7280ae..9c2daae0ce 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx @@ -20,6 +20,7 @@ import { makeClassNameHelper } from '@veupathdb/wdk-client/lib/Utils/ComponentUt import { VariableCollectionSingleSelect } from '../../variableSelectors/VariableCollectionSingleSelect'; import { IsEnabledInPickerParams } from '../../visualizations/VisualizationTypes'; import { entityTreeToArray } from '../../../utils/study-metadata'; +import { InputSpec } from '../../visualizations/InputVariables'; const cx = makeClassNameHelper('AppStepConfigurationContainer'); @@ -52,7 +53,7 @@ export const plugin: ComputationPlugin = { return { entityId: config.collectionVariable.entityId, placeholderDisplayName: 'PCA Axis 1', - variableId: 'Axis1', + variableId: 'PC1', }; } }, @@ -64,7 +65,7 @@ export const plugin: ComputationPlugin = { return { entityId: config.collectionVariable.entityId, placeholderDisplayName: 'PCA Axis 2', - variableId: 'Axis2', + variableId: 'PC2', }; } }, diff --git a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx index 668981259d..1455233613 100755 --- a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx +++ b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx @@ -354,6 +354,8 @@ function ScatterplotViz(props: VisualizationProps) { } : null; + console.log('computedXAxisDescriptor:', computedXAxisDescriptor); + // When we only have a computed y axis (and no provided overlay) then the y axis var // can have a "normal" variable descriptor. See abundance app for the funny case of handeling a computed overlay. const computedYAxisDescriptor = computedYAxisDetails @@ -745,8 +747,8 @@ function ScatterplotViz(props: VisualizationProps) { config: { outputEntityId: outputEntity.id, valueSpec: hideTrendlines ? undefined : valueSpecValue, - xAxisVariable: vizConfig.xAxisVariable, - yAxisVariable: vizConfig.yAxisVariable, + xAxisVariable: computedXAxisDescriptor ?? vizConfig.xAxisVariable, + yAxisVariable: computedYAxisDescriptor ?? vizConfig.yAxisVariable, overlayVariable: vizConfig.overlayVariable, facetVariable: vizConfig.facetVariable ? [vizConfig.facetVariable] From eef9f722016dee886888d98ded0bfec316b659f2 Mon Sep 17 00:00:00 2001 From: asizemore Date: Mon, 3 Nov 2025 15:09:23 -0500 Subject: [PATCH 03/10] add sendComputedVariablesInRequest to Options --- .../computations/plugins/dimensionalityReduction.tsx | 1 + .../implementations/ScatterplotVisualization.tsx | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx index 9c2daae0ce..a19b266c22 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx @@ -74,6 +74,7 @@ export const plugin: ComputationPlugin = { hideFacetInputs: true, hideLogScale: true, returnPointIds: false, + sendComputedVariablesInRequest: true, }) .withSelectorIcon(ScatterBetadivSVG), }, diff --git a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx index 1455233613..90e8d2f9be 100755 --- a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx +++ b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx @@ -286,6 +286,7 @@ interface Options hideTrendlines?: boolean; hideLogScale?: boolean; returnPointIds?: boolean; // Determines whether the backend should return the ids of each point in the scatterplot + sendComputedVariablesInRequest?: boolean; // Determines whether computed variable descriptors should be sent to the backend in the data request. } function ScatterplotViz(props: VisualizationProps) { @@ -332,6 +333,7 @@ function ScatterplotViz(props: VisualizationProps) { computedYAxisDetails, computedOverlayVariableDescriptor, providedOverlayVariableDescriptor, + sendComputedVariablesInRequest, ] = useMemo( () => [ options?.getComputedXAxisDetails?.(computation.descriptor.configuration), @@ -340,6 +342,7 @@ function ScatterplotViz(props: VisualizationProps) { computation.descriptor.configuration ), options?.getOverlayVariable?.(computation.descriptor.configuration), + options?.sendComputedVariablesInRequest ?? false, ], [computation.descriptor.configuration, options] ); @@ -747,8 +750,12 @@ function ScatterplotViz(props: VisualizationProps) { config: { outputEntityId: outputEntity.id, valueSpec: hideTrendlines ? undefined : valueSpecValue, - xAxisVariable: computedXAxisDescriptor ?? vizConfig.xAxisVariable, - yAxisVariable: computedYAxisDescriptor ?? vizConfig.yAxisVariable, + xAxisVariable: + (sendComputedVariablesInRequest && computedXAxisDescriptor) || + vizConfig.xAxisVariable, + yAxisVariable: + (sendComputedVariablesInRequest && computedYAxisDescriptor) || + vizConfig.yAxisVariable, overlayVariable: vizConfig.overlayVariable, facetVariable: vizConfig.facetVariable ? [vizConfig.facetVariable] From 44517294c570b5c46d9a2d1dffecc89aba65a252 Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 4 Nov 2025 18:18:37 -0500 Subject: [PATCH 04/10] cleanup --- .../visualizations/implementations/ScatterplotVisualization.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx index 90e8d2f9be..3ed262469c 100755 --- a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx +++ b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx @@ -357,8 +357,6 @@ function ScatterplotViz(props: VisualizationProps) { } : null; - console.log('computedXAxisDescriptor:', computedXAxisDescriptor); - // When we only have a computed y axis (and no provided overlay) then the y axis var // can have a "normal" variable descriptor. See abundance app for the funny case of handeling a computed overlay. const computedYAxisDescriptor = computedYAxisDetails From 730c393654dd77e25c61cd74ecb573770044b709 Mon Sep 17 00:00:00 2001 From: asizemore Date: Wed, 5 Nov 2025 10:24:23 -0500 Subject: [PATCH 05/10] cleanup --- .../computations/plugins/dimensionalityReduction.tsx | 8 ++------ .../implementations/ScatterplotVisualization.tsx | 10 ++++++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx index a19b266c22..e7f5de413e 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx @@ -2,7 +2,6 @@ import { useFindEntityAndVariableCollection } from '../../..'; import { VariableCollectionDescriptor } from '../../../types/variable'; import { scatterplotVisualization } from '../../visualizations/implementations/ScatterplotVisualization'; import { ComputationConfigProps, ComputationPlugin } from '../Types'; -import { partial } from 'lodash'; import { useConfigChangeHandler, assertComputationWithConfig, @@ -11,8 +10,6 @@ import { } from '../Utils'; import * as t from 'io-ts'; import { Computation } from '../../../types/visualization'; -import SingleSelect from '@veupathdb/coreui/lib/components/inputs/SingleSelect'; -import { useMemo } from 'react'; import ScatterBetadivSVG from '../../visualizations/implementations/selectorIcons/ScatterBetadivSVG'; import { ComputationStepContainer } from '../ComputationStepContainer'; import './Plugins.scss'; @@ -20,7 +17,6 @@ import { makeClassNameHelper } from '@veupathdb/wdk-client/lib/Utils/ComponentUt import { VariableCollectionSingleSelect } from '../../variableSelectors/VariableCollectionSingleSelect'; import { IsEnabledInPickerParams } from '../../visualizations/VisualizationTypes'; import { entityTreeToArray } from '../../../utils/study-metadata'; -import { InputSpec } from '../../visualizations/InputVariables'; const cx = makeClassNameHelper('AppStepConfigurationContainer'); @@ -156,8 +152,8 @@ export function DimensionalityReductionConfiguration( ); } -// Beta div's only requirement of the study is that it contains -// at least one collection +// Dimensionality reduction's only requirement of the study is that it contains +// at least one collection. function isEnabledInPicker({ studyMetadata, }: IsEnabledInPickerParams): boolean { diff --git a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx index 3ed262469c..8ed978d7aa 100755 --- a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx +++ b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx @@ -749,11 +749,13 @@ function ScatterplotViz(props: VisualizationProps) { outputEntityId: outputEntity.id, valueSpec: hideTrendlines ? undefined : valueSpecValue, xAxisVariable: - (sendComputedVariablesInRequest && computedXAxisDescriptor) || - vizConfig.xAxisVariable, + sendComputedVariablesInRequest && computedXAxisDescriptor + ? computedXAxisDescriptor + : vizConfig.xAxisVariable, yAxisVariable: - (sendComputedVariablesInRequest && computedYAxisDescriptor) || - vizConfig.yAxisVariable, + sendComputedVariablesInRequest && computedYAxisDescriptor + ? computedYAxisDescriptor + : vizConfig.yAxisVariable, overlayVariable: vizConfig.overlayVariable, facetVariable: vizConfig.facetVariable ? [vizConfig.facetVariable] From e079883ae27bcfd4444e6af41f1c5fd4a021cfc9 Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 11 Nov 2025 16:56:38 -0500 Subject: [PATCH 06/10] dual compute notebook success --- .../plugins/dimensionalityReduction.tsx | 7 ++++++- .../eda/src/lib/notebook/ComputeNotebookCell.tsx | 14 ++++++++++++-- .../eda/src/lib/notebook/EdaNotebookAnalysis.tsx | 3 +++ .../libs/eda/src/lib/notebook/NotebookPresets.tsx | 14 ++++++++++++++ .../libs/eda/src/lib/notebook/NotebookRoute.tsx | 2 +- 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx index e7f5de413e..351e6c6e0a 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx @@ -118,16 +118,21 @@ export function DimensionalityReductionConfiguration( computation, analysisState, visualizationId, + changeConfigHandlerOverride, } = props; assertComputationWithConfig(computation, DimensionalityReductionConfig); const configuration = computation.descriptor.configuration; - const changeConfigHandler = useConfigChangeHandler( + const workspaceChangeConfigHandler = useConfigChangeHandler( analysisState, computation, visualizationId ); + const changeConfigHandler = changeConfigHandlerOverride + ? changeConfigHandlerOverride + : workspaceChangeConfigHandler; + return ( { if (!computation || !analysis.descriptor.computations[0]) return; @@ -61,7 +63,9 @@ export function ComputeNotebookCell( const existingComputation = analysisState.analysis?.descriptor.computations.find( - (comp) => isEqual(comp.descriptor.configuration, updatedConfiguration) //&& + (comp) => + isEqual(comp.computationId, computationId) && + isEqual(comp.descriptor.configuration, updatedConfiguration) ); if (existingComputation) return; @@ -74,7 +78,13 @@ export function ComputeNotebookCell( }, }; - analysisState.setComputations([updatedComputation]); + analysisState.setComputations((computations) => { + return computations.map((comp) => + comp.computationId === computation.computationId + ? updatedComputation + : comp + ); + }); }; const { jobStatus, createJob } = useComputeJobStatus( diff --git a/packages/libs/eda/src/lib/notebook/EdaNotebookAnalysis.tsx b/packages/libs/eda/src/lib/notebook/EdaNotebookAnalysis.tsx index a1292bd74b..8b94fac591 100644 --- a/packages/libs/eda/src/lib/notebook/EdaNotebookAnalysis.tsx +++ b/packages/libs/eda/src/lib/notebook/EdaNotebookAnalysis.tsx @@ -118,8 +118,11 @@ export function EdaNotebookAnalysis(props: Props) { // This ensures that updates are queued and applied in order, even across // multiple recursive calls. notebookPreset.cells.forEach((cell) => processCell(cell)); + console.log('createdcells'); }, [analysis, setComputations, addVisualization, notebookPreset]); + console.log('notebookpreset', notebookPreset); + // // Now we render the notebook directly from the read-only `notebookPreset`, // fetching computations and visualizations from analysisState.analysis where needed. diff --git a/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx b/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx index f2c5f3731b..9649149d9a 100644 --- a/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx +++ b/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx @@ -81,6 +81,20 @@ export const presetNotebooks: Record = { displayName: 'Differential Abundance Notebook', projects: ['MicrobiomeDB'], cells: [ + { + type: 'compute', + title: 'PCA', + computationName: 'dimensionalityreduction', + computationId: 'pca_1', + cells: [ + { + type: 'visualization', + title: 'PCA Plot', + visualizationName: 'scatterplot', + visualizationId: 'pca_1', + }, + ], + }, { type: 'compute', title: 'Differential Abundance', diff --git a/packages/libs/eda/src/lib/notebook/NotebookRoute.tsx b/packages/libs/eda/src/lib/notebook/NotebookRoute.tsx index a99ab74dd2..62398ff1fd 100644 --- a/packages/libs/eda/src/lib/notebook/NotebookRoute.tsx +++ b/packages/libs/eda/src/lib/notebook/NotebookRoute.tsx @@ -70,7 +70,7 @@ export default function NotebookRoute(props: Props) { > From 6082e20ed17c0e808620a611e44ef8954ecb9d4b Mon Sep 17 00:00:00 2001 From: asizemore Date: Wed, 12 Nov 2025 09:35:11 -0500 Subject: [PATCH 07/10] show step number and helper text for pca --- .../computations/plugins/dimensionalityReduction.tsx | 2 ++ .../libs/eda/src/lib/notebook/NotebookPresets.tsx | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx index 351e6c6e0a..71ed6b531f 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/dimensionalityReduction.tsx @@ -119,6 +119,7 @@ export function DimensionalityReductionConfiguration( analysisState, visualizationId, changeConfigHandlerOverride, + showStepNumber = true, } = props; assertComputationWithConfig(computation, DimensionalityReductionConfig); const configuration = computation.descriptor.configuration; @@ -139,6 +140,7 @@ export function DimensionalityReductionConfiguration( stepNumber: 1, stepTitle: `Configure ${computationAppOverview.displayName}`, }} + showStepNumber={showStepNumber} >
diff --git a/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx b/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx index 9649149d9a..7cdc1145f6 100644 --- a/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx +++ b/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx @@ -83,9 +83,18 @@ export const presetNotebooks: Record = { cells: [ { type: 'compute', - title: 'PCA', + title: 'Configure PCA', computationName: 'dimensionalityreduction', computationId: 'pca_1', + helperText: ( + + ), cells: [ { type: 'visualization', From 749db05d9e594f9a076927195869cea03d9dcb61 Mon Sep 17 00:00:00 2001 From: asizemore Date: Thu, 4 Dec 2025 18:44:49 -0500 Subject: [PATCH 08/10] update differential expression notebook to include pca --- .../components/computations/plugins/index.ts | 4 ++-- .../eda/src/lib/notebook/NotebookPresets.tsx | 18 +++++++++--------- .../eda/src/lib/notebook/TextNotebookCell.tsx | 8 +++++++- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts b/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts index 6ab384e7e2..9ba9bd4f22 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts @@ -6,7 +6,7 @@ import { plugin as distributions } from './distributions'; import { plugin as countsandproportions } from './countsAndProportions'; import { plugin as abundance } from './abundance'; import { plugin as differentialabundance } from './differentialabundance'; -// import { plugin as differentialexpression } from './differentialExpression'; +import { plugin as differentialexpression } from './differentialExpression'; import { plugin as correlationassaymetadata } from './correlationAssayMetadata'; // mbio import { plugin as correlationassayassay } from './correlationAssayAssay'; // mbio import { plugin as correlation } from './correlation'; // genomics (- vb) @@ -19,7 +19,7 @@ export const plugins: Record = { betadiv, dimensionalityreduction, differentialabundance, - // differentialexpression, + differentialexpression, correlationassaymetadata, correlationassayassay, correlation, diff --git a/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx b/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx index 30bc4ac306..5aed8168c1 100644 --- a/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx +++ b/packages/libs/eda/src/lib/notebook/NotebookPresets.tsx @@ -129,7 +129,7 @@ export const presetNotebooks: Record = { @@ -177,7 +177,7 @@ export const presetNotebooks: Record = { }, helperText: ( = { title: 'Review and run search', helperText: ( = { if (!analysisState.analysis?.descriptor?.computations?.length) { return
No analysis configuration available
; } - const computation = - analysisState.analysis.descriptor.computations[0]; - if (!computation?.visualizations?.length) { + const differentialExpressionComputation = + analysisState.analysis.descriptor.computations[1]; + if (!differentialExpressionComputation?.visualizations?.length) { return
No visualization configuration available
; } const volcanoPlotConfig = - analysisState.analysis?.descriptor.computations[0] - .visualizations[0].descriptor.configuration; + differentialExpressionComputation.visualizations[0].descriptor + .configuration; if ( !volcanoPlotConfig || @@ -262,7 +262,7 @@ export const presetNotebooks: Record = { }} > To make adjustments, update the volcano plot settings in - step 2. + step 3.
); diff --git a/packages/libs/eda/src/lib/notebook/TextNotebookCell.tsx b/packages/libs/eda/src/lib/notebook/TextNotebookCell.tsx index 1413484c70..123c0343f2 100644 --- a/packages/libs/eda/src/lib/notebook/TextNotebookCell.tsx +++ b/packages/libs/eda/src/lib/notebook/TextNotebookCell.tsx @@ -1,12 +1,18 @@ import ExpandablePanel from '@veupathdb/coreui/lib/components/containers/ExpandablePanel'; import { NotebookCellProps } from './NotebookCell'; import { TextCellDescriptor } from './NotebookPresets'; +import { useMemo } from 'react'; export function TextNotebookCell(props: NotebookCellProps) { const { cell, isDisabled, analysisState } = props; const { text, title, getDynamicContent } = cell; + const dynamicContent = useMemo( + () => getDynamicContent?.(analysisState), + [getDynamicContent, analysisState] + ); + return ( <> {cell.helperText && ( @@ -24,7 +30,7 @@ export function TextNotebookCell(props: NotebookCellProps) { className={'NotebookCellContent' + (isDisabled ? ' disabled' : '')} > {text} - {getDynamicContent && getDynamicContent(analysisState)} + {dynamicContent}
From 931bfe82c6be2441608fdb6245fe828b190287b1 Mon Sep 17 00:00:00 2001 From: asizemore Date: Mon, 8 Dec 2025 12:16:27 -0500 Subject: [PATCH 09/10] ensure consistent calculation of axis variables --- .../computations/plugins/differentialExpression.tsx | 3 +-- .../implementations/ScatterplotVisualization.tsx | 10 ++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/differentialExpression.tsx b/packages/libs/eda/src/lib/core/components/computations/plugins/differentialExpression.tsx index cf08770928..a4e0ef1765 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/differentialExpression.tsx +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/differentialExpression.tsx @@ -2,7 +2,6 @@ import { ContinuousVariableDataShape, DistributionResponse, LabeledRange, - usePromise, useStudyMetadata, } from '../../..'; import { @@ -25,7 +24,7 @@ import { useFindEntityAndVariableCollection, useSubsettingClient, } from '../../../hooks/workspace'; -import { ReactNode, useCallback, useEffect, useMemo, useRef } from 'react'; +import { ReactNode, useEffect, useMemo, useRef } from 'react'; import { ComputationStepContainer } from '../ComputationStepContainer'; import VariableTreeDropdown from '../../variableSelectors/VariableTreeDropdown'; import { ValuePicker } from '../../visualizations/implementations/ValuePicker'; diff --git a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx index 8ed978d7aa..2a728dd982 100755 --- a/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx +++ b/packages/libs/eda/src/lib/core/components/visualizations/implementations/ScatterplotVisualization.tsx @@ -379,8 +379,14 @@ function ScatterplotViz(props: VisualizationProps) { // variables within a viz. Computed overlay was left out intentionally to retain // desired behavior (see PR #38). const variablesForConstraints = useDeepValue({ - xAxisVariable: computedXAxisDescriptor ?? vizConfig.xAxisVariable, - yAxisVariable: computedYAxisDescriptor ?? vizConfig.yAxisVariable, + xAxisVariable: + sendComputedVariablesInRequest && computedXAxisDescriptor + ? computedXAxisDescriptor + : vizConfig.xAxisVariable, + yAxisVariable: + sendComputedVariablesInRequest && computedYAxisDescriptor + ? computedYAxisDescriptor + : vizConfig.yAxisVariable, overlayVariable: vizConfig.overlayVariable && (providedOverlayVariableDescriptor ?? vizConfig.overlayVariable), From 955831643cd7306694d4e331846e80006d265e5e Mon Sep 17 00:00:00 2001 From: asizemore Date: Mon, 8 Dec 2025 12:17:05 -0500 Subject: [PATCH 10/10] temporarily turn off differentialexpression --- .../eda/src/lib/core/components/computations/plugins/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts b/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts index 9ba9bd4f22..6ab384e7e2 100644 --- a/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts +++ b/packages/libs/eda/src/lib/core/components/computations/plugins/index.ts @@ -6,7 +6,7 @@ import { plugin as distributions } from './distributions'; import { plugin as countsandproportions } from './countsAndProportions'; import { plugin as abundance } from './abundance'; import { plugin as differentialabundance } from './differentialabundance'; -import { plugin as differentialexpression } from './differentialExpression'; +// import { plugin as differentialexpression } from './differentialExpression'; import { plugin as correlationassaymetadata } from './correlationAssayMetadata'; // mbio import { plugin as correlationassayassay } from './correlationAssayAssay'; // mbio import { plugin as correlation } from './correlation'; // genomics (- vb) @@ -19,7 +19,7 @@ export const plugins: Record = { betadiv, dimensionalityreduction, differentialabundance, - differentialexpression, + // differentialexpression, correlationassaymetadata, correlationassayassay, correlation,