CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
RPCTBGhostBuster.cc
Go to the documentation of this file.
1 /*******************************************************************************
2 * *
3 * Karol Bunkowski *
4 * Warsaw University 2004 *
5 * *
6 *******************************************************************************/
7 
9 //#include <set>
10 #include <algorithm>
11 
12 using namespace std;
13 //---------------------------------------------------------------------------
14 
16  L1RpcTBMuonsVec2 gbPhiMuonsVec2;
17  for (unsigned int iTow = 0; iTow < pacMuonsVec2.size(); iTow++) {
18  gbPhiMuonsVec2.push_back(gBPhi(pacMuonsVec2[iTow]));
19  }
20 
21  return gBEta(gbPhiMuonsVec2);
22 }
23 
24 /* version wyit imlemented condition "last but one"
25  NOT USED IN VHDL
26  bool prevKillByBigger = false;
27  for(int iMu = 0; iMu < m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
28  if(pacMuonsVec[iMu].getCode() < pacMuonsVec[iPrevMu].getCode())
29  prevKillByBigger = true;
30  else if(pacMuonsVec[iMu].getCode() > pacMuonsVec[iPrevMu].getCode())
31  prevKillByBigger = false;
32 
33  if(pacMuonsVec[iMu].getCode() == 0);
34  else if(pacMuonsVec[iMu].getCode() > pacMuonsVec[iPrevMu].getCode() && //local maximum
35  pacMuonsVec[iMu].getCode() > pacMuonsVec[iMu + 1].getCode() )
36  ;
37  else if(pacMuonsVec[iMu].getCode() >= pacMuonsVec[iPrevMu].getCode() && //last-but-one
38  pacMuonsVec[iMu].getCode() == pacMuonsVec[iMu + 1].getCode() &&
39  pacMuonsVec[iMu + 1].getCode() > pacMuonsVec[iMu + 2].getCode()) {
40  if(prevKillByBigger)
41  pacMuonsVec[iMu].kill();
42  }
43  else {
44  pacMuonsVec[iMu].kill();
45  }
46 
47  iPrevMu = iMu;
48  }
49 */
50 
52  if (pacMuonsVec.empty())
53  return L1RpcTBMuonsVec(); //empty vector;
54  //--------- killing ghosts ---------------------------------------
55  pacMuonsVec.push_back(RPCTBMuon()); //adding empty muon to the end,
56 
57  for (unsigned int iMu = 0; iMu < RPCConst::m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
58  if (pacMuonsVec[iMu].getCode() == 0)
59  ;
60  else if (pacMuonsVec[iMu].getCode() < pacMuonsVec[iMu + 1].getCode())
61  pacMuonsVec[iMu].kill();
62  else if (pacMuonsVec[iMu].getCode() == pacMuonsVec[iMu + 1].getCode()) {
63  if (pacMuonsVec[iMu].wasKilled())
64  pacMuonsVec[iMu + 1].kill();
65  else
66  pacMuonsVec[iMu].kill();
67  } else //>
68  pacMuonsVec[iMu + 1].kill();
69  }
70 
71  pacMuonsVec.pop_back(); //removing empty muon from the end,
72 
73  //-------setting the m_GBData ----------------------------------
74  if (pacMuonsVec[0].isLive())
75  pacMuonsVec[0].setGBDataKilledFirst();
76  else if (pacMuonsVec[0].wasKilled())
77  for (unsigned int iMu = 0; iMu < RPCConst::m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
78  if (pacMuonsVec[iMu].isLive()) {
79  pacMuonsVec[iMu].setGBDataKilledFirst();
80  break;
81  }
82  }
83 
84  if (pacMuonsVec[RPCConst::m_SEGMENTS_IN_SECTOR_CNT - 1].isLive())
85  pacMuonsVec[RPCConst::m_SEGMENTS_IN_SECTOR_CNT - 1].setGBDataKilledLast();
86  else if (pacMuonsVec[RPCConst::m_SEGMENTS_IN_SECTOR_CNT - 1].wasKilled())
87  for (int iMu = RPCConst::m_SEGMENTS_IN_SECTOR_CNT - 1; iMu >= 0; iMu--) {
88  if (pacMuonsVec[iMu].isLive()) {
89  pacMuonsVec[iMu].setGBDataKilledLast();
90  break;
91  }
92  }
93  //-------------sorting ------------------------------------------
94  /*
95  multiset<RPCTBMuon, RPCTBMuon::TMuonMore> liveMuonsSet;
96  for(int iMu = 0; iMu < m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
97  if(pacMuonsVec[iMu].isLive()) {
98  pacMuonsVec[iMu].setPhiAddr(iMu);
99  liveMuonsSet.insert(pacMuonsVec[iMu]);
100  }
101  }
102  L1RpcTBMuonsVec outputMuons(liveMuonsSet.begin(), liveMuonsSet.end());*/
103 
104  L1RpcTBMuonsVec outputMuons;
105  for (unsigned int iMu = 0; iMu < RPCConst::m_SEGMENTS_IN_SECTOR_CNT; iMu++) {
106  if (pacMuonsVec[iMu].isLive()) {
107  pacMuonsVec[iMu].setPhiAddr(iMu);
108  outputMuons.push_back(pacMuonsVec[iMu]);
109  }
110  }
111  sort(outputMuons.begin(), outputMuons.end(), RPCTBMuon::TMuonMore());
112 
113  //-------setting size to m_GBPHI_OUT_MUONS_CNT----------------
114  while (outputMuons.size() < RPCConst::m_GBPHI_OUT_MUONS_CNT)
115  outputMuons.push_back(RPCTBMuon());
116  while (outputMuons.size() > RPCConst::m_GBPHI_OUT_MUONS_CNT)
117  outputMuons.pop_back();
118 
119  return outputMuons;
120 }
121 
123 
125  //----- killing ghosts ---------------------------------------
126  for (unsigned int iMuVec = 0; iMuVec < gbPhiMuonsVec2.size() - 1; iMuVec++) {
127  for (unsigned int iMu = 0; iMu < gbPhiMuonsVec2[iMuVec].size(); iMu++) {
128  if (gbPhiMuonsVec2[iMuVec][iMu].getCode() == 0)
129  break; //because muons are sorted
130 
131  for (unsigned int iMuNext = 0; iMuNext < gbPhiMuonsVec2[iMuVec + 1].size(); iMuNext++) {
132  if (abs(gbPhiMuonsVec2[iMuVec][iMu].getPhiAddr() - gbPhiMuonsVec2[iMuVec + 1][iMuNext].getPhiAddr()) <= 1) {
133  //comparing with next:
134  if (gbPhiMuonsVec2[iMuVec][iMu].getCode() < gbPhiMuonsVec2[iMuVec + 1][iMuNext].getCode()) {
135  gbPhiMuonsVec2[iMuVec][iMu].kill();
136  } else {
137  gbPhiMuonsVec2[iMuVec + 1][iMuNext].kill();
138  }
139  }
140  }
141  }
142  }
143 
144  //---------sorting-----------------------------------------
145  /* multiset<RPCTBMuon, RPCTBMuon::TMuonMore> liveMuonsSet;
146  for(unsigned int iMuVec = 0; iMuVec < gbPhiMuonsVec2.size(); iMuVec++)
147  for(unsigned int iMu = 0; iMu < gbPhiMuonsVec2[iMuVec].size(); iMu++)
148  if(gbPhiMuonsVec2[iMuVec][iMu].isLive()) {
149  gbPhiMuonsVec2[iMuVec][iMu].setEtaAddr(iMuVec);
150  liveMuonsSet.insert(gbPhiMuonsVec2[iMuVec][iMu]);
151  }
152  L1RpcTBMuonsVec outputMuons(liveMuonsSet.begin(), liveMuonsSet.end()); */
153 
154  L1RpcTBMuonsVec outputMuons;
155  for (unsigned int iMuVec = 0; iMuVec < gbPhiMuonsVec2.size(); iMuVec++)
156  for (unsigned int iMu = 0; iMu < gbPhiMuonsVec2[iMuVec].size(); iMu++)
157  if (gbPhiMuonsVec2[iMuVec][iMu].isLive()) {
158  gbPhiMuonsVec2[iMuVec][iMu].setEtaAddr(iMuVec);
159  outputMuons.push_back(gbPhiMuonsVec2[iMuVec][iMu]);
160  }
161  sort(outputMuons.begin(), outputMuons.end(), RPCTBMuon::TMuonMore());
162 
163  //-------setting size to m_GBETA_OUT_MUONS_CNT----------------
164  while (outputMuons.size() < RPCConst::m_GBETA_OUT_MUONS_CNT)
165  outputMuons.push_back(RPCTBMuon());
166  while (outputMuons.size() > RPCConst::m_GBETA_OUT_MUONS_CNT)
167  outputMuons.pop_back();
168 
169  return outputMuons;
170 }
static const unsigned int m_GBETA_OUT_MUONS_CNT
m_Number of muon candidates return by Trigger Board&#39;s eta Ghost Buster
Definition: RPCConst.h:158
L1RpcTBMuonsVec gBEta(L1RpcTBMuonsVec2 &gbPhiMuonsVec2) const
static const unsigned int m_SEGMENTS_IN_SECTOR_CNT
m_Number of Logic Segments in one Logic Sector, defines also the number of Logic Cones for one Logic ...
Definition: RPCConst.h:154
static const unsigned int m_GBPHI_OUT_MUONS_CNT
m_Number of muon candidates return by Trigger Board&#39;s phi Ghost Buster
Definition: RPCConst.h:156
std::vector< RPCTBMuon > L1RpcTBMuonsVec
Definition: RPCTBMuon.h:218
std::vector< L1RpcTBMuonsVec > L1RpcTBMuonsVec2
Definition: RPCTBMuon.h:219
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
L1RpcTBMuonsVec run(L1RpcTBMuonsVec2 &pacMuonsVec2) const
L1RpcTBMuonsVec gBPhi(L1RpcTBMuonsVec &pacMuonsVec) const
Used in sorting.
Definition: RPCTBMuon.h:89