andrew@45: /* andrew@45: * Histogram.cpp andrew@45: * annotationResultCalculator andrew@45: * andrew@45: * Created by Andrew on 08/05/2012. andrew@45: * Copyright 2012 QMUL. All rights reserved. andrew@45: * andrew@45: */ andrew@45: andrew@45: #include "Histogram.h" andrew@45: andrew@45: Histogram::Histogram(){ andrew@45: screenHeight = ofGetHeight(); andrew@45: } andrew@45: andrew@47: void Histogram::createHistogram(const int& binWidthIn, const int& numberofBinsIn){ andrew@48: //printf("create regular histo\n"); andrew@49: andrew@45: numberofBins = numberofBinsIn; andrew@45: binWidth = binWidthIn; andrew@47: minimumBinValue = -1.0 * binWidth * ((double)numberofBins/2); andrew@49: andrew@45: histogram.clear(); andrew@45: histogram.assign(numberofBins, 0); andrew@49: andrew@45: maximum = 0; andrew@47: numberOutsideRange = 0; andrew@47: andrew@47: setBinPoints(); andrew@47: andrew@47: } andrew@47: andrew@48: andrew@48: void Histogram::createAbsoluteHistogram(const int& binWidthIn, const int& numberofBinsIn){ andrew@48: printf("create abs histo\n"); andrew@48: andrew@48: minimumBinValue = 0; andrew@48: numberofBins = numberofBinsIn; andrew@48: binWidth = binWidthIn; andrew@48: andrew@48: histogram.clear(); andrew@48: histogram.assign(numberofBins, 0); andrew@48: andrew@48: maximum = 0; andrew@48: numberOutsideRange = 0; andrew@48: andrew@48: setBinPoints(); andrew@48: } andrew@48: andrew@49: void Histogram::createAbsoluteHistogramForMatchData(){ andrew@49: printf("create abs histo\n"); andrew@49: andrew@49: minimumBinValue = 0; andrew@49: andrew@49: numberofBins = 7; andrew@49: andrew@49: histogram.clear(); andrew@49: histogram.assign(numberofBins, 0); andrew@49: andrew@49: maximum = 0; andrew@49: numberOutsideRange = 0; andrew@49: andrew@49: setBinPointsToMatchRange(); andrew@49: } andrew@49: andrew@49: void Histogram::setBinPointsToMatchRange(){ andrew@49: binPoints.clear(); andrew@49: numberofBins = 7; andrew@49: binWidth = 0; andrew@49: binPoints.push_back(0); andrew@49: binPoints.push_back(20); andrew@49: binPoints.push_back(40); andrew@49: binPoints.push_back(60); andrew@49: binPoints.push_back(100); andrew@49: binPoints.push_back(200); andrew@49: binPoints.push_back(500); andrew@49: maximumBinValue = 1000; andrew@49: } andrew@49: andrew@49: andrew@49: andrew@47: void Histogram::setBinPoints(){ andrew@47: binPoints.clear(); andrew@47: binPoints.push_back(minimumBinValue); andrew@47: while (binPoints.size() < numberofBins){ andrew@47: binPoints.push_back(binPoints[binPoints.size()-1] + binWidth); andrew@47: } andrew@47: maximumBinValue = binPoints[binPoints.size()-1]+binWidth; andrew@47: andrew@48: // for (int k = 0; k < binPoints.size();k++){ andrew@48: // printf("Bin pts [%i] : %f\n", k, binPoints[k]); andrew@48: // } andrew@47: andrew@47: } andrew@47: andrew@47: void Histogram::processDataIntoHistogram(const DoubleVector& data){ andrew@47: andrew@45: double binPoint; andrew@45: int bin = 0; andrew@47: numberOutsideRange = 0; andrew@47: andrew@45: for (int i = 0;i < data.size();i++){ andrew@45: //find which bin it falls into. andrew@45: //5 bins, width is 10 andrew@45: //then we start around zero for the 5+1/2 th, i.e. 3rd bin andrew@45: //zero is the 5/2 th pt andrew@48: // printf("data[%i] %f\n", i, data[i]); andrew@45: andrew@45: bin = 0; andrew@47: binPoint = binPoints[0];//i.e. minimumBinValue; andrew@48: // printf("binpT%f\n", binPoint); andrew@45: if (data[i] >= binPoint){//i.e. falls inside andrew@49: andrew@49: while (bin < numberofBins && data[i] > binPoints[bin+1]) { andrew@45: //printf("data pt %f bin %i binPt %.1f\n", data[i], bin, binPoint); andrew@47: bin++; andrew@47: binPoint = binPoints[bin]; andrew@48: andrew@47: // binPoint += binWidth; andrew@47: // bin++; andrew@45: } andrew@45: andrew@46: // printf("data pt %f bin %i binPt %.1f\n", data[i], bin, binPoint); andrew@45: andrew@47: if (data[i] <= maximumBinValue){//in case outside range andrew@45: histogram[bin]++; andrew@47: } else{ andrew@47: //then it's greater than maximum andrew@47: numberOutsideRange++; andrew@45: } andrew@47: } else{ andrew@47: //then it's less than minimum andrew@47: numberOutsideRange++; andrew@45: } andrew@45: } andrew@45: andrew@45: for (int k = 0; k < histogram.size();k++){ andrew@45: andrew@45: if (histogram[k] > maximum) andrew@45: maximum = histogram[k]; andrew@45: andrew@48: printf("HISTO[%i] (%.1f - %.1f) = %i\n", k, binPoints[k], binPoints[k]+binWidth, histogram[k]); andrew@45: } andrew@47: printf("Number outside %i\n", numberOutsideRange); andrew@45: andrew@45: andrew@45: } andrew@45: andrew@49: andrew@49: void Histogram::printHistogramPercentages(){ andrew@49: double total = numberOutsideRange; andrew@49: andrew@49: for (int k = 0; k < histogram.size();k++){ andrew@49: total += histogram[k]; andrew@49: } andrew@49: andrew@49: for (int k = 0;k < histogram.size() - 1;k++){ andrew@49: printf("HISTO[%i] (%.1f - %.1f) = %.2f\n", k, binPoints[k], binPoints[k+1], 100.0*(double)histogram[k]/total); andrew@49: } andrew@49: 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: printf("OUTSIDE = %.2f\n", (double) 100.0*numberOutsideRange/total); andrew@49: andrew@49: } andrew@49: andrew@45: void Histogram::plotHistogram(){ andrew@45: plotHistogram(maximum); andrew@45: } andrew@45: andrew@45: void Histogram::plotHistogram(const double& maxHeight){ andrew@45: andrew@45: double width = ofGetWidth(); andrew@45: double height = ofGetHeight(); andrew@45: screenHeight = ofGetHeight(); andrew@45: if (numberofBins > 0 && maxHeight > 0){ andrew@45: width /= numberofBins; andrew@45: height /= maxHeight; andrew@45: andrew@45: for (int i = 0;i < numberofBins;i++){ andrew@45: ofRect(i * width, getY(histogram[i]*height), width, histogram[i]*height); andrew@45: } andrew@45: andrew@45: } andrew@45: andrew@45: } andrew@45: andrew@49: void Histogram::labelHistogram(){ andrew@49: andrew@49: double width = ofGetWidth(); andrew@49: // double height = ofGetHeight(); andrew@49: screenHeight = ofGetHeight(); andrew@49: if (numberofBins > 0){ andrew@49: width /= numberofBins; andrew@49: // height /= maxHeight; andrew@49: andrew@49: andrew@49: andrew@49: for (int i = 0;i < numberofBins;i++){ andrew@49: andrew@49: int nextBinVal = maximumBinValue; andrew@49: if (i < numberofBins - 1){ andrew@49: nextBinVal = binPoints[i+1]; andrew@49: } andrew@49: andrew@49: ofDrawBitmapString(ofToString(binPoints[i], 0)+" - "+ofToString(nextBinVal, 0), (i +0.2) * width, screenHeight - 10); andrew@49: } andrew@49: andrew@49: } andrew@49: andrew@49: } andrew@49: andrew@45: andrew@45: int Histogram::getY(const int& y){ andrew@45: return screenHeight - y; andrew@45: } andrew@45: