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

Contents of /PamCut/Collections/EffCollection/EffCollection.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (show annotations) (download)
Wed Jan 27 15:59:10 2010 UTC (14 years, 10 months ago) by pam-fi
Branch: MAIN
Changes since 1.9: +19 -1 lines
Bug in actions handling fixed.

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 #include "TGraphAsymmErrors.h"
12
13 extern "C" {
14 /*! @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 }
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) {
43 _detCollection.AddCut(cut);
44 }
45
46 void EffCollection::AddSelectionCut(PamCut *cut) {
47 _selCollection.AddCut(cut);
48 }
49
50 void EffCollection::AddDetectorAction(CollectionAction *action) {
51 _detCollection.AddAction(action);
52 }
53
54 void EffCollection::AddSelectionAction(CollectionAction *action) {
55 _selCollection.AddAction(action);
56 }
57
58 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 // We cal lalso base class' Setup(), which will likely do nothing since _sel and _det are empty.
66 VerboseCollection::Setup(events);
67
68 }
69
70 int EffCollection::ApplyCut(PamLevel2 *event) {
71
72 _nEv++;
73 if (_selCollection.ApplyCut(event) == CUTOK) {
74 _sel++;
75 if (_detCollection.ApplyCut(event) == CUTOK) {
76 _det++;
77 _nGood++;
78 return CUTOK;
79 }
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 for (unsigned int i = 0; i < _selCollection.GetActionsSize(); i++)
90 _actions.push_back(_selCollection.GetAction(i));
91 for (unsigned int i = 0; i < _detCollection.GetSize(); i++)
92 _cuts.push_back(_detCollection.GetCut(i));
93 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 VerboseCollection::Finalize();
99
100 // Compute the error
101 Int_t sel = (Int_t) _sel;
102 Int_t det = (Int_t) _det;
103 Double_t eff, errLow, errHigh;
104 if (_errMethod == EFFERR_ROOT) {
105 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 if (_errMethod == EFFERR_SERGIO) {
123 efficiency_(&sel, &det, &eff, &errLow, &errHigh);
124 }
125
126 // Add some info about efficiency to the stdout
127 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 cout << " Total detector efficiency: " << eff << " +" << errHigh << "-" << errLow << endl;
132
133 // Write the output file
134 if (_outFileBase != "") {
135
136 ofstream outTextFile((_outFileBase + "-" + GetName() + ".txt").Data(), ios_base::out);
137 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 outTextFile.close();
143 }
144
145 }

  ViewVC Help
Powered by ViewVC 1.1.23