source: tags/release-1.0.6/src/Utils/getStats.cc @ 1391

Last change on this file since 1391 was 192, checked in by Matthew Whiting, 18 years ago

A large commit based around a few changes:

  • Implemented the new SNRpeak column, defining it in columns.cc and printing it out in outputDetection.cc.
  • Corrected a bug in the subsection parsing that miscalculated the pixel offset when "*" was given as an axis range.
  • setupFDR now calculates the flux threshold so this can be reported.
  • The object flags now distinguish between spatial edge and spectral edge locations.
  • Other minor changes for clarity's sake.
File size: 10.6 KB
Line 
1#include <cpgplot.h>
2#include <iostream>
3#include <math.h>
4#include <Utils/utils.hh>
5
6template <class T> T absval(T value)
7{
8  if( value > 0) return value;
9  else return 0-value;
10}
11//--------------------------------------------------------------------
12
13template <class T> void findMinMax(const T *array, const int size,
14                                   T &min, T &max)
15{
16  min = max = array[0];
17  for(int i=1;i<size;i++) {
18    if(array[i]<min) min=array[i];
19    if(array[i]>max) max=array[i];
20  }
21}
22template void findMinMax<int>(const int *array, const int size,
23                              int &min, int &max);
24template void findMinMax<float>(const float *array, const int size,
25                                float &min, float &max);
26//--------------------------------------------------------------------
27
28template <class T> float findMean(T *array, int size)
29{
30  float mean = array[0];
31  for(int i=1;i<size;i++) mean += array[i];
32  mean /= float(size);
33  return mean;
34}
35template float findMean<int>(int *array, int size);
36template float findMean<float>(float *array, int size);
37//--------------------------------------------------------------------
38
39template <class T> float findStddev(T *array, int size)
40{
41  float mean = findMean(array,size);
42  float stddev = (array[0]-mean) * (array[0]-mean);
43  for(int i=1;i<size;i++) stddev += (array[i]-mean)*(array[i]-mean);
44  stddev = sqrt(stddev/float(size-1));
45  return stddev;
46}
47template float findStddev<int>(int *array, int size);
48template float findStddev<float>(float *array, int size);
49//--------------------------------------------------------------------
50
51template <class T> T findMedian(T *array, int size)
52{
53  // NOTE: madfm = median absolute deviation from median
54  T *newarray = new T[size];
55  T median;
56  for(int i=0;i<size;i++) newarray[i] = array[i];
57  sort(newarray,0,size);
58  if((size%2)==0) median = (newarray[size/2-1]+newarray[size/2])/2;
59  else median = newarray[size/2];
60  delete [] newarray;
61  return median;
62}
63template int findMedian<int>(int *array, int size);
64template float findMedian<float>(float *array, int size);
65//--------------------------------------------------------------------
66
67template <class T> T findMADFM(T *array, int size)
68{
69  // NOTE: madfm = median absolute deviation from median
70  T *newarray = new T[size];
71  T median = findMedian<T>(array,size);
72  T madfm;
73  for(int i=0;i<size;i++) newarray[i] = absval(array[i]-median);
74  sort(newarray,0,size);
75  if((size%2)==0) madfm = (newarray[size/2-1]+newarray[size/2])/2;
76  else madfm = newarray[size/2];
77  delete [] newarray;
78  return madfm;
79}
80template int findMADFM<int>(int *array, int size);
81template float findMADFM<float>(float *array, int size);
82//--------------------------------------------------------------------
83
84template <class T> void findMedianStats(T *array, int size,
85                                        T &median, T &madfm)
86{
87  // NOTE: madfm = median absolute deviation from median
88  if(size==0){
89    std::cerr << "Error in findMedianStats: zero sized array!\n";
90    return;
91  }
92  T *newarray = new T[size];
93
94  for(int i=0;i<size;i++) newarray[i] = array[i];
95  sort(newarray,0,size);
96  if((size%2)==0) median = (newarray[size/2-1]+newarray[size/2])/2;
97  else median = newarray[size/2];
98
99  for(int i=0;i<size;i++) newarray[i] = absval(array[i]-median);
100  sort(newarray,0,size);
101  if((size%2)==0) madfm = (newarray[size/2-1]+newarray[size/2])/2;
102  else madfm = newarray[size/2];
103
104  delete [] newarray;
105}
106template void findMedianStats<int>(int *array, int size,
107                                   int &median, int &madfm);
108template void findMedianStats<long>(long *array, int size,
109                                    long &median, long &madfm);
110template void findMedianStats<float>(float *array, int size,
111                                     float &median, float &madfm);
112template void findMedianStats<double>(double *array, int size,
113                                      double &median, double &madfm);
114//--------------------------------------------------------------------
115
116template <class T> void findMedianStats(T *array, int size, bool *isGood,
117                                        T &median, T &madfm)
118{
119  // NOTE: madfm = median absolute deviation from median
120  int goodSize=0;
121  for(int i=0;i<size;i++) if(isGood[i]) goodSize++;
122  if(goodSize==0){
123    std::cerr << "Error in findMedianStats: no good values!\n";
124    return;
125  }
126  T *newarray = new T[goodSize];
127  for(int i=0;i<size;i++) if(isGood[i]) newarray[goodSize++] = array[i];
128  sort(newarray,0,goodSize);
129  if((goodSize%2)==0)
130    median = (newarray[goodSize/2-1]+newarray[goodSize/2])/2;
131  else
132    median = newarray[goodSize/2];
133
134  for(int i=0;i<goodSize;i++) newarray[i] = absval(newarray[i]-median);
135  sort(newarray,0,goodSize);
136  if((goodSize%2)==0)
137    madfm = (newarray[goodSize/2-1]+newarray[goodSize/2])/2;
138  else
139    madfm = newarray[goodSize/2];
140
141  delete [] newarray;
142}
143template void findMedianStats<int>(int *array, int size, bool *isGood,
144                                   int &median, int &madfm);
145template void findMedianStats<long>(long *array, int size, bool *isGood,
146                                    long &median, long &madfm);
147template void findMedianStats<float>(float *array, int size, bool *isGood,
148                                     float &median, float &madfm);
149template void findMedianStats<double>(double *array, int size, bool *isGood,
150                                      double &median, double &madfm);
151//--------------------------------------------------------------------
152 
153
154template <class T> void findNormalStats(T *array, int size,
155                                        float &mean, float &stddev)
156{
157  if(size==0){
158    std::cerr << "Error in findNormalStats: zero sized array!\n";
159    return;
160  }
161  mean = array[0];
162  for(int i=1;i<size;i++){
163    mean += array[i];
164  }
165  mean /= float(size);
166
167  stddev = (array[0]-mean) * (array[0]-mean);
168  for(int i=1;i<size;i++) stddev += (array[i]-mean)*(array[i]-mean);
169  stddev = sqrt(stddev/float(size-1));
170
171}
172template void findNormalStats<int>(int *array, int size,
173                                   float &mean, float &stddev);
174template void findNormalStats<long>(long *array, int size,
175                                    float &mean, float &stddev);
176template void findNormalStats<float>(float *array, int size,
177                                     float &mean, float &stddev);
178template void findNormalStats<double>(double *array, int size,
179                                      float &mean, float &stddev);
180//--------------------------------------------------------------------
181
182template <class T> void findNormalStats(T *array, int size, bool *isGood,
183                                        float &mean, float &stddev)
184{
185  int goodSize=0;
186  for(int i=0;i<size;i++) if(isGood[i]) goodSize++;
187  if(goodSize==0){
188    std::cerr << "Error in findNormalStats: no good values!\n";
189    return;
190  }
191  int start=0;
192  while(!isGood[start]){start++;}
193  mean = array[start];
194  for(int i=start+1;i<size;i++){
195    if(isGood[i]) mean += array[i];
196  }
197  mean /= float(goodSize);
198
199  stddev = (array[start]-mean) * (array[start]-mean);
200  for(int i=1;i<size;i++){
201    if(isGood[i]) stddev += (array[i]-mean)*(array[i]-mean);
202  }
203  stddev = sqrt(stddev/float(goodSize-1));
204
205}
206template void findNormalStats<int>(int *array, int size, bool *isGood,
207                                   float &mean, float &stddev);
208template void findNormalStats<long>(long *array, int size, bool *isGood,
209                                    float &mean, float &stddev);
210template void findNormalStats<float>(float *array, int size, bool *isGood,
211                                     float &mean, float &stddev);
212template void findNormalStats<double>(double *array, int size, bool *isGood,
213                                      float &mean, float &stddev);
214//--------------------------------------------------------------------
215
216void findTrimmedHistStatsOLD(float *array, const int size,
217                             float &tmean, float &tsigma)
218{
219
220  const int nbin = 100;
221  float *num = new float[nbin];
222  bool *keep = new bool[nbin];
223
224  // HOW MANY VALUES IN EACH BIN?
225  float min,max;
226  findMinMax(array,size,min,max);
227  for(int i=0; i<nbin; i++) num[i]=0;
228  for(int i=0; i<size; i++){
229    float fraction = (array[i] - min) / (max - min);
230    int bin = (int)( floor(fraction*nbin) );
231    if((bin>=0)&&(bin<nbin)) num[bin]++;
232  }
233  int binmax = 0;
234  for(int i=1; i<nbin; i++)  if(num[i]>num[binmax]) binmax = i;
235  for(int i=0; i<nbin; i++) keep[i] = (num[i]>=num[binmax]/2);
236  float *newarray = new float[size];
237  int newsize = 0;
238  for(int i=0; i<size; i++){
239    float fraction = (array[i] - min) / (max - min);
240    int bin = (int)( floor(fraction*nbin) );
241    if(keep[bin]) newarray[newsize++] = array[i];
242  }
243
244  findNormalStats(newarray,newsize,tmean,tsigma);
245  delete [] num,keep,newarray;
246
247}
248//--------------------------------------------------------------------
249
250void findTrimmedHistStats2(float *array, const int size,
251                           float &tmean, float &tsigma)
252{
253
254  const int nbin = 200;
255  float *num = new float[nbin];
256  bool *keep = new bool[nbin];
257
258  // HOW MANY VALUES IN EACH BIN?
259  float min,max;
260  findMinMax(array,size,min,max);
261  for(int i=0; i<nbin; i++) num[i]=0;
262  for(int i=0; i<size; i++){
263    float fraction = (array[i] - min) / (max - min);
264    int bin = (int)( floor(fraction*nbin) );
265    if((bin>=0)&&(bin<nbin)) num[bin]++;
266  }
267  int binmax = 0;
268  for(int i=1; i<nbin; i++)  if(num[i]>num[binmax]) binmax = i;
269  for(int i=0; i<nbin; i++) keep[i] = (num[i]>=num[binmax]/2);
270  float *newarray = new float[size];
271  int newsize = 0;
272  for(int i=0; i<size; i++){
273    float fraction = (array[i] - min) / (max - min);
274    int bin = (int)( floor(fraction*nbin) );
275    if(keep[bin]) newarray[newsize++] = array[i];
276  }
277
278  tmean = findMean(newarray,newsize);
279
280  tsigma = newsize * (max-min)/float(nbin) /
281    (num[binmax] * erf(sqrt(M_LN2)) * sqrt(2.*M_PI));
282
283}
284//--------------------------------------------------------------------
285
286void findTrimmedHistStats(float *array, const int size,
287                          float &tmean, float &tsigma)
288{
289  float datamin,datamax;
290  findMinMax(array,size,datamin,datamax);
291  float *sorted = new float[size];
292  float *cumul  = new float[size];
293  float *angle  = new float[size];
294  for(int i=0;i<size;i++) sorted[i] = array[i]/(datamax-datamin);
295  sort(sorted,0,size);
296  for(int i=0;i<size;i++) cumul[i] = (float)i/(float)size;
297  int width =(int)( 20. * log10((float)size));
298  for(int i=0;i<size;i++){
299    int beg,end;
300    float slope,eSlope,inter,eInter,r;
301    if(i<width/2) beg=0; else beg=i-width/2;
302    if(i>=size-width/2) end=size-1; else end=i+width/2;
303    if(linear_regression(size,sorted,cumul,beg,end,slope,eSlope,inter,eInter,r)==0)
304      angle[i] = atan( fabs(slope) ) * 180. / M_PI;
305    else angle[i] = 90.;
306  }
307
308//   int start = 0;
309//   while(angle[start] < 45.) start++;
310//   int finish = size-1;
311//   while(angle[finish] < 45.) finish--;
312
313  int maxpt = 0;
314  for(int i = 1; i<size; i++) if(angle[i]>angle[maxpt]) maxpt=i;
315  int start = maxpt;
316  while((start>0)&&(angle[start]>45.)) start--;
317  int finish = maxpt;
318  while((finish < size-1)&&(angle[finish]>45.)) finish++;
319
320//   std::cerr << "npts = " << size << ", start = " << start << ", finish = " << finish << std::endl;
321
322  int trimSize=0;
323  float *newarray = new float[finish-start+1];
324  for(int i=0;i<finish-start+1;i++) newarray[i] = sorted[i+start]*(datamax-datamin);
325
326  findNormalStats(newarray,finish-start+1,tmean,tsigma);
327 
328}
Note: See TracBrowser for help on using the repository browser.