27 Result(
double x=0,
double el=0,
double eh=0)
96 virtual double Low()
const
132 Final(
double x,
double el,
double eh,
133 double chi2,
double low,
double high)
214 void Add(
double x,
double el,
double eh)
216 size_t n =
fData.size();
219 fData.back().fEl = el;
220 fData.back().fEh = eh;
238 virtual double W(
const Result& r)
const = 0;
247 virtual double StepW(
double guess,
const Result& r)
const = 0;
253 virtual double StepOffset(
double guess,
const Result& r)
const = 0;
260 virtual double TermVar(
double guess,
const Result& r)
const = 0;
278 double var =
TermVar(guess, r);
279 if (var <= 0)
return -1000;
281 return std::pow(guess - r.
fX, 2) / var;
294 double F(
double guess,
302 s +=
Term(guess, *i);
327 double delta = 0.1 * sign * s;
330 for (
unsigned short i = 0; i < nIter; i++) {
332 double got =
F(best + sign * s, chi2, begin, end);
334 if (std::fabs(got-1) < 1e-7)
339 double guess =
F(best + sign * s + delta, chi2, begin, end);
342 if ((got - 1) * (guess - 1) > 0) {
343 if ((got - 1) / (guess - 1) < 1)
351 s += sign * delta * (1 - got) / (guess - got);
374 double x = (highest+lowest)/2;
378 for (
unsigned short i = 0; i < nIter; i++) {
385 double w =
StepW(x, *j);
391 x = (sum - offset) / sumw;
393 if (std::fabs(x - oldX) < (highest-lowest) * 1e-6)
break;
409 unsigned short nIter=50)
411 double lowest = +1e33;
412 double highest = -1e33;
418 lowest = std::min(i->Low(), lowest);
419 highest = std::max(i->High(), highest);
420 sumLow = 1./std::pow(i->fEl, 2);
421 sumHigh = 1./std::pow(i->fEh, 2);
424 double sLow = 1. / std::sqrt(sumLow);
425 double sHigh = 1. / std::sqrt(sumHigh);
428 double bestX =
FindX(nIter, begin, end, lowest, highest);
429 double bestChi2 =
F(bestX, 0, begin, end);
430 double bestLow =
FindError(nIter,begin,end,-1,bestX,bestChi2,sLow);
431 double bestHigh =
FindError(nIter,begin,end,+1,bestX,bestChi2,sHigh);
433 return Final(bestX, bestLow, bestHigh, bestChi2, lowest, highest);
447 return o << r.
fX <<
"\t-" << r.
fEl <<
"\t+" << r.
fEh;
459 return o << static_cast<const Combiner::Result&>(r) <<
"\t" << r.
fChi2;
481 return .5 * std::pow(s + r.
fX * r.
Sprime(), 3) / s;
498 return s / std::pow(s+r.
Sprime()*(guess - r.
fX),3);
524 return std::pow(r.
S() + r.
Sprime() * (guess - r.
fX),2);
548 static double L(
double guess,
double x,
double el,
double eh)
550 double d = (guess-x);
551 double s = 2 * el * eh / (el + eh);
552 double sp = (eh - el) / (eh + eh);
553 return std::pow(d / (s+sp*d), 2);
563 static double WrapL(
double* xp,
double* pp)
565 return L(xp[0], pp[0], pp[1], pp[2]);
589 return std::pow(v + r.
fX * vp, 2) / (2 * v + r.
fX * vp);
606 return v / std::pow(v+r.
Vprime()*(guess - r.
fX), 2);
623 return 0.5 * vp * std::pow((guess-r.
fX)/(r.
V()+vp*(guess-r.
fX)),2);
640 return r.
V() + r.
Vprime() * (guess - r.
fX);
664 static double L(
double guess,
double x,
double el,
double eh)
666 double d = (guess-x);
669 return std::pow(d,2) / (v+vp*d);
679 static double WrapL(
double* xp,
double* pp)
681 return L(xp[0], pp[0], pp[1], pp[2]);
697 TF1* f =
new TF1(Form(
"f%02d", j),
701 f->SetParNames(
"x",
"#sigma^{-}",
"#sigma^{+}");
702 f->SetParameters(r.
fX, r.
fEl, r.
fEh);
703 f->SetLineStyle((j%3)+2);
704 f->SetLineColor(kBlack);
711 TLine* l =
new TLine(m-f->GetParameter(1), 1,
712 m+f->GetParameter(2), 1);
714 l->SetLineColor(f->GetLineColor());
715 l->SetLineStyle(f->GetLineStyle());
716 l->SetLineWidth(f->GetLineWidth());
725 TList fs; fs.SetOwner(
false);
728 TF1* f =
MakeF(*i, j, isSigma);
729 f->SetRange(r.
Low(), r.
High());
730 fs.Add(f, j == 0 ?
"" :
"same");
734 TF1* fr =
MakeF(r, j, isSigma);
735 fr->SetLineColor(kRed+2);
742 while((o = next())) { o->Draw(j == 0 ?
"" :
"same"); j++; }
744 static_cast<TF1*
>(fs.First())->GetHistogram()
745 ->GetYaxis()->SetRangeUser(-.1, 5.1);
757 std::ostream_iterator<Combiner::Result> out(std::cout,
"\n");
758 std::copy(b, e, out);
764 std::cout <<
"Linear sigma: " << sf <<
"\n"
765 <<
" Expected: " << s <<
"\n"
766 <<
" Difference: " << sd << std::endl;
774 std::cout <<
"Linear variance: " << vf <<
"\n"
775 <<
" Expected: " << v <<
"\n"
776 <<
" Difference: " << vd << std::endl;
785 l.
Add(4, 1.682, 2.346);
786 l.
Add(5, 1.912, 2.581);
796 l.
Add(6.32064, 0.567382, 0.379042);
797 l.
Add(6.15549, 0.159504, 0.170811);
806 l.
Add(6.20449, 0.451232, 0.495192);
807 l.
Add(6.16188, 0.165785, 0.176712);
static double WrapL(double *xp, double *pp)
double W(const Result &r) const
double Term(double guess, const Result &r) const
Final Calculate(const_iterator &begin, const_iterator &end, unsigned short nIter=50)
Final(double x, double el, double eh, double chi2, double low, double high)
double TermVar(double guess, const Result &r) const
void RunTest(Combiner::const_iterator b, Combiner::const_iterator e, Combiner::Final s, Combiner::Final v)
virtual double W(const Result &r) const =0
double F(double guess, double chi2, const_iterator &begin, const_iterator &end) const
virtual double StepOffset(double guess, const Result &r) const =0
double StepOffset(double guess, const Result &r) const
static double WrapL(double *xp, double *pp)
List::const_iterator const_iterator
Container::iterator iterator
static TF1 * MakeF(const Combiner::Result &r, Int_t j, Bool_t isSigma)
double W(const Result &r) const
static double L(double guess, double x, double el, double eh)
void Add(double x, double el, double eh)
std::list< Result > Container
virtual double TermVar(double guess, const Result &r) const =0
std::ostream & operator<<(std::ostream &o, const Combiner::Result &r)
static void Draw(Combiner::const_iterator b, Combiner::const_iterator e, Combiner::Result r, Bool_t isSigma)
virtual double High() const
double StepW(double guess, const Result &r) const
virtual double Low() const
static double L(double guess, double x, double el, double eh)
double StepOffset(double, const Result &) const
const_iterator begin() const
double FindX(unsigned short nIter, const_iterator &begin, const_iterator &end, double lowest, double highest)
double TermVar(double guess, const Result &r) const
void Final(Bool_t reweighed=false)
double StepW(double guess, const Result &r) const
static TLine * MakeL(TF1 *f)
int main(int argc, char **argv)
const_iterator end() const
Container::const_iterator const_iterator
double FindError(unsigned short nIter, const_iterator &begin, const_iterator &end, int sign, double best, double chi2, double s)
Result(double x=0, double el=0, double eh=0)
virtual double StepW(double guess, const Result &r) const =0
void Add(const Result &r)