ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.35
Committed: Mon Jul 6 13:38:04 2009 UTC (15 years, 9 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.34: +6 -1 lines
Log Message:
Added timestamp, bx, orbitnumber, etc.

File Contents

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