// ------------------------------------------------------------------------- // ----- PndLmdGeaneTask source file ----- // ----- Created 18/07/08 by T.Stockmanns ----- // ----- modified for Lmd by M. Michel & A.Karavdina ----- // ------------------------------------------------------------------------- // libc includes #include // Root includes #include "TROOT.h" #include "TClonesArray.h" #include "TVector3.h" #include // framework includes #include "FairRootManager.h" #include "PndLmdGeaneTask.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairHit.h" #include "PndMCTrack.h" #include "FairBaseParSet.h" #include "TGeant3.h" #include "FairTrackParH.h" #include "FairTrackParP.h" #include "TDatabasePDG.h" #include "PndTrack.h" // PndSds includes #include "PndSdsMCPoint.h" #include "PndSdsHit.h" //PndLmd includes #include "PndLinTrack.h" #include #include // ----- Default constructor ------------------------------------------- PndLmdGeaneTask::PndLmdGeaneTask() : FairTask("Geane Task for PANDA Lmd"), fEventNr(0), fUseMVDPoint(false) { } // ------------------------------------------------------------------------- PndLmdGeaneTask::PndLmdGeaneTask(Double_t pBeam,TVector3 IP): FairTask("Geane Task for PANDA Lmd"), fEventNr(0), fUseMVDPoint(false) { fPbeam = pBeam; cout<<"Beam Momentum for particle with PDGid#"<GetObject("LMDPoint"); if ( !fMCHits) { std::cout << "-W- PndLmdGeaneTask::Init: "<< "No LMDPoint"<<" array!" << std::endl; return kERROR; } // fTracks = (TClonesArray*) ioman->GetObject("LMDTrack"); fTracks = (TClonesArray*) ioman->GetObject("LMDPndTrack"); if (!fTracks){ std::cout << "-W- PndLmdGeaneTask::Init: "<< "No Track" << " array!" << std::endl; return kERROR; } fTrackParGeane = new TClonesArray("FairTrackParH"); ioman->Register("GeaneTrackPar","Geane", fTrackParGeane, kTRUE); fTrackParIni = new TClonesArray("FairTrackParH"); ioman->Register("GeaneTrackIni","Geane", fTrackParIni, kTRUE); fTrackParFinal = new TClonesArray("FairTrackParH"); ioman->Register("GeaneTrackFinal","Geane", fTrackParFinal, kTRUE); fDetName = new TClonesArray("TObjString"); ioman->Register("DetName", "Geane", fDetName, kTRUE); fPro = new FairGeanePro(); fGeoH = PndGeoHandling::Instance(); FairRun* fRun = FairRun::Instance(); FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); return kSUCCESS; } // ------------------------------------------------------------------------- void PndLmdGeaneTask::SetParContainers() { // Get Base Container /// FairRun* ana = FairRun::Instance(); // FairRuntimeDb* rtdb=ana->GetRuntimeDb(); } // ----- Public method Exec -------------------------------------------- void PndLmdGeaneTask::Exec(Option_t* opt) { // cout<<"PndLmdGeaneTask::Exec starts!"< > mcHitMap;//Track -> MCHits fTrackParGeane->Delete(); fTrackParIni->Delete(); fTrackParFinal->Delete(); fDetName->Delete(); mcHitMap = AssignHitsToTracks(); fEventNr++; //Charge & mass of particle Int_t PDGCode = -2212; //antiproton // Int_t PDGCode = fPDGid; TDatabasePDG *fdbPDG = TDatabasePDG::Instance(); TParticlePDG *fParticle = fdbPDG->GetParticle(PDGCode); Double_t fCharge = fParticle->Charge()/3.; // cout<<"fCharge = "<GetEntriesFast(); // cout<<"glI = "<At(i)); // TString DecName = recTrack->GetDetName(); // if(DecName!="Lumi") continue; // //Vector of particle momentum and starting point // TVector3 DirVec = recTrack->GetDirectionVec(); // StartPos = recTrack->GetStartVec(); // StartPosErr = recTrack->GetStartErrVec(); // StartMomErr = recTrack->GetDirectionErrVec(); // StartMom = fPbeam*DirVec; // StartMomErr *=fPbeam; PndTrack* recTrack = (PndTrack*)(fTracks->At(i)); // TString DecName = recTrack->GetDetName(); // if(DecName!="Lumi") continue; FairTrackParP fFittedTrkP = recTrack->GetParamFirst(); TVector3 PosRecLMD(fFittedTrkP.GetX(),fFittedTrkP.GetY(),fFittedTrkP.GetZ()); TVector3 MomRecLMD(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz()); MomRecLMD *=fPbeam/MomRecLMD.Mag(); double covMARS[6][6]; fFittedTrkP.GetMARSCov(covMARS); TVector3 errMomRecLMD(sqrt(covMARS[0][0]),sqrt(covMARS[1][1]),sqrt(covMARS[2][2])); TVector3 errPosRecLMD(sqrt(covMARS[3][3]),sqrt(covMARS[4][4]),sqrt(covMARS[5][5])); StartPos = PosRecLMD; StartPosErr = errPosRecLMD; StartMom = MomRecLMD; StartMomErr = errMomRecLMD; if(fVerbose>2){ cout<<"------------------------------------------"<SetPoint(vtx); fPro->PropagateToPCA(1,-1);// back-propagate to point Bool_t isProp = fPro->Propagate(fStart, fRes, PDGCode); ///---------------------------------------------------------------------- // ///Forwars propagate to the 1st plane to a space point--------------------------------- // PndMCTrack* mctrk = (PndMCTrack*)(fMCTracks->At(i)); // TVector3 MomMC = mctrk->GetMomentum(); // TVector3 PosMC = mctrk->GetStartVertex(); // FairTrackParH *fStart = // new (clref1[size1]) FairTrackParH(PosMC, MomMC, StartPosErr, StartMomErr, fCharge); // TClonesArray& clref = *fTrackParGeane; // Int_t size = clref.GetEntriesFast(); // FairTrackParH *fRes = new(clref[size]) FairTrackParH(); // fPro->SetPoint(StartPos); // //fPro->PropagateToPCA(1,-1); // fPro->PropagateToPCA(1,1); // Bool_t isProp = fPro->Propagate(fStart, fRes, PDGCode); // ///---------------------------------------------------------------------- // ///Propagate to virtual plane at PCA ------------------------------------ // TVector3 oc = (0,0,0); // TVector3 dj(0,1,0); // TVector3 dk(-1,0,0); // FairTrackParP *fStart = // new (clref1[size1]) FairTrackParP(StartPos, StartMom, StartPosErr, StartMomErr, fCharge, oc, dj, dk); // TClonesArray& clref = *fTrackParGeane; // Int_t size = clref.GetEntriesFast(); // FairTrackParP *fRes = new(clref[size]) FairTrackParP(); // fPro->SetPoint(vtx); // fPro->BackTrackToVirtualPlaneAtPCA(1); // Bool_t isProp = fPro->Propagate(fStart, fRes, PDGCode); // cout<<"================= %%%% ===================="<PropagateFromPlane(v1s, v2s); // fPro->PropagateToPlane(oc,dj,dk); // fPro->setBackProp(); // Bool_t isProp = fPro->Propagate(fStart, fRes, PDGCode); // cout<<"================= %%%% ===================="<GetX(),fRes->GetY(),fRes->GetZ()); TVector3 gMom(fRes->GetPx(),fRes->GetPy(),fRes->GetPz()); TVector3 gErrPos(fRes->GetDX(),fRes->GetDY(),fRes->GetDZ()); TVector3 gErrMom(fRes->GetDPx(),fRes->GetDPy(),fRes->GetDPz()); // cout<<" "<2){ // cout<<"================= %%%% ===================="<2){ cout<<"!!! Back-propagation with GEANE didn't return result !!!"<Delete(); // fMCHits->Delete(); if(fVerbose>2) cout<<"PndLmdGeaneTask::Exec END!"< > PndLmdGeaneTask::AssignHitsToTracks() { std::map > result; for (int i = 0; i < fMCHits->GetEntriesFast(); i++){ //get all MC Hits PndSdsMCPoint* myPoint = (PndSdsMCPoint*)(fMCHits->At(i)); //sort MCHits with Tracks //PndMCTrack* myTrack = (PndMCTrack*)(fMCTracks->At(myPoint->GetTrackID())); result[myPoint->GetTrackID()].push_back(i); } return result; } ClassImp(PndLmdGeaneTask);