annotate annotationCalculatorSrc/Histogram.cpp @ 56:4394c9490716 tip

minor changes
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Mon, 24 Dec 2012 18:58:39 +0000
parents 8df911733fdc
children
rev   line source
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