ROOT logo
#include <TF1.h>
#include <TH1.h>
#include <TMath.h>
#include <cmath>

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);
  }
};


    
 PDFLandau.C:1
 PDFLandau.C:2
 PDFLandau.C:3
 PDFLandau.C:4
 PDFLandau.C:5
 PDFLandau.C:6
 PDFLandau.C:7
 PDFLandau.C:8
 PDFLandau.C:9
 PDFLandau.C:10
 PDFLandau.C:11
 PDFLandau.C:12
 PDFLandau.C:13
 PDFLandau.C:14
 PDFLandau.C:15
 PDFLandau.C:16
 PDFLandau.C:17
 PDFLandau.C:18
 PDFLandau.C:19
 PDFLandau.C:20
 PDFLandau.C:21
 PDFLandau.C:22
 PDFLandau.C:23
 PDFLandau.C:24
 PDFLandau.C:25
 PDFLandau.C:26
 PDFLandau.C:27
 PDFLandau.C:28
 PDFLandau.C:29
 PDFLandau.C:30
 PDFLandau.C:31
 PDFLandau.C:32
 PDFLandau.C:33
 PDFLandau.C:34
 PDFLandau.C:35
 PDFLandau.C:36
 PDFLandau.C:37
 PDFLandau.C:38
 PDFLandau.C:39
 PDFLandau.C:40
 PDFLandau.C:41
 PDFLandau.C:42
 PDFLandau.C:43
 PDFLandau.C:44
 PDFLandau.C:45
 PDFLandau.C:46
 PDFLandau.C:47
 PDFLandau.C:48
 PDFLandau.C:49
 PDFLandau.C:50
 PDFLandau.C:51
 PDFLandau.C:52
 PDFLandau.C:53
 PDFLandau.C:54
 PDFLandau.C:55
 PDFLandau.C:56
 PDFLandau.C:57
 PDFLandau.C:58
 PDFLandau.C:59
 PDFLandau.C:60
 PDFLandau.C:61
 PDFLandau.C:62
 PDFLandau.C:63
 PDFLandau.C:64
 PDFLandau.C:65
 PDFLandau.C:66
 PDFLandau.C:67
 PDFLandau.C:68
 PDFLandau.C:69
 PDFLandau.C:70
 PDFLandau.C:71
 PDFLandau.C:72
 PDFLandau.C:73
 PDFLandau.C:74
 PDFLandau.C:75
 PDFLandau.C:76
 PDFLandau.C:77
 PDFLandau.C:78
 PDFLandau.C:79
 PDFLandau.C:80
 PDFLandau.C:81
 PDFLandau.C:82
 PDFLandau.C:83
 PDFLandau.C:84
 PDFLandau.C:85
 PDFLandau.C:86
 PDFLandau.C:87
 PDFLandau.C:88
 PDFLandau.C:89
 PDFLandau.C:90
 PDFLandau.C:91
 PDFLandau.C:92
 PDFLandau.C:93
 PDFLandau.C:94
 PDFLandau.C:95
 PDFLandau.C:96
 PDFLandau.C:97
 PDFLandau.C:98
 PDFLandau.C:99
 PDFLandau.C:100
 PDFLandau.C:101
 PDFLandau.C:102
 PDFLandau.C:103
 PDFLandau.C:104
 PDFLandau.C:105
 PDFLandau.C:106
 PDFLandau.C:107
 PDFLandau.C:108
 PDFLandau.C:109
 PDFLandau.C:110
 PDFLandau.C:111
 PDFLandau.C:112
 PDFLandau.C:113
 PDFLandau.C:114
 PDFLandau.C:115
 PDFLandau.C:116
 PDFLandau.C:117
 PDFLandau.C:118
 PDFLandau.C:119
 PDFLandau.C:120
 PDFLandau.C:121
 PDFLandau.C:122
 PDFLandau.C:123
 PDFLandau.C:124
 PDFLandau.C:125
 PDFLandau.C:126
 PDFLandau.C:127
 PDFLandau.C:128
 PDFLandau.C:129
 PDFLandau.C:130
 PDFLandau.C:131
 PDFLandau.C:132
 PDFLandau.C:133
 PDFLandau.C:134
 PDFLandau.C:135
 PDFLandau.C:136
 PDFLandau.C:137
 PDFLandau.C:138
 PDFLandau.C:139
 PDFLandau.C:140
 PDFLandau.C:141
 PDFLandau.C:142
 PDFLandau.C:143
 PDFLandau.C:144
 PDFLandau.C:145
 PDFLandau.C:146
 PDFLandau.C:147
 PDFLandau.C:148
 PDFLandau.C:149
 PDFLandau.C:150
 PDFLandau.C:151
 PDFLandau.C:152