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

import copy


[docs] def adjoint( transf, data, mapper, di, df, mode, runsubdir, workdir, **kwargs ): if mode != "adj": return data xmod = data.datastore 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 in_types = transf.component out_types = 2 * [transf.component[1]] for (trid, trid_out) in zip(mapper["inputs"], mapper["outputs"]): xmod[trid] = {k: xmod[trid_out][k] for k in xmod[trid_out]} xmod[trid]["adj_out"] = copy.deepcopy(xmod[trid_out]["adj_out"]) signature = transf.fwd_data["signature"] spec_data = transf.fwd_data["spec_data"] isotopologue_adj = xmod[(out_types[1], outputs[1])]["adj_out"] spec_ref_adj = xmod[(out_types[0], outputs[0])]["adj_out"] a_factor = (1 + signature / 1000) * r_std # Mass correction if units are in mass if unit == "mass": isotopologue_adj *= iso_mass[1] / spec_mass spec_ref_adj *= iso_mass[0] / spec_mass # Sensitivity to total xmod[(in_types[1], inputs[1])]["adj_out"] = ( a_factor * isotopologue_adj + spec_ref_adj ) / (1 + a_factor) # Sensitivity to signature xmod[(in_types[0], inputs[0])]["adj_out"] = ( r_std * spec_data * (isotopologue_adj - spec_ref_adj) / 1000 / (1 + a_factor) ** 2 ) del xmod[(out_types[0], outputs[0])] del xmod[(out_types[1], outputs[1])] data.datastore = xmod return data