/*-
*******************************************************************************
* Copyright (c) 2011, 2016 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
*
* Contributors:
* Matthew Gerring - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.dawnsci.nexus.builder.data.impl;
import static org.eclipse.dawnsci.nexus.test.util.NexusAssert.assertAxes;
import static org.eclipse.dawnsci.nexus.test.util.NexusAssert.assertIndices;
import static org.eclipse.dawnsci.nexus.test.util.NexusAssert.assertNodesEquals;
import static org.eclipse.dawnsci.nexus.test.util.NexusAssert.assertSignal;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import org.eclipse.dawnsci.nexus.NXdata;
import org.eclipse.dawnsci.nexus.NXdetector;
import org.eclipse.dawnsci.nexus.NXpositioner;
import org.eclipse.dawnsci.nexus.NexusBaseClass;
import org.eclipse.dawnsci.nexus.NexusException;
import org.eclipse.dawnsci.nexus.NexusNodeFactory;
import org.eclipse.dawnsci.nexus.builder.AbstractNexusObjectProvider;
import org.eclipse.dawnsci.nexus.builder.NexusObjectProvider;
import org.eclipse.dawnsci.nexus.builder.data.AxisDataDevice;
import org.eclipse.dawnsci.nexus.builder.data.DataDeviceBuilder;
import org.eclipse.dawnsci.nexus.builder.data.NexusDataBuilder;
import org.eclipse.dawnsci.nexus.builder.data.PrimaryDataDevice;
import org.eclipse.dawnsci.nexus.builder.impl.DefaultNexusEntryBuilder;
import org.eclipse.dawnsci.nexus.builder.impl.DefaultNexusFileBuilder;
import org.junit.Before;
import org.junit.Test;
public class DefaultNexusDataBuilderTest {
public static class TestDetector extends AbstractNexusObjectProvider<NXdetector> {
public TestDetector() {
super("testDetector", NexusBaseClass.NX_DETECTOR, NXdetector.NX_DATA);
}
@Override
protected NXdetector createNexusObject() {
NXdetector detector = NexusNodeFactory.createNXdetector();
detector.initializeLazyDataset(NXdetector.NX_DATA, 3, Double.class);
return detector;
}
}
public static class TestDetectorWithAxisField extends AbstractNexusObjectProvider<NXdetector> {
public TestDetectorWithAxisField() {
super("detector2", NexusBaseClass.NX_DETECTOR);
setPrimaryDataFieldName(NXdetector.NX_DATA);
addAxisDataField(NXdetector.NX_TIME_OF_FLIGHT, 2, null);
}
@Override
protected NXdetector createNexusObject() {
NXdetector detector = NexusNodeFactory.createNXdetector();
detector.initializeLazyDataset(NXdetector.NX_DATA, 3, Double.class);
detector.setAttribute(NXdetector.NX_DATA, "units", "mm");
detector.initializeLazyDataset(NXdetector.NX_TIME_OF_FLIGHT, 1, Double.class);
return detector;
}
}
public static class TestDetectorWithMultiplePrimaryDataFields extends AbstractNexusObjectProvider<NXdetector> {
public TestDetectorWithMultiplePrimaryDataFields() {
super("detector", NexusBaseClass.NX_DETECTOR);
setPrimaryDataFieldName(NXdetector.NX_DATA);
addAdditionalPrimaryDataFieldName("sum");
}
@Override
protected NXdetector createNexusObject() {
NXdetector detector = NexusNodeFactory.createNXdetector();
detector.initializeLazyDataset(NXdetector.NX_DATA, 3, Double.class);
detector.initializeLazyDataset("sum", 3, Double.class);
return detector;
}
}
public static class TestDetectorWithExternalLink extends AbstractNexusObjectProvider<NXdetector> {
public TestDetectorWithExternalLink() {
super("testDetector", NexusBaseClass.NX_DETECTOR, NXdetector.NX_DATA);
setDefaultExternalFileName("external.nxs");
}
@Override
protected NXdetector createNexusObject() {
NXdetector detector = NexusNodeFactory.createNXdetector();
// create an external link instead of a lazy dataset
addExternalLink(detector, NXdetector.NX_DATA, "/entry/data", 3);
return detector;
}
}
public static class TestPositioner extends AbstractNexusObjectProvider<NXpositioner> {
public TestPositioner() {
super("positioner", NexusBaseClass.NX_POSITIONER, NXpositioner.NX_VALUE);
}
public TestPositioner(String name) {
super(name, NexusBaseClass.NX_POSITIONER);
}
@Override
protected NXpositioner createNexusObject() {
NXpositioner positioner = NexusNodeFactory.createNXpositioner();
positioner.initializeLazyDataset(NXpositioner.NX_VALUE, 1, Double.class);
positioner.initializeLazyDataset("source", 1, Double.class);
return positioner;
}
}
public static class MultipleFieldTestPositioner extends AbstractNexusObjectProvider<NXpositioner> {
public MultipleFieldTestPositioner() {
super("ss1", NexusBaseClass.NX_POSITIONER);
setUseDeviceNameInNXdata(false);
setAxisDataFieldNames("field1", "field2", "field3", "field4");
}
@Override
protected NXpositioner createNexusObject() {
NXpositioner positioner = NexusNodeFactory.createNXpositioner();
positioner.initializeLazyDataset("field1", 1, Double.class);
positioner.initializeLazyDataset("field2", 1, Double.class);
positioner.initializeLazyDataset("field3", 1, Double.class);
positioner.initializeLazyDataset("field4", 1, Double.class);
return positioner;
}
}
public static class TestPositionerWithExternalLink extends AbstractNexusObjectProvider<NXpositioner> {
public TestPositionerWithExternalLink() {
super("positioner", NexusBaseClass.NX_POSITIONER, NXpositioner.NX_VALUE);
setDefaultExternalFileName("external.nxs");
}
@Override
protected NXpositioner createNexusObject() {
NXpositioner positioner = NexusNodeFactory.createNXpositioner();
addExternalLink(positioner, NXpositioner.NX_VALUE, "/entry/data", 1);
return positioner;
}
}
private NexusDataBuilder dataBuilder;
private NXdata nxData;
@Before
public void setUp() throws Exception {
DefaultNexusFileBuilder fileBuilder = new DefaultNexusFileBuilder("test");
DefaultNexusEntryBuilder entryBuilder = fileBuilder.newEntry();
entryBuilder.addDefaultGroups();
dataBuilder = entryBuilder.createDefaultData();
nxData = dataBuilder.getNxData();
}
private void addToEntry(NexusObjectProvider<?>... nexusObjects) throws NexusException {
// TODO it would be good to be able to add fields from a group that hasn't been created already
for (NexusObjectProvider<?> nexusObjectProvider : nexusObjects) {
nexusObjectProvider.getNexusObject();
}
}
@Test
public void testGetNxData() {
assertThat(dataBuilder.getNxData(), notNullValue());
}
@Test
public void testSetPrimaryDataDevice() throws NexusException {
assertThat(nxData.getNumberOfAttributes(), is(1));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(0));
TestDetector detector = new TestDetector();
addToEntry(detector);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
assertSignal(nxData, NXdetector.NX_DATA);
assertAxes(nxData, ".", ".", ".");
assertThat(nxData.getDataNode(NXdetector.NX_DATA), is(sameInstance(
detector.getNexusObject().getDataNode(NXdetector.NX_DATA))));
}
@Test
public void testSetPrimaryDataDevice_useDeviceName() throws NexusException {
assertThat(nxData.getNumberOfAttributes(), is(1));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(0));
TestDetector detector = new TestDetector();
detector.setUseDeviceNameInNXdata(true);
addToEntry(detector);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
assertSignal(nxData, "testDetector");
assertAxes(nxData, ".", ".", ".");
assertThat(nxData.getDataNode("testDetector"), is(sameInstance(
detector.getNexusObject().getDataNode(NXdetector.NX_DATA))));
}
@Test
public void testSetPrimaryDataDevice_setSignalFieldName() throws NexusException {
assertThat(nxData.getNumberOfAttributes(), is(1));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(0));
TestDetectorWithAxisField detector = new TestDetectorWithAxisField();
addToEntry(detector);
PrimaryDataDevice<NXdetector> dataDevice = DataDeviceBuilder.newPrimaryDataDevice(detector,
NXdetector.NX_TIME_OF_FLIGHT);
dataBuilder.setPrimaryDevice(dataDevice);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
assertSignal(nxData, NXdetector.NX_TIME_OF_FLIGHT);
assertAxes(nxData, ".");
assertThat(nxData.getDataNode(NXdetector.NX_TIME_OF_FLIGHT), is(sameInstance(
detector.getNexusObject().getDataNode(NXdetector.NX_TIME_OF_FLIGHT))));
}
@Test
public void testSetPrimaryDataDevice_multipleFields() throws NexusException {
assertThat(nxData.getNumberOfAttributes(), is(1));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(0));
TestDetectorWithAxisField detector = new TestDetectorWithAxisField();
addToEntry(detector);
DataDeviceBuilder<NXdetector> detectorDataDevice =
DataDeviceBuilder.newPrimaryDataDeviceBuilder(detector);
detectorDataDevice.setDestinationFieldName(NXdetector.NX_TIME_OF_FLIGHT, "tof");
dataBuilder.setPrimaryDevice((PrimaryDataDevice<NXdetector>) detectorDataDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertSignal(nxData, "data");
assertAxes(nxData, ".", ".", "tof");
assertIndices(nxData, "tof", 2);
assertThat(nxData.getDataNode("data"), is(sameInstance(
detector.getNexusObject().getDataNode(NXdetector.NX_DATA))));
assertThat(nxData.getDataNode("tof"), is(sameInstance(
detector.getNexusObject().getDataNode(NXdetector.NX_TIME_OF_FLIGHT))));
}
@Test
public void testSetPrimaryDataDevice_setDestinationFieldName() throws NexusException {
assertThat(nxData.getNumberOfAttributes(), is(1));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(0));
TestDetector detector = new TestDetector();
addToEntry(detector);
DataDeviceBuilder<NXdetector> detectorDataDevice = new DataDeviceBuilder<>(detector, true);
detectorDataDevice.setDestinationFieldName(NXdetector.NX_DATA, "foo");
dataBuilder.setPrimaryDevice((PrimaryDataDevice<NXdetector>) detectorDataDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
assertSignal(nxData, "foo");
assertAxes(nxData, ".", ".", ".");
assertThat(nxData.getDataNode("foo"), is(sameInstance(
detector.getNexusObject().getDataNode(NXdetector.NX_DATA))));
}
@Test
public void testSetPrimaryDataDevice_externalLink() throws Exception {
assertThat(nxData.getNumberOfAttributes(), is(1));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(0));
TestDetectorWithExternalLink detector = new TestDetectorWithExternalLink();
addToEntry(detector);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
assertSignal(nxData, NXdetector.NX_DATA);
assertAxes(nxData, ".", ".", ".");
assertNodesEquals("", nxData.getNode("data"),
detector.getNexusObject().getNode(NXdetector.NX_DATA));
}
@Test
public void testAddAxisDevice() throws NexusException {
TestDetector detector = new TestDetector();
TestPositioner positioner = new TestPositioner();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
dataBuilder.addAxisDevice(positioner, null, 0);
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, ".", ".", ".");
assertIndices(nxData, "positioner", 0);
assertThat(nxData.getDataNode("positioner"), is(sameInstance(
positioner.getNexusObject().getDataNode(NXpositioner.NX_VALUE))));
}
@Test
public void testAddAxisDevice_defaultAxisForDimension() throws NexusException {
TestDetector detector = new TestDetector();
TestPositioner positioner = new TestPositioner();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
dataBuilder.addAxisDevice(positioner, 0);
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, "positioner", ".", ".");
assertIndices(nxData, "positioner", 0);
assertThat(nxData.getDataNode("positioner"), is(sameInstance(
positioner.getNexusObject().getDataNode(NXpositioner.NX_VALUE))));
}
@Test
public void testAddAxisDevice_setSourceFieldName() throws NexusException {
TestDetector detector = new TestDetector();
TestPositioner positioner = new TestPositioner();
positioner.setUseDeviceNameInNXdata(false);
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
DataDeviceBuilder<NXpositioner> axisDevice = DataDeviceBuilder.newAxisDataDeviceBuilder(
positioner);
axisDevice.clearAxisFields();
axisDevice.addAxisField("source");
axisDevice.setDefaultAxisSourceFieldName("source");
dataBuilder.addAxisDevice((AxisDataDevice<?>) axisDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, ".", ".", ".");
assertIndices(nxData, "source", 0);
assertThat(nxData.getDataNode("source"), is(sameInstance(
positioner.getNexusObject().getDataNode("source"))));
}
@Test
public void testAddAxisDevice_sourceFieldName_defaultAxisForDimension() throws NexusException {
TestDetector detector = new TestDetector();
TestPositioner positioner = new TestPositioner();
positioner.setUseDeviceNameInNXdata(false);
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
DataDeviceBuilder<NXpositioner> axisDevice = DataDeviceBuilder.newAxisDataDeviceBuilder(
positioner);
axisDevice.clearAxisFields();
axisDevice.addAxisField("source", 0);
dataBuilder.addAxisDevice((AxisDataDevice<?>) axisDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, "source", ".", ".");
assertIndices(nxData, "source", 0);
assertThat(nxData.getDataNode("source"), is(sameInstance(
positioner.getNexusObject().getDataNode("source"))));
}
@Test
public void testAddAxisDevice_sourceAndDestinationFieldNames() throws NexusException {
TestDetector detector = new TestDetector();
TestPositioner positioner = new TestPositioner();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
DataDeviceBuilder<NXpositioner> axisDevice = DataDeviceBuilder.newAxisDataDeviceBuilder(
positioner);
axisDevice.setAxisFields("source");
axisDevice.setDestinationFieldName("source", "dest");
dataBuilder.addAxisDevice((AxisDataDevice<?>) axisDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, ".", ".", ".");
assertIndices(nxData, "dest", 0);
assertThat(nxData.getDataNode("dest"), is(sameInstance(
positioner.getNexusObject().getDataNode("source"))));
}
@Test
public void testAddAxisDevice_sourceAndDestinationFieldNames_defaultAxisForDimension() throws NexusException {
TestDetector detector = new TestDetector();
TestPositioner positioner = new TestPositioner();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
DataDeviceBuilder<NXpositioner> axisDevice = DataDeviceBuilder.newAxisDataDeviceBuilder(
positioner, 1);
axisDevice.setAxisFields("source");
axisDevice.setDefaultAxisSourceFieldName("source");
axisDevice.setDestinationFieldName("source", "dest");
dataBuilder.addAxisDevice((AxisDataDevice<?>) axisDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, ".", "dest", ".");
assertIndices(nxData, "dest", 1);
assertThat(nxData.getDataNode("dest"), is(sameInstance(
positioner.getNexusObject().getDataNode("source"))));
}
@Test
public void testAddAxisDevice_multipleFields() throws NexusException {
TestDetector detector = new TestDetector();
MultipleFieldTestPositioner positioner = new MultipleFieldTestPositioner();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
dataBuilder.addAxisDevice(positioner, 0);
assertThat(nxData.getNumberOfAttributes(), is(7));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(5));
assertAxes(nxData, "field1", ".", ".");
for (String sourceFieldName : positioner.getAxisDataFieldNames()) {
assertIndices(nxData, sourceFieldName, 0);
assertThat(nxData.getDataNode(sourceFieldName), is(sameInstance(
positioner.getNexusObject().getDataNode(sourceFieldName))));
}
}
@Test
public void testAddAxisDevice_multipleFields_defaultAxisForDimension() throws NexusException {
TestDetector detector = new TestDetector();
MultipleFieldTestPositioner positioner = new MultipleFieldTestPositioner();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
DataDeviceBuilder<NXpositioner> axisDevice = DataDeviceBuilder.newAxisDataDeviceBuilder(
positioner, "field3", 2);
dataBuilder.addAxisDevice((AxisDataDevice<?>) axisDevice.build());
assertThat(nxData.getNumberOfAttributes(), is(7));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(5));
assertAxes(nxData, ".", ".", "field3");
for (String sourceFieldName : positioner.getAxisDataFieldNames()) {
assertIndices(nxData, sourceFieldName, sourceFieldName.equals("field3") ? 2 : 0);
assertThat(nxData.getDataNode(sourceFieldName), is(sameInstance(
positioner.getNexusObject().getDataNode(sourceFieldName))));
}
}
@Test
public void testAddAxisDevice_externalLink() throws Exception {
TestDetector detector = new TestDetector();
TestPositionerWithExternalLink positioner = new TestPositionerWithExternalLink();
addToEntry(detector, positioner);
dataBuilder.setPrimaryDevice(detector);
assertThat(nxData.getNumberOfAttributes(), is(3));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(1));
dataBuilder.addAxisDevice(positioner, 0);
assertThat(nxData.getNumberOfAttributes(), is(4));
assertThat(nxData.getNumberOfGroupNodes(), is(0));
assertThat(nxData.getNumberOfDataNodes(), is(2));
assertAxes(nxData, "positioner", ".", ".");
assertIndices(nxData, "positioner", 0);
assertNodesEquals("", nxData.getNode("positioner"),
positioner.getNexusObject().getNode(NXpositioner.NX_VALUE));
}
}