Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:11:52

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 #pragma once
0009 
0010 #include "Acts/Geometry/GeometryContext.hpp"
0011 #include "Acts/Plugins/EDM4hep/TrackerHitCompatibility.hpp"
0012 #include "ActsExamples/EventData/Cluster.hpp"
0013 #include "ActsExamples/EventData/Measurement.hpp"
0014 #include "ActsExamples/EventData/SimParticle.hpp"
0015 #include "ActsExamples/EventData/Trajectories.hpp"
0016 #include "ActsFatras/EventData/Hit.hpp"
0017 
0018 #include <functional>
0019 
0020 #include <edm4hep/MCParticle.h>
0021 #include <edm4hep/MutableMCParticle.h>
0022 #include <edm4hep/MutableSimTrackerHit.h>
0023 #include <edm4hep/MutableTrack.h>
0024 #include <edm4hep/MutableTrackerHitPlane.h>
0025 #include <edm4hep/SimTrackerHit.h>
0026 #include <edm4hep/TrackerHitPlane.h>
0027 
0028 namespace ActsExamples::EDM4hepUtil {
0029 
0030 using MapParticleIdFrom =
0031     std::function<ActsFatras::Barcode(const edm4hep::MCParticle& particle)>;
0032 using MapParticleIdTo =
0033     std::function<edm4hep::MCParticle(ActsFatras::Barcode particleId)>;
0034 
0035 inline ActsFatras::Barcode zeroParticleMapper(
0036     const edm4hep::MCParticle& /*particle*/) {
0037   return 0;
0038 }
0039 
0040 using MapGeometryIdFrom =
0041     std::function<Acts::GeometryIdentifier(std::uint64_t cellId)>;
0042 using MapGeometryIdTo =
0043     std::function<std::uint64_t(Acts::GeometryIdentifier geometryId)>;
0044 
0045 /// Reads a Fatras particle from EDM4hep.
0046 ///
0047 /// Inpersistent information:
0048 /// - particle ID
0049 /// - process
0050 SimParticle readParticle(
0051     const edm4hep::MCParticle& from,
0052     const MapParticleIdFrom& particleMapper = zeroParticleMapper);
0053 
0054 /// Write a Fatras particle into EDM4hep.
0055 ///
0056 /// Inpersistent information:
0057 /// - particle ID
0058 /// - process
0059 void writeParticle(const SimParticle& from, edm4hep::MutableMCParticle to);
0060 
0061 /// Reads a Fatras hit from EDM4hep.
0062 ///
0063 /// Inpersistent information:
0064 /// - after4 momentum
0065 /// - hit index
0066 /// - digitization channel
0067 ActsFatras::Hit readSimHit(const edm4hep::SimTrackerHit& from,
0068                            const MapParticleIdFrom& particleMapper,
0069                            const MapGeometryIdFrom& geometryMapper);
0070 
0071 /// Writes a Fatras hit to EDM4hep.
0072 ///
0073 /// Inpersistent information:
0074 /// - after4 momentum
0075 /// - hit index
0076 /// - digitization channel
0077 void writeSimHit(const ActsFatras::Hit& from, edm4hep::MutableSimTrackerHit to,
0078                  const MapParticleIdTo& particleMapper,
0079                  const MapGeometryIdTo& geometryMapper);
0080 
0081 /// Reads a measurement cluster from EDM4hep.
0082 ///
0083 /// Inpersistent information:
0084 /// - hit index
0085 /// - 1D local coords?
0086 /// - segment path
0087 ///
0088 /// Known issues:
0089 /// - cluster channels are read from inappropriate fields
0090 /// - local 2D coordinates and time are read from position
0091 VariableBoundMeasurementProxy readMeasurement(
0092     MeasurementContainer& container, const edm4hep::TrackerHitPlane& from,
0093     const edm4hep::TrackerHit3DCollection* fromClusters, Cluster* toCluster,
0094     const MapGeometryIdFrom& geometryMapper);
0095 
0096 /// Writes a measurement cluster to EDM4hep.
0097 ///
0098 /// Inpersistent information:
0099 /// - hit index
0100 /// - 1D local coords?
0101 /// - segment path
0102 ///
0103 /// Known issues:
0104 /// - cluster channels are written to inappropriate fields
0105 /// - local 2D coordinates and time are written to position
0106 void writeMeasurement(const ConstVariableBoundMeasurementProxy& from,
0107                       edm4hep::MutableTrackerHitPlane to,
0108                       const Cluster* fromCluster,
0109                       edm4hep::TrackerHit3DCollection& toClusters,
0110                       const MapGeometryIdTo& geometryMapper);
0111 
0112 /// Writes a trajectory to EDM4hep.
0113 ///
0114 /// Inpersistent information:
0115 /// - trajectory state incomplete
0116 /// - relation to the particles
0117 void writeTrajectory(const Acts::GeometryContext& gctx, double Bz,
0118                      const Trajectories& from, edm4hep::MutableTrack to,
0119                      std::size_t fromIndex,
0120                      const Acts::ParticleHypothesis& particleHypothesis,
0121                      const IndexMultimap<ActsFatras::Barcode>& hitParticlesMap);
0122 
0123 /// Helper function to either return an id as is, or unpack an index from it
0124 /// if it is a podio::ObjectID.
0125 /// @tparam T The type of the id.
0126 /// @param o The id to convert.
0127 /// @return The id as an unsigned integer.
0128 template <typename T>
0129 std::uint64_t podioObjectIDToInteger(T&& o) {
0130   if constexpr (!std::is_same_v<T, podio::ObjectID>) {
0131     return o;
0132   } else {
0133     return o.index;
0134   }
0135 }
0136 
0137 }  // namespace ActsExamples::EDM4hepUtil