ATLAS Offline Software
Loading...
Searching...
No Matches
xAODMaker::xAODTruthCnvAlg Class Reference

Algorithm creating xAOD truth from HepMC. More...

#include <xAODTruthCnvAlg.h>

Inheritance diagram for xAODMaker::xAODTruthCnvAlg:

Classes

struct  MetadataFields
class  MetaDataWriter
 Factor out the pieces dealing with writing to meta data. More...
struct  VertexParticles
 Type for tracking particles connected to a single vertex. More...

Public Member Functions

 xAODTruthCnvAlg (const std::string &name, ISvcLocator *svcLoc)
 Regular algorithm constructor.
virtual StatusCode initialize () override
 Function initialising the algorithm.
virtual StatusCode execute (const EventContext &ctx) const override
 Function executing the algorithm.
virtual void handle (const Incident &incident) override
 Incident handler.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef std::map< HepMC::ConstGenVertexPtr, VertexParticlesVertexMap
 Convenience handle for a map of vtx ptrs -> connected particles.
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Static Private Member Functions

static void fillVertex (xAOD::TruthVertex *tv, const HepMC::ConstGenVertexPtr &gv)
 These functions do not set up ELs, just the other variables.
static void fillParticle (xAOD::TruthParticle *tp, const HepMC::ConstGenParticlePtr &gp)

Private Attributes

SG::ReadHandleKey< McEventCollectionm_aodContainerKey
 The key of the input AOD truth container.
SG::WriteHandleKey< xAOD::TruthEventContainerm_xaodTruthEventContainerKey
 The key for the output xAOD truth containers.
SG::WriteHandleKey< xAOD::TruthPileupEventContainerm_xaodTruthPUEventContainerKey
SG::WriteHandleKey< xAOD::TruthParticleContainerm_xaodTruthParticleContainerKey
SG::WriteHandleKey< xAOD::TruthVertexContainerm_xaodTruthVertexContainerKey
SG::WriteHandleKey< xAODTruthParticleLinkVectorm_truthLinkContainerKey
SG::WriteHandleKey< xAOD::TruthParticleContainerm_lheTruthParticleContainerKey
Gaudi::Property< bool > m_doAllPileUp {this, "WriteAllPileUpTruth", false}
 Pile-up options.
Gaudi::Property< bool > m_doInTimePileUp {this, "WriteInTimePileUpTruth", false}
MetaDataWriter m_meta ATLAS_THREAD_SAFE
 Helper for writing to the meta data store.
ServiceHandle< StoreGateSvcm_metaStore
 Connection to the metadata store.
std::string m_metaName
 SG key and name for meta data.
Gaudi::Property< bool > m_writeMetaData {this, "WriteTruthMetaData", true}
 option to disable writing of metadata (e.g. if running a filter on xAOD in generators)
SG::ReadHandleKey< xAOD::EventInfom_evtInfo {this, "EventInfo", "EventInfo", "" }
 Event Info.
bool m_firstBeginRun
 Tag Info.
MetadataFields m_metaFields
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Algorithm creating xAOD truth from HepMC.

This algorithm can be used to translate the HepMC coming from an AOD, and create xAOD truth objects out of them for an output xAOD.

Author
James Catmore James.nosp@m..Cat.nosp@m.more@.nosp@m.cern.nosp@m..ch
Jovan Mitreski Jovan.nosp@m..Mit.nosp@m.reski.nosp@m.@cer.nosp@m.n.ch
Andy Buckley Andy..nosp@m.Buck.nosp@m.ley@c.nosp@m.ern..nosp@m.ch

Definition at line 64 of file xAODTruthCnvAlg.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

◆ VertexMap

Convenience handle for a map of vtx ptrs -> connected particles.

Definition at line 123 of file xAODTruthCnvAlg.h.

Constructor & Destructor Documentation

◆ xAODTruthCnvAlg()

xAODMaker::xAODTruthCnvAlg::xAODTruthCnvAlg ( const std::string & name,
ISvcLocator * svcLoc )

Regular algorithm constructor.

Definition at line 54 of file xAODTruthCnvAlg.cxx.

