ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.52
Committed: Tue Dec 15 00:46:57 2009 UTC (15 years, 4 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012i, Mit_012h, Mit_012g, Mit_012f
Changes since 1.51: +29 -46 lines
Log Message:
Fix hlt filling bug with multiple menus, still some possible issues, but only in very rare cases which should not happen in real life

File Contents

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