//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndLmdKalmanTask // see PndLmdKalmanTask.h for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // Ralf Kliemt, TU Dresden (Copied for MVD use) // Anastasia Karavdina, Uni Mainz (Copied for LMD use) //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndLmdKalmanTask.h" // C/C++ Headers ---------------------- #include #include #include // Collaborating Class Headers -------- #include "FairRootManager.h" #include "TClonesArray.h" #include "GFTrack.h" #include "TDatabasePDG.h" #include "PndSdsHit.h" #include "FairMCPoint.h" #include "PndSdsRecoHit.h" #include "PndGeoHandling.h" #include "GFRecoHitFactory.h" #include "GFKalman.h" #include "GFException.h" #include "TH1D.h" #include "TFile.h" #include "TGeoTrack.h" #include "TGeoManager.h" #include "TLorentzVector.h" #include "GFDetPlane.h" #include "FairTrackParH.h" #include "FairBaseParSet.h" #include "LSLTrackRep.h" //#include "GeaneTrackRep2.h" #include "GeaneTrackRep.h" #include "FairGeanePro.h" #include "GFAbsTrackRep.h" #include "GFConstField.h" #include "PndDetectorList.h" //#include "PndSdsRecoHit.h" #include "RKTrackRep.h" #include "PndTrackCand.h" #include "PndTrack.h" #include "PndGenfitAdapters.h" #include "TMatrixFSym.h" //#include "GFPandaField.h" #include "PndGenfitField.h" // Class Member definitions ----------- PndLmdKalmanTask::PndLmdKalmanTask() : FairTask("Kalman Filter"), fPersistence(kFALSE) { // fTrackBranchName = "GFTrackCandLmd"; fTrackBranchName = "LMDTrackCand"; // fSdsHitBranchName = "LMDHitsStrip"; fSdsHitBranchName = "LMDHitsPixel"; PndGeoHandling::Instance(); // hxpull = new TH1D("hxpull","x/#sigma_{x}",1e2,-10,10.); // hypull = new TH1D("hypull","y/#sigma_{y}",1e2,-10,10.); // hzpull = new TH1D("hzpull","z/#sigma_{z}",1e2,-10,10.); // hpxpull = new TH1D("hpxpull","px/#sigma_{px}",1e2,-10,10.); // hpypull = new TH1D("hpypull","x/#sigma_{py}",1e2,-10,10.); // hpzpull = new TH1D("hpzpull","pz/#sigma_{pz}",1e2,-10,10.); flGEANE = false; flRK = false; fscaleP = 1; fscaleM = 1;} PndLmdKalmanTask::PndLmdKalmanTask(TString HitBranch, TString TrackBranch) : FairTask("Kalman Filter"), fPersistence(kFALSE) { fTrackBranchName = TrackBranch; fSdsHitBranchName = HitBranch; PndGeoHandling::Instance(); flGEANE = false; flRK = false; fscaleP = 1; fscaleM = 1; } PndLmdKalmanTask::~PndLmdKalmanTask() { // if(fPH!=NULL)delete fPH; // if(fChi2H!=NULL)delete fChi2H; } InitStatus PndLmdKalmanTask::Init() { fTrackcount=0; fsensType=0; //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("PndLmdKalmanTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fTrackArray=(TClonesArray*) ioman->GetObject(fTrackBranchName); if(fTrackArray==0) { Error("PndLmdKalmanTask::Init","GFTrackCandLmd array not found!"); return kERROR; } fSdsHitsArray=(TClonesArray*) ioman->GetObject(fSdsHitBranchName); //Set output collection // fTrackFittedArray = new TClonesArray("PndLinTrack"); // ioman->Register("LMDTrack", "PndLmd", fTrackFittedArray, kTRUE); fTrackFittedArray = new TClonesArray("PndTrack"); ioman->Register("LMDPndTrack", "PndLmd", fTrackFittedArray, kTRUE); // Build hit factory ----------------------------- fTheRecoHitFactory = new GFRecoHitFactory(); TClonesArray* stripar=(TClonesArray*) ioman->GetObject(fSdsHitBranchName); if(stripar==0){ //TODO Convention on detector number needed Error("PndLmdKalmanTask::Init","LMDHitsStrip array not found"); } else { fTheRecoHitFactory->addProducer(1,new GFRecoHitProducer(stripar)); std::cout << "*** PndLmdKalmanTask::Init" << "\t" << "fSdsHitBranchName array found" << std::endl; } //read beam momentum from base FairRun* fRun = FairRun::Instance(); FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); FairBaseParSet* par=(FairBaseParSet*) (rtdb->findContainer("FairBaseParSet")); fPbeam = par->GetBeamMom(); //fPbeam -=8.77e-5;//TEST!!! energy loss for 11.91 GeV/c // fPbeam -=1e-4;//TEST!!! energy loss for 1.5 GeV/c std::cout<<"Beam Momentum for this run is "<init(new GFPandaField()); GFFieldManager::getInstance()->init(new PndGenfitField()); } if(flGEANE){ std::cout<<"GeaneTrackRep will be used for track representation"<Delete(); if(fVerbose>1) std::cout<<"((((((((((((((((((((( PndLmdKalmanTask::Exec )))))))))))))))))))))"<GetEntriesFast(); // Detailed output if(fVerbose>1) std::cout<<" -I- PndLmdKalmanTask: contains "<1) std::cout<<"starting track"<At(itr); const int Ntrkcandhits= trackCand->GetNHits(); //Read info about 1st plane(sensor) PndTrackCandHit theHit = trackCand->GetSortedHit(0); //get 1st hit Int_t hitID = theHit.GetHitId(); PndSdsHit* myHit = (PndSdsHit*)(fSdsHitsArray->At(hitID)); TMatrixD hitCov = myHit->GetCov(); if(fVerbose>1) std::cout<<"hitCov:"<1) hitCov.Print(); Int_t id = myHit->GetSensorID(); TString path = fGeoH->GetPath(id); TVector3 oo, uu, vv; fGeoH->GetOUVShortId(id, oo,uu,vv); if(fVerbose>1){ std::cout<<"oo:"<getPosSeed(); TVector3 StartDir = GFtrkCand->getDirSeed(); TVector3 StartMom = fPbeam*StartDir; TVector3 StartPosErr(sqrt(hitCov[0][0]),sqrt(hitCov[1][1]),sqrt(hitCov[2][2])); TVector3 StartDirErr(0.1*(sqrt(hitCov[0][0])),0.1*(sqrt(hitCov[1][1])),0.1*sqrt(hitCov[2][2]));//TODO: check this assumption (2*sigma_{x}/20cm) TVector3 StartMomErr=fPbeam*StartDirErr; //initial errors for Kalman must be large: this is usually done in order to give a low weight to the prefit StartPosErr *=fscaleP; StartMomErr *=fscaleM; // StartMomErr *=1; if(fVerbose>2){ unsigned int detid=12345, index=12345; std::cout<< "GFTrackCand no. "<getNHits()<<" hits."<getNHits();ihit++){ GFtrkCand->getHit(ihit, detid,index); //detid and index are written here std::cout<<" ]\n[ "<1){ std::cout<<"*** BEFORE ***"<1) std::cout<<"RKTrackRep will be used for track representation"<getPosSeed(); // // TVector3 StartDir = GFtrkCand->getDirSeed(); // // TVector3 StartMom = fPbeam*StartDir; // LSLTrackRep* rep = new LSLTrackRep(StartPos.Z(),StartPos.X(),StartPos.Y(),StartDir.X(),StartDir.Y(),1/fPbeam, // StartPosErr.X(),StartPosErr.Y(),StartDirErr.X(),StartDirErr.Y(), // 1e-23,magFieldConst); // //TODO: double siginvp = 1/1e-4 is it correct??? // /// LinTrk rep (END) ------------------ ///GEANE track rep -------------------- if(flGEANE){ // if(fVerbose>1) // std::cout<<"GeaneTrackRep will be used for track representation"<getDirSeed(); // if(fVerbose>1){ // std::cout<<" ---- dirCand ---- "<SetPoint(pointbackprop); // fPro->PropagateToPCA(1, -1); // Bool_t rc = fPro->Propagate(fStart, fRes, fPDGCode); // if(fVerbose>1){ // if(rc) std::cout<<"success in back propagation to init GeaneTrackRep !"<GetX(), fRes->GetY(), fRes->GetZ()); // StartMom.SetXYZ(fRes->GetPx(), fRes->GetPy(), fRes->GetPz()); // StartPosErr.SetXYZ(fRes->GetDX(), fRes->GetDY(), fRes->GetDZ()); // StartMomErr.SetXYZ(fRes->GetDPx(), fRes->GetDPy(), fRes->GetDPz()); // } // if(fVerbose>1){ // std::cout<<"*** AFTER ***"<setCandidate(*GFtrkCand); // Load RecoHits try { trk->addHitVector(fTheRecoHitFactory->createMany(trk->getCand())); if(fVerbose>1){ std::cout<getNumHits()<<" hits in track " <addHitVector " << e.what() << std::endl; throw e; } // Start Fitter try{ if(fVerbose>1){ std::cout<<" ... GFtrk BEFORE ..."<Print(); } fitter.processTrack(trk); if(fVerbose>1){ std::cout<<" ... GFtrk AFTER ..."<Print(); } } catch (GFException e){ std::cout<<"*** FITTER EXCEPTION ***"<0) std::cout<<"successful FIT!"<1){ std::cout<<"trkPnd AFTER GenFit "<Print(); std::cout<<"Number of hits in trk-cand: "<GetNHits()<SetTrackCand(*trackCand); trkPnd->SetRefIndex(itr);//TODO: check is it correct set RefIn like ID of trk-cand??? trkPnd->SetChi2(trk->getChiSqu()); // --- Save as PndTrack--- TClonesArray& clref = *fTrackFittedArray; Int_t size = clref.GetEntriesFast(); PndTrack *trackfit = new(clref[size]) PndTrack(*trkPnd); // // --- Save as Lin trk --- // FairTrackParP fFittedTrkParabolStart = trkPnd->GetParamFirst(); // TVector3 FinPos(fFittedTrkParabolStart.GetX(),fFittedTrkParabolStart.GetY(),fFittedTrkParabolStart.GetZ()); // TVector3 FinMom(fFittedTrkParabolStart.GetPx(),fFittedTrkParabolStart.GetPy(),fFittedTrkParabolStart.GetPz()); // double covMARS[6][6]; // fFittedTrkParabolStart.GetMARSCov(covMARS); // // std::cout<<"covMARS:"<GetX(), fResNEW->GetY(), fResNEW->GetZ()); // // FinMom.SetXYZ(fResNEW->GetPx(), fResNEW->GetPy(), fResNEW->GetPz()); // // FinPosErr.SetXYZ(fResNEW->GetDX(), fResNEW->GetDY(), fResNEW->GetDZ()); // // FinMomErr.SetXYZ(fResNEW->GetDPx(), fResNEW->GetDPy(), fResNEW->GetDPz()); // // } // // } // if(fVerbose>1){ // std::cout<<"Trk parameters after fit: "<getChiSqu(); // TClonesArray& clref = *fTrackFittedArray; // Int_t size = clref.GetEntriesFast(); // PndLinTrack *trackfit = new(clref[size]) PndLinTrack("Lumi",FinPos.X(),FinDir.X(),FinPos.Y(),FinDir.Y(),FinPos.Z(), // FinDir.Z(),chi2GF, -1,-1,itr);//TODO: set correct hit id! // // // trackfit->Print(); // // GFAbsTrackRep* clone = trk->getCardinalRep()->clone(); // // TMatrixT firstCov = clone->getFirstCov(); // // std::cout<<" full: cov.matrix"<1){ // std::cout<<"Covariance Matrix:"<Print(); // } // // std::cout<<" sqrt(((*COVmatrix)(0,0))) = "<