""" This module deals with partial correlations. It is an attempt to migrate over the partial correlations feature from GeneNetwork1. """ from typing import Sequence from functools import reduce def control_samples(controls: Sequence[dict], sampleslist: Sequence[str]): """ Fetches data for the control traits. This migrates `web/webqtl/correlation/correlationFunction.controlStrain` in GN1, with a few modifications to the arguments passed in. PARAMETERS: controls: A map of sample names to trait data. Equivalent to the `cvals` value in the corresponding source function in GN1. sampleslist: A list of samples. Equivalent to `strainlst` in the corresponding source function in GN1 """ def __process_control__(trait_data): def __process_sample__(acc, sample): if sample in trait_data["data"].keys(): sample_item = trait_data["data"][sample] val = sample_item["value"] if val is not None: return ( acc[0] + (sample,), acc[1] + (val,), acc[2] + (sample_item["variance"],)) return acc return reduce( __process_sample__, sampleslist, (tuple(), tuple(), tuple())) return reduce( lambda acc, item: ( acc[0] + (item[0],), acc[1] + (item[1],), acc[2] + (item[2],), acc[3] + (len(item[0]),), ), [__process_control__(trait_data) for trait_data in controls], (tuple(), tuple(), tuple(), tuple())) def dictify_by_samples(samples_vals_vars: Sequence[Sequence]) -> dict: """ Build a sequence of dictionaries from a sequence of separate sequences of samples, values and variances. This is a partial migration of `web.webqtl.correlation.correlationFunction.fixStrains` function in GN1. This implementation extracts code that will find common use, and that will find use in more than one place. """ return tuple( { sample: {"sample_name": sample, "value": val, "variance": var} for sample, val, var in zip(*trait_line) } for trait_line in zip(*(samples_vals_vars[0:3])))