//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class TpcPatternRecoTask // see TpcPatternRecoTask.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 "TpcPatternRecoTask.h" // C/C++ Headers ---------------------- // Collaborating Class Headers -------- #include "CbmRootManager.h" #include "TClonesArray.h" #include "RecoHitFactory.h" #include "FitterExceptions.h" #include "TpcConfTrackFinder.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" // Class Member definitions ----------- ClassImp(TpcPatternRecoTask) TpcPatternRecoTask::TpcPatternRecoTask() : CbmTask("Tpc Pattern Reco"), _persistence(kFALSE) { // default values for Conformal Map TrackFinder _xcut=1.; _ycut=1.; _zcut=2.; _chi2cut=10; _minpoints=4; _clusterBranchName = "TpcCluster"; } TpcPatternRecoTask::~TpcPatternRecoTask() { if(_multiplicityHisto!=NULL)delete _multiplicityHisto; if(_trackPurityH!=NULL)delete _trackPurityH; if(_trackSizeH!=NULL)delete _trackSizeH; } void TpcPatternRecoTask::SetTrkFinderParameters(double xcut, double ycut, double zcut, double chi2cut, unsigned int minpointsforfit) { _xcut=xcut; _ycut=ycut; _zcut=zcut; _chi2cut=chi2cut; _minpoints=minpointsforfit; } InitStatus TpcPatternRecoTask::Init() { //Get ROOT Manager CbmRootManager* ioman= CbmRootManager::Instance(); if(ioman==0) { Error("TpcPatternRecoTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection _clusterArray=(TClonesArray*) ioman->GetObject(_clusterBranchName); if(_clusterArray==0) { Error("TpcPatternRecoTask::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 TpcConfTrackFinder(); _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 TpcPatternRecoTask::Exec(Option_t* opt) { std::cout<<"TpcPatternRecoTask::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<<"TpcPatternRecoTask::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.AddID(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); TpcCluster* cl1=(TpcCluster*)_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; TpcCluster* cl2=(TpcCluster*)_clusterArray->At(hitID); pos2=cl2->pos(); delta=pos2-pos1; if(fabs(delta.Z())>0.01)ok=true; } if(!ok){ std::cout<<"Track initialization went wrong dz<0.1mm"<getTrackRep(0)->setStatusFlag(2); continue; } double mx=delta.X()/delta.Z(); double my=delta.Y()/delta.Z(); 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; }