//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // TPC-CDC Matching Routine // // // Environment: // Software developed for the Prototype Detector at FOPI // // Author List: // Robert Münzer TUM // //----------------------------------------------------------- // This Class' Header ------------------ #include "PndTpcCdcMatchingTask.h" // C++ headers #include #include #include // Collaborating Class Headers -------- #include "FairRootManager.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "PndTpcDigiPar.h" #include "TVector3.h" #include "PndTpcCluster.h" #include "TrackFitStat.h" #include "TGeoManager.h" #include "GFAbsTrackRep.h" #include "GFAbsRecoHit.h" #include "GFDetPlane.h" #include "GFException.h" #include "GFKalman.h" //#include "GFTools.h" #include "GFTrack.h" #include "GFTrackCand.h" #include "FopiEvent.h" #include "RKTrackRep.h" #include "CdcCircle.h" #include "GFDetPlane.h" #include "PseudoSpacePoint.h" #define DEBUG 0 PndTpcCdcMatchingTask::PndTpcCdcMatchingTask() : fTpcClusterBranchName("PndTpcCluster"), fTpcTrackBranchName("TrackPostFit"), fCdcTrackBranchName("PndTpcCdcTrack"), fCdcHitBranchName("PndTpcCdcHit"), fCdcEvBranchName("PndTpcCdcEvent"), fmaxmatdistance(3), fmaxmatphi(4*acos(0.)), fminhitsperlength(0.), fmatablecdctracks(0), fmatchedcdctracks(0), fPersistence(kTRUE), fSecondarySupp(kFALSE), fNumReps(1) {;} PndTpcCdcMatchingTask::~PndTpcCdcMatchingTask(){ delete fPar; } InitStatus PndTpcCdcMatchingTask::Init() { //Get ROOT Manager ------------------ FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("PndTpcCdcMatchingTask::Init","RootManager not instantiated!"); return kERROR; } // Get input ------------------------ fTpcClusterArray=(TClonesArray*) ioman->GetObject(fTpcClusterBranchName); if(fTpcClusterArray==0) { Error("PndTpcCdcMatchingTask::Init","PndTpcCluster array not found!"); return kERROR; } fTpcTrackArray=(TClonesArray*) ioman->GetObject(fTpcTrackBranchName); if(fTpcTrackArray==0) { Error("PndTpcCdcMatchingTask::Init","GFTrack array not found!"); return kERROR; } fCdcHitArray=(TClonesArray*) ioman->GetObject(fCdcHitBranchName); if(fCdcHitArray==0) { Error("PndTpcCdcMatchingTask::Init","Cdc Hits array not found!"); return kERROR; } fCdcTrackArray=(TClonesArray*) ioman->GetObject(fCdcTrackBranchName); if(fCdcTrackArray==0) { Error("PndTpcCdcMatchingTask::Init","CDC track array not found!"); return kERROR; } fCdcEventArray=(TClonesArray*) ioman->GetObject(fCdcEvBranchName); if(fCdcEventArray==0) { Error("PndTpcCdcMatchingTask::Init","CDC event not found!"); return kERROR; } // std::cout<<"PRE INIT"<"); fCdcTpcMatPreFitOutArray = new TClonesArray("GFTrack"); ioman->Register("PndTpcCdcMatArray","PndTpc",fCdcTpcMatArrayOutArray,fPersistence); ioman->Register("PndTpcCdcPreFit","PndTpc",fCdcTpcMatPreFitOutArray,fPersistence); // std::cout<<"INIT OUT ARRAYS"<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get PndTpc digitisation parameter container fPar= (PndTpcDigiPar*) db->getContainer("PndTpcDigiPar"); if (!fPar ) Fatal("SetParContainers", "PndTpcDigiPar not found"); } bool sortfunction(TVector3 i,TVector3 j){ return(i.Perp()Delete(); fCdcTpcMatArrayOutArray->Clear(); std::cerr << "PndTpcCdcMatchingTask: delete" << std::endl; Int_t NumCdcTracks = fCdcTrackArray->GetEntriesFast(); Int_t NumTpcTracks = fTpcTrackArray->GetEntriesFast(); Int_t TpcId = 8; CdcCircle cdctrackcircle[NumCdcTracks]; //CdcEvent *aCdcevent = (CdcEvent*) fCdcEventArray->At(0); //Int_t NumHits = aCdcevent->GetNhit(); //TVector3 Vertex = aCdcevent->GetVertex(); //std::cout << "vertex Z: " << Vertex.Z() << std::endl; std::vector candIDs; TMatrixT matchcdctpcvalue; TMatrixT matchcdctpc; matchcdctpc.ResizeTo(NumCdcTracks,NumTpcTracks); matchcdctpcvalue.ResizeTo(NumCdcTracks,NumTpcTracks); Int_t CdcMatAbleTracks = 0; for(Int_t cdctrack=0;cdctrackAt(cdctrack); cdctrackcircle[cdctrack].SetRXYP(cdcsingletrack->GetRadius(),cdcsingletrack->GetMx(),cdcsingletrack->GetMy(),cdcsingletrack->GetPhi()); //std::cout<<"Tracklength("<GetNpoint()<30 ) continue; // in case this could be implemented in the CDC reference system // if( cdcsingletrack->GetZ0()>-10||cdcsingletrack->GetZ0()<-50 ) continue; CdcMatAbleTracks += 1; for(Int_t tpctrack=0;tpctrackAt(tpctrack); GFTrackCand cand = tpcsingletrack->getCand(); candIDs.clear(); candIDs = cand.GetHitIDs(TpcId); if(DEBUG){ std::cout<<"tpctrack: "<At(candIDs[nhit]); TVector3 hitpoint = tpcsinglecluster->pos(); Float_t amp = tpcsinglecluster->amp(); Float_t size = tpcsinglecluster->get2DSize(); //if(size<2) continue; // if(amp<30) continue; if(cdctrackcircle[cdctrack].MatPoint(hitpoint,fmaxmatdistance,fmaxmatphi)!=0) matchcdctpcvalue[cdctrack][tpctrack] += 1/(cdctrackcircle[cdctrack].GetTpcLength()*cdctrackcircle[cdctrack].MatPoint(hitpoint,fmaxmatdistance,fmaxmatphi)); } } } if(DEBUG){ matchcdctpcvalue.Print(); } Int_t NumMatchTrack=std::min(NumCdcTracks,NumTpcTracks); TMatrixT tpc; // n Entrey returns Id of TPC Track with matches to CDC-Track with id n tpc.ResizeTo(NumTpcTracks,1); std::cerr << "PndTpcCdcMatchingTask::Exec late" << std::endl; for (Int_t itertrack=0;itertrackmaximalvalue&&matchcdctpc[ct][tp]==-1){ maximalvalue=matchcdctpcvalue[ct][tp]; cdctrackmaximum=ct; tpctrackmaximum=tp; } } } for (Int_t tp=0;tp* mattrackid = new((*fCdcTpcMatArrayOutArray)[fCdcTpcMatArrayOutArray->GetEntriesFast()]) TMatrixT(NumCdcTracks,9); //TMatrixT mattrackid; // n Entrey returns Id of TPC Track with matches to CDC-Track with id n TMatrixT cdctotpc =matchcdctpc*tpc ; if(DEBUG){ matchcdctpc.Print(); } Int_t intnum=0; for( Int_t ct=0;ct return--------"<"<At(cdctrack); GFTrack* tpcsingletrack = (GFTrack*) fTpcTrackArray->At(tpctrack); std::vector hitIDs; hitIDs.clear(); hitIDs = cdcsingletrack->GetCdcIdHits(); std::vector hitIDsorter; for (Int_t nhit=0;nhitAt(hitIDs[nhit]); TVector3 hitpoint = chit->GetHitPos(); hitpoint.SetZ((Float_t) hitIDs[nhit]); hitIDsorter.push_back(hitpoint); } sort(hitIDsorter.begin(),hitIDsorter.end(),sortfunction); CdcHit* cchit = (CdcHit*) fCdcHitArray->At((Int_t) hitIDsorter.at(0).Z()); GFAbsRecoHit *thehit = tpcsingletrack->getHit(0)->clone(); TMatrixT thehitpoint = thehit->getRawHitCoord(); TVector3 clpos = cchit->GetHitPos(); clpos.SetXYZ(thehitpoint[0][0],thehitpoint[1][0],thehitpoint[2][0]); cchit = (CdcHit*) fCdcHitArray->At((Int_t) hitIDsorter.at(1).Z()); thehit = tpcsingletrack->getHit(1)->clone(); thehitpoint = thehit->getRawHitCoord(); TVector3 mom = cchit->GetHitPos()-clpos; Float_t cdcmomentum=cdcsingletrack->GetMom(); Float_t cdctheta=cdcsingletrack->GetTheta(); Float_t cdcphi=cdcsingletrack->GetPhi(); Float_t cdcz0 = cdcsingletrack->GetZ0(); mom.SetPhi(cdcphi); TVector3 mom1=mom; TVector2 centpoint; // if(fabs(atan(tan(centpoint.Phi()-mom.Phi())))>acos(0.)){ if(cdcsingletrack->GetRadius()<0){ centpoint.Set(-clpos.Y()+cdcsingletrack->GetMy(),-clpos.X()+cdcsingletrack->GetMx()); // std::cout<<"Changed: "<GetRadius()<GetMy(),clpos.X()-cdcsingletrack->GetMx()); // std::cout<<"UnChanged: "<GetRadius()<GetMass(); Float_t cdccharge=cdcsingletrack->GetCharge(); int pdg; if(cdccharge<0&&!cdcmass>0.32){ pdg = -211; // pi- } else if(cdccharge<0&&cdcmass>0.32){ pdg = -321; //k- } else if(!cdcmass>0.32){ pdg = 211; // pi+ } else if(cdcmass<0.67){ pdg = 321; //k+ } else { pdg = 2212; // p } RKTrackRep* rep= new RKTrackRep(clpos,mom,poserr,momerr,pdg); Int_t NumTpcHits=tpcsingletrack->getNumHits(); GFTrack* trk=new((*fCdcTpcMatPreFitOutArray)[fCdcTpcMatPreFitOutArray->GetEntriesFast()]) GFTrack(rep); GFAbsTrackRep *singletpcrep = tpcsingletrack->getTrackRep(0); try{ // std::cout<<"Start fitting TPC tracks"<extrapolateToLine(Point1,Point2,poca,normVec,poca_onwire); if(DEBUG) { poca.Print(); } (*mattrackid)[tid][6] = poca.X(); (*mattrackid)[tid][7] = poca.Y(); (*mattrackid)[tid][8] = poca.Z(); } catch (GFException e){ // std::cout<getHit(tpchit)->clone(); trk->addHit(theHit,2.,candIDs[tpchit]); } Float_t lastradius=0; for (Int_t nhit=0;nhitAt((Int_t) hitIDsorter.at(nhit).Z()); TVector3 hitpoint = chit->GetHitPos(); lastradius=hitpoint.Perp(); //hitpoint.SetZ(hitpoint.Perp()/tan(cdctheta)+cdcz0); TVector3 hitXerr = chit->GetXposErr(); TVector3 hitYerr = chit->GetYposErr(); TVector3 hitZerr = chit->GetZposErr(); //hitXerr.SetMag(hitXerr.Mag()*50); //hitYerr.SetMag(hitYerr.Mag()*50); //hitZerr.SetMag(hitZerr.Mag()/50.); PseudoSpacePoint* thishit = new PseudoSpacePoint(hitpoint,hitXerr,hitYerr,hitZerr); trk->addHit(thishit,200.,hitIDs[nhit]); } GFKalman fitter; fitter.setNumIterations(3); try{ // std::cout<<"Start fitting TPC-CDC tracks"<extrapolateToLine(Point1,Point2,poca,normVec,poca_onwire); if(DEBUG) { poca.Print(); } (*mattrackid)[tid][3] = poca.X(); (*mattrackid)[tid][4] = poca.Y(); (*mattrackid)[tid][5] = poca.Z(); } catch (GFException e){ // std::cout<