55 : AthReentrantAlgorithm( name, svcLoc )
56 , m_metaStore( "StoreGateSvc/MetaDataStore", name )
57 , m_firstBeginRun(true)
58 {
59 // leaving metadata alone for now--to be updated
60 declareProperty( "MetaObjectName", m_metaName = "TruthMetaData" );
61 declareProperty( "MetaDataStore", m_metaStore );
62 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > m_metaStore
Connection to the metadata store.
std::string m_metaName
SG key and name for meta data.

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode xAODMaker::xAODTruthCnvAlg::execute ( const EventContext & ctx) const
overridevirtual

Function executing the algorithm.

Definition at line 111 of file xAODTruthCnvAlg.cxx.

111 {
112
113 SG::WriteHandle<xAODTruthParticleLinkVector> truthLinkVec(m_truthLinkContainerKey, ctx);
114 ATH_CHECK(truthLinkVec.record(std::make_unique<xAODTruthParticleLinkVector>()));
115
116 // Retrieve the HepMC truth:
117 SG::ReadHandle<McEventCollection> mcColl(m_aodContainerKey, ctx);
118 // validity check is only really needed for serial running. Remove when MT is only way.
119 if (!mcColl.isValid()) {
120 ATH_MSG_ERROR("Could not retrieve HepMC with key:" << m_aodContainerKey.key());
121 return StatusCode::FAILURE;
122 } else {
123 ATH_MSG_DEBUG( "Retrieved HepMC with key: " << m_aodContainerKey.key() );
124 }
125
126 // **************************************************************
127 // Create the xAOD containers and their auxiliary stores:
128 // **************************************************************
129 // Signal event
130 SG::WriteHandle<xAOD::TruthEventContainer> xTruthEventContainer(m_xaodTruthEventContainerKey, ctx);
131 ATH_CHECK(xTruthEventContainer.record(std::make_unique<xAOD::TruthEventContainer>(),
132 std::make_unique<xAOD::TruthEventAuxContainer>()));
133 ATH_MSG_DEBUG( "Recorded TruthEventContainer with key: " << m_xaodTruthEventContainerKey.key() );
134
135 // Pile-up events
136 SG::WriteHandle<xAOD::TruthPileupEventContainer> xTruthPileupEventContainer;
138 xTruthPileupEventContainer = SG::WriteHandle<xAOD::TruthPileupEventContainer>(m_xaodTruthPUEventContainerKey, ctx);
139 ATH_CHECK(xTruthPileupEventContainer.record(std::make_unique<xAOD::TruthPileupEventContainer>(),
140 std::make_unique<xAOD::TruthPileupEventAuxContainer>()));
141 ATH_MSG_DEBUG( "Recorded TruthPileupEventContainer with key: " << m_xaodTruthPUEventContainerKey.key() );
142 }
143
144 // Particles
145 SG::WriteHandle<xAOD::TruthParticleContainer> xTruthParticleContainer(m_xaodTruthParticleContainerKey, ctx);
146 ATH_CHECK(xTruthParticleContainer.record(std::make_unique<xAOD::TruthParticleContainer>(),
147 std::make_unique<xAOD::TruthParticleAuxContainer>()));
148 ATH_MSG_DEBUG( "Recorded TruthParticleContainer with key: " << m_xaodTruthParticleContainerKey.key() );
149 // Vertices
150 SG::WriteHandle<xAOD::TruthVertexContainer> xTruthVertexContainer(m_xaodTruthVertexContainerKey, ctx);
151 ATH_CHECK(xTruthVertexContainer.record(std::make_unique<xAOD::TruthVertexContainer>(),
152 std::make_unique<xAOD::TruthVertexAuxContainer>()));
153 ATH_MSG_DEBUG( "Recorded TruthVertexContainer with key: " << m_xaodTruthVertexContainerKey.key() );
154
155 // To keep track of whether we wrote an LHE event already or not
156#ifdef HEPMC3
157 bool hadLHERecord = false;
158#endif
159
160 // ***********************************************************************************
161 // Create the xAOD objects
162 // This consists of three parts:
163 // (1) For each Athena event, loop over the GenEvents and build TruthEvent collections
164 // In principle there can be more than one GenEvent per event
165 // (2) For each GenEvent, loop over the GenParticles. For each GenParticle:
166 // (a) Create a TruthParticle.
167 // (b) Call fillParticle
168 // (c) Add the TruthParticle to the TruthParticle container, and add
169 // an EL to this TruthParticle to the truthParticles in TruthEvent
170 // (call this EL eltp)
171 // (d) For the GenVertex * that's this particle's production vertex,
172 // (i) see if it is in tempMap. If not, add it.
173 // (ii) add a copy of eltp (the EL to this truth particle) to map[gv].second
174 // (e) For the GenVertex * that's this particle's decay vertex,
175 // (i) see if it is in tempMap. If not, add it.
176 // (ii) add a copy of eltp (the EL to this truth particle) to map[gv].first
177 // (3) Iterate over tempMap. For each GenVertex *:
178 // (a) Create a TruthVertex
179 // (b) Call fillVertex
180 // (c) Add the TruthVertex to the TruthTruth container, and add an EL to this TruthVertex
181 // to the truthVertices in TruthEvent. (call this EL eltv)
182 // (d) call tv->setIncomingParticles(mapiter.second.first) <- I think mapiter.second.first is the first of the pair
183 // (e) call tv->setOutgoingParticles(mapiter.second.second)
184 // (f) Iterate through the incomingParticles, and set the decay vertex EL as eltv.
185 // (g) Iterate through the outgoingParticles, and set the incoming vertex EL as eltv.
186 //
187 // Comment lines below follow this recipe
188 // ************************************************************************************
189
190 // (1) Build TruthEvents
191 ATH_MSG_DEBUG("Number of GenEvents in this Athena event = " << mcColl->size());
192#ifdef HEPMC3
193 bool newAttributesPresent(false);
194#endif
195 for (unsigned int cntr = 0; cntr < mcColl->size(); ++cntr) {
196 const HepMC::GenEvent* genEvt = (*mcColl)[cntr];
197 bool isSignalProcess(false);
198 if (cntr==0) {
199 isSignalProcess=true;
200#ifdef HEPMC3
201 auto bunchCrossingTime = genEvt->attribute<HepMC3::IntAttribute>("BunchCrossingTime");
202 if (bunchCrossingTime) {
203 newAttributesPresent = true;
204 ATH_MSG_VERBOSE("New attributes present.");
205 }
206 else {
207 ATH_MSG_VERBOSE("New attributes missing.");
208 }
209#else
210 ATH_MSG_VERBOSE("New attributes missing.");
211#endif
212 }
213 if (cntr>0) {
214 // Handle pile-up events
215 if (!m_doInTimePileUp && !m_doAllPileUp) break;
216 isSignalProcess=false;
217#ifdef HEPMC3
218 auto bunchCrossingTime = genEvt->attribute<HepMC3::IntAttribute>("BunchCrossingTime");
219 if (bunchCrossingTime) {
220 // New approach based on checking the bunch crossing
221 // time directly.
222 if (m_doInTimePileUp && std::abs(bunchCrossingTime->value()) > 0) {
223 // Skip out-of-time pile-up events
224 continue;
225 }
226 }
227 else {
228 // Old approach based on McEventCollection structure. If
229 // in-time pileup only is requested, loop stops when the
230 // separator GenEvent between out-of-time and in-time is
231 // reached
232 if (m_doInTimePileUp && isSeparatorGenEvent(genEvt)) {
233 if (newAttributesPresent) {
234 // Old structure with new Attributes?! Check all
235 // GenEvents just in case.
236 ATH_MSG_VERBOSE("New-style, but seeing separator GenEvents");
237 continue;
238 }
239 // Old structure - stop at the first separator
240 // GenEvent.
241 break;
242 }
243 }
244#else
245 // Old approach based on McEventCollection structure. If
246 // in-time pileup only is requested, loop stops when the
247 // separator GenEvent between out-of-time and in-time is
248 // reached
249 if (m_doInTimePileUp && isSeparatorGenEvent(genEvt)) {
250 // Old structure - stop at the first separator
251 // GenEvent.
252 break;
253 }
254#endif
255 }
256
257 xAOD::TruthEvent* xTruthEvent = nullptr;
258 xAOD::TruthPileupEvent* xTruthPileupEvent = nullptr;
259
260
261 if (isSignalProcess) {
262 xTruthEvent = xTruthEventContainer->push_back( std::make_unique<xAOD::TruthEvent>() );
263 // Cross-section
264 auto crossSection = genEvt->cross_section();
265#ifdef HEPMC3
266 xTruthEvent->setCrossSection(crossSection ? (float)crossSection->xsec() : -1);
267 xTruthEvent->setCrossSectionError(crossSection ? (float)crossSection->xsec_err() : -1);
268#else
269 xTruthEvent->setCrossSection(crossSection ? (float)crossSection->cross_section() : -1);
270 xTruthEvent->setCrossSectionError(crossSection ? (float)crossSection->cross_section_error() : -1);
271#endif
272
273 if (m_writeMetaData) {
274 //The mcChannelNumber is used as a unique identifier for which truth meta data belongs to
276 SG::ReadHandle<xAOD::EventInfo> evtInfo (m_evtInfo,ctx);
277 if (evtInfo.isValid()) {
278 mcChannelNumber = evtInfo->mcChannelNumber();
279 if (mcChannelNumber==0) mcChannelNumber = evtInfo->runNumber();
280 }
281 else {
282 ATH_MSG_FATAL("Faied to retrieve EventInfo");
283 return StatusCode::FAILURE;
284 }
285
286 ATH_CHECK( m_meta.maybeWrite (mcChannelNumber, *genEvt, m_metaFields) );
287 }
288 // Event weights
289 vector<float> weights;
290 for (const double& w : genEvt->weights()) weights.push_back((float)(w));
291 //AV This to be decided. It is always a good idea to have a default weight 1.0.
292 //if (weights.empty()) weights.push_back(1.0);
293 xTruthEvent->setWeights(weights);
294
295 // Heavy ion info
296 auto const hiInfo = genEvt->heavy_ion();
297 if (hiInfo) {
298#ifdef HEPMC3
299 /* Please note HepMC3 as well as more recent HePMC2 versions have more Hi parameters */
300 xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll_hard, xAOD::TruthEvent::NCOLLHARD);
301 xTruthEvent->setHeavyIonParameter(hiInfo->Npart_proj, xAOD::TruthEvent::NPARTPROJ);
302 xTruthEvent->setHeavyIonParameter(hiInfo->Npart_targ, xAOD::TruthEvent::NPARTTARG);
303 xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll, xAOD::TruthEvent::NCOLL);
304 xTruthEvent->setHeavyIonParameter(hiInfo->spectator_neutrons, xAOD::TruthEvent::SPECTATORNEUTRONS);
305 xTruthEvent->setHeavyIonParameter(hiInfo->spectator_protons, xAOD::TruthEvent::SPECTATORPROTONS);
306 xTruthEvent->setHeavyIonParameter(hiInfo->N_Nwounded_collisions, xAOD::TruthEvent::NNWOUNDEDCOLLISIONS);
307 xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_N_collisions, xAOD::TruthEvent::NWOUNDEDNCOLLISIONS);
308 xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_Nwounded_collisions, xAOD::TruthEvent::NWOUNDEDNWOUNDEDCOLLISIONS);
309 xTruthEvent->setHeavyIonParameter((float)hiInfo->impact_parameter, xAOD::TruthEvent::IMPACTPARAMETER);
310 xTruthEvent->setHeavyIonParameter((float)hiInfo->event_plane_angle, xAOD::TruthEvent::EVENTPLANEANGLE);
311 xTruthEvent->setHeavyIonParameter((float)hiInfo->eccentricity, xAOD::TruthEvent::ECCENTRICITY);
312 xTruthEvent->setHeavyIonParameter((float)hiInfo->sigma_inel_NN, xAOD::TruthEvent::SIGMAINELNN);
313#else
314 xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll_hard(), xAOD::TruthEvent::NCOLLHARD);
315 xTruthEvent->setHeavyIonParameter(hiInfo->Npart_proj(), xAOD::TruthEvent::NPARTPROJ);
316 xTruthEvent->setHeavyIonParameter(hiInfo->Npart_targ(), xAOD::TruthEvent::NPARTTARG);
317 xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll(), xAOD::TruthEvent::NCOLL);
318 xTruthEvent->setHeavyIonParameter(hiInfo->spectator_neutrons(), xAOD::TruthEvent::SPECTATORNEUTRONS);
319 xTruthEvent->setHeavyIonParameter(hiInfo->spectator_protons(), xAOD::TruthEvent::SPECTATORPROTONS);
320 xTruthEvent->setHeavyIonParameter(hiInfo->N_Nwounded_collisions(), xAOD::TruthEvent::NNWOUNDEDCOLLISIONS);
321 xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_N_collisions(), xAOD::TruthEvent::NWOUNDEDNCOLLISIONS);
322 xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_Nwounded_collisions(), xAOD::TruthEvent::NWOUNDEDNWOUNDEDCOLLISIONS);
323 xTruthEvent->setHeavyIonParameter(hiInfo->impact_parameter(), xAOD::TruthEvent::IMPACTPARAMETER);
324 xTruthEvent->setHeavyIonParameter(hiInfo->event_plane_angle(), xAOD::TruthEvent::EVENTPLANEANGLE);
325 xTruthEvent->setHeavyIonParameter(hiInfo->eccentricity(), xAOD::TruthEvent::ECCENTRICITY);
326 xTruthEvent->setHeavyIonParameter(hiInfo->sigma_inel_NN(), xAOD::TruthEvent::SIGMAINELNN);
327#endif
328 // This doesn't yet exist in our version of HepMC
329 // xTruthEvent->setHeavyIonParameter(hiInfo->centrality(),xAOD::TruthEvent::CENTRALITY);
330 }
331
332 // Parton density info
333 // This will exist 99% of the time, except for e.g. cosmic or particle gun simulation
334 auto const pdfInfo = genEvt->pdf_info();
335 if (pdfInfo) {
336#ifdef HEPMC3
337 xTruthEvent->setPdfInfoParameter(pdfInfo->parton_id[0], xAOD::TruthEvent::PDGID1);
338 xTruthEvent->setPdfInfoParameter(pdfInfo->parton_id[1], xAOD::TruthEvent::PDGID2);
339 xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id[1], xAOD::TruthEvent::PDFID1);
340 xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id[1], xAOD::TruthEvent::PDFID2);
341
342 xTruthEvent->setPdfInfoParameter((float)pdfInfo->x[0], xAOD::TruthEvent::X1);
343 xTruthEvent->setPdfInfoParameter((float)pdfInfo->x[1], xAOD::TruthEvent::X2);
344 xTruthEvent->setPdfInfoParameter((float)pdfInfo->scale, xAOD::TruthEvent::Q);
345 xTruthEvent->setPdfInfoParameter((float)pdfInfo->xf[0], xAOD::TruthEvent::XF1);
346 xTruthEvent->setPdfInfoParameter((float)pdfInfo->xf[1], xAOD::TruthEvent::XF2);
347#else
348 xTruthEvent->setPdfInfoParameter(pdfInfo->id1(), xAOD::TruthEvent::PDGID1);
349 xTruthEvent->setPdfInfoParameter(pdfInfo->id2(), xAOD::TruthEvent::PDGID2);
350 xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id1(), xAOD::TruthEvent::PDFID1);
351 xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id2(), xAOD::TruthEvent::PDFID2);
352
353 xTruthEvent->setPdfInfoParameter((float)pdfInfo->x1(), xAOD::TruthEvent::X1);
354 xTruthEvent->setPdfInfoParameter((float)pdfInfo->x2(), xAOD::TruthEvent::X2);
355 xTruthEvent->setPdfInfoParameter((float)pdfInfo->scalePDF(), xAOD::TruthEvent::Q);
356 xTruthEvent->setPdfInfoParameter((float)pdfInfo->pdf1(), xAOD::TruthEvent::XF1);
357 xTruthEvent->setPdfInfoParameter((float)pdfInfo->pdf2(), xAOD::TruthEvent::XF2);
358#endif
359 }
360
361 // Handle LHE particles, only supported for HEPMC3
362#ifdef HEPMC3
363 auto lhe_record_attribute = genEvt->attribute<HepMC::ShortEventAttribute>("LHERecord");
364
365 if (lhe_record_attribute && !hadLHERecord && !m_lheTruthParticleContainerKey.empty()){
366 hadLHERecord=true;
367 // The event had an LHE record, so let's record it. This will only happen once per event.
368 SG::WriteHandle<xAOD::TruthParticleContainer> xTruthLHEParticleContainer(m_lheTruthParticleContainerKey, ctx);
369 ATH_CHECK(xTruthLHEParticleContainer.record(std::make_unique<xAOD::TruthParticleContainer>(),
370 std::make_unique<xAOD::TruthParticleAuxContainer>()));
371 ATH_MSG_DEBUG( "Recorded TruthLHEParticleContainer with key: " << m_lheTruthParticleContainerKey.key() );
372 // The LHE record is stored in a struct with old-style LHE format, so we have to re-encode it
373 for (int nPart=0;nPart<lhe_record_attribute->NUP;++nPart) {
374 // Create TruthParticle
375 xAOD::TruthParticle* xTruthParticle = new xAOD::TruthParticle();
376 // Put particle into container;
377 xTruthLHEParticleContainer->push_back( xTruthParticle );
378 // Copy LHE info into the new particle; good description is in https://arxiv.org/abs/hep-ph/0609017
379 xTruthParticle->setPdgId( lhe_record_attribute->IDUP[nPart] );
380 xTruthParticle->setUid( nPart+1 );
381 xTruthParticle->setStatus( lhe_record_attribute->ISTUP[nPart] );
382 xTruthParticle->setPx( lhe_record_attribute->PUP[nPart][0] );
383 xTruthParticle->setPy( lhe_record_attribute->PUP[nPart][1] );
384 xTruthParticle->setPz( lhe_record_attribute->PUP[nPart][2] );
385 xTruthParticle->setE( lhe_record_attribute->PUP[nPart][3] );
386 xTruthParticle->setM( lhe_record_attribute->PUP[nPart][4] );
387 } // End of loop over particles
388 } // End of if we found the LHE record attribute
389 else if (hadLHERecord){
390 ATH_MSG_WARNING("Truth record appeared to have two LHE records; this should not be possible");
391 }
392#else
393 if (!m_lheTruthParticleContainerKey.empty()){
394 ATH_MSG_WARNING("HEPMC2 does not support LHE truth record storage. Skipping.");
395 }
396#endif
397 }else{//not isSignalProcess
398 xTruthPileupEvent = xTruthPileupEventContainer->push_back( std::make_unique<xAOD::TruthPileupEvent>() );
399 }
400
401 // (2) Build particles and vertices
402 // Map for building associations between particles and vertices
403 // The pair in the map is the (incomingParticles . outgoingParticles) of the given vertex
404 // If signal process vertex is a disconnected vertex (no incoming/outgoing particles), add it manually
405 VertexMap vertexMap;
406 VertexMap::iterator mapItr;
407 vector<HepMC::ConstGenVertexPtr> vertices;
408
409 // Check signal process vertex
410 // If this is a disconnected vertex, add it manually or won't be added from the loop over particles below.
411 auto disconnectedSignalProcessVtx = HepMC::signal_process_vertex(genEvt); // Get the signal process vertex
412 if (disconnectedSignalProcessVtx) {
413 if (disconnectedSignalProcessVtx->particles_in_size() == 0 && disconnectedSignalProcessVtx->particles_out_size() == 0 ) {
414 //This is a disconnected vertex, add it manually
415 vertices.push_back (std::move(disconnectedSignalProcessVtx));
416 }
417 } else {
418 ATH_MSG_WARNING("Signal process vertex pointer not valid in HepMC Collection for GenEvent #" << cntr << " / " << mcColl->size());
419 }
420
421 // Get the beam particles
422 pair<HepMC::ConstGenParticlePtr,HepMC::ConstGenParticlePtr> beamParticles;
423 bool genEvt_valid_beam_particles=false;
424#ifdef HEPMC3
425 auto beamParticles_vec = genEvt->beams();
426 genEvt_valid_beam_particles=(beamParticles_vec.size()>1);
427 if (genEvt_valid_beam_particles){beamParticles.first=beamParticles_vec[0]; beamParticles.second=beamParticles_vec[1]; }
428 // We want to process particles in barcode order.
429 auto bcmapatt = genEvt->attribute<HepMC::GenEventBarcodes>("barcodes"); // FIXME barcode-based
430 if (!bcmapatt) {
431 ATH_MSG_ERROR("TruthParticleCnvTool.cxx: Event does not contain barcodes attribute");
432 return StatusCode::FAILURE;
433 }
434 std::map<int, HepMC3::ConstGenParticlePtr> bcmap = bcmapatt->barcode_to_particle_map();
435 xTruthParticleContainer->reserve(bcmap.size());
436 for (const auto &[genPartBarcode,part]: bcmap) {
437#else
438 genEvt_valid_beam_particles=genEvt->valid_beam_particles();
439 if ( genEvt_valid_beam_particles ) beamParticles = genEvt->beam_particles();
440 xTruthParticleContainer->reserve(genEvt->particles_size());
441 for (auto part: *genEvt) {
442#endif
443 int genPartUniqueID = HepMC::uniqueID(part);
444 // (a) create TruthParticle
445 xAOD::TruthParticle* xTruthParticle = new xAOD::TruthParticle();
446 // (b) Put particle into container;
447 xTruthParticleContainer->push_back( xTruthParticle );
448 fillParticle(xTruthParticle, part); // (c) Copy HepMC info into the new particle
449 // (d) Build Event<->Particle element link
450 const ElementLink<xAOD::TruthParticleContainer> eltp(*xTruthParticleContainer, xTruthParticleContainer->size()-1);
451 if (isSignalProcess) xTruthEvent->addTruthParticleLink(eltp);
452 if (!isSignalProcess) xTruthPileupEvent->addTruthParticleLink(eltp);
453
454 // Create link between HepMC and xAOD truth
455 if (isSignalProcess) truthLinkVec->push_back(new xAODTruthParticleLink(HepMcParticleLink(genPartUniqueID,0,HepMcParticleLink::IS_POSITION, HepMcParticleLink::IS_ID), eltp));
456 if (!isSignalProcess) truthLinkVec->push_back(new xAODTruthParticleLink(HepMcParticleLink(genPartUniqueID,genEvt->event_number(), HepMcParticleLink::IS_EVENTNUM, HepMcParticleLink::IS_ID), eltp));
457
458 // Is this one of the beam particles?
459 if (genEvt_valid_beam_particles) {
460 if (isSignalProcess) {
461 if (part == beamParticles.first) xTruthEvent->setBeamParticle1Link(eltp);
462 if (part == beamParticles.second) xTruthEvent->setBeamParticle2Link(eltp);
463 }
464 }
465 // (e) Particle's production vertex
466 auto productionVertex = part->production_vertex();
467 // Skip the dummy vertex that HepMC3 adds
468 // Can distinguish it from real vertices because it has
469 // a null event pointer.
470 if (productionVertex && productionVertex->parent_event() != nullptr) {
471 VertexParticles& parts = vertexMap[productionVertex];
472 if (parts.incoming.empty() && parts.outgoing.empty())
473 vertices.push_back (std::move(productionVertex));
474 parts.outgoingEL.push_back(eltp);
475 parts.outgoing.push_back(xTruthParticle);
476 }
477 //
478 // else maybe want to keep track that this is the production vertex
479 //
480 // (f) Particle's decay vertex
481 auto decayVertex = part->end_vertex();
482 if (decayVertex) {
483 VertexParticles& parts = vertexMap[decayVertex];
484 if (parts.incoming.empty() && parts.outgoing.empty())
485 vertices.push_back (std::move(decayVertex));
486 parts.incomingEL.push_back(eltp);
487 parts.incoming.push_back(xTruthParticle);
488 }
489
490 } // end of loop over particles
491
492 // (3) Loop over the map
493 auto signalProcessVtx = HepMC::signal_process_vertex(genEvt); // Get the signal process vertex
494 xTruthVertexContainer->reserve(vertices.size());
495 for (const auto& vertex : vertices) {
496 const auto& parts = vertexMap[vertex];
497 // (a) create TruthVertex
498 xAOD::TruthVertex* xTruthVertex = new xAOD::TruthVertex();
499 // (b) Put particle into container (so has store)
500 xTruthVertexContainer->push_back( xTruthVertex );
501 fillVertex(xTruthVertex, vertex); // (c) Copy HepMC info into the new vertex
502 // (d) Build Event<->Vertex element link
503 ElementLink<xAOD::TruthVertexContainer> eltv(*xTruthVertexContainer, xTruthVertexContainer->size()-1);
504 // Mark if this is the signal process vertex
505 if (vertex == signalProcessVtx && isSignalProcess) xTruthEvent->setSignalProcessVertexLink(eltv);
506 if (isSignalProcess) xTruthEvent->addTruthVertexLink(eltv);
507 if (!isSignalProcess) xTruthPileupEvent->addTruthVertexLink(eltv);
508 // (e) Assign incoming particles to the vertex, from the map
509 xTruthVertex->setIncomingParticleLinks( parts.incomingEL );
510 // (f) Assign outgoing particles to the vertex, from the map
511 xTruthVertex->setOutgoingParticleLinks( parts.outgoingEL );
512 // (g) Set Particle<->Vertex links for incoming particles
513 for (xAOD::TruthParticle* p : parts.incoming) p->setDecayVtxLink(eltv);
514 // (h) Set Particle<->Vertex links for incoming particles
515 for (xAOD::TruthParticle* p : parts.outgoing) p->setProdVtxLink(eltv);
516 } //end of loop over vertices
517
518 } // end of loop over McEventCollection
519
520
521 std::stable_sort(truthLinkVec->begin(), truthLinkVec->end(), SortTruthParticleLink());
522 ATH_MSG_VERBOSE("Summarizing truth link size: " << truthLinkVec->size() );
523
524 return StatusCode::SUCCESS;
525 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
SG::WriteHandleKey< xAOD::TruthVertexContainer > m_xaodTruthVertexContainerKey
Gaudi::Property< bool > m_doAllPileUp
Pile-up options.
SG::WriteHandleKey< xAOD::TruthParticleContainer > m_lheTruthParticleContainerKey
SG::WriteHandleKey< xAODTruthParticleLinkVector > m_truthLinkContainerKey
SG::ReadHandleKey< McEventCollection > m_aodContainerKey
The key of the input AOD truth container.
static void fillVertex(xAOD::TruthVertex *tv, const HepMC::ConstGenVertexPtr &gv)
These functions do not set up ELs, just the other variables.
SG::WriteHandleKey< xAOD::TruthParticleContainer > m_xaodTruthParticleContainerKey
Gaudi::Property< bool > m_writeMetaData
option to disable writing of metadata (e.g. if running a filter on xAOD in generators)
std::map< HepMC::ConstGenVertexPtr, VertexParticles > VertexMap
Convenience handle for a map of vtx ptrs -> connected particles.
SG::ReadHandleKey< xAOD::EventInfo > m_evtInfo
Event Info.
Gaudi::Property< bool > m_doInTimePileUp
static void fillParticle(xAOD::TruthParticle *tp, const HepMC::ConstGenParticlePtr &gp)
SG::WriteHandleKey< xAOD::TruthEventContainer > m_xaodTruthEventContainerKey
The key for the output xAOD truth containers.
SG::WriteHandleKey< xAOD::TruthPileupEventContainer > m_xaodTruthPUEventContainerKey
void addTruthVertexLink(const TruthVertexLink_t &vlink)
Add one truth vertex.
void addTruthParticleLink(const TruthParticleLink_t &plink)
Add one truth particle.
void setWeights(const std::vector< float > &weights)
Set the event weights.
void setSignalProcessVertexLink(const TruthVertexLink_t &link)
Set pointer to a vertex representing the primary beam interaction point.
void setCrossSectionError(float value)
Set the cross-section error.
void setCrossSection(float value)
Set the cross-section.
bool setHeavyIonParameter(int value, HIParam parameter)
Set an integer HI parameter.
bool setPdfInfoParameter(int value, PdfParam parameter)
Set an integer PDF info parameter.
@ NWOUNDEDNWOUNDEDCOLLISIONS
[int]
void setBeamParticle1Link(const TruthParticleLink_t &pcl1)
Set one incoming beam particle.
void setBeamParticle2Link(const TruthParticleLink_t &pcl2)
Set one incoming beam particle.
void setPy(float value)
Set the y component of the particle's momentum.
void setUid(int value)
Set unique ID.
void setM(float value)
Also store the mass.
void setE(float value)
Set the energy of the particle.
void setPz(float value)
Set the z component of the particle's momentum.
void setStatus(int value)
Set status code.
void setPdgId(int pid)
Set PDG ID code.
void setPx(float value)
Set the x component of the particle's momentum.
void setOutgoingParticleLinks(const TPLinks_t &links)
Set all the outgoing particles.
void setIncomingParticleLinks(const TPLinks_t &links)
Set all the incoming particles.
int uniqueID(const T &p)
GenVertex * signal_process_vertex(const GenEvent *e)
Definition GenEvent.h:627
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.
TruthVertex_v1 TruthVertex
Typedef to implementation.
Definition TruthVertex.h:15
TruthEvent_v1 TruthEvent
Typedef to implementation.
Definition TruthEvent.h:17
TruthParticle_v1 TruthParticle
Typedef to implementation.
TruthPileupEvent_v1 TruthPileupEvent
Typedef to implementation.
setEventNumber uint32_t
Type for tracking particles connected to a single vertex.
bool isSeparatorGenEvent(const HepMC::GenEvent *genEvt)

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ fillParticle()

