Back to home page

Project CMSSW displayed by LXR

 
 

    


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++) {  /// loop over candidates from four electron sorter FPGAs
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     // Assign a "priority" for sorting - this assumes the candidates
0071     // have already been filled in "priority order"
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     //Then sort it
0078     sort(data.begin(), data.end(), L1GctElectronSorter::rankByGt);
0079 
0080     //Copy data to output buffer
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 }