From c258c798b1adc5a4c2f84bd5620f6ec7d0e77471 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 19 Jan 2026 13:51:11 -0500 Subject: [PATCH 01/38] update calibrator --- offline/packages/trackbase/Calibrator.cc | 61 ++++++++++-------------- offline/packages/trackbase/Calibrator.h | 10 +--- 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/offline/packages/trackbase/Calibrator.cc b/offline/packages/trackbase/Calibrator.cc index 44b66bce1a..ce9839e7f5 100644 --- a/offline/packages/trackbase/Calibrator.cc +++ b/offline/packages/trackbase/Calibrator.cc @@ -6,43 +6,34 @@ void Calibrator::calibrate(const Calibrator::MeasurementContainer& measurements, const Acts::SourceLink& sourceLink, Acts::VectorMultiTrajectory::TrackStateProxy& trackState) const { - trackState.setUncalibratedSourceLink(sourceLink); + trackState.setUncalibratedSourceLink(Acts::SourceLink{sourceLink}); const ActsSourceLink sl = sourceLink.get(); - const ActsSourceLink::Index index = sl.index(); - std::visit( - [&](const auto& uncalibmeas) + const ActsExamples::ConstVariableBoundMeasurementProxy measurement = + measurements.getMeasurement(sl.index()); + + Acts::visit_measurement(measurement.size(), [&](auto N) -> void + { + constexpr std::size_t kMeasurementSize = decltype(N)::value; + const ActsExamples::ConstFixedBoundMeasurementProxy fixedMeasurement = + static_cast>( + measurement); + const auto cov = fixedMeasurement.covariance(); + const TrkrDefs::cluskey cluskey = sl.cluskey(); + const uint8_t layer = TrkrDefs::getLayer(cluskey); + const double misalignmentFactor = gctx.get()->getMisalignmentFactor(layer); + + Acts::ActsSquareMatrix expandedCov = Acts::ActsSquareMatrix::Zero(); + + for (int i = 0; i < cov.rows(); i++) + { + for (int j = 0; j < cov.cols(); j++) { - std::array indices{}; - indices[0] = Acts::BoundIndices::eBoundLoc0; - indices[1] = Acts::BoundIndices::eBoundLoc1; - - Acts::ActsVector<2> loc; - loc(0) = uncalibmeas.parameters()[Acts::eBoundLoc0]; - loc(1) = uncalibmeas.parameters()[Acts::eBoundLoc1]; - - auto cov = uncalibmeas.covariance(); - const TrkrDefs::cluskey cluskey = sl.cluskey(); - const uint8_t layer = TrkrDefs::getLayer(cluskey); - const double misalignmentFactor = gctx.get()->getMisalignmentFactor(layer); - - Acts::ActsSquareMatrix<2> expandedCov = Acts::ActsSquareMatrix<2>::Zero(); - - for (int i = 0; i < cov.rows(); i++) - { - for (int j = 0; j < cov.cols(); j++) - { - expandedCov(i, j) = cov(i, j) * misalignmentFactor; - } - } - - Acts::Measurement meas(sourceLink, - indices, - loc, expandedCov); - - trackState.allocateCalibrated(meas.size()); - trackState.setCalibrated(meas); - }, - (measurements)[index]); + expandedCov(i, j) = cov(i, j) * misalignmentFactor; + } + } + trackState.allocateCalibrated(fixedMeasurement.parameters().eval(), + expandedCov.eval()); + trackState.setProjectorSubspaceIndices(fixedMeasurement.subspaceIndices()); }); } void CalibratorAdapter::calibrate( diff --git a/offline/packages/trackbase/Calibrator.h b/offline/packages/trackbase/Calibrator.h index 2f9d4f2fc0..651091ad5b 100644 --- a/offline/packages/trackbase/Calibrator.h +++ b/offline/packages/trackbase/Calibrator.h @@ -6,7 +6,7 @@ #include "TrkrDefs.h" #include "alignmentTransformationContainer.h" -#include +#include #include #include @@ -14,13 +14,7 @@ class Calibrator { public: - using Measurement = ::Acts::BoundVariantMeasurement; - /// Container of measurements. - /// - /// In contrast to the source links, the measurements themself must not be - /// orderable. The source links stored in the measurements are treated - /// as opaque here and no ordering is enforced on the stored measurements. - using MeasurementContainer = std::vector; + using MeasurementContainer = ActsExamples::MeasurementContainer; void calibrate(const MeasurementContainer& measurements, const Acts::GeometryContext& gctx, From 3b875db25f73c26fd9a473ea25bccc8383ae2ca4 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 19 Jan 2026 15:20:18 -0500 Subject: [PATCH 02/38] call wrapper tgeo builder --- offline/packages/trackbase/TGeoDetectorWithOptions.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.cc b/offline/packages/trackbase/TGeoDetectorWithOptions.cc index 4467c20754..cb29c27dc7 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.cc +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.cc @@ -108,7 +108,13 @@ auto TGeoDetectorWithOptions::finalize( readTGeoLayerBuilderConfigs(vm, config); } - return m_detector.finalize(config, std::move(mdecorator)); + auto logger = Acts::getDefaultLogger("TGeoDetector", Acts::Logging::INFO); + ContextDecorators tgeoContextDecorators = {}; + std::vector> detectorStore; + TrackingGeometryPtr tgeoTrackingGeometry = ActsExamples::buildTGeoDetectorWrapper( + config, Acts::GeometryContext(), detectorStore, std::move(mdecorator), *logger); + + return {std::move(tgeoTrackingGeometry), std::move(tgeoContextDecorators)}; } } // namespace ActsExamples From 9646765c059439aa04786e12592200b3653abce2 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 19 Jan 2026 15:20:43 -0500 Subject: [PATCH 03/38] preserve makefile while testing --- offline/packages/trackbase/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/offline/packages/trackbase/Makefile.am b/offline/packages/trackbase/Makefile.am index 29d090c40a..d19587bdd7 100644 --- a/offline/packages/trackbase/Makefile.am +++ b/offline/packages/trackbase/Makefile.am @@ -26,6 +26,7 @@ lib_LTLIBRARIES = \ libtrack.la AM_CPPFLAGS = \ + -I$(MYINSTALL)/include \ -I$(includedir) \ -isystem$(OFFLINE_MAIN)/include \ -isystem$(ROOTSYS)/include @@ -33,7 +34,7 @@ AM_CPPFLAGS = \ AM_LDFLAGS = \ -L$(libdir) \ -L$(OFFLINE_MAIN)/lib \ - -L$(OFFLINE_MAIN)/lib64 \ + -L$(MYINSTALL)/lib64 \ -L$(ROOTSYS)/lib From e219ff4ce68c639cdd5f98aaf4b7d639f70b1f49 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 19 Jan 2026 16:56:40 -0500 Subject: [PATCH 04/38] use helper functions --- .../trackbase/ResidualOutlierFinder.h | 48 +++++-------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/offline/packages/trackbase/ResidualOutlierFinder.h b/offline/packages/trackbase/ResidualOutlierFinder.h index 593f5df981..904aa474d0 100644 --- a/offline/packages/trackbase/ResidualOutlierFinder.h +++ b/offline/packages/trackbase/ResidualOutlierFinder.h @@ -6,10 +6,12 @@ #include #include #include -#include + +#include #include #include #include +#include #include struct ResidualOutlierFinder @@ -49,44 +51,14 @@ struct ResidualOutlierFinder auto sourceLink = state.getUncalibratedSourceLink().template get(); const auto& cluskey = sourceLink.cluskey(); - const auto predicted = state.predicted(); - const auto predictedCovariance = state.predictedCovariance(); - float chi2 = std::numeric_limits::max(); - - auto fullCalibrated = state - .template calibrated() - .data(); - auto fullCalibratedCovariance = state - .template calibratedCovariance() - .data(); - - chi2 = Acts::visit_measurement(state.calibratedSize(), [&](auto N) -> double - { - constexpr size_t kMeasurementSize = decltype(N)::value; - typename Acts::TrackStateTraits::Measurement calibrated{ - fullCalibrated}; - - typename Acts::TrackStateTraits::MeasurementCovariance - calibratedCovariance{fullCalibratedCovariance}; - - using ParametersVector = Acts::ActsVector; - const auto H = state.projector().template topLeftCorner().eval(); - ParametersVector res; - res = calibrated - H * predicted; - chi2 = (res.transpose() * ((calibratedCovariance + H * predictedCovariance * H.transpose())).inverse() * res).eval()(0, 0); - - return chi2; }); + double chi2 = Acts::calculatePredictedChi2(state); float distance = Acts::visit_measurement(state.calibratedSize(), [&](auto N) { constexpr size_t kMeasurementSize = decltype(N)::value; - auto residuals = - state.template calibrated() - - state.projector() - .template topLeftCorner() * - state.predicted(); - auto cdistance = residuals.norm(); - return cdistance; }); + auto [residual, residualCovariance] = + calculatePredictedResidual(state); + return residual.norm(); }); if (verbosity > 2) { @@ -108,6 +80,10 @@ struct ResidualOutlierFinder std::cout << PHWHERE << "no geometry set in residual outlier finder" << std::endl; exit(1); } + const auto predicted = state.predicted(); + auto fullCalibrated = state + .template calibrated() + .data(); Acts::FreeVector freeParams = Acts::transformBoundToFreeParameters(state.referenceSurface(), m_tGeometry->geometry().getGeoContext(), @@ -117,7 +93,7 @@ struct ResidualOutlierFinder m_tGeometry->geometry().getGeoContext(), local, Acts::Vector3(1, 1, 1)); float data[] = { - (float) sphenixlayer, (float) layer, (float) volume, distance, chi2, + (float) sphenixlayer, (float) layer, (float) volume, distance, (float)chi2, (float) freeParams[Acts::eFreePos0], (float) freeParams[Acts::eFreePos1], (float) freeParams[Acts::eFreePos2], (float) predicted[Acts::eBoundLoc0], (float) predicted[Acts::eBoundLoc1], (float) global[Acts::eFreePos0], (float) global[Acts::eFreePos1], (float) global[Acts::eFreePos2], From 1f11a69946026f7a53903e7382857b2ee6bee031 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 19 Jan 2026 16:57:07 -0500 Subject: [PATCH 05/38] abolished measurement object --- offline/packages/trackbase/ActsTrackFittingAlgorithm.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/offline/packages/trackbase/ActsTrackFittingAlgorithm.h b/offline/packages/trackbase/ActsTrackFittingAlgorithm.h index 425c669da2..c68698b9d7 100644 --- a/offline/packages/trackbase/ActsTrackFittingAlgorithm.h +++ b/offline/packages/trackbase/ActsTrackFittingAlgorithm.h @@ -11,7 +11,7 @@ #include #include #include - +#include #pragma GCC diagnostic push // needed for local Act compilation #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include @@ -32,8 +32,7 @@ class ActsTrackFittingAlgorithm final { public: using TrackParameters = ::Acts::BoundTrackParameters; - using Measurement = ::Acts::BoundVariantMeasurement; - using MeasurementContainer = std::vector; + using MeasurementContainer = ActsExamples::MeasurementContainer; using TrackContainer = Acts::TrackContainer Date: Mon, 19 Jan 2026 16:57:21 -0500 Subject: [PATCH 06/38] update gsf apis --- .../trackbase/ActsGsfTrackFittingAlgorithm.h | 26 ++++++++++--------- .../TrackFittingAlgorithmFunctionsGsf.cc | 6 +++-- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h b/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h index fd144c1163..7b418a0b62 100644 --- a/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h +++ b/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h @@ -62,7 +62,7 @@ namespace MixtureReductionAlgorithm::KLDistance; Acts::ComponentMergeMethod mergeMethod = Acts::ComponentMergeMethod::eMaxWeight; - + double reverseFilteringCovarianceScaling = 1.0; ActsSourceLink::SurfaceAccessor m_slSurfaceAccessor; GsfFitterFunctionImpl(Fitter&& f, @@ -83,17 +83,18 @@ namespace extensions.updater.connect<&Acts::GainMatrixUpdater::operator()>(&updater); Acts::GsfOptions gsfOptions{ - options.geoContext, - options.magFieldContext, - options.calibrationContext, - extensions, - options.propOptions, - &(*options.referenceSurface), - maxComponents, - weightCutoff, - abortOnError, - disableAllMaterialHandling}; + options.geoContext, options.magFieldContext, + options.calibrationContext}; + gsfOptions.extensions = extensions; + gsfOptions.propagatorPlainOptions = options.propOptions; + gsfOptions.referenceSurface = options.referenceSurface; + gsfOptions.maxComponents = maxComponents; + gsfOptions.weightCutoff = weightCutoff; + gsfOptions.abortOnError = abortOnError; + gsfOptions.disableAllMaterialHandling = disableAllMaterialHandling; gsfOptions.componentMergeMethod = mergeMethod; + gsfOptions.reverseFilteringCovarianceScaling = + reverseFilteringCovarianceScaling; gsfOptions.extensions.calibrator.connect<&calibrator_t::calibrate>( &calibrator); gsfOptions.extensions.surfaceAccessor.connect<&ActsSourceLink::SurfaceAccessor::operator()>(&m_slSurfaceAccessor); @@ -152,5 +153,6 @@ class ActsGsfTrackFittingAlgorithm BetheHeitlerApprox betheHeitlerApprox, std::size_t maxComponents, double weightCutoff, MixtureReductionAlgorithm finalReductionMethod, bool abortOnError, - bool disableAllMaterialHandling, const Acts::Logger& logger = *Acts::getDefaultLogger("GSF", Acts::Logging::FATAL)); + bool disableAllMaterialHandling, double reverseFilteringCovarianceScaling, + const Acts::Logger& logger = *Acts::getDefaultLogger("GSF", Acts::Logging::FATAL)); }; diff --git a/offline/packages/trackbase/TrackFittingAlgorithmFunctionsGsf.cc b/offline/packages/trackbase/TrackFittingAlgorithmFunctionsGsf.cc index cecd2898b9..16d5912532 100644 --- a/offline/packages/trackbase/TrackFittingAlgorithmFunctionsGsf.cc +++ b/offline/packages/trackbase/TrackFittingAlgorithmFunctionsGsf.cc @@ -9,7 +9,8 @@ ActsGsfTrackFittingAlgorithm::makeGsfFitterFunction( BetheHeitlerApprox betheHeitlerApprox, std::size_t maxComponents, double weightCutoff, MixtureReductionAlgorithm finalReductionMethod, bool abortOnError, - bool disableAllMaterialHandling, const Acts::Logger& logger) + bool disableAllMaterialHandling, double reverseFilteringCovarianceScaling, + const Acts::Logger& logger) { MultiStepper stepper(std::move(magneticField), logger.cloneWithSuffix("GSFStep")); @@ -35,6 +36,7 @@ ActsGsfTrackFittingAlgorithm::makeGsfFitterFunction( fitterFunction->abortOnError = abortOnError; fitterFunction->disableAllMaterialHandling = disableAllMaterialHandling; fitterFunction->reductionAlg = finalReductionMethod; - + fitterFunction->reverseFilteringCovarianceScaling = + reverseFilteringCovarianceScaling; return fitterFunction; } From bbdeda0523037c4e7dbbcae931ab002614eb612d Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 23 Feb 2026 15:19:22 -0500 Subject: [PATCH 07/38] trackbase compiles --- .../trackbase/AlignmentTransformation.cc | 2 +- .../trackbase/MagneticFieldOptions.cc | 200 ------------------ .../packages/trackbase/MagneticFieldOptions.h | 22 -- offline/packages/trackbase/Makefile.am | 7 +- .../trackbase/TGeoDetectorWithOptions.cc | 6 +- .../trackbase/sPHENIXActsDetectorElement.cc | 11 +- .../trackbase/sPHENIXActsDetectorElement.h | 15 +- 7 files changed, 15 insertions(+), 248 deletions(-) delete mode 100644 offline/packages/trackbase/MagneticFieldOptions.cc delete mode 100644 offline/packages/trackbase/MagneticFieldOptions.h diff --git a/offline/packages/trackbase/AlignmentTransformation.cc b/offline/packages/trackbase/AlignmentTransformation.cc index 2e8647ab01..aa67288bb6 100644 --- a/offline/packages/trackbase/AlignmentTransformation.cc +++ b/offline/packages/trackbase/AlignmentTransformation.cc @@ -372,7 +372,7 @@ Acts::Transform3 AlignmentTransformation::newMakeTransform(const Surface& surf, // get the acts transform components // Note that Acts transforms local coordinates of (x,z,y) to global (x,y,z) - Acts::Transform3 actsTransform = surf->transform(m_tGeometry->geometry().getGeoContext()); + auto actsTransform = surf->transform(m_tGeometry->geometry().getGeoContext()); Eigen::Matrix3d actsRotationPart = actsTransform.rotation(); Eigen::Vector3d actsTranslationPart = actsTransform.translation(); diff --git a/offline/packages/trackbase/MagneticFieldOptions.cc b/offline/packages/trackbase/MagneticFieldOptions.cc deleted file mode 100644 index 4043397f76..0000000000 --- a/offline/packages/trackbase/MagneticFieldOptions.cc +++ /dev/null @@ -1,200 +0,0 @@ - - -#include "MagneticFieldOptions.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -void ActsExamples::Options::addMagneticFieldOptions(Description& desc) { - using boost::program_options::bool_switch; - using boost::program_options::value; - - // avoid adding the options twice - if (desc.find_nothrow("bf-constant-tesla", true) != nullptr) { - return; - } - - auto opt = desc.add_options(); - opt("bf-constant-tesla", value>(), - "Set a constant magnetic field vector in Tesla. If given, this takes " - "preference over all other options."); - opt("bf-scalable", bool_switch(), - "If given, the constant field strength will be scaled differently in " - "every event. This is for testing only."); - opt("bf-scalable-scalor", value()->default_value(1.25), - "Scaling factor for the event-dependent field strength scaling. A unit " - "value means that the field strength stays the same for every event."); - opt("bf-map-file", value(), - "Read a magnetic field map from the given file. ROOT and text file " - "formats are supported. Only used if no constant field is given."); - opt("bf-map-tree", value()->default_value("bField"), - "Name of the TTree in the ROOT file. Only used if the field map is read " - "from a ROOT file."); - opt("bf-map-type", value()->default_value("xyz"), - "Either 'xyz' or 'rz' to define the type of the field map."); - opt("bf-map-octantonly", bool_switch(), - "If given, the field map is assumed to describe only the first " - "octant/quadrant and the field is symmetrically extended to the full " - "space."); - opt("bf-map-lengthscale-mm", value()->default_value(1.), - "Optional length scale modifier for the field map grid. This options " - "only needs to be set if the length unit in the field map file is not " - "`mm`. The value must scale from the stored unit to the equivalent value " - "in `mm`."); - opt("bf-map-fieldscale-tesla", value()->default_value(1.), - "Optional field value scale modifier for the field map value. This " - "option only needs to be set if the field value unit in the field map " - "file is not `Tesla`. The value must scale from the stored unit to the " - "equivalent value in `Tesla`."); - opt("bf-solenoid-mag-tesla", value()->default_value(0.), - "The magnitude of a solenoid magnetic field in the center in `Tesla`. " - "Only used " - "if neither constant field nor a magnetic field map is given."); - opt("bf-solenoid-length", value()->default_value(6000), - "The length of the solenoid magnetic field in `mm`."); - opt("bf-solenoid-radius", value()->default_value(1200), - "The radius of the solenoid magnetic field in `mm`."); - opt("bf-solenoid-ncoils", value()->default_value(1194), - "Number of coils for the solenoid magnetic field."); - opt("bf-solenoid-map-rlim", - value()->value_name("MIN:MAX")->default_value({0, 1200}), - "The length bounds of the grid created from the analytical solenoid " - "field in `mm`."); - opt("bf-solenoid-map-zlim", - value()->value_name("MIN:MAX")->default_value({-3000, 3000}), - "The radius bounds of the grid created from the analytical solenoid " - "field in `mm`."); - opt("bf-solenoid-map-nbins", value>()->default_value({{150, 200}}), - "The number of bins in r-z directions for the grid created from the " - "analytical solenoid field."); -} - - -std::shared_ptr -ActsExamples::Options::readMagneticField(const Variables& vars) { - using namespace ActsExamples::detail; - using std::filesystem::path; - - // first option: create a constant field - if (vars.count("bf-constant-tesla") != 0u) { - const auto values = vars["bf-constant-tesla"].as>(); - Acts::Vector3 field(values[0] * Acts::UnitConstants::T, - values[1] * Acts::UnitConstants::T, - values[2] * Acts::UnitConstants::T); - if (vars["bf-scalable"].as()) { - return std::make_shared(field); - } else { - return std::make_shared(field); - } - } - - // second option: read a field map from a file - if (vars.count("bf-map-file") != 0u) { - const path file = vars["bf-map-file"].as(); - const auto tree = vars["bf-map-tree"].as(); - const auto type = vars["bf-map-type"].as(); - const auto useOctantOnly = vars["bf-map-octantonly"].as(); - const auto lengthUnit = - vars["bf-map-lengthscale-mm"].as() * Acts::UnitConstants::mm; - const auto fieldUnit = - vars["bf-map-fieldscale-tesla"].as() * Acts::UnitConstants::T; - - bool readRoot = false; - if (file.extension() == ".root") { - readRoot = true; - } else if (file.extension() == ".txt") { - readRoot = false; - } else { - throw std::runtime_error("Unsupported magnetic field map file type"); - } - - if (type == "xyz") { - auto mapBins = [](const std::array& bins, - const std::array& sizes) { - return (bins[0] * (sizes[1] * sizes[2]) + bins[1] * sizes[2] + bins[2]); - }; - - if (readRoot) { - auto map = makeMagneticFieldMapXyzFromRoot( - std::move(mapBins), file.native(), tree, lengthUnit, fieldUnit, - useOctantOnly); - return std::make_shared(std::move(map)); - - } else { - auto map = makeMagneticFieldMapXyzFromText(std::move(mapBins), - file.native(), lengthUnit, - fieldUnit, useOctantOnly); - return std::make_shared(std::move(map)); - } - - } else if (type == "rz") { - auto mapBins = [](std::array bins, - std::array sizes) { - return (bins[1] * sizes[0] + bins[0]); - }; - - if (readRoot) { - auto map = makeMagneticFieldMapRzFromRoot( - std::move(mapBins), file.native(), tree, lengthUnit, fieldUnit, - useOctantOnly); - return std::make_shared(std::move(map)); - - } else { - auto map = makeMagneticFieldMapRzFromText(std::move(mapBins), - file.native(), lengthUnit, - fieldUnit, useOctantOnly); - return std::make_shared(std::move(map)); - } - - } else { - throw std::runtime_error("Unknown magnetic field map type"); - } - } - - // third option: create a solenoid field - if (vars["bf-solenoid-mag-tesla"].as() > 0) { - // Construct a solenoid field - Acts::SolenoidBField::Config solenoidConfig{}; - solenoidConfig.length = - vars["bf-solenoid-length"].as() * Acts::UnitConstants::mm; - solenoidConfig.radius = - vars["bf-solenoid-radius"].as() * Acts::UnitConstants::mm; - solenoidConfig.nCoils = vars["bf-solenoid-ncoils"].as(); - solenoidConfig.bMagCenter = - vars["bf-solenoid-mag-tesla"].as() * Acts::UnitConstants::T; - - const auto solenoidField = Acts::SolenoidBField(solenoidConfig); - // The parameters for creating a field map - auto getRange = [&](const char* name, auto unit, auto& lower, auto& upper) { - auto interval = vars[name].as(); - lower = interval.lower.value() * unit; - upper = interval.upper.value() * unit; - }; - std::pair rlim, zlim; - getRange("bf-solenoid-map-rlim", Acts::UnitConstants::mm, rlim.first, - rlim.second); - getRange("bf-solenoid-map-zlim", Acts::UnitConstants::mm, zlim.first, - zlim.second); - const auto nbins = vars["bf-solenoid-map-nbins"].as>(); - auto map = - Acts::solenoidFieldMap(rlim, zlim, {nbins[0], nbins[1]}, solenoidField); - return std::make_shared(std::move(map)); - } - - // default option: no field - return std::make_shared(); -} diff --git a/offline/packages/trackbase/MagneticFieldOptions.h b/offline/packages/trackbase/MagneticFieldOptions.h deleted file mode 100644 index 7604c026c4..0000000000 --- a/offline/packages/trackbase/MagneticFieldOptions.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _MAGNETICFIELDOPTIONS_H -#define _MAGNETICFIELDOPTIONS_H - -#include -#include -#include - -namespace ActsExamples { - -namespace Options { - -/// Add magnetic field options with a `bf-` prefix. -void addMagneticFieldOptions(Description& desc); - -/// Read and create the magnetic field from the given user variables. -std::shared_ptr readMagneticField( - const Variables& vars); - -} // namespace Options -} // namespace ActsExamples - -#endif // _MAGNETICFIELDOPTIONS_H \ No newline at end of file diff --git a/offline/packages/trackbase/Makefile.am b/offline/packages/trackbase/Makefile.am index d19587bdd7..1a53d8cfa4 100644 --- a/offline/packages/trackbase/Makefile.am +++ b/offline/packages/trackbase/Makefile.am @@ -32,9 +32,9 @@ AM_CPPFLAGS = \ -isystem$(ROOTSYS)/include AM_LDFLAGS = \ + -L$(MYINSTALL)/lib64 \ -L$(libdir) \ -L$(OFFLINE_MAIN)/lib \ - -L$(MYINSTALL)/lib64 \ -L$(ROOTSYS)/lib @@ -72,7 +72,6 @@ pkginclude_HEADERS = \ LaserClusterContainerv1.h \ LaserClusterv1.h \ LaserClusterv2.h \ - MagneticFieldOptions.h \ MaterialWiper.h \ MvtxDefs.h \ MvtxEventInfo.h \ @@ -217,7 +216,6 @@ libtrack_la_SOURCES = \ Calibrator.cc \ ClusterErrorPara.cc \ CommonOptions.cc \ - MagneticFieldOptions.cc \ sPHENIXActsDetectorElement.cc \ TGeoDetectorWithOptions.cc \ TrackFittingAlgorithmFunctionsGsf.cc \ @@ -293,8 +291,7 @@ libtrack_io_la_SOURCES = \ libtrack_la_LIBADD = \ libtrack_io.la \ -lActsCore \ - -lActsExamplesMagneticField \ - -lActsPluginTGeo \ + -lActsPluginRoot \ -lActsExamplesDetectorTGeo \ -lffamodules \ -lboost_program_options diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.cc b/offline/packages/trackbase/TGeoDetectorWithOptions.cc index cb29c27dc7..fdb81ac03d 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.cc +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.cc @@ -10,9 +10,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/offline/packages/trackbase/sPHENIXActsDetectorElement.cc b/offline/packages/trackbase/sPHENIXActsDetectorElement.cc index 3daec79ca2..2604ecaf71 100644 --- a/offline/packages/trackbase/sPHENIXActsDetectorElement.cc +++ b/offline/packages/trackbase/sPHENIXActsDetectorElement.cc @@ -23,16 +23,7 @@ const Acts::Transform3& sPHENIXActsDetectorElement::transform(const Acts::Geomet auto& layerVec = transformVec[sphlayer]; // get the vector of transforms for this layer if (layerVec.size() > sensor) - { - /* - if(sphlayer > 7) - { - std::cout << "sPHENIXActsDetectorElement: volume " << volume <<" Acts layer " << layer << " sensor " << sensor - << " sphenix layer " << sphlayer << std::endl; - std::cout << layerVec[sensor].matrix() << std::endl; - } - */ - + { return layerVec[sensor]; } diff --git a/offline/packages/trackbase/sPHENIXActsDetectorElement.h b/offline/packages/trackbase/sPHENIXActsDetectorElement.h index 7abf4a511f..87a172458b 100644 --- a/offline/packages/trackbase/sPHENIXActsDetectorElement.h +++ b/offline/packages/trackbase/sPHENIXActsDetectorElement.h @@ -2,8 +2,8 @@ #define TRACKBASE_SPHENIXACTSDETECTORELEMENT_H #include -#include -#include +#include +#include /** * This class implements an sphenix detector element to build @@ -13,9 +13,10 @@ class ActsGeometry; -class sPHENIXActsDetectorElement : public Acts::TGeoDetectorElement +class sPHENIXActsDetectorElement : public ActsPlugins::TGeoDetectorElement { public: + using Identifier = ActsPlugins::TGeoDetectorElement::Identifier; sPHENIXActsDetectorElement() = delete; sPHENIXActsDetectorElement(const Identifier& identifier, @@ -24,7 +25,7 @@ class sPHENIXActsDetectorElement : public Acts::TGeoDetectorElement const std::string& axes = "XYZ", double scalor = 10., std::shared_ptr material = nullptr) - : Acts::TGeoDetectorElement(identifier, tGeoNode, tGeoMatrix, + : ActsPlugins::TGeoDetectorElement(identifier, tGeoNode, tGeoMatrix, axes, scalor, material) { } @@ -34,7 +35,7 @@ class sPHENIXActsDetectorElement : public Acts::TGeoDetectorElement Acts::Transform3& tgTransform, std::shared_ptr tgBounds, double tgThickness = 0.) - : Acts::TGeoDetectorElement(identifier, tGeoNode, tgTransform, + : ActsPlugins::TGeoDetectorElement(identifier, tGeoNode, tgTransform, tgBounds, tgThickness) { } @@ -44,7 +45,7 @@ class sPHENIXActsDetectorElement : public Acts::TGeoDetectorElement Acts::Transform3& tgTransform, std::shared_ptr tgBounds, double tgThickness = 0.) - : Acts::TGeoDetectorElement(identifier, tGeoNode, tgTransform, tgBounds, + : ActsPlugins::TGeoDetectorElement(identifier, tGeoNode, tgTransform, tgBounds, tgThickness) { } @@ -58,7 +59,7 @@ class sPHENIXActsDetectorElement : public Acts::TGeoDetectorElement }; std::shared_ptr sPHENIXElementFactory( - const Identifier& identifier, const TGeoNode& tGeoNode, + const sPHENIXActsDetectorElement::Identifier& identifier, const TGeoNode& tGeoNode, const TGeoMatrix& tGeoMatrix, const std::string& axes, double scalor, std::shared_ptr material) { From 0c9988a632bb6ed1fe26b41f0f414ec22ed86543 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Tue, 24 Feb 2026 13:34:58 -0500 Subject: [PATCH 08/38] update alignment states --- offline/packages/trackreco/ActsAlignmentStates.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/offline/packages/trackreco/ActsAlignmentStates.cc b/offline/packages/trackreco/ActsAlignmentStates.cc index d99fc1c178..f9c8570274 100644 --- a/offline/packages/trackreco/ActsAlignmentStates.cc +++ b/offline/packages/trackreco/ActsAlignmentStates.cc @@ -127,10 +127,9 @@ void ActsAlignmentStates::fillAlignmentStateMap( auto ckey = sl.cluskey(); Acts::Vector2 localMeas = Acts::Vector2::Zero(); /// get the local measurement that acts used - std::visit([&](const auto& meas) { - localMeas(0) = meas.parameters()[0]; - localMeas(1) = meas.parameters()[1]; - }, measurements[sl.index()]); + const auto measurement = measurements.getMeasurement(sl.index()); + localMeas(0) = measurement.parameters()[0]; + localMeas(1) = measurement.parameters()[1]; if (m_verbosity > 2) { @@ -142,7 +141,9 @@ void ActsAlignmentStates::fillAlignmentStateMap( auto clus = m_clusterMap->findCluster(ckey); // local state vector - const Acts::Vector2 localState = state.effectiveProjector() * state.smoothed(); + const auto H = state.projectorSubspaceHelper().fullProjector().topLeftCorner( + state.calibratedSize(), Acts::eBoundSize); + const Acts::Vector2 localState = H * state.smoothed(); // Local residual between measurement and smoothed Acts state const Acts::Vector2 localResidual = localMeas - localState; @@ -205,8 +206,8 @@ void ActsAlignmentStates::fillAlignmentStateMap( //! this is the derivative of the state wrt to Acts track parameters //! e.g. (d_0, z_0, phi, theta, q/p, t) - auto localDeriv = state.effectiveProjector() * state.jacobian(); - if(m_verbosity > 2) + auto localDeriv = H * state.jacobian(); + if (m_verbosity > 2) { std::cout << "local deriv " << std::endl << localDeriv << std::endl; } From b7c498958d2ecc37cb447a7f1ae6dd2db64c1086 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 25 Feb 2026 15:00:39 -0500 Subject: [PATCH 09/38] fix acts propagator --- offline/packages/trackreco/ActsPropagator.cc | 49 ++++++++++---------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/offline/packages/trackreco/ActsPropagator.cc b/offline/packages/trackreco/ActsPropagator.cc index 2578f05e61..fa3e2d1152 100644 --- a/offline/packages/trackreco/ActsPropagator.cc +++ b/offline/packages/trackreco/ActsPropagator.cc @@ -48,12 +48,12 @@ ActsPropagator::makeTrackParams(SvtxTrackState* state, Acts::BoundSquareMatrix cov = transformer.rotateSvtxTrackCovToActs(state); return ActsTrackFittingAlgorithm::TrackParameters::create( - surf, // NOLINT (performance-unnecessary-value-param) - m_geometry->geometry().getGeoContext(), - actsFourPos, momentum, - trackCharge / momentum.norm(), - cov, - Acts::ParticleHypothesis::pion()); + m_geometry->geometry().getGeoContext(), + surf, // NOLINT (performance-unnecessary-value-param) + actsFourPos, momentum, + trackCharge / momentum.norm(), + cov, + Acts::ParticleHypothesis::pion()); } ActsPropagator::BoundTrackParamResult ActsPropagator::makeTrackParams(SvtxTrack* track, @@ -85,13 +85,13 @@ ActsPropagator::makeTrackParams(SvtxTrack* track, Acts::BoundSquareMatrix cov = transformer.rotateSvtxTrackCovToActs(track); - return ActsTrackFittingAlgorithm::TrackParameters::create(perigee, - m_geometry->geometry().getGeoContext(), - actsFourPos, momentum, - track->get_charge() / track->get_p(), - cov, - Acts::ParticleHypothesis::pion(), - 1*Acts::UnitConstants::cm); + return ActsTrackFittingAlgorithm::TrackParameters::create( + m_geometry->geometry().getGeoContext(), perigee, + actsFourPos, momentum, + track->get_charge() / track->get_p(), + cov, + Acts::ParticleHypothesis::pion(), + 1 * Acts::UnitConstants::cm); } ActsPropagator::BTPPairResult @@ -112,15 +112,16 @@ ActsPropagator::propagateTrack(const Acts::BoundTrackParameters& params, auto propagator = makePropagator(); - using Actors = Acts::ActionList<>; - using Aborters = Acts::AbortList; - - Acts::PropagatorOptions options( + using Actors = Acts::ActorList<>; + using PropagatorOptions = SphenixPropagator::Options; + PropagatorOptions options( m_geometry->geometry().getGeoContext(), m_geometry->geometry().magFieldContext); + ActsAborter aborter; + aborter.abortlayer = actslayer; + aborter.abortvolume = actsvolume; + options.actorList.append(aborter); - options.abortList.get().abortlayer = actslayer; - options.abortList.get().abortvolume = actsvolume; auto result = propagator.propagate(params, options); @@ -147,7 +148,7 @@ ActsPropagator::propagateTrack(const Acts::BoundTrackParameters& params, auto propagator = makePropagator(); - Acts::PropagatorOptions<> options(m_geometry->geometry().getGeoContext(), + SphenixPropagator::Options> options(m_geometry->geometry().getGeoContext(), m_geometry->geometry().magFieldContext); auto result = propagator.propagate(params, *surface, @@ -175,9 +176,9 @@ ActsPropagator::propagateTrackFast(const Acts::BoundTrackParameters& params, } auto propagator = makeFastPropagator(); - - Acts::PropagatorOptions<> options(m_geometry->geometry().getGeoContext(), - m_geometry->geometry().magFieldContext); + using Propagator = Acts::Propagator; + Propagator::Options> options(m_geometry->geometry().getGeoContext(), + m_geometry->geometry().magFieldContext); auto result = propagator.propagate(params, *surface, options); @@ -232,7 +233,7 @@ ActsPropagator::SphenixPropagator ActsPropagator::makePropagator() } auto trackingGeometry = m_geometry->geometry().tGeometry; - Stepper stepper(field, m_overstepLimit); + Stepper stepper(field); Acts::Navigator::Config cfg{trackingGeometry}; cfg.resolvePassive = false; cfg.resolveMaterial = true; From 67f930de9f27637747f9dff340d579924d82b150 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Thu, 26 Feb 2026 09:49:09 -0500 Subject: [PATCH 10/38] fix geometry building API --- .../trackbase/TGeoDetectorWithOptions.h | 3 + .../packages/trackreco/MakeActsGeometry.cc | 85 +++++++------------ offline/packages/trackreco/MakeActsGeometry.h | 9 +- 3 files changed, 38 insertions(+), 59 deletions(-) diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.h b/offline/packages/trackbase/TGeoDetectorWithOptions.h index cc8467c92d..bb8fcf9578 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.h +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.h @@ -10,6 +10,7 @@ namespace ActsExamples { class TGeoDetectorWithOptions : public IBaseDetector { public: + TGeoDetectorWithOptions(TGeoDetector::Config config) : m_detector(config) {} TGeoDetector m_detector; void addOptions( @@ -18,6 +19,8 @@ class TGeoDetectorWithOptions : public IBaseDetector { auto finalize(const boost::program_options::variables_map& vm, std::shared_ptr mdecorator) -> std::pair override; + + }; } // namespace ActsExamples diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index 07f3dbe71c..a5f196889f 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -664,7 +664,7 @@ void MakeActsGeometry::buildActsSurfaces() // acts/Examples/Run/Common/src/GeometryExampleBase::ProcessGeometry() in MakeActsGeometry() // so we get access to the results. The layer builder magically gets the TGeoManager - makeGeometry(argstr.size(), argv, m_detector); + makeGeometry(argstr.size(), argv, responseFile, materialFile); for (size_t i = 0; i < argstr.size(); ++i) { @@ -707,24 +707,46 @@ void MakeActsGeometry::setMaterialResponseFile(std::string &responseFile, return; } -void MakeActsGeometry::makeGeometry(int argc, char *argv[], - ActsExamples::TGeoDetectorWithOptions &detector) +void MakeActsGeometry::makeGeometry(int argc, char *argv[], const std::string& responseFile, const std::string& materialFile) { + // setup and parse options boost::program_options::options_description desc; ActsExamples::Options::addGeometryOptions(desc); ActsExamples::Options::addMaterialOptions(desc); ActsExamples::Options::addMagneticFieldOptions(desc); + ActsExamples::TGeoDetector::Config config; + config.surfaceLogLevel = Acts::Logging::FATAL; + config.layerLogLevel = Acts::Logging::FATAL; + config.volumeLogLevel = Acts::Logging::FATAL; + config.detectorElementFactory = sPHENIXElementFactory; + config.readJson(responseFile); + + std::shared_ptr matDeco = nullptr; + if (materialFile.find(".json") != std::string::npos || + materialFile.find(".cbor") != std::string::npos) + { + // Set up the converter first + Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig; + // Set up the json-based decorator + matDeco = std::make_shared( + jsonGeoConvConfig, materialFile, Acts::Logging::FATAL); + } + else + { + matDeco = std::make_shared(); + } + config.materialDecorator = matDeco; + // this does the building now. The TGeoDetector owns the + // tracking geometry + ActsExamples::TGeoDetectorWithOptions detector(config); + // Add specific options for this geometry detector.addOptions(desc); auto vm = ActsExamples::Options::parse(desc, argc, argv); - // The geometry, material and decoration - auto geometry = build(vm, detector); - // Geometry is a pair of (tgeoTrackingGeometry, tgeoContextDecorators) - - m_tGeometry = geometry.first; + m_tGeometry = detector.m_detector.trackingGeometry(); if (m_useField) { m_magneticField = ActsExamples::Options::readMagneticField(vm); @@ -741,49 +763,6 @@ void MakeActsGeometry::makeGeometry(int argc, char *argv[], return; } -std::pair, - std::vector>> -MakeActsGeometry::build(const boost::program_options::variables_map &vm, - ActsExamples::TGeoDetectorWithOptions &detector) -{ - // Material decoration - std::shared_ptr matDeco = nullptr; - - // Retrieve the filename - auto fileName = vm["mat-input-file"].template as(); - // json or root based decorator - if (fileName.find(".json") != std::string::npos || - fileName.find(".cbor") != std::string::npos) - { - // Set up the converter first - Acts::MaterialMapJsonConverter::Config jsonGeoConvConfig; - // Set up the json-based decorator - matDeco = std::make_shared( - jsonGeoConvConfig, fileName, Acts::Logging::FATAL); - } - else - { - matDeco = std::make_shared(); - } - - ActsExamples::TGeoDetector::Config config; - - config.elementFactory = sPHENIXElementFactory; - - config.fileName = vm["geo-tgeo-filename"].as(); - - config.surfaceLogLevel = Acts::Logging::FATAL; - config.layerLogLevel = Acts::Logging::FATAL; - config.volumeLogLevel = Acts::Logging::FATAL; - - const auto path = vm["geo-tgeo-jsonconfig"].template as(); - - readTGeoLayerBuilderConfigsFile(path, config); - - // Return the geometry and context decorators - return detector.m_detector.finalize(config, matDeco); -} - void MakeActsGeometry::readTGeoLayerBuilderConfigsFile(const std::string &path, ActsExamples::TGeoDetector::Config &config) { @@ -1082,7 +1061,7 @@ void MakeActsGeometry::makeInttMapPairs(TrackingVolumePtr &inttVolume) TrkrDefs::hitsetkey hitsetkey = getInttHitSetKeyFromCoords(layer, world_center); // Add this surface to the map - std::pair tmp = make_pair(hitsetkey, surf); + std::pair tmp = std::make_pair(hitsetkey, surf); m_clusterSurfaceMapSilicon.insert(tmp); if (Verbosity() > 10) @@ -1219,7 +1198,7 @@ void MakeActsGeometry::makeMvtxMapPairs(TrackingVolumePtr &mvtxVolume) } // Add this surface to the map - std::pair tmp = make_pair(hitsetkey, surf); + std::pair tmp = std::make_pair(hitsetkey, surf); m_clusterSurfaceMapSilicon.insert(tmp); if (Verbosity() > 10) diff --git a/offline/packages/trackreco/MakeActsGeometry.h b/offline/packages/trackreco/MakeActsGeometry.h index f437236131..613a045dda 100644 --- a/offline/packages/trackreco/MakeActsGeometry.h +++ b/offline/packages/trackreco/MakeActsGeometry.h @@ -174,13 +174,13 @@ class MakeActsGeometry : public SubsysReco void buildActsSurfaces(); /// Function that mimics ActsExamples::GeometryExampleBase - void makeGeometry(int argc, char *argv[], - ActsExamples::TGeoDetectorWithOptions &detector); + void makeGeometry(int argc, char *argv[], const std::string& responseFile, const std::string& materialFile); #ifndef __CLING__ std::pair, std::vector>> build(const boost::program_options::variables_map &vm, - ActsExamples::TGeoDetectorWithOptions &detector); + ActsExamples::TGeoDetector::Config config, + ActsExamples::TGeoDetectorWithOptions &detector); #endif void readTGeoLayerBuilderConfigsFile(const std::string &path, ActsExamples::TGeoDetector::Config &config); @@ -273,9 +273,6 @@ class MakeActsGeometry : public SubsysReco /// z does not need spacing as the boxes are rotated around the z axis const double half_width_clearance_z = 0.5; - /// The acts geometry object - ActsExamples::TGeoDetectorWithOptions m_detector; - /// Acts geometry objects that are needed to create (for example) the fitter TrackingGeometry m_tGeometry; std::shared_ptr m_magneticField; From e6240d3cd9dbaa5070d24ffc7d5c2b26dcaa2995 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Thu, 26 Feb 2026 09:49:28 -0500 Subject: [PATCH 11/38] fix acts evaluator --- offline/packages/trackreco/ActsEvaluator.cc | 12 ++++++------ offline/packages/trackreco/ActsEvaluator.h | 5 ++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/offline/packages/trackreco/ActsEvaluator.cc b/offline/packages/trackreco/ActsEvaluator.cc index 9ecdbf2b7a..4a705f99fd 100644 --- a/offline/packages/trackreco/ActsEvaluator.cc +++ b/offline/packages/trackreco/ActsEvaluator.cc @@ -238,7 +238,7 @@ void ActsEvaluator::End() m_trackFile->Close(); } -void ActsEvaluator::visitTrackStates(const Acts::ConstVectorMultiTrajectory& traj, +void ActsEvaluator::visitTrackStates(const Acts::VectorMultiTrajectory& traj, const size_t& trackTip, const ActsTrackFittingAlgorithm::MeasurementContainer& measurements) { @@ -276,10 +276,9 @@ void ActsEvaluator::visitTrackStates(const Acts::ConstVectorMultiTrajectory& tra Acts::Vector2 local = Acts::Vector2::Zero(); /// get the local measurement that acts used - std::visit([&](const auto& meas) { - local(0) = meas.parameters()[0]; - local(1) = meas.parameters()[1]; - }, measurements[sourceLink.index()]); + const auto measurement = measurements.getMeasurement(sourceLink.index()); + local(0) = measurement.parameters()[0]; + local(1) = measurement.parameters()[1]; /// Get global position /// This is an arbitrary vector. Doesn't matter in coordinate transformation @@ -396,7 +395,8 @@ void ActsEvaluator::visitTrackStates(const Acts::ConstVectorMultiTrajectory& tra auto covariance = state.predictedCovariance(); /// Local hit residual info - auto H = state.effectiveProjector(); + const auto H = state.projectorSubspaceHelper().fullProjector().topLeftCorner( + state.calibratedSize(), Acts::eBoundSize); auto resCov = cov + H * covariance * H.transpose(); auto residual = state.effectiveCalibrated() - H * parameters; m_res_x_hit.push_back(residual(Acts::eBoundLoc0)); diff --git a/offline/packages/trackreco/ActsEvaluator.h b/offline/packages/trackreco/ActsEvaluator.h index fda1e1ebb8..4af937d018 100644 --- a/offline/packages/trackreco/ActsEvaluator.h +++ b/offline/packages/trackreco/ActsEvaluator.h @@ -9,7 +9,7 @@ #include #include - +#include #include class TTree; @@ -31,7 +31,6 @@ class TrackSeedContainer; using SourceLink = ActsSourceLink; using Trajectory = ActsExamples::Trajectories; -using Measurement = Acts::Measurement; using Acts::VectorHelpers::eta; using Acts::VectorHelpers::perp; using Acts::VectorHelpers::phi; @@ -83,7 +82,7 @@ class ActsEvaluator void fillFittedTrackParams(const Trajectory::IndexedParameters& paramsMap, const size_t& trackTip); - void visitTrackStates(const Acts::ConstVectorMultiTrajectory& traj, + void visitTrackStates(const Acts::VectorMultiTrajectory& traj, const size_t& trackTip, const ActsTrackFittingAlgorithm::MeasurementContainer& measurements); From 9ea65df7b45f76d4bc53937ce7b2f7778a3afe2a Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Thu, 26 Feb 2026 09:56:04 -0500 Subject: [PATCH 12/38] geometry builder compiles --- offline/packages/trackreco/MakeActsGeometry.cc | 1 + offline/packages/trackreco/MakeActsGeometry.h | 1 + 2 files changed, 2 insertions(+) diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index a5f196889f..de0e1d644f 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -59,6 +59,7 @@ #include #include #include +#include #include #include diff --git a/offline/packages/trackreco/MakeActsGeometry.h b/offline/packages/trackreco/MakeActsGeometry.h index 613a045dda..a362bace41 100644 --- a/offline/packages/trackreco/MakeActsGeometry.h +++ b/offline/packages/trackreco/MakeActsGeometry.h @@ -41,6 +41,7 @@ class TGeoVolume; namespace Acts { class Surface; + class SurfaceArray; } using Surface = std::shared_ptr; From a4193691af546c2ee17ec7a92fab5311dd27540b Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Thu, 26 Feb 2026 14:17:09 -0500 Subject: [PATCH 13/38] makesourcelinks compiles --- offline/packages/trackreco/MakeSourceLinks.cc | 14 +++++++------- offline/packages/trackreco/MakeSourceLinks.h | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/offline/packages/trackreco/MakeSourceLinks.cc b/offline/packages/trackreco/MakeSourceLinks.cc index f9038d182e..d607a4be96 100644 --- a/offline/packages/trackreco/MakeSourceLinks.cc +++ b/offline/packages/trackreco/MakeSourceLinks.cc @@ -23,6 +23,8 @@ #include #include +#include + #include #include @@ -257,7 +259,7 @@ SourceLinkVec MakeSourceLinks::getSourceLinks( SourceLink sl(surf->geometryId(), index, cluskey); Acts::SourceLink actsSL{sl}; - Acts::Measurement meas(actsSL, indices, loc, cov); + measurements.emplaceMeasurement<2>(surf->geometryId(), indices, loc, cov); if (m_verbosity > 3) { unsigned int this_layer = TrkrDefs::getLayer(cluskey); @@ -268,10 +270,10 @@ SourceLinkVec MakeSourceLinks::getSourceLinks( << ", cov : " << cov.transpose() << std::endl << " geo id " << sl.geometryId() << std::endl; std::cout << "Surface original transform: " << std::endl; - surf.get()->toStream(tGeometry->geometry().getGeoContext(), std::cout); + surf.get()->toStream(tGeometry->geometry().getGeoContext()); std::cout << std::endl << "Surface transient transform: " << std::endl; - surf.get()->toStream(transient_geocontext, std::cout); + surf.get()->toStream(transient_geocontext); std::cout << std::endl; std::cout << "Corrected surface transform:" << std::endl; std::cout << transformMapTransient->getTransform(surf->geometryId()).matrix() << std::endl; @@ -284,7 +286,6 @@ SourceLinkVec MakeSourceLinks::getSourceLinks( } sourcelinks.push_back(actsSL); - measurements.emplace_back(meas); } SLTrackTimer.stop(); @@ -544,7 +545,7 @@ SourceLinkVec MakeSourceLinks::getSourceLinksClusterMover( SourceLink sl(surf->geometryId(), index, cluskey); Acts::SourceLink actsSL{sl}; - Acts::Measurement meas(actsSL, indices, loc, cov); + measurements.emplaceMeasurement<2>(surf->geometryId(), indices, loc, cov); if (m_verbosity > 3) { std::cout << "MakeSourceLinks::getSourceLinksClusterMover - source link " << sl.index() << ", loc : " @@ -552,7 +553,7 @@ SourceLinkVec MakeSourceLinks::getSourceLinksClusterMover( << ", cov : " << cov.transpose() << std::endl << " geo id " << sl.geometryId() << std::endl; std::cout << "Surface : " << std::endl; - surf.get()->toStream(tGeometry->geometry().getGeoContext(), std::cout); + surf.get()->toStream(tGeometry->geometry().getGeoContext()); std::cout << std::endl; std::cout << "Cluster error " << cluster->getRPhiError() << " , " << cluster->getZError() << std::endl; std::cout << "For key " << cluskey << " with local pos " << std::endl @@ -561,7 +562,6 @@ SourceLinkVec MakeSourceLinks::getSourceLinksClusterMover( } sourcelinks.push_back(actsSL); - measurements.emplace_back(meas); } SLTrackTimer.stop(); diff --git a/offline/packages/trackreco/MakeSourceLinks.h b/offline/packages/trackreco/MakeSourceLinks.h index d22acc4881..7cabf268dc 100644 --- a/offline/packages/trackreco/MakeSourceLinks.h +++ b/offline/packages/trackreco/MakeSourceLinks.h @@ -74,6 +74,7 @@ class MakeSourceLinks short int crossing); private: + int m_verbosity = 0; bool m_pp_mode = false; std::set m_ignoreLayer; From a1b48d8f4774f51c8384ce3f7af87b02108fe438 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Thu, 26 Feb 2026 14:47:43 -0500 Subject: [PATCH 14/38] gsf compiles --- offline/packages/trackreco/PHActsGSF.cc | 8 ++++---- offline/packages/trackreco/PHActsGSF.h | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/offline/packages/trackreco/PHActsGSF.cc b/offline/packages/trackreco/PHActsGSF.cc index 4d75b257dd..6523e87beb 100644 --- a/offline/packages/trackreco/PHActsGSF.cc +++ b/offline/packages/trackreco/PHActsGSF.cc @@ -102,7 +102,7 @@ int PHActsGSF::InitRun(PHCompositeNode* topNode) m_tGeometry->geometry().magField, bha, 12, 1e-4, - MixtureReductionAlgorithm::KLDistance, false, false); + MixtureReductionAlgorithm::KLDistance, false, false,100.); if (m_actsEvaluator) { @@ -233,7 +233,7 @@ int PHActsGSF::process_event(PHCompositeNode* topNode) auto magcontext = m_tGeometry->geometry().magFieldContext; auto calcontext = m_tGeometry->geometry().calibContext; - auto ppoptions = Acts::PropagatorPlainOptions(); + auto ppoptions = Acts::PropagatorPlainOptions(m_transient_geocontext, magcontext); ActsTrackFittingAlgorithm::GeneralFitterOptions options{ m_transient_geocontext, @@ -294,8 +294,8 @@ ActsTrackFittingAlgorithm::TrackParameters PHActsGSF::makeSeed(SvtxTrack* track, ActsTransformations transformer; auto cov = transformer.rotateSvtxTrackCovToActs(track); - return ActsTrackFittingAlgorithm::TrackParameters::create(psurf, - m_tGeometry->geometry().getGeoContext(), + return ActsTrackFittingAlgorithm::TrackParameters::create(m_tGeometry->geometry().getGeoContext(), + psurf, fourpos, momentum, charge / momentum.norm(), diff --git a/offline/packages/trackreco/PHActsGSF.h b/offline/packages/trackreco/PHActsGSF.h index ce5bea1749..0a1561675a 100644 --- a/offline/packages/trackreco/PHActsGSF.h +++ b/offline/packages/trackreco/PHActsGSF.h @@ -37,7 +37,6 @@ class SvtxTrack; using SourceLink = ActsSourceLink; using FitResult = ActsTrackFittingAlgorithm::TrackFitterResult; using Trajectory = ActsExamples::Trajectories; -using Measurement = Acts::Measurement; using SurfacePtrVec = std::vector; using SourceLinkVec = std::vector; From 8a4c1418be56e864bc5a165dea18cb55a46249fc Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 27 Feb 2026 13:16:20 -0500 Subject: [PATCH 15/38] fix include --- offline/packages/trackbase/TGeoDetectorWithOptions.h | 1 - 1 file changed, 1 deletion(-) diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.h b/offline/packages/trackbase/TGeoDetectorWithOptions.h index bb8fcf9578..fa93e10b62 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.h +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.h @@ -4,7 +4,6 @@ #include "IBaseDetector.h" #include -#include namespace ActsExamples { From c547c80a0210999d7cf673397f277688c52c9595 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 27 Feb 2026 14:19:02 -0500 Subject: [PATCH 16/38] add fwd decl --- offline/packages/trackbase/IBaseDetector.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/offline/packages/trackbase/IBaseDetector.h b/offline/packages/trackbase/IBaseDetector.h index a52e5f1b0b..527d565307 100644 --- a/offline/packages/trackbase/IBaseDetector.h +++ b/offline/packages/trackbase/IBaseDetector.h @@ -8,12 +8,20 @@ #pragma once -#include "ActsExamples/Utilities/OptionsFwd.hpp" - #include #include #include - +namespace boost::program_options +{ + class options_description; + class variables_map; +} // namespace boost::program_options + +namespace ActsExamples::Options +{ + using Description = ::boost::program_options::options_description; + using Variables = ::boost::program_options::variables_map; +} // namespace ActsExamples::Options namespace Acts { class TrackingGeometry; class IMaterialDecorator; From d2e9a1c5dae0de2406d7eafa9c319bd7c71b302c Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 27 Feb 2026 14:19:46 -0500 Subject: [PATCH 17/38] add some updates for compilation --- offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h | 2 +- offline/packages/trackbase_historic/ActsTransformations.cc | 2 +- offline/packages/trackbase_historic/ActsTransformations.h | 2 +- offline/packages/trackreco/MakeActsGeometry.h | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h b/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h index 7b418a0b62..d0de5fadbd 100644 --- a/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h +++ b/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h @@ -62,7 +62,7 @@ namespace MixtureReductionAlgorithm::KLDistance; Acts::ComponentMergeMethod mergeMethod = Acts::ComponentMergeMethod::eMaxWeight; - double reverseFilteringCovarianceScaling = 1.0; + double reverseFilteringCovarianceScaling = 100.; ActsSourceLink::SurfaceAccessor m_slSurfaceAccessor; GsfFitterFunctionImpl(Fitter&& f, diff --git a/offline/packages/trackbase_historic/ActsTransformations.cc b/offline/packages/trackbase_historic/ActsTransformations.cc index ae76cec640..f987d31cf2 100644 --- a/offline/packages/trackbase_historic/ActsTransformations.cc +++ b/offline/packages/trackbase_historic/ActsTransformations.cc @@ -286,7 +286,7 @@ void ActsTransformations::calculateDCA(const Acts::BoundTrackParameters& param, } void ActsTransformations::fillSvtxTrackStates( - const Acts::ConstVectorMultiTrajectory& traj, + const Acts::VectorMultiTrajectory& traj, const size_t& trackTip, SvtxTrack* svtxTrack, const Acts::GeometryContext& geoContext) const diff --git a/offline/packages/trackbase_historic/ActsTransformations.h b/offline/packages/trackbase_historic/ActsTransformations.h index 3cc90b7311..986488b4ea 100644 --- a/offline/packages/trackbase_historic/ActsTransformations.h +++ b/offline/packages/trackbase_historic/ActsTransformations.h @@ -70,7 +70,7 @@ class ActsTransformations //___________________________________________________________________________________________________________ void fillSvtxTrackStates( - const Acts::ConstVectorMultiTrajectory& traj, + const Acts::VectorMultiTrajectory& traj, const size_t& trackTip, SvtxTrack* svtxTrack, const Acts::GeometryContext& geoContext diff --git a/offline/packages/trackreco/MakeActsGeometry.h b/offline/packages/trackreco/MakeActsGeometry.h index a362bace41..db53aa4337 100644 --- a/offline/packages/trackreco/MakeActsGeometry.h +++ b/offline/packages/trackreco/MakeActsGeometry.h @@ -41,8 +41,7 @@ class TGeoVolume; namespace Acts { class Surface; - class SurfaceArray; -} +} // namespace Acts using Surface = std::shared_ptr; using TrackingGeometry = std::shared_ptr; From 380428821c41897fd83e7ca89fe639002c513aac Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 27 Feb 2026 15:45:15 -0500 Subject: [PATCH 18/38] go back to regular makefile --- offline/packages/trackbase/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/offline/packages/trackbase/Makefile.am b/offline/packages/trackbase/Makefile.am index 1a53d8cfa4..03c78d3b89 100644 --- a/offline/packages/trackbase/Makefile.am +++ b/offline/packages/trackbase/Makefile.am @@ -32,7 +32,7 @@ AM_CPPFLAGS = \ -isystem$(ROOTSYS)/include AM_LDFLAGS = \ - -L$(MYINSTALL)/lib64 \ + -L$(OFFLINE_MAIN)/lib64 \ -L$(libdir) \ -L$(OFFLINE_MAIN)/lib \ -L$(ROOTSYS)/lib From 567fda4404ef352d77435eb08194a6b549de459d Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 27 Feb 2026 16:30:20 -0500 Subject: [PATCH 19/38] Return other lines from makefile to normal --- offline/packages/trackbase/Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/offline/packages/trackbase/Makefile.am b/offline/packages/trackbase/Makefile.am index 03c78d3b89..84691993c2 100644 --- a/offline/packages/trackbase/Makefile.am +++ b/offline/packages/trackbase/Makefile.am @@ -26,15 +26,14 @@ lib_LTLIBRARIES = \ libtrack.la AM_CPPFLAGS = \ - -I$(MYINSTALL)/include \ -I$(includedir) \ -isystem$(OFFLINE_MAIN)/include \ -isystem$(ROOTSYS)/include AM_LDFLAGS = \ - -L$(OFFLINE_MAIN)/lib64 \ -L$(libdir) \ -L$(OFFLINE_MAIN)/lib \ + -L$(OFFLINE_MAIN)/lib64 \ -L$(ROOTSYS)/lib From df117a71a9bbf9a7f28bbd93117a23988823931b Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 2 Mar 2026 08:56:59 -0500 Subject: [PATCH 20/38] add missing fstream include --- simulation/g4simulation/g4tpc/PHG4TpcPadPlaneReadout.cc | 1 + simulation/g4simulation/g4tpc/TpcClusterBuilder.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/simulation/g4simulation/g4tpc/PHG4TpcPadPlaneReadout.cc b/simulation/g4simulation/g4tpc/PHG4TpcPadPlaneReadout.cc index 6cd968883e..7006241673 100644 --- a/simulation/g4simulation/g4tpc/PHG4TpcPadPlaneReadout.cc +++ b/simulation/g4simulation/g4tpc/PHG4TpcPadPlaneReadout.cc @@ -40,6 +40,7 @@ #include #include // for getenv #include +#include #include #include // for _Rb_tree_cons... #include // for pair diff --git a/simulation/g4simulation/g4tpc/TpcClusterBuilder.cc b/simulation/g4simulation/g4tpc/TpcClusterBuilder.cc index fb6a02ba26..ed2445b1ad 100644 --- a/simulation/g4simulation/g4tpc/TpcClusterBuilder.cc +++ b/simulation/g4simulation/g4tpc/TpcClusterBuilder.cc @@ -15,7 +15,7 @@ #include - +#include #include #include // for sqrt, cos, sin #include From 100fa26788c94b20cf456d9774bb9fd54f3753b6 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 2 Mar 2026 14:08:24 -0500 Subject: [PATCH 21/38] Readd mag field options --- .../trackbase/MagneticFieldOptions.cc | 200 ++++++++++++++++++ .../packages/trackbase/MagneticFieldOptions.h | 22 ++ offline/packages/trackbase/Makefile.am | 2 + offline/packages/trackbase/SpacePoint.h | 3 +- .../packages/trackreco/PHActsKDTreeSeeding.cc | 3 +- .../trackreco/PHActsSiliconSeeding.cc | 3 +- 6 files changed, 228 insertions(+), 5 deletions(-) create mode 100644 offline/packages/trackbase/MagneticFieldOptions.cc create mode 100644 offline/packages/trackbase/MagneticFieldOptions.h diff --git a/offline/packages/trackbase/MagneticFieldOptions.cc b/offline/packages/trackbase/MagneticFieldOptions.cc new file mode 100644 index 0000000000..4043397f76 --- /dev/null +++ b/offline/packages/trackbase/MagneticFieldOptions.cc @@ -0,0 +1,200 @@ + + +#include "MagneticFieldOptions.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +void ActsExamples::Options::addMagneticFieldOptions(Description& desc) { + using boost::program_options::bool_switch; + using boost::program_options::value; + + // avoid adding the options twice + if (desc.find_nothrow("bf-constant-tesla", true) != nullptr) { + return; + } + + auto opt = desc.add_options(); + opt("bf-constant-tesla", value>(), + "Set a constant magnetic field vector in Tesla. If given, this takes " + "preference over all other options."); + opt("bf-scalable", bool_switch(), + "If given, the constant field strength will be scaled differently in " + "every event. This is for testing only."); + opt("bf-scalable-scalor", value()->default_value(1.25), + "Scaling factor for the event-dependent field strength scaling. A unit " + "value means that the field strength stays the same for every event."); + opt("bf-map-file", value(), + "Read a magnetic field map from the given file. ROOT and text file " + "formats are supported. Only used if no constant field is given."); + opt("bf-map-tree", value()->default_value("bField"), + "Name of the TTree in the ROOT file. Only used if the field map is read " + "from a ROOT file."); + opt("bf-map-type", value()->default_value("xyz"), + "Either 'xyz' or 'rz' to define the type of the field map."); + opt("bf-map-octantonly", bool_switch(), + "If given, the field map is assumed to describe only the first " + "octant/quadrant and the field is symmetrically extended to the full " + "space."); + opt("bf-map-lengthscale-mm", value()->default_value(1.), + "Optional length scale modifier for the field map grid. This options " + "only needs to be set if the length unit in the field map file is not " + "`mm`. The value must scale from the stored unit to the equivalent value " + "in `mm`."); + opt("bf-map-fieldscale-tesla", value()->default_value(1.), + "Optional field value scale modifier for the field map value. This " + "option only needs to be set if the field value unit in the field map " + "file is not `Tesla`. The value must scale from the stored unit to the " + "equivalent value in `Tesla`."); + opt("bf-solenoid-mag-tesla", value()->default_value(0.), + "The magnitude of a solenoid magnetic field in the center in `Tesla`. " + "Only used " + "if neither constant field nor a magnetic field map is given."); + opt("bf-solenoid-length", value()->default_value(6000), + "The length of the solenoid magnetic field in `mm`."); + opt("bf-solenoid-radius", value()->default_value(1200), + "The radius of the solenoid magnetic field in `mm`."); + opt("bf-solenoid-ncoils", value()->default_value(1194), + "Number of coils for the solenoid magnetic field."); + opt("bf-solenoid-map-rlim", + value()->value_name("MIN:MAX")->default_value({0, 1200}), + "The length bounds of the grid created from the analytical solenoid " + "field in `mm`."); + opt("bf-solenoid-map-zlim", + value()->value_name("MIN:MAX")->default_value({-3000, 3000}), + "The radius bounds of the grid created from the analytical solenoid " + "field in `mm`."); + opt("bf-solenoid-map-nbins", value>()->default_value({{150, 200}}), + "The number of bins in r-z directions for the grid created from the " + "analytical solenoid field."); +} + + +std::shared_ptr +ActsExamples::Options::readMagneticField(const Variables& vars) { + using namespace ActsExamples::detail; + using std::filesystem::path; + + // first option: create a constant field + if (vars.count("bf-constant-tesla") != 0u) { + const auto values = vars["bf-constant-tesla"].as>(); + Acts::Vector3 field(values[0] * Acts::UnitConstants::T, + values[1] * Acts::UnitConstants::T, + values[2] * Acts::UnitConstants::T); + if (vars["bf-scalable"].as()) { + return std::make_shared(field); + } else { + return std::make_shared(field); + } + } + + // second option: read a field map from a file + if (vars.count("bf-map-file") != 0u) { + const path file = vars["bf-map-file"].as(); + const auto tree = vars["bf-map-tree"].as(); + const auto type = vars["bf-map-type"].as(); + const auto useOctantOnly = vars["bf-map-octantonly"].as(); + const auto lengthUnit = + vars["bf-map-lengthscale-mm"].as() * Acts::UnitConstants::mm; + const auto fieldUnit = + vars["bf-map-fieldscale-tesla"].as() * Acts::UnitConstants::T; + + bool readRoot = false; + if (file.extension() == ".root") { + readRoot = true; + } else if (file.extension() == ".txt") { + readRoot = false; + } else { + throw std::runtime_error("Unsupported magnetic field map file type"); + } + + if (type == "xyz") { + auto mapBins = [](const std::array& bins, + const std::array& sizes) { + return (bins[0] * (sizes[1] * sizes[2]) + bins[1] * sizes[2] + bins[2]); + }; + + if (readRoot) { + auto map = makeMagneticFieldMapXyzFromRoot( + std::move(mapBins), file.native(), tree, lengthUnit, fieldUnit, + useOctantOnly); + return std::make_shared(std::move(map)); + + } else { + auto map = makeMagneticFieldMapXyzFromText(std::move(mapBins), + file.native(), lengthUnit, + fieldUnit, useOctantOnly); + return std::make_shared(std::move(map)); + } + + } else if (type == "rz") { + auto mapBins = [](std::array bins, + std::array sizes) { + return (bins[1] * sizes[0] + bins[0]); + }; + + if (readRoot) { + auto map = makeMagneticFieldMapRzFromRoot( + std::move(mapBins), file.native(), tree, lengthUnit, fieldUnit, + useOctantOnly); + return std::make_shared(std::move(map)); + + } else { + auto map = makeMagneticFieldMapRzFromText(std::move(mapBins), + file.native(), lengthUnit, + fieldUnit, useOctantOnly); + return std::make_shared(std::move(map)); + } + + } else { + throw std::runtime_error("Unknown magnetic field map type"); + } + } + + // third option: create a solenoid field + if (vars["bf-solenoid-mag-tesla"].as() > 0) { + // Construct a solenoid field + Acts::SolenoidBField::Config solenoidConfig{}; + solenoidConfig.length = + vars["bf-solenoid-length"].as() * Acts::UnitConstants::mm; + solenoidConfig.radius = + vars["bf-solenoid-radius"].as() * Acts::UnitConstants::mm; + solenoidConfig.nCoils = vars["bf-solenoid-ncoils"].as(); + solenoidConfig.bMagCenter = + vars["bf-solenoid-mag-tesla"].as() * Acts::UnitConstants::T; + + const auto solenoidField = Acts::SolenoidBField(solenoidConfig); + // The parameters for creating a field map + auto getRange = [&](const char* name, auto unit, auto& lower, auto& upper) { + auto interval = vars[name].as(); + lower = interval.lower.value() * unit; + upper = interval.upper.value() * unit; + }; + std::pair rlim, zlim; + getRange("bf-solenoid-map-rlim", Acts::UnitConstants::mm, rlim.first, + rlim.second); + getRange("bf-solenoid-map-zlim", Acts::UnitConstants::mm, zlim.first, + zlim.second); + const auto nbins = vars["bf-solenoid-map-nbins"].as>(); + auto map = + Acts::solenoidFieldMap(rlim, zlim, {nbins[0], nbins[1]}, solenoidField); + return std::make_shared(std::move(map)); + } + + // default option: no field + return std::make_shared(); +} diff --git a/offline/packages/trackbase/MagneticFieldOptions.h b/offline/packages/trackbase/MagneticFieldOptions.h new file mode 100644 index 0000000000..a5254b9a6a --- /dev/null +++ b/offline/packages/trackbase/MagneticFieldOptions.h @@ -0,0 +1,22 @@ +#ifndef _MAGNETICFIELDOPTIONS_H +#define _MAGNETICFIELDOPTIONS_H + +#include +#include +#include + +namespace ActsExamples { + +namespace Options { + +/// Add magnetic field options with a `bf-` prefix. +void addMagneticFieldOptions(Description& desc); + +/// Read and create the magnetic field from the given user variables. +std::shared_ptr readMagneticField( + const Variables& vars); + +} // namespace Options +} // namespace ActsExamples + +#endif // _MAGNETICFIELDOPTIONS_H diff --git a/offline/packages/trackbase/Makefile.am b/offline/packages/trackbase/Makefile.am index 84691993c2..92b4273988 100644 --- a/offline/packages/trackbase/Makefile.am +++ b/offline/packages/trackbase/Makefile.am @@ -72,6 +72,7 @@ pkginclude_HEADERS = \ LaserClusterv1.h \ LaserClusterv2.h \ MaterialWiper.h \ + MagneticFieldOptions.h \ MvtxDefs.h \ MvtxEventInfo.h \ MvtxEventInfov1.h \ @@ -215,6 +216,7 @@ libtrack_la_SOURCES = \ Calibrator.cc \ ClusterErrorPara.cc \ CommonOptions.cc \ + MagneticFieldOptions.cc \ sPHENIXActsDetectorElement.cc \ TGeoDetectorWithOptions.cc \ TrackFittingAlgorithmFunctionsGsf.cc \ diff --git a/offline/packages/trackbase/SpacePoint.h b/offline/packages/trackbase/SpacePoint.h index 74bff8b1c2..7a422de8c8 100644 --- a/offline/packages/trackbase/SpacePoint.h +++ b/offline/packages/trackbase/SpacePoint.h @@ -6,7 +6,7 @@ #include "trackbase/TrkrDefs.h" #include -#include +#include /** * A struct for Acts to take cluster information for seeding @@ -42,6 +42,7 @@ inline bool operator==(SpacePoint a, SpacePoint b) } using SpacePointPtr = std::unique_ptr; +using SpacePointContainer = std::vector; using SeedContainer = std::vector>; #endif diff --git a/offline/packages/trackreco/PHActsKDTreeSeeding.cc b/offline/packages/trackreco/PHActsKDTreeSeeding.cc index 3bd70410d9..264806af96 100644 --- a/offline/packages/trackreco/PHActsKDTreeSeeding.cc +++ b/offline/packages/trackreco/PHActsKDTreeSeeding.cc @@ -33,8 +33,7 @@ #include #include -#include -#include +#include #include #include #include diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.cc b/offline/packages/trackreco/PHActsSiliconSeeding.cc index 8af74c701f..f131319125 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.cc +++ b/offline/packages/trackreco/PHActsSiliconSeeding.cc @@ -43,9 +43,8 @@ #ifndef __clang__ #pragma GCC diagnostic pop #endif -#include #include -#include +#include #include #include From aabd8ae5b5d426f1e3d17f179c85247ccc0d129a Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 2 Mar 2026 14:13:58 -0500 Subject: [PATCH 22/38] fix field map reading --- offline/packages/trackbase/MagneticFieldOptions.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/offline/packages/trackbase/MagneticFieldOptions.cc b/offline/packages/trackbase/MagneticFieldOptions.cc index 4043397f76..52ee028196 100644 --- a/offline/packages/trackbase/MagneticFieldOptions.cc +++ b/offline/packages/trackbase/MagneticFieldOptions.cc @@ -7,8 +7,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -129,13 +129,13 @@ ActsExamples::Options::readMagneticField(const Variables& vars) { }; if (readRoot) { - auto map = makeMagneticFieldMapXyzFromRoot( + auto map = ActsPlugins::makeMagneticFieldMapXyzFromRoot( std::move(mapBins), file.native(), tree, lengthUnit, fieldUnit, useOctantOnly); return std::make_shared(std::move(map)); } else { - auto map = makeMagneticFieldMapXyzFromText(std::move(mapBins), + auto map = Acts::makeMagneticFieldMapXyzFromText(std::move(mapBins), file.native(), lengthUnit, fieldUnit, useOctantOnly); return std::make_shared(std::move(map)); @@ -148,13 +148,13 @@ ActsExamples::Options::readMagneticField(const Variables& vars) { }; if (readRoot) { - auto map = makeMagneticFieldMapRzFromRoot( + auto map = ActsPlugins::makeMagneticFieldMapRzFromRoot( std::move(mapBins), file.native(), tree, lengthUnit, fieldUnit, useOctantOnly); return std::make_shared(std::move(map)); } else { - auto map = makeMagneticFieldMapRzFromText(std::move(mapBins), + auto map = Acts::makeMagneticFieldMapRzFromText(std::move(mapBins), file.native(), lengthUnit, fieldUnit, useOctantOnly); return std::make_shared(std::move(map)); From fbfe26ec3d15ac3215e95f7511877c9010dd6223 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 2 Mar 2026 14:24:12 -0500 Subject: [PATCH 23/38] add in field options --- offline/packages/trackreco/MakeActsGeometry.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index de0e1d644f..5abeaa6397 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -64,20 +65,20 @@ #include +#include +#include + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wuninitialized" #include #pragma GCC diagnostic pop -#include #include #include #include -#include -#include #include #include From 5e88868187ec794a3506128af3c33772aa40073e Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Mon, 2 Mar 2026 21:25:36 -0500 Subject: [PATCH 24/38] add fwd decl --- offline/packages/trackbase/MagneticFieldOptions.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/offline/packages/trackbase/MagneticFieldOptions.h b/offline/packages/trackbase/MagneticFieldOptions.h index a5254b9a6a..e827e456be 100644 --- a/offline/packages/trackbase/MagneticFieldOptions.h +++ b/offline/packages/trackbase/MagneticFieldOptions.h @@ -3,7 +3,18 @@ #include #include -#include + +namespace boost::program_options +{ + class options_description; + class variables_map; +} // namespace boost::program_options + +namespace ActsExamples::Options +{ + using Description = ::boost::program_options::options_description; + using Variables = ::boost::program_options::variables_map; +} // namespace ActsExamples::Options namespace ActsExamples { From 3dedddb8d5e8b3920a7cef057ecfcd46ef8d0d13 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Tue, 3 Mar 2026 16:24:55 -0500 Subject: [PATCH 25/38] Get kd seeder to compile locally --- offline/packages/trackbase/SpacePoint.h | 5 +- .../packages/trackreco/PHActsKDTreeSeeding.cc | 42 ++--- .../packages/trackreco/PHActsKDTreeSeeding.h | 163 +++++++++--------- 3 files changed, 104 insertions(+), 106 deletions(-) diff --git a/offline/packages/trackbase/SpacePoint.h b/offline/packages/trackbase/SpacePoint.h index 7a422de8c8..afede18a3b 100644 --- a/offline/packages/trackbase/SpacePoint.h +++ b/offline/packages/trackbase/SpacePoint.h @@ -5,6 +5,7 @@ #include #include "trackbase/TrkrDefs.h" +#include #include #include @@ -40,9 +41,11 @@ inline bool operator==(SpacePoint a, SpacePoint b) { return (a.m_clusKey == b.m_clusKey); } +using SpacePointContainerType = ActsExamples::SpacePointContainer>; +using proxy_type = typename Acts::SpacePointContainer::SpacePointProxyType; using SpacePointPtr = std::unique_ptr; using SpacePointContainer = std::vector; -using SeedContainer = std::vector>; +using SeedContainer = std::vector>; #endif diff --git a/offline/packages/trackreco/PHActsKDTreeSeeding.cc b/offline/packages/trackreco/PHActsKDTreeSeeding.cc index 264806af96..ad5b25307e 100644 --- a/offline/packages/trackreco/PHActsKDTreeSeeding.cc +++ b/offline/packages/trackreco/PHActsKDTreeSeeding.cc @@ -15,8 +15,8 @@ #include #include #include -#include #include +#include #include #include @@ -59,7 +59,7 @@ PHActsKDTreeSeeding::PHActsKDTreeSeeding(const std::string& name) { } -//____________________________________________________________________________.. +//______________________ ______________________________________________________.. PHActsKDTreeSeeding::~PHActsKDTreeSeeding() { } @@ -115,23 +115,18 @@ int PHActsKDTreeSeeding::process_event(PHCompositeNode* topNode) SeedContainer PHActsKDTreeSeeding::runSeeder() { - Acts::SeedFinderOrthogonal finder(m_seedFinderConfig); + auto finder = std::make_unique>(m_seedFinderConfig); auto spacePoints = getMvtxSpacePoints(); + Acts::SpacePointContainerConfig spConfig; + Acts::SpacePointContainerOptions spOptions; + spOptions.beamPos = {0, 0}; - std::function< - std::tuple>( - const SpacePoint* sp)> - create_coordinates = [](const SpacePoint* sp) - { - Acts::Vector3 position(sp->x(), sp->y(), sp->z()); - Acts::Vector2 variance(sp->varianceR(), sp->varianceZ()); - return std::make_tuple(position, variance, sp->t()); - }; - + ActsExamples::SpacePointContainer container(spacePoints); + Acts::SpacePointContainer spContainer(spConfig, spOptions, container); /// Call acts seeding algo - SeedContainer seeds = finder.createSeeds(m_seedFinderOptions, - spacePoints, create_coordinates); + auto seeds = finder->createSeeds(m_seedFinderOptions, spContainer); + if (Verbosity() > 1) { std::cout << "Acts::OrthogonalSeeder found " << seeds.size() @@ -147,19 +142,19 @@ void PHActsKDTreeSeeding::fillTrackSeedContainer(SeedContainer& seeds) { auto siseed = std::make_unique(); std::map positions; - - for (auto& spptr : seed.sp()) + const auto& sps = seed.sp(); + for (int spid = 0; spid < 3; spid++) { - auto ckey = spptr->Id(); + auto ckey = sps[spid]->externalSpacePoint()->Id(); siseed->insert_cluster_key(ckey); auto globalPosition = m_tGeometry->getGlobalPosition( ckey, m_clusterMap->findCluster(ckey)); positions.insert(std::make_pair(ckey, globalPosition)); } - - TrackSeedHelper::circleFitByTaubin(siseed.get(),positions, 0, 8); - TrackSeedHelper::lineFit(siseed.get(),positions, 0, 8); + + TrackSeedHelper::circleFitByTaubin(siseed.get(), positions, 0, 8); + TrackSeedHelper::lineFit(siseed.get(), positions, 0, 8); /// Project to INTT and find matches to add to positions findInttMatches(positions, *siseed); @@ -438,7 +433,7 @@ SpacePointPtr PHActsKDTreeSeeding::makeSpacePoint(const Surface& surf, * uncertainties by a tuned factor that gives the v17 performance * Track reconstruction is an art as much as it is a science... */ - SpacePointPtr spPtr(new SpacePoint{key, x, y, z, r, surf->geometryId(), var[0] * m_uncfactor, var[1] * m_uncfactor,std::nullopt}); + SpacePointPtr spPtr(new SpacePoint{key, x, y, z, r, surf->geometryId(), var[0] * m_uncfactor, var[1] * m_uncfactor, std::nullopt}); if (Verbosity() > 2) { @@ -536,8 +531,7 @@ void PHActsKDTreeSeeding::configureSeedFinder() filterCfg.maxSeedsPerSpM = m_maxSeedsPerSpM; m_seedFinderConfig.seedFilter = - std::make_unique>( - Acts::SeedFilter(filterCfg)); + std::make_unique>(filterCfg); m_seedFinderConfig.rMax = m_rMax; m_seedFinderConfig.deltaRMinTopSP = m_deltaRMinTopSP; diff --git a/offline/packages/trackreco/PHActsKDTreeSeeding.h b/offline/packages/trackreco/PHActsKDTreeSeeding.h index f4db9e5f1d..b05abeb39d 100644 --- a/offline/packages/trackreco/PHActsKDTreeSeeding.h +++ b/offline/packages/trackreco/PHActsKDTreeSeeding.h @@ -28,87 +28,88 @@ class TrackSeed; class PHActsKDTreeSeeding : public SubsysReco { public: - PHActsKDTreeSeeding(const std::string& name = "PHActsKDTreeSeeding"); - - ~PHActsKDTreeSeeding() override; - - int Init(PHCompositeNode* topNode) override; - int InitRun(PHCompositeNode* topNode) override; - int process_event(PHCompositeNode* topNode) override; - int End(PHCompositeNode* topNode) override; - - void useTruthClusters(bool truth) { m_useTruthClusters = truth; } - - private: - void configureSeedFinder(); - int getNodes(PHCompositeNode* topNode); - int createNodes(PHCompositeNode* topNode); - SeedContainer runSeeder(); - void fillTrackSeedContainer(SeedContainer& seeds); - std::vector getMvtxSpacePoints(); - SpacePointPtr makeSpacePoint(const Surface& surf, - const TrkrDefs::cluskey key, - TrkrCluster* clus); - - /// Projects circle fit to INTT radii to find possible INTT clusters - /// belonging to MVTX track stub - void findInttMatches(std::map& clusters, - TrackSeed& seed); - - void matchInttClusters(std::map& clusters, - const double xProj[], - const double yProj[], - const double zProj[]); - - Acts::SeedFilterConfig m_seedFilterConfig; - Acts::SeedFinderOrthogonalConfig m_seedFinderConfig; - Acts::SeedFinderOptions m_seedFinderOptions; - - /// configured to seed in the MVTX using the middle layer - /// as the seed anchor - /// Defines volume to search for seeds in - float m_rMax = 200. * Acts::UnitConstants::mm; - float m_deltaRMinTopSP = 1. * Acts::UnitConstants::mm; - float m_deltaRMaxTopSP = 20. * Acts::UnitConstants::mm; - float m_deltaRMinBottomSP = 1. * Acts::UnitConstants::mm; - float m_deltaRMaxBottomSP = 20. * Acts::UnitConstants::mm; - float m_collisionRegionMin = -300 * Acts::UnitConstants::mm; - float m_collisionRegionMax = 300 * Acts::UnitConstants::mm; - float m_zMin = -300. * Acts::UnitConstants::mm; - float m_zMax = 300. * Acts::UnitConstants::mm; - - /// max number of seeds a single middle sp can belong to - float m_maxSeedsPerSpM = 1; - float m_cotThetaMax = 2.9; - float m_sigmaScattering = 5; - float m_radLengthPerSeed = 0.05; - float m_minPt = 100.; // MeV - float m_bFieldInZ = 0.0014; // kTesla - float m_beamPosX = 0; - float m_beamPosY = 0; - - /// Maximum transverse PCA allowed - float m_impactMax = 20. * Acts::UnitConstants::mm; - - /// Middle spacepoint must fall between these two radii - float m_rMinMiddle = 28. * Acts::UnitConstants::mm; - float m_rMaxMiddle = 36. * Acts::UnitConstants::mm; - - int m_nIteration = 0; - std::string m_trackMapName = "SiliconTrackSeedContainer"; - bool m_useTruthClusters = false; - - ClusterErrorPara m_clusErrPara; - float m_uncfactor = 3.175; - const static int m_nInttLayers = 4; - float m_nInttLayerRadii[m_nInttLayers] = {0}; - float m_rPhiSearchWin = 0.1; - - PHG4CylinderGeomContainer* m_geomContainerIntt = nullptr; - TrkrClusterIterationMapv1* m_iterationMap = nullptr; - ActsGeometry* m_tGeometry = nullptr; - TrkrClusterContainer* m_clusterMap = nullptr; - TrackSeedContainer* m_seedContainer = nullptr; +using proxy_type = typename Acts::SpacePointContainer>, Acts::detail::RefHolder>::SpacePointProxyType; + PHActsKDTreeSeeding(const std::string& name = "PHActsKDTreeSeeding"); + + ~PHActsKDTreeSeeding() override; + + int Init(PHCompositeNode* topNode) override; + int InitRun(PHCompositeNode* topNode) override; + int process_event(PHCompositeNode* topNode) override; + int End(PHCompositeNode* topNode) override; + + void useTruthClusters(bool truth) { m_useTruthClusters = truth; } + +private: + void configureSeedFinder(); + int getNodes(PHCompositeNode* topNode); + int createNodes(PHCompositeNode* topNode); + SeedContainer runSeeder(); + void fillTrackSeedContainer(SeedContainer& seeds); + std::vector getMvtxSpacePoints(); + SpacePointPtr makeSpacePoint(const Surface& surf, + const TrkrDefs::cluskey key, + TrkrCluster* clus); + + /// Projects circle fit to INTT radii to find possible INTT clusters + /// belonging to MVTX track stub + void findInttMatches(std::map& clusters, + TrackSeed& seed); + + void matchInttClusters(std::map& clusters, + const double xProj[], + const double yProj[], + const double zProj[]); + + Acts::SeedFilterConfig m_seedFilterConfig; + Acts::SeedFinderOrthogonalConfig m_seedFinderConfig; + Acts::SeedFinderOptions m_seedFinderOptions; + + /// configured to seed in the MVTX using the middle layer + /// as the seed anchor + /// Defines volume to search for seeds in + float m_rMax = 200. * Acts::UnitConstants::mm; + float m_deltaRMinTopSP = 1. * Acts::UnitConstants::mm; + float m_deltaRMaxTopSP = 20. * Acts::UnitConstants::mm; + float m_deltaRMinBottomSP = 1. * Acts::UnitConstants::mm; + float m_deltaRMaxBottomSP = 20. * Acts::UnitConstants::mm; + float m_collisionRegionMin = -300 * Acts::UnitConstants::mm; + float m_collisionRegionMax = 300 * Acts::UnitConstants::mm; + float m_zMin = -300. * Acts::UnitConstants::mm; + float m_zMax = 300. * Acts::UnitConstants::mm; + + /// max number of seeds a single middle sp can belong to + float m_maxSeedsPerSpM = 1; + float m_cotThetaMax = 2.9; + float m_sigmaScattering = 5; + float m_radLengthPerSeed = 0.05; + float m_minPt = 100.; // MeV + float m_bFieldInZ = 0.0014; // kTesla + float m_beamPosX = 0; + float m_beamPosY = 0; + + /// Maximum transverse PCA allowed + float m_impactMax = 20. * Acts::UnitConstants::mm; + + /// Middle spacepoint must fall between these two radii + float m_rMinMiddle = 28. * Acts::UnitConstants::mm; + float m_rMaxMiddle = 36. * Acts::UnitConstants::mm; + + int m_nIteration = 0; + std::string m_trackMapName = "SiliconTrackSeedContainer"; + bool m_useTruthClusters = false; + + ClusterErrorPara m_clusErrPara; + float m_uncfactor = 3.175; + const static int m_nInttLayers = 4; + float m_nInttLayerRadii[m_nInttLayers] = {0}; + float m_rPhiSearchWin = 0.1; + + PHG4CylinderGeomContainer* m_geomContainerIntt = nullptr; + TrkrClusterIterationMapv1* m_iterationMap = nullptr; + ActsGeometry* m_tGeometry = nullptr; + TrkrClusterContainer* m_clusterMap = nullptr; + TrackSeedContainer* m_seedContainer = nullptr; }; #endif // PHACTSKDTREESEEDING_H From 603c32a5d17bd49ee5beea9583f985f7edf47a3c Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Tue, 3 Mar 2026 21:53:23 -0500 Subject: [PATCH 26/38] working through silicon seeding API changes --- .../trackreco/PHActsSiliconSeeding.cc | 102 +++++++++++------- .../packages/trackreco/PHActsSiliconSeeding.h | 10 +- 2 files changed, 66 insertions(+), 46 deletions(-) diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.cc b/offline/packages/trackreco/PHActsSiliconSeeding.cc index f131319125..d52e2808cf 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.cc +++ b/offline/packages/trackreco/PHActsSiliconSeeding.cc @@ -87,8 +87,8 @@ int PHActsSiliconSeeding::Init(PHCompositeNode* /*topNode*/) Acts::SeedFilterConfig sfCfg = configureSeedFilter(); sfCfg = sfCfg.toInternalUnits(); - m_seedFinderCfg.seedFilter = std::make_unique>( - Acts::SeedFilter(sfCfg)); + m_seedFinderCfg.seedFilter = std::make_unique>( + sfCfg); configureSeeder(); configureSPGrid(); @@ -99,10 +99,10 @@ int PHActsSiliconSeeding::Init(PHCompositeNode* /*topNode*/) } // vector containing the map of z bins in the top and bottom layers - m_bottomBinFinder = std::make_unique>( - nphineighbors, zBinNeighborsBottom); - m_topBinFinder = std::make_unique>( - nphineighbors, zBinNeighborsTop); + m_bottomBinFinder = std::make_unique>( + nphineighbors, zBinNeighborsBottom, 0); + m_topBinFinder = std::make_unique>( + nphineighbors, zBinNeighborsTop, 0); if (m_seedAnalysis) { @@ -195,7 +195,8 @@ int PHActsSiliconSeeding::End(PHCompositeNode* /*topNode*/) void PHActsSiliconSeeding::runSeeder() { - Acts::SeedFinder> seedFinder(m_seedFinderCfg); + Acts::SeedFinder> seedFinder(m_seedFinderCfg); auto eventTimer = std::make_unique("eventTimer"); eventTimer->stop(); @@ -209,20 +210,9 @@ void PHActsSiliconSeeding::runSeeder() std::cout << "Seeding for strobe " << strobe << std::endl; } GridSeeds seedVector; - /// Covariance converter functor needed by seed finder - auto covConverter = [=](const SpacePoint& sp, float zAlign, float rAlign, - float sigmaError) - { - Acts::Vector3 position{sp.x(), sp.y(), sp.z()}; - Acts::Vector2 cov; - cov[0] = (sp.m_varianceR + rAlign * rAlign) * sigmaError; - cov[1] = (sp.m_varianceZ + zAlign * zAlign) * sigmaError; - return std::make_tuple(position, cov, sp.t()); - }; - - Acts::Extent rRangeSPExtent; + eventTimer->restart(); - auto spVec = getSiliconSpacePoints(rRangeSPExtent, strobe); + auto spVec = getSiliconSpacePoints(strobe); eventTimer->stop(); spTime += eventTimer->get_accumulated_time(); if (m_seedAnalysis) @@ -230,37 +220,71 @@ void PHActsSiliconSeeding::runSeeder() h_nInputMeas->Fill(spVec.size()); } - Acts::CylindricalSpacePointGrid grid = - Acts::CylindricalSpacePointGridCreator::createGrid( + Acts::SpacePointContainerConfig spConfig; + spConfig.useDetailedDoubleMeasurementInfo = + m_seedFinderCfg.useDetailedDoubleMeasurementInfo; + // Options + // TODO - check beam pos information + Acts::SpacePointContainerOptions spOptions; + spOptions.beamPos = {0., 0.}; + + // Prepare interface SpacePoint backend-ACTS + ActsExamples::SpacePointContainer container(spVec); + // Prepare Acts API + Acts::SpacePointContainer + spContainer(spConfig, spOptions, container); + + using value_type = typename decltype(spContainer)::SpacePointProxyType; + using seed_type = Acts::Seed; + + Acts::CylindricalSpacePointGrid grid = + Acts::CylindricalSpacePointGridCreator::createGrid( m_gridCfg, m_gridOptions); - Acts::CylindricalSpacePointGridCreator::fillGrid( + Acts::CylindricalSpacePointGridCreator::fillGrid( m_seedFinderCfg, m_seedFinderOptions, grid, - spVec.begin(), spVec.end(), covConverter, - rRangeSPExtent); + spContainer); + + // Compute radius Range + // we rely on the fact the grid is storing the proxies + // with a sorting in the radius + float minRange = std::numeric_limits::max(); + float maxRange = std::numeric_limits::lowest(); + for (const auto& coll : grid) + { + if (coll.empty()) + { + continue; + } + const auto* firstEl = coll.front(); + const auto* lastEl = coll.back(); + minRange = std::min(firstEl->radius(), minRange); + maxRange = std::max(lastEl->radius(), maxRange); + } - std::array, 2UL> navigation; - navigation[1UL] = m_seedFinderCfg.zBinsCustomLooping; + std::array, 3ul> navigation; + navigation[1ul] = m_seedFinderCfg.zBinsCustomLooping; - auto spacePointsGrouping = Acts::CylindricalBinnedGroup( + auto spacePointsGrouping = Acts::CylindricalBinnedGroup( std::move(grid), *m_bottomBinFinder, *m_topBinFinder, std::move(navigation)); /// variable middle SP radial region of interest const Acts::Range1D rMiddleSPRange( - std::floor(rRangeSPExtent.min(Acts::binR) / 2) * 2 + 1.5, - std::floor(rRangeSPExtent.max(Acts::binR) / 2) * 2 - 1.5); + // TODO check these values in current code with Acts::Extent + std::floor(minRange / 2) * 2 + 1.5, + std::floor(maxRange / 2) * 2 - 1.5); eventTimer->restart(); - SeedContainer seeds; + static thread_local std::vector seeds; seeds.clear(); + decltype(seedFinder)::SeedingState state; - state.spacePointData.resize(spVec.size(), - m_seedFinderCfg.useDetailedDoubleMeasurementInfo); + state.spacePointMutableData.resize(spContainer.size()); for (const auto [bottom, middle, top] : spacePointsGrouping) { seedFinder.createSeedsForGroup(m_seedFinderOptions, state, spacePointsGrouping.grid(), - std::back_inserter(seeds), + seeds, bottom, middle, top, @@ -270,15 +294,13 @@ void PHActsSiliconSeeding::runSeeder() seederTime += eventTimer->get_accumulated_time(); eventTimer->restart(); - seedVector.push_back(seeds); - if (m_streaming) { - makeSvtxTracksWithTime(seedVector, strobe); + makeSvtxTracksWithTime(seeds, strobe); } else { - makeSvtxTracks(seedVector); + makeSvtxTracks(seeds); } eventTimer->stop(); @@ -1417,8 +1439,7 @@ SpacePointPtr PHActsSiliconSeeding::makeSpacePoint( return spPtr; } -std::vector PHActsSiliconSeeding::getSiliconSpacePoints(Acts::Extent& rRangeSPExtent, - const int strobe) +std::vector PHActsSiliconSeeding::getSiliconSpacePoints(const int strobe) { std::vector spVec; unsigned int numSiliconHits = 0; @@ -1464,7 +1485,6 @@ std::vector PHActsSiliconSeeding::getSiliconSpacePoints(Acts: auto* sp = makeSpacePoint(surface, cluskey, cluster).release(); spVec.push_back(sp); - rRangeSPExtent.extend({sp->x(), sp->y(), sp->z()}); numSiliconHits++; } } diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.h b/offline/packages/trackreco/PHActsSiliconSeeding.h index 506f9c225c..0d02295953 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.h +++ b/offline/packages/trackreco/PHActsSiliconSeeding.h @@ -33,6 +33,7 @@ class TrkrClusterIterationMap; class TrkrClusterCrossingAssoc; using GridSeeds = std::vector>>; +using SpacePointProxy_type = typename Acts::SpacePointContainer>, Acts::detail::RefHolder>::SpacePointProxyType; /** * This class runs the Acts seeder over the MVTX measurements @@ -225,8 +226,7 @@ class PHActsSiliconSeeding : public SubsysReco TrkrCluster *clus); /// Get all space points for the seeder - std::vector getSiliconSpacePoints(Acts::Extent &rRangeSPExtent, - const int strobe); + std::vector getSiliconSpacePoints(const int strobe); void printSeedConfigs(Acts::SeedFilterConfig &sfconfig); bool isTimingMismatched(TrackSeed& seed) const; @@ -288,7 +288,7 @@ class PHActsSiliconSeeding : public SubsysReco int m_lowStrobeIndex = 0; int m_highStrobeIndex = 1; /// Configuration classes for Acts seeding - Acts::SeedFinderConfig m_seedFinderCfg; + Acts::SeedFinderConfig m_seedFinderCfg; Acts::CylindricalSpacePointGridConfig m_gridCfg; Acts::CylindricalSpacePointGridOptions m_gridOptions; Acts::SeedFinderOptions m_seedFinderOptions; @@ -353,8 +353,8 @@ class PHActsSiliconSeeding : public SubsysReco std::vector> zBinNeighborsTop; std::vector> zBinNeighborsBottom; int nphineighbors = 1; - std::unique_ptr> m_bottomBinFinder; - std::unique_ptr> m_topBinFinder; + std::unique_ptr> m_bottomBinFinder; + std::unique_ptr> m_topBinFinder; int m_event = 0; From a0f0087597661e20b72cf999783354dc3d2ab384 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 09:51:44 -0500 Subject: [PATCH 27/38] finally get all templated changes sorted out --- .../trackreco/PHActsSiliconSeeding.cc | 62 +++++++------------ .../packages/trackreco/PHActsSiliconSeeding.h | 11 ++-- 2 files changed, 29 insertions(+), 44 deletions(-) diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.cc b/offline/packages/trackreco/PHActsSiliconSeeding.cc index d52e2808cf..b0b799ed38 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.cc +++ b/offline/packages/trackreco/PHActsSiliconSeeding.cc @@ -43,6 +43,7 @@ #ifndef __clang__ #pragma GCC diagnostic pop #endif + #include #include #include @@ -231,11 +232,10 @@ void PHActsSiliconSeeding::runSeeder() // Prepare interface SpacePoint backend-ACTS ActsExamples::SpacePointContainer container(spVec); // Prepare Acts API - Acts::SpacePointContainer + SpacePointContainerRefHolder spContainer(spConfig, spOptions, container); - using value_type = typename decltype(spContainer)::SpacePointProxyType; - using seed_type = Acts::Seed; + Acts::CylindricalSpacePointGrid grid = Acts::CylindricalSpacePointGridCreator::createGrid( @@ -327,7 +327,7 @@ void PHActsSiliconSeeding::runSeeder() return; } -void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, +void PHActsSiliconSeeding::makeSvtxTracksWithTime(const std::vector& seedVector, const int& strobe) { @@ -335,17 +335,8 @@ void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, int numGoodSeeds = 0; m_seedid = -1; - for (const auto& seeds : seedVector) + for (const auto& seed : seedVector) { - /// loop over acts triplets - for (const auto& seed : seeds) - { - if (Verbosity() > 1) - { - std::cout << "Seed " << numSeeds << " has " - << seed.sp().size() << " measurements " - << std::endl; - } numSeeds++; if (m_seedAnalysis) { @@ -355,10 +346,10 @@ void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, std::map positions; std::vector clus_positions; - - for (const auto& spacePoint : seed.sp()) + const auto& sps = seed.sp(); + for (int spid = 0; spid < 3; spid++) { - const auto& cluskey = spacePoint->Id(); + const auto& cluskey = sps[spid]->externalSpacePoint()->Id(); auto globalPosition = m_tGeometry->getGlobalPosition( cluskey, @@ -401,9 +392,10 @@ void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, { // make the svtxtrack seed with both mvtx + intt clusters auto trackSeed = std::make_unique(); - for (const auto& mvtx_clus : seed.sp()) + + for (int spid = 0; spid < 3; spid++) { - const auto& cluskey = mvtx_clus->Id(); + const auto& cluskey = sps[spid]->externalSpacePoint()->Id(); trackSeed->insert_cluster_key(cluskey); } for (auto& intt_clus : intt_clus_vec) @@ -426,9 +418,9 @@ void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, { /// make a single mvtx only seed auto trackSeed = std::make_unique(); - for (const auto& mvtx_clus : seed.sp()) + for (int spid = 0; spid < 3; spid++) { - const auto& cluskey = mvtx_clus->Id(); + const auto& cluskey = sps[spid]->externalSpacePoint()->Id(); trackSeed->insert_cluster_key(cluskey); } TrackSeedHelper::circleFitByTaubin(trackSeed.get(), positions, 0, 7); @@ -439,34 +431,23 @@ void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, m_seedContainer->insert(trackSeed.get()); numGoodSeeds++; } - } + } if (Verbosity() > 4) { std::cout << "num good seeds : " << numGoodSeeds << std::endl; } } -void PHActsSiliconSeeding::makeSvtxTracks(const GridSeeds& seedVector) +void PHActsSiliconSeeding::makeSvtxTracks(const std::vector& seedVector) { int numSeeds = 0; int numGoodSeeds = 0; m_seedid = -1; int strobe = m_lowStrobeIndex; - /// Loop over grid volumes. In our case this will be strobe - for (const auto& seeds : seedVector) + for (const auto& seed : seedVector) { - /// Loop over actual seeds in this grid volume - for (const auto& seed : seeds) - { - if (Verbosity() > 1) - { - std::cout << "Seed " << numSeeds << " has " - << seed.sp().size() << " measurements " - << std::endl; - } - - if (m_seedAnalysis) + if (m_seedAnalysis) { clearTreeVariables(); m_seedid++; @@ -479,9 +460,10 @@ void PHActsSiliconSeeding::makeSvtxTracks(const GridSeeds& seedVector) std::map positions; auto trackSeed = std::make_unique(); - for (const auto& spacePoint : seed.sp()) + const auto& sps = seed.sp(); + for (int spid = 0; spid < 3; spid++) { - const auto& cluskey = spacePoint->Id(); + const auto& cluskey = sps[spid]->externalSpacePoint()->Id(); cluster_keys.push_back(cluskey); trackSeed->insert_cluster_key(cluskey); @@ -499,7 +481,7 @@ void PHActsSiliconSeeding::makeSvtxTracks(const GridSeeds& seedVector) if (Verbosity() > 1) { std::cout << "Adding cluster with x,y " - << spacePoint->x() << ", " << spacePoint->y() + << sps[spid]->externalSpacePoint()->x() << ", " << sps[spid]->externalSpacePoint()->y() << " mm in detector " << (unsigned int) TrkrDefs::getTrkrId(cluskey) << " with cluskey " << cluskey @@ -620,7 +602,7 @@ void PHActsSiliconSeeding::makeSvtxTracks(const GridSeeds& seedVector) std::cout << "Intt fit time " << circlefittime << " and svtx time " << svtxtracktime << std::endl; } - } + strobe++; if (strobe > m_highStrobeIndex) { diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.h b/offline/packages/trackreco/PHActsSiliconSeeding.h index 0d02295953..09081d088f 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.h +++ b/offline/packages/trackreco/PHActsSiliconSeeding.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -33,8 +34,10 @@ class TrkrClusterIterationMap; class TrkrClusterCrossingAssoc; using GridSeeds = std::vector>>; -using SpacePointProxy_type = typename Acts::SpacePointContainer>, Acts::detail::RefHolder>::SpacePointProxyType; - +using SpacePointContainerRefHolder = Acts::SpacePointContainer; +using SpacePointProxy_type = typename SpacePointContainerRefHolder::SpacePointProxyType; +using value_type = SpacePointContainerRefHolder::SpacePointProxyType; +using seed_type = Acts::Seed; /** * This class runs the Acts seeder over the MVTX measurements * to create track stubs for the rest of the stub matching pattern @@ -213,10 +216,10 @@ class PHActsSiliconSeeding : public SubsysReco Acts::SeedFilterConfig configureSeedFilter() const; /// Take final seeds and fill the TrackSeedContainer - void makeSvtxTracks(const GridSeeds &seedVector); + void makeSvtxTracks(const std::vector& seedVector); /// Take final seeds and fill the TrackSeedContainer - void makeSvtxTracksWithTime(const GridSeeds &seedVector, const int &strobe); + void makeSvtxTracksWithTime(const std::vector& seedVector, const int &strobe); /// Create a seeding space point out of an Acts::SourceLink SpacePointPtr makeSpacePoint( From c21d9d580d78fe9ef656decbe6e6fe0aa85bc5fd Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 10:45:01 -0500 Subject: [PATCH 28/38] track fitters compile --- offline/packages/trackreco/PHActsTrkFitter.cc | 10 +++------ offline/packages/trackreco/PHActsTrkFitter.h | 1 - .../packages/trackreco/PHCosmicsTrkFitter.cc | 22 ++----------------- .../packages/trackreco/PHCosmicsTrkFitter.h | 2 -- 4 files changed, 5 insertions(+), 30 deletions(-) diff --git a/offline/packages/trackreco/PHActsTrkFitter.cc b/offline/packages/trackreco/PHActsTrkFitter.cc index d0006ac25c..a342ea104b 100644 --- a/offline/packages/trackreco/PHActsTrkFitter.cc +++ b/offline/packages/trackreco/PHActsTrkFitter.cc @@ -694,8 +694,8 @@ void PHActsTrkFitter::loopTracks(Acts::Logging::Level logLevel) /// Reset the track seed with the dummy covariance auto seed = ActsTrackFittingAlgorithm::TrackParameters::create( - pSurface, m_transient_geocontext, + pSurface, actsFourPos, momentum, charge / momentum.norm(), @@ -709,13 +709,12 @@ void PHActsTrkFitter::loopTracks(Acts::Logging::Level logLevel) } /// Set host of propagator options for Acts to do e.g. material integration - Acts::PropagatorPlainOptions ppPlainOptions; - auto calibptr = std::make_unique(); CalibratorAdapter calibrator{*calibptr, measurements}; auto magcontext = m_tGeometry->geometry().magFieldContext; auto calibcontext = m_tGeometry->geometry().calibContext; + auto ppPlainOptions = Acts::PropagatorPlainOptions(m_transient_geocontext, magcontext); ActsTrackFittingAlgorithm::GeneralFitterOptions kfOptions{ @@ -928,10 +927,7 @@ bool PHActsTrkFitter::getTrackFitResult( { h_updateTime->Fill(updateTime); } - - Trajectory trajectory(tracks.trackStateContainer(), - trackTips, indexedParams); - + if (m_actsEvaluator) { m_evaluator->evaluateTrackFit(tracks, trackTips, indexedParams, track, diff --git a/offline/packages/trackreco/PHActsTrkFitter.h b/offline/packages/trackreco/PHActsTrkFitter.h index 056c3e88b3..cadfd5bec0 100644 --- a/offline/packages/trackreco/PHActsTrkFitter.h +++ b/offline/packages/trackreco/PHActsTrkFitter.h @@ -45,7 +45,6 @@ class PHG4TpcGeomContainer; using SourceLink = ActsSourceLink; using FitResult = ActsTrackFittingAlgorithm::TrackFitterResult; using Trajectory = ActsExamples::Trajectories; -using Measurement = Acts::Measurement; using SurfacePtrVec = std::vector; using SourceLinkVec = std::vector; diff --git a/offline/packages/trackreco/PHCosmicsTrkFitter.cc b/offline/packages/trackreco/PHCosmicsTrkFitter.cc index d4664415ad..c93861b166 100644 --- a/offline/packages/trackreco/PHCosmicsTrkFitter.cc +++ b/offline/packages/trackreco/PHCosmicsTrkFitter.cc @@ -81,7 +81,6 @@ namespace PHCosmicsTrkFitter::PHCosmicsTrkFitter(const std::string& name) : SubsysReco(name) - , m_trajectories(nullptr) { } @@ -207,8 +206,6 @@ int PHCosmicsTrkFitter::ResetEvent(PHCompositeNode* /*topNode*/) std::cout << "Reset PHCosmicsTrkFitter" << std::endl; } - m_trajectories->clear(); - return Fun4AllReturnCodes::EVENT_OK; } @@ -498,8 +495,8 @@ void PHCosmicsTrkFitter::loopTracks(Acts::Logging::Level logLevel) } //! Reset the track seed with the dummy covariance auto seed = ActsTrackFittingAlgorithm::TrackParameters::create( - pSurface, m_transient_geocontext, + pSurface, actsFourPos, momentum, charge / momentum.norm(), @@ -519,13 +516,12 @@ void PHCosmicsTrkFitter::loopTracks(Acts::Logging::Level logLevel) } //! Set host of propagator options for Acts to do e.g. material integration - Acts::PropagatorPlainOptions ppPlainOptions; - auto calibptr = std::make_unique(); CalibratorAdapter calibrator{*calibptr, measurements}; auto magcontext = m_tGeometry->geometry().magFieldContext; auto calibcontext = m_tGeometry->geometry().calibContext; + auto ppPlainOptions = Acts::PropagatorPlainOptions(m_transient_geocontext, magcontext); ActsTrackFittingAlgorithm::GeneralFitterOptions kfOptions{ @@ -608,11 +604,6 @@ bool PHCosmicsTrkFitter::getTrackFitResult(FitResult& fitOutput, std::cout << "For trackTip == " << outtrack.tipIndex() << std::endl; } - Trajectory trajectory(tracks.trackStateContainer(), - trackTips, indexedParams); - - m_trajectories->insert(std::make_pair(track->get_id(), trajectory)); - /// Get position, momentum from the Acts output. Update the values of /// the proto track updateSvtxTrack(trackTips, indexedParams, tracks, track); @@ -793,15 +784,6 @@ int PHCosmicsTrkFitter::createNodes(PHCompositeNode* topNode) dstNode->addNode(svtxNode); } - m_trajectories = findNode::getClass>(topNode, "ActsTrajectories"); - if (!m_trajectories) - { - m_trajectories = new std::map; - auto node = - new PHDataNode>(m_trajectories, "ActsTrajectories"); - svtxNode->addNode(node); - } - m_trackMap = findNode::getClass(topNode, _track_map_name); if (!m_trackMap) diff --git a/offline/packages/trackreco/PHCosmicsTrkFitter.h b/offline/packages/trackreco/PHCosmicsTrkFitter.h index 2619cc7dd2..2dc8c579db 100644 --- a/offline/packages/trackreco/PHCosmicsTrkFitter.h +++ b/offline/packages/trackreco/PHCosmicsTrkFitter.h @@ -39,7 +39,6 @@ class TTree; using SourceLink = ActsSourceLink; using FitResult = ActsTrackFittingAlgorithm::TrackFitterResult; using Trajectory = ActsExamples::Trajectories; -using Measurement = Acts::Measurement; using SurfacePtrVec = std::vector; using SourceLinkVec = std::vector; @@ -177,7 +176,6 @@ class PHCosmicsTrkFitter : public SubsysReco std::unique_ptr m_evaluator = nullptr; std::string m_evalname = "ActsEvaluator.root"; - std::map* m_trajectories = nullptr; SvtxTrackMap* m_seedTracks = nullptr; //! tpc global position wrapper From 2df35fc95f6dfda522beb71d718592717184f879 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 10:46:50 -0500 Subject: [PATCH 29/38] remove deprecated library names --- offline/packages/trackreco/Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/offline/packages/trackreco/Makefile.am b/offline/packages/trackreco/Makefile.am index 3b70c0e270..4829357b0b 100644 --- a/offline/packages/trackreco/Makefile.am +++ b/offline/packages/trackreco/Makefile.am @@ -119,7 +119,7 @@ AM_CPPFLAGS += -I$(OFFLINE_MAIN)/include/ActsFatras ACTS_LIBS = \ -lActsCore \ - -lActsPluginTGeo \ + -lActsPluginRoot \ -lActsExamplesDetectorTGeo \ -lActsExamplesFramework @@ -174,7 +174,6 @@ libtrack_reco_la_SOURCES = \ libtrack_reco_la_LIBADD = \ -lActsCore \ - -lActsPluginTGeo \ -lActsExamplesDetectorTGeo \ -lActsExamplesFramework \ -lcalo_io \ From d303120b053740ec7c5321fc4a52259b5a0d5d49 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 12:40:40 -0500 Subject: [PATCH 30/38] remove missing include --- offline/packages/trackreco/PHActsSiliconSeeding.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.cc b/offline/packages/trackreco/PHActsSiliconSeeding.cc index b0b799ed38..1a9e27d5d2 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.cc +++ b/offline/packages/trackreco/PHActsSiliconSeeding.cc @@ -43,8 +43,6 @@ #ifndef __clang__ #pragma GCC diagnostic pop #endif - -#include #include #include #include From 3167d915dc22eed563cffe2b44dd8d57df03df8a Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 13:34:41 -0500 Subject: [PATCH 31/38] make single typename definition for new acts propagator options --- .../packages/TrackerMillepedeAlignment/MakeMilleFiles.cc | 6 +++--- offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.h | 1 + offline/packages/trackreco/ActsPropagator.cc | 4 +--- offline/packages/trackreco/ActsPropagator.h | 4 +++- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.cc b/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.cc index c894542990..939de889a7 100644 --- a/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.cc +++ b/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.cc @@ -309,9 +309,9 @@ bool MakeMilleFiles::getLocalVtxDerivativesXY(SvtxTrack* track, auto param = propagator.makeTrackParams(firststate, track->get_charge(), surf).value(); auto perigee = propagator.makeVertexSurface(vertex); auto actspropagator = propagator.makePropagator(); - - Acts::PropagatorOptions<> options(_tGeometry->geometry().getGeoContext(), - _tGeometry->geometry().magFieldContext); + ActsPropagator::SphenixPropagatorOptions + options(_tGeometry->geometry().getGeoContext(), + _tGeometry->geometry().magFieldContext); auto result = actspropagator.propagate(param, *perigee, options); diff --git a/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.h b/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.h index 25a8963987..0733e22bb6 100644 --- a/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.h +++ b/offline/packages/TrackerMillepedeAlignment/MakeMilleFiles.h @@ -23,6 +23,7 @@ #include +#include #include #include diff --git a/offline/packages/trackreco/ActsPropagator.cc b/offline/packages/trackreco/ActsPropagator.cc index fa3e2d1152..6170edb2a6 100644 --- a/offline/packages/trackreco/ActsPropagator.cc +++ b/offline/packages/trackreco/ActsPropagator.cc @@ -112,9 +112,7 @@ ActsPropagator::propagateTrack(const Acts::BoundTrackParameters& params, auto propagator = makePropagator(); - using Actors = Acts::ActorList<>; - using PropagatorOptions = SphenixPropagator::Options; - PropagatorOptions options( + SphenixPropagatorOptions options( m_geometry->geometry().getGeoContext(), m_geometry->geometry().magFieldContext); ActsAborter aborter; diff --git a/offline/packages/trackreco/ActsPropagator.h b/offline/packages/trackreco/ActsPropagator.h index 95a4655f81..164145156b 100644 --- a/offline/packages/trackreco/ActsPropagator.h +++ b/offline/packages/trackreco/ActsPropagator.h @@ -38,7 +38,9 @@ class ActsPropagator using Stepper = Acts::EigenStepper<>; using FastPropagator = Acts::Propagator; using SphenixPropagator = Acts::Propagator; - + using Actors = Acts::ActorList<>; + using SphenixPropagatorOptions = SphenixPropagator::Options; + ActsPropagator() {} ActsPropagator(ActsGeometry* geometry) : m_geometry(geometry) From b2b2ba9021f08a592440c7f2608dca03a93007b9 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 14:14:31 -0500 Subject: [PATCH 32/38] fix func signature --- offline/packages/trackbase_historic/TrackAnalysisUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/offline/packages/trackbase_historic/TrackAnalysisUtils.h b/offline/packages/trackbase_historic/TrackAnalysisUtils.h index aab282da20..fc53a45b2d 100644 --- a/offline/packages/trackbase_historic/TrackAnalysisUtils.h +++ b/offline/packages/trackbase_historic/TrackAnalysisUtils.h @@ -40,7 +40,7 @@ namespace TrackAnalysisUtils // when/if the tpc geometry changes in the future. This is to get us going const float thickness_per_region[4]); float calc_dedx(TrackSeed* tpcseed, TrkrClusterContainer* clustermap, ActsGeometry* tgeometry, - float const thickness_per_region[4]); + const float thickness_per_region[4]); TrackFitResiduals get_residuals(SvtxTrack* track, TrkrClusterContainer* clustermap, PHCompositeNode* topNode); From 97a7f52366690a4a655b7f11f8242bf75b150926 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Wed, 4 Mar 2026 15:13:44 -0500 Subject: [PATCH 33/38] Remove acts dependency which is unneccessary --- calibrations/tpc/TpcDVCalib/Makefile.am | 4 ---- calibrations/tpc/TpcDVCalib/TrackToCalo.cc | 9 +-------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/calibrations/tpc/TpcDVCalib/Makefile.am b/calibrations/tpc/TpcDVCalib/Makefile.am index 033929f967..6ae4411894 100644 --- a/calibrations/tpc/TpcDVCalib/Makefile.am +++ b/calibrations/tpc/TpcDVCalib/Makefile.am @@ -24,10 +24,6 @@ libTpcDVCalib_la_LDFLAGS = \ -L$(OFFLINE_MAIN)/lib libTpcDVCalib_la_LIBADD = \ - -lActsCore \ - -lActsPluginTGeo \ - -lActsExamplesDetectorTGeo \ - -lActsExamplesFramework \ -lSubsysReco \ -ltrackbase_historic_io \ -ltrack_io \ diff --git a/calibrations/tpc/TpcDVCalib/TrackToCalo.cc b/calibrations/tpc/TpcDVCalib/TrackToCalo.cc index f9707e4862..0a6bf6117f 100644 --- a/calibrations/tpc/TpcDVCalib/TrackToCalo.cc +++ b/calibrations/tpc/TpcDVCalib/TrackToCalo.cc @@ -38,14 +38,7 @@ #include #include #include -#include - -#include -#include -#include -#include -#include -#include + #include #include From d91092f3c993cc1c66d19589d517be8b8ae6c9b6 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Thu, 5 Mar 2026 14:45:39 -0500 Subject: [PATCH 34/38] remove finalize method --- .../trackbase/TGeoDetectorWithOptions.cc | 38 ------------------- .../trackbase/TGeoDetectorWithOptions.h | 5 --- 2 files changed, 43 deletions(-) diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.cc b/offline/packages/trackbase/TGeoDetectorWithOptions.cc index fdb81ac03d..6c0698cec7 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.cc +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.cc @@ -79,42 +79,4 @@ void TGeoDetectorWithOptions::addOptions( "Json file to dump empty config into."); } -auto TGeoDetectorWithOptions::finalize( - const boost::program_options::variables_map& vm, - std::shared_ptr mdecorator) - -> std::pair { - TGeoDetector::Config config; - - config.fileName = vm["geo-tgeo-filename"].as(); - - config.surfaceLogLevel = - Acts::Logging::Level(vm["geo-surface-loglevel"].template as()); - config.layerLogLevel = - Acts::Logging::Level(vm["geo-layer-loglevel"].template as()); - config.volumeLogLevel = - Acts::Logging::Level(vm["geo-volume-loglevel"].template as()); - - // No valid geometry configuration. Stop - if (vm["geo-tgeo-jsonconfig"].as().empty()) { - writeTGeoDetectorConfig(vm, config); - std::exit(EXIT_SUCCESS); - } - // Enable dump from full config - else if (!(vm["geo-tgeo-dump-jsonconfig"].as().compare( - "tgeo_empty_cofig.json") == 0)) { - readTGeoLayerBuilderConfigs(vm, config); - writeTGeoDetectorConfig(vm, config); - } else { - readTGeoLayerBuilderConfigs(vm, config); - } - - auto logger = Acts::getDefaultLogger("TGeoDetector", Acts::Logging::INFO); - ContextDecorators tgeoContextDecorators = {}; - std::vector> detectorStore; - TrackingGeometryPtr tgeoTrackingGeometry = ActsExamples::buildTGeoDetectorWrapper( - config, Acts::GeometryContext(), detectorStore, std::move(mdecorator), *logger); - - return {std::move(tgeoTrackingGeometry), std::move(tgeoContextDecorators)}; -} - } // namespace ActsExamples diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.h b/offline/packages/trackbase/TGeoDetectorWithOptions.h index fa93e10b62..af3358abdf 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.h +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.h @@ -14,11 +14,6 @@ class TGeoDetectorWithOptions : public IBaseDetector { void addOptions( boost::program_options::options_description& opt) const override; - - auto finalize(const boost::program_options::variables_map& vm, - std::shared_ptr mdecorator) - -> std::pair override; - }; } // namespace ActsExamples From e58e15fd49c8289f801ec62b13816c982a0487cf Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 6 Mar 2026 10:21:45 -0500 Subject: [PATCH 35/38] Remove finalize --- offline/packages/trackbase/IBaseDetector.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/offline/packages/trackbase/IBaseDetector.h b/offline/packages/trackbase/IBaseDetector.h index 527d565307..8f1f0f16d5 100644 --- a/offline/packages/trackbase/IBaseDetector.h +++ b/offline/packages/trackbase/IBaseDetector.h @@ -42,8 +42,5 @@ class IBaseDetector { virtual void addOptions( boost::program_options::options_description& opt) const = 0; - virtual std::pair finalize( - const boost::program_options::variables_map& vm, - std::shared_ptr mdecorator) = 0; }; } // namespace ActsExamples From 108c24b3a0b58a5f8424b37f21a0d78a34ddec0c Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 10 Apr 2026 09:00:29 -0400 Subject: [PATCH 36/38] make sure detector does not leave scope --- offline/packages/trackreco/MakeActsGeometry.cc | 11 +++++------ offline/packages/trackreco/MakeActsGeometry.h | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index 5abeaa6397..64e1c16f48 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -299,19 +299,18 @@ int MakeActsGeometry::InitRun(PHCompositeNode *topNode) m_actsGeometry->set_tpc_tzero(m_tpc_tzero); m_actsGeometry->set_sampa_tzero_bias(m_sampa_tzero_bias); // alignment_transformation.useInttSurveyGeometry(m_inttSurvey); + if (Verbosity() > 1) { alignment_transformation.verbosity(); } alignment_transformation.createMap(topNode); - for (auto &[layer, factor] : m_misalignmentFactor) { alignment_transformation.misalignmentFactor(layer, factor); } - // print - if (Verbosity()) + if (Verbosity() > 3) { for (const auto &id : surfMaps.m_tpcVolumeIds) { @@ -742,13 +741,13 @@ void MakeActsGeometry::makeGeometry(int argc, char *argv[], const std::string& r config.materialDecorator = matDeco; // this does the building now. The TGeoDetector owns the // tracking geometry - ActsExamples::TGeoDetectorWithOptions detector(config); + m_TGeoDetector = std::make_unique(config); // Add specific options for this geometry - detector.addOptions(desc); + m_TGeoDetector->addOptions(desc); auto vm = ActsExamples::Options::parse(desc, argc, argv); - m_tGeometry = detector.m_detector.trackingGeometry(); + m_tGeometry = m_TGeoDetector->m_detector.trackingGeometry(); if (m_useField) { m_magneticField = ActsExamples::Options::readMagneticField(vm); diff --git a/offline/packages/trackreco/MakeActsGeometry.h b/offline/packages/trackreco/MakeActsGeometry.h index db53aa4337..dfd20f1d9f 100644 --- a/offline/packages/trackreco/MakeActsGeometry.h +++ b/offline/packages/trackreco/MakeActsGeometry.h @@ -216,6 +216,7 @@ class MakeActsGeometry : public SubsysReco // void makeTGeoNodeMap(PHCompositeNode *topNode); void unpackVolumes(); + std::unique_ptr m_TGeoDetector = nullptr; /// Subdetector geometry containers for getting layer information PHG4CylinderGeomContainer *m_geomContainerMvtx = nullptr; From a1aae44a959933bdc41b47c0b60a77b99d107080 Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 10 Apr 2026 15:15:36 -0400 Subject: [PATCH 37/38] clean up --- offline/packages/trackreco/MakeActsGeometry.cc | 1 + offline/packages/trackreco/PHActsSiliconSeeding.cc | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index 64e1c16f48..a76c822287 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -721,6 +721,7 @@ void MakeActsGeometry::makeGeometry(int argc, char *argv[], const std::string& r config.surfaceLogLevel = Acts::Logging::FATAL; config.layerLogLevel = Acts::Logging::FATAL; config.volumeLogLevel = Acts::Logging::FATAL; + config.logLevel = Acts::Logging::FATAL; config.detectorElementFactory = sPHENIXElementFactory; config.readJson(responseFile); diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.cc b/offline/packages/trackreco/PHActsSiliconSeeding.cc index 1a9e27d5d2..ab0126913c 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.cc +++ b/offline/packages/trackreco/PHActsSiliconSeeding.cc @@ -442,7 +442,6 @@ void PHActsSiliconSeeding::makeSvtxTracks(const std::vector& seedVect int numGoodSeeds = 0; m_seedid = -1; - int strobe = m_lowStrobeIndex; for (const auto& seed : seedVector) { if (m_seedAnalysis) @@ -601,11 +600,6 @@ void PHActsSiliconSeeding::makeSvtxTracks(const std::vector& seedVect << svtxtracktime << std::endl; } - strobe++; - if (strobe > m_highStrobeIndex) - { - std::cout << PHWHERE << "Error: some how grid seed vector is not the same as the number of strobes" << std::endl; - } } if (m_seedAnalysis) From bd1e06bac9e5d99b5cbf9a1b539829aeb20d158c Mon Sep 17 00:00:00 2001 From: Joe Osborn Date: Fri, 10 Apr 2026 15:22:39 -0400 Subject: [PATCH 38/38] remove deadweight --- .../packages/trackreco/MakeActsGeometry.cc | 34 ------------------- offline/packages/trackreco/MakeActsGeometry.h | 9 ----- 2 files changed, 43 deletions(-) diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index a76c822287..b4e03ca909 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -765,40 +765,6 @@ void MakeActsGeometry::makeGeometry(int argc, char *argv[], const std::string& r return; } -void MakeActsGeometry::readTGeoLayerBuilderConfigsFile(const std::string &path, - ActsExamples::TGeoDetector::Config &config) -{ - if (path.empty()) - { - std::cout << "There is no acts geometry response file loaded. Cannot build, exiting" - << std::endl; - exit(1); - } - - nlohmann::json djson; - std::ifstream infile(path, std::ifstream::in | std::ifstream::binary); - infile >> djson; - - config.unitScalor = djson["geo-tgeo-unit-scalor"]; - - config.buildBeamPipe = djson["geo-tgeo-build-beampipe"]; - if (config.buildBeamPipe) - { - const auto beamPipeParameters = - djson["geo-tgeo-beampipe-parameters"].get>(); - config.beamPipeRadius = beamPipeParameters[0]; - config.beamPipeHalflengthZ = beamPipeParameters[1]; - config.beamPipeLayerThickness = beamPipeParameters[2]; - } - - // Fill nested volume configs - for (const auto &volume : djson["Volumes"]) - { - auto &vol = config.volumes.emplace_back(); - vol = volume; - } -} - void MakeActsGeometry::unpackVolumes() { // m_tGeometry is a TrackingGeometry pointer diff --git a/offline/packages/trackreco/MakeActsGeometry.h b/offline/packages/trackreco/MakeActsGeometry.h index dfd20f1d9f..b7eb441b23 100644 --- a/offline/packages/trackreco/MakeActsGeometry.h +++ b/offline/packages/trackreco/MakeActsGeometry.h @@ -175,15 +175,6 @@ class MakeActsGeometry : public SubsysReco /// Function that mimics ActsExamples::GeometryExampleBase void makeGeometry(int argc, char *argv[], const std::string& responseFile, const std::string& materialFile); -#ifndef __CLING__ - std::pair, - std::vector>> - build(const boost::program_options::variables_map &vm, - ActsExamples::TGeoDetector::Config config, - ActsExamples::TGeoDetectorWithOptions &detector); -#endif - void readTGeoLayerBuilderConfigsFile(const std::string &path, - ActsExamples::TGeoDetector::Config &config); void setMaterialResponseFile(std::string &responseFile, std::string &materialFile);