CMS 3D CMS Logo

L1MuGMTMatrix.h
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
8 //
9 //
10 // Author :
11 // N. Neumeister CERN EP
12 //
13 // Migrated to CMSSW:
14 // I. Mikulec
15 //
16 //--------------------------------------------------
17 #ifndef L1TriggerGlobalMuonTrigger_L1MuGMTMatrix_h
18 #define L1TriggerGlobalMuonTrigger_L1MuGMTMatrix_h
19 
20 //---------------
21 // C++ Headers --
22 //---------------
23 
24 #include <iostream>
25 #include <cassert>
26 #include <string>
27 #include <sstream>
28 
29 
30 //----------------------
31 // Base Class Headers --
32 //----------------------
33 
34 //------------------------------------
35 // Collaborating Class Declarations --
36 //------------------------------------
37 
38 
40 
41 
42 // ---------------------
43 // -- Class Interface --
44 // ---------------------
45 
46 template<class T>
48 
49  public:
50 
52  L1MuGMTMatrix(int r, int c);
53 
56 
58  virtual ~L1MuGMTMatrix();
59 
61  T& operator()(int r, int c);
62 
64  const T& operator()(int r, int c) const;
65 
67  void init(T v=0);
68 
70  void set(int r, int c, T v);
71 
74 
77 
79  L1MuGMTMatrix& operator+=(const T& s);
80 
82  L1MuGMTMatrix& operator*=(const T& s);
83 
85  bool isMax(int r, int c) const;
86 
88  bool isMin(int r, int c) const;
89 
91  int colAny(int c) const;
92 
94  int rowAny(int r) const;
95 
97  void print() const;
98 
99  private:
100 
102 
103  T **p;
104 
105 };
106 
107 
108 template<class T>
110 
111  p = new T*[r];
112 
113  assert(p != nullptr);
114 
115  for (int i = 0; i < r; i++) {
116  p[i] = new T[c];
117  assert(p[i] != nullptr);
118  }
119 
120 }
121 
122 // copy constructor
123 
124 
125 template<class T>
127 
128  p = new T*[r_size];
129 
130  assert(p != nullptr);
131 
132  for (int i = 0; i < r_size; i++) {
133  p[i] = new T[c_size];
134  assert(p[i] != nullptr);
135  for (int j = 0; j < c_size; j++) p[i][j] = mat.p[i][j];
136  }
137 
138 }
139 
140 
141 //--------------
142 // Destructor --
143 //--------------
144 template<class T>
146 
147  for (int i = 0; i < r_size; i++) {
148  delete [] p[i];
149  }
150 
151  delete [] p;
152 
153 }
154 
155 
156 //
157 //
158 //
159 template<class T>
161 
162  assert( r >= 0 && r < r_size && c >= 0 && c < c_size );
163 
164  return p[r][c];
165 
166 }
167 
168 
169 //
170 //
171 //
172 template<class T>
173 const T& L1MuGMTMatrix<T>::operator()(int r, int c) const {
174 
175  assert( r >= 0 && r < r_size && c >= 0 && c < c_size );
176 
177  return p[r][c];
178 
179 }
180 
181 
182 //
183 // initialize matrix
184 //
185 template<class T>
187 
188  for (int r = 0; r < r_size; r++) {
189  for (int c = 0; c < c_size; c++) p[r][c] = v;
190  }
191 
192 }
193 
194 
195 //
196 // set matrix element
197 //
198 template<class T>
199 void L1MuGMTMatrix<T>::set(int r, int c, T v) {
200 
201  assert( r >= 0 && r < r_size && c >= 0 && c < c_size );
202 
203  p[r][c] = v;
204 
205 }
206 
207 
208 //
209 // assignment operator
210 //
211 template<class T>
213 
214  if ( this != &m ) {
215  assert(m.c_size == c_size && m.r_size == r_size);
216 
217  for (int r = 0; r < r_size; r++) {
218  for (int c = 0; c < c_size; c++) p[r][c] = m.p[r][c];
219  }
220  }
221 
222  return (*this);
223 
224 }
225 
226 
227 //
228 // matrix addition
229 //
230 template<class T>
232 
233  assert(m.c_size == c_size && m.r_size == r_size);
234 
235  for (int r = 0; r < r_size; r++) {
236  for (int c = 0; c < c_size; c++) {
237  p[r][c] += m.p[r][c];
238  }
239  }
240 
241  return *this;
242 
243 }
244 
245 
246 //
247 // scalar addition
248 //
249 template<class T>
251 
252  for (int r = 0; r < r_size; r++) {
253  for (int c = 0; c < c_size; c++) p[r][c] += s;
254  }
255 
256  return *this;
257 
258 }
259 
260 
261 //
262 // scalar multiplication
263 //
264 template<class T>
266 
267  for (int r = 0; r < r_size; r++) {
268  for (int c = 0; c < c_size; c++) p[r][c] *= s;
269  }
270 
271  return *this;
272 
273 }
274 
275 
276 //
277 // is the element (r,c) the max. entry in its row and column?
278 //
279 template<class T>
280 bool L1MuGMTMatrix<T>::isMax(int r, int c) const {
281 
282  bool max = true;
283 
284  for (int i = 0; i < c; i++) {
285  max = max && ( this->p[r][c] > this->p[r][i]);
286  }
287  for (int i = c+1; i < c_size; i++) {
288  max = max && ( this->p[r][c] >= this->p[r][i]);
289  }
290 
291  for (int j = 0; j < r; j++) {
292  max = max && ( this->p[r][c] > this->p[j][c]);
293  }
294  for (int j = r+1; j < r_size; j++) {
295  max = max && ( this->p[r][c] >= this->p[j][c]);
296  }
297 
298  return max;
299 
300 }
301 
302 
303 //
304 // is the element (r,c) the min. entry in its row and column?
305 //
306 template<class T>
307 bool L1MuGMTMatrix<T>::isMin(int r, int c) const {
308 
309  bool min = true;
310  for (int i = 0; i < c_size; i++) {
311  min = min && ( this->p[r][c] <= this->p[r][i]);
312  }
313  for (int j = 0; j < r_size; j++) {
314  min = min && ( this->p[r][c] <= this->p[j][c]);
315  }
316 
317  return min;
318 
319 }
320 
321 
322 //
323 // is any element in column c > 0 ? return index or -1
324 //
325 template<class T>
326 int L1MuGMTMatrix<T>::colAny(int c) const {
327 
328  int stat = -1;
329  for (int i = 0; i < r_size; i++) {
330  if ( this->p[i][c] > 0 ) stat = i;
331  }
332 
333  return stat;
334 
335 }
336 
337 
338 //
339 // is any element in row r > 0 ? return index or -1
340 //
341 template<class T>
342 int L1MuGMTMatrix<T>::rowAny(int r) const {
343 
344  int stat = -1;
345  for (int i = 0; i < c_size; i++) {
346  if ( this->p[r][i] > 0 ) stat = i;
347  }
348 
349  return stat;
350 
351 }
352 
353 
354 //
355 // print matrix
356 //
357 template<class T>
359 
360  for (int r = 0; r < r_size; r++) {
361  std::stringstream output;
362  for (int c = 0; c < c_size; c++) output << p[r][c] << "\t";
363  edm::LogVerbatim("GMTMatrix_print") << output.str();
364  }
365  edm::LogVerbatim("GMTMatrix_print");
366 
367 }
368 
369 #endif
L1MuGMTMatrix & operator=(const L1MuGMTMatrix &m)
assignment operator
virtual ~L1MuGMTMatrix()
destructor
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?
L1MuGMTMatrix & operator*=(const T &s)
scalar multiplication
void set(int r, int c, T v)
set matrix element
bool isMin(int r, int c) const
is the element (r,c) the min. entry in its row and column?
int rowAny(int r) const
is any element in row r > 0 ? return index or -1
T & operator()(int r, int c)
L1MuGMTMatrix(int r, int c)
constructor
void print() const
print matrix
T min(T a, T b)
Definition: MathUtil.h:58
L1MuGMTMatrix & operator+=(const L1MuGMTMatrix &m)
matrix addition
long double T
int colAny(int c) const
is any element in column c > 0 ? return index or -1