#include #include #include #include struct PDF { static double cheb(double v, double* p, double* q, int n) { double num = 0; double den = 0; for (int i = n-1; i >= 0; i--) { num = (p[i] + num)*v; den = (q[i] + den)*v; } return num/den; } static double f1(double v) { static double a1[3] = {0.04166666667,-0.01996527778, 0.02709538966}; double u = std::exp(v+1); if (u < 1e-10) return 0; double ue = std::exp(-1/u); double us = std::sqrt(u); return 0.3989422803*(ue/us)*(1+(a1[0]+(a1[1]+a1[2]*u)*u)*u); } static double f2(double v) { static double p1[] = {0.4259894875, -0.1249762550, 0.03984243700, -0.006298287635, 0.001511162253}; static double q1[] = {1.0, -0.3388260629, 0.09594393323, -0.01608042283, 0.003778942063}; double u = std::exp(-v-1); return std::exp(-u)*std::sqrt(u)*cheb(v,p1,q1,5); } static double f3(double v) { static double p2[] = {0.1788541609, 0.1173957403, 0.01488850518, -0.001394989411, 0.0001283617211}; static double q2[] = {1.0, 0.7428795082, 0.3153932961, 0.06694219548, 0.008790609714}; return cheb(v,p2,q2,5); } static double f4(double v) { static double p3[] = {0.1788544503, 0.09359161662, 0.006325387654, 0.00006611667319, -0.000002031049101}; static double q3[] = {1.0, 0.6097809921, 0.2560616665, 0.04746722384, 0.006957301675}; return cheb(v,p3,q3,5); } static double f5(double v) { static double p4[] = {0.9874054407, 118.6723273, 849.2794360, -743.7792444, 427.0262186}; static double q4[] = {1.0, 106.8615961, 337.6496214, 2016.712389, 1597.063511}; double u = 1/v; return u*u*cheb(u,p4,q4,5); } static double f6(double v) { static double p5[] = {1.003675074, 167.5702434, 4789.711289, 21217.86767, -22324.94910}; static double q5[] = {1.0, 156.9424537, 3745.310488, 9834.698876, 66924.28357}; double u = 1/v; return u*u*cheb(u,p5,q5,5); } static double f7(double v) { static double p6[] = {1.000827619, 664.9143136, 62972.92665, 475554.6998, -5743609.109}; static double q6[] = {1.0, 651.4101098, 56974.73333, 165917.4725, -2815759.939}; double u = 1/v; return u*u*cheb(u,p6,q6,5); } static double f8(double v) { static double a2[2] = {-1.845568670,-4.284640743}; double u = 1/(v-v*std::log(v)/(v+1)); return u*u*(1+(a2[0]+a2[1]*u)*u); } static Double_t wrap(Double_t* px, Double_t* pp) { Int_t i = pp[0]; Double_t v = px[0]; switch (i) { case 1: return f1(v); case 2: return f2(v); case 3: return f3(v); case 4: return f4(v); case 5: return f5(v); case 6: return f6(v); case 7: return f7(v); case 8: return f8(v); } return 0; } static TF1* getComp(Int_t i) { Double_t l = -10; Double_t h = -5.5; switch (i) { case 2: l = -5.5; h = -1; break; case 3: l = -1; h = 1; break; case 4: l = 1; h = 5; break; case 5: l = 5; h = 12; break; case 6: l = 12; h = 50; break; case 7: l = 50; h = 300; break; case 8: l = 300; h = 1000; break; default: i = 1; break; } l *= (l < 0 ? 1.5 : 0.4); h *= (h < 0 ? 0.5 : 1.5); TF1* f = new TF1(Form("f%d", i), &PDF::wrap, l, h, 1); f->SetParameter(0, i); f->SetLineColor(i); return f; } static void draw() { TH1* h = new TH1F("h","h", 1000, -10, 1000); h->Draw(); TF1* l = new TF1("l", "landau", -10, 1000); l->SetParameters(1,0,1); l->SetLineStyle(2); l->Draw("same"); Double_t max = 0; for (Int_t i = 1; i <= 8; i++) { TF1* f = getComp(i); f->Draw("same"); max = TMath::Max(f->GetMaximum(),max); } h->SetMaximum(1.1*max); } };