File indexing completed on 2024-04-06 12:19:52
0001 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctElectronFinalSort.h"
0002 #include "L1Trigger/GlobalCaloTrigger/interface/L1GctEmLeafCard.h"
0003
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005
0006 #include <algorithm>
0007
0008 L1GctElectronFinalSort::L1GctElectronFinalSort(bool iso, L1GctEmLeafCard* posEtaCard, L1GctEmLeafCard* negEtaCard)
0009 : L1GctProcessor(),
0010 m_emCandsType(iso),
0011 m_thePosEtaLeafCard(nullptr),
0012 m_theNegEtaLeafCard(nullptr),
0013 m_inputCands(16),
0014 m_outputCands(4),
0015 m_setupOk(true) {
0016 if (posEtaCard != nullptr) {
0017 m_thePosEtaLeafCard = posEtaCard;
0018 } else {
0019 m_setupOk = false;
0020 if (m_verbose) {
0021 edm::LogWarning("L1GctSetupError") << "L1GctElectronFinalSort::Constructor() : 1st EmLeafCard passed is zero";
0022 }
0023 }
0024 if (negEtaCard != nullptr) {
0025 m_theNegEtaLeafCard = negEtaCard;
0026 } else {
0027 m_setupOk = false;
0028 if (m_verbose) {
0029 edm::LogWarning("L1GctSetupError") << "L1GctElectronFinalSort::Constructor() : 2nd EmLeafCard passed is zero";
0030 }
0031 }
0032 if (!m_setupOk && m_verbose) {
0033 edm::LogError("L1GctSetupError") << "L1GctElectronFinalSort has been incorrectly constructed";
0034 }
0035 }
0036
0037 L1GctElectronFinalSort::~L1GctElectronFinalSort() {
0038 m_inputCands.clear();
0039 m_outputCands.contents.clear();
0040 }
0041
0042 void L1GctElectronFinalSort::resetProcessor() {
0043 m_inputCands.clear();
0044 m_inputCands.resize(16);
0045 }
0046
0047 void L1GctElectronFinalSort::resetPipelines() { m_outputCands.reset(numOfBx()); }
0048
0049 void L1GctElectronFinalSort::fetchInput() {
0050 if (m_setupOk) {
0051 for (int k = 0; k < 4; k++) {
0052 if (m_emCandsType) {
0053 setInputEmCand(k, m_thePosEtaLeafCard->getIsoElectronSorterU1()->getOutputCands().at(k));
0054 setInputEmCand(k + 4, m_thePosEtaLeafCard->getIsoElectronSorterU2()->getOutputCands().at(k));
0055 setInputEmCand(k + 8, m_theNegEtaLeafCard->getIsoElectronSorterU1()->getOutputCands().at(k));
0056 setInputEmCand(k + 12, m_theNegEtaLeafCard->getIsoElectronSorterU2()->getOutputCands().at(k));
0057 } else {
0058 setInputEmCand(k, m_thePosEtaLeafCard->getNonIsoElectronSorterU1()->getOutputCands().at(k));
0059 setInputEmCand(k + 4, m_thePosEtaLeafCard->getNonIsoElectronSorterU2()->getOutputCands().at(k));
0060 setInputEmCand(k + 8, m_theNegEtaLeafCard->getNonIsoElectronSorterU1()->getOutputCands().at(k));
0061 setInputEmCand(k + 12, m_theNegEtaLeafCard->getNonIsoElectronSorterU2()->getOutputCands().at(k));
0062 }
0063 }
0064 }
0065 }
0066
0067 void L1GctElectronFinalSort::process() {
0068 if (m_setupOk) {
0069 std::vector<prioritisedEmCand> data(m_inputCands.size());
0070
0071
0072 for (unsigned i = 0; i < m_inputCands.size(); i++) {
0073 prioritisedEmCand c(m_inputCands.at(i), i);
0074 data.at(i) = c;
0075 }
0076
0077
0078 sort(data.begin(), data.end(), L1GctElectronSorter::rankByGt);
0079
0080
0081 std::vector<L1GctEmCand> temp(4);
0082 for (int i = 0; i < 4; i++) {
0083 temp.at(i) = data.at(i).emCand;
0084 }
0085 m_outputCands.store(temp, bxRel());
0086 }
0087 }
0088
0089 void L1GctElectronFinalSort::setInputEmCand(unsigned i, const L1GctEmCand& cand) {
0090 if ((i < m_inputCands.size()) && (cand.bx() == bxAbs())) {
0091 m_inputCands.at(i) = cand;
0092 }
0093 }
0094
0095 std::ostream& operator<<(std::ostream& s, const L1GctElectronFinalSort& cand) {
0096 s << "===ElectronFinalSort===" << std::endl;
0097 s << "Card type = " << (cand.m_emCandsType ? "isolated" : "non-isolated") << std::endl;
0098 s << "Pointers to the Electron Leaf cards are: " << std::endl;
0099 s << " Pos. eta: " << cand.m_thePosEtaLeafCard;
0100 s << " Neg. eta: " << cand.m_theNegEtaLeafCard;
0101 s << std::endl;
0102 s << "No of Electron Input Candidates " << cand.m_inputCands.size() << std::endl;
0103 s << "No of Electron Output Candidates " << cand.m_outputCands.contents.size() << std::endl;
0104
0105 return s;
0106 }