ATLAS Offline Software
Loading...
Searching...
No Matches
ActsFatrasWriteHandler.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6// ActsFatrasWriteHandler.cxx
8
9// class header
11//InDet
14
15//Tracking ACTS
17#include "TrkSurfaces/Surface.h"
18
19
20ActsFatrasWriteHandler::ActsFatrasWriteHandler(const std::string& type, const std::string& name,
21 const IInterface* parent)
22 : AthAlgTool(type, name, parent){}
23
25
27{
28 ATH_MSG_INFO(name() << " initialize()" );
29 // Get the Pixel Identifier-helper
30 ATH_CHECK(detStore()->retrieve(m_pixIdHelper, "PixelID"));
31 // Get the SCT Identifier-helper
32 ATH_CHECK(detStore()->retrieve(m_sctIdHelper, "SCT_ID"));
33 // setup handle keys
34 for(auto const& HitCollectionName:m_HitCollectionNames){
35 m_HitCollectionKeys.push_back(static_cast<std::string>(HitCollectionName));
36 }
37 ATH_CHECK(m_HitCollectionKeys.initialize());
38
39 ATH_MSG_INFO(name() << " initialize() successful" );
40 return StatusCode::SUCCESS;
41}
42
43StatusCode ActsFatrasWriteHandler::WriteHits(std::vector<SiHitCollection>& HitCollections, const EventContext& ctx) const
44{
45 auto HitsWriteHandles = m_HitCollectionKeys.makeHandles(ctx);
46 for(long unsigned int i=0;i<HitCollections.size();++i){
47 ATH_MSG_DEBUG(name() << " WriteHits: adding "<<m_HitCollectionNames[i]<< " "<<HitCollections[i].size()<<" hits");
48 ATH_CHECK(HitsWriteHandles[i].record(std::make_unique<SiHitCollection>(HitCollections[i])));
49 ATH_MSG_DEBUG(name() << " WriteHits: added "<<m_HitCollectionNames[i]<< " "<<HitCollections[i].size()<<" hits");
50 }
51 return StatusCode::SUCCESS;
52}
53
55{
56 return StatusCode::SUCCESS;
57}
58
60 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
61 const std::vector<ActsFatras::Hit>& hits,
62 SiHitCollection& pixelSiHits, SiHitCollection& sctSiHits) const
63{
64 ATH_MSG_VERBOSE(name() << " particle " << isp << " with " << hits.size() << " hits");
65 for (auto& hit:hits){
66 double energyDeposit = hit.depositedEnergy() / Acts::UnitConstants::MeV;
67 double time = ActsTrk::timeToAthena(hit.time());
68
69 // get the ACTS geo identifier
70 auto hit_geoid = hit.geometryId();
71 // get the ACTS surface
72 try {
73 auto acts_surface = trackingGeometry->findSurface(hit_geoid);
74 const ActsDetectorElement* acts_de = dynamic_cast<const ActsDetectorElement*>(acts_surface->associatedDetectorElement());
75
76 const Trk::Surface& hitSurface = acts_de->atlasSurface();
77 ATH_MSG_VERBOSE(name() << " Surface position global atlas: " << hitSurface.center());
78 // get the ATLAS identifier and hash identifier
80 ATH_MSG_VERBOSE(name() << " hit Id Acts|atlas: "<< hit_geoid <<"|" << hitId);
81 const Trk::TrkDetElementBase* detElementBase = hitSurface.associatedDetectorElement();
82 const InDetDD::SiDetectorElement* hitSiDetElement = dynamic_cast<const InDetDD::SiDetectorElement*>((detElementBase));
83 ATH_MSG_VERBOSE(name() << " hit position global Acts|atlas: " << hit.position() <<"|" << detElementBase->center());
84
85 auto intersection = hitSurface.globalToLocal(hit.position());
86 ATH_MSG_VERBOSE(name() << " hit isOnSurface: "<<hitSurface.isOnSurface(hit.position()));
87 ATH_MSG_VERBOSE(name() << " intersection (atlas local) " << intersection.value().x() <<"," << intersection.value().y());
88 double interX = intersection.value().x();
89 double interY = intersection.value().y();
90
91 double thickness = hitSiDetElement->thickness();
92 ATH_MSG_VERBOSE(name() << " thickness (atlas)" << thickness);
93
94 const Amg::Transform3D &hitTransform = hitSiDetElement->transformHit().inverse();
95 // get the momentum direction into the local frame
96 Amg::Vector3D particleDir = hit.direction();
97 const Amg::Transform3D& sTransform = hitSurface.transform();
98 Amg::Vector3D localDirection = sTransform.inverse().linear() * particleDir;
99 localDirection *= thickness/cos(localDirection.theta());
100 // moving direction
101 int movingDirection = localDirection.z() > 0. ? 1 : -1;
102 // get he local distance of the intersection in x,y
103 double distX = localDirection.x();
104 double distY = localDirection.y();
105 // local entries in x,y
106 double localEntryX = interX-0.5*distX;
107 double localEntryY = interY-0.5*distY;
108 double localExitX = interX+0.5*distX;
109 double localExitY = interY+0.5*distY;
111 // transform into the hit frame
112 Amg::Vector3D localEntry(hitTransform * (sTransform * Amg::Vector3D(localEntryX,localEntryY,-0.5*movingDirection*thickness)));
113 Amg::Vector3D localExit(hitTransform * (sTransform * Amg::Vector3D(localExitX,localExitY,0.5*movingDirection*thickness)));
114 const HepGeom::Point3D<double> localEntryHep( localEntry.x(), localEntry.y(), localEntry.z() );
115 const HepGeom::Point3D<double> localExitHep( localExit.x(), localExit.y(), localExit.z() );
116
117 auto isPixel=hitSiDetElement->isPixel();
118 ATH_MSG_VERBOSE(name() << " localEntryHep|localExitHep (atlas)" << localEntryHep << "|" << localExitHep);
119 ATH_MSG_VERBOSE(name() << " isPixel " << isPixel);
120 ATH_MSG_VERBOSE(name() << " barrel_ec (atlas)" << (isPixel ? m_pixIdHelper->barrel_ec(hitId) : m_sctIdHelper->barrel_ec(hitId)));
121 ATH_MSG_VERBOSE(name() << " layer_disk (atlas)" << (isPixel ? m_pixIdHelper->layer_disk(hitId) : m_sctIdHelper->layer_disk(hitId)));
122 ATH_MSG_VERBOSE(name() << " eta_module (atlas)" << (isPixel ? m_pixIdHelper->eta_module(hitId) : m_sctIdHelper->eta_module(hitId)));
123 ATH_MSG_VERBOSE(name() << " phi_module (atlas)" << (isPixel ? m_pixIdHelper->phi_module(hitId) : m_sctIdHelper->phi_module(hitId)));
124
125 auto partLink = isp.getParticleLink();
126 auto siHit = SiHit(localEntryHep,
127 localExitHep,
128 energyDeposit,
129 time,
130 *partLink,
131 isPixel ? 0 : 1,
132 isPixel ? m_pixIdHelper->barrel_ec(hitId) : m_sctIdHelper->barrel_ec(hitId),
133 isPixel ? m_pixIdHelper->layer_disk(hitId) : m_sctIdHelper->layer_disk(hitId),
134 isPixel ? m_pixIdHelper->eta_module(hitId) : m_sctIdHelper->eta_module(hitId),
135 isPixel ? m_pixIdHelper->phi_module(hitId) : m_sctIdHelper->phi_module(hitId),
136 isPixel ? 0 : m_sctIdHelper->side(hitId));
137 if (isPixel)
138 pixelSiHits.push_back(siHit);
139 else
140 sctSiHits.push_back(siHit);
141 ATH_MSG_VERBOSE(name() << " convert and store 1 hit, total " << pixelSiHits.size() << " Pixel | "<<sctSiHits.size()<< " SCT hits stored for particle" << isp);
142 }
143 catch (const std::exception& e){
144 ATH_MSG_DEBUG(name() << "Can not find Acts Surface (" << e.what() << ")...Skip...");
145 }
146 }
147}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
AtlasHitsVector< SiHit > SiHitCollection
const Trk::Surface & atlasSurface() const
Return a shared pointer on the ATLAS surface associated with this identifier,.
StatusCode WriteHits(std::vector< SiHitCollection > &HitCollections, const EventContext &ctx) const
SG::WriteHandleKeyArray< SiHitCollection > m_HitCollectionKeys
std::array< StringProperty, 2 > m_HitCollectionNames
virtual StatusCode initialize() override
const PixelID * m_pixIdHelper
the Pixel ID helper
void createHits(const ISF::ISFParticle &isp, std::shared_ptr< const Acts::TrackingGeometry > trackingGeometry, const std::vector< ActsFatras::Hit > &hits, SiHitCollection &pixelSiHits, SiHitCollection &sctSiHits) const
Loop over the hits and call the hit creator, provide the ActsFatras::Particle to create the hits.
virtual StatusCode finalize() override
const SCT_ID * m_sctIdHelper
the SCT ID helper
ActsFatrasWriteHandler(const std::string &, const std::string &, const IInterface *)
Constructor.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
void push_back(const T &t)
size_type size() const
The generic ISF particle definition,.
Definition ISFParticle.h:42
const HepMcParticleLink * getParticleLink() const
HepMcParticleLink accessors.
Class to hold geometrical description of a silicon detector element.
const GeoTrf::Transform3D & transformHit() const
Local (simulation/hit frame) to global transform.
Definition SiHit.h:19
Abstract Base Class for tracking surfaces.
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const =0
Specified by each surface type: GlobalToLocal method without dynamic memory allocation - boolean chec...
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Identifier associatedDetectorElementIdentifier() const
return Identifier of the associated Detector Element
virtual bool isOnSurface(const Amg::Vector3D &glopo, const BoundaryCheck &bchk=true, double tol1=0., double tol2=0.) const
This method returns true if the GlobalPosition is on the Surface for both, within or without check of...
Definition Surface.cxx:123
const Amg::Vector3D & center() const
Returns the center position of the Surface.
This is the base class for all tracking detector elements with read-out relevant information.
virtual const Amg::Vector3D & center() const =0
Return the center of the element.
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
constexpr double timeToAthena(const double actsT)
Converts a time unit from Acts to Athena units.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D