16#include "GaudiKernel/ThreadLocalContext.h"
47 const std::string& name,
48 const IInterface* parent ) :
49 base_class(
type, name, parent ),
58 declareProperty(
"DataType",
60 "Type of data we are dealing with (Full/Fast/Truth...)" );
62 declareProperty(
"TruthIsolationTool",
64 "Pointer to the TruthIsolationTool to be able to compute "
65 "transverse energy isolations for various isolation cones cuts. "
66 "See McParticleEvent/TruthParticleParameters.h for cone cuts." );
69 declareProperty(
"DoEtIsolations",
71 "Switch to compute or not the Et-isolations for TruthParticle "
72 "(and their underlying @c HepMC::GenParticle).\n"
73 "Default is to not compute these Et-isolations (and save CPU)." );
77 declareProperty(
"SelectSignalType",
79 "Switch to select different type of signal\n"
81 " hard scatter plus minbias 1\n"
83 "Default is hard scatter only." );
85 declareInterface<ITruthParticleCnvTool>(
this);
119 (
" DoEtIsolations: [" << std::boolalpha
126 return StatusCode::SUCCESS;
131 return execute (Gaudi::Hive::currentContext());
141 ATH_CHECK(mcPartsOutputWriteHandle.
record(std::make_unique<TruthParticleContainer>()));
143 if (!mcPartsOutputWriteHandle.
isValid()){
145 return StatusCode::FAILURE;
151 if (!mcEventsReadHandle.
isValid()){
156 <<
"] will be EMPTY !!");
157 return StatusCode::RECOVERABLE;
160 ATH_MSG_DEBUG(
" Found McEventCollection of size = "<< mcEventsReadHandle->size() );
164 std::size_t genEventIndex = 0;
166 bool all_good =
true;
172 ATH_MSG_DEBUG(
" Found McEventCollection iterators : "<< (fEvt-mcEventsReadHandle->begin()) <<
" to "<< (lEvt-mcEventsReadHandle->begin()) );
178 if (
nullptr == evt) {
181 genEventIndex = (it - mcEventsReadHandle->begin());
185 if (!this->
convert( mcEventsReadHandle.
ptr(), genEventIndex, mcPartsOutputWriteHandle.
ptr(), dummyVisitor ).isSuccess()) {
193 mcPartsOutputWriteHandle->setGenEvent( mcEventsReadHandle.
ptr(), (fEvt - mcEventsReadHandle->begin() ) );
197 ? StatusCode::SUCCESS
198 : StatusCode::RECOVERABLE;
208 const unsigned int genEventIndex,
212 ATH_MSG_DEBUG(
"Converting McEventCollection to TruthParticleContainer");
215 if (
nullptr == mcCollection ) {
217 return StatusCode::RECOVERABLE;
220 if ( mcCollection->
size() <= genEventIndex ) {
223 <<
"Requested element nbr : " << genEventIndex <<
" !!");
224 return StatusCode::RECOVERABLE;
227 IProxyDict* sg = SG::CurrentEventStore::store();
230 ATH_MSG_DEBUG(
"Retrieve the GenEvent from given McEventCollection");
232 container->setGenEvent( mcCollection, genEventIndex, sg );
235 container->reserve( container->size() + evt->particles_size() );
244 ATH_MSG_ERROR(
"TruthParticleCnvTool.cxx: Event does not contain barcodes attribute");
245 return StatusCode::FAILURE;
248 for (
const auto &[bc,hepMcPart]: bcmap) {
251 container->push_back( mcPart );
254 visitor->
visit( mcPart );
261 ATH_MSG_ERROR(
"TruthParticle is not wrapping the GenParticle : "
262 << hepMcPart <<
" !!");
265 bcToMcPart[ mcLink.
compress() ] = mcPart;
271 container->setParticles( bcToMcPart );
276 const std::string& etIsolName
278 if ( etIsolName.empty() ) {
280 "TruthEtIsolations container (requested: ["
281 << container->genEventName() <<
"])");
282 return StatusCode::RECOVERABLE;
286 if ( !evtStore()->retrieve( etIsols, etIsolName ).isSuccess() ) {
287 ATH_MSG_WARNING(
"Could not retrieve the TruthEtIsolations container at ["
288 << etIsolName <<
"] !!");
289 return StatusCode::RECOVERABLE;
294 container->setEtIsolations( etIsols, genEventIndex );
297 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
ATLAS-specific HepMC functions.
DataModel_detail::const_iterator< DataVector > const_iterator
size_type size() const noexcept
Returns the number of elements in the collection.
std::map< int, ConstGenParticlePtr > barcode_to_particle_map() const
a link optimized in size for a GenParticle in a McEventCollection
barcode_type compress() const
Hash the 32 bit barcode and 16 bit eventindex into a 32bit int.
virtual void visit(TruthParticle *truthParticle) const =0
The method to visit a TruthParticle to apply further modifications to the instance at hand.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
virtual int pdgId() const
Return enum indicating particle id the enum file is available in Event/EventKernel/PdtPdg....
PileuType_t
define some Pile-up classification Important : this classification is copied in McParticleAlgs/python...
static void findEventIterators(PileuType_t putype, McEventCollection::const_iterator &fEvt, McEventCollection::const_iterator &lEvt)
Find interval [fEvt,lEvt] containing all GenEvents of type putype from the McEventCollection.
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
pointer_type ptr()
Dereference the pointer.
int m_selectSignalTypeProp
Type of truth particle we want to create (property to be set by jobO).
virtual ~TruthParticleCnvTool()
Destructor:
TruthParticleCnvTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
SG::WriteHandleKey< TruthParticleContainer > m_mcPartsOutputWriteHandleKey
Output TruthParticle WriteHandleKey (built from the McEventCollection).
ToolHandle< ITruthIsolationTool > IsolTool_t
virtual StatusCode execute() const override
ParticleDataType::DataType m_dataType
Type of data we are dealing with (Full/Fast/Truth/...).
IsolTool_t m_isolationTool
Pointer to the ITruthIsolationTool to be able to retrieve the previously computed transverse energy i...
void setDataType(const int type)
Inline methods:
virtual StatusCode initialize() override
Athena Algorithm's Hooks.
PileUpClassification::PileuType_t m_selectSignalType
Type of truth particle we want to create.
StatusCode convert(const McEventCollection *mcEvts, const unsigned int genEvtIndex, TruthParticleContainer *mcParts, const ITruthParticleVisitor *visitor) const override
Converts a McEventCollection into an TruthParticleContainer (ie: converts it into an AOD compliant co...
std::string m_vxCandidatesName
BooleanProperty m_doEtIsolation
Switch to compute or not the Et-isolations for TruthParticle (and their underlying HepMC::GenParticle...
SG::ReadHandleKey< McEventCollection > m_mcEventsReadHandleKey
ReadHandleKey for the McEventCollection the TruthParticles will be made from.
std::unordered_map< long, const TruthParticle * > Map_t
barcode to TruthParticle dictionary
(HepMC) Monte Carlo particle.
void setGenEventIndex(size_t index)
set the GenEvent index
HepMC::ConstGenParticlePtr genParticle() const
Retrieve the GenParticle this TruthParticle has been made from (if any).
void setCharge(const ChargeType charge)
Set the charge of this TruthParticle.
int signal_process_id(const GenEvent &evt)
HepMC3::GenEvent GenEvent
double charge(const T &p)
Information about type of data used to fill particle.