ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/AnaFwkMod.cc
Revision: 1.24
Committed: Tue Aug 27 14:13:15 2013 UTC (11 years, 8 months ago) by bendavid
Content type: text/plain
Branch: MAIN
Changes since 1.23: +2 -1 lines
Log Message:
fix missing reqbranch

File Contents

# User Rev Content
1 bendavid 1.24 // $Id: AnaFwkMod.cc,v 1.23 2013/08/26 22:43:59 bendavid Exp $
2 loizides 1.1
3     #include "MitAna/TreeMod/interface/AnaFwkMod.h"
4     #include "MitAna/DataUtil/interface/Debug.h"
5 loizides 1.6 #include "MitAna/DataTree/interface/Names.h"
6 bendavid 1.16 #include "MitAna/DataTree/interface/PileupInfo.h"
7 loizides 1.4 #include <TFile.h>
8 loizides 1.1 #include <TH1D.h>
9 bendavid 1.16 #include <TH3D.h>
10 loizides 1.1 #include <TStopwatch.h>
11 loizides 1.4 #include <TTree.h>
12 loizides 1.1
13     using namespace mithep;
14    
15     ClassImp(mithep::AnaFwkMod)
16    
17     //--------------------------------------------------------------------------------------------------
18     AnaFwkMod::AnaFwkMod(const char *name, const char *title) :
19     BaseMod(name,title),
20 loizides 1.6 fAllHeadTreeName(Names::gkAllEvtTreeName),
21     fAllHeadBrName(Names::gkAllEvtHeaderBrn),
22 loizides 1.8 fSkipNEvents(0),
23 loizides 1.13 fPrintScale(1),
24 loizides 1.1 fSWtotal(0),
25 loizides 1.4 fSWevent(0),
26 loizides 1.6 fAllHeaders(0,Names::gkSkimmedHeaders),
27 loizides 1.4 fAllHeadTree(0),
28     fAllEventHeader(0),
29     fReload(kFALSE),
30 loizides 1.6 fCurEnt(-2),
31 loizides 1.8 fNEventsSkimmed(0),
32 bendavid 1.16 fNEventsSkipped(0),
33     fPileupInfoName("PileupInfo"),
34     fDoPUInfo(kFALSE),
35     hNPU(0),
36 ceballos 1.19 hNPU50ns(0),
37 bendavid 1.23 hNPUTrue(0),
38     fMCEventInfo(0),
39     fMCEventInfoName(Names::gkMCEvtInfoBrn),
40     hDTotalMCWeight(0)
41 loizides 1.1 {
42     // Constructor.
43     }
44    
45     //--------------------------------------------------------------------------------------------------
46 loizides 1.4 void AnaFwkMod::BeginRun()
47     {
48     // Get HLT tree and set branches if new file was opened. Read next entry in HLT key
49     // depending on entry in RunInfo.
50    
51     if (fReload) {
52     // reset to be (re-)loaded variables
53     fReload = 0;
54     fAllHeadTree = 0;
55     fAllEventHeader = 0;
56     fCurEnt = 0;
57    
58     // get current file
59     TFile *file = GetCurrentFile();
60     if (!file)
61     return;
62    
63 loizides 1.10 // get all event header tree
64 loizides 1.4 fAllHeadTree = dynamic_cast<TTree*>(file->Get(fAllHeadTreeName));
65     if (!fAllHeadTree) {
66 loizides 1.6 SendError(kWarning, "BeginRun",
67 loizides 1.9 "Cannot find tree '%s' in file '%s'",
68 loizides 1.6 fAllHeadTreeName.Data(),file->GetName());
69 loizides 1.4 return;
70     }
71    
72 loizides 1.10 // get all event header branch
73     if (fAllHeadTree->GetBranch(fAllHeadBrName)) {
74     fAllHeadTree->SetBranchAddress(fAllHeadBrName, &fAllEventHeader);
75     } else {
76     SendError(kWarning, "BeginRun",
77     "Cannot find branch '%s' in tree '%s'",
78     fAllHeadBrName.Data(), fAllHeadTreeName.Data());
79     return;
80     }
81 loizides 1.4 }
82     }
83    
84     //--------------------------------------------------------------------------------------------------
85     void AnaFwkMod::CopyAllEventHeaders()
86     {
87     // Deal with the headers from all events if needed.
88    
89     fAllHeaders.Reset();
90    
91     const EventHeader *curev = GetEventHeader();
92     if (!curev) {
93 loizides 1.9 SendError(kWarning, "CopyAllEventHeaders", "Cannot obtain current event");
94 loizides 1.4 return;
95     }
96    
97     if (fAllHeadTree) {
98 loizides 1.6 const Int_t nemax = fAllHeadTree->GetEntries();
99     if (fCurEnt == nemax) {
100     SendError(kAbortEvent, "CopyAllEventHeaders",
101     "End of all events tree reached (%d=%d)", fCurEnt, nemax);
102     return;
103     }
104 loizides 1.4 fAllHeadTree->GetEntry(fCurEnt++);
105 paus 1.17 while (fCurEnt <= nemax && fAllEventHeader->Skimmed()) {
106 loizides 1.4 EventHeader *eh = fAllHeaders.AddNew();
107 paus 1.17 eh->SetRunNum (fAllEventHeader->RunNum());
108     eh->SetEvtNum (fAllEventHeader->EvtNum());
109     eh->SetLumiSec (fAllEventHeader->LumiSec());
110 loizides 1.5 eh->SetRunEntry(fAllEventHeader->RunEntry());
111 paus 1.17 eh->SetSkimmed (fAllEventHeader->Skimmed());
112 loizides 1.4 fAllHeadTree->GetEntry(fCurEnt++);
113     }
114 paus 1.17 if ((fAllEventHeader->RunNum() != curev->RunNum()) ||
115     (fAllEventHeader->EvtNum() != curev->EvtNum()) ||
116     (fAllEventHeader->LumiSec() != curev->LumiSec()) ||
117     (fAllEventHeader->RunEntry() != curev->RunEntry())) {
118 loizides 1.4 SendError(kWarning, "CopyAllEventHeaders",
119 loizides 1.6 "Event header information for entry %d inconsistent: "
120     "%d==%d, %d==%d, %d==%d, %d==%d",
121     fCurEnt,
122 loizides 1.4 fAllEventHeader->RunNum(), curev->RunNum(),
123     fAllEventHeader->EvtNum(), curev->EvtNum(),
124     fAllEventHeader->LumiSec(), curev->LumiSec(),
125     fAllEventHeader->RunEntry(), curev->RunEntry());
126     return;
127     }
128 loizides 1.6
129     // read-ahead to check if more events are coming
130     if (fCurEnt<nemax) {
131     Int_t testEnt = fCurEnt;
132     fAllHeadTree->GetEntry(testEnt++);
133 paus 1.17 while (testEnt<=nemax && fAllEventHeader->Skimmed())
134 loizides 1.6 fAllHeadTree->GetEntry(testEnt++);
135 loizides 1.7 if (testEnt==nemax+1) { // need to add remaining skimmed events
136 loizides 1.6 fAllHeadTree->GetEntry(fCurEnt++);
137 loizides 1.7 while(fCurEnt<=nemax) {
138 loizides 1.6 EventHeader *eh = fAllHeaders.AddNew();
139 paus 1.17 eh->SetRunNum (fAllEventHeader->RunNum());
140     eh->SetEvtNum (fAllEventHeader->EvtNum());
141     eh->SetLumiSec (fAllEventHeader->LumiSec());
142 loizides 1.6 eh->SetRunEntry(fAllEventHeader->RunEntry());
143 paus 1.17 eh->SetSkimmed (fAllEventHeader->Skimmed());
144 loizides 1.6 fAllHeadTree->GetEntry(fCurEnt++);
145     }
146 loizides 1.7 if (fCurEnt != nemax+1) {
147 loizides 1.6 SendError(kAbortEvent, "CopyAllEventHeaders",
148     "End of all events tree unexpectedly not reached (%d!=%d)", fCurEnt, nemax);
149     return;
150     }
151     }
152     }
153 loizides 1.4 }
154     }
155    
156     //--------------------------------------------------------------------------------------------------
157     Bool_t AnaFwkMod::Notify()
158     {
159     // Make sure to get the new "AllEvents" tree when the file changes.
160    
161     fReload = kTRUE;
162     return kTRUE;
163     }
164    
165     //--------------------------------------------------------------------------------------------------
166 loizides 1.1 void AnaFwkMod::Process()
167     {
168 loizides 1.8 // Do event skipping and counting and print out timing information.
169 loizides 1.1
170 loizides 1.8 // counting processed events
171     IncNEventsProcessed();
172 loizides 1.4
173 loizides 1.6 // get skimmed event headers
174     CopyAllEventHeaders();
175     fNEventsSkimmed += fAllHeaders.GetEntries();
176 loizides 1.4
177 loizides 1.8 // check if events should be skipped
178     if (fNEventsSkipped<fSkipNEvents) {
179     ++fNEventsSkipped;
180     MDB(kAnalysis, 3) {
181 bendavid 1.15 Info("Process", "Skipping (aborting) %d out of %lld first events.",
182 loizides 1.9 fNEventsSkipped, fSkipNEvents);
183 loizides 1.8 }
184     AbortEvent();
185     return;
186     }
187 loizides 1.1
188     // check if printout should be done
189 loizides 1.14 Bool_t doPrint = 0;
190     UInt_t nProcessed = fPrintScale;
191 loizides 1.1
192     MDB(kAnalysis, 4) {
193 loizides 1.12 if (GetNEventsProcessed() % (fPrintScale) == 0)
194 loizides 1.1 doPrint = 1;
195     } else {
196     MDB(kAnalysis, 3) {
197 loizides 1.12 if (GetNEventsProcessed() % (fPrintScale*10) == 0)
198 loizides 1.1 doPrint = 1;
199 loizides 1.14 nProcessed = fPrintScale*10;
200 loizides 1.1 } else {
201     MDB(kAnalysis, 2) {
202 loizides 1.12 if (GetNEventsProcessed() % (fPrintScale*100) == 0)
203 loizides 1.1 doPrint = 1;
204 loizides 1.14 nProcessed = fPrintScale*100;
205 loizides 1.1 } else {
206     MDB(kAnalysis, 1) {
207 loizides 1.12 if (GetNEventsProcessed() % (fPrintScale*1000) == 0)
208 loizides 1.1 doPrint = 1;
209 loizides 1.14 nProcessed = fPrintScale*1000;
210 loizides 1.1 }
211     }
212     }
213     }
214    
215 bendavid 1.16 if (GetEventHeader()->IsMC()) {
216     LoadBranch(fPileupInfoName);
217 ceballos 1.21 Double_t npu[4] = {0.,0.,0.,0.};
218 bendavid 1.16 for (UInt_t i=0; i<fPileupInfo->GetEntries(); ++i) {
219     const PileupInfo *puinfo = fPileupInfo->At(i);
220     if (puinfo->GetBunchCrossing()==0) npu[0]= puinfo->GetPU_NumInteractions();
221     else if (puinfo->GetBunchCrossing()==-1) npu[1] = puinfo->GetPU_NumInteractions();
222     else if (puinfo->GetBunchCrossing()==1) npu[2] = puinfo->GetPU_NumInteractions();
223 ceballos 1.19 if (puinfo->GetBunchCrossing()==0) npu[3]= puinfo->GetPU_NumMean();
224 bendavid 1.16 }
225     hNPU->Fill(npu[0]);
226     hNPU50ns->Fill(npu[0],npu[1],npu[2]);
227 ceballos 1.19 hNPUTrue->Fill(npu[3]);
228 bendavid 1.23
229     LoadBranch(fMCEventInfoName);
230     hDTotalMCWeight->Fill(0., fMCEventInfo->Weight());
231    
232 bendavid 1.16 }
233    
234    
235 loizides 1.1 if (doPrint) {
236     fSWevent->Stop();
237 loizides 1.9 Info("Process",
238     "Events %d -> %.2gs real, %.2gs cpu (%.2g real, %.2g cpu per event)",
239     GetNEventsProcessed(), fSWevent->RealTime(), fSWevent->CpuTime(),
240 loizides 1.14 fSWevent->RealTime()/nProcessed,
241     fSWevent->CpuTime()/nProcessed);
242 loizides 1.1 fSWevent->Start();
243 bendavid 1.16 }
244    
245    
246 loizides 1.1 }
247    
248     //--------------------------------------------------------------------------------------------------
249     void AnaFwkMod::SlaveBegin()
250     {
251     // Book our histogram and start the stop watches.
252    
253     fSWtotal = new TStopwatch;
254     fSWevent = new TStopwatch;
255 loizides 1.4
256     if (!PublishObj(&fAllHeaders)) {
257     SendError(kAbortAnalysis, "SlaveBegin",
258     "Could not publish all event headers with name %s.", fAllHeaders.GetName());
259     return;
260     }
261 bendavid 1.16
262     ReqBranch(fPileupInfoName, fPileupInfo);
263 bendavid 1.24 ReqBranch(fMCEventInfoName, fMCEventInfo);
264 bendavid 1.16
265 bendavid 1.18 hNPU = new TH1D("hNPU", "hNPU", 201, -0.5, 200.5);
266 bendavid 1.16 AddOutput(hNPU);
267    
268 bendavid 1.18 hNPU50ns = new TH3D("hNPU50ns", "hNPU50ns", 201, -0.5, 200.5, 201, -0.5, 200.5, 201, -0.5, 200.5);
269 bendavid 1.16 AddOutput(hNPU50ns);
270    
271 ceballos 1.22 hNPUTrue = new TH1D("hNPUTrue", "hNPUTrue", 2000, 0.0, 200.0);
272 ceballos 1.19 AddOutput(hNPUTrue);
273    
274 bendavid 1.23 hDTotalMCWeight = new TH1D("hDTotalMCWeight","hDTotalMCWeight",1,-0.5,0.5);
275     AddOutput(hDTotalMCWeight);
276    
277 loizides 1.1 }
278    
279     //--------------------------------------------------------------------------------------------------
280     void AnaFwkMod::SlaveTerminate()
281     {
282     // Fill event histogram and printout timing information.
283    
284 loizides 1.4 RetractObj(fAllHeaders.GetName());
285    
286 loizides 1.3 SaveNEventsProcessed();
287 loizides 1.6 TH1D *hDAllEvents = new TH1D("hDAllEvents","Sum of processed and skimmed events",1,-0.5,0.5);
288     hDAllEvents->Fill(0.0,fNEventsSkimmed+GetNEventsProcessed());
289     hDAllEvents->SetEntries(fNEventsSkimmed+GetNEventsProcessed());
290     AddOutput(hDAllEvents);
291 loizides 1.1
292 loizides 1.8 TH1D *hDSkippedEvents = new TH1D("hDSkippedEvents","Number of skipped events",1,-0.5,0.5);
293     hDSkippedEvents->Fill(0.0,fNEventsSkipped);
294     hDSkippedEvents->SetEntries(fNEventsSkipped);
295     AddOutput(hDSkippedEvents);
296    
297 loizides 1.1 fSWtotal->Stop();
298     fSWevent->Stop();
299    
300     MDB(kAnalysis, 1)
301 loizides 1.9 Info("SlaveTerminate",
302     "Events %d -> %.2gs real, %.2gs cpu (%.2gs real, %.2gs cpu per event)",
303     GetNEventsProcessed(), fSWtotal->RealTime(), fSWtotal->CpuTime(),
304     fSWtotal->RealTime()/GetNEventsProcessed(),
305     fSWtotal->CpuTime()/GetNEventsProcessed());
306 loizides 1.1
307     delete fSWtotal;
308     delete fSWevent;
309     }