def observables(self, _prediction, parameters): """Creates a list of eos.Observable objects for the named set of predictions.""" if _prediction not in self.predictions: raise RuntimeError( 'Cannot create observables for unknown set of predictions: \'{}\'' .format(_prediction)) prediction = self.predictions[_prediction] options = eos.Options(**prediction['global_options']) observables = [ eos.Observable.make( o['name'], parameters, eos.Kinematics( **(o['kinematics'] if 'kinematics' in o else {})), options) for o in prediction['observables'] ] if None in observables: unknown_observables = set() for p, o in zip(prediction['observables'], observables): if o is None: unknown_observables.add(p['name']) raise RuntimeError( 'Prediction \'{}\' contains unknown observable names: {}'. format(_prediction, unknown_observables)) return observables
def plot_observable(self, item): oname = item['observable'] info(' plotting EOS observable "{}"'.format(oname)) # create parameters parameters = eos.Parameters.Defaults() if 'parameters' in item and 'parameters-from-file' in item: warn( ' overriding values read from \'parameters-from-file\' with explicit values in \'parameters\'' ) if 'parameters-from-file' in item and type( item['parameters-from-file']) is str: parameters.override_from_file(item['parameters-from-file']) if 'parameters' in item and type(item['parameters']) is dict: for key, value in item['parameters'].items(): parameters.set(key, value) # create kinematics kinematics = eos.Kinematics() if not 'kinematic' in item: raise KeyError( 'kinematic not found; do not know how to map x to a kinematic variable' ) kvar = kinematics.declare(item['kinematic'], np.nan) # create (empty) options options = eos.Options() # create observable observable = eos.Observable.make(oname, parameters, kinematics, options) xlo, xhi = self.xrange if 'range' in item: xlo, xhi = item['range'] samples = 100 if 'samples' in item: samples = item['samples'] xvalues = np.linspace(xlo, xhi, samples + 1) ovalues = np.array([]) for xvalue in xvalues: kvar.set(xvalue) ovalues = np.append(ovalues, observable.evaluate()) color = 'black' if 'color' in item: color = item['color'] plt.plot(xvalues, ovalues, color=color)
def test_log_000(self): "Computation of specific observable should log error" import eos with self.assertLogs('EOS', level='ERROR') as cm: eos.Observable.make( "B->pilnu::BR", eos.Parameters.Defaults(), eos.Kinematics(q2_min=1, q2_max=6), eos.Options(**{'U': 'c'})) # will be overwritten by the # implementation of the observable self.assertEqual(cm.output, [ r"""ERROR:EOS:[ConcreteObservableEntry.make] Observable 'B->pilnu::BR' forces option key 'U' to value 'u', overriding user-provided value 'c'""" ])
def plot(self): item = self.item oname = item['observable'] info(' plotting EOS observable "{}"'.format(oname)) # create parameters parameters = eos.Parameters.Defaults() if 'parameters' in item and 'parameters-from-file' in item: warn(' overriding values read from \'parameters-from-file\' with explicit values in \'parameters\'') if 'parameters-from-file' in item and type(item['parameters-from-file']) is str: warn(' overriding parameters from file') parameters.override_from_file(item['parameters-from-file']) if 'parameters' in item and type(item['parameters']) is dict: for key, value in item['parameters'].items(): parameters.set(key, value) # create kinematics kinematics = eos.Kinematics() if not ('kinematic' in item or 'variable' in item) and not 'parameter' in item: raise KeyError('neither kinematic variable nor parameter found; do not know how to map x to a variable') if ('kinematic' in item or 'variable' in item) and 'parameter' in item: raise KeyError('both kinematic variable and parameter found; do not know how to map x to a variable') if 'kinematic' in item: var = kinematics.declare(item['kinematic'], np.nan) elif 'variable' in item: var = kinematics.declare(item['variable'], np.nan) else: var = parameters.declare(item['parameter'], np.nan) if 'kinematics' in item: for k, v in item['kinematics'].items(): kinematics.declare(k, v) # create (empty) options options = eos.Options() # create observable observable = eos.Observable.make(oname, parameters, kinematics, options) xvalues = np.linspace(self.xlo, self.xhi, self.xsamples + 1) ovalues = np.array([]) for xvalue in xvalues: var.set(xvalue) ovalues = np.append(ovalues, observable.evaluate()) plt.plot(xvalues, ovalues, alpha=self.alpha, color=self.color, label=self.label, ls=self.style)