CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/L1Trigger/CSCTrackFinder/src/CSCTFMuonSorter.cc

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   // First we sort and crop the incoming tracks based on their rank.
00016   for(int bx = m_minBX - 6; bx <= m_maxBX - 6; ++bx) // switch back into signed 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); // resize to max number of muons the MS can output
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; // for now, convert using this.. LUT in the future
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 // This will change to use a look up table
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 }