#include "TChough2.h" #include #include"TGraph.h" #include"TGraphErrors.h" #include"TCanvas.h" #include"TApplication.h" #include"TSystem.h" #include"TRandom.h" #include"TEllipse.h" #include #include #include "TH2D.h" #include "TROOT.h" #include "TStyle.h" using std::pair; using std::cout; using std::endl; using std::vector; TChough2::TChough2(const TVector3& _yp,const TVector3& _zp ,int _nBinsTheta,int _nBinsR,double _cutR, double _cutTheta,double _minTheta, double _maxTheta, double _minR, double _maxR ) : TCabsHough(_yp,_zp){ nBinsR = _nBinsR; nBinsTheta =_nBinsTheta; cutTheta=_cutTheta; cutR=_cutR; minR=_minR; maxR=_maxR; minTheta=_minTheta; maxTheta=_maxTheta; canvas1 = NULL; houghHisto=NULL; for(int i=0;iSetStyle("Plain"); gStyle->SetPalette(1); sprintf(buf,"c%5.5f",r.Uniform()); std::string name; if(yp.x()==0){ name="Hough Transformation (z,y) -> (theta,r)"; }else{ name="Hough Transformation (z,x) -> (theta,r)"; } canvas1 = new TCanvas(buf,name.c_str(),_z,_y,_w,_h); TGraph* g = new TGraph(ypHit.size(),z,y); TGraphErrors* maxPoints = new TGraphErrors(maxVector.size(),thetaMax_,rMax_,thetaMaxE_,rMaxE_); canvas1->Divide(1,2); canvas1->cd(1); g->SetTitle(""); g->GetXaxis()->SetTitle("z"); g->SetMarkerStyle(24); g->SetMarkerSize(2.); g->Draw("AP"); vector mcTruthTracks; if(mcTruth!=NULL){ int nTracks=mcTruth->nTracks(); cout<getTrack(i); double aX=0; double bX=0; if(yp.x()==0){ cout<<"Y "<getAy(); bX=mcTrack->getBy(); }else{ cout<<"X "<getAx(); bX=mcTrack->getBx(); } sprintf(buf,"%f*x+%f",aX,bX); cout<SetLineStyle(1); mcTruthTracks.at(i)->SetLineWidth(1); mcTruthTracks.at(i)->Draw("same"); } } std::vector selHits; std::vector selHits2; for(unsigned int i=0;iSetLineStyle(1); houghLines[i]->SetLineWidth(1); houghLines[i]->SetLineColor(kGreen); houghLinesUpperBound[i]->SetLineColor(kGreen); houghLinesLowerBound[i]->SetLineColor(kGreen); } if(maxVector.size()>1){ if(hot(i,1)){ selHits2.push_back(i); houghLines[i]->SetLineStyle(1); houghLines[i]->SetLineWidth(1); houghLines[i]->SetLineColor(kBlue); houghLinesUpperBound[i]->SetLineColor(kBlue); houghLinesLowerBound[i]->SetLineColor(kBlue); } if(hot(i,1)&&hot(i,0)){ houghLines[i]->SetLineStyle(1); houghLines[i]->SetLineWidth(1); houghLines[i]->SetLineColor(kRed); houghLinesUpperBound[i]->SetLineColor(kRed); houghLinesLowerBound[i]->SetLineColor(kRed); } } } // cout<<"checking hotnes"<1){ for(unsigned int i=0;i0){ TGraph* gsel2 = new TGraph(selHits2.size(),zsel2,ysel2); gsel2->SetMarkerStyle(3); gsel2->SetMarkerSize(3); gsel2->SetMarkerColor(kBlue); gsel2->Draw("P"); } } if(selHits.size()>0){ TGraph* gsel = new TGraph(selHits.size(),zsel,ysel); gsel->SetMarkerStyle(2); gsel->SetMarkerColor(kRed); gsel->Draw("P"); } canvas1->cd(2); houghHisto->Draw("colz"); for(int i=0;iSetLineWidth(1); houghLines[i]->Draw("e1same"); houghLinesLowerBound[i]->Draw("same"); houghLinesUpperBound[i]->Draw("same"); } maxPoints->SetMarkerStyle(2); maxPoints->SetMarkerSize(5.); maxPoints->SetMarkerColor(kRed); maxPoints->Draw("*P"); canvas1->Update(); canvas1->Modified(); if(stop){ // cout<<"run"<SetReturnFromRun(kTRUE); gSystem->Run(); gROOT->Reset(); } } void TChough2::doHough(){ cleanup(); NumberOfHits = nHits(); assert(NumberOfHits<=Max_NumberOfHits); for(int i=0;i-1); assert(maxIndexnBinsTheta){ continue; } if(j<0){ continue; } else if(j>nBinsR){ continue; } if(!(j==maxBinR&&k==maxBinTheta)){ if(histo->GetBinContent(k,j)>=maxVal){ maxVal=histo->GetBinContent(k,j); //histo->SetBinContent(k,j,0); binTheta=k; binR=j; }else{ //histo->SetBinContent(k,j,0); } } } } histo->SetBinContent(binTheta,binR,0); if(binTheta!=-1&&binR!=-1){ maxBinTheta=binTheta; maxBinR=binR; } //cout<<"max around "< > &_maxVector, int _nOnMax) { TH2D* houghHistoCopy = new TH2D(*houghHisto); if(!weighting){ int maxBinTheta; int maxBinR; int zDummy; while(houghHistoCopy->GetBinContent(houghHistoCopy->GetMaximumBin(maxBinTheta,maxBinR,zDummy))>=_nOnMax){ std::vector > nearbyMax; double sumTheta=maxBinTheta; double sumR=maxBinR; std::pair max; max.first=maxBinTheta; max.second=maxBinR; nearbyMax.push_back(max); double maxVal=houghHistoCopy->GetBinContent(maxBinTheta,maxBinR); while(findMaxAroundPoint(houghHistoCopy,maxBinTheta,maxBinR)==maxVal){ max.first=maxBinTheta; max.second=maxBinR; nearbyMax.push_back(max); sumTheta+=maxBinTheta; sumR+=maxBinR; } max.first = sumTheta/nearbyMax.size(); max.second = sumR/nearbyMax.size(); cout<<"nearbyMax.size() "<nBinsTheta){ continue; } if(j<0){ continue; } else if(j>nBinsR){ continue; } houghHistoCopy->SetBinContent(k,j,0); } } } } }else{ for(int i=0;iGetMaximumBin(maxBinTheta,maxBinR,zDummy); double maxVal = houghHisto->GetBinContent(maxBinTheta,maxBinR); std::vector > nearbyMax; for (int k=maxBinTheta-2;k<=maxBinTheta+2;k++){ for(int j=maxBinR-2;j<=maxBinR+2;j++){ if(k<0){ continue; } else if(k>nBinsTheta){ continue; } if(j<0){ continue; } else if(j>nBinsR){ continue; } if(j!=maxBinR&&k!=maxBinTheta){ if(houghHisto->GetBinContent(k,j)==maxVal){ pair max; max.first=k; max.second=j; nearbyMax.push_back(max); } } } } pair max; max.first=maxBinTheta; max.second=maxBinR; // cout<<"maxBinTheta "<SetLineStyle(1); sprintf(buf,"%f*sin(x*3.141592654)+%f*cos(x*3.141592654)+%f*%f",HitCoordinates[i][0],HitCoordinates[i][1],nSigma,resolution.at(i)); sprintf(bufName,"%icopy%f*sin(x*3.141592654)+%f*cos(x*3.141592654)+%f*%f",i,HitCoordinates[i][0],HitCoordinates[i][1],nSigma,resolution.at(i)); houghLinesUpperBound[i] = new TF1(bufName,buf,minTheta/3.141592654,maxTheta/3.141592654); houghLinesUpperBound[i]->SetLineStyle(2); houghLinesUpperBound[i]->SetLineWidth(1); sprintf(buf,"%f*sin(x*3.141592654)+%f*cos(x*3.141592654)-%f*%f",HitCoordinates[i][0],HitCoordinates[i][1],nSigma,resolution.at(i)); sprintf(bufName,"%icopy%f*sin(x*3.141592654)+%f*cos(x*3.141592654)-%f*%f",i,HitCoordinates[i][0],HitCoordinates[i][1],nSigma,resolution.at(i)); houghLinesLowerBound[i] = new TF1(bufName,buf,minTheta/3.141592654,maxTheta/3.141592654); houghLinesLowerBound[i]->SetLineStyle(2); houghLinesLowerBound[i]->SetLineWidth(1); } } void TChough2::findHitsOnTrack(){ for(int i=0;iSetLineStyle(1); houghLines[ihit]->SetLineWidth(1); houghLines[ihit]->SetLineColor(kGreen); } } } void TChough2::makeHoughHisto(){ char buf[50]; static TRandom r(0); sprintf(buf,"houghHisto%5.5f",r.Uniform()); houghHisto = new TH2D(buf,"",nBinsTheta,minTheta/3.141592654,maxTheta/3.141592654,nBinsR,minR,maxR); houghHisto->SetStats(kFALSE); houghHisto->GetYaxis()->SetTitle("R"); houghHisto->GetXaxis()->SetTitle("#theta[#pi]"); for(int ihit=0;ihit-1){ houghHisto->SetBinContent(iTheta+1,iR+1,houghHisto->GetBinContent(iTheta+1,iR+1) + 1); } } */ double z = HitCoordinates[ihit][1]; double y = HitCoordinates[ihit][0]; double theta0 = (iTheta)*binTheta+minTheta; double theta1 = theta0 + binTheta; double r_at_theta0 = z*cos(theta0)+y*sin(theta0)-minR; double r_at_theta1 = z*cos(theta1)+y*sin(theta1)-minR; double rMin=r_at_theta0; double rMax=r_at_theta1; if(r_at_theta0>r_at_theta1){ rMin=r_at_theta1; rMax=r_at_theta0; } rMax+=nSigma*resolution.at(ihit); rMin-=nSigma*resolution.at(ihit); int iRmin=(int)(rMin/binR); int iRmax=(int)(rMax/binR); int weight = 1; if(iRmin==iRmax){ if(weighting){ weight=binWeight(iTheta,iRmin,ihit); }else{ weight=1; } if(weight<0){ cout<SetBinContent(iTheta+1,iRmin+1,houghHisto->GetBinContent(iTheta+1,iRmin+1) + weight); //cout<<"equal "<SetBinContent(iTheta+1,iR+1,houghHisto->GetBinContent(iTheta+1,iR+1) + weight); //cout<<"not equal "<=r0 && r_at_theta0<=r1) left=true; if(r_at_theta1>=r0 && r_at_theta1<=r1) right=true; if(theta_at_r0>=theta0 && theta_at_r0<=theta1) bottom=true; if(theta_at_r1>=theta0 && theta_at_r1<=theta1) top=true; double distance=-1; if(left&&right) distance = sqrt(pow((binTheta) /binTheta,2.)+pow((r_at_theta0-r_at_theta1)/binR,2.)); if(left&&bottom) distance = sqrt(pow((theta_at_r0-theta0) /binTheta,2.)+pow((r_at_theta0-r0)/binR,2.) ); if(left&&top) distance = sqrt(pow((theta_at_r1-theta0) /binTheta,2.)+pow((r_at_theta0-r1)/binR,2.) ); if(bottom&&top) distance = sqrt(pow((theta_at_r0 - theta_at_r1)/binTheta,2.)+pow((binR) /binR,2.)); if(bottom&&right)distance = sqrt(pow((theta1-theta_at_r0) /binTheta,2.)+pow((r0-r_at_theta1)/binR,2.)); if(right&&top) distance = sqrt(pow((theta1-theta_at_r1) /binTheta,2.)+pow((r1-r_at_theta1)/binR,2.)); // cout<& _c){ TVector3 xp=yp.Cross(zp); TMatrixT S(3,3); S[0][0]=xp.X(); S[1][0]=xp.Y(); S[2][0]=xp.Z(); S[0][1]=yp.X(); S[1][1]=yp.Y(); S[2][1]=yp.Z(); S[0][2]=zp.X(); S[1][2]=zp.Y(); S[2][2]=zp.Z(); //TMatrixT Stransp = S; //Stransp.T(); clear(); minY=1.E50; maxY=-1.E50; minZ=1.E50; maxZ=-1.E50; TCalign* a = TCalign::getInstance(); for(unsigned int i=0;i<_c.size();++i){ TVector3 hitPrime = S * _c.at(i).posXYZ(); //xprime isnt needed only doing transform in one plane double y = hitPrime.Y(); double z = hitPrime.Z(); if(y>maxY) maxY=y; if(ymaxZ) maxZ=z; if(zgetRes(_c.at(i).getId())); } //minR=0; /* Assuming that a track has to pass all detectors, but not nececarily having hits inn all maxR is the distance from one corner of a rectangle with sides rangeY and rangeZ to the diagonal max/minTheta is calculated using the same asumption */ rangeY=maxY-minY; rangeZ=maxZ-minZ; if(maxR==0&&minR==0){ maxR=rangeY*rangeZ / sqrt(pow(rangeY,2) + pow(rangeZ,2))+0.1; minR=-maxR; } rangeR=maxR-minR; if(maxTheta==0&&minTheta==0){ maxTheta=3.141592654/2+atan(rangeY/rangeZ)+0.01; minTheta=3.141592654/2-atan(rangeY/rangeZ)-0.01; } rangeTheta=maxTheta-minTheta; binTheta=rangeTheta/nBinsTheta; binR=rangeR/(nBinsR); if( fabs(maxY-minY)<1.E-10)minY-=1.E-5; if( fabs(maxZ-minZ)<1.E-10)minZ-=1.E-5; }