ATLAS Offline Software
Loading...
Searching...
No Matches
TruthTrackRetriever.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
7#include "HepPDT/ParticleData.hh"
8#include "HepPDT/ParticleDataTable.hh"
9#include "GaudiKernel/SystemOfUnits.h"
11
15#include <cmath>
16
17namespace JiveXML {
18
19
26 TruthTrackRetriever::TruthTrackRetriever(const std::string& type,const std::string& name,const IInterface* parent):
27 base_class(type,name,parent),
28 m_typeName("STr")
29 {
30 declareProperty("StoreGateKey", m_McEvtCollName = "TruthEvent", "Name of the McEventCollection");
31 declareProperty("UnstableMinPtCut", m_MinPtCut = 100*Gaudi::Units::MeV, "Minimum pT for an unstable particle to get accepted");
32 declareProperty("UnstableMinRhoCut", m_MinRhoCut = 40*Gaudi::Units::mm, "Minium radius of the end-vertex for unstable particle to get accepted");
33
34 }
35
40 //Nothing to do here
41 return StatusCode::SUCCESS;
42 }
43
48 StatusCode TruthTrackRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
49
50 //be verbose
51 ATH_MSG_DEBUG( "Retrieving " << dataTypeName() );
52
53 //Retrieve the collection
54 const McEventCollection* McEvtColl = NULL;
55 if ( !evtStore()->contains<McEventCollection>( m_McEvtCollName )){
56 ATH_MSG_DEBUG( "Could not find McEventCollection " << m_McEvtCollName );
57 return StatusCode::SUCCESS;
58 }
59 if( evtStore()->retrieve(McEvtColl, m_McEvtCollName).isFailure() ){
60 ATH_MSG_DEBUG( "Could not retrieve McEventCollection " << m_McEvtCollName );
61 return StatusCode::SUCCESS;
62 }
63
64 // Calculate the size
65 long NParticles=0;
66 McEventCollection::const_iterator McEvtCollItr = McEvtColl->begin();
67 for ( ; McEvtCollItr != McEvtColl->end(); ++McEvtCollItr)
68 NParticles += (*McEvtCollItr)->particles_size();
69
70 //Show in verbose mode
71 ATH_MSG_DEBUG( "Total number of particles in McEventCollection \"" << m_McEvtCollName << "\" is " << NParticles );
72
73 //Reserve space for the output data
74 DataVect pt; pt.reserve(NParticles);
75 DataVect phi; phi.reserve(NParticles);
76 DataVect eta; eta.reserve(NParticles);
77 DataVect rhoVertex; rhoVertex.reserve(NParticles);
78 DataVect phiVertex; phiVertex.reserve(NParticles);
79 DataVect zVertex; zVertex.reserve(NParticles);
80 DataVect code; code.reserve(NParticles);
81 DataVect id; id.reserve(NParticles);
82 DataVect rhoEndVertex; rhoEndVertex.reserve(NParticles);
83 DataVect phiEndVertex; phiEndVertex.reserve(NParticles);
84 DataVect zEndVertex; zEndVertex.reserve(NParticles);
85
86
87 //Now loop events and retrieve
88 for ( McEvtCollItr = McEvtColl->begin(); McEvtCollItr != McEvtColl->end(); ++McEvtCollItr){
89
90 //Loop over particles in the event
91#ifdef HEPMC3
92 const auto &barcodes = (*McEvtCollItr)->attribute<HepMC::GenEventBarcodes> ("barcodes");
93 std::map<int,int> id_to_barcode_map;
94 if (barcodes) id_to_barcode_map = barcodes->id_to_barcode_map();
95#endif
96 for (const auto& particle: *(*McEvtCollItr) ) {
97
98 //Additional cuts for decaying particles
99 if ( particle->end_vertex() ) {
100 //Reject particles that fail the pt cut
101 if ( particle->momentum().perp() < m_MinPtCut) continue ;
102 //Reject particles that fail the minimum end-vertex cut
103 if (particle->end_vertex()->position().perp() < m_MinRhoCut ) continue ;
104 }
105
106 //Get basic parameters (eta, phi, pt, ...)
107 pt.emplace_back(particle->momentum().perp()/Gaudi::Units::GeV);
108 float thePhi = particle->momentum().phi();
109 phi.emplace_back( (thePhi<0) ? thePhi+=2*M_PI : thePhi );
110 eta.emplace_back( particle->momentum().pseudoRapidity() );
111 code.emplace_back( particle->pdg_id() );
112#ifdef HEPMC3
113 id.emplace_back( id_to_barcode_map.at(particle->id() ));
114#else
115 id.emplace_back( HepMC::barcode(*particle) );
116#endif
117
118 // Get the vertex information
119 const auto& vertexprod = particle->production_vertex();
120 if (vertexprod) {
121 const auto& pos=vertexprod->position();
122 rhoVertex.emplace_back( std::sqrt(pos.x()*pos.x()+pos.y()*pos.y()+pos.z()*pos.z())*Gaudi::Units::mm/Gaudi::Units::cm );
123 float vtxPhi = pos.phi();
124 phiVertex.emplace_back( (vtxPhi<0)? vtxPhi+=2*M_PI : vtxPhi );
125 zVertex.emplace_back( pos.z()*Gaudi::Units::mm/Gaudi::Units::cm );
126 } else {
127 rhoVertex.emplace_back( 0. );
128 phiVertex.emplace_back( 0. );
129 zVertex.emplace_back( 0. );
130 }
131 //Do the same for the end vertex
132 const auto& vertexend = particle->end_vertex();
133 if ( vertexend ) {
134 const auto& pos=vertexend->position();
135 rhoEndVertex.emplace_back(std::sqrt(pos.x()*pos.x()+pos.y()*pos.y()+pos.z()*pos.z())*Gaudi::Units::mm/Gaudi::Units::cm);
136 float vtxPhi = pos.phi();
137 phiEndVertex.emplace_back( (vtxPhi<0)? vtxPhi+=2*M_PI : vtxPhi );
138 zEndVertex.emplace_back(pos.z()*Gaudi::Units::mm/Gaudi::Units::cm);
139 } else {
140 rhoEndVertex.emplace_back( 0. );
141 phiEndVertex.emplace_back( 0. );
142 zEndVertex.emplace_back( 0. );
143 }
144 }
145 }
146
147 DataMap myDataMap;
148 const auto nEntries = pt.size();
149 myDataMap["pt"] = std::move(pt);
150 myDataMap["phi"] = std::move(phi);
151 myDataMap["eta"] = std::move(eta);
152 myDataMap["code"] = std::move(code);
153 myDataMap["id"] = std::move(id);
154 myDataMap["rhoVertex"] = std::move(rhoVertex);
155 myDataMap["phiVertex"] = std::move(phiVertex);
156 myDataMap["zVertex"] = std::move(zVertex);
157 myDataMap["rhoEndVertex"] = std::move(rhoEndVertex);
158 myDataMap["phiEndVertex"] = std::move(phiEndVertex);
159 myDataMap["zEndVertex"] = std::move(zEndVertex);
160
161 //Be verbose
162 ATH_MSG_DEBUG( dataTypeName() << ": "<< nEntries );
163
164 //forward data to formating tool
165 return FormatTool->AddToEvent(dataTypeName(), m_McEvtCollName, &myDataMap);
166 }
167}
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_DEBUG(x)
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
StatusCode initialize()
Default AthAlgTool methods.
std::string m_McEvtCollName
Storegate key for the McEventCollection (different between RDO/ESD and AOD)
TruthTrackRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
double m_MinRhoCut
Minium radius of the end-vertex for the particle to get accepted.
double m_MinPtCut
Minimum pT for a particle to get accepted.
const std::string m_typeName
The data type that is generated by this retriever.
virtual std::string dataTypeName() const
Return the name of the data type.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
int barcode(const T *p)
Definition Barcode.h:16
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
std::map< std::string, DataVect > DataMap
Definition DataType.h:59
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition DataType.h:58