Source code for pycif.plugins.transforms.system.toobsvect.perturb_transform

import copy
from logging import debug

import numpy as np


[docs] def perturb_transform(self, nsamples, dir_samples, file_samples, transf_mapper): obsvect = self.obsvect datavect = obsvect.datavect components = datavect.components # Save original dimension if not hasattr(obsvect, "dim_ref"): obsvect.dim_ref = obsvect.dim # Update data vector to fit samples trid2clean = [] nmembers = 0 for trid in transf_mapper["inputs"]: comp = trid[0] trcr = trid[1] if "__sample#" not in trcr: continue trcr_ref = trcr.split("__sample#")[0] member_ID = int(trcr.split("__sample#")[1]) nmembers = max(nmembers, member_ID) component = getattr(components, comp) params = component.parameters if not hasattr(params, trcr_ref): debug( f"Skipping {trid} for 'tooobsvect' as {trcr_ref} " "is not in datavect" ) continue tracer = getattr(params, trcr_ref) params.attributes.append(trcr) trid2clean.append((comp, trcr_ref)) # Copy tracer tracer_out = tracer.__class__(plg_orig=tracer) setattr(params, trcr, tracer_out) # Update tracer pointer tracer_out.ypointer = tracer.ypointer + member_ID * obsvect.dim # Update tracer datastore tracer_out.datastore = copy.deepcopy(tracer_out.datastore) if tracer_out.datastore["metadata"]["parameter"].dtype == 'category': tracer_out.datastore.loc[:, ("metadata", "parameter")] = \ tracer_out.datastore["metadata"]["parameter"].cat.add_categories( trcr) tracer_out.datastore.loc[ tracer_out.datastore["metadata"]["parameter"] == trcr_ref, ("metadata", "parameter")] = trcr # Update obsvect dimension and data obsvect.dim = (nmembers + 1) * obsvect.dim_ref # Extend data according to new dimension for data_id in ["dy", "ysim", "yobs", "yobs_err", "obsvect_mask"]: setattr(obsvect, data_id, np.tile(getattr(obsvect, data_id), nmembers + 1)) # Removing non-perturbed tracers for trid in set(trid2clean): comp = trid[0] trcr = trid[1] component = getattr(components, comp) params = component.parameters params.attributes.remove(trcr) delattr(params, trcr)