ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/tschum/LimitTool/Model.cc
Revision: 1.1.1.1 (vendor branch)
Committed: Fri Jun 17 13:09:26 2011 UTC (13 years, 10 months ago) by tschum
Content type: text/plain
Branch: tschum, MAIN
CVS Tags: start, HEAD
Changes since 1.1: +0 -0 lines
Log Message:
Evolved standalone RA7 limit calculation tool

File Contents

# Content
1 #include "Model.h"
2 #include<vector>
3 #include<string>
4 #include<sstream>
5 #include "RooFit.h"
6 #include "RooAbsPdf.h"
7 #include "RooProdPdf.h"
8 #include "RooPoisson.h"
9 #include "RooGaussian.h"
10 #include "RooLognormal.h"
11 #include "RooRealVar.h"
12 #include "RooConstVar.h"
13 #include "RooFormulaVar.h"
14 #include "RooArgSet.h"
15 #include "RooPolynomial.h"
16 #include "RooArgList.h"
17 #include "RooDataSet.h"
18 #include "RooNLLVar.h"
19 #include "TMath.h"
20 #include "RooRandom.h"
21 #include "RooPlot.h"
22 #include "RooGamma.h"
23 #include "RooRealVar.h"
24 #include "RooAbsReal.h"
25 #include <iostream>
26 #include <fstream>
27 #include <istream>
28 #include <cstdlib>
29 #include <cstdarg>
30 #include <cstring>
31 #include <cstdio>
32 #include"TCanvas.h"
33 #include"TFile.h"
34 #include"TH1F.h"
35
36 #include "RooStats/BayesianCalculator.h"
37 #include "RooStats/ProfileLikelihoodCalculator.h"
38 #include "RooStats/LikelihoodIntervalPlot.h"
39 #include "Model.h"
40 #include "RooStats/HybridCalculatorOriginal.h"
41 #include "RooStats/HybridResult.h"
42 #include "RooStats/HybridPlot.h"
43 #include "RooStats/ModelConfig.h"
44 #include "RooStats/FeldmanCousins.h"
45 #include "RooStats/ToyMCSampler.h"
46 #include "RooStats/PointSetInterval.h"
47 #include "RooStats/ConfidenceBelt.h"
48 #include "RooWorkspace.h"
49 #include "RooStats/HypoTestInverter.h"
50 #include "RooStats/HypoTestInverterResult.h"
51 #include "RooStats/HypoTestPlot.h"
52
53 #include "RooStats/MCMCCalculator.h"
54 #include "RooStats/MCMCInterval.h"
55 #include "RooStats/MCMCIntervalPlot.h"
56
57
58
59 using namespace std;
60 using namespace RooFit;
61 using namespace RooStats;
62
63
64 string int_to_string(int i){
65 std::stringstream out;
66 out << i;
67 return out.str();
68
69 };
70
71 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
72 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73 Model::Model():n_channels(0),n_backgrounds(0),n_nuisances(0),range_nuisances(-1),range_POI(-1),range_n_obs(-1),use_nuisances(false),corrupted(true)
74 {
75 POI_set=0;
76 observable_set=0;
77 nuisance_set=0;
78 nuisance_prior_pdf=0;
79 POI_prior_pdf=0;
80
81 POI=0;
82 signal=0;
83 background=0;
84 observables=0;
85 nuisance_names=0;
86 nuisance_upper_limit=0;
87 nuisance_parameters=0;
88 nuisance_widths=0;
89 scaling_factors=0;
90 nuisance_priors=0;
91 sb_means=0;
92 b_means=0;
93 sb_poissons=0;
94 b_poissons=0;
95 sb_likelihood=0;
96 b_likelihood=0;
97 data=0;
98 }
99
100 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
101 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
102 Model::Model(ConfigFile* bkgConfig, ConfigFile* sigConfig, int selectChannel) {
103
104 POI_set=0;
105 observable_set=0;
106 nuisance_set=0;
107 nuisance_prior_pdf=0;
108 POI_prior_pdf=0;
109
110 POI=0;
111 signal=0;
112 background=0;
113 observables=0;
114 nuisance_names=0;
115 nuisance_upper_limit=0;
116 nuisance_parameters=0;
117 nuisance_widths=0;
118 scaling_factors=0;
119 nuisance_priors=0;
120 sb_means=0;
121 b_means=0;
122 sb_poissons=0;
123 b_poissons=0;
124 sb_likelihood=0;
125 b_likelihood=0;
126 data=0;
127 nuisance_means=0;
128
129 //store the input from the background and data file here
130 vector<double> *signal_expectation =new vector<double>;
131 vector< vector<double>* > *background_expectations =new vector< vector<double>* >;
132 vector< vector< vector<double>* >* >* systematic_uncertainties=0;
133 vector<int> *n_input=new vector<int>;
134
135 //read [definitions]
136 this->n_channels = bkgConfig->Value("definitions","n_channels");
137 this->n_backgrounds = bkgConfig->Value("definitions","n_backgrounds");
138 this->n_nuisances = bkgConfig->Value("definitions","n_nuisance");
139 this->range_nuisances= bkgConfig->Value("definitions","nuisance_range");
140 this->range_POI= bkgConfig->Value("definitions","parameter_of_interest_range");
141 this->range_n_obs= bkgConfig->Value("definitions","observation_range");
142 this->lumiScale= bkgConfig->Value("definitions","lumi_scale",1);
143
144 bool sepStatUnc = bkgConfig->Value("definitions","seperate_stat_unc",false);
145 bool sumSigUnc = bkgConfig->Value("definitions","sum_signal_unc",false);
146
147
148 if( n_channels != sigConfig->Value("definitions","n_channels") ) {
149 cout<<"n_channels don't match for background and signal!!!"<<endl;
150 exit(-1);
151 }
152 if( n_nuisances < sigConfig->Value("definitions","n_nuisance") ) {
153 cout<<"n_nuisances don't match for background and signal!!!"<<endl;
154 exit(-1);
155 }
156
157
158 if(selectChannel > 0 ) this->n_channels = 1;
159
160 //read [observation]
161 //fill the vector with the observations
162 for(int i=1;i<=n_channels;i++){
163 string value_id = (string)"n"+int_to_string(i);
164 if(selectChannel > 0 ) value_id = (string)"n"+int_to_string(selectChannel);
165 int value = bkgConfig->Value("observation",value_id.c_str());
166 // cout<<value_id.c_str()<<" "<<value<<endl;
167 n_input->push_back(int(value*lumiScale+0.5));
168 }
169
170 sumS=0;
171 //read [signal yield]
172 //fill the vector with the signal expectations
173 for(int i=1;i<=n_channels;i++){
174 string value_id = (string)"s"+int_to_string(i);
175 if(selectChannel > 0 ) value_id = (string)"s"+int_to_string(selectChannel);
176 double value = sigConfig->Value("signal_yield",value_id.c_str());
177 // cout<<value_id.c_str()<<" "<<value<<endl;
178 signal_expectation->push_back(value*lumiScale);
179 sumS += value*lumiScale;
180 }
181
182 sumB=0;
183 //read [background_yield_n]
184 //fill the vectors with the background expectations
185 for(int i=1;i<=n_backgrounds;i++){
186 string section_id = (string)"background_yield_" + int_to_string(i);
187 vector<double>* background_yield = new vector<double>;
188 for(int j=1;j<=n_channels;j++){
189 string value_id = (string)"b" + int_to_string(j);
190 if(selectChannel > 0 ) value_id = (string)"b"+int_to_string(selectChannel);
191 double value = bkgConfig->Value(section_id.c_str(),value_id.c_str());
192 // cout<<value_id.c_str()<<" "<<value<<endl;
193 background_yield->push_back(value*lumiScale);
194 sumB += value*lumiScale;
195 }
196 background_expectations->push_back(background_yield);
197 }
198
199
200 sumBerr=0;
201 //read [nuisance_n]
202 //fill the object for the systematic uncertainties
203 if(this->n_nuisances==0){
204 systematic_uncertainties=0;
205 }
206 else{
207 systematic_uncertainties=new vector< vector< vector<double>* >* >;
208 this->nuisance_names=new vector<string>;
209 this->nuisance_upper_limit=new vector<double>;
210 //read [nuisance_n]
211 vector<double>* sum_yield = new vector<double>;
212 for(int w=0;w<n_channels;w++)
213 sum_yield->push_back(0);
214
215 for(int i=1;i<=n_nuisances;i++){
216
217 string section_id = (string)"nuisance_" + int_to_string(i);
218 string name = bkgConfig->Value(section_id.c_str(),"name");
219 string name_compare = sigConfig->Value(section_id.c_str(),"name","");
220
221 if(name_compare== "") {
222 cout<<"nuisance name "<<name<<" not found, set to 0 for signal!"<<endl;
223
224 } else if( name != name_compare){
225 cout<<"nuisance names don't match for background and signal!!!"<<endl;
226 cout<<"background n"<<i<<" has name: "<< name<<endl;
227 cout<<"signal n"<<i<<" has name: "<< name_compare<<endl;
228 exit(-1);
229 }
230
231 if( !sepStatUnc || name.find("BKG_MC_") == string::npos ) {
232
233 vector< vector<double>* >* nuisance_yields=new vector<vector<double>*>;
234 vector<double>* nuisance_yield = new vector<double>;
235 for(int j=1;j<=n_channels;j++){
236 string value_id = (string)"sigma_s_" + int_to_string(j);
237 if(selectChannel > 0 ) value_id = (string)"sigma_s_"+int_to_string(selectChannel);
238 double value = sigConfig->Value(section_id.c_str(),value_id.c_str(),0);
239 if(name.find("_MC_")==string::npos)
240 nuisance_yield->push_back(value);
241 else
242 nuisance_yield->push_back(value/sqrt(lumiScale));
243 // cout<<value_id.c_str()<<" "<<value<<endl;
244 }
245 if(name.find("BKG_")==string::npos&&sumSigUnc) {
246
247 for(int j=0;j<n_channels;j++){
248 sum_yield->at(j) += pow(nuisance_yield->at(j),2);
249 }
250 } else {
251 this->nuisance_names->push_back(name);
252 //upper range for uncertainties -> (X*sigma)
253 double upper_limit= bkgConfig->Value(section_id.c_str(),"upper_limit");
254 this->nuisance_upper_limit->push_back(upper_limit);
255
256 nuisance_yields->push_back(nuisance_yield);
257 for(int k=1;k<=n_backgrounds;k++){
258 vector<double>* nuisance_yield = new vector<double>;
259 for(int j=1;j<=n_channels;j++){
260 string value_id = (string)"sigma_b" + int_to_string(k) + "_" + int_to_string(j);
261 if(selectChannel > 0 ) value_id = (string)"sigma_b" + int_to_string(k) + "_" + int_to_string(selectChannel);
262 double value = bkgConfig->Value(section_id.c_str(),value_id.c_str());
263 if(name.find("_MC_")==string::npos) {
264 nuisance_yield->push_back(value);
265 sumBerr += pow(value,2);
266 } else {
267 nuisance_yield->push_back(value/sqrt(lumiScale));
268 sumBerr += pow(value/sqrt(lumiScale),2);
269 }
270 // cout<<value_id.c_str()<<" "<<value<<endl;
271 }
272 nuisance_yields->push_back(nuisance_yield);
273 }
274 systematic_uncertainties->push_back(nuisance_yields);
275 }
276 } else {
277 for(int t=1;t<=n_channels;t++){
278
279 vector< vector<double>* >* nuisance_yields=new vector<vector<double>*>;
280
281 this->nuisance_names->push_back(name+ "_" + int_to_string(t));
282 //upper range for uncertainties -> (X*sigma)
283 double upper_limit= bkgConfig->Value(section_id.c_str(),"upper_limit");
284 this->nuisance_upper_limit->push_back(upper_limit);
285
286 vector<double>* nuisance_yield = new vector<double>;
287 for(int j=1;j<=n_channels;j++){
288 nuisance_yield->push_back(0);
289 }
290 nuisance_yields->push_back(nuisance_yield);
291 for(int k=1;k<=n_backgrounds;k++){
292 vector<double>* nuisance_yield = new vector<double>;
293 for(int j=1;j<=n_channels;j++){
294 string value_id = (string)"sigma_b" + int_to_string(k) + "_" + int_to_string(j);
295 if(selectChannel > 0 ) value_id = (string)"sigma_b" + int_to_string(k) + "_" + int_to_string(selectChannel);
296 double value = bkgConfig->Value(section_id.c_str(),value_id.c_str());
297 if(t==j) {
298 nuisance_yield->push_back(value/sqrt(lumiScale));
299 sumBerr += pow(value/sqrt(lumiScale),2);
300 } else nuisance_yield->push_back(0);
301 // cout<<value_id.c_str()<<" "<<value<<endl;
302 }
303 nuisance_yields->push_back(nuisance_yield);
304 }
305 systematic_uncertainties->push_back(nuisance_yields);
306 }
307 }
308 }
309
310
311 if(sumSigUnc) {
312
313 this->nuisance_names->push_back("SUM_SIG_UNC");
314 this->nuisance_upper_limit->push_back(5);
315 vector< vector<double>* >* nuisance_yields=new vector<vector<double>*>;
316 vector<double>* nuisance_yield = new vector<double>;
317 for(int j=0;j<n_channels;j++){
318 nuisance_yield->push_back( sqrt(sum_yield->at(j)) );
319 }
320 nuisance_yields->push_back(nuisance_yield);
321 for(int k=1;k<=n_backgrounds;k++){
322 vector<double>* nuisance_yield = new vector<double>;
323 for(int j=1;j<=n_channels;j++){
324 nuisance_yield->push_back(0);
325 }
326 nuisance_yields->push_back(nuisance_yield);
327 }
328 systematic_uncertainties->push_back(nuisance_yields);
329 }
330
331 //rescale num of nuisance parameters
332 n_nuisances = systematic_uncertainties->size();
333
334 }
335
336 check_input(n_input,signal_expectation,background_expectations,systematic_uncertainties);
337
338 if(systematic_uncertainties==0){
339 use_nuisances=false;
340 }
341 else use_nuisances=true;
342
343 create_POI();
344 create_observables();
345 create_signal_expectations(signal_expectation);
346 create_background_expectations(background_expectations);
347 create_nuisances(systematic_uncertainties);
348 create_scaling_factors(systematic_uncertainties);
349 create_POI_prior();
350
351 create_nuisance_priors();
352 create_sb_likelihood();
353 create_b_likelihood();
354 create_dataset(n_input);
355
356 create_pseudo_datasets(signal_expectation,background_expectations,systematic_uncertainties);
357
358 create_teststats();
359
360 }
361 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
362 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
363 Model::Model(std::vector<double>* signal_expectation,std::vector< std::vector<double>* >* background_expectation,std::vector< vector< vector<double>* >* >* systematic_uncertainties,std::vector<double>* nuisance_upper_limits,std::vector<int>* n_input,int nuisance_range,int POI_range,int observation_range):n_channels(signal_expectation->size()),n_backgrounds(background_expectation->size()),n_nuisances(systematic_uncertainties->size()),range_nuisances(nuisance_range),range_POI(POI_range),range_n_obs(observation_range){
364
365 POI_set=0;
366 observable_set=0;
367 nuisance_set=0;
368 nuisance_prior_pdf=0;
369 POI_prior_pdf=0;
370
371 POI=0;
372 signal=0;
373 background=0;
374 observables=0;
375 nuisance_names=0;
376 nuisance_parameters=0;
377 nuisance_widths=0;
378 scaling_factors=0;
379 nuisance_priors=0;
380 sb_means=0;
381 b_means=0;
382 sb_poissons=0;
383 b_poissons=0;
384 sb_likelihood=0;
385 b_likelihood=0;
386 data=0;
387 nuisance_means=0;
388
389
390 nuisance_upper_limit=nuisance_upper_limits;
391
392 check_input(n_input,signal_expectation,background_expectation,systematic_uncertainties);
393 if(systematic_uncertainties==0){
394 use_nuisances=false;
395 }
396 else use_nuisances=true;
397 create_POI();
398 create_observables();
399 create_signal_expectations(signal_expectation);
400 create_background_expectations(background_expectation);
401 create_nuisances(systematic_uncertainties);
402 create_scaling_factors(systematic_uncertainties);
403 create_POI_prior();
404 create_nuisance_priors();
405 create_sb_likelihood();
406 create_b_likelihood();
407 if(n_input!=0){
408 create_dataset(n_input);
409 }
410
411
412 }
413
414 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
415 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
416 Model::~Model(){
417 if(data!=0){
418 delete data;
419 }
420 // cout<<"deleted"<<endl;
421 if(b_likelihood!=0){
422 delete b_likelihood;
423 }
424 // cout<<"deleted"<<endl;
425 if(sb_likelihood!=0){
426 delete sb_likelihood;
427 }
428 // cout<<"deleted"<<endl;
429 if(b_poissons!=0){
430 for(unsigned i=0;i<b_poissons->size();i++){
431 delete b_poissons->at(i);
432 }
433 delete b_poissons;
434 }
435 // cout<<"deleted"<<endl;
436 if(sb_poissons!=0){
437 for(unsigned i=0;i<sb_poissons->size();i++){
438 delete sb_poissons->at(i);
439 }
440 delete sb_poissons;
441 }
442 // cout<<"deleted"<<endl;
443 if(b_means!=0){
444 for(unsigned i=0;i<b_means->size();i++){
445 delete b_means->at(i);
446 }
447 delete b_means;
448 }
449 // cout<<"deleted"<<endl;
450 if(sb_means!=0){
451 for(unsigned i=0;i<sb_means->size();i++){
452 delete sb_means->at(i);
453 }
454 delete sb_means;
455 }
456 // cout<<"deleted"<<endl;
457 if(nuisance_priors!=0){
458 for(unsigned i=0;i<nuisance_priors->size();i++){
459 delete nuisance_priors->at(i);
460 }
461 delete nuisance_priors;
462 }
463 // cout<<"deleted"<<endl;
464 if(scaling_factors!=0){
465 for(unsigned i=0;i<scaling_factors->size();i++){
466 for(unsigned j=0;j<scaling_factors->at(i)->size();j++){
467 for(unsigned k=0;k<scaling_factors->at(i)->at(j)->size();k++){
468 delete scaling_factors->at(i)->at(j)->at(k);
469 }
470 delete scaling_factors->at(i)->at(j);
471 }
472 delete scaling_factors->at(i);
473 }
474 delete scaling_factors;
475 }
476 // cout<<"deleted"<<endl;
477 if(nuisance_widths!=0){
478 for(unsigned i=0;i<nuisance_widths->size();i++){
479 delete nuisance_widths->at(i);
480 }
481 delete nuisance_widths;
482 }
483 // cout<<"deleted"<<endl;
484 if(nuisance_parameters!=0){
485 for(unsigned i=0;i<nuisance_parameters->size();i++){
486 delete nuisance_parameters->at(i);
487 }
488 delete nuisance_parameters;
489 }
490 // cout<<"deleted"<<endl;
491 if(observables!=0){
492 for(unsigned i=0;i<observables->size();i++){
493 delete observables->at(i);
494 }
495 delete observables;
496 }
497 // cout<<"deleted"<<endl;
498 if(background!=0){
499 for(unsigned i=0;i<background->size();i++){
500 for(unsigned j=0;j<background->at(i)->size();j++){
501 delete background->at(i)->at(j);
502 }
503 delete background->at(i);
504 }
505 delete background;
506 }
507 // cout<<"deleted"<<endl;
508 if(signal!=0){
509 for(unsigned i=0;i<signal->size();i++){
510 delete signal->at(i);
511 }
512 delete signal;
513 }
514 // cout<<"deleted"<<endl;
515 if(POI!=0){
516 delete POI;
517 }
518 // cout<<"deleted"<<endl;
519 if(POI_prior_pdf!=0){
520 delete POI_prior_pdf;
521 }
522 // cout<<"deleted"<<endl;
523 if(nuisance_prior_pdf!=0){
524 delete nuisance_prior_pdf;
525 }
526 // cout<<"deleted"<<endl;
527 if(nuisance_set!=0){
528 delete nuisance_set;
529 }
530 // cout<<"deleted"<<endl;
531 if(observable_set!=0){
532 delete observable_set;
533 }
534 // cout<<"deleted"<<endl;
535 if(POI_set!=0){
536 delete POI_set;
537 }
538 cout<<"----------------------------"<<endl;
539 cout<<endl;
540 }
541
542 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
543 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
544 bool Model::check_input(std::vector<int>* n_input,std::vector<double>* signal_expectation,std::vector< std::vector<double>* >* background_expectation,std::vector< std::vector< std::vector<double>* >* >* systematic_uncertainties){
545
546 // cout<<"Checking, if input is consistent\n"<<endl;
547 unsigned n=signal_expectation->size();
548 for(unsigned i=0;i<background_expectation->size();i++){
549 if(background_expectation->at(i)->size()!=n){
550 this->corrupted=true;
551 cout<<"ERROR: size of signal and background expectation "<<i<<" don't match"<<endl;
552 return(false);
553 }
554 }
555 if(n_input!=0){
556 if(n_input->size()!=n){
557 this->corrupted=true;
558 cout<<"ERROR: size of signal expectation and observation don't match"<<endl;
559 return(false);
560 }
561 }
562 if(systematic_uncertainties!=0){
563 for(unsigned i=0;i<systematic_uncertainties->size();i++){
564 if(systematic_uncertainties->at(i)->size()!=background_expectation->size()+1){
565 this->corrupted=true;
566 cout<<"ERROR: at "<<i<<" : systematic uncertainty matrix doesn't contain values for signal and all backgrounds"<<endl;
567 return(false);
568 }
569 for(unsigned j=0;j<systematic_uncertainties->at(i)->size();j++){
570 if(systematic_uncertainties->at(i)->at(j)->size()!=n){
571 this->corrupted=true;
572 cout<<"ERROR: size of signal expectation and systematic uncertainty matrix don't match"<<endl;
573 return(false);
574 }
575 }
576 }
577 if(nuisance_upper_limit->size() != systematic_uncertainties->size() ) {
578 this->corrupted=true;
579 cout<<"ERROR: size of nuisance upper limits and systematic uncertainties don't match"<<endl;
580 return(false);
581 }
582 }
583
584
585 cout<<"Checked, that input is consistent!\n"<<endl;
586
587 this->corrupted=false;
588 return(true);
589 }
590 // this overwrites existing dataset
591 void Model::set_dataset(RooDataSet* d){
592 delete data;
593 data=d;
594
595 }
596
597 ///set nuisances to zero andconstant
598 void Model::set_nuisance_const(){
599
600 RooArgSet* nuisances=nuisance_set;
601 TIterator* it=nuisances->createIterator();
602 //RooAbsArg* nui;
603 // while((RooAbsReal*)it->Next()){
604 RooRealVar* nui;
605 while( (nui=(RooRealVar*) it->Next()) ){
606 //(RooAbsReal*)it->setVal(0);
607 RooRealVar* nui2=dynamic_cast<RooRealVar*>(nui);
608 //cout<<"nui "<<nui2<<endl;
609 nui2->setVal(0);
610 nui2->setConstant(kTRUE);
611
612
613 }
614
615
616 }
617 ///set nuisances to zero andconstant
618 void Model::set_nuisance_var(){
619
620 RooArgSet* nuisances=nuisance_set;
621 TIterator* it=nuisances->createIterator();
622 RooRealVar* nui;
623 // while((RooAbsReal*)it->Next()){
624 while( (nui=(RooRealVar*)it->Next()) ){
625 //(RooAbsReal*)it->setVal(0);
626 RooRealVar* nui2=dynamic_cast<RooRealVar*>(nui);
627 //cout<<"nui "<<nui2<<endl;
628 nui2->setVal(0);
629 nui2->setConstant(kFALSE);
630
631
632 }
633
634 }
635
636 void Model::set_poi_const(double p=0){
637 RooRealVar* ss=get_POI();
638 ss->setVal(p);
639 ss->setConstant(kTRUE);
640
641
642 }
643 void Model::set_poi_var(double p=0){
644 RooRealVar* ss=get_POI();
645 ss->setVal(p);
646 ss->setConstant(kFALSE);
647
648 }
649
650
651
652
653 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
654 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
655 void Model::create_observables(){
656 // cout<<"Create observables\n"<<endl;
657 if(range_n_obs>0){
658 observables=new vector<RooRealVar*>;
659 observable_set=new RooArgSet();
660 char* name=new char[1000];
661
662 for(int i=0;i<this->n_channels;i++){
663 sprintf (name, "observation_%d",i);
664 RooRealVar* tmp_observables=new RooRealVar(name,name,0,range_n_obs);
665 observables->push_back(tmp_observables);
666 observable_set->add(*observables->at(i));
667 }
668 delete [] name;
669 }
670 else{
671 cout<<"ERROR: negative range for the observations\n"<<endl;
672 this->corrupted=true;
673 }
674 }
675
676 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
677 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
678 void Model::create_signal_expectations(std::vector<double>* signal_expectation){
679 // cout<<"Create signal expectations\n"<<endl;
680 signal=new std::vector< RooConstVar*>;
681 char* name=new char[1000];
682
683 for(int i=0;i<this->n_channels;i++){
684 sprintf (name, "signal_%d", i);
685 RooConstVar* tmp_signal=new RooConstVar(name,name,signal_expectation->at(i));
686 signal->push_back(tmp_signal);
687 }
688 delete [] name;
689 }
690
691 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
692 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
693 void Model::create_background_expectations(std::vector< std::vector<double>* >* background_expectation){
694 // cout<<"Create background expectations\n"<<endl;
695 background =new vector< vector<RooConstVar*>* >;
696 char* name=new char[1000];
697
698 for(int i=0;i<this->n_backgrounds;i++){
699 vector<RooConstVar*>* tmp_background_row=new vector<RooConstVar*>;
700 for(int j=0;j<this->n_channels;j++){
701 sprintf (name, "background_channel_%d_source_%d",j,i);
702 RooConstVar* tmp_background=new RooConstVar(name,name,background_expectation->at(i)->at(j));
703 tmp_background_row->push_back(tmp_background);
704 }
705 background->push_back(tmp_background_row);
706 }
707 delete [] name;
708 }
709
710 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
711 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
712 void Model::create_nuisances(std::vector< vector< vector<double>* >* >* systematic_uncertainties){
713 // cout<<"Create nuisance parameters\n"<<endl;
714 if(range_nuisances>0){
715 if(use_nuisances==true){
716
717 nuisance_set=new RooArgSet();
718 nuisance_parameters=new vector<RooRealVar*>;
719 nuisance_widths=new vector<RooConstVar*>;
720 char* name=new char[1000];
721 char* title=new char[1000];
722
723 for(unsigned i=0;i<systematic_uncertainties->size();i++){
724 double greatest_error=0;
725 for(unsigned j=0;j<systematic_uncertainties->at(i)->size();j++){
726 for(unsigned k=0;k<systematic_uncertainties->at(i)->at(j)->size();k++){
727 if(systematic_uncertainties->at(i)->at(j)->at(k) >greatest_error){
728 greatest_error=systematic_uncertainties->at(i)->at(j)->at(k);
729 }
730 }
731 }
732 if(nuisance_names==0){
733 sprintf (name, "sigma_%d", i);
734 sprintf (title, "sigma_%d", i);
735 }
736 else{
737 sprintf (name, "sigma_%d", i);
738 sprintf (title, "sigma_%s", this->nuisance_names->at(i).c_str());
739 }
740 RooConstVar* tmp_nuisance_width=new RooConstVar(name,title,greatest_error);
741 nuisance_widths->push_back(tmp_nuisance_width);
742 if(nuisance_names==0){
743 sprintf (name, "delta_%d", i);
744 sprintf (title, "delta_%d", i);
745 }
746 else{
747 sprintf (name, "delta_%d", i);
748 sprintf (title, "delta_%s", this->nuisance_names->at(i).c_str());
749 }
750 //RooRealVar* tmp_nuisance_parameters=new RooRealVar(name,title,0,-1*range_nuisances*nuisance_widths->at(i)->getVal(),1.0*range_nuisances*nuisance_widths->at(i)->getVal());
751 //RooRealVar* tmp_nuisance_parameters=new RooRealVar(name,title,0,-1,1.0*range_nuisances*nuisance_widths->at(i)->getVal());
752
753 double lower_limit=-1;
754 std::string line = title;
755 std::string::size_type pos=line.find("[LOGNORMAL]");
756 if(pos != std::string::npos) lower_limit=-0.9999;
757 RooRealVar* tmp_nuisance_parameters=new RooRealVar(name,title,0,lower_limit,1.0*nuisance_upper_limit->at(i)*nuisance_widths->at(i)->getVal());
758 // cout<<name<<" has upper limit "<<nuisance_upper_limit->at(i)<<endl;
759
760 nuisance_parameters->push_back(tmp_nuisance_parameters);
761 nuisance_set->add(*nuisance_parameters->at(i));
762 }
763 delete [] name;
764 delete [] title;
765 }
766 else cout<<"No systematic uncertainties specified, no nuisance parameters created\n"<<endl;
767 }
768 else{
769 cout<<"ERROR: negative range for the nuisance_parameters\n"<<endl;
770 this->corrupted=true;
771 }
772 }
773
774 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
775 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
776 void Model::create_scaling_factors(vector< vector< vector<double>* >* >* systematic_uncertainties){
777 // cout<<"Create scaling factors for nuisances\n"<<endl;
778 if(use_nuisances==true &&nuisance_parameters!=0){
779
780 scaling_factors = new vector< vector< vector<RooConstVar*>* >* >;
781 char* name=new char[1000];
782
783 for(unsigned i=0;i<nuisance_parameters->size();i++){
784
785 vector< vector<RooConstVar*>* >* tmp_scaling_factors_for_one_nuisance = new vector< vector<RooConstVar*>* >;
786 vector<RooConstVar*>* tmp_signal_scaling_for_one_nuisance = new vector<RooConstVar*>;
787
788 for(int j=0;j<this->n_channels;j++){
789 sprintf (name, "signal_scaling_factor_channel_%d_nuisance_%d", j,i);
790 RooConstVar* tmp_signal_scaling=new RooConstVar(name,name,1.0*systematic_uncertainties->at(i)->at(0)->at(j)/nuisance_widths->at(i)->getVal());
791 tmp_signal_scaling_for_one_nuisance->push_back(tmp_signal_scaling);
792 }
793 tmp_scaling_factors_for_one_nuisance->push_back(tmp_signal_scaling_for_one_nuisance);
794
795 for(unsigned j=0;j<background->size();j++){
796
797 vector<RooConstVar*>* tmp_background_scaling_for_one_nuisance_for_one_background_source = new vector<RooConstVar*>;
798
799 for(int k=0;k<this->n_channels;k++){
800 sprintf (name, "background_scaling_factor_channel_%d_source_%d_nuisance_%d",k,j,i);
801 RooConstVar* tmp_background_scaling=new RooConstVar(name,name,1.0*systematic_uncertainties->at(i)->at(j+1)->at(k)/nuisance_widths->at(i)->getVal());
802 tmp_background_scaling_for_one_nuisance_for_one_background_source->push_back(tmp_background_scaling);
803 }
804 tmp_scaling_factors_for_one_nuisance->push_back(tmp_background_scaling_for_one_nuisance_for_one_background_source);
805 }
806 scaling_factors->push_back(tmp_scaling_factors_for_one_nuisance);
807 }
808 delete [] name;
809 }
810 else{
811 if(use_nuisances==true){
812 cout<<"ERROR: systematics specified, but no nuisance parameters created yet; can't define scaling factors\n"<<endl;
813 this->corrupted=true;
814 }
815 else cout<<"No systematics_specified, no scaling factors needed\n"<<endl;
816 }
817 }
818
819
820 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
821 // Use this for Gaussian errors
822 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
823 void Model::create_nuisance_priors(){
824 //void Model::create_nuisance_priors(){
825 cout<<"Create nuisances priors\n"<<endl;
826 if(use_nuisances==true &&nuisance_parameters!=0){
827
828 nuisance_priors=new vector<RooAbsPdf*>;
829 nuisance_means=new vector<RooFormulaVar*>;
830 RooArgList* nuisance_prior_list=new RooArgList();
831 char* name=new char[1000];
832
833 for(unsigned i=0;i<nuisance_parameters->size();i++){
834 //here check if in name is gauss or logNormal
835 //cout<<(*nuiscance_parameters)[i].GetTitle()<<endl;
836 RooRealVar* dummy = nuisance_parameters->at(i);
837 //cout<<dummy->GetTitle()<<endl;
838
839 int distribution=0;
840 std::string line = dummy->GetTitle();///now find in string gauss or logNormal
841 std::string::size_type pos=line.find("[GAUSS]");
842 if(pos != std::string::npos) distribution=0;
843 pos=line.find("[LOGNORMAL]");
844 if(pos != std::string::npos) distribution=1;
845
846 if(distribution==0){
847 ///using gaussian function as nuisance distribution
848 cout<<" ---> "<<line<<" using Gaussian Distribuion"<<endl;
849 sprintf (name, "nuisance_prior_%d", i);
850 RooGaussian* tmp_nuisance_priors=new RooGaussian(name,name,*nuisance_parameters->at(i),RooFit::RooConst(0),*nuisance_widths->at(i));
851 nuisance_priors->push_back(tmp_nuisance_priors);
852 nuisance_prior_list->add(*nuisance_priors->at(i));
853 }
854 else if(distribution==1){
855 ///using logNormal function as nuiscance distribution
856 cout<<" ---> "<<line<<" using logNormal Distribuion"<<endl;
857 char* name2=new char[1000];
858
859 sprintf (name, "nuisance_mean_%d", i);
860 sprintf(name2,"%s+1",nuisance_parameters->at(i)->GetName());
861 RooFormulaVar* tmp_nuisance_means=new RooFormulaVar(name,name2,RooArgSet(*nuisance_parameters->at(i)));
862 nuisance_means->push_back(tmp_nuisance_means);
863 sprintf (name, "nuisance_prior_%d", i);
864 //RooLognormal* tmp_nuisance_priors=new RooLognormal(name, name,*nuisance_means->at(i), RooFit::RooConst(1), RooFit::RooConst(TMath::Exp(nuisance_widths->at(i)->getVal())));
865 //ok i have to adjust my mean parameter or each nusiance....
866 ///by my handmade calculations this is mu=sigma^2
867 double new_mean=nuisance_widths->at(i)->getVal()*nuisance_widths->at(i)->getVal();
868 //and put it into the function as exponential...
869 RooLognormal* tmp_nuisance_priors=new RooLognormal(name, name,*nuisance_means->at(i), RooFit::RooConst(TMath::Exp(new_mean)), RooFit::RooConst(TMath::Exp(nuisance_widths->at(i)->getVal())));
870 //cout<<"----------------------------"<<name<<" "<<nuisance_widths->at(i)->getVal()<<" "<<TMath::Exp(nuisance_widths->at(i)->getVal())<<endl;
871 nuisance_priors->push_back(tmp_nuisance_priors);
872 nuisance_prior_list->add(*nuisance_priors->at(i));
873
874
875 }
876 }
877 nuisance_prior_pdf=new RooProdPdf("nuisance_prior_pdf","nuisance_prior_pdf",*nuisance_prior_list);
878 delete nuisance_prior_list;
879 delete [] name;
880 }
881 else{
882 if(use_nuisances==true){
883 cout<<"ERROR: systematics specified, but no nuisance parameters created yet; can't create nuisance pdfs\n"<<endl;
884 this->corrupted=true;
885 }
886 else cout<<"No systematics_specified, no nuisance_priors needed\n"<<endl;
887 }
888
889 cout<<endl;
890
891 }
892
893 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
894 // Use this for Gaussian errors
895 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
896 // void Model::create_nuisance_priors(){
897 // //void Model::create_nuisance_priors(){
898 // cout<<"Create nuisances priors\n"<<endl;
899 // if(use_nuisances==true &&nuisance_parameters!=0){
900
901 // nuisance_priors=new vector<RooAbsPdf*>;
902 // RooArgList* nuisance_prior_list=new RooArgList();
903 // char* name=new char[1000];
904
905 // for(int i=0;i<nuisance_parameters->size();i++){
906 // sprintf (name, "nuisance_prior_%d", i);
907 // RooGaussian* tmp_nuisance_priors=new RooGaussian(name,name,*nuisance_parameters->at(i),RooFit::RooConst(0),*nuisance_widths->at(i));
908 // nuisance_priors->push_back(tmp_nuisance_priors);
909 // nuisance_prior_list->add(*nuisance_priors->at(i));
910 // }
911 // nuisance_prior_pdf=new RooProdPdf("nuisance_prior_pdf","nuisance_prior_pdf",*nuisance_prior_list);
912 // delete nuisance_prior_list;
913 // delete [] name;
914 // }
915 // else{
916 // if(use_nuisances==true){
917 // cout<<"ERROR: systematics specified, but no nuisance parameters created yet; can't create nuisance pdfs\n"<<endl;
918 // this->corrupted=true;
919 // }
920 // else cout<<"No systematics_specified, no nuisance_priors needed\n"<<endl;
921 // }
922 // }
923
924 // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
925 // // Use this for LogNormal errors
926 // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
927 void Model::create_nuisance_priors_2(){
928 if(use_nuisances==true &&nuisance_parameters!=0){
929
930 nuisance_priors=new vector<RooAbsPdf*>;
931 nuisance_means=new vector<RooFormulaVar*>;
932 RooArgList* nuisance_prior_list=new RooArgList();
933 char* name=new char[1000];
934
935 for(unsigned i=0;i<nuisance_parameters->size();i++){
936 char* name2=new char[1000];
937 sprintf (name, "nuisance_mean_%d", i);
938 sprintf(name2,"%s+1",nuisance_parameters->at(i)->GetName());
939 RooFormulaVar* tmp_nuisance_means=new RooFormulaVar(name,name2,RooArgSet(*nuisance_parameters->at(i)));
940 nuisance_means->push_back(tmp_nuisance_means);
941 sprintf (name, "nuisance_prior_%d", i);
942 RooLognormal* tmp_nuisance_priors=new RooLognormal(name, name,*nuisance_means->at(i), RooFit::RooConst(1), RooFit::RooConst(TMath::Exp(nuisance_widths->at(i)->getVal())));
943
944 nuisance_priors->push_back(tmp_nuisance_priors);
945 nuisance_prior_list->add(*nuisance_priors->at(i));
946 delete [] name2;
947 }
948 nuisance_prior_pdf=new RooProdPdf("nuisance_prior_pdf","nuisance_prior_pdf",*nuisance_prior_list);
949 delete nuisance_prior_list;
950 delete [] name;
951 }
952 else{
953 if(use_nuisances==true){
954 cout<<"ERROR: systematics specified, but no nuisance parameters created yet; can't create nuisance pdfs\n"<<endl;
955 this->corrupted=true;
956 }
957 else cout<<"No systematics_specified, no nuisance_priors needed\n"<<endl;
958 }
959 }
960
961 // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
962 // // Use this for Gamma errors, does not work
963 // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
964 // void Model::create_nuisance_priors(){
965 //
966 // if(use_nuisances==true &&nuisance_parameters!=0){
967 //
968 // nuisance_priors=new vector<RooAbsPdf*>;
969 // nuisance_means=new vector<RooFormulaVar*>;
970 // RooArgList* nuisance_prior_list=new RooArgList();
971 // char* name=new char[1000];
972 // RooConstVar gamma("gamma","gamma",20);
973 //
974 // for(int i=0;i<nuisance_parameters->size();i++){
975 // char* name2=new char[1000];
976 // sprintf (name, "beta_%d", i);
977 // RooConstVar* beta=new RooConstVar(name,name,TMath::Sqrt(nuisance_widths->at(i)->getVal()*nuisance_widths->at(i)->getVal()/gamma.getVal()));
978 // sprintf(name2,"%s+beta_%d*gamma",nuisance_parameters->at(i)->GetName(),i);
979 // nuisance_parameters->at(i)->setRange(TMath::Max(-1.0,-beta->getVal()*gamma.getVal()),range_nuisances*nuisance_widths->at(i)->getVal());
980 // sprintf (name, "nuisance_mean_%d", i);
981 // RooFormulaVar* tmp_nuisance_means=new RooFormulaVar(name,name2,RooArgSet(*beta,gamma,*nuisance_parameters->at(i)));
982 // nuisance_means->push_back(tmp_nuisance_means);
983 // sprintf (name, "nuisance_prior_%d", i);
984 // RooGamma* tmp_nuisance_priors=new RooGamma(name, name,*nuisance_means->at(i),RooFit::RooConst(gamma.getVal()),RooFit::RooConst(beta->getVal()),RooFit::RooConst(0));
985 // tmp_nuisance_priors->Print();
986 // nuisance_priors->push_back(tmp_nuisance_priors);
987 // nuisance_prior_list->add(*nuisance_priors->at(i));
988 // delete [] name2;
989 // delete beta;
990 // }
991 // nuisance_prior_pdf=new RooProdPdf("nuisance_prior_pdf","nuisance_prior_pdf",*nuisance_prior_list);
992 // nuisance_prior_pdf->Print();
993 // delete nuisance_prior_list;
994 // delete [] name;
995 // }
996 // else{
997 // if(use_nuisances==true){
998 // cout<<"ERROR: systematics specified, but no nuisance parameters created yet; can't create nuisance pdfs\n"<<endl;
999 // this->corrupted=true;
1000 // }
1001 // else cout<<"No systematics_specified, no nuisance_priors needed\n"<<endl;
1002 // }
1003 // }
1004
1005
1006 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1007 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1008 void Model::create_POI(){
1009 if(range_POI>0){
1010 // cout<<"Create parameter of interest\n"<<endl;
1011 //POI=new RooRealVar("POI","POI",1.0*range_POI/2,0,range_POI);
1012 POI=new RooRealVar("POI","POI",1.0*range_POI/2,0,range_POI);
1013 POI_set=new RooArgSet(*POI);
1014 }
1015 else{
1016 cout<<"ERROR: negative range specified, problem with input\n"<<endl;
1017 this->corrupted=true;
1018 }
1019 }
1020
1021 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1022 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1023 void Model::create_POI_prior(){
1024 if(POI!=0){
1025 // cout<<"Create flat prior for the parameter of interest\n"<<endl;
1026 RooAbsPdf* tmp_POI_prior= new RooPolynomial("tmp_POI_pior","tmp_POI_pior",*POI,RooArgList(RooFit::RooConst(0)));
1027 //RooJeffreysPrior* tmp_POI_prior =new RooJeffreysPrior("jeffreys","jeffreys",*w.pdf("p"),*POI,*observable_set);
1028 //RooJeffreysPrior pi("jeffreys","jeffreys",*w.pdf("p"),*w.set("poi"),*w.set("obs"));
1029
1030 // tmp->Print();
1031 POI_prior_pdf=new RooProdPdf("POI_prior","POI_prior",RooArgList(*tmp_POI_prior));
1032 POI_prior_pdf->getVal();
1033 delete tmp_POI_prior;
1034 }
1035 else{
1036 cout<<"ERROR: no parameter of interest specified yet, can't create prior\n"<<endl;
1037 this->corrupted=true;
1038 }
1039 }
1040
1041 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1042 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1043 void Model::create_sb_likelihood(){
1044 if(corrupted==false){
1045 cout<<"Create sb_likelihood\n"<<endl;
1046 sb_means = new vector<RooFormulaVar*>;
1047 sb_poissons = new vector<RooPoisson*>;
1048 vector<RooArgSet*>* sb_params =new vector<RooArgSet*>;
1049 char* name=new char[1000];
1050
1051 for(int i=0;i<n_channels;i++){
1052 RooArgSet* tmp_sb_params=new RooArgSet(*POI,*signal->at(i));
1053 for(int j=0;j<n_backgrounds;j++){
1054 tmp_sb_params->add(*background->at(j)->at(i));
1055 if(use_nuisances==true){
1056 for(unsigned k=0;k<nuisance_parameters->size();k++){
1057 tmp_sb_params->add(*nuisance_parameters->at(k));
1058 tmp_sb_params->add(*scaling_factors->at(k)->at(0)->at(i));
1059 tmp_sb_params->add(*scaling_factors->at(k)->at(j+1)->at(i));
1060 }
1061 }
1062 }
1063 sb_params->push_back(tmp_sb_params);
1064 }
1065 //Poisson means and Poisson distributions
1066 stringstream* formula_string=new stringstream();
1067 for(int i=0;i<n_channels;i++){
1068 formula_string->str("");
1069 *formula_string<<"1*(";
1070 *formula_string<<"POI";
1071 *formula_string<<"*signal_"<<i;
1072 if(use_nuisances==true){
1073 for(unsigned j=0;j<nuisance_parameters->size();j++){
1074 *formula_string<<"*(1+delta_"<<j<<"*signal_scaling_factor_channel_"<<i<<"_nuisance_"<<j<<")";
1075 }
1076 }
1077 for(int k=0;k<n_backgrounds;k++){
1078 *formula_string<<"+background_channel_"<<i<<"_source_"<<k;
1079 if(use_nuisances==true){
1080 for(unsigned j=0;j<nuisance_parameters->size();j++){
1081 *formula_string<<"*(1+delta_"<<j<<"*background_scaling_factor_channel_"<<i<<"_source_"<<k<<"_nuisance_"<<j<<")";
1082 }
1083 }
1084 }
1085 *formula_string<<")";
1086 cout<<formula_string->str()<<endl;
1087 sprintf (name, "sb_mean_%d",i);
1088 RooFormulaVar* tmp_sb_means=new RooFormulaVar(name,formula_string->str().c_str(),*sb_params->at(i));
1089 sb_means->push_back(tmp_sb_means);
1090 sprintf (name, "sb_poisson_%d",i);
1091 RooPoisson* tmp_sb_poissons=new RooPoisson(name,name,*observables->at(i),*sb_means->at(i));
1092 sb_poissons->push_back(tmp_sb_poissons);
1093 }
1094
1095 RooArgList *sb_pdfs=new RooArgList();
1096 for(int i=0;i<n_channels;i++) {
1097 sb_pdfs->add(*sb_poissons->at(i));
1098 }
1099 sb_likelihood=new RooProdPdf("sb_likelihood","sb_likelihood",*sb_pdfs);
1100
1101 delete sb_pdfs;
1102 for(unsigned i=0;i<sb_params->size();i++){
1103 delete sb_params->at(i);
1104 }
1105 delete sb_params;
1106 delete formula_string;
1107 delete [] name;
1108 }
1109 }
1110
1111 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1112 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1113 void Model::create_b_likelihood(){
1114
1115 if(corrupted==false){
1116 cout<<"Create b_likelihood\n"<<endl;
1117 b_means = new vector<RooFormulaVar*>;
1118 b_poissons = new vector<RooPoisson*>;
1119 vector<RooArgSet*>* b_params =new vector<RooArgSet*>;
1120 char* name=new char[1000];
1121 for(int i=0;i<n_channels;i++){
1122 RooArgSet* tmp_b_params=new RooArgSet();
1123 for(int j=0;j<n_backgrounds;j++){
1124 tmp_b_params->add(*background->at(j)->at(i));
1125 if(use_nuisances==true){
1126 for(unsigned k=0;k<nuisance_parameters->size();k++){
1127 tmp_b_params->add(*nuisance_parameters->at(k));
1128 tmp_b_params->add(*scaling_factors->at(k)->at(j+1)->at(i));
1129 }
1130 }
1131 }
1132 b_params->push_back(tmp_b_params);
1133 }
1134 //Poisson means and Poisson distributions
1135 stringstream* formula_string=new stringstream();
1136 for(int i=0;i<n_channels;i++){
1137 formula_string->str("");
1138 *formula_string<<"1*(";
1139 for(int k=0;k<n_backgrounds;k++){
1140 if(k==0){
1141 *formula_string<<"background_channel_"<<i<<"_source_"<<k;
1142 }
1143 else{
1144 *formula_string<<"+background_channel_"<<i<<"_source_"<<k;
1145 }
1146 if(use_nuisances==true){
1147 for(unsigned j=0;j<nuisance_parameters->size();j++){
1148 *formula_string<<"*(1+delta_"<<j<<"*background_scaling_factor_channel_"<<i<<"_source_"<<k<<"_nuisance_"<<j<<")";
1149 }
1150 }
1151 }
1152 *formula_string<<")";
1153 sprintf (name, "b_mean_%d",i);
1154 cout<<formula_string->str()<<endl;
1155 // b_params->at(i)->Print();
1156 RooFormulaVar* tmp_b_means=new RooFormulaVar(name,formula_string->str().c_str(),*b_params->at(i));
1157 b_means->push_back(tmp_b_means);
1158 sprintf (name, "b_poisson_%d",i);
1159 RooPoisson* tmp_b_poissons=new RooPoisson(name,name,*observables->at(i),*b_means->at(i));
1160 b_poissons->push_back(tmp_b_poissons);
1161 }
1162 RooArgList *b_pdfs=new RooArgList();
1163 for(int i=0;i<n_channels;i++) {
1164 b_pdfs->add(*b_poissons->at(i));
1165 }
1166 b_likelihood=new RooProdPdf("b_likelihood","b_likelihood",*b_pdfs);
1167 delete b_pdfs;
1168 for(unsigned i=0;i<b_params->size();i++){
1169 delete b_params->at(i);
1170 }
1171 delete b_params;
1172 delete formula_string;
1173 delete [] name;
1174 }
1175 }
1176
1177 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1178 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1179 bool Model::create_dataset(std::vector<int>* n_input){
1180 if(corrupted==false){
1181 // cout<<"Create data from input\n"<<endl;
1182 if(int(n_input->size())!=n_channels){
1183 cout<<"ERROR: observation input doesn't match number of channels\n"<<endl;
1184 this->corrupted=true;
1185 return(false);
1186 }
1187 for(int i=0;i<n_channels;i++){
1188 observables->at(i)->setVal(n_input->at(i));
1189 }
1190 if(data!=0){
1191 delete data;
1192 }
1193 data=new RooDataSet("data","data",*observable_set);
1194 data->add(*observable_set);
1195 return (true);
1196 }
1197
1198 return(false);
1199 }
1200
1201 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1202 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1203
1204 bool Model::create_pseudo_datasets(std::vector<double>* signal_expectation, std::vector< std::vector<double>* >* background_expectation, std::vector< std::vector< std::vector<double>* >* >* systematic_uncertainties){
1205
1206 char* name=new char[1000];
1207
1208 pseudo_b_obs_set=new RooArgSet();
1209 pseudo_bDN_obs_set=new RooArgSet();
1210 pseudo_bUP_obs_set=new RooArgSet();
1211 pseudo_sb_obs_set=new RooArgSet();
1212
1213 for(int i=0;i<this->n_channels;i++){
1214
1215 double b = 0;
1216 double bDN = 0;
1217 double bUP = 0;
1218 double sb = signal_expectation->at(i);
1219
1220 for(int j=0;j<n_backgrounds;j++){
1221
1222 b += background_expectation->at(j)->at(i);
1223 sb += background_expectation->at(j)->at(i);
1224
1225 double uncsum2 = 0;
1226 for(unsigned k=0;k<nuisance_parameters->size();k++){
1227
1228
1229 uncsum2 += pow(systematic_uncertainties->at(k)->at(j+1)->at(i),2);
1230 }
1231
1232 bDN += background_expectation->at(j)->at(i) * (1-sqrt(uncsum2));
1233 bUP += background_expectation->at(j)->at(i) * (1+sqrt(uncsum2));
1234
1235 }
1236
1237 sprintf (name, "observation_%d",i);
1238
1239 RooRealVar* tmp_b=new RooRealVar(name,name,int(b+0.5),0,range_n_obs);
1240 tmp_b->Print();
1241 RooRealVar* tmp_bDN=new RooRealVar(name,name,int(bDN+0.5),0,range_n_obs);
1242 tmp_bDN->Print();
1243 RooRealVar* tmp_bUP=new RooRealVar(name,name,int(bUP+0.5),0,range_n_obs);
1244 tmp_bUP->Print();
1245 RooRealVar* tmp_sb=new RooRealVar(name,name,int(sb+0.5),0,range_n_obs);
1246 tmp_sb->Print();
1247
1248
1249 pseudo_b_obs_set->add(*tmp_b);
1250 pseudo_bDN_obs_set->add(*tmp_bDN);
1251 pseudo_bUP_obs_set->add(*tmp_bUP);
1252 pseudo_sb_obs_set->add(*tmp_sb);
1253
1254
1255
1256
1257 }
1258 delete [] name;
1259
1260 pseudo_data_b=new RooDataSet("pseudo_data_b","pseudo_data_b",*pseudo_b_obs_set);
1261 pseudo_data_b->add(*pseudo_b_obs_set);
1262
1263 pseudo_data_b_minusSigma=new RooDataSet("pseudo_data_b_minusSigma","pseudo_data_b_minusSigma",*pseudo_bDN_obs_set);
1264 pseudo_data_b_minusSigma->add(*pseudo_bDN_obs_set);
1265
1266 pseudo_data_b_plusSigma=new RooDataSet("pseudo_data_b_plusSigma","pseudo_data_b_plusSigma",*pseudo_bUP_obs_set);
1267 pseudo_data_b_plusSigma->add(*pseudo_bUP_obs_set);
1268
1269 pseudo_data_sb=new RooDataSet("pseudo_data_sb","pseudo_data_sb",*pseudo_sb_obs_set);
1270 pseudo_data_sb->add(*pseudo_sb_obs_set);
1271
1272
1273 return true;
1274 }
1275 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1276 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1277 RooRealVar* Model::get_POI(){
1278 return(this->POI);
1279 }
1280
1281 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1282 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1283 RooArgSet* Model::get_POI_set(){
1284 return(this->POI_set);
1285 }
1286
1287 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1288 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1289 RooArgSet* Model::get_observable_set(){
1290 return(this->observable_set);
1291 }
1292
1293 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1294 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1295 RooArgSet* Model::get_nuisance_set(){
1296 return(this->nuisance_set);
1297 }
1298 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1299 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1300 RooProdPdf* Model::get_POI_prior(){
1301 return(POI_prior_pdf);
1302 }
1303
1304 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1305 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1306 RooProdPdf* Model::get_nuisance_prior_pdf(){
1307 return(nuisance_prior_pdf);
1308 }
1309
1310 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1311 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1312 RooProdPdf* Model::get_sb_likelihood(){
1313 return(sb_likelihood);
1314 }
1315
1316 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1317 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1318 RooProdPdf* Model::get_b_likelihood(){
1319 return(this->b_likelihood);
1320 }
1321
1322 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1323 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1324 RooProdPdf* Model::get_complete_likelihood(){
1325 RooProdPdf* complete_likelihood=new RooProdPdf("complete_likelihood","complete_likelihood",RooArgList(*this->sb_likelihood,*this->nuisance_prior_pdf));
1326 return(complete_likelihood);
1327 }
1328
1329 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1330 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1331 RooDataSet* Model::get_data(){
1332 return(this->data);
1333 }
1334 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1335 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1336 RooDataSet* Model::get_pseudo_data_b(){
1337 return(this->pseudo_data_b);
1338 }
1339 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1340 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1341 RooDataSet* Model::get_pseudo_data_bDN(){
1342 return(this->pseudo_data_b_minusSigma);
1343 }
1344 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1345 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1346 RooDataSet* Model::get_pseudo_data_bUP(){
1347 return(this->pseudo_data_b_plusSigma);
1348 }
1349 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1350 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1351 RooDataSet* Model::get_pseudo_data_sb(){
1352 return(this->pseudo_data_sb);
1353 }
1354 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1355 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1356 void Model::set_random_seed(int i){
1357 cout<<"Setting random seed to "<<i<<endl;
1358 RooRandom::randomGenerator()->SetSeed(i);
1359 }
1360 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1361 double Model::get_sum_signal(){
1362 return(this->sumS);
1363 }
1364 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1365 double Model::get_sum_background(){
1366 return(this->sumB);
1367 }
1368 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1369 double Model::get_total_bunc(){
1370 return(sqrt(this->sumBerr)*this->sumB);
1371 }
1372 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1373 double Model::get_lumi_scale(){
1374 return(this->lumiScale);
1375 }
1376 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1377 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1378 void Model::Print(){
1379 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1380 //Some output of the model parameters
1381 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1382 cout<<"---------------------------------------------------------------------------------------------------------------------"<<endl;
1383 cout<<"Model information"<<endl;
1384 cout<<"---------------------------------------------------------------------------------------------------------------------\n\n\n"<<endl;
1385 cout<<"Number of channels: "<<this->n_channels<<"\nNumber of background sources per channel: "<<this->n_backgrounds<<"\n\n\n"<<endl;
1386 cout<<"Channel signal expectation background_expectation(s)\n"<<endl;
1387 for(int i=0;i<this->n_channels;i++){
1388 cout<<i<<" "<<this->signal->at(i)->getVal();
1389 for(int j=0;j<this->n_backgrounds;j++){
1390 cout<<" "<<this->background->at(j)->at(i)->getVal();
1391 }
1392 cout<<"\n";
1393 }
1394
1395 if(use_nuisances==true){
1396 cout<<"\n\n---------------------------------------------------------------------------------------------------------------------"<<endl;
1397 cout<<"Systematic uncertainties"<<endl;
1398 cout<<"---------------------------------------------------------------------------------------------------------------------\n\n"<<endl;
1399 for(unsigned i=0;i<this->nuisance_parameters->size();i++){
1400 if(nuisance_names) cout<<"Matrix for "<<nuisance_names->at(i).c_str()<<" uncertainty "<<"\n"<<endl;
1401 else cout<<"Matrix for uncertainty "<<i<<"\n"<<endl;
1402 cout<<" sigma_signal sigma_b\n"<<endl;
1403 for(int j=0;j<this->n_channels;j++){
1404 cout<<"Channel "<<j<<" ";
1405 for(int k=0;k<this->n_backgrounds+1;k++){
1406 cout<<this->nuisance_widths->at(i)->getVal()*this->scaling_factors->at(i)->at(k)->at(j)->getVal()<<" ";
1407 }
1408 cout<<"\n";
1409 }
1410 cout<<"\n\n";
1411 }
1412 cout<<"\n\n---------------------------------------------------------------------------------------------------------------------"<<endl;
1413 cout<<"scaling factors"<<endl;
1414 cout<<"---------------------------------------------------------------------------------------------------------------------\n\n\n"<<endl;
1415 for(unsigned i=0;i<nuisance_parameters->size();i++){
1416 if(nuisance_names) cout<<"Scaling factors for "<<nuisance_names->at(i).c_str()<<" nuisance parameter "<<"\n"<<endl;
1417 else cout<<"Scaling factors for nuisance parameter "<<i<<"\n"<<endl;
1418 cout<<"Width of nuisance distribution: "<<nuisance_widths->at(i)->getVal()<<"\n"<<endl;
1419 cout<<" signal scaling background scaling\n"<<endl;
1420 for(int j=0;j<n_channels;j++){
1421 cout<<"channel "<<j<<" "<<scaling_factors->at(i)->at(0)->at(j)->getVal();
1422 for(unsigned k=0;k<background->size();k++){
1423 cout<<" "<<scaling_factors->at(i)->at(k+1)->at(j)->getVal();
1424 }
1425 cout<<"\n"<<endl;
1426 }
1427 cout<<"\n\n\n"<<endl;
1428 }
1429 }
1430 }
1431
1432
1433
1434 void Model::test(string file){
1435 ofstream myfile;
1436 myfile.open (file.c_str(), fstream::app);
1437 myfile<<endl;
1438 myfile<<"[observation]"<<endl;
1439 char* name=new char[1000];
1440 char* hmm=new char[1000];
1441 for(int i=0;i<this->n_channels;i++){
1442 sprintf (name, "observation_%d",i);
1443 //cout<<this->data->get()->getRealValue(name)<<endl;
1444 sprintf (hmm, "n%d",i+1);
1445 myfile<<hmm<<" = "<<this->data->get()->getRealValue(name)<<endl;
1446 }
1447 myfile.close();
1448 delete [] name;
1449 }
1450 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1451
1452 void Model::create_teststats() {
1453
1454
1455 RooRealVar* firstPOI = (RooRealVar*) this->get_POI_set()->first();
1456 firstPOI->setVal(1);
1457
1458 RooNLLVar* sb_nll = new RooNLLVar("sb_nll","sb_nll",*this->get_sb_likelihood(),*this->get_data());
1459 RooNLLVar* b_nll = new RooNLLVar("b_nll","b_nll",*this->get_b_likelihood(),*this->get_data());
1460 test_Data = 2*(sb_nll->getVal()-b_nll->getVal());
1461
1462 sb_nll = new RooNLLVar ("sb_nll","sb_nll",*this->get_sb_likelihood(),*this->get_pseudo_data_b());
1463 b_nll = new RooNLLVar ("b_nll","b_nll",*this->get_b_likelihood(),*this->get_pseudo_data_b());
1464 test_Bmean = 2*(sb_nll->getVal()-b_nll->getVal());
1465
1466 sb_nll = new RooNLLVar ("sb_nll","sb_nll",*this->get_sb_likelihood(),*this->get_pseudo_data_bDN());
1467 b_nll = new RooNLLVar ("b_nll","b_nll",*this->get_b_likelihood(),*this->get_pseudo_data_bDN());
1468 test_Bdown = 2*(sb_nll->getVal()-b_nll->getVal());
1469
1470 sb_nll = new RooNLLVar ("sb_nll","sb_nll",*this->get_sb_likelihood(),*this->get_pseudo_data_bUP());
1471 b_nll = new RooNLLVar ("b_nll","b_nll",*this->get_b_likelihood(),*this->get_pseudo_data_bUP());
1472 test_Bup = 2*(sb_nll->getVal()-b_nll->getVal());
1473
1474 sb_nll = new RooNLLVar ("sb_nll","sb_nll",*this->get_sb_likelihood(),*this->get_pseudo_data_sb());
1475 b_nll = new RooNLLVar ("b_nll","b_nll",*this->get_b_likelihood(),*this->get_pseudo_data_sb());
1476 test_SBmean = 2*(sb_nll->getVal()-b_nll->getVal());
1477
1478 cout<<"Test statistics for data = "<<test_Data<<endl;
1479 cout<<"Test statistics for b = "<<test_Bmean<<endl;
1480 cout<<"Test statistics for b - 1sigma = "<<test_Bdown<<endl;
1481 cout<<"Test statistics for b + 1sigma = "<<test_Bup<<endl;
1482 cout<<"Test statistics for sb = "<<test_SBmean<<endl;
1483
1484 }
1485
1486 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1487 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1488 //////////////////////////////////////////////// CLS LIMIT CALCULATION METHODS ///////////////////////////////////////
1489 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1490 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1491
1492
1493 void significance_Hybrid(Model* model,int n_toys,int random_seed=0){
1494 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1495 cout<<"Calculating significance with the Hybrid method"<<endl;
1496 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1497
1498 //set the random seed
1499 RooRandom::randomGenerator()->SetSeed(random_seed);
1500
1501 //get the calculator
1502 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1503
1504 //for numbercounting experiments
1505 myhc.PatchSetExtended(false);
1506
1507 //set likelihood ratio as the test statistics
1508 myhc.SetTestStatistic(1);
1509
1510 //define the systematics to be used
1511 if (model->get_nuisance_set()) {
1512 myhc.UseNuisance(true);
1513 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1514 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1515 } else {
1516 myhc.UseNuisance(false);
1517 }
1518
1519 //define the number of toys to be done
1520 myhc.SetNumberOfToys(n_toys);
1521
1522 //get the Hypotestresult
1523 HybridResult* hcResult = myhc.GetHypoTest();
1524 double significance = hcResult->Significance();
1525 //double CLS= hcResult->Cls();
1526 //double CLSerror= hcResult->ClsError();
1527
1528 // myhc.PrintMore("");
1529 cout <<"HybridCalculator significance:" << significance<< endl;
1530 }
1531
1532 HybridResult* UL_significance_Hybrid(Model* model,int n_toys,int random_seed=0,double sig=1){
1533 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1534 cout<<"Calculating significance with the Hybrid method"<<endl;
1535 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1536
1537 RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);
1538
1539 //set the random seed
1540 RooRandom::randomGenerator()->SetSeed(random_seed);
1541
1542 //get the calculator
1543 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1544
1545 //for numbercounting experiments
1546 myhc.PatchSetExtended(false);
1547
1548 //set likelihood ratio as the test statistics
1549 myhc.SetTestStatistic(1);
1550
1551
1552 //define the systematics to be used
1553 if (model->get_nuisance_set()) {
1554 myhc.UseNuisance(true);
1555 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1556 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1557 } else {
1558 myhc.UseNuisance(false);
1559 }
1560
1561 // myhc.UseNuisance(false);
1562
1563
1564 //RooArgSet* poi= model->get_POI_set();
1565 // poi->first()->Set(sig);
1566 RooRealVar* firstPOI = (RooRealVar*) model->get_POI_set()->first();
1567 firstPOI->setVal(sig);
1568
1569
1570
1571 double expSigmas = fabs(model->get_teststat_Bmean() - model->get_teststat_SBmean())/fabs(model->get_teststat_Bmean() - model->get_teststat_Bup());
1572
1573 cout<<"Expected Sigmas Significance from Test statistics = "<<expSigmas<<endl;
1574
1575
1576 if(! isfinite(expSigmas) || expSigmas > 5.5) {
1577 cout<<" => BIG signal: Set CLs to 0!"<<endl;
1578 return 0;
1579 }
1580
1581
1582
1583 //Test if we have a very small signal
1584
1585 myhc.SetNumberOfToys(200);
1586 HybridResult* hcResult = myhc.GetHypoTest();
1587 hcResult->SetDataTestStatistics( model->get_teststat_Bdown() );
1588
1589 if(hcResult->CLs() > 0.5) {
1590 cout<<"Small signal: Stop running toys after 200!!"<<endl;
1591 return hcResult;
1592 }
1593
1594 delete hcResult;
1595
1596
1597 //define the number of toys to be done
1598 myhc.SetNumberOfToys(n_toys);
1599
1600 return myhc.GetHypoTest();
1601
1602 // hcResult->PrintMore("");
1603
1604 // // HypoTestPlot *plot = new HypoTestPlot(*hcResult,100);
1605 // HybridPlot* plot=hcResult->GetPlot("hcPlot","p Values Plot",100);
1606 // TCanvas *c1=new TCanvas;
1607 // plot->Draw();
1608 // c1->SaveAs("hybrid_Result.eps");
1609
1610 // double significance = hcResult->Significance();
1611 // double CLS= hcResult->CLs();
1612 // double CLB= hcResult->CLb();
1613 // double CLsplusb= hcResult->CLsplusb();
1614 // double CLSerror= hcResult->CLsError();
1615
1616
1617 // // compute the mean expected significance from toys
1618 // double mean_sb_toys_test_stat = plot->GetSBmean();
1619 // hcResult->SetDataTestStatistics(mean_sb_toys_test_stat);
1620 // double toys_significance = hcResult->Significance();
1621
1622 // cout<<endl;
1623 // cout<<"POI: "<<sig<<endl;
1624 // cout <<"significance of data: " << significance<<endl;
1625 // cout <<"mean significance of toys: " << toys_significance<<endl;
1626 // cout<<"CLs: "<<CLS<<endl;
1627 // cout<<"CLb: "<<CLB<<endl;
1628 // cout<<"CLsplusb: "<<CLsplusb<<endl;
1629 // cout<<"CLserror: "<<CLSerror<<endl;
1630
1631
1632 }
1633
1634
1635
1636
1637
1638
1639 void upper_limit_Hybrid_auto_scan(Model* model,double confidence,int n_toys_per_point,double lower_scan_bound, double upper_scan_bound,int random_seed=0,bool useCLS=true,double accuracy=0.005){
1640 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1641 cout<<"Calculating upper limit with the Hybrid method"<<endl;
1642 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1643
1644 //set the random seed
1645 RooRandom::randomGenerator()->SetSeed(random_seed);
1646
1647 //get the calculator
1648 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1649
1650 //for numbercounting experiments
1651 myhc.PatchSetExtended(false);
1652
1653 //set likelihood ratio as the test statistics
1654 myhc.SetTestStatistic(1);
1655
1656 //define the systematics to be used
1657 if (model->get_nuisance_set()) {
1658 myhc.UseNuisance(true);
1659 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1660 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1661 } else {
1662 myhc.UseNuisance(false);
1663 }
1664
1665 //define the number of toys to be done
1666 myhc.SetNumberOfToys(n_toys_per_point);
1667
1668 //get the interval calculator
1669 HypoTestInverter myInverter(myhc,*model->get_POI());
1670
1671 //use the CLS method
1672 myInverter.UseCLs(useCLS);
1673
1674 //set the confidence
1675 myInverter.SetTestSize((1-confidence)*2);
1676
1677 //run the auto scan in range lower_scan_bound - upper_scan_bound with accuracy parameter accuracy
1678 myInverter.RunAutoScan(lower_scan_bound,upper_scan_bound,myInverter.Size()/2,accuracy);
1679
1680 //get the result
1681 HypoTestInverterResult* results = myInverter.GetInterval();
1682
1683 double upperLimit = results->UpperLimit();
1684 std::cout <<confidence<< "% upper limit is: " << upperLimit << std::endl;
1685 }
1686
1687
1688
1689
1690
1691
1692
1693 void upper_limit_Hybrid_fixed_scan(Model* model,double confidence,int n_toys_per_point,double lower_scan_bound, double upper_scan_bound,int n_steps,int random_seed=0,bool useCLS=true){
1694 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1695 cout<<"Calculating upper limit with the Hybrid method"<<endl;
1696 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1697
1698 //set the random seed
1699 RooRandom::randomGenerator()->SetSeed(random_seed);
1700
1701 //get the calculator
1702 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1703
1704 //for numbercounting experiments
1705 myhc.PatchSetExtended(false);
1706
1707 //set likelihood ratio as the test statistics
1708 myhc.SetTestStatistic(1);
1709
1710 //define the systematics to be used
1711 if (model->get_nuisance_set()) {
1712 myhc.UseNuisance(true);
1713 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1714 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1715 } else {
1716 myhc.UseNuisance(false);
1717 }
1718
1719 //define the number of toys to be done
1720 myhc.SetNumberOfToys(n_toys_per_point);
1721
1722 //get the interval calculator
1723 HypoTestInverter myInverter(myhc,*model->get_POI());
1724
1725 //use the CLS method
1726 myInverter.UseCLs(useCLS);
1727
1728 //set the confidence
1729 myInverter.SetTestSize((1-confidence)*2);
1730
1731 //run the fixed scan in range lower_scan_bound - upper_scan_bound with n_steps steps
1732 myInverter.RunFixedScan(n_steps,lower_scan_bound,upper_scan_bound);
1733
1734 //get the result
1735 HypoTestInverterResult* results = myInverter.GetInterval();
1736
1737 double upperLimit = results->UpperLimit();
1738 std::cout <<confidence<< "% upper limit is: " << upperLimit << std::endl;
1739 }
1740
1741 void upper_limit_Hybrid_one_point(Model* model,double value_to_run_for,int n_toys,int random_seed=0,bool useCLS=true){
1742 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1743 cout<<"Calculating upper limit with the Hybrid method"<<endl;
1744 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1745
1746 //set the random seed
1747 RooRandom::randomGenerator()->SetSeed(random_seed);
1748
1749 //get the calculator
1750 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1751
1752 //for numbercounting experiments
1753 myhc.PatchSetExtended(false);
1754
1755 //set likelihood ratio as the test statistics
1756 myhc.SetTestStatistic(1);
1757
1758 //define the systematics to be used
1759 if (model->get_nuisance_set()) {
1760 myhc.UseNuisance(true);
1761 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1762 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1763 } else {
1764 myhc.UseNuisance(false);
1765 }
1766
1767 //define the number of toys to be done
1768 myhc.SetNumberOfToys(n_toys);
1769
1770 //get the interval calculator
1771 HypoTestInverter myInverter(myhc,*model->get_POI());
1772
1773 //use the CLS method
1774 myInverter.UseCLs(useCLS);
1775
1776 //run one point
1777 myInverter.RunOnePoint(value_to_run_for);
1778 }
1779
1780 void central_interval_Hybrid_fixed_scan(Model* model,double confidence,int n_toys_per_point,double lower_scan_bound, double upper_scan_bound,int n_steps,int random_seed=0,bool useCLS=true){
1781 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1782 cout<<"Calculating central interval with the Hybrid method"<<endl;
1783 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1784
1785 //set the random seed
1786 RooRandom::randomGenerator()->SetSeed(random_seed);
1787
1788 //get the calculator
1789 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1790
1791 //for numbercounting experiments
1792 myhc.PatchSetExtended(false);
1793
1794 //set likelihood ratio as the test statistics
1795 myhc.SetTestStatistic(1);
1796
1797 //define the systematics to be used
1798 if (model->get_nuisance_set()) {
1799 myhc.UseNuisance(true);
1800 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1801 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1802 } else {
1803 myhc.UseNuisance(false);
1804 }
1805
1806 //define the number of toys to be done
1807 myhc.SetNumberOfToys(n_toys_per_point);
1808
1809 //get the interval calculator
1810 HypoTestInverter myInverter(myhc,*model->get_POI());
1811
1812 //use the CLS method
1813 myInverter.UseCLs(useCLS);
1814
1815 //set the confidence
1816 myInverter.SetTestSize(1-confidence);
1817
1818 //run the auto fixed in range lower_scan_bound - upper_scan_bound with n_steps steps
1819 myInverter.RunFixedScan(n_steps,lower_scan_bound,upper_scan_bound);
1820
1821
1822 //get the result
1823 HypoTestInverterResult* results = myInverter.GetInterval();
1824
1825 double upperLimit = results->UpperLimit();
1826 double lowerLimit = results->LowerLimit();
1827 std::cout <<confidence<<"% interval is: " << lowerLimit<<" , "<< upperLimit << std::endl;
1828 }
1829
1830 void central_interval_Hybrid_auto_scan(Model* model,double confidence,int n_toys_per_point,double lower_scan_bound, double upper_scan_bound,int random_seed=0,bool useCLS=true,double accuracy=0.005){
1831 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1832 cout<<"Calculating central interval with the Hybrid method"<<endl;
1833 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1834
1835 //set the random seed
1836 RooRandom::randomGenerator()->SetSeed(random_seed);
1837
1838 //get the HybridCalculatorOriginal
1839 HybridCalculatorOriginal myhc(*model->get_data(),*model->get_sb_likelihood(),*model->get_b_likelihood());
1840
1841 //for numbercounting experiments
1842 myhc.PatchSetExtended(false);
1843
1844 //set likelihood ratio as the test statistics
1845 myhc.SetTestStatistic(1);
1846
1847 // define the systematics to be used
1848 if (model->get_nuisance_set()) {
1849 myhc.UseNuisance(true);
1850 myhc.SetNuisancePdf(*model->get_nuisance_prior_pdf());
1851 myhc.SetNuisanceParameters(*model->get_nuisance_set());
1852 } else {
1853 myhc.UseNuisance(false);
1854 }
1855
1856 //define the number of toys to be done
1857 myhc.SetNumberOfToys(n_toys_per_point);
1858
1859 //get the interval calculator
1860 HypoTestInverter myInverter(myhc,*model->get_POI());
1861
1862 //use the CLS method
1863 myInverter.UseCLs(useCLS);
1864
1865 //set the confidence
1866 myInverter.SetTestSize(1-confidence);
1867 //scan the values for X to find the interval
1868 //requires the search range and the desired accuracy
1869 myInverter.RunAutoScan(lower_scan_bound,upper_scan_bound,myInverter.Size(),accuracy);
1870 //get the result
1871 HypoTestInverterResult* results = myInverter.GetInterval();
1872
1873 double upperLimit = results->UpperLimit();
1874 double lowerLimit = results->LowerLimit();
1875 std::cout <<confidence<<"% interval is: " << lowerLimit<<" , "<< upperLimit << std::endl;
1876
1877 }
1878
1879
1880
1881 HypoTestResult* significance_Profile_Likelihood(Model* model){
1882 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1883 cout<<"Calculating significance with the Profile Likelihood method"<<endl;
1884 cout<<"///////////////////////////////////////////////////////////////////////////////////////////"<<endl;
1885
1886
1887 // //define paramsOfInterest
1888 RooArgSet *paramsOfInterest=new RooArgSet("paramsOfInterest");
1889 paramsOfInterest->addClone(*model->get_POI()); //clone because we need s for complete likelihood
1890
1891 //get the calculator
1892 ProfileLikelihoodCalculator plc(*model->get_data(),*model->get_complete_likelihood(), *paramsOfInterest);
1893
1894 //define null hypothesis
1895 paramsOfInterest->setRealValue(model->get_POI()->GetName(),0);
1896 plc.SetNullParameters(*paramsOfInterest);
1897
1898 //get the hypotest
1899 // HypoTestResult* lrhypo=plc.GetHypoTest();
1900 // double significance=lrhypo->Significance();
1901 // cout<<"Profile Likelihood significance is: "<<significance<<endl;
1902
1903
1904 return plc.GetHypoTest();
1905 }
1906
1907
1908
1909
1910
1911
1912 int main(int argc, char* argv[]){
1913
1914 if (argc<=1){
1915 std::cerr<<"Error: Expected configs!"<<std::endl;
1916 exit(1);
1917 } else if (argc==2){
1918 std::cerr<<"Error: Expected background AND min 1 signal config!"<<std::endl;
1919 exit(1);
1920 }
1921
1922
1923 bool writePlots = true;
1924
1925 string bkgFileName=argv[1];
1926 std::cout << "opening background and data config file: "<<bkgFileName<<"\n"<<std::endl;
1927 cout<<"----------------------------\n"<<endl;
1928 //open the config file
1929 ConfigFile* bkgConfig = new ConfigFile(bkgFileName);
1930
1931 int n_toys = bkgConfig->Value("definitions","n_toys");
1932 bool use_seperate_channels = bkgConfig->Value("definitions","use_seperate_channels",0);
1933 int n_sep_channels = 1;
1934 if(use_seperate_channels) n_sep_channels = bkgConfig->Value("definitions","n_channels");
1935
1936 for (int file=2; file<argc; ++file){
1937
1938 string fileName=argv[file];
1939 std::cout << "opening scan signal "<<file-1<<" from "<<argc-2<<": "<<fileName<<"\n"<<std::endl;
1940
1941
1942 for (int iChannnel=0; iChannnel<n_sep_channels; ++iChannnel){
1943
1944 if(use_seperate_channels) std::cout << "Use seperated channels, now channel "<<iChannnel+1<<"/"<<n_sep_channels<<".\n"<<std::endl;
1945
1946 ConfigFile* sigConfig = new ConfigFile(fileName);
1947
1948 Model* model = 0;
1949 if(use_seperate_channels) model = new Model(bkgConfig, sigConfig, iChannnel+1);
1950 else model = new Model(bkgConfig, sigConfig);
1951
1952 // model->Print();
1953
1954
1955
1956 // HypoTestResult* plcResult = significance_Profile_Likelihood(model);
1957
1958 // if(plcResult) {
1959 // cout<<"\n ++++++++++"<<endl;
1960 // plcResult->Print();
1961 // cout<<"CL_s_Error: "<<plcResult->CLsError()<<endl;
1962 // cout<<"plc significance: "<<plcResult->Significance()<<endl;
1963 // cout<<"\n ++++++++++"<<endl;
1964
1965 // }
1966
1967 cout<<"\n ++++++++++"<<endl;
1968 if( model->get_lumi_scale() != 1) cout<<"Scale lumi with "<<model->get_lumi_scale()<<endl;
1969 cout<<"Signal= "<<model->get_sum_signal()<<endl;
1970 double soverb =model->get_sum_signal()/sqrt(model->get_sum_background());
1971 double soverberr = model->get_sum_signal()/sqrt( model->get_sum_background() + model->get_total_bunc() );
1972 cout<<"S / sqrt(B) = "<<soverb<<endl;
1973 cout<<"S / sqrt(B+unc) = "<<soverberr<<endl;
1974
1975
1976 int random_integer = rand();
1977 // random_integer = 321; //set to fixed value only for comparisions
1978 cout<<"random_integer: "<<random_integer<<endl;
1979
1980
1981 HybridResult* hcResult = UL_significance_Hybrid(model,n_toys,random_integer);
1982
1983 double obsCLs = 0;
1984 double obsCLsError = 0;
1985 double obsSignificance = 1000;
1986 double expSignificance = 1000;
1987 double estimateSignificance = 1000;
1988 double expCLs = 0;
1989 double expCLsError = 0;
1990 double expCLsRMSDN = 0;
1991 double expCLsRMSUP = 0;
1992
1993 HybridPlot* plot = 0;
1994 TCanvas *c1 = 0;
1995
1996
1997 if(hcResult) {
1998
1999
2000 vector<double> b = hcResult->GetTestStat_b();
2001 vector<double> sb = hcResult->GetTestStat_sb();
2002
2003 double max = 0;
2004 double min = 0;
2005
2006 for(unsigned int v=0;v<b.size()&&v<sb.size();v++) {
2007 if( max < b.at(v) && isfinite(b.at(v)) ) max = b.at(v);
2008 if( min > sb.at(v) && isfinite(sb.at(v)) ) min = sb.at(v);
2009 }
2010
2011 for(unsigned int v=0;v<b.size()&&v<sb.size();v++) {
2012 if(! isfinite(b.at(v))) b.at(v) = max;
2013 if(! isfinite(sb.at(v))) sb.at(v) = min;
2014 }
2015
2016 HybridResult* corrResult = new HybridResult("HybridResult",sb,b);
2017 corrResult->SetDataTestStatistics( hcResult->GetTestStat_data() );
2018
2019
2020 plot=corrResult->GetPlot("hcPlot","p Values Plot",200);
2021 c1=new TCanvas;
2022 plot->Draw();
2023
2024
2025 cout<<"\n ++++++++++"<<endl;
2026 cout<<"Get center of B and SB model from the plot: "<<endl;
2027 double sbcenter = plot->GetSBCenter();
2028 double bcenter = plot->GetBCenter();
2029 double bUP = bcenter + plot->GetBrms();
2030 double bDN = bcenter - plot->GetBrms();
2031
2032
2033 if( sbcenter==0 ) sbcenter = model->get_teststat_SBmean();
2034 if( bcenter==0 ) {
2035 bcenter = model->get_teststat_Bmean();
2036 bUP = model->get_teststat_Bup();
2037 bDN = model->get_teststat_Bdown();
2038 }
2039
2040 estimateSignificance = fabs(bcenter-sbcenter)/fabs(bcenter-bUP);
2041
2042 cout<<"SB center = "<<sbcenter<<" +/- "<<plot->GetSBrms()<<endl;
2043 cout<<"B center = "<<bcenter<<" +/- "<<plot->GetBrms()<<endl;
2044 cout<<"estimation of Significance: "<<estimateSignificance<<" sigma" <<endl;
2045
2046 corrResult->PrintMore("");
2047 cout<<" +/- "<<corrResult->CLsError()<<endl;
2048 cout<<"data significance: "<<corrResult->Significance()<< " sigma" <<endl;
2049
2050 // compute the mean expected significance from toys
2051 obsCLs = corrResult->CLs();
2052 obsCLsError = corrResult->CLsError();
2053 obsSignificance = corrResult->Significance();
2054
2055
2056 corrResult->SetDataTestStatistics(sbcenter);
2057
2058 if( corrResult->CLb() < 1 )
2059 expSignificance = corrResult->Significance();
2060 else
2061 expSignificance = 1000;
2062
2063 // cout<<"\n ++++++++++"<<endl;
2064 // cout<<"Results from mean of SB toys:"<<endl;
2065 // corrResult->PrintMore("");
2066 cout<<"Exp significance: "<<corrResult->Significance()<< " sigma" <<endl;
2067
2068 corrResult->SetDataTestStatistics(bcenter);
2069
2070 expCLs = corrResult->CLs();
2071 expCLsError = corrResult->CLsError();
2072
2073 // cout<<"\n ++++++++++"<<endl;
2074 // cout<<"Results from mean of B toys:"<<endl;
2075 // corrResult->PrintMore("");
2076
2077 cout<<"CL_s_exp: "<<expCLs<<endl;
2078 cout<<" +/- "<<expCLsError<<endl;
2079
2080
2081 corrResult->SetDataTestStatistics(bDN);
2082
2083 expCLsRMSDN = corrResult->CLs();
2084 cout<<"CL_s_expRMSdn: "<<expCLsRMSDN<<endl;
2085 cout<<" +/- "<< corrResult->CLsError()<<endl;
2086
2087 corrResult->SetDataTestStatistics(bUP);
2088
2089 expCLsRMSUP = corrResult->CLs();
2090 cout<<"CL_s_expRMSup: "<<expCLsRMSUP<<endl;
2091 cout<<" +/- "<< corrResult->CLsError()<<endl;
2092
2093
2094 cout<<"\n ++++++++++"<<endl;
2095
2096 if(writePlots) {
2097 size_t found = fileName.find_last_of("/");
2098 if(found == string::npos) found = 0;
2099 else found++;
2100 string shortFileName = fileName.substr(found,fileName.length());
2101
2102 if(use_seperate_channels) c1->SaveAs(string(shortFileName.substr(0,shortFileName.find(".dat"))+"_channel"+int_to_string(iChannnel+1)+"_Result.eps").c_str());
2103 else c1->SaveAs(string(shortFileName.substr(0,shortFileName.find(".dat"))+"_Result.eps").c_str());
2104 }
2105
2106 delete corrResult;
2107 }
2108
2109 ///Write results to config
2110
2111 ostringstream otext;
2112
2113
2114 if(!use_seperate_channels || iChannnel==0) {
2115 otext <<"[results_Hybrid]\n"
2116 <<"BkgrConfig = "<<bkgFileName<<"\n"
2117 <<"n_toys = "<<n_toys<<"\n"
2118 <<"SoverB = "<<soverb<<"\n"
2119 <<"SoverBunc = "<<soverberr<<"\n"
2120 <<"SignalSum = "<<model->get_sum_signal()<<"\n"
2121 <<"BkgSum = "<<model->get_sum_background()<<"\n"
2122 <<"BkgUnc = "<<model->get_total_bunc()<<"\n";
2123 }
2124
2125
2126 if(!use_seperate_channels) {
2127 otext <<"obsCLs = "<<obsCLs<<"\n"
2128 <<"obsCLsError = "<<obsCLsError<<"\n"
2129 <<"obsSignificance = "<<obsSignificance<<"\n"
2130 <<"expCLs = "<<expCLs<<"\n"
2131 <<"expCLsError = "<<expCLsError<<"\n"
2132 <<"expSignificance = "<<expSignificance<<"\n"
2133 <<"expCLs_rmsDN = "<<expCLsRMSDN<<"\n"
2134 <<"expCLs_rmsUP = "<<expCLsRMSUP<<"\n"
2135 <<"estimateSignificance = "<<estimateSignificance<<"\n";
2136 } else {
2137 otext <<"obsCLs_ch"<<iChannnel+1<<" = "<<obsCLs<<"\n"
2138 <<"obsCLsError_ch"<<iChannnel+1<<" = "<<obsCLsError<<"\n"
2139 <<"obsSignificance_ch"<<iChannnel+1<<" = "<<obsSignificance<<"\n"
2140 <<"expCLs_ch"<<iChannnel+1<<" = "<<expCLs<<"\n"
2141 <<"expCLsError_ch"<<iChannnel+1<<" = "<<expCLsError<<"\n"
2142 <<"expSignificance_ch"<<iChannnel+1<<" = "<<expSignificance<<"\n"
2143 <<"expCLs_rmsDN_ch"<<iChannnel+1<<" = "<<expCLsRMSDN<<"\n"
2144 <<"expCLs_rmsUP_ch"<<iChannnel+1<<" = "<<expCLsRMSUP<<"\n"
2145 <<"estimateSignificance_ch"<<iChannnel+1<<" = "<<estimateSignificance<<"\n";
2146 }
2147
2148
2149
2150 time_t rawtime;
2151 struct tm * timeinfo;
2152 time ( &rawtime );
2153 timeinfo = localtime ( &rawtime );
2154 ofstream ofile;
2155 ofile.open (fileName.c_str(),ios::app);
2156 if (ofile.good())
2157 std::cout << "adding results to '"<<fileName.c_str()<<"'"<<std::endl;
2158 else if ( (ofile.rdstate() & ifstream::failbit ) != 0 )
2159 std::cerr << "ERROR opening '"<<fileName.c_str()<<"'! Does the directory exist?"<<std::endl;
2160
2161
2162 if(!use_seperate_channels || iChannnel==0) ofile << "\n"<< asctime (timeinfo) <<"\n"<< otext.str()<<"\n";
2163 else ofile << otext.str()<<"\n";
2164
2165
2166
2167
2168 ofile.close();
2169
2170
2171
2172 if(plot) delete plot;
2173 if(c1) delete c1;
2174 delete hcResult;
2175 delete sigConfig;
2176 delete model;
2177 }
2178 }
2179
2180
2181
2182 //########################
2183
2184 // vector<double> *signal_expectation = new vector<double>;
2185 // vector< vector<double>* > *background_expectation = new vector< vector<double>* >;
2186 // vector< vector< vector<double>* >* >* systematic_uncertainties= new vector< vector< vector<double>* >* >;
2187 // vector<double> *nuisance_upper_limit = new vector<double>;
2188 // vector<int> *n_input= new vector<int>;
2189
2190 // int nuisance_range=10;
2191 // int POI_range=20;
2192 // int observation_range=500;
2193
2194
2195 // // signal_expectation->push_back(1.85562);
2196 // signal_expectation->push_back(9.97288);
2197 // signal_expectation->push_back(1.33057);
2198 // signal_expectation->push_back(12.8879);
2199
2200
2201
2202 // std::vector<double>* bkg1 = new vector<double>;
2203 // // bkg1->push_back(68.0);
2204 // bkg1->push_back(38.9);
2205 // bkg1->push_back(8.0);
2206 // bkg1->push_back(5.9);
2207 // background_expectation->push_back(bkg1);
2208
2209
2210
2211 // std::vector<double>* unc1_sig = new vector<double>;
2212 // std::vector<double>* unc2_sig = new vector<double>;
2213 // std::vector<double>* unc1_bkg1 = new vector<double>;
2214 // std::vector<double>* unc2_bkg1 = new vector<double>;
2215
2216 // std::vector< std::vector<double>* >* unc_type1 = new vector< vector<double>* >;
2217 // std::vector< std::vector<double>* >* unc_type2 = new vector< vector<double>* >;
2218
2219 // // unc1_sig->push_back(0.318846/1.85562);
2220 // unc1_sig->push_back(1.55237/9.97288);
2221 // unc1_sig->push_back(0.34926/1.33057);
2222 // unc1_sig->push_back(2.2063/12.8879);
2223
2224
2225 // unc_type1->push_back(unc1_sig);
2226
2227 // // unc2_sig->push_back(0.0);
2228 // unc2_sig->push_back(0.0);
2229 // unc2_sig->push_back(0.0);
2230 // unc2_sig->push_back(0.0);
2231
2232
2233 // unc_type2->push_back(unc2_sig);
2234
2235
2236 // // unc1_bkg1->push_back(13.6/68.0);
2237 // // unc1_bkg1->push_back(8.6/38.9);
2238 // // unc1_bkg1->push_back(1.2/8.0);
2239 // // unc1_bkg1->push_back(1.4/5.9);
2240
2241 // // unc1_bkg1->push_back(0.);
2242 // unc1_bkg1->push_back(0.);
2243 // unc1_bkg1->push_back(0.);
2244 // unc1_bkg1->push_back(0.);
2245
2246 // unc_type1->push_back(unc1_bkg1);
2247
2248
2249 // // unc2_bkg1->push_back(13.6/68.0);
2250 // unc2_bkg1->push_back(8.6/38.9);
2251 // unc2_bkg1->push_back(1.2/8.0);
2252 // unc2_bkg1->push_back(1.4/5.9);
2253
2254
2255 // unc_type2->push_back(unc2_bkg1);
2256
2257 // systematic_uncertainties->push_back(unc_type1);
2258
2259 // systematic_uncertainties->push_back(unc_type2);
2260
2261
2262 // nuisance_upper_limit->push_back(5);
2263 // nuisance_upper_limit->push_back(5);
2264
2265
2266 // // n_input->push_back(65);
2267 // n_input->push_back(31);
2268 // n_input->push_back(6);
2269 // n_input->push_back(9);
2270
2271
2272
2273 // Model* test=new Model(signal_expectation,background_expectation,systematic_uncertainties,nuisance_upper_limit,n_input,nuisance_range,POI_range,observation_range);
2274
2275 // // Model* test=new Model(signal_expectation,background_expectation,systematic_uncertainties,nuisance_upper_limit,0,nuisance_range,POI_range,observation_range);
2276
2277 // test->Print();
2278
2279
2280 // // Model* test=new Model("RA7/test_60_230_COV.txt");
2281
2282
2283 // test->get_b_likelihood()->getVariables()->Print();
2284
2285
2286 // // TFile file("Model_results.root","recreate");
2287
2288 // // TH1F* hist_b_likelihood_0 = (TH1F*) test->get_b_likelihood()->createHistogram("observation_0",100);
2289 // // TH1F* hist_b_likelihood_1 = (TH1F*) test->get_b_likelihood()->createHistogram("observation_1",100);
2290 // // TH1F* hist_b_likelihood_2 = (TH1F*) test->get_b_likelihood()->createHistogram("observation_2",100);
2291 // // TH1F* hist_b_likelihood_3 = (TH1F*) test->get_b_likelihood()->createHistogram("observation_3",100);
2292
2293 // // TH1F* hist_sb_likelihood_0 = (TH1F*) test->get_sb_likelihood()->createHistogram("observation_0",100);
2294 // // TH1F* hist_sb_likelihood_1 = (TH1F*) test->get_sb_likelihood()->createHistogram("observation_1",100);
2295 // // TH1F* hist_sb_likelihood_2 = (TH1F*) test->get_sb_likelihood()->createHistogram("observation_2",100);
2296 // // TH1F* hist_sb_likelihood_3 = (TH1F*) test->get_sb_likelihood()->createHistogram("observation_3",100);
2297
2298 // // hist_b_likelihood_0->Write();
2299 // // hist_b_likelihood_1->Write();
2300 // // hist_b_likelihood_2->Write();
2301 // // hist_b_likelihood_3->Write();
2302
2303 // // hist_sb_likelihood_0->Write();
2304 // // hist_sb_likelihood_1->Write();
2305 // // hist_sb_likelihood_2->Write();
2306 // // hist_sb_likelihood_3->Write();
2307
2308 // // file.Close();
2309
2310 // // significance_Hybrid(test,5000,321);
2311
2312
2313 // UL_significance_Hybrid(test,10000,321);
2314 // // upper_limit_Hybrid_auto_scan(test,0.95,50,0.01,5);
2315
2316
2317
2318 // // systematic_uncertainties
2319
2320 // // for (int file=1; file<argc; ++file){
2321
2322 // // string fileName=argv[file];
2323 // // std::cout << "opening: "<<fileName<<std::endl;
2324
2325 // // ConfigFile config(argv[file]);
2326
2327
2328 // // Model* test=new Model(signal_expectation,background_expectation,systematic_uncertainties,n_input,nuisance_range,POI_range,observation_range);
2329
2330
2331 // // significance_Hybrid(test,1000,321);
2332
2333
2334 // // delete test;
2335
2336 // // string out="out_"+fileName;
2337 // // ofstream outfile(out.c_str());
2338 // // outfile<<"##outputfile created by Model.cc from: "<<fileName<<endl;
2339
2340 // // outfile.close();
2341
2342 // // std::cout << "##outputfile created: "<<out<<std::endl;
2343
2344 // // }
2345
2346
2347
2348
2349
2350 // // Model* test=new Model(file.c_str());
2351 // //Model* test=new Model("test_60_230.txt");
2352 // //Model* test=new Model("test_140_200.txt");
2353 // //Model* test=new Model("MultiLepton_Model_Jt200_CU_DAVIS_ML01.txt");
2354
2355
2356 // // srand((unsigned)time(0));
2357 // // int random_integer = rand();
2358 // //cout<<random_integer<<endl;
2359 // // cout<<"random_number: "<<"XXXseedXXX"<<endl;
2360
2361 // // RooRandom::randomGenerator()->SetSeed(random_integer);
2362
2363
2364
2365
2366
2367 return(0);
2368
2369 }