ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.19
Committed: Tue Oct 7 00:22:49 2008 UTC (16 years, 6 months ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_004
Changes since 1.18: +13 -6 lines
Log Message:
Workaround for HLT bug. Temporarily committed to head, will be retagged to Mit_004

File Contents

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