ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.39
Committed: Mon Jul 13 06:39:40 2009 UTC (15 years, 9 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.38: +26 -7 lines
Log Message:
Fill trigger type.

File Contents

# User Rev Content
1 loizides 1.39 // $Id: FillerMetaInfos.cc,v 1.38 2009/07/10 13:50:02 loizides Exp $
2 loizides 1.1
3     #include "MitProd/TreeFiller/interface/FillerMetaInfos.h"
4 loizides 1.5 #include "FWCore/Framework/interface/TriggerNames.h"
5 loizides 1.1 #include "DataFormats/Common/interface/Handle.h"
6 loizides 1.5 #include "DataFormats/Common/interface/TriggerResults.h"
7 loizides 1.14 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
8 loizides 1.1 #include "MitAna/DataTree/interface/Names.h"
9 loizides 1.5 #include "MitAna/DataTree/interface/EventHeader.h"
10     #include "MitAna/DataTree/interface/LAHeader.h"
11 loizides 1.25 #include "MitAna/DataTree/interface/TriggerMask.h"
12 loizides 1.16 #include "MitAna/DataTree/interface/TriggerName.h"
13 loizides 1.5 #include "MitAna/DataTree/interface/RunInfo.h"
14 loizides 1.34 #include "MitAna/DataTree/interface/TriggerObjectCol.h"
15     #include "MitProd/ObjectService/interface/ObjectService.h"
16 loizides 1.8 #include <TObjectTable.h>
17 loizides 1.14 #include <TIterator.h>
18 sixie 1.13
19 loizides 1.1 using namespace std;
20     using namespace edm;
21     using namespace mithep;
22    
23 loizides 1.12 bool mithep::FillerMetaInfos::instance_ = 0;
24    
25 loizides 1.8 //--------------------------------------------------------------------------------------------------
26 loizides 1.26 FillerMetaInfos::FillerMetaInfos(const ParameterSet &cfg, const char *name, bool active) :
27     BaseFiller(cfg,name,(instance_==0||active?1:0)),
28 loizides 1.30 evtName_(Conf().getUntrackedParameter<string>("evtMitName",Names::gkEvtHeaderBrn)),
29     runName_(Conf().getUntrackedParameter<string>("runMitName",Names::gkRunInfoBrn)),
30     lahName_(Conf().getUntrackedParameter<string>("lahMitName",Names::gkLAHeaderBrn)),
31 loizides 1.16 hltActive_(Conf().getUntrackedParameter<bool>("hltActive",true)),
32 loizides 1.33 hltResName_(Conf().getUntrackedParameter<string>("hltResEdmName","TriggerResults")),
33     hltEvtName_(Conf().getUntrackedParameter<string>("hltEvtEdmName","hltTriggerSummaryAOD")),
34 loizides 1.30 hltTableName_(Conf().getUntrackedParameter<string>("hltTableMitName",Names::gkHltTableBrn)),
35     hltLabelName_(Conf().getUntrackedParameter<string>("hltLabelMitName",Names::gkHltLabelBrn)),
36     hltBitsName_(Conf().getUntrackedParameter<string>("hltBitsMitName",Names::gkHltBitBrn)),
37     hltObjsName_(Conf().getUntrackedParameter<string>("hltObjsMitName",Names::gkHltObjBrn)),
38 loizides 1.5 tws_(0),
39 loizides 1.2 eventHeader_(new EventHeader()),
40 loizides 1.3 evtLAHeader_(new LAHeader()),
41 loizides 1.2 runInfo_(new RunInfo()),
42     runTree_(0),
43 loizides 1.3 laTree_(0),
44     runEntries_(0),
45 loizides 1.25 hltBits_(new TriggerMask),
46 loizides 1.22 hltTable_(new vector<string>),
47 loizides 1.16 hltTabMap_(0),
48 loizides 1.22 hltLabels_(new vector<string>),
49 loizides 1.16 hltLabMap_(0),
50     hltObjs_(new TriggerObjectBaseArr),
51     hltRels_(new TriggerObjectRelArr),
52     hltTree_(0),
53     hltEntries_(0),
54 loizides 1.3 fileNum_(0)
55 loizides 1.1 {
56 loizides 1.3 // Constructor.
57 loizides 1.12
58 loizides 1.38 assert(instance_ == 0);
59     ++instance_;
60 loizides 1.33
61     if (Conf().exists("hltProcNames"))
62     hltProcNames_ = Conf().getUntrackedParameter<vector<string> >("hltProcNames");
63     if (hltProcNames_.size()==0)
64     hltProcNames_.push_back("HLT");
65 loizides 1.1 }
66    
67 loizides 1.8 //--------------------------------------------------------------------------------------------------
68 loizides 1.1 FillerMetaInfos::~FillerMetaInfos()
69     {
70 loizides 1.3 // Destructor.
71    
72 loizides 1.2 delete eventHeader_;
73 loizides 1.8 delete evtLAHeader_;
74 loizides 1.2 delete runInfo_;
75 loizides 1.37 delete hltBits_;
76 loizides 1.16 delete hltTable_;
77     delete hltLabels_;
78     delete hltObjs_;
79     delete hltRels_;
80 loizides 1.3 eventHeader_ = 0;
81 loizides 1.8 evtLAHeader_ = 0;
82 loizides 1.3 runInfo_ = 0;
83 loizides 1.16 hltTable_ = 0;
84     hltLabels_ = 0;
85     hltObjs_ = 0;
86     hltRels_ = 0;
87 loizides 1.3 runTree_ = 0;
88     laTree_ = 0;
89 loizides 1.16 hltTree_ = 0;
90 loizides 1.1 }
91    
92 loizides 1.8 //--------------------------------------------------------------------------------------------------
93 loizides 1.2 void FillerMetaInfos::BookDataBlock(TreeWriter &tws)
94 loizides 1.1 {
95 loizides 1.30 // Create run info tree and book our branches.
96 loizides 1.3
97     // add branches to main tree
98 loizides 1.27 tws.AddBranch(evtName_,&eventHeader_);
99     OS()->add<mithep::EventHeader>(eventHeader_,evtName_);
100     tws.AddBranch(hltBitsName_,&hltBits_);
101     tws.AddBranch(hltObjsName_,&hltObjs_);
102 loizides 1.16 tws.AddBranch(Form("%sRelation",hltObjsName_.c_str()),&hltRels_);
103 loizides 1.20 tws.GetTree()->BranchRef();
104 loizides 1.3
105     // add branches to run info tree
106 loizides 1.27 tws.AddBranchToTree(Names::gkRunTreeName,runName_,
107 loizides 1.25 TClass::GetClass(typeid(*runInfo_))->GetName(),&runInfo_);
108 loizides 1.2 tws.SetAutoFill(Names::gkRunTreeName,0);
109     runTree_=tws.GetTree(Names::gkRunTreeName);
110 loizides 1.3
111     // add branches to lookahead tree
112 loizides 1.24 tws.AddBranchToTree(Names::gkLATreeName,Names::gkLAHeaderBrn,
113 loizides 1.25 TClass::GetClass(typeid(*evtLAHeader_))->GetName(),&runInfo_);
114 loizides 1.3 tws.SetAutoFill(Names::gkLATreeName,0);
115     laTree_=tws.GetTree(Names::gkLATreeName);
116    
117 loizides 1.16 // add branches to HLT trigger info tree
118 loizides 1.27 tws.AddBranchToTree(Names::gkHltTreeName,hltTableName_,
119 loizides 1.29 TClass::GetClass(typeid(*hltTable_))->GetName(),&hltTable_,32*1024,0);
120 loizides 1.27 tws.AddBranchToTree(Names::gkHltTreeName,hltLabelName_,
121 loizides 1.29 TClass::GetClass(typeid(*hltLabels_))->GetName(),&hltLabels_,32*1024,0);
122 loizides 1.16 tws.SetAutoFill(Names::gkHltTreeName,0);
123     hltTree_=tws.GetTree(Names::gkHltTreeName);
124    
125 loizides 1.3 // store pointer to tree writer
126     tws_ = &tws;
127 loizides 1.1 }
128    
129 loizides 1.8 //--------------------------------------------------------------------------------------------------
130 loizides 1.36 void FillerMetaInfos::FillDataBlock(const edm::Event &event, const edm::EventSetup &setup)
131 loizides 1.1 {
132 loizides 1.3 // Fill our data structures.
133    
134     // clear map if a new file was opened
135     if (tws_->GetFileNumber()!=fileNum_) {
136     runmap_.clear();
137     fileNum_ = tws_->GetFileNumber();
138     runEntries_ = 0;
139 loizides 1.16 hltEntries_ = -1;
140 loizides 1.3 }
141    
142     UInt_t runnum = event.id().run();
143    
144     // store look ahead information
145     if (runEntries_>0) {
146     evtLAHeader_->SetRunNum(runnum);
147     laTree_->Fill();
148 loizides 1.21 if(0) { // check for memory leak in usage of ROOT objects
149 loizides 1.14 if(laTree_->GetEntries() % 100==0)
150     gObjectTable->Print();
151     }
152 loizides 1.3 }
153    
154 loizides 1.2 // fill event header
155     eventHeader_->SetEvtNum(event.id().event());
156     eventHeader_->SetLumiSec(event.luminosityBlock());
157     eventHeader_->SetRunNum(runnum);
158 loizides 1.27 eventHeader_->SetIsMC(!event.isRealData());
159 loizides 1.35 eventHeader_->SetBunchCrossing(event.bunchCrossing());
160     eventHeader_->SetExpType(event.experimentType());
161     eventHeader_->SetOrbitNumber(event.orbitNumber());
162     eventHeader_->SetStoreNumber(event.bunchCrossing());
163     eventHeader_->SetTimeStamp(event.time().value());
164 loizides 1.2
165 loizides 1.3 // look-up if entry is in map
166 loizides 1.2 map<UInt_t,Int_t>::iterator riter = runmap_.find(runnum);
167     if (riter != runmap_.end()) {
168     Int_t runentry = riter->second;
169     eventHeader_->SetRunEntry(runentry);
170 loizides 1.16 FillHltTrig(event,setup);
171 loizides 1.2 return;
172     }
173 loizides 1.1
174 loizides 1.2 // fill new run info
175     Int_t runentry = runEntries_;
176 loizides 1.16 ++runEntries_;
177 loizides 1.2 eventHeader_->SetRunEntry(runentry);
178     runmap_.insert(pair<UInt_t,Int_t>(runnum,runentry));
179 loizides 1.16 runInfo_->SetRunNum(runnum);
180    
181     Int_t hltentry = hltEntries_;
182 loizides 1.14 FillHltInfo(event,setup);
183 loizides 1.16 FillHltTrig(event,setup);
184 loizides 1.21 if (hltentry < hltEntries_) {
185     runInfo_->SetHltEntry(hltentry);
186 loizides 1.16 hltTree_->Fill();
187 loizides 1.21 } else {
188     runInfo_->SetHltEntry(hltentry-1);
189     }
190 loizides 1.14
191 loizides 1.2 runTree_->Fill();
192 loizides 1.1 }
193 loizides 1.5
194 loizides 1.8 //--------------------------------------------------------------------------------------------------
195 loizides 1.36 void FillerMetaInfos::FillHltInfo(const edm::Event &event, const edm::EventSetup &setup)
196 loizides 1.5 {
197 loizides 1.16 // Fill HLT trigger table if it changed.
198 loizides 1.5
199 loizides 1.36 if (!hltActive_)
200     return;
201 loizides 1.14
202 loizides 1.21 // check if we can access the hlt config information
203 loizides 1.33 if (hltProcName_.empty()) {
204     string teststr;
205 loizides 1.39 for(UInt_t i=0; i<hltProcNames_.size(); ++i) {
206 loizides 1.33 if (i>0)
207     teststr += ", ";
208     teststr += hltProcNames_.at(i);
209     edm::LogInfo("FillerMetaInfos") << "Trying to access hlt config using "
210     << hltProcNames_.at(i) << std::endl;
211    
212     if (hltConfig_.init(hltProcNames_.at(i))) {
213     hltProcName_ = hltProcNames_.at(i);
214     if (hltResName_.find(':')==string::npos)
215     hltResName_ += "::";
216     else
217     hltResName_ += ":";
218     hltResName_ += hltProcName_;
219     if (hltEvtName_.find(':')==string::npos)
220     hltEvtName_ += "::";
221     else
222     hltEvtName_ += ":";
223     hltEvtName_ += hltProcName_;
224     break;
225     }
226     }
227     if (hltProcName_.empty()) {
228     edm::LogError("FillerMetaInfos") << "Cannot access hlt config using "
229     << teststr << std::endl;
230     throw edm::Exception(edm::errors::Configuration, "FillerMetaInfos::FillHltInfo()\n")
231     << "Cannot access hlt config using " << teststr << std::endl;
232     return;
233     }
234     } else {
235     if (!hltConfig_.init(hltProcName_)) {
236     edm::LogError("FillerMetaInfos") << "Cannot access hlt config using "
237     << hltProcName_ << std::endl;
238     throw edm::Exception(edm::errors::Configuration, "FillerMetaInfos::FillHltInfo()\n")
239     << "Cannot access hlt config using " << hltProcName_ << std::endl;
240     return;
241     }
242 loizides 1.16 }
243 loizides 1.14
244 loizides 1.21 // check size of menu... < 256
245 loizides 1.16 if (hltConfig_.size()>hltBits_->Size()) {
246 loizides 1.21 edm::LogError("FillerMetaInfos") << "HLT config contains too many paths "
247 loizides 1.25 << hltConfig_.size() << " > "
248     << hltBits_->Size() << std::endl;
249 loizides 1.16 return;
250     }
251 loizides 1.14
252 loizides 1.22 vector<string> *trigtable = new vector<string>;
253 loizides 1.16 map<string,Short_t> *tabmap = new map<string,Short_t>;
254 loizides 1.22 vector<string> *labels = new vector<string>;
255 loizides 1.16 map<string,Short_t> *labmap = new map<string,Short_t>;
256    
257 loizides 1.28 if (0) {
258     if (!hltConfig_.tableName().empty())
259     trigtable->push_back(hltConfig_.tableName());
260     else
261     trigtable->push_back("unknown_hlt_config");
262     }
263    
264 loizides 1.21 // loop over hlt paths
265 loizides 1.16 for(UInt_t i=0;i<hltConfig_.size();++i) {
266    
267     tabmap->insert(pair<string,Short_t>(hltConfig_.triggerName(i),i));
268 loizides 1.22 trigtable->push_back(hltConfig_.triggerName(i));
269 loizides 1.16 const vector<string> &mLabels(hltConfig_.moduleLabels(i));
270     for (UInt_t j=0; j<mLabels.size(); ++j) {
271 loizides 1.19
272 loizides 1.16 const string& label(mLabels[j]);
273    
274 loizides 1.19 // remove characters which do not work: negation is included as !ModuleName
275     // (this might require a change in the underlying CMSSW HLT fwk, so watch out).
276     const char *lptr = &label[0];
277     if (label[0] == '!')
278     ++lptr;
279    
280     map<string,Short_t>::iterator riter = labmap->find(lptr);
281 loizides 1.16 if (riter == labmap->end()) {
282 loizides 1.22 labmap->insert(pair<string,Short_t>(lptr,labels->size()));
283     labels->push_back(lptr);
284 loizides 1.16 }
285 loizides 1.19
286     const string type(hltConfig_.moduleType(lptr));
287 loizides 1.16 riter = labmap->find(type);
288     if (riter == labmap->end()) {
289 loizides 1.22 labmap->insert(pair<string,Short_t>(type,labels->size()));
290     labels->push_back(type);
291 loizides 1.14 }
292     }
293     }
294    
295 loizides 1.22 if (hltTable_->size()>=0) {
296 loizides 1.32 // check if existing table is equal to new table:
297     // if so keep it, otherwise store the new one
298 loizides 1.21
299 loizides 1.32 if ((hltTable_->size()==trigtable->size()) &&
300     (hltLabels_->size()==labels->size())) {
301 loizides 1.21
302     bool newEntryFound = false;
303 loizides 1.22 for (UInt_t i=0; i<trigtable->size(); ++i) {
304 loizides 1.32 if (trigtable->at(i) != hltTable_->at(i)) {
305 loizides 1.21 newEntryFound = true;
306     break;
307     }
308     }
309     if (!newEntryFound) {
310 loizides 1.22 for (UInt_t i=0; i<labels->size(); ++i) {
311 loizides 1.32 if (labels->at(i) != hltLabels_->at(i)) {
312 loizides 1.21 newEntryFound = true;
313     break;
314     }
315     }
316     }
317    
318     if (!newEntryFound) {
319     if (verbose_>1)
320     cout << "FillHltInfo: Kept previous HLT information" << endl;
321    
322     delete trigtable;
323     delete labels;
324     delete labmap;
325     delete tabmap;
326     return;
327     }
328 loizides 1.16 }
329 loizides 1.20 }
330 loizides 1.16
331 loizides 1.21 // new hlt entry
332 loizides 1.16 delete hltTable_;
333     delete hltLabels_;
334     delete hltTabMap_;
335     delete hltLabMap_;
336     hltTable_ = trigtable;
337     hltLabels_ = labels;
338     hltTabMap_ = tabmap;
339     hltLabMap_ = labmap;
340     hltEntries_++;
341     }
342    
343     //--------------------------------------------------------------------------------------------------
344 loizides 1.36 void FillerMetaInfos::FillHltTrig(const edm::Event &event, const edm::EventSetup &setup)
345 loizides 1.16 {
346     // Fill HLT trigger objects along triggered paths.
347    
348 loizides 1.36 if (!hltActive_)
349     return;
350 loizides 1.16
351     // reset trigger objects
352     hltObjs_->Reset();
353     hltRels_->Reset();
354 loizides 1.14
355 loizides 1.16 // get HLT trigger information
356 loizides 1.14 Handle<TriggerResults> triggerResultsHLT;
357 loizides 1.16 GetProduct(hltResName_, triggerResultsHLT, event);
358 loizides 1.5
359 loizides 1.16 // get HLT trigger object information
360     Handle<trigger::TriggerEvent> triggerEventHLT;
361     GetProduct(hltEvtName_, triggerEventHLT, event);
362    
363     if (verify_)
364     assert(triggerResultsHLT->size()==hltConfig_.size());
365    
366 loizides 1.25 // new bitmask
367 loizides 1.37 BitMask256 maskhlt;
368 loizides 1.16
369 loizides 1.37 // loop over trigger objects and fill them
370     const trigger::TriggerObjectCollection &toc(triggerEventHLT->getObjects());
371 loizides 1.39 const std::vector<std::string> &tags(triggerEventHLT->collectionTags());
372     for(UInt_t i=0,iprev=0; i<tags.size(); ++i) {
373     UInt_t inext(triggerEventHLT->collectionKey(i));
374     if (verbose_>2)
375     cout << i << " " << tags.at(i) << " with " << inext-iprev << " objects " << endl;
376     for (UInt_t k=iprev; k<inext; ++k) {
377     const trigger::TriggerObject &tobj = toc[k];
378     TriggerObjectBase *trigObj = hltObjs_->Allocate();
379     new (trigObj) TriggerObjectBase(tobj.id(),0,tobj.pt(),tobj.eta(),tobj.phi(),tobj.mass());
380     if (verbose_>4)
381     cout << " " << k << " " << tobj.id() << " " << tobj.pt() << " " << tobj.eta()
382     << " " << tobj.phi() << " " << tobj.mass() << endl;
383     }
384     iprev = inext;
385 loizides 1.37 }
386 loizides 1.16
387     // loop over trigger paths
388     const UInt_t N = hltConfig_.size();
389     for(UInt_t i=0;i<N;++i) {
390    
391     const string &name(hltConfig_.triggerName(i));
392     const UInt_t tind(hltConfig_.triggerIndex(name.c_str()));
393     if (verify_)
394     assert(tind==i);
395    
396     if (verbose_>0)
397     cout << "Trigger: path " << name << " [" << i << "]" << endl;
398    
399     // get our trigger bit
400     map<string,Short_t>::iterator riter = hltTabMap_->find(name);
401     if (riter == hltTabMap_->end()) {
402     PrintErrorAndExit(Form("Trigger %s not found\n", name.c_str()));
403     }
404    
405     UInt_t mytind = riter->second;
406     if (verify_) {
407     if (mytind!=tind)
408     PrintErrorAndExit(Form("Trigger for %s index does not match: %ud %ud\n",
409     name.c_str(), mytind, tind));
410     }
411    
412     // modules on this trigger path
413     const UInt_t M(hltConfig_.size(tind));
414     const UInt_t mind(triggerResultsHLT->index(tind));
415     assert (mind<M);
416    
417     const vector<string> &mLabels(hltConfig_.moduleLabels(tind));
418    
419     if (verbose_>1)
420     cout << " Last active module - label/type: "
421     << mLabels[mind] << "/" << hltConfig_.moduleType(mLabels[mind])
422     << " [" << mind << " out of 0-" << (M-1) << " on this path]" << endl;
423    
424     // loop over modules on path
425     for (UInt_t j=0; j<=mind; ++j) {
426     const string &mLabel(mLabels[j]);
427    
428     // check whether the module is packed up in TriggerEvent product
429     const UInt_t find(triggerEventHLT->filterIndex(InputTag(mLabel,"",hltProcName_)));
430     if (find>=triggerEventHLT->sizeFilters())
431     continue;
432    
433     const string mType(hltConfig_.moduleType(mLabel));
434 loizides 1.37
435     string tType = "L1";
436     if (mType != "HLTLevel1GTSeed")
437     tType = "L3";
438    
439 loizides 1.16 if (verbose_>1)
440 loizides 1.37 cout << " '" << tType << "' filter in slot " << j
441     << " - label/type " << mLabel << "/" << mType << endl;
442 loizides 1.16
443     // find index for module label/type name
444     Short_t modind = -1;
445     map<string,Short_t>::iterator riter = hltLabMap_->find(mLabel);
446     if (riter != hltLabMap_->end()) {
447     modind = riter->second;
448     }
449 loizides 1.17 assert(modind!=-1);
450    
451     Short_t filind = -1;
452 loizides 1.16 riter = hltLabMap_->find(mType);
453     if (riter != hltLabMap_->end()) {
454 loizides 1.17 filind = riter->second;
455 loizides 1.16 }
456 loizides 1.17 assert(filind!=-1);
457 loizides 1.14
458 loizides 1.16 // find trigger objects
459     const trigger::Vids &vids(triggerEventHLT->filterIds(find));
460     const trigger::Keys &keys(triggerEventHLT->filterKeys(find));
461     const trigger::size_type nVids(vids.size());
462     const trigger::size_type nKeys(keys.size());
463     assert(nVids==nKeys);
464    
465     if (verbose_>2)
466 loizides 1.37 cout << " " << nVids << " accepted '" << tType << "' objects found: " << endl;
467 loizides 1.16
468     // loop over trigger objects
469     const trigger::TriggerObjectCollection &toc(triggerEventHLT->getObjects());
470     for (trigger::size_type k=0; k<nVids; ++k) {
471     Int_t tocind = keys[k];
472    
473     const trigger::TriggerObject &tobj(toc[tocind]);
474 loizides 1.37
475 loizides 1.16 if (verbose_>2)
476     cout << " " << k << " " << vids[k] << "/" << keys[k] << ": "
477     << tobj.id() << " " << tobj.pt() << " " << tobj.eta()
478     << " " << tobj.phi() << " " << tobj.mass() << endl;
479    
480     TriggerObjectRel *trigRel = hltRels_->Allocate();
481 loizides 1.37 new (trigRel) TriggerObjectRel(mytind,vids[k],tocind,modind,filind);
482 loizides 1.39 TriggerObjectBase *trigObj = hltObjs_->At(tocind);
483     if (trigObj->Type()==0) {
484     trigObj->SetType(vids[k]);
485     } else {
486     if (trigObj->Type()!=vids[k]) {
487     if (verbose_>3)
488     cout << " -> Have already type " << trigObj->Type()
489     << " ignored new type " << vids[k] << endl;
490     }
491     }
492 loizides 1.16 }
493     }
494 loizides 1.37
495     if (triggerResultsHLT->accept(tind))
496     maskhlt.SetBit(mytind);
497 loizides 1.16 }
498 loizides 1.25
499 loizides 1.37 hltBits_->SetBits(maskhlt);
500 loizides 1.16 hltObjs_->Trim();
501     hltRels_->Trim();
502 loizides 1.5 }