508 auto triggerObjects = std::make_unique<TriggerObjectCollection>();
509 auto triggerObjectsStandAlone = std::make_unique<TriggerObjectStandAloneCollection>();
510 std::unique_ptr<PackedTriggerPrescales> packedPrescales, packedPrescalesL1min, packedPrescalesL1max;
522 if (!handleTriggerResults.
isValid()) {
524 <<
"' not in event\n"
525 <<
"No HLT information produced";
527 }
else if (!handleTriggerEvent.
isValid()) {
529 <<
"' not in event\n"
530 <<
"No HLT information produced";
546 if (handleHltPrescaleTable.
isValid()) {
548 handleHltPrescaleTable->
set(), handleHltPrescaleTable->
labels(), handleHltPrescaleTable->
table());
552 if (hltPrescaleTable.size() == 0) {
556 <<
"Using default from event setup";
562 LogDebug(
"hltPrescaleTable") <<
"HLT prescale table found in event setup";
564 LogWarning(
"hltPrescaleSet") <<
"HLTPrescaleTable from event setup has error";
568 unsigned set(hltPrescaleTable.set());
569 if (hltPrescaleTable.size() > 0) {
571 bool foundPrescaleLabel(
false);
572 for (
unsigned iLabel = 0; iLabel < hltPrescaleTable.labels().size(); ++iLabel) {
575 foundPrescaleLabel =
true;
579 if (!foundPrescaleLabel) {
584 }
else if (
iEvent.isRealData()) {
586 LogError(
"hltPrescaleTable") <<
"No HLT prescale table found\n"
587 <<
"Using default empty table with all prescales 1";
591 const unsigned sizePaths(
hltConfig.size());
592 const unsigned sizeFilters(handleTriggerEvent->
sizeFilters());
593 const unsigned sizeObjects(handleTriggerEvent->
sizeObjects());
595 std::map<std::string, int> moduleStates;
598 auto triggerPaths = std::make_unique<TriggerPathCollection>();
600 const std::vector<std::string>& pathNames =
hltConfig.triggerNames();
601 for (
size_t indexPath = 0; indexPath < sizePaths; ++indexPath) {
602 const std::string& namePath = pathNames.at(indexPath);
603 unsigned indexLastFilterPathModules(handleTriggerResults->
index(indexPath) + 1);
604 const unsigned sizeModulesPath(
hltConfig.size(indexPath));
606 if (sizeModulesPath != 0) {
607 while (indexLastFilterPathModules > 0) {
608 --indexLastFilterPathModules;
609 const std::string& labelLastFilterPathModules(
hltConfig.moduleLabel(indexPath, indexLastFilterPathModules));
610 unsigned indexLastFilterFilters =
612 if (indexLastFilterFilters < sizeFilters) {
613 if (
hltConfig.moduleType(labelLastFilterPathModules) ==
"HLTBool")
619 indexLastFilterPathModules = 0;
624 handleTriggerResults->
wasrun(indexPath),
625 handleTriggerResults->
accept(indexPath),
626 handleTriggerResults->
error(indexPath),
627 indexLastFilterPathModules,
628 hltConfig.saveTagsModules(namePath).size());
631 assert(indexLastFilterPathModules < sizeModulesPath || sizeModulesPath == 0);
632 std::map<unsigned, std::string> indicesModules;
633 for (
size_t iM = 0; iM < sizeModulesPath; ++iM) {
639 if (indexFilter < sizeFilters) {
642 const unsigned slotModule(
hltConfig.moduleIndex(indexPath, nameModule));
643 indicesModules.insert(std::pair<unsigned, std::string>(slotModule, nameModule));
647 for (L1SeedCollection::const_iterator iSeed = l1Seeds.begin(); iSeed != l1Seeds.end(); ++iSeed) {
653 for (std::map<unsigned, std::string>::const_iterator iM = indicesModules.begin(); iM != indicesModules.end();
655 if (iM->first < indexLastFilterPathModules) {
656 moduleStates[iM->second] = 1;
657 }
else if (iM->first == indexLastFilterPathModules) {
658 moduleStates[iM->second] = handleTriggerResults->
accept(indexPath);
659 }
else if (moduleStates.find(iM->second) == moduleStates.end()) {
660 moduleStates[iM->second] = -1;
671 std::multimap<trigger::size_type, int>
objectTypes;
672 std::multimap<trigger::size_type, std::string> filterLabels;
674 for (
size_t iF = 0; iF < sizeFilters; ++iF) {
679 for (
size_t iK = 0; iK <
keys.size(); ++iK) {
680 filterLabels.insert(std::pair<trigger::size_type, std::string>(
keys[iK], nameFilter));
688 triggerObjectsStandAlone->reserve(sizeObjects);
691 std::map<trigger::size_type, trigger::size_type> newObjectKeys;
692 for (
size_t iO = 0, iC = 0, nC = handleTriggerEvent->
sizeCollections(); iO < sizeObjects && iC < nC; ++iO) {
697 while (iO >= collectionKeys[iC])
701 typedef std::multimap<trigger::size_type, int>::const_iterator it_type;
702 for (std::pair<it_type, it_type> trange =
objectTypes.equal_range(iO); trange.first != trange.second;
704 triggerObject.addTriggerObjectType(trange.first->second);
710 bool excluded(
false);
721 typedef std::multimap<trigger::size_type, std::string>::const_iterator it_fl;
722 for (std::pair<it_fl, it_fl> frange = filterLabels.equal_range(iO); frange.first != frange.second;
724 triggerObjectStandAlone.addFilterLabel(frange.first->second);
725 const std::vector<ModuleLabelToPathAndFlags::PathAndFlags>&
paths =
727 for (std::vector<ModuleLabelToPathAndFlags::PathAndFlags>::const_iterator iP =
paths.begin(); iP !=
paths.end();
729 bool pathFired = handleTriggerResults->
wasrun(iP->pathIndex) && handleTriggerResults->
accept(iP->pathIndex);
730 triggerObjectStandAlone.addPathName(iP->pathName, pathFired && iP->lastFilter, pathFired && iP->l3Filter);
734 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
743 auto triggerFilters = std::make_unique<TriggerFilterCollection>();
744 triggerFilters->reserve(sizeFilters);
745 for (
size_t iF = 0; iF < sizeFilters; ++iF) {
755 for (
size_t iK = 0; iK <
keys.size(); ++iK) {
757 if (newObjectKeys.find(
keys.at(iK)) != newObjectKeys.end()) {
758 if (newObjectKeys[
keys.at(iK)] == sizeObjects)
763 LogWarning(
"triggerObjectKey") <<
"TriggerFilter '" << nameFilter
764 <<
"' requests non-existing TriggerObject key " <<
keys.at(iK) <<
"\n"
765 <<
"Skipping object assignment";
769 std::map<std::string, int>::iterator iS(moduleStates.find(nameFilter));
770 if (iS != moduleStates.end()) {
785 packedPrescales = std::make_unique<PackedTriggerPrescales>(handleTriggerResults);
786 packedPrescalesL1min = std::make_unique<PackedTriggerPrescales>(handleTriggerResults);
787 packedPrescalesL1max = std::make_unique<PackedTriggerPrescales>(handleTriggerResults);
790 for (
unsigned int i = 0,
n =
names.size();
i <
n; ++
i) {
793 if (pvdet.first.empty()) {
794 packedPrescalesL1max->addPrescaledTrigger(
i, 1);
795 packedPrescalesL1min->addPrescaledTrigger(
i, 1);
797 int pmin = -1, pmax = -1;
798 for (
const auto&
p : pvdet.first) {
800 if (
p.second > 0 && (
pmin == -1 ||
pmin >
p.second))
803 packedPrescalesL1max->addPrescaledTrigger(
i, pmax);
804 packedPrescalesL1min->addPrescaledTrigger(
i,
pmin);
807 packedPrescales->addPrescaledTrigger(
i, pvdet.second);
821 std::map<L1GtObject, std::vector<unsigned> > l1ObjectTypeMap;
825 if (handleL1ExtraMu.
isValid()) {
826 std::vector<unsigned> muKeys;
827 for (
size_t l1Mu = 0; l1Mu < handleL1ExtraMu->size(); ++l1Mu) {
828 if (
mainBxOnly_ && handleL1ExtraMu->at(l1Mu).bx() != 0)
835 const reco::LeafCandidate leafCandidate(*(handleL1ExtraMu->at(l1Mu).reco::LeafCandidate::clone()));
843 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
844 if (handleL1ExtraMu->at(l1Mu).bx() == 0)
845 muKeys.push_back(triggerObjectsStandAlone->size() - 1);
847 l1ObjectTypeMap.insert(std::make_pair(
Mu, muKeys));
855 if (handleL1ExtraNoIsoEG.
isValid()) {
856 std::vector<unsigned> noIsoEGKeys;
857 for (
size_t l1NoIsoEG = 0; l1NoIsoEG < handleL1ExtraNoIsoEG->size(); ++l1NoIsoEG) {
858 if (
mainBxOnly_ && handleL1ExtraNoIsoEG->at(l1NoIsoEG).bx() != 0)
865 const reco::LeafCandidate leafCandidate(*(handleL1ExtraNoIsoEG->at(l1NoIsoEG).reco::LeafCandidate::clone()));
873 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
874 if (handleL1ExtraNoIsoEG->at(l1NoIsoEG).bx() == 0)
875 noIsoEGKeys.push_back(triggerObjectsStandAlone->size() - 1);
877 l1ObjectTypeMap.insert(std::make_pair(
NoIsoEG, noIsoEGKeys));
879 LogError(
"l1ExtraValid") <<
"l1extra::L1EmParticleCollection product with InputTag '"
885 if (handleL1ExtraIsoEG.
isValid()) {
886 std::vector<unsigned> isoEGKeys;
887 for (
size_t l1IsoEG = 0; l1IsoEG < handleL1ExtraIsoEG->size(); ++l1IsoEG) {
888 if (
mainBxOnly_ && handleL1ExtraIsoEG->at(l1IsoEG).bx() != 0)
895 const reco::LeafCandidate leafCandidate(*(handleL1ExtraIsoEG->at(l1IsoEG).reco::LeafCandidate::clone()));
903 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
904 if (handleL1ExtraIsoEG->at(l1IsoEG).bx() == 0)
905 isoEGKeys.push_back(triggerObjectsStandAlone->size() - 1);
907 l1ObjectTypeMap.insert(std::make_pair(
IsoEG, isoEGKeys));
915 if (handleL1ExtraCenJet.
isValid()) {
916 std::vector<unsigned> cenJetKeys;
917 for (
size_t l1CenJet = 0; l1CenJet < handleL1ExtraCenJet->size(); ++l1CenJet) {
918 if (
mainBxOnly_ && handleL1ExtraCenJet->at(l1CenJet).bx() != 0)
925 const reco::LeafCandidate leafCandidate(*(handleL1ExtraCenJet->at(l1CenJet).reco::LeafCandidate::clone()));
933 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
934 if (handleL1ExtraCenJet->at(l1CenJet).bx() == 0)
935 cenJetKeys.push_back(triggerObjectsStandAlone->size() - 1);
937 l1ObjectTypeMap.insert(std::make_pair(
CenJet, cenJetKeys));
939 LogError(
"l1ExtraValid") <<
"l1extra::L1JetParticleCollection product with InputTag '"
945 if (handleL1ExtraForJet.
isValid()) {
946 std::vector<unsigned> forJetKeys;
947 for (
size_t l1ForJet = 0; l1ForJet < handleL1ExtraForJet->size(); ++l1ForJet) {
948 if (
mainBxOnly_ && handleL1ExtraForJet->at(l1ForJet).bx() != 0)
955 const reco::LeafCandidate leafCandidate(*(handleL1ExtraForJet->at(l1ForJet).reco::LeafCandidate::clone()));
963 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
964 if (handleL1ExtraForJet->at(l1ForJet).bx() == 0)
965 forJetKeys.push_back(triggerObjectsStandAlone->size() - 1);
967 l1ObjectTypeMap.insert(std::make_pair(
ForJet, forJetKeys));
969 LogError(
"l1ExtraValid") <<
"l1extra::L1JetParticleCollection product with InputTag '"
975 if (handleL1ExtraTauJet.
isValid()) {
976 std::vector<unsigned> tauJetKeys;
977 for (
size_t l1TauJet = 0; l1TauJet < handleL1ExtraTauJet->size(); ++l1TauJet) {
978 if (
mainBxOnly_ && handleL1ExtraTauJet->at(l1TauJet).bx() != 0)
985 const reco::LeafCandidate leafCandidate(*(handleL1ExtraTauJet->at(l1TauJet).reco::LeafCandidate::clone()));
993 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
994 if (handleL1ExtraTauJet->at(l1TauJet).bx() == 0)
995 tauJetKeys.push_back(triggerObjectsStandAlone->size() - 1);
997 l1ObjectTypeMap.insert(std::make_pair(
TauJet, tauJetKeys));
999 LogError(
"l1ExtraValid") <<
"l1extra::L1JetParticleCollection product with InputTag '"
1005 if (handleL1ExtraETM.
isValid()) {
1006 std::vector<unsigned> etmKeys;
1007 for (
size_t l1ETM = 0; l1ETM < handleL1ExtraETM->size(); ++l1ETM) {
1008 if (
mainBxOnly_ && handleL1ExtraETM->at(l1ETM).bx() != 0)
1015 const reco::LeafCandidate leafCandidate(*(handleL1ExtraETM->at(l1ETM).reco::LeafCandidate::clone()));
1023 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
1024 if (handleL1ExtraETM->at(l1ETM).bx() == 0)
1025 etmKeys.push_back(triggerObjectsStandAlone->size() - 1);
1027 l1ObjectTypeMap.insert(std::make_pair(
ETM, etmKeys));
1029 LogError(
"l1ExtraValid") <<
"l1extra::L1EtMissParticleCollection product with InputTag '"
1035 if (handleL1ExtraHTM.
isValid()) {
1036 std::vector<unsigned> htmKeys;
1037 for (
size_t l1HTM = 0; l1HTM < handleL1ExtraHTM->size(); ++l1HTM) {
1038 if (
mainBxOnly_ && handleL1ExtraHTM->at(l1HTM).bx() != 0)
1045 const reco::LeafCandidate leafCandidate(*(handleL1ExtraHTM->at(l1HTM).reco::LeafCandidate::clone()));
1053 triggerObjectsStandAlone->push_back(triggerObjectStandAlone);
1054 if (handleL1ExtraHTM->at(l1HTM).bx() == 0)
1055 htmKeys.push_back(triggerObjectsStandAlone->size() - 1);
1057 l1ObjectTypeMap.insert(std::make_pair(
HTM, htmKeys));
1059 LogError(
"l1ExtraValid") <<
"l1extra::L1EtMissParticleCollection product with InputTag '"
1069 auto triggerAlgos = std::make_unique<TriggerAlgorithmCollection>();
1073 std::map<L1GtObject, trigger::TriggerObjectType> mapObjectTypes;
1085 auto const& l1GtAlgorithms = handleL1GtTriggerMenu->gtAlgorithmMap();
1086 auto const& l1GtTechTriggers = handleL1GtTriggerMenu->gtTechnicalTriggerMap();
1087 auto const& l1GtConditionsVector = handleL1GtTriggerMenu->gtConditionMap();
1090 for (
size_t iCv = 0; iCv < l1GtConditionsVector.size(); ++iCv) {
1091 l1GtConditions.insert(l1GtConditionsVector.at(iCv).begin(), l1GtConditionsVector.at(iCv).end());
1093 triggerAlgos->reserve(l1GtAlgorithms.size() + l1GtTechTriggers.size());
1096 if (!handleL1GlobalTriggerObjectMaps.
isValid()) {
1097 LogError(
"l1ObjectMap") <<
"L1GlobalTriggerObjectMaps product with InputTag '"
1099 <<
"No L1 objects and GTL results available for physics algorithms";
1106 LogError(
"l1ObjectMap") <<
"ParameterSet registry not available\n"
1107 <<
"Skipping conditions for all L1 physics algorithm names in this run";
1111 LogInfo(
"l1ObjectMap") <<
"ParameterSet registry not available\n"
1112 <<
"Skipping conditions for all L1 physics algorithm names in this event";
1116 for (
CItAlgo iAlgo = l1GtAlgorithms.begin(); iAlgo != l1GtAlgorithms.end(); ++iAlgo) {
1119 LogError(
"l1Algo") <<
"L1 physics algorithm '" <<
algoName <<
"' has bit number "
1120 << iAlgo->second.algoBitNumber()
1128 LogError(
"l1Algo") <<
"L1 physics algorithm '" <<
algoName <<
"' not found in the L1 menu\n"
1134 <<
"' does not have category 'AlgorithmTrigger' from 'L1GtUtils'\n"
1138 bool decisionBeforeMask;
1139 bool decisionAfterMask;
1145 <<
" from 'L1GtUtils'\n"
1150 iAlgo->second.algoAlias(),
1157 triggerAlgo.setLogicalExpression(iAlgo->second.algoLogicalExpression());
1159 if (!handleL1GlobalTriggerObjectMaps.
isValid()) {
1160 triggerAlgos->push_back(triggerAlgo);
1165 <<
"' is missing in L1GlobalTriggerObjectMaps\n"
1166 <<
"Skipping conditions and GTL result";
1167 triggerAlgos->push_back(triggerAlgo);
1170 bool algorithmResult = handleL1GlobalTriggerObjectMaps->
algorithmResult(bit);
1172 if ((algorithmResult != decisionBeforeMask) &&
1173 (decisionBeforeMask ==
true)) {
1174 LogInfo(
"l1ObjectMap") <<
"L1 physics algorithm '" <<
algoName <<
"' with different decisions in\n"
1175 <<
"L1GlobalTriggerObjectMaps (GTL result) : " << algorithmResult <<
"\n"
1176 <<
"L1GlobalTriggerReadoutRecord (decision before mask): " << decisionBeforeMask;
1178 triggerAlgo.setGtlResult(algorithmResult);
1183 triggerAlgos->push_back(triggerAlgo);
1189 <<
"' not available in ParameterSet registry\n"
1190 <<
"Skipping conditions for this algorithm in this run";
1193 <<
"' not available in ParameterSet registry\n"
1194 <<
"Skipping conditions for this algorithm in this event";
1196 triggerAlgos->push_back(triggerAlgo);
1201 for (
unsigned iT = 0; iT < conditionNames.size(); ++iT) {
1211 LogError(
"l1CondMap") <<
"More condition names from ParameterSet registry than the "
1212 <<
conditions.nConditions() <<
" conditions in L1GlobalTriggerObjectMaps\n"
1213 <<
"Skipping condition " << conditionNames.at(iT) <<
" in algorithm " <<
algoName;
1217 if (l1GtConditions.find(triggerCond.name()) != l1GtConditions.end()) {
1218 triggerCond.
setCategory(l1GtConditions[triggerCond.name()]->condCategory());
1219 triggerCond.setType(l1GtConditions[triggerCond.name()]->condType());
1220 const std::vector<L1GtObject> l1ObjectTypes(l1GtConditions[triggerCond.name()]->objectType());
1221 for (
size_t iType = 0; iType < l1ObjectTypes.size(); ++iType) {
1222 triggerCond.addTriggerObjectType(mapObjectTypes[l1ObjectTypes.at(iType)]);
1227 for (
size_t iVV = 0; iVV < combinations.
nCombinations(); ++iVV) {
1230 if (iV >= l1ObjectTypes.size()) {
1231 LogError(
"l1CondMap") <<
"Index " << iV <<
" in combinations vector overshoots size "
1232 << l1ObjectTypes.size() <<
" of types vector in conditions map\n"
1233 <<
"Skipping object key in condition " << triggerCond.name();
1234 }
else if (l1ObjectTypeMap.find(l1ObjectTypes.at(iV)) != l1ObjectTypeMap.end()) {
1235 if (objectIndex >= l1ObjectTypeMap[l1ObjectTypes.at(iV)].size()) {
1237 <<
"Index " << objectIndex <<
" in combination overshoots number "
1238 << l1ObjectTypeMap[l1ObjectTypes.at(iV)].size() <<
"of according trigger objects\n"
1239 <<
"Skipping object key in condition " << triggerCond.name();
1241 const unsigned objectKey(l1ObjectTypeMap[l1ObjectTypes.at(iV)].at(objectIndex));
1242 triggerCond.addObjectKey(objectKey);
1244 triggerObjectsStandAlone->at(objectKey).addAlgorithmName(
1245 triggerAlgo.name(), (triggerAlgo.decision() && triggerCond.wasAccept()));
1246 triggerObjectsStandAlone->at(objectKey).addConditionName(triggerCond.name());
1251 LogWarning(
"l1CondMap") <<
"L1 conditions '" << triggerCond.name() <<
"' not found in the L1 menu\n"
1252 <<
"Remains incomplete";
1256 triggerAlgo.addConditionKey(
key);
1258 triggerAlgos->push_back(triggerAlgo);
1261 for (
CItAlgo iAlgo = l1GtTechTriggers.begin(); iAlgo != l1GtTechTriggers.end(); ++iAlgo) {
1264 LogError(
"l1Algo") <<
"L1 technical trigger '" <<
algoName <<
"' has bit number "
1265 << iAlgo->second.algoBitNumber()
1273 LogError(
"l1Algo") <<
"L1 technical trigger '" <<
algoName <<
"' not found in the L1 menu\n"
1279 <<
"' does not have category 'TechnicalTrigger' from 'L1GtUtils'\n"
1283 bool decisionBeforeMask;
1284 bool decisionAfterMask;
1290 <<
" from 'L1GtUtils'\n"
1295 iAlgo->second.algoAlias(),
1302 triggerAlgo.setLogicalExpression(iAlgo->second.algoLogicalExpression());
1303 triggerAlgos->push_back(triggerAlgo);
1321 obj.packFilterLabels(
iEvent, *handleTriggerResults);