10 #include "GaudiKernel/IPartPropSvc.h"
18 #include "HepPDT/ParticleDataTable.hh"
27 m_particleDataTable(nullptr),
28 m_extrapolator(
"Trk::Extrapolator/AtlasExtrapolator")
30 declareInterface<ITruthToTrack>(
this);
40 IPartPropSvc* partPropSvc =
nullptr;
41 StatusCode sc = service(
"PartPropSvc", partPropSvc,
true);
43 ATH_MSG_ERROR (
"Could not initialize Particle Properties Service");
44 return StatusCode::FAILURE;
46 m_particleDataTable = partPropSvc->PDT();
48 if ( m_extrapolator.retrieve().isFailure() ) {
49 ATH_MSG_FATAL (
"Failed to retrieve tool " << m_extrapolator );
50 return StatusCode::FAILURE;
55 return StatusCode::SUCCESS;
61 if (
part ==
nullptr || m_particleDataTable==
nullptr)
return nullptr;
65 prodVertexVector.setZero();
70 const HepPDT::ParticleData* pd =
nullptr;
75 if (trackRecordCollection.
isValid()) {
79 ATH_MSG_DEBUG(
"reading from track record, size=" << trackRecordCollection->
size());
81 if (trackRecordCollection->
empty())
ATH_MSG_WARNING (
"action required but TrackRecordCollection size is 0");
84 for (
const auto & trackRecord : *trackRecordCollection){
88 id = trackRecord.GetPDGCode();
89 pd = m_particleDataTable->particle(std::abs(
id));
95 CLHEP::Hep3Vector tv = trackRecord.GetPosition();
97 globalPos = prodVertexVector;
99 Amg::Vector3D hv2(trackRecord.GetMomentum().x(), trackRecord.GetMomentum().y(),
100 trackRecord.GetMomentum().z());
103 ATH_MSG_DEBUG(
"Found particle " <<
part <<
", momentum " << hv2 <<
" production " << globalPos);
109 charge = (
id>0) ? pd->charge() : -pd->charge();
112 prodVertexVector.y(),
113 prodVertexVector.z() );
115 Amg::Transform3D tmpTransf = prodSurfaceCentre * Amg::RotationMatrix3D::Identity();
131 if (
part ==
nullptr || m_particleDataTable==
nullptr)
return nullptr;
139 const HepPDT::ParticleData* pd =
nullptr;
143 if (trackRecordCollection.
isValid()) {
148 ATH_MSG_DEBUG(
"reading from track record, size=" << trackRecordCollection->
size());
150 if (trackRecordCollection->
empty())
ATH_MSG_WARNING (
"action required but TrackRecordCollection size is 0");
152 for (
const auto & trackRecord : *trackRecordCollection){
156 id = trackRecord.GetPDGCode();
157 pd = m_particleDataTable->particle(std::abs(
id));
163 CLHEP::Hep3Vector tv = trackRecord.GetPosition();
165 globalPos = prodVertexVector;
167 Amg::Vector3D hv2(trackRecord.GetMomentum().x(), trackRecord.GetMomentum().y(), trackRecord.GetMomentum().z());
170 ATH_MSG_DEBUG(
"found particle " <<
part <<
", momentum " << hv2 <<
" production " << globalPos);
177 charge = (
id>0) ? pd->charge() : -pd->charge();
180 prodVertexVector.y(),
181 prodVertexVector.z() );
183 Amg::Transform3D tmpTransf = prodSurfaceCentre * Amg::RotationMatrix3D::Identity();
200 if(
part &&
part->production_vertex() && m_particleDataTable && m_extrapolator) {
204 std::unique_ptr<const Trk::TrackParameters> productionVertexTrackParams( makeProdVertexParameters(
part) );
205 if(productionVertexTrackParams) {
209 generatedTrackPerigee =
210 m_extrapolator->extrapolateDirectly(Gaudi::Hive::currentContext(),
211 *productionVertexTrackParams,
219 return generatedTrackPerigee;
226 if(
part &&
part->hasProdVtx() && m_particleDataTable && m_extrapolator) {
230 std::unique_ptr<const Trk::TrackParameters> productionVertexTrackParams( makeProdVertexParameters(
part) );
231 if(productionVertexTrackParams) {
235 generatedTrackPerigee =
236 m_extrapolator->extrapolateDirectly(Gaudi::Hive::currentContext(),
237 *productionVertexTrackParams,
245 return generatedTrackPerigee;