CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
L1MuGMTMatcher.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuGMTMatcher
4 //
5 // Description: Matcher
6 //
7 //
8 // $Date: 2007/04/10 09:59:19 $
9 // $Revision: 1.4 $
10 //
11 // Author :
12 // N. Neumeister CERN EP
13 //
14 // Migrated to CMSSW:
15 // I. Mikulec
16 //
17 //--------------------------------------------------
18 
19 //-----------------------
20 // This Class's Header --
21 //-----------------------
22 
24 
25 //---------------
26 // C++ Headers --
27 //---------------
28 
29 #include <iostream>
30 #include <iomanip>
31 #include <cmath>
32 
33 #include <fstream>
34 #include <sstream>
35 
36 //-------------------------------
37 // Collaborating Class Headers --
38 //-------------------------------
39 
52 
54 
55 // --------------------------------
56 // class L1MuGMTMatcher
57 //---------------------------------
58 
59 //----------------
60 // Constructors --
61 //----------------
63  m_gmt(gmt), m_id(id), first(MaxMatch), second(MaxMatch),
64  matchQuality(MaxMatch,MaxMatch), pairMatrix(MaxMatch,MaxMatch) {
65 
66  first.reserve(MaxMatch);
67  second.reserve(MaxMatch);
68 
69 }
70 
71 //--------------
72 // Destructor --
73 //--------------
75 
76  reset();
77 
78 }
79 
80 //--------------
81 // Operations --
82 //--------------
83 
84 //
85 // run Muon Matcher
86 //
88 
89  load();
90  match();
91 
92 }
93 
94 //
95 // clear Matcher
96 //
98 
99  matchQuality.init(0);
100  pairMatrix.init(false);
101 
102  for ( unsigned i = 0; i < MaxMatch; i++ ) {
103  first[i] = 0;
104  second[i] = 0;
105  }
106 
107 }
108 
109 
110 //
111 // print matching results
112 //
114 
115  edm::LogVerbatim("GMT_Matcher_info");
116  if ( L1MuGMTConfig::Debug(4) ) {
117  edm::LogVerbatim("GMT_Matcher_info") << "MATCH Quality : ";
119  }
120 
121  edm::LogVerbatim("GMT_Matcher_info") << "PAIR Matrix : ";
122  pairMatrix.print();
123 
124  edm::LogVerbatim("GMT_Matcher_info");
125 
126 }
127 
128 
129 //
130 // load Matcher (get data from data buffer)
131 //
133 
134  // barrel matcher gets DTBX and barrel RPC muons
135  if ( m_id == 0 ) {
136  for ( unsigned idt = 0; idt < L1MuGMTConfig::MAXDTBX; idt++ ) {
137  first[idt] = m_gmt.Data()->DTBXMuon(idt);
138  }
139  for ( unsigned irpc = 0; irpc < L1MuGMTConfig::MAXRPCbarrel; irpc++ ) {
140  second[irpc] = m_gmt.Data()->RPCMuon(irpc);
141  }
142  }
143 
144  // endcap matcher gets CSC and endcap RPC muons
145  if ( m_id == 1 ) {
146  for ( unsigned icsc = 0; icsc < L1MuGMTConfig::MAXCSC; icsc++ ) {
147  first[icsc] = m_gmt.Data()->CSCMuon(icsc);
148  }
149  for ( unsigned irpc = 0; irpc < L1MuGMTConfig::MAXRPCendcap; irpc++ ) {
150  second[irpc] = m_gmt.Data()->RPCMuon(irpc+4);
151  }
152  }
153 
154  // matcher in DT/CSC cancel-out unit gets DTBX and CSC muons
155  if ( m_id == 2 ) {
156  for ( unsigned idt = 0; idt < L1MuGMTConfig::MAXDTBX; idt++ ) {
157  first[idt] = m_gmt.Data()->DTBXMuon(idt);
158  }
159  for ( unsigned icsc = 0; icsc < L1MuGMTConfig::MAXCSC; icsc++ ) {
160  second[icsc] = m_gmt.Data()->CSCMuon(icsc);
161  }
162  }
163 
164  // matcher in CSC/DT cancel-out unit gets CSC and DTBX muons
165  if ( m_id==3 ) {
166  for ( unsigned icsc = 0; icsc < L1MuGMTConfig::MAXCSC; icsc++ ) {
167  first[icsc] = m_gmt.Data()->CSCMuon(icsc);
168  }
169  for ( unsigned idt = 0; idt < L1MuGMTConfig::MAXDTBX; idt++ ) {
170  second[idt] = m_gmt.Data()->DTBXMuon(idt);
171  }
172  }
173 
174  // bRPC/CSC gets barrel RPC and CSC muons
175  if ( m_id == 4 ) {
176  for ( unsigned irpc = 0; irpc < L1MuGMTConfig::MAXRPCbarrel; irpc++ ) {
177  first[irpc] = m_gmt.Data()->RPCMuon(irpc);
178  }
179  for ( unsigned icsc = 0; icsc < L1MuGMTConfig::MAXCSC; icsc++ ) {
180  second[icsc] = m_gmt.Data()->CSCMuon(icsc);
181  }
182  }
183 
184  // bRPC/DT matcher gets forward RPC and DTBX muons
185  if ( m_id == 5 ) {
186  for ( unsigned irpc = 0; irpc < L1MuGMTConfig::MAXRPCendcap; irpc++ ) {
187  first[irpc] = m_gmt.Data()->RPCMuon(irpc+4);
188  }
189  for ( unsigned idt = 0; idt < L1MuGMTConfig::MAXDTBX; idt++ ) {
190  second[idt] = m_gmt.Data()->DTBXMuon(idt);
191  }
192  }
193 }
194 
195 
196 //
197 // match muons
198 //
200 
202  L1MuGMTMatrix<bool> disableMatrix(MaxMatch,MaxMatch);
203  maxMatrix.init(false);
204  disableMatrix.init(false);
205 
206  // loop over all combinations
207 
208  unsigned i,j;
209  for ( i = 0; i < MaxMatch; i++ )
210  for ( j = 0; j < MaxMatch; j++ )
211  matchQuality(i,j) = lookup_mq(i,j);
212 
213  // store in debug block
215 
216  // fill MAX matrix
217 
218  for ( i = 0; i < MaxMatch; i++ )
219  for ( j = 0; j < MaxMatch; j++ )
220  maxMatrix(i,j) = matchQuality.isMax(i,j) && (matchQuality(i,j) != 0);
221 
222  // fill disable matrix
223 
224  for ( i = 0; i < MaxMatch; i++ )
225  for ( j = 0; j < MaxMatch; j++ ) {
226 
227  for ( unsigned i1 = 0; i1 < MaxMatch; i1++ )
228  if ( i1 != i ) disableMatrix(i,j) = disableMatrix(i,j) || maxMatrix(i1,j);
229 
230  for ( unsigned j1 = 0; j1 < MaxMatch; j1++ )
231  if ( j1 != j ) disableMatrix(i,j) = disableMatrix(i,j) || maxMatrix(i,j1);
232  }
233 
234  // fill pair matrix
235 
236  for ( i = 0; i < MaxMatch; i++ ) {
237  for ( j = 0; j < MaxMatch; j++ ) {
238 
239  bool max = true;
240 
241  for ( unsigned i1 = 0; i1 < i; i1++ ) {
242  max = max && ((matchQuality(i,j) > matchQuality(i1,j)) ||
243  disableMatrix(i1,j));
244  }
245 
246  for ( unsigned i1 = i+1; i1 < MaxMatch; i1++ ) {
247  max = max && ((matchQuality(i,j) >= matchQuality(i1,j)) ||
248  disableMatrix(i1,j));
249  }
250 
251  for ( unsigned j1 = 0; j1 < j; j1++ ) {
252  max = max && ((matchQuality(i,j) > matchQuality(i,j1)) ||
253  disableMatrix(i,j1));
254  }
255 
256  for ( unsigned j1 = j+1; j1 < MaxMatch; j1++ ) {
257  max = max && ((matchQuality(i,j) >= matchQuality(i,j1)) ||
258  disableMatrix(i,j1));
259  }
260 
261  pairMatrix(i,j) = max && (matchQuality(i,j) != 0);
262 
263  }
264  }
265 
266  // store in debug block
268 }
269 
270 //
271 // compare eta and phi of two muons
272 //
274 
275  bool empty1 = ( first[i] != 0 ) ? first[i]->empty() : true;
276  bool empty2 = ( second[j] != 0 ) ? second[j]->empty() : true;
277  if ( empty1 || empty2) return 0;
278 
279  //
280  // (1) calculate delta-phi (integer version)
281  //
282  unsigned phi1 = first[i]->phi_packed();
283  unsigned phi2 = second[j]->phi_packed();
284 
285  int delta_phi = ( ( phi1 - phi2 + 3*72 ) % 144 ) - 72;
286 
287  if (delta_phi < -3 || delta_phi >3)
288  delta_phi = -4;
289 
290  L1MuSignedPacking<3> DPhiPacking;
291  unsigned delta_phi_packed = DPhiPacking.packedFromIdx (delta_phi);
292 
293  //
294  // (2) look-up delta-eta
295  //
296  unsigned eta1 = first[i]->eta_packed();
297  unsigned eta2 = second[j]->eta_packed();
298 
299  unsigned delta_eta_packed = 0;
300 
301  if (m_id == 0 || m_id == 1) { // main matching units
302  // first is dt/csc, second is rpc
303 
304  bool disable1 = L1MuGMTSortRankUnit::isDisabled(first[i]);
305  bool disable2 = L1MuGMTSortRankUnit::isDisabled(second[j]);;
306 
307  if (disable1 || disable2) return 0;
308 
310  delta_eta_packed = de_lut->SpecificLookup_delta_eta (m_id, eta1, eta2);
311  }
312  else { // overlap cancel-out matching units
313  // first is own chip, second is other chip
314  int idx1 = first[i]->type_idx();
315  int idx1_dcrr = (idx1==1)?2:(idx1==2)?1:idx1;
316 
317  int idx2 = second[j]->type_idx();
318  int idx2_dcrr = (idx2==1)?2:(idx2==2)?1:idx2;
319 
320  bool disable1 = L1MuGMTSortRankUnit::isDisabled(first[i]);
321 
323  bool disable2 = dishot_lut->SpecificLookup_disable_hot (idx2_dcrr,
324  second[j]->eta_packed(),
325  second[j]->phi_packed()) == 1;
326 
327  if (disable1 || disable2) return 0;
328 
329  // convert eta to 4-bit, first
331 
332 
333  unsigned eta1_4bit = econv_lut->SpecificLookup_eta_ovl (idx1_dcrr, eta1);
334  unsigned eta2_4bit = econv_lut->SpecificLookup_eta_ovl (idx2_dcrr, eta2);
335 
336  // look up delta eta
338  delta_eta_packed = cou_de_lut->SpecificLookup_delta_eta (m_id-2, eta1_4bit, eta2_4bit);
339  }
340 
341  //
342  // (3) look up match quality
343  //
345 
346  unsigned mq = mq_lut->SpecificLookup_mq(m_id, delta_eta_packed, delta_phi_packed);
347 
348  return mq;
349 }
350 
int i
Definition: DBlmapReader.cc:9
virtual unsigned packedFromIdx(int idx) const
get the packed notation of a value, check range
Definition: L1MuPacking.h:94
const L1MuGlobalMuonTrigger & m_gmt
void init(T v=0)
initialize matrix
bool isMax(int r, int c) const
is the element (r,c) the max. entry in its row and column?
virtual ~L1MuGMTMatcher()
destructor
static bool isDisabled(const L1MuRegionalCand *)
Diable bit.
unsigned SpecificLookup_eta_ovl(int idx, unsigned eta6) const
specific lookup function for eta_ovl
static L1MuGMTLFMatchQualLUT * getLFMatchQualLUT()
void run()
run Matcher
static L1MuGMTLFOvlEtaConvLUT * getLFOvlEtaConvLUT()
unsigned SpecificLookup_mq(int idx, unsigned delta_eta, unsigned delta_phi) const
specific lookup function for mq
void print()
print matching results
const L1MuRegionalCand * CSCMuon(int index) const
get CSC muon
Definition: L1MuGMTPSB.cc:252
std::vector< const L1MuRegionalCand * > second
U second(std::pair< T, U > const &p)
static L1MuGMTLFDeltaEtaLUT * getLFDeltaEtaLUT()
int lookup_mq(int i, int j)
static bool Debug()
const T & max(const T &a, const T &b)
void SetPairMatrix(int idx, L1MuGMTMatrix< bool > pm)
Set pair matrices.
unsigned SpecificLookup_delta_eta(int idx, unsigned eta_dtcsc, unsigned eta_rpc) const
specific lookup function for delta_eta
const L1MuGMTPSB * Data() const
return pointer to PSB
const L1MuRegionalCand * RPCMuon(int index) const
get RPC muon
Definition: L1MuGMTPSB.cc:232
int j
Definition: DBlmapReader.cc:9
int irpc
void print() const
print matrix
static const unsigned int MAXCSC
Definition: L1MuGMTConfig.h:91
static const unsigned int MAXDTBX
Definition: L1MuGMTConfig.h:91
static const unsigned int MAXRPCendcap
Definition: L1MuGMTConfig.h:90
static L1MuGMTLFDisableHotLUT * getLFDisableHotLUT()
std::vector< const L1MuRegionalCand * > first
void SetMQMatrix(int idx, L1MuGMTMatrix< int > mqm)
Set match quality matrices.
bool first
Definition: L1TdeRCT.cc:94
double delta_phi(double ph11, double phi2)
Definition: AnglesUtil.h:91
L1MuGMTMatrix< bool > pairMatrix
void reset()
clear Matcher
const L1MuRegionalCand * DTBXMuon(int index) const
get DTBX muon
Definition: L1MuGMTPSB.cc:242
static L1MuGMTLFCOUDeltaEtaLUT * getLFCOUDeltaEtaLUT()
static const unsigned int MaxMatch
L1MuGMTMatcher(const L1MuGlobalMuonTrigger &gmt, int id)
constructor
static const unsigned int MAXRPCbarrel
Definition: L1MuGMTConfig.h:90
L1MuGMTMatrix< int > matchQuality
L1MuGMTDebugBlock * DebugBlockForFill() const
for debug: return the debug block (in order to fill it)
unsigned SpecificLookup_disable_hot(int idx, unsigned eta, unsigned phi) const
specific lookup function for disable_hot
unsigned SpecificLookup_delta_eta(int idx, unsigned eta1, unsigned eta2) const
specific lookup function for delta_eta