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 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/trackbase/ActsGsfTrackFittingAlgorithm.h b/offline/packages/trackbase/ActsGsfTrackFittingAlgorithm.h index fd144c1163..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 = 100.; 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/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::TrackContainertransform(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/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, diff --git a/offline/packages/trackbase/IBaseDetector.h b/offline/packages/trackbase/IBaseDetector.h index a52e5f1b0b..8f1f0f16d5 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; @@ -34,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 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)); diff --git a/offline/packages/trackbase/MagneticFieldOptions.h b/offline/packages/trackbase/MagneticFieldOptions.h index 7604c026c4..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 { @@ -19,4 +30,4 @@ std::shared_ptr readMagneticField( } // namespace Options } // namespace ActsExamples -#endif // _MAGNETICFIELDOPTIONS_H \ No newline at end of file +#endif // _MAGNETICFIELDOPTIONS_H diff --git a/offline/packages/trackbase/Makefile.am b/offline/packages/trackbase/Makefile.am index 29d090c40a..92b4273988 100644 --- a/offline/packages/trackbase/Makefile.am +++ b/offline/packages/trackbase/Makefile.am @@ -71,8 +71,8 @@ pkginclude_HEADERS = \ LaserClusterContainerv1.h \ LaserClusterv1.h \ LaserClusterv2.h \ - MagneticFieldOptions.h \ MaterialWiper.h \ + MagneticFieldOptions.h \ MvtxDefs.h \ MvtxEventInfo.h \ MvtxEventInfov1.h \ @@ -292,8 +292,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/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], diff --git a/offline/packages/trackbase/SpacePoint.h b/offline/packages/trackbase/SpacePoint.h index 74bff8b1c2..afede18a3b 100644 --- a/offline/packages/trackbase/SpacePoint.h +++ b/offline/packages/trackbase/SpacePoint.h @@ -5,8 +5,9 @@ #include #include "trackbase/TrkrDefs.h" +#include #include -#include +#include /** * A struct for Acts to take cluster information for seeding @@ -40,8 +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 SeedContainer = std::vector>; +using SpacePointContainer = std::vector; +using SeedContainer = std::vector>; #endif diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.cc b/offline/packages/trackbase/TGeoDetectorWithOptions.cc index 4467c20754..6c0698cec7 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 @@ -79,36 +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); - } - - return m_detector.finalize(config, std::move(mdecorator)); -} - } // namespace ActsExamples diff --git a/offline/packages/trackbase/TGeoDetectorWithOptions.h b/offline/packages/trackbase/TGeoDetectorWithOptions.h index cc8467c92d..af3358abdf 100644 --- a/offline/packages/trackbase/TGeoDetectorWithOptions.h +++ b/offline/packages/trackbase/TGeoDetectorWithOptions.h @@ -4,20 +4,17 @@ #include "IBaseDetector.h" #include -#include namespace ActsExamples { class TGeoDetectorWithOptions : public IBaseDetector { public: + TGeoDetectorWithOptions(TGeoDetector::Config config) : m_detector(config) {} TGeoDetector m_detector; 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 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; } 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) { 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/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); 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; } 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); diff --git a/offline/packages/trackreco/ActsPropagator.cc b/offline/packages/trackreco/ActsPropagator.cc index 2578f05e61..6170edb2a6 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,14 @@ ActsPropagator::propagateTrack(const Acts::BoundTrackParameters& params, auto propagator = makePropagator(); - using Actors = Acts::ActionList<>; - using Aborters = Acts::AbortList; - - Acts::PropagatorOptions options( + SphenixPropagatorOptions 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 +146,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 +174,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 +231,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; 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) diff --git a/offline/packages/trackreco/MakeActsGeometry.cc b/offline/packages/trackreco/MakeActsGeometry.cc index 07f3dbe71c..b4e03ca909 100644 --- a/offline/packages/trackreco/MakeActsGeometry.cc +++ b/offline/packages/trackreco/MakeActsGeometry.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -59,24 +60,25 @@ #include #include #include +#include #include #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 @@ -297,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) { @@ -664,7 +665,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 +708,47 @@ 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.logLevel = 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 + 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); - // The geometry, material and decoration - auto geometry = build(vm, detector); - // Geometry is a pair of (tgeoTrackingGeometry, tgeoContextDecorators) - - m_tGeometry = geometry.first; + m_tGeometry = m_TGeoDetector->m_detector.trackingGeometry(); if (m_useField) { m_magneticField = ActsExamples::Options::readMagneticField(vm); @@ -741,83 +765,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) -{ - 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 @@ -1082,7 +1029,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 +1166,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..b7eb441b23 100644 --- a/offline/packages/trackreco/MakeActsGeometry.h +++ b/offline/packages/trackreco/MakeActsGeometry.h @@ -41,7 +41,7 @@ class TGeoVolume; namespace Acts { class Surface; -} +} // namespace Acts using Surface = std::shared_ptr; using TrackingGeometry = std::shared_ptr; @@ -174,16 +174,7 @@ class MakeActsGeometry : public SubsysReco void buildActsSurfaces(); /// Function that mimics ActsExamples::GeometryExampleBase - void makeGeometry(int argc, char *argv[], - ActsExamples::TGeoDetectorWithOptions &detector); -#ifndef __CLING__ - std::pair, - std::vector>> - build(const boost::program_options::variables_map &vm, - ActsExamples::TGeoDetectorWithOptions &detector); -#endif - void readTGeoLayerBuilderConfigsFile(const std::string &path, - ActsExamples::TGeoDetector::Config &config); + void makeGeometry(int argc, char *argv[], const std::string& responseFile, const std::string& materialFile); void setMaterialResponseFile(std::string &responseFile, std::string &materialFile); @@ -216,6 +207,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; @@ -273,9 +265,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; 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; 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 \ 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; diff --git a/offline/packages/trackreco/PHActsKDTreeSeeding.cc b/offline/packages/trackreco/PHActsKDTreeSeeding.cc index 3bd70410d9..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 @@ -33,8 +33,7 @@ #include #include -#include -#include +#include #include #include #include @@ -60,7 +59,7 @@ PHActsKDTreeSeeding::PHActsKDTreeSeeding(const std::string& name) { } -//____________________________________________________________________________.. +//______________________ ______________________________________________________.. PHActsKDTreeSeeding::~PHActsKDTreeSeeding() { } @@ -116,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() @@ -148,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); @@ -439,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) { @@ -537,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 diff --git a/offline/packages/trackreco/PHActsSiliconSeeding.cc b/offline/packages/trackreco/PHActsSiliconSeeding.cc index 8af74c701f..ab0126913c 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.cc +++ b/offline/packages/trackreco/PHActsSiliconSeeding.cc @@ -43,9 +43,7 @@ #ifndef __clang__ #pragma GCC diagnostic pop #endif -#include -#include -#include +#include #include #include @@ -88,8 +86,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(); @@ -100,10 +98,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) { @@ -196,7 +194,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(); @@ -210,20 +209,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) @@ -231,37 +219,70 @@ 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 + SpacePointContainerRefHolder + spContainer(spConfig, spOptions, container); + + + + 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, @@ -271,15 +292,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(); @@ -306,7 +325,7 @@ void PHActsSiliconSeeding::runSeeder() return; } -void PHActsSiliconSeeding::makeSvtxTracksWithTime(const GridSeeds& seedVector, +void PHActsSiliconSeeding::makeSvtxTracksWithTime(const std::vector& seedVector, const int& strobe) { @@ -314,17 +333,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) { @@ -334,10 +344,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, @@ -380,9 +390,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) @@ -405,9 +416,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); @@ -418,34 +429,22 @@ 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++; @@ -458,9 +457,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); @@ -478,7 +478,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 @@ -599,12 +599,7 @@ void PHActsSiliconSeeding::makeSvtxTracks(const GridSeeds& seedVector) std::cout << "Intt fit time " << circlefittime << " and svtx time " << 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) @@ -1418,8 +1413,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; @@ -1465,7 +1459,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..09081d088f 100644 --- a/offline/packages/trackreco/PHActsSiliconSeeding.h +++ b/offline/packages/trackreco/PHActsSiliconSeeding.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -33,7 +34,10 @@ class TrkrClusterIterationMap; class TrkrClusterCrossingAssoc; using GridSeeds = std::vector>>; - +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 @@ -212,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( @@ -225,8 +229,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 +291,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 +356,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; 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 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