pypsalg/pyext/AreaDetHist.cpp

Go to the documentation of this file.
00001 #include <math.h>
00002 #include <vector>
00003 #include "AreaDetHist.h"
00004 #include "MsgLogger/MsgLogger.h"
00005 
00006 namespace pypsalg {
00007 
00008 // Constructor
00009 AreaDetHist::AreaDetHist (ndarray<double,3> calib_data, int valid_min,
00010                           int valid_max, int bin_size, bool findIsolated, double minAduGap) :
00011   _valid_min(valid_min),_valid_max(valid_max),_bin_size(bin_size),_findIsolated(findIsolated),_minAduGap(minAduGap)
00012 {
00013   int originalLength = _valid_max-_valid_min+1;
00014   std::cout << _valid_max << "," << _valid_min << "," << _bin_size << "," << originalLength << std::endl;
00015   assert(originalLength % _bin_size == 0);
00016   
00017   _histLength = originalLength/_bin_size + 2; // extra two pixels for underflow/overflow
00018   std::cout << "histLength: " << _histLength << std::endl;
00019   // Important note: cspad and cspad2x2 have different ordering of segs,rows,cols.
00020   // cspad shape: (segs,rows,cols)
00021   // cspad2x2 shape: (rows,cols,segs)
00022   // But dethist.py converts the cspad2x2's shape into (segs,rows,cols)
00023   const unsigned int *arrayShape = calib_data.shape();  
00024   _segs = arrayShape[0]; 
00025   _rows = arrayShape[1];
00026   _cols = arrayShape[2];
00027   _numPixPerSeg = _rows*_cols; // TODO: unused
00028   _histogram = make_ndarray<uint32_t>(_segs,_rows,_cols,_histLength);
00029   for (ndarray<uint32_t,4>::iterator p = _histogram.begin(); p != _histogram.end(); p++) {
00030     *p = 0;
00031   }
00032 }
00033 
00034 // Destructor
00035 AreaDetHist::~AreaDetHist () {}
00036 
00037 // Returns histogram
00038 ndarray<uint32_t, 4> AreaDetHist::get() {return _histogram;}
00039 
00040 // Fills histogram in a standard way using under/overflow stored at the first/last elements.
00041 void AreaDetHist::_fillHistogram(ndarray<double,3> calib_data) {
00042   double val;
00043   // fill histogram
00044   for (unsigned int i = 0; i < _segs; i++) {
00045   for (unsigned int j = 0; j < _rows; j++) {
00046   for (unsigned int k = 0; k < _cols; k++) {
00047     val = calib_data[i][j][k];
00048     int binPos = (int) floor( (val - _valid_min)/_bin_size );   
00049     if ( val >= _valid_min && val <= _valid_max ) { // in range
00050       _histogram[i][j][k][ binPos+1 ] += 1;
00051     } else if ( val > _valid_max ) { // too large
00052       _histogram[i][j][k][ _histLength-1 ] += 1;
00053     } else { // too small
00054       _histogram[i][j][k][ 0 ] += 1;
00055     }
00056     //pixelInd++;
00057   }
00058   }
00059   }
00060 }
00061 
00062 // Calculates whether val is greater than its neighbors by at least minAduGap
00063 int isIsolated(double val, double minAduGap, std::vector<double> *neighbors) {
00064         int result = 1;
00065         std::vector<double>::iterator p;
00066         for (p = neighbors->begin(); p != neighbors->end(); p++) {
00067                 if (val-minAduGap < *p) {
00068                         result = 0;
00069                         return result;
00070                 }
00071         }
00072         return result;
00073 }
00074 
00075 // Get pixel index given pixel position (seg,row,col)
00076 unsigned int getPixelIndex(const unsigned int numPixPerSeg, const unsigned int Cols, unsigned int seg, unsigned int row, unsigned int col) {
00077     return seg*numPixPerSeg + row*Cols + col;
00078 }
00079 
00080 // Increment counter on histogram
00081 void AreaDetHist::_insertHistElement(double x, int i, int j, int k) {
00082         int binPos = (int) floor( (x - _valid_min)/_bin_size ); // histogram bin position  
00083         if ( x >= _valid_min && x <= _valid_max ) { // in range
00084                 _histogram[i][j][k][ binPos+1 ] += 1;
00085         } else if ( x > _valid_max ) { // too large
00086                 _histogram[i][j][k][ _histLength-1 ] += 1;
00087         } else { // too small
00088                 _histogram[i][j][k][ 0 ] += 1;
00089         }
00090 }
00091 
00092 // Update the histograms given calib_data
00093 void AreaDetHist::update(ndarray<double,3> calib_data)
00094 {
00095   if (_findIsolated) {
00096         double val = 0;
00097     int result = 0;
00098         unsigned int j = 0;
00099         unsigned int k = 0;
00100 
00101         // corner of detector (3 pixel neighborhood)
00102         int numNeighbors = 3;
00103     std::vector<double> neighbors(numNeighbors);
00104         for (unsigned int i = 0; i < _segs; i++) {
00105                 // Upper left corner
00106                 j = 0;
00107                 k = 0;
00108                 val = calib_data[i][j][k];
00109                 neighbors[0] =  calib_data[i][j+1][k];
00110                 neighbors[1] =  calib_data[i][j][k+1];
00111                 neighbors[2] =  calib_data[i][j+1][k+1];
00112                 result = isIsolated(val, _minAduGap, &neighbors);
00113                 if (result) {
00114                         // no need to get pixel index
00115                         _insertHistElement(val, i, j, k);
00116                 }
00117 
00118                 // Upper right corner
00119                 k = _cols-1;
00120                 val = calib_data[i][j][k];
00121                 neighbors[0] = calib_data[i][j+1][k];
00122                 neighbors[1] = calib_data[i][j][k-1];
00123                 neighbors[2] = calib_data[i][j+1][k-1];
00124                 result = isIsolated(val, _minAduGap, &neighbors);
00125                 if (result) {
00126                         // no need to get pixel index
00127                         _insertHistElement(val, i, j, k);
00128                 }
00129 
00130                 // Lower left corner
00131                 j = _rows-1;
00132                 k = 0;
00133                 val = calib_data[i][j][k];
00134                 neighbors[0] = calib_data[i][j][k+1];
00135                 neighbors[1] = calib_data[i][j-1][k];
00136                 neighbors[2] = calib_data[i][j-1][k+1];
00137                 result = isIsolated(val, _minAduGap, &neighbors);
00138                 if (result) {
00139                         // no need to get pixel index
00140                         _insertHistElement(val, i, j, k);
00141                 }
00142 
00143                 // Lower right corner
00144                 k = _cols-1;
00145                 val = calib_data[i][j][k];
00146                 neighbors[0] = calib_data[i][j][k-1];
00147                 neighbors[1] = calib_data[i][j-1][k];
00148                 neighbors[2] = calib_data[i][j-1][k-1];
00149                 result = isIsolated(val, _minAduGap, &neighbors);
00150                 if (result) {
00151                         // no need to get pixel index
00152                         _insertHistElement(val, i, j, k);
00153                 }
00154         }
00155 
00156         // side of detector (5 pixel neighborhood)
00157         numNeighbors = 5;
00158     neighbors.resize(numNeighbors);
00159         for (unsigned int i = 0; i < _segs; i++) {
00160                 // Upper edge
00161                 j = 0;
00162                 for (unsigned int t = 1; t < _cols-1; t++) {
00163                         val = calib_data[i][j][t];
00164                         neighbors[0] = calib_data[i][j][t-1];
00165                         neighbors[1] = calib_data[i][j][t+1];
00166                         neighbors[2] = calib_data[i][j+1][t-1];
00167                         neighbors[3] = calib_data[i][j+1][t];
00168                         neighbors[4] = calib_data[i][j+1][t+1];
00169                         result = isIsolated(val, _minAduGap, &neighbors);
00170                         if (result) {
00171                                 // no need to get pixel index
00172                                 _insertHistElement(val, i, j, t);
00173                         }
00174                 }
00175 
00176                 // Lower edge
00177                 j = _rows-1;
00178                 for (unsigned int t = 1; t < _cols-1; t++) {
00179                         val = calib_data[i][j][t];
00180                         neighbors[0] = calib_data[i][j][t-1];
00181                         neighbors[1] = calib_data[i][j][t+1];
00182                         neighbors[2] = calib_data[i][j-1][t-1];
00183                         neighbors[3] = calib_data[i][j-1][t];
00184                         neighbors[4] = calib_data[i][j-1][t+1];
00185                         result = isIsolated(val, _minAduGap, &neighbors);
00186                         if (result) {
00187                                 // no need to get pixel index
00188                                 _insertHistElement(val, i, j, t);
00189                         }
00190                 }
00191 
00192                 // Left edge
00193                 k = 0;
00194                 for (unsigned int t = 1; t < _rows-1; t++) {
00195                         val = calib_data[i][t][k];
00196                         neighbors[0] = calib_data[i][t+1][k];
00197                         neighbors[1] = calib_data[i][t-1][k];
00198                         neighbors[2] = calib_data[i][t+1][k+1];
00199                         neighbors[3] = calib_data[i][t][k+1];
00200                         neighbors[4] = calib_data[i][t+1][k+1];
00201                         result = isIsolated(val, _minAduGap, &neighbors);
00202                         if (result) {
00203                                 // no need to get pixel index
00204                                 _insertHistElement(val, i, t, k);
00205                         }
00206                 }
00207 
00208                 // Right edge
00209                 k = _cols-1;
00210                 for (unsigned int t = 1; t < _rows-1; t++) {
00211                         val = calib_data[i][t][k];
00212                         neighbors[0] = calib_data[i][t+1][k];
00213                         neighbors[1] = calib_data[i][t-1][k];
00214                         neighbors[2] = calib_data[i][t+1][k-1];
00215                         neighbors[3] = calib_data[i][t][k-1];
00216                         neighbors[4] = calib_data[i][t+1][k-1];
00217                         result = isIsolated(val, _minAduGap, &neighbors);
00218                         if (result) {
00219                                 // no need to get pixel index
00220                                 _insertHistElement(val, i, t, k);
00221                         }
00222                 }
00223         }
00224 
00225         // non-edge of detector (8 pixel neighborhood)
00226         numNeighbors = 8;
00227     neighbors.resize(numNeighbors);
00228         for (unsigned int i = 0; i < _segs; i++) {
00229         for (unsigned int j = 1; j < _rows-1; j++) {
00230         for (unsigned int k = 1; k < _cols-1; k++) {
00231                 val = calib_data[i][j][k];
00232                 neighbors[0] = calib_data[i][j-1][k-1];
00233                 neighbors[1] = calib_data[i][j-1][k];
00234                 neighbors[2] = calib_data[i][j-1][k+1];
00235                 neighbors[3] = calib_data[i][j][k-1];
00236                 neighbors[4] = calib_data[i][j][k+1];
00237                 neighbors[5] = calib_data[i][j+1][k-1];
00238                 neighbors[6] = calib_data[i][j+1][k];
00239                 neighbors[7] = calib_data[i][j+1][k+1];
00240                 result = isIsolated(val, _minAduGap, &neighbors);
00241                 if (result) {
00242                         // no need to get pixel index
00243                         _insertHistElement(val, i, j, k);
00244                 }
00245         }
00246         }
00247         }
00248   } else {
00249         _fillHistogram(calib_data);
00250   }
00251 }
00252 
00253 } // namespace pypsalg

Generated on 19 Dec 2016 for PSDMSoftware by  doxygen 1.4.7