IMP  2.2.1
The Integrative Modeling Platform
HistogramD.h
Go to the documentation of this file.
1 /**
2  * \file IMP/statistics/HistogramD.h \brief Holds a histogram
3  *
4  * Copyright 2007-2014 IMP Inventors. All rights reserved.
5  *
6  */
7 
8 #ifndef IMPSTATISTICS_HISTOGRAM_D_H
9 #define IMPSTATISTICS_HISTOGRAM_D_H
10 #include <IMP/statistics/statistics_config.h>
11 #include "internal/histogram.h"
13 #include <IMP/algebra/VectorD.h>
15 #include <IMP/algebra/GridD.h>
17 #include <IMP/base_types.h>
18 #include <limits>
19 #include <vector>
20 IMPSTATISTICS_BEGIN_NAMESPACE
21 /** Dynamically build a histogram embedded in D-dimensional space. */
22 template <int D, class Grid = algebra::GridD<
23  D, typename algebra::DenseGridStorageD<D, double>, double,
24  typename algebra::DefaultEmbeddingD<D> > >
26  public:
27  typedef Grid CountGrid;
28  HistogramD() : count_(std::numeric_limits<double>::max()) {}
29  HistogramD(double voxel_size, const algebra::BoundingBoxD<D> &bb)
30  : grid_(voxel_size, bb, 0), count_(0) {}
31  /** Increase the count for the bin that holds a
32  value that is in range for this histogram.*/
33  void add(const algebra::VectorD<D> &x, double weight = 1) {
34  IMP_USAGE_CHECK(count_ != std::numeric_limits<double>::max(),
35  "Using uninitialized histogram");
36  typename CountGrid::ExtendedIndex ei = grid_.get_nearest_extended_index(x);
37  if (grid_.get_has_index(ei)) {
38  grid_[grid_.get_index(ei)] += weight;
39  }
40  count_ += weight;
41  }
42  //! Get the sum of all counts in the histogram.
43  double get_total_count() const { return count_; }
44  HistogramD<D> get_frequencies() const {
45  CountGrid grid(grid_.get_unit_cell()[0], algebra::get_bounding_box(grid_),
46  0);
47  grid_.apply(internal::Frequency<D, Grid>(grid, 1.0 / count_));
48  return HistogramD<D>(grid);
49  }
50  /** Get a histogram that has the pdf value as the value for the bin.*/
52  CountGrid grid(grid_.get_unit_cell()[0], algebra::get_bounding_box(grid_),
53  0);
54  double volume =
55  algebra::get_volume(grid_.get_bounding_box(*grid_.all_indexes_begin()));
56  grid_.apply(internal::Frequency<D, Grid>(grid, 1.0 / (count_ * volume)));
57  return HistogramD<D>(grid);
58  }
59  const CountGrid &get_counts() const { return grid_; }
61  algebra::VectorD<D> zeros(grid_.get_bounding_box().get_corner(0));
62  std::fill(zeros.coordinates_begin(), zeros.coordinates_end(), 0.0);
63  return grid_.apply(internal::Mean<D>(zeros)).mn / count_;
64  }
65  unsigned int get_dimension() const { return grid_.get_dimension(); }
66  algebra::VectorD<D> get_standard_deviation(
67  const algebra::VectorD<D> &mean) const {
68  algebra::VectorD<D> zeros(grid_.get_bounding_box().get_corner(0));
69  std::fill(zeros.coordinates_begin(), zeros.coordinates_end(), 0.0);
70  algebra::VectorD<D> s2 =
71  grid_.apply(internal::Sigma2<D>(mean, zeros)).sigma2;
72  s2 /= count_;
73  for (unsigned int i = 0; i < get_dimension(); ++i) {
74  s2[i] = std::sqrt(s2[i]);
75  }
76  return s2;
77  }
78  algebra::BoundingBoxD<D> get_bounding_box() const {
79  return IMP::algebra::get_bounding_box(grid_);
80  }
81  FloatPair get_minimum_and_maximum() const {
82  return grid_.apply(internal::MinMax<D>()).minmax;
83  }
84 
85  IMP_SHOWABLE_INLINE(HistogramD, out << "count: " << count_);
86 
87  private:
88  HistogramD(const CountGrid &g) : grid_(g), count_(1) {}
89  CountGrid grid_;
90  double count_;
91 };
92 
93 #ifndef IMP_DOXYGEN
94 typedef HistogramD<1> Histogram1D;
95 IMP_VALUES(Histogram1D, Histogram1Ds);
96 typedef HistogramD<2> Histogram2D;
97 IMP_VALUES(Histogram2D, Histogram2Ds);
98 typedef HistogramD<3> Histogram3D;
99 IMP_VALUES(Histogram3D, Histogram3Ds);
100 typedef HistogramD<4> Histogram4D;
101 IMP_VALUES(Histogram4D, Histogram4Ds);
102 typedef HistogramD<5> Histogram5D;
103 IMP_VALUES(Histogram5D, Histogram5Ds);
104 typedef HistogramD<6> Histogram6D;
105 IMP_VALUES(Histogram6D, Histogram6Ds);
106 typedef HistogramD<-1> HistogramKD;
107 IMP_VALUES(HistogramKD, HistogramKDs);
108 #endif
109 
110 /** Return the midpoint of the bin that best approximates the
111  specified quantile (passed as a fraction). That is,
112 passing .5 returns the median. And passing .9*/
113 IMPSTATISTICSEXPORT double get_quantile(const Histogram1D &h, double fraction);
114 
115 IMPSTATISTICS_END_NAMESPACE
116 #endif /* IMPSTATISTICS_HISTOGRAM_D_H */
Basic types used by IMP.
double get_mean(const cv::Mat &mat, const cvIntMat &mask)
Import IMP/kernel/base_types.h in the namespace.
A class to represent a voxel grid.
std::pair< double, double > FloatPair
A generic pair of floats.
Definition: base/types.h:27
#define IMP_VALUES(Name, PluralName)
Define the type for storing sets of values.
double get_quantile(const Histogram1D &h, double fraction)
#define IMP_SHOWABLE_INLINE(Name, how_to_show)
Declare the methods needed by an object that can be printed.
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method.
double get_volume(const BoundingBoxD< D > &bb)
Definition: BoundingBoxD.h:147
A Cartesian vector in D-dimensions.
Definition: VectorD.h:52
A bounding box in D dimensions.
Simple D vector class.
An axis-aligned bounding box.
Definition: BoundingBoxD.h:27
HistogramD< D > get_probability_distribution_function() const
Definition: HistogramD.h:51
All grids that are in the python API should be defined here.
void add(const algebra::VectorD< D > &x, double weight=1)
Definition: HistogramD.h:33
double get_total_count() const
Get the sum of all counts in the histogram.
Definition: HistogramD.h:43
BoundingBoxD< D > get_bounding_box(const BoundingBoxD< D > &g)
Definition: BoundingBoxD.h:160