#include "PndMvdRiemannVertexFinderTask.h" #include #include // Root includes #include "TROOT.h" #include "TString.h" #include "TClonesArray.h" #include "TParticlePDG.h" #include "TVector3.h" #include "TH1F.h" // framework includes #include "FairRootManager.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "PndMCTrack.h" // PndMvd includes #include "PndSdsRecoHit.h" // #include "PndMvdTrackCand.h" #include "PndSdsHit.h" #include "PndSdsMCPoint.h" #include "PndSdsCluster.h" #include "PndSdsDigi.h" //#include "PndRiemannTrackFinder.h" #include "PndRiemannHit.h" #include "PndRiemannTrack.h" #include "PndDetectorList.h" #include "PndSdsMCPoint.h" PndMvdRiemannVertexFinderTask::PndMvdRiemannVertexFinderTask() : FairTask("MVD Riemann VERTEX Finder") { fHitBranch = "MVDHitsPixel"; fHitBranch2 = "MVDHitsStrip"; fTrackBranch = "MVDRiemannTrackCand"; fIdealTrackCandBranch = "MVDIdealTrackCand"; fMCTrackBranch = "MCTrack"; fEventNr = 0; //fTrackBranch = "MCTrack"; } PndMvdRiemannVertexFinderTask::~PndMvdRiemannVertexFinderTask() { } void PndMvdRiemannVertexFinderTask::SetParContainers() { // Get Base Container /* FairRun* ana = FairRun::Instance(); FairRuntimeDb* rtdb=ana->GetRuntimeDb(); fGeoPar = (PndMvdGeoPar*)(rtdb->getContainer("PndMvdGeoPar")); */ } InitStatus PndMvdRiemannVertexFinderTask::ReInit() { InitStatus stat=kSUCCESS; return stat; /* FairRun* ana = FairRun::Instance(); FairRuntimeDb* rtdb=ana->GetRuntimeDb(); fGeoPar=(PndMvdGeoPar*)(rtdb->getContainer("PndMvdGeoPar")); return kSUCCESS; */ } // ----- Public method Init -------------------------------------------- InitStatus PndMvdRiemannVertexFinderTask::Init() { FairRootManager* ioman = FairRootManager::Instance(); if ( ! ioman ) { std::cout << "-E- PndMvdRiemannVertexFinderTask::Init: " << "RootManager not instantiated!" << std::endl; return kFATAL; } // Get input array fHitArray = (TClonesArray*) ioman->GetObject(fHitBranch); if ( !fHitArray){ std::cout << "-W- PndMvdRiemannVertexFinderTask::Init: " << "No hitArray!" << std::endl; return kERROR; } fHitArray2 = (TClonesArray*) ioman->GetObject(fHitBranch2); if ( !fHitArray2){ std::cout << "-W- PndMvdRiemannVertexFinderTask::Init: " << "No hitArray2!" << std::endl; return kERROR; } fTrackCandArray = (TClonesArray*) ioman->GetObject(fTrackBranch); if ( !fTrackCandArray){ std::cout << "-W- PndMvdRiemannVertexFinderTask::Init: " << "No tracks!" << std::endl; return kERROR; } fIdealTrackCandArray= (TClonesArray*) ioman->GetObject(fIdealTrackCandBranch); if ( !fIdealTrackCandArray){ std::cout << "-W- PndMvdRiemannVertexFinderTask::Init: " << "No ideal tracks!" << std::endl; return kERROR; } fMCTrackArray = (TClonesArray*) ioman->GetObject(fMCTrackBranch); if ( !fMCTrackArray){ std::cout << "-W- PndMvdRiemannVertexFinderTask::Init: " << "No MC tracks!" << std::endl; return kERROR; } fTrackArray = new TClonesArray("PndRiemannTrack"); delta = new TH1F("delta","delta",1000,0,10); wrongV= new TH1F("wrong","wrong",1000,0,10); fVertex = new TClonesArray("PndSdsMCPoint"); ioman->Register("Vertex", "MVD", fVertex, kTRUE); fMCVertex = new TClonesArray("PndSdsMCPoint"); ioman->Register("MCVertex", "MVD", fMCVertex, kTRUE); // fRiemannTrackArray = new TClonesArray("PndRiemannTrack"); // ioman->Register("MVDRiemannTrack","MVD",fRiemannTrackArray, kTRUE); std::cout << "-I- PndMvdRiemannVertexFinderTask: Initialisation successfull" << std::endl; return kSUCCESS; } // ----- Public method Exec -------------------------------------------- void PndMvdRiemannVertexFinderTask::Exec(Option_t* opt) { // Reset output array if ( ! fTrackCandArray ) Fatal("Exec", "No trackCandArray"); std::vector CheckedCand; refit(CheckedCand); std::vector< std::pair > PairCand; std::vector< std::pair > TrueMCCand; std::vector< std::pair > FalseMCCand; std::vector< std::pair > MCCand; int MaxIndex=0; FindVertex(CheckedCand,PairCand,TrueMCCand,FalseMCCand,MCCand ,MaxIndex); CalcEfficiency(TrueMCCand, FalseMCCand, MCCand); std::cout << "Done event : " << fEventNr++ << std::endl; } void PndMvdRiemannVertexFinderTask::CalcEfficiency(std::vector< std::pair > TrueMCCand, std::vector< std::pair > FalseMCCand,std::vector< std::pair > MCCand) { int counter=0; for(unsigned int i=0;i Pair(i,j); PairCand.push_back(Pair); if (j>MaxIndex) MaxIndex=j; av=p1+p2; av*=0.5; PndSdsMCPoint* Vertex1 = new PndSdsMCPoint(0,0,-1,p1,p1,p1,p1,0,0,0); PndSdsMCPoint* Vertex2 = new PndSdsMCPoint(0,0,-1,p2,p2,p2,p2,0,0,0); new((*fVertex)[fVertex->GetEntriesFast()])PndSdsMCPoint(*Vertex1); new((*fVertex)[fVertex->GetEntriesFast()])PndSdsMCPoint(*Vertex2); int c1=FoundCandInMCCands(CheckedCand[i]); int c2=FoundCandInMCCands(CheckedCand[j]); if (c1>-1 && c2>-1){ // std::cout<At(c1); PndMCTrack* myTrack1 = (PndMCTrack*)fMCTrackArray->At(Cand1->getMcTrackId()); PndTrackCand* Cand2 = (PndTrackCand*)fIdealTrackCandArray->At(c2); PndMCTrack* myTrack2 = (PndMCTrack*)fMCTrackArray->At(Cand2->getMcTrackId()); if (((myTrack1->GetPdgCode()==myTrack2->GetPdgCode()) or ((myTrack1->GetPdgCode()*myTrack2->GetPdgCode()<0) && (fabs(myTrack1->GetPdgCode())!=fabs(myTrack2->GetPdgCode()))))){///for D+D- delta->Fill((myTrack1->GetStartVertex()-p1).Mag()); delta->Fill((myTrack1->GetStartVertex()-p2).Mag()); pair Pair2(c1,c2); TrueMCCand.push_back(Pair2); } else{ wrongV->Fill((myTrack1->GetStartVertex()-p1).Mag()); wrongV->Fill((myTrack1->GetStartVertex()-p2).Mag()); pair Pair3(c1,c2); FalseMCCand.push_back(Pair3); } } } } } for(int i=0;iGetEntriesFast();i++){ PndTrackCand* Cand1 = (PndTrackCand*)fIdealTrackCandArray->At(i); PndMCTrack* myTrack1 = (PndMCTrack*)fMCTrackArray->At(Cand1->getMcTrackId()); for(int j=i+1;jGetEntriesFast();j++){ PndTrackCand* Cand2 = (PndTrackCand*)fIdealTrackCandArray->At(j); PndMCTrack* myTrack2 = (PndMCTrack*)fMCTrackArray->At(Cand2->getMcTrackId()); if (((myTrack1->GetPdgCode()==myTrack2->GetPdgCode()) or ((myTrack1->GetPdgCode()*myTrack2->GetPdgCode()<0) && (fabs(myTrack1->GetPdgCode())!=fabs(myTrack2->GetPdgCode()))))){ if(CheckRecoTrack(Cand1,myTrack1) && CheckRecoTrack(Cand2,myTrack2) ){ pair Pair(i,j); MCCand.push_back(Pair); // std::cout<<"IdealVertex: "<& CheckedCand) { for(int i=0;iGetEntriesFast();i++){ PndTrackCand* Cand = (PndTrackCand*)fTrackCandArray->At(i); unsigned int detId,hitId; PndRiemannTrack track; for(unsigned int j=0;jGetNHits();j++){ detId=Cand->GetSortedHit(j).GetDetId(); hitId=Cand->GetSortedHit(j).GetHitId(); PndSdsHit* point = new PndSdsHit(); // std::cout<<"detId= "<GetEntriesFast()<At(candN); for(int k=0;kGetEntriesFast();k++){ PndTrackCand* TestCand=(PndTrackCand*)fIdealTrackCandArray->At(k); unsigned int counter=0; bool ZeroPos=false; for(unsigned int i=0;iGetNHits();i++){ unsigned int d1,h1; d1=FoundCand->GetSortedHit(i).GetDetId(); h1=FoundCand->GetSortedHit(i).GetHitId(); if (d1==0){ ZeroPos=true; continue; } for(unsigned int j=0;jGetNHits();j++){ unsigned int d2,h2; d2=TestCand->GetSortedHit(j).GetDetId(); h2=TestCand->GetSortedHit(j).GetHitId(); if(d1==d2 && h1==h2){ counter++; } } } if ((counter==FoundCand->GetNHits() && !ZeroPos) or (counter==FoundCand->GetNHits()-1 && ZeroPos)){ return k; } } return -1; } bool PndMvdRiemannVertexFinderTask::CheckVertex(std::vector Combination, std::vector< std::pair > PairCand) { int count1=0; for(unsigned int i=0;iAt(first); PndTrackCand* cand2=(PndTrackCand*)fTrackCandArray->At(second); int counter=0; for(unsigned int i=0;iGetNHits();i++){ unsigned int d1,h1; d1=cand1->GetSortedHit(i).GetDetId(); h1=cand1->GetSortedHit(i).GetHitId(); for(unsigned int j=0;jGetNHits();j++){ unsigned int d2,h2; d2=cand2->GetSortedHit(j).GetDetId(); h2=cand2->GetSortedHit(j).GetHitId(); if(d1==d2 && h1==h2){ counter++; } } } if (counter<3) return true; else return false; } bool PndMvdRiemannVertexFinderTask::CheckRecoTrack(PndTrackCand *cand,PndMCTrack* myTrack) { if (/*myTrack->GetPdgCode()==211 &&*/ (cand->GetNHits()>2) && (myTrack->GetMotherID()==-1)){ int count=0; unsigned int detIDi, hitIDi; unsigned int detIDj, hitIDj; for(unsigned int i=0;iGetNHits();i++){ detIDi=cand->GetSortedHit(i).GetDetId(); hitIDi=cand->GetSortedHit(i).GetHitId(); PndSdsHit *pointI; if (detIDi == FairRootManager::Instance()->GetBranchId(fHitBranch)) pointI = (PndSdsHit*)fHitArray->At(hitIDi); else if (detIDi == FairRootManager::Instance()->GetBranchId(fHitBranch2)) pointI = (PndSdsHit*)fHitArray2->At(hitIDi); else pointI = 0; for(unsigned int j=0;jGetNHits();j++){ detIDj=cand->GetSortedHit(j).GetDetId(); hitIDj=cand->GetSortedHit(j).GetHitId(); PndSdsHit *pointJ; if (detIDj == FairRootManager::Instance()->GetBranchId(fHitBranch)) pointJ = (PndSdsHit*)fHitArray->At(hitIDj); else if (detIDj == FairRootManager::Instance()->GetBranchId(fHitBranch2)) pointJ = (PndSdsHit*)fHitArray2->At(hitIDj); else pointJ = 0; if ((pointI!=0) && (pointJ!=0) && (i!=j)){ TVector3 a=pointI->GetPosition() - pointJ->GetPosition(); if (a.Mag()<1){ count++; } } } } if ((cand->GetNHits()-count/2)<3){ // std::cout <<"Less then 3 base points in RecoTrack"<<" "<getNHits()<<" "<Clear(); fIdealTrackCandArray->Clear(); fTrackArray->Clear(); fVertex->Clear(); fMCVertex->Clear(); } ClassImp(PndMvdRiemannVertexFinderTask);