/[PAMELA software]/PamCut/Collections/EffCollection/EffCollection.cpp
ViewVC logotype

Diff of /PamCut/Collections/EffCollection/EffCollection.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by pam-fi, Fri Aug 14 10:32:22 2009 UTC revision 1.9 by pam-fi, Wed Oct 28 17:47:15 2009 UTC
# Line 8  Line 8 
8  /*! @file EffCollection.cpp The EffCollection class implementation file. */  /*! @file EffCollection.cpp The EffCollection class implementation file. */
9    
10  #include "EffCollection.h"  #include "EffCollection.h"
11    #include "TGraphAsymmErrors.h"
12    
13  EffCollection::EffCollection(const char *collectionName, TString outFileBase) :  extern "C" {
14    VerboseCollection(collectionName), _selCollection("selCollection"), _detCollection("detCollection"), _outFileBase(  /*! @brief Fortran routine by Sergio Ricciarini which computes errors on the efficiency.
15        outFileBase), _det(0), _sel(0) {   *
16     * This routine has been developed to carefully evaluate the error bars on the efficiency,
17     * which must have a value between 0 and 1. See the appendix of Sergio's PhD thesis for more
18     * details.
19     * The important thing is that the computed efficiency will have the unphysical value 1.1
20     * if there are less than 8 events in the efficiency sample (eg., the sample used to compute the
21     * efficiency). This is necessary to have a reliable estimate of the errors.
22     *
23     * @param sel Pointer to an Int_t variable containing the number of events in the efficiency sample.
24     * @param det Pointer to an Int_t variable containing the number of events in the efficiency sample
25     *            which satisfied the set of cuts  for which the efficiency is being measured.
26     * @param eff Pointer to a Double_t variable where the computed efficiency will be returned.
27     * @param errLow Pointer to a Double_t variable where the length of the lower error bar will
28     *               be returned.
29     * @param errHigh Pointer to a Double_t variable where the length of the upper error bar will
30     *               be returned.
31     * @return Not clear at this point... ignore it.
32     */
33    bool efficiency_(Int_t* sel, Int_t* det, Double_t* eff, Double_t* errLow, Double_t* errHigh);
34    }
35    
36    EffCollection::EffCollection(const char *collectionName, TString outFileBase, int errMethod, bool owns) :
37      VerboseCollection(collectionName, false), _selCollection("selCollection",owns), _detCollection("detCollection",
38          owns), _outFileBase(outFileBase), _errMethod(errMethod), _det(0), _sel(0) {
39    
40  }  }
41    
42  void EffCollection::AddDetectorCut(PamCut &cut) {  void EffCollection::AddDetectorCut(PamCut *cut) {
43    _detCollection.AddCut(cut);    _detCollection.AddCut(cut);
44  }  }
45    
46  void EffCollection::AddSelectionCut(PamCut &cut) {  void EffCollection::AddSelectionCut(PamCut *cut) {
47    _selCollection.AddCut(cut);    _selCollection.AddCut(cut);
48  }  }
49    
50  void EffCollection::AddDetectorAction(CollectionAction &action) {  void EffCollection::AddDetectorAction(CollectionAction *action) {
51    _detCollection.AddAction(action);    _detCollection.AddAction(action);
52  }  }
53    
54  void EffCollection::AddSelectionAction(CollectionAction &action) {  void EffCollection::AddSelectionAction(CollectionAction *action) {
55    _selCollection.AddAction(action);    _selCollection.AddAction(action);
56  }  }
57    
# Line 55  void EffCollection::Finalize() { Line 79  void EffCollection::Finalize() {
79    // Now all the cuts are in place, and VerboseCollection can print its report    // Now all the cuts are in place, and VerboseCollection can print its report
80    VerboseCollection::Finalize();    VerboseCollection::Finalize();
81    
82    // Add some info about efficiency    // Compute the error
83    float eff;    Int_t sel = (Int_t) _sel;
84    if (_sel != 0.)    Int_t det = (Int_t) _det;
85      eff = (float)_det / (float)_sel;    Double_t eff, errLow, errHigh;
86    else    if (_errMethod == EFFERR_ROOT) {
87      eff = 0.;      if (sel < 8) {
88          eff = 1.1;
89          errLow = errHigh = 0.;
90        }
91        else {
92          TH1I pass("pass", "pass", 1, 0., 1.);
93          TH1I total("total", "total", 1, 0., 1.);
94          pass.Fill(0.5, det);
95          total.Fill(0.5, sel);
96          TGraphAsymmErrors errGraph;
97          errGraph.BayesDivide(&pass, &total);
98          Double_t dummy;
99          errGraph.GetPoint(0, dummy, eff);
100          errLow = errGraph.GetErrorYlow(0);
101          errHigh = errGraph.GetErrorYhigh(0);
102        }
103      }
104      if (_errMethod == EFFERR_SERGIO) {
105        efficiency_(&sel, &det, &eff, &errLow, &errHigh);
106      }
107    
108      // Add some info about efficiency to the stdout
109    cout << "    ****** Efficiency informations ******\n";    cout << "    ****** Efficiency informations ******\n";
110    cout << "    Detector cuts:\n";    cout << "    Detector cuts:\n";
111    for (unsigned int i = 0; i < _detCollection.GetSize(); i++)    for (unsigned int i = 0; i < _detCollection.GetSize(); i++)
112      cout << "      - " << _detCollection.GetCut(i)->GetName() << "\n";      cout << "      - " << _detCollection.GetCut(i)->GetName() << "\n";
113    cout << "    Total detector efficiency: " << eff << endl;    cout << "    Total detector efficiency: " << eff << " +" << errHigh << "-" << errLow << endl;
114    
115    // Write the output file    // Write the output file
116    if (_outFileBase != "") {    if (_outFileBase != "") {
117      ofstream outTextFile((_outFileBase + "-eff.txt").Data(), ios_base::out);  
118      outTextFile << _det << "    " << _sel << "    " << eff << endl;      ofstream outTextFile((_outFileBase + "-" + GetName() + ".txt").Data(), ios_base::out);
119        streamsize newPrec = 4;
120        outTextFile.precision(newPrec);
121        outTextFile.setf(ios::fixed, ios::floatfield);
122        outTextFile << setw(10) << det << setw(10) << sel << setw(10) << eff << setw(10) << errLow << setw(10) << errHigh
123            << endl;
124      outTextFile.close();      outTextFile.close();
125    }    }
126    

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.9

  ViewVC Help
Powered by ViewVC 1.1.23