|
ATLAS Offline Software
|
Go to the documentation of this file.
16 #include "GaudiKernel/MsgStream.h"
29 constexpr
int NKEYS = 5;
31 std::string s_keys[NKEYS] = {
"TruthEvent",
"G4Truth",
"GEN_AOD",
"GEN_EVENT",
"Bkg_TruthEvent"};
41 std::atomic<unsigned> s_hint = NKEYS;
44 const unsigned short CPTRMAXMSGCOUNT = 100;
63 return codes[suppEnum];
79 log << MSG::ERROR <<
" Wrong truth Suppression Char (" << std::string(&suppChar,1) <<
") set in HepMcParticleLink ExtendedBarCode object !!!" <<
endmsg;
90 os <<
"Event index " ;
94 os << position <<
" (position in collection) ";
97 os << event_number <<
" (event number) ";
99 os <<
", Unique ID " ;
101 uniqueID (particle_id, particle_barcode);
102 if (particle_barcode == 0 && particle_id == 0) {
103 os <<
" 0 (id/barcode) ";
105 else if (particle_barcode != UNDEFINEDBC) {
106 os << particle_barcode <<
" (barcode) ";
109 os << particle_id <<
" (id) ";
111 os <<
", McEventCollection "
121 std::ostringstream
ss;
155 const HepMC::GenEvent *pEvt = pEvtColl->at (
eventIndex);
160 log << MSG::WARNING <<
"cptr: McEventCollection not found" <<
endmsg;
191 <<
"cptr: no truth particle associated with this hit (barcode==0)."
192 <<
" Probably this is a noise hit" <<
endmsg;
201 const HepMC::GenEvent *pEvt =
nullptr;
204 if (event_number == 0) {
205 pEvt = pEvtColl->at(0);
208 if (position < pEvtColl->
size()) {
209 pEvt = pEvtColl->at (position);
214 log << MSG::WARNING <<
"cptr: position = " << position <<
", McEventCollection size = "<< pEvtColl->size() <<
endmsg;
220 pEvt = pEvtColl->find (event_number);
223 if (
nullptr != pEvt) {
229 if (event_number == 0) {
240 if (genParticleID > -1) {
251 const auto &
particles = pEvt->particles();
272 <<
"cptr: Mc Truth not stored for event at " << position
276 <<
"cptr: Mc Truth not stored for event with event number " << event_number
282 log << MSG::WARNING <<
"cptr: McEventCollection not found" <<
endmsg;
325 return int(particle_barcode);
355 const HepMC::GenEvent* pEvt{};
357 if (event_position < coll->
size()) {
358 pEvt = coll->at (event_position);
361 const int genEventNumber = pEvt->event_number();
366 if (genEventNumber > -1) {
367 event_number =
static_cast<index_type>(genEventNumber);
406 if (event_number == 0) {
419 std::vector<HepMcParticleLink::index_type>
422 std::vector<index_type> positions; positions.reserve(1);
423 const int int_event_number =
static_cast<int>(event_number);
425 size_t sz = coll->size();
426 for (
size_t i = 0;
i <
sz;
i++) {
427 if ((*coll)[
i]->event_number() == int_event_number) {
428 positions.push_back(
i);
432 if (positions.empty() ) {
446 if (position < coll->
size()) {
447 return coll->at (position)->event_number();
452 log << MSG::WARNING <<
"getEventNumberAtPosition: position = " << position <<
", McEventCollection size = "<< coll->size() <<
endmsg;
476 return redirectedLink;
502 pEvtColl = SG::DataProxy_cast<McEventCollection> (
proxy);
505 log << MSG::WARNING <<
"cptr: McEventCollection not found" <<
endmsg;
519 unsigned int hint_orig = s_hint;
520 if (hint_orig >= NKEYS) hint_orig = 0;
521 unsigned int hint = hint_orig;
525 if (hint != s_hint) {
528 static std::atomic<unsigned> findCount {0};
529 if(++findCount == 1) {
531 log << MSG::INFO <<
"find_proxy: Using " << s_keys[hint]
532 <<
" as McEventCollection key for this job " <<
endmsg;
537 if (hint >= NKEYS) hint = 0;
538 }
while (hint != hint_orig);
541 static std::atomic<unsigned long> msgCount {0};
542 unsigned int count = ++msgCount;
543 if (
count <= CPTRMAXMSGCOUNT) {
544 log << MSG::WARNING <<
"find_proxy: No Valid MC event Collection found "
547 if (
count == CPTRMAXMSGCOUNT) {
548 log << MSG::WARNING <<
"find_proxy: suppressing further messages about valid MC event Collection. Use \n"
549 <<
" msgSvc.setVerbose += [HepMcParticleLink]\n"
550 <<
"to see all messages" <<
endmsg;
552 if (
count > CPTRMAXMSGCOUNT) {
553 log <<
MSG::VERBOSE <<
"find_proxy: No Valid MC event Collection found "
565 static const std::string unset =
"CollectionNotSet";
566 unsigned idx = s_hint;
std::ostream & operator<<(std::ostream &os, const HepMcParticleLink &link)
Output operator.
bool linkIsNull() const
return true if neither barcode nor id are valid
void reset()
Reset the value to invalid.
void makeIndex(index_type index, index_type position) const
Change index from position to number.
const T * ptr() const
Return a pointer to the cached value.
void uniqueID(barcode_type &id, barcode_type &barcode) const
Return the GenParticle id/barcode.
virtual SG::DataProxy * proxy(const CLID &id, const std::string &key) const =0
Get proxy with given id and key.
singleton-like access to IMessageSvc via open function and helper
constexpr static index_type UNDEFINED
All 1's. Used to represent an undefined index/position.
static SG::DataProxy * find_proxy(const IProxyDict *sg)
Find the proxy for the target event collection.
bool isValid() const
Test to see if the value is valid.
HepMcParticleLink(IProxyDict *sg=nullptr)
Default constructor.
ExtendedBarCode m_extBarcode
Persistent part: barcode and location of target GenEvent.
void print(std::ostream &os) const
Dump in textual format to a stream.
static IProxyDict * store()
Fetch the current store.
int barcode() const
Return the barcode of the target particle.
static int getEventNumberAtPosition(index_type position, const IProxyDict *sg)
Return the event number of the GenEvent at the specified position in the McEventCollection.
bool linkIsNull() const
return true if neither barcode nor id are valid
int id() const
Return the id of the target particle.
void setTruthSuppressionType(EBC_SUPPRESSED_TRUTH truthSupp)
Return whether the truth particle has been suppressed.
IMessageSvc * getMessageSvc(bool quiet=false)
static const McEventCollection * retrieveMcEventCollection(const IProxyDict *sg)
Look up the event collection we're targeting.
static char truthSuppressionTypeAsChar(EBC_SUPPRESSED_TRUTH suppEnum)
Translate truth suppression enum to a char ('a'..'b').
HepMC::ConstGenParticlePtr cptr() const
Dereference.
static const CLID & ID()
the CLID of T
dictionary codes
helper to get a human-readable string
ATH_NO_UNIQUE_ADDRESS CxxUtils::CachedValue< HepMC::ConstGenParticlePtr > m_ptr
Transient part. Pointer to the particle.
a link optimized in size for a GenParticle in a McEventCollection
static std::string getLastEventCollectionName()
Return the most recent SG key used for a particular collection type.
GenParticle * barcode_to_particle(const GenEvent *e, int id)
void setExtendedBarCode(const ExtendedBarCode &extBarcode)
Alter the persistent part of the link.
Persistent representation of a link.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objects.
uint32_t CLID
The Class ID type.
void makeID(barcode_type ID, barcode_type barcode) const
Change m_BC from barcode to ID.
index_type eventIndex() const
Return the event number of the referenced GenEvent.
const GenParticle * ConstGenParticlePtr
static std::vector< index_type > getEventPositionInCollection(index_type index, const IProxyDict *sg)
Return a vector of the positions in the McEventCollection of the GenEvent(s) with a given event numbe...
static HepMcParticleLink getRedirectedLink(const HepMcParticleLink &particleLink, uint32_t eventIndex, const EventContext &ctx)
Return a HepMcParticleLink pointing at the same particle, but in a different GenEvent.
IProxyDict * m_store
Pointer to the store containing the event.
EBC_SUPPRESSED_TRUTH getTruthSuppressionType() const
Return whether the truth particle has been suppressed, as an enum.
void set(const T &val) const
Set the value, assuming it is currently invalid.
constexpr static barcode_type UNDEFINEDBC
barcode_type uid() const
Unique ID of target variable (0 for a null link).
void print(std::FILE *stream, std::format_string< Args... > fmt, Args &&... args)
static EBC_SUPPRESSED_TRUTH truthSuppressionTypeFromChar(char suppChar)
Translate truth suppression char ('a'..'b') to an enum.
void eventIndex(index_type &index, index_type &position) const
Return the event index/position.
thread_local event_number_t eventIndex