diff --git a/cypress/e2e/app.cy.ts b/cypress/e2e/app.cy.ts
index 60c57d170..b03639145 100644
--- a/cypress/e2e/app.cy.ts
+++ b/cypress/e2e/app.cy.ts
@@ -399,29 +399,29 @@ describe('/mock', () => {
}
});
- it('visualize 2D complex signal as NxImage', () => {
+ it('visualize 2D complex signal with "spectrum" interpretation and auxiliaries as NxLine', () => {
cy.selectExplorerNode('nexus_entry');
- cy.selectExplorerNode('complex');
+ cy.selectExplorerNode('complex_spectrum');
cy.findByRole('heading', {
- name: 'nexus_entry / complex',
+ name: 'nexus_entry / complex_spectrum',
}).should('be.visible');
if (Cypress.env('TAKE_SNAPSHOTS')) {
- cy.matchImageSnapshot('nximage_complex_2d');
+ cy.matchImageSnapshot('nxline_complex_2d_aux');
}
});
- it('visualize 2D complex signal with "spectrum" interpretation and auxiliaries as NxLine', () => {
+ it('visualize 2D complex signal as NxImage', () => {
cy.selectExplorerNode('nexus_entry');
- cy.selectExplorerNode('complex_spectrum');
+ cy.selectExplorerNode('complex_image');
cy.findByRole('heading', {
- name: 'nexus_entry / complex_spectrum',
+ name: 'nexus_entry / complex_image',
}).should('be.visible');
if (Cypress.env('TAKE_SNAPSHOTS')) {
- cy.matchImageSnapshot('nxline_complex_2d_aux');
+ cy.matchImageSnapshot('nximage_complex_2d');
}
});
diff --git a/cypress/snapshots/app.cy.ts/auximage.snap.png b/cypress/snapshots/app.cy.ts/auximage.snap.png
index d6eb55764..fdd01432d 100644
Binary files a/cypress/snapshots/app.cy.ts/auximage.snap.png and b/cypress/snapshots/app.cy.ts/auximage.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/auxspectrum.snap.png b/cypress/snapshots/app.cy.ts/auxspectrum.snap.png
index 8e6f7a86c..ff1a62632 100644
Binary files a/cypress/snapshots/app.cy.ts/auxspectrum.snap.png and b/cypress/snapshots/app.cy.ts/auxspectrum.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/logspectrum.snap.png b/cypress/snapshots/app.cy.ts/logspectrum.snap.png
index 7ba462ef2..3eb982627 100644
Binary files a/cypress/snapshots/app.cy.ts/logspectrum.snap.png and b/cypress/snapshots/app.cy.ts/logspectrum.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/nximage.snap.png b/cypress/snapshots/app.cy.ts/nximage.snap.png
index e375bcd59..0a6f985b7 100644
Binary files a/cypress/snapshots/app.cy.ts/nximage.snap.png and b/cypress/snapshots/app.cy.ts/nximage.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/nximage_complex_2d.snap.png b/cypress/snapshots/app.cy.ts/nximage_complex_2d.snap.png
index 0ec2f677d..4de43f04a 100644
Binary files a/cypress/snapshots/app.cy.ts/nximage_complex_2d.snap.png and b/cypress/snapshots/app.cy.ts/nximage_complex_2d.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/nxline.snap.png b/cypress/snapshots/app.cy.ts/nxline.snap.png
index 8228e0c36..097211a08 100644
Binary files a/cypress/snapshots/app.cy.ts/nxline.snap.png and b/cypress/snapshots/app.cy.ts/nxline.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/nxline_complex_2d_aux.snap.png b/cypress/snapshots/app.cy.ts/nxline_complex_2d_aux.snap.png
index c207d05da..b1906c3c0 100644
Binary files a/cypress/snapshots/app.cy.ts/nxline_complex_2d_aux.snap.png and b/cypress/snapshots/app.cy.ts/nxline_complex_2d_aux.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/nxrgb.snap.png b/cypress/snapshots/app.cy.ts/nxrgb.snap.png
index 7e8ee8aac..2cd26c975 100644
Binary files a/cypress/snapshots/app.cy.ts/nxrgb.snap.png and b/cypress/snapshots/app.cy.ts/nxrgb.snap.png differ
diff --git a/cypress/snapshots/app.cy.ts/nxscatter.snap.png b/cypress/snapshots/app.cy.ts/nxscatter.snap.png
index cd116dc58..2cc53c897 100644
Binary files a/cypress/snapshots/app.cy.ts/nxscatter.snap.png and b/cypress/snapshots/app.cy.ts/nxscatter.snap.png differ
diff --git a/packages/app/src/__tests__/NexusPack.test.tsx b/packages/app/src/__tests__/NexusPack.test.tsx
index ba62a6cc6..1c572f6f9 100644
--- a/packages/app/src/__tests__/NexusPack.test.tsx
+++ b/packages/app/src/__tests__/NexusPack.test.tsx
@@ -55,7 +55,7 @@ test('visualize NXdata group without explicit signal interpretation', async () =
expect(screen.getByRole('figure', { name: 'oneD' })).toBeVisible(); // signal name
// 2D complex signal (no interpretation)
- await selectExplorerNode('complex');
+ await selectExplorerNode('complex_image');
expect(getVisTabs()).toEqual([NexusVis.NxSpectrum, NexusVis.NxImage]);
expect(getSelectedVisTab()).toBe(NexusVis.NxImage);
expect(
diff --git a/packages/app/src/providers/mock/mock-file.ts b/packages/app/src/providers/mock/mock-file.ts
index 7d55ef45d..a6bc68158 100644
--- a/packages/app/src/providers/mock/mock-file.ts
+++ b/packages/app/src/providers/mock/mock-file.ts
@@ -219,11 +219,6 @@ export function makeMockFile(): GroupWithChildren {
},
auxAttr: ['secondary', 'tertiary'],
}),
- nxData('complex', {
- signal: array('twoD_cplx'),
- axes: { position: array('position') },
- axesAttr: ['.', 'position'],
- }),
nxData('complex_spectrum', {
signal: withNxAttr(array('twoD_cplx'), {
interpretation: 'spectrum',
@@ -231,6 +226,13 @@ export function makeMockFile(): GroupWithChildren {
auxiliary: { secondary_cplx: array('secondary_cplx') },
auxAttr: ['secondary_cplx'],
}),
+ nxData('complex_image', {
+ signal: array('twoD_cplx'),
+ axes: { position: array('position') },
+ axesAttr: ['.', 'position'],
+ auxiliary: { secondary_cplx: array('secondary_cplx') },
+ auxAttr: ['secondary_cplx'],
+ }),
nxData('rgb-image', {
signal: withImageAttr(
withNxAttr(array('fourD_rgb'), {
diff --git a/packages/app/src/vis-packs/nexus/containers/NxComplexImageContainer.tsx b/packages/app/src/vis-packs/nexus/containers/NxComplexImageContainer.tsx
index cd98986e2..e258553d3 100644
--- a/packages/app/src/vis-packs/nexus/containers/NxComplexImageContainer.tsx
+++ b/packages/app/src/vis-packs/nexus/containers/NxComplexImageContainer.tsx
@@ -1,4 +1,5 @@
import { assertGroup, assertMinDims } from '@h5web/shared/guards';
+import { useState } from 'react';
import DimensionMapper from '../../../dimension-mapper/DimensionMapper';
import { useDimMappingState } from '../../../dimension-mapper/hooks';
@@ -9,7 +10,8 @@ import { getSliceSelection } from '../../core/utils';
import type { VisContainerProps } from '../../models';
import VisBoundary from '../../VisBoundary';
import { assertComplexNxData } from '../guards';
-import { useNxData, useNxValuesCached } from '../hooks';
+import { useNxData, useNxImageDataToFetch, useNxValuesCached } from '../hooks';
+import NxSignalPicker from '../NxSignalPicker';
import NxValuesFetcher from '../NxValuesFetcher';
import { guessKeepRatio } from '../utils';
@@ -20,10 +22,11 @@ function NxComplexImageContainer(props: VisContainerProps) {
const nxData = useNxData(entity);
assertComplexNxData(nxData);
- const { signalDef, axisDefs, silxStyle } = nxData;
- assertMinDims(signalDef.dataset, 2);
+ const { signalDef, axisDefs, auxDefs, silxStyle } = nxData;
+ const [selectedDef, setSelectedDef] = useState(signalDef);
+ assertMinDims(selectedDef.dataset, 2);
- const { shape: dims } = signalDef.dataset;
+ const { shape: dims } = selectedDef.dataset;
const [dimMapping, setDimMapping] = useDimMappingState(dims, 2);
const axisLabels = axisDefs.map((def) => def?.label);
@@ -36,8 +39,16 @@ function NxComplexImageContainer(props: VisContainerProps) {
keepRatio: guessKeepRatio(xAxisDef, yAxisDef),
});
+ const nxDataToFetch = useNxImageDataToFetch(nxData, selectedDef);
+
return (
<>
+ {auxDefs.length > 0 && (
+
+ )}
{
const { signal, axisValues, title } = nxValues;
diff --git a/packages/app/src/vis-packs/nexus/containers/NxImageContainer.tsx b/packages/app/src/vis-packs/nexus/containers/NxImageContainer.tsx
index f9022ac46..008bd9c5e 100644
--- a/packages/app/src/vis-packs/nexus/containers/NxImageContainer.tsx
+++ b/packages/app/src/vis-packs/nexus/containers/NxImageContainer.tsx
@@ -1,5 +1,4 @@
import { assertGroup, assertMinDims } from '@h5web/shared/guards';
-import type { NumericType } from '@h5web/shared/hdf5-models';
import { useState } from 'react';
import DimensionMapper from '../../../dimension-mapper/DimensionMapper';
@@ -10,8 +9,7 @@ import { getSliceSelection } from '../../core/utils';
import type { VisContainerProps } from '../../models';
import VisBoundary from '../../VisBoundary';
import { assertNumericNxData } from '../guards';
-import { useNxData, useNxValuesCached } from '../hooks';
-import type { NxData } from '../models';
+import { useNxData, useNxImageDataToFetch, useNxValuesCached } from '../hooks';
import NxSignalPicker from '../NxSignalPicker';
import NxValuesFetcher from '../NxValuesFetcher';
import { guessKeepRatio } from '../utils';
@@ -39,15 +37,7 @@ function NxImageContainer(props: VisContainerProps) {
keepRatio: guessKeepRatio(xAxisDef, yAxisDef),
});
- const nxDataToFetch: NxData = {
- ...nxData,
- signalDef: selectedDef,
- auxDefs: [], // fetch selected signal only
- titleDataset:
- selectedDef.dataset === signalDef.dataset
- ? nxData.titleDataset
- : undefined, // when auxiliary signal is selected, always use its label as title
- };
+ const nxDataToFetch = useNxImageDataToFetch(nxData, selectedDef);
return (
<>
diff --git a/packages/app/src/vis-packs/nexus/hooks.ts b/packages/app/src/vis-packs/nexus/hooks.ts
index e97353766..e236ebc8e 100644
--- a/packages/app/src/vis-packs/nexus/hooks.ts
+++ b/packages/app/src/vis-packs/nexus/hooks.ts
@@ -1,9 +1,13 @@
-import type { GroupWithChildren } from '@h5web/shared/hdf5-models';
+import type {
+ ComplexType,
+ GroupWithChildren,
+ NumericType,
+} from '@h5web/shared/hdf5-models';
import type { DimensionMapping } from '../../dimension-mapper/models';
import { useDataContext } from '../../providers/DataProvider';
import { useValuesInCache } from '../core/hooks';
-import type { NxData } from './models';
+import type { DatasetDef, NxData } from './models';
import {
assertNxDataGroup,
findAuxErrorDataset,
@@ -44,6 +48,23 @@ export function useNxData(group: GroupWithChildren): NxData {
};
}
+export function useNxImageDataToFetch(
+ nxData: NxData,
+ selectedDef: DatasetDef,
+): NxData {
+ const { signalDef } = nxData;
+
+ return {
+ ...nxData,
+ signalDef: selectedDef,
+ auxDefs: [], // fetch selected signal only
+ titleDataset:
+ selectedDef.dataset === signalDef.dataset
+ ? nxData.titleDataset
+ : undefined, // when auxiliary signal is selected, always use its label as title
+ };
+}
+
export function useNxValuesCached(
nxData: NxData,
): (dimMapping: DimensionMapping) => boolean {