CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/L1Trigger/GlobalMuonTrigger/src/L1MuGMTMatrix.h

Go to the documentation of this file.
00001 //-------------------------------------------------
00002 //
00008 //
00009 //   $Date: 2007/03/23 18:51:35 $
00010 //   $Revision: 1.4 $
00011 //
00012 //   Author :
00013 //   N. Neumeister            CERN EP 
00014 //
00015 //   Migrated to CMSSW:
00016 //   I. Mikulec
00017 //
00018 //--------------------------------------------------
00019 #ifndef L1TriggerGlobalMuonTrigger_L1MuGMTMatrix_h
00020 #define L1TriggerGlobalMuonTrigger_L1MuGMTMatrix_h
00021 
00022 //---------------
00023 // C++ Headers --
00024 //---------------
00025 
00026 #include <iostream>
00027 #include <cassert>
00028 #include <string>
00029 #include <sstream>
00030 
00031 
00032 //----------------------
00033 // Base Class Headers --
00034 //----------------------
00035 
00036 //------------------------------------
00037 // Collaborating Class Declarations --
00038 //------------------------------------
00039 
00040 
00041 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00042 
00043 
00044 //              ---------------------
00045 //              -- Class Interface --
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 // copy constructor
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 // Destructor --
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 // initialize matrix
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 // set matrix element
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 // assignment operator
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 // matrix addition
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 // scalar addition
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 // scalar multiplication
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 // is the element (r,c) the max. entry in its row and column?
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 // is the element (r,c) the min. entry in its row and column?
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 // is any element in column c > 0 ? return index or -1 
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 // is any element in row r > 0 ? return index or -1  
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 // print matrix
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