00001 #include <math.h>
00002 #include <vector>
00003 #include "AreaDetHist.h"
00004 #include "MsgLogger/MsgLogger.h"
00005
00006 namespace pypsalg {
00007
00008
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;
00018 std::cout << "histLength: " << _histLength << std::endl;
00019
00020
00021
00022
00023 const unsigned int *arrayShape = calib_data.shape();
00024 _segs = arrayShape[0];
00025 _rows = arrayShape[1];
00026 _cols = arrayShape[2];
00027 _numPixPerSeg = _rows*_cols;
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
00035 AreaDetHist::~AreaDetHist () {}
00036
00037
00038 ndarray<uint32_t, 4> AreaDetHist::get() {return _histogram;}
00039
00040
00041 void AreaDetHist::_fillHistogram(ndarray<double,3> calib_data) {
00042 double val;
00043
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 ) {
00050 _histogram[i][j][k][ binPos+1 ] += 1;
00051 } else if ( val > _valid_max ) {
00052 _histogram[i][j][k][ _histLength-1 ] += 1;
00053 } else {
00054 _histogram[i][j][k][ 0 ] += 1;
00055 }
00056
00057 }
00058 }
00059 }
00060 }
00061
00062
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
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
00081 void AreaDetHist::_insertHistElement(double x, int i, int j, int k) {
00082 int binPos = (int) floor( (x - _valid_min)/_bin_size );
00083 if ( x >= _valid_min && x <= _valid_max ) {
00084 _histogram[i][j][k][ binPos+1 ] += 1;
00085 } else if ( x > _valid_max ) {
00086 _histogram[i][j][k][ _histLength-1 ] += 1;
00087 } else {
00088 _histogram[i][j][k][ 0 ] += 1;
00089 }
00090 }
00091
00092
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
00102 int numNeighbors = 3;
00103 std::vector<double> neighbors(numNeighbors);
00104 for (unsigned int i = 0; i < _segs; i++) {
00105
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
00115 _insertHistElement(val, i, j, k);
00116 }
00117
00118
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
00127 _insertHistElement(val, i, j, k);
00128 }
00129
00130
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
00140 _insertHistElement(val, i, j, k);
00141 }
00142
00143
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
00152 _insertHistElement(val, i, j, k);
00153 }
00154 }
00155
00156
00157 numNeighbors = 5;
00158 neighbors.resize(numNeighbors);
00159 for (unsigned int i = 0; i < _segs; i++) {
00160
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
00172 _insertHistElement(val, i, j, t);
00173 }
00174 }
00175
00176
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
00188 _insertHistElement(val, i, j, t);
00189 }
00190 }
00191
00192
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
00204 _insertHistElement(val, i, t, k);
00205 }
00206 }
00207
00208
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
00220 _insertHistElement(val, i, t, k);
00221 }
00222 }
00223 }
00224
00225
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
00243 _insertHistElement(val, i, j, k);
00244 }
00245 }
00246 }
00247 }
00248 } else {
00249 _fillHistogram(calib_data);
00250 }
00251 }
00252
00253 }