def __init__(self, plotter, item): import yaml super().__init__(plotter, item) if 'constraints' not in item: raise KeyError('no constraints specified') # extract information self.names = item['constraints'] self.rotation = 'vertical' if 'rotation' not in item else item['rotation'] self.constraints = [] if type(self.names) == str: self.names = [self.names] constraints = eos.Constraints() for name in self.names: entry = constraints[name] if not entry: raise ValueError('unknown constraint {}'.format(name)) constraint = yaml.load(entry.serialize(), Loader=yaml.SafeLoader) self.constraints.append(constraint)
def plot_constraint(self, item): import yaml constraints = eos.Constraints() if 'constraints' not in item: raise KeyError('no constraints specified') names = item['constraints'] if type(names) == str: names = [names] for name in names: entry = constraints[name] if not entry: raise ValueError('unknown constraint {}'.format(name)) constraint = yaml.load(entry.serialize()) xvalues = None xerrors = None yvalues = None yerrors = None if constraint['type'] == 'Gaussian': kinematics = constraint['kinematics'] width = 1 if item['variable'] in kinematics: xvalues = [kinematics[item['variable']]] xerrors = None elif (item['variable'] + '_min' in kinematics) and (item['variable'] + '_max' in kinematics): xvalues = [(kinematics[item['variable'] + '_max'] + kinematics[item['variable'] + '_min']) / 2] xerrors = [(kinematics[item['variable'] + '_max'] - kinematics[item['variable'] + '_min']) / 2] if item['rescale-by-width']: width = (kinematics[item['variable'] + '_max'] - kinematics[item['variable'] + '_min']) yvalues = [constraint['mean'] / width] sigma_hi = np.sqrt( float(constraint['sigma-stat']['hi'])**2 + float(constraint['sigma-sys']['hi'])**2) / width sigma_lo = np.sqrt( float(constraint['sigma-stat']['lo'])**2 + float(constraint['sigma-sys']['lo'])**2) / width yerrors = [[sigma_hi, sigma_lo]] elif constraint['type'] == 'MultivariateGaussian(Covariance)': if 'observable' not in item: raise KeyError( 'observable needs to be specified for MultivariateGaussian(Covariance) constraints' ) dim = constraint['dim'] covariance = np.array(constraint['covariance']) observables = constraint['observables'] means = constraint['means'] kinematics = constraint['kinematics'] xvalues = [] xerrors = [] yvalues = [] yerrors = [] for i in range(0, dim): width = 1 if not observables[i] == item['observable']: continue _kinematics = kinematics[i] if item['variable'] in _kinematics: xvalues.append(_kinematics[item['variable']]) xerrors.append(0) elif (item['variable'] + '_min' in _kinematics) and (item['variable'] + '_max' in _kinematics): xvalues.append( (_kinematics[item['variable'] + '_max'] + _kinematics[item['variable'] + '_min']) / 2) xerrors.append( (_kinematics[item['variable'] + '_max'] - _kinematics[item['variable'] + '_min']) / 2) if item['rescale-by-width']: width = (_kinematics[item['variable'] + '_max'] - _kinematics[item['variable'] + '_min']) yvalues.append(means[i] / width) yerrors.append(np.sqrt(covariance[i, i]) / width) elif constraint['type'] == 'MultivariateGaussian': if 'observable' not in item: raise KeyError( 'observable needs to be specified for MultivariateGaussian constraints' ) dim = constraint['dim'] sigma_stat_hi = np.array(constraint['sigma-stat-hi']) sigma_stat_lo = np.array(constraint['sigma-stat-lo']) sigma_sys = np.array(constraint['sigma-sys']) sigma = np.sqrt( np.power(sigma_sys, 2) + 0.25 * np.power(sigma_stat_hi + sigma_stat_lo, 2)) observables = constraint['observables'] means = constraint['means'] kinematics = constraint['kinematics'] xvalues = [] xerrors = [] yvalues = [] yerrors = [] for i in range(0, dim): width = 1 if not observables[i] == item['observable']: continue _kinematics = kinematics[i] if item['variable'] in _kinematics: xvalues.append(_kinematics[item['variable']]) xerrors.append(0) elif (item['variable'] + '_min' in _kinematics) and (item['variable'] + '_max' in _kinematics): xvalues.append( (_kinematics[item['variable'] + '_max'] + _kinematics[item['variable'] + '_min']) / 2) xerrors.append( (_kinematics[item['variable'] + '_max'] - _kinematics[item['variable'] + '_min']) / 2) if item['rescale-by-width']: width = (_kinematics[item['variable'] + '_max'] - _kinematics[item['variable'] + '_min']) yvalues.append(means[i] / width) yerrors.append(sigma[i] / width) else: raise ValueError('type of constraint presently not supported') xvalues = np.array(xvalues) if xerrors: xerrors = np.array(xerrors) yvalues = np.array(yvalues) yerrors = np.array(yerrors) color = item['color'] if 'color' in item else 'black' label = item['label'] if 'label' in item else None plt.errorbar(x=xvalues, y=yvalues, xerr=xerrors, yerr=yerrors.T, color=color, elinewidth=1.0, fmt='_', linestyle='none', label=label)
#!/usr/bin/python3 # vim: set sw=4 sts=4 et tw=120 : import eos import re import yaml constraints = eos.Constraints() def latex_to_rst(s): return (re.sub(r'\$([^\$]*)\$', r':math:`\1`', s)) page_title = 'List of Constraints' print('#' * len(page_title)) print(page_title) print('#' * len(page_title)) print('\n') print( 'The following is the full list of likelihood constraints (both experimental and theoretical) included in EOS v{}.\n\n' .format(eos.__version__)) print('\n') print('.. list-table::') print(' :widths: 50,50') print(' :header-rows: 1') print('') print(' * - Qualified Name') print(' - Observables') for qn, entry in constraints: print(' * - ``{qn}``'.format(qn=qn))
def plot(self): import yaml constraints = eos.Constraints() for name in self.names: entry = constraints[name] if not entry: raise ValueError('unknown constraint {}'.format(name)) constraint = yaml.load(entry.serialize(), Loader=yaml.SafeLoader) xvalues = None xerrors = None yvalues = None yerrors = None if constraint['type'] == 'Gaussian': kinematics = constraint['kinematics'] width = 1 if self.variable in kinematics: xvalues = [kinematics[self.variable]] xerrors = None elif (self.variable + '_min' in kinematics) and (self.variable + '_max' in kinematics): xvalues = [(kinematics[self.variable + '_max'] + kinematics[self.variable + '_min']) / 2] xerrors = [(kinematics[self.variable + '_max'] - kinematics[self.variable + '_min']) / 2] if self.rescale_by_width: width = (kinematics[self.variable + '_max'] - kinematics[self.variable + '_min']) yvalues = [float(constraint['mean']) / width] sigma_hi = np.sqrt(float(constraint['sigma-stat']['hi'])**2 + float(constraint['sigma-sys']['hi'])**2) / width sigma_lo = np.sqrt(float(constraint['sigma-stat']['lo'])**2 + float(constraint['sigma-sys']['lo'])**2) / width yerrors = [[sigma_hi, sigma_lo]] elif constraint['type'] == 'MultivariateGaussian(Covariance)': if not self.observable: raise KeyError('observable needs to be specified for MultivariateGaussian(Covariance) constraints') dim = constraint['dim'] covariance = np.array(constraint['covariance']) observables = constraint['observables'] means = constraint['means'] kinematics = constraint['kinematics'] xvalues = [] xerrors = [] yvalues = [] yerrors = [] for i in range(0, dim): width = 1 if not observables[i] == self.observable: continue _kinematics = kinematics[i] if self.variable in _kinematics: xvalues.append(_kinematics[self.variable]) xerrors = None elif (self.variable + '_min' in _kinematics) and (self.variable + '_max' in _kinematics): xvalues.append((_kinematics[self.variable + '_max'] + _kinematics[self.variable + '_min']) / 2) xerrors.append((_kinematics[self.variable + '_max'] - _kinematics[self.variable + '_min']) / 2) if self.rescale_by_width: width = (_kinematics[self.variable + '_max'] - _kinematics[self.variable + '_min']) yvalues.append(means[i] / width) yerrors.append(np.sqrt(covariance[i, i]) / width) elif constraint['type'] == 'MultivariateGaussian': if not self.observable: raise KeyError('observable needs to be specified for MultivariateGaussian constraints') dim = constraint['dim'] sigma_stat_hi = np.array(constraint['sigma-stat-hi']) sigma_stat_lo = np.array(constraint['sigma-stat-lo']) sigma_sys = np.array(constraint['sigma-sys']) sigma = np.sqrt(np.power(sigma_sys, 2) + 0.25 * np.power(sigma_stat_hi + sigma_stat_lo, 2)) observables = constraint['observables'] means = constraint['means'] kinematics = constraint['kinematics'] xvalues = [] xerrors = [] yvalues = [] yerrors = [] for i in range(0, dim): width = 1 if not observables[i] == self.observable: continue _kinematics = kinematics[i] if self.variable in _kinematics: xvalues.append(_kinematics[self.variable]) xerrors = None elif (self.variable + '_min' in _kinematics) and (self.variable + '_max' in _kinematics): xvalues.append((_kinematics[self.variable + '_max'] + _kinematics[self.variable + '_min']) / 2) xerrors.append((_kinematics[self.variable + '_max'] - _kinematics[self.variable + '_min']) / 2) if self.rescale_by_width: width = (_kinematics[self.variable + '_max'] - _kinematics[self.variable + '_min']) yvalues.append(means[i] / width) yerrors.append(sigma[i] / width) else: raise ValueError('type of constraint presently not supported') xvalues = np.array(xvalues) if xerrors: xerrors = np.array(xerrors) yvalues = np.array(yvalues) yerrors = np.array(yerrors) plt.errorbar(x=xvalues, y=yvalues, xerr=xerrors, yerr=yerrors.T, color=self.color, elinewidth=1.0, fmt='_', linestyle='none', label=self.label) # disable the label for subsequent plots self.label = None