RosettaSciIO can read .spx single spectrum and .bcf “hypermaps” file formats saved with Bruker’s Esprit v1.x or v2.x in .bcf hybrid (virtual file system/container with xml and binary data, optionally compressed) format. Most .bcf import functionality is implemented. Both high-resolution 16-bit SEM images and hyperspectral EDX data can be retrieved simultaneously.

BCF can look as all inclusive format, however it does not save some key EDS parameters: any of dead/live/real times, full width at half maximum (FWHM) at \(Mn_{K\alpha}\) line. However, real time for whole map is calculated from metadata (pixelAverage, lineAverage, pixelTime, lineCounter and map height).

Note that Bruker Esprit uses a similar format for EBSD data, but it is not currently supported by RosettaSciIO.

The format contains an extensive list of details and parameters of EDS analyses which in HyperSpy are mapped to the metadata and original_metadata dictionaries.

API functions#

rsciio.bruker.file_reader(filename, lazy=False, select_type=None, index=None, downsample=1, cutoff_at_kV=None, instrument=None)#

Read a Bruker .bcf or .spx file.

filenamestr, pathlib.Path

Filename of the file to read or corresponding pathlib.Path.

lazybool, default=False

Whether to open the file lazily or not.

select_type'spectrum_image', 'image' or None, default=None

If specified, only the corresponding type of data, either spectrum image or image, is returned. By default (None), all data are loaded.

indexint, None or str, default=None

Allow to select the index of the dataset in the .bcf file, which can contain several datasets. The default value (None) results in loading the first dataset. When set to 'all', all available datasets will be loaded and returned as separate signals.

downsampleint, default=1

The downsampling ratio of a hyperspectral array (height and width only), can be an integer >=1, where value of 1 results in no downsampling. The underlying method of downsampling is unchangeable: sum. Differently than :py:func:skimage.measure.block_reduce, it is memory efficient as it doesn’t create intermediate arrays.

cutoff_at_kVint, float, 'zealous', 'auto' or None, default=None

It can be used either to crop or enlarge the energy (or number of channels) range at max values. It can be used to conserve memory or enlarge the range if needed to mach the size of other file. The default value (None) does not influence the size. Numerical values should be in kV. 'zealous' truncates to the last non zero channel (this option should not be used for stacks, as low beam current EDS can have a different last non zero channel per slice). 'auto' truncates channels to SEM/TEM acceleration voltage or energy at last channel, depending which is smaller. In case the hv info is not there or hv is off (0 kV) then it falls back to the full channel range.

instrumentstr or None, default=None

Can be either 'TEM' or 'SEM'.

list of dict

List of dictionaries containing the following fields:

  • ‘data’ – multidimensional numpy.ndarray or dask.array.Array

  • ‘axes’ – list of dictionaries describing the axes containing the fields ‘name’, ‘units’, ‘index_in_array’, and either ‘size’, ‘offset’, and ‘scale’ or a numpy array ‘axis’ containing the full axes vector

  • ‘metadata’ – dictionary containing the parsed metadata

  • ‘original_metadata’ – dictionary containing the full metadata tree from the input file

When the file contains several datasets, each dataset will be loaded as separate dictionary.


Example of loading reduced (downsampled, and with energy range cropped) “spectrum only” data from bcf (original shape: 80 keV EDS range (4096 channels), 100x75 pixels; SEM acceleration voltage: 20kV):

>>> file_reader("sample80kv.bcf", select_type='spectrum_image',
                downsample=2, cutoff_at_kV=10)

Load the same file with limiting array size to SEM acceleration voltage:

>>> file_reader("sample80kv.bcf", cutoff_at_kV='auto')

The loaded array energy dimension can by forced to be larger than the data recorded by setting the ‘cutoff_at_kV’ kwarg to higher value:

>>> file_reader("sample80kv.bcf", cutoff_at_kV=60)

Loading without setting cutoff_at_kV value would return data with all 4096 channels. Note that setting downsample higher than 1 currently locks out using SEM images for navigation in the plotting.