CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/L1Trigger/RPCTrigger/src/RPCTBGhostBuster.cc

Go to the documentation of this file.
00001 /*******************************************************************************
00002 *                                                                              *
00003 *  Karol Bunkowski                                                             *
00004 *  Warsaw University 2004                                                      *
00005 *                                                                              *
00006 *******************************************************************************/
00007 
00008 #include "L1Trigger/RPCTrigger/interface/RPCTBGhostBuster.h"
00009 //#include <set>
00010 #include <algorithm>
00011 
00012 using namespace std;
00013 //---------------------------------------------------------------------------
00014 
00015 L1RpcTBMuonsVec RPCTBGhostBuster::run(L1RpcTBMuonsVec2 &pacMuonsVec2) const {
00016   L1RpcTBMuonsVec2 gbPhiMuonsVec2;
00017   for(unsigned int iTow = 0; iTow < pacMuonsVec2.size(); iTow++) {
00018     gbPhiMuonsVec2.push_back(gBPhi(pacMuonsVec2[iTow]));
00019   }
00020 
00021   return gBEta(gbPhiMuonsVec2);
00022 }
00023 
00024 
00025 /* version wyit imlemented condition "last but one"
00026    NOT USED IN VHDL
00027   bool prevKillByBigger = false;
00028   for(int iMu = 0; iMu < m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
00029     if(pacMuonsVec[iMu].getCode() < pacMuonsVec[iPrevMu].getCode())
00030       prevKillByBigger = true;
00031     else if(pacMuonsVec[iMu].getCode() > pacMuonsVec[iPrevMu].getCode())
00032       prevKillByBigger = false;  
00033 
00034     if(pacMuonsVec[iMu].getCode() == 0);
00035     else if(pacMuonsVec[iMu].getCode() > pacMuonsVec[iPrevMu].getCode() &&    //local maximum
00036             pacMuonsVec[iMu].getCode() > pacMuonsVec[iMu + 1].getCode()  )
00037       ;
00038     else if(pacMuonsVec[iMu].getCode() >= pacMuonsVec[iPrevMu].getCode() &&   //last-but-one
00039             pacMuonsVec[iMu].getCode() == pacMuonsVec[iMu + 1].getCode() &&
00040             pacMuonsVec[iMu + 1].getCode() > pacMuonsVec[iMu + 2].getCode()) {
00041       if(prevKillByBigger)
00042         pacMuonsVec[iMu].kill();
00043     }
00044     else {
00045       pacMuonsVec[iMu].kill();
00046     }
00047 
00048     iPrevMu = iMu;
00049   }
00050 */
00051 
00052 L1RpcTBMuonsVec RPCTBGhostBuster::gBPhi(L1RpcTBMuonsVec &pacMuonsVec) const {
00053   if(pacMuonsVec.size() == 0)
00054     return L1RpcTBMuonsVec(); //empty vector;
00055 //--------- killing ghosts ---------------------------------------
00056   pacMuonsVec.push_back(RPCTBMuon()); //adding  empty muon to the end,
00057 
00058   for(unsigned int iMu = 0; iMu < RPCConst::m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
00059     if(pacMuonsVec[iMu].getCode() == 0)
00060       ;
00061     else if(pacMuonsVec[iMu].getCode() < pacMuonsVec[iMu + 1].getCode())
00062       pacMuonsVec[iMu].kill();
00063     else if(pacMuonsVec[iMu].getCode() == pacMuonsVec[iMu + 1].getCode()) {
00064       if(pacMuonsVec[iMu].wasKilled())
00065         pacMuonsVec[iMu+1].kill();
00066       else
00067         pacMuonsVec[iMu].kill();
00068     }
00069     else  //>
00070       pacMuonsVec[iMu+1].kill();
00071   }
00072 
00073   pacMuonsVec.pop_back();  //removing empty muon from the end,
00074 
00075 //-------setting the m_GBData ----------------------------------
00076   if(pacMuonsVec[0].isLive())
00077     pacMuonsVec[0].setGBDataKilledFirst();
00078   else if(pacMuonsVec[0].wasKilled())
00079     for(unsigned int iMu = 0; iMu < RPCConst::m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
00080       if(pacMuonsVec[iMu].isLive()) {
00081         pacMuonsVec[iMu].setGBDataKilledFirst();
00082         break;
00083       }
00084     }
00085 
00086     if(pacMuonsVec[RPCConst::m_SEGMENTS_IN_SECTOR_CNT-1].isLive()) 
00087       pacMuonsVec[RPCConst::m_SEGMENTS_IN_SECTOR_CNT-1].setGBDataKilledLast();
00088     else if(pacMuonsVec[RPCConst::m_SEGMENTS_IN_SECTOR_CNT-1].wasKilled())
00089       for(int iMu = RPCConst::m_SEGMENTS_IN_SECTOR_CNT -1; iMu >= 0 ; iMu--) {
00090         if(pacMuonsVec[iMu].isLive()) {
00091           pacMuonsVec[iMu].setGBDataKilledLast();
00092           break;
00093       }
00094     }
00095 //-------------sorting ------------------------------------------
00096   /*
00097   multiset<RPCTBMuon, RPCTBMuon::TMuonMore> liveMuonsSet;
00098   for(int iMu = 0; iMu < m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
00099     if(pacMuonsVec[iMu].isLive()) {
00100       pacMuonsVec[iMu].setPhiAddr(iMu);
00101       liveMuonsSet.insert(pacMuonsVec[iMu]);
00102     }
00103   }
00104   L1RpcTBMuonsVec outputMuons(liveMuonsSet.begin(), liveMuonsSet.end());*/
00105 
00106   L1RpcTBMuonsVec outputMuons;
00107   for(unsigned int iMu = 0; iMu < RPCConst::m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
00108     if(pacMuonsVec[iMu].isLive()) {
00109       pacMuonsVec[iMu].setPhiAddr(iMu);
00110       outputMuons.push_back(pacMuonsVec[iMu]);
00111     }
00112   }
00113   sort(outputMuons.begin(), outputMuons.end(), RPCTBMuon::TMuonMore());
00114 
00115 //-------setting size to m_GBPHI_OUT_MUONS_CNT----------------
00116   while (outputMuons.size() < RPCConst::m_GBPHI_OUT_MUONS_CNT)
00117     outputMuons.push_back(RPCTBMuon());
00118   while(outputMuons.size() > RPCConst::m_GBPHI_OUT_MUONS_CNT)
00119     outputMuons.pop_back();
00120 
00121   return outputMuons;
00122 }
00123 
00125 
00126 L1RpcTBMuonsVec RPCTBGhostBuster::gBEta(L1RpcTBMuonsVec2 &gbPhiMuonsVec2) const {
00127 //-----  killing ghosts ---------------------------------------
00128   for(unsigned int iMuVec = 0; iMuVec < gbPhiMuonsVec2.size() -1; iMuVec++) {
00129     for(unsigned int iMu = 0; iMu < gbPhiMuonsVec2[iMuVec].size(); iMu++) {
00130       if(gbPhiMuonsVec2[iMuVec][iMu].getCode() == 0)
00131         break; //because muons are sorted
00132 
00133       for(unsigned int iMuNext = 0; iMuNext < gbPhiMuonsVec2[iMuVec+1].size(); iMuNext++) {
00134         if(abs(gbPhiMuonsVec2[iMuVec][iMu].getPhiAddr()-gbPhiMuonsVec2[iMuVec+1][iMuNext].getPhiAddr())<=1)
00135         {
00136           //comparing with next:
00137           if(gbPhiMuonsVec2[iMuVec][iMu].getCode() < gbPhiMuonsVec2[iMuVec+1][iMuNext].getCode()) 
00138           { 
00139             gbPhiMuonsVec2[iMuVec][iMu].kill();
00140           }
00141           else 
00142           {
00143             gbPhiMuonsVec2[iMuVec+1][iMuNext].kill();
00144           }
00145         }
00146       }
00147     }
00148   }
00149 
00150 //---------sorting-----------------------------------------
00151 /*  multiset<RPCTBMuon, RPCTBMuon::TMuonMore> liveMuonsSet;
00152   for(unsigned int iMuVec = 0; iMuVec < gbPhiMuonsVec2.size(); iMuVec++)
00153   for(unsigned int iMu = 0; iMu < gbPhiMuonsVec2[iMuVec].size(); iMu++)
00154       if(gbPhiMuonsVec2[iMuVec][iMu].isLive()) {
00155         gbPhiMuonsVec2[iMuVec][iMu].setEtaAddr(iMuVec);
00156         liveMuonsSet.insert(gbPhiMuonsVec2[iMuVec][iMu]);
00157       }
00158   L1RpcTBMuonsVec outputMuons(liveMuonsSet.begin(), liveMuonsSet.end()); */
00159 
00160   L1RpcTBMuonsVec outputMuons;
00161   for(unsigned int iMuVec = 0; iMuVec < gbPhiMuonsVec2.size(); iMuVec++)
00162     for(unsigned int iMu = 0; iMu < gbPhiMuonsVec2[iMuVec].size(); iMu++)
00163       if(gbPhiMuonsVec2[iMuVec][iMu].isLive()) {
00164         gbPhiMuonsVec2[iMuVec][iMu].setEtaAddr(iMuVec);
00165         outputMuons.push_back(gbPhiMuonsVec2[iMuVec][iMu]);
00166       }
00167   sort(outputMuons.begin(), outputMuons.end(), RPCTBMuon::TMuonMore());
00168   
00169 //-------setting size to m_GBETA_OUT_MUONS_CNT----------------
00170   while(outputMuons.size() < RPCConst::m_GBETA_OUT_MUONS_CNT)
00171     outputMuons.push_back(RPCTBMuon());
00172   while(outputMuons.size() > RPCConst::m_GBETA_OUT_MUONS_CNT)
00173     outputMuons.pop_back();
00174 
00175   return outputMuons;
00176 }
00177 
00178