diff --git a/reco/KF/CbmKfFitTracksTask.cxx b/reco/KF/CbmKfFitTracksTask.cxx index 0962838adf8bd988d288a90efde181010dc646eb..2f43763fa8ef09894573c04ebc8b4e0fff7fc040 100644 --- a/reco/KF/CbmKfFitTracksTask.cxx +++ b/reco/KF/CbmKfFitTracksTask.cxx @@ -101,7 +101,7 @@ void CbmKfFitTracksTask::Exec(Option_t* /*opt*/) return; } CbmKfTrackFitter::Track t; - if (!fFitter.CreateMvdStsTrack(t, *stsTrack)) { + if (!fFitter.CreateMvdStsTrack(t, iTr)) { LOG(fatal) << "CbmKfFitTracksTask: can not create the sts track for the fit! "; return; } diff --git a/reco/KF/CbmKfTrackFitter.cxx b/reco/KF/CbmKfTrackFitter.cxx index 0d0c80e4c5c3b9a27d270baf2b0f227295dd5b68..272cf0e93b5ed3ddddc8ebf039a498bcdeed99b5 100644 --- a/reco/KF/CbmKfTrackFitter.cxx +++ b/reco/KF/CbmKfTrackFitter.cxx @@ -120,18 +120,115 @@ void CbmKfTrackFitter::SetMassHypothesis(double mass) void CbmKfTrackFitter::SetElectronFlag(bool isElectron) { fIsElectron = isElectron; } -bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const CbmGlobalTrack& globalTrack) +bool CbmKfTrackFitter::CreateMvdStsTrack(CbmKfTrackFitter::Track& kfTrack, int stsTrackIndex) +{ + Init(); + if (!fIsInitialized) return false; + + if (!fInputStsTracks) { + LOG(error) << "CbmKfTrackFitter: Sts track array not found!"; + return false; + } + if (stsTrackIndex >= fInputStsTracks->GetEntriesFast()) { + LOG(error) << "CbmKfTrackFitter: Sts track index " << stsTrackIndex << " is out of range!"; + return false; + } + auto* stsTrack = dynamic_cast<const CbmStsTrack*>(fInputStsTracks->At(stsTrackIndex)); + if (!stsTrack) { + LOG(error) << "CbmKfTrackFitter: Sts track is null!"; + return false; + } + + CbmGlobalTrack globalTrack; + globalTrack.SetStsTrackIndex(stsTrackIndex); + globalTrack.SetParamFirst(*dynamic_cast<const FairTrackParam*>(stsTrack->GetParamFirst())); + + return CreateGlobalTrack(kfTrack, globalTrack); +} + + +bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, int globalTrackIndex) { Init(); if (!fIsInitialized) return false; - std::vector<CbmMvdHit> mvdHits; - std::vector<CbmStsHit> stsHits; - std::vector<CbmMuchPixelHit> muchHits; - std::vector<CbmTrdHit> trdHits; - std::vector<CbmTofHit> tofHits; + if (!fInputGlobalTracks) { + LOG(error) << "CbmKfTrackFitter: Global track array not found!"; + return false; + } + + if (globalTrackIndex >= fInputGlobalTracks->GetEntriesFast()) { + LOG(error) << "CbmKfTrackFitter: Global track index " << globalTrackIndex << " is out of range!"; + return false; + } + + auto* globalTrack = dynamic_cast<const CbmGlobalTrack*>(fInputGlobalTracks->At(globalTrackIndex)); + if (!globalTrack) { + LOG(error) << "CbmKfTrackFitter: Global track is null!"; + return false; + } + + return CreateGlobalTrack(kfTrack, *globalTrack); +} + +bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const CbmGlobalTrack& globalTrack) +{ kfTrack = {}; + Init(); + if (!fIsInitialized) return false; + + const ca::Parameters& caPar = CbmL1::Instance()->fpAlgo->GetParameters(); + + int nStations = caPar.GetNstationsActive(); + + CbmKfTrackFitter::Track t; + + { + t.fNodes.resize(nStations); + for (int i = 0; i < nStations; i++) { + CbmKfTrackFitter::FitNode& n = t.fNodes[i]; + n = {}; + n.fMaterialLayer = i; + n.fZ = caPar.GetStation(i).GetZScal(); + n.fRadThick = 0.; + n.fIsRadThickSet = false; + n.fIsFitted = false; + n.fIsXySet = false; + n.fIsTimeSet = false; + n.fHitSystemId = ECbmModuleId::kNotExist; + n.fHitAddress = -1; + n.fHitIndex = -1; + } + t.fFirstHitNode = nStations - 1; + t.fLastHitNode = 0; + } + + // lambda to set the node from the pixel hit + auto setNode = [&](const CbmPixelHit& h, int stIdx, int hitIdx, ca::EDetectorID detId) { + int ista = caPar.GetStationIndexActive(stIdx, detId); + if (ista < 0) return; + assert(ista < nStations); + CbmKfTrackFitter::FitNode& n = t.fNodes[ista]; + n.fZ = h.GetZ(); + n.fMxy.SetX(h.GetX()); + n.fMxy.SetY(h.GetY()); + n.fMxy.SetDx2(h.GetDx() * h.GetDx()); + n.fMxy.SetDy2(h.GetDy() * h.GetDy()); + n.fMxy.SetDxy(h.GetDxy()); + n.fMxy.SetNdfX(1); + n.fMxy.SetNdfY(1); + n.fIsXySet = true; + n.fMt.SetT(h.GetTime()); + n.fMt.SetDt2(h.GetTimeError() * h.GetTimeError()); + n.fMt.SetNdfT(1); + n.fIsTimeSet = (detId != ca::EDetectorID::kMvd); + n.fRadThick = 0.; + n.fIsRadThickSet = false; + n.fHitSystemId = cbm::L1Util::ConvertDetSystemId(detId); + n.fHitAddress = h.GetAddress(); + n.fHitIndex = hitIdx; + }; // Read MVD & STS hits @@ -161,14 +258,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const LOG(error) << "CbmKfTrackFitter: Mvd hit array not found!"; return false; } - mvdHits.reserve(nMvdHits); for (int ih = 0; ih < nMvdHits; ih++) { int hitIndex = stsTrack->GetMvdHitIndex(ih); if (hitIndex >= fInputMvdHits->GetEntriesFast()) { LOG(error) << "CbmKfTrackFitter: Mvd hit index " << hitIndex << " is out of range!"; return false; } - mvdHits.push_back(*dynamic_cast<const CbmMvdHit*>(fInputMvdHits->At(hitIndex))); + const auto& hit = *dynamic_cast<const CbmMvdHit*>(fInputMvdHits->At(hitIndex)); + setNode(hit, CbmMvdTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex, + ca::EDetectorID::kMvd); } } @@ -180,14 +278,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const LOG(error) << "CbmKfTrackFitter: Sts hit array not found!"; return false; } - stsHits.reserve(nStsHits); for (int ih = 0; ih < nStsHits; ih++) { int hitIndex = stsTrack->GetStsHitIndex(ih); if (hitIndex >= fInputStsHits->GetEntriesFast()) { LOG(error) << "CbmKfTrackFitter: Sts hit index " << hitIndex << " is out of range!"; return false; } - stsHits.push_back(*dynamic_cast<const CbmStsHit*>(fInputStsHits->At(hitIndex))); + const auto& hit = *dynamic_cast<const CbmStsHit*>(fInputStsHits->At(hitIndex)); + setNode(hit, CbmStsTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex, + ca::EDetectorID::kSts); } } } // MVD & STS hits @@ -216,14 +315,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const LOG(error) << "CbmKfTrackFitter: Much hit array not found!"; return false; } - muchHits.reserve(nHits); for (int ih = 0; ih < nHits; ih++) { int hitIndex = track->GetHitIndex(ih); if (hitIndex >= fInputMuchHits->GetEntriesFast()) { LOG(error) << "CbmKfTrackFitter: Much hit index " << hitIndex << " is out of range!"; return false; } - muchHits.push_back(*dynamic_cast<const CbmMuchPixelHit*>(fInputMuchHits->At(hitIndex))); + const auto& hit = *dynamic_cast<const CbmMuchPixelHit*>(fInputMuchHits->At(hitIndex)); + setNode(hit, CbmMuchTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex, + ca::EDetectorID::kMuch); } } } @@ -251,14 +351,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const LOG(error) << "CbmKfTrackFitter: Trd hit array not found!"; return false; } - trdHits.reserve(nHits); for (int ih = 0; ih < nHits; ih++) { int hitIndex = track->GetHitIndex(ih); if (hitIndex >= fInputTrdHits->GetEntriesFast()) { LOG(error) << "CbmKfTrackFitter: Trd hit index " << hitIndex << " is out of range!"; return false; } - trdHits.push_back(*dynamic_cast<const CbmTrdHit*>(fInputTrdHits->At(hitIndex))); + const auto& hit = *dynamic_cast<const CbmTrdHit*>(fInputTrdHits->At(hitIndex)); + setNode(hit, CbmTrdTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex, + ca::EDetectorID::kTrd); } } } @@ -288,157 +389,30 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const LOG(error) << "CbmKfTrackFitter: Tof hit array not found!"; return false; } - tofHits.reserve(nHits); for (int ih = 0; ih < nHits; ih++) { int hitIndex = track->GetHitIndex(ih); if (hitIndex >= fInputTofHits->GetEntriesFast()) { LOG(error) << "CbmKfTrackFitter: Tof hit index " << hitIndex << " is out of range!"; return false; } - tofHits.push_back(*dynamic_cast<const CbmTofHit*>(fInputTofHits->At(hitIndex))); + const auto& hit = *dynamic_cast<const CbmTofHit*>(fInputTofHits->At(hitIndex)); + setNode(hit, CbmTofTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex, + ca::EDetectorID::kTof); } } } - return CreateTrack(kfTrack, *globalTrack.GetParamFirst(), mvdHits, stsHits, muchHits, trdHits, tofHits); -} - - -bool CbmKfTrackFitter::CreateMvdStsTrack(CbmKfTrackFitter::Track& kfTrack, const CbmStsTrack& stsTrack) -{ - Init(); - if (!fIsInitialized) return false; - - std::vector<CbmMvdHit> mvdHits; - std::vector<CbmStsHit> stsHits; - std::vector<CbmMuchPixelHit> muchHits; - std::vector<CbmTrdHit> trdHits; - std::vector<CbmTofHit> tofHits; - - kfTrack = {}; - - // Read MVD hits - - int nMvdHits = stsTrack.GetNofMvdHits(); - if (nMvdHits > 0) { - if (!fInputMvdHits) { - LOG(error) << "CbmKfTrackFitter: Mvd hit array not found!"; - return false; - } - mvdHits.reserve(nMvdHits); - for (int ih = 0; ih < nMvdHits; ih++) { - int hitIndex = stsTrack.GetMvdHitIndex(ih); - mvdHits.push_back(*dynamic_cast<const CbmMvdHit*>(fInputMvdHits->At(hitIndex))); - } - } - - // Read STS hits - - int nStsHits = stsTrack.GetNofStsHits(); - if (nStsHits > 0) { - if (!fInputStsHits) { - LOG(error) << "CbmKfTrackFitter: Sts hit array not found!"; - return false; - } - stsHits.reserve(nStsHits); - for (int ih = 0; ih < nStsHits; ih++) { - int hitIndex = stsTrack.GetStsHitIndex(ih); - stsHits.push_back(*dynamic_cast<const CbmStsHit*>(fInputStsHits->At(hitIndex))); - } - } - - return CreateTrack(kfTrack, *stsTrack.GetParamFirst(), mvdHits, stsHits, muchHits, trdHits, tofHits); -} - - -bool CbmKfTrackFitter::CreateTrack(CbmKfTrackFitter::Track& kfTrack, const FairTrackParam& trackFirst, - const std::vector<CbmMvdHit>& mvdHits, const std::vector<CbmStsHit>& stsHits, - const std::vector<CbmMuchPixelHit>& muchHits, const std::vector<CbmTrdHit>& trdHits, - const std::vector<CbmTofHit>& tofHits - -) -{ - kfTrack = {}; - Init(); - if (!fIsInitialized) return false; - - const ca::Parameters& caPar = CbmL1::Instance()->fpAlgo->GetParameters(); - - int nStations = caPar.GetNstationsActive(); - - CbmKfTrackFitter::Track t; - - { - t.fNodes.resize(nStations); - for (int i = 0; i < nStations; i++) { - CbmKfTrackFitter::FitNode& n = t.fNodes[i]; - n = {}; - n.fMaterialLayer = i; - n.fZ = caPar.GetStation(i).GetZScal(); - n.fRadThick = 0.; - n.fIsRadThickSet = false; - n.fIsFitted = false; - n.fIsXySet = false; - n.fIsTimeSet = false; - } - t.fFirstHitNode = nStations - 1; - t.fLastHitNode = 0; - } - - // lambda to set the node from the pixel hit - auto setNode = [&](const CbmPixelHit& h, int stIdx, ca::EDetectorID detId) { - int ista = caPar.GetStationIndexActive(stIdx, detId); - if (ista < 0) return; - assert(ista < nStations); - CbmKfTrackFitter::FitNode& n = t.fNodes[ista]; - n.fZ = h.GetZ(); - n.fMxy.SetX(h.GetX()); - n.fMxy.SetY(h.GetY()); - n.fMxy.SetDx2(h.GetDx() * h.GetDx()); - n.fMxy.SetDy2(h.GetDy() * h.GetDy()); - n.fMxy.SetDxy(h.GetDxy()); - n.fMxy.SetNdfX(1); - n.fMxy.SetNdfY(1); - n.fIsXySet = true; - n.fMt.SetT(h.GetTime()); - n.fMt.SetDt2(h.GetTimeError() * h.GetTimeError()); - n.fMt.SetNdfT(1); - n.fIsTimeSet = (detId != ca::EDetectorID::kMvd); - n.fRadThick = 0.; - n.fIsRadThickSet = false; - n.fSystemId = cbm::L1Util::ConvertDetSystemId(detId); - n.fAddress = h.GetAddress(); - }; - - for (auto& h : mvdHits) { - setNode(h, CbmMvdTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kMvd); - } - - for (auto& h : stsHits) { - setNode(h, CbmStsTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kSts); - } - - for (auto& h : muchHits) { - setNode(h, CbmMuchTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kMuch); - } - - for (auto& h : trdHits) { - setNode(h, CbmTrdTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kTrd); - } - - for (auto& h : tofHits) { - setNode(h, CbmTofTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kTof); - } - t.MakeConsistent(); - ca::TrackParamD tmp = cbm::L1Util::ConvertTrackParam(trackFirst); + ca::TrackParamD tmp = cbm::L1Util::ConvertTrackParam(*globalTrack.GetParamFirst()); t.fNodes[t.fFirstHitNode].fTrack.Set(tmp); t.fNodes[t.fFirstHitNode].fIsFitted = 1; kfTrack = t; return true; + + // return CreateTrack(kfTrack, *globalTrack.GetParamFirst(), mvdHits, stsHits, muchHits, trdHits, tofHits); } @@ -492,6 +466,7 @@ void CbmKfTrackFitter::AddMaterialEffects(const CbmKfTrackFitter::Track& t, CbmK fFit.EnergyLossCorrection(n.fRadThick, upstreamDirection ? fvec::One() : fvec::Zero()); } + void CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t) { // fit the track diff --git a/reco/KF/CbmKfTrackFitter.h b/reco/KF/CbmKfTrackFitter.h index 7e17effd462847d723d99687632d7d097ae81ff7..f9ba682f713a29aca8a82adb71bd5b59a3cd2ee7 100644 --- a/reco/KF/CbmKfTrackFitter.h +++ b/reco/KF/CbmKfTrackFitter.h @@ -65,8 +65,9 @@ class CbmKfTrackFitter { ca::MeasurementTime<ca::fvec> fMt{}; ///< time measurement at fZ - ECbmModuleId fSystemId{ECbmModuleId::kNotExist}; ///< detector system ID of the hit - int fAddress{-1}; ///< detector ID of the hit + ECbmModuleId fHitSystemId{ECbmModuleId::kNotExist}; ///< detector system ID of the hit + int fHitAddress{-1}; ///< detector ID of the hit + int fHitIndex{-1}; ///< hit index in the detector hit array /// == Flags etc bool fIsXySet{false}; ///< true if the XY measurement is set @@ -109,11 +110,8 @@ class CbmKfTrackFitter { /// set electron flag (bremmstrallung will be applied) void SetElectronFlag(bool isElectron); - bool CreateTrack(Track& kfTrack, const FairTrackParam& trackFirst, const std::vector<CbmMvdHit>& mvdHits, - const std::vector<CbmStsHit>& stsHits, const std::vector<CbmMuchPixelHit>& muchHits, - const std::vector<CbmTrdHit>& trdHits, const std::vector<CbmTofHit>& tofHits); - - bool CreateMvdStsTrack(Track& kfTrack, const CbmStsTrack& stsTrack); + bool CreateMvdStsTrack(Track& kfTrack, int stsTrackIndex); + bool CreateGlobalTrack(Track& kfTrack, int globalTrackIndex); bool CreateGlobalTrack(Track& kfTrack, const CbmGlobalTrack& globalTrack); /// fit the track diff --git a/reco/L1/qa/CbmCaTrackFitQa.cxx b/reco/L1/qa/CbmCaTrackFitQa.cxx index f642be83d43949bbb5d22a2453e65b8c4f3fddda..e7b612b521b22aa6b384310d47844d1be6bdfe6d 100644 --- a/reco/L1/qa/CbmCaTrackFitQa.cxx +++ b/reco/L1/qa/CbmCaTrackFitQa.cxx @@ -224,8 +224,8 @@ void TrackFitQa::SetDefaultProperties() fvRLo[ETrackParType::kQP] = -.3; ///< Lower boundary, residual of q/p [ec/GeV] fvRUp[ETrackParType::kQP] = +.3; ///< Upper boundary, residual of q/p [ec/GeV] fvRBins[ETrackParType::kTIME] = 200; ///< Number of bins, residual of time - fvRLo[ETrackParType::kTIME] = -1.; ///< Lower boundary, residual of time [ns] - fvRUp[ETrackParType::kTIME] = +1.; ///< Upper boundary, residual of time [ns] + fvRLo[ETrackParType::kTIME] = -10.; ///< Lower boundary, residual of time [ns] + fvRUp[ETrackParType::kTIME] = +10.; ///< Upper boundary, residual of time [ns] fvRBins[ETrackParType::kVI] = 200; ///< Number of bins, residual of inverse speed fvRLo[ETrackParType::kVI] = -2.; ///< Lower boundary, residual of inverse speed [1/c] fvRUp[ETrackParType::kVI] = +2.; ///< Upper boundary, residual of inverse speed [1/c] diff --git a/reco/alignment/CbmBbaAlignmentTask.cxx b/reco/alignment/CbmBbaAlignmentTask.cxx index c7e143158b467746d97c005e3b6f044e26854b5c..3df2712526b61ac2ca3fcb37f7c83ff64a772957 100644 --- a/reco/alignment/CbmBbaAlignmentTask.cxx +++ b/reco/alignment/CbmBbaAlignmentTask.cxx @@ -60,7 +60,7 @@ void CbmBbaAlignmentTask::TrackContainer::MakeConsistent() fNtrdHits = 0; fNtofHits = 0; for (const auto& n : fUnalignedTrack.fNodes) { - switch (n.fSystemId) { + switch (n.fHitSystemId) { case ECbmModuleId::kMvd: fNmvdHits++; break; case ECbmModuleId::kSts: fNstsHits++; break; case ECbmModuleId::kMuch: fNmuchHits++; break; @@ -177,7 +177,7 @@ void CbmBbaAlignmentTask::Exec(Option_t* /*opt*/) const CbmStsTrack* stsTrack = dynamic_cast<CbmStsTrack*>(fInputStsTracks->At(iTr)); if (!stsTrack) continue; TrackContainer t; - if (!fFitter.CreateMvdStsTrack(t.fUnalignedTrack, *stsTrack)) continue; + if (!fFitter.CreateMvdStsTrack(t.fUnalignedTrack, iTr)) continue; t.MakeConsistent(); fFitter.FitTrack(t.fUnalignedTrack); t.fAlignedTrack = t.fUnalignedTrack;