void xAODMaker::xAODTruthCnvAlg::fillParticle ( xAOD::TruthParticle * tp,
const HepMC::ConstGenParticlePtr & gp )
staticprivate

Definition at line 589 of file xAODTruthCnvAlg.cxx.

589 {
590 tp->setPdgId(gp->pdg_id());
591 tp->setUid(HepMC::uniqueID(gp)); // FIXME set xAOD::TruthParticle function name appropriately
592 tp->setStatus(HepMC::status(gp)); // For now convert the status back to the old scheme
593
594 auto pol = HepMC::polarization(gp);
595 if (pol.is_defined()) {
596 tp->setPolarizationParameter(pol.theta(), xAOD::TruthParticle::polarizationTheta);
597 tp->setPolarizationParameter(pol.phi(), xAOD::TruthParticle::polarizationPhi);
598 }
599
600 tp->setM(gp->generated_mass());
601 tp->setPx(gp->momentum().px());
602 tp->setPy(gp->momentum().py());
603 tp->setPz(gp->momentum().pz());
604 tp->setE(gp->momentum().e());
605 }
@ polarizationPhi
Polarization in ( )
@ polarizationTheta
Polarization in ( )
int status(const T &p)
Polarization polarization(const T &a)

◆ fillVertex()

void xAODMaker::xAODTruthCnvAlg::fillVertex ( xAOD::TruthVertex * tv,
const HepMC::ConstGenVertexPtr & gv )
staticprivate

