26 void kdTreeBinning() {
31 const UInt_t DATASZ = 10000;
32 const UInt_t DATADIM = 2;
33 const UInt_t NBINS = 50;
35 Double_t smp[DATASZ * DATADIM];
38 double sig[2] = {2,3};
41 for (UInt_t i = 0; i < DATADIM; ++i)
42 for (UInt_t j = 0; j < DATASZ; ++j)
43 smp[DATASZ * i + j] = r.Gaus(mu[i], sig[i]);
45 UInt_t h1bins = (UInt_t) sqrt(NBINS);
47 TH2D* h1 =
new TH2D(
"h1BinTest",
"Regular binning", h1bins, -5., 5., h1bins, -5., 5.);
48 for (UInt_t j = 0; j < DATASZ; ++j)
49 h1->Fill(smp[j], smp[DATASZ + j]);
55 TKDTreeBinning* kdBins =
new TKDTreeBinning(DATASZ, DATADIM, smp, NBINS);
57 UInt_t nbins = kdBins->GetNBins();
58 UInt_t dim = kdBins->GetDim();
60 const Double_t* binsMinEdges = kdBins->GetBinsMinEdges();
61 const Double_t* binsMaxEdges = kdBins->GetBinsMaxEdges();
63 TH2Poly* h2pol =
new TH2Poly(
"h2PolyBinTest",
"KDTree binning", kdBins->GetDataMin(0), kdBins->GetDataMax(0), kdBins->GetDataMin(1), kdBins->GetDataMax(1));
65 for (UInt_t i = 0; i < nbins; ++i) {
66 UInt_t edgeDim = i * dim;
67 h2pol->AddBin(binsMinEdges[edgeDim], binsMinEdges[edgeDim + 1], binsMaxEdges[edgeDim], binsMaxEdges[edgeDim + 1]);
70 for (UInt_t i = 1; i <= kdBins->GetNBins(); ++i)
71 h2pol->SetBinContent(i, kdBins->GetBinDensity(i - 1));
73 std::cout <<
"Bin with minimum density: " << kdBins->GetBinMinDensity() << std::endl;
74 std::cout <<
"Bin with maximum density: " << kdBins->GetBinMaxDensity() << std::endl;
76 TCanvas* c1 =
new TCanvas(
"glc1",
"TH2Poly from a kdTree",0,0,600,800);
82 h2pol->Draw(
"COLZ L");
89 std::vector<Double_t> z = std::vector<Double_t>(DATASZ, 0.);
90 for (UInt_t i = 0; i < DATASZ; ++i)
91 z[i] = (Double_t) h2pol->GetBinContent(h2pol->FindBin(smp[i], smp[DATASZ + i]));
93 TGraph2D *g =
new TGraph2D(DATASZ, smp, &smp[DATASZ], &z[0]);
94 g->SetMarkerStyle(20);
103 TH2Poly* h2polrebin =
new TH2Poly(
"h2PolyBinTest",
"KDTree binning", kdBins->GetDataMin(0), kdBins->GetDataMax(0), kdBins->GetDataMin(1), kdBins->GetDataMax(1));
104 h2polrebin->SetFloat();
109 kdBins->SortBinsByDensity();
111 for (UInt_t i = 0; i < kdBins->GetNBins(); ++i) {
112 const Double_t* binMinEdges = kdBins->GetBinMinEdges(i);
113 const Double_t* binMaxEdges = kdBins->GetBinMaxEdges(i);
114 h2polrebin->AddBin(binMinEdges[0], binMinEdges[1], binMaxEdges[0], binMaxEdges[1]);
117 for (UInt_t i = 1; i <= kdBins->GetNBins(); ++i){
118 h2polrebin->SetBinContent(i, kdBins->GetBinDensity(i - 1));}
120 std::cout <<
"Bin with minimum density: " << kdBins->GetBinMinDensity() << std::endl;
121 std::cout <<
"Bin with maximum density: " << kdBins->GetBinMaxDensity() << std::endl;
124 for (UInt_t i = 0; i < DATASZ; ++i)
125 z[i] = (Double_t) h2polrebin->FindBin(smp[i], smp[DATASZ + i]);
127 TGraph2D *g2 =
new TGraph2D(DATASZ, smp, &smp[DATASZ], &z[0]);
128 g2->SetMarkerStyle(20);
135 TCanvas* c4 =
new TCanvas(
"glc4",
"TH2Poly from a kdTree (Ordered)",50,50,800,800);
139 h2polrebin->Draw(
"COLZ L");
148 TKDTreeBinning* kdX =
new TKDTreeBinning(DATASZ, 1, &smp[0], 20);
149 TKDTreeBinning* kdY =
new TKDTreeBinning(DATASZ, 1, &smp[DATASZ], 40);
152 kdX->SortOneDimBinEdges();
153 kdY->SortOneDimBinEdges();
155 TH1* hX=
new TH1F(
"hX",
"X projection", kdX->GetNBins(), kdX->GetOneDimBinEdges());
156 for(
int i=0; i<kdX->GetNBins(); ++i){
157 hX->SetBinContent(i+1, kdX->GetBinDensity(i));
160 TH1* hY=
new TH1F(
"hY",
"Y Projection", kdY->GetNBins(), kdY->GetOneDimBinEdges());
161 for(
int i=0; i<kdY->GetNBins(); ++i){
162 hY->SetBinContent(i+1, kdY->GetBinDensity(i));