def test_GIVEN_an_NXdetector_group_with_pixel_shape_WHEN_calling_create_component_THEN_component_has_a_PixelShape(): wrapper = nx.NexusWrapper("file_with_detector") detector_group = wrapper.create_nx_group( "detector", "NXdetector", wrapper.instrument ) wrapper.create_nx_group("pixel_shape", "NXoff_geometry", detector_group) new_component = create_component(wrapper, detector_group) assert isinstance(new_component._shape, PixelShape)
def test_GIVEN_an_NXdisk_chopper_group_WHEN_calling_create_component_THEN_component_has_a_ChopperShape(): wrapper = nx.NexusWrapper("file_with_chopper") chopper_group = wrapper.create_nx_group( "chopper", "NXdisk_chopper", wrapper.instrument ) new_component = create_component(wrapper, chopper_group) assert isinstance(new_component._shape, ChopperShape) assert isinstance( new_component.shape[0], NoShapeGeometry ), "Expect chopper component to return NoShapeGeometry as it has insufficient details to create a mesh of the disk shape"
def test_GIVEN_a_PixelShape_WHEN_calling_get_shape_THEN_shape_and_transformations_are_returned( ): wrapper = nx.NexusWrapper("file_with_detector") detector_group = wrapper.create_nx_group("detector", "NXdetector", wrapper.instrument) shape_group = wrapper.create_nx_group("pixel_shape", "NXoff_geometry", detector_group) # Populate shape group vertices = [ [-0.05, -0.05, 0.0], [0.05, -0.05, 0.0], [0.05, 0.05, 0.0], [-0.05, 0.05, 0.0], ] faces = [0] winding_order = [0, 1, 2, 3] vertices_field = wrapper.set_field_value(shape_group, "vertices", vertices) wrapper.set_attribute_value(vertices_field, "units", "m") wrapper.set_field_value(shape_group, "winding_order", winding_order) wrapper.set_field_value(shape_group, "faces", faces) # Add pixel offsets to detector group x_offsets = np.array([[-0.05, 0.05], [-0.05, 0.05]]) y_offsets = np.array([[-0.05, -0.05], [0.05, 0.05]]) wrapper.set_field_value(detector_group, "x_pixel_offset", x_offsets) wrapper.set_field_value(detector_group, "y_pixel_offset", y_offsets) pixel_shape = PixelShape(wrapper, detector_group) assert isinstance(pixel_shape, PixelShape) shape, transformations = pixel_shape.get_shape() for vertex_index, vertex in enumerate(shape.vertices): assert np.allclose(qvector3d_to_numpy_array(vertex), vertices[vertex_index]) assert np.allclose(shape.faces, [winding_order]) assert (len(transformations) == x_offsets.size ), "Expected one transformation per pixel offset" assert np.allclose(qvector3d_to_numpy_array(transformations[0]), np.array([-0.05, -0.05, 0.0])) assert np.allclose(qvector3d_to_numpy_array(transformations[3]), np.array([0.05, 0.05, 0.0]))
def test_GIVEN_an_nx_group_with_shape_WHEN_calling_create_component_THEN_component_returns_OFFGeometry(): wrapper = nx.NexusWrapper("file_with_component_with_shape") monitor_group = wrapper.create_nx_group("monitor", "NXmonitor", wrapper.instrument) new_component = create_component(wrapper, monitor_group) shape_group = wrapper.create_nx_group( "shape", "NXoff_geometry", new_component.group ) vertices_dataset = wrapper.set_field_value( shape_group, "vertices", np.array([[0, 2, -2], [-1, -1, 1], [1, -1, 1]]), dtype=np.float, ) wrapper.set_field_value( shape_group, "winding_order", np.array([0, 1, 2]), dtype=np.int32 ) wrapper.set_field_value(shape_group, "faces", np.array([0]), dtype=np.int32) wrapper.set_attribute_value(vertices_dataset, "units", "m") assert isinstance(new_component.shape[0], OFFGeometryNexus)
def test_GIVEN_an_NXdisk_chopper_group_WHEN_calling_create_component_THEN_component_returns_OFFGeometry_of_chopper(): wrapper = nx.NexusWrapper("file_with_chopper") chopper_group = wrapper.create_nx_group( "chopper", "NXdisk_chopper", wrapper.instrument ) add_dataset( chopper_group, "slit_edges", np.array( [ 83.71, 94.7, 140.49, 155.79, 193.26, 212.56, 242.32, 265.33, 287.91, 314.37, 330.3, 360.0, ] ) + 15.0, attributes={"units": "deg"}, ) add_dataset(chopper_group, "slits", 6) add_dataset(chopper_group, "slit_height", 130.0, attributes={"units": "mm"}) add_dataset(chopper_group, "radius", 300.0, attributes={"units": "mm"}) new_component = create_component(wrapper, chopper_group) assert isinstance(new_component._shape, ChopperShape) assert isinstance(new_component.shape[0], OFFGeometryNoNexus) assert ( len(new_component.shape[0].vertices) > 8 ), "Expect chopper geometry with many vertices, not just a placeholder cube with 8 vertices"
def test_GIVEN_an_nx_group_with_no_shape_WHEN_calling_create_component_THEN_component_has_a_ComponentShape(): wrapper = nx.NexusWrapper("file_with_component_with_no_shape") monitor_group = wrapper.create_nx_group("monitor", "NXmonitor", wrapper.instrument) new_component = create_component(wrapper, monitor_group) assert isinstance(new_component._shape, ComponentShape)