//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcPatternRecoTask // see PndTpcPatternRecoTask.hh for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndTpcPatternRecoTask.h" // C/C++ Headers ---------------------- // Collaborating Class Headers -------- #include "CbmRootManager.h" #include "TClonesArray.h" #include "RecoHitFactory.h" #include "FitterExceptions.h" #include "PndTpcConfTrackFinder.h" #include "TrackCand.h" #include "Track.h" #include "LSLTrackRep.h" #include "TH1I.h" #include "TH1D.h" #include "McIdCollection.h" //#include "AbsBFieldIfc.h" //#include "CbmFieldAdaptor.h" #include using std::fabs; // Class Member definitions ----------- ClassImp(PndTpcPatternRecoTask) PndTpcPatternRecoTask::PndTpcPatternRecoTask() : CbmTask("PndTpc Pattern Reco"), _persistence(kFALSE) { // default values for Conformal Map TrackFinder _xcut=1.; _ycut=1.; _zcut=2.; _chi2cut=10; _minpoints=4; _clusterBranchName = "PndTpcCluster"; } PndTpcPatternRecoTask::~PndTpcPatternRecoTask() { if(_multiplicityHisto!=NULL)delete _multiplicityHisto; if(_trackPurityH!=NULL)delete _trackPurityH; if(_trackSizeH!=NULL)delete _trackSizeH; } void PndTpcPatternRecoTask::SetTrkFinderParameters(double xcut, double ycut, double zcut, double chi2cut, unsigned int minpointsforfit) { _xcut=xcut; _ycut=ycut; _zcut=zcut; _chi2cut=chi2cut; _minpoints=minpointsforfit; } InitStatus PndTpcPatternRecoTask::Init() { //Get ROOT Manager CbmRootManager* ioman= CbmRootManager::Instance(); if(ioman==0) { Error("PndTpcPatternRecoTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection _clusterArray=(TClonesArray*) ioman->GetObject(_clusterBranchName); if(_clusterArray==0) { Error("PndTpcPatternRecoTask::Init","Cluster-array not found!"); return kERROR; } // create and register output array _trackArray = new TClonesArray("Track"); ioman->Register("TrackPreFit","GenFit",_trackArray,_persistence); //if(_field==NULL){ // Error("DemoPatternRecoTask::Init","BField not found!"); // return kERROR; // //_fieldIfc=new CbmFieldAdaptor(_field); _trackfinder= new PndTpcConfTrackFinder(); _trackfinder->configure(_xcut,_ycut,_zcut, // proximity cuts _chi2cut, // chi2cut _minpoints, // minpoints for fit true, // do merge 0.1,0.1, 3.); // merge cuts (fractional) // init histos _multiplicityHisto=new TH1I("multipl","# track candidates",20,0,20); _trackSizeH=new TH1I("trksize","# hits in track",100,0,100); _trackPurityH=new TH1D("trkpurity","trackPurity",25,0,1); return kSUCCESS; } void PndTpcPatternRecoTask::Exec(Option_t* opt) { std::cout<<"PndTpcPatternRecoTask::Exec"<Delete(); std::vector clusterlist; unsigned int ncl=_clusterArray->GetEntriesFast(); for(unsigned int icl=0; iclAt(icl)); } std::vector candlist; _trackfinder->buildTracks(clusterlist,candlist); std::cout<<"PndTpcPatternRecoTask::Exec:: " <Fill(candlist.size()); // ----------------------------------------------- // build tracks unsigned int ncand=candlist.size(); for(unsigned int ic=0; icgetNHits()<6){ std::cout<<"Track initialization went wrong not enough hits in track"<getNHits();++i){ unsigned int detId; unsigned int hitId; cand->getHit(i,detId,hitId); mcid.AddIDCollection(clusterlist[hitId]->mcId()); } _trackPurityH->Fill(mcid.MaxRelWeight()); _trackSizeH->Fill(cand->getNHits()); // Todo: Use R from pattern reco to initialize track rep! // create track object LSLTrackRep* rep=new LSLTrackRep(); //rep->SetBField(_fieldIfc); Track* trk=new((*_trackArray)[_trackArray->GetEntriesFast()]) Track(rep); trk->setCandidate(*cand); // here the candidate is copied! //Is this what we want? // calcualte start values unsigned int detID; unsigned int hitID; cand->getHit(0,detID,hitID); PndTpcCluster* cl1=(PndTpcCluster*)_clusterArray->At(hitID); TVector3 pos1=cl1->pos(); TVector3 pos2; TVector3 delta; bool ok=false; unsigned int index=1; while(!ok && indexgetNHits()){ cand->getHit(index,detID,hitID); ++index; PndTpcCluster* cl2=(PndTpcCluster*)_clusterArray->At(hitID); pos2=cl2->pos(); delta=pos2-pos1; if(fabs(delta.Z())>0.1)ok=true; } if(!ok){ std::cout<<"Track initialization went wrong dz<1mm"<getTrackRep(0)->setStatusFlag(2); continue; } double mx=delta.X()/delta.Z(); double my=delta.Y()/delta.Z(); if(fabs(mx)<1E-12)mx<0 ? mx=-1E-12 : mx=+1E-12; if(fabs(my)<1E-12)my<0 ? my=-1E-12 : my=+1E-12; std::cout<<"mx="<mkdir("PatternReco"); file->cd("PatternReco"); _multiplicityHisto->Write(); delete _multiplicityHisto; _multiplicityHisto=NULL; _trackSizeH->Write(); delete _trackSizeH; _trackSizeH=NULL; _trackPurityH->Write(); delete _trackPurityH; _trackPurityH=NULL; file->Close(); delete file; }