CMS 3D CMS Logo

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