Source code for pycif.plugins.transforms.complex.isotopes.obsvect2native

import numpy as np
import pandas as pd


[docs] def obsvect2native( transf, y0, mapper, mod_input, ddi, ddf, mode, runsubdir, workdir, **kwargs ): y0.loc[:, "indorig"] = np.arange(len(y0)) y0.loc[:, "parameter_ref"] = y0["parameter"] inputs = transf.parameters_in.names outputs = transf.parameters_out.names unit = transf.unit r_std = transf.parameters_in.standard iso_mass = transf.parameters_out.iso_mass spec_mass = transf.parameters_out.spec_mass # Just splitting into two sub-species in the dataframe mask = y0["parameter"].str.lower().isin([s.lower() for s in inputs]) df = y0.loc[mask].copy() df = pd.concat([df.assign(parameter=iso.lower()) for iso in outputs]) # Computing adjoint if needed if mode == "adj": mask_tot = df["parameter_ref"] == inputs[1].lower() mask_iso = df["parameter_ref"] == inputs[0].lower() mask_spec_ref = (df["parameter"] == outputs[0].lower()) & mask_iso mask_isotopologue = ( df["parameter"] == outputs[1].lower() ) & mask_iso incr = 0 * df["obs_incr"] incr_spec_ref = df.loc[mask_spec_ref, "obs_incr"] incr_isotopologue = df.loc[mask_isotopologue, "obs_incr"] # Fetch simulation from previous forward isotopologue = transf.fwd_data[ddi]["isotopologue_iso"] spec_ref = transf.fwd_data[ddi]["spec_ref_iso"] incr.loc[mask_tot] = df.loc[mask_tot, "obs_incr"] incr.loc[mask_spec_ref] = ( -isotopologue / spec_ref ** 2 * incr_spec_ref * 1000 / r_std ) incr.loc[mask_isotopologue] = ( 1 / spec_ref * incr_isotopologue * 1000 / r_std ) df.loc[:, "obs_incr"] = incr y0 = pd.concat([df, y0.loc[~mask]]) y0 = y0.sort_values(['indorig', 'parameter']) return y0