ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/HLTFwkMod.cc
Revision: 1.16
Committed: Sun May 15 20:40:30 2011 UTC (13 years, 11 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_032, Mit_031, Mit_025c_branch2, Mit_025c_branch1, Mit_030, Mit_029c, Mit_029b, Mit_030_pre1, Mit_029a, Mit_029, Mit_029_pre1, Mit_028a, Mit_025c_branch0, Mit_028, Mit_027a, Mit_027, Mit_026, Mit_025e, Mit_025d, Mit_025c, Mit_025b, Mit_025a, Mit_025, Mit_025pre2, Mit_024b, Mit_025pre1, Mit_024a, Mit_024, Mit_023, Mit_022a, Mit_022, Mit_021, Mit_021pre2, HEAD
Branch point for: Mit_025c_branch
Changes since 1.15: +2 -2 lines
Log Message:
support more than 256 hlt paths

File Contents

# Content
1 // $Id: HLTFwkMod.cc,v 1.15 2011/03/11 04:03:54 bendavid Exp $
2
3 #include "MitAna/TreeMod/interface/HLTFwkMod.h"
4 #include <TFile.h>
5 #include <TTree.h>
6 #include "MitAna/DataUtil/interface/Debug.h"
7 #include "MitAna/DataTree/interface/Names.h"
8 #include "MitAna/DataTree/interface/TriggerName.h"
9 #include "MitAna/DataTree/interface/TriggerTable.h"
10 #include "MitAna/DataTree/interface/TriggerObjectBaseCol.h"
11 #include "MitAna/DataTree/interface/TriggerObjectRelCol.h"
12 #include "MitAna/DataTree/interface/TriggerObjectCol.h"
13 #include "MitAna/DataTree/interface/TriggerObjectsTable.h"
14
15 using namespace mithep;
16
17 ClassImp(mithep::HLTFwkMod)
18
19
20 //--------------------------------------------------------------------------------------------------
21 HLTFwkMod::HLTFwkMod(const char *name, const char *title) :
22 BaseMod(name,title),
23 fHLTTreeName(Names::gkHltTreeName),
24 fHLTTabName(Names::gkHltTableBrn),
25 fHLTLabName(Names::gkHltLabelBrn),
26 fObjsName(Names::gkHltObjBrn),
27 fRelsName(Form("%sRelation",fObjsName.Data())),
28 fHLTTabNamePub(Form("%sFwk",fHLTTabName.Data())),
29 fHLTLabNamePub(Form("%sFwk",fHLTLabName.Data())),
30 fObjsNamePub(Form("%sFwk",fObjsName.Data())),
31 fL1ATabNamePub("L1AlgoTableFwk"),
32 fL1TTabNamePub("L1TechTableFwk"),
33 fNMaxTriggers(1024),
34 fObjs(0),
35 fRels(0),
36 fReload(0),
37 fHLTTree(0),
38 fHLTTab(0),
39 fHLTLab(0),
40 fCurEnt(-2),
41 fTriggers(new TriggerTable(fNMaxTriggers)),
42 fLabels(new TriggerTable(fNMaxTriggers*16)),
43 fTrigObjs(new TriggerObjectsTable(fTriggers,fNMaxTriggers)),
44 fL1Algos(new TriggerTable(fNMaxTriggers)),
45 fL1Techs(new TriggerTable(fNMaxTriggers))
46 {
47 // Constructor.
48
49 fTriggers->SetName(fHLTTabNamePub);
50 fTriggers->SetOwner();
51 fLabels->SetName(fHLTLabNamePub);
52 fLabels->SetOwner();
53 fTrigObjs->SetName(fObjsNamePub);
54 fTrigObjs->SetOwner();
55 fL1Algos->SetName(fL1ATabNamePub);
56 fL1Algos->SetOwner();
57 fL1Techs->SetName(fL1TTabNamePub);
58 fL1Techs->SetOwner();
59 }
60
61 //--------------------------------------------------------------------------------------------------
62 HLTFwkMod::~HLTFwkMod()
63 {
64 // Destructor.
65
66 fReload = 0;
67 fHLTTree = 0;
68 fHLTTab = 0;
69 fHLTLab = 0;
70 fCurEnt = -2;
71 delete fTriggers;
72 fTriggers = 0;
73 delete fLabels;
74 fLabels = 0;
75 delete fTrigObjs;
76 fTrigObjs = 0;
77 delete fL1Algos;
78
79 }
80
81 //--------------------------------------------------------------------------------------------------
82 void HLTFwkMod::BeginRun()
83 {
84 // Get HLT tree and set branches if new file was opened. Read next entry in HLT key
85 // depending on entry in RunInfo.
86
87 if (fReload) {
88
89 // reset to be (re-)loaded variables
90 fReload = 0;
91 fHLTTree = 0;
92 fHLTTab = 0;
93 fHLTLab = 0;
94 fCurEnt = -2;
95
96 // get current file
97 TFile *file = GetCurrentFile();
98 if (!file)
99 return;
100
101 // get HLT tree
102 fHLTTree = dynamic_cast<TTree*>(file->Get(fHLTTreeName));
103 if (!fHLTTree) {
104 SendError(kAbortAnalysis, "BeginRun",
105 "Cannot find HLT tree with name %s.", fHLTTreeName.Data());
106 }
107
108 // get HLT trigger name branch
109 if (fHLTTree->GetBranch(fHLTTabName)) {
110 fHLTTree->SetBranchAddress(fHLTTabName, &fHLTTab);
111 } else {
112 SendError(kAbortAnalysis, "BeginRun",
113 "Cannot find HLT tree branch with name %s.", fHLTTabName.Data());
114 }
115
116 // get HLT module labels branch
117 if (fHLTTree->GetBranch(fHLTLabName)) {
118 fHLTTree->SetBranchAddress(fHLTLabName, &fHLTLab);
119 } else {
120 SendError(kAbortAnalysis, "BeginRun",
121 "Cannot find HLT tree branch with name %s.", fHLTLabName.Data());
122 }
123 }
124
125 // get entry for HLT info
126 const RunInfo *runinfo = GetRunInfo();
127 if (!runinfo) {
128 SendError(kAbortAnalysis, "BeginRun",
129 "Cannot obtain run info object from selector.");
130 return;
131 }
132
133 // load trigger table
134 if (runinfo->HltEntry()!=fCurEnt) {
135 MDB(kAnalysis, 1)
136 Info("BeginRun", "Loading trigger table for run %u", runinfo->RunNum());
137
138 fCurEnt = runinfo->HltEntry();
139 Bool_t load = LoadTriggerTable();
140 if (!load) {
141 SendError(kAbortAnalysis, "BeginRun",
142 "Cannot load trigger table for next entry (%ld).", fCurEnt);
143 return;
144 }
145
146 MDB(kAnalysis, 2) {
147 Info("BeginRun", "Printing tables for run %u", runinfo->RunNum());
148 cout << " --- Trigger table ---" << endl;
149 fTriggers->Print();
150 cout << " --- Module lables ---" << endl;
151 fLabels->Print();
152 if (fL1Algos->GetEntries()) {
153 cout << " --- L1 Algos ---" << endl;
154 fL1Algos->Print();
155 }
156 if (fL1Techs->GetEntries()) {
157 cout << " --- L1 Techs ---" << endl;
158 fL1Techs->Print();
159 }
160 }
161 }
162 }
163
164 //--------------------------------------------------------------------------------------------------
165 Bool_t HLTFwkMod::LoadTriggerTable()
166 {
167 // Load next trigger (and module) table from HLT tree.
168
169 if (fCurEnt<0)
170 return kFALSE;
171
172 // delete old tables
173 fTriggers->Delete();
174 fLabels->Delete();
175 fL1Algos->Delete();
176 fL1Techs->Delete();
177
178 // load next event in HLT tree
179 fHLTTab = 0;
180 fHLTLab = 0;
181 Int_t ret = fHLTTree->GetEvent(fCurEnt);
182 if (ret<0 || fHLTTab==0 || fHLTTab==0 ) {
183 SendError(kAbortAnalysis, "LoadTriggerTable",
184 "Could not get trigger data for next entry (%ld).", fCurEnt);
185 return kFALSE;
186 }
187
188 // check size of trigger table
189 if (fHLTTab->size()>fNMaxTriggers) {
190 SendError(kAbortAnalysis, "LoadTriggerTable",
191 "Size of trigger table (%ld) larger than maximum (%ld).",
192 fHLTTab->size(), fNMaxTriggers);
193 return kFALSE;
194 }
195
196 // add trigger names
197 for (UInt_t i=0; i<fHLTTab->size(); ++i) {
198 TriggerName *tname = new TriggerName(fHLTTab->at(i),i);
199 fTriggers->Add(tname);
200 }
201
202 // add module labels
203 UInt_t counter = 0;
204 UInt_t bitnum = 0;
205 UInt_t which = 0;
206 while (counter<fHLTLab->size()) {
207 TString tmpn(fHLTLab->at(counter));
208 ++counter;
209 if (tmpn.CompareTo("xxx-L1AlgoNames-xxx",TString::kIgnoreCase)==0) {
210 bitnum = 0;
211 which = 1;
212 continue;
213 } else if (tmpn.CompareTo("xxx-L1TechNames-xxx",TString::kIgnoreCase)==0) {
214 bitnum = 0;
215 which = 2;
216 continue;
217 }
218 TriggerName *tname = new TriggerName(tmpn,bitnum);
219 if (which==0)
220 fLabels->Add(tname);
221 else if (which==1)
222 fL1Algos->Add(tname);
223 else
224 fL1Techs->Add(tname);
225 ++bitnum;
226 }
227
228 return kTRUE;
229 }
230
231 //--------------------------------------------------------------------------------------------------
232 Bool_t HLTFwkMod::Notify()
233 {
234 // Save notification of a new file, which will trigger the reloading of the tables and bitmasks.
235
236 fReload = kTRUE;
237 return kTRUE;
238 }
239
240 //--------------------------------------------------------------------------------------------------
241 void HLTFwkMod::Process()
242 {
243 // Read trigger objects and relation branch and fill our object table.
244
245 fTrigObjs->Delete();
246
247 LoadBranch(fObjsName);
248 LoadBranch(fRelsName);
249
250 const UInt_t n = fRels->GetEntries();
251 for (UInt_t i=0; i<n; ++i) {
252 const TriggerObjectRel *rel = fRels->At(i);
253 if (!rel) continue;
254
255 const TriggerObjectBase *ob = fObjs->At(rel->ObjInd());
256 if (!ob) continue;
257
258 TriggerObject *obj = new TriggerObject(rel->TrgId(), rel->Type(), ob->Id(),
259 ob->Pt(), ob->Eta(), ob->Phi(), ob->Mass());
260
261 obj->SetTrigName(fHLTTab->at(rel->TrgId()).c_str());
262 obj->SetModuleName(fHLTLab->at(rel->ModInd()).c_str());
263 obj->SetFilterName(fHLTLab->at(rel->FilterInd()).c_str());
264 if (obj->TagInd()>=0)
265 obj->SetTagName(fHLTLab->at(obj->TagInd()).c_str());
266 else
267 obj->SetTagName("Unknown");
268
269 fTrigObjs->Add(obj);
270 }
271 }
272
273 //--------------------------------------------------------------------------------------------------
274 void HLTFwkMod::SlaveBegin()
275 {
276 // Request branches for trigger objects and relation, and publish our tables.
277
278 if (fObjsName != Names::gkHltObjBrn)
279 fRelsName = Form("%sRelation",fObjsName.Data());
280
281 ReqBranch(fObjsName, fObjs);
282 ReqBranch(fRelsName, fRels);
283
284 if (!PublishObj(fTriggers)) {
285 SendError(kAbortAnalysis, "SlaveBegin",
286 "Could not publish HLT trigger table with name %s.", fTriggers->GetName());
287 return;
288 }
289 if (!PublishObj(fTrigObjs)) {
290 SendError(kAbortAnalysis, "SlaveBegin",
291 "Could not publish HLT trigger objects table with name %s.", fTrigObjs->GetName());
292 return;
293 }
294 if (!PublishObj(fLabels)) {
295 SendError(kAbortAnalysis, "SlaveBegin",
296 "Could not publish HLT labels with name %s.", fLabels->GetName());
297 return;
298 }
299 if (!PublishObj(fL1Algos)) {
300 SendError(kAbortAnalysis, "SlaveBegin",
301 "Could not publish L1 algo table with name %s.", fL1Algos->GetName());
302 return;
303 }
304 if (!PublishObj(fL1Techs)) {
305 SendError(kAbortAnalysis, "SlaveBegin",
306 "Could not publish L1 tech table with name %s.", fL1Techs->GetName());
307 return;
308 }
309 }
310
311 //--------------------------------------------------------------------------------------------------
312 void HLTFwkMod::SlaveTerminate()
313 {
314 // Retract our published objects.
315
316 RetractObj(fTriggers->GetName());
317 RetractObj(fLabels->GetName());
318 RetractObj(fTrigObjs->GetName());
319 RetractObj(fL1Algos->GetName());
320 RetractObj(fL1Techs->GetName());
321 }