\(\renewcommand\AA{\unicode{x212B}}\)

SliceMD v1

../_images/SliceMD-v1_dlg.png

SliceMD dialog.

Summary

Make a MDEventWorkspace containing the events in a slice of an input MDEventWorkspace.

Properties

Name Direction Type Default Description
InputWorkspace Input IMDWorkspace Mandatory An input MDWorkspace.
AxisAligned Input boolean True Perform binning aligned with the axes of the input MDEventWorkspace?
AlignedDim0 Input string   Binning parameters for the 0th dimension. Enter it as a comma-separated list of values with the format: ‘name,minimum,maximum,number_of_bins’. Leave blank for NONE.
AlignedDim1 Input string   Binning parameters for the 1th dimension. Enter it as a comma-separated list of values with the format: ‘name,minimum,maximum,number_of_bins’. Leave blank for NONE.
AlignedDim2 Input string   Binning parameters for the 2th dimension. Enter it as a comma-separated list of values with the format: ‘name,minimum,maximum,number_of_bins’. Leave blank for NONE.
AlignedDim3 Input string   Binning parameters for the 3th dimension. Enter it as a comma-separated list of values with the format: ‘name,minimum,maximum,number_of_bins’. Leave blank for NONE.
AlignedDim4 Input string   Binning parameters for the 4th dimension. Enter it as a comma-separated list of values with the format: ‘name,minimum,maximum,number_of_bins’. Leave blank for NONE.
AlignedDim5 Input string   Binning parameters for the 5th dimension. Enter it as a comma-separated list of values with the format: ‘name,minimum,maximum,number_of_bins’. Leave blank for NONE.
BasisVector0 Input string   Description of the basis vector of the 0th output dimension.Format: ‘name, units, x,y,z,..’. name : string for the name of the output dimension. units : string for the units of the output dimension. x,y,z,…: vector definining the basis in the input dimensions space. Leave blank for NONE.
BasisVector1 Input string   Description of the basis vector of the 1th output dimension.Format: ‘name, units, x,y,z,..’. name : string for the name of the output dimension. units : string for the units of the output dimension. x,y,z,…: vector definining the basis in the input dimensions space. Leave blank for NONE.
BasisVector2 Input string   Description of the basis vector of the 2th output dimension.Format: ‘name, units, x,y,z,..’. name : string for the name of the output dimension. units : string for the units of the output dimension. x,y,z,…: vector definining the basis in the input dimensions space. Leave blank for NONE.
BasisVector3 Input string   Description of the basis vector of the 3th output dimension.Format: ‘name, units, x,y,z,..’. name : string for the name of the output dimension. units : string for the units of the output dimension. x,y,z,…: vector definining the basis in the input dimensions space. Leave blank for NONE.
BasisVector4 Input string   Description of the basis vector of the 4th output dimension.Format: ‘name, units, x,y,z,..’. name : string for the name of the output dimension. units : string for the units of the output dimension. x,y,z,…: vector definining the basis in the input dimensions space. Leave blank for NONE.
BasisVector5 Input string   Description of the basis vector of the 5th output dimension.Format: ‘name, units, x,y,z,..’. name : string for the name of the output dimension. units : string for the units of the output dimension. x,y,z,…: vector definining the basis in the input dimensions space. Leave blank for NONE.
Translation Input dbl list   Coordinates in the INPUT workspace that corresponds to (0,0,0) in the OUTPUT workspace. Enter as a comma-separated string. Default: 0 in all dimensions (no translation).
OutputExtents Input dbl list   The minimum, maximum edges of space of each dimension of the OUTPUT workspace, as a comma-separated list
OutputBins Input int list   The number of bins for each dimension of the OUTPUT workspace.
NormalizeBasisVectors Input boolean True Normalize the given basis vectors to unity. If true, then a distance of 1 in the INPUT dimensions = 1 in the OUTPUT dimensions. If false, then a distance of norm(basis_vector) in the INPUT dimension = 1 in the OUTPUT dimensions.
ForceOrthogonal Input boolean False Force the input basis vectors to form an orthogonal coordinate system. Only works in 3 dimension!
OutputWorkspace Output Workspace Mandatory Name of the output MDEventWorkspace.
OutputFilename Input string   Optional: Specify a NeXus file to write if you want the output workspace to be file-backed. Allowed extensions: [‘.nxs’]
Memory Input number -1 If OutputFilename is specified to use a file back end: The amount of memory (in MB) to allocate to the in-memory cache. If not specified, a default of 40% of free physical memory is used.
TakeMaxRecursionDepthFromInput Input boolean True Copy the maximum recursion depth from the input workspace.
MaxRecursionDepth Input number 1000 Sets the maximum recursion depth to use. Can be used to constrain the workspaces internal structure

Description

