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, 1 month 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

# User Rev Content
1 loizides 1.6 // $Id: AnaFwkMod.cc,v 1.5 2009/03/11 10:07:40 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.1 fSWtotal(0),
21 loizides 1.4 fSWevent(0),
22 loizides 1.6 fAllHeaders(0,Names::gkSkimmedHeaders),
23 loizides 1.4 fAllHeadTree(0),
24     fAllEventHeader(0),
25     fReload(kFALSE),
26 loizides 1.6 fCurEnt(-2),
27     fNEventsSkimmed(0)
28 loizides 1.1 {
29     // Constructor.
30     }
31    
32     //--------------------------------------------------------------------------------------------------
33 loizides 1.4 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 loizides 1.6 SendError(kWarning, "BeginRun",
55     "Can not find tree '%s' in file '%s'",
56     fAllHeadTreeName.Data(),file->GetName());
57 loizides 1.4 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 loizides 1.6 "Can not find branch '%s' in tree '%s'",
67 loizides 1.4 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 loizides 1.6 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 loizides 1.4 fAllHeadTree->GetEntry(fCurEnt++);
93 loizides 1.6 while(fAllEventHeader->Skimmed() && fCurEnt<nemax) {
94 loizides 1.4 EventHeader *eh = fAllHeaders.AddNew();
95     eh->SetRunNum(fAllEventHeader->RunNum());
96     eh->SetEvtNum(fAllEventHeader->EvtNum());
97     eh->SetLumiSec(fAllEventHeader->LumiSec());
98 loizides 1.5 eh->SetRunEntry(fAllEventHeader->RunEntry());
99     eh->SetSkimmed(fAllEventHeader->Skimmed());
100 loizides 1.4 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 loizides 1.6 "Event header information for entry %d inconsistent: "
108     "%d==%d, %d==%d, %d==%d, %d==%d",
109     fCurEnt,
110 loizides 1.4 fAllEventHeader->RunNum(), curev->RunNum(),
111     fAllEventHeader->EvtNum(), curev->EvtNum(),
112     fAllEventHeader->LumiSec(), curev->LumiSec(),
113     fAllEventHeader->RunEntry(), curev->RunEntry());
114     return;
115     }
116 loizides 1.6
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 loizides 1.4 }
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 loizides 1.1 void AnaFwkMod::Process()
155     {
156     // Do event counting and print out timing information.
157    
158 loizides 1.4
159 loizides 1.6 // get skimmed event headers
160     CopyAllEventHeaders();
161     fNEventsSkimmed += fAllHeaders.GetEntries();
162 loizides 1.4
163 loizides 1.1 // counting events
164 loizides 1.3 IncNEventsProcessed();
165 loizides 1.1
166     // check if printout should be done
167     Bool_t doPrint = 0;
168    
169     MDB(kAnalysis, 4) {
170 loizides 1.3 if (GetNEventsProcessed() % 1000 == 0)
171 loizides 1.1 doPrint = 1;
172     } else {
173     MDB(kAnalysis, 3) {
174 loizides 1.3 if (GetNEventsProcessed() % 10000 == 0)
175 loizides 1.1 doPrint = 1;
176     } else {
177     MDB(kAnalysis, 2) {
178 loizides 1.3 if (GetNEventsProcessed() % 50000 == 0)
179 loizides 1.1 doPrint = 1;
180     } else {
181     MDB(kAnalysis, 1) {
182 loizides 1.3 if (GetNEventsProcessed() % 250000 == 0)
183 loizides 1.1 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 loizides 1.3 GetNEventsProcessed(), fSWevent->RealTime(), fSWevent->CpuTime(),
193     fSWevent->RealTime()/GetNEventsProcessed(), fSWevent->CpuTime()/GetNEventsProcessed());
194 loizides 1.1 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 loizides 1.4
206     if (!PublishObj(&fAllHeaders)) {
207     SendError(kAbortAnalysis, "SlaveBegin",
208     "Could not publish all event headers with name %s.", fAllHeaders.GetName());
209     return;
210     }
211 loizides 1.1 }
212    
213     //--------------------------------------------------------------------------------------------------
214     void AnaFwkMod::SlaveTerminate()
215     {
216     // Fill event histogram and printout timing information.
217    
218 loizides 1.4 RetractObj(fAllHeaders.GetName());
219    
220 loizides 1.3 SaveNEventsProcessed();
221 loizides 1.6 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 loizides 1.1
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 loizides 1.3 GetNEventsProcessed(), fSWtotal->RealTime(), fSWtotal->CpuTime(),
232     fSWtotal->RealTime()/GetNEventsProcessed(), fSWtotal->CpuTime()/GetNEventsProcessed());
233 loizides 1.1
234     delete fSWtotal;
235     delete fSWevent;
236     }