17#include "GaudiKernel/MsgStream.h"
30constexpr int NKEYS = 5;
32std::string s_keys[NKEYS] = {
"TruthEvent",
"G4Truth",
"GEN_AOD",
"GEN_EVENT",
"Bkg_TruthEvent"};
42std::atomic<unsigned> s_hint = NKEYS;
45const unsigned short CPTRMAXMSGCOUNT = 100;
62 static const char codes[
EBC_NSUPP] = {
'a',
'b'};
64 return codes[suppEnum];
80 log << MSG::ERROR <<
" Wrong truth Suppression Char (" << std::string(&suppChar,1) <<
") set in HepMcParticleLink ExtendedBarCode object !!!" <<
endmsg;
91 os <<
"Event index " ;
95 os << position <<
" (position in collection) ";
98 os << event_number <<
" (event number) ";
100 os <<
", Unique ID " ;
102 uniqueID (particle_id, particle_barcode);
103 if (particle_barcode == 0 && particle_id == 0) {
104 os <<
" 0 (id/barcode) ";
107 os << particle_barcode <<
" (barcode) ";
110 os << particle_id <<
" (id) ";
112 os <<
", McEventCollection "
122 std::ostringstream
ss;
154 if (part !=
nullptr && positionFlag ==
IS_POSITION) {
161 log << MSG::WARNING <<
"cptr: McEventCollection not found" <<
endmsg;
181 const bool is_valid =
m_ptr.isValid();
192 <<
"cptr: no truth particle associated with this hit (barcode==0)."
193 <<
" Probably this is a noise hit" <<
endmsg;
199 sg = SG::CurrentEventStore::store();
205 if (event_number == 0) {
206 pEvt = pEvtColl->at(0);
209 if (position < pEvtColl->
size()) {
210 pEvt = pEvtColl->at (position);
215 log << MSG::WARNING <<
"cptr: position = " << position <<
", McEventCollection size = "<< pEvtColl->size() <<
endmsg;
221 pEvt = pEvtColl->find (event_number);
224 if (
nullptr != pEvt) {
228 m_extBarcode.makeIndex (pEvt->event_number(), position);
230 if (event_number == 0) {
231 m_extBarcode.makeIndex (pEvt->event_number(), position);
241 if (genParticleID > -1) {
251 const auto &particles = pEvt->particles();
252 if (particle_id-1 < particles.size()) {
265 <<
"cptr: Mc Truth not stored for event at " << position
269 <<
"cptr: Mc Truth not stored for event with event number " << event_number
275 log << MSG::WARNING <<
"cptr: McEventCollection not found" <<
endmsg;
318 return int(particle_barcode);
350 if (event_position < coll->
size()) {
351 pEvt = coll->at (event_position);
354 const int genEventNumber = pEvt->event_number();
359 if (genEventNumber > -1) {
360 event_number =
static_cast<index_type>(genEventNumber);
399 if (event_number == 0) {
424std::vector<HepMcParticleLink::index_type>
427 std::vector<index_type> positions; positions.reserve(1);
428 const int int_event_number =
static_cast<int>(event_number);
430 size_t sz = coll->size();
431 for (
size_t i = 0; i <
sz; i++) {
432 if ((*coll)[i]->event_number() == int_event_number) {
433 positions.push_back(i);
437 if (positions.empty() ) {
451 if (position < coll->
size()) {
452 return coll->at (position)->event_number();
457 log << MSG::WARNING <<
"getEventNumberAtPosition: position = " << position <<
", McEventCollection size = "<< coll->size() <<
endmsg;
491 return redirectedLink;
501 m_store = SG::CurrentEventStore::store();
520 log << MSG::WARNING <<
"cptr: McEventCollection not found" <<
endmsg;
534 unsigned int hint_orig = s_hint.load(std::memory_order_relaxed);
535 if (hint_orig >= NKEYS) hint_orig = 0;
536 unsigned int hint = hint_orig;
540 if (hint != s_hint.load(std::memory_order_relaxed)) {
541 s_hint.store(hint, std::memory_order_relaxed);
543 static std::once_flag log_flag;
544 std::call_once(log_flag, [hint]() {
546 log << MSG::INFO <<
"find_proxy: Using " << s_keys[hint]
547 <<
" as McEventCollection key for this job " <<
endmsg;
552 if (hint >= NKEYS) hint = 0;
553 }
while (hint != hint_orig);
556 static std::atomic<unsigned long> msgCount {0};
557 unsigned int count = ++msgCount;
558 if (
count <= CPTRMAXMSGCOUNT) {
559 log << MSG::WARNING <<
"find_proxy: No Valid MC event Collection found "
562 if (
count == CPTRMAXMSGCOUNT) {
563 log << MSG::WARNING <<
"find_proxy: suppressing further messages about valid MC event Collection. Use \n"
564 <<
" msgSvc.setVerbose += [HepMcParticleLink]\n"
565 <<
"to see all messages" <<
endmsg;
567 if (
count > CPTRMAXMSGCOUNT) {
568 log << MSG::VERBOSE <<
"find_proxy: No Valid MC event Collection found "
580 static const std::string unset =
"CollectionNotSet";
581 unsigned idx = s_hint;
597 link.m_extBarcode.print(os);
610 link.m_extBarcode.print(os);
uint32_t CLID
The Class ID type.
std::ostream & operator<<(std::ostream &os, const HepMcParticleLink &link)
Output operator.
size_t size() const
Number of registered mappings.
void print(char *figname, TCanvas *c1)
Persistent representation of a link.
void print(std::ostream &os) const
Dump in textual format to a stream.
static char truthSuppressionTypeAsChar(EBC_SUPPRESSED_TRUTH suppEnum)
Translate truth suppression enum to a char ('a'..'b').
static EBC_SUPPRESSED_TRUTH truthSuppressionTypeFromChar(char suppChar)
Translate truth suppression char ('a'..'b') to an enum.
static constexpr index_type UNDEFINED
All 1's. Used to represent an undefined index/position.
void uniqueID(barcode_type &id, barcode_type &barcode) const
Return the GenParticle id/barcode.
static constexpr barcode_type UNDEFINEDBC
EBC_SUPPRESSED_TRUTH getTruthSuppressionType() const
Return whether the truth particle has been suppressed, as an enum.
void setExtendedBarCode(const ExtendedBarCode &extBarcode)
Alter the persistent part of the link.
int id() const
Return the id of the target particle.
bool linkIsNull() const
return true if neither barcode nor id are valid
static const McEventCollection * retrieveMcEventCollection(const IProxyDict *sg)
Look up the event collection we're targeting.
static SG::DataProxy * find_proxy(const IProxyDict *sg)
Find the proxy for the target event collection.
HepMC::ConstGenParticlePtr cptr() const
Dereference.
HepMcParticleLink(IProxyDict *sg=nullptr)
Default constructor.
ExtendedBarCode m_extBarcode
Persistent part: barcode and location of target GenEvent.
static std::string getLastEventCollectionName()
Return the most recent SG key used for a particular collection type.
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 int getEventNumberAtPosition(index_type position, const IProxyDict *sg)
Return the event number of the GenEvent at the specified position in the McEventCollection.
index_type eventIndex() const
Return the event number of the referenced GenEvent.
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.
int barcode() const
Return the barcode of the target particle.
IProxyDict * m_store
Pointer to the store containing the event.
void setTruthSuppressionType(EBC_SUPPRESSED_TRUTH truthSupp)
Return whether the truth particle has been suppressed.
ATH_NO_UNIQUE_ADDRESS CxxUtils::CachedValue< HepMC::ConstGenParticlePtr > m_ptr
Transient part. Pointer to the particle.
virtual SG::DataProxy * proxy(const CLID &id, const std::string &key) const =0
Get proxy with given id and key.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
singleton-like access to IMessageSvc via open function and helper
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
IMessageSvc * getMessageSvc(bool quiet=false)
IProxyDict * proxyDictFromEventContext()
Return the IProxyDict for this thread's current context.
ConstGenParticlePtr barcode_to_particle(const GenEvent *e, int id)
HepMC3::ConstGenParticlePtr ConstGenParticlePtr
HepMC3::GenEvent GenEvent
DATA * DataProxy_cast(DataProxy *proxy)
cast the proxy into the concrete data object it proxies
static constexpr CLID ID()