andrew@45
|
1 /*
|
andrew@45
|
2 * Histogram.cpp
|
andrew@45
|
3 * annotationResultCalculator
|
andrew@45
|
4 *
|
andrew@45
|
5 * Created by Andrew on 08/05/2012.
|
andrew@45
|
6 * Copyright 2012 QMUL. All rights reserved.
|
andrew@45
|
7 *
|
andrew@45
|
8 */
|
andrew@45
|
9
|
andrew@45
|
10 #include "Histogram.h"
|
andrew@45
|
11
|
andrew@45
|
12 Histogram::Histogram(){
|
andrew@45
|
13 screenHeight = ofGetHeight();
|
andrew@45
|
14 }
|
andrew@45
|
15
|
andrew@47
|
16 void Histogram::createHistogram(const int& binWidthIn, const int& numberofBinsIn){
|
andrew@48
|
17 //printf("create regular histo\n");
|
andrew@49
|
18
|
andrew@45
|
19 numberofBins = numberofBinsIn;
|
andrew@45
|
20 binWidth = binWidthIn;
|
andrew@47
|
21 minimumBinValue = -1.0 * binWidth * ((double)numberofBins/2);
|
andrew@49
|
22
|
andrew@45
|
23 histogram.clear();
|
andrew@45
|
24 histogram.assign(numberofBins, 0);
|
andrew@49
|
25
|
andrew@45
|
26 maximum = 0;
|
andrew@47
|
27 numberOutsideRange = 0;
|
andrew@47
|
28
|
andrew@47
|
29 setBinPoints();
|
andrew@47
|
30
|
andrew@47
|
31 }
|
andrew@47
|
32
|
andrew@48
|
33
|
andrew@48
|
34 void Histogram::createAbsoluteHistogram(const int& binWidthIn, const int& numberofBinsIn){
|
andrew@48
|
35 printf("create abs histo\n");
|
andrew@48
|
36
|
andrew@48
|
37 minimumBinValue = 0;
|
andrew@48
|
38 numberofBins = numberofBinsIn;
|
andrew@48
|
39 binWidth = binWidthIn;
|
andrew@48
|
40
|
andrew@48
|
41 histogram.clear();
|
andrew@48
|
42 histogram.assign(numberofBins, 0);
|
andrew@48
|
43
|
andrew@48
|
44 maximum = 0;
|
andrew@48
|
45 numberOutsideRange = 0;
|
andrew@48
|
46
|
andrew@48
|
47 setBinPoints();
|
andrew@48
|
48 }
|
andrew@48
|
49
|
andrew@49
|
50 void Histogram::createAbsoluteHistogramForMatchData(){
|
andrew@49
|
51 printf("create abs histo\n");
|
andrew@49
|
52
|
andrew@49
|
53 minimumBinValue = 0;
|
andrew@49
|
54
|
andrew@49
|
55 numberofBins = 7;
|
andrew@49
|
56
|
andrew@49
|
57 histogram.clear();
|
andrew@49
|
58 histogram.assign(numberofBins, 0);
|
andrew@49
|
59
|
andrew@49
|
60 maximum = 0;
|
andrew@49
|
61 numberOutsideRange = 0;
|
andrew@49
|
62
|
andrew@49
|
63 setBinPointsToMatchRange();
|
andrew@49
|
64 }
|
andrew@49
|
65
|
andrew@49
|
66 void Histogram::setBinPointsToMatchRange(){
|
andrew@49
|
67 binPoints.clear();
|
andrew@49
|
68 numberofBins = 7;
|
andrew@49
|
69 binWidth = 0;
|
andrew@49
|
70 binPoints.push_back(0);
|
andrew@49
|
71 binPoints.push_back(20);
|
andrew@49
|
72 binPoints.push_back(40);
|
andrew@49
|
73 binPoints.push_back(60);
|
andrew@49
|
74 binPoints.push_back(100);
|
andrew@49
|
75 binPoints.push_back(200);
|
andrew@49
|
76 binPoints.push_back(500);
|
andrew@49
|
77 maximumBinValue = 1000;
|
andrew@49
|
78 }
|
andrew@49
|
79
|
andrew@49
|
80
|
andrew@49
|
81
|
andrew@47
|
82 void Histogram::setBinPoints(){
|
andrew@47
|
83 binPoints.clear();
|
andrew@47
|
84 binPoints.push_back(minimumBinValue);
|
andrew@47
|
85 while (binPoints.size() < numberofBins){
|
andrew@47
|
86 binPoints.push_back(binPoints[binPoints.size()-1] + binWidth);
|
andrew@47
|
87 }
|
andrew@47
|
88 maximumBinValue = binPoints[binPoints.size()-1]+binWidth;
|
andrew@47
|
89
|
andrew@48
|
90 // for (int k = 0; k < binPoints.size();k++){
|
andrew@48
|
91 // printf("Bin pts [%i] : %f\n", k, binPoints[k]);
|
andrew@48
|
92 // }
|
andrew@47
|
93
|
andrew@47
|
94 }
|
andrew@47
|
95
|
andrew@47
|
96 void Histogram::processDataIntoHistogram(const DoubleVector& data){
|
andrew@47
|
97
|
andrew@45
|
98 double binPoint;
|
andrew@45
|
99 int bin = 0;
|
andrew@47
|
100 numberOutsideRange = 0;
|
andrew@47
|
101
|
andrew@45
|
102 for (int i = 0;i < data.size();i++){
|
andrew@45
|
103 //find which bin it falls into.
|
andrew@45
|
104 //5 bins, width is 10
|
andrew@45
|
105 //then we start around zero for the 5+1/2 th, i.e. 3rd bin
|
andrew@45
|
106 //zero is the 5/2 th pt
|
andrew@48
|
107 // printf("data[%i] %f\n", i, data[i]);
|
andrew@45
|
108
|
andrew@45
|
109 bin = 0;
|
andrew@47
|
110 binPoint = binPoints[0];//i.e. minimumBinValue;
|
andrew@48
|
111 // printf("binpT%f\n", binPoint);
|
andrew@45
|
112 if (data[i] >= binPoint){//i.e. falls inside
|
andrew@49
|
113
|
andrew@49
|
114 while (bin < numberofBins && data[i] > binPoints[bin+1]) {
|
andrew@45
|
115 //printf("data pt %f bin %i binPt %.1f\n", data[i], bin, binPoint);
|
andrew@47
|
116 bin++;
|
andrew@47
|
117 binPoint = binPoints[bin];
|
andrew@48
|
118
|
andrew@47
|
119 // binPoint += binWidth;
|
andrew@47
|
120 // bin++;
|
andrew@45
|
121 }
|
andrew@45
|
122
|
andrew@46
|
123 // printf("data pt %f bin %i binPt %.1f\n", data[i], bin, binPoint);
|
andrew@45
|
124
|
andrew@47
|
125 if (data[i] <= maximumBinValue){//in case outside range
|
andrew@45
|
126 histogram[bin]++;
|
andrew@47
|
127 } else{
|
andrew@47
|
128 //then it's greater than maximum
|
andrew@47
|
129 numberOutsideRange++;
|
andrew@45
|
130 }
|
andrew@47
|
131 } else{
|
andrew@47
|
132 //then it's less than minimum
|
andrew@47
|
133 numberOutsideRange++;
|
andrew@45
|
134 }
|
andrew@45
|
135 }
|
andrew@45
|
136
|
andrew@45
|
137 for (int k = 0; k < histogram.size();k++){
|
andrew@45
|
138
|
andrew@45
|
139 if (histogram[k] > maximum)
|
andrew@45
|
140 maximum = histogram[k];
|
andrew@45
|
141
|
andrew@48
|
142 printf("HISTO[%i] (%.1f - %.1f) = %i\n", k, binPoints[k], binPoints[k]+binWidth, histogram[k]);
|
andrew@45
|
143 }
|
andrew@47
|
144 printf("Number outside %i\n", numberOutsideRange);
|
andrew@45
|
145
|
andrew@45
|
146
|
andrew@45
|
147 }
|
andrew@45
|
148
|
andrew@49
|
149
|
andrew@49
|
150 void Histogram::printHistogramPercentages(){
|
andrew@49
|
151 double total = numberOutsideRange;
|
andrew@49
|
152
|
andrew@49
|
153 for (int k = 0; k < histogram.size();k++){
|
andrew@49
|
154 total += histogram[k];
|
andrew@49
|
155 }
|
andrew@49
|
156
|
andrew@49
|
157 for (int k = 0;k < histogram.size() - 1;k++){
|
andrew@49
|
158 printf("HISTO[%i] (%.1f - %.1f) = %.2f\n", k, binPoints[k], binPoints[k+1], 100.0*(double)histogram[k]/total);
|
andrew@49
|
159 }
|
andrew@49
|
160 printf("HISTO[%i] (%.1f - %.1f) = %.2f\n", histogram.size() - 1, binPoints[histogram.size() - 1], maximumBinValue, 100.0*(double)histogram[histogram.size() - 1]/total);
|
andrew@49
|
161 printf("OUTSIDE = %.2f\n", (double) 100.0*numberOutsideRange/total);
|
andrew@49
|
162
|
andrew@49
|
163 }
|
andrew@49
|
164
|
andrew@45
|
165 void Histogram::plotHistogram(){
|
andrew@45
|
166 plotHistogram(maximum);
|
andrew@45
|
167 }
|
andrew@45
|
168
|
andrew@45
|
169 void Histogram::plotHistogram(const double& maxHeight){
|
andrew@45
|
170
|
andrew@45
|
171 double width = ofGetWidth();
|
andrew@45
|
172 double height = ofGetHeight();
|
andrew@45
|
173 screenHeight = ofGetHeight();
|
andrew@45
|
174 if (numberofBins > 0 && maxHeight > 0){
|
andrew@45
|
175 width /= numberofBins;
|
andrew@45
|
176 height /= maxHeight;
|
andrew@45
|
177
|
andrew@45
|
178 for (int i = 0;i < numberofBins;i++){
|
andrew@45
|
179 ofRect(i * width, getY(histogram[i]*height), width, histogram[i]*height);
|
andrew@45
|
180 }
|
andrew@45
|
181
|
andrew@45
|
182 }
|
andrew@45
|
183
|
andrew@45
|
184 }
|
andrew@45
|
185
|
andrew@49
|
186 void Histogram::labelHistogram(){
|
andrew@49
|
187
|
andrew@49
|
188 double width = ofGetWidth();
|
andrew@49
|
189 // double height = ofGetHeight();
|
andrew@49
|
190 screenHeight = ofGetHeight();
|
andrew@49
|
191 if (numberofBins > 0){
|
andrew@49
|
192 width /= numberofBins;
|
andrew@49
|
193 // height /= maxHeight;
|
andrew@49
|
194
|
andrew@49
|
195
|
andrew@49
|
196
|
andrew@49
|
197 for (int i = 0;i < numberofBins;i++){
|
andrew@49
|
198
|
andrew@49
|
199 int nextBinVal = maximumBinValue;
|
andrew@49
|
200 if (i < numberofBins - 1){
|
andrew@49
|
201 nextBinVal = binPoints[i+1];
|
andrew@49
|
202 }
|
andrew@49
|
203
|
andrew@49
|
204 ofDrawBitmapString(ofToString(binPoints[i], 0)+" - "+ofToString(nextBinVal, 0), (i +0.2) * width, screenHeight - 10);
|
andrew@49
|
205 }
|
andrew@49
|
206
|
andrew@49
|
207 }
|
andrew@49
|
208
|
andrew@49
|
209 }
|
andrew@49
|
210
|
andrew@45
|
211
|
andrew@45
|
212 int Histogram::getY(const int& y){
|
andrew@45
|
213 return screenHeight - y;
|
andrew@45
|
214 }
|
andrew@45
|
215
|