#include "tracking.h" #include "assert.h" #include #include #include #include #include "PndTpcCluster.h" #include "TEllipse.h" #include "TLine.h" #include "TCanvas.h" #include "TSystem.h" #include "TApplication.h" #define DEBUG std::cout << __FILE__ << " " << __LINE__ << std::endl tracking::tracking(int _visflag, double _r1, double _r2, int _nHOT, bool _stopROOT, std::string _name, unsigned int _mounting) : r1Y(_r1), r2Y(_r2), visflag(_visflag), minNhitsOnTrack(_nHOT), counter(0),stopROOT(_stopROOT), dir(_name.c_str(),_name.c_str()), name(_name),mounting(_mounting){ // cleanup(); minAX = -1.; maxAX = 1.; minBX = -100.; maxBX = 150.; minAY = -1.; maxAY = 1.; minBY = -100.; maxBY = 150.; nBinsAX = 150; nBinsBX = 150; nBinsAY = 150; nBinsBY = 150; r1X = 0.03; r2X = 2.1; /* static const double r1Y = 0.03; */ /* static const double r2Y = 2.1; */ canvas1=NULL; canvas2=NULL; xzHits=NULL; yzHits=NULL; xzErrHits=NULL; yzErrHits=NULL; xzSelHits=NULL; yzSelHits=NULL; xzFit = NULL; yzFit = NULL; assert(mounting == 1 || mounting ==2); switch(mounting){ case 1: maxX=99.2; maxY=8.; maxZ=85.; break; case 2: maxX=8.; maxY=85.; maxZ=99.2; break; } hits3D=NULL; houghHistoXZ=NULL; houghHistoYZ=NULL; for(int i=0;iGetYaxis()->SetTitle("X in mm"); xzHits_H->GetXaxis()->SetTitle("Z in mm"); yzHits_H->GetYaxis()->SetTitle("Y in mm"); yzHits_H->GetXaxis()->SetTitle("Z in mm"); break; case 2: xzHits_H->GetYaxis()->SetTitle("Y in mm"); xzHits_H->GetXaxis()->SetTitle("X in mm"); yzHits_H->GetYaxis()->SetTitle("Z in mm"); yzHits_H->GetXaxis()->SetTitle("X in mm"); break; } yzHits_H->GetYaxis()->SetTitleOffset(1.3); xzHits_H->GetYaxis()->SetTitleOffset(1.3); yzHits_H->GetYaxis()->SetTitleOffset(1.3); xzHits_H->SetStats(kFALSE); yzHits_H->SetStats(kFALSE); biasedResidX = new TH1D("biasedResidX","biasedResidX",50,-4.,4.); biasedResidY = new TH1D("biasedResidY","biasedResidY",50,-4.,4.); biasedResidZ = new TH1D("biasedResidZ","biasedResidZ",50,-4.,4.); chi2reduced = new TH1D("chi2reduced","chi2reduced",100,0.,10.); } bool tracking::processEvent(std::vector* clusters, int trigger,AnalysisEvent *analysisEvt) { bool returnVal = false; dir.cd(); cleanup(); NumberOfHits = clusters->size(); analysisEvt->setTrigger(trigger); for(int i=0;iat(i)->pos().x()*10.; HitCoordinates[i][1] = clusters->at(i)->pos().y()*10.; HitCoordinates[i][2] = clusters->at(i)->pos().z()*10.; HitCoordinatesError[i][0] = clusters->at(i)->sig().x()*10.; HitCoordinatesError[i][1] = clusters->at(i)->sig().y()*10.; HitCoordinatesError[i][2] = clusters->at(i)->sig().z()*10.; break; case 2: HitCoordinates[i][0] = clusters->at(i)->pos().y()*10.; HitCoordinates[i][1] = clusters->at(i)->pos().z()*10.; HitCoordinates[i][2] = clusters->at(i)->pos().x()*10.; HitCoordinatesError[i][0] = clusters->at(i)->sig().y()*10.; HitCoordinatesError[i][1] = clusters->at(i)->sig().z()*10.; HitCoordinatesError[i][2] = clusters->at(i)->sig().x()*10.; break; } HitCharge[i] = clusters->at(i)->amp(); clusterSize[i] = clusters->at(i)->size(); nPad[i] = clusters->at(i)->nPad(); nPadX[i] = clusters->at(i)->nPadX(); nPadY[i] = clusters->at(i)->nPadY(); } if(Max_NumberOfHits increase it" << std::endl; return false; } counter++; // cout << "Trigger: " << Trigger << endl; double _x1,_x2,_y1,_y2; makeHitGraph(0); makeHoughLines(0); makeHoughHisto(0,counter); makeHitGraph(1); makeHoughLines(1); makeHoughHisto(1,counter); double axmax,bxmax; findMaxInHisto(0,axmax,bxmax); double aymax,bymax; findMaxInHisto(1,aymax,bymax); findHitsOnTrack(1,aymax,bymax); makeSelHitGraph(0); makeSelHitGraph(1); if(nSelHits >= minNhitsOnTrack) { returnVal = true; fitReturn_t fitReturn; fitAll(axmax,bxmax,aymax,bymax,fitReturn); std::cout << "ax: " << fitReturn.ax << "\n" << "bx: " << fitReturn.bx << "\n" << "ay: " << fitReturn.ay << "\n" << "by: " << fitReturn.by << "\n" << std::endl; analysisEvt->setTrackParams(fitReturn.ax, fitReturn.bx, fitReturn.ay, fitReturn.by); analysisEvt->setAngles(); analysisEvt->setNselhits(nSelHits); analysisEvt->setNhits(NumberOfHits); char buf[50]; sprintf(buf,"%f*x+%f",fitReturn.ax,fitReturn.bx); xzFit = new TF1(buf,buf,0.,maxZ); xzFit->SetLineColor(kRed); xzFit->SetLineWidth(1); sprintf(buf,"%f*x+%f",fitReturn.ay,fitReturn.by); yzFit = new TF1(buf,buf,0.,maxZ); yzFit->SetLineColor(kRed); yzFit->SetLineWidth(1); //fill biased resid histo for(int i=0;iaddCluster(cluster); if( (HitCoordinates[ selHits[i] ][2] >= Z_START) && (HitCoordinates[ selHits[i] ][2] < Z_STOP) ){ biasedResidX->Fill(dx); biasedResidY->Fill(dy); biasedResidZ->Fill(dz); } } if(analysisEvt->getMinYresid()>1.) returnVal = false; chi2reduced->Fill(fitReturn.chi2/(nSelHits*2. - 4.)); } //fit subset if(visflag==1 && NumberOfHits>2) { char bufa[50]; sprintf(bufa,"canvas_a_%s",name.c_str()); char bufb[50]; sprintf(bufb,"canvas_b_%s",name.c_str()); char buf2[50]; sprintf(buf2,"HTA - %s - trigger: %d",name.c_str(),trigger); if(stopROOT) { canvas1=new TCanvas(bufa,buf2,700,0 ,600,430); canvas2=new TCanvas(bufb,buf2,700,500,600,430); } else { canvas1=new TCanvas(bufa,buf2,0,0 ,600,430); canvas2=new TCanvas(bufb,buf2,0,500,600,430); } // TCanvas* myCanvas2=new TCanvas("myCanvas2","Hough Transform Analysis",400,400); // TCanvas* myCanvas3=new TCanvas("myCanvas3","Hough Transform Analysis",400,400); // TCanvas* myCanvas4=new TCanvas("myCanvas4","Hough Transform Analysis",400,400); canvas1->Divide(2,1); canvas2->Divide(2,1); canvas1->cd(1); xzHits_H->Draw(); for(int i=0;iDraw("P"); } xzSelHits->Draw("P"); xzErrHits->Draw("P"); if(nSelHits >= minNhitsOnTrack) xzFit->Draw("same"); canvas1->cd(2); yzHits_H->Draw(); for(int i=0;iDraw("P"); } yzSelHits->Draw("P"); yzErrHits->Draw("P"); if(nSelHits >= minNhitsOnTrack) yzFit->Draw("same"); canvas2->cd(1); // houghLinesXZ_H->Draw(); houghHistoXZ->Draw("colz"); for(int i=0;iDraw("same"); } canvas2->cd(2); // houghLinesYZ_H->Draw(); houghHistoYZ->Draw("colz"); for(int i=0;iDraw("same"); } TEllipse* ell = new TEllipse(aymax,bymax,r1Y,r2Y); ell->SetLineWidth(4); ell->Draw("same"); // dir.ls(); if(stopROOT) { gApplication->SetReturnFromRun(kTRUE); gSystem->Run(); } //delete myCanvas1; // delete myCanvas2; // delete myCanvas3; // delete myCanvas4; } return returnVal; } tracking::~tracking(){ // cleanup(); } void tracking::findMaxInHisto(int xyswitch, double& amax,double& bmax) { double minA,maxA,minB,maxB,nBinsA,nBinsB; TH2D* hist; switch(xyswitch) { case 0: hist = houghHistoXZ; minA = minAX; maxA = maxAX; minB = minBX; maxB = maxBX; nBinsA = nBinsAX; nBinsB = nBinsBX; break; case 1: hist = houghHistoYZ; minA = minAY; maxA = maxAY; minB = minBY; maxB = maxBY; nBinsA = nBinsAY; nBinsB = nBinsBY; break; } double binA = (maxA - minA)/nBinsA; double binB = (maxB - minB)/nBinsB; double maxEntry = -1; for(int ia=0;iaGetBinContent(ia+1,ib+1) > maxEntry) { maxEntry = hist->GetBinContent(ia+1,ib+1); amax = minA + ia*binA + 0.5*binA; bmax = minB + ib*binB + 0.5*binB; } } } } void tracking::makeHoughLines(int xyswitch){ char buf[50]; for(int i=0;iGaus(HitCoordinates[i][0],HitCoordinatesError[i][0]),HitCoordinates[i][2]); houghLinesXZ[i] = new TF1(buf,buf,minAX,maxAX); // houghLinesXZ[i]->SetLineColor(kBlue); houghLinesXZ[i]->SetLineStyle(2); break; case 1: sprintf(buf,"%f-%f*x",HitCoordinates[i][1],HitCoordinates[i][2]); houghLinesYZ[i] = new TF1(buf,buf,minAY,maxAY); // houghLinesYZ[i]->SetLineColor(kBlue); houghLinesYZ[i]->SetLineStyle(2); break; } } } void tracking::findHitsOnTrack(int xyswitch, double a0,double b0){ double z,x_or_y; double discr; for(int i=0;i=0) houghLinesXZ[ihit]->SetLineStyle(1); break; case 1: discr = r1Y*r1Y*slope*slope + r2Y*r2Y - offset*offset; if(discr>=0) { selHits[nSelHits] = ihit; nSelHits++; } if(discr>=0) houghLinesYZ[ihit]->SetLineStyle(1); if(discr>=0) houghLinesYZ[ihit]->SetLineWidth(1); if(discr>=0) houghLinesYZ[ihit]->SetLineColor(kGreen); break; } } } void tracking::makeHoughHisto(int xyswitch,int nevt){ //char buf[50]; switch(xyswitch) { case 0: //sprintf(buf,"houghHistoXZ%i",nevt); houghHistoXZ = new TH2D("","",nBinsAX,minAX,maxAX,nBinsBX,minBX,maxBX); houghHistoXZ->SetStats(kFALSE); houghHistoXZ->GetYaxis()->SetTitle("BX"); houghHistoXZ->GetXaxis()->SetTitle("AX"); break; case 1: //sprintf(buf,"houghHistoYZ%i",nevt); houghHistoYZ = new TH2D("","",nBinsAY,minAY,maxAY,nBinsBY,minBY,maxBY); houghHistoYZ->SetStats(kFALSE); houghHistoYZ->GetYaxis()->SetTitle("BY"); houghHistoYZ->GetXaxis()->SetTitle("AY"); break; } for(int ihit=0;ihit 0) { houghHistoXZ->SetBinContent(ia+1,ib+1,houghHistoXZ->GetBinContent(ia+1,ib+1) + weight); } } } break; case 1: for(int ia=0;ia 0) { houghHistoYZ->SetBinContent(ia+1,ib+1,houghHistoYZ->GetBinContent(ia+1,ib+1) + weight); } } } break; } } } int tracking::binWeight(int ia, int ib, int ihit , int xyswitch) { double minA,maxA,minB,maxB,nBinsA,nBinsB; double x_or_y; double z = HitCoordinates[ihit][2]; switch(xyswitch) { case 0: x_or_y = HitCoordinates[ihit][0]; minA = minAX; maxA = maxAX; minB = minBX; maxB = maxBX; nBinsA = nBinsAX; nBinsB = nBinsBX; break; case 1: x_or_y = HitCoordinates[ihit][1]; minA = minAY; maxA = maxAY; minB = minBY; maxB = maxBY; nBinsA = nBinsAY; nBinsB = nBinsBY; break; } double binA = (maxA - minA)/nBinsA; double binB = (maxB - minB)/nBinsB; double a0 = minA + ia*binA; double b0 = minB + ib*binB; double a1 = a0 + binA; double b1 = b0 + binB; double a_at_b0 = (x_or_y-b0)/z; double a_at_b1 = (x_or_y-b1)/z; double b_at_a0 = -1.0*a0*z+x_or_y; double b_at_a1 = -1.0*a1*z+x_or_y; bool left=false; bool right=false; bool top=false; bool bottom=false; if(b_at_a0>b0 && b_at_a0b0 && b_at_a1a0 && a_at_b0a0 && a_at_b1b0 && b_at_a0b0 && b_at_a1a0 && a_at_b0a0 && a_at_b1a0 && a_at_b0a0 && a_at_b1b0 && b_at_a1b0 && b_at_a1a0 && a_at_b1maxAmp) maxAmp=HitCharge[i]; if(HitCharge[i]SetMarkerStyle(24); _gr_->SetMarkerSize(minMarkerSize+(maxMarkerSize-minMarkerSize)*(HitCharge[i]-minAmp)/(maxAmp-minAmp)); xzHitsVec.push_back(_gr_); break; case 1: _gr_ = new TGraph(1,singleX,singleY); _gr_->SetMarkerStyle(24); _gr_->SetMarkerSize(minMarkerSize+(maxMarkerSize-minMarkerSize)*(HitCharge[i]-minAmp)/(maxAmp-minAmp)); yzHitsVec.push_back(_gr_); break; } } switch(xyswitch) { case 0: xzHits = new TGraphErrors(NumberOfHits,xvals,yvals); xzHits->SetMarkerStyle(24); xzErrHits = new TGraphErrors(NumberOfHits,xvals,yvals,xerrs,yerrs); xzErrHits->SetMarkerStyle(1); break; case 1: yzHits = new TGraphErrors(NumberOfHits,xvals,yvals); yzHits->SetMarkerStyle(24); yzErrHits = new TGraphErrors(NumberOfHits,xvals,yvals,xerrs,yerrs); yzErrHits->SetMarkerStyle(1); break; } } void tracking::makeSelHitGraph(int xyswitch) { double xvals[Max_NumberOfHits]; double yvals[Max_NumberOfHits]; for(int i=0;iSetMarkerSize(1.); xzSelHits->SetMarkerColor(kGreen); xzSelHits->SetMarkerStyle(20); break; case 1: yzSelHits = new TGraph(nSelHits,xvals,yvals); yzSelHits->SetMarkerSize(1.); yzSelHits->SetMarkerColor(kGreen); yzSelHits->SetMarkerStyle(20); break; } } int tracking::fitAll(double ax_s, double bx_s, double ay_s, double by_s, fitReturn_t &fitReturn) { if(nSelHits skipped" << std::endl; return 0; } if(nSelHits>MAXHITS) { std::cout << "nSelHits>MAXHITS for this event -> skipped" << std::endl; return 0; } fitArg_t fitArg; for(int i=0;i