12 #include <utl/TabulatedFunctionErrors.h>
13 #include <utl/MultiTabulatedFunctionErrors.h>
14 #include <utl/ErrorLogger.h>
15 #include <utl/AugerException.h>
27 using namespace FdLightCollectionEfficiencyKG;
44 const unsigned int nSamples =
fData.size();
50 vector<vector<double> > efficiencies;
51 vector<vector<double> > efficiencyUncertainties;
52 const unsigned int nBins =
fData.begin()->GetNPoints();
53 efficiencies.resize(nBins);
54 efficiencyUncertainties.resize(nBins);
56 for (
unsigned int i = 0; i < nBins; ++i) {
57 efficiencies[i].reserve(nSamples);
58 efficiencyUncertainties[i].reserve(nSamples);
61 vector<double> xvalues;
62 xvalues.resize(nBins, 0.);
65 for (std::list<utl::TabulatedFunctionErrors>::const_iterator iter =
fData.begin();
66 iter !=
fData.end(); ++iter)
71 for (
unsigned int i = 0; i < lceff.
GetNPoints(); ++i) {
72 const double eff = lceff.
GetY(i);
73 const double effUnc = lceff.
GetYErr(i);
74 assert(isfinite(eff));
75 efficiencies[i].push_back(eff);
76 efficiencyUncertainties[i].push_back(effUnc);
77 xvalues[i] = lceff.
GetX(i);
82 for (
unsigned int i = 0; i < efficiencies.size(); ++i) {
83 if (efficiencies[i].size() != 0) {
88 assert(isfinite(meanWUncert.first));
89 assert(isfinite(meanWUncert.second));
91 fMean.
PushBack( xvalues[i], 0., meanWUncert.first, meanWUncert.second );
98 msg <<
"Bootstrapped using " << nSamples <<
" efficiencies";
109 for (
unsigned int i = 0; i < lcEff.
GetNPoints(); ++i) {
110 const double val = lcEff.
GetY(i);
111 const double unc = lcEff.
GetYErr(i);
112 assert(isfinite(val));
113 assert(isfinite(unc));
115 if (val >= absValueThreshold && unc/val > relUncertaintyThreshold) {
118 msg <<
"Uncertainty still too large at"
119 <<
" index " << i <<
", value " << unc/val*100. <<
"%";
131 std::pair<double, double>
133 const std::vector<double>& uncertainties,
136 std::pair<double, double> retval;
138 const double mean =
WeightedMean(samples, uncertainties);
142 const double mean =
Mean(samples);
143 assert(isfinite(mean));
144 const double kMAD = 1.4826;
148 retval = std::make_pair( mean,
sqrt(
SampleVariance(samples, mean) / (
double)samples.size() ) );
158 assert(isfinite(retval.first));
159 assert(isfinite(retval.second));
168 const unsigned int n = samples.size();
170 for (
unsigned int i = 0; i < n; ++i) {
171 assert(isfinite(samples[i]));
174 return sum / (double)n;
181 const unsigned int n = samples.size();
183 assert(uncertainties.size() == n);
185 double sum = 0, sumW = 0;
186 for (
unsigned int i = 0; i < n; ++i) {
187 assert(isfinite(samples[i]));
188 assert(isfinite(uncertainties[i]));
189 const double unc = uncertainties[i];
190 const double w = 1./(unc*unc);
201 double variance = 0.;
202 const unsigned int n = samples.size();
204 for (
unsigned int i = 0; i < n; i++) {
205 assert(isfinite(samples[i]));
206 variance +=
pow(samples[i]-mean, 2.);
208 return variance / ((double)n - 1.);
214 const std::vector<double>& uncertainties,
217 const unsigned int n = samples.size();
219 assert(uncertainties.size() == n);
221 double sumW = 0., sumW2 = 0., wvariance = 0.;
222 for (
unsigned int i = 0; i < n; ++i) {
223 const double unc = uncertainties[i];
224 assert(isfinite(samples[i]));
225 assert(isfinite(unc));
227 const double w = 1./(unc*unc);
230 wvariance += w*
pow(samples[i]-mean, 2.);
232 return (sumW / (sumW*sumW - sumW2)) * wvariance;
239 const double medianElem = ((double)sortedSamples.size()+1.)/2.;
240 const unsigned int idx = (
unsigned int)medianElem;
242 if ( (medianElem-(
double)idx > 0.1) )
243 median = 0.5 * (sortedSamples[idx] + sortedSamples[idx+1]);
245 median = sortedSamples[idx];
247 assert(isfinite(median));
256 vector<double> sortedSamples = samples;
257 const unsigned int nSamples = sortedSamples.size();
259 std::sort(sortedSamples.begin(), sortedSamples.end());
260 const double sampleMedian =
Median(sortedSamples);
261 assert(isfinite(sampleMedian));
263 for (
unsigned int i = 0; i < nSamples; ++i) {
264 assert(isfinite(sortedSamples[i]));
265 sortedSamples[i] = fabs(sortedSamples[i] - sampleMedian);
268 std::sort(sortedSamples.begin(), sortedSamples.end());
270 const double mad =
Median(sortedSamples);
271 assert(isfinite(mad));
unsigned int GetNPoints() const
double WeightedSampleVariance(const std::vector< double > &samples, const std::vector< double > &uncertainties, const double mean)
#define INFO(message)
Macro for logging informational messages.
double pow(const double x, const unsigned int i)
const double & GetYErr(const unsigned int idx) const
utl::TabulatedFunctionErrors fMean
double WeightedMean(const std::vector< double > &samples, const std::vector< double > &uncertainties)
Bootstrapper(const std::list< utl::TabulatedFunctionErrors > &data, const int verbosity=0)
std::pair< double, double > MeanWithUncertainty(const std::vector< double > &samples, const std::vector< double > &uncertainties, const VarianceEstimator est=eSampleVariance)
void PushBack(const double x, const double xErr, const double y, const double yErr)
Base class for inconsistency/illogicality exceptions.
const double & GetY(const unsigned int idx) const
double MedianAbsoluteDeviation(const std::vector< double > &samples, const double mean)
double Median(const std::vector< double > &sortedSamples)
const double & GetX(const unsigned int idx) const
bool MaxRelUncertaintyBelowThreshold(const double relUncertaintyThreshold, const double absValueThreshold=0.)
int fVerbosity
global verbosity flag
double Mean(const std::vector< double > &samples)
double SampleVariance(const std::vector< double > &samples, const double mean)
const std::list< utl::TabulatedFunctionErrors > & fData