ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.23
Committed: Tue Mar 3 08:37:51 2009 UTC (16 years, 2 months ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_008pre1
Changes since 1.22: +5 -3 lines
Log Message:
Give class name since it is std type.

File Contents

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