# HG changeset patch # User muon-spectroscopy-computational-project # Date 1701867826 0 # Node ID 84c8e04bc1a12e31d709a12cf8fb1842b6701b7f # Parent 2752b2dd7ad65ab57250906c67702ace6fffd9fe planemo upload for repository https://github.com/MaterialsGalaxy/larch-tools/tree/main/larch_artemis commit 1cf6d7160497ba58fe16a51f00d088a20934eba6 diff -r 2752b2dd7ad6 -r 84c8e04bc1a1 common.py --- a/common.py Tue Nov 14 15:34:23 2023 +0000 +++ b/common.py Wed Dec 06 13:03:46 2023 +0000 @@ -7,38 +7,145 @@ def get_group(athena_group: AthenaGroup, key: str = None) -> Group: + group_keys = list(athena_group._athena_groups.keys()) if key is None: - group_keys = list(athena_group._athena_groups.keys()) key = group_keys[0] - return extract_athenagroup(athena_group._athena_groups[key]) + else: + key = key.replace("-", "_") + + try: + return extract_athenagroup(athena_group._athena_groups[key]) + except KeyError as e: + raise KeyError(f"{key} not in {group_keys}") from e + + +def read_all_groups(dat_file: str, key: str = None) -> "dict[str, Group]": + # Cannot rely on do_ABC as _larch is None + athena_group = read_athena( + dat_file, + do_preedge=False, + do_bkg=False, + do_fft=False, + ) + all_groups = {} + for key in athena_group._athena_groups.keys(): + group = get_group(athena_group, key) + pre_edge_with_defaults(group=group) + xftf_with_defaults(group=group) + all_groups[key] = group + + return all_groups + + +def read_group(dat_file: str, key: str = None): + # Cannot rely on do_ABC as _larch is None + athena_group = read_athena( + dat_file, + do_preedge=False, + do_bkg=False, + do_fft=False, + ) + group = get_group(athena_group, key) + pre_edge_with_defaults(group=group) + xftf_with_defaults(group=group) + return group -def read_group(dat_file: str, key: str = None, xftf_params: dict = None): - athena_group = read_athena(dat_file) - group = get_group(athena_group, key) - bkg_parameters = group.athena_params.bkg - print(group.athena_params.fft) - print(group.athena_params.fft.__dict__) - pre_edge( - group, - e0=bkg_parameters.e0, - pre1=bkg_parameters.pre1, - pre2=bkg_parameters.pre2, - norm1=bkg_parameters.nor1, - norm2=bkg_parameters.nor2, - nnorm=bkg_parameters.nnorm, - make_flat=bkg_parameters.flatten, +def pre_edge_with_defaults(group: Group, settings: dict = None): + merged_settings = {} + try: + bkg_parameters = group.athena_params.bkg + except AttributeError as e: + print(f"Cannot load group.athena_params.bkg from group:\n{e}") + bkg_parameters = None + + keys = ( + ("e0", "e0", None), + ("pre1", "pre1", None), + ("pre2", "pre2", None), + ("norm1", "nor1", None), + ("norm2", "nor2", None), + ("nnorm", "nnorm", None), + ("make_flat", "flatten", None), + ("step", "step", None), + # This cannot be read from file as it is not stored by Larch (0.9.71) + # ("nvict", "nvict", None), ) - autobk(group) - if xftf_params is None: - xftf(group) - else: - print(xftf_params) - xftf(group, **xftf_params) - xftf_details = Group() - setattr(xftf_details, "call_args", xftf_params) - group.xftf_details = xftf_details - return group + for key, parameters_key, default in keys: + extract_attribute( + merged_settings, key, bkg_parameters, parameters_key, default + ) + + if settings: + for k, v in settings.items(): + if k == "nvict": + print( + "WARNING: `nvict` can be used for pre-edge but is not " + "saved to file, so value used will not be accessible in " + "future operations using this Athena .prj" + ) + merged_settings[k] = v + + print(f"Pre-edge normalization with {merged_settings}") + try: + pre_edge(group, **merged_settings) + except Warning as e: + raise Warning( + "Unable to perform pre-edge fitting with:\n\n" + f"energy:\n{group.energy}\n\nmu:{group.mu}\n\n" + "Consider checking the correct columns have been extracted" + ) from e + autobk(group, pre_edge_kws=merged_settings) + + +def xftf_with_defaults(group: Group, settings: dict = None): + merged_settings = {} + try: + fft_parameters = group.athena_params.fft + except AttributeError as e: + print(f"Cannot load group.athena_params.fft from group:\n{e}") + fft_parameters = None + + keys = ( + ("kmin", "kmin", 0), + ("kmax", "kmax", 20), + ("dk", "dk", 1), + ("kweight", "kw", 2), + ("kweight", "kweight", 2), + ("window", "kwindow", "kaiser"), + ) + for key, parameters_key, default in keys: + extract_attribute( + merged_settings, key, fft_parameters, parameters_key, default + ) + + if settings: + for k, v in settings.items(): + merged_settings[k] = v + + print(f"XFTF with {merged_settings}") + xftf(group, **merged_settings) + xftf_details = Group() + setattr(xftf_details, "call_args", merged_settings) + group.xftf_details = xftf_details + + +def extract_attribute( + merged_settings: dict, + key: str, + parameters_group: Group, + parameters_key: str, + default: "str|int" = None, +): + if parameters_group is not None: + try: + merged_settings[key] = getattr(parameters_group, parameters_key) + return + except AttributeError: + pass + + if default is not None: + merged_settings[key] = default def read_groups(dat_files: "list[str]", key: str = None) -> Iterable[Group]: diff -r 2752b2dd7ad6 -r 84c8e04bc1a1 larch_artemis.py --- a/larch_artemis.py Tue Nov 14 15:34:23 2023 +0000 +++ b/larch_artemis.py Wed Dec 06 13:03:46 2023 +0000 @@ -5,20 +5,16 @@ import os import sys -from common import get_group +from common import read_group from larch.fitting import guess, param, param_group -from larch.io import read_athena from larch.symboltable import Group from larch.xafs import ( FeffPathGroup, FeffitDataSet, TransformGroup, - autobk, feffit, feffit_report, - pre_edge, - xftf, ) import matplotlib @@ -39,14 +35,6 @@ return csv_data -def calc_with_defaults(xafs_group: Group) -> Group: - """Calculate pre_edge and background with default arguments""" - pre_edge(xafs_group) - autobk(xafs_group) - xftf(xafs_group) - return xafs_group - - def dict_to_gds(data_dict): dgs_group = param_group() for par_idx in data_dict: @@ -209,12 +197,10 @@ rmr_path = f"rmr/rmr{series_id}.png" chikr_path = f"chikr/chikr{series_id}.png" - athena_project = read_athena(prj_file) - athena_group = get_group(athena_project) # calc_with_defaults will hang indefinitely (>6 hours recorded) if the # data contains any NaNs - consider adding an early error here if this is # not fixed in Larch? - data_group = calc_with_defaults(athena_group) + data_group = read_group(prj_file) print(f"Fitting project from file {data_group.filename}") diff -r 2752b2dd7ad6 -r 84c8e04bc1a1 larch_artemis.xml --- a/larch_artemis.xml Tue Nov 14 15:34:23 2023 +0000 +++ b/larch_artemis.xml Wed Dec 06 13:03:46 2023 +0000 @@ -4,7 +4,7 @@ 0.9.71 - 0 + 1 10.1088/1742-6596/430/1/012007 @@ -40,6 +40,7 @@ + Filtered k-space - + + + + + + + + + + + + + + diff -r 2752b2dd7ad6 -r 84c8e04bc1a1 macros.xml --- a/macros.xml Tue Nov 14 15:34:23 2023 +0000 +++ b/macros.xml Wed Dec 06 13:03:46 2023 +0000 @@ -1,26 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + \ No newline at end of file