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

import numpy as np
import pandas as pd
import copy


[docs] def forward( transf, data, mapper, ddi, ddf, mode, runsubdir, workdir, **kwargs ): xmod = data.datastore inputs = transf.parameters_in.names outputs = transf.parameters_out.names r_std = transf.parameters_in.standard iso_mass = transf.parameters_out.iso_mass spec_mass = transf.parameters_out.spec_mass unit = transf.unit in_types = transf.component out_types = 2 * [transf.component[1]] keys = ['spec'] if mode == 'tl': keys.append('incr') for (trid, trid_out) in zip(mapper["inputs"], mapper["outputs"]): xmod[trid_out] = {k: xmod[trid][k] for k in xmod[trid]} xmod[trid_out]["spec"] = copy.deepcopy(xmod[trid]["spec"]) if mode == 'tl': xmod[trid_out]["incr"] = copy.deepcopy(xmod[trid]["incr"]) signature = xmod[(in_types[0], inputs[0])]['spec'] spec_data = xmod[(in_types[1], inputs[1])]['spec'] # Save signature and data for later use by adjoint transf.fwd_data = { 'signature': signature.values, 'spec_data': spec_data.values} a_factor = (1 + signature / 1000) * r_std xmod[(out_types[0], outputs[0])]['spec'] = \ spec_data / (1 + a_factor) xmod[(out_types[1], outputs[1])]['spec'] = \ spec_data * a_factor / (1 + a_factor) # Applying tangent linear if mode == 'tl': spec_data_tl = xmod[(in_types[1], inputs[1])]['incr'] signature_tl = xmod[(in_types[0], inputs[0])]['incr'] xmod[(out_types[0], outputs[0])]['incr'] = \ spec_data_tl / (1 + a_factor) \ - spec_data * r_std * signature_tl \ / (1000 * (1 + a_factor) ** 2) xmod[(out_types[1], outputs[1])]['incr'] = \ spec_data_tl * a_factor / (1 + a_factor) \ + spec_data * r_std * signature_tl \ / (1000 * (1 + a_factor) ** 2) # Mass correction if units are in mass if unit == 'mass': xmod[(out_types[0], outputs[0])]['spec'] *= \ (iso_mass[0] / spec_mass) xmod[(out_types[1], outputs[1])]['spec'] *= \ (iso_mass[1] / spec_mass) if mode == 'tl': xmod[(out_types[0], outputs[0])]['incr'] *= \ (iso_mass[0] / spec_mass) xmod[(out_types[1], outputs[1])]['incr'] *= \ (iso_mass[1] / spec_mass) # del xmod[(in_types[0], inputs[0])] # del xmod[(in_types[1], inputs[1])] data.datastore = xmod return data