Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-11-16 10:01:28

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 Whitney Armstrong, Wouter Deconinck, Sylvester Joosten
0003 
0004 #include <cmath>
0005 // Gaudi
0006 #include "GaudiAlg/GaudiAlgorithm.h"
0007 #include "GaudiKernel/ToolHandle.h"
0008 #include "GaudiAlg/Transformer.h"
0009 #include "GaudiAlg/GaudiTool.h"
0010 #include "GaudiKernel/RndmGenerators.h"
0011 #include "Gaudi/Property.h"
0012 
0013 #include <k4FWCore/DataHandle.h>
0014 #include <k4Interface/IGeoSvc.h>
0015 #include "ActsExamples/EventData/Track.hpp"
0016 #include "Acts/Definitions/Units.hpp"
0017 #include "Acts/Definitions/Common.hpp"
0018 
0019 #include "edm4eic/TrackerHitCollection.h"
0020 #include "edm4eic/ClusterCollection.h"
0021 #include "edm4hep/utils/vector_utils.h"
0022 
0023 #include "Acts/Surfaces/PerigeeSurface.hpp"
0024 
0025   ///// (Reconstructed) track parameters e.g. close to the vertex.
0026   //using TrackParameters = Acts::CurvilinearTrackParameters;
0027 
0028   ///// Container of reconstructed track states for multiple tracks.
0029   //using TrackParametersContainer = std::vector<TrackParameters>;
0030 
0031   ///// MultiTrajectory definition
0032   //using Trajectory = Acts::MultiTrajectory<SourceLink>;
0033 
0034   ///// Container for the truth fitting/finding track(s)
0035   //using TrajectoryContainer = std::vector<SimMultiTrajectory>;
0036 
0037 namespace Jug::Reco {
0038 
0039   /** Initial Track parameters from MC truth.
0040    *
0041    *  TrackParmetersContainer
0042    *
0043    *  \ingroup tracking
0044    */
0045   class TrackParamImagingClusterInit : public GaudiAlgorithm {
0046   private:
0047     DataHandle<edm4eic::ClusterCollection>          m_inputClusters{"inputClusters", Gaudi::DataHandle::Reader, this};
0048     DataHandle<ActsExamples::TrackParametersContainer> m_outputInitialTrackParameters{"outputInitialTrackParameters",
0049                                                                         Gaudi::DataHandle::Writer, this};
0050 
0051   public:
0052     TrackParamImagingClusterInit(const std::string& name, ISvcLocator* svcLoc)
0053         : GaudiAlgorithm(name, svcLoc) {
0054       declareProperty("inputClusters", m_inputClusters, "Input clusters");
0055       declareProperty("outputInitialTrackParameters", m_outputInitialTrackParameters, "");
0056     }
0057 
0058     StatusCode initialize() override {
0059       if (GaudiAlgorithm::initialize().isFailure()) {
0060         return StatusCode::FAILURE;
0061       }
0062       IRndmGenSvc* randSvc = svc<IRndmGenSvc>("RndmGenSvc", true);
0063       if (randSvc == nullptr) {
0064         return StatusCode::FAILURE;
0065       }
0066       return StatusCode::SUCCESS;
0067     }
0068 
0069     StatusCode execute() override {
0070       // input collection
0071       const auto* const clusters = m_inputClusters.get();
0072       // Create output collections
0073       auto* init_trk_params = m_outputInitialTrackParameters.createAndPut();
0074 
0075       for(const auto& c : *clusters) {
0076 
0077         using Acts::UnitConstants::GeV;
0078         using Acts::UnitConstants::MeV;
0079         using Acts::UnitConstants::mm;
0080         using Acts::UnitConstants::ns;
0081 
0082         const double p = c.getEnergy()*GeV;
0083         // FIXME hardcoded value
0084         if( p < 0.1*GeV) {
0085           continue;
0086         }
0087         const double theta = edm4hep::utils::anglePolar(c.getPosition());
0088         const double phi = edm4hep::utils::angleAzimuthal(c.getPosition());
0089 
0090         Acts::BoundVector  params;
0091         params(Acts::eBoundLoc0)   = 0.0 * mm ;
0092         params(Acts::eBoundLoc1)   = 0.0 * mm ;
0093         params(Acts::eBoundPhi)    = phi;
0094         params(Acts::eBoundTheta)  = theta;
0095         params(Acts::eBoundQOverP) = 1/p;
0096         params(Acts::eBoundTime)   = 0 * ns;
0097 
0098         auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3{0,0,0});
0099 
0100         debug() << "Invoke track finding seeded by truth particle with p = " << p/GeV  << " GeV" << endmsg;
0101 
0102         // add both charges to the track candidate...
0103         init_trk_params->push_back({pSurface, params, {}, Acts::ParticleHypothesis::pion()});
0104 
0105         Acts::BoundVector  params2;
0106         params2(Acts::eBoundLoc0)   = 0.0 * mm ;
0107         params2(Acts::eBoundLoc1)   = 0.0 * mm ;
0108         params2(Acts::eBoundPhi)    = phi;
0109         params2(Acts::eBoundTheta)  = theta;
0110         params2(Acts::eBoundQOverP) = -1/p;
0111         params2(Acts::eBoundTime)   = 0 * ns;
0112         init_trk_params->push_back({pSurface, params2, {}, Acts::ParticleHypothesis::pion()});
0113 
0114       }
0115       return StatusCode::SUCCESS;
0116     }
0117   };
0118   // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
0119   DECLARE_COMPONENT(TrackParamImagingClusterInit)
0120 
0121 } // namespace Jug::reco