Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "L1Trigger/RPCTrigger/interface/RPCTBGhostBuster.h"
00009
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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 L1RpcTBMuonsVec RPCTBGhostBuster::gBPhi(L1RpcTBMuonsVec &pacMuonsVec) const {
00053 if(pacMuonsVec.size() == 0)
00054 return L1RpcTBMuonsVec();
00055
00056 pacMuonsVec.push_back(RPCTBMuon());
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();
00074
00075
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
00096
00097
00098
00099
00100
00101
00102
00103
00104
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
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
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;
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
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
00151
00152
00153
00154
00155
00156
00157
00158
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
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