ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.33
Committed: Wed Mar 25 05:05:09 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_009a, Mit_009, Mit_008
Changes since 1.32: +47 -8 lines
Log Message:
Added possibility to specify several HLT process names that sequentually will be tried until one is found that works. Needed for CRAFT data.

File Contents

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