8a8f8274 |
1 | TStopwatch timer; |
2 | const Int_t nt = 100; |
3 | //___________________________________________________________ |
4 | void pdfIO(const Int_t method = 0) |
5 | { |
6 | // Test interpolator IO response for several data dimensions. |
7 | // method = 0 : use COG interpolator |
8 | // method = 1 : use INT interpolator |
9 | |
10 | Float_t tw, tr; |
11 | TGraph *gw = new TGraph(5); |
12 | gw->SetMarkerStyle(24);gw->SetMarkerColor(2); |
13 | TGraph *gr = new TGraph(5); |
14 | gr->SetMarkerStyle(25);gr->SetMarkerColor(4); |
15 | for(int idim = 1; idim<6; idim++){ |
16 | tw = interpolWrite(method, idim); |
17 | gw->SetPoint(idim-1, idim, tw); |
18 | tr = interpolRead(idim); |
19 | gr->SetPoint(idim-1, idim, tr); |
20 | } |
21 | gw->Draw("apl"); |
22 | gr->Draw("pl"); |
23 | } |
24 | |
25 | //___________________________________________________________ |
26 | Float_t interpolWrite(const Int_t method, const Int_t ndim) |
27 | { |
28 | if(!gSystem->FindFile(".", "5D_Gauss.root")) build(5, 1000000); |
29 | TFile::Open("5D_Gauss.root"); |
30 | printf("\nWriting %dD interpolator ...\n", ndim); |
31 | TTree *db = (TTree*)gFile->Get("db"); |
32 | TString var = "x0"; for(int idim=1; idim<ndim; idim++) var += Form(":x%d", idim); |
33 | printf("\tBuilding interpolator ...\n"); |
34 | TKDPDF pdf(db, var.Data(), "", 400, 100000); |
35 | pdf.SetInterpolationMethod(method); |
36 | pdf.SetStore(); |
37 | |
38 | |
39 | printf("\tSetting up the interpolator ...\n"); |
40 | Float_t *c, val, v_err; |
41 | Double_t *p = new Double_t[ndim], res, r_err; |
42 | timer.Start(kTRUE); |
43 | for(int inode=0; inode<pdf.GetNTNodes(); inode++){ |
44 | pdf.GetCOGPoint(inode, c, val, v_err); |
45 | for(int idim=0; idim<ndim; idim++) p[idim] = (Double_t)c[idim]; |
46 | // printf("Evaluate for node [%d] ", inode); |
47 | // for(int idim=0; idim<ndim; idim++) printf("%5.3f ", p[idim]); printf("\n"); |
48 | for(int it=0; it<nt; it++) pdf.Eval(p, res, r_err, kTRUE); |
49 | // printf("R = %6.4f +- %6.4f\n", res, r_err); |
50 | } |
51 | timer.Stop(); |
52 | |
53 | Float_t time = 1.E3*timer.CpuTime()/float(nt); |
54 | printf("\tFinish interpolation in %6.2f [ms]\n", time); |
55 | |
56 | printf("\tSaving interpolator ...\n"); |
57 | TFile *fi = TFile::Open(Form("%dD_Interpolator.root", ndim), "RECREATE"); |
58 | pdf.Write(Form("%dDgauss", ndim)); |
59 | fi->Close(); |
60 | delete fi; |
61 | |
62 | delete [] p; |
63 | |
64 | return time; |
65 | } |
66 | |
67 | //___________________________________________________________ |
68 | Float_t interpolRead(const Int_t ndim) |
69 | { |
70 | printf("Reading %dD interpolator ...\n", ndim); |
71 | TFile::Open(Form("%dD_Interpolator.root", ndim)); |
72 | TKDPDF *pdf = (TKDPDF*)gFile->Get(Form("%dDgauss", ndim)); |
73 | gFile->Close(); |
74 | |
75 | printf("\tDoing interpolation ...\n"); |
76 | Float_t *c, v, ve; |
77 | Double_t *p = new Double_t[ndim], r, re; |
78 | timer.Start(kTRUE); |
79 | for(int ip=0; ip<pdf->GetNTNodes(); ip++){ |
80 | pdf->GetCOGPoint(ip, c, v, ve); |
81 | for(int idim=0; idim<ndim; idim++) p[idim] = (Double_t)c[idim]; |
82 | for(int it=0; it<nt; it++) pdf->Eval(p, r, re); |
83 | } |
84 | timer.Stop(); |
85 | Float_t time = 1.E3*timer.CpuTime()/float(nt); |
86 | printf("\tFinish interpolation in %6.2f [ms]\n", time); |
87 | delete [] p; |
88 | return time; |
89 | } |
90 | |
91 | //___________________________________________________________ |
92 | void build(const int ndim, const int npoints) |
93 | { |
94 | printf("Building DB ...\n"); |
95 | Float_t data[ndim]; |
96 | TFile::Open(Form("%dD_Gauss.root", ndim), "RECREATE"); |
97 | TTree *t = new TTree("db", Form("%dD data base for kD statistics", ndim)); |
98 | for(int idim=0; idim<ndim; idim++) t->Branch(Form("x%d", idim), &data[idim], Form("x%d/F", idim)); |
99 | |
100 | for (Int_t ip=0; ip<npoints; ip++){ |
101 | for (Int_t id=0; id<ndim; id++) data[id]= gRandom->Gaus(); |
102 | t->Fill(); |
103 | } |
104 | |
105 | t->Write(); |
106 | gFile->Close(); |
107 | delete gFile; |
108 | } |
109 | |
110 | |