Source code for blissoda.fluo.parameters.mosaic_fluoxas

from typing import Dict
from typing import List
from typing import Optional
from typing import Sequence
from typing import Tuple
from typing import Union

from .utils import directories
from .utils import models
from .workflows import mosaic_fluoxas_multi_detector
from .workflows import mosaic_fluoxas_multi_detector_align
from .workflows import mosaic_fluoxas_nofit_align
from .workflows import mosaic_fluoxas_single_detector
from .workflows import mosaic_fluoxas_single_detector_align


[docs] def mosaic_fluoxas_workflow_inputs( filenames: Sequence[Sequence[str]], output_root_uri: str, concat_output_root_uri: str, scan_ranges: Sequence[Sequence[Tuple[int, int]]], config_filenames: Sequence[str], instrument_name: Optional[str] = None, detectors: Optional[Sequence[Union[int, str]]] = None, detector_numbers: Optional[Sequence[int]] = None, detector_names: Optional[Sequence[str]] = None, fast_fitting: bool = True, quantification: bool = True, diagnostics: bool = True, livetime_ref_value: Union[str, int, float, None] = None, counter_ref_value: Union[str, int, float, None] = None, counter_name: Optional[str] = None, energy_name: Optional[str] = None, energy_multiplier: Optional[float] = 2, exclude_scans: Optional[Sequence[Sequence[Sequence[int]]]] = None, resolution: Optional[Dict[str, Tuple[Union[int, float], str]]] = None, do_align: bool = True, align_counter: Optional[str] = None, align_crop: Optional[bool] = True, fast_align_counter_selection: Optional[bool] = False, stack_axis: Optional[str] = None, real_axes: Optional[List[str]] = None, virtual_axes: Optional[Dict[str, str]] = None, ignore_axes: Optional[List[str]] = None, axis_units: Optional[Dict[str, str]] = None, group_by_index: bool = False, ) -> Tuple[str, List[dict]]: if len(filenames) != len(scan_ranges): raise ValueError( f"{len(filenames)} scan ranges (first, last) are needed for {len(filenames)} files" ) if not exclude_scans: exclude_scans = [()] * len(filenames) parameters = models.common_parameters_model( detectors=detectors, detector_numbers=detector_numbers, detector_names=detector_names, config_filenames=config_filenames, energy_name=energy_name, energy_multiplier=energy_multiplier, counter_name=counter_name, instrument_name=instrument_name, fast_fitting=fast_fitting, quantification=quantification, diagnostics=diagnostics, livetime_ref_value=livetime_ref_value, counter_ref_value=counter_ref_value, stack=True, real_axes=real_axes, virtual_axes=virtual_axes, ignore_axes=ignore_axes, axis_units=axis_units, ) parameters = models.MosaicFluoXasParameters( filenames=filenames, scan_ranges=scan_ranges, exclude_scans=exclude_scans, group_by_index=group_by_index, concat_output_root_uri=concat_output_root_uri, output_root_uri=output_root_uri, resolution=resolution, align_counter=align_counter, fast_align_counter_selection=fast_align_counter_selection, align_crop=align_crop, stack_axis=stack_axis, **parameters.model_dump(), ) if parameters.no_fit: workflow = mosaic_fluoxas_nofit_align.WORKFLOW inputs = mosaic_fluoxas_nofit_align.workflow_inputs(parameters) elif parameters.fit_single_detector: if do_align: workflow = mosaic_fluoxas_single_detector_align.WORKFLOW inputs = mosaic_fluoxas_single_detector_align.workflow_inputs(parameters) else: workflow = mosaic_fluoxas_single_detector.WORKFLOW inputs = mosaic_fluoxas_single_detector.workflow_inputs(parameters) else: if parameters.sum_spectra: raise ValueError( f"Sum before fit is not supported yet for FluoXAS. Provide {len(parameters.detector_names)} config files." ) if do_align: workflow = mosaic_fluoxas_multi_detector_align.WORKFLOW inputs = mosaic_fluoxas_multi_detector_align.workflow_inputs(parameters) else: workflow = mosaic_fluoxas_multi_detector.WORKFLOW inputs = mosaic_fluoxas_multi_detector.workflow_inputs(parameters) return workflow, inputs
[docs] def mosaic_fluoxas_paths( session: str, sample: str, datasets: Sequence[Sequence[str]], scan_ranges: Sequence[Sequence[Tuple[int, int]]], config_filenames: Sequence[str], dirname: Optional[str] = None, demo: bool = False, ) -> models.MosaicFluoXasPaths: filenames = [ [ directories.raw_directory(session, sample, dataset, demo=demo) for dataset in dataset_group ] for dataset_group in datasets ] first_dataset = datasets[0][0] first_scan_number = scan_ranges[0][0][0] concat_filename = directories.processed_path( session, sample, first_dataset, dirname, f"{sample}_{first_dataset}_concat.h5", demo=demo, ) output_filename = directories.processed_path( session, sample, first_dataset, dirname, f"{sample}_{first_dataset}.h5", demo=demo, ) convert_destination = directories.processed_path( session, sample, first_dataset, dirname, f"{sample}_{first_dataset}_scan{first_scan_number:04d}.json", demo=demo, ) concat_output_root_uri = concat_filename output_root_uri = f"{output_filename}::/{first_scan_number}.1" config_filenames = [ directories.pymca_config_path(session, s, demo=demo) for s in config_filenames ] workflow_path = directories.accessible_workflow_path( session, sample, first_dataset, dirname, demo=demo ) return models.MosaicFluoXasPaths( filenames=filenames, output_root_uri=output_root_uri, concat_output_root_uri=concat_output_root_uri, convert_destination=convert_destination, workflow_path=workflow_path, config_filenames=config_filenames, )