ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.51
Committed: Wed Dec 2 23:56:11 2009 UTC (15 years, 5 months ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012e, Mit_012d
Changes since 1.50: +24 -25 lines
Log Message:
Fix names for L1 bits, add physics declared

File Contents

# User Rev Content
1 loizides 1.51 // $Id: FillerMetaInfos.cc,v 1.50 2009/12/02 20:28:16 loizides Exp $
2 loizides 1.1
3     #include "MitProd/TreeFiller/interface/FillerMetaInfos.h"
4 loizides 1.46 #include "CondFormats/DataRecord/interface/L1GtTriggerMenuRcd.h"
5     #include "CondFormats/L1TObjects/interface/L1GtTriggerMenu.h"
6     #include "CondFormats/L1TObjects/interface/L1GtTriggerMenuFwd.h"
7 loizides 1.1 #include "DataFormats/Common/interface/Handle.h"
8 loizides 1.5 #include "DataFormats/Common/interface/TriggerResults.h"
9 loizides 1.14 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
10 loizides 1.46 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerRecord.h"
11 loizides 1.49 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
12 loizides 1.46 #include "FWCore/Framework/interface/ESHandle.h"
13     #include "FWCore/Framework/interface/TriggerNames.h"
14 loizides 1.5 #include "MitAna/DataTree/interface/EventHeader.h"
15     #include "MitAna/DataTree/interface/LAHeader.h"
16 loizides 1.46 #include "MitAna/DataTree/interface/Names.h"
17 loizides 1.49 #include "MitAna/DataTree/interface/L1TriggerMaskCol.h"
18 loizides 1.46 #include "MitAna/DataTree/interface/RunInfo.h"
19 loizides 1.25 #include "MitAna/DataTree/interface/TriggerMask.h"
20 loizides 1.46 #include "MitAna/DataTree/interface/TriggerObjectBase.h"
21 loizides 1.41 #include "MitAna/DataTree/interface/TriggerObjectBaseCol.h"
22     #include "MitAna/DataTree/interface/TriggerObjectRelCol.h"
23 loizides 1.34 #include "MitProd/ObjectService/interface/ObjectService.h"
24 loizides 1.8 #include <TObjectTable.h>
25 loizides 1.14 #include <TIterator.h>
26 sixie 1.13
27 loizides 1.1 using namespace std;
28     using namespace edm;
29     using namespace mithep;
30    
31 loizides 1.42 Int_t mithep::FillerMetaInfos::instance_ = 0;
32 loizides 1.12
33 loizides 1.8 //--------------------------------------------------------------------------------------------------
34 loizides 1.26 FillerMetaInfos::FillerMetaInfos(const ParameterSet &cfg, const char *name, bool active) :
35     BaseFiller(cfg,name,(instance_==0||active?1:0)),
36 loizides 1.30 evtName_(Conf().getUntrackedParameter<string>("evtMitName",Names::gkEvtHeaderBrn)),
37 loizides 1.42 runTreeName_(Conf().getUntrackedParameter<string>("runTreeMitName",Names::gkRunTreeName)),
38     lahTreeName_(Conf().getUntrackedParameter<string>("lahTreeMitName",Names::gkLATreeName)),
39     hltTreeName_(Conf().getUntrackedParameter<string>("hltTreeMitName",
40     Form("%s%s",Names::gkHltTreeName,Istr()))),
41 loizides 1.16 hltActive_(Conf().getUntrackedParameter<bool>("hltActive",true)),
42 loizides 1.33 hltResName_(Conf().getUntrackedParameter<string>("hltResEdmName","TriggerResults")),
43     hltEvtName_(Conf().getUntrackedParameter<string>("hltEvtEdmName","hltTriggerSummaryAOD")),
44 loizides 1.30 hltTableName_(Conf().getUntrackedParameter<string>("hltTableMitName",Names::gkHltTableBrn)),
45     hltLabelName_(Conf().getUntrackedParameter<string>("hltLabelMitName",Names::gkHltLabelBrn)),
46 loizides 1.42 hltBitsName_(Conf().getUntrackedParameter<string>("hltBitsMitName",
47     Form("%s%s",Names::gkHltBitBrn,Istr()))),
48     hltObjsName_(Conf().getUntrackedParameter<string>("hltObjsMitName",
49     Form("%s%s",Names::gkHltObjBrn,Istr()))),
50 loizides 1.46 l1Active_(Conf().getUntrackedParameter<bool>("l1Active",true)),
51     l1GTRecName_(Conf().getUntrackedParameter<string>("l1GtRecordEdmName","l1GtRecord")),
52 loizides 1.49 l1GTRRName_(Conf().getUntrackedParameter<string>("l1GtReadRecEdmName","")),
53 loizides 1.46 l1TBitsName_(Conf().getUntrackedParameter<string>("l1TechBitsMitName",
54     Form("%s%s",Names::gkL1TechBitsBrn,Istr()))),
55     l1ABitsName_(Conf().getUntrackedParameter<string>("l1AlgoBitsMitName",
56     Form("%s%s",Names::gkL1AlgoBitsBrn,Istr()))),
57 loizides 1.5 tws_(0),
58 loizides 1.2 eventHeader_(new EventHeader()),
59 loizides 1.3 evtLAHeader_(new LAHeader()),
60 loizides 1.2 runInfo_(new RunInfo()),
61     runTree_(0),
62 loizides 1.3 laTree_(0),
63     runEntries_(0),
64 loizides 1.25 hltBits_(new TriggerMask),
65 loizides 1.22 hltTable_(new vector<string>),
66 loizides 1.16 hltTabMap_(0),
67 loizides 1.22 hltLabels_(new vector<string>),
68 loizides 1.16 hltLabMap_(0),
69     hltObjs_(new TriggerObjectBaseArr),
70     hltRels_(new TriggerObjectRelArr),
71     hltTree_(0),
72     hltEntries_(0),
73 loizides 1.46 fileNum_(0),
74     l1TBits_(new L1TriggerMask),
75 loizides 1.48 l1ABits_(new L1TriggerMask),
76     l1TBits2_(new L1TriggerMask),
77 loizides 1.49 l1ABits2_(new L1TriggerMask),
78     l1AbArr_(new L1TriggerMaskArr),
79     l1TbArr_(new L1TriggerMaskArr)
80 loizides 1.1 {
81 loizides 1.3 // Constructor.
82 loizides 1.12
83 loizides 1.38 ++instance_;
84 loizides 1.33
85     if (Conf().exists("hltProcNames"))
86     hltProcNames_ = Conf().getUntrackedParameter<vector<string> >("hltProcNames");
87     if (hltProcNames_.size()==0)
88     hltProcNames_.push_back("HLT");
89 loizides 1.46
90     if (l1Active_ && !hltActive_)
91     PrintErrorAndExit("L1Active set _without_ hltActive set as well is not supported");
92 loizides 1.1 }
93    
94 loizides 1.8 //--------------------------------------------------------------------------------------------------
95 loizides 1.1 FillerMetaInfos::~FillerMetaInfos()
96     {
97 loizides 1.3 // Destructor.
98    
99 loizides 1.2 delete eventHeader_;
100 loizides 1.8 delete evtLAHeader_;
101 loizides 1.2 delete runInfo_;
102 loizides 1.37 delete hltBits_;
103 loizides 1.16 delete hltTable_;
104     delete hltLabels_;
105     delete hltObjs_;
106     delete hltRels_;
107 loizides 1.46 delete l1TBits_;
108     delete l1ABits_;
109 loizides 1.49 delete l1AbArr_;
110     delete l1TbArr_;
111 loizides 1.3 eventHeader_ = 0;
112 loizides 1.8 evtLAHeader_ = 0;
113 loizides 1.3 runInfo_ = 0;
114 loizides 1.16 hltTable_ = 0;
115     hltLabels_ = 0;
116     hltObjs_ = 0;
117     hltRels_ = 0;
118 loizides 1.3 runTree_ = 0;
119     laTree_ = 0;
120 loizides 1.16 hltTree_ = 0;
121 loizides 1.1 }
122    
123 loizides 1.8 //--------------------------------------------------------------------------------------------------
124 loizides 1.44 void FillerMetaInfos::BookDataBlock(TreeWriter &tws, const edm::EventSetup &es)
125 loizides 1.1 {
126 loizides 1.30 // Create run info tree and book our branches.
127 loizides 1.3
128     // add branches to main tree
129 loizides 1.42 if (OS()->get<mithep::EventHeader>(evtName_)==0) {
130     tws.AddBranch(evtName_,&eventHeader_);
131     OS()->add<mithep::EventHeader>(eventHeader_,evtName_);
132     }
133 loizides 1.3
134     // add branches to run info tree
135 loizides 1.42 runTree_=tws.GetTree(runTreeName_);
136     if (runTree_==0) {
137     tws.AddBranchToTree(runTreeName_,Names::gkRunInfoBrn,
138     TClass::GetClass(typeid(*runInfo_))->GetName(),&runInfo_);
139     tws.SetAutoFill(runTreeName_,0);
140     runTree_=tws.GetTree(runTreeName_);
141     }
142 loizides 1.3
143     // add branches to lookahead tree
144 loizides 1.42 laTree_=tws.GetTree(lahTreeName_);
145     if (laTree_==0) {
146     tws.AddBranchToTree(lahTreeName_,Names::gkLAHeaderBrn,
147     TClass::GetClass(typeid(*evtLAHeader_))->GetName(),&runInfo_);
148     tws.SetAutoFill(lahTreeName_,0);
149     laTree_=tws.GetTree(lahTreeName_);
150     }
151 loizides 1.3
152 loizides 1.45 // add HLT branches to main tree and to HLT trigger info tree
153     if (hltActive_) {
154     tws.AddBranch(hltBitsName_,&hltBits_);
155     tws.AddBranch(hltObjsName_,&hltObjs_);
156     tws.AddBranch(Form("%sRelation",hltObjsName_.c_str()),&hltRels_);
157    
158     tws.AddBranchToTree(hltTreeName_,hltTableName_,
159     TClass::GetClass(typeid(*hltTable_))->GetName(),&hltTable_,32*1024,0);
160     tws.AddBranchToTree(hltTreeName_,hltLabelName_,
161     TClass::GetClass(typeid(*hltLabels_))->GetName(),&hltLabels_,32*1024,0);
162     tws.SetAutoFill(hltTreeName_,0);
163     hltTree_=tws.GetTree(hltTreeName_);
164     }
165 loizides 1.16
166 loizides 1.46 if (l1Active_) {
167     tws.AddBranch(l1TBitsName_,&l1TBits_);
168     tws.AddBranch(l1ABitsName_,&l1ABits_);
169 loizides 1.48 tws.AddBranch(Form("%sBeforeMask",l1TBitsName_.c_str()),&l1TBits2_);
170     tws.AddBranch(Form("%sBeforeMask",l1ABitsName_.c_str()),&l1ABits2_);
171 loizides 1.49 if (l1GTRRName_.size()) {
172     tws.AddBranch(Form("%sBxs",l1TBitsName_.c_str()),&l1TbArr_);
173     tws.AddBranch(Form("%sBxs",l1ABitsName_.c_str()),&l1AbArr_);
174     }
175 loizides 1.46 }
176    
177 loizides 1.3 // store pointer to tree writer
178     tws_ = &tws;
179 loizides 1.1 }
180    
181 loizides 1.8 //--------------------------------------------------------------------------------------------------
182 loizides 1.50 void FillerMetaInfos::FillBitAMask(BitMask128 &bits, const DecisionWord &dw)
183 loizides 1.49 {
184     // Fill bit mask.
185    
186     size_t dws = dw.size();
187 loizides 1.50 if (dws>128)
188     dws = 128;
189 loizides 1.49 for (size_t i=0; i<dws;++i) {
190     if (dw.at(i))
191     bits.SetBit(i);
192     }
193     }
194    
195     //--------------------------------------------------------------------------------------------------
196 loizides 1.50 void FillerMetaInfos::FillBitTMask(BitMask128 &bits, const TechnicalTriggerWord &tw)
197 loizides 1.49 {
198     // Fill bit mask.
199    
200     size_t tws = tw.size();
201 loizides 1.50 if (tws>128)
202     tws = 128;
203 loizides 1.49 for (size_t i=0; i<tws;++i) {
204     if (tw.at(i))
205     bits.SetBit(i);
206     }
207     }
208    
209     //--------------------------------------------------------------------------------------------------
210 loizides 1.36 void FillerMetaInfos::FillDataBlock(const edm::Event &event, const edm::EventSetup &setup)
211 loizides 1.1 {
212 loizides 1.3 // Fill our data structures.
213    
214     // clear map if a new file was opened
215     if (tws_->GetFileNumber()!=fileNum_) {
216     runmap_.clear();
217     fileNum_ = tws_->GetFileNumber();
218     runEntries_ = 0;
219 loizides 1.16 hltEntries_ = -1;
220 loizides 1.3 }
221    
222     UInt_t runnum = event.id().run();
223    
224     // store look ahead information
225     if (runEntries_>0) {
226     evtLAHeader_->SetRunNum(runnum);
227     laTree_->Fill();
228 loizides 1.21 if(0) { // check for memory leak in usage of ROOT objects
229 loizides 1.14 if(laTree_->GetEntries() % 100==0)
230     gObjectTable->Print();
231     }
232 loizides 1.3 }
233    
234 loizides 1.2 // fill event header
235     eventHeader_->SetEvtNum(event.id().event());
236     eventHeader_->SetLumiSec(event.luminosityBlock());
237     eventHeader_->SetRunNum(runnum);
238 loizides 1.27 eventHeader_->SetIsMC(!event.isRealData());
239 loizides 1.35 eventHeader_->SetBunchCrossing(event.bunchCrossing());
240     eventHeader_->SetExpType(event.experimentType());
241     eventHeader_->SetOrbitNumber(event.orbitNumber());
242     eventHeader_->SetStoreNumber(event.bunchCrossing());
243     eventHeader_->SetTimeStamp(event.time().value());
244 loizides 1.2
245 loizides 1.3 // look-up if entry is in map
246 loizides 1.2 map<UInt_t,Int_t>::iterator riter = runmap_.find(runnum);
247     if (riter != runmap_.end()) {
248     Int_t runentry = riter->second;
249     eventHeader_->SetRunEntry(runentry);
250 loizides 1.16 FillHltTrig(event,setup);
251 loizides 1.46 FillL1Trig(event,setup);
252 loizides 1.2 return;
253     }
254 loizides 1.1
255 loizides 1.2 // fill new run info
256     Int_t runentry = runEntries_;
257 loizides 1.16 ++runEntries_;
258 loizides 1.2 eventHeader_->SetRunEntry(runentry);
259     runmap_.insert(pair<UInt_t,Int_t>(runnum,runentry));
260 loizides 1.16 runInfo_->SetRunNum(runnum);
261    
262     Int_t hltentry = hltEntries_;
263 loizides 1.14 FillHltInfo(event,setup);
264 loizides 1.16 FillHltTrig(event,setup);
265 loizides 1.46 FillL1Trig(event,setup);
266 loizides 1.21 if (hltentry < hltEntries_) {
267     runInfo_->SetHltEntry(hltentry);
268 loizides 1.16 hltTree_->Fill();
269 loizides 1.21 } else {
270     runInfo_->SetHltEntry(hltentry-1);
271     }
272 loizides 1.14
273 loizides 1.2 runTree_->Fill();
274 loizides 1.1 }
275 loizides 1.5
276 loizides 1.8 //--------------------------------------------------------------------------------------------------
277 loizides 1.36 void FillerMetaInfos::FillHltInfo(const edm::Event &event, const edm::EventSetup &setup)
278 loizides 1.5 {
279 loizides 1.16 // Fill HLT trigger table if it changed.
280 loizides 1.5
281 loizides 1.36 if (!hltActive_)
282     return;
283 loizides 1.14
284 loizides 1.21 // check if we can access the hlt config information
285 loizides 1.33 if (hltProcName_.empty()) {
286     string teststr;
287 loizides 1.39 for(UInt_t i=0; i<hltProcNames_.size(); ++i) {
288 loizides 1.33 if (i>0)
289     teststr += ", ";
290     teststr += hltProcNames_.at(i);
291     edm::LogInfo("FillerMetaInfos") << "Trying to access hlt config using "
292     << hltProcNames_.at(i) << std::endl;
293    
294     if (hltConfig_.init(hltProcNames_.at(i))) {
295     hltProcName_ = hltProcNames_.at(i);
296     if (hltResName_.find(':')==string::npos)
297     hltResName_ += "::";
298     else
299     hltResName_ += ":";
300     hltResName_ += hltProcName_;
301     if (hltEvtName_.find(':')==string::npos)
302     hltEvtName_ += "::";
303     else
304     hltEvtName_ += ":";
305     hltEvtName_ += hltProcName_;
306     break;
307     }
308     }
309     if (hltProcName_.empty()) {
310     edm::LogError("FillerMetaInfos") << "Cannot access hlt config using "
311     << teststr << std::endl;
312     throw edm::Exception(edm::errors::Configuration, "FillerMetaInfos::FillHltInfo()\n")
313     << "Cannot access hlt config using " << teststr << std::endl;
314     return;
315     }
316     } else {
317     if (!hltConfig_.init(hltProcName_)) {
318     edm::LogError("FillerMetaInfos") << "Cannot access hlt config using "
319     << hltProcName_ << std::endl;
320     throw edm::Exception(edm::errors::Configuration, "FillerMetaInfos::FillHltInfo()\n")
321     << "Cannot access hlt config using " << hltProcName_ << std::endl;
322     return;
323     }
324 loizides 1.16 }
325 loizides 1.14
326 loizides 1.21 // check size of menu... < 256
327 loizides 1.16 if (hltConfig_.size()>hltBits_->Size()) {
328 loizides 1.21 edm::LogError("FillerMetaInfos") << "HLT config contains too many paths "
329 loizides 1.25 << hltConfig_.size() << " > "
330     << hltBits_->Size() << std::endl;
331 loizides 1.16 return;
332     }
333 loizides 1.14
334 loizides 1.22 vector<string> *trigtable = new vector<string>;
335 loizides 1.16 map<string,Short_t> *tabmap = new map<string,Short_t>;
336 loizides 1.22 vector<string> *labels = new vector<string>;
337 loizides 1.16 map<string,Short_t> *labmap = new map<string,Short_t>;
338    
339 loizides 1.28 if (0) {
340     if (!hltConfig_.tableName().empty())
341     trigtable->push_back(hltConfig_.tableName());
342     else
343     trigtable->push_back("unknown_hlt_config");
344     }
345    
346 loizides 1.40 // get HLT trigger object information to be able to access the tag information
347     Handle<trigger::TriggerEvent> triggerEventHLT;
348     GetProduct(hltEvtName_, triggerEventHLT, event);
349     const std::vector<std::string> &tags(triggerEventHLT->collectionTags());
350     for(UInt_t i=0,c=0; i<tags.size(); ++i) {
351     string tag(tags.at(i));
352     if (tag.compare(0,19,"hltL1extraParticles")!=0)
353     continue;
354     if (tag == "hltL1extraParticles::HLT") {
355     if (c==0)
356     tag = "hltL1extraParticles:Muon:HLT";
357     else if (c==1)
358     tag = "hltL1extraParticles:HFRing:HLT";
359     else
360     tag = Form("hltL1extraParticles:Unknown%d:HLT", c);
361     ++c;
362     }
363     map<string,Short_t>::iterator riter = labmap->find(tag);
364     if (riter == labmap->end()) {
365     labmap->insert(pair<string,Short_t>(tag,labels->size()));
366     labels->push_back(tag);
367     }
368     }
369    
370 loizides 1.21 // loop over hlt paths
371 loizides 1.16 for(UInt_t i=0;i<hltConfig_.size();++i) {
372    
373     tabmap->insert(pair<string,Short_t>(hltConfig_.triggerName(i),i));
374 loizides 1.22 trigtable->push_back(hltConfig_.triggerName(i));
375 loizides 1.16 const vector<string> &mLabels(hltConfig_.moduleLabels(i));
376     for (UInt_t j=0; j<mLabels.size(); ++j) {
377 loizides 1.19
378 loizides 1.16 const string& label(mLabels[j]);
379    
380 loizides 1.19 // remove characters which do not work: negation is included as !ModuleName
381     // (this might require a change in the underlying CMSSW HLT fwk, so watch out).
382     const char *lptr = &label[0];
383     if (label[0] == '!')
384     ++lptr;
385    
386     map<string,Short_t>::iterator riter = labmap->find(lptr);
387 loizides 1.16 if (riter == labmap->end()) {
388 loizides 1.22 labmap->insert(pair<string,Short_t>(lptr,labels->size()));
389     labels->push_back(lptr);
390 loizides 1.16 }
391 loizides 1.19
392     const string type(hltConfig_.moduleType(lptr));
393 loizides 1.16 riter = labmap->find(type);
394     if (riter == labmap->end()) {
395 loizides 1.22 labmap->insert(pair<string,Short_t>(type,labels->size()));
396     labels->push_back(type);
397 loizides 1.14 }
398     }
399     }
400    
401 loizides 1.46 if (l1Active_) {
402     edm::ESHandle<L1GtTriggerMenu> menuRcd;
403     setup.get<L1GtTriggerMenuRcd>().get(menuRcd) ;
404     const L1GtTriggerMenu* menu = menuRcd.product();
405    
406 loizides 1.50 // get L1 algo names
407 loizides 1.46 labels->push_back("xxx-L1AlgoNames-xxx");
408 loizides 1.51 size_t position = labels->size();
409     for (size_t kk = 0; kk<128; ++kk) {
410     labels->push_back(Form("UnusedL1Algo%d",kk));
411     }
412 loizides 1.46 for (CItAlgo algo = menu->gtAlgorithmMap().begin();
413     algo!=menu->gtAlgorithmMap().end(); ++algo) {
414 loizides 1.51 size_t act = position + algo->second.algoBitNumber();
415     if (act>=labels->size()) {
416     edm::LogError("FillerMetaInfos") << "Cannot store more than 128 L1 algorithm bits, but got "
417     << algo->second.algoBitNumber() << std::endl;
418     }
419     (*labels)[act] = algo->second.algoName();
420 loizides 1.46 }
421    
422 loizides 1.50 // get L1 tech names
423 loizides 1.48 labels->push_back("xxx-L1TechNames-xxx");
424 loizides 1.51 position = labels->size();
425     for (size_t kk = 0; kk<64; ++kk) {
426     labels->push_back(Form("UnusedL1Tech%d",kk));
427     }
428 loizides 1.46 for (CItAlgo algo = menu->gtTechnicalTriggerMap().begin();
429     algo!=menu->gtTechnicalTriggerMap().end(); ++algo) {
430 loizides 1.51 size_t act = position + algo->second.algoBitNumber();
431     if (act>=labels->size()) {
432     edm::LogError("FillerMetaInfos") << "Cannot store more than 64 L1 technical bits, but got "
433     << algo->second.algoBitNumber() << std::endl;
434     }
435     (*labels)[act] = algo->second.algoName();
436 loizides 1.46 }
437     }
438    
439 loizides 1.22 if (hltTable_->size()>=0) {
440 loizides 1.32 // check if existing table is equal to new table:
441     // if so keep it, otherwise store the new one
442 loizides 1.21
443 loizides 1.32 if ((hltTable_->size()==trigtable->size()) &&
444     (hltLabels_->size()==labels->size())) {
445 loizides 1.21
446     bool newEntryFound = false;
447 loizides 1.22 for (UInt_t i=0; i<trigtable->size(); ++i) {
448 loizides 1.32 if (trigtable->at(i) != hltTable_->at(i)) {
449 loizides 1.21 newEntryFound = true;
450     break;
451     }
452     }
453     if (!newEntryFound) {
454 loizides 1.22 for (UInt_t i=0; i<labels->size(); ++i) {
455 loizides 1.32 if (labels->at(i) != hltLabels_->at(i)) {
456 loizides 1.21 newEntryFound = true;
457     break;
458     }
459     }
460     }
461    
462     if (!newEntryFound) {
463     if (verbose_>1)
464     cout << "FillHltInfo: Kept previous HLT information" << endl;
465    
466     delete trigtable;
467     delete labels;
468     delete labmap;
469     delete tabmap;
470     return;
471     }
472 loizides 1.16 }
473 loizides 1.20 }
474 loizides 1.16
475 loizides 1.21 // new hlt entry
476 loizides 1.16 delete hltTable_;
477     delete hltLabels_;
478     delete hltTabMap_;
479     delete hltLabMap_;
480     hltTable_ = trigtable;
481     hltLabels_ = labels;
482     hltTabMap_ = tabmap;
483     hltLabMap_ = labmap;
484     hltEntries_++;
485     }
486    
487     //--------------------------------------------------------------------------------------------------
488 loizides 1.36 void FillerMetaInfos::FillHltTrig(const edm::Event &event, const edm::EventSetup &setup)
489 loizides 1.16 {
490     // Fill HLT trigger objects along triggered paths.
491    
492 loizides 1.36 if (!hltActive_)
493     return;
494 loizides 1.16
495     // reset trigger objects
496     hltObjs_->Reset();
497     hltRels_->Reset();
498 loizides 1.14
499 loizides 1.16 // get HLT trigger information
500 loizides 1.14 Handle<TriggerResults> triggerResultsHLT;
501 loizides 1.16 GetProduct(hltResName_, triggerResultsHLT, event);
502 loizides 1.5
503 loizides 1.16 // get HLT trigger object information
504     Handle<trigger::TriggerEvent> triggerEventHLT;
505     GetProduct(hltEvtName_, triggerEventHLT, event);
506    
507     if (verify_)
508     assert(triggerResultsHLT->size()==hltConfig_.size());
509    
510 loizides 1.25 // new bitmask
511 loizides 1.37 BitMask256 maskhlt;
512 loizides 1.16
513 loizides 1.37 // loop over trigger objects and fill them
514     const trigger::TriggerObjectCollection &toc(triggerEventHLT->getObjects());
515 loizides 1.39 const std::vector<std::string> &tags(triggerEventHLT->collectionTags());
516 loizides 1.40 for(UInt_t i=0,iprev=0,c=0; i<tags.size(); ++i) {
517    
518 loizides 1.41 Short_t tnind = -(i+1);
519 loizides 1.40 string tag(tags.at(i));
520     if (tag.compare(0,19,"hltL1extraParticles")==0) {
521     if (tag == "hltL1extraParticles::HLT") {
522     if (c==0)
523     tag = "hltL1extraParticles:Muon:HLT";
524     else if (c==1)
525     tag = "hltL1extraParticles:HFRing:HLT";
526     else
527     tag = Form("hltL1extraParticles:Unknown%d:HLT", c-1);
528     ++c;
529     }
530     map<string,Short_t>::iterator riter = hltLabMap_->find(tag);
531     if (riter != hltLabMap_->end()) {
532 loizides 1.41 tnind = riter->second;
533 loizides 1.40 }
534     }
535    
536 loizides 1.39 UInt_t inext(triggerEventHLT->collectionKey(i));
537     if (verbose_>2)
538 loizides 1.40 cout << i << " " << tag << " with " << inext-iprev << " objects " << endl;
539 loizides 1.39 for (UInt_t k=iprev; k<inext; ++k) {
540     const trigger::TriggerObject &tobj = toc[k];
541     TriggerObjectBase *trigObj = hltObjs_->Allocate();
542     new (trigObj) TriggerObjectBase(tobj.id(),0,tobj.pt(),tobj.eta(),tobj.phi(),tobj.mass());
543 loizides 1.41 trigObj->SetTagInd(tnind);
544 loizides 1.39 if (verbose_>4)
545     cout << " " << k << " " << tobj.id() << " " << tobj.pt() << " " << tobj.eta()
546     << " " << tobj.phi() << " " << tobj.mass() << endl;
547     }
548     iprev = inext;
549 loizides 1.37 }
550 loizides 1.16
551     // loop over trigger paths
552     const UInt_t N = hltConfig_.size();
553     for(UInt_t i=0;i<N;++i) {
554    
555     const string &name(hltConfig_.triggerName(i));
556 loizides 1.40 const UInt_t tind(hltConfig_.triggerIndex(name));
557 loizides 1.16 if (verify_)
558     assert(tind==i);
559    
560     if (verbose_>0)
561     cout << "Trigger: path " << name << " [" << i << "]" << endl;
562    
563     // get our trigger bit
564     map<string,Short_t>::iterator riter = hltTabMap_->find(name);
565     if (riter == hltTabMap_->end()) {
566     PrintErrorAndExit(Form("Trigger %s not found\n", name.c_str()));
567     }
568    
569     UInt_t mytind = riter->second;
570     if (verify_) {
571     if (mytind!=tind)
572     PrintErrorAndExit(Form("Trigger for %s index does not match: %ud %ud\n",
573     name.c_str(), mytind, tind));
574     }
575    
576     // modules on this trigger path
577     const UInt_t M(hltConfig_.size(tind));
578     const UInt_t mind(triggerResultsHLT->index(tind));
579     assert (mind<M);
580    
581     const vector<string> &mLabels(hltConfig_.moduleLabels(tind));
582    
583     if (verbose_>1)
584     cout << " Last active module - label/type: "
585     << mLabels[mind] << "/" << hltConfig_.moduleType(mLabels[mind])
586     << " [" << mind << " out of 0-" << (M-1) << " on this path]" << endl;
587    
588     // loop over modules on path
589     for (UInt_t j=0; j<=mind; ++j) {
590     const string &mLabel(mLabels[j]);
591    
592     // check whether the module is packed up in TriggerEvent product
593     const UInt_t find(triggerEventHLT->filterIndex(InputTag(mLabel,"",hltProcName_)));
594     if (find>=triggerEventHLT->sizeFilters())
595     continue;
596    
597     const string mType(hltConfig_.moduleType(mLabel));
598 loizides 1.37
599     string tType = "L1";
600     if (mType != "HLTLevel1GTSeed")
601     tType = "L3";
602    
603 loizides 1.16 if (verbose_>1)
604 loizides 1.37 cout << " '" << tType << "' filter in slot " << j
605     << " - label/type " << mLabel << "/" << mType << endl;
606 loizides 1.16
607     // find index for module label/type name
608     Short_t modind = -1;
609     map<string,Short_t>::iterator riter = hltLabMap_->find(mLabel);
610     if (riter != hltLabMap_->end()) {
611     modind = riter->second;
612     }
613 loizides 1.17 assert(modind!=-1);
614    
615     Short_t filind = -1;
616 loizides 1.16 riter = hltLabMap_->find(mType);
617     if (riter != hltLabMap_->end()) {
618 loizides 1.17 filind = riter->second;
619 loizides 1.16 }
620 loizides 1.17 assert(filind!=-1);
621 loizides 1.14
622 loizides 1.16 // find trigger objects
623     const trigger::Vids &vids(triggerEventHLT->filterIds(find));
624     const trigger::Keys &keys(triggerEventHLT->filterKeys(find));
625     const trigger::size_type nVids(vids.size());
626     const trigger::size_type nKeys(keys.size());
627     assert(nVids==nKeys);
628    
629     if (verbose_>2)
630 loizides 1.37 cout << " " << nVids << " accepted '" << tType << "' objects found: " << endl;
631 loizides 1.16
632     // loop over trigger objects
633     const trigger::TriggerObjectCollection &toc(triggerEventHLT->getObjects());
634     for (trigger::size_type k=0; k<nVids; ++k) {
635     Int_t tocind = keys[k];
636    
637     const trigger::TriggerObject &tobj(toc[tocind]);
638 loizides 1.37
639 loizides 1.16 if (verbose_>2)
640     cout << " " << k << " " << vids[k] << "/" << keys[k] << ": "
641     << tobj.id() << " " << tobj.pt() << " " << tobj.eta()
642     << " " << tobj.phi() << " " << tobj.mass() << endl;
643    
644     TriggerObjectRel *trigRel = hltRels_->Allocate();
645 loizides 1.37 new (trigRel) TriggerObjectRel(mytind,vids[k],tocind,modind,filind);
646 loizides 1.39 TriggerObjectBase *trigObj = hltObjs_->At(tocind);
647     if (trigObj->Type()==0) {
648     trigObj->SetType(vids[k]);
649     } else {
650     if (trigObj->Type()!=vids[k]) {
651     if (verbose_>3)
652     cout << " -> Have already type " << trigObj->Type()
653     << " ignored new type " << vids[k] << endl;
654     }
655     }
656 loizides 1.16 }
657     }
658 loizides 1.37
659     if (triggerResultsHLT->accept(tind))
660     maskhlt.SetBit(mytind);
661 loizides 1.16 }
662 loizides 1.25
663 loizides 1.37 hltBits_->SetBits(maskhlt);
664 loizides 1.16 hltObjs_->Trim();
665     hltRels_->Trim();
666 loizides 1.5 }
667 loizides 1.42
668     //--------------------------------------------------------------------------------------------------
669 loizides 1.46 void FillerMetaInfos::FillL1Trig(const edm::Event &event, const edm::EventSetup &setup)
670     {
671 loizides 1.50 // Fill L1 trigger bits after masking.
672 loizides 1.46
673     if (!l1Active_)
674     return;
675    
676     // get L1 trigger record information
677     Handle<L1GlobalTriggerRecord> gtRecord;
678     GetProduct(l1GTRecName_, gtRecord, event);
679    
680     // deal with algo bits
681 loizides 1.50 BitMask128 l1amask;
682 loizides 1.49 DecisionWord dw(gtRecord->decisionWord());
683     FillBitAMask(l1amask, dw);
684 loizides 1.46 l1ABits_->SetBits(l1amask);
685    
686     // deal with tech bits
687 loizides 1.50 BitMask128 l1tmask;
688 loizides 1.49 TechnicalTriggerWord tw(gtRecord->technicalTriggerWord());
689     FillBitTMask(l1tmask, tw);
690 loizides 1.46 l1TBits_->SetBits(l1tmask);
691 loizides 1.48
692 loizides 1.50 BitMask128 l1abmask;
693 loizides 1.49 DecisionWord dwb(gtRecord->decisionWordBeforeMask());
694     FillBitAMask(l1abmask, dwb);
695 loizides 1.48 l1ABits2_->SetBits(l1abmask);
696    
697     // deal with tech bits
698 loizides 1.50 BitMask128 l1tbmask;
699 loizides 1.49 TechnicalTriggerWord twb(gtRecord->technicalTriggerWordBeforeMask());
700     FillBitTMask(l1tbmask, twb);
701     l1TBits2_->SetBits(l1tbmask);
702    
703     // get L1 trigger readout record information if wanted
704     if (l1GTRRName_.size()==0)
705     return;
706    
707     Handle<L1GlobalTriggerReadoutRecord> gtReadoutRec;
708     GetProduct(l1GTRRName_, gtReadoutRec, event);
709    
710 loizides 1.51 const L1GtFdlWord &fdlword(gtReadoutRec->gtFdlWord());
711     eventHeader_->SetIsPhysDec(fdlword.physicsDeclared()==1);
712    
713 loizides 1.49 l1AbArr_->Reset();
714     const std::vector<L1GtFdlWord> &m_gtFdlWord(gtReadoutRec->gtFdlVector());
715     for (std::vector<L1GtFdlWord>::const_iterator itBx = m_gtFdlWord.begin();
716     itBx != m_gtFdlWord.end(); ++itBx) {
717 loizides 1.50 BitMask128 amask;
718 loizides 1.49 DecisionWord dw((*itBx).finalOR());
719     FillBitAMask(amask,dw);
720     mithep::L1TriggerMask *nm = l1AbArr_->Allocate();
721     new (nm) mithep::L1TriggerMask(amask);
722     nm->SetBx((*itBx).bxInEvent());
723     }
724    
725     l1TbArr_->Reset();
726     for (std::vector<L1GtFdlWord>::const_iterator itBx = m_gtFdlWord.begin();
727     itBx != m_gtFdlWord.end(); ++itBx) {
728 loizides 1.50 BitMask128 amask;
729 loizides 1.49 TechnicalTriggerWord dw((*itBx).gtTechnicalTriggerWord());
730     FillBitTMask(amask,dw);
731     mithep::L1TriggerMask *nm = l1TbArr_->Allocate();
732     new (nm) mithep::L1TriggerMask(amask);
733     nm->SetBx((*itBx).bxInEvent());
734 loizides 1.48 }
735 loizides 1.46 }
736    
737     //--------------------------------------------------------------------------------------------------
738 loizides 1.42 const char *FillerMetaInfos::Istr() const
739     {
740     // Return instance if instance > 0.
741    
742     if (instance_==0)
743     return "";
744    
745     return Form("_%d",instance_);
746     }