ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/AnaFwkMod.cc
Revision: 1.6
Committed: Thu Mar 12 15:37:53 2009 UTC (16 years, 2 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.5: +53 -7 lines
Log Message:
Deal with skimmed event headers.

File Contents

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