ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/SampleClass.C
Revision: 1.4
Committed: Fri Jul 8 14:33:58 2011 UTC (13 years, 10 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.3: +49 -14 lines
Log Message:
Also implemented PickUp function now; Please remember to specify the -l TreePlayer option when compiling ...

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