//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcRiemannTrackFinder // see PndTpcRiemannTrackFinder.h for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // Johannes Rauch TUM // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndTpcRiemannTrackFinder.h" // C/C++ Headers ---------------------- #include #include // Collaborating Class Headers -------- #include "DebugLogger.h" //#include "PndTpcClusterRadius.h" #include "PndTpcClusterZ.h" #include "GFTrackCand.h" #include "PndTpcCluster.h" #include "PndTpcRiemannTrack.h" #include "PndTpcRiemannHit.h" #include "PndTpcProximityHTCorrelator.h" #include "PndTpcRiemannHTCorrelator.h" #include "PndTpcRiemannTTCorrelator.h" // initialisation of static member variables double PndTpcRiemannTrackFinder::_interactionZ = 0.; int PndTpcRiemannTrackFinder::_sorting = 3; // Class Member definitions ----------- PndTpcRiemannTrackFinder::PndTpcRiemannTrackFinder() : _minHitsForFit(5), _sortingMode(false) { // correlators in decreasing priority! //addCorrelator(new PndTpcProximityHTCorrelator(1.)); //addCorrelator(new PndTpcRiemannHTCorrelator(5.E-4)); } PndTpcRiemannTrackFinder::~PndTpcRiemannTrackFinder() { for(int i=0;i<_correlators.size();++i){ if(_correlators[i]!=NULL){ delete _correlators[i]; _correlators[i]=NULL; } } _correlators.clear(); for(int i=0;i<_TTcorrelators.size();++i){ if(_TTcorrelators[i]!=NULL){ delete _TTcorrelators[i]; _TTcorrelators[i]=NULL; } } _TTcorrelators.clear(); } void PndTpcRiemannTrackFinder::addCorrelator(PndTpcAbsHitTrackCorrelator* c) { _correlators.push_back(c); _found.push_back(false); _bestMatchQuality.push_back(9999); _bestMatchIndex.push_back(0); } void PndTpcRiemannTrackFinder::addTTCorrelator(PndTpcAbsTrackTrackCorrelator* c) { _TTcorrelators.push_back(c); } unsigned int PndTpcRiemannTrackFinder::buildTracks(std::vector& cll, std::vector& candlist) { sortClusters(cll); unsigned int ncl=cll.size(); for(unsigned int icl=0;iclpos().Perp() <<" Mag: "<pos().Mag() <<" Z: "<pos().Z()<corr(trk,rhit,survive,matchQuality); if(!applicable)continue; // try the next correlator if(!survive){ trksurvive=false; break; // track has failed this level --> can be excluded } if(icormatchQuality){ _bestMatchQuality[icor]=matchQuality; _bestMatchIndex[icor]=itrk; trksurvive=true; } } // end loop over correlator foundAtAll|=trksurvive; } // end loop over tracks if(!foundAtAll)// new track { PndTpcRiemannTrack* trk=new PndTpcRiemannTrack(); trk->setSort(_sortingMode); candlist.push_back(trk); //std::cout<<"Creating new track"<addHit(rhit); } else { // add hit to best match // use the bestMatch from deepest level // std::cout<<"bestMatch[0]="<<_bestMatchIndex[0] // <<" bestMatch[1]="<<_bestMatchIndex[1]<addHit(rhit); if(theTrk->getNumHits()>=_minHitsForFit){ theTrk->refit(); theTrk->szFit(); } } resetFlags(); } // end loop over cluster std::cout<getNumHits()<<" hits R="; if(candlist[i]->getNumHits()>=_minHitsForFit)std::cout<r(); std::cout<Plot(1); } return candlist.size(); } void PndTpcRiemannTrackFinder::mergeTracks(std::vector& candlist){ std::cout<<"PndTpcRiemannTrackFinder::mergeTracks"<getNumHits()>=trk2->getNumHits()) applicable=_TTcorrelators[icor]->corr(trk1,trk2,survive,matchQuality); else applicable=_TTcorrelators[icor]->corr(trk2,trk1,survive,matchQuality); if(!applicable) { survive = false; break; } if(!survive) break; } // end loop through correlators if (!survive) continue; // test next trk2 // merge tracks if survived std::cout<<"merge track "<getNumHits(); unsigned int nhits2 = trk2->getNumHits(); if(!_sortingMode){ // we have to collect clusters from both tracks, sort them and build a new track // collect clusters from both tracks and sort std::vector clusters; for(unsigned int i=0; igetHit(i)->cluster()); } for(unsigned int i=0; igetHit(i)->cluster()); } sortClusters(clusters); // fill clusters into new RiemannTrack and refit PndTpcRiemannTrack* mergedTrack = new PndTpcRiemannTrack(); mergedTrack->setSort(false); for(unsigned int i=0; iaddHit(rhit); } if(mergedTrack->getNumHits()>=_minHitsForFit){ mergedTrack->refit(); mergedTrack->szFit(); } // delete old trackcands and store new trackcand delete candlist[itrk1]; trk1=mergedTrack; candlist[itrk1]=mergedTrack; } else{ // we can just add the hits from trk2 to trk1 and the sorting is done internally for(unsigned int i=0; iaddHit(trk2->getHit(i)); } // refit if we have enough hits if(trk1->getNumHits()>=_minHitsForFit){ trk1->refit(); trk1->szFit(); } } // delete trk2 delete candlist[itrk2]; candlist[itrk2]=NULL; } // end loop over the other tracks to be tested } // end loop over tracks // clean up candlist for(int i=0;igetNumHits()<<" hits R="; if(candlist[i]->getNumHits()>=_minHitsForFit)std::cout<r(); std::cout<& cll){ if(_sorting==-1) return; std::sort(cll.begin(),cll.end(),sortCluster); } bool sortCluster(PndTpcCluster* s1, PndTpcCluster* s2) { // -1: no sorting, 0: sort Clusters by X, 1: Y, 2: Z, 3: R, 4: distance to origin int sorting = PndTpcRiemannTrackFinder::getSorting(); double a1; double a2; TVector3 d1; TVector3 d2; switch (sorting){ case -1: //no sorting return false; break; case 0: a1=s1->pos().X(); a2=s2->pos().X(); return a1>a2; break; case 1: a1=s1->pos().Y(); a2=s2->pos().Y(); return a1>a2; break; case 2: a1=s1->pos().Z(); a2=s2->pos().Z(); return a1>a2; break; case 4: d1 = s1->pos(); d1(2) -= PndTpcRiemannTrackFinder::getInteractionZ(); d2 = s2->pos(); d2(2) -= PndTpcRiemannTrackFinder::getInteractionZ(); a1=d1.Mag(); a2=d2.Mag(); return a1>a2; break; default: // also case 3 -> R a1=s1->pos().Perp(); a2=s2->pos().Perp(); return a1>a2; } } bool sortTracksN(PndTpcRiemannTrack* t1, PndTpcRiemannTrack* t2) { int a1=t1->getNumHits(); int a2=t2->getNumHits(); return a1>a2; } bool sortTracksFirstClusterPos(PndTpcRiemannTrack* t1, PndTpcRiemannTrack* t2) { return sortCluster(t1->getFirstHit()->cluster(), t2->getFirstHit()->cluster()); } void PndTpcRiemannTrackFinder::resetFlags(){ // reset all flags for(int k=0;k<_correlators.size();++k){ _found[k]=false; _bestMatchQuality[k]=99999; _bestMatchIndex[k]=0; } }