/*-
* Copyright 2015 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.dawnsci.nexus;
import org.eclipse.dawnsci.analysis.api.tree.DataNode;
import org.eclipse.dawnsci.analysis.api.tree.GroupNode;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
public class NexusMappingFileTest extends AbstractNexusFileTestBase {
private static final String FILE_NAME = "mapping.nxs";
private static int T_SHAPE = 5;
private static int X_SHAPE = 10;
private static int Y_SHAPE = 12;
private static int X_PIXEL_SHAPE = 6;
private static int Y_PIXEL_SHAPE = 8;
private static int ENERGY_SHAPE = 24;
private static int MICRO_X_SHAPE = 64;
private static int MICRO_Y_SHAPE = 48;
private NXroot root;
private GroupNode userCache = null;
private DataNode experimentIDCache = null;
private GroupNode microDataCache = null;
private GroupNode monitorArmTransformCache = null;
private GroupNode detectorArmTransformCache = null;
private DataNode getDataNode(final String path) {
return (DataNode) root.findNodeLink(path).getDestination();
}
@Override
protected NXroot createNXroot() {
root = NexusNodeFactory.createNXroot();
addEntry1(root);
addEntryMicro(root);
return root;
}
private void addEntry1(NXroot root) {
NXentry entry = NexusNodeFactory.createNXentry();
entry.setProgram_name(DatasetFactory.createFromObject("GDA 9.0.0"));
entry.setField("scan_command", "Mapping Scan");
entry.setField("scan_identifier", "aa-bb-cc-dd-ee");
entry.setField("title", "Example Mapping Scan");
entry.setEntry_identifier(DatasetFactory.createFromObject("24737"));
addExperimentID(entry);
addUser(entry);
addInstrument(entry);
addSample(entry);
root.setEntry("entry1", entry);
addDataBlock(entry);
}
private void addDataBlock(NXentry entry) {
NXdata data = NexusNodeFactory.createNXdata();
data.setAttribute(null, "signal", "data");
data.setAttribute(null, "axes", DatasetFactory.createFromObject(new String[] {"x_stage_set", "y_stage_set", "t_stage_set", "energy"}));
data.setAttribute(null, "t_stage_indices", DatasetFactory.createFromObject(new int[] {0, 1, 2}));
data.setAttribute(null, "x_stage_indices", DatasetFactory.createFromObject(new int[] {0, 1, 2}));
data.setAttribute(null, "y_stage_indices", DatasetFactory.createFromObject(new int[] {0, 1, 2}));
data.setAttribute(null, "energy_indices", DatasetFactory.createFromObject(new int[] {3}));
data.setAttribute(null, "t_stage_set_indices", DatasetFactory.createFromObject(new int[] {2}));
data.setAttribute(null, "x_stage_set_indices", DatasetFactory.createFromObject(new int[] {1}));
data.setAttribute(null, "y_stage_set_indices", DatasetFactory.createFromObject(new int[] {0}));
data.addDataNode("data", getDataNode("/entry1/instrument/fluo/data"));
data.addDataNode("energy", getDataNode("/entry1/instrument/fluo/energy"));
data.addDataNode("t_stage", getDataNode("/entry1/sample/transformations/t_stage"));
data.addDataNode("x_stage", getDataNode("/entry1/sample/transformations/x_stage"));
data.addDataNode("y_stage", getDataNode("/entry1/sample/transformations/y_stage"));
data.addDataNode("t_stage_set", getDataNode("/entry1/sample/t_stage_set"));
data.addDataNode("x_stage_set", getDataNode("/entry1/sample/x_stage_set"));
data.addDataNode("y_stage_set", getDataNode("/entry1/sample/y_stage_set"));
entry.addGroupNode("data", data);
}
private void addSample(NXentry entry) {
NXsample sample = NexusNodeFactory.createNXsample();
sample.setAttribute(null, "depends_on", "t_stage");
NXtransformations transforms = NexusNodeFactory.createNXtransformations();
DataNode t_stage = NexusNodeFactory.createDataNode();
t_stage.setDataset(DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
transforms.addDataNode("t_stage", t_stage);
transforms.setAttribute("t_stage", "depends_on", "x_stage");
transforms.setAttribute("t_stage", "transformation_type", "rotation");
DataNode x_stage = NexusNodeFactory.createDataNode();
x_stage.setDataset(DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
transforms.addDataNode("x_stage", x_stage);
transforms.setAttribute("x_stage", "depends_on", "y_stage");
transforms.setAttribute("x_stage", "transformation_type", "translation");
DataNode y_stage = NexusNodeFactory.createDataNode();
y_stage.setDataset(DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
transforms.addDataNode("y_stage", y_stage);
transforms.setAttribute("y_stage", "depends_on", ".");
transforms.setAttribute("y_stage", "transformation_type", "translation");
sample.addNode("transformations", transforms);
sample.setDataset("t_stage_set", DatasetFactory.createRange(T_SHAPE, Dataset.INT16));
sample.setDataset("x_stage_set", DatasetFactory.createRange(X_SHAPE, Dataset.INT16));
sample.setDataset("y_stage_set", DatasetFactory.createRange(Y_SHAPE, Dataset.INT16));
entry.setSample(sample);
}
private void addInstrument(NXentry entry) {
NXinstrument instrument = NexusNodeFactory.createNXinstrument();
addFluorecenceDetector(instrument);
addDiffractionDetector(instrument);
addTransmissionMonitor(instrument);
addI0Monitor(instrument);
addItMonitor(instrument);
entry.setInstrument(instrument);
}
private void addItMonitor(NXinstrument instrument) {
NXmonitor monitor = NexusNodeFactory.createNXmonitor();
monitor.setDataset("data", DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
addMonitorArmTransform(monitor);
instrument.addGroupNode("It", monitor);
}
private void addMonitorArmTransform(NXmonitor monitor) {
if (monitorArmTransformCache == null) {
NXtransformations transforms = NexusNodeFactory.createNXtransformations();
DataNode monitor_arm = NexusNodeFactory.createDataNode();
monitor_arm.setDataset(DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
transforms.addDataNode("monitor_arm", monitor_arm);
transforms.setAttribute("monitor_arm", "depends_on", ".");
transforms.setAttribute("monitor_arm", "transformation_type", "translation");
monitor.addNode("transformations", transforms);
monitorArmTransformCache = monitor.getGroupNode("transformations");
} else {
monitor.addNode("transformations", monitorArmTransformCache);
}
}
private void addI0Monitor(NXinstrument instrument) {
NXmonitor monitor = NexusNodeFactory.createNXmonitor();
monitor.setDataset("data", DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
addMonitorArmTransform(monitor);
instrument.addGroupNode("I0", monitor);
}
private void addTransmissionMonitor(NXinstrument instrument) {
NXmonitor monitor = NexusNodeFactory.createNXmonitor();
monitor.setDataset("data", DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
addMonitorArmTransform(monitor);
instrument.addGroupNode("trans", monitor);
}
private void addDiffractionDetector(NXinstrument instrument) {
NXdetector detector = NexusNodeFactory.createNXdetector();
detector.setAttribute(null, "signal", "data");
detector.setX_pixel_sizeScalar(1.0);
detector.setAttribute(NXdetector.NX_X_PIXEL_SIZE, "units", "um");
detector.setY_pixel_sizeScalar(1.0);
detector.setAttribute(NXdetector.NX_Y_PIXEL_SIZE, "units", "um");
detector.setDataset("data", DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE, X_PIXEL_SHAPE, Y_PIXEL_SHAPE}, Dataset.INT16));
detector.setAttribute("data", "interpretation", "image");
addDetectorArmTransform(detector);
instrument.addGroupNode("diff", detector);
}
private void addFluorecenceDetector(NXinstrument instrument) {
NXdetector detector = NexusNodeFactory.createNXdetector();
detector.setAttribute(null, "signal", "data");
detector.setAttribute(null, "axes", DatasetFactory.createFromObject(new String[] {".", ".", ".", "energy"}));
detector.setAttribute(null, "energy_indices", "3");
detector.setDataset("data", DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE, ENERGY_SHAPE}, Dataset.INT16));
detector.setAttribute("data", "interpretation", "spectrum");
detector.setDataset("energy", DatasetFactory.createRange(ENERGY_SHAPE, Dataset.INT16));
detector.setAttribute("energy", "units", "keV");
addDetectorArmTransform(detector);
instrument.addGroupNode("fluo", detector);
}
private void addDetectorArmTransform(NXdetector detector) {
if (detectorArmTransformCache == null) {
NXtransformations transforms = NexusNodeFactory.createNXtransformations();
DataNode detector_arm = NexusNodeFactory.createDataNode();
detector_arm.setDataset(DatasetFactory.ones(new int[] {X_SHAPE, Y_SHAPE, T_SHAPE}, Dataset.INT16));
transforms.addDataNode("detector_arm", detector_arm);
transforms.setAttribute("detector_arm", "depends_on", ".");
transforms.setAttribute("detector_arm", "transformation_type", "translation");
detector.addNode("transformations", transforms);
detectorArmTransformCache = detector.getGroupNode("transformations");
} else {
detector.addNode("transformations", detectorArmTransformCache);
}
}
private void addEntryMicro(NXroot root) {
NXentry entry = NexusNodeFactory.createNXentry();
entry.setProgram_name(DatasetFactory.createFromObject("Microscope Software 1.0.0"));
entry.setField("title", "White image of scan");
addExperimentID(entry);
addUser(entry);
addMicroscopeData(entry);
root.setEntry("entry_micro", entry);
}
private void addUser(NXentry entry) {
if (userCache == null) {
NXuser user = NexusNodeFactory.createNXuser();
user.setField("username", "ssg37927");
entry.setUser(user);
userCache = entry.getGroupNode("user");
} else {
entry.addGroupNode("user", userCache);
}
}
private void addExperimentID(NXentry entry) {
if (experimentIDCache == null) {
entry.setExperiment_identifier(DatasetFactory.createFromObject("mt9396-1"));
experimentIDCache = entry.getDataNode(NXentry.NX_EXPERIMENT_IDENTIFIER);
} else {
entry.addDataNode(NXentry.NX_EXPERIMENT_IDENTIFIER, experimentIDCache);
}
}
private void addMicroscopeData(NXentry entry) {
if (microDataCache == null) {
NXdata data = NexusNodeFactory.createNXdata();
data.setAttribute(null, "signal", "data");
data.setAttribute(null, "axes", DatasetFactory.createFromObject(new String[] {".", "image_x", "image_y"}));
data.setAttribute(null, "image_x_indices", "1");
data.setAttribute(null, "image_y_indices", "2");
data.setDataset("data", DatasetFactory.ones(new int[] {4, MICRO_X_SHAPE, MICRO_Y_SHAPE}, Dataset.INT16));
data.setAttribute("data", "interpretation", "rgba-image");
data.setDataset("image_x", DatasetFactory.createRange(MICRO_X_SHAPE, Dataset.INT16));
data.setAttribute("image_x", "units", "mm");
data.setDataset("image_y", DatasetFactory.createRange(MICRO_Y_SHAPE, Dataset.INT16));
data.setAttribute("image_y", "units", "mm");
entry.setData(data);
microDataCache = entry.getGroupNode("data");
} else {
entry.addGroupNode("data", microDataCache);
}
}
@Override
protected String getFilename() {
return FILE_NAME;
}
}