ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/SampleClass.C
Revision: 1.29
Committed: Fri Jun 28 15:03:02 2013 UTC (11 years, 10 months ago) by buchmann
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.28: +1 -0 lines
Log Message:
Updated files for migration to git (sync)

File Contents

# User Rev Content
1 buchmann 1.1 #include <iostream>
2     #include <sstream>
3     #include <vector>
4     #include <utility>
5    
6     #include <TFile.h>
7     #include <TTree.h>
8     #include <TH1.h>
9     #include <TH2.h>
10     #include <TCut.h>
11     #include <THStack.h>
12     #include <TColor.h>
13     #include <TCanvas.h>
14     #include <TError.h>
15     #include <TText.h>
16     #include <TLegend.h>
17     #include <TError.h>
18     #include <TTreeFormula.h>
19    
20     #define SampleClassLoaded
21    
22     #ifndef Verbosity
23     #define Verbosity 0
24     #endif
25     #ifndef HUSH
26     #define HUSH 1
27     #endif
28     #ifndef GeneralToolBoxLoaded
29     #include "GeneralToolBox.C"
30     #endif
31     using namespace std;
32    
33     bool doesROOTFileExist(string filename);
34     bool addoverunderflowbins=false;
35 buchmann 1.28 string treename="events";
36 buchmann 1.1
37     class sample
38     {
39     public:
40     string filename;
41     string samplename;
42     long Nentries;
43     float xs;//cross section
44     float weight;
45     bool is_data;
46     bool is_signal;
47     bool is_active;
48 buchmann 1.9 float weightrenormalization;
49 buchmann 1.1 int groupindex;
50     Color_t samplecolor;
51    
52     TFile *tfile;
53     TTree *events;
54    
55     sample(string m_filename,string m_samplename,long m_Nentries, float m_xs,bool is_data, bool m_is_signal, int m_groupindex, Color_t color);
56 buchmann 1.21 string ExtractVersion(string FullVersionString);
57 buchmann 1.1 void closeFile();
58     };
59    
60     string write_mc_or_data(bool is_data)
61     {
62     if(is_data) return "data";
63     return "MC";
64     }
65    
66 buchmann 1.21 string sample::ExtractVersion(string FullVersionString) {
67     string Result=FullVersionString.substr(FullVersionString.find(" ")+1,FullVersionString.length());
68     Result=Result.substr(0,Result.find(" "));
69     return Result;
70     }
71    
72 buchmann 1.1 sample::sample(string m_filename, string m_samplename, long m_Nentries, float m_xs,bool m_is_data, bool m_is_signal, int m_groupindex, Color_t mycolor)
73     {
74     this->filename=m_filename;
75     this->samplename=m_samplename;
76     this->Nentries=m_Nentries;
77     this->xs=m_xs;
78     this->is_data=m_is_data;
79     this->is_signal=m_is_signal;
80     this->groupindex=m_groupindex;
81     this->is_active=true;
82     this->samplecolor=mycolor;
83 buchmann 1.9 this->weightrenormalization=1.0;
84 buchmann 1.1 if(!doesROOTFileExist(this->filename)) {
85     stringstream message;
86     message << "The " << write_mc_or_data(is_data) << " sample " << this->samplename << " is invalid because the associated file path, " << this->filename << " is incorrect.";
87     write_error("Sample::Sample",message.str());
88     this->is_active=false;
89     }
90    
91     if(doesROOTFileExist(this->filename)) {
92     //suppressing stupid 64/32 errors here (Warning in <TFile::ReadStreamerInfo>: /scratch/buchmann/MC_Spring11_PU_PF/TToBLNu_TuneZ2_t-channel_7TeV-madgraph.root: not a TStreamerInfo object)
93 buchmann 1.18 // Int_t currlevel=gErrorIgnoreLevel;
94     // gErrorIgnoreLevel=5000;
95 buchmann 1.1 this->tfile = new TFile(m_filename.c_str());
96 buchmann 1.18 // gErrorIgnoreLevel=currlevel;
97 buchmann 1.1 this->events=(TTree*)(this->tfile)->Get(treename.c_str());
98 buchmann 1.28 // this->events->SetCacheSize(5000000);//only a 5 MB cache!
99 buchmann 1.1 if(Verbosity>0) dout << "The " << write_mc_or_data(is_data) << " file " << this->filename << " has been added successfully to the list of samples. " << endl;
100 buchmann 1.7 long long measured_nevents=(long)1;
101     TH1F *weight_histo = (TH1F*)(this->tfile)->Get("weight_histo");
102     float average_weight = 1.0;
103     if(weight_histo) {
104 buchmann 1.20 //average_weight = weight_histo->Integral()/weight_histo->GetEntries();
105 buchmann 1.7 measured_nevents = (long)weight_histo->GetEntries();
106     } else {
107     measured_nevents=(this->events)->GetEntries();
108     }
109    
110 fronga 1.11 if(((this->Nentries>1)||(this->Nentries==0))&&measured_nevents!=this->Nentries) {
111 buchmann 1.1 //special cases: m_Nentries=1 : we want to give each event the full weight (->scans!)
112     // m_Nentries=0: detect the number of events and set the nevents automatically
113 fronga 1.11 // m_Nentries<0: set manually (see below)
114 buchmann 1.1
115     stringstream warning;
116     warning << "Detected incorrect number of events in sample initialization of sample " << m_filename << " (detected Nevents: " << measured_nevents << " , definition claims: " << this->Nentries << "; will use measured number of events. If you want to use this algorithm to set the number of events anyway, set the number of events to 0.";
117     if(m_Nentries>1) write_warning(__FUNCTION__,warning.str());
118     this->Nentries=measured_nevents;
119 fronga 1.11 } else if ( this->Nentries<0 ) {
120     this->Nentries = -this->Nentries;
121     }
122     if ( average_weight>0 ) {
123     this->weight=(xs/(float)Nentries)/average_weight;
124     this->weightrenormalization=(1.0/average_weight);
125     } else {
126 buchmann 1.12 if(average_weight>0) {
127     this->weight=(xs/(float)Nentries)/average_weight;
128     this->weightrenormalization=(1.0/average_weight);
129     } else {
130     this->weight = (xs/(float)Nentries);
131     this->weightrenormalization=1;
132     }
133 buchmann 1.1 }
134 buchmann 1.21
135 buchmann 1.1 }
136     else {
137     this->is_active=false;
138     }
139    
140     }
141    
142     void sample::closeFile()
143     {
144     if(doesROOTFileExist(this->filename)) {
145     (this->tfile)->Close();
146     }
147     else {
148     dout << "SAMPLE " << this->samplename << " cannot be closed as the underlying file (" << this->filename << ") does not exist!" << endl;
149     this->is_active=false;
150     }
151     }
152    
153     bool doesROOTFileExist(string filename)
154     {
155     //suppressing stupid 64/32 errors here (Warning in <TFile::ReadStreamerInfo>: /scratch/buchmann/MC_Spring11_PU_PF/TToBLNu_TuneZ2_t-channel_7TeV-madgraph.root: not a TStreamerInfo object)
156 buchmann 1.18 // Int_t currlevel=gErrorIgnoreLevel;
157     // gErrorIgnoreLevel=5000;
158 buchmann 1.1 TFile *f = new TFile(filename.c_str());
159    
160     if (f->IsZombie()) {
161     dout << "Error opening file" << filename << endl;
162     return 0;
163     }
164     f->Close();
165 buchmann 1.18 // gErrorIgnoreLevel=currlevel;
166 buchmann 1.1 return 1;
167     }
168     //********************************************************
169    
170     TCut essentialcut("mll>0");
171     // The following cut (cutWeight) will reweight all the events: use "weight" to correct MC for pileUP, "1.0" otherwise
172 buchmann 1.7 TCut cutWeight("weight");
173 fronga 1.11 //TCut cutWeight("(weight*(((id1==id2&&id1==0)*1.2)+((id1==id2&&id1==1)/1.2)+(id1!=id2)))");
174 buchmann 1.1
175     void setessentialcut(TCut ess) {
176     essentialcut=ess;
177     }
178    
179     class samplecollection
180     {
181     public:
182     string name;
183     vector<sample> collection;
184     int nsamples;
185     int ndatasamples;
186     int nmcsamples;
187     int ngroups;
188    
189     samplecollection(string m_name);
190     void AddSample(string m_filename,string m_samplename,long m_Nentries, float m_xs,bool is_data, bool m_is_signal, int groupindex, Color_t color);
191    
192     //vector quantities
193     TH1F* Draw(string m_histoname,string m_var, vector<float> binning, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, vector<int> onlyindex, bool drawsignal);
194     TH1F* Draw(string m_histoname,string m_var, vector<float> binning, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal);
195    
196     //minx,maxs quantities
197     TH1F* Draw(string m_histoname,string m_var, int m_nbins, float m_minx, float m_maxx, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal);
198     TH1F* Draw(string m_histoname,string m_var, int m_nbins, float m_minx, float m_maxx, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, vector<int> onlyindex, bool drawsignal);
199    
200     TH2F* Draw(string m_histoname,string m_var, vector<float> binningx, vector<float> binningy, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, vector<int> onlyindex, bool drawsignal);
201    
202     vector<float> get_optimal_binsize(string variable, TCut cut,int nbins, float low, float high);
203    
204     THStack DrawStack(string m_histoname,string m_var, int m_nbins, float m_minx, float m_maxx, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal);
205     THStack DrawStack(string m_histoname,string m_var, vector<float> binning, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal);
206     vector<int> FindSample(string what);
207 buchmann 1.3 vector<int> FindSampleBySampleName(string what);
208 buchmann 1.1 void ListSamples();
209     bool do_sample(int thissample, vector<int> &selected_samples);
210     Color_t GetColor(string filename);
211     Color_t GetColor(int sampleindex);
212    
213     TLegend* allbglegend(string title,float x, float y);
214     TLegend* allbglegend(string title, TH1F *data, float x, float y);
215    
216 buchmann 1.27 void PickUpFromThisFile(int isamp, string cut, vector<string> &output, vector<string> &pickupfile, bool QuietMode);
217     void PickUpEvents(string cut,string filename,bool QuietMode);
218 buchmann 1.1 string find_units(string&);
219    
220     void RemoveLastSample();
221     };
222    
223     samplecollection::samplecollection(string m_name)
224     {
225     this->name=m_name;
226     if(Verbosity>0) dout << "Initiated sample collection " << this->name << " " << endl;
227     }
228    
229     void samplecollection::ListSamples()
230     {
231     dout << "---------------------------------------------------------------------------------------------------" << endl;
232     dout << "Listing all " << this->nsamples << " sample(s) of the sample collection called " << this->name << " : " << endl;
233     if(this->ndatasamples>0) {
234     dout << "Data sample(s): " << endl;
235 buchmann 1.4 for (int isamp=0;isamp<(int)this->collection.size();isamp++)
236 buchmann 1.1 {
237     if((this->collection)[isamp].is_data) dout << " - " << (this->collection)[isamp].samplename << " from " << (this->collection)[isamp].filename << endl;
238     }
239     }
240     if(this->nmcsamples>0) {
241     dout << "MC sample(s): " << endl;
242 buchmann 1.4 for (int isamp=0;isamp<(int)this->collection.size();isamp++)
243 buchmann 1.1 {
244 buchmann 1.21 if(!(this->collection)[isamp].is_data) dout << " - " << (this->collection)[isamp].samplename << " (" << (this->collection)[isamp].filename << ") xs=" << (this->collection)[isamp].xs << " pb, N(events)=" << (this->collection)[isamp].Nentries << endl;
245 buchmann 1.1 }
246     }
247     dout << "---------------------------------------------------------------------------------------------------" << endl;
248     }
249    
250     void samplecollection::AddSample(string m_filename,string m_samplename,long m_Nentries, float m_xs,bool is_data, bool m_is_signal, int groupindex, Color_t newcolor)
251     {
252     sample NewSample(m_filename,m_samplename,m_Nentries,m_xs,is_data,m_is_signal,groupindex,newcolor);
253 buchmann 1.18 if (!NewSample.is_active) {
254     write_warning(__FUNCTION__,"Not adding this sample ("+m_filename+") as it has been declared inactive");
255     return;
256     }
257 buchmann 1.1 (this->collection).push_back(NewSample);
258     if((this->collection).size()==1) {
259     this->nmcsamples=0;
260     this->ndatasamples=0;
261     this->nsamples=0;
262     this->ngroups=0;
263     }
264     if(groupindex>this->ngroups) this->ngroups=groupindex;
265     if(is_data) this->ndatasamples++;
266     else this->nmcsamples++;
267     this->nsamples=this->collection.size();
268     }
269    
270     bool samplecollection::do_sample(int thissample, vector<int> &selected_samples)
271     {
272     bool drawit=false;
273 buchmann 1.4 for(int isel=0;isel<(int)selected_samples.size();isel++)
274 buchmann 1.1 {
275     if(selected_samples[isel]==thissample) {
276     drawit=true;
277     break;
278     }
279     }
280     return drawit;
281     }
282    
283     TH1F* samplecollection::Draw(string m_histoname,string m_var, int m_nbins, float m_minx, float m_maxx, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal=false)
284     {
285     vector<int> emptyvector;
286     TH1F *histo = this->Draw(m_histoname,m_var, m_nbins, m_minx, m_maxx, m_xlabel, m_ylabel, Cut, m_is_data, luminosity,emptyvector,drawsignal);
287     return histo;
288     }
289    
290     TH1F* samplecollection::Draw(string m_histoname,string m_var, vector<float> binning, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal=false)
291     {
292     vector<int> emptyvector;
293     TH1F *histo = this->Draw(m_histoname,m_var, binning, m_xlabel, m_ylabel, Cut, m_is_data, luminosity,emptyvector,drawsignal);
294     return histo;
295     }
296    
297 buchmann 1.28
298 buchmann 1.1 TH1F* samplecollection::Draw(string m_histoname,string m_var, vector<float> binning, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, vector<int> onlyindex, bool drawsignal=false) {
299     if(Verbosity>0) dout << endl << endl;
300     if(Verbosity>0) dout << "-------------------------------------------------------------------------------------" << endl;
301     if(Verbosity>0) dout << "histoname : " << m_histoname << " , m_var = " << m_var << ", m_xlabel=" << m_xlabel << " m_ylabel=" << m_ylabel << " m_is_data = " << m_is_data << " lumi = " << luminosity << " onlyindex size: " << onlyindex.size() << endl;
302 buchmann 1.9
303 buchmann 1.1 if(HUSH==0) dout << "Drawing histo called " << m_histoname << "... " << endl;
304     bool do_only_selected_samples=false;
305     if(onlyindex.size()>0&&onlyindex[0]!=-1) {
306     if(Verbosity>0) {dout << "Requested to only draw sample corresponding to the following sample(s) : " << endl;}
307 buchmann 1.4 for(int is=0;is<(int)onlyindex.size();is++) {
308 buchmann 1.1 if(Verbosity>0) dout << " - " << (this->collection)[onlyindex[is]].filename << " (sample index: " << onlyindex[is] << ")" << endl;
309     }
310     do_only_selected_samples=true;
311     }
312     if(onlyindex.size()==1&&onlyindex[0]==-1) {
313     do_only_selected_samples=true; // this is the special case when we request a non-existing sample - we shouldn't draw anything then.
314     onlyindex.clear();
315     }
316     stringstream h_histoname;
317     h_histoname<<"h_"<<m_histoname;
318     float binningarray[binning.size()+1];
319 buchmann 1.4 for(int i=0;i<(int)binning.size();i++) {binningarray[i]=binning[i];}
320 buchmann 1.1 TH1F *histo = new TH1F(m_histoname.c_str(),"",binning.size()-1,binningarray);
321     histo->Sumw2();
322    
323     stringstream drawthis;
324     drawthis<<m_var<<">>tempdrawhisto";
325    
326     for (unsigned int isample=0;isample<(this->collection).size();isample++) {
327     bool use_this_sample=false;
328     if(!(this->collection)[isample].is_active) continue; // skip inactive samples right away
329     if(((this->collection)[isample].is_data==m_is_data)&&(!do_only_selected_samples)) {
330     if(drawsignal==false&&(this->collection)[isample].is_signal==true) continue;
331     use_this_sample=true;
332     }
333     if(do_only_selected_samples&&this->do_sample(isample,onlyindex)) {
334     use_this_sample=true;
335     }
336     TH1F *tempdrawhisto = new TH1F("tempdrawhisto","tempdrawhisto",binning.size()-1,binningarray);
337     tempdrawhisto->Sumw2();
338     if(use_this_sample) {
339     (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*cutWeight);//this weight is based on PU etc. not XS
340 buchmann 1.19 // cout << "\033[1;33m Drawing " << drawthis.str() << " with cut " << (const char*) (essentialcut&&Cut)*cutWeight << " for sample " << (this->collection)[isample].filename << "\033[0m (overflow: " << addoverunderflowbins << ")" << endl;
341 buchmann 1.28 // cout << "Drawing for : " << (this->collection)[isample].filename << endl;
342     // for(int i=1;i<=tempdrawhisto->GetNbinsX();i++) cout << " Bin " << i << " [" << tempdrawhisto->GetBinLowEdge(i) << "," << tempdrawhisto->GetBinLowEdge(i)+tempdrawhisto->GetBinWidth(i) << "] : " << tempdrawhisto->GetBinContent(i) << " +/- " << tempdrawhisto->GetBinError(i) << endl;
343 buchmann 1.1 if(addoverunderflowbins) {
344     //now also adding the overflow & underflow bins:
345     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1)+tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()));
346     tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX())));
347 buchmann 1.16 // tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0)+tempdrawhisto->GetBinContent(1));
348     // tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
349 fronga 1.15 // Delete over- and under-flow bins
350     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX()+1,0);
351 buchmann 1.16 // tempdrawhisto->SetBinContent(0,0);
352 buchmann 1.1 }
353    
354     if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));//weight applied here is XS & N(entries)
355 fronga 1.11 if(Verbosity>0) dout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << ": " <<tempdrawhisto->Integral() << endl;
356 buchmann 1.1 histo->Add(tempdrawhisto);
357     }
358     tempdrawhisto->Delete();
359     }//end of loop over isample
360     if(Verbosity>0) dout << "Histo has been filled and now contains " << histo->Integral() << " points (integral)" << endl;
361     histo->GetXaxis()->SetTitle(m_xlabel.c_str());
362     // Try to add bin width information: look for units in m_xlabel
363     string units = find_units(m_xlabel);
364     if ( units.length()>0 ) {
365     stringstream ylabel;
366     ylabel << m_ylabel << " / " << histo->GetBinWidth(1) << " " << units;
367     histo->GetYaxis()->SetTitle( ylabel.str().c_str() );
368     } else {
369     histo->GetYaxis()->SetTitle(m_ylabel.c_str());
370     }
371     histo->GetXaxis()->CenterTitle();
372     histo->GetYaxis()->CenterTitle();
373     if(do_only_selected_samples) histo->SetLineColor(this->GetColor(onlyindex[0]));
374     return histo;
375     }
376    
377     TH2F* samplecollection::Draw(string m_histoname,string m_var, vector<float> binningx, vector<float> binningy, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, vector<int> onlyindex, bool drawsignal=false) {
378     if(Verbosity>0) dout << endl << endl;
379     if(Verbosity>0) dout << "-------------------------------------------------------------------------------------" << endl;
380     if(Verbosity>0) dout << "histoname : " << m_histoname << " , m_var = " << m_var << ", m_xlabel=" << m_xlabel << " m_ylabel=" << m_ylabel << " m_is_data = " << m_is_data << " lumi = " << luminosity << " onlyindex size: " << onlyindex.size() << endl;
381     if(HUSH==0) dout << "Drawing histo called " << m_histoname << "... " << endl;
382     bool do_only_selected_samples=false;
383     if(onlyindex.size()>0&&onlyindex[0]!=-1) {
384     if(Verbosity>0) {dout << "Requested to only draw sample corresponding to the following sample(s) : " << endl;}
385 buchmann 1.4 for(int is=0;is<(int)onlyindex.size();is++) {
386 buchmann 1.1 if(Verbosity>0) dout << " - " << (this->collection)[onlyindex[is]].filename << " (sample index: " << onlyindex[is] << ")" << endl;
387     }
388     do_only_selected_samples=true;
389     }
390     if(onlyindex.size()==1&&onlyindex[0]==-1) {
391     do_only_selected_samples=true; // this is the special case when we request a non-existing sample - we shouldn't draw anything then.
392     onlyindex.clear();
393     }
394     stringstream h_histoname;
395     h_histoname<<"h_"<<m_histoname;
396 buchmann 1.27 TH2F *histo = new TH2F(m_histoname.c_str(),"",binningx.size()-1,&binningx[0],binningy.size()-1,&binningy[0]);
397 buchmann 1.1 histo->Sumw2();
398    
399     stringstream drawthis;
400     drawthis<<m_var<<">>tempdrawhisto";
401    
402     for (unsigned int isample=0;isample<(this->collection).size();isample++) {
403     bool use_this_sample=false;
404     if(!(this->collection)[isample].is_active) continue; // skip inactive samples right away
405     if(((this->collection)[isample].is_data==m_is_data)&&(!do_only_selected_samples)) {
406     if(drawsignal==false&&(this->collection)[isample].is_signal==true) continue;
407     use_this_sample=true;
408     }
409     if(do_only_selected_samples&&this->do_sample(isample,onlyindex)) {
410     use_this_sample=true;
411     }
412 buchmann 1.27 TH2F *tempdrawhisto = new TH2F("tempdrawhisto","tempdrawhisto",binningx.size()-1,&binningx[0],binningy.size()-1,&binningy[0]);
413 buchmann 1.1 tempdrawhisto->Sumw2();
414     if(use_this_sample) {
415     if(Verbosity>0) dout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << endl;
416     (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*cutWeight);//this weight is based on PU etc. not XS
417 buchmann 1.13 // cout << "About to draw : " << drawthis.str() << " with cut " << (const char*) (essentialcut&&Cut)*cutWeight << endl;
418 buchmann 1.1 if(addoverunderflowbins) {
419     //now also adding the overflow & underflow bins:
420     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1)+tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()));
421     tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX())));
422     tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0)+tempdrawhisto->GetBinContent(1));
423     tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
424     }
425    
426     if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));//weight applied here is XS & N(entries)
427     histo->Add(tempdrawhisto);
428     }
429     tempdrawhisto->Delete();
430     }//end of loop over isample
431     if(Verbosity>0) dout << "Histo has been filled and now contains " << histo->Integral() << " points (integral)" << endl;
432     histo->GetXaxis()->SetTitle(m_xlabel.c_str());
433     histo->GetYaxis()->SetTitle(m_ylabel.c_str());
434     histo->GetXaxis()->CenterTitle();
435     histo->GetYaxis()->CenterTitle();
436     if(do_only_selected_samples) histo->SetLineColor(this->GetColor(onlyindex[0]));
437     return histo;
438     }
439    
440    
441     TH1F* samplecollection::Draw(string m_histoname,string m_var, int m_nbins, float m_minx, float m_maxx, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, vector<int> onlyindex, bool drawsignal=false)
442     {
443     vector<float> binning;
444     for(int i=0;i<=m_nbins;i++)
445     {
446     binning.push_back(((float)(m_maxx-m_minx)/((float)m_nbins))*i+m_minx);
447     }
448 fronga 1.14
449 buchmann 1.1 TH1F *histo = this->Draw(m_histoname,m_var, binning, m_xlabel, m_ylabel, Cut, m_is_data, luminosity, onlyindex,drawsignal);
450     return histo;
451     }
452    
453     THStack samplecollection::DrawStack(string m_histoname,string m_var, vector<float> binning, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool drawsignal=false) {
454     stringstream h_histoname;
455     h_histoname<<"h_"<<m_histoname;
456     THStack thestack("thestack",m_histoname.c_str());
457    
458     stringstream drawthis;
459     drawthis<<m_var<<">>tempdrawhisto";
460    
461     TH1F *histogroups[this->ngroups+1];
462     int bookedhistos[this->ngroups+1];
463     for(int ih=0;ih<=this->ngroups;ih++) bookedhistos[ih]=0;
464    
465     float binningarray[binning.size()+1];
466 buchmann 1.4 for(int i=0;i<(int)binning.size();i++) {binningarray[i]=binning[i];}
467 buchmann 1.1
468     for (unsigned int isample=0;isample<(this->collection).size();isample++) {
469     if(!drawsignal&&(this->collection)[isample].is_signal) continue;
470     if((this->collection)[isample].is_active&&(this->collection)[isample].is_data==m_is_data) {//fills mc if we want mc, else fills data.
471     TH1F *tempdrawhisto = new TH1F("tempdrawhisto","",binning.size()-1,binningarray);
472 buchmann 1.19 tempdrawhisto->Sumw2();
473 buchmann 1.1 (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*cutWeight);
474 buchmann 1.27 // cout << "\033[1;33m Drawing " << drawthis.str() << " with cut " << (const char*) (essentialcut&&Cut)*cutWeight << " for sample " << (this->collection)[isample].filename << "\033[0m (overflow: " << addoverunderflowbins << ")" << endl;
475 buchmann 1.1 if(addoverunderflowbins) {
476     //now also adding the overflow & underflow bins:
477     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1)+tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()));
478     // tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()))); // errors not necessary for stack!
479     tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0)+tempdrawhisto->GetBinContent(1));
480     // tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1))); // errors not necessary for stack!
481     }
482    
483     if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));
484     tempdrawhisto->SetFillColor(this->GetColor(isample));
485     if(bookedhistos[(this->collection)[isample].groupindex]==0) {
486 buchmann 1.5 tempdrawhisto->SetName((removefunnystring((this->collection)[isample].samplename)+"__"+GetNumericHistoName()).c_str());
487 buchmann 1.1 histogroups[(this->collection)[isample].groupindex]=(TH1F*)tempdrawhisto->Clone();
488     bookedhistos[(this->collection)[isample].groupindex]=1;
489     }
490     else
491     {
492     histogroups[(this->collection)[isample].groupindex]->Add(tempdrawhisto);
493     bookedhistos[(this->collection)[isample].groupindex]++;
494     }
495     tempdrawhisto->Delete();
496     }
497     }
498     vector<int> ordered_indices;
499     vector<float> ordered_integrals;
500    
501     for(int ig=0;ig<=this->ngroups;ig++) {
502     if(bookedhistos[ig]>0) {
503     ordered_indices.push_back(ig);
504     ordered_integrals.push_back(histogroups[ig]->Integral());
505     }
506     }
507    
508     /*
509     bubbleSort(ordered_integrals,ordered_indices);
510     // for(int index=ordered_indices.size()-1;index>=0;index--) {
511     for(int index=0;index<ordered_indices.size();index++) {
512     thestack.Add(histogroups[ordered_indices[index]]);
513     }
514     */
515 buchmann 1.4 for(int index=0;index<(int)ordered_indices.size();index++) {
516 buchmann 1.1 thestack.Add(histogroups[ordered_indices[index]]);
517     }
518 buchmann 1.29
519 buchmann 1.1 return thestack;
520     }
521    
522     THStack samplecollection::DrawStack(string m_histoname,string m_var, int m_nbins, float m_minx, float m_maxx, string m_xlabel, string m_ylabel, TCut Cut, bool m_is_data, float luminosity, bool
523     drawsignal=false)
524     {
525     vector<float> binning;
526     for(int i=0;i<=m_nbins;i++)
527     {
528     binning.push_back(((float)(m_maxx-m_minx)/((float)m_nbins))*i+m_minx);
529     }
530     return this->DrawStack(m_histoname,m_var, binning, m_xlabel, m_ylabel, Cut, m_is_data, luminosity, drawsignal);
531     }
532    
533    
534     vector<int> samplecollection::FindSample(string what)
535     {
536     vector<int> hitcollection;
537     for(unsigned int isam=0;isam<(this->collection).size();isam++)
538     {
539     if(((this->collection)[isam].filename).find(what)!=string::npos) {
540     hitcollection.push_back(isam);
541     } else {
542     }
543     }
544     if(hitcollection.size()==0) {
545     hitcollection.push_back(-1);
546     write_warning(__FUNCTION__,"Couldn't find sample "+string(what)+" using sample collection \""+string(this->name)+"\"");
547     }
548     return hitcollection;
549     }
550    
551 buchmann 1.3 vector<int> samplecollection::FindSampleBySampleName(string what)
552     {
553     vector<int> hitcollection;
554     for(unsigned int isam=0;isam<(this->collection).size();isam++)
555     {
556     if(((this->collection)[isam].samplename).find(what)!=string::npos) {
557     hitcollection.push_back(isam);
558     } else {
559     }
560     }
561     if(hitcollection.size()==0) {
562     hitcollection.push_back(-1);
563     write_warning(__FUNCTION__,"Couldn't find sample "+string(what)+" using sample collection \""+string(this->name)+"\"");
564     }
565     return hitcollection;
566     }
567    
568 buchmann 1.1 Color_t samplecollection::GetColor(string filename) {
569     vector<int> corresponding_samples = this->FindSample(filename);
570     if(corresponding_samples.size()>0) return this->GetColor(corresponding_samples[0]);
571     return kBlack;
572     }
573    
574     Color_t samplecollection::GetColor(int sampleindex) {
575     return this->collection[sampleindex].samplecolor;
576     }
577    
578     TLegend* samplecollection::allbglegend(string title, TH1F *data,float posx=0.65, float posy=0.60) {
579     // TLegend *leg = new TLegend(0.65,0.60,0.89,0.77);
580     TLegend *leg = new TLegend(posx,posy,0.89,0.89);
581     if(title!="") leg->SetHeader(title.c_str());
582 fronga 1.14 if(data->GetName()!="nothing") leg->AddEntry(data,"Data","lp");
583 buchmann 1.1 leg->SetFillColor(kWhite);
584     leg->SetBorderSize(0);
585     leg->SetLineColor(kWhite);
586    
587 buchmann 1.22 int maxIgroup=0;
588     for(int isample=0;isample<(int)(this->collection).size();isample++) {
589 buchmann 1.24 if((this->collection)[isample].groupindex>maxIgroup) maxIgroup=(this->collection)[isample].groupindex;
590 buchmann 1.22 }
591 buchmann 1.24 maxIgroup++;
592 buchmann 1.22
593     TH1F *fakehistos[maxIgroup];
594     bool donealready[maxIgroup];
595    
596     for(int i=0;i<maxIgroup;i++) donealready[i]=false;
597 buchmann 1.24
598 buchmann 1.4 for(int isample=0;isample<(int)(this->collection).size();isample++) {
599 buchmann 1.1 if((this->collection)[isample].is_data||(this->collection)[isample].is_signal) continue;
600     if(!donealready[(this->collection)[isample].groupindex]) {
601 buchmann 1.24 assert((this->collection)[isample].groupindex<maxIgroup);
602 buchmann 1.1 fakehistos[(this->collection)[isample].groupindex] = new TH1F(GetNumericHistoName().c_str(),"",1,0,1);
603     fakehistos[(this->collection)[isample].groupindex]->Fill(1);
604     fakehistos[(this->collection)[isample].groupindex]->SetFillColor(this->GetColor(isample));
605     leg->AddEntry(fakehistos[(this->collection)[isample].groupindex],((this->collection)[isample].samplename).c_str(),"f");
606     donealready[(this->collection)[isample].groupindex]=true;
607 buchmann 1.21 PlottingSetup::FakeHistoHeap.push_back(fakehistos[(this->collection)[isample].groupindex]);
608 buchmann 1.1 }
609     }
610     DrawPrelim();
611     leg->SetTextFont(42);
612     return leg;
613     }
614    
615     TLegend* samplecollection::allbglegend(string title="",float posx=0.65, float posy=0.60) {
616     TH1F *blub = new TH1F("nothing","nothing",1,0,1);
617 buchmann 1.21 TLegend *leg = this->allbglegend(title,blub,posx,posy);
618 buchmann 1.25 PlottingSetup::FakeHistoHeap.push_back(blub);
619 buchmann 1.21 return leg;
620 buchmann 1.1 }
621    
622    
623     void set_treename(string treen="events") {
624     dout << "Treename has been set to " << treen << endl;
625     if(treen=="PFevents"||treen=="events") treename=treen;
626     else write_error("sample::set_treename","Setting the treename failed as you provided an invalid tree name.");
627     }
628    
629     vector<float> samplecollection::get_optimal_binsize(string variable, TCut cut,int nbins, float low, float high) {
630     TH1F *histo = this->Draw("histo",variable,5000,low,high, "finding_optimal_binsize", "events", cut,0,1000);
631     float eventsperbin=histo->Integral()/nbins;
632     vector<float> binning;
633     binning.push_back(high);
634     float runningsum=0;
635     for(int i=histo->GetNbinsX();i>0;i--) {
636     runningsum+=histo->GetBinContent(i);
637     if(TMath::Abs(runningsum-eventsperbin)<0.05*eventsperbin||runningsum>eventsperbin) {
638     binning.push_back(histo->GetBinLowEdge(i));
639     runningsum=0;
640     }
641     }
642     if(runningsum>0) binning.push_back(low);
643     for(int i=0;i<int(binning.size()/2);i++) {
644     float temp=binning[i];
645     binning[i]=binning[binning.size()-1-i];
646     binning[binning.size()-1-i]=temp;
647     }
648    
649     return binning;
650    
651     }
652    
653 buchmann 1.27 void samplecollection::PickUpFromThisFile(int isamp, string cut, vector<string> &output, vector<string> &pickupfile, bool QuietMode) {
654 buchmann 1.26 int lumi,runNum;
655     ULong64_t eventNum;
656    
657 buchmann 1.1 float jzb[30];
658     (this->collection)[isamp].events->SetBranchAddress("jzb",&jzb);
659     (this->collection)[isamp].events->SetBranchAddress("lumi",&runNum);
660     (this->collection)[isamp].events->SetBranchAddress("eventNum",&eventNum);
661     (this->collection)[isamp].events->SetBranchAddress("lumi",&lumi);
662     (this->collection)[isamp].events->SetBranchAddress("runNum",&runNum);
663    
664    
665     TTreeFormula *select = new TTreeFormula("select", cut.c_str()&&essentialcut, (this->collection)[isamp].events);
666     int npickedup=0;
667 buchmann 1.26 stringstream filetext;
668 buchmann 1.1 for (Int_t entry = 0 ; entry < (this->collection)[isamp].events->GetEntries() ; entry++) {
669     (this->collection)[isamp].events->LoadTree(entry);
670     if (select->EvalInstance()) {
671     (this->collection)[isamp].events->GetEntry(entry);
672 buchmann 1.27 if(!QuietMode) dout << runNum << ":" << lumi << ":" << eventNum << endl;
673 buchmann 1.26 filetext.str("");
674     filetext << runNum << ":" << lumi << ":" << eventNum << endl;
675     output.push_back(filetext.str());
676 buchmann 1.1 npickedup++;
677     }
678     }
679 buchmann 1.27 if(!QuietMode) dout << "Printed out a total of " << npickedup << " events" << endl;
680 buchmann 1.1 }
681    
682    
683    
684 buchmann 1.27 void samplecollection::PickUpEvents(string cut, string filename, bool QuietMode=false) {
685 buchmann 1.1 vector<string> output;
686     vector<string> pickupfile;
687 buchmann 1.26 for (unsigned int isamp=0;isamp<this->collection.size();isamp++)
688 buchmann 1.1 {
689     if((this->collection)[isamp].is_data) {
690     //we have a data sample !
691 buchmann 1.27 this->PickUpFromThisFile(isamp,cut,output,pickupfile,QuietMode);
692 buchmann 1.1 }
693     }
694 buchmann 1.26
695 buchmann 1.1 //do something with output and of course the pickup file!
696 buchmann 1.26 ofstream myfile(filename.c_str());
697     for(unsigned int ievent=0;ievent<output.size();ievent++) myfile << output[ievent];
698     myfile.close();
699    
700 buchmann 1.1 }
701    
702     //________________________________________________________________________________________
703     // Find units from histogram x-label (looks for '[...]')
704     string samplecollection::find_units(string& xlabel) {
705    
706     string units;
707     size_t pos1 = xlabel.find("[");
708     if ( pos1 != string::npos ) {
709     size_t pos2 = xlabel.find("]");
710     units = xlabel.substr(pos1+1,pos2-pos1-1);
711     }// else {
712     // size_t pos1 = xlabel.find("(");
713     // if ( pos1 != string::npos ) {
714     // size_t pos2 = xlabel.find(")");
715     // units = xlabel.substr(pos1+1,pos2-pos1-1);
716     // }
717     // }
718     return units;
719    
720     }
721    
722     void samplecollection::RemoveLastSample() {
723     dout << "Removing last sample: " << ((this->collection)[(this->collection).size()-1]).filename << std::endl;
724     if(((this->collection)[(this->collection).size()-1]).is_data) this->ndatasamples--;
725     else this->nmcsamples--;
726     this->nsamples--;
727     ((this->collection)[(this->collection).size()-1]).closeFile();
728     (this->collection).pop_back();
729     }
730    
731     void switch_overunderflow(bool newpos=false) {
732     addoverunderflowbins=newpos;
733     }
734    
735