flavour
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
model.h
Go to the documentation of this file.
1 #ifndef MODEL_H
2 #define MODEL_H
3 
4 #define _USE_MATH_DEFINES
5 #include <iostream>
6 #include <set>
7 #include <ginac/ginac.h>
8 #include <cmath>
9 #include <complex>
10 #include <memory>
11 #include <tr1/memory>
12 #include "TRandom3.h"
13 #include "TMath.h"
14 
15 //g++ teste.cpp -o teste -lcln -lginac
16 using namespace std;
17 //using namespace tr1;
18 using namespace GiNaC;
20 class measure{
21 public:
22  measure(double v=0,double e=0):value(v),error(e){}
24  const measure & m1=*this;
25  return measure(m1.value*m2.value,sqrt(std::pow(m1.value*m2.error,2)+std::pow(m2.value*m1.error,2)));
26  }
28  const measure & m1=*this;
29  return measure(m1.value/m2.value,sqrt(std::pow(m1.value/std::pow(m2.value,2)*m2.error,2)+std::pow(m1.error/m2.value,2)));
30  }
31  double value;
32  double error;
33  };
35 class observable{
36 public:
37  observable(): copies(1) {}
38  virtual ~observable(){}
39 
44  virtual double loglikelihood(double hipothesis) const = 0;
45  virtual double error(double hipothesis) const = 0;
46 
47  //virtual int type() const =0;
48  mutable uint copies;
49 };
50 
52 class limitedobs: public observable{
53 public:
58  //limitedobs(double limit, double cl=0.9, double m=0): s(fabs(limit-m)/1.282), min(m),lim(limit) {
59 // if(cl==0.95) s*=1.282/1.645;
60  limitedobs(double limit, double cl=0.9, double m=0): s(fabs(limit-m)/(1.282+sqrt(M_PI_2))), min(m),lim(limit) {
61  if(cl==0.95) s*=(1.282+sqrt(M_PI_2))/(1.645+sqrt(M_PI_2));
62  }
64  double loglikelihood(double hipothesis) const {
65  double diff=(hipothesis-min-sqrt(M_PI_2)*s)/s;
66  if(diff<0) diff=0;
67  return diff*diff/2;
68  }
69  double error(double hipothesis) const {
70  double diff=(hipothesis-min )/s;
71  return diff;
72  }
73 
74  double s,min,lim;
75 };
76 
78 class gaussobs: public observable{
79 public:
80 
84  gaussobs(measure v): m(v.value), s(v.error) {}
85  gaussobs(double mean, double sigma): m(mean), s(mean*sigma) {}
87  double loglikelihood(double hipothesis) const {
88  double diff=(m-hipothesis)/s;
89  return diff*diff/2;
90  }
91  double error(double hipothesis) const {
92  double diff=(hipothesis-m)/s;
93  return diff;
94  }
95  const double m, s;
96 };
97 
98 
100 class gauss2obs: public observable{
101 public:
102 
106  gauss2obs(measure v): m(v.value), s(v.error) {}
107  gauss2obs(double mean, double sigma): m(mean), s(sigma) {}
109  double loglikelihood(double hipothesis) const {
110  double diff=(m-hipothesis)/s;
111  return diff*diff/2;
112  }
113  double error(double hipothesis) const {
114  double diff=(hipothesis-m)/s;
115  return diff;
116  }
117 
118  double expected()const {return m;}
119  //int type() const {return 1;}
120  const double m, s;
121 };
122 
125 public:
130  freeparameter(double mi, double ma, TRandom3 * r,double ss=1e-2): min(mi), max(ma), value(mi+(ma-mi)*r->Rndm()), step((ma-mi)*ss) {}
131 
133 
135  void next(TRandom3 * r,double f=1){
136  //double x=r->Gaus()*step;
137  value+=r->Gaus()*step*f;
138  }
140  bool isvalid() const {
141  return min<=value && value<=max;
142  }
144 
146  double dist(double x) const {
147  return std::pow((x-value)/step,2);
148  }
150  double min;
152  double max;
154  double value;
156  double step;
157 
158 };
159 
162 public:
167  discreteparameter(int mi, int ma, TRandom3 * r): min(mi), max(ma), value(mi+r->Integer(ma-mi+1)) {}
169  double min;
171  double max;
173  double value;
174 };
175 
177 class parameters: public vector< freeparameter >{
178 public:
179 
180 //parameters(){}
182 void next(TRandom3 * r, double f=1){
183  for(iterator i=begin();i!=end();i++){
184  i->next(r,f);
185  }
186 
187  //for(uint i=0;i<discrete.size();i++){
188  //discrete[i].next(r);
189  //}
190  }
191 
193 bool isvalid() const{
194  for(const_iterator i=begin();i!=end();i++){
195  if(!i->isvalid()) return 0;
196  }
197  return 1;
198  }
200 double dist(const parameters& p) const{
201  double total=0;
202  for(uint i=0;i<size();i++){
203  total+=at(i).dist(p[i].value);
204  }
205  return sqrt(total/size());
206 }
207 
208 void setvalues(const parameters& p){
209 
210  for(uint i=0;i<size();i++){
211  at(i).value=p[i].value;
212  }
213  }
214 
215 double area() const{
216  float a=1;
217  for(const_iterator i=begin();i!=end();i++){
218  a*=i->step;
219  }
220  return a;
221  }
222 
223 double gausslikelihood(const parameters & p2) const{
224  double l=1;
225  for(uint i=0;i<size();i++){
226  l*=TMath::Gaus((p2[i].value-at(i).value)/at(i).step);
227  }
228  return l;
229  }
230 
231  lst p;
232  vector<double> values;
233  //vector<discreteparameters> discrete;
234 };
235 
237 class calcu{
238  public:
243  virtual double operator()(const parameters & p) const=0;
244  //virtual int type() const =0;
245 };
246 
248 class calcuba:public calcu{
249  public:
250  calcuba(observable * ob, const FUNCP_CUBA & e0): calcu(), o(ob), e(e0){}
251 
252  double operator()(const parameters & p) const{
253  double ret=1000;
254  int pass=1;
255 
256  /* try{
257  ret=ex_to<numeric>(e.subs(p.p,subs_options::no_pattern).evalf()).to_double();
258  }
259  catch(GiNaC::pole_error e){
260  pass=0;
261  cout<<"Pole error"<<endl;
262  }
263  catch(...){
264  cout<<"Other exception"<<endl;
265  exit(1);
266  }
267  */
268  int n=p.values.size(), m=1;
269  e(&n,&(p.values[0]),&m,&ret);
270  if(pass) ret=o->loglikelihood(ret);
271  else ret=1000;
272 
273  return ret;
274  }
275 
276  shared_ptr<observable> o;
277  FUNCP_CUBA e;
278  };
279 
280 
282 class calcuex:public calcu{
283  public:
284  calcuex(observable * ob, const ex & e0): calcu(), o(ob), e(e0){}
286 
287  double operator()(const parameters & p) const{
288  double ret=1000;
289  int pass=1;
290  try{
291  ret=ex_to<numeric>(e.subs(p.p,subs_options::no_pattern).evalf()).to_double();
292  }
293  catch(GiNaC::pole_error e){
294  pass=0;
295  cout<<"Pole error"<<endl;
296  }
297  catch(exception e){
298  cout<<e.what()<<endl;
299  }
300  catch(...){
301  cout<<"Other exception"<<endl;
302  exit(1);
303  }
304  if(pass) ret=o->loglikelihood(ret);
305  else ret=1000;
306 
307  return ret;
308  }
309 
310  double error(const parameters & p) const{
311  double ret=1000;
312  int pass=1;
313  try{
314  cout<<e<<endl;
315  cout<<e.subs(p.p)<<endl;
316 
317  ret=ex_to<numeric>(e.subs(p.p,subs_options::no_pattern).evalf()).to_double();
318  }
319  catch(GiNaC::pole_error er){
320  pass=0;
321  cout<<"Pole error"<<endl;
322  }
323  catch(exception er){
324  pass=0;
325 
326  cout<<er.what()<<endl;
327  cout<<e.subs(p.p,subs_options::no_pattern).evalf()<<endl;
328  }
329  catch(...){
330  cout<<"Other exception"<<endl;
331  exit(1);
332  }
333  if(pass) ret=o->error(ret);
334  else ret=1000;
335 
336  return ret;
337  }
338 
339 shared_ptr<observable> o;
340 ex e;
341 };
342 
345 public:
346  prediction(observable * ob, const FUNCP_CUBA & e0): calculate(new calcuba(ob,e0)) {}
347  prediction(observable * ob, const ex & e0): calculate(new calcuex(ob,e0)) {}
348  prediction(calcu * c): calculate(c) {}
349  prediction(const prediction& p): calculate(p.calculate) {}
351 
352  double loglikelihood(const parameters & p) const { return (*calculate)(p);}
354 
355  shared_ptr<calcu> calculate;
356  //vector<ex> es;
357 };
358 
359 
361 class Model: public vector< prediction > {
362 public:
363 
364  Model(): r(new TRandom3(0)){}
365  virtual ~Model(){delete r;};
366  virtual parameters getlist(const parameters & p) const = 0;
367  virtual parameters generateparameters(int max=0) const = 0;
368  virtual int veto(const parameters & p, int max=0) const {return !p.isvalid();}
369 
371 
374 double likelihood(const parameters & p, bool check=1, int max=0) const{
375  if(veto(p,max) && check) return 0;
376  double total=loglike(p,0);
377  if(total<-1000) return 0;
378  return exp(total);
379  }
380 
381 double loglike(const parameters & p, bool check=1, int max=0) const{
382  if(veto(p,max) && check) return -1000;
383  parameters pp(getlist(p));
384 
385  double total=0;
386  int n=0;
387  for(const_iterator i=begin();i!=end();i++) {
388  try{
389  n++;
390  total+=i->loglikelihood(pp);
391  }
392  catch(exception e){
393  cout<<n<<e.what()<<endl;
394  exit(1);
395  }
396  //catch(...){
397  //cout<<"DD "<<n<<endl;
398  //exit(1);
399  //}
400 }
401 
402  return -total;
403  }
404 
405  TRandom3 * r;
406 };
407 
408 #endif
double min
minimum possible value for the parameter
Definition: model.h:150
void next(TRandom3 *r, double f=1)
changes randomly the ::value of the parameter, the standard deviation is ::step
Definition: model.h:135
double operator()(const parameters &p) const
Definition: model.h:252
prediction(calcu *c)
Definition: model.h:348
double loglikelihood(const parameters &p) const
Definition: model.h:352
double min
minimum possible value for the parameter
Definition: model.h:169
A base class representing an experimental measure.
Definition: model.h:35
prediction(observable *ob, const ex &e0)
Definition: model.h:347
~prediction()
Definition: model.h:350
A parameter which will be fitted in the simulation.
Definition: model.h:161
uint copies
Definition: model.h:48
A class containing the value and uncertainty of an experimental measure.
Definition: model.h:20
TRandom3 * r
Definition: model.h:405
virtual ~Model()
Definition: model.h:365
measure operator/(measure m2) const
Definition: model.h:27
double s
Definition: model.h:74
double dist(double x) const
probability distribution, to be used by the Markov Chain Monte Carlo simulation
Definition: model.h:146
Definition: multivector.h:4
double error(const parameters &p) const
Definition: model.h:310
prediction(const prediction &p)
Definition: model.h:349
double area() const
Definition: model.h:215
calcuex(observable *ob, const ex &e0)
Definition: model.h:284
discreteparameter(int mi, int ma, TRandom3 *r)
Definition: model.h:167
~limitedobs()
Definition: model.h:63
unsigned int uint
Definition: script.cpp:4
double value
value of the parameter
Definition: model.h:173
double operator()(const parameters &p) const
Definition: model.h:287
An experimental measure which is an upper limit on a parameter with a given Confidence Level...
Definition: model.h:52
gaussobs(measure v)
Definition: model.h:84
vector of parameters
Definition: model.h:177
An experimental measure of a parameter which is a mean value and a standard deviation.
Definition: model.h:78
class to do the calculus of a constraint based on a GiNaC symbolic expression
Definition: model.h:282
gaussobs(double mean, double sigma)
Definition: model.h:85
limitedobs(double limit, double cl=0.9, double m=0)
Definition: model.h:60
lst p
Definition: model.h:231
~gaussobs()
Definition: model.h:86
double likelihood(const parameters &p, bool check=1, int max=0) const
calculates the probability of getting all the experimental measures if the model describes the realit...
Definition: model.h:374
double loglikelihood(double hipothesis) const
Definition: model.h:109
Model()
Definition: model.h:364
double loglike(const parameters &p, bool check=1, int max=0) const
Definition: model.h:381
Abstract class for a model.
Definition: model.h:361
double error
Definition: model.h:32
Base class to do the calculus of a constraint to the model.
Definition: model.h:237
shared_ptr< observable > o
Definition: model.h:276
double loglikelihood(double hipothesis) const
Definition: model.h:87
~gauss2obs()
Definition: model.h:108
freeparameter(double mi, double ma, TRandom3 *r, double ss=1e-2)
Definition: model.h:130
observable()
Definition: model.h:37
bool isvalid() const
checks if the value of the parameter is between ::min and ::max
Definition: model.h:140
double value
value of the parameter
Definition: model.h:154
double max
maximum possible value for the parameter
Definition: model.h:171
calcuba(observable *ob, const FUNCP_CUBA &e0)
Definition: model.h:250
double loglikelihood(double hipothesis) const
Definition: model.h:64
FUNCP_CUBA e
Definition: model.h:277
double gausslikelihood(const parameters &p2) const
Definition: model.h:223
measure(double v=0, double e=0)
Definition: model.h:22
double error(double hipothesis) const
Definition: model.h:113
virtual ~observable()
Definition: model.h:38
virtual int veto(const parameters &p, int max=0) const
Definition: model.h:368
double max
maximum possible value for the parameter
Definition: model.h:152
const double s
Definition: model.h:120
class to do the calculus of a constraint based on a GiNaC compiled expression
Definition: model.h:248
A parameter which will be fitted in the simulation.
Definition: model.h:124
double error(double hipothesis) const
Definition: model.h:69
double expected() const
Definition: model.h:118
the same as gaussobs but with a different initializer, such that the uncertainty sigma is absolute ...
Definition: model.h:100
~calcuex()
Definition: model.h:285
gauss2obs(measure v)
Definition: model.h:106
void next(TRandom3 *r, double f=1)
changes randomly the value of the parameters
Definition: model.h:182
double value
Definition: model.h:31
const double s
Definition: model.h:95
gauss2obs(double mean, double sigma)
Definition: model.h:107
shared_ptr< observable > o
Definition: model.h:339
theoretical expression for an experimental measure
Definition: model.h:344
ex e
Definition: model.h:340
prediction(observable *ob, const FUNCP_CUBA &e0)
Definition: model.h:346
void setvalues(const parameters &p)
Definition: model.h:208
double dist(const parameters &p) const
checks if this and another vector of parameters are within 1sigma of distance
Definition: model.h:200
bool isvalid() const
checks if all the values are between their minimums and maximums
Definition: model.h:193
shared_ptr< calcu > calculate
theoretical expression for the experimental measure
Definition: model.h:355
vector< double > values
Definition: model.h:232
double error(double hipothesis) const
Definition: model.h:91
measure operator*(measure m2) const
Definition: model.h:23
double step
standard deviation of the random changes of ::value in next(TRandom3 *)
Definition: model.h:156