ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.29
Committed: Wed Mar 18 14:57:58 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_008pre2
Changes since 1.28: +4 -4 lines
Log Message:
Removed OAK

File Contents

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