ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMetaInfos.cc
Revision: 1.57
Committed: Mon May 10 20:08:15 2010 UTC (14 years, 11 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_014pre3, Mit_014pre2, Mit_014pre1
Changes since 1.56: +27 -6 lines
Log Message:
Extract last available hlt process if none was specified

File Contents

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