ROOT logo
TStopwatch timer;
const Int_t nt = 100;
//___________________________________________________________
void pdfIO(const Int_t method = 0)
{
// Test interpolator IO response for several data dimensions.
// method = 0 : use COG interpolator
// method = 1 : use INT interpolator

	Float_t tw, tr;
	TGraph *gw = new TGraph(5);
	gw->SetMarkerStyle(24);gw->SetMarkerColor(2);
	TGraph *gr = new TGraph(5);
	gr->SetMarkerStyle(25);gr->SetMarkerColor(4);
	for(int idim = 1; idim<6; idim++){
		tw = interpolWrite(method, idim);
		gw->SetPoint(idim-1, idim, tw);
		tr = interpolRead(idim);
		gr->SetPoint(idim-1, idim, tr);
	}
	gw->Draw("apl");
	gr->Draw("pl");
}

//___________________________________________________________
Float_t interpolWrite(const Int_t method, const Int_t ndim)
{
	if(!gSystem->FindFile(".", "5D_Gauss.root")) build(5, 1000000);
	TFile::Open("5D_Gauss.root");
	printf("\nWriting %dD interpolator ...\n", ndim);
	TTree *db = (TTree*)gFile->Get("db");
	TString var = "x0"; for(int idim=1; idim<ndim; idim++) var += Form(":x%d", idim);
	printf("\tBuilding interpolator ...\n");
	TKDPDF pdf(db, var.Data(), "", 400, 100000);
	pdf.SetInterpolationMethod(method);
	pdf.SetStore();

	
	printf("\tSetting up the interpolator ...\n");
	Float_t *c, val, v_err;
	Double_t *p = new Double_t[ndim], res, r_err;
	timer.Start(kTRUE);
	for(int inode=0; inode<pdf.GetNTNodes(); inode++){
		pdf.GetCOGPoint(inode, c, val, v_err);
		for(int idim=0; idim<ndim; idim++) p[idim] = (Double_t)c[idim];
// 		printf("Evaluate for node [%d] ", inode);
// 		for(int idim=0; idim<ndim; idim++) printf("%5.3f ", p[idim]); printf("\n");
		for(int it=0; it<nt; it++) pdf.Eval(p, res, r_err, kTRUE);
//		printf("R = %6.4f +- %6.4f\n", res, r_err);
	}
	timer.Stop();
	
	Float_t time = 1.E3*timer.CpuTime()/float(nt);
	printf("\tFinish interpolation in %6.2f [ms]\n", time);
	
	printf("\tSaving interpolator ...\n");
	TFile *fi = TFile::Open(Form("%dD_Interpolator.root", ndim), "RECREATE");
	pdf.Write(Form("%dDgauss", ndim));
	fi->Close();
	delete fi;
	
	delete [] p;

	return time;
}

//___________________________________________________________
Float_t interpolRead(const Int_t ndim)
{
	printf("Reading %dD interpolator ...\n", ndim);
	TFile::Open(Form("%dD_Interpolator.root", ndim));
	TKDPDF *pdf = (TKDPDF*)gFile->Get(Form("%dDgauss", ndim));
	gFile->Close();
	
	printf("\tDoing interpolation ...\n");
	Float_t *c, v, ve;
	Double_t *p = new Double_t[ndim], r, re;
	timer.Start(kTRUE);	
	for(int ip=0; ip<pdf->GetNTNodes(); ip++){
		pdf->GetCOGPoint(ip, c, v, ve);
		for(int idim=0; idim<ndim; idim++) p[idim] = (Double_t)c[idim];
		for(int it=0; it<nt; it++) pdf->Eval(p, r, re);
	}
	timer.Stop();
	Float_t time = 1.E3*timer.CpuTime()/float(nt);
	printf("\tFinish interpolation in %6.2f [ms]\n", time);
	delete [] p;
	return time;
}

//___________________________________________________________
void build(const int ndim, const int npoints)
{
	printf("Building DB ...\n");
	Float_t data[ndim];
	TFile::Open(Form("%dD_Gauss.root", ndim), "RECREATE");
	TTree *t = new TTree("db", Form("%dD data base for kD statistics", ndim));
	for(int idim=0; idim<ndim; idim++) t->Branch(Form("x%d", idim), &data[idim], Form("x%d/F", idim));

	for (Int_t ip=0; ip<npoints; ip++){
		for (Int_t id=0; id<ndim; id++) data[id]= gRandom->Gaus();
		t->Fill();
	}

	t->Write();
	gFile->Close();
	delete gFile;
}


 pdfIO.C:1
 pdfIO.C:2
 pdfIO.C:3
 pdfIO.C:4
 pdfIO.C:5
 pdfIO.C:6
 pdfIO.C:7
 pdfIO.C:8
 pdfIO.C:9
 pdfIO.C:10
 pdfIO.C:11
 pdfIO.C:12
 pdfIO.C:13
 pdfIO.C:14
 pdfIO.C:15
 pdfIO.C:16
 pdfIO.C:17
 pdfIO.C:18
 pdfIO.C:19
 pdfIO.C:20
 pdfIO.C:21
 pdfIO.C:22
 pdfIO.C:23
 pdfIO.C:24
 pdfIO.C:25
 pdfIO.C:26
 pdfIO.C:27
 pdfIO.C:28
 pdfIO.C:29
 pdfIO.C:30
 pdfIO.C:31
 pdfIO.C:32
 pdfIO.C:33
 pdfIO.C:34
 pdfIO.C:35
 pdfIO.C:36
 pdfIO.C:37
 pdfIO.C:38
 pdfIO.C:39
 pdfIO.C:40
 pdfIO.C:41
 pdfIO.C:42
 pdfIO.C:43
 pdfIO.C:44
 pdfIO.C:45
 pdfIO.C:46
 pdfIO.C:47
 pdfIO.C:48
 pdfIO.C:49
 pdfIO.C:50
 pdfIO.C:51
 pdfIO.C:52
 pdfIO.C:53
 pdfIO.C:54
 pdfIO.C:55
 pdfIO.C:56
 pdfIO.C:57
 pdfIO.C:58
 pdfIO.C:59
 pdfIO.C:60
 pdfIO.C:61
 pdfIO.C:62
 pdfIO.C:63
 pdfIO.C:64
 pdfIO.C:65
 pdfIO.C:66
 pdfIO.C:67
 pdfIO.C:68
 pdfIO.C:69
 pdfIO.C:70
 pdfIO.C:71
 pdfIO.C:72
 pdfIO.C:73
 pdfIO.C:74
 pdfIO.C:75
 pdfIO.C:76
 pdfIO.C:77
 pdfIO.C:78
 pdfIO.C:79
 pdfIO.C:80
 pdfIO.C:81
 pdfIO.C:82
 pdfIO.C:83
 pdfIO.C:84
 pdfIO.C:85
 pdfIO.C:86
 pdfIO.C:87
 pdfIO.C:88
 pdfIO.C:89
 pdfIO.C:90
 pdfIO.C:91
 pdfIO.C:92
 pdfIO.C:93
 pdfIO.C:94
 pdfIO.C:95
 pdfIO.C:96
 pdfIO.C:97
 pdfIO.C:98
 pdfIO.C:99
 pdfIO.C:100
 pdfIO.C:101
 pdfIO.C:102
 pdfIO.C:103
 pdfIO.C:104
 pdfIO.C:105
 pdfIO.C:106
 pdfIO.C:107
 pdfIO.C:108
 pdfIO.C:109
 pdfIO.C:110
 pdfIO.C:111