These functions do not set up ELs, just the other variables.

Definition at line 577 of file xAODTruthCnvAlg.cxx.

577 {
578 // id was renamed to status in HepMC3.
579 tv->setStatus(HepMC::status(gv)); // For now convert the status back to the old scheme
580 tv->setUid(HepMC::uniqueID(gv)); // FIXME set xAOD::TruthVertex function name appropriately
581 tv->setX(gv->position().x());
582 tv->setY(gv->position().y());
583 tv->setZ(gv->position().z());
584 tv->setT(gv->position().t());
585 }
void setStatus(int value)
Set the vertex status.
void setZ(float value)
Set the vertex's longitudinal distance from the origin.
void setUid(int value)
Set the vertex unique ID.
void setT(float value)
Set the vertex time.
void setX(float value)
Set the x displacement of the vertex.
void setY(float value)
Set the y displacement of the vertex.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ handle()

void xAODMaker::xAODTruthCnvAlg::handle ( const Incident & incident)
overridevirtual

Incident handler.

Definition at line 527 of file xAODTruthCnvAlg.cxx.

527 {
528 if (m_firstBeginRun && incident.type()==IncidentType::BeginRun) {
529 m_firstBeginRun = false;
530 ServiceHandle<StoreGateSvc> inputStore("StoreGateSvc/InputMetaDataStore", name());
531 if(inputStore.retrieve().isFailure()) {
532 ATH_MSG_ERROR("Failed to retrieve Input Metadata Store");
533 return;
534 }
535 const IOVMetaDataContainer* tagInfo{nullptr};
536 if(inputStore->retrieve(tagInfo,"/TagInfo").isFailure()) {
537 ATH_MSG_WARNING("Failed to retrieve /TagInfo metadata from the input store");
538 return;
539 }
540 if(tagInfo->payloadContainer()->size()>0) {
541 CondAttrListCollection* tagInfoPayload = tagInfo->payloadContainer()->at(0);
542 if(tagInfoPayload->size()>0) {
543 const CondAttrListCollection::AttributeList& al = tagInfoPayload->attributeList(0);
544 if (al.exists("lhefGenerator")){
545 m_metaFields.lhefGenerator = al["lhefGenerator"].data<std::string>();
546 }
547
548 if (al.exists("generators")){
549 m_metaFields.generators = al["generators"].data<std::string>();
550 }
551
552 if (al.exists("evgenProcess")){
553 m_metaFields.evgenProcess = al["evgenProcess"].data<std::string>();
554 }
555
556 if (al.exists("evgenTune")){
557 m_metaFields.evgenTune = al["evgenTune"].data<std::string>();
558 }
559
560 if (al.exists("hardPDF")){
561 m_metaFields.hardPDF = al["hardPDF"].data<std::string>();
562 }
563
564 if (al.exists("softPDF")){
565 m_metaFields.softPDF = al["softPDF"].data<std::string>();
566 }
567 }
568 }
569 else {
570 ATH_MSG_WARNING("Empty Tag Info metadata!");
571 }
572 }
573 }
static Double_t al
const AttributeList & attributeList(ChanNum chanNum) const
attribute list for a given channel number
size_type size() const
number of Chan/AttributeList pairs
coral::AttributeList AttributeList
const IOVPayloadContainer * payloadContainer() const
Access to payload container.
size_type size() const
size of payload vector
CondAttrListCollection * at(unsigned int i) const
Element access.

