ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.58
Committed: Sat May 29 11:58:47 2010 UTC (14 years, 11 months ago) by bendavid
Content type: text/plain
Branch: MAIN
Changes since 1.57: +51 -44 lines
Log Message:
Use new L1 GT utils to fill l1 info from triggermenulite

File Contents

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