ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/AnaFwkMod.cc
Revision: 1.10
Committed: Sat Mar 28 14:39:56 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_009c, Mit_009b, Mit_009a, Mit_009
Changes since 1.9: +11 -11 lines
Log Message:
Bugfix: Setup all event tree/branch only when file changed.

File Contents

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