X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STAT%2FTKDInterpolator.cxx;h=31d846a0c68c14356a76ae7c6a2779fdad487037;hb=052e193bd68de48c12c199c9b396812701f8eab5;hp=ad7f08d991fa0638ceb49a656e554410b24cceff;hpb=316a7f5a175681144596d0f7d69cf1b6ba9c4c50;p=u%2Fmrichter%2FAliRoot.git diff --git a/STAT/TKDInterpolator.cxx b/STAT/TKDInterpolator.cxx index ad7f08d991f..31d846a0c68 100644 --- a/STAT/TKDInterpolator.cxx +++ b/STAT/TKDInterpolator.cxx @@ -1,588 +1,86 @@ #include "TKDInterpolator.h" +#include "TKDNodeInfo.h" -#include "TLinearFitter.h" -#include "TVector.h" -#include "TTree.h" -#include "TH2.h" -#include "TObjArray.h" -#include "TObjString.h" -#include "TPad.h" -#include "TBox.h" -#include "TGraph.h" -#include "TMarker.h" -#include "TRandom.h" -#include "TROOT.h" +#include "TError.h" +#include "TClonesArray.h" ClassImp(TKDInterpolator) -ClassImp(TKDInterpolator::TKDNodeInfo) -///////////////////////////////////////////////////////////////////// -// Memory setup of protected data memebers -// fRefPoints : evaluation point of PDF for each terminal node of underlying KD Tree. -// | 1st terminal node (fNDim point coordinates) | 2nd terminal node (fNDim point coordinates) | ... -// -// fRefValues : evaluation value/error of PDF for each terminal node of underlying KD Tree. -// | 1st terminal node (value) | 2nd terminal node (value) | ... | 1st terminal node (error) | 2nd terminal node (error) | ... -// -// status = |0|0|0|0|0|1(tri-cubic weights)|1(STORE)|1 INT(0 COG )| -///////////////////////////////////////////////////////////////////// + //_________________________________________________________________ -TKDInterpolator::TKDInterpolator() : TKDTreeIF() - ,fNTNodes(0) - ,fRefPoints(0x0) - ,fRefValues(0x0) - ,fCov(0x0) - ,fPar(0x0) - ,fPDFstatus(0x0) - ,fStatus(4) - ,fLambda(0) - ,fDepth(-1) - ,fBuffer(0x0) - ,fKDhelper(0x0) - ,fFitter(0x0) +TKDInterpolator::TKDInterpolator() : + TKDInterpolatorBase() { // Default constructor. To be used with care since in this case building // of data structure is completly left to the user responsability. } //_________________________________________________________________ -TKDInterpolator::TKDInterpolator(Int_t npoints, Int_t ndim, UInt_t bsize, Float_t **data) : TKDTreeIF(npoints, ndim, bsize, data) - ,fNTNodes(GetNTerminalNodes()) - ,fRefPoints(0x0) - ,fRefValues(0x0) - ,fCov(0x0) - ,fPar(0x0) - ,fPDFstatus(0x0) - ,fStatus(4) - ,fLambda(0) - ,fDepth(-1) - ,fBuffer(0x0) - ,fKDhelper(0x0) - ,fFitter(0x0) -{ -// Wrapper constructor for the similar TKDTree one. - - Build(); -} - - -//_________________________________________________________________ -TKDInterpolator::TKDInterpolator(TTree *t, const Char_t *var, const Char_t *cut, UInt_t bsize, Long64_t nentries, Long64_t firstentry) : TKDTreeIF() - ,fNTNodes(0) - ,fRefPoints(0x0) - ,fRefValues(0x0) - ,fCov(0x0) - ,fPar(0x0) - ,fPDFstatus(0x0) - ,fStatus(4) - ,fLambda(0) - ,fDepth(-1) - ,fBuffer(0x0) - ,fKDhelper(0x0) - ,fFitter(0x0) -{ -// Alocate data from a tree. The variables which have to be analysed are -// defined in the "var" parameter as a colon separated list. The format should -// be identical to that used by TTree::Draw(). -// -// - - TObjArray *vars = TString(var).Tokenize(":"); - fNDim = vars->GetEntriesFast(); fNDimm = 2*fNDim; - if(fNDim > 6/*kDimMax*/) Warning("TKDInterpolator(TTree*, const Char_t, const Char_t, UInt_t)", Form("Variable number exceed maximum dimension %d. Results are unpredictable.", 6/*kDimMax*/)); - fBucketSize = bsize; - - Int_t np; - Double_t *v; - for(int idim=0; idimDraw(((TObjString*)(*vars)[idim])->GetName(), cut, "goff", nentries, firstentry))){ - Warning("TKDInterpolator(TTree*, const Char_t, const Char_t, UInt_t)", Form("Can not access data for keys %s. Key defined on tree :", ((TObjString*)(*vars)[idim])->GetName() )); - TIterator *it = (t->GetListOfLeaves())->MakeIterator(); - TObject *o; - while(o = (*it)()) printf("\t%s\n", o->GetName()); - continue; - } - if(!fNpoints){ - fNpoints = np; - Info("TKDInterpolator(TTree*, const Char_t, const Char_t, UInt_t)", Form("Allocating %d data points in %d dimensions.", fNpoints, fNDim)); - fData = new Float_t*[fNDim]; - for(int idim=0; idimGetV1(); - for(int ip=0; ipFindNearestNeighbors(pointF, npoints+1, index, dist)){ - Error("Eval()", Form("Failed retriving %d neighbours for point:", npoints)); - for(int idim=0; idimClearPoints(); - for(int in=0; inAddPoint(fBuffer, fRefValues[index[in]], fRefValues[index[in]]*sig/w); - } - npoints += 4; - } while(fFitter->Eval()); - - // retrive fitter results - TMatrixD cov(fLambda, fLambda); - TVectorD par(fLambda); - fFitter->GetCovarianceMatrix(cov); - fFitter->GetParameters(par); - Double_t chi2 = fFitter->GetChisquare()/(npoints - 4 - fLambda); - - // store results - if(fStatus&2 && fStatus&1){ - fPar[node] = par; - fCov[node] = cov; - fPDFstatus[node] = 1; - } - - // Build df/dpi|x values - Double_t *fdfdp = &fBuffer[fLambda]; - ipar = 0; - fdfdp[ipar++] = 1.; - for(int idim=0; idimSetFormula(Form("hyp%d", fNDim+1)); -// -// -// Float_t pointF[50]; -// for(int idim=0; idimClearPoints(); -// do{ -// if(!fKDhelper->FindNearestNeighbors(pointF, npoints+1, index, dist)){ -// Error("Eval()", Form("Failed retriving %d neighbours for point:", npoints)); -// for(int idim=0; idimAddPoint(fBuffer, fRefValues[index[in]], fRefValues[index[in]]*uncertainty); -// } -// istart = npoints; -// npoints += 4; -// } while(fFitter->Eval()); -// delete [] w; -// -// // calculate evaluation -// // fFitter->PrintResults(3); -// TMatrixD cov(lambda, lambda); -// TVectorD par(lambda); -// fFitter->GetCovarianceMatrix(cov); -// fFitter->GetParameters(par); -// -// // Build temporary array to keep values df/dpi|x -// Double_t f[100]; -// ipar = 0; -// f[ipar++] = 1.; -// for(int idim=0; idimGetChisquare()/(npoints - 4 - lambda); -// -// for(int ipar=0; ipar> depth != 1) continue; - nnodes++; - } - - //printf("depth %d nodes %d\n", depth, nnodes); - - TH2 *h2 = 0x0; - if(!(h2 = (TH2S*)gROOT->FindObject("hNodes"))) h2 = new TH2S("hNodes", "", 100, fRange[2*ax1], fRange[2*ax1+1], 100, fRange[2*ax2], fRange[2*ax2+1]); - h2->GetXaxis()->SetTitle(Form("x_{%d}", ax1)); - h2->GetYaxis()->SetTitle(Form("x_{%d}", ax2)); - h2->Draw(); - - const Float_t border = 0.;//1.E-4; - TBox *node_array = new TBox[nnodes], *node; - Float_t *bounds = 0x0; - nnodes = 0; - for(int inode = 0; inode <= 2*fNnodes; inode++){ - if(depth == -1){ - if(!IsTerminal(inode)) continue; - } else if((inode+1) >> depth != 1) continue; - - node = &node_array[nnodes++]; - //node = new TBox(bounds[2*ax1]+border, bounds[2*ax2]+border, bounds[2*ax1+1]-border, bounds[2*ax2+1]-border); - node->SetFillStyle(3002); - node->SetFillColor(50+Int_t(gRandom->Uniform()*50.)); - bounds = GetBoundary(inode); - node->DrawBox(bounds[2*ax1]+border, bounds[2*ax2]+border, bounds[2*ax1+1]-border, bounds[2*ax2+1]-border); - } - if(depth != -1) return; - - // Draw reference points - TGraph *ref = new TGraph(GetNTerminalNodes()); - ref->SetMarkerStyle(3); - ref->SetMarkerSize(.7); - ref->SetMarkerColor(2); - for(int inode = 0; inode < GetNTerminalNodes(); inode++) ref->SetPoint(inode, fRefPoints[ax1][inode], fRefPoints[ax2][inode]); - ref->Draw("p"); - return; } //_________________________________________________________________ -void TKDInterpolator::DrawNode(Int_t tnode, UInt_t ax1, UInt_t ax2) +void TKDInterpolator::AddNode(const TKDNodeInfo &node) { -// Draw node "node" and the data points within. -// -// Observation: -// This function creates some graphical objects -// but don't delete it. Abusing this function may cause memory leaks ! - - if(tnode < 0 || tnode >= GetNTerminalNodes()){ - Warning("DrawNode()", Form("Terminal node %d outside defined range.", tnode)); - return; - } - - Int_t inode = tnode; - tnode += fNnodes; - // select zone of interest in the indexes array - Int_t *index = GetPointsIndexes(tnode); - Int_t nPoints = (tnode == 2*fNnodes) ? fNpoints%fBucketSize : fBucketSize; - - // draw data points - TGraph *g = new TGraph(nPoints); - g->SetMarkerStyle(7); - for(int ip = 0; ipSetPoint(ip, fData[ax1][index[ip]], fData[ax2][index[ip]]); - - // draw estimation point - TMarker *m=new TMarker(fRefPoints[ax1][inode], fRefPoints[ax2][inode], 20); - m->SetMarkerColor(2); - m->SetMarkerSize(1.7); - - // draw node contour - Float_t *bounds = GetBoundary(tnode); - TBox *n = new TBox(bounds[2*ax1], bounds[2*ax2], bounds[2*ax1+1], bounds[2*ax2+1]); - n->SetFillStyle(0); - - if(gPad) gPad->Clear(); - g->Draw("ap"); - m->Draw(); - n->Draw(); - - return; -} + if(!fNodes){ + Warning("TKDInterpolator::SetNode()", "Node array not defined."); + return; + } - -//__________________________________________________________________ -void TKDInterpolator::SetIntInterpolation(const Bool_t on) -{ -// Set interpolation bit to "on" and build/delete memory - - if(on) fStatus += fStatus&1 ? 0 : 1; - else fStatus += fStatus&1 ? -1 : 0; - TString formula; - if(on) formula = Form("hyp%d", fLambda-1); - else { - formula = "1"; - for(int idim=0; idimSetFormula(formula.Data()); + Int_t n(GetNTNodes()); + new((*fNodes)[n++]) TKDNodeInfo(node); } - //_________________________________________________________________ -void TKDInterpolator::SetSetStore(const Bool_t on) +Bool_t TKDInterpolator::Build(Int_t npoints, Int_t ndim) { -// Set store bit to "on" and build/delete memory - - if(on){ - fStatus += fStatus&2 ? 0 : 2; - if(!fCov){ - fPDFstatus = new Bool_t[fNTNodes]; - fCov = new TMatrixD[fNTNodes]; - fPar = new TVectorD[fNTNodes]; - for(int i=0; iHas(p)) return i; + + printf("Point p["); + for(int i=0; i= GetNTNodes()){ + Warning("TKDInterpolator::SetNode()", Form("Node array defined up to %d.", GetNTNodes())); + return kFALSE; + } + TKDNodeInfo *node = (TKDNodeInfo*)(*fNodes)[inode]; + (*node) = ref; + return kTRUE; }