Specular reflectivity reduction workflow

The specular reflectivity data reduction is build around the event_reduction.EventReflectivity class, which performs the reduction. A number of useful modules are available to handle parts of the workflow around the actual reduction.

Data sets

Specular reflectivity measurements at BL4B are done by combining several runs, taken at different scattering angle and wavelength band. To allow for the automation of the reduction process, several meta data entries are stored in the data files. To be able to know which data files belong together in a single reflectivity measurement, two important log entries are used:

  • sequence_id: The sequence ID identifies a unique reflectivity curve. All data runs with a matching sequence_id are put together to create a single reflectivity curve.
  • sequence_number: The sequence number identifies the location of a given run in the list of runs that define a full sequence. All sequences start at 1. For instance, a sequence number of 3 means that this run is the third of the complete set. This becomes important for storing reduction parameters.

Reduction parameters and templates

The reduction parameters are managed using the reduction_template_reader.ReductionParameters class. This class allows users to define and store the parameters required for the reduction process. By using this class, you can easily save, load, and modify the parameters, ensuring consistency and reproducibility in your data reduction workflow.

Compatibility with RefRed

Refred is the user interface that helps users define reduction parameters by selecting the data to process, peak and background regions, etc. A complete reflectivity curve is generally comprised of multiple runs, and RefRed allows one to save a so-called template file that contains all the information needs to reduce each run in the set. The reduction backend (this package) has utilities to read and write such templates, which are stored in XML format. A template consist of an ordered list of ReductionParameters objects, which corresponding to a specific sequence_number.

To read a templates and obtains a list of ReductionParameters objects:

from lr_reduction import reduction_template_reader

with open(template_file, "r") as fd:
    xml_str = fd.read()
    data_sets = reduction_template_reader.from_xml(xml_str)

From a list of ReductionParameters objects:

    xml_str = reduction_template_reader.to_xml(data_sets)
    with open(os.path.join(output_dir, "template.xml"), "w") as fd:
        fd.write(xml_str)

Reduction workflow

The main reduction workflow, which will extract specular reflectivity from a data file given a reduction template, is found in the workflow module. This workflow will is the one performed by the automated reduction system at BL4B:

  • It will extract the correct reduction parameters from the provided template
  • Perform the reduction and compute the reflectivity curve for that data
  • Combine the reflectivity curve segment with other runs belonging to the same set
  • Write out the complete reflectivity curve in an output file
  • Write out a copy of the template by replacing the run numbers in the template by those that were used

Once you have a template, you can simply do:

from lr_reduction import workflow
from mantid.simpleapi import LoadEventNexus

# Load the data from disk
ws = LoadEventNexus(Filename='/SNS/REF_L/IPTS-XXXX/nexus/REFL_YYYY.h5')

# The template file you want to use
template_file = '/SNS/REF_L/IPTS-XXXX/autoreduce/template.xml'

# The folder where you want your output
output_dir = '/tmp'

workflow.reduce(ws, template_file, output_dir)

Thie will produce output files in the speficied output directory.