//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of resCalc // Uses existing GFTracks and calculates // residua in XY. // Developed as part of the GEM-TPC project // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Felix Boehmer (original author) // Physik Department E18, TUM // //----------------------------------------------------------- #include "TpcRefGFTrkResCalc_Alignment.h" #include "TClonesArray.h" #include "TpcCluster.h" #include "TpcResidual.h" #include "TpcRefResidualCollection.h" #include "TpcSPHit.h" #include "TpcAlignmentManager.h" #include "GFTools.h" #include "GFTrack.h" #include "GFException.h" #include "GFAbsTrackRep.h" #include "GFRecoHitFactory.h" #include "GFRecoHitProducer.h" #include "RKTrackRep.h" #include #include #include #include #include #include #include double TpcRefGFTrkResCalc_Alignment::phiDifference(double angle1, double angle2){ double difference=angle1-angle2; difference=difference*180/TMath::Pi(); if(difference>180){ difference-=360; }else if(difference<-180){ difference+=360; } return difference; } TpcRefGFTrkResCalc_Alignment::TpcRefGFTrkResCalc_Alignment() : fGFTrackBranchName("TpcTrackPostFit"), fTpcSPHitBranchName("TpcSPHit"), fRefGFTrackBranchName("CdcTrackPostFit"), fTpcClusterBranchName("TpcCluster"), fNRep(-1), fDetID(-1), fAlignedMatching(true), fRequireGoodFit(true), fUseClusters(false), fRefTrackMomentumCut(0.5), fRefTrackPosCut(40.), fTpcTrackMomCut(0.5), fTrackdPhiCut(10), fOrigTransfName("tpc"), fAlMan(NULL), fQAFileName("TpcRefGFTrkResCalc_AlignmentQA.root"), sectorTrackSelection(false),minAngle(0),maxAngle(0) { fHistoFile = new TFile(fQAFileName,"recreate"); rRefHist=new TH1D("Ref_RHist","Ref_RHist;r (cm)",1000,0,150); hists.push_back(rRefHist); xyRefHist=new TH2D("Ref_XYHist","Ref_XYHist;x (cm);y (cm)",1000,-150,150,1000,-150,150); hists.push_back(xyRefHist); momRefHist=new TH1D("Ref_MomHist","Ref_MomHist;p (GeV/c)",1000,0,10); hists.push_back(momRefHist); phiRefHist=new TH1D("Ref_PhiHist","Ref_PhiHist; #phi (deg)",1000,-360,360); hists.push_back(phiRefHist); dPhiRefTrkPosHist=new TH1D("Ref_dPhiMomPos","Ref_dPhiMomPos; #phi (deg)",1000,-360,360); hists.push_back(dPhiRefTrkPosHist); rRefCutHist=new TH1D("RefMomCut_RHist","RefMomCut_RHist;r (cm)",1000,0,150); hists.push_back(rRefCutHist); xyRefCutHist=new TH2D("RefMomCut_XYHist","RefMomCut_XYHist;x (cm);y (cm",1000,-150,150,1000,-150,150); hists.push_back(xyRefCutHist); momRefCutHist=new TH1D("RefMomCut_MomHist","RefMomCut_MomHist; p (GeV/c)",1000,0,10); hists.push_back(momRefCutHist); phiRefCutHist=new TH1D("RefMomCut_PhiHist","RefMomCut_PhiHist;#phi (deg)",1000,360,360); hists.push_back(phiRefCutHist); dPhiRefCutTrkPosHist=new TH1D("RefMomCut_dPhiMomPos","RefMomCut_dPhiMomPos; d#phi (deg)",1000,-360,360); hists.push_back(dPhiRefCutTrkPosHist); dPhiRefCutTrkPosHist2=new TH1D("RefMomCut_dPhiMomPos_rot","RefMomCut_dPhiMomPos_rot; d#phi (deg)",1000,-360,360); hists.push_back(dPhiRefCutTrkPosHist2); rHist=new TH1D("TpcTrack_RHist","rHist;r (cm)",1000,0,150); hists.push_back(rHist); momHist=new TH1D("TpcTrack_MomHist","TpcTrack_MomHist; p (GeV/c)",1000,0,10); hists.push_back(momHist); phiHist=new TH1D("TpcTrack_PhiHist","TpcTrack_PhiHist; #phi (deg)",1000,-360,360); hists.push_back(phiHist); dPhiTpcTrkPosHist=new TH1D("TpcTrack_dPhiMomPos","TpcTrack_dPhiMomPos; d#phi (deg)",1000,-360,360); hists.push_back(dPhiTpcTrkPosHist); dPhiHist=new TH1D("dPhiMom_Tpc-Ref","dPhiMom_Tpc-Ref",1000,-180,180); hists.push_back(dPhiHist); dPhiVsPhiHist=new TH2D("dPhiMom_Tpc-RefvsTpcPhi","dPhiMom_Tpc-RefvsTpcPhi",500,-180,180,500,-10,10); hists.push_back(dPhiVsPhiHist); dPhiPosHist=new TH1D("dPhiPos_Tpc-Ref","dPhiPos_Tpc-Ref",2000,-180,180); hists.push_back(dPhiPosHist); dPhiVsPhiPosHist=new TH2D("dPhiPos_Tpc-RefvsTpcPhi","dPhiPos_Tpc-RefvsTpcPhi",500,-180,180,500,-10,10); hists.push_back(dPhiVsPhiPosHist); //************************************************************************************************ // Positive charge //************************************************************************************************ dPhiPlusHist=new TH1D("dPhiPlusMom_Tpc-Ref","dPhiPlusMom_Tpc-Ref",1000,-180,180); hists.push_back(dPhiPlusHist); dPhiPlusVsPhiHist=new TH2D("dPhiPlusMom_Tpc-RefvsTpcPhi","dPhiPlusMom_Tpc-RefvsTpcPhi",500,-180,180,500,-10,10); hists.push_back(dPhiPlusVsPhiHist); dPhiPlusPosHist=new TH1D("dPhiPlusPos_Tpc-Ref","dPhiPlusPos_Tpc-Ref",2000,-180,180); hists.push_back(dPhiPlusPosHist); dPhiPlusVsPhiPosHist=new TH2D("dPhiPlusPos_Tpc-RefvsTpcPhi","dPhiPlusPos_Tpc-RefvsTpcPhi",500,-180,180,500,-10,10); hists.push_back(dPhiPlusVsPhiPosHist); //signedResiduals signedXYResidual= new TH1D("signedResidual", "signedResidual",500, -20,20); hists.push_back(signedXYResidual); signedXYResidualPlus= new TH1D("signedResidualPlus", "signedResidualPlus",500, -20,20); hists.push_back(signedXYResidualPlus); signedXYResidualMinus= new TH1D("signedResidualMinus", "signedResidualMinus",500, -20,20); hists.push_back(signedXYResidualMinus); signedXYResidualVsPhi= new TH2D("signedResidualVsPhi", "signedResidualVsPhi",360,-180,180,500, -20,20); hists.push_back(signedXYResidualVsPhi); signedXYResidualVsPhiPlus= new TH2D("signedResidualVsPhiPlus", "signedResidualVsPhiPlus",360,-180,180,500, -20,20); hists.push_back(signedXYResidualVsPhiPlus); signedXYResidualVsPhiMinus= new TH2D("signedResidualVsPhiMinus", "signedResidualVsPhiMinus",360,-180,180,500, -20,20); hists.push_back(signedXYResidualVsPhiMinus); zSlices=10; zStart=-30; zEnd=40; double zRange=zEnd-zStart; double zBin=zRange/((double)zSlices); double zBinStart=zStart; double zBinEnd=zBinStart; for(int i =0;iGetClass()->GetName()); if(type.find(RefGFTrackRefType)GetClass()->GetName()); if(type.find(GFTrackRefType)GetClass()->GetName()); if(type.find(tpcSPHitType)GetClass()->GetName()); if(type.find(tpcClusterType)GetEntriesFast(); // GF Referencetrackfit op //std::cout<<"nRefTracks "<=0) refRep = iRefTrack->getTrackRep(fNRep); else refRep = iRefTrack->getCardinalRep(); int val = refRep->getStatusFlag(); if(val!=0 && fRequireGoodFit) continue; double charge=refRep->getCharge(); TVector3 refMom=refRep->getMom(); TVector3 refPos=refRep->getPos(); //********************************************************************* dPhiRefTrkPosHist->Fill((refMom.Phi()-refPos.Phi())*180/TMath::Pi()); rRefHist->Fill(refPos.Perp()); xyRefHist->Fill(refPos.X(),refPos.Y()); momRefHist->Fill(refMom.Mag()); phiRefHist->Fill(refMom.Phi()*180/TMath::Pi()); //********************************************************************* if(refMom.Perp()fRefTrackPosCut){ continue; } try{ refRep->extrapolateToCylinder(15,refPos,refMom); }catch(GFException& ex){ std::cout<<"TpcRefGFTrackResCalc::calc(): Error during CDC extrap to cylinder: \n" <<" "<Fill(dPosMomPhi); rRefCutHist->Fill(refPos.Perp()); xyRefCutHist->Fill(refPos.X(),refPos.Y()); momRefCutHist->Fill(refMom.Mag()); phiRefCutHist->Fill(refMom.Phi()*180/TMath::Pi()); //********************************************************************* double refPhi=refMom.Phi(); // if(fabs(dPosMomPhi)>150){ // refMom.RotateZ(TMath::Pi()); // refPhi=refMom.Phi(); // std::cerr<<"Error:: Rotating track!"<Fill(dPosMomPhi2); //********************************************************************* //create residualCollection for this track fResults.push_back(new TpcRefResidualCollection(fTpcSPHitBranchName.Data(),irtr)); unsigned int nTracks = fGFTrackArray->GetEntriesFast(); for(unsigned int itr=0;itrgetCardinalRep(); if(rep->getStatusFlag()!=0){ continue; } TVector3 mom, pos; TMatrixDSym cov_; const TMatrixDSym lastCov=rep->getLastCov(); rep->getPosMomCov(pos,mom,cov_); if(mom.Perp()getStatusFlag()!=0){ continue; } RKTrackRep* lastRep = (RKTrackRep*) rep->clone(); GFDetPlane tpcLastPl = rep->getLastPlane(); TVectorD lastState = lastRep->getLastState(); try{ lastRep->setData(lastState,tpcLastPl,&lastCov,lastRep->getAuxInfo(lastRep->getReferencePlane())); }catch(GFException& ex){ std::cout<<"TpcRefGFTrackResCalc::calc():during getting of AuxInfo: \n" <<" "<getMom(); delete lastRep; if(lastTpcMom.Mag()<0.1){ std::cout<<"################################################################################"<masterToLocalVect(fOrigTransfName,mom); mom=fAlMan->localToMasterVect("tpc",mom); pos=fAlMan->masterToLocal(fOrigTransfName,pos); pos=fAlMan->localToMaster("tpc",pos); rep->setPosMomCov(pos,mom,cov_); } try{ rep->extrapolateToCylinder(15,pos,mom); }catch(GFException& ex){ std::cout<<"TpcRefGFTrackResCalc::calc(): Error during extrap to cylinder mom: \n" <<" "<Fill(residual.Perp()*resDir); signedXYResidualVsPhi->Fill(pos.Phi()*180/TMath::Pi(),residual.Perp()*resDir); if(charge>0){ signedXYResidualPlus->Fill(residual.Perp()*resDir); signedXYResidualVsPhiPlus->Fill(pos.Phi()*180/TMath::Pi(),residual.Perp()*resDir); }else{ signedXYResidualMinus->Fill(residual.Perp()*resDir); signedXYResidualVsPhiMinus->Fill(pos.Phi()*180/TMath::Pi(),residual.Perp()*resDir); } rHist->Fill(pos.Perp()); momHist->Fill(mom.Mag()); phiHist->Fill(mom.Phi()*180/TMath::Pi()); dPhiTpcTrkPosHist->Fill(phiDifference(mom.Phi(),pos.Phi())); dPhiVsPhiHist->Fill(mom.Phi()*180/TMath::Pi(),phiDifference(mom.Phi(),refPhi)); dPhiHist->Fill(phiDifference(mom.Phi(),refMom.Phi())); dThetaVTheta->Fill(mom.Theta()*180/TMath::Pi(),phiDifference(mom.Theta(),refMom.Theta())); dTheta->Fill((mom.Theta()-refMom.Theta())*180/TMath::Pi()); dPhiVsPhiPosHist->Fill(pos.Phi()*180/TMath::Pi(),phiDifference(pos.Phi(),refPos.Phi())); dPhiPosHist->Fill(phiDifference(pos.Phi(),refPos.Phi())); dThetaPosVThetaPos->Fill(pos.Theta()*180/TMath::Pi(),phiDifference(pos.Theta(),refPos.Theta())); dThetaPos->Fill(phiDifference(pos.Theta(),refPos.Theta())); //Negative tracks if(refRep->getCharge()<0){ dPhiMinusVsPhiHist->Fill(mom.Phi()*180/TMath::Pi(),phiDifference(mom.Phi(),refPhi)); dPhiMinusHist->Fill(phiDifference(mom.Phi(),refMom.Phi())); dPhiMinusVsPhiPosHist->Fill(pos.Phi()*180/TMath::Pi(),phiDifference(pos.Phi(),refPos.Phi())); dPhiMinusPosHist->Fill(phiDifference(pos.Phi(),refPos.Phi())); double zBinEnd=zStart; double zBin=(zEnd-zStart)/((double)zSlices); double zPos=pos.Z(); for(int i=0;iFill(pos.Phi()*180/TMath::Pi(),phiDifference(pos.Phi(),refPos.Phi())); histMap[sliceNamesMinusMom[i]]->Fill(mom.Phi()*180/TMath::Pi(),phiDifference(mom.Phi(),refPhi)); break; } } } //Plus tracks if(refRep->getCharge()>0){ dPhiPlusVsPhiHist->Fill(mom.Phi()*180/TMath::Pi(),phiDifference(mom.Phi(),refPhi)); dPhiPlusHist->Fill(phiDifference(mom.Phi(),refMom.Phi())); dPhiPlusVsPhiPosHist->Fill(pos.Phi()*180/TMath::Pi(),phiDifference(pos.Phi(),refPos.Phi())); dPhiPlusPosHist->Fill(phiDifference(pos.Phi(),refPos.Phi())); double zBinEnd=zStart; double zBin=(zEnd-zStart)/((double)zSlices); double zPos=pos.Z(); for(int i=0;iFill(pos.Phi()*180/TMath::Pi(),phiDifference(pos.Phi(),refPos.Phi())); histMap[sliceNamesPlusMom[i]]->Fill(mom.Phi()*180/TMath::Pi(),phiDifference(mom.Phi(),refPhi)); break; } } } //********************************************************************* if((fabs(pos.Phi()-refPos.Phi())*180/TMath::Pi()>(this->fTrackdPhiCut/2)) or (fabs(mom.Phi()-refMom.Phi())*180/TMath::Pi()>this->fTrackdPhiCut)){ continue; } //********************************************************************* dThetaVThetaCut->Fill(mom.Theta()*180/TMath::Pi(),(mom.Theta()-refMom.Theta())*180/TMath::Pi()); dThetaCut->Fill((mom.Theta()-refMom.Theta())*180/TMath::Pi()); dThetaPosVThetaPosCut->Fill(pos.Theta()*180/TMath::Pi(),(pos.Theta()-refPos.Theta())*180/TMath::Pi()); dThetaPosCut->Fill((pos.Theta()-refPos.Theta())*180/TMath::Pi()); //********************************************************************* //debug //continue; //loop over hits from matched track GFTrackCand cand=iTrack->getCand(); unsigned int nHits = cand.getNHits(); for(int iHit=(nHits-1);iHit>=0;iHit=(iHit-1)){ int hitId, detId; cand.getHit(iHit,detId,hitId); TpcSPHit* recoHit = (TpcSPHit*) fTpcSPHitArray->At(hitId); if(recoHit==NULL){ std::cout<<"nooooooooooooooooooooooooooooooooo "<GetEntries()< cov(3,3) ; if(fUseClusters){ int iCl=recoHit->getClusterID(); TpcCluster* cl= (TpcCluster*) fTpcClusterArray->At(recoHit->getClusterID()); if(cl==0){ std::cout<<"no cluster at id: "<GetEntriesFast()<GetEntriesFast()<pos(); hPos=fAlMan->localToMaster("tpc",hPos); TVector3 sig = cl->sig(); cov[0][0] = sig.X()*sig.X(); cov[1][1] = sig.Y()*sig.Y(); cov[2][2] = sig.Z()*sig.Z(); cov=fAlMan->localToMaster("tpc",cov); }else{ TVectorT rc = ((GFAbsRecoHit*)recoHit)->getRawHitCoord(); cov =((GFAbsRecoHit*)recoHit)->getRawHitCov(); hPos = TVector3(rc[0], rc[1], rc[2]); if(fOrigTransfName!="tpc"){ hPos=fAlMan->masterToLocal(fOrigTransfName,hPos); if(hPos.Perp()>13 or hPos.Perp()<7){ continue; } hPos=fAlMan->localToMaster("tpc",hPos); cov=fAlMan->masterToLocal(fOrigTransfName,cov); cov=fAlMan->localToMaster("tpc",cov); } } double tracklength=0; bool ok=true; TVector3 poca, norm; TVector3 pos1,mom1; TMatrixDSym cov6; try { refRep->extrapolateToCylinder(hPos.Perp(),poca,norm); TVectorT dummy; GFDetPlane plane(poca,norm); tracklength=refRep->extrapolate(plane); refRep->getPosMomCov(pos1,mom1,cov6); } catch(GFException& ex) { std::cout<<"TpcRefGFTrackResCalc::calc(): Error during extrapolation: \n" <<" "<setResXYZ(poca-hPos); theRes->setRefPos(poca); theRes->setHitPos(hPos); theRes->setTrackDir(mom1.Unit()); //TODO, use correct assignment (cluster/SPHit) if(fUseClusters){ theRes->setHitIndex(recoHit->getClusterID()); }else{ theRes->setHitIndex(hitId); } TMatrixDSym cov3=cov6.GetSub(0,2,0,2); //cov3.Print(); theRes->setHitCov(cov); theRes->setTrackCov(cov3); theRes->setTrackLength(tracklength); theRes->setCharge(charge); fResults.back()->addResidual(theRes); } }//end Hit loop }//end GFTrack loop }//end refGFTrack loop } void TpcRefGFTrkResCalc_Alignment::writeHists(){ fHistoFile->cd(); for(unsigned int i =0;iWrite(); if(hists[i]->InheritsFrom("TH2D")){ TProfile* temp = ((TH2D*)hists[i])->ProfileX(); temp->Write(); } } for(std::map::iterator it =histMap.begin();it!=histMap.end();++it){ it->second->Write(); if(it->second->InheritsFrom("TH2D")){ TProfile* temp = ((TH2D*)it->second)->ProfileX(); temp->Write(); } } fHistoFile->Close(); } void TpcRefGFTrkResCalc_Alignment::setSectorTrackSelection(double minAngle_,double maxAngle_){ if (minAngle_<0 or minAngle_>22.5 or maxAngle_< 0 or maxAngle_>22.5){ std::cerr<<"########################################################################################################################"<