diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h index c2a13707a3409a4cea377ffe94e42f814d581c2b..bd8ec6e86e6ca2f633f5b6025c945bf217e833de 100755 --- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h +++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h @@ -106,11 +106,13 @@ public: virtual Acts::MagneticFieldContext getMagneticFieldContext(const EventContext& ctx) const; private: - const FaserSCT_ID* m_idHelper{nullptr}; + const FaserSCT_ID* m_idHelper {nullptr}; std::shared_ptr<TrackFitterFunction> m_fit; std::unique_ptr<const Acts::Logger> m_logger; Gaudi::Property<std::string> m_actsLogging {this, "ActsLogging", "VERBOSE"}; + std::unique_ptr<Trk::Track> makeTrack(Acts::GeometryContext& tgContext, TrackFitterResult& fitResult, std::vector<Tracker::FaserSCT_SpacePoint> seed_spcollection) const; + const Trk::TrackParameters* ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const; // Read handle for conditions object to get the field cache SG::ReadCondHandleKey<FaserFieldCacheCondObj> m_fieldCondObjInputKey {this, "FaserFieldCacheCondObj", "fieldCondObj", "Name of the Magnetic Field conditions object key"}; @@ -124,7 +126,7 @@ private: SG::ReadHandleKey<TrackerSimDataCollection> m_sctMap {this, "TrackerSimDataCollection", "SCT_SDO_Map"}; const TrackerDD::SCT_DetectorManager* m_detManager{nullptr}; - SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "FaserActsCKFTrackCollection", "FaserActsCKFTrackCollection", "Output trackcollection name" }; + SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "FaserActsKFTrackCollection", "FaserActsKFTrackCollection", "Output track collection" }; }; #endif diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h index 961a9723f2772f252dc1ac274a9b35bd759d6af7..5db8dbf7b12d8a6a773696c2741e598c141342c9 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h +++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h @@ -1,6 +1,7 @@ #ifndef FASERACTSKALMANFILTER_ITRACKFINDERTOOL_H #define FASERACTSKALMANFILTER_ITRACKFINDERTOOL_H +#include "TrackerSpacePoint/FaserSCT_SpacePoint.h" #include "GaudiKernel/IInterface.h" #include "GaudiKernel/IAlgTool.h" #include "FaserActsKalmanFilter/IndexSourceLink.h" @@ -18,6 +19,7 @@ public: virtual const std::shared_ptr<const Acts::Surface> initialSurface() const = 0; virtual const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const = 0; virtual const std::shared_ptr<std::vector<Measurement>> measurements() const = 0; + virtual const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints() const = 0; }; #endif // FASERACTSKALMANFILTER_ITRACKFINDERTOOL_H \ No newline at end of file diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h index 16909fe3a830a6bb0078998259232f3efbd4ae72..a71ddb56ab7b70af4930fc5cd1369010a5e7446b 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h +++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h @@ -1,6 +1,7 @@ #ifndef FASERACTSKALMANFILTER_PROTOTRACKWRITERTOOL_H #define FASERACTSKALMANFILTER_PROTOTRACKWRITERTOOL_H +#include "TrackerSpacePoint/FaserSCT_SpacePoint.h" #include "AthenaBaseComps/AthAlgTool.h" #include "Gaudi/Property.h" #include "GaudiKernel/IInterface.h" diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h index ff874e9374a7abd5561f74e1cb89a4eb5094894d..09b8d144aec9f2e20fe98446c9a1cfab2d1b753b 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h +++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h @@ -13,6 +13,7 @@ #include "TrackerSpacePoint/FaserSCT_SpacePointContainer.h" #include "FaserActsGeometryInterfaces/IFaserActsTrackingGeometryTool.h" #include "FaserActsKalmanFilter/ITrackFinderTool.h" +#include "TrackerSpacePoint/FaserSCT_SpacePoint.h" #include "TrkTrack/TrackCollection.h" class FaserSCT_ID; @@ -33,12 +34,14 @@ public: virtual const std::shared_ptr<const Acts::Surface> initialSurface() const override; virtual const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const override; virtual const std::shared_ptr<std::vector<Measurement>> measurements() const override; + virtual const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints() const override; private: std::shared_ptr<const Acts::CurvilinearTrackParameters> m_initialTrackParameters; std::shared_ptr<const Acts::Surface> m_initialSurface; std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {}; std::shared_ptr<std::vector<Measurement>> m_measurements {}; + std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> m_spacePoints {}; const FaserSCT_ID* m_idHelper {nullptr}; const TrackerDD::SCT_DetectorManager* m_detManager {nullptr}; @@ -81,4 +84,8 @@ inline const std::shared_ptr<std::vector<Measurement>> return m_measurements; } +inline const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> + SegmentFitTrackFinderTool::spacePoints() const { + return m_spacePoints; +} #endif // FASERACTSKALMANFILTER_SEGMENTFITTRACKFINDERTOOL_H diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h index ab1767af69d0602d23a3cccd6d147f32586f4429..c4e7a87975c8fc435b53f96897d76a836675409e 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h +++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h @@ -48,11 +48,14 @@ public: return m_measurements; } + virtual const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints() const override; + private: std::shared_ptr<const Acts::CurvilinearTrackParameters> m_initialTrackParameters; std::shared_ptr<const Acts::Surface> m_initialSurface; std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {}; std::shared_ptr<std::vector<Measurement>> m_measurements {}; + std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> m_spacePoints {}; const FaserSCT_ID* m_idHelper{nullptr}; const TrackerDD::SCT_DetectorManager* m_detManager{nullptr}; @@ -60,7 +63,7 @@ private: static std::vector<Acts::Vector3> map2vector(const std::map<int, Acts::Vector3>& positions, int station); static Acts::Vector3 average(const std::vector<Acts::Vector3>& spacePoints); static std::pair<Acts::Vector3, Acts::Vector3> linear_fit(const std::vector<Acts::Vector3>& position); - static std::pair<double, double> momentum2(const std::map<int, Acts::Vector3>& hits, double B=0.55) ; + static std::pair<double, double> momentum2(const std::map<int, Acts::Vector3>& hits, double B=0.57) ; SG::ReadHandleKey<SpacePointForSeedCollection> m_spacePointCollectionKey { this, "FaserSpacePointsSeedsName", "Seeds_SpacePointContainer"}; @@ -93,4 +96,9 @@ private: Gaudi::Property<double> m_covTime {this, "covTime", 1}; }; +inline const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> +TruthSeededTrackFinderTool::spacePoints() const { + return m_spacePoints; +} + #endif // FASERACTSKALMANFILTER_TRUTHSEEDEDTRACKFINDERTOOL_H diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py b/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py index 0f10b935969a7112d69c4d54c496778b3f70513a..9c3ddda06b4177c30d78104968e8aa45ecd84832 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py +++ b/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py @@ -50,12 +50,43 @@ from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg # ostream.TakeItemsFromInput = True # return acc +def FaserActsKalmanFilter_OutputCfg(flags): + acc = ComponentAccumulator() + acc.merge(OutputStreamCfg(flags, "ESD")) + ostream = acc.getEventAlgo("OutputStreamESD") + ostream.TakeItemsFromInput = True + return acc + +def FaserActsKalmanFilter_OutputAODCfg(flags): + acc = ComponentAccumulator() + itemList = ["xAOD::EventInfo#*", + "xAOD::EventAuxInfo#*", + "FaserSCT_RDO_Container#*", + "xAOD::FaserTriggerData#*", + "xAOD::FaserTriggerDataAux#*", + "ScintWaveformContainer#*", + "TrackCollection#*", + "xAOD::WaveformHitContainer#*", + "xAOD::WaveformHitAuxContainer#*", + "xAOD::WaveformClock#*", + "xAOD::WaveformClockAuxInfo#*" + ] + acc.merge(OutputStreamCfg(flags, "AOD",itemList)) + ostream = acc.getEventAlgo("OutputStreamAOD") + ostream.TakeItemsFromInput = True + return acc + def FaserActsKalmanFilterCfg(flags, **kwargs): acc = ComponentAccumulator() trajectory_writer_tool = CompFactory.TrajectoryWriterTool() trajectory_writer_tool.FilePath = "KalmanFilterTrajectories.root" track_finder_tool = CompFactory.SegmentFitTrackFinderTool() + # track_finder_tool.covLoc0 = 1e-3 + # track_finder_tool.covLoc1 = 3.61e-4 + # track_finder_tool.covPhi = 1.1e-3 + # track_finder_tool.covTheta = 8.4e-8 + # track_finder_tool.covQOverP = 1e-3 track_finder_tool.covLoc0 = 1e-4 track_finder_tool.covLoc1 = 1e-4 track_finder_tool.covPhi = 1e-4 @@ -68,7 +99,12 @@ def FaserActsKalmanFilterCfg(flags, **kwargs): # track_finder_tool.covMeas01 = 0.01 # track_finder_tool.covMeas10 = 0.01 # track_finder_tool.covMeas11 = 0.64 - # + # track_finder_tool.covLoc0 = 1e-4 + # track_finder_tool.covLoc1 = 1e-4 + # track_finder_tool.covPhi = 1e-4 + # track_finder_tool.covTheta = 1e-4 + # track_finder_tool.covQOverP = 1e-4 + # track_finder_tool.covLoc0 = 1e-1 # track_finder_tool.covLoc1 = 1e-1 # track_finder_tool.covPhi = 1e-1 @@ -102,4 +138,6 @@ def FaserActsKalmanFilterCfg(flags, **kwargs): kalman_filter.TrackFinderTool = track_finder_tool kalman_filter.ActsLogging = "INFO" acc.addEventAlgo(kalman_filter) + acc.merge(FaserActsKalmanFilter_OutputCfg(flags)) + acc.merge(FaserActsKalmanFilter_OutputAODCfg(flags)) return acc diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx index 6f5207e06d5dbd4e99912e9d9365f35317fbb386..a31bf4ba89722e01ab283a10ff3fec3ddb19aaa0 100755 --- a/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx +++ b/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx @@ -46,6 +46,8 @@ #include "FaserActsGeometry/IFaserActsPropStepRootWriterSvc.h" #include "FaserActsGeometry/FaserActsDetectorElement.h" +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" + //ROOT #include <TTree.h> @@ -79,6 +81,8 @@ StatusCode FaserActsKalmanFilterAlg::initialize() { ATH_CHECK(m_trackFinderTool.retrieve()); ATH_CHECK(m_trajectoryWriterTool.retrieve()); ATH_CHECK(m_protoTrackWriterTool.retrieve()); + ATH_CHECK(m_trackCollection.initialize()); + ATH_CHECK(detStore()->retrieve(m_idHelper,"FaserSCT_ID")); m_fit = makeTrackFitterFunction(m_trackingGeometryTool->trackingGeometry()); if (m_actsLogging == "VERBOSE") { m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::VERBOSE); @@ -95,7 +99,10 @@ StatusCode FaserActsKalmanFilterAlg::initialize() { StatusCode FaserActsKalmanFilterAlg::execute() { const EventContext& ctx = Gaudi::Hive::currentContext(); - ATH_MSG_VERBOSE(name() << "::" << __FUNCTION__); + //make TrackCollection + ATH_CHECK(m_trackCollection.initialize()); + SG::WriteHandle<TrackCollection> trackContainer{m_trackCollection,ctx}; + std::unique_ptr<TrackCollection> outputTracks = std::make_unique<TrackCollection>(); std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry = m_trackingGeometryTool->trackingGeometry(); @@ -114,6 +121,9 @@ StatusCode FaserActsKalmanFilterAlg::execute() { m_trackFinderTool->sourceLinks(); std::shared_ptr<std::vector<Measurement>> measurements = m_trackFinderTool->measurements(); + // FIXME this will only work for SegmentFitTrackFinder + std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints = + m_trackFinderTool->spacePoints(); ATH_CHECK(m_protoTrackWriterTool->write(initialTrackParameters, measurements, geoctx)); TrajectoryContainer trajectories; @@ -140,6 +150,10 @@ StatusCode FaserActsKalmanFilterAlg::execute() { if (result.ok()) { // Get the fit output object const auto& fitOutput = result.value(); + std::unique_ptr<Trk::Track> track = makeTrack(geoctx, result, *spacePoints); + if (track) { + outputTracks->push_back(std::move(track)); + } // The track entry indices container. One element here. std::vector<size_t> trackTips; @@ -170,6 +184,9 @@ StatusCode FaserActsKalmanFilterAlg::execute() { std::vector<Acts::CurvilinearTrackParameters> initialTrackParametersVector {*initialTrackParameters}; m_trajectoryWriterTool->writeout(trajectories, geoctx, initialTrackParametersVector); + + ATH_CHECK(trackContainer.record(std::move(outputTracks))); + return StatusCode::SUCCESS; } @@ -187,4 +204,116 @@ Acts::MagneticFieldContext FaserActsKalmanFilterAlg::getMagneticFieldContext(con } const FaserFieldCacheCondObj* fieldCondObj{*readHandle}; return Acts::MagneticFieldContext(fieldCondObj); -} \ No newline at end of file +} + + +std::unique_ptr<Trk::Track> +FaserActsKalmanFilterAlg::makeTrack(Acts::GeometryContext& geoCtx, TrackFitterResult& fitResult, std::vector<Tracker::FaserSCT_SpacePoint> sps) const { + std::unique_ptr<Trk::Track> newtrack = nullptr; + //Get the fit output object + const auto& fitOutput = fitResult.value(); + if (fitOutput.fittedParameters) { + DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{}; + std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam; + // Loop over all the output state to create track state + fitOutput.fittedStates.visitBackwards(fitOutput.lastMeasurementIndex, [&](const auto &state) { + auto flag = state.typeFlags(); + if (state.referenceSurface().associatedDetectorElement() != nullptr) { + // const auto* actsElement = dynamic_cast<const FaserActsDetectorElement*>(state.referenceSurface().associatedDetectorElement()); + // if (actsElement != nullptr ){ + // We need to determine the type of state + std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern; + const Trk::TrackParameters *parm; + + // State is a hole (no associated measurement), use predicted para meters + if (flag[Acts::TrackStateFlag::HoleFlag] == true) { + const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(), + state.predicted(), + state.predictedCovariance()); + parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx); + // auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p arm); + typePattern.set(Trk::TrackStateOnSurface::Hole); + } + // The state was tagged as an outlier, use filtered parameters + else if (flag[Acts::TrackStateFlag::OutlierFlag] == true) { + const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(), + state.filtered(), state.filteredCovariance()); + parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx); + typePattern.set(Trk::TrackStateOnSurface::Outlier); + } + // The state is a measurement state, use smoothed parameters + else { + const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(), + state.smoothed(), state.smoothedCovariance()); + actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam))); + // const auto& psurface=actsParam.referenceSurface(); + Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]); + // const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]); + // auto pos=actsParam.position(tgContext); + parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx); + typePattern.set(Trk::TrackStateOnSurface::Measurement); + } + Tracker::FaserSCT_ClusterOnTrack* measState = nullptr; + if (state.hasUncalibrated()) { + auto sp= sps.at(state.uncalibrated().index()); + //const Tracker::FaserSCT_Cluster* fitCluster=&sp; + const Tracker::FaserSCT_Cluster* fitCluster=sp.clusterList().first; + if(fitCluster != nullptr) { + if (fitCluster->detectorElement() != nullptr) { + measState = new Tracker::FaserSCT_ClusterOnTrack{ + fitCluster, + Trk::LocalParameters{ + Trk::DefinedParameter{fitCluster->localPosition()[0], Trk::loc1}, + Trk::DefinedParameter{fitCluster->localPosition()[1], Trk::loc2} + }, + fitCluster->localCovariance(), + m_idHelper->wafer_hash(fitCluster->detectorElement()->identify()) + }; + } + } + } + double nDoF = state.calibratedSize(); + const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF); + const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern); + // If a state was succesfully created add it to the trajectory + if (perState) { + finalTrajectory->insert(finalTrajectory->begin(), perState); + } + } + return; + }); + + // Create the track using the states + const Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon); + // Trk::FitQuality* q = nullptr; + // newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter ); //Mark the fitter as KalmanFitter + newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), nullptr); + } + return newtrack; +} + +const Trk::TrackParameters* +FaserActsKalmanFilterAlg ::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const { + using namespace Acts::UnitLiterals; + std::optional<AmgSymMatrix(5)> cov = std::nullopt; + if (actsParameter.covariance()){ + AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner(5, 5)); + // Convert the covariance matrix to GeV + for(int i=0; i < newcov.rows(); i++){ + newcov(i, 4) = newcov(i, 4)*1_MeV; + } + for(int i=0; i < newcov.cols(); i++){ + newcov(4, i) = newcov(4, i)*1_MeV; + } + cov = std::optional<AmgSymMatrix(5)>(newcov); + } + const Amg::Vector3D& pos=actsParameter.position(gctx); + double tphi=actsParameter.get<Acts::eBoundPhi>(); + double ttheta=actsParameter.get<Acts::eBoundTheta>(); + double tqOverP=actsParameter.get<Acts::eBoundQOverP>()*1_MeV; + double p = std::abs(1. / tqOverP); + Amg::Vector3D tmom(p * std::cos(tphi) * std::sin(ttheta), p * std::sin(tphi) * std::sin(ttheta), p * std::cos(ttheta)); + const Trk::CurvilinearParameters * curv = new Trk::CurvilinearParameters(pos,tmom,tqOverP>0, cov); + return curv; +} + diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx index 12ee0cae5609e33a477f2724f083a03909b32fad..0aa77c3e8b3f18a75b55aafb730e216e388c10f5 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx +++ b/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx @@ -73,6 +73,7 @@ StatusCode SegmentFitTrackFinderTool::run() { std::array<Acts::BoundIndices, kSize> Indices = {Acts::eBoundLoc0, Acts::eBoundLoc1}; std::vector<IndexSourceLink> sourceLinks; std::vector<Measurement> measurements; + std::vector<Tracker::FaserSCT_SpacePoint> spacePoints {}; for (const FaserSCT_SpacePointCollection* spacePointCollection : *spacePointContainer) { for (const Tracker::FaserSCT_SpacePoint *spacePoint: *spacePointCollection) { Identifier id1 = spacePoint->cluster1()->identify(); @@ -80,6 +81,7 @@ StatusCode SegmentFitTrackFinderTool::run() { // check if both clusters have been used to reconstruct track if (std::find(trackIds.begin(), trackIds.end(), id1) != trackIds.end() && std::find(trackIds.begin(), trackIds.end(), id2) != trackIds.end()) { + spacePoints.push_back(*spacePoint); Identifier id = spacePoint->associatedSurface().associatedDetectorElementIdentifier(); // create source link Acts::GeometryIdentifier geoId = identifierMap->at(id); @@ -95,6 +97,7 @@ StatusCode SegmentFitTrackFinderTool::run() { } m_sourceLinks = std::make_shared<std::vector<IndexSourceLink>>(sourceLinks); m_measurements = std::make_shared<std::vector<Measurement>>(measurements); + m_spacePoints = std::make_shared<std::vector<Tracker::FaserSCT_SpacePoint>>(spacePoints); // TODO how should we handle events without a track in each station? if (positions.size() != 3) { diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx index 85b1036e415fb3f28f9f6b8ee37679afb60304bd..f5b850d8a05877b9d7d48db65faadbff7cfac519 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx +++ b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx @@ -51,8 +51,6 @@ Acts::CurvilinearTrackParameters TruthBasedInitialParameterTool::getInitialParam } } - std::cout << "?? px = " << momentum.x() << " py = " << momentum.y() << " pz = " << momentum.z() << std::endl; - Acts::Vector3 truthVertex = {vertex.x(), vertex.y(), vertex.z()}; // in mm Acts::Vector3 truthMomentum = {momentum.x() / 1000, momentum.y() / 1000, momentum.z() / 1000}; // in GeV m_simWriterTool->writeout(truthVertex, truthMomentum); diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py b/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py index c8f9fcd8010cb94155bab2028bff0bc372b98441..a3f1ccacd536a7d821903cd02ea3219290a1ebc1 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py +++ b/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py @@ -11,6 +11,7 @@ from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg +from TrackerSegmentFit.TrackerSegmentFitConfig import SegmentFitAlgCfg from TrackerSpacePointFormation.TrackerSpacePointFormationConfig import TrackerSpacePointFinderCfg from TruthSeededTrackFinder.TruthSeededTrackFinderConfig import TruthSeededTrackFinderCfg from FaserActsKalmanFilter.FaserActsKalmanFilterConfig import FaserActsKalmanFilterCfg @@ -34,10 +35,11 @@ acc.merge(PoolReadCfg(ConfigFlags)) # Inner Detector acc.merge(FaserSCT_ClusterizationCfg(ConfigFlags)) +acc.merge(SegmentFitAlgCfg(ConfigFlags)) acc.merge(TrackerSpacePointFinderCfg(ConfigFlags)) acc.merge(TruthSeededTrackFinderCfg(ConfigFlags)) acc.merge(FaserActsKalmanFilterCfg(ConfigFlags)) -acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG +# acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG # logging.getLogger('forcomps').setLevel(VERBOSE) # acc.foreach_component("*").OutputLevel = VERBOSE @@ -48,5 +50,5 @@ acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG # ConfigFlags.dump() # Execute and finish -sc = acc.run(maxEvents=1000) +sc = acc.run(maxEvents=100) sys.exit(not sc.isSuccess()) diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/TI12KalmanFilter.py b/Tracking/Acts/FaserActsKalmanFilter/test/TI12KalmanFilter.py new file mode 100644 index 0000000000000000000000000000000000000000..0a8dc9ae131fb78410da19250f36155e12912367 --- /dev/null +++ b/Tracking/Acts/FaserActsKalmanFilter/test/TI12KalmanFilter.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import sys +from AthenaCommon.Logging import log, logging +from AthenaCommon.Constants import DEBUG, VERBOSE, INFO +from AthenaCommon.Configurable import Configurable +from CalypsoConfiguration.AllConfigFlags import ConfigFlags +from AthenaConfiguration.TestDefaults import defaultTestFiles +from CalypsoConfiguration.MainServicesConfig import MainServicesCfg +from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg +from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg +from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg +from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg +from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg +from TrackerSegmentFit.TrackerSegmentFitConfig import SegmentFitAlgCfg +from TrackerSpacePointFormation.TrackerSpacePointFormationConfig import TrackerSpacePointFinderCfg +from FaserActsKalmanFilter.FaserActsKalmanFilterConfig import FaserActsKalmanFilterCfg + + +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True + +# Configure +ConfigFlags.Input.Files = ['MiddleStationTrack.raw'] +ConfigFlags.Output.ESDFileName = "MiddleStation-KalmanFilter.ESD.pool.root" +ConfigFlags.Output.AODFileName = "MiddleStation-KalmanFilter.AOD.pool.root" +ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01" +ConfigFlags.IOVDb.DatabaseInstance = "OFLP200" +ConfigFlags.Input.ProjectName = "data21" +ConfigFlags.Input.isMC = False +ConfigFlags.GeoModel.FaserVersion = "FASER-01" +ConfigFlags.Common.isOnline = False +ConfigFlags.GeoModel.Align.Dynamic = False +ConfigFlags.Beam.NumberOfCollisions = 0. +ConfigFlags.Detector.GeometryFaserSCT = True +ConfigFlags.lock() + +# Core components +acc = MainServicesCfg(ConfigFlags) +acc.merge(FaserByteStreamCnvSvcCfg(ConfigFlags)) +acc.merge(FaserSCT_ClusterizationCfg(ConfigFlags)) +acc.merge(SegmentFitAlgCfg(ConfigFlags)) +acc.merge(TrackerSpacePointFinderCfg(ConfigFlags)) +acc.merge(FaserActsKalmanFilterCfg(ConfigFlags)) +acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG + +replicaSvc = acc.getService("DBReplicaSvc") +replicaSvc.COOLSQLiteVetoPattern = "" +replicaSvc.UseCOOLSQLite = True +replicaSvc.UseCOOLFrontier = False +replicaSvc.UseGeomSQLite = True + + +# logging.getLogger('forcomps').setLevel(VERBOSE) +# acc.foreach_component("*").OutputLevel = VERBOSE +# acc.foreach_component("*ClassID*").OutputLevel = INFO +# acc.getService("StoreGateSvc").Dump = True +# acc.getService("ConditionStore").Dump = True +# acc.printConfig(withDetails=True) +# ConfigFlags.dump() + +# Execute and finish +sc = acc.run(maxEvents=-1) +sys.exit(not sc.isSuccess())