#include <HxHistogram.h>
Public Methods | |
Constructors  | |
| HxHistogram () | |
| Construct an empty histogram. More... | |
| HxHistogram (const HxHistogram &) | |
| Copy constructor. More... | |
| HxHistogram (int dimSize) | |
| Construct a 1D histogram with a range from 0 to dimSize - 1 and a binWidth of 1. More... | |
| HxHistogram (int dimSize1, int dimSize2) | |
| Construct a 2D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension. More... | |
| HxHistogram (int dimSize1, int dimSize2, int dimSize3) | |
| Construct a 3D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension. More... | |
| HxHistogram (HxValueType dataType, int dimensions, int dimSize1, int dimSize2=0, int dimSize3=0) | |
| Construct Histogram with given data type and number of dimensions. More... | |
| HxHistogram (HxValueType dataType, int dimensions, double lowBin1, double highBin1, int nBins1, double lowBin2, double highBin2, int nBins2, double lowBin3, double highBin3, int nBins3) | |
| Construct a Histogram with given parameters. More... | |
| HxHistogram (HxString filename) | |
| Read a Histogram from disk. More... | |
Destructor  | |
| ~HxHistogram () | |
| Destructor. More... | |
Operators  | |
| HxHistogram & | operator= (const HxHistogram &) | 
| Assignment operator. More... | |
| int | isNull () const | 
| Indicates wether this is a valid histogram. More... | |
| operator int () const | |
| Indicates wether this is a valid histogram. More... | |
Inquiry  | |
| int | ident () const | 
| The unique identifier of the histogram. More... | |
| HxValueType | dataType () const | 
| The data value type. More... | |
| int | dimensionality () const | 
| The number of dimensions of the histogram. More... | |
| int | dimensionSize (int dim) const | 
| The size of the histogram in the i-th dimension. More... | |
| int | nrOfBins () const | 
| The total size of the histogram. More... | |
| double | lowBin (int dim) const | 
| The lowest bin in the i-th dimension. More... | |
| double | highBin (int dim) const | 
| The highest bin in the i-th dimension. More... | |
| double | binWidth (int dim) const | 
| The bin width in the i-th dimension. More... | |
| double | binToValue (int bin, int dimension) const | 
| Translate bin to value. More... | |
| int | valueToBin (double value, int dimension) const | 
| Translate value to bin. More... | |
| int | valueToBin (double val) const | 
| Translate value to bin for 1D case. More... | |
| int | clipBin (int bin) const | 
| clip a bin index into the histogram [0:nrbins-1]. More... | |
| double | get (int bin1) const | 
| Get the number of elements in the given bin. More... | |
| double | get (int bin1, int bin2) const | 
| Get the number of elements in the given bin. More... | |
| double | get (int bin1, int bin2, int bin3) const | 
| Get the number of elements in the given bin. More... | |
Checked modification  | |
| void | insertValChecked (int val) | 
| Insert value in 1D histogram. More... | |
| void | insertValChecked (double val) | 
| Insert value in 1D histogram. More... | |
| void | insertValChecked (HxScalarInt val) | 
| Insert value in 1D histogram. More... | |
| void | insertValChecked (HxScalarDouble val) | 
| Insert value in 1D histogram. More... | |
| void | insertValChecked (HxVec2Int val) | 
| Insert value in 2D histogram. More... | |
| void | insertValChecked (HxVec2Double val) | 
| Insert value in 2D histogram. More... | |
| void | insertValChecked (HxVec3Int val) | 
| Insert value in 3D histogram. More... | |
| void | insertValChecked (HxVec3Double val) | 
| Insert value in 3D histogram. More... | |
| void | incBinChecked (int bin) | 
| Increment the given bin. More... | |
| void | incBinChecked (int bin1, int bin2) | 
| Increment the given bin. More... | |
| void | incBinChecked (int bin1, int bin2, int bin3) | 
| Increment the given bin. More... | |
Unchecked modification  | |
| void | insertVal (int val) | 
| Insert value in 1D histogram. More... | |
| void | insertVal (double val) | 
| Insert value in 1D histogram. More... | |
| void | insertVal (double val, double sigma) | 
| Kernel Density Estimator. More... | |
| void | insertVal (HxScalarInt val) | 
| Insert value in 1D histogram. More... | |
| void | insertVal (HxScalarDouble val) | 
| Insert value in 1D histogram. More... | |
| void | insertVal (HxVec2Int val) | 
| Insert value in 2D histogram. More... | |
| void | insertVal (HxVec2Double val) | 
| Insert value in 2D histogram. More... | |
| void | insertVal (HxVec3Int val) | 
| Insert value in 3D histogram. More... | |
| void | insertVal (HxVec3Double val) | 
| Insert value in 3D histogram. More... | |
| void | incBin (int bin) | 
| Increment the given bin (assumes 1D histogram). More... | |
| void | incBin (int bin1, int bin2) | 
| Increment the given bin (assumes 2D histogram). More... | |
| void | incBin (int bin1, int bin2, int bin3) | 
| Increment the given bin (assumes 3D histogram). More... | |
| void | setBin (int bin1, long val) | 
| Reset the value of the given bin to val (assumes 1D histogram). More... | |
| void | setBin (int bin1, int bin2, long val) | 
| Reset the value of the given bin to val (assumes 2D histogram). More... | |
| void | setBin (int bin1, int bin2, int bin3, long val) | 
| Reset the value of the given bin to val (assumes 3D histogram). More... | |
| void | setBin (int bin1, double val) | 
| Reset the value of the given bin to val (assumes 1D histogram). More... | |
| void | setBin (int bin1, int bin2, double val) | 
| Reset the value of the given bin to val (assumes 2D histogram). More... | |
| void | setBin (int bin1, int bin2, int bin3, double val) | 
| Reset the value of the given bin to val (assumes 3D histogram). More... | |
Statistics  | |
| HxHistogram | smooth (double sigma=3.0) | 
| Smooth histogram data. More... | |
| std::list< HxVec2Double > | modes () | 
| Get histogram modes. More... | |
| HxHistogram | normalize (double weight=1.0) | 
| Normalize histogram data. More... | |
| double | sum () const | 
| The sum of the histogram. More... | |
| double | minVal () const | 
| The minimum number of elements in the histogram. More... | |
| double | minVal (int *index) const | 
| The minimum number of elements in the histogram. More... | |
| double | maxVal () const | 
| The maximum number of elements in the histogram. More... | |
| double | maxVal (int *index) const | 
| The maximum number of elements in the histogram. More... | |
| double | intersection (const HxHistogram &) const | 
| Intersection of histograms. More... | |
| double | chiSquare (const HxHistogram &) const | 
| Chi square intersection of histograms. More... | |
| double | chiSquareNorm (const HxHistogram &) const | 
| Normalized chi square intersection of histograms. More... | |
compute threshold value  | |
| int | computeIsodataThreshold (void) | 
| int | computeEntropyThreshold (void) | 
Output/display  | |
| HxHistogram | convert (HxValueType dataType) | 
| convert dataType. More... | |
| void | getTheData (double *x, double *y) | 
| Fill the externally allocated buffer with data from this histogram. More... | |
| void | getTheData2 (double *x1, double *x2, double *y) | 
| Fill the externally allocated buffer with data from this histogram. More... | |
| void | getTheData3 (double *x1, double *x2, double *x3, double *y) | 
| Fill the externally allocated buffer with data from this histogram. More... | |
| void | getDataDouble (double *data) | 
| Fill the externally allocated buffer with data from this histogram. More... | |
| void | getDataInt (int *data) | 
| Fill the externally allocated buffer with data from this histogram. More... | |
| void | render3d (int *data, int dataWidth, int dataHeight, double elevation, double alpha, double threshold) | 
| Assume the histogram is a 3d rgb cube and render it for display in Java in the externally allocated data buffer. More... | |
| STD_OSTREAM & | put (STD_OSTREAM &, HxString delimit="") const | 
| Print histogram data in the given stream. More... | |
| int | write (HxString filename) | 
| Write histogram to disk. More... | |
Reduce operations  | |
| HxHistogram | threshold (double valThreshold) | 
| Returns new histogram in which bins with count<=valThreshold are set to 0.0, bins with count>valThreshold keep original value. More... | |
| int | countBins (double valThreshold=0.0) | 
| Returns number of bins with count>valThreshold. More... | |
| HxHistogram | reduceRange (int binMin1, int binMax1=-1, int binMin2=0, int binMax2=-1, int binMin3=0, int binMax3=-1) | 
| Returns new histogram containing given range of bins only. More... | |
| HxHistogram | reduceRangeVal (double binValMin1, double binValMax1, double binValMin2=0, double binValMax2=0, double binValMin3=0, double binValMax3=0) | 
| Returns new histogram containing given range of values (mapped to bin numbers) only. More... | |
| HxHistogram | to1D (int dim=1) | 
| Projects n-dimensional (1<n<=3) histogram on a 1-D histogram for given dimension. More... | |
The current implementation supports 1, 2, and 3 dimensional histograms with real-valued data (no integer data yet). For each dimension a range (lowB - highB) and a number of bins has to be specified (typically highB - lowB + 1 to get a binWidth of 1). The number of bins in a given dimension is known as the dimensionSize. The width of a bin is defined as (highB - lowB) / (nBins - 1). The first bin goes from lowB to lowB + binWidth, the last bin from highB to highB + binWidth.
CHANGED: JMG CdB
      
  | 
  