◆ initialize()

StatusCode xAODMaker::xAODTruthCnvAlg::initialize ( )
overridevirtual

Function initialising the algorithm.

Definition at line 65 of file xAODTruthCnvAlg.cxx.

65 {
67 ATH_MSG_FATAL( "Contradictory xAOD truth pile-up setting: all pile-up AND in-time alone requested simultaneously. Check settings." );
68 return StatusCode::FAILURE;
69 }
70
71 if (m_writeMetaData) {
72 ATH_CHECK( m_meta.initialize (m_metaStore, m_metaName) );
73 }
74
75 // initialize handles
77
78 // only if doing full truth
79 ATH_CHECK(m_aodContainerKey.initialize());
86 }
87
88 ATH_CHECK(m_evtInfo.initialize());
89
90 ServiceHandle<IIncidentSvc> incSvc("IncidentSvc", name());
91 ATH_CHECK(incSvc.retrieve());
92 incSvc->addListener( this, "BeginRun", 10);
93
94 ATH_MSG_DEBUG("AODContainerName = " << m_aodContainerKey.key() );
95 ATH_MSG_DEBUG("xAOD TruthEventContainer name = " << m_xaodTruthEventContainerKey.key() );
96 ATH_MSG_DEBUG("xAOD TruthPileupEventContainer name = " << m_xaodTruthPUEventContainerKey.key() );
97 ATH_MSG_DEBUG("xAOD TruthParticleContainer name = " << m_xaodTruthParticleContainerKey.key() );
98 ATH_MSG_DEBUG("xAOD TruthVertexContainer name = " << m_xaodTruthVertexContainerKey.key() );
100 ATH_MSG_DEBUG("xAOD TruthLHEParticleContainer name = " << m_lheTruthParticleContainerKey.key() );
101 }
102
103 if (m_doAllPileUp) ATH_MSG_INFO( "All pile-up truth (including out-of-time) will be written" );
104 if (m_doInTimePileUp) ATH_MSG_INFO( "In-time pile-up truth (but not out-of-time) will be written" );
105 if (!m_doAllPileUp && !m_doInTimePileUp) ATH_MSG_INFO( "No pile-up truth will be written" );
106
107 return StatusCode::SUCCESS;
108 }
#define ATH_MSG_INFO(x)

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ ATLAS_THREAD_SAFE

