diff options
Diffstat (limited to 'utils/misc.py')
| -rw-r--r-- | utils/misc.py | 242 |
1 files changed, 30 insertions, 212 deletions
diff --git a/utils/misc.py b/utils/misc.py index f0c1ad4..59c5edb 100644 --- a/utils/misc.py +++ b/utils/misc.py @@ -9,7 +9,7 @@ Misc functions for the BSM flavour ratio analysis from __future__ import absolute_import, division -import os, sys +import os import errno import multiprocessing @@ -19,174 +19,7 @@ from operator import attrgetter import numpy as np -from utils.enums import Likelihood, ParamTag - - -class Param(object): - """Parameter class to store parameters. - """ - def __init__(self, name, value, ranges, seed=None, std=None, tex=None, tag=None): - self._seed = None - self._ranges = None - self._tex = None - self._tag = None - - self.name = name - self.value = value - self.seed = seed - self.ranges = ranges - self.std = std - self.tex = tex - self.tag = tag - - @property - def ranges(self): - return tuple(self._ranges) - - @ranges.setter - def ranges(self, values): - self._ranges = [val for val in values] - - @property - def seed(self): - if self._seed is None: return self.ranges - return tuple(self._seed) - - @seed.setter - def seed(self, values): - if values is None: return - self._seed = [val for val in values] - - @property - def tex(self): - return r'{0}'.format(self._tex) - - @tex.setter - def tex(self, t): - self._tex = t if t is not None else r'{\rm %s}' % self.name - - @property - def tag(self): - return self._tag - - @tag.setter - def tag(self, t): - if t is None: self._tag = ParamTag.NONE - else: - assert t in ParamTag - self._tag = t - - -class ParamSet(Sequence): - """Container class for a set of parameters. - """ - def __init__(self, *args): - param_sequence = [] - for arg in args: - try: - param_sequence.extend(arg) - except TypeError: - param_sequence.append(arg) - - if len(param_sequence) != 0: - # Disallow duplicated params - all_names = [p.name for p in param_sequence] - unique_names = set(all_names) - if len(unique_names) != len(all_names): - duplicates = set([x for x in all_names if all_names.count(x) > 1]) - raise ValueError('Duplicate definitions found for param(s): ' + - ', '.join(str(e) for e in duplicates)) - - # Elements of list must be Param type - assert all([isinstance(x, Param) for x in param_sequence]), \ - 'All params must be of type "Param"' - - self._params = param_sequence - - def __len__(self): - return len(self._params) - - def __getitem__(self, i): - if isinstance(i, int): - return self._params[i] - elif isinstance(i, basestring): - return self._by_name[i] - - def __getattr__(self, attr): - try: - return super(ParamSet, self).__getattribute__(attr) - except AttributeError: - t, v, tb = sys.exc_info() - try: - return self[attr] - except KeyError: - raise t, v, tb - - def __iter__(self): - return iter(self._params) - - def __str__(self): - o = '\n' - for obj in self._params: - o += '== {0:<15} = {1:<15}, tag={2:<15}\n'.format( - obj.name, obj.value, obj.tag - ) - return o - - @property - def _by_name(self): - return {obj.name: obj for obj in self._params} - - @property - def names(self): - return tuple([obj.name for obj in self._params]) - - @property - def labels(self): - return tuple([obj.tex for obj in self._params]) - - @property - def values(self): - return tuple([obj.value for obj in self._params]) - - @property - def seeds(self): - return tuple([obj.seed for obj in self._params]) - - @property - def ranges(self): - return tuple([obj.ranges for obj in self._params]) - - @property - def stds(self): - return tuple([obj.std for obj in self._params]) - - @property - def tags(self): - return tuple([obj.tag for obj in self._params]) - - @property - def params(self): - return self._params - - def to_dict(self): - return {obj.name: obj.value for obj in self._params} - - def from_tag(self, tag, values=False, index=False, invert=False): - if values and index: assert 0 - tag = np.atleast_1d(tag) - if not invert: - ps = [(idx, obj) for idx, obj in enumerate(self._params) - if obj.tag in tag] - else: - ps = [(idx, obj) for idx, obj in enumerate(self._params) - if obj.tag not in tag] - if values: - return tuple([io[1].value for io in ps]) - elif index: - return tuple([io[0] for io in ps]) - else: - return ParamSet([io[1] for io in ps]) +from utils.enums import Likelihood class SortingHelpFormatter(argparse.HelpFormatter): @@ -197,54 +30,32 @@ class SortingHelpFormatter(argparse.HelpFormatter): def gen_identifier(args): - mr = args.measured_ratio - si = args.sigma_ratio + f = '_DIM{0}'.format(args.dimension) + mr1, mr2, mr3 = args.measured_ratio if args.fix_source_ratio: - sr = args.source_ratio + sr1, sr2, sr3 = args.source_ratio + f += '_sfr_{0:03d}_{1:03d}_{2:03d}_mfr_{3:03d}_{4:03d}_{5:03d}'.format( + int(sr1*100), int(sr2*100), int(sr3*100), + int(mr1*100), int(mr2*100), int(mr3*100) + ) if args.fix_mixing: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_sfr_{4:03d}_{5:03d}_{6:03d}_DIM{7}_fix_mixing'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), int(si*1000), - int(sr[0]*100), int(sr[1]*100), int(sr[2]*100), args.dimension - ) + f += '_fix_mixing' elif args.fix_mixing_almost: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_sfr_{4:03d}_{5:03d}_{6:03d}_DIM{7}_fix_mixing_almost'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), int(si*1000), - int(sr[0]*100), int(sr[1]*100), int(sr[2]*100), args.dimension - ) + f += '_fix_mixing_almost' elif args.fix_scale: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_sfr_{4:03d}_{5:03d}_{6:03d}_DIM{7}_fixed_scale_{8}'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), int(si*1000), - int(sr[0]*100), int(sr[1]*100), int(sr[2]*100), args.dimension, - args.scale - ) - else: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_sfr_{4:03d}_{5:03d}_{6:03d}_DIM{7}_single_scale'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), int(si*1000), - int(sr[0]*100), int(sr[1]*100), int(sr[2]*100), args.dimension - ) + f += '_fix_scale_{0}'.format(args.scale) else: - if args.fix_mixing: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_DIM{4}_fix_mixing'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), - int(si*1000), args.dimension - ) - elif args.fix_mixing_almost: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_DIM{4}_fix_mixing_almost'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), - int(si*1000), args.dimension - ) - elif args.fix_scale: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_DIM{4}_fixed_scale_{5}'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), - int(si*1000), args.dimension, args.scale - ) - else: - out = '_{0:03d}_{1:03d}_{2:03d}_{3:04d}_DIM{4}'.format( - int(mr[0]*100), int(mr[1]*100), int(mr[2]*100), - int(si*1000), args.dimension - ) - if args.likelihood is Likelihood.FLAT: out += '_flat' - return out + f += '_mfr_{3:03d}_{4:03d}_{5:03d}'.format(mr1, mr2, mr3) + if args.fix_mixing: + f += '_fix_mixing' + elif args.fix_mixing_almost: + f += '_fix_mixing_almost' + elif args.fix_scale: + f += '_fix_scale_{0}'.format(args.scale) + if args.likelihood is Likelihood.FLAT: f += '_flat' + elif args.likelihood is Likelihood.GAUSSIAN: + f += '_sigma_{0:03d}'.format(int(args.sigma_ratio*1000)) + return f def gen_outfile_name(args): @@ -314,6 +125,13 @@ def make_dir(outfile): raise +def seed_parse(s): + if s.lower() == 'none': + return None + else: + return int(s) + + def thread_type(t): if t.lower() == 'max': return multiprocessing.cpu_count() |
