//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcRecoTester // see PndTpcRecoTester.hh for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndTpcRecoTester.h" // C/C++ Headers ---------------------- #include #include #include // Collaborating Class Headers -------- #include "PndTpcCluster.h" #include "Kalman.h" #include "PndTpcClusterRadius.h" #include "PndTpcConfMapRecoHit.h" #include "PndTpcConfMapFit.h" #include "DetPlane.h" #include "PndTpcConfTrackFinder.h" #include "TrackCand.h" #include "Track.h" #include "TCovEllipse.h" #include "TGraph.h" #include "TFile.h" #include "TTree.h" #include "TRandom.h" #include "TH1I.h" #include "TF2.h" #include "TH2D.h" #include "TLorentzVector.h" #include "TPolyMarker3D.h" #include "TPolyLine3D.h" #include "DebugLogger.h" #include "dbgstream.h" #include "TMatrixT.h" #include "TVectorD.h" #include "StdDiscriminantFcn.h" #include "PndTpcRiemannHit.h" #include "PndTpcRiemannTrack.h" #include "PndTpcRiemannTrackFinder.h" #include "PndTpcRiemannHTCorrelator.h" #include "PndTpcProximityHTCorrelator.h" #include "TMath.h" // Class Member definitions ----------- ClassImp(PndTpcRecoTester) void PndTpcRecoTester::testConfMap(){ std::vector cll; // clusterlist maketoytracks(2,cll); TGraph* confhits=new TGraph(cll.size()); TGraph* hits=new TGraph(cll.size()); for(int i=0;iSetPoint(i,cll[i]->pos().X(),cll[i]->pos().Y()); PndTpcConfMapRecoHit hit(cll[i]); confhits->SetPoint(i,hit.getXcf(), hit.getHitCoord(DetPlane())[0][0]); } cll.clear(); maketoytracks(2,cll,true); TGraph* confhits2=new TGraph(cll.size()); TGraph* hits2=new TGraph(cll.size()); for(int i=0;iSetPoint(i,cll[i]->pos().X(),cll[i]->pos().Y()); PndTpcConfMapRecoHit hit(cll[i]); confhits2->SetPoint(i,hit.getXcf(), hit.getHitCoord(DetPlane())[0][0]); } TFile* outfile=new TFile("confhits.root","RECREATE"); confhits->SetTitle("Conformal Hits"); confhits->Write("confhits"); hits->SetTitle("Hits"); hits->Write("hits"); confhits2->SetTitle("Conformal Hits from IP"); confhits2->Write("confhitsIP"); hits2->SetTitle("Hits from IP"); hits2->Write("hitsIP"); outfile->Close(); return; } void PndTpcRecoTester::testConfMapFit(){ PndTpcConfMapFit myfit; TMatrixT cov(2,2); //cov[0][0]=10; //cov[1][1]=10; //cov[0][1]=-1; //cov[1][0]=-1; //myfit.setCov(cov); myfit.Print(); PndTpcCluster mycl(TVector3(5,5,3),1,0); PndTpcConfMapRecoHit hit(&mycl); std::cout<<"Residual:"< cands; _finder.buildTracks(cll,cands); //std::cout<getNHits()<<" hits and radius "<<1./cands[i]->getCurv()<& trks=_finder.getTrkListRef(); // beware using reference! for(unsigned int i=0;i(trks[i]->getTrackRep(0))->isRotated()) std::cout<<"Track "<getNumHits(); for(unsigned int ih=0;ih(trks[i]->getHit(ih)); confhits->SetPoint(hitcounter,conf->getXcf(), conf->getHitCoord(DetPlane())[0][0]); zshits->SetPoint(hitcounter++,conf->s(), conf->z()); }// end loop over hits in track }// end loop over tracks TFile* outfile=new TFile("confhits.root","RECREATE"); confhits->Write("confhits"); zshits->Write("zshits"); outfile->Close(); return cands.size(); } void PndTpcRecoTester::testRotated(){ PndTpcConfMapRecoHit hit1(new PndTpcCluster(TVector3(5,5,3),1,0)); std::cout<Fill(testConfFinder()); } TFile* outfile=new TFile("toystat.root","RECREATE"); histo->Write(); outfile->Close(); } void PndTpcRecoTester::testConfTrackMerge(int nevents, bool split, bool merge){ PndTpcConfTrackFinder _finder; _finder.configure(1,1,2, // proximity cuts 3, // chi2cut 3, // numhitsforfit merge, // do merge 0.05,0.05, // merge cuts 4.); // proximity merge cut if(split)_finder.setMaxHitsInTrack(20); std::vector > confresults; std::vector > confcov; _finder.setConfFitResults(&confresults,&confcov); // make event std::vector rv; std::vector dirv; std::vector dipv; std::vector startv; //maketoyevent(2,rv,dirv,dipv); rv.push_back(50); rv.push_back(51); TVector2 dir(1,0.3);dir=dir.Unit(); dirv.push_back(dir); TVector2 dir2(1.1,0.6);dir2=dir2.Unit(); dirv.push_back(dir2); dipv.push_back(1); dipv.push_back(1); TVector2 start1(0,0);startv.push_back(start1); TVector2 start2(0,0);startv.push_back(start2); for(int evts=0; evts cll; // clusterlist maketoyhits(2,rv,dirv,dipv,startv,cll); std::vector cands; std::vector cands2; _finder.buildTracks(cll,cands); } TFile* outfile=new TFile("toystat.root","RECREATE"); TTree* tr=new TTree("stattree","stattree"); double p1; double p2; tr->Branch("p1",&p1,"p1/D"); tr->Branch("p2",&p2,"p2/D"); std::cout<Fill(); TCovEllipse* el=new TCovEllipse(confcov[i],p1,p2); confcov[i].Print(); std::cout<<"p1="<Write(name); } tr->Write(); outfile->Close(); } //************************************************************************ //****************** discrimant analysis ********************************* // param[0]=m[0], param[1]=m[1], param[2]=cov[0][0], param[3]=cov[1][1], // param[4]=cov[1][0]=cov[0][1] double ftf2(Double_t *x, Double_t *params) { TVectorT m(2); m[0]=params[0]; m[1]=params[1]; TMatrixT cov(2,2); cov[0][0]=params[2]; cov[1][1]=params[3]; cov[0][1]=params[4]; cov[1][0]=cov[0][1]; StdDiscriminantFcn dis(m,cov); TVectorT xv(2,x); return dis(xv); } double dis2(Double_t *x, Double_t *params) { // class1 TVectorT m1(2); m1[0]=params[0]; m1[1]=params[1]; TMatrixT cov1(2,2); cov1[0][0]=params[2]; cov1[1][1]=params[3]; cov1[0][1]=params[4]; cov1[1][0]=cov1[0][1]; StdDiscriminantFcn dis1(m1,cov1); // class2 TVectorT m2(2); m2[0]=params[5]; m2[1]=params[6]; TMatrixT cov2(2,2); cov2[0][0]=params[7]; cov2[1][1]=params[8]; cov2[0][1]=params[9]; cov2[1][0]=cov2[0][1]; StdDiscriminantFcn dis2(m2,cov2); TVectorT xv(2,x); return dis1(xv)-dis2(xv); } double dis3(Double_t *x, Double_t *params) { double d1=ftf2(x, params); double d2=ftf2(x, &(params[5])); double d3=ftf2(x, &(params[10])); double m1= d1>d2 ? d1 : d2; return m1>d3 ? m1 : d3; } double dis3_cut(Double_t *x, Double_t *params) { double d=dis3(x,params); return params[15]>d ? params[15] : d; } void PndTpcRecoTester::testStdDis(double* par) { TF2* f=new TF2("dis",&ftf2,0,4,0,4,5); double pars[16]={2,2,0.4,0.8,0.5, 5,1,0.4,0.8,0.5, 3,4,0.1,0.2,0.1,-2}; if(par!=NULL)for(int i=0;i<16;++i)pars[i]=par[i]; f->SetParameters(pars); TMatrixT cov(2,2); cov[0][0]=pars[2]; cov[1][1]=pars[3]; cov[0][1]=pars[4]; cov[1][0]=cov[0][1]; TCovEllipse* el=new TCovEllipse(cov,pars[0],pars[1]); TF2* f2=new TF2("dis2",&dis2,-5,10,-5,10,10); f2->SetParameters(pars); TMatrixT cov2(2,2); cov2[0][0]=pars[7]; cov2[1][1]=pars[8]; cov2[0][1]=pars[9]; cov2[1][0]=cov2[0][1]; TCovEllipse* el2=new TCovEllipse(cov2,pars[5],pars[6]); TF2* f3=new TF2("dis3",&dis3,-5,10,-5,10,15); f3->SetParameters(pars); TMatrixT cov3(2,2); cov3[0][0]=pars[12]; cov3[1][1]=pars[13]; cov3[0][1]=pars[14]; cov3[1][0]=cov2[0][1]; TCovEllipse* el3=new TCovEllipse(cov3,pars[10],pars[11]); TF2* f4=new TF2("dis3_cut",&dis3_cut,-5,10,-5,10,16); f4->SetParameters(pars); TFile* file=new TFile("StdDis.root","RECREATE"); el->Write("covel"); el2->Write("covel2"); el3->Write("covel3"); f->Write(); f2->Write(); f3->Write(); f4->Write(); file->Close(); } // *********************************************************************** // *************** Riemann tracker *************************************** void PndTpcRecoTester::testRiemannMap(){ std::vector cll; // clusterlist maketoytracks(1,cll); std::vector rhits; int nhits=cll.size(); for(int i=0;ix(); //x.Print(); track.addHit(rhits[j]); TVector3 r=x-TVector3(0,0,0.5); //std::cout<<"R="<SetPoint(j,x.X(),x.Y(),x.Z()); } track.av().Print(); track.refit(); track.szFit(); track.n().Print(); std::cout<<"abs(n)="<x().X(); o[1]=rhits[0]->x().Y(); o[2]=rhits[0]->x().Z(); TVectorD e=o+track.n(); TGraph* sz=new TGraph(nhits); for(int j=0;jcalcPosOnTrk(&track); sz->SetPoint(j,rhits[j]->s(),rhits[j]->z()); } TPolyLine3D* arr=new TPolyLine3D(2); arr->SetPoint(0,o[0],o[1],o[2]); arr->SetPoint(1,e[0],e[1],e[2]); TFile* file=new TFile("Riemann.root","RECREATE"); line->Write("rieTrack"); arr->Write("arrow"); sz->Write("sz"); file->Close(); } void PndTpcRecoTester::testRiemannFit(unsigned int ntrk, double r){ TH1D* rh=new TH1D("rh","rh",100,r-20,r+20); TH1D* diph=new TH1D("diph","diph",40,-0.1,0.1); double mean=0; PndTpcRiemannTrackFinder finder; finder.setMinHitsForFit(4); finder.addCorrelator(new PndTpcRiemannHTCorrelator(1E-3,0.01,2.0)); finder.addCorrelator(new PndTpcProximityHTCorrelator(2.)); for(int i=0;i cll; // clusterlist std::vector rv; std::vector dirv; std::vector dipv; std::vector startv; rv.push_back(r); dipv.push_back(10); maketoyevent(1,rv,dirv,dipv,startv); maketoyhits(1,rv,dirv,dipv,startv,cll); std::vector cands; finder.buildTracks(cll,cands); int ncands=cands.size(); for(int i=0;ir()>10000)continue; mean+=trk->r()*100; rh->Fill(trk->r()*100); diph->Fill(fabs(trk->m())-0.2); } } mean/=(double)ntrk; std::cout<<"mean="<IsOpen()){std::cout<<"No file"<Write(); diph->Write(); outf->Close(); } void PndTpcRecoTester::testRiemannFinder(unsigned int ntrk){ std::vector cll; // clusterlist maketoytracks(ntrk,cll); std::vector cands; PndTpcRiemannTrackFinder finder; finder.setMinHitsForFit(4); finder.addCorrelator(new PndTpcRiemannHTCorrelator(1E-3,0.01,2.0)); finder.addCorrelator(new PndTpcProximityHTCorrelator(2.)); finder.buildTracks(cll,cands); unsigned int ntrks=cands.size(); //std::vector marker; TFile* file=new TFile("RiemannFinder.root","RECREATE"); for(int i=0;in()[0], trk->n()[1], trk->n()[2], trk->c()); trk->szFit(); unsigned int nhits=trk->getNumHits(); TPolyMarker3D* maker=new TPolyMarker3D(nhits); TPolyMarker3D* clust=new TPolyMarker3D(nhits); TGraph* sz=new TGraph(nhits); for(int h=0;hgetHit(h); maker->SetPoint(h,hit->x().X(),hit->x().Y(),hit->x().Z()); sz->SetPoint(h,hit->s(),hit->z()); clust->SetPoint(h,hit->cluster()->pos().X()/30,hit->cluster()->pos().Y()/30,0); } char name[200]; sprintf(name,"track%i",i); maker->Write(name); sprintf(name,"sztrack%i",i); sz->Write(name); sprintf(name,"clusters%i",i); clust->Write(name); sprintf(name,"plane%i",i); plane->Write(name); } file->Close(); } // *********************************************************************** // *************** Private methods *************************************** void PndTpcRecoTester::maketoyevent(int n,std::vector& rv,std::vector& dirv, std::vector& dipv, std::vector& startv){ bool rflag=false; bool dipflag=false; if(rv.size()!=0)rflag=true; if(dipv.size()!=0)dipflag=true; for(int i=0;iUniform(30,70); double dirstartx; double dirstarty; gRandom->Circle(dirstartx,dirstarty,15); TVector2 dir(dirstartx,dirstarty); double dz_dphi=gRandom->Uniform(1.,100.); double startr=gRandom->Uniform(0,40); double startx; double starty; gRandom->Circle(startx,starty,startr); TVector2 start(startx,starty); std::cout<<"Track: r="<& rv, std::vector& dirv, std::vector& dipv, std::vector& startv, std::vector& cll){ //produce hits TGraph* hits=new TGraph(); TGraph* confhits=new TGraph(); TGraph* hitsxz=new TGraph(); TGraph* confhits_shift=new TGraph(); unsigned int hitcounter=0; double sig=0.01; // sigma in space for(int t=0;tUniform(-1,1)>0 ? 1. : -1.; std::cout<<"rot="<Gaus(0,sig); double yhit=point.Y()+gRandom->Gaus(0,sig); double zhit=phi*dz_dphi+gRandom->Gaus(0,sig); double r=TMath::Sqrt(xhit*xhit+yhit*yhit); if(r<5) continue; hits->SetPoint(hitcounter,xhit,yhit); hitsxz->SetPoint(hitcounter,xhit,zhit); PndTpcCluster* cl=new PndTpcCluster(TVector3(xhit,yhit,zhit),1,hitcounter); PndTpcConfMapRecoHit conf(cl); conf.setRotated(); cll.push_back(cl); confhits->SetPoint(hitcounter,conf.getXcf(),conf.getHitCoord(DetPlane())[0][0]); conf.setReferencePoint(start.X(),start.Y()); confhits_shift->SetPoint(hitcounter,conf.getXcf(),conf.getHitCoord(DetPlane())[0][0]); ++hitcounter; ++hitsintrk; } //std::cout<Write("hits"); hitsxz->Write("hitsxz"); confhits->Write("confhits"); confhits_shift->Write("confhits2"); outfile->Close(); } void PndTpcRecoTester::maketoytracks(int n,std::vector& cll, bool vertex) { // make events std::vector rv; std::vector dirv; std::vector dipv; std::vector startv; maketoyevent(n,rv,dirv,dipv,startv); if(vertex){ for(int i=0;i