MetaDataWriter m_meta xAODMaker::xAODTruthCnvAlg::ATLAS_THREAD_SAFE
mutableprivate

Helper for writing to the meta data store.

This factors out the pieces that are non-const. It's declared mutable and protected with a mutex.

Definition at line 154 of file xAODTruthCnvAlg.h.

◆ m_aodContainerKey

SG::ReadHandleKey<McEventCollection> xAODMaker::xAODTruthCnvAlg::m_aodContainerKey
private
Initial value:
{
this, "AODContainerName", "GEN_AOD", "The input McEvenCollection"}

The key of the input AOD truth container.

Definition at line 130 of file xAODTruthCnvAlg.h.

130 {
131 this, "AODContainerName", "GEN_AOD", "The input McEvenCollection"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doAllPileUp

Gaudi::Property<bool> xAODMaker::xAODTruthCnvAlg::m_doAllPileUp {this, "WriteAllPileUpTruth", false}
private

Pile-up options.

Definition at line 148 of file xAODTruthCnvAlg.h.

148{this, "WriteAllPileUpTruth", false};

◆ m_doInTimePileUp

Gaudi::Property<bool> xAODMaker::xAODTruthCnvAlg::m_doInTimePileUp {this, "WriteInTimePileUpTruth", false}
private

Definition at line 149 of file xAODTruthCnvAlg.h.

149{this, "WriteInTimePileUpTruth", false};

◆ m_evtInfo

SG::ReadHandleKey<xAOD::EventInfo> xAODMaker::xAODTruthCnvAlg::m_evtInfo {this, "EventInfo", "EventInfo", "" }
private

Event Info.

Definition at line 165 of file xAODTruthCnvAlg.h.

165{this, "EventInfo", "EventInfo", "" };

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_firstBeginRun

bool xAODMaker::xAODTruthCnvAlg::m_firstBeginRun
private

Tag Info.

Definition at line 168 of file xAODTruthCnvAlg.h.

◆ m_lheTruthParticleContainerKey

SG::WriteHandleKey<xAOD::TruthParticleContainer> xAODMaker::xAODTruthCnvAlg::m_lheTruthParticleContainerKey
private
Initial value:
{
this, "xAODTruthLHEParticleContainerName", "", "Output TruthLHEParticles container"}

Definition at line 144 of file xAODTruthCnvAlg.h.

144 {
145 this, "xAODTruthLHEParticleContainerName", "", "Output TruthLHEParticles container"};

◆ m_metaFields

MetadataFields xAODMaker::xAODTruthCnvAlg::m_metaFields
private

Definition at line 169 of file xAODTruthCnvAlg.h.

◆ m_metaName

std::string xAODMaker::xAODTruthCnvAlg::m_metaName
private

SG key and name for meta data.

Definition at line 159 of file xAODTruthCnvAlg.h.

◆ m_metaStore

ServiceHandle< StoreGateSvc > xAODMaker::xAODTruthCnvAlg::m_metaStore
private

Connection to the metadata store.

Definition at line 157 of file xAODTruthCnvAlg.h.

◆ m_truthLinkContainerKey

SG::WriteHandleKey<xAODTruthParticleLinkVector> xAODMaker::xAODTruthCnvAlg::m_truthLinkContainerKey
private
Initial value:
{
this, "TruthLinks", "xAODTruthLinks", "Output xAODTruthLinks container"}

Definition at line 142 of file xAODTruthCnvAlg.h.

142 {
143 this, "TruthLinks", "xAODTruthLinks", "Output xAODTruthLinks container"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_writeMetaData

Gaudi::Property<bool> xAODMaker::xAODTruthCnvAlg::m_writeMetaData {this, "WriteTruthMetaData", true}
private

option to disable writing of metadata (e.g. if running a filter on xAOD in generators)

Definition at line 162 of file xAODTruthCnvAlg.h.

162{this, "WriteTruthMetaData", true};

◆ m_xaodTruthEventContainerKey

SG::WriteHandleKey<xAOD::TruthEventContainer> xAODMaker::xAODTruthCnvAlg::m_xaodTruthEventContainerKey
private
Initial value:
{
this, "xAODTruthEventContainerName", "TruthEvents", "Output TruthEvents container"}

The key for the output xAOD truth containers.

Definition at line 134 of file xAODTruthCnvAlg.h.

134 {
135 this, "xAODTruthEventContainerName", "TruthEvents", "Output TruthEvents container"};

◆ m_xaodTruthParticleContainerKey

SG::WriteHandleKey<xAOD::TruthParticleContainer> xAODMaker::xAODTruthCnvAlg::m_xaodTruthParticleContainerKey
private
Initial value:
{
this, "xAODTruthParticleContainerName", "TruthParticles", "Output TruthParticles container"}

Definition at line 138 of file xAODTruthCnvAlg.h.

138 {
139 this, "xAODTruthParticleContainerName", "TruthParticles", "Output TruthParticles container"};

◆ m_xaodTruthPUEventContainerKey

SG::WriteHandleKey<xAOD::TruthPileupEventContainer> xAODMaker::xAODTruthCnvAlg::m_xaodTruthPUEventContainerKey
private
Initial value:
{
this, "xAODTruthPileupEventContainerName", "TruthPileupEvents", "Output TruthPileupEvents container"}

Definition at line 136 of file xAODTruthCnvAlg.h.

136 {
137 this, "xAODTruthPileupEventContainerName", "TruthPileupEvents", "Output TruthPileupEvents container"};

◆ m_xaodTruthVertexContainerKey

SG::WriteHandleKey<xAOD::TruthVertexContainer> xAODMaker::xAODTruthCnvAlg::m_xaodTruthVertexContainerKey
private
Initial value:
{
this, "xAODTruthVertexContainerName", "TruthVertices", "Output TruthVertices container"}

Definition at line 140 of file xAODTruthCnvAlg.h.

140 {
141 this, "xAODTruthVertexContainerName", "TruthVertices", "Output TruthVertices container"};

The documentation for this class was generated from the following files: