ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.24
Committed: Sat Mar 7 19:28:01 2009 UTC (16 years, 2 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.23: +9 -7 lines
Log Message:
get name from TClass.

File Contents

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