ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/SampleClass.C
(Generate patch)

Comparing UserCode/cbrown/Development/Plotting/Modules/SampleClass.C (file contents):
Revision 1.2 by buchmann, Thu Feb 9 15:59:08 2012 UTC vs.
Revision 1.24 by buchmann, Mon Jan 21 14:42:04 2013 UTC

# Line 45 | Line 45 | public:
45    bool is_data;
46    bool is_signal;
47    bool is_active;
48 +  float weightrenormalization;
49    int groupindex;
50    Color_t samplecolor;
51    
# Line 52 | Line 53 | public:
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 +  string ExtractVersion(string FullVersionString);
57    void closeFile();
58   };
59  
# Line 61 | Line 63 | string write_mc_or_data(bool is_data)
63    return "MC";
64   }
65  
66 + 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   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;
# Line 72 | Line 80 | sample::sample(string m_filename, string
80    this->groupindex=m_groupindex;
81    this->is_active=true;
82    this->samplecolor=mycolor;
83 +  this->weightrenormalization=1.0;
84    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.";
# Line 81 | Line 90 | sample::sample(string m_filename, string
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 <    Int_t currlevel=gErrorIgnoreLevel;
94 <    gErrorIgnoreLevel=5000;
93 > //    Int_t currlevel=gErrorIgnoreLevel;
94 > //     gErrorIgnoreLevel=5000;
95      this->tfile = new TFile(m_filename.c_str());
96 <    gErrorIgnoreLevel=currlevel;
96 > //     gErrorIgnoreLevel=currlevel;
97      this->events=(TTree*)(this->tfile)->Get(treename.c_str());
98      if(Verbosity>0) dout << "The " << write_mc_or_data(is_data) << " file " << this->filename << " has been added successfully to the list of samples. " << endl;
99 <    long long measured_nevents=(this->events)->GetEntries();
100 <    if(((this->Nentries>1)||(this->Nentries==0))&measured_nevents!=this->Nentries) {
99 >    long long measured_nevents=(long)1;
100 >    TH1F *weight_histo = (TH1F*)(this->tfile)->Get("weight_histo");
101 >    float average_weight = 1.0;
102 >    if(weight_histo) {
103 >      //average_weight = weight_histo->Integral()/weight_histo->GetEntries();
104 >      measured_nevents = (long)weight_histo->GetEntries();
105 >    } else {
106 >      measured_nevents=(this->events)->GetEntries();
107 >    }
108 >
109 >    if(((this->Nentries>1)||(this->Nentries==0))&&measured_nevents!=this->Nentries) {
110        //special cases: m_Nentries=1 : we want to give each event the full weight (->scans!)
111        //               m_Nentries=0: detect the number of events and set the nevents automatically
112 +      //               m_Nentries<0: set manually (see below)
113  
114        stringstream warning;
115        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.";
116        if(m_Nentries>1) write_warning(__FUNCTION__,warning.str());
117        this->Nentries=measured_nevents;
118 +    } else if ( this->Nentries<0 ) {
119 +      this->Nentries = -this->Nentries;
120      }
121 <    this->weight=(xs/(float)Nentries);
121 >    if ( average_weight>0 ) {
122 >      this->weight=(xs/(float)Nentries)/average_weight;
123 >      this->weightrenormalization=(1.0/average_weight);
124 >    } else {
125 >      if(average_weight>0) {
126 >      this->weight=(xs/(float)Nentries)/average_weight;
127 >      this->weightrenormalization=(1.0/average_weight);
128 >      } else {
129 >        this->weight = (xs/(float)Nentries);
130 >        this->weightrenormalization=1;
131 >      }
132 >    }
133 >      
134    }
135    else {
136      this->is_active=false;
# Line 119 | Line 152 | void sample::closeFile()
152   bool doesROOTFileExist(string filename)
153   {
154    //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)
155 <  Int_t currlevel=gErrorIgnoreLevel;
156 <  gErrorIgnoreLevel=5000;
155 > //   Int_t currlevel=gErrorIgnoreLevel;
156 > //   gErrorIgnoreLevel=5000;
157    TFile *f = new TFile(filename.c_str());
158    
159    if (f->IsZombie()) {
# Line 128 | Line 161 | bool doesROOTFileExist(string filename)
161      return 0;
162    }
163    f->Close();
164 <  gErrorIgnoreLevel=currlevel;
164 > //   gErrorIgnoreLevel=currlevel;
165    return 1;
166   }
167   //********************************************************
# Line 136 | Line 169 | bool doesROOTFileExist(string filename)
169   TCut essentialcut("mll>0");
170   // The following cut (cutWeight) will reweight all the events: use "weight" to correct MC for pileUP, "1.0" otherwise
171   TCut cutWeight("weight");
172 + //TCut cutWeight("(weight*(((id1==id2&&id1==0)*1.2)+((id1==id2&&id1==1)/1.2)+(id1!=id2)))");
173  
174   void setessentialcut(TCut ess) {
175    essentialcut=ess;
# Line 169 | Line 203 | public:
203    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);
204    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);
205    vector<int> FindSample(string what);
206 +  vector<int> FindSampleBySampleName(string what);
207    void ListSamples();
208    bool do_sample(int thissample, vector<int> &selected_samples);
209    Color_t GetColor(string filename);
# Line 196 | Line 231 | void samplecollection::ListSamples()
231    dout << "Listing all " << this->nsamples << " sample(s) of the sample collection called " << this->name << " : " << endl;
232    if(this->ndatasamples>0) {
233      dout << "Data sample(s): " << endl;
234 <    for (int isamp=0;isamp<this->collection.size();isamp++)
234 >    for (int isamp=0;isamp<(int)this->collection.size();isamp++)
235        {
236          if((this->collection)[isamp].is_data) dout << " - " << (this->collection)[isamp].samplename << " from " << (this->collection)[isamp].filename << endl;
237        }
238    }
239    if(this->nmcsamples>0) {
240      dout << "MC sample(s): " << endl;
241 <    for (int isamp=0;isamp<this->collection.size();isamp++)
241 >    for (int isamp=0;isamp<(int)this->collection.size();isamp++)
242        {
243          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;
244        }
# Line 214 | Line 249 | void samplecollection::ListSamples()
249   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)
250   {
251    sample NewSample(m_filename,m_samplename,m_Nentries,m_xs,is_data,m_is_signal,groupindex,newcolor);
252 +  if (!NewSample.is_active) {
253 +    write_warning(__FUNCTION__,"Not adding this sample ("+m_filename+") as it has been declared inactive");
254 +    return;
255 +  }
256    (this->collection).push_back(NewSample);
257    if((this->collection).size()==1) {
258      this->nmcsamples=0;
# Line 230 | Line 269 | void samplecollection::AddSample(string
269   bool samplecollection::do_sample(int thissample, vector<int> &selected_samples)
270   {
271    bool drawit=false;
272 <  for(int isel=0;isel<selected_samples.size();isel++)
272 >  for(int isel=0;isel<(int)selected_samples.size();isel++)
273    {
274      if(selected_samples[isel]==thissample) {
275        drawit=true;
# Line 258 | Line 297 | TH1F* samplecollection::Draw(string m_hi
297    if(Verbosity>0) dout << endl << endl;
298    if(Verbosity>0) dout << "-------------------------------------------------------------------------------------" << endl;
299    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;
300 +  
301    if(HUSH==0) dout << "Drawing histo called " << m_histoname << "... " << endl;
302    bool do_only_selected_samples=false;
303    if(onlyindex.size()>0&&onlyindex[0]!=-1) {
304      if(Verbosity>0) {dout << "Requested to only draw sample corresponding to the following sample(s) : " << endl;}
305 <    for(int is=0;is<onlyindex.size();is++) {
305 >    for(int is=0;is<(int)onlyindex.size();is++) {
306        if(Verbosity>0) dout << "   - " << (this->collection)[onlyindex[is]].filename << " (sample index: " << onlyindex[is] << ")" << endl;
307      }
308      do_only_selected_samples=true;
# Line 274 | Line 314 | TH1F* samplecollection::Draw(string m_hi
314    stringstream h_histoname;
315    h_histoname<<"h_"<<m_histoname;
316    float binningarray[binning.size()+1];
317 <  for(int i=0;i<binning.size();i++) {binningarray[i]=binning[i];}
317 >  for(int i=0;i<(int)binning.size();i++) {binningarray[i]=binning[i];}
318    TH1F *histo = new TH1F(m_histoname.c_str(),"",binning.size()-1,binningarray);
319    histo->Sumw2();
320    
# Line 294 | Line 334 | TH1F* samplecollection::Draw(string m_hi
334      TH1F *tempdrawhisto = new TH1F("tempdrawhisto","tempdrawhisto",binning.size()-1,binningarray);
335      tempdrawhisto->Sumw2();
336      if(use_this_sample) {
297      if(Verbosity>0) dout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << endl;
337        (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*cutWeight);//this weight is based on PU etc. not XS
338 + //        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;
339        if(addoverunderflowbins) {
340          //now also adding the overflow & underflow bins:
341          tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1)+tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()));
342          tempdrawhisto->SetBinError(tempdrawhisto->GetNbinsX(),TMath::Sqrt(tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX())));
343 <        tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0)+tempdrawhisto->GetBinContent(1));
344 <        tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
343 > //      tempdrawhisto->SetBinContent(1,tempdrawhisto->GetBinContent(0)+tempdrawhisto->GetBinContent(1));
344 > //      tempdrawhisto->SetBinError(1,TMath::Sqrt(tempdrawhisto->GetBinContent(1)));
345 >        // Delete over- and under-flow bins
346 >        tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX()+1,0);
347 > //        tempdrawhisto->SetBinContent(0,0);
348        }
349  
350        if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));//weight applied here is XS & N(entries)
351 +      if(Verbosity>0) dout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << ": " <<tempdrawhisto->Integral() << endl;
352        histo->Add(tempdrawhisto);
353      }
354      tempdrawhisto->Delete();
# Line 334 | Line 378 | TH2F* samplecollection::Draw(string m_hi
378    bool do_only_selected_samples=false;
379    if(onlyindex.size()>0&&onlyindex[0]!=-1) {
380      if(Verbosity>0) {dout << "Requested to only draw sample corresponding to the following sample(s) : " << endl;}
381 <    for(int is=0;is<onlyindex.size();is++) {
381 >    for(int is=0;is<(int)onlyindex.size();is++) {
382        if(Verbosity>0) dout << "   - " << (this->collection)[onlyindex[is]].filename << " (sample index: " << onlyindex[is] << ")" << endl;
383      }
384      do_only_selected_samples=true;
# Line 347 | Line 391 | TH2F* samplecollection::Draw(string m_hi
391    h_histoname<<"h_"<<m_histoname;
392    float binningarray[binningx.size()+1];
393    float binningyarray[binningy.size()+1];
394 <  for(int i=0;i<binningx.size();i++) {binningarray[i]=binningx[i];binningyarray[i]=binningy[i];}
395 <  TH2F *histo = new TH2F(m_histoname.c_str(),"",binningx.size()-1,binningarray,binningy.size(),binningyarray);
394 >  for(int i=0;i<(int)binningx.size();i++) {binningarray[i]=binningx[i];binningyarray[i]=binningy[i];}
395 >  TH2F *histo = new TH2F(m_histoname.c_str(),"",binningx.size()-1,binningarray,binningy.size()-1,binningyarray);
396    histo->Sumw2();
397    
398    stringstream drawthis;
# Line 369 | Line 413 | TH2F* samplecollection::Draw(string m_hi
413      if(use_this_sample) {
414        if(Verbosity>0) dout << "[samplecollection::Draw] : Added contribution from sample " << (this->collection)[isample].samplename << endl;
415        (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*cutWeight);//this weight is based on PU etc. not XS
416 + //       cout << "About to draw : " << drawthis.str() << "  with cut   " << (const char*) (essentialcut&&Cut)*cutWeight << endl;
417        if(addoverunderflowbins) {
418          //now also adding the overflow & underflow bins:
419          tempdrawhisto->SetBinContent(tempdrawhisto->GetNbinsX(),tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()+1)+tempdrawhisto->GetBinContent(tempdrawhisto->GetNbinsX()));
# Line 399 | Line 444 | TH1F* samplecollection::Draw(string m_hi
444    {
445      binning.push_back(((float)(m_maxx-m_minx)/((float)m_nbins))*i+m_minx);
446    }
447 <  
447 >
448    TH1F *histo = this->Draw(m_histoname,m_var, binning, m_xlabel, m_ylabel, Cut, m_is_data, luminosity, onlyindex,drawsignal);
449    return histo;
450    }
# Line 417 | Line 462 | THStack samplecollection::DrawStack(stri
462    for(int ih=0;ih<=this->ngroups;ih++) bookedhistos[ih]=0;
463    
464    float binningarray[binning.size()+1];
465 <  for(int i=0;i<binning.size();i++) {binningarray[i]=binning[i];}
465 >  for(int i=0;i<(int)binning.size();i++) {binningarray[i]=binning[i];}
466    
467    for (unsigned int isample=0;isample<(this->collection).size();isample++) {
468      if(!drawsignal&&(this->collection)[isample].is_signal) continue;
469      if((this->collection)[isample].is_active&&(this->collection)[isample].is_data==m_is_data) {//fills mc if we want mc, else fills data.
470        TH1F *tempdrawhisto = new TH1F("tempdrawhisto","",binning.size()-1,binningarray);
471 +      tempdrawhisto->Sumw2();
472        (this->collection)[isample].events->Draw(drawthis.str().c_str(),(essentialcut&&Cut)*cutWeight);
473        
474        if(addoverunderflowbins) {
# Line 436 | Line 482 | THStack samplecollection::DrawStack(stri
482        if(!(this->collection)[isample].is_data) tempdrawhisto->Scale(luminosity*((this->collection)[isample].weight));
483        tempdrawhisto->SetFillColor(this->GetColor(isample));
484        if(bookedhistos[(this->collection)[isample].groupindex]==0) {
485 <        tempdrawhisto->SetName(GetNumericHistoName().c_str());
485 >        tempdrawhisto->SetName((removefunnystring((this->collection)[isample].samplename)+"__"+GetNumericHistoName()).c_str());
486          histogroups[(this->collection)[isample].groupindex]=(TH1F*)tempdrawhisto->Clone();
487          bookedhistos[(this->collection)[isample].groupindex]=1;
488        }
# Line 465 | Line 511 | THStack samplecollection::DrawStack(stri
511      thestack.Add(histogroups[ordered_indices[index]]);
512    }
513    */
514 <  for(int index=0;index<ordered_indices.size();index++) {
514 >  for(int index=0;index<(int)ordered_indices.size();index++) {
515      thestack.Add(histogroups[ordered_indices[index]]);
516    }
517    return thestack;
# Line 500 | Line 546 | vector<int> samplecollection::FindSample
546    return hitcollection;
547   }
548  
549 + vector<int> samplecollection::FindSampleBySampleName(string what)
550 + {
551 +  vector<int> hitcollection;
552 +  for(unsigned int isam=0;isam<(this->collection).size();isam++)
553 +  {
554 +    if(((this->collection)[isam].samplename).find(what)!=string::npos) {
555 +      hitcollection.push_back(isam);
556 +    } else {
557 +    }
558 +  }
559 +  if(hitcollection.size()==0) {
560 +    hitcollection.push_back(-1);
561 +    write_warning(__FUNCTION__,"Couldn't find sample "+string(what)+" using sample collection \""+string(this->name)+"\"");
562 +  }
563 +  return hitcollection;
564 + }
565 +
566   Color_t samplecollection::GetColor(string filename) {
567    vector<int> corresponding_samples = this->FindSample(filename);
568    if(corresponding_samples.size()>0) return this->GetColor(corresponding_samples[0]);
# Line 514 | Line 577 | TLegend* samplecollection::allbglegend(s
577   //  TLegend *leg = new TLegend(0.65,0.60,0.89,0.77);
578    TLegend *leg = new TLegend(posx,posy,0.89,0.89);
579    if(title!="") leg->SetHeader(title.c_str());
580 <  if(data->GetName()!="nothing") leg->AddEntry(data,"Data","p");
580 >  if(data->GetName()!="nothing") leg->AddEntry(data,"Data","lp");
581    leg->SetFillColor(kWhite);
582    leg->SetBorderSize(0);
583    leg->SetLineColor(kWhite);
584    
585 <  TH1F *fakehistos[(this->collection).size()];
586 <  bool donealready[(this->collection).size()];
587 <  for(int i=0;i<(this->collection).size();i++) donealready[i]=false;
588 <  for(int isample=0;isample<(this->collection).size();isample++) {
585 >  int maxIgroup=0;
586 >  for(int isample=0;isample<(int)(this->collection).size();isample++) {
587 >    if((this->collection)[isample].groupindex>maxIgroup) maxIgroup=(this->collection)[isample].groupindex;
588 >  }
589 >  maxIgroup++;
590 >  
591 >  TH1F *fakehistos[maxIgroup];
592 >  bool donealready[maxIgroup];
593 >  
594 >  for(int i=0;i<maxIgroup;i++) donealready[i]=false;
595 >  
596 >  for(int isample=0;isample<(int)(this->collection).size();isample++) {
597      if((this->collection)[isample].is_data||(this->collection)[isample].is_signal) continue;
527
598      if(!donealready[(this->collection)[isample].groupindex]) {
599 +      assert((this->collection)[isample].groupindex<maxIgroup);
600      fakehistos[(this->collection)[isample].groupindex] = new TH1F(GetNumericHistoName().c_str(),"",1,0,1);
601      fakehistos[(this->collection)[isample].groupindex]->Fill(1);
602      fakehistos[(this->collection)[isample].groupindex]->SetFillColor(this->GetColor(isample));
603      leg->AddEntry(fakehistos[(this->collection)[isample].groupindex],((this->collection)[isample].samplename).c_str(),"f");
604      donealready[(this->collection)[isample].groupindex]=true;
605 +    PlottingSetup::FakeHistoHeap.push_back(fakehistos[(this->collection)[isample].groupindex]);
606      }
607    }
608    DrawPrelim();
# Line 539 | Line 611 | TLegend* samplecollection::allbglegend(s
611   }
612  
613   TLegend* samplecollection::allbglegend(string title="",float posx=0.65, float posy=0.60) {
614 <  Int_t currlevel=gErrorIgnoreLevel;
615 <  gErrorIgnoreLevel=5000;
614 > //   Int_t currlevel=gErrorIgnoreLevel;
615 > //   gErrorIgnoreLevel=5000;
616    TH1F *blub = new TH1F("nothing","nothing",1,0,1);
617 <  gErrorIgnoreLevel=currlevel;//we know this possibly replaces a previous histo, but we don't care since it's fake anyway.
618 <  return this->allbglegend(title,blub,posx,posy);
617 > //   gErrorIgnoreLevel=currlevel;//we know this possibly replaces a previous histo, but we don't care since it's fake anyway.
618 >  TLegend *leg = this->allbglegend(title,blub,posx,posy);
619 >  delete blub;
620 >  return leg;
621   }
622  
623  
# Line 605 | Line 679 | void samplecollection::PickUpFromThisFil
679   void samplecollection::PickUpEvents(string cut) {
680    vector<string> output;
681    vector<string> pickupfile;
682 <  for (int isamp=0;isamp<this->collection.size();isamp++)
682 >  for (int isamp=0;isamp<(int)this->collection.size();isamp++)
683    {
684      if((this->collection)[isamp].is_data) {
685        //we have a data sample !

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines