ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/AnaFwkMod.cc
Revision: 1.11
Committed: Wed Jun 17 16:58:44 2009 UTC (15 years, 10 months ago) by ceballos
Content type: text/plain
Branch: MAIN
Changes since 1.10: +4 -4 lines
Log Message:
renaming

File Contents

# User Rev Content
1 ceballos 1.11 // $Id: AnaFwkMod.cc,v 1.10 2009/03/28 14:39:56 loizides 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 loizides 1.4 #include <TFile.h>
7 loizides 1.1 #include <TH1D.h>
8     #include <TStopwatch.h>
9 loizides 1.4 #include <TTree.h>
10 loizides 1.1
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 loizides 1.6 fAllHeadTreeName(Names::gkAllEvtTreeName),
19     fAllHeadBrName(Names::gkAllEvtHeaderBrn),
20 loizides 1.8 fSkipNEvents(0),
21 loizides 1.1 fSWtotal(0),
22 loizides 1.4 fSWevent(0),
23 loizides 1.6 fAllHeaders(0,Names::gkSkimmedHeaders),
24 loizides 1.4 fAllHeadTree(0),
25     fAllEventHeader(0),
26     fReload(kFALSE),
27 loizides 1.6 fCurEnt(-2),
28 loizides 1.8 fNEventsSkimmed(0),
29     fNEventsSkipped(0)
30 loizides 1.1 {
31     // Constructor.
32     }
33    
34     //--------------------------------------------------------------------------------------------------
35 loizides 1.4 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 loizides 1.10 // get all event header tree
53 loizides 1.4 fAllHeadTree = dynamic_cast<TTree*>(file->Get(fAllHeadTreeName));
54     if (!fAllHeadTree) {
55 loizides 1.6 SendError(kWarning, "BeginRun",
56 loizides 1.9 "Cannot find tree '%s' in file '%s'",
57 loizides 1.6 fAllHeadTreeName.Data(),file->GetName());
58 loizides 1.4 return;
59     }
60    
61 loizides 1.10 // 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 loizides 1.4 }
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 loizides 1.9 SendError(kWarning, "CopyAllEventHeaders", "Cannot obtain current event");
83 loizides 1.4 return;
84     }
85    
86     if (fAllHeadTree) {
87 loizides 1.6 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 loizides 1.4 fAllHeadTree->GetEntry(fCurEnt++);
94 loizides 1.7 while(fCurEnt<=nemax && fAllEventHeader->Skimmed()) {
95 loizides 1.4 EventHeader *eh = fAllHeaders.AddNew();
96     eh->SetRunNum(fAllEventHeader->RunNum());
97     eh->SetEvtNum(fAllEventHeader->EvtNum());
98     eh->SetLumiSec(fAllEventHeader->LumiSec());
99 loizides 1.5 eh->SetRunEntry(fAllEventHeader->RunEntry());
100     eh->SetSkimmed(fAllEventHeader->Skimmed());
101 loizides 1.4 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 loizides 1.6 "Event header information for entry %d inconsistent: "
109     "%d==%d, %d==%d, %d==%d, %d==%d",
110     fCurEnt,
111 loizides 1.4 fAllEventHeader->RunNum(), curev->RunNum(),
112     fAllEventHeader->EvtNum(), curev->EvtNum(),
113     fAllEventHeader->LumiSec(), curev->LumiSec(),
114     fAllEventHeader->RunEntry(), curev->RunEntry());
115     return;
116     }
117 loizides 1.6
118     // read-ahead to check if more events are coming
119     if (fCurEnt<nemax) {
120     Int_t testEnt = fCurEnt;
121     fAllHeadTree->GetEntry(testEnt++);
122 loizides 1.7 while(testEnt<=nemax && fAllEventHeader->Skimmed())
123 loizides 1.6 fAllHeadTree->GetEntry(testEnt++);
124 loizides 1.7 if (testEnt==nemax+1) { // need to add remaining skimmed events
125 loizides 1.6 fAllHeadTree->GetEntry(fCurEnt++);
126 loizides 1.7 while(fCurEnt<=nemax) {
127 loizides 1.6 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 loizides 1.7 if (fCurEnt != nemax+1) {
136 loizides 1.6 SendError(kAbortEvent, "CopyAllEventHeaders",
137     "End of all events tree unexpectedly not reached (%d!=%d)", fCurEnt, nemax);
138     return;
139     }
140     }
141     }
142 loizides 1.4 }
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 loizides 1.1 void AnaFwkMod::Process()
156     {
157 loizides 1.8 // Do event skipping and counting and print out timing information.
158 loizides 1.1
159 loizides 1.8 // counting processed events
160     IncNEventsProcessed();
161 loizides 1.4
162 loizides 1.6 // get skimmed event headers
163     CopyAllEventHeaders();
164     fNEventsSkimmed += fAllHeaders.GetEntries();
165 loizides 1.4
166 loizides 1.8 // check if events should be skipped
167     if (fNEventsSkipped<fSkipNEvents) {
168     ++fNEventsSkipped;
169     MDB(kAnalysis, 3) {
170 loizides 1.9 Info("Process", "Skipping (aborting) %d out of %d first events.",
171     fNEventsSkipped, fSkipNEvents);
172 loizides 1.8 }
173     AbortEvent();
174     return;
175     }
176 loizides 1.1
177     // check if printout should be done
178     Bool_t doPrint = 0;
179    
180     MDB(kAnalysis, 4) {
181 ceballos 1.11 if (GetNEventsProcessed() % 100 == 0)
182 loizides 1.1 doPrint = 1;
183     } else {
184     MDB(kAnalysis, 3) {
185 ceballos 1.11 if (GetNEventsProcessed() % 1000 == 0)
186 loizides 1.1 doPrint = 1;
187     } else {
188     MDB(kAnalysis, 2) {
189 loizides 1.8 if (GetNEventsProcessed() % 10000 == 0)
190 loizides 1.1 doPrint = 1;
191     } else {
192     MDB(kAnalysis, 1) {
193 ceballos 1.11 if (GetNEventsProcessed() % 100000 == 0)
194 loizides 1.1 doPrint = 1;
195     }
196     }
197     }
198     }
199    
200     if (doPrint) {
201     fSWevent->Stop();
202 loizides 1.9 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 loizides 1.1 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 loizides 1.4
219     if (!PublishObj(&fAllHeaders)) {
220     SendError(kAbortAnalysis, "SlaveBegin",
221     "Could not publish all event headers with name %s.", fAllHeaders.GetName());
222     return;
223     }
224 loizides 1.1 }
225    
226     //--------------------------------------------------------------------------------------------------
227     void AnaFwkMod::SlaveTerminate()
228     {
229     // Fill event histogram and printout timing information.
230    
231 loizides 1.4 RetractObj(fAllHeaders.GetName());
232    
233 loizides 1.3 SaveNEventsProcessed();
234 loizides 1.6 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 loizides 1.1
239 loizides 1.8 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 loizides 1.1 fSWtotal->Stop();
245     fSWevent->Stop();
246    
247     MDB(kAnalysis, 1)
248 loizides 1.9 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 loizides 1.1
254     delete fSWtotal;
255     delete fSWevent;
256     }