aboutsummaryrefslogtreecommitdiffstats
path: root/utils/misc.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils/misc.py')
-rw-r--r--utils/misc.py242
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()