source: branches/fitshead-branch/Utils/getStats.cc @ 1441

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

Corrected typo from revision 78.

File size: 6.5 KB
Line 
1#include <cpgplot.h>
2#include <iostream>
3#include <math.h>
4#include <Utils/utils.hh>
5
6void findMinMax(const float *array, const int size, float &min, float &max)
7{
8  min = max = array[0];
9  for(int i=1;i<size;i++) {
10    if(array[i]<min) min=array[i];
11    if(array[i]>max) max=array[i];
12  }
13}
14
15float findMean(float *&array, int size)
16{
17  float mean = array[0];
18  for(int i=1;i<size;i++) mean += array[i];
19  mean /= float(size);
20  return mean;
21}
22
23float findStddev(float *&array, int size)
24{
25  float mean = findMean(array,size);
26  float stddev = (array[0]-mean) * (array[0]-mean);
27  for(int i=1;i<size;i++) stddev += (array[i]-mean)*(array[i]-mean);
28  stddev = sqrt(stddev/float(size-1));
29  return stddev;
30}
31
32float findMedian(float *&array, int size)
33{
34  // NOTE: madfm = median absolute deviation from median
35  float *newarray = new float[size];
36  float median;
37  for(int i=0;i<size;i++) newarray[i] = array[i];
38  sort(newarray,0,size);
39  if((size%2)==0) median = 0.5*(newarray[size/2-1]+newarray[size/2]);
40  else median = newarray[size/2];
41  delete [] newarray;
42  return median;
43}
44
45float findMADFM(float *&array, int size)
46{
47  // NOTE: madfm = median absolute deviation from median
48  float *newarray = new float[size];
49  float median = findMedian(array,size);
50  float madfm;
51  for(int i=0;i<size;i++) newarray[i] = fabs(array[i]-median);
52  sort(newarray,0,size);
53  if((size%2)==0) madfm = 0.5*(newarray[size/2-1]+newarray[size/2]);
54  else madfm = newarray[size/2];
55  delete [] newarray;
56  return madfm;
57}
58 
59void findMedianStats(float *&array, int size, float &median, float &madfm)
60{
61  // NOTE: madfm = median absolute deviation from median
62  float *newarray = new float[size];
63
64  for(int i=0;i<size;i++) newarray[i] = array[i];
65  sort(newarray,0,size);
66  if((size%2)==0) median = 0.5*(newarray[size/2-1]+newarray[size/2]);
67  else median = newarray[size/2];
68
69  for(int i=0;i<size;i++) newarray[i] = fabs(array[i]-median);
70  sort(newarray,0,size);
71  if((size%2)==0) madfm = 0.5*(newarray[size/2-1]+newarray[size/2]);
72  else madfm = newarray[size/2];
73
74  delete [] newarray;
75}
76 
77void findMedianStats(float *&array, long size, float &median, float &madfm)
78{
79  // NOTE: madfm = median absolute deviation from median
80  float *newarray = new float[size];
81
82  for(int i=0;i<size;i++) newarray[i] = array[i];
83  sort(newarray,0,size);
84  if((size%2)==0) median = 0.5*(newarray[size/2-1]+newarray[size/2]);
85  else median = newarray[size/2];
86
87  for(int i=0;i<size;i++) newarray[i] = fabs(array[i]-median);
88  sort(newarray,0,size);
89  if((size%2)==0) madfm = 0.5*(newarray[size/2-1]+newarray[size/2]);
90  else madfm = newarray[size/2];
91
92  delete [] newarray;
93}
94 
95
96void findNormalStats(float *&array, int size, float &mean, float &stddev)
97{
98  mean = array[0];
99  for(int i=1;i<size;i++){
100    mean += array[i];
101  }
102  mean /= float(size);
103
104  stddev = (array[0]-mean) * (array[0]-mean);
105  for(int i=1;i<size;i++) stddev += (array[i]-mean)*(array[i]-mean);
106  stddev = sqrt(stddev/float(size-1));
107
108}
109
110void findTrimmedHistStatsOLD(float *array, const int size, float &tmean, float &tsigma)
111{
112
113  const int nbin = 100;
114  float *num = new float[nbin];
115  bool *keep = new bool[nbin];
116
117  // HOW MANY VALUES IN EACH BIN?
118  float min,max;
119  findMinMax(array,size,min,max);
120  for(int i=0; i<nbin; i++) num[i]=0;
121  for(int i=0; i<size; i++){
122    float fraction = (array[i] - min) / (max - min);
123    int bin = (int)( floor(fraction*nbin) );
124    if((bin>=0)&&(bin<nbin)) num[bin]++;
125  }
126  int binmax = 0;
127  for(int i=1; i<nbin; i++)  if(num[i]>num[binmax]) binmax = i;
128  for(int i=0; i<nbin; i++) keep[i] = (num[i]>=num[binmax]/2);
129  float *newarray = new float[size];
130  int newsize = 0;
131  for(int i=0; i<size; i++){
132    float fraction = (array[i] - min) / (max - min);
133    int bin = (int)( floor(fraction*nbin) );
134    if(keep[bin]) newarray[newsize++] = array[i];
135  }
136  // if(newsize==0)
137    std::cerr << size << "<->" << newsize << std::endl;
138
139  findNormalStats(newarray,newsize,tmean,tsigma);
140//   cpgopen("tmp.ps/vps");
141//   cpghistlog(newsize,newarray,min,max,100,0);
142//   cpghist(newsize,newarray,min,max,100,0);
143//   cpgend();
144  delete [] num,keep,newarray;
145
146//   tsigma *= trimToNormal;
147
148}
149void findTrimmedHistStats2(float *array, const int size, float &tmean, float &tsigma)
150{
151
152  const int nbin = 200;
153  float *num = new float[nbin];
154  bool *keep = new bool[nbin];
155
156  // HOW MANY VALUES IN EACH BIN?
157  float min,max;
158  findMinMax(array,size,min,max);
159  for(int i=0; i<nbin; i++) num[i]=0;
160  for(int i=0; i<size; i++){
161    float fraction = (array[i] - min) / (max - min);
162    int bin = (int)( floor(fraction*nbin) );
163    if((bin>=0)&&(bin<nbin)) num[bin]++;
164  }
165  int binmax = 0;
166  for(int i=1; i<nbin; i++)  if(num[i]>num[binmax]) binmax = i;
167  for(int i=0; i<nbin; i++) keep[i] = (num[i]>=num[binmax]/2);
168  float *newarray = new float[size];
169  int newsize = 0;
170  for(int i=0; i<size; i++){
171    float fraction = (array[i] - min) / (max - min);
172    int bin = (int)( floor(fraction*nbin) );
173    if(keep[bin]) newarray[newsize++] = array[i];
174  }
175
176  tmean = findMean(newarray,newsize);
177
178  tsigma = newsize * (max-min)/float(nbin) /
179    (num[binmax] * erf(sqrt(M_LN2)) * sqrt(2.*M_PI));
180
181}
182
183void findTrimmedHistStats(float *array, const int size, float &tmean, float &tsigma)
184{
185  float datamin,datamax;
186  findMinMax(array,size,datamin,datamax);
187  float *sorted = new float[size];
188  float *cumul  = new float[size];
189  float *angle  = new float[size];
190  for(int i=0;i<size;i++) sorted[i] = array[i]/(datamax-datamin);
191  sort(sorted,0,size);
192  for(int i=0;i<size;i++) cumul[i] = (float)i/(float)size;
193  int width =(int)( 20. * log10((float)size));
194  for(int i=0;i<size;i++){
195    int beg,end;
196    float slope,eSlope,inter,eInter,r;
197    if(i<width/2) beg=0; else beg=i-width/2;
198    if(i>=size-width/2) end=size-1; else end=i+width/2;
199    if(linear_regression(size,sorted,cumul,beg,end,slope,eSlope,inter,eInter,r)==0)
200      angle[i] = atanf( fabs(slope) ) * 180. / M_PI;
201    else angle[i] = 90.;
202  }
203
204//   int start = 0;
205//   while(angle[start] < 45.) start++;
206//   int finish = size-1;
207//   while(angle[finish] < 45.) finish--;
208
209  int maxpt = 0;
210  for(int i = 1; i<size; i++) if(angle[i]>angle[maxpt]) maxpt=i;
211  int start = maxpt;
212  while((start>0)&&(angle[start]>45.)) start--;
213  int finish = maxpt;
214  while((finish < size-1)&&(angle[finish]>45.)) finish++;
215
216  std::cerr << "npts = " << size << ", start = " << start << ", finish = " << finish << std::endl;
217
218  int trimSize=0;
219  float *newarray = new float[finish-start+1];
220  for(int i=0;i<finish-start+1;i++) newarray[i] = sorted[i+start]*(datamax-datamin);
221
222  findNormalStats(newarray,finish-start+1,tmean,tsigma);
223 
224}
Note: See TracBrowser for help on using the repository browser.