Ignore:
Timestamp:
Dec 26, 2006, 10:56:26 AM (15 years ago)
Author:
Jari Häkkinen
Message:

Addresses #170.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/yat/statistics/Histogram.cc

    r680 r718  
    3232
    3333
    34 Histogram::Histogram(void)
    35   : xmax_(0), xmin_(0), sum_all_(), sum_histogram_()
    36 {
    37 }
     34  Histogram::Histogram(void)
     35    : xmax_(0), xmin_(0), sum_all_(), sum_histogram_()
     36  {
     37  }
    3838
    3939
    40 
    41 Histogram::Histogram(const Histogram& b)
    42 {
    43   *this=b;
    44 }
     40  Histogram::Histogram(const Histogram& b)
     41  {
     42    *this=b;
     43  }
    4544
    4645
    47 
    48 Histogram::Histogram(const double min, const double max, const size_t n)
    49   : histogram_(std::vector<double>(n,0.0)),
    50     xmax_(max), xmin_(min),
    51     sum_all_(), sum_histogram_()
    52 {
    53 }
     46  Histogram::Histogram(const double min, const double max, const size_t n)
     47    : histogram_(std::vector<double>(n,0.0)),
     48      xmax_(max), xmin_(min),
     49      sum_all_(), sum_histogram_()
     50  {
     51  }
    5452
    5553
    56 
    57 Histogram::~Histogram(void)
    58 {
    59 }
     54  Histogram::~Histogram(void)
     55  {
     56  }
    6057
    6158
     59  int Histogram::add(const double x, const double w)
     60  {
     61    sum_all_.add(x,w);
     62    if (x<xmin_)
     63      return -1;
     64    else if (x>=xmax_)
     65      return 1;
    6266
    63 int Histogram::add(const double x, const double w)
    64 {
    65   sum_all_.add(x,w);
    66   if (x<xmin_)
    67     return -1;
    68   else if (x>=xmax_)
    69     return 1;
    70  
    71   sum_histogram_.add(x,w);
    72   histogram_[bin(x)] += w;
    73   return 0;
    74 }
     67    sum_histogram_.add(x,w);
     68    histogram_[bin(x)] += w;
     69    return 0;
     70  }
    7571
    7672
    77 
    78 void Histogram::normalize(bool choice)
    79 {
    80   double scale_factor;
    81   if (choice)
    82     scale_factor = sum_all_.sum_w();
    83   else
    84     scale_factor = sum_all_.sum_w()*spacing();
    85   for (size_t i=0; i<histogram_.size(); i++)
    86     histogram_[i]/=scale_factor;
    87 
    88 }
     73  const statistics::AveragerWeighted& Histogram::averager_all(void) const
     74  {
     75    return sum_all_;
     76  }
    8977
    9078
    91 void Histogram::reset(void)
    92 {
    93   for (u_int i=0; i<histogram_.size(); i++)
    94     histogram_[i]=0;
    95   sum_all_.reset();
    96   sum_histogram_.reset();
    97 }
     79  const statistics::AveragerWeighted& Histogram::averager_histogram(void) const
     80  {
     81    return sum_histogram_;
     82  }
    9883
    9984
    100 
    101 const Histogram& Histogram::operator=(const Histogram& b)
    102 {
    103   if (this==&b)
    104     return *this;
    105   histogram_=b.histogram_;
    106   xmax_=b.xmax_;
    107   xmin_=b.xmin_;
    108   sum_all_=b.sum_all_;
    109   sum_histogram_=b.sum_histogram_;
    110   return *this;
    111 }
     85  size_t Histogram::bin(double d)
     86  {
     87    return (((d<xmin_) || (d>xmax_)) ? 0 :
     88            static_cast<size_t>(floor((d-xmin_)/spacing() )));
     89  }
    11290
    11391
     92  size_t Histogram::nof_bins(void) const
     93  {
     94    return histogram_.size();
     95  }
    11496
    115 std::ostream& operator<<(std::ostream& s,const Histogram& histogram)
    116 {
    117   s << "# histogram min : " << histogram.xmin() << '\n';
    118   s << "# histogram max : " << histogram.xmax() << '\n';
    119   s << "# number of bins: " << histogram.nof_bins() << '\n';
    120   s << "# nof points in histogram : "
    121     << histogram.averager_histogram().sum_w() << '\n';
    122   s << "# nof points in total:      "
    123     << histogram.averager_all().sum_w() << '\n';
    124   s << "# column 1: center of observation bin\n"
    125     << "# column 2: frequency\n";
    12697
    127   for (u_int i=0; i<histogram.nof_bins(); i++) {
    128     s.width(12);
    129     s << histogram.observation_value(i);
    130     s.width(12);
    131     s << histogram[i] << '\n';
    132   }
     98  void Histogram::normalize(bool choice)
     99  {
     100    double scale_factor;
     101    if (choice)
     102      scale_factor = sum_all_.sum_w();
     103    else
     104      scale_factor = sum_all_.sum_w()*spacing();
     105    for (size_t i=0; i<histogram_.size(); i++)
     106      histogram_[i]/=scale_factor;
     107  }
    133108
    134   return s;
    135 }
     109
     110  double Histogram::observation_value(const size_t k) const
     111  {
     112    return xmin_+spacing()*(k+0.5);
     113  }
     114
     115
     116  void Histogram::reset(void)
     117  {
     118    for (u_int i=0; i<histogram_.size(); i++)
     119      histogram_[i]=0;
     120    sum_all_.reset();
     121    sum_histogram_.reset();
     122  }
     123
     124
     125  double Histogram::spacing(void) const
     126  {
     127    return (xmax_-xmin_)/nof_bins();
     128  }
     129
     130
     131  double Histogram::xmax(void) const
     132  {
     133    return xmax_;
     134  }
     135
     136
     137  double Histogram::xmin(void) const
     138  {
     139    return xmin_;
     140  }
     141
     142
     143  double Histogram::operator[](size_t k) const
     144  {
     145    return histogram_[k];
     146  }
     147
     148
     149  const Histogram& Histogram::operator=(const Histogram& b)
     150  {
     151    if (this==&b)
     152      return *this;
     153    histogram_=b.histogram_;
     154    xmax_=b.xmax_;
     155    xmin_=b.xmin_;
     156    sum_all_=b.sum_all_;
     157    sum_histogram_=b.sum_histogram_;
     158    return *this;
     159  }
     160
     161
     162  std::ostream& operator<<(std::ostream& s,const Histogram& histogram)
     163  {
     164    s << "# histogram min : " << histogram.xmin() << '\n';
     165    s << "# histogram max : " << histogram.xmax() << '\n';
     166    s << "# number of bins: " << histogram.nof_bins() << '\n';
     167    s << "# nof points in histogram : "
     168      << histogram.averager_histogram().sum_w() << '\n';
     169    s << "# nof points in total:      "
     170      << histogram.averager_all().sum_w() << '\n';
     171    s << "# column 1: center of observation bin\n"
     172      << "# column 2: frequency\n";
     173
     174    for (u_int i=0; i<histogram.nof_bins(); i++) {
     175      s.width(12);
     176      s << histogram.observation_value(i);
     177      s.width(12);
     178      s << histogram[i] << '\n';
     179    }
     180
     181    return s;
     182  }
    136183
    137184}}} // of namespace statistics, yat, and theplu
Note: See TracChangeset for help on using the changeset viewer.