diff --git a/offline/packages/trackbase/ActsSurfaceMaps.cc b/offline/packages/trackbase/ActsSurfaceMaps.cc index d92e387ca0..69cd94ece6 100644 --- a/offline/packages/trackbase/ActsSurfaceMaps.cc +++ b/offline/packages/trackbase/ActsSurfaceMaps.cc @@ -34,6 +34,11 @@ bool ActsSurfaceMaps::isTpcSurface(const Acts::Surface* surface) const return m_tpcVolumeIds.find(surface->geometryId().volume()) != m_tpcVolumeIds.end(); } +bool ActsSurfaceMaps::isSiSurface(const Acts::Surface* surface) const +{ + return m_siVolumeIds.find(surface->geometryId().volume()) != m_siVolumeIds.end(); +} + bool ActsSurfaceMaps::isMicromegasSurface(const Acts::Surface* surface) const { return m_micromegasVolumeIds.find(surface->geometryId().volume()) != m_micromegasVolumeIds.end(); diff --git a/offline/packages/trackbase/ActsSurfaceMaps.h b/offline/packages/trackbase/ActsSurfaceMaps.h index 94c327be79..e90263c49a 100644 --- a/offline/packages/trackbase/ActsSurfaceMaps.h +++ b/offline/packages/trackbase/ActsSurfaceMaps.h @@ -37,6 +37,9 @@ struct ActsSurfaceMaps //! true if given surface corresponds to TPC bool isTpcSurface(const Acts::Surface* surface) const; + //! true if given surface corresponds to the silicon + bool isSiSurface(const Acts::Surface* surface) const; + //! true if given surface corresponds to Micromegas bool isMicromegasSurface(const Acts::Surface* surface) const; @@ -65,6 +68,10 @@ struct ActsSurfaceMaps /** it is used to quickly tell if a given Acts Surface belongs to the TPC */ std::set m_tpcVolumeIds; + //! stores all acts volume ids relevant to the Silicon + /** it is used to quickly tell if a given Acts Surface belongs to the Silicon */ + std::set m_siVolumeIds; + //! stores all acts volume ids relevant to the micromegas /** it is used to quickly tell if a given Acts Surface belongs to micromegas */ std::set m_micromegasVolumeIds; diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index 07f3dbe71c..366510574c 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -283,6 +283,12 @@ int MakeActsGeometry::InitRun(PHCompositeNode *topNode) } } + // fill Si volume ids + for (const auto &[hitsetid, surface] : m_clusterSurfaceMapSilicon) + { + surfMaps.m_siVolumeIds.insert(surface->geometryId().volume()); + } + // fill Micromegas volume ids for (const auto &[hitsetid, surface] : m_clusterSurfaceMapMmEdit) { diff --git a/offline/packages/trackreco/PHActsTrkFitter.cc b/offline/packages/trackreco/PHActsTrkFitter.cc index d0006ac25c..72647a2295 100644 --- a/offline/packages/trackreco/PHActsTrkFitter.cc +++ b/offline/packages/trackreco/PHActsTrkFitter.cc @@ -526,11 +526,11 @@ void PHActsTrkFitter::loopTracks(Acts::Logging::Level logLevel) // position comes from the silicon seed, unless there is no silicon seed Acts::Vector3 position(0, 0, 0); - if (siseed) + if (siseed && !m_ignoreSilicon) { position = TrackSeedHelper::get_xyz(siseed) * Acts::UnitConstants::cm; } - if (!siseed || !is_valid(position) || m_ignoreSilicon) + if (!siseed || !is_valid(position) || m_forceTpcOnlyFit) { position = TrackSeedHelper::get_xyz(tpcseed) * Acts::UnitConstants::cm; } @@ -574,6 +574,13 @@ void PHActsTrkFitter::loopTracks(Acts::Logging::Level logLevel) continue; } } + //else if (m_forceTpcOnlyFit) + //{ + // if (surface_apr->geometryId().volume() < 14) + // { + // continue; + // } + //} bool pop_flag = false; if (surface_apr->geometryId().approach() == 1) { @@ -643,7 +650,7 @@ void PHActsTrkFitter::loopTracks(Acts::Logging::Level logLevel) float seedphi = 0; float seedtheta = 0; float seedeta = 0; - if (siseed) + if (siseed && !m_forceTpcOnlyFit) { seedphi = siseed->get_phi(); seedtheta = siseed->get_theta(); @@ -984,6 +991,9 @@ SourceLinkVec PHActsTrkFitter::filterSourceLinks(const SourceLinkVec& sourceLink if (m_forceSiOnlyFit && (m_tGeometry->maps().isMicromegasSurface(surf) || m_tGeometry->maps().isTpcSurface(surf)) ) { continue; } + if (m_forceTpcOnlyFit && (m_tGeometry->maps().isMicromegasSurface(surf) || m_tGeometry->maps().isSiSurface(surf)) ) + { continue; } + // update vectors filtered.push_back(sl); } @@ -1070,7 +1080,7 @@ void PHActsTrkFitter::updateSvtxTrack( track->identify(); } - if (!m_fitSiliconMMs && !m_forceSiOnlyFit) + if (!m_fitSiliconMMs && !m_forceSiOnlyFit && !m_forceTpcOnlyFit) { track->clear_states(); } @@ -1097,9 +1107,20 @@ void PHActsTrkFitter::updateSvtxTrack( track->set_y(params.position(m_transient_geocontext)(1) / Acts::UnitConstants::cm); track->set_z(params.position(m_transient_geocontext)(2) / Acts::UnitConstants::cm); - track->set_px(params.momentum()(0)); - track->set_py(params.momentum()(1)); - track->set_pz(params.momentum()(2)); + auto* seed = track->get_tpc_seed(); + + if(!m_forceSiOnlyFit) + { + track->set_px(params.momentum()(0)); + track->set_py(params.momentum()(1)); + track->set_pz(params.momentum()(2)); + } + else + { + track->set_px(seed->get_px()); + track->set_py(seed->get_py()); + track->set_pz(seed->get_pz()); + } track->set_charge(params.charge()); track->set_chisq(trajState.chi2Sum); @@ -1134,7 +1155,7 @@ void PHActsTrkFitter::updateSvtxTrack( // in using silicon mm fit also extrapolate track parameters to all TPC surfaces with clusters // get all tpc clusters - auto* seed = track->get_tpc_seed(); + if (m_fitSiliconMMs && seed) { // acts propagator diff --git a/offline/packages/trackreco/PHActsTrkFitter.h b/offline/packages/trackreco/PHActsTrkFitter.h index 056c3e88b3..8d0cf352a8 100644 --- a/offline/packages/trackreco/PHActsTrkFitter.h +++ b/offline/packages/trackreco/PHActsTrkFitter.h @@ -84,6 +84,11 @@ class PHActsTrkFitter : public SubsysReco m_forceSiOnlyFit = forceSiOnlyFit; } + void forceTpcOnlyFit(bool forceTpcOnlyFit) + { + m_forceTpcOnlyFit = forceTpcOnlyFit; + } + /// require micromegas in SiliconMM fits void setUseMicromegas(bool value) { @@ -217,6 +222,7 @@ class PHActsTrkFitter : public SubsysReco bool m_fitSiliconMMs = false; bool m_forceSiOnlyFit = false; + bool m_forceTpcOnlyFit = false; /// requires micromegas present when fitting silicon-MM surfaces bool m_useMicromegas = true;