Go to the documentation of this file.00001
00002
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef L1TriggerGlobalMuonTrigger_L1MuGMTMatrix_h
00020 #define L1TriggerGlobalMuonTrigger_L1MuGMTMatrix_h
00021
00022
00023
00024
00025
00026 #include <iostream>
00027 #include <cassert>
00028 #include <string>
00029 #include <sstream>
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00042
00043
00044
00045
00046
00047
00048 template<class T>
00049 class L1MuGMTMatrix {
00050
00051 public:
00052
00054 L1MuGMTMatrix(int r, int c);
00055
00057 L1MuGMTMatrix(const L1MuGMTMatrix<T>&);
00058
00060 virtual ~L1MuGMTMatrix();
00061
00063 T& operator()(int r, int c);
00064
00066 const T& operator()(int r, int c) const;
00067
00069 void init(T v=0);
00070
00072 void set(int r, int c, T v);
00073
00075 L1MuGMTMatrix& operator=(const L1MuGMTMatrix& m);
00076
00078 L1MuGMTMatrix& operator+=(const L1MuGMTMatrix& m);
00079
00081 L1MuGMTMatrix& operator+=(const T& s);
00082
00084 L1MuGMTMatrix& operator*=(const T& s);
00085
00087 bool isMax(int r, int c) const;
00088
00090 bool isMin(int r, int c) const;
00091
00093 int colAny(int c) const;
00094
00096 int rowAny(int r) const;
00097
00099 void print() const;
00100
00101 private:
00102
00103 int r_size, c_size;
00104
00105 T **p;
00106
00107 };
00108
00109
00110 template<class T>
00111 L1MuGMTMatrix<T>::L1MuGMTMatrix(int r, int c) : r_size(r), c_size(c) {
00112
00113 p = new T*[r];
00114
00115 assert(p != 0);
00116
00117 for (int i = 0; i < r; i++) {
00118 p[i] = new T[c];
00119 assert(p[i] != 0);
00120 }
00121
00122 }
00123
00124
00125
00126
00127 template<class T>
00128 L1MuGMTMatrix<T>::L1MuGMTMatrix(const L1MuGMTMatrix<T>& mat) : r_size(mat.r_size), c_size(mat.c_size) {
00129
00130 p = new T*[r_size];
00131
00132 assert(p != 0);
00133
00134 for (int i = 0; i < r_size; i++) {
00135 p[i] = new T[c_size];
00136 assert(p[i] != 0);
00137 for (int j = 0; j < c_size; j++) p[i][j] = mat.p[i][j];
00138 }
00139
00140 }
00141
00142
00143
00144
00145
00146 template<class T>
00147 L1MuGMTMatrix<T>::~L1MuGMTMatrix() {
00148
00149 for (int i = 0; i < r_size; i++) {
00150 delete [] p[i];
00151 }
00152
00153 delete [] p;
00154
00155 }
00156
00157
00158
00159
00160
00161 template<class T>
00162 T& L1MuGMTMatrix<T>::operator()(int r, int c) {
00163
00164 assert( r >= 0 && r < r_size && c >= 0 && c < c_size );
00165
00166 return p[r][c];
00167
00168 }
00169
00170
00171
00172
00173
00174 template<class T>
00175 const T& L1MuGMTMatrix<T>::operator()(int r, int c) const {
00176
00177 assert( r >= 0 && r < r_size && c >= 0 && c < c_size );
00178
00179 return p[r][c];
00180
00181 }
00182
00183
00184
00185
00186
00187 template<class T>
00188 void L1MuGMTMatrix<T>::init(T v) {
00189
00190 for (int r = 0; r < r_size; r++) {
00191 for (int c = 0; c < c_size; c++) p[r][c] = v;
00192 }
00193
00194 }
00195
00196
00197
00198
00199
00200 template<class T>
00201 void L1MuGMTMatrix<T>::set(int r, int c, T v) {
00202
00203 assert( r >= 0 && r < r_size && c >= 0 && c < c_size );
00204
00205 p[r][c] = v;
00206
00207 }
00208
00209
00210
00211
00212
00213 template<class T>
00214 L1MuGMTMatrix<T>& L1MuGMTMatrix<T>::operator=(const L1MuGMTMatrix& m) {
00215
00216 if ( this != &m ) {
00217 assert(m.c_size == c_size && m.r_size == r_size);
00218
00219 for (int r = 0; r < r_size; r++) {
00220 for (int c = 0; c < c_size; c++) p[r][c] = m.p[r][c];
00221 }
00222 }
00223
00224 return (*this);
00225
00226 }
00227
00228
00229
00230
00231
00232 template<class T>
00233 L1MuGMTMatrix<T>& L1MuGMTMatrix<T>::operator+=(const L1MuGMTMatrix& m) {
00234
00235 assert(m.c_size == c_size && m.r_size == r_size);
00236
00237 for (int r = 0; r < r_size; r++) {
00238 for (int c = 0; c < c_size; c++) {
00239 p[r][c] += m.p[r][c];
00240 }
00241 }
00242
00243 return *this;
00244
00245 }
00246
00247
00248
00249
00250
00251 template<class T>
00252 L1MuGMTMatrix<T>& L1MuGMTMatrix<T>::operator+=(const T& s) {
00253
00254 for (int r = 0; r < r_size; r++) {
00255 for (int c = 0; c < c_size; c++) p[r][c] += s;
00256 }
00257
00258 return *this;
00259
00260 }
00261
00262
00263
00264
00265
00266 template<class T>
00267 L1MuGMTMatrix<T>& L1MuGMTMatrix<T>::operator*=(const T& s) {
00268
00269 for (int r = 0; r < r_size; r++) {
00270 for (int c = 0; c < c_size; c++) p[r][c] *= s;
00271 }
00272
00273 return *this;
00274
00275 }
00276
00277
00278
00279
00280
00281 template<class T>
00282 bool L1MuGMTMatrix<T>::isMax(int r, int c) const {
00283
00284 bool max = true;
00285
00286 for (int i = 0; i < c; i++) {
00287 max = max && ( this->p[r][c] > this->p[r][i]);
00288 }
00289 for (int i = c+1; i < c_size; i++) {
00290 max = max && ( this->p[r][c] >= this->p[r][i]);
00291 }
00292
00293 for (int j = 0; j < r; j++) {
00294 max = max && ( this->p[r][c] > this->p[j][c]);
00295 }
00296 for (int j = r+1; j < r_size; j++) {
00297 max = max && ( this->p[r][c] >= this->p[j][c]);
00298 }
00299
00300 return max;
00301
00302 }
00303
00304
00305
00306
00307
00308 template<class T>
00309 bool L1MuGMTMatrix<T>::isMin(int r, int c) const {
00310
00311 bool min = true;
00312 for (int i = 0; i < c_size; i++) {
00313 min = min && ( this->p[r][c] <= this->p[r][i]);
00314 }
00315 for (int j = 0; j < r_size; j++) {
00316 min = min && ( this->p[r][c] <= this->p[j][c]);
00317 }
00318
00319 return min;
00320
00321 }
00322
00323
00324
00325
00326
00327 template<class T>
00328 int L1MuGMTMatrix<T>::colAny(int c) const {
00329
00330 int stat = -1;
00331 for (int i = 0; i < r_size; i++) {
00332 if ( this->p[i][c] > 0 ) stat = i;
00333 }
00334
00335 return stat;
00336
00337 }
00338
00339
00340
00341
00342
00343 template<class T>
00344 int L1MuGMTMatrix<T>::rowAny(int r) const {
00345
00346 int stat = -1;
00347 for (int i = 0; i < c_size; i++) {
00348 if ( this->p[r][i] > 0 ) stat = i;
00349 }
00350
00351 return stat;
00352
00353 }
00354
00355
00356
00357
00358
00359 template<class T>
00360 void L1MuGMTMatrix<T>::print() const {
00361
00362 for (int r = 0; r < r_size; r++) {
00363 std::stringstream output;
00364 for (int c = 0; c < c_size; c++) output << p[r][c] << "\t";
00365 edm::LogVerbatim("GMTMatrix_print") << output.str();
00366 }
00367 edm::LogVerbatim("GMTMatrix_print");
00368
00369 }
00370
00371 #endif