Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:12:53

0001 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/OMTFSorter.h"
0002 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/GoldenPattern.h"
0003 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/GoldenPatternWithStat.h"
0004 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/OMTFConfiguration.h"
0005 
0006 #include <cassert>
0007 #include <iostream>
0008 #include <strstream>
0009 #include <algorithm>
0010 #include <bitset>
0011 
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 
0014 #include "L1Trigger/RPCTrigger/interface/RPCConst.h"
0015 ///////////////////////////////////////////////////////
0016 ///////////////////////////////////////////////////////
0017 template <class GoldenPatternType>
0018 AlgoMuons::value_type OMTFSorter<GoldenPatternType>::sortRefHitResults(
0019     unsigned int procIndx, unsigned int iRefHit, const GoldenPatternVec<GoldenPatternType>& gPatterns, int charge) {
0020   GoldenPatternType* bestGP = nullptr;  //the GoldenPattern with the best result for this iRefHit
0021   //std::cout <<" ====== sortRefHitResults: " << std::endl;
0022 
0023   for (auto& itGP : gPatterns) {
0024     if (!itGP->getResults()[procIndx][iRefHit].isValid())
0025       continue;
0026 
0027     if (charge != 0 && itGP->key().theCharge != charge)
0028       continue;  //charge==0 means ignore charge
0029 
0030     ///Accept only candidates with >2 hits
0031     if (itGP->getResults()[procIndx][iRefHit].getFiredLayerCnt() < 3)  //TODO - move 3 to the configuration??
0032       continue;
0033 
0034     if (bestGP == nullptr) {
0035       bestGP = itGP.get();
0036     } else if (myType == 0 && itGP->getResults()[procIndx][iRefHit].getFiredLayerCnt() >
0037                                   bestGP->getResults()[procIndx][iRefHit].getFiredLayerCnt()) {
0038       bestGP = itGP.get();
0039       /*
0040       std::cout <<" sorter, byQual, now best is: "
0041         <<bestGP->key() << " "
0042         <<itGP->getResults()[procIndx][iRefHit]
0043         <<std::endl;
0044       */
0045     } else if (myType == 1 || (itGP->getResults()[procIndx][iRefHit].getFiredLayerCnt() ==
0046                                bestGP->getResults()[procIndx][iRefHit].getFiredLayerCnt())) {
0047       if (itGP->getResults()[procIndx][iRefHit].getPdfSum() > bestGP->getResults()[procIndx][iRefHit].getPdfSum()) {
0048         //if the PdfWeigtSum is equal, we take the GP with the lower number, i.e. lower pt = check if this is ok for physics FIXME (KB)
0049         bestGP = itGP.get();
0050         /*
0051         std::cout <<" sorter, byDisc, now best is: "
0052           <<bestGP->key() << " "
0053           <<itGP->getResults()[procIndx][iRefHit]
0054           <<std::endl;
0055     */
0056       }
0057     }
0058   }
0059   if (bestGP) {
0060     AlgoMuons::value_type candidate(new AlgoMuon(bestGP->getResults()[procIndx][iRefHit], bestGP, iRefHit));
0061     //std::cout<<__FUNCTION__<<" line "<<__LINE__ <<" return: " << *candidate << std::endl;
0062     return candidate;
0063   } else {
0064     AlgoMuons::value_type candidate(new AlgoMuon());
0065     candidate->setRefHitNumber(iRefHit);
0066     return candidate;
0067   }
0068 }
0069 
0070 template class OMTFSorter<GoldenPattern>;
0071 template class OMTFSorter<GoldenPatternWithStat>;
0072 template class OMTFSorter<GoldenPatternWithThresh>;