| 
 Construct an empty histogram. 
 
 00073                          : _data(0)
00074 {
00075 }
 | 
  
      
  | 
  
| 
 Copy constructor. 
 
 00077 : _data(rhs._data) 00078 { 00079 }  | 
  
      
  | 
  
| 
 Construct a 1D histogram with a range from 0 to dimSize - 1 and a binWidth of 1. 
 
 00082 {
00083     _data = new HxHistogramData(REAL_VALUE, 1,
00084                                 0, dimSize - 1, dimSize,
00085                                 0, 0, 0,
00086                                 0, 0, 0);
00087 }
 | 
  
      
  | 
  ||||||||||||
| 
 Construct a 2D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension. 
 
 00090 {
00091     _data = new HxHistogramData(REAL_VALUE, 2,
00092                                 0, dimSize1 - 1, dimSize1,
00093                                 0, dimSize2 - 1, dimSize2,
00094                                 0, 0, 0);
00095 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Construct a 3D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension. 
 
 00098 {
00099     _data = new HxHistogramData(REAL_VALUE, 3,
00100                                 0, dimSize1 - 1, dimSize1,
00101                                 0, dimSize2 - 1, dimSize2,
00102                                 0, dimSize3 - 1, dimSize3);
00103 }
 | 
  
      
  | 
  ||||||||||||||||||||||||
| 
 Construct Histogram with given data type and number of dimensions. The range in a dimension is 0 to dimSize - 1, the binWidth is 1. 
 00107 {
00108     _data = new HxHistogramData(dataType, dimensions,
00109                                 0, dimSize1 - 1, dimSize1,
00110                                 0, dimSize2 - 1, dimSize2,
00111                                 0, dimSize3 - 1, dimSize3);
00112 }
 | 
  
      
  | 
  ||||||||||||||||||||||||||||||||||||||||||||||||
| 
 Construct a Histogram with given parameters. If dataType == INT\_VALUE parameters are casted. 
 00118 {
00119     _data = new HxHistogramData(dataType, dimensions,
00120                                 lowBin1, highBin1, nBins1,
00121                                 lowBin2, highBin2, nBins2,
00122                                 lowBin3, highBin3, nBins3);
00123 }
 | 
  
      
  | 
  
| 
 Read a Histogram from disk. 
 
 00130 {
00131     HxString name;
00132     FILE *fp;
00133     IOHEADER header;
00134 
00135     name = filename + ".hst";
00136 
00137     fp = fopen(name.c_str(), "rb");
00138     if (!fp)
00139         _data = 0;
00140     else {
00141         fread(&header, sizeof(header), 1, fp);
00142 
00143         _data = new HxHistogramData(header.dataType, header.dimensions,
00144                             header.lowBin1, header.highBin1, header.nBins1,
00145                             header.lowBin2, header.highBin2, header.nBins2,
00146                             header.lowBin3, header.highBin3, header.nBins3);
00147 
00148         if (_data->_dataType == REAL_VALUE)
00149             fread(_data->_bins.realValue, _data->_totSize,
00150                 sizeof(*(_data->_bins.realValue)), fp);
00151         else
00152             fread(_data->_bins.intValue, _data->_totSize,
00153                 sizeof(*(_data->_bins.intValue)), fp);
00154         fclose(fp);
00155     }
00156 }
 | 
  
      
  | 
  
| 
 Destructor. 
 
 00159 {
00160 }
 | 
  
      
  | 
  
| 
 Assignment operator. 
 
 00171 {
00172     _data = rhs._data;
00173     return *this;
00174 }
 | 
  
      
  | 
  
| 
 Indicates wether this is a valid histogram. 
 
 00178 { 
00179     return _data ? 0 : 1; 
00180 }
 | 
  
      
  | 
  
| 
 Indicates wether this is a valid histogram. 
 
 00184 { 
00185     return _data ? 1 : 0; 
00186 }
 | 
  
      
  | 
  
| 
 The unique identifier of the histogram. 
 
 00190 { 
00191     return _data ? _data->_id : 0 ; 
00192 }
 | 
  
      
  | 
  
| 
 The data value type. Either INT\_VALUE or REAL\_VALUE. 
 00196 {
00197     return _data ? _data->_dataType : INT_VALUE;
00198 }
 | 
  
      
  | 
  
| 
 The number of dimensions of the histogram. 
 
 00202 {
00203     return _data ? _data->_nDims : 0;
00204 }
 | 
  
      
  | 
  
| 
 The size of the histogram in the i-th dimension. The first dimension has i = 1. 
 00208 {
00209     if (!_data)
00210         return 0;
00211     switch (dim) {
00212     case 1: return _data->_dimSize1;
00213     case 2: return _data->_dimSize2;
00214     case 3: return _data->_dimSize3;
00215     }
00216     return 0;
00217 }
 | 
  
      
  | 
  
| 
 The total size of the histogram. 
 
 00221 {
00222     if (!_data)
00223         return 0;
00224     return _data->_totSize;
00225 }
 | 
  
      
  | 
  
| 
 The lowest bin in the i-th dimension. 
 
 00229 {
00230     if (!_data)
00231         return 0;
00232     switch (dim) {
00233     case 1: return _data->_lowBin1;
00234     case 2: return _data->_lowBin2;
00235     case 3: return _data->_lowBin3;
00236     }
00237     return 0;
00238 }
 | 
  
      
  | 
  
| 
 The highest bin in the i-th dimension. 
 
 00242 {
00243     if (!_data)
00244         return 0;
00245     switch (dim) {
00246     case 1: return _data->_highBin1;
00247     case 2: return _data->_highBin2;
00248     case 3: return _data->_highBin3;
00249     }
00250     return 0;
00251 }
 | 
  
      
  | 
  
| 
 The bin width in the i-th dimension. 
 
 00255 {
00256     if (!_data)
00257         return 0;
00258     switch (dim) {
00259     case 1: return _data->_binWidth1;
00260     case 2: return _data->_binWidth2;
00261     case 3: return _data->_binWidth3;
00262     }
00263     return 0;
00264 }
 | 
  
      
  | 
  ||||||||||||
| 
 Translate bin to value. 
 
 00268 {
00269     if (!_data)
00270         return 0;
00271     switch (dimension) {
00272     case 1: return (bin+0.5) * _data->_binWidth1 + _data->_lowBin1;
00273     case 2: return (bin+0.5) * _data->_binWidth2 + _data->_lowBin2;
00274     case 3: return (bin+0.5) * _data->_binWidth3 + _data->_lowBin3;
00275     }
00276     return 0;
00277 }
 | 
  
      
  | 
  ||||||||||||
| 
 Translate value to bin. 
 
 00568 {
00569     if (!_data)
00570         return -1;
00571     switch (dimension) {
00572     case 1: return (int) ((val - _data->_lowRange1) * _data->_binFac1);
00573     case 2: return (int) ((val - _data->_lowRange2) * _data->_binFac2);
00574     case 3: return (int) ((val - _data->_lowRange3) * _data->_binFac3);
00575     }
00576     return -1;
00577 }
 | 
  
      
  | 
  
| 
 Translate value to bin for 1D case. 
 
 00581 {
00582     if (!_data)
00583         return -1;
00584     return (int) ((val - _data->_lowRange1) * _data->_binFac1);
00585 }
 | 
  
      
  | 
  
| 
 clip a bin index into the histogram [0:nrbins-1]. 
 
  | 
  
      
  | 
  
| 
 Get the number of elements in the given bin. 
 
 00474 {
00475     return _data ? _data->getBin(bin1) : 0;
00476 }
 | 
  
      
  | 
  ||||||||||||
| 
 Get the number of elements in the given bin. 
 
 00480 {
00481     return _data ? _data->getBin(bin2 * _data->_dimSize1 + bin1) : 0;
00482 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Get the number of elements in the given bin. 
 
 00486 {
00487     return _data ? _data->getBin((bin3 * _data->_dimSize2 + bin2) *
00488                                 _data->_dimSize1 + bin1) : 0;
00489 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
 00281 {
00282     if (_data && (_data->_nDims == 1))    
00283     {
00284         int bin = (int) ((val - _data->_lowRange1) * _data->_binFac1);
00285         if (bin >= _data->_dimSize1)
00286         {
00287             if (val==_data->_highBin1)
00288                 bin=_data->_dimSize1-1;
00289             else
00290                 return; // out of range, don't do anything
00291         }
00292         incBinChecked(bin);
00293     }
00294 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
 00298 {
00299     if (_data && (_data->_nDims == 1))
00300     {
00301         int bin = (int) ((val - _data->_lowRange1) * _data->_binFac1);
00302         if (bin >= _data->_dimSize1)
00303         {
00304             if (val==_data->_highBin1)
00305                 bin=_data->_dimSize1-1;
00306             else
00307                 return; // out of range, don't do anything
00308         }
00309         incBinChecked(bin);
00310     }
00311 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
 00315 {
00316     if (_data && (_data->_nDims == 1))
00317     {
00318         int bin = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00319         if (bin >= _data->_dimSize1)
00320         {
00321             if (val.x()==_data->_highBin1)
00322                 bin=_data->_dimSize1-1;
00323             else
00324                 return; // out of range, don't do anything
00325         }
00326         incBinChecked(bin);
00327     }
00328 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
 00332 {
00333     if (_data && (_data->_nDims == 1))
00334     {
00335         int bin = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00336         if (bin >= _data->_dimSize1)
00337         {
00338             if (val.x()==_data->_highBin1)
00339                 bin=_data->_dimSize1-1;
00340             else
00341                 return; // out of range, don't do anything
00342         }
00343         incBinChecked(bin);
00344     }
00345 }
 | 
  
      
  | 
  
| 
 Insert value in 2D histogram. 
 
 00349 {
00350     if (_data && (_data->_nDims == 2))
00351     {
00352         int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00353         if (bin1 >= _data->_dimSize1)
00354         {
00355             if (val.x()==_data->_highBin1)
00356                 bin1=_data->_dimSize1-1;
00357             else
00358                 return; // out of range, don't do anything
00359         }
00360         int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00361         if (bin2 >= _data->_dimSize2)
00362         {
00363             if (val.y()==_data->_highBin2)
00364                 bin2=_data->_dimSize2-1;
00365             else
00366                 return; // out of range, don't do anything
00367         }
00368         incBinChecked(bin1,bin2);
00369     }
00370 }
 | 
  
      
  | 
  
| 
 Insert value in 2D histogram. 
 
 00374 {
00375     if (_data && (_data->_nDims == 2))
00376     {
00377         int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00378         if (bin1 >= _data->_dimSize1)
00379         {
00380             if (val.x()==_data->_highBin1)
00381                 bin1=_data->_dimSize1-1;
00382             else
00383                 return; // out of range, don't do anything
00384         }
00385         int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00386         if (bin2 >= _data->_dimSize2)
00387         {
00388             if (val.y()==_data->_highBin2)
00389                 bin2=_data->_dimSize2-1;
00390             else
00391                 return; // out of range, don't do anything
00392         }
00393         incBinChecked(bin1,bin2);
00394     }
00395 }
 | 
  
      
  | 
  
| 
 Insert value in 3D histogram. 
 
 00399 {
00400     if (_data && (_data->_nDims == 3))
00401     {
00402         int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00403         if (bin1 >= _data->_dimSize1)
00404         {
00405             if (val.x()==_data->_highBin1)
00406                 bin1=_data->_dimSize1-1;
00407             else
00408                 return; // out of range, don't do anything
00409         }
00410         int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00411         if (bin2 >= _data->_dimSize2)
00412         {
00413             if (val.y()==_data->_highBin2)
00414                 bin2=_data->_dimSize2-1;
00415             else
00416                 return; // out of range, don't do anything
00417         }
00418         int bin3 = (int) ((val.z() - _data->_lowRange3) * _data->_binFac3);
00419         if (bin3 >= _data->_dimSize3)
00420         {
00421             if (val.z()==_data->_highBin3)
00422                 bin3=_data->_dimSize3-1;
00423             else
00424                 return; // out of range, don't do anything
00425         }
00426         incBin(bin1,bin2,bin3);
00427     }
00428 }
 | 
  
      
  | 
  
| 
 Insert value in 3D histogram. 
 
 00432 {
00433     if (_data && (_data->_nDims == 3))
00434     {
00435         int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00436         if (bin1 >= _data->_dimSize1)
00437         {
00438             if (val.x()==_data->_highBin1)
00439                 bin1=_data->_dimSize1-1;
00440             else
00441                 return; // out of range, don't do anything
00442         }
00443         int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00444         if (bin2 >= _data->_dimSize2)
00445         {
00446             if (val.y()==_data->_highBin2)
00447                 bin2=_data->_dimSize2-1;
00448             else
00449                 return; // out of range, don't do anything
00450         }
00451         int bin3 = (int) ((val.z() - _data->_lowRange3) * _data->_binFac3);
00452         if (bin3 >= _data->_dimSize3)
00453         {
00454             if (val.z()==_data->_highBin3)
00455                 bin3=_data->_dimSize3-1;
00456             else
00457                 return; // out of range, don't do anything
00458         }
00459         incBin(bin1,bin2,bin3);
00460     }
00461 }
 | 
  
      
  | 
  
| 
 Increment the given bin. Checks whether this is a 1D histogram and preserves reference count. Values outside the histogram range are ignored. 
 00465 {
00466     if (_data) {
00467         if ((_data->_nDims == 1) &&
00468                 (bin >= 0) && (bin < _data->_dimSize1)) {
00469             _data->getUnshared();
00470             _data->incBin(bin);
00471         }
00472     }
00473 }
 | 
  
      
  | 
  ||||||||||||
| 
 Increment the given bin. Checks whether this is a 2D histogram and preserves reference count. Values outside the histogram range are ignored. 
 00477 {
00478     if (_data) {
00479         if ((_data->_nDims == 2) &&
00480                 (bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00481                 (bin2 >= 0) && (bin2 < _data->_dimSize2)) {
00482             _data->getUnshared();
00483             _data->incBin(bin2 * _data->_dimSize1 + bin1);
00484         }
00485     }
00486 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Increment the given bin. Checks whether this is a 3D histogram and preserves reference count. Values outside the histogram range are ignored. 
 00490 {
00491     if (_data) {
00492         if ((_data->_nDims == 3) &&
00493                 (bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00494                 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00495                 (bin3 >= 0) && (bin3 < _data->_dimSize3)) {
00496             _data->getUnshared();
00497             _data->incBin((bin3 * _data->_dimSize2 + bin2) *
00498                          _data->_dimSize1 + bin1);
00499         }
00500     }
00501 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
 00596 {
00597     incBin(clipBin(valueToBin((double) val)));
00598 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
 00602 {
00603     incBin(clipBin(valueToBin(val)));
00604 }
 | 
  
      
  | 
  ||||||||||||
| 
 Kernel Density Estimator. 
 
 00506 {
00507     if (!_data || (_data->_dataType != REAL_VALUE))
00508         return;
00509 
00510     double ori = (val - _data->_lowBin1) / _data->_binWidth1;
00511     double s = sigma/_data->_binWidth1;
00512     double t, sat;
00513 
00514     int binmin = (int) (ori-3*s+0.5);
00515     int binmax = (int) (ori+3*s+0.5);
00516     int bin;
00517 
00518     if (binmin < 0)
00519         binmin = 0;
00520 
00521     /* gaussian mass left outside kernel */
00522     t = (ori-binmin+0.5)/(sqrt(2.0)*s);
00523 
00524     sat = erfc(t)*0.5;
00525 
00526     _data->_bins.realValue[binmin ? binmin-1 : 0] += sat;
00527 
00528     if (binmax >= _data->_dimSize1)
00529         binmax = _data->_dimSize1-1;
00530 
00531     /* gaussian mass right outside kernel */
00532     t = (binmax-ori+0.5)/(sqrt(2.0)*s);
00533 
00534     sat = erfc(t)*0.5;
00535 
00536     _data->_bins.realValue[binmax < _data->_dimSize1-1 ? binmax+1 : binmax]
00537         += sat;
00538 
00539     double a = 1./(sqrt(2*M_PI)*s);
00540     double b = -0.5/(s*s);
00541 
00542     for (bin=binmin; bin<=binmax; bin++) {
00543         double v = bin-ori;
00544         _data->_bins.realValue[bin] += a*exp(b*v*v);
00545     }
00546 }
 | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
  | 
  
      
  | 
  
| 
 Insert value in 1D histogram. 
 
  | 
  
      
  | 
  
| 
 Insert value in 2D histogram. 
 
 00622 {
00623     int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00624     if (bin1 >= _data->_dimSize1)
00625     {
00626         if (val.x()==_data->_highBin1)
00627             bin1=_data->_dimSize1-1;
00628         else
00629             return; // out of range, don't do anything
00630     }
00631     int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00632     if (bin2 >= _data->_dimSize2)
00633     {
00634         if (val.y()==_data->_highBin2)
00635             bin2=_data->_dimSize2-1;
00636         else
00637             return; // out of range, don't do anything
00638     }
00639     incBin(bin1,bin2);      
00640 }
 | 
  
      
  | 
  
| 
 Insert value in 2D histogram. 
 
 00644 {
00645     int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00646     if (bin1 >= _data->_dimSize1)
00647     {
00648         if (val.x()==_data->_highBin1)
00649             bin1=_data->_dimSize1-1;
00650         else
00651             return; // out of range, don't do anything
00652     }
00653     int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00654     if (bin2 >= _data->_dimSize2)
00655     {
00656         if (val.y()==_data->_highBin2)
00657             bin2=_data->_dimSize2-1;
00658         else
00659             return; // out of range, don't do anything
00660     }
00661     incBin(bin1,bin2);
00662 }
 | 
  
      
  | 
  
| 
 Insert value in 3D histogram. 
 
 00666 {
00667     int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00668     if (bin1 >= _data->_dimSize1)
00669     {
00670         if (val.x()==_data->_highBin1)
00671             bin1=_data->_dimSize1-1;
00672         else
00673             return; // out of range, don't do anything
00674     }
00675     int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00676     if (bin2 >= _data->_dimSize2)
00677     {
00678         if (val.y()==_data->_highBin2)
00679             bin2=_data->_dimSize2-1;
00680         else
00681             return; // out of range, don't do anything
00682     }
00683     int bin3 = (int) ((val.z() - _data->_lowRange3) * _data->_binFac3);
00684     if (bin3 >= _data->_dimSize3)
00685     {
00686         if (val.z()==_data->_highBin3)
00687             bin3=_data->_dimSize3-1;
00688         else
00689             return; // out of range, don't do anything
00690     }
00691     incBin(bin1,bin2,bin3);
00692 }
 | 
  
      
  | 
  
| 
 Insert value in 3D histogram. 
 
 00696 {
00697     int bin1 = (int) ((val.x() - _data->_lowRange1) * _data->_binFac1);
00698     if (bin1 >= _data->_dimSize1)
00699     {
00700         if (val.x()==_data->_highBin1)
00701             bin1=_data->_dimSize1-1;
00702         else
00703             return; // out of range, don't do anything
00704     }
00705     int bin2 = (int) ((val.y() - _data->_lowRange2) * _data->_binFac2);
00706     if (bin2 >= _data->_dimSize2)
00707     {
00708         if (val.y()==_data->_highBin2)
00709             bin2=_data->_dimSize2-1;
00710         else
00711             return; // out of range, don't do anything
00712     }
00713     int bin3 = (int) ((val.z() - _data->_lowRange3) * _data->_binFac3);
00714     if (bin3 >= _data->_dimSize3)
00715     {
00716         if (val.z()==_data->_highBin3)
00717             bin3=_data->_dimSize3-1;
00718         else
00719             return; // out of range, don't do anything
00720     }
00721     incBin(bin1,bin2,bin3);
00722 }
 | 
  
      
  | 
  
| 
 Increment the given bin (assumes 1D histogram). Values outside the histogram range are ignored. 
 00493 {
00494     if ((bin >= 0) && (bin < _data->_dimSize1))
00495         _data->incBin(bin);
00496 }
 | 
  
      
  | 
  ||||||||||||
| 
 Increment the given bin (assumes 2D histogram). Values outside the histogram range are ignored. 
 00500 {
00501     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00502             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00503         _data->incBin(bin2 * _data->_dimSize1 + bin1);
00504 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Increment the given bin (assumes 3D histogram). Values outside the histogram range are ignored. 
 00508 {
00509     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00510             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00511             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00512         _data->incBin((bin3 * _data->_dimSize2 + bin2) *
00513                      _data->_dimSize1 + bin1);
00514 }
 | 
  
      
  | 
  ||||||||||||
| 
 Reset the value of the given bin to val (assumes 1D histogram). Values outside the histogram range are ignored. 
 00518 {
00519     if ((bin1 >= 0) && (bin1 < _data->_dimSize1))           
00520         _data->setBin(bin1, val);
00521 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Reset the value of the given bin to val (assumes 2D histogram). Values outside the histogram range are ignored. 
 00525 {
00526     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00527             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00528         _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00529 }
 | 
  
      
  | 
  ||||||||||||||||||||
| 
 Reset the value of the given bin to val (assumes 3D histogram). Values outside the histogram range are ignored. 
 00533 {
00534     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00535             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00536             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00537         _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00538                      _data->_dimSize1 + bin1, val);
00539 }
 | 
  
      
  | 
  ||||||||||||
| 
 Reset the value of the given bin to val (assumes 1D histogram). Values outside the histogram range are ignored. 
 00543 {
00544     if ((bin1 >= 0) && (bin1 < _data->_dimSize1))           
00545         _data->setBin(bin1, val);
00546 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Reset the value of the given bin to val (assumes 2D histogram). Values outside the histogram range are ignored. 
 00550 {
00551     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00552             (bin2 >= 0) && (bin2 < _data->_dimSize2))
00553         _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00554 }
 | 
  
      
  | 
  ||||||||||||||||||||
| 
 Reset the value of the given bin to val (assumes 3D histogram). Values outside the histogram range are ignored. 
 00558 {
00559     if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00560             (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00561             (bin3 >= 0) && (bin3 < _data->_dimSize3))
00562         _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00563                      _data->_dimSize1 + bin1, val);
00564 }
 | 
  
      
  | 
  
| 
 Smooth histogram data. 
 
 00550 {
00551     if (!_data)
00552         return HxHistogram();
00553 
00554     GaussIIR g(sigma);
00555     HxHistogramData *data = new HxHistogramData(REAL_VALUE, *_data);
00556 
00557     /* for now only works for 1D histogram */
00558     /* will be fixed when image processing works on sampled density fields */
00559     /* instead of HxImageRep only... */
00560 
00561 #ifndef _DEBUG
00562     g.lineFilter(data->_bins.realValue, data->_totSize);
00563 #endif
00564 
00565     return HxHistogram(data);
00566 }
 | 
  
      
  | 
  
| 
 Get histogram modes. 
 
 00608 {
00609     HxHistogramData *data = (_data->_dataType != REAL_VALUE) ?
00610         new HxHistogramData(REAL_VALUE, *_data) : _data.pointee();
00611 
00612 
00613 
00614     /* for now only works for 1D histogram */
00615     /* will be fixed when image processing works on sampled density fields */
00616     /* instead of HxImageRep only... */
00617     /* then, see PAMI 22(11), pp. 1318--1323, 2000 */
00618 
00619     data->getUnshared();
00620     std::list<MicrosoftListSortDoesntWork> l;
00621     
00622     /* maxima detection */
00623     double *ptr = data->_bins.realValue;
00624     double max = *ptr++;
00625     int dir = 1;
00626     for (int i=1; i < data->_totSize; i++) {
00627         double val = *ptr++;
00628         double grad = dir ? val-max : max-val;
00629         if (grad <= 0) {
00630             if (dir == 1) // maximum
00631                 l.push_back(MicrosoftListSortDoesntWork(binToValue(i-1,1), max));
00632             // else minimum
00633             dir = dir ? 0 : 1;
00634         }
00635         max = val;
00636     }
00637 
00638     if (data != _data.pointee())
00639         delete data;
00640 
00641     l.sort();
00642     std::list<HxVec2Double> res;
00643     for (std::list<MicrosoftListSortDoesntWork>::iterator it = l.begin();
00644             it != l.end(); it++)
00645         res.push_back(HxVec2Double(*it));
00646 
00647     return res;
00648 }
 | 
  
      
  | 
  
| 
 Normalize histogram data. 
 
 00652 {
00653     if (!_data)
00654         return HxHistogram();
00655     HxHistogramData *data = new HxHistogramData(REAL_VALUE, *_data);
00656 
00657     int n = data->_totSize;
00658     double norm = sum() / weight;
00659     if (fabs(norm) > 0.0)
00660     {
00661         while (--n >= 0)
00662             data->_bins.realValue[n] /= norm;
00663         data->_sum = weight;
00664     }
00665 
00666     return HxHistogram(data);
00667 }
 | 
  
      
  | 
  
| 
 The sum of the histogram. 
 
 00671 {
00672     if (!_data)
00673         return 0;
00674     int n = _data->_totSize;
00675     double s = 0;
00676     if (_data->_dataType == REAL_VALUE)
00677         while (--n >= 0)
00678             s += _data->_bins.realValue[n];
00679     else
00680         while (--n >= 0)
00681             s += _data->_bins.intValue[n];
00682     _data->_sum = s;
00683     return s;
00684 }
 | 
  
      
  | 
  
| 
 The minimum number of elements in the histogram. 
 
 00688 {
00689     if (!_data)
00690         return 0;
00691     int n = _data->_totSize;
00692     double m;
00693     if (_data->_dataType == REAL_VALUE) {
00694         m = _data->_bins.realValue[0];
00695         while (--n >= 0)
00696             if (_data->_bins.realValue[n] < m)
00697                 m = _data->_bins.realValue[n];
00698     }
00699     else {
00700         m = _data->_bins.intValue[0];
00701         while (--n >= 0)
00702             if (_data->_bins.intValue[n] < m)
00703                 m = _data->_bins.intValue[n];
00704     }
00705     return m;
00706 }
 | 
  
      
  | 
  
| 
 The minimum number of elements in the histogram. Index is the number of the bin at which the minimum number is first found. 
 00732 {
00733     if (!_data)
00734         return 0;
00735     int n = _data->_totSize;
00736     double m;
00737     *index = 0;
00738     if (_data->_dataType == REAL_VALUE) {
00739         m = _data->_bins.realValue[0];
00740         while (--n >= 0)
00741             if (_data->_bins.realValue[n] < m) {
00742                 m = _data->_bins.realValue[n];
00743                 *index = n;
00744             }
00745     }
00746     else {
00747         m = _data->_bins.intValue[0];
00748         while (--n >= 0)
00749             if (_data->_bins.intValue[n] < m) {
00750                 m = _data->_bins.intValue[n];
00751                 *index = n;
00752             }
00753     }
00754     return m;
00755 }
 | 
  
      
  | 
  
| 
 The maximum number of elements in the histogram. 
 
 00710 {
00711     if (!_data)
00712         return 0;
00713     int n = _data->_totSize;
00714     double m;
00715     if (_data->_dataType == REAL_VALUE) {
00716         m = _data->_bins.realValue[0];
00717         while (--n >= 0)
00718             if (_data->_bins.realValue[n] > m)
00719                 m = _data->_bins.realValue[n];
00720     }
00721     else {
00722         m = _data->_bins.intValue[0];
00723         while (--n >= 0)
00724             if (_data->_bins.intValue[n] > m)
00725                 m = _data->_bins.intValue[n];
00726     }
00727     return m;
00728 }
 | 
  
      
  | 
  
| 
 The maximum number of elements in the histogram. Index is the number of the bin at which the maximum number is first found. 
 00759 {
00760     if (!_data)
00761         return 0;
00762     int n = _data->_totSize;
00763     double m;
00764     *index = 0;
00765     if (_data->_dataType == REAL_VALUE) {
00766         m = _data->_bins.realValue[0];
00767         while (--n >= 0)
00768             if (_data->_bins.realValue[n] > m) {
00769                 m = _data->_bins.realValue[n];
00770                 *index = n;
00771             }
00772     }
00773     else {
00774         m = _data->_bins.intValue[0];
00775         while (--n >= 0)
00776             if (_data->_bins.intValue[n] > m) {
00777                 m = _data->_bins.intValue[n];
00778                 *index = n;
00779             }
00780     }
00781     return m;
00782 }
 | 
  
      
  | 
  
| 
 Intersection of histograms. 
 
 00806 {
00807     if (!_data)
00808         return 0;
00809     if (!isEqualSize(rhs))
00810         return -1;
00811     int n = _data->_totSize;
00812     double s = 0;
00813     if (_data->_dataType == REAL_VALUE)
00814         if (rhs._data->_dataType == REAL_VALUE)
00815             s = ::intersect(_data->_bins.realValue, rhs._data->_bins.realValue, n);
00816         else
00817             s = ::intersect(_data->_bins.realValue, rhs._data->_bins.intValue, n);
00818     else
00819         if (rhs._data->_dataType == REAL_VALUE)
00820             s = ::intersect(_data->_bins.intValue, rhs._data->_bins.realValue, n);
00821         else
00822             s = ::intersect(_data->_bins.intValue, rhs._data->_bins.intValue, n);
00823 
00824     return s;
00825 }
 | 
  
      
  | 
  
| 
 Chi square intersection of histograms. 
 
 00843 {
00844     if (!_data)
00845         return 0;
00846     if (!isEqualSize(rhs))
00847         return -1;
00848     int n = _data->_totSize;
00849     double s = 0;
00850     if (_data->_dataType == REAL_VALUE)
00851         if (rhs._data->_dataType == REAL_VALUE)
00852             s = ::chiSq(_data->_bins.realValue, rhs._data->_bins.realValue, n);
00853         else
00854             s = ::chiSq(_data->_bins.realValue, rhs._data->_bins.intValue, n);
00855     else
00856         if (rhs._data->_dataType == REAL_VALUE)
00857             s = ::chiSq(_data->_bins.intValue, rhs._data->_bins.realValue, n);
00858         else
00859             s = ::chiSq(_data->_bins.intValue, rhs._data->_bins.intValue, n);
00860     return s;
00861 }
 | 
  
      
  | 
  
| 
 Normalized chi square intersection of histograms. 
 
 00880 {
00881     if (!_data)
00882         return 0;
00883     if (!isEqualSize(rhs))
00884         return -1;
00885     int n = _data->_totSize;
00886     double s = 0;
00887     if (_data->_dataType == REAL_VALUE)
00888         if (rhs._data->_dataType == REAL_VALUE)
00889             s = ::chiSqNorm(_data->_bins.realValue, rhs._data->_bins.realValue, n);
00890         else
00891             s = ::chiSqNorm(_data->_bins.realValue, rhs._data->_bins.intValue, n);
00892     else
00893         if (rhs._data->_dataType == REAL_VALUE)
00894             s = ::chiSqNorm(_data->_bins.intValue, rhs._data->_bins.realValue, n);
00895         else
00896             s = ::chiSqNorm(_data->_bins.intValue, rhs._data->_bins.intValue, n);
00897     return s;
00898 }
 | 
  
      
  | 
  
| 
 convert dataType. 
 
 00164 {
00165     HxHistogramData *data = new HxHistogramData(*_data);
00166     return HxHistogram(data);
00167 }
 | 
  
      
  | 
  ||||||||||||
| 
 Fill the externally allocated buffer with data from this histogram. The pointer to x represents the bin value, y the bin count. 
 00902 {
00903     if (!_data)
00904         return;
00905 
00906     int n = 0;
00907     if (_data->_dataType == REAL_VALUE)
00908         for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) {
00909             x[n] = binToValue(dim1,1);
00910             y[n] = _data->_bins.realValue[dim1];
00911             n++;
00912         }
00913     else
00914         for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) {
00915             x[n] = binToValue(dim1,1);
00916             y[n] = _data->_bins.intValue[dim1];
00917             n++;
00918         }
00919 }
 | 
  
      
  | 
  ||||||||||||||||
| 
 Fill the externally allocated buffer with data from this histogram. The pointer to x1,x2 represents the bin value, y the bin count. 
 00923 {
00924     if (!_data)
00925         return;
00926 
00927     int n = 0;
00928     if (_data->_dataType == REAL_VALUE)
00929         for (int dim2=0 ; dim2<dimensionSize(2) ; dim2++) {
00930             for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) {
00931                 x1[n] = binToValue(dim1,1);
00932                 x2[n] = binToValue(dim2,2);
00933                 y[n] = _data->_bins.realValue[dim2 * _data->_dimSize1
00934                            + dim1];
00935                 n++;
00936             }
00937         }
00938     else
00939         for (int dim2=0 ; dim2<dimensionSize(2) ; dim2++) {
00940             for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) {
00941                 x1[n] = binToValue(dim1,1);
00942                 x2[n] = binToValue(dim2,2);
00943                 y[n] = _data->_bins.intValue[dim2 * _data->_dimSize1
00944                            + dim1];
00945                 n++;
00946             }
00947         }
00948 }
 | 
  
      
  | 
  ||||||||||||||||||||
| 
 Fill the externally allocated buffer with data from this histogram. The pointer to x1,x2,x3 represents the bin value, y the bin count. 
 00952 {
00953     if (!_data)
00954         return;
00955 
00956     int n = 0;
00957     if (_data->_dataType == REAL_VALUE)
00958         for (int dim3=0 ; dim3<dimensionSize(3) ; dim3++) {
00959             for (int dim2=0 ; dim2<dimensionSize(2) ; dim2++) {
00960                 for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) {
00961                     x1[n] = binToValue(dim1,1);
00962                     x2[n] = binToValue(dim2,2);
00963                     x3[n] = binToValue(dim3,3);
00964                     y[n] = _data->_bins.realValue[(dim3 * _data->_dimSize2
00965                                 + dim2) * _data->_dimSize1 + dim1];
00966                     n++;
00967                 }
00968             }
00969         }
00970     else
00971         for (int dim3=0 ; dim3<dimensionSize(3) ; dim3++) {
00972             for (int dim2=0 ; dim2<dimensionSize(2) ; dim2++) {
00973                 for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) {
00974                     x1[n] = binToValue(dim1,1);
00975                     x2[n] = binToValue(dim2,2);
00976                     x3[n] = binToValue(dim3,3);
00977                     y[n] = _data->_bins.intValue[(dim3 * _data->_dimSize2
00978                                 + dim2) * _data->_dimSize1 + dim1];
00979                     n++;
00980                 }
00981             }
00982         }
00983 }
 | 
  
      
  | 
  
| 
 Fill the externally allocated buffer with data from this histogram. 
 
 00987 {
00988     if (!_data)
00989         return;
00990     int n = _data->_totSize;
00991     if (_data->_dataType == REAL_VALUE)
00992         while (--n >= 0)
00993             data[n] = _data->_bins.realValue[n];
00994     else
00995         while (--n >= 0)
00996             data[n] = _data->_bins.intValue[n];
00997 }
 | 
  
      
  | 
  
| 
 Fill the externally allocated buffer with data from this histogram. 
 
 01001 {
01002     if (!_data)
01003         return;
01004     int n = _data->_totSize;
01005     if (_data->_dataType == REAL_VALUE)
01006         while (--n >= 0)
01007             data[n] = (int)(_data->_bins.realValue[n] + 0.5);
01008     else
01009         while (--n >= 0)
01010             data[n] = _data->_bins.intValue[n];
01011 }
 | 
  
      
  | 
  ||||||||||||||||||||||||||||
| 
 Assume the histogram is a 3d rgb cube and render it for display in Java in the externally allocated data buffer. 
 
 01088 {
01089     if (!_data)
01090         return;
01091     /*
01092     el = (elevation * M_PI) / 180.;
01093     al = (alpha * M_PI) / 180.;
01094     cosa = cos(al);
01095     sina = sin(al);
01096     cose = cos(el);
01097     sine = sin(el);
01098     dataW = dataWidth;
01099     xMin = 190; //for 3D histo
01100     yMax = 190; //255;
01101     */
01102     double el = (elevation * M_PI) / 180.;
01103     double al = (alpha * M_PI) / 180.;
01104     double cosa = cos(al);
01105     double sina = sin(al);
01106     double cose = cos(el);
01107     double sine = sin(el);
01108     int dataW = dataWidth;
01109     int xMin = 190; //for 3D histo
01110     int yMax = 190; //255;
01111     drawAxis(data,cosa,sina,cose,sine,dataW);
01112 
01113     int n = 0;
01114 
01115     if (_data->_dataType == REAL_VALUE) {
01116         for (int b=0 ; b < _data->_dimSize3 ; b++) {
01117             for (int g=0 ; g < _data->_dimSize2 ; g++) {
01118                 for (int r=0 ; r < _data->_dimSize1 ; r++) {
01119                     if (_data->_bins.realValue[n] > threshold) {
01120                         /*
01121                           Doen't work if hist range unequals 0..255
01122                         double rV = r * _data->_binWidth1 + _data->_lowBin1;
01123                         double gV = g * _data->_binWidth2 + _data->_lowBin2;
01124                         double bV = b * _data->_binWidth3 + _data->_lowBin3;
01125                         */
01126                         double rV = r * 255./(_data->_dimSize1-1);
01127                         double gV = g * 255./(_data->_dimSize2-1);
01128                         double bV = b * 255./(_data->_dimSize3-1);
01129                         setPixelV(data, transf3Dto2D(rV,gV,bV,cosa,sina,cose,sine), HxVec3Int(rV,gV,bV), dataW);
01130                     }
01131                     n++;
01132                 }
01133             }
01134         }
01135     }
01136     else {
01137         for (int b=0 ; b < _data->_dimSize3 ; b++) {
01138             for (int g=0 ; g < _data->_dimSize2 ; g++) {
01139                 for (int r=0 ; r < _data->_dimSize1 ; r++) {
01140                     if (_data->_bins.intValue[n] > threshold) {
01141                         /*
01142                           Doen't work if hist range unequals 0..255
01143                         double rV = r * _data->_binWidth1 + _data->_lowBin1;
01144                         double gV = g * _data->_binWidth2 + _data->_lowBin2;
01145                         double bV = b * _data->_binWidth3 + _data->_lowBin3;
01146                         */
01147                         double rV = r * 255./(_data->_dimSize1-1);
01148                         double gV = g * 255./(_data->_dimSize2-1);
01149                         double bV = b * 255./(_data->_dimSize3-1);
01150                         setPixelV(data, transf3Dto2D(rV,gV,bV,cosa,sina,cose,sine), HxVec3Int(rV,gV,bV), dataW);
01151                     }
01152                     n++;
01153                 }
01154             }
01155         }
01156     }
01157 }
 | 
  
      
  | 
  ||||||||||||
| 
 Print histogram data in the given stream. 
 
 01161 {
01162     if (!_data)
01163         return os << "HxHistogram(null)" << STD_ENDL;
01164 
01165     int dim1, dim2, dim3;
01166     if (_data->_dataType == REAL_VALUE)
01167         switch (dimensionality()) {
01168         case 1:
01169             for (dim1=0 ; dim1<dimensionSize(1) ; dim1++)
01170                 os << binToValue(dim1,1) << delimit <<
01171                    float(_data->_bins.realValue[dim1]) << STD_ENDL;
01172             break;
01173         case 2:
01174             for (dim2=0 ; dim2<dimensionSize(2) ; dim2++) 
01175                 for (dim1=0 ; dim1<dimensionSize(1) ; dim1++)
01176                     os << binToValue(dim1,1) << delimit <<
01177                        binToValue(dim2,2) << delimit <<
01178                        float(_data->_bins.realValue[dim2 * _data->_dimSize1
01179                            + dim1]) << STD_ENDL;
01180             break;
01181         case 3:
01182             for (dim3=0; dim3<dimensionSize(3) ; dim3++) 
01183                 for (dim2=0 ; dim2<dimensionSize(2) ; dim2++) 
01184                     for (dim1=0 ; dim1<dimensionSize(1) ; dim1++)
01185                         os << binToValue(dim1,1) << delimit <<
01186                            binToValue(dim2,2) << delimit <<
01187                            binToValue(dim3,3) << delimit <<
01188                            float(_data->_bins.realValue[(dim3 * _data->_dimSize2
01189                                 + dim2) * _data->_dimSize1 + dim1]) << STD_ENDL;
01190             break;
01191         }
01192     else
01193         switch (dimensionality()) {
01194         case 1:
01195             for (dim1=0 ; dim1<dimensionSize(1) ; dim1++)
01196                 os << binToValue(dim1,1) << delimit <<
01197                    _data->_bins.intValue[dim1] << STD_ENDL;
01198             break;
01199         case 2:
01200             for (dim2=0 ; dim2<dimensionSize(2) ; dim2++) 
01201                 for (dim1=0 ; dim1<dimensionSize(1) ; dim1++)
01202                     os << binToValue(dim1,1) << delimit <<
01203                        binToValue(dim2,2) << delimit <<
01204                        _data->_bins.intValue[dim2 * _data->_dimSize1
01205                            + dim1] << STD_ENDL;
01206             break;
01207         case 3:
01208             for (dim3=0; dim3<dimensionSize(3) ; dim3++) 
01209                 for (dim2=0 ; dim2<dimensionSize(2) ; dim2++) 
01210                     for (dim1=0 ; dim1<dimensionSize(1) ; dim1++)
01211                         os << binToValue(dim1,1) << delimit <<
01212                            binToValue(dim2,2) << delimit <<
01213                            binToValue(dim3,3) << delimit <<
01214                            _data->_bins.intValue[(dim3 * _data->_dimSize2
01215                                 + dim2) * _data->_dimSize1 + dim1] << STD_ENDL;
01216             break;
01217         }
01218     return os;
01219 }
 | 
  
      
  | 
  
| 
 Write histogram to disk. 
 
 01238 {
01239     HxString name;
01240     FILE *fp;
01241     IOHEADER header;
01242 
01243     if (!_data)
01244         return 0;
01245     
01246     name = filename + ".hst";
01247 
01248     fp = fopen(name.c_str(), "wb");
01249     if (!fp)
01250         return 0;
01251 
01252     header.dataType = _data->_dataType;
01253     header.dimensions = _data->_nDims;
01254     header.lowBin1 = _data->_lowBin1;
01255     header.highBin1 = _data->_highBin1;
01256     header.nBins1 = _data->_dimSize1;
01257     header.lowBin2 = _data->_lowBin2;
01258     header.highBin2 = _data->_highBin2;
01259     header.nBins2 = _data->_dimSize2;
01260     header.lowBin3 = _data->_lowBin3;
01261     header.highBin3 = _data->_highBin3;
01262     header.nBins3 = _data->_dimSize3;
01263     fwrite(&header, sizeof(header), 1, fp);
01264 
01265     if (_data->_dataType == REAL_VALUE)
01266         fwrite(_data->_bins.realValue, _data->_totSize,
01267             sizeof(*(_data->_bins.realValue)), fp);
01268     else
01269         fwrite(_data->_bins.intValue, _data->_totSize,
01270             sizeof(*(_data->_bins.intValue)), fp);
01271 
01272     fclose(fp);
01273 
01274     return 1;
01275 }
 | 
  
      
  | 
  
| 
 Returns new histogram in which bins with count<=valThreshold are set to 0.0, bins with count>valThreshold keep original value. 
 
 01279 {
01280     if (!_data)
01281         return HxHistogram();
01282     HxHistogramData *data = new HxHistogramData(*_data);
01283 
01284     int n = data->_totSize;
01285 
01286     if (data->_dataType == REAL_VALUE)
01287         while (--n >= 0) {
01288             if (data->_bins.realValue[n]<=valThreshold)
01289                 data->_bins.realValue[n]=0.0;
01290         }
01291     else
01292         while (--n >= 0) {
01293             if (data->_bins.intValue[n]<=valThreshold)
01294                 data->_bins.intValue[n]=0.0;
01295         }
01296     
01297     return HxHistogram(data);
01298 }
 | 
  
      
  | 
  
| 
 Returns number of bins with count>valThreshold. Counts number of non-empty bins by default. 
 01302 {
01303     if (!_data)
01304         return 0;    
01305 
01306     int n = _data->_totSize;    
01307     
01308     int counter=0;
01309 
01310     if (_data->_dataType == REAL_VALUE)
01311         while (--n >= 0) {
01312             if (_data->_bins.realValue[n]>valThreshold)
01313                counter++;
01314         }
01315     else
01316         while (--n >= 0) {
01317             if (_data->_bins.intValue[n]>valThreshold)
01318                counter++;
01319         }
01320     
01321     return counter;
01322 }
 | 
  
      
  | 
  ||||||||||||||||||||||||||||
| 
 Returns new histogram containing given range of bins only. (Including given min and max.) Default value -1 maps to dimensionSize()-1. 
 01328 {
01329     if (!_data)
01330         return HxHistogram();
01331     
01332     // Default value binMax=-1 maps to dimensionSize()-1.
01333     if (binMax1<0)
01334         binMax1=dimensionSize(1)-1;
01335     if (binMax2<0)
01336         binMax2=dimensionSize(2)-1;
01337     if (binMax3<0)
01338         binMax3=dimensionSize(3)-1;
01339 
01340     if (binMin1<0 || binMin2<0 || binMin3<0)
01341     {
01342         STD_CERR << "Error in HxHistogram::reduceRange, minimum smaller than 0." << STD_ENDL;
01343         return HxHistogram();
01344     }
01345 
01346     if (binMax1<binMin1 || binMax2<binMin2 || binMax3<binMin3)
01347     {
01348         STD_CERR << "Error in HxHistogram::reduceRange, minimum higher than maximum." << STD_ENDL;
01349         return HxHistogram();
01350     }
01351 
01352     // Make new histogram for given range
01353     HxHistogram h=HxHistogram(dataType(),dimensionality(),
01354         binToValue(binMin1,1),binToValue(binMax1,1),binMax1-binMin1+1,
01355         binToValue(binMin2,2),binToValue(binMax2,2),binMax2-binMin2+1,
01356         binToValue(binMin3,3),binToValue(binMax3,3),binMax3-binMin3+1);
01357 
01358     if (_data->_dataType == REAL_VALUE) {
01359         for (int z=binMin3; z<=binMax3; z++)
01360             for (int y=binMin2; y<=binMax2; y++)
01361                 for (int x=binMin1; x<=binMax1; x++) {
01362                     int n = ((z-binMin3) * _data->_dimSize2 + (y-binMin2)) *
01363                          _data->_dimSize1 + x-binMin1;
01364                     int m = (z * _data->_dimSize2 + y) *
01365                          _data->_dimSize1 + x;
01366                     h._data->_bins.realValue[n] = _data->_bins.realValue[m];
01367                 }
01368     }
01369     else {
01370         for (int z=binMin3; z<=binMax3; z++)
01371             for (int y=binMin2; y<=binMax2; y++)
01372                 for (int x=binMin1; x<=binMax1; x++) {
01373                     int n = ((z-binMin3) * _data->_dimSize2 + (y-binMin2)) *
01374                          _data->_dimSize1 + x-binMin1;
01375                     int m = (z * _data->_dimSize2 + y) *
01376                          _data->_dimSize1 + x;
01377                     h._data->_bins.intValue[n] = _data->_bins.intValue[m];
01378                 }
01379     }
01380 
01381     return h;
01382 }
 | 
  
      
  | 
  ||||||||||||||||||||||||||||
| 
 Returns new histogram containing given range of values (mapped to bin numbers) only. (Including bins for given min and max.) If min==max, the whole range for that dimension is returned. 
 01387 {
01388     if (binValMin1==binValMax1) {
01389         binValMin1=_data->_lowBin1;
01390         binValMax1=_data->_highBin1;
01391     }
01392     if (binValMin1<_data->_lowBin1)
01393         binValMin1=_data->_lowBin1;
01394     if (binValMax1>_data->_highBin1)
01395         binValMax1=_data->_highBin1;
01396     if (binValMin2==binValMax2) {
01397         binValMin2=_data->_lowBin2;
01398         binValMax2=_data->_highBin2;
01399     }
01400     if (binValMin2<_data->_lowBin2)
01401         binValMin2=_data->_lowBin2;
01402     if (binValMax2>_data->_highBin2)
01403         binValMax2=_data->_highBin2;
01404     if (binValMin3==binValMax3) {
01405         binValMin3=_data->_lowBin3;
01406         binValMax3=_data->_highBin3;
01407     }
01408     if (binValMin3<_data->_lowBin3)
01409         binValMin3=_data->_lowBin3;
01410     if (binValMax3>_data->_highBin3)
01411         binValMax3=_data->_highBin3;
01412     return reduceRange(valueToBin(binValMin1,1),valueToBin(binValMax1,1),
01413         valueToBin(binValMin2,2),valueToBin(binValMax2,2),
01414         valueToBin(binValMin3,3),valueToBin(binValMax3,3));
01415 }
 | 
  
      
  | 
  
| 
 Projects n-dimensional (1<n<=3) histogram on a 1-D histogram for given dimension. 
 
 01420 {
01421     if (dimensionality()<2)
01422     {
01423 //      STD_CERR << "Warning. HxHistogram::to1D, dimensionality is " << dimensionality() << STD_ENDL;       
01424         return *this;
01425     }
01426 
01427     if (dim<1 || dim>3)
01428     {
01429         STD_CERR << "Error. Dimension out of bounds: " << dim << STD_ENDL;      
01430         return HxHistogram();
01431     }
01432 
01433     
01434     HxHistogram result; 
01435     result=HxHistogram(dataType(), 1, 
01436                         lowBin(dim),highBin(dim),dimensionSize(dim),
01437                         0,0,0,
01438                         0,0,0);
01439 
01440     int otherDim1=-1;
01441     int otherDim2=-1;
01442 
01443     if (dim==1)
01444     {
01445         otherDim1=3;
01446         otherDim2=2;
01447     }
01448     if (dim==2)
01449     {
01450         otherDim1=3;
01451         otherDim2=1;
01452     }
01453     if (dim==3)
01454     {
01455         otherDim1=2;
01456         otherDim2=1;
01457     }
01458 
01459     for (int b=0; b<dimensionSize(dim); b++)
01460     {
01461         double total=0;
01462         for (int sb=0; sb<dimensionSize(otherDim1); sb++)
01463             for (int tb=0; tb<dimensionSize(otherDim2); tb++)
01464             {                   
01465                 if (dim==1)
01466                     total+=get(b,tb,sb);
01467                 if (dim==2)
01468                     total+=get(tb,b,sb);
01469                 if (dim==3)
01470                     total+=get(tb,sb,b);
01471             }           
01472         result.setBin(b, total);
01473     }
01474 
01475     return result;
01476 }
 | 
  
1.2.12 written by Dimitri van Heesch,
 © 1997-2001