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

Annotation of /PamCut/Collections/EffCollection/EffCollection.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (hide annotations) (download)
Tue Mar 23 17:27:39 2010 UTC (14 years, 8 months ago) by pam-fi
Branch: MAIN
CVS Tags: Root_V8, MergedToHEAD_1, nuclei_reproc, MergedFromV8_1, BeforeMergingFromV8_1
Branch point for: V8
Changes since 1.10: +1 -1 lines
Documentation updated.

1 pam-fi 1.1 /*
2     * EffCollection.cpp
3     *
4     * Created on: 10/ago/2009
5     * Author: Nicola Mori
6     */
7    
8     /*! @file EffCollection.cpp The EffCollection class implementation file. */
9    
10     #include "EffCollection.h"
11 pam-fi 1.6 #include "TGraphAsymmErrors.h"
12 pam-fi 1.1
13 pam-fi 1.5 extern "C" {
14 pam-fi 1.8 /*! @brief Fortran routine by Sergio Ricciarini which computes errors on the efficiency.
15     *
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 pam-fi 1.5 }
35    
36 pam-fi 1.8 EffCollection::EffCollection(const char *collectionName, TString outFileBase, int errMethod, bool owns) :
37 pam-fi 1.9 VerboseCollection(collectionName, false), _selCollection("selCollection",owns), _detCollection("detCollection",
38     owns), _outFileBase(outFileBase), _errMethod(errMethod), _det(0), _sel(0) {
39 pam-fi 1.1
40     }
41    
42 pam-fi 1.8 void EffCollection::AddDetectorCut(PamCut *cut) {
43 pam-fi 1.1 _detCollection.AddCut(cut);
44     }
45    
46 pam-fi 1.8 void EffCollection::AddSelectionCut(PamCut *cut) {
47 pam-fi 1.1 _selCollection.AddCut(cut);
48     }
49    
50 pam-fi 1.8 void EffCollection::AddDetectorAction(CollectionAction *action) {
51 pam-fi 1.1 _detCollection.AddAction(action);
52     }
53    
54 pam-fi 1.8 void EffCollection::AddSelectionAction(CollectionAction *action) {
55 pam-fi 1.1 _selCollection.AddAction(action);
56     }
57    
58 pam-fi 1.10 void EffCollection::Setup(PamLevel2 *events){
59     // Base class have a single vector for cuts and another for actions. Here the cuts and actions
60     // are not contained inside these vectors but rather inside two SmartCollection object members.
61     // So we must call their Setup().
62     _selCollection.Setup(events);
63     _detCollection.Setup(events);
64    
65 pam-fi 1.11 // We call also base class' Setup(), which will likely do nothing since _sel and _det are empty.
66 pam-fi 1.10 VerboseCollection::Setup(events);
67    
68     }
69    
70 pam-fi 1.1 int EffCollection::ApplyCut(PamLevel2 *event) {
71    
72 pam-fi 1.3 _nEv++;
73     if (_selCollection.ApplyCut(event) == CUTOK) {
74     _sel++;
75     if (_detCollection.ApplyCut(event) == CUTOK) {
76     _det++;
77     _nGood++;
78     return CUTOK;
79 pam-fi 1.1 }
80     }
81    
82     return 0;
83     }
84    
85     void EffCollection::Finalize() {
86     // Let's add all the cuts to the vector of the collection before calling VerboseCollection::Finalize
87     for (unsigned int i = 0; i < _selCollection.GetSize(); i++)
88     _cuts.push_back(_selCollection.GetCut(i));
89 pam-fi 1.10 for (unsigned int i = 0; i < _selCollection.GetActionsSize(); i++)
90     _actions.push_back(_selCollection.GetAction(i));
91 pam-fi 1.1 for (unsigned int i = 0; i < _detCollection.GetSize(); i++)
92     _cuts.push_back(_detCollection.GetCut(i));
93 pam-fi 1.10 for (unsigned int i = 0; i < _detCollection.GetActionsSize(); i++)
94     _actions.push_back(_detCollection.GetAction(i));
95    
96     // Now all the cuts and actions are in place, and VerboseCollection can print its report and call Finalize() for
97     // every cut and action (calling SmartCollection::Finalize().
98 pam-fi 1.1 VerboseCollection::Finalize();
99 pam-fi 1.3
100 pam-fi 1.5 // Compute the error
101     Int_t sel = (Int_t) _sel;
102     Int_t det = (Int_t) _det;
103     Double_t eff, errLow, errHigh;
104 pam-fi 1.7 if (_errMethod == EFFERR_ROOT) {
105 pam-fi 1.6 if (sel < 8) {
106     eff = 1.1;
107     errLow = errHigh = 0.;
108     }
109     else {
110     TH1I pass("pass", "pass", 1, 0., 1.);
111     TH1I total("total", "total", 1, 0., 1.);
112     pass.Fill(0.5, det);
113     total.Fill(0.5, sel);
114     TGraphAsymmErrors errGraph;
115     errGraph.BayesDivide(&pass, &total);
116     Double_t dummy;
117     errGraph.GetPoint(0, dummy, eff);
118     errLow = errGraph.GetErrorYlow(0);
119     errHigh = errGraph.GetErrorYhigh(0);
120     }
121     }
122 pam-fi 1.7 if (_errMethod == EFFERR_SERGIO) {
123 pam-fi 1.6 efficiency_(&sel, &det, &eff, &errLow, &errHigh);
124     }
125 pam-fi 1.5
126     // Add some info about efficiency to the stdout
127 pam-fi 1.2 cout << " ****** Efficiency informations ******\n";
128     cout << " Detector cuts:\n";
129     for (unsigned int i = 0; i < _detCollection.GetSize(); i++)
130     cout << " - " << _detCollection.GetCut(i)->GetName() << "\n";
131 pam-fi 1.5 cout << " Total detector efficiency: " << eff << " +" << errHigh << "-" << errLow << endl;
132 pam-fi 1.1
133 pam-fi 1.3 // Write the output file
134 pam-fi 1.1 if (_outFileBase != "") {
135 pam-fi 1.5
136 pam-fi 1.7 ofstream outTextFile((_outFileBase + "-" + GetName() + ".txt").Data(), ios_base::out);
137 pam-fi 1.5 streamsize newPrec = 4;
138     outTextFile.precision(newPrec);
139     outTextFile.setf(ios::fixed, ios::floatfield);
140     outTextFile << setw(10) << det << setw(10) << sel << setw(10) << eff << setw(10) << errLow << setw(10) << errHigh
141     << endl;
142 pam-fi 1.1 outTextFile.close();
143     }
144    
145     }

  ViewVC Help
Powered by ViewVC 1.1.23