00001
00017
00018 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtUtils.h"
00019
00020
00021 #include <iomanip>
00022
00023
00024 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutSetupFwd.h"
00025 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
00026 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerRecord.h"
00027
00028 #include "FWCore/Framework/interface/ESHandle.h"
00029
00030 #include "CondFormats/L1TObjects/interface/L1GtStableParameters.h"
00031 #include "CondFormats/DataRecord/interface/L1GtStableParametersRcd.h"
00032
00033 #include "CondFormats/L1TObjects/interface/L1GtPrescaleFactors.h"
00034 #include "CondFormats/DataRecord/interface/L1GtPrescaleFactorsAlgoTrigRcd.h"
00035 #include "CondFormats/DataRecord/interface/L1GtPrescaleFactorsTechTrigRcd.h"
00036
00037 #include "CondFormats/L1TObjects/interface/L1GtTriggerMask.h"
00038 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskAlgoTrigRcd.h"
00039 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskTechTrigRcd.h"
00040
00041 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskVetoAlgoTrigRcd.h"
00042 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskVetoTechTrigRcd.h"
00043
00044 #include "CondFormats/L1TObjects/interface/L1GtTriggerMenu.h"
00045 #include "CondFormats/DataRecord/interface/L1GtTriggerMenuRcd.h"
00046
00047 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00048
00049
00050 L1GtUtils::L1GtUtils() :
00051
00052 m_l1GtStableParCacheID(0ULL), m_numberAlgorithmTriggers(0),
00053
00054 m_numberTechnicalTriggers(0),
00055
00056 m_l1GtPfAlgoCacheID(0ULL), m_l1GtPfTechCacheID(0ULL),
00057
00058 m_l1GtTmAlgoCacheID(0ULL), m_l1GtTmTechCacheID(0ULL),
00059
00060 m_l1GtTmVetoAlgoCacheID(0ULL), m_l1GtTmVetoTechCacheID(0ULL),
00061
00062 m_l1GtMenuCacheID(0ULL),
00063
00064 m_l1EventSetupValid(false),
00065
00066 m_l1GtMenuLiteValid(false),
00067
00068 m_beginRunCache(false),
00069
00070 m_runIDCache(0),
00071
00072 m_provRunIDCache(0),
00073
00074 m_physicsDaqPartition(0),
00075
00076 m_retrieveL1EventSetup(false),
00077
00078 m_retrieveL1GtTriggerMenuLite(false)
00079
00080 {
00081
00082
00083 }
00084
00085
00086 L1GtUtils::~L1GtUtils() {
00087
00088
00089
00090 }
00091
00092 const std::string L1GtUtils::triggerCategory(
00093 const TriggerCategory& trigCategory) const {
00094
00095 switch (trigCategory) {
00096 case AlgorithmTrigger: {
00097 return "Algorithm Trigger";
00098 }
00099 break;
00100 case TechnicalTrigger: {
00101 return "Technical Trigger";
00102 }
00103
00104 break;
00105 default: {
00106 return EmptyString;
00107 }
00108 break;
00109 }
00110 }
00111
00112
00113 void L1GtUtils::retrieveL1EventSetup(const edm::EventSetup& evSetup) {
00114
00115
00116 m_retrieveL1EventSetup = true;
00117
00118 m_l1EventSetupValid = true;
00119
00120
00121
00122
00123
00124 unsigned long long l1GtStableParCacheID =
00125 evSetup.get<L1GtStableParametersRcd>().cacheIdentifier();
00126
00127 if (m_l1GtStableParCacheID != l1GtStableParCacheID) {
00128
00129 edm::ESHandle<L1GtStableParameters> l1GtStablePar;
00130 evSetup.get<L1GtStableParametersRcd>().get(l1GtStablePar);
00131 m_l1GtStablePar = l1GtStablePar.product();
00132
00133
00134 m_numberAlgorithmTriggers = m_l1GtStablePar->gtNumberPhysTriggers();
00135
00136
00137 m_numberTechnicalTriggers =
00138 m_l1GtStablePar->gtNumberTechnicalTriggers();
00139
00140 int maxNumberTrigger = std::max(m_numberAlgorithmTriggers,
00141 m_numberTechnicalTriggers);
00142
00143 m_triggerMaskSet.reserve(maxNumberTrigger);
00144 m_prescaleFactorSet.reserve(maxNumberTrigger);
00145
00146
00147 m_l1GtStableParCacheID = l1GtStableParCacheID;
00148
00149 }
00150
00151
00152
00153
00154 unsigned long long l1GtPfAlgoCacheID =
00155 evSetup.get<L1GtPrescaleFactorsAlgoTrigRcd>().cacheIdentifier();
00156
00157 if (m_l1GtPfAlgoCacheID != l1GtPfAlgoCacheID) {
00158
00159 edm::ESHandle<L1GtPrescaleFactors> l1GtPfAlgo;
00160 evSetup.get<L1GtPrescaleFactorsAlgoTrigRcd>().get(l1GtPfAlgo);
00161 m_l1GtPfAlgo = l1GtPfAlgo.product();
00162
00163 m_prescaleFactorsAlgoTrig = &(m_l1GtPfAlgo->gtPrescaleFactors());
00164
00165 m_l1GtPfAlgoCacheID = l1GtPfAlgoCacheID;
00166
00167 }
00168
00169 unsigned long long l1GtPfTechCacheID = evSetup.get<
00170 L1GtPrescaleFactorsTechTrigRcd>().cacheIdentifier();
00171
00172 if (m_l1GtPfTechCacheID != l1GtPfTechCacheID) {
00173
00174 edm::ESHandle<L1GtPrescaleFactors> l1GtPfTech;
00175 evSetup.get<L1GtPrescaleFactorsTechTrigRcd>().get(l1GtPfTech);
00176 m_l1GtPfTech = l1GtPfTech.product();
00177
00178 m_prescaleFactorsTechTrig = &(m_l1GtPfTech->gtPrescaleFactors());
00179
00180 m_l1GtPfTechCacheID = l1GtPfTechCacheID;
00181
00182 }
00183
00184
00185
00186
00187 unsigned long long l1GtTmAlgoCacheID =
00188 evSetup.get<L1GtTriggerMaskAlgoTrigRcd>().cacheIdentifier();
00189
00190 if (m_l1GtTmAlgoCacheID != l1GtTmAlgoCacheID) {
00191
00192 edm::ESHandle<L1GtTriggerMask> l1GtTmAlgo;
00193 evSetup.get<L1GtTriggerMaskAlgoTrigRcd>().get(l1GtTmAlgo);
00194 m_l1GtTmAlgo = l1GtTmAlgo.product();
00195
00196 m_triggerMaskAlgoTrig = &(m_l1GtTmAlgo->gtTriggerMask());
00197
00198 m_l1GtTmAlgoCacheID = l1GtTmAlgoCacheID;
00199
00200 }
00201
00202 unsigned long long l1GtTmTechCacheID =
00203 evSetup.get<L1GtTriggerMaskTechTrigRcd>().cacheIdentifier();
00204
00205 if (m_l1GtTmTechCacheID != l1GtTmTechCacheID) {
00206
00207 edm::ESHandle<L1GtTriggerMask> l1GtTmTech;
00208 evSetup.get<L1GtTriggerMaskTechTrigRcd>().get(l1GtTmTech);
00209 m_l1GtTmTech = l1GtTmTech.product();
00210
00211 m_triggerMaskTechTrig = &(m_l1GtTmTech->gtTriggerMask());
00212
00213 m_l1GtTmTechCacheID = l1GtTmTechCacheID;
00214
00215 }
00216
00217 unsigned long long l1GtTmVetoAlgoCacheID =
00218 evSetup.get<L1GtTriggerMaskVetoAlgoTrigRcd>().cacheIdentifier();
00219
00220 if (m_l1GtTmVetoAlgoCacheID != l1GtTmVetoAlgoCacheID) {
00221
00222 edm::ESHandle<L1GtTriggerMask> l1GtTmVetoAlgo;
00223 evSetup.get<L1GtTriggerMaskVetoAlgoTrigRcd>().get(l1GtTmVetoAlgo);
00224 m_l1GtTmVetoAlgo = l1GtTmVetoAlgo.product();
00225
00226 m_triggerMaskVetoAlgoTrig = &(m_l1GtTmVetoAlgo->gtTriggerMask());
00227
00228 m_l1GtTmVetoAlgoCacheID = l1GtTmVetoAlgoCacheID;
00229
00230 }
00231
00232 unsigned long long l1GtTmVetoTechCacheID =
00233 evSetup.get<L1GtTriggerMaskVetoTechTrigRcd>().cacheIdentifier();
00234
00235 if (m_l1GtTmVetoTechCacheID != l1GtTmVetoTechCacheID) {
00236
00237 edm::ESHandle<L1GtTriggerMask> l1GtTmVetoTech;
00238 evSetup.get<L1GtTriggerMaskVetoTechTrigRcd>().get(l1GtTmVetoTech);
00239 m_l1GtTmVetoTech = l1GtTmVetoTech.product();
00240
00241 m_triggerMaskVetoTechTrig = &(m_l1GtTmVetoTech->gtTriggerMask());
00242
00243 m_l1GtTmVetoTechCacheID = l1GtTmVetoTechCacheID;
00244
00245 }
00246
00247
00248
00249
00250 unsigned long long l1GtMenuCacheID =
00251 evSetup.get<L1GtTriggerMenuRcd>().cacheIdentifier();
00252
00253 if (m_l1GtMenuCacheID != l1GtMenuCacheID) {
00254
00255 edm::ESHandle<L1GtTriggerMenu> l1GtMenu;
00256 evSetup.get<L1GtTriggerMenuRcd>().get(l1GtMenu);
00257 m_l1GtMenu = l1GtMenu.product();
00258
00259 m_algorithmMap = &(m_l1GtMenu->gtAlgorithmMap());
00260 m_algorithmAliasMap = &(m_l1GtMenu->gtAlgorithmAliasMap());
00261
00262 m_technicalTriggerMap = &(m_l1GtMenu->gtTechnicalTriggerMap());
00263
00264 m_l1GtMenuCacheID = l1GtMenuCacheID;
00265
00266 }
00267
00268 }
00269
00270
00271 void L1GtUtils::retrieveL1GtTriggerMenuLite(const edm::Run& iRun,
00272 const edm::InputTag& l1GtMenuLiteInputTag) {
00273
00274
00275 m_retrieveL1GtTriggerMenuLite = true;
00276
00277
00278 edm::Handle<L1GtTriggerMenuLite> l1GtMenuLite;
00279 iRun.getByLabel(l1GtMenuLiteInputTag, l1GtMenuLite);
00280
00281 if (!l1GtMenuLite.isValid()) {
00282
00283 LogDebug("L1GtUtils") << "\nL1GtTriggerMenuLite with \n "
00284 << l1GtMenuLiteInputTag
00285 << "\nrequested in configuration, but not found in the event."
00286 << std::endl;
00287
00288 m_l1GtMenuLiteValid = false;
00289 } else {
00290 m_l1GtMenuLite = l1GtMenuLite.product();
00291 m_l1GtMenuLiteValid = true;
00292
00293 LogDebug("L1GtUtils") << "\nL1GtTriggerMenuLite with \n "
00294 << l1GtMenuLiteInputTag << "\nretrieved for run "
00295 << iRun.runAuxiliary().run() << std::endl;
00296
00297 m_algorithmMapLite = &(m_l1GtMenuLite->gtAlgorithmMap());
00298 m_algorithmAliasMapLite = &(m_l1GtMenuLite->gtAlgorithmAliasMap());
00299 m_technicalTriggerMapLite = &(m_l1GtMenuLite->gtTechnicalTriggerMap());
00300
00301 m_triggerMaskAlgoTrigLite = &(m_l1GtMenuLite->gtTriggerMaskAlgoTrig());
00302 m_triggerMaskTechTrigLite = &(m_l1GtMenuLite->gtTriggerMaskTechTrig());
00303
00304 m_prescaleFactorsAlgoTrigLite
00305 = &(m_l1GtMenuLite->gtPrescaleFactorsAlgoTrig());
00306 m_prescaleFactorsTechTrigLite
00307 = &(m_l1GtMenuLite->gtPrescaleFactorsTechTrig());
00308
00309 }
00310
00311 }
00312
00313 void L1GtUtils::getL1GtRunCache(const edm::Run& iRun,
00314 const edm::EventSetup& evSetup, const bool useL1EventSetup,
00315 const bool useL1GtTriggerMenuLite, const edm::InputTag& l1GtTmLInputTag) {
00316
00317
00318
00319 m_beginRunCache = true;
00320
00321
00322
00323 if (useL1EventSetup) {
00324 retrieveL1EventSetup(evSetup);
00325 }
00326
00327
00328
00329
00330
00331
00332 if (useL1GtTriggerMenuLite) {
00333 retrieveL1GtTriggerMenuLite(iRun, l1GtTmLInputTag);
00334 }
00335
00336 }
00337
00338
00339 void L1GtUtils::getL1GtRunCache(const edm::Run& iRun,
00340 const edm::EventSetup& evSetup, bool useL1EventSetup,
00341 bool useL1GtTriggerMenuLite) {
00342
00343 if (useL1GtTriggerMenuLite) {
00344 getL1GtTriggerMenuLiteInputTag(iRun, m_provL1GtTriggerMenuLiteInputTag);
00345
00346 }
00347
00348 getL1GtRunCache(iRun, evSetup, useL1EventSetup, useL1GtTriggerMenuLite,
00349 m_provL1GtTriggerMenuLiteInputTag);
00350
00351 }
00352
00353
00354
00355 void L1GtUtils::getL1GtRunCache(const edm::Event& iEvent,
00356 const edm::EventSetup& evSetup, const bool useL1EventSetup,
00357 const bool useL1GtTriggerMenuLite, const edm::InputTag& l1GtTmLInputTag) {
00358
00359
00360 if (!m_beginRunCache) {
00361
00362
00363
00364 if (useL1EventSetup) {
00365 retrieveL1EventSetup(evSetup);
00366 }
00367 }
00368
00369
00370
00371 const edm::Run& iRun = iEvent.getRun();
00372 edm::RunID runID = iRun.runAuxiliary().id();
00373
00374 if (runID != m_runIDCache) {
00375
00376 if (!m_beginRunCache) {
00377
00378
00379
00380 if (useL1GtTriggerMenuLite) {
00381 retrieveL1GtTriggerMenuLite(iRun, l1GtTmLInputTag);
00382 }
00383 }
00384
00385
00386
00387 getL1GtRecordInputTag(iEvent, m_provL1GtRecordInputTag,
00388 m_provL1GtReadoutRecordInputTag);
00389
00390
00391 m_runIDCache = runID;
00392
00393 }
00394
00395 }
00396
00397
00398 void L1GtUtils::getL1GtRunCache(const edm::Event& iEvent,
00399 const edm::EventSetup& evSetup, const bool useL1EventSetup,
00400 const bool useL1GtTriggerMenuLite) {
00401
00402
00403 if (!m_beginRunCache) {
00404
00405 const edm::Run& iRun = iEvent.getRun();
00406 edm::RunID runID = iRun.runAuxiliary().id();
00407
00408 if (runID != m_provRunIDCache) {
00409
00410 if (useL1GtTriggerMenuLite) {
00411
00412 getL1GtTriggerMenuLiteInputTag(iRun,
00413 m_provL1GtTriggerMenuLiteInputTag);
00414 }
00415
00416
00417 m_provRunIDCache = runID;
00418 }
00419
00420 }
00421
00422
00423 getL1GtRunCache(iEvent, evSetup, useL1EventSetup, useL1GtTriggerMenuLite,
00424 m_provL1GtTriggerMenuLiteInputTag);
00425
00426 }
00427
00428
00429 void L1GtUtils::getL1GtRecordInputTag(const edm::Event& iEvent,
00430 edm::InputTag& l1GtRecordInputTag,
00431 edm::InputTag& l1GtReadoutRecordInputTag) const {
00432
00433 typedef std::vector<edm::Provenance const*> Provenances;
00434 Provenances provenances;
00435 std::string friendlyName;
00436 std::string modLabel;
00437 std::string instanceName;
00438 std::string processName;
00439
00440 bool foundL1GtRecord = false;
00441 bool foundL1GtReadoutRecord = false;
00442
00443 LogDebug("L1GtUtils") << "\nTry to get AllProvenance for event "
00444 << iEvent.id().event() << std::endl;
00445
00446 iEvent.getAllProvenance(provenances);
00447
00448 LogTrace("L1GtUtils") << "\n" << "Event contains " << provenances.size()
00449 << " product" << (provenances.size() == 1 ? "" : "s")
00450 << " with friendlyClassName, moduleLabel, productInstanceName and processName:\n"
00451 << std::endl;
00452
00453 for (Provenances::iterator itProv = provenances.begin(), itProvEnd =
00454 provenances.end(); itProv != itProvEnd; ++itProv) {
00455
00456 friendlyName = (*itProv)->friendlyClassName();
00457 modLabel = (*itProv)->moduleLabel();
00458 instanceName = (*itProv)->productInstanceName();
00459 processName = (*itProv)->processName();
00460
00461 LogTrace("L1GtUtils") << friendlyName << "\t \"" << modLabel
00462 << "\" \t \"" << instanceName << "\" \t \"" << processName
00463 << "\"" << std::endl;
00464
00465 if (friendlyName == "L1GlobalTriggerRecord") {
00466 l1GtRecordInputTag = edm::InputTag(modLabel, instanceName,
00467 processName);
00468 foundL1GtRecord = true;
00469 } else if (friendlyName == "L1GlobalTriggerReadoutRecord") {
00470
00471 l1GtReadoutRecordInputTag = edm::InputTag(modLabel, instanceName,
00472 processName);
00473 foundL1GtReadoutRecord = true;
00474 }
00475 }
00476
00477
00478 if (!foundL1GtRecord) {
00479 l1GtRecordInputTag = edm::InputTag();
00480 } else {
00481 LogTrace("L1GtUtils")
00482 << "\nL1GlobalTriggerRecord found in the event with \n "
00483 << l1GtRecordInputTag << std::endl;
00484 }
00485
00486 if (!foundL1GtReadoutRecord) {
00487 l1GtReadoutRecordInputTag = edm::InputTag();
00488 } else {
00489 LogTrace("L1GtUtils")
00490 << "\nL1GlobalTriggerReadoutRecord found in the event with \n "
00491 << l1GtReadoutRecordInputTag << std::endl;
00492 }
00493
00494 }
00495
00496 void L1GtUtils::getL1GtTriggerMenuLiteInputTag(const edm::Run& iRun,
00497 edm::InputTag& l1GtTriggerMenuLiteInputTag) const {
00498
00499 typedef std::vector<edm::Provenance const*> Provenances;
00500 Provenances provenances;
00501 std::string friendlyName;
00502 std::string modLabel;
00503 std::string instanceName;
00504 std::string processName;
00505
00506 bool foundL1GtTriggerMenuLite = false;
00507
00508 LogDebug("L1GtUtils") << "\nTry to get AllProvenance for run "
00509 << iRun.runAuxiliary().run() << std::endl;
00510
00511 iRun.getAllProvenance(provenances);
00512
00513 LogTrace("L1GtUtils") << "\n" << "Run contains " << provenances.size()
00514 << " product" << (provenances.size() == 1 ? "" : "s")
00515 << " with friendlyClassName, moduleLabel, productInstanceName and processName:\n"
00516 << std::endl;
00517
00518 for (Provenances::iterator itProv = provenances.begin(), itProvEnd =
00519 provenances.end(); itProv != itProvEnd; ++itProv) {
00520
00521 friendlyName = (*itProv)->friendlyClassName();
00522 modLabel = (*itProv)->moduleLabel();
00523 instanceName = (*itProv)->productInstanceName();
00524 processName = (*itProv)->processName();
00525
00526 LogTrace("L1GtUtils") << friendlyName << "\t \"" << modLabel
00527 << "\" \t \"" << instanceName << "\" \t \"" << processName
00528 << "\"" << std::endl;
00529
00530 if (friendlyName == "L1GtTriggerMenuLite") {
00531 l1GtTriggerMenuLiteInputTag = edm::InputTag(modLabel, instanceName,
00532 processName);
00533 foundL1GtTriggerMenuLite = true;
00534 }
00535
00536 }
00537
00538 if (!foundL1GtTriggerMenuLite) {
00539 l1GtTriggerMenuLiteInputTag = edm::InputTag();
00540 LogTrace("L1GtUtils") << "\nL1GtTriggerMenuLite not found in Run"
00541 << std::endl;
00542 } else {
00543 LogTrace("L1GtUtils") << "\nL1GtTriggerMenuLite found in Run with \n "
00544 << l1GtTriggerMenuLiteInputTag << std::endl;
00545 }
00546
00547 }
00548
00549
00550 const bool L1GtUtils::l1AlgoTechTrigBitNumber(
00551 const std::string& nameAlgoTechTrig, TriggerCategory& trigCategory,
00552 int& bitNumber) const {
00553
00554 trigCategory = AlgorithmTrigger;
00555 bitNumber = -1;
00556
00557 if (m_retrieveL1GtTriggerMenuLite) {
00558 if (m_l1GtMenuLiteValid) {
00559
00560
00561 for (L1GtTriggerMenuLite::CItL1Trig itTrig =
00562 m_algorithmAliasMapLite->begin(); itTrig
00563 != m_algorithmAliasMapLite->end(); itTrig++) {
00564
00565 if (itTrig->second == nameAlgoTechTrig) {
00566
00567 trigCategory = AlgorithmTrigger;
00568 bitNumber = itTrig->first;
00569
00570 return true;
00571 }
00572 }
00573
00574
00575 for (L1GtTriggerMenuLite::CItL1Trig itTrig =
00576 m_algorithmMapLite->begin(); itTrig
00577 != m_algorithmMapLite->end(); itTrig++) {
00578
00579 if (itTrig->second == nameAlgoTechTrig) {
00580
00581 trigCategory = AlgorithmTrigger;
00582 bitNumber = itTrig->first;
00583
00584 return true;
00585 }
00586 }
00587
00588
00589 for (L1GtTriggerMenuLite::CItL1Trig itTrig =
00590 m_technicalTriggerMapLite->begin(); itTrig
00591 != m_technicalTriggerMapLite->end(); itTrig++) {
00592
00593 if (itTrig->second == nameAlgoTechTrig) {
00594
00595 trigCategory = TechnicalTrigger;
00596 bitNumber = itTrig->first;
00597
00598 return true;
00599 }
00600 }
00601
00602 } else if (m_retrieveL1EventSetup) {
00603
00604
00605 CItAlgo itAlgo = m_algorithmAliasMap->find(nameAlgoTechTrig);
00606 if (itAlgo != m_algorithmAliasMap->end()) {
00607 trigCategory = AlgorithmTrigger;
00608 bitNumber = (itAlgo->second).algoBitNumber();
00609
00610 return true;
00611 }
00612
00613
00614 itAlgo = m_algorithmMap->find(nameAlgoTechTrig);
00615 if (itAlgo != m_algorithmMap->end()) {
00616 trigCategory = AlgorithmTrigger;
00617 bitNumber = (itAlgo->second).algoBitNumber();
00618
00619 return true;
00620 }
00621
00622
00623 itAlgo = m_technicalTriggerMap->find(nameAlgoTechTrig);
00624 if (itAlgo != m_technicalTriggerMap->end()) {
00625 trigCategory = TechnicalTrigger;
00626 bitNumber = (itAlgo->second).algoBitNumber();
00627
00628 return true;
00629 }
00630
00631 } else {
00632
00633 return false;
00634
00635 }
00636 } else if (m_retrieveL1EventSetup) {
00637
00638
00639 CItAlgo itAlgo = m_algorithmAliasMap->find(nameAlgoTechTrig);
00640 if (itAlgo != m_algorithmAliasMap->end()) {
00641 trigCategory = AlgorithmTrigger;
00642 bitNumber = (itAlgo->second).algoBitNumber();
00643
00644 return true;
00645 }
00646
00647
00648 itAlgo = m_algorithmMap->find(nameAlgoTechTrig);
00649 if (itAlgo != m_algorithmMap->end()) {
00650 trigCategory = AlgorithmTrigger;
00651 bitNumber = (itAlgo->second).algoBitNumber();
00652
00653 return true;
00654 }
00655
00656
00657 itAlgo = m_technicalTriggerMap->find(nameAlgoTechTrig);
00658 if (itAlgo != m_technicalTriggerMap->end()) {
00659 trigCategory = TechnicalTrigger;
00660 bitNumber = (itAlgo->second).algoBitNumber();
00661
00662 return true;
00663 }
00664
00665 } else {
00666
00667 return false;
00668
00669 }
00670
00671
00672 return false;
00673
00674
00675 }
00676
00677 const bool L1GtUtils::l1TriggerNameFromBit(const int& bitNumber,
00678 const TriggerCategory& trigCategory, std::string& aliasL1Trigger,
00679 std::string& nameL1Trigger) const {
00680
00681 aliasL1Trigger.clear();
00682 nameL1Trigger.clear();
00683
00684 if (m_retrieveL1GtTriggerMenuLite) {
00685 if (m_l1GtMenuLiteValid) {
00686
00687
00688 if (trigCategory == AlgorithmTrigger) {
00689
00690 bool trigAliasFound = false;
00691 bool trigNameFound = false;
00692
00693 for (L1GtTriggerMenuLite::CItL1Trig itTrig =
00694 m_algorithmAliasMapLite->begin();
00695 itTrig != m_algorithmAliasMapLite->end(); itTrig++) {
00696
00697 if (static_cast<int>(itTrig->first) == bitNumber) {
00698 aliasL1Trigger = itTrig->second;
00699 trigAliasFound = true;
00700 break;
00701 }
00702 }
00703
00704 for (L1GtTriggerMenuLite::CItL1Trig itTrig =
00705 m_algorithmMapLite->begin();
00706 itTrig != m_algorithmMapLite->end(); itTrig++) {
00707
00708 if (static_cast<int>(itTrig->first) == bitNumber) {
00709 nameL1Trigger = itTrig->second;
00710 trigNameFound = true;
00711 break;
00712 }
00713 }
00714
00715 if (!(trigAliasFound && trigNameFound)) {
00716 return false;
00717 }
00718
00719 return true;
00720
00721 } else if (trigCategory == TechnicalTrigger) {
00722
00723
00724
00725 bool trigNameFound = false;
00726
00727 for (L1GtTriggerMenuLite::CItL1Trig itTrig =
00728 m_technicalTriggerMapLite->begin();
00729 itTrig != m_technicalTriggerMapLite->end(); itTrig++) {
00730
00731 if (static_cast<int>(itTrig->first) == bitNumber) {
00732 nameL1Trigger = itTrig->second;
00733
00734
00735
00736 aliasL1Trigger = itTrig->second;
00737
00738 trigNameFound = true;
00739 break;
00740 }
00741 }
00742
00743 if (!(trigNameFound)) {
00744 return false;
00745 }
00746
00747 return true;
00748
00749 } else {
00750
00751
00752 return false;
00753 }
00754
00755 } else if (m_retrieveL1EventSetup) {
00756
00757
00758 if (trigCategory == AlgorithmTrigger) {
00759
00760 bool trigAliasFound = false;
00761
00762 for (CItAlgo itTrig = m_algorithmAliasMap->begin();
00763 itTrig != m_algorithmAliasMap->end(); itTrig++) {
00764
00765 if ((itTrig->second).algoBitNumber() == bitNumber) {
00766 aliasL1Trigger = itTrig->first;
00767
00768 nameL1Trigger = (itTrig->second).algoName();
00769
00770 trigAliasFound = true;
00771 break;
00772 }
00773 }
00774
00775 if (!(trigAliasFound)) {
00776 return false;
00777 }
00778
00779 return true;
00780
00781 } else if (trigCategory == TechnicalTrigger) {
00782
00783
00784
00785 bool trigNameFound = false;
00786
00787 for (CItAlgo itTrig = m_technicalTriggerMap->begin();
00788 itTrig != m_technicalTriggerMap->end(); itTrig++) {
00789
00790 if ((itTrig->second).algoBitNumber() == bitNumber) {
00791 nameL1Trigger = (itTrig->second).algoName();
00792
00793
00794 aliasL1Trigger = nameL1Trigger;
00795
00796 trigNameFound = true;
00797 break;
00798 }
00799 }
00800
00801 if (!(trigNameFound)) {
00802 return false;
00803 }
00804
00805 return true;
00806
00807 } else {
00808
00809
00810 return false;
00811 }
00812
00813 } else {
00814
00815 return false;
00816
00817 }
00818 } else if (m_retrieveL1EventSetup) {
00819
00820
00821 if (trigCategory == AlgorithmTrigger) {
00822
00823 bool trigAliasFound = false;
00824
00825 for (CItAlgo itTrig = m_algorithmAliasMap->begin();
00826 itTrig != m_algorithmAliasMap->end(); itTrig++) {
00827
00828 if ((itTrig->second).algoBitNumber() == bitNumber) {
00829 aliasL1Trigger = itTrig->first;
00830
00831 nameL1Trigger = (itTrig->second).algoName();
00832
00833 trigAliasFound = true;
00834 break;
00835 }
00836 }
00837
00838 if (!(trigAliasFound)) {
00839 return false;
00840 }
00841
00842 return true;
00843
00844 } else if (trigCategory == TechnicalTrigger) {
00845
00846
00847
00848 bool trigNameFound = false;
00849
00850 for (CItAlgo itTrig = m_technicalTriggerMap->begin();
00851 itTrig != m_technicalTriggerMap->end(); itTrig++) {
00852
00853 if ((itTrig->second).algoBitNumber() == bitNumber) {
00854 nameL1Trigger = (itTrig->second).algoName();
00855
00856
00857 aliasL1Trigger = itTrig->first;
00858
00859 trigNameFound = true;
00860 break;
00861 }
00862 }
00863
00864 if (!(trigNameFound)) {
00865 return false;
00866 }
00867
00868 return true;
00869
00870 } else {
00871
00872
00873 return false;
00874 }
00875
00876 } else {
00877
00878 return false;
00879
00880 }
00881
00882
00883 return false;
00884
00885 }
00886
00887 const int L1GtUtils::l1Results(const edm::Event& iEvent,
00888 const edm::InputTag& l1GtRecordInputTag,
00889 const edm::InputTag& l1GtReadoutRecordInputTag,
00890 const std::string& nameAlgoTechTrig, bool& decisionBeforeMask,
00891 bool& decisionAfterMask, int& prescaleFactor, int& triggerMask) const {
00892
00893
00894 decisionBeforeMask = false;
00895 decisionAfterMask = false;
00896 prescaleFactor = -1;
00897 triggerMask = -1;
00898
00899
00900 int iError = 0;
00901 int l1ConfCode = 0;
00902
00903
00904
00905 if (!availableL1Configuration(iError, l1ConfCode)) {
00906 return iError;
00907 }
00908
00909
00910
00911
00912
00913
00914
00915 TriggerCategory trigCategory = AlgorithmTrigger;
00916 int bitNumber = -1;
00917
00918
00919 if (!l1AlgoTechTrigBitNumber(nameAlgoTechTrig, trigCategory, bitNumber)) {
00920
00921 iError = l1ConfCode + 1;
00922
00923 if (m_retrieveL1GtTriggerMenuLite) {
00924 if (m_l1GtMenuLiteValid) {
00925
00926 LogDebug("L1GtUtils") << "\nAlgorithm/technical trigger \n "
00927 << nameAlgoTechTrig
00928 << "\not found in the trigger menu \n "
00929 << m_l1GtMenuLite->gtTriggerMenuImplementation()
00930 << "\nretrieved from L1GtTriggerMenuLite" << std::endl;
00931
00932 } else {
00933
00934
00935 LogDebug("L1GtUtils") << "\nAlgorithm/technical trigger \n "
00936 << nameAlgoTechTrig
00937 << "\not found in the trigger menu \n "
00938 << m_l1GtMenu->gtTriggerMenuImplementation()
00939 << "\nretrieved from Event Setup" << std::endl;
00940
00941 }
00942
00943 } else {
00944
00945 LogDebug("L1GtUtils") << "\nAlgorithm/technical trigger \n "
00946 << nameAlgoTechTrig
00947 << "\not found in the trigger menu \n "
00948 << m_l1GtMenu->gtTriggerMenuImplementation()
00949 << "\nretrieved from Event Setup" << std::endl;
00950
00951 }
00952
00953 return iError;
00954
00955 }
00956
00957
00958
00959
00960 if (bitNumber < 0) {
00961
00962 iError = l1ConfCode + 2;
00963
00964 if (m_retrieveL1GtTriggerMenuLite) {
00965 if (m_l1GtMenuLiteValid) {
00966 LogDebug("L1GtUtils") << "\nNegative bit number for "
00967 << triggerCategory(trigCategory) << "\n "
00968 << nameAlgoTechTrig << "\nfrom menu \n "
00969 << m_l1GtMenuLite->gtTriggerMenuImplementation()
00970 << "\nretrieved from L1GtTriggerMenuLite" << std::endl;
00971
00972 } else {
00973
00974 LogDebug("L1GtUtils") << "\nNegative bit number for "
00975 << triggerCategory(trigCategory) << "\n "
00976 << nameAlgoTechTrig << "\nfrom menu \n "
00977 << m_l1GtMenu->gtTriggerMenuImplementation()
00978 << "\nretrieved from Event Setup" << std::endl;
00979
00980 }
00981
00982 } else {
00983
00984 LogDebug("L1GtUtils") << "\nNegative bit number for "
00985 << triggerCategory(trigCategory) << "\n "
00986 << nameAlgoTechTrig << "\nfrom menu \n "
00987 << m_l1GtMenu->gtTriggerMenuImplementation()
00988 << "\nretrieved from Event Setup" << std::endl;
00989
00990 }
00991
00992 return iError;
00993 }
00994
00995
00996
00997
00998
00999
01000 int iErrorRecord = 0;
01001
01002 bool validRecord = false;
01003 bool gtReadoutRecordValid = false;
01004
01005 edm::Handle<L1GlobalTriggerRecord> gtRecord;
01006 iEvent.getByLabel(l1GtRecordInputTag, gtRecord);
01007
01008 if (gtRecord.isValid()) {
01009
01010 validRecord = true;
01011
01012 } else {
01013
01014 iErrorRecord = 10;
01015 LogDebug("L1GtUtils") << "\nL1GlobalTriggerRecord with \n "
01016 << l1GtRecordInputTag << "\nnot found in the event."
01017 << std::endl;
01018 }
01019
01020 edm::Handle<L1GlobalTriggerReadoutRecord> gtReadoutRecord;
01021 iEvent.getByLabel(l1GtReadoutRecordInputTag, gtReadoutRecord);
01022
01023 if (gtReadoutRecord.isValid()) {
01024
01025 gtReadoutRecordValid = true;
01026 validRecord = true;
01027
01028 } else {
01029
01030 iErrorRecord = iErrorRecord + 100;
01031 LogDebug("L1GtUtils") << "\nL1GlobalTriggerReadoutRecord with \n "
01032 << l1GtReadoutRecordInputTag << "\nnot found in the event."
01033 << std::endl;
01034
01035 }
01036
01037
01038
01039
01040
01041
01042
01043 int pfIndexTechTrig = -1;
01044 int pfIndexAlgoTrig = -1;
01045
01046 if (validRecord) {
01047 if (gtReadoutRecordValid) {
01048
01049 pfIndexTechTrig
01050 = (gtReadoutRecord->gtFdlWord()).gtPrescaleFactorIndexTech();
01051 pfIndexAlgoTrig
01052 = (gtReadoutRecord->gtFdlWord()).gtPrescaleFactorIndexAlgo();
01053
01054 } else {
01055
01056 pfIndexTechTrig
01057 = static_cast<int> (gtRecord->gtPrescaleFactorIndexTech());
01058 pfIndexAlgoTrig
01059 = static_cast<int> (gtRecord->gtPrescaleFactorIndexAlgo());
01060
01061 }
01062
01063 } else {
01064
01065 LogDebug("L1GtUtils") << "\nError: "
01066 << "\nNo valid L1GlobalTriggerRecord with \n "
01067 << l1GtRecordInputTag << "\nfound in the event."
01068 << "\nNo valid L1GlobalTriggerReadoutRecord with \n "
01069 << l1GtReadoutRecordInputTag << "\nfound in the event."
01070 << std::endl;
01071
01072 iError = l1ConfCode + iErrorRecord;
01073 return iError;
01074
01075 }
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085 size_t pfSetsSize = 0;
01086 int pfIndex = -1;
01087 const std::vector<int>* prescaleFactorsSubset = 0;
01088 const std::vector<unsigned int>* triggerMasksSet = 0;
01089
01090 switch (trigCategory) {
01091 case AlgorithmTrigger: {
01092 if (m_retrieveL1GtTriggerMenuLite) {
01093 if (m_l1GtMenuLiteValid) {
01094 pfSetsSize = m_prescaleFactorsAlgoTrigLite->size();
01095 triggerMasksSet = m_triggerMaskAlgoTrigLite;
01096
01097 } else {
01098
01099 pfSetsSize = m_prescaleFactorsAlgoTrig->size();
01100 triggerMasksSet = m_triggerMaskAlgoTrig;
01101
01102 }
01103
01104 } else {
01105
01106 pfSetsSize = m_prescaleFactorsAlgoTrig->size();
01107 triggerMasksSet = m_triggerMaskAlgoTrig;
01108
01109 }
01110
01111 pfIndex = pfIndexAlgoTrig;
01112
01113 }
01114 break;
01115 case TechnicalTrigger: {
01116 if (m_retrieveL1GtTriggerMenuLite) {
01117 if (m_l1GtMenuLiteValid) {
01118 pfSetsSize = m_prescaleFactorsTechTrigLite->size();
01119 triggerMasksSet = m_triggerMaskTechTrigLite;
01120
01121 } else {
01122
01123 pfSetsSize = m_prescaleFactorsTechTrig->size();
01124 triggerMasksSet = m_triggerMaskTechTrig;
01125
01126 }
01127
01128 } else {
01129
01130 pfSetsSize = m_prescaleFactorsTechTrig->size();
01131 triggerMasksSet = m_triggerMaskTechTrig;
01132
01133 }
01134
01135 pfIndex = pfIndexTechTrig;
01136
01137 }
01138 break;
01139 default: {
01140
01141 iError = l1ConfCode + iErrorRecord + 3;
01142 return iError;
01143
01144 }
01145 break;
01146 }
01147
01148
01149
01150
01151 if (pfIndex < 0) {
01152
01153 iError = l1ConfCode + iErrorRecord + 1000;
01154 LogDebug("L1GtUtils")
01155 << "\nError: index of prescale factor set retrieved from the data \n"
01156 << "less than zero."
01157 << "\n Value of index retrieved from data = " << pfIndex
01158 << std::endl;
01159
01160 return iError;
01161
01162 } else if (pfIndex >= (static_cast<int>(pfSetsSize))) {
01163 iError = l1ConfCode + iErrorRecord + 2000;
01164 LogDebug("L1GtUtils")
01165 << "\nError: index of prescale factor set retrieved from the data \n"
01166 << "greater than the size of the vector of prescale factor sets."
01167 << "\n Value of index retrieved from data = " << pfIndex
01168 << "\n Vector size = " << pfSetsSize << std::endl;
01169
01170 return iError;
01171
01172 } else {
01173 switch (trigCategory) {
01174 case AlgorithmTrigger: {
01175 if (m_retrieveL1GtTriggerMenuLite) {
01176 if (m_l1GtMenuLiteValid) {
01177 prescaleFactorsSubset
01178 = &((*m_prescaleFactorsAlgoTrigLite).at(pfIndex));
01179
01180 } else {
01181
01182 prescaleFactorsSubset
01183 = &((*m_prescaleFactorsAlgoTrig).at(pfIndex));
01184
01185 }
01186
01187 } else {
01188
01189 prescaleFactorsSubset
01190 = &((*m_prescaleFactorsAlgoTrig).at(pfIndex));
01191
01192 }
01193
01194 }
01195 break;
01196 case TechnicalTrigger: {
01197 if (m_retrieveL1GtTriggerMenuLite) {
01198 if (m_l1GtMenuLiteValid) {
01199 prescaleFactorsSubset
01200 = &((*m_prescaleFactorsTechTrigLite).at(pfIndex));
01201
01202 } else {
01203
01204 prescaleFactorsSubset
01205 = &((*m_prescaleFactorsTechTrig).at(pfIndex));
01206
01207 }
01208
01209 } else {
01210
01211 prescaleFactorsSubset
01212 = &((*m_prescaleFactorsTechTrig).at(pfIndex));
01213
01214 }
01215
01216 }
01217 break;
01218 default: {
01219
01220
01221 }
01222 break;
01223 }
01224
01225 }
01226
01227
01228
01229
01230
01231 switch (trigCategory) {
01232 case AlgorithmTrigger: {
01233 if (gtReadoutRecordValid) {
01234 const DecisionWord& decWord = gtReadoutRecord->decisionWord();
01235 decisionBeforeMask = trigResult(decWord, bitNumber,
01236 nameAlgoTechTrig, trigCategory, iError);
01237 if (iError) {
01238 return (iError + l1ConfCode + iErrorRecord);
01239 }
01240
01241 } else {
01242
01243 const DecisionWord& decWord =
01244 gtRecord->decisionWordBeforeMask();
01245 decisionBeforeMask = trigResult(decWord, bitNumber,
01246 nameAlgoTechTrig, trigCategory, iError);
01247 if (iError) {
01248 return (iError + l1ConfCode + iErrorRecord);
01249 }
01250
01251 }
01252
01253 }
01254 break;
01255 case TechnicalTrigger: {
01256 if (gtReadoutRecordValid) {
01257 const DecisionWord& decWord =
01258 gtReadoutRecord->technicalTriggerWord();
01259 decisionBeforeMask = trigResult(decWord, bitNumber,
01260 nameAlgoTechTrig, trigCategory, iError);
01261 if (iError) {
01262 return (iError + l1ConfCode + iErrorRecord);
01263 }
01264
01265 } else {
01266
01267 const DecisionWord& decWord =
01268 gtRecord->technicalTriggerWordBeforeMask();
01269 decisionBeforeMask = trigResult(decWord, bitNumber,
01270 nameAlgoTechTrig, trigCategory, iError);
01271 if (iError) {
01272 return (iError + l1ConfCode + iErrorRecord);
01273 }
01274
01275 }
01276
01277 }
01278 break;
01279 default: {
01280
01281
01282 }
01283 break;
01284 }
01285
01286
01287
01288
01289 if (bitNumber < (static_cast<int> (prescaleFactorsSubset->size()))) {
01290 prescaleFactor = (*prescaleFactorsSubset)[bitNumber];
01291 } else {
01292 iError = l1ConfCode + iErrorRecord + 4000;
01293 LogDebug("L1GtUtils") << "\nError: bit number " << bitNumber
01294 << " retrieved for " << triggerCategory(trigCategory) << "\n "
01295 << nameAlgoTechTrig
01296 << "\ngreater than size of actual L1 GT prescale factor set: "
01297 << prescaleFactorsSubset->size()
01298 << "\nError: Inconsistent L1 trigger configuration!"
01299 << std::endl;
01300
01301 return iError;
01302 }
01303
01304
01305
01306 if (bitNumber < (static_cast<int> ((*triggerMasksSet).size()))) {
01307
01308 if (m_retrieveL1GtTriggerMenuLite) {
01309 if (m_l1GtMenuLiteValid) {
01310 triggerMask = (*triggerMasksSet)[bitNumber];
01311
01312 } else {
01313
01314
01315 triggerMask = ((*triggerMasksSet)[bitNumber]) & (1
01316 << m_physicsDaqPartition);
01317
01318 }
01319
01320 } else {
01321
01322
01323 triggerMask = ((*triggerMasksSet)[bitNumber]) & (1
01324 << m_physicsDaqPartition);
01325
01326 }
01327
01328
01329 } else {
01330 iError = l1ConfCode + iErrorRecord + 5000;
01331 LogDebug("L1GtUtils") << "\nError: bit number " << bitNumber
01332 << " retrieved for " << triggerCategory(trigCategory) << "\n "
01333 << nameAlgoTechTrig
01334 << "\ngreater than size of L1 GT trigger mask set: "
01335 << (*triggerMasksSet).size()
01336 << "\nError: Inconsistent L1 trigger configuration!"
01337 << std::endl;
01338
01339 return iError;
01340
01341 }
01342
01343 decisionAfterMask = decisionBeforeMask;
01344
01345 if (triggerMask) {
01346 decisionAfterMask = false;
01347 }
01348
01349 return iError;
01350
01351 }
01352
01353
01354 const int L1GtUtils::l1Results(const edm::Event& iEvent,
01355 const std::string& nameAlgoTechTrig, bool& decisionBeforeMask,
01356 bool& decisionAfterMask, int& prescaleFactor, int& triggerMask) const {
01357
01358
01359 decisionBeforeMask = false;
01360 decisionAfterMask = false;
01361 prescaleFactor = -1;
01362 triggerMask = -1;
01363
01364 int l1ErrorCode = 0;
01365
01366 l1ErrorCode = l1Results(iEvent, m_provL1GtRecordInputTag,
01367 m_provL1GtReadoutRecordInputTag, nameAlgoTechTrig, decisionBeforeMask,
01368 decisionAfterMask, prescaleFactor, triggerMask);
01369
01370 return l1ErrorCode;
01371
01372 }
01373
01374
01375
01376 const bool L1GtUtils::decisionBeforeMask(const edm::Event& iEvent,
01377 const edm::InputTag& l1GtRecordInputTag,
01378 const edm::InputTag& l1GtReadoutRecordInputTag,
01379 const std::string& nameAlgoTechTrig, int& errorCode) const {
01380
01381
01382 bool decisionBeforeMask = false;
01383 bool decisionAfterMask = false;
01384 int prescaleFactor = -1;
01385 int triggerMask = -1;
01386
01387 errorCode = l1Results(iEvent, l1GtRecordInputTag,
01388 l1GtReadoutRecordInputTag, nameAlgoTechTrig, decisionBeforeMask,
01389 decisionAfterMask, prescaleFactor, triggerMask);
01390
01391 return decisionBeforeMask;
01392
01393 }
01394
01395 const bool L1GtUtils::decisionBeforeMask(const edm::Event& iEvent,
01396 const std::string& nameAlgoTechTrig, int& errorCode) const {
01397
01398
01399 bool decisionBeforeMask = false;
01400 bool decisionAfterMask = false;
01401 int prescaleFactor = -1;
01402 int triggerMask = -1;
01403
01404 errorCode = l1Results(iEvent, nameAlgoTechTrig, decisionBeforeMask,
01405 decisionAfterMask, prescaleFactor, triggerMask);
01406
01407 return decisionBeforeMask;
01408
01409 }
01410
01411
01412
01413 const bool L1GtUtils::decisionAfterMask(const edm::Event& iEvent,
01414 const edm::InputTag& l1GtRecordInputTag,
01415 const edm::InputTag& l1GtReadoutRecordInputTag,
01416 const std::string& nameAlgoTechTrig, int& errorCode) const {
01417
01418
01419 bool decisionBeforeMask = false;
01420 bool decisionAfterMask = false;
01421 int prescaleFactor = -1;
01422 int triggerMask = -1;
01423
01424 errorCode = l1Results(iEvent, l1GtRecordInputTag,
01425 l1GtReadoutRecordInputTag, nameAlgoTechTrig, decisionBeforeMask,
01426 decisionAfterMask, prescaleFactor, triggerMask);
01427
01428 return decisionAfterMask;
01429
01430 }
01431
01432 const bool L1GtUtils::decisionAfterMask(const edm::Event& iEvent,
01433 const std::string& nameAlgoTechTrig, int& errorCode) const {
01434
01435
01436 bool decisionBeforeMask = false;
01437 bool decisionAfterMask = false;
01438 int prescaleFactor = -1;
01439 int triggerMask = -1;
01440
01441 errorCode = l1Results(iEvent, nameAlgoTechTrig, decisionBeforeMask,
01442 decisionAfterMask, prescaleFactor, triggerMask);
01443
01444 return decisionAfterMask;
01445
01446 }
01447
01448
01449
01450 const bool L1GtUtils::decision(const edm::Event& iEvent,
01451 const edm::InputTag& l1GtRecordInputTag,
01452 const edm::InputTag& l1GtReadoutRecordInputTag,
01453 const std::string& nameAlgoTechTrig, int& errorCode) const {
01454
01455
01456 bool decisionBeforeMask = false;
01457 bool decisionAfterMask = false;
01458 int prescaleFactor = -1;
01459 int triggerMask = -1;
01460
01461 errorCode = l1Results(iEvent, l1GtRecordInputTag,
01462 l1GtReadoutRecordInputTag, nameAlgoTechTrig, decisionBeforeMask,
01463 decisionAfterMask, prescaleFactor, triggerMask);
01464
01465 return decisionAfterMask;
01466
01467 }
01468
01469 const bool L1GtUtils::decision(const edm::Event& iEvent,
01470 const std::string& nameAlgoTechTrig, int& errorCode) const {
01471
01472
01473 bool decisionBeforeMask = false;
01474 bool decisionAfterMask = false;
01475 int prescaleFactor = -1;
01476 int triggerMask = -1;
01477
01478 errorCode = l1Results(iEvent, nameAlgoTechTrig, decisionBeforeMask,
01479 decisionAfterMask, prescaleFactor, triggerMask);
01480
01481 return decisionAfterMask;
01482
01483 }
01484
01485
01486
01487 const int L1GtUtils::prescaleFactor(const edm::Event& iEvent,
01488 const edm::InputTag& l1GtRecordInputTag,
01489 const edm::InputTag& l1GtReadoutRecordInputTag,
01490 const std::string& nameAlgoTechTrig, int& errorCode) const {
01491
01492
01493 bool decisionBeforeMask = false;
01494 bool decisionAfterMask = false;
01495 int prescaleFactor = -1;
01496 int triggerMask = -1;
01497
01498 errorCode = l1Results(iEvent, l1GtRecordInputTag,
01499 l1GtReadoutRecordInputTag, nameAlgoTechTrig, decisionBeforeMask,
01500 decisionAfterMask, prescaleFactor, triggerMask);
01501
01502 return prescaleFactor;
01503
01504 }
01505
01506 const int L1GtUtils::prescaleFactor(const edm::Event& iEvent,
01507 const std::string& nameAlgoTechTrig, int& errorCode) const {
01508
01509
01510 bool decisionBeforeMask = false;
01511 bool decisionAfterMask = false;
01512 int prescaleFactor = -1;
01513 int triggerMask = -1;
01514
01515 errorCode = l1Results(iEvent, nameAlgoTechTrig, decisionBeforeMask,
01516 decisionAfterMask, prescaleFactor, triggerMask);
01517
01518 return prescaleFactor;
01519
01520 }
01521
01522 const int L1GtUtils::triggerMask(const edm::Event& iEvent,
01523 const edm::InputTag& l1GtRecordInputTag,
01524 const edm::InputTag& l1GtReadoutRecordInputTag,
01525 const std::string& nameAlgoTechTrig, int& errorCode) const {
01526
01527
01528 bool decisionBeforeMask = false;
01529 bool decisionAfterMask = false;
01530 int prescaleFactor = -1;
01531 int triggerMask = -1;
01532
01533 errorCode = l1Results(iEvent, l1GtRecordInputTag,
01534 l1GtReadoutRecordInputTag, nameAlgoTechTrig, decisionBeforeMask,
01535 decisionAfterMask, prescaleFactor, triggerMask);
01536
01537 return triggerMask;
01538
01539 }
01540
01541 const int L1GtUtils::triggerMask(const edm::Event& iEvent,
01542 const std::string& nameAlgoTechTrig, int& errorCode) const {
01543
01544
01545 bool decisionBeforeMask = false;
01546 bool decisionAfterMask = false;
01547 int prescaleFactor = -1;
01548 int triggerMask = -1;
01549
01550 errorCode = l1Results(iEvent, nameAlgoTechTrig, decisionBeforeMask,
01551 decisionAfterMask, prescaleFactor, triggerMask);
01552
01553 return triggerMask;
01554
01555 }
01556
01557 const int L1GtUtils::triggerMask(const std::string& nameAlgoTechTrig,
01558 int& errorCode) const {
01559
01560
01561 int triggerMaskValue = -1;
01562
01563
01564 int iError = 0;
01565 int l1ConfCode = 0;
01566
01567
01568
01569 if (!availableL1Configuration(iError, l1ConfCode)) {
01570 errorCode = iError;
01571 return triggerMaskValue;
01572 }
01573
01574
01575
01576
01577
01578
01579
01580 TriggerCategory trigCategory = AlgorithmTrigger;
01581 int bitNumber = -1;
01582
01583 if (!l1AlgoTechTrigBitNumber(nameAlgoTechTrig, trigCategory, bitNumber)) {
01584
01585 iError = l1ConfCode + 1;
01586
01587 if (m_retrieveL1GtTriggerMenuLite) {
01588 if (m_l1GtMenuLiteValid) {
01589
01590 LogDebug("L1GtUtils") << "\nAlgorithm/technical trigger \n "
01591 << nameAlgoTechTrig
01592 << "\not found in the trigger menu \n "
01593 << m_l1GtMenuLite->gtTriggerMenuImplementation()
01594 << "\nretrieved from L1GtTriggerMenuLite" << std::endl;
01595
01596 } else {
01597
01598
01599 LogDebug("L1GtUtils") << "\nAlgorithm/technical trigger \n "
01600 << nameAlgoTechTrig
01601 << "\not found in the trigger menu \n "
01602 << m_l1GtMenu->gtTriggerMenuImplementation()
01603 << "\nretrieved from Event Setup" << std::endl;
01604
01605 }
01606
01607 } else {
01608
01609 LogDebug("L1GtUtils") << "\nAlgorithm/technical trigger \n "
01610 << nameAlgoTechTrig
01611 << "\not found in the trigger menu \n "
01612 << m_l1GtMenu->gtTriggerMenuImplementation()
01613 << "\nretrieved from Event Setup" << std::endl;
01614
01615 }
01616
01617 errorCode = iError;
01618 return triggerMaskValue;
01619
01620 }
01621
01622
01623
01624
01625 if (bitNumber < 0) {
01626
01627 iError = l1ConfCode + 2;
01628
01629 if (m_retrieveL1GtTriggerMenuLite) {
01630 if (m_l1GtMenuLiteValid) {
01631 LogDebug("L1GtUtils") << "\nNegative bit number for "
01632 << triggerCategory(trigCategory) << "\n "
01633 << nameAlgoTechTrig << "\nfrom menu \n "
01634 << m_l1GtMenuLite->gtTriggerMenuImplementation()
01635 << "\nretrieved from L1GtTriggerMenuLite" << std::endl;
01636
01637 } else {
01638
01639 LogDebug("L1GtUtils") << "\nNegative bit number for "
01640 << triggerCategory(trigCategory) << "\n "
01641 << nameAlgoTechTrig << "\nfrom menu \n "
01642 << m_l1GtMenu->gtTriggerMenuImplementation()
01643 << "\nretrieved from Event Setup" << std::endl;
01644
01645 }
01646
01647 } else {
01648
01649 LogDebug("L1GtUtils") << "\nNegative bit number for "
01650 << triggerCategory(trigCategory) << "\n "
01651 << nameAlgoTechTrig << "\nfrom menu \n "
01652 << m_l1GtMenu->gtTriggerMenuImplementation()
01653 << "\nretrieved from Event Setup" << std::endl;
01654
01655 }
01656
01657 errorCode = iError;
01658 return triggerMaskValue;
01659 }
01660
01661
01662
01663
01664
01665
01666 const std::vector<unsigned int>* triggerMasksSet = 0;
01667
01668 switch (trigCategory) {
01669 case AlgorithmTrigger: {
01670 if (m_retrieveL1GtTriggerMenuLite) {
01671 if (m_l1GtMenuLiteValid) {
01672 triggerMasksSet = m_triggerMaskAlgoTrigLite;
01673
01674 } else {
01675
01676 triggerMasksSet = m_triggerMaskAlgoTrig;
01677
01678 }
01679
01680 } else {
01681
01682 triggerMasksSet = m_triggerMaskAlgoTrig;
01683
01684 }
01685
01686 }
01687 break;
01688 case TechnicalTrigger: {
01689 if (m_retrieveL1GtTriggerMenuLite) {
01690 if (m_l1GtMenuLiteValid) {
01691 triggerMasksSet = m_triggerMaskTechTrigLite;
01692
01693 } else {
01694
01695 triggerMasksSet = m_triggerMaskTechTrig;
01696
01697 }
01698
01699 } else {
01700
01701 triggerMasksSet = m_triggerMaskTechTrig;
01702
01703 }
01704
01705 }
01706 break;
01707 default: {
01708
01709 iError = l1ConfCode + 3;
01710
01711 errorCode = iError;
01712 return triggerMaskValue;
01713
01714 }
01715 break;
01716 }
01717
01718
01719
01720 if (bitNumber < (static_cast<int> ((*triggerMasksSet).size()))) {
01721
01722 if (m_retrieveL1GtTriggerMenuLite) {
01723 if (m_l1GtMenuLiteValid) {
01724 triggerMaskValue = (*triggerMasksSet)[bitNumber];
01725
01726 } else {
01727
01728
01729 triggerMaskValue = ((*triggerMasksSet)[bitNumber]) & (1
01730 << m_physicsDaqPartition);
01731
01732 }
01733
01734 } else {
01735
01736
01737 triggerMaskValue = ((*triggerMasksSet)[bitNumber]) & (1
01738 << m_physicsDaqPartition);
01739
01740 }
01741
01742 } else {
01743 iError = l1ConfCode + 5000;
01744 LogDebug("L1GtUtils") << "\nError: bit number " << bitNumber
01745 << " retrieved for " << triggerCategory(trigCategory) << "\n "
01746 << nameAlgoTechTrig
01747 << "\ngreater than size of L1 GT trigger mask set: "
01748 << (*triggerMasksSet).size()
01749 << "\nError: Inconsistent L1 trigger configuration!"
01750 << std::endl;
01751
01752 errorCode = iError;
01753 return triggerMaskValue;
01754
01755 }
01756
01757 errorCode = iError;
01758 return triggerMaskValue;
01759
01760 }
01761
01762 const int L1GtUtils::prescaleFactorSetIndex(const edm::Event& iEvent,
01763 const edm::InputTag& l1GtRecordInputTag,
01764 const edm::InputTag& l1GtReadoutRecordInputTag,
01765 const TriggerCategory& trigCategory, int& errorCode) const {
01766
01767
01768 int pfIndex = -1;
01769
01770
01771 int iError = 0;
01772 int l1ConfCode = 0;
01773
01774
01775
01776 if (!availableL1Configuration(iError, l1ConfCode)) {
01777 errorCode = iError;
01778 return pfIndex;
01779 }
01780
01781
01782
01783
01784
01785
01786
01787
01788 int iErrorRecord = 0;
01789
01790 bool validRecord = false;
01791 bool gtReadoutRecordValid = false;
01792
01793 edm::Handle<L1GlobalTriggerRecord> gtRecord;
01794 iEvent.getByLabel(l1GtRecordInputTag, gtRecord);
01795
01796 if (gtRecord.isValid()) {
01797
01798 validRecord = true;
01799
01800 } else {
01801
01802 iErrorRecord = 10;
01803 LogDebug("L1GtUtils") << "\nL1GlobalTriggerRecord with \n "
01804 << l1GtRecordInputTag << "\nnot found in the event."
01805 << std::endl;
01806 }
01807
01808 edm::Handle<L1GlobalTriggerReadoutRecord> gtReadoutRecord;
01809 iEvent.getByLabel(l1GtReadoutRecordInputTag, gtReadoutRecord);
01810
01811 if (gtReadoutRecord.isValid()) {
01812
01813 gtReadoutRecordValid = true;
01814 validRecord = true;
01815
01816 } else {
01817
01818 iErrorRecord = iErrorRecord + 100;
01819 LogDebug("L1GtUtils") << "\nL1GlobalTriggerReadoutRecord with \n "
01820 << l1GtReadoutRecordInputTag << "\nnot found in the event."
01821 << std::endl;
01822
01823 }
01824
01825
01826
01827
01828
01829
01830
01831 int pfIndexTechTrig = -1;
01832 int pfIndexAlgoTrig = -1;
01833
01834 if (validRecord) {
01835 if (gtReadoutRecordValid) {
01836
01837 pfIndexTechTrig
01838 = (gtReadoutRecord->gtFdlWord()).gtPrescaleFactorIndexTech();
01839 pfIndexAlgoTrig
01840 = (gtReadoutRecord->gtFdlWord()).gtPrescaleFactorIndexAlgo();
01841
01842 } else {
01843
01844 pfIndexTechTrig
01845 = static_cast<int> (gtRecord->gtPrescaleFactorIndexTech());
01846 pfIndexAlgoTrig
01847 = static_cast<int> (gtRecord->gtPrescaleFactorIndexAlgo());
01848
01849 }
01850
01851 } else {
01852
01853 LogDebug("L1GtUtils") << "\nError: "
01854 << "\nNo valid L1GlobalTriggerRecord with \n "
01855 << l1GtRecordInputTag << "\nfound in the event."
01856 << "\nNo valid L1GlobalTriggerReadoutRecord with \n "
01857 << l1GtReadoutRecordInputTag << "\nfound in the event."
01858 << std::endl;
01859
01860 iError = l1ConfCode + iErrorRecord;
01861
01862 errorCode = iError;
01863 return pfIndex;
01864
01865 }
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875 size_t pfSetsSize = 0;
01876
01877 switch (trigCategory) {
01878 case AlgorithmTrigger: {
01879 if (m_retrieveL1GtTriggerMenuLite) {
01880 if (m_l1GtMenuLiteValid) {
01881 pfSetsSize = m_prescaleFactorsAlgoTrigLite->size();
01882
01883 } else {
01884
01885 pfSetsSize = m_prescaleFactorsAlgoTrig->size();
01886
01887 }
01888
01889 } else {
01890
01891 pfSetsSize = m_prescaleFactorsAlgoTrig->size();
01892
01893 }
01894
01895 pfIndex = pfIndexAlgoTrig;
01896
01897 }
01898 break;
01899 case TechnicalTrigger: {
01900 if (m_retrieveL1GtTriggerMenuLite) {
01901 if (m_l1GtMenuLiteValid) {
01902 pfSetsSize = m_prescaleFactorsTechTrigLite->size();
01903
01904 } else {
01905
01906 pfSetsSize = m_prescaleFactorsTechTrig->size();
01907
01908 }
01909
01910 } else {
01911
01912 pfSetsSize = m_prescaleFactorsTechTrig->size();
01913
01914 }
01915
01916 pfIndex = pfIndexTechTrig;
01917
01918 }
01919 break;
01920 default: {
01921
01922 iError = l1ConfCode + iErrorRecord + 3;
01923 return iError;
01924
01925 }
01926 break;
01927 }
01928
01929
01930
01931
01932 if (pfIndex < 0) {
01933
01934 iError = l1ConfCode + iErrorRecord + 1000;
01935 LogDebug("L1GtUtils")
01936 << "\nError: index of prescale factor set retrieved from the data \n"
01937 << "less than zero."
01938 << "\n Value of index retrieved from data = " << pfIndex
01939 << std::endl;
01940
01941 errorCode = iError;
01942 return pfIndex;
01943
01944 } else if (pfIndex >= (static_cast<int>(pfSetsSize))) {
01945 iError = l1ConfCode + iErrorRecord + 2000;
01946 LogDebug("L1GtUtils")
01947 << "\nError: index of prescale factor set retrieved from the data \n"
01948 << "greater than the size of the vector of prescale factor sets."
01949 << "\n Value of index retrieved from data = " << pfIndex
01950 << "\n Vector size = " << pfSetsSize << std::endl;
01951
01952 errorCode = iError;
01953 return pfIndex;
01954
01955 } else {
01956
01957 errorCode = iError;
01958 return pfIndex;
01959 }
01960
01961 errorCode = iError;
01962 return pfIndex;
01963
01964 }
01965
01966
01967 const int L1GtUtils::prescaleFactorSetIndex(const edm::Event& iEvent,
01968 const TriggerCategory& trigCategory, int& errorCode) const {
01969
01970
01971 int iError = 0;
01972 int pfIndex = -1;
01973
01974 pfIndex = prescaleFactorSetIndex(iEvent, m_provL1GtRecordInputTag,
01975 m_provL1GtReadoutRecordInputTag, trigCategory, iError);
01976
01977
01978
01979 errorCode = iError;
01980 return pfIndex;
01981
01982 }
01983
01984
01985
01986 const std::vector<int>& L1GtUtils::prescaleFactorSet(const edm::Event& iEvent,
01987 const edm::InputTag& l1GtRecordInputTag,
01988 const edm::InputTag& l1GtReadoutRecordInputTag,
01989 const TriggerCategory& trigCategory, int& errorCode) {
01990
01991
01992 m_prescaleFactorSet.clear();
01993
01994
01995 int iError = 0;
01996
01997 const int pfIndex = prescaleFactorSetIndex(iEvent, l1GtRecordInputTag,
01998 l1GtReadoutRecordInputTag, trigCategory, iError);
01999
02000 if (iError == 0) {
02001
02002 switch (trigCategory) {
02003 case AlgorithmTrigger: {
02004 if (m_retrieveL1GtTriggerMenuLite) {
02005 if (m_l1GtMenuLiteValid) {
02006 m_prescaleFactorSet
02007 = (*m_prescaleFactorsAlgoTrigLite).at(pfIndex);
02008
02009 } else {
02010
02011 m_prescaleFactorSet = (*m_prescaleFactorsAlgoTrig).at(
02012 pfIndex);
02013
02014 }
02015
02016 } else {
02017
02018 m_prescaleFactorSet = (*m_prescaleFactorsAlgoTrig).at(
02019 pfIndex);
02020
02021 }
02022
02023 }
02024 break;
02025 case TechnicalTrigger: {
02026 if (m_retrieveL1GtTriggerMenuLite) {
02027 if (m_l1GtMenuLiteValid) {
02028 m_prescaleFactorSet
02029 = (*m_prescaleFactorsTechTrigLite).at(pfIndex);
02030
02031 } else {
02032
02033 m_prescaleFactorSet = (*m_prescaleFactorsTechTrig).at(
02034 pfIndex);
02035
02036 }
02037
02038 } else {
02039
02040 m_prescaleFactorSet = (*m_prescaleFactorsTechTrig).at(
02041 pfIndex);
02042
02043 }
02044
02045 }
02046 break;
02047 default: {
02048
02049
02050 }
02051 break;
02052 }
02053
02054 }
02055
02056 errorCode = iError;
02057 return m_prescaleFactorSet;
02058
02059 }
02060
02061 const std::vector<int>& L1GtUtils::prescaleFactorSet(const edm::Event& iEvent,
02062 const TriggerCategory& trigCategory, int& errorCode) {
02063
02064
02065 m_prescaleFactorSet.clear();
02066
02067
02068 int iError = 0;
02069
02070 m_prescaleFactorSet = prescaleFactorSet(iEvent, m_provL1GtRecordInputTag,
02071 m_provL1GtReadoutRecordInputTag, trigCategory, iError);
02072
02073 errorCode = iError;
02074 return m_prescaleFactorSet;
02075
02076 }
02077
02078
02079
02080
02081 const std::vector<unsigned int>& L1GtUtils::triggerMaskSet(
02082 const TriggerCategory& trigCategory, int& errorCode) {
02083
02084
02085 m_triggerMaskSet.clear();
02086
02087
02088 int iError = 0;
02089 int l1ConfCode = 0;
02090
02091
02092
02093 if (!availableL1Configuration(iError, l1ConfCode)) {
02094 errorCode = iError;
02095 return m_triggerMaskSet;
02096 }
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107 switch (trigCategory) {
02108 case AlgorithmTrigger: {
02109 if (m_retrieveL1GtTriggerMenuLite) {
02110
02111
02112 if (m_l1GtMenuLiteValid) {
02113 errorCode = iError;
02114 return (*m_triggerMaskAlgoTrigLite);
02115
02116 } else {
02117
02118 for (unsigned i = 0; i < m_triggerMaskAlgoTrig->size(); i++) {
02119 m_triggerMaskSet.push_back(
02120 ((*m_triggerMaskAlgoTrig)[i]) & (1
02121 << m_physicsDaqPartition));
02122 }
02123
02124 }
02125
02126 } else {
02127
02128 for (unsigned i = 0; i < m_triggerMaskAlgoTrig->size(); i++) {
02129 m_triggerMaskSet.push_back(((*m_triggerMaskAlgoTrig)[i])
02130 & (1 << m_physicsDaqPartition));
02131 }
02132
02133 }
02134 }
02135 break;
02136 case TechnicalTrigger: {
02137 if (m_retrieveL1GtTriggerMenuLite) {
02138 if (m_l1GtMenuLiteValid) {
02139 errorCode = iError;
02140 return (*m_triggerMaskTechTrigLite);
02141
02142 } else {
02143
02144 for (unsigned i = 0; i < m_triggerMaskTechTrig->size(); i++) {
02145 m_triggerMaskSet.push_back(
02146 ((*m_triggerMaskTechTrig)[i]) & (1
02147 << m_physicsDaqPartition));
02148 }
02149
02150 }
02151
02152 } else {
02153
02154 for (unsigned i = 0; i < m_triggerMaskTechTrig->size(); i++) {
02155 m_triggerMaskSet.push_back(((*m_triggerMaskTechTrig)[i])
02156 & (1 << m_physicsDaqPartition));
02157 }
02158
02159 }
02160 }
02161 break;
02162 default: {
02163
02164 iError = l1ConfCode + 3;
02165
02166 errorCode = iError;
02167 return m_triggerMaskSet;
02168
02169 }
02170 break;
02171 }
02172
02173 errorCode = iError;
02174 return m_triggerMaskSet;
02175
02176 }
02177
02178
02179
02180 const std::string& L1GtUtils::l1TriggerMenu() const {
02181
02182 if (m_retrieveL1GtTriggerMenuLite) {
02183 if (m_l1GtMenuLiteValid) {
02184 return m_l1GtMenuLite->gtTriggerMenuName();
02185
02186 } else if (m_retrieveL1EventSetup) {
02187 return m_l1GtMenu->gtTriggerMenuName();
02188
02189 } else {
02190
02191 return EmptyString;
02192
02193 }
02194 } else if (m_retrieveL1EventSetup) {
02195 return m_l1GtMenu->gtTriggerMenuName();
02196
02197 } else {
02198
02199 return EmptyString;
02200
02201 }
02202
02203 }
02204
02205 const std::string& L1GtUtils::l1TriggerMenuImplementation() const {
02206
02207 if (m_retrieveL1GtTriggerMenuLite) {
02208 if (m_l1GtMenuLiteValid) {
02209 return m_l1GtMenuLite->gtTriggerMenuImplementation();
02210
02211 } else if (m_retrieveL1EventSetup) {
02212 return m_l1GtMenu->gtTriggerMenuImplementation();
02213
02214 } else {
02215
02216 return EmptyString;
02217
02218 }
02219 } else if (m_retrieveL1EventSetup) {
02220 return m_l1GtMenu->gtTriggerMenuImplementation();
02221
02222 } else {
02223
02224 return EmptyString;
02225
02226 }
02227
02228 }
02229
02230 const L1GtTriggerMenu* L1GtUtils::ptrL1TriggerMenuEventSetup(int& errorCode) {
02231
02232
02233 int iError = 0;
02234 int l1ConfCode = 0;
02235
02236
02237
02238 if (!availableL1Configuration(iError, l1ConfCode)) {
02239 errorCode = iError;
02240 return 0;
02241 }
02242
02243 if (m_retrieveL1EventSetup) {
02244 errorCode = iError;
02245 return m_l1GtMenu;
02246 } else {
02247 iError = l1ConfCode;
02248
02249 errorCode = iError;
02250 return 0;
02251
02252 }
02253
02254 errorCode = iError;
02255 return m_l1GtMenu;
02256 }
02257
02258 const L1GtTriggerMenuLite* L1GtUtils::ptrL1GtTriggerMenuLite(int& errorCode) {
02259
02260
02261 int iError = 0;
02262 int l1ConfCode = 0;
02263
02264
02265
02266 if (!availableL1Configuration(iError, l1ConfCode)) {
02267 errorCode = iError;
02268 return 0;
02269 }
02270
02271 if (m_retrieveL1GtTriggerMenuLite) {
02272 if (m_l1GtMenuLiteValid) {
02273
02274 errorCode = iError;
02275 return m_l1GtMenuLite;
02276
02277 } else {
02278 iError = l1ConfCode;
02279
02280 errorCode = iError;
02281 return 0;
02282 }
02283 } else {
02284 iError = l1ConfCode;
02285
02286 errorCode = iError;
02287 return 0;
02288 }
02289
02290 errorCode = iError;
02291 return m_l1GtMenuLite;
02292
02293 }
02294
02295 const bool L1GtUtils::availableL1Configuration(int& errorCode, int& l1ConfCode) const {
02296
02297 if (m_retrieveL1GtTriggerMenuLite) {
02298 if (!m_retrieveL1EventSetup) {
02299 LogDebug("L1GtUtils")
02300 << "\nRetrieve L1 trigger configuration from L1GtTriggerMenuLite only.\n"
02301 << std::endl;
02302 l1ConfCode = 0;
02303 } else {
02304 LogDebug("L1GtUtils")
02305 << "\nFall through: retrieve L1 trigger configuration from L1GtTriggerMenuLite."
02306 << "\nIf L1GtTriggerMenuLite not valid, try to retrieve from event setup.\n"
02307 << std::endl;
02308 l1ConfCode = 100000;
02309 }
02310
02311 if (m_l1GtMenuLiteValid) {
02312 LogDebug("L1GtUtils")
02313 << "\nRetrieve L1 trigger configuration from L1GtTriggerMenuLite, valid product.\n"
02314 << std::endl;
02315 l1ConfCode = l1ConfCode + 10000;
02316 errorCode = 0;
02317
02318 return true;
02319
02320 } else if (m_retrieveL1EventSetup) {
02321 if (m_l1EventSetupValid) {
02322 LogDebug("L1GtUtils")
02323 << "\nFall through: retrieve L1 trigger configuration from event setup."
02324 << "\nFirst option was L1GtTriggerMenuLite - but product is not valid.\n"
02325 << std::endl;
02326 l1ConfCode = l1ConfCode + 20000;
02327 errorCode = 0;
02328
02329 return true;
02330
02331 } else {
02332 LogDebug("L1GtUtils")
02333 << "\nFall through: L1GtTriggerMenuLite not valid, event setup not valid.\n"
02334 << std::endl;
02335 l1ConfCode = l1ConfCode + L1GtNotValidError;
02336 errorCode = l1ConfCode;
02337
02338 return false;
02339
02340
02341 }
02342
02343 } else {
02344 LogDebug("L1GtUtils")
02345 << "\nError: L1 trigger configuration requested from L1GtTriggerMenuLite only"
02346 << "\nbut L1GtTriggerMenuLite is not valid.\n" << std::endl;
02347 l1ConfCode = l1ConfCode + L1GtNotValidError;
02348 errorCode = l1ConfCode;
02349
02350 return false;
02351
02352 }
02353 } else if (m_retrieveL1EventSetup) {
02354
02355 LogDebug("L1GtUtils")
02356 << "\nRetrieve L1 trigger configuration from event setup."
02357 << "\nL1GtTriggerMenuLite product was not requested.\n"
02358 << std::endl;
02359 l1ConfCode = 200000;
02360
02361 if (m_l1EventSetupValid) {
02362 LogDebug("L1GtUtils")
02363 << "\nRetrieve L1 trigger configuration from event setup only."
02364 << "\nValid L1 trigger event setup.\n"
02365 << std::endl;
02366 l1ConfCode = l1ConfCode + 10000;
02367 errorCode = 0;
02368
02369 return true;
02370
02371 } else {
02372 LogDebug("L1GtUtils")
02373 << "\nRetrieve L1 trigger configuration from event setup only."
02374 << "\nNo valid L1 trigger event setup.\n"
02375 << std::endl;
02376 l1ConfCode = l1ConfCode + L1GtNotValidError;
02377 errorCode = l1ConfCode;
02378
02379 return false;
02380
02381
02382 }
02383
02384 } else {
02385 LogDebug("L1GtUtils")
02386 << "\nError: no L1 trigger configuration requested to be retrieved."
02387 << "\nMust call before getL1GtRunCache in beginRun and analyze.\n"
02388 << std::endl;
02389 l1ConfCode = 300000;
02390 errorCode = l1ConfCode;
02391
02392 return false;
02393
02394 }
02395 }
02396
02397
02398
02399 const bool L1GtUtils::trigResult(const DecisionWord& decWord,
02400 const int bitNumber, const std::string& nameAlgoTechTrig,
02401 const TriggerCategory& trigCategory, int& errorCode) const {
02402
02403 bool trigRes = false;
02404 errorCode = 0;
02405
02406 if (bitNumber < (static_cast<int> (decWord.size()))) {
02407 trigRes = decWord[bitNumber];
02408 } else {
02409 errorCode = 3000;
02410 LogDebug("L1GtUtils") << "\nError: bit number " << bitNumber
02411 << " retrieved for " << triggerCategory(trigCategory) << "\n "
02412 << nameAlgoTechTrig
02413 << "\ngreater than size of L1 GT decision word: "
02414 << decWord.size()
02415 << "\nError: Inconsistent L1 trigger configuration!"
02416 << std::endl;
02417 }
02418
02419 return trigRes;
02420 }
02421
02422 L1GtUtils::LogicalExpressionL1Results::LogicalExpressionL1Results(
02423 const std::string& expression, L1GtUtils& l1GtUtils) :
02424
02425 m_logicalExpression(expression),
02426
02427 m_l1GtUtils(l1GtUtils),
02428
02429 m_l1GtRecordInputTag(edm::InputTag()),
02430
02431 m_l1GtReadoutRecordInputTag(edm::InputTag()),
02432
02433 m_l1ConfCode(-1),
02434
02435 m_validL1Configuration(false),
02436
02437 m_validLogicalExpression(false),
02438
02439 m_l1GtInputTagsFromProv(true),
02440
02441 m_l1ResultsAlreadyCalled(false),
02442
02443 m_expL1TriggersSize(0),
02444
02445 m_expBitsTechTrigger(false) {
02446
02447 initialize();
02448 }
02449
02450 L1GtUtils::LogicalExpressionL1Results::LogicalExpressionL1Results(
02451 const std::string& expression, L1GtUtils& l1GtUtils,
02452 const edm::InputTag& l1GtRecordInputTag,
02453 const edm::InputTag& l1GtReadoutRecordInputTag) :
02454
02455 m_logicalExpression(expression),
02456
02457 m_l1GtUtils(l1GtUtils),
02458
02459 m_l1GtRecordInputTag(l1GtRecordInputTag),
02460
02461 m_l1GtReadoutRecordInputTag(l1GtReadoutRecordInputTag),
02462
02463 m_l1ConfCode(-1),
02464
02465 m_validL1Configuration(false),
02466
02467 m_validLogicalExpression(false),
02468
02469 m_l1GtInputTagsFromProv(false),
02470
02471 m_l1ResultsAlreadyCalled(false),
02472
02473 m_expL1TriggersSize(0),
02474
02475 m_expBitsTechTrigger(false) {
02476
02477 initialize();
02478 }
02479
02480
02481 L1GtUtils::LogicalExpressionL1Results::~LogicalExpressionL1Results() {
02482
02483
02484
02485 }
02486
02487 bool L1GtUtils::LogicalExpressionL1Results::initialize() {
02488
02489
02490
02491
02492 try {
02493
02494 L1GtLogicParser m_l1AlgoLogicParser = L1GtLogicParser(
02495 m_logicalExpression);
02496
02497
02498 m_expL1Triggers = m_l1AlgoLogicParser.operandTokenVector();
02499 m_expL1TriggersSize = m_expL1Triggers.size();
02500
02501 m_validLogicalExpression = true;
02502
02503 } catch (cms::Exception & ex) {
02504 m_validLogicalExpression = false;
02505
02506 edm::LogWarning("L1GtUtils") << ex;
02507 edm::LogWarning("L1GtUtils") << ex.what();
02508 edm::LogWarning("L1GtUtils") << ex.explainSelf();
02509 }
02510
02511
02512
02513
02514
02515
02516
02517
02518 m_expBitsTechTrigger = true;
02519
02520 for (size_t iTrig = 0; iTrig < m_expL1TriggersSize; ++iTrig) {
02521 const std::string& bitString = (m_expL1Triggers[iTrig]).tokenName;
02522 std::istringstream bitStream(bitString);
02523 int bitInt;
02524
02525 if ((bitStream >> bitInt).fail()) {
02526
02527 m_expBitsTechTrigger = false;
02528
02529 break;
02530 }
02531
02532 (m_expL1Triggers[iTrig]).tokenNumber = bitInt;
02533
02534 }
02535
02536
02537 m_decisionsBeforeMask.resize(m_expL1TriggersSize);
02538 m_decisionsAfterMask.resize(m_expL1TriggersSize);
02539 m_prescaleFactors.resize(m_expL1TriggersSize);
02540 m_triggerMasks.resize(m_expL1TriggersSize);
02541 m_errorCodes.resize(m_expL1TriggersSize);
02542 m_expTriggerCategory.resize(m_expL1TriggersSize);
02543 m_expTriggerInMenu.resize(m_expL1TriggersSize);
02544
02545 LogDebug("L1GtUtils") << std::endl;
02546 LogTrace("L1GtUtils") << "\nLogical expression\n " << m_logicalExpression
02547 << "\n has " << m_expL1TriggersSize << " L1 triggers" << std::endl;
02548 for (size_t iTrig = 0; iTrig < m_expL1TriggersSize; ++iTrig) {
02549
02550 const std::string& trigNameOrAlias = (m_expL1Triggers[iTrig]).tokenName;
02551 LogTrace("L1GtUtils") << " " << trigNameOrAlias << std::endl;
02552
02553 (m_decisionsBeforeMask[iTrig]).first = trigNameOrAlias;
02554 (m_decisionsBeforeMask[iTrig]).second = false;
02555
02556 (m_decisionsAfterMask[iTrig]).first = trigNameOrAlias;
02557 (m_decisionsAfterMask[iTrig]).second = false;
02558
02559 (m_prescaleFactors[iTrig]).first = trigNameOrAlias;
02560 (m_prescaleFactors[iTrig]).second = -1;
02561
02562 (m_triggerMasks[iTrig]).first = trigNameOrAlias;
02563 (m_triggerMasks[iTrig]).second = -1;
02564
02565 (m_errorCodes[iTrig]).first = trigNameOrAlias;
02566 (m_errorCodes[iTrig]).second = -1;
02567
02568 m_expTriggerCategory[iTrig] = L1GtUtils::AlgorithmTrigger;
02569
02570 m_expTriggerInMenu[iTrig] = false;
02571
02572 }
02573 LogTrace("L1GtUtils") << std::endl;
02574
02575 return true;
02576
02577 }
02578
02579
02580 const int L1GtUtils::LogicalExpressionL1Results::logicalExpressionRunUpdate(
02581 const edm::Run& iRun, const edm::EventSetup& evSetup,
02582 const std::string& logicExpression) {
02583
02584
02585 int errorCode = 0;
02586
02587
02588
02589
02590 m_logicalExpression = logicExpression;
02591 m_validLogicalExpression = false;
02592
02593 m_l1ResultsAlreadyCalled = false;
02594
02595 m_expL1TriggersSize = 0;
02596 m_expBitsTechTrigger = false;
02597
02598
02599 m_decisionsBeforeMask.clear();
02600 m_decisionsAfterMask.clear();
02601 m_prescaleFactors.clear();
02602 m_triggerMasks.clear();
02603 m_errorCodes.clear();
02604 m_expTriggerCategory.clear();
02605 m_expTriggerInMenu.clear();
02606
02607
02608 initialize();
02609
02610
02611 errorCode = logicalExpressionRunUpdate(iRun, evSetup);
02612
02613 return errorCode;
02614
02615 }
02616
02617
02618 const int L1GtUtils::LogicalExpressionL1Results::logicalExpressionRunUpdate(
02619 const edm::Run& iRun, const edm::EventSetup& evSetup) {
02620
02621
02622
02623
02624
02625 int errorCode = 0;
02626 int l1ConfCode = 0;
02627
02628 if (!(m_l1GtUtils.availableL1Configuration(errorCode, l1ConfCode))) {
02629
02630 m_validL1Configuration = false;
02631 return errorCode;
02632 } else {
02633
02634 m_validL1Configuration = true;
02635 m_l1ConfCode = l1ConfCode;
02636 }
02637
02638
02639
02640
02641
02642
02643
02644
02645 L1GtUtils::TriggerCategory trigCategory = L1GtUtils::AlgorithmTrigger;
02646 int bitNumber = -1;
02647
02648 for (size_t iTrig = 0; iTrig < m_expL1TriggersSize; ++iTrig) {
02649
02650 trigCategory = L1GtUtils::AlgorithmTrigger;
02651 bitNumber = -1;
02652 const std::string& trigNameOrAlias = (m_expL1Triggers[iTrig]).tokenName;
02653
02654 if (!m_expBitsTechTrigger) {
02655 const bool triggerInMenu = m_l1GtUtils.l1AlgoTechTrigBitNumber(
02656 trigNameOrAlias, trigCategory, bitNumber);
02657
02658 (m_expL1Triggers[iTrig]).tokenNumber = bitNumber;
02659 m_expTriggerCategory[iTrig] = trigCategory;
02660 m_expTriggerInMenu[iTrig] = triggerInMenu;
02661
02662 } else {
02663
02664 std::string aliasL1Trigger;
02665 std::string nameL1Trigger;
02666
02667 trigCategory = L1GtUtils::TechnicalTrigger;
02668 bitNumber = (m_expL1Triggers[iTrig]).tokenNumber;
02669
02670 const bool triggerInMenu = m_l1GtUtils.l1TriggerNameFromBit(
02671 bitNumber, trigCategory, aliasL1Trigger, nameL1Trigger);
02672
02673 if (!triggerInMenu) {
02674 aliasL1Trigger = "Technical_trigger_bit_"
02675 + (m_expL1Triggers[iTrig]).tokenName + "_empty";
02676 }
02677
02678 (m_expL1Triggers[iTrig]).tokenName = aliasL1Trigger;
02679 m_expTriggerCategory[iTrig] = trigCategory;
02680 m_expTriggerInMenu[iTrig] = triggerInMenu;
02681
02682
02683
02684 (m_decisionsBeforeMask[iTrig]).first = aliasL1Trigger;
02685 (m_decisionsAfterMask[iTrig]).first = aliasL1Trigger;
02686 (m_prescaleFactors[iTrig]).first = aliasL1Trigger;
02687 (m_triggerMasks[iTrig]).first = aliasL1Trigger;
02688 (m_errorCodes[iTrig]).first = aliasL1Trigger;
02689
02690 }
02691 }
02692
02693 return errorCode;
02694
02695 }
02696
02697 const std::vector<std::pair<std::string, bool> >& L1GtUtils::LogicalExpressionL1Results::decisionsBeforeMask() {
02698
02699
02700 if (!m_l1ResultsAlreadyCalled) {
02701 throw cms::Exception("FailModule") << "\nUsage error: "
02702 << "\n Method 'errorCodes' must be called in the event loop before attempting to use this method.\n"
02703 << std::endl;
02704 }
02705
02706 return m_decisionsBeforeMask;
02707
02708 }
02709
02710 const std::vector<std::pair<std::string, bool> >& L1GtUtils::LogicalExpressionL1Results::decisionsAfterMask() {
02711
02712
02713 if (!m_l1ResultsAlreadyCalled) {
02714 throw cms::Exception("FailModule") << "\nUsage error: "
02715 << "\n Method 'errorCodes' must be called in the event loop before attempting to use this method.\n"
02716 << std::endl;
02717 }
02718
02719 return m_decisionsAfterMask;
02720
02721 }
02722
02723 const std::vector<std::pair<std::string, int> >& L1GtUtils::LogicalExpressionL1Results::prescaleFactors() {
02724
02725
02726 if (!m_l1ResultsAlreadyCalled) {
02727 throw cms::Exception("FailModule") << "\nUsage error: "
02728 << "\n Method 'errorCodes' must be called in the event loop before attempting to use this method.\n"
02729 << std::endl;
02730 }
02731
02732 return m_prescaleFactors;
02733
02734 }
02735
02736 const std::vector<std::pair<std::string, int> >& L1GtUtils::LogicalExpressionL1Results::triggerMasks() {
02737
02738
02739 if (!m_l1ResultsAlreadyCalled) {
02740 throw cms::Exception("FailModule") << "\nUsage error: "
02741 << "\n Method 'errorCodes' must be called in the event loop before attempting to use this method.\n"
02742 << std::endl;
02743 }
02744
02745 return m_triggerMasks;
02746
02747 }
02748
02749 const std::vector<std::pair<std::string, int> >& L1GtUtils::LogicalExpressionL1Results::errorCodes(
02750 const edm::Event& iEvent) {
02751
02752 m_l1ResultsAlreadyCalled = false;
02753
02754
02755 if (!m_validL1Configuration) {
02756 reset(m_decisionsBeforeMask);
02757 reset(m_decisionsAfterMask);
02758 reset(m_prescaleFactors);
02759 reset(m_triggerMasks);
02760 reset(m_errorCodes);
02761
02762 m_l1ResultsAlreadyCalled = true;
02763 return m_errorCodes;
02764
02765 }
02766
02767 if (m_l1GtInputTagsFromProv) {
02768
02769 l1Results(iEvent, m_l1GtUtils.provL1GtRecordInputTag(),
02770 m_l1GtUtils.provL1GtReadoutRecordInputTag());
02771
02772 } else {
02773
02774 l1Results(iEvent, m_l1GtRecordInputTag, m_l1GtReadoutRecordInputTag);
02775 }
02776
02777 m_l1ResultsAlreadyCalled = true;
02778
02779 return m_errorCodes;
02780
02781 }
02782
02783 void L1GtUtils::LogicalExpressionL1Results::reset(
02784 std::vector<std::pair<std::string, bool> > pairVector) const {
02785
02786 for (size_t iTrig = 0; iTrig < m_expL1TriggersSize; ++iTrig) {
02787 (pairVector[iTrig]).second = false;
02788 }
02789 }
02790
02791 void L1GtUtils::LogicalExpressionL1Results::reset(
02792 std::vector<std::pair<std::string, int> > pairVector) const {
02793
02794 for (size_t iTrig = 0; iTrig < m_expL1TriggersSize; ++iTrig) {
02795 (pairVector[iTrig]).second = -1;
02796 }
02797 }
02798
02799 void L1GtUtils::LogicalExpressionL1Results::l1Results(const edm::Event& iEvent,
02800 const edm::InputTag& l1GtRecordInputTag,
02801 const edm::InputTag& l1GtReadoutRecordInputTag) {
02802
02803
02804 reset(m_decisionsBeforeMask);
02805 reset(m_decisionsAfterMask);
02806 reset(m_prescaleFactors);
02807 reset(m_triggerMasks);
02808 reset(m_errorCodes);
02809
02810
02811 bool decisionBeforeMaskValue = false;
02812 bool decisionAfterMaskValue = false;
02813 int prescaleFactorValue = -1;
02814 int triggerMaskValue = -1;
02815 int errorCode = -1;
02816
02817 LogDebug("L1GtUtils") << std::endl;
02818 LogTrace("L1GtUtils") << "\nLogical expression\n " << m_logicalExpression
02819 << std::endl;
02820
02821
02822
02823 for (size_t iTrig = 0; iTrig < m_expL1TriggersSize; ++iTrig) {
02824
02825 const std::string& trigNameOrAlias = (m_expL1Triggers[iTrig]).tokenName;
02826
02827 if (m_expTriggerInMenu[iTrig]) {
02828 errorCode = m_l1GtUtils.l1Results(iEvent, l1GtRecordInputTag,
02829 l1GtReadoutRecordInputTag, trigNameOrAlias,
02830 decisionBeforeMaskValue, decisionAfterMaskValue,
02831 prescaleFactorValue, triggerMaskValue);
02832
02833 if (errorCode != 0) {
02834
02835
02836
02837
02838 decisionBeforeMaskValue = false;
02839 decisionAfterMaskValue = false;
02840 prescaleFactorValue = -1;
02841 triggerMaskValue = -1;
02842
02843 }
02844
02845 } else {
02846
02847
02848
02849 decisionBeforeMaskValue = false;
02850 decisionAfterMaskValue = false;
02851 prescaleFactorValue = -1;
02852 triggerMaskValue = -1;
02853 errorCode = m_l1ConfCode + 1;
02854
02855 }
02856
02857 LogTrace("L1GtUtils") << "\n" << trigNameOrAlias << ":" << std::endl;
02858
02859 (m_decisionsBeforeMask[iTrig]).second = decisionBeforeMaskValue;
02860 LogTrace("L1GtUtils") << " decision before mask = "
02861 << decisionBeforeMaskValue << std::endl;
02862
02863 (m_decisionsAfterMask[iTrig]).second = decisionAfterMaskValue;
02864 LogTrace("L1GtUtils") << " decision after mask = "
02865 << decisionAfterMaskValue << std::endl;
02866
02867 (m_prescaleFactors[iTrig]).second = prescaleFactorValue;
02868 LogTrace("L1GtUtils") << " prescale factor = "
02869 << prescaleFactorValue << std::endl;
02870
02871 (m_triggerMasks[iTrig]).second = triggerMaskValue;
02872 LogTrace("L1GtUtils") << " trigger mask = "
02873 << triggerMaskValue << std::endl;
02874
02875 (m_errorCodes[iTrig]).second = errorCode;
02876 LogTrace("L1GtUtils") << " error code = " << errorCode
02877 << std::endl;
02878
02879 }
02880
02881 LogDebug("L1GtUtils") << std::endl;
02882
02883 }
02884
02885 const std::string L1GtUtils::EmptyString = "";
02886 const int L1GtUtils::L1GtNotValidError = 99999;
02887