ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/AnaFwkMod.cc
Revision: 1.19
Committed: Sat Sep 22 07:55:22 2012 UTC (12 years, 7 months ago) by ceballos
Content type: text/plain
Branch: MAIN
Changes since 1.18: +9 -3 lines
Log Message:
adding true PU

File Contents

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