Go to the documentation of this file.00001 #include <L1Trigger/CSCTrackFinder/interface/CSCTFMuonSorter.h>
00002
00003 #include <FWCore/MessageLogger/interface/MessageLogger.h>
00004
00005 CSCTFMuonSorter::CSCTFMuonSorter(const edm::ParameterSet& pset)
00006 {
00007 m_minBX = pset.getParameter<int>("MinBX");
00008 m_maxBX = pset.getParameter<int>("MaxBX");
00009 }
00010
00011 std::vector<L1MuRegionalCand> CSCTFMuonSorter::run(const CSCTriggerContainer<csc::L1Track>& tracks) const
00012 {
00013 std::vector<L1MuRegionalCand> result;
00014
00015
00016 for(int bx = m_minBX - 6; bx <= m_maxBX - 6; ++bx)
00017 {
00018 std::vector<csc::L1Track> tks = tracks.get(bx);
00019 std::sort(tks.begin(),tks.end(),std::greater<csc::L1Track>());
00020 if(tks.size() > 4) tks.resize(4);
00021
00022 std::vector<csc::L1Track>::iterator itr = tks.begin();
00023 std::vector<csc::L1Track>::const_iterator end = tks.end();
00024 for(; itr != end; itr++)
00025 {
00026
00027
00028 unsigned gbl_phi = itr->localPhi() + ((itr->sector() - 1)*24) + 6;
00029 if(gbl_phi > 143) gbl_phi -= 143;
00030 itr->setPhiPacked(gbl_phi & 0xff);
00031 unsigned eta_sign = (itr->endcap() == 1 ? 0 : 1);
00032
00033 int gbl_eta = itr->eta_packed() | eta_sign << (L1MuRegionalCand::ETA_LENGTH - 1);
00034
00035 itr->setEtaPacked(gbl_eta & 0x3f);
00036 unsigned pt = 0, quality = 0;
00037 decodeRank(itr->rank(), quality, pt);
00038
00039 itr->setQualityPacked(quality & 0x3);
00040 itr->setPtPacked(pt & 0x1f);
00041
00042 if(!itr->empty()) result.push_back(*itr);
00043 }
00044 }
00045
00046 std::vector<L1MuRegionalCand>::const_iterator ittr = result.begin();
00047 unsigned ii = 1;
00048 for(; ittr != result.end(); ittr++)
00049 {
00050 LogDebug("CSCTFMuonSorter:run()") << "TRACK " << ii++ << ": Eta: " << ittr->etaValue()
00051 << " Phi: " << ittr->phiValue() << " Pt: " << ittr->ptValue()
00052 << " Quality: " << ittr->quality() << " BX: " << ittr->bx();
00053 }
00054
00055 return result;
00056 }
00057
00058
00059
00060 void CSCTFMuonSorter::decodeRank(const unsigned& rank, unsigned& quality,
00061 unsigned& pt) const
00062 {
00063 if(rank == 0)
00064 {
00065 quality = 0;
00066 pt = 0;
00067 }
00068 else
00069 {
00070 quality = rank >> L1MuRegionalCand::PT_LENGTH;
00071 pt = rank & ( (1<<L1MuRegionalCand::PT_LENGTH) - 1);
00072 }
00073 }