5
5
* Description: filter L1 bits and extract seed objects from L1 GT for HLT algorithms.
6
6
*
7
7
* Implementation:
8
- * This class is an HLTFilter (-> EDFilter). It implements:
8
+ * This class is an HLTStreamFilter (-> stream:: EDFilter). It implements:
9
9
* - filtering on Level-1 bits, given via a logical expression of algorithm names
10
10
* - extraction of the seed objects from L1 GT object map record
11
11
*
73
73
#include " FWCore/Framework/interface/ESHandle.h"
74
74
75
75
// constructors
76
- HLTLevel1GTSeed::HLTLevel1GTSeed (const edm::ParameterSet& parSet) : HLTFilter (parSet),
76
+ HLTLevel1GTSeed::HLTLevel1GTSeed (const edm::ParameterSet& parSet) : HLTStreamFilter (parSet),
77
77
// seeding done via L1 trigger object maps, with objects that fired
78
78
m_l1UseL1TriggerObjectMaps(parSet.getParameter<bool > (
79
79
" L1UseL1TriggerObjectMaps" )),
@@ -179,12 +179,9 @@ HLTLevel1GTSeed::HLTLevel1GTSeed(const edm::ParameterSet& parSet) : HLTFilter(pa
179
179
<< " Input tag for L1 muon collections: "
180
180
<< m_l1MuonCollectionTag << " \n " << std::endl;
181
181
182
- // initialize cached IDs
182
+ // initialize cache
183
+ m_l1GtMenu = nullptr ;
183
184
m_l1GtMenuCacheID = 0ULL ;
184
-
185
- m_l1GtTmAlgoCacheID = 0ULL ;
186
- m_l1GtTmTechCacheID = 0ULL ;
187
-
188
185
}
189
186
190
187
// destructor
@@ -271,6 +268,10 @@ bool HLTLevel1GTSeed::hltFilter(edm::Event& iEvent, const edm::EventSetup& evSet
271
268
filterproduct.addCollectionTag (m_l1EtMissMHTTag);
272
269
}
273
270
271
+ // get the trigger mask from the EventSetup
272
+ edm::ESHandle<L1GtTriggerMask> l1GtTmAlgo;
273
+ evSetup.get <L1GtTriggerMaskAlgoTrigRcd>().get (l1GtTmAlgo);
274
+
274
275
// get L1GlobalTriggerReadoutRecord and GT decision
275
276
edm::Handle <L1GlobalTriggerReadoutRecord> gtReadoutRecord;
276
277
iEvent.getByToken (m_l1GtReadoutRecordToken, gtReadoutRecord);
@@ -312,29 +313,14 @@ bool HLTLevel1GTSeed::hltFilter(edm::Event& iEvent, const edm::EventSetup& evSet
312
313
// seeding done via technical trigger bits
313
314
if (m_l1TechTriggerSeeding) {
314
315
315
- // get / update the trigger mask from the EventSetup
316
- // local cache & check on cacheIdentifier
317
- unsigned long long l1GtTmTechCacheID = evSetup.get <
318
- L1GtTriggerMaskTechTrigRcd>().cacheIdentifier ();
319
-
320
- if (m_l1GtTmTechCacheID != l1GtTmTechCacheID) {
321
-
322
- edm::ESHandle<L1GtTriggerMask> l1GtTmTech;
323
- evSetup.get <L1GtTriggerMaskTechTrigRcd>().get (l1GtTmTech);
324
- m_l1GtTmTech = l1GtTmTech.product ();
325
-
326
- m_triggerMaskTechTrig = m_l1GtTmTech->gtTriggerMask ();
327
-
328
- m_l1GtTmTechCacheID = l1GtTmTechCacheID;
329
-
330
- }
316
+ // get the technical trigger mask from the EventSetup
317
+ edm::ESHandle<L1GtTriggerMask> l1GtTmTech;
318
+ evSetup.get <L1GtTriggerMaskTechTrigRcd>().get (l1GtTmTech);
331
319
332
320
// get Global Trigger technical trigger word, update the tokenResult members
333
321
// from m_l1AlgoLogicParser and get the result for the logical expression
334
- const std::vector<bool >& gtTechTrigWord =
335
- gtReadoutRecord->technicalTriggerWord ();
336
- updateAlgoLogicParser (gtTechTrigWord, m_triggerMaskTechTrig,
337
- physicsDaqPartition);
322
+ const std::vector<bool >& gtTechTrigWord = gtReadoutRecord->technicalTriggerWord ();
323
+ updateAlgoLogicParser (gtTechTrigWord, l1GtTmTech->gtTriggerMask (), physicsDaqPartition);
338
324
339
325
// always empty filter - GT not aware of objects for technical triggers
340
326
bool seedsResult = m_l1AlgoLogicParser.expressionResult ();
@@ -359,12 +345,13 @@ bool HLTLevel1GTSeed::hltFilter(edm::Event& iEvent, const edm::EventSetup& evSet
359
345
360
346
edm::ESHandle<L1GtTriggerMenu> l1GtMenu;
361
347
evSetup.get <L1GtTriggerMenuRcd>().get (l1GtMenu);
362
- m_l1GtMenu = l1GtMenu.product ();
363
- (const_cast <L1GtTriggerMenu*> (m_l1GtMenu))->buildGtConditionMap (); // ...ugly
364
-
348
+ // make a copy of the L1GtTriggerMenu in order to call buildGtConditionMap() (FIXME - is this really needed ?)
349
+ delete m_l1GtMenu;
350
+ m_l1GtMenu = new L1GtTriggerMenu (* l1GtMenu.product ());
351
+ m_l1GtMenu->buildGtConditionMap ();
365
352
m_l1GtMenuCacheID = l1GtMenuCacheID;
366
353
367
- const AlgorithmMap& algorithmMap = l1GtMenu->gtAlgorithmMap ();
354
+ const AlgorithmMap& algorithmMap = l1GtMenu->gtAlgorithmMap ();
368
355
const AlgorithmMap& algorithmAliasMap = l1GtMenu->gtAlgorithmAliasMap ();
369
356
370
357
LogTrace (" HLTLevel1GTSeed" ) << " \n L1 trigger menu "
@@ -382,35 +369,13 @@ bool HLTLevel1GTSeed::hltFilter(edm::Event& iEvent, const edm::EventSetup& evSet
382
369
}
383
370
}
384
371
385
- // get / update the trigger mask from the EventSetup
386
- // local cache & check on cacheIdentifier
387
-
388
- unsigned long long l1GtTmAlgoCacheID = evSetup.get <
389
- L1GtTriggerMaskAlgoTrigRcd>().cacheIdentifier ();
390
-
391
- if (m_l1GtTmAlgoCacheID != l1GtTmAlgoCacheID) {
392
-
393
- edm::ESHandle<L1GtTriggerMask> l1GtTmAlgo;
394
- evSetup.get <L1GtTriggerMaskAlgoTrigRcd>().get (l1GtTmAlgo);
395
- m_l1GtTmAlgo = l1GtTmAlgo.product ();
396
-
397
- m_triggerMaskAlgoTrig = m_l1GtTmAlgo->gtTriggerMask ();
398
-
399
- m_l1GtTmAlgoCacheID = l1GtTmAlgoCacheID;
400
-
401
- }
402
-
403
372
// FinalOR is true, it was tested before
404
373
if (m_l1UseL1TriggerObjectMaps) {
405
- if (!(seedsL1TriggerObjectMaps (iEvent, filterproduct,
406
- gtReadoutRecordPtr, physicsDaqPartition))) {
374
+ if (not seedsL1TriggerObjectMaps (iEvent, filterproduct, l1GtTmAlgo.product (), gtReadoutRecordPtr, physicsDaqPartition))
407
375
return false ;
408
- }
409
376
} else {
410
- if (!( seedsL1Extra (iEvent, filterproduct))) {
377
+ if (not seedsL1Extra (iEvent, filterproduct))
411
378
return false ;
412
- }
413
-
414
379
}
415
380
416
381
if (m_isDebugEnabled) {
@@ -422,7 +387,7 @@ bool HLTLevel1GTSeed::hltFilter(edm::Event& iEvent, const edm::EventSetup& evSet
422
387
}
423
388
424
389
const std::vector<L1GtObject>* HLTLevel1GTSeed::objectTypeVec (const int chipNr,
425
- const std::string& cndName) {
390
+ const std::string& cndName) const {
426
391
427
392
const ConditionMap& conditionMap =
428
393
(m_l1GtMenu->gtConditionMap ()).at (chipNr);
@@ -437,11 +402,9 @@ const std::vector<L1GtObject>* HLTLevel1GTSeed::objectTypeVec(const int chipNr,
437
402
438
403
// for a new L1 Trigger menu, update the tokenNumber (holding the bit numbers)
439
404
// from m_l1AlgoLogicParser and from m_l1AlgoSeeds, and fill the m_l1AlgoSeedsRpn vector
440
- void HLTLevel1GTSeed::updateAlgoLogicParser (const L1GtTriggerMenu* l1GtMenu,
441
- const AlgorithmMap& algorithmMap) {
405
+ void HLTLevel1GTSeed::updateAlgoLogicParser (const L1GtTriggerMenu* l1GtMenu, const AlgorithmMap& algorithmMap) {
442
406
443
- std::vector<L1GtLogicParser::OperandToken>& algOpTokenVector =
444
- m_l1AlgoLogicParser.operandTokenVector ();
407
+ std::vector<L1GtLogicParser::OperandToken>& algOpTokenVector = m_l1AlgoLogicParser.operandTokenVector ();
445
408
446
409
size_t jSeed = 0 ;
447
410
size_t l1AlgoSeedsSize = m_l1AlgoSeeds.size ();
@@ -592,7 +555,7 @@ void HLTLevel1GTSeed::updateAlgoLogicParser(const std::vector<bool>& gtWord,
592
555
// (seeding via bit numbers) - done once in constructor
593
556
void HLTLevel1GTSeed::convertStringToBitNumber () {
594
557
595
- std::vector<L1GtLogicParser::OperandToken>& algOpTokenVector =
558
+ std::vector<L1GtLogicParser::OperandToken> & algOpTokenVector =
596
559
m_l1AlgoLogicParser.operandTokenVector ();
597
560
598
561
for (size_t i = 0 ; i < algOpTokenVector.size (); ++i) {
@@ -636,7 +599,8 @@ void HLTLevel1GTSeed::convertStringToBitNumber() {
636
599
637
600
// debug print grouped in a single function
638
601
// can be called for a new menu (bool "true") or for a new event
639
- void HLTLevel1GTSeed::debugPrint (bool newMenu) {
602
+ void HLTLevel1GTSeed::debugPrint (bool newMenu) const
603
+ {
640
604
641
605
if (m_l1TechTriggerSeeding) {
642
606
LogDebug (" HLTLevel1GTSeed" )
@@ -657,7 +621,7 @@ void HLTLevel1GTSeed::debugPrint(bool newMenu) {
657
621
}
658
622
}
659
623
660
- std::vector<L1GtLogicParser::OperandToken>& algOpTokenVector =
624
+ std::vector<L1GtLogicParser::OperandToken> const & algOpTokenVector =
661
625
m_l1AlgoLogicParser.operandTokenVector ();
662
626
663
627
LogTrace (" HLTLevel1GTSeed" )
@@ -748,13 +712,14 @@ void HLTLevel1GTSeed::debugPrint(bool newMenu) {
748
712
// seeding is done via L1 trigger object maps, considering the objects which fired in L1
749
713
bool HLTLevel1GTSeed::seedsL1TriggerObjectMaps (edm::Event& iEvent,
750
714
trigger::TriggerFilterObjectWithRefs & filterproduct,
715
+ const L1GtTriggerMask * l1GtTmAlgo,
751
716
const L1GlobalTriggerReadoutRecord* gtReadoutRecordPtr,
752
717
const int physicsDaqPartition) {
753
718
754
719
// get Global Trigger decision word, update the tokenResult members
755
720
// from m_l1AlgoLogicParser and get the result for the logical expression
756
721
const std::vector<bool >& gtDecisionWord = gtReadoutRecordPtr->decisionWord ();
757
- updateAlgoLogicParser (gtDecisionWord, m_triggerMaskAlgoTrig , physicsDaqPartition);
722
+ updateAlgoLogicParser (gtDecisionWord, l1GtTmAlgo-> gtTriggerMask () , physicsDaqPartition);
758
723
759
724
bool seedsResult = m_l1AlgoLogicParser.expressionResult ();
760
725
@@ -852,13 +817,13 @@ bool HLTLevel1GTSeed::seedsL1TriggerObjectMaps(edm::Event& iEvent,
852
817
}
853
818
854
819
const std::vector<L1GtLogicParser::OperandToken>& opTokenVecObjMap =
855
- objMap->operandTokenVector ();
820
+ objMap->operandTokenVector ();
856
821
857
822
const std::vector<L1GtLogicParser::TokenRPN>& algoSeedsRpn =
858
- * ( m_l1AlgoSeedsRpn.at (iAlgo) );
823
+ * ( m_l1AlgoSeedsRpn.at (iAlgo) );
859
824
860
825
const std::vector<const std::vector<L1GtObject>*>& algoSeedsObjTypeVec =
861
- m_l1AlgoSeedsObjType[iAlgo];
826
+ m_l1AlgoSeedsObjType[iAlgo];
862
827
863
828
//
864
829
L1GtLogicParser logicParserConditions (algoSeedsRpn, opTokenVecObjMap);
@@ -1321,7 +1286,7 @@ bool HLTLevel1GTSeed::seedsL1TriggerObjectMaps(edm::Event& iEvent,
1321
1286
// L1 conditions from the seeding logical expression for bunch crosses F, 0, 1
1322
1287
// directly from L1Extra and use them as seeds at HLT
1323
1288
// method and filter return true if at least an object is filled
1324
- bool HLTLevel1GTSeed::seedsL1Extra (edm::Event & iEvent, trigger::TriggerFilterObjectWithRefs & filterproduct) {
1289
+ bool HLTLevel1GTSeed::seedsL1Extra (edm::Event & iEvent, trigger::TriggerFilterObjectWithRefs & filterproduct) const {
1325
1290
1326
1291
1327
1292
@@ -1856,7 +1821,7 @@ bool HLTLevel1GTSeed::seedsL1Extra(edm::Event & iEvent, trigger::TriggerFilterOb
1856
1821
}
1857
1822
1858
1823
// detailed print of filter content
1859
- void HLTLevel1GTSeed::dumpTriggerFilterObjectWithRefs (trigger::TriggerFilterObjectWithRefs & filterproduct)
1824
+ void HLTLevel1GTSeed::dumpTriggerFilterObjectWithRefs (trigger::TriggerFilterObjectWithRefs & filterproduct) const
1860
1825
{
1861
1826
LogDebug (" HLTLevel1GTSeed" ) << " \n HLTLevel1GTSeed::hltFilter "
1862
1827
<< " \n Dump TriggerFilterObjectWithRefs\n " << std::endl;
@@ -2019,3 +1984,7 @@ void HLTLevel1GTSeed::dumpTriggerFilterObjectWithRefs(trigger::TriggerFilterObje
2019
1984
LogTrace (" HLTLevel1GTSeed" ) << " \n\n " << std::endl;
2020
1985
2021
1986
}
1987
+
1988
+ // register as framework plugin
1989
+ #include " FWCore/Framework/interface/MakerMacros.h"
1990
+ DEFINE_FWK_MODULE (HLTLevel1GTSeed);
0 commit comments