00001 #include "cafe/StatWeight.hpp"
00002 #include <iostream>
00003 #include <math.h>
00004
00005 using namespace std ;
00006
00007 namespace cafe {
00008
00009 StatSelection::StatSelection(const std::string& name, unsigned long events, bool weight) :
00010 _name(name), _events(events)
00011 {
00012 if (events==0)
00013 _updated = false ;
00014 else
00015 _updated = true ;
00016 _weight = weight ;
00017 }
00018
00019 double StatSelection::err(const StatSelection& selection) const {
00020 if (selection.nevents() < _events ) {
00021 cout << "cafe::StatSelection: error in the events sample order! "
00022 << "Number of events in the preciding selection " << selection.nevents()
00023 << " less than in the following one " << _events << "!"
00024 << endl ;
00025 return 0 ;
00026 }
00027 double eff = ((double)_events) / selection.nevents() ;
00028 return sqrt(eff*(1-eff)/selection.nevents()) ;
00029 }
00030
00031 unsigned long StatSelection::addEvent() {
00032 if (!_updated) {
00033 _events++;
00034 _updated = true ;
00035 }
00036 return _events;
00037 }
00038
00039
00040 StatWeight::StatWeight(const std::string& name) : StatSelection(name, 0, true),
00041 _weight_average(1.0),_weight(1.0),
00042 _rms2(0), _weight_old(0), _rms2_old(0),
00043 _weight_average_pos(-1.0),_weight_pos(1.0),
00044 _rms2_pos(0), _weight_old_pos(0), _rms2_old_pos(0),
00045 _weight_average_neg(-1.0),_weight_neg(1.0),
00046 _rms2_neg(0), _weight_old_neg(0), _rms2_old_neg(0)
00047 { }
00048
00049 void StatWeight::Clear() {
00050 StatSelection::Clear() ;
00051 _weight = 1.0 ;
00052 _weight_old = 0 ;
00053 _weight_pos = 1.0 ;
00054 _weight_old_pos = 0 ;
00055 _weight_neg = 1.0 ;
00056 _weight_old_neg = 0 ;
00057 }
00058
00059 double StatWeight::applyWeight(double weight, double weight_pos, double weight_neg ) {
00060 if (weight < 0 ) {
00061 cout << "cafe::StatWeight WARNING: You are trying to apply weight "
00062 << weight
00063 << " < 0!"
00064 << endl ;
00065 return 0.0;
00066 }
00067
00068 if (!isUpdated()) {
00069 _weight_old = _weight_average ;
00070 _rms2_old = _rms2 ;
00071 _weight_old_pos = _weight_average_pos ;
00072 _rms2_old_pos = _rms2_pos ;
00073 _weight_old_neg = _weight_average_neg ;
00074 _rms2_old_neg = _rms2_neg ;
00075 }
00076
00077 addEvent() ;
00078 _weight *= weight ;
00079
00080 if (weight_pos >= 0)
00081 _weight_pos *= weight_pos ;
00082 if (weight_neg >= 0)
00083 _weight_neg *= weight_neg ;
00084
00085 if (nevents() == 1) {
00086 _weight_average = _weight ;
00087 if (weight_pos >= 0)
00088 _weight_average_pos = _weight_pos ;
00089 if (weight_neg >= 0)
00090 _weight_average_neg = _weight_neg ;
00091 _rms2 = 0 ;
00092 _rms2_pos = 0 ;
00093 _rms2_neg = 0 ;
00094 } else {
00095 _rms2 = ((double) nevents()-2)/(nevents()-1)*_rms2_old + pow(_weight-_weight_old,2)/nevents() ;
00096 if (weight_pos >= 0)
00097 _rms2_pos = ((double) nevents()-2)/(nevents()-1)*_rms2_old_pos +
00098 pow(_weight_pos-_weight_old_pos,2)/nevents() ;
00099 if (weight_neg >= 0)
00100 _rms2_neg = ((double) nevents()-2)/(nevents()-1)*_rms2_old_neg +
00101 pow(_weight_neg-_weight_old_neg,2)/nevents() ;
00102
00103 _weight_average = _weight_old*(((double)nevents()-1)/nevents()) + _weight/nevents() ;
00104 if (weight_pos >= 0)
00105 _weight_average_pos = _weight_old_pos*(((double)nevents()-1)/nevents()) + _weight_pos/nevents() ;
00106 if (weight_neg >= 0)
00107 _weight_average_neg = _weight_old_neg*(((double)nevents()-1)/nevents()) + _weight_neg/nevents() ;
00108 }
00109
00110 return _weight ;
00111 }
00112
00113 double StatWeight::err() const {
00114 if (nevents() <= 1 || _rms2 <= 0) return 0.0 ;
00115 return sqrt(_rms2/nevents()) ;
00116 }
00117
00118 double StatWeight::err_pos() const {
00119 if (nevents() <= 1 || _rms2_pos <= 0) return 0.0 ;
00120 return sqrt(_rms2_pos/nevents()) ;
00121 }
00122
00123 double StatWeight::err_neg() const {
00124 if (nevents() <= 1 || _rms2_neg <= 0) return 0.0 ;
00125 return sqrt(_rms2_neg/nevents()) ;
00126 }
00127
00128
00129 double StatWeight::rms() const {
00130 return _rms2 >0 ? sqrt(_rms2) : 0.0 ;
00131 }
00132
00133 double StatWeight::rms_pos() const {
00134 return _rms2_pos >0 ? sqrt(_rms2_pos) : 0.0 ;
00135 }
00136
00137 double StatWeight::rms_neg() const {
00138 return _rms2_neg >0 ? sqrt(_rms2_neg) : 0.0 ;
00139 }
00140
00141
00142 }
00143
00144 ClassImp(cafe::StatSelection);
00145 ClassImp(cafe::StatWeight);