ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/SampleClass.C
Revision: 1.6
Committed: Thu Jul 14 06:25:07 2011 UTC (13 years, 9 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.5: +1 -1 lines
Log Message:
Style update

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 buchmann 1.5 #include <TH2.h>
10 buchmann 1.1 #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 buchmann 1.4 #include <TTreeFormula.h>
19 buchmann 1.1
20     #define SampleClassLoaded
21 buchmann 1.4
22 buchmann 1.1 #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 buchmann 1.2 bool addoverunderflowbins=false;
35 buchmann 1.1 string treename="PFevents";
36    
37     class sample
38     {
39     public:
40     string filename;
41     string samplename;
42     int Nentries;
43     float xs;//cross section
44     float weight;
45     bool is_data;
46     bool is_signal;
47     bool is_active;
48     int groupindex;
49     Color_t samplecolor;
50    
51     TFile *tfile;
52     TTree *events;
53    
54     sample(string m_filename,string m_samplename,int m_Nentries, float m_xs,bool is_data, bool m_is_signal, int m_groupindex, Color_t color);
55     void closeFile();
56     };
57    
58     string write_mc_or_data(bool is_data)
59     {
60     if(is_data) return "data";
61     return "MC";
62     }
63    
64     sample::sample(string m_filename, string m_samplename, int m_Nentries, float m_xs,bool m_is_data, bool m_is_signal, int m_groupindex, Color_t mycolor)
65     {
66     this->filename=m_filename;
67     this->samplename=m_samplename;
68     this->Nentries=m_Nentries;
69     this->xs=m_xs;
70     this->is_data=m_is_data;
71     this->is_signal=m_is_signal;
72     this->weight=(xs/(float)Nentries);
73     this->groupindex=m_groupindex;
74     this->is_active=true;
75     this->samplecolor=mycolor;
76     if(!doesROOTFileExist(this->filename)) {
77     stringstream message;
78     message << "The " << write_mc_or_data(is_data) << " sample " << this->samplename << " is invalid because the associated file path, " << this->filename << " is incorrect.";
79     write_error("Sample::Sample",message.str());
80     this->is_active=false;
81     }
82    
83     if(doesROOTFileExist(this->filename)) {
84     //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)
85     Int_t currlevel=gErrorIgnoreLevel;
86     gErrorIgnoreLevel=5000;
87     this->tfile = new TFile(m_filename.c_str());
88     gErrorIgnoreLevel=currlevel;
89     this->events=(TTree*)(this->tfile)->Get(treename.c_str());
90     if(Verbosity>0) cout << "The " << write_mc_or_data(is_data) << " file " << this->filename << " has been added successfully to the list of samples. " << endl;
91     }
92     else {
93     this->is_active=false;
94     }
95    
96     }
97    
98     void sample::closeFile()
99     {
100     if(doesROOTFileExist(this->filename)) {
101     (this->tfile)->Close();
102     }
103     else {
104     cout << "SAMPLE " << this->samplename << " cannot be closed as the underlying file (" << this->filename << ") does not exist!" << endl;
105     this->is_active=false;
106     }
107     }
108    
109     bool doesROOTFileExist(string filename)
110     {
111     //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)
112     Int_t currlevel=gErrorIgnoreLevel;
113     gErrorIgnoreLevel=5000;
114     TFile *f = new TFile(filename.c_str());
115    
116     if (f->IsZombie()) {
117     cout << "Error opening file" << filename << endl;
118     return 0;
119     }
120     f->Close();
121     gErrorIgnoreLevel=currlevel;
122     return 1;
123     }
124     //********************************************************
125    
126     TCut essentialcut("mll>0");
127    
128     void setessentialcut(TCut ess) {
129     essentialcut=ess;
130     }
131    
132     class samplecollection
133     {
134     public:
135     string name;
136     vector<sample> collection;
137     int nsamples;
138     int ndatasamples;
139     int nmcsamples;
140     int ngroups;
141    
142     samplecollection(string m_name);
143     void AddSample(string m_filename,string m_samplename,int m_Nentries, float m_xs,bool is_data, bool m_is_signal, int groupindex, Color_t color);
144    
145     //vector quantities
146     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);
147     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);
148    
149     //minx,maxs quantities
150     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);
151     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);
152    
153 buchmann 1.5 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);
154    
155 buchmann 1.2 vector<float> get_optimal_binsize(string variable, TCut cut,int nbins, float low, float high);
156    
157 buchmann 1.1 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);
158     vector<int> FindSample(string what);
159     void ListSamples();
160     bool do_sample(int thissample, vector<int> &selected_samples);
161     Color_t GetColor(string filename);
162     Color_t GetColor(int sampleindex);
163    
164 buchmann 1.4 TLegend* allbglegend(string title,float x, float y);
165     TLegend* allbglegend(string title, TH1F *data, float x, float y);
166    
167     void PickUpFromThisFile(int isamp, string cut, vector<string> &output, vector<string> &pickupfile);
168     void PickUpEvents(string cut);
169 buchmann 1.1 };
170    
171     samplecollection::samplecollection(string m_name)
172     {
173     this->name=m_name;
174     if(Verbosity>0) cout << "Initiated sample collection " << this->name << " " << endl;
175     }
176    
177     void samplecollection::ListSamples()
178     {
179     cout << "---------------------------------------------------------------------------------------------------" << endl;
180     cout << "Listing all " << this->nsamples << " sample(s) of the sample collection called " << this->name << " : " << endl;
181     if(this->ndatasamples>0) {
182     cout << "Data sample(s): " << endl;
183     for (int isamp=0;isamp<this->collection.size();isamp++)
184     {
185     if((this->collection)[isamp].is_data) cout << " - " << (this->collection)[isamp].samplename << " from " << (this->collection)[isamp].filename << endl;
186     }
187     }
188     if(this->nmcsamples>0) {
189     cout << "MC sample(s): " << endl;
190     for (int isamp=0;isamp<this->collection.size();isamp++)
191     {
192     if(!(this->collection)[isamp].is_data) cout << " - " << (this->collection)[isamp].samplename << " from " << (this->collection)[isamp].filename << endl;
193     }
194     }
195     cout << "---------------------------------------------------------------------------------------------------" << endl;
196     }
197    
198     void samplecollection::AddSample(string m_filename,string m_samplename,int m_Nentries, float m_xs,bool is_data, bool m_is_signal, int groupindex, Color_t newcolor)
199     {
200     sample NewSample(m_filename,m_samplename,m_Nentries,m_xs,is_data,m_is_signal,groupindex,newcolor);
201     (this->collection).push_back(NewSample);
202     if((this->collection).size()==1) {
203     this->nmcsamples=0;
204     this->ndatasamples=0;
205     this->nsamples=0;
206     this->ngroups=0;
207     }
208     if(groupindex>this->ngroups) this->ngroups=groupindex;
209     if(is_data) this->ndatasamples++;
210     else this->nmcsamples++;
211     this->nsamples=this->collection.size();
212     }
213    
214     bool samplecollection::do_sample(int thissample, vector<int> &selected_samples)
215     {
216     bool drawit=false;
217     for(int isel=0;isel<selected_samples.size();isel++)
218     {
219     if(selected_samples[isel]==thissample) {
220     drawit=true;
221     break;
222     }
223     }
224     return drawit;
225     }
226    
227     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)
228     {
229     vector<int> emptyvector;
230     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);
231     return histo;
232     }
233    
234     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)
235     {
236     vector<int> emptyvector;
237     TH1F *histo = this->Draw(m_histoname,m_var, binning, m_xlabel, m_ylabel, Cut, m_is_data, luminosity,emptyvector,drawsignal);
238     return histo;
239     }
240    
241     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) {
242     if(Verbosity>0) cout << endl << endl;
243     if(Verbosity>0) cout << "-------------------------------------------------------------------------------------" << endl;
244     if(Verbosity>0) cout << "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;
245     if(HUSH==0) cout << "Drawing histo called " << m_histoname << "... " << endl;
246     bool do_only_selected_samples=false;
247     if(onlyindex.size()>0&&onlyindex[0]!=-1) {
248     if(Verbosity>0) {cout << "Requested to only draw sample corresponding to the following sample(s) : " << endl;}
249     for(int is=0;is<onlyindex.size();is++) {
250     if(Verbosity>0) cout << " - " << (this->collection)[onlyindex[is]].filename << " (sample index: " << onlyindex[is] << ")" << endl;
251     }
252     do_only_selected_samples=true;
253     }
254     if(onlyindex.size()==1&&onlyindex[0]==-1) {
255     do_only_selected_samples=true; // this is the special case when we request a non-existing sample - we shouldn't draw anything then.
256     onlyindex.clear();
257     }
258     stringstream h_histoname;
259     h_histoname<<"h_"<<m_histoname;
260     float binningarray[binning.size()+1];
261     for(int i=0;i<binning.size();i++) {binningarray[i]=binning[i];}
262     TH1F *histo = new TH1F(m_histoname.c_str(),"",binning.size()-1,binningarray);
263     histo->Sumw2();
264    
265     stringstream drawthis;
266     drawthis<<m_var<<">>tempdrawhisto";
267    
268     for (unsigned int isample=0;isample<(this->collection).size();isample++) {
269     bool use_this_sample=false;
270     if(!(this->collection)[isample].is_active) continue; // skip inactive samples right away
271     if(((this->collection)[isample].is_data==m_is_data)&&(!do_only_selected_samples)) {
272     if(drawsignal==false&&(this->collection)[isample].is_signal==true) continue;
273     use_this_sample=true;
274     }
275     if(do_only_selected_samples&&this->do_sample(isample,onlyindex)) {
276     use_this_sample=true;
277     }
278     TH1F *tempdrawhisto = new TH1F("tempdrawhisto","tempdrawhisto",binning.size()-1,binningarray);
279     tempdrawhisto->Sumw2();
280     if(use_this_sample) {
281     if(Verbosity>0) cout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << endl;
282 buchmann 1.2 (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*"weight");//this weight is based on PU etc. not XS
283     if(addoverunderflowbins) {
284     //now also adding the overflow & underflow bins:
285     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1));
286     tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX())));
287     tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0));
288     tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
289     }
290    
291     if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));//weight applied here is XS & N(entries)
292 buchmann 1.1 histo->Add(tempdrawhisto);
293     }
294     tempdrawhisto->Delete();
295     }//end of loop over isample
296     if(Verbosity>0) cout << "Histo has been filled and now contains " << histo->Integral() << " points (integral)" << endl;
297     histo->GetXaxis()->SetTitle(m_xlabel.c_str());
298     histo->GetYaxis()->SetTitle(m_ylabel.c_str());
299     histo->GetXaxis()->CenterTitle();
300     histo->GetYaxis()->CenterTitle();
301     if(do_only_selected_samples) histo->SetLineColor(this->GetColor(onlyindex[0]));
302     return histo;
303     }
304    
305 buchmann 1.5 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) {
306     if(Verbosity>0) cout << endl << endl;
307     if(Verbosity>0) cout << "-------------------------------------------------------------------------------------" << endl;
308     if(Verbosity>0) cout << "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;
309     if(HUSH==0) cout << "Drawing histo called " << m_histoname << "... " << endl;
310     bool do_only_selected_samples=false;
311     if(onlyindex.size()>0&&onlyindex[0]!=-1) {
312     if(Verbosity>0) {cout << "Requested to only draw sample corresponding to the following sample(s) : " << endl;}
313     for(int is=0;is<onlyindex.size();is++) {
314     if(Verbosity>0) cout << " - " << (this->collection)[onlyindex[is]].filename << " (sample index: " << onlyindex[is] << ")" << endl;
315     }
316     do_only_selected_samples=true;
317     }
318     if(onlyindex.size()==1&&onlyindex[0]==-1) {
319     do_only_selected_samples=true; // this is the special case when we request a non-existing sample - we shouldn't draw anything then.
320     onlyindex.clear();
321     }
322     stringstream h_histoname;
323     h_histoname<<"h_"<<m_histoname;
324     float binningarray[binningx.size()+1];
325     float binningyarray[binningy.size()+1];
326     for(int i=0;i<binningx.size();i++) {binningarray[i]=binningx[i];binningyarray[i]=binningy[i];}
327     TH2F *histo = new TH2F(m_histoname.c_str(),"",binningx.size()-1,binningarray,binningy.size(),binningyarray);
328     histo->Sumw2();
329    
330     stringstream drawthis;
331     drawthis<<m_var<<">>tempdrawhisto";
332    
333     for (unsigned int isample=0;isample<(this->collection).size();isample++) {
334     bool use_this_sample=false;
335     if(!(this->collection)[isample].is_active) continue; // skip inactive samples right away
336     if(((this->collection)[isample].is_data==m_is_data)&&(!do_only_selected_samples)) {
337     if(drawsignal==false&&(this->collection)[isample].is_signal==true) continue;
338     use_this_sample=true;
339     }
340     if(do_only_selected_samples&&this->do_sample(isample,onlyindex)) {
341     use_this_sample=true;
342     }
343     TH2F *tempdrawhisto = new TH2F("tempdrawhisto","tempdrawhisto",binningx.size()-1,binningarray,binningy.size()-1,binningyarray);
344     tempdrawhisto->Sumw2();
345     if(use_this_sample) {
346     if(Verbosity>0) cout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << endl;
347     (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*"weight");//this weight is based on PU etc. not XS
348     if(addoverunderflowbins) {
349     //now also adding the overflow & underflow bins:
350     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1));
351     tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX())));
352     tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0));
353     tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
354     }
355    
356     if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));//weight applied here is XS & N(entries)
357     histo->Add(tempdrawhisto);
358     }
359     tempdrawhisto->Delete();
360     }//end of loop over isample
361     if(Verbosity>0) cout << "Histo has been filled and now contains " << histo->Integral() << " points (integral)" << endl;
362     histo->GetXaxis()->SetTitle(m_xlabel.c_str());
363     histo->GetYaxis()->SetTitle(m_ylabel.c_str());
364     histo->GetXaxis()->CenterTitle();
365     histo->GetYaxis()->CenterTitle();
366     if(do_only_selected_samples) histo->SetLineColor(this->GetColor(onlyindex[0]));
367     return histo;
368     }
369    
370 buchmann 1.1
371     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)
372     {
373     vector<float> binning;
374     for(int i=0;i<=m_nbins;i++)
375     {
376     binning.push_back(((float)(m_maxx-m_minx)/((float)m_nbins))*i+m_minx);
377     }
378    
379     TH1F *histo = this->Draw(m_histoname,m_var, binning, m_xlabel, m_ylabel, Cut, m_is_data, luminosity, onlyindex,drawsignal);
380     return histo;
381     }
382     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 drawsignal=false)
383     {
384     stringstream h_histoname;
385     h_histoname<<"h_"<<m_histoname;
386     THStack thestack("thestack",m_histoname.c_str());
387    
388     stringstream drawthis;
389     drawthis<<m_var<<">>tempdrawhisto";
390    
391     TH1F *histogroups[this->ngroups+1];
392     int bookedhistos[this->ngroups+1];
393     for(int ih=0;ih<=this->ngroups;ih++) bookedhistos[ih]=0;
394    
395     for (unsigned int isample=0;isample<(this->collection).size();isample++) {
396     if(!drawsignal&&(this->collection)[isample].is_signal) continue;
397     if((this->collection)[isample].is_active&&(this->collection)[isample].is_data==m_is_data) {//fills mc if we want mc, else fills data.
398     TH1F *tempdrawhisto = new TH1F("tempdrawhisto","",m_nbins,m_minx,m_maxx);
399     (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*"weight");
400 buchmann 1.2
401     if(addoverunderflowbins) {
402     //now also adding the overflow & underflow bins:
403     tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1));
404     tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX())));
405     tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0));
406     tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
407     }
408    
409 buchmann 1.1 if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));
410     tempdrawhisto->SetFillColor(this->GetColor(isample));
411     if(bookedhistos[(this->collection)[isample].groupindex]==0) {
412     tempdrawhisto->SetName(GetNumericHistoName().c_str());
413     histogroups[(this->collection)[isample].groupindex]=(TH1F*)tempdrawhisto->Clone();
414     bookedhistos[(this->collection)[isample].groupindex]=1;
415     }
416     else
417     {
418     histogroups[(this->collection)[isample].groupindex]->Add(tempdrawhisto);
419     bookedhistos[(this->collection)[isample].groupindex]++;
420     }
421     tempdrawhisto->Delete();
422     }
423     }
424     vector<int> ordered_indices;
425     vector<float> ordered_integrals;
426    
427     for(int ig=0;ig<=this->ngroups;ig++) {
428     if(bookedhistos[ig]>0) {
429     ordered_indices.push_back(ig);
430     ordered_integrals.push_back(histogroups[ig]->Integral());
431     }
432     }
433    
434     /*
435     bubbleSort(ordered_integrals,ordered_indices);
436     // for(int index=ordered_indices.size()-1;index>=0;index--) {
437     for(int index=0;index<ordered_indices.size();index++) {
438     thestack.Add(histogroups[ordered_indices[index]]);
439     }
440     */
441     for(int index=0;index<ordered_indices.size();index++) {
442     thestack.Add(histogroups[ordered_indices[index]]);
443     }
444     return thestack;
445     }
446    
447    
448     vector<int> samplecollection::FindSample(string what)
449     {
450     vector<int> hitcollection;
451     for(unsigned int isam=0;isam<(this->collection).size();isam++)
452     {
453     if(((this->collection)[isam].filename).find(what)!=string::npos) {
454     hitcollection.push_back(isam);
455     }
456     else {
457     }
458     }
459     if(hitcollection.size()==0) hitcollection.push_back(-1);
460     return hitcollection;
461     }
462    
463     Color_t samplecollection::GetColor(string filename) {
464     vector<int> corresponding_samples = this->FindSample(filename);
465     if(corresponding_samples.size()>0) return this->GetColor(corresponding_samples[0]);
466     return kBlack;
467     }
468    
469     Color_t samplecollection::GetColor(int sampleindex) {
470     return this->collection[sampleindex].samplecolor;
471     }
472    
473 buchmann 1.4 TLegend* samplecollection::allbglegend(string title, TH1F *data,float posx=0.65, float posy=0.60) {
474     // TLegend *leg = new TLegend(0.65,0.60,0.89,0.77);
475 buchmann 1.6 TLegend *leg = new TLegend(posx,posy,0.89,0.89);
476 buchmann 1.1 if(title!="") leg->SetHeader(title.c_str());
477     if(data->GetName()!="nothing") leg->AddEntry(data,"Data","p");
478     leg->SetFillColor(kWhite);
479     leg->SetBorderSize(0);
480     leg->SetLineColor(kWhite);
481    
482     TH1F *fakehistos[(this->collection).size()];
483     bool donealready[(this->collection).size()];
484     for(int i=0;i<(this->collection).size();i++) donealready[i]=false;
485     for(int isample=0;isample<(this->collection).size();isample++) {
486     if((this->collection)[isample].is_data||(this->collection)[isample].is_signal) continue;
487    
488     if(!donealready[(this->collection)[isample].groupindex]) {
489     fakehistos[(this->collection)[isample].groupindex] = new TH1F(GetNumericHistoName().c_str(),"",1,0,1);
490     fakehistos[(this->collection)[isample].groupindex]->Fill(1);
491     fakehistos[(this->collection)[isample].groupindex]->SetFillColor(this->GetColor(isample));
492     leg->AddEntry(fakehistos[(this->collection)[isample].groupindex],((this->collection)[isample].samplename).c_str(),"f");
493     donealready[(this->collection)[isample].groupindex]=true;
494     }
495     }
496 buchmann 1.4 DrawPrelim();
497 buchmann 1.1 leg->SetTextFont(42);
498     return leg;
499     }
500    
501 buchmann 1.4 TLegend* samplecollection::allbglegend(string title="",float posx=0.65, float posy=0.60) {
502 buchmann 1.1 Int_t currlevel=gErrorIgnoreLevel;
503     gErrorIgnoreLevel=5000;
504     TH1F *blub = new TH1F("nothing","nothing",1,0,1);
505     gErrorIgnoreLevel=currlevel;//we know this possibly replaces a previous histo, but we don't care since it's fake anyway.
506 buchmann 1.4 return this->allbglegend(title,blub,posx,posy);
507 buchmann 1.1 }
508    
509 buchmann 1.4
510 buchmann 1.1 void set_treename(string treen="events") {
511     cout << "Treename has been set to " << treen << endl;
512     if(treen=="PFevents"||treen=="events") treename=treen;
513     else write_error("sample::set_treename","Setting the treename failed as you provided an invalid tree name.");
514     }
515 buchmann 1.2
516     vector<float> samplecollection::get_optimal_binsize(string variable, TCut cut,int nbins, float low, float high) {
517     TH1F *histo = this->Draw("histo",variable,5000,low,high, "finding_optimal_binsize", "events", cut,0,1000);
518     float eventsperbin=histo->Integral()/nbins;
519     vector<float> binning;
520     binning.push_back(high);
521     float runningsum=0;
522     for(int i=histo->GetNbinsX();i>0;i--) {
523     runningsum+=histo->GetBinContent(i);
524     if(TMath::Abs(runningsum-eventsperbin)<0.05*eventsperbin||runningsum>eventsperbin) {
525     binning.push_back(histo->GetBinLowEdge(i));
526     runningsum=0;
527     }
528     }
529     if(runningsum>0) binning.push_back(low);
530     for(int i=0;i<int(binning.size()/2);i++) {
531     float temp=binning[i];
532     binning[i]=binning[binning.size()-1-i];
533     binning[binning.size()-1-i]=temp;
534     }
535    
536     return binning;
537    
538 buchmann 1.3 }
539    
540 buchmann 1.4 void samplecollection::PickUpFromThisFile(int isamp, string cut, vector<string> &output, vector<string> &pickupfile) {
541     int lumi,eventNum,runNum;
542     float jzb[30];
543     (this->collection)[isamp].events->SetBranchAddress("jzb",&jzb);
544     (this->collection)[isamp].events->SetBranchAddress("lumi",&runNum);
545     (this->collection)[isamp].events->SetBranchAddress("eventNum",&eventNum);
546     (this->collection)[isamp].events->SetBranchAddress("lumi",&lumi);
547     (this->collection)[isamp].events->SetBranchAddress("runNum",&runNum);
548    
549     TTreeFormula *select = new TTreeFormula("select", "pfJetGoodNum>=3&&jzb[1]>100&&jzb[1]<150&&id1==id2", (this->collection)[isamp].events);
550     for (Int_t entry = 0 ; entry < (this->collection)[isamp].events->GetEntries() ; entry++) {
551     (this->collection)[isamp].events->LoadTree(entry);
552     if (select->EvalInstance()) {
553     (this->collection)[isamp].events->GetEntry(entry);
554     cout << runNum << ":" << lumi << ":" << eventNum << endl;
555     }
556     }
557     }
558    
559    
560    
561     void samplecollection::PickUpEvents(string cut) {
562     vector<string> output;
563     vector<string> pickupfile;
564     for (int isamp=0;isamp<this->collection.size();isamp++)
565     {
566     if((this->collection)[isamp].is_data) {
567     //we have a data sample !
568     this->PickUpFromThisFile(isamp,cut,output,pickupfile);
569     }
570     }
571     //do something with output and of course the pickup file!
572     }
573    
574    
575 buchmann 1.3 void switch_overunderflow(bool newpos=false) {
576     addoverunderflowbins=newpos;
577 buchmann 1.2 }