Source code for mkShapesRDF.shapeAnalysis.latinos.LatinosUtils
[docs]
def flatten_samples(samples):
"""
flatten the subsamples (create full samples named sample_subsample, or flatten_samples_map(sample, subsample))
Parameters
----------
samples : dict
samples dictionary, will be modified in place
Returns
-------
list
subsamplesmap is returned e.g. ``[(sample, [sample_subsample1, sample_subsample2])]``
"""
subsamplesmap = []
for sname in list(samples.keys()):
sample = samples[sname]
if "subsamples" not in sample:
continue
flatten_samples_map = samples[sname].get(
"flatten_samples_map", lambda sname, sub: "%s_%s" % (sname, sub)
)
subsamplesmap.append((sname, []))
for sub in sample["subsamples"]:
new_subsample_name = flatten_samples_map(sname, sub)
samples[new_subsample_name] = sample
subsamplesmap[-1][1].append(new_subsample_name)
sample.pop("subsamples")
samples.pop(sname)
return subsamplesmap
[docs]
def flatten_cuts(cuts):
"""
flatten the categories (create full cuts named cut_category)
Parameters
----------
cuts : dict
cuts dictionary, will be modified in place
Returns
-------
list
categoriesmap is returned e.g. ``[(cut, [cut_category1, cut_category2])]``
"""
categoriesmap = []
for cname in list(cuts.keys()):
cut = cuts[cname]
if "categories" not in cut:
continue
categoriesmap.append((cname, []))
for cat in cut["categories"]:
cuts["%s_%s" % (cname, cat)] = cut
categoriesmap[-1][1].append("%s_%s" % (cname, cat))
cut.pop("categories")
cuts.pop(cname)
return categoriesmap
[docs]
def update_variables_with_categories(variables, categoriesmap):
"""
Update variables dict with the flatten categories.
variables can have "cuts" specifications
Parameters
----------
variables : dict
variables dictionary, will be modified in place
categoriesmap : list
categoriesmap as returned by flatten_cuts
"""
for variable in variables.items():
if "cuts" not in variable:
continue
cutspec = variable["cuts"]
for cname, categories in categoriesmap:
if cname not in cutspec:
continue
# original cut is in the spec
cutspec.remove(cname)
# if a category (subcut) is also in the spec, we won't touch this variable
if len(set(cutspec) & set(categories)) != 0:
continue
# otherwise we replace the cut with all the categories
cutspec.extend(categories)
[docs]
def update_nuisances_with_subsamples(nuisances, subsamplesmap):
"""
Update nuisances dict with the flatten subsamples.
Parameters
----------
nuisances : dict
nuisances dictionary, will be modified in place
subsamplesmap : list
subsamplesmap as returned by flatten_samples
"""
for nuisance in nuisances.items():
if "samples" not in nuisance:
continue
samplespec = nuisance["samples"]
for sname, subsamples in subsamplesmap:
if sname not in samplespec:
continue
# original sample is in the spec
sconfig = samplespec.pop(sname)
# if a subsample is also in the spec, we won't toucn this any more
if len(set(samplespec.keys()) & set(subsamples)) != 0:
continue
# otherwise we replace the sample with all the subsamples
samplespec.update((subsample, sconfig) for subsample in subsamples)
[docs]
def update_nuisances_with_categories(nuisances, categoriesmap):
"""
Update nuisances dict with the flatten categories.
Parameters
----------
nuisances : dict
nuisances dictionary, will be modified in place
categoriesmap : list
categoriesmap as returned by flatten_samples
"""
for nuisance in nuisances.values():
if "cuts" not in nuisance:
continue
cutspec = nuisance["cuts"]
for cname, categories in categoriesmap:
if cname not in cutspec:
continue
# original cut is in the spec
cutspec.remove(cname)
# if a category (subcut) is also in the spec, we won't touch this nuisance
if len(set(cutspec) & set(categories)) != 0:
continue
# otherwise we replace the cut with all the categories
cutspec.extend(categories)