1 void interpolCompare(const Int_t method = 0, const int nstat = 40000)
3 // Compare interpolation methods.
4 // method = 0 : Select COG method
5 // method = 1 : Select INT method
7 const Float_t alpha = 20.;
8 const int bucket = nstat/100; //400;
9 const int nevals = 100;
12 for(int istat=0; istat<nstat; istat++) data1[istat] = gRandom->Gaus();
15 TLegend *leg = new TLegend(0.7157258,0.8280255,0.9637097,0.9596603);
16 leg->SetBorderSize(1);
17 TF1 *f=new TF1("f1", "gaus(0);x;f(x)", -5., 5.);
20 f->SetParameter(0, 1.);
21 f->SetParameter(1, 0.);
22 f->SetParameter(2, 1.);
23 f->SetParameter(0, 1./f->Integral(-10., 10.));
24 f->Draw(); leg->AddEntry(f, "model", "l");
27 Float_t cog, val, val_err;
28 Double_t x, chi2, chi2pdf, chi2int, result, err;
30 TKDPDF pdf(nstat, 1, bucket, data);
31 pdf.SetInterpolationMethod(method);
34 TKDInterpolator in(1, pdf.GetNTNodes());
35 in.SetInterpolationMethod(method);
38 // change to the reprezentation which is closer to the local
39 // interpolating polynom.
42 TKDNodeInfo *node = 0x0;
43 while(node = pdf.GetNodeInfo(inode)){
44 if(node->fVal[0] > 0.){
45 in.SetNode(inode, *node);
46 node = in.GetNodeInfo(inode);
48 node->fVal[0] = TMath::Log(fx);
49 node->fVal[1] = node->fVal[1]/fx;
54 // Do preprocessing for INT
56 if(method) for(int icog=0; icog<pdf.GetNTNodes(); icog++){
57 pdf.GetCOGPoint(icog, pcog, val, val_err);
59 pdf.Eval(&x, result, err);
60 in.Eval(&x, result, err);
65 // prepare drawing containers
66 TGraphErrors *gPDF = new TGraphErrors(nevals);
67 gPDF->SetMarkerStyle(7);
68 TGraph *gREP = new TGraph(nevals);
69 gREP->SetMarkerStyle(7);
70 gREP->SetMarkerColor(4);
71 gREP->SetLineColor(4);
73 TGraphErrors *gINT = new TGraphErrors(nevals);
74 gINT->SetMarkerStyle(24);
75 gINT->SetMarkerSize(.6);
76 gINT->SetMarkerColor(3);
77 gINT->SetLineColor(3);
78 TGraph *gREI = new TGraph(nevals);
79 gREI->SetMarkerStyle(24);
80 gREI->SetMarkerColor(4);
81 gREI->SetLineColor(4);
83 // Do the interpolation with PDF and Interpolator
84 Double_t dx = 10./nevals;
86 chi2pdf = 0.; npPDF = 0;
87 chi2int = 0.; npINT = 0;
88 for(int ip=0; ip<nevals; ip++){
89 chi2 = pdf.Eval(&x, result, err);
90 gPDF->SetPoint(ip, x, result);
91 gPDF->SetPointError(ip, 0., err);
93 chi2pdf += (result - f->Eval(x))*(result - f->Eval(x))/f->Eval(x)/f->Eval(x);
96 gREP->SetPoint(ip, x, .1*err/TMath::Abs(result));
97 //printf("%2d x[%f] r[%f +- %f] chi2[%e]\n", ip, x, result, err, chi2);
99 chi2 = in.Eval(&x, result, err);
100 result = TMath::Exp(result);
102 gINT->SetPoint(ip, x, result);
103 gINT->SetPointError(ip, 0., err);
104 if(TMath::Abs(x)<3.){
105 chi2int += (result - f->Eval(x))*(result - f->Eval(x))/f->Eval(x)/f->Eval(x);
108 gREI->SetPoint(ip, x, .1*err/TMath::Abs(result));
109 //printf("%2d x[%f] r[%f +- %f] chi2[%e]\n\n", ip, x, result, err, chi2);
113 gINT->Draw("p"); leg->AddEntry(gINT, Form("Interpolator [%s]", method ? "INT" : "COG"), "pl");
114 gPDF->Draw("p"); leg->AddEntry(gPDF, Form("PDF [%s]", method ? "INT" : "COG"), "pl");
115 gREI->Draw("pl"); leg->AddEntry(gREI, "1% #epsilon Interpolator", "pl");
116 gREP->Draw("pl"); leg->AddEntry(gREP, "1% #epsilon PDF", "pl");
119 printf("PDF : chi2(%d) = %f\n", npPDF, chi2pdf);
121 printf("INT : chi2(%d) = %f\n", npINT, chi2int);