Algorithm that can take a slice out of an original MDEventWorkspace while preserving all the events contained therein.

It uses the same parameters as BinMD v1 to determine a transformation to make from input->output workspace. The difference is that BinMD v1 sums events in a regular grid whereas SliceMD moves the events into the output workspace, which boxes itself.

Please see BinMD v1 for a detailed description of the parameters.

Axis-Aligned Slice

Events outside the range of the slice are dropped. The new output MDEventWorkspace’s dimensions only extend as far as the limit specified.

Non-Axis-Aligned Slice

The coordinates of each event are transformed according to the new basis vectors, and placed in the output MDEventWorkspace. The dimensions of the output workspace are along the basis vectors specified.

Splitting Parameters

The OutputBins parameter is interpreted as the “SplitInto” parameter for the top split-level in each dimension. For instance, if you want the output workspace to split in 2x2x2, you would specify OutputBins=”2,2,2”.

For 1D slices, it may make sense to specify a SplitInto parameter of 1 in every other dimension - that way, boxes will only be split along the 1D direction.

To force the box structure to match that defined in OutputBins, the MaxRecursionDepth property can be set to 1. If this is not the case then boxes will split further if sufficient events fall in the same box. Further splitting uses the value of “SplitInto” from the InputWorkspace.

Slicing a MDHistoWorkspace

It is possible to slice a MDHistoWorkspace. Each MDHistoWorkspace holds a reference to the MDEventWorkspace that created it, as well as the coordinate transformation that was used.

In this case, the algorithm is executed on the original MDEventWorkspace, in the proper coordinates. Perhaps surprisingly, the output of SliceMD on a MDHistoWorkspace is a MDEventWorkspace!

Only the non-axis aligned slice method can be performed on a MDHistoWorkspace! Of course, your basis vectors can be aligned with the dimensions, which is equivalent.

Usage

Example - Axis aligned binning

mdew = CreateMDWorkspace(Dimensions=3, Extents=[-10,10,-10,10,-10,10], Names='A, B, C', Units='U, U, U')
FakeMDEventData(mdew, PeakParams=[100000, 0, 0, 0, 1])

# Slice out all C > 0
sliced = SliceMD(InputWorkspace=mdew, AxisAligned=True, AlignedDim0='A,-10,10,10', AlignedDim1='B, -10, 10, 10', AlignedDim2='C,-10, 0, 10',)

dim0 = sliced.getDimension(0)
dim1 = sliced.getDimension(1)
dim2 = sliced.getDimension(2)

print("A extents {} {}".format(dim0.getMinimum(), dim0.getMaximum()))
print("B extents {} {}".format(dim1.getMinimum(), dim1.getMaximum()))
print("C extents {} {}".format(dim2.getMinimum(), dim2.getMaximum()))
print("Original MDEW should have 2*N events in sliced. We get a factor of :  {:.0f}".format(mdew.getNEvents() / sliced.getNEvents()))

Output:

A extents -10.0 10.0
B extents -10.0 10.0
C extents -10.0 0.0
Original MDEW should have 2*N events in sliced. We get a factor of :  2

Example - Non-axis aligned binning

import numpy

# Create a host workspace
mdew = CreateMDWorkspace(Dimensions=2, Extents=[-10,10,-10,10], Names='A, B', Units='U, U')
# Add a peak at -5,-5
FakeMDEventData(mdew, PeakParams=[100000, -5, -5, 1])
# Add a peak at 5, 5
FakeMDEventData(mdew, PeakParams=[100000, 5, 5, 1])
# Slice at 45 degrees. BasisVector0 now runs through both peaks
sliced = SliceMD(InputWorkspace=mdew, AxisAligned=False, BasisVector0='X, sqrt(2*U^2), 1,1', BasisVector1='Y, sqrt(2*U^2),-1,1',OutputBins=[100,1], OutputExtents=[-10,10,-10,10])

# Bin it to gather statistics
binned = BinMD(sliced, AxisAligned=True,  AlignedDim0='X, 0,10, 100', AlignedDim1='Y,-10,10,1')
signals = binned.getSignalArray()

dim_x = binned.getDimension(0)
x_axis= numpy.linspace(dim_x.getMinimum(), dim_x.getMaximum(), dim_x.getNBins())
x_at_max = x_axis[numpy.argmax(signals)]
print("Brightest region should be at x  = sqrt( 2*5*5 ) = 7.07. Found to be:  {0:.2f}".format(x_at_max))

Output:

Brightest region should be at x  = sqrt( 2*5*5 ) = 7.07. Found to be:  7.07

Categories: AlgorithmIndex | MDAlgorithms\Slicing

Source

C++ header: SliceMD.h (last modified: 2020-03-20)

C++ source: SliceMD.cpp (last modified: 2020-04-07)