Go to the documentation of this file.00001 #include "Utilities/BinningTools/interface/ClusterizingHistogram.h"
00002 #include <iostream>
00003
00004 using namespace std;
00005
00006 ClusterizingHistogram::ClusterizingHistogram(int nb, float xmi, float xma) :
00007 my_nbins(nb), xmin(xmi), xmax(xma), my_entries(0), my_underflows(0), my_overflows(0) {
00008 bin_entries = new int[my_nbins];
00009 bin_means = new float[my_nbins];
00010 binsiz = (xmax-xmin) / my_nbins;
00011 for (int i=0; i<my_nbins; i++) {
00012 bin_entries[i] = 0;
00013 bin_means[i] = 0.;
00014 }
00015 }
00016 ClusterizingHistogram::~ClusterizingHistogram(){ delete[] bin_entries; delete [] bin_means;}
00017
00018 int ClusterizingHistogram::bin( float x) const {
00019 if (x < xmin) return -1;
00020 else if (x > xmax) return my_nbins;
00021 else return int((x-xmin)/binsiz);
00022 }
00023 int ClusterizingHistogram::bin( double x) const {
00024 if (x < xmin) return -1;
00025 else if (x > xmax) return my_nbins;
00026 else return int((x-xmin)/binsiz);
00027 }
00028
00029 void ClusterizingHistogram::fill( float x) {
00030 if (x < xmin) my_underflows++;
00031 else if (x > xmax) my_overflows++;
00032 else {
00033 int bin = int((x-xmin)/binsiz);
00034 if ( bin > my_nbins-1) bin = my_nbins-1;
00035 ++bin_entries[bin];
00036 bin_means[bin] += x;
00037 my_entries++;
00038
00039 }
00040 }
00041
00042 vector<float> ClusterizingHistogram::clusterize( float resol) {
00043 vector<float> clust;
00044 int nclust = 0;
00045 bool inclust = false;
00046 float last_pos = xmin - 1000.*resol;
00047 int sum = 0;
00048 float sumx = 0;
00049 for (int i=0; i<my_nbins; i++) {
00050 if (bin_entries[i] != 0) {
00051 if ( fabs(bin_pos(i)-last_pos) > resol) {
00052 inclust = false;
00053 if (nclust != 0) clust.push_back( sumx/sum);
00054 }
00055 if (!inclust) {
00056 nclust++;
00057 sumx = 0.;
00058 sum = 0;
00059 }
00060 sum += bin_entries[i];
00061 sumx += bin_means[i];
00062 last_pos = bin_pos(i);
00063 inclust = true;
00064 }
00065 }
00066 if (nclust != 0) clust.push_back( sumx/sum);
00067 return clust;
00068 }
00069
00070
00071 void ClusterizingHistogram::dump() const { dump(0, my_nbins);}
00072
00073 void ClusterizingHistogram::dump(int i1, int i2) const {
00074 cout << "Dumping ClusterizingHistogram contents:" << endl;
00075 for (int i=max(i1,0); i<min(i2,my_nbins); i++) {
00076 cout << i << " " << bin_entries[i] << " " << bin_pos(i) << endl;
00077 }
00078 cout << "Underflows: " << my_underflows << endl;
00079 cout << "Overflows: " << my_overflows << endl;
00080 cout << "Total number of entries: " << my_entries << endl;
00081 }
00082
00083 void ClusterizingHistogram::dump( float x1, float x2) const { dump( bin(x1), bin(x2));}
00084 void ClusterizingHistogram::dump( double x1, double x2) const { dump( bin(x1), bin(x2));}
00085 void ClusterizingHistogram::dump( float x1, double x2) const { dump( bin(x1), bin(x2));}
00086 void ClusterizingHistogram::dump( double x1, float x2) const { dump( bin(x1), bin(x2));}
00087
00088 void ClusterizingHistogram::reset() {
00089 my_entries = 0;
00090 my_underflows = 0;
00091 my_overflows = 0;
00092 for (int i=0; i<my_nbins; i++) {
00093 bin_entries[i] = 0;
00094 bin_means[i] = 0.;
00095 }
00096 }