ATLAS Offline Software
Loading...
Searching...
No Matches
Athena::RootNtupleEventSelector Class Reference

Class implementing the GAUDI IEvtSelector interface using ROOT TTree as a backend. More...

#include <RootNtupleEventSelector.h>

Inheritance diagram for Athena::RootNtupleEventSelector:
Collaboration diagram for Athena::RootNtupleEventSelector:

Public Member Functions

 RootNtupleEventSelector (const std::string &name, ISvcLocator *svcLoc)
 Constructor with parameters:
virtual ~RootNtupleEventSelector ()
 Destructor:
virtual StatusCode initialize () override
virtual StatusCode stop () override
virtual StatusCode finalize () override
virtual void handle (const Incident &incident) override
virtual StatusCode io_reinit () override
 Callback method to reinitialize the internal state of the component for I/O purposes (e.g.
virtual int size (Context &refCtxt) const override
 ICollectionSize interface
virtual StatusCode createContext (Context *&refpCtxt) const override
virtual StatusCode last (Context &refContext) const override
virtual StatusCode next (Context &refCtxt) const override
virtual StatusCode next (Context &refCtxt, int jump) const override
virtual StatusCode previous (Context &refCtxt) const override
virtual StatusCode previous (Context &refCtxt, int jump) const override
virtual StatusCode rewind (Context &refCtxt) const override
virtual StatusCode createAddress (const Context &refCtxt, IOpaqueAddress *&) const override
virtual StatusCode releaseContext (Context *&refCtxt) const override
virtual StatusCode resetCriteria (const std::string &cr, Context &ctx) const override
virtual StatusCode seek (Context &refCtxt, int evtnum) const override
 Seek to a given event number.
virtual int curEvent (const Context &refCtxt) const override
 return the current event number.
virtual StatusCode preLoadAddresses (StoreID::type storeID, tadList &list) override
virtual StatusCode loadAddresses (StoreID::type storeID, tadList &list) override
 get all new addresses from Provider for this Event.
virtual StatusCode updateAddress (StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx) override
 update a transient Address

Private Member Functions

StatusCode endInputFile (RootNtupleEventContext *rctx) const
void setupInputCollection (Gaudi::Details::PropertyBase &inputCollectionsName)
 callback to synchronize the list of input files
StatusCode createRootBranchAddresses (StoreID::type storeID, tadList &tads)
 helper method to create proxies
TTree * fetchNtuple (const std::string &fname, const std::string &tupleName) const
 helper method to retrieve the correct tuple
void addMetadataFromDirectoryName (const std::string &metadirname, TFile *fileObj, const std::string &prefix="") const
void addMetadataFromDirectory (TDirectoryFile *metadir, const std::string &prefix="") const
void addMetadata (TTree *metatree, const std::string &path="") const
void addMetadata (TObjString *metastring, const std::string &path="") const
StatusCode createMetaDataRootBranchAddresses (StoreGateSvc *store, TTree *tree, const std::string &prefix) const
 helper method to create proxies for the metadata store
StatusCode do_init_io ()
 helper method to init the i/o components

Private Attributes

std::vector< std::vector< CollMetaData > > m_collEvts
 helper method to get the collection index (into m_inputCollectionsName) and tuple index (into m_tupleNames') for a given event index evtidx`.
TTree * m_tuple
 current tree being read
bool m_needReload
 The (python) selection function to apply on the TChain we are reading.
std::optional< InputFileIncidentGuardm_inputFileGuard
 RAII guard: guarantees a matching EndInputFile for every BeginInputFile.
bool m_fireBIF {true}
 Flag to fire BeginInputFile on the next BeginEvent incident.
std::vector< TFile * > m_files

Friends

class Athena::RootNtupleEventContext

Detailed Description

Class implementing the GAUDI IEvtSelector interface using ROOT TTree as a backend.

Definition at line 48 of file RootNtupleEventSelector.h.

Constructor & Destructor Documentation

◆ RootNtupleEventSelector()

Athena::RootNtupleEventSelector::RootNtupleEventSelector ( const std::string & name,
ISvcLocator * svcLoc )

Constructor with parameters:

Definition at line 222 of file RootNtupleEventSelector.cxx.

223 :
224 extends ( name, svcLoc ),
225 m_dataStore( "StoreGateSvc/StoreGateSvc", name ),
226 m_imetaStore( "StoreGateSvc/InputMetaDataStore", name ),
227 m_ometaStore( "StoreGateSvc/MetaDataStore", name ),
228 m_clidsvc ( "ClassIDSvc", name ),
229 m_dictsvc ( "AthDictLoaderSvc", name ),
230 m_incsvc ( "IncidentSvc", name ),
231 m_nbrEvts ( 0 ),
232 m_curEvt ( 0 ),
233 m_collEvts ( ),
234 m_tuple (NULL),
235 m_needReload (true)
236{
237 declareProperty( "DataStore",
238 m_dataStore,
239 "Store where to publish data");
240
241 declareProperty( "InputMetaStore",
242 m_imetaStore,
243 "Store where to publish (input) metadata");
244
245 declareProperty( "MetaStore",
246 m_ometaStore,
247 "Store where to publish (output) metadata");
248
249 declareProperty( "InputCollections",
250 m_inputCollectionsName,
251 "List of input (ROOT) file names" );
252 m_inputCollectionsName.declareUpdateHandler
254
255 declareProperty( "TupleName",
256 m_tupleName = "CollectionTree",
257 "Name of the TTree to load/read from input file(s). "
258 "May be a semicolon-separated string to read multiple TTrees.");
259
260 declareProperty( "SkipEvents",
261 m_skipEvts = 0,
262 "Number of events to skip at the beginning" );
263
264 declareProperty( "ActiveBranches",
265 m_activeBranchNames,
266 "List of branch names to activate" );
267}
void setupInputCollection(Gaudi::Details::PropertyBase &inputCollectionsName)
callback to synchronize the list of input files
TTree * m_tuple
current tree being read
std::vector< std::vector< CollMetaData > > m_collEvts
helper method to get the collection index (into m_inputCollectionsName) and tuple index (into m_tuple...
bool m_needReload
The (python) selection function to apply on the TChain we are reading.

◆ ~RootNtupleEventSelector()

Athena::RootNtupleEventSelector::~RootNtupleEventSelector ( )
virtual

Destructor:

Definition at line 271 of file RootNtupleEventSelector.cxx.

272{}

Member Function Documentation

◆ addMetadata() [1/2]

void Athena::RootNtupleEventSelector::addMetadata ( TObjString * metastring,
const std::string & path = "" ) const
private

Definition at line 1214 of file RootNtupleEventSelector.cxx.

1215{
1216 std::string *converted = new std::string(metastring->String());
1217 if (!m_imetaStore->record(converted, path).isSuccess()) {
1218 ATH_MSG_INFO("Could not create metadata for string [" << path << "]");
1219 }
1220}
#define ATH_MSG_INFO(x)

◆ addMetadata() [2/2]

void Athena::RootNtupleEventSelector::addMetadata ( TTree * metatree,
const std::string & path = "" ) const
private

Definition at line 1202 of file RootNtupleEventSelector.cxx.

1203{
1204 if (metatree->GetEntry(0) < 0) {
1205 ATH_MSG_INFO("Problem retrieving data from metadata-tree [" << path << "] !!");
1206 return;
1207 }
1208
1209 if (!createMetaDataRootBranchAddresses(m_imetaStore.get(), metatree, path).isSuccess()) {
1210 ATH_MSG_INFO("Could not create metadata for tree [" << path << "]");
1211 }
1212}
StatusCode createMetaDataRootBranchAddresses(StoreGateSvc *store, TTree *tree, const std::string &prefix) const
helper method to create proxies for the metadata store

◆ addMetadataFromDirectory()

void Athena::RootNtupleEventSelector::addMetadataFromDirectory ( TDirectoryFile * metadir,
const std::string & prefix = "" ) const
private

Definition at line 1160 of file RootNtupleEventSelector.cxx.

1161{
1162 std::unordered_set<std::string> meta_keys;
1163 const TList *keys = metadir->GetListOfKeys();
1164 for (Int_t i=0; i < keys->GetSize(); ++i) {
1165 TKey* key = dynamic_cast<TKey*>(keys->At(i));
1166 if (!key) {
1167 continue;
1168 }
1169
1170 const std::string meta_key = key->GetName();
1171 if (!meta_keys.emplace(key->GetName()).second) {
1172 // key was already in the set:
1173 // meta_key is another cycle from a previous key entry.
1174 // *ASSUME* the highest cycle is the one we are interested in
1175 // *AND* that it was the previous one...
1176 continue;
1177 }
1178
1179 std::string fullPrefix(prefix);
1180 if (prefix != "") fullPrefix += "/";
1181 const std::string path = fullPrefix + key->GetName();
1182
1183 TString fullKeyName(TString::Format("%s;%hi", key->GetName(), key->GetCycle()));
1184 TObject *objRef = metadir->Get(fullKeyName);
1185
1186 TTree *metatree = dynamic_cast<TTree*>(objRef);
1187 if (metatree) {
1188 addMetadata(metatree, path);
1189 continue;
1190 }
1191
1192 TObjString *metaObjString = dynamic_cast<TObjString*>(objRef);
1193 if (metaObjString) {
1194 addMetadata(metaObjString, path);
1195 continue;
1196 }
1197
1198 ATH_MSG_WARNING("Unsupported metadata type: " << objRef->ClassName());
1199 }
1200}
#define ATH_MSG_WARNING(x)
void addMetadata(TTree *metatree, const std::string &path="") const
path
python interpreter configuration --------------------------------------—
Definition athena.py:130

◆ addMetadataFromDirectoryName()

void Athena::RootNtupleEventSelector::addMetadataFromDirectoryName ( const std::string & metadirname,
TFile * fileObj,
const std::string & prefix = "" ) const
private

Definition at line 1153 of file RootNtupleEventSelector.cxx.

1154{
1155 TDirectoryFile *metadir = (TDirectoryFile*)fileObj->Get(metadirname.c_str());
1156 if (!metadir) return;
1157 addMetadataFromDirectory(metadir, prefix);
1158}
void addMetadataFromDirectory(TDirectoryFile *metadir, const std::string &prefix="") const

◆ createAddress()

StatusCode Athena::RootNtupleEventSelector::createAddress ( const Context & refCtxt,
IOpaqueAddress *&  ) const
overridevirtual

Definition at line 671 of file RootNtupleEventSelector.cxx.

673{
674 //std::cerr << "::TTES::createAddress()...\n";
675 return StatusCode::SUCCESS;
676}

◆ createContext()

StatusCode Athena::RootNtupleEventSelector::createContext ( Context *& refpCtxt) const
overridevirtual

IEvtSelector interface

Definition at line 663 of file RootNtupleEventSelector.cxx.

664{
666 refCtx = ctx;
667 return StatusCode::SUCCESS;
668}

◆ createMetaDataRootBranchAddresses()

StatusCode Athena::RootNtupleEventSelector::createMetaDataRootBranchAddresses ( StoreGateSvc * store,
TTree * tree,
const std::string & prefix ) const
private

helper method to create proxies for the metadata store

Definition at line 978 of file RootNtupleEventSelector.cxx.

981{
982 if (0 == store) {
983 ATH_MSG_ERROR("null pointer to store !");
984 return StatusCode::FAILURE;
985 }
986
987 if (0 == tree) {
988 ATH_MSG_ERROR("null pointer to n-tuple !");
989 return StatusCode::FAILURE;
990 }
991
992 // Record tree in Storegate for later writing
993 TransferTree* temp = new TransferTree(tree);
994 if (store->record(temp,prefix).isFailure()) ATH_MSG_ERROR("Unable to record metadata tree " << tree->GetName());
995
996 const std::string tree_name = tree->GetName();
997 TObjArray *branches = tree->GetListOfBranches();
998 if (!branches) {
999 ATH_MSG_INFO("no branches!!");
1000 return StatusCode::SUCCESS;
1001 }
1002
1003 // loop over branches
1004 for (Int_t i = 0; i < branches->GetEntries(); ++i) {
1005 TBranch *branch = (TBranch *)branches->At(i);
1006 if (branch) {
1007
1008 CLID id = 0;
1009 const void* value_ptr = tree;
1010 const std::string type_name = branch->GetClassName();
1011 const std::string br_name = branch->GetName();
1012 const std::string sg_key = prefix.empty()
1013 ? br_name
1014 : prefix + "/" + br_name;
1015 TClass *cls = NULL;
1016 if (!type_name.empty()) {
1017 cls = TClass::GetClass(type_name.c_str());
1018 }
1019 const std::type_info *ti = 0;
1020
1021 if (cls) {
1022 ti = cls->GetTypeInfo();
1023 // first, try to load a dict for that class...
1024 if (ti) {
1025 m_dictsvc->load_type(*ti);
1026 }
1027 if (!ti) {
1028 ATH_MSG_WARNING("could not find a type-info for [" <<
1029 type_name << "]");
1030 continue;
1031 }
1032 std::string ti_typename = System::typeinfoName(*ti);
1033 if (!m_clidsvc->getIDOfTypeInfoName(ti_typename, id)
1034 .isSuccess()) {
1035 // try another one...
1036 {
1037 // Protect against data race inside TClassEdit.
1038 // https://github.com/root-project/root/issues/10353
1039 // Should be fixed in root 6.26.02.
1040 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
1041 ti_typename = TClassEdit::ShortType(ti_typename.c_str(),
1042 TClassEdit::kDropAllDefault);
1043 }
1044 if (!m_clidsvc->getIDOfTypeInfoName(ti_typename, id)
1045 .isSuccess()) {
1046 ATH_MSG_INFO("** could not find a CLID from type-info ["
1047 << System::typeinfoName(*ti) << "]");
1048 ATH_MSG_INFO("** could not find a CLID from type-info-alias ["
1049 << ti_typename << "]");
1050 continue;
1051 }
1052 }
1053 } else {
1054 // probably a built-in type...
1055 TObjArray *leaves = branch->GetListOfLeaves();
1056 if (leaves &&
1057 leaves->GetEntries() == 1) {
1058 const std::string type_name = ((TLeaf*)leaves->At(0))->GetTypeName();
1059 if (!m_clidsvc->getIDOfTypeName(::root_typename(type_name), id)
1060 .isSuccess()) {
1061 ATH_MSG_INFO("** could not find a CLID for type-name ["
1062 << type_name << "]");
1063 continue;
1064 }
1065 }
1066 }
1067 if (id == 0) {
1068 ATH_MSG_INFO("** could not find a CLID for type-name ["
1069 << type_name << "]");
1070 continue;
1071 }
1072 CxxUtils::RefCountedPtr<Athena::RootBranchAddress> addr
1073 (new Athena::RootBranchAddress
1074 (ROOT_StorageType, id,
1075 tree_name,
1076 br_name,
1077 (unsigned long)(value_ptr),
1078 (unsigned long)(0)));
1079 if (!store->recordAddress(sg_key, std::move(addr), true).isSuccess()) {
1080 ATH_MSG_ERROR("could not record address at [" << sg_key << "] in store ["
1081 << store->name() << "]");
1082 }
1083 // SG::TransientAddress* taddr = new SG::TransientAddress
1084 // (id, sg_key, addr);
1085 // taddr->setProvider(this);
1086 // taddr->clearAddress(true);
1087 // tads.push_back(taddr);
1088 }
1089 }
1090 return StatusCode::SUCCESS;
1091}
#define ATH_MSG_ERROR(x)
uint32_t CLID
The Class ID type.
void record(const T *p, const std::string &key)
Definition TestStore.h:81
virtual const std::string & name() const override
Definition TestStore.cxx:97
TestStore store
Definition TestStore.cxx:23
TChain * tree

◆ createRootBranchAddresses()

StatusCode Athena::RootNtupleEventSelector::createRootBranchAddresses ( StoreID::type storeID,
tadList & tads )
private

helper method to create proxies

Definition at line 871 of file RootNtupleEventSelector.cxx.

873{
874 if (storeID != StoreID::EVENT_STORE) {
875 ATH_MSG_INFO("-- not the event-store --");
876 return(StatusCode::SUCCESS);
877 }
878
879 if (0 == m_tuple) {
880 ATH_MSG_ERROR("null pointer to n-tuple !");
881 return StatusCode::FAILURE;
882 }
883
884 TObjArray *leaves = m_tuple->GetListOfLeaves();
885 if (!leaves) {
886 ATH_MSG_INFO("no leaves!!");
887 return StatusCode::SUCCESS;
888 }
889
890 // loop over leaves
891 for (Int_t i = 0; i < leaves->GetEntries(); ++i) {
892 TLeaf *leaf = (TLeaf *)leaves->At(i);
893 TBranch *branch = leaf->GetBranch();
894 if (branch) {
895
896 CLID id = 0;
897 const void* value_ptr = m_tuple;
898 const std::string type_name = leaf->GetTypeName();
899 const std::string br_name = branch->GetName();
900 const std::string sg_key = br_name;//m_tupleName.value()+"/"+br_name;
901 TClass *cls = TClass::GetClass(type_name.c_str());
902 const std::type_info *ti = 0;
903
904 if (cls) {
905 ti = cls->GetTypeInfo();
906 // first, try to load a dict for that class...
907 if (ti) {
908 m_dictsvc->load_type(*ti);
909 }
910 if (!ti) {
911 ATH_MSG_WARNING("could not find a type-info for [" <<
912 type_name << "]");
913 continue;
914 }
915 std::string ti_typename = System::typeinfoName(*ti);
916 if (!m_clidsvc->getIDOfTypeInfoName(ti_typename, id)
917 .isSuccess()) {
918 // try another one...
919 {
920 // Protect against data race inside TClassEdit.
921 // https://github.com/root-project/root/issues/10353
922 // Should be fixed in root 6.26.02.
923 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
924 ti_typename = TClassEdit::ShortType(ti_typename.c_str(),
925 TClassEdit::kDropAllDefault);
926 }
927 if (!m_clidsvc->getIDOfTypeInfoName(ti_typename, id)
928 .isSuccess()) {
929 ATH_MSG_DEBUG("** could not find a CLID from type-info ["
930 << System::typeinfoName(*ti) << "]");
931 ATH_MSG_DEBUG("** could not find a CLID from type-info-alias ["
932 << ti_typename << "]");
933 continue;
934 }
935 }
936 } else {
937 // probably a built-in type...
938 if (!m_clidsvc->getIDOfTypeName(::root_typename(type_name), id)
939 .isSuccess()) {
940 ATH_MSG_DEBUG("** could not find a CLID for type-name ["
941 << type_name << "]");
942 continue;
943 }
944 }
945 if (id == 0) {
946 ATH_MSG_DEBUG("** could not find a CLID for type-name ["
947 << type_name << "]");
948 continue;
949 }
950 Athena::RootBranchAddress* addr = new Athena::RootBranchAddress
951 (ROOT_StorageType, id,
952 m_tuple->GetName(),
953 br_name,
954 (unsigned long)(value_ptr),
955 (unsigned long)(m_curEvt-1));
956
957 // recycle old rootaddress, if any.
958 SG::DataProxy* proxy = m_dataStore->proxy (id, sg_key);
959 if (proxy) {
960 proxy->setAddress (addr);
961 }
962 else {
963 auto taddr = new SG::TransientAddress(id, sg_key, addr, false);
964 taddr->setProvider(this, storeID);
965 // only add the *new* TransientAddress to the input list as the *old* ones
966 // are already tracked by the datastore (via the sticky proxies)
967 tads.push_back(taddr);
968 }
969 }
970 }
971 m_needReload = false;
972 // BeginInputFile is deferred to handle() on BeginEvent — see comment there.
973
974 return StatusCode::SUCCESS;
975}
#define ATH_MSG_DEBUG(x)
@ EVENT_STORE
Definition StoreID.h:26

◆ curEvent()

int Athena::RootNtupleEventSelector::curEvent ( const Context & refCtxt) const
overridevirtual

return the current event number.

Returns
The current event number.

Definition at line 754 of file RootNtupleEventSelector.cxx.

755{
756 return m_curEvt;
757}

◆ do_init_io()

StatusCode Athena::RootNtupleEventSelector::do_init_io ( )
private

helper method to init the i/o components

Definition at line 1223 of file RootNtupleEventSelector.cxx.

1224{
1225 // std::cout << "::fetchNtuple..." << std::endl;
1226
1227 // initialize some helper structures and data
1228 {
1229 CollMetaData zero;
1230 zero.min_entries = -1;
1231 zero.max_entries = -1;
1232 zero.entries = -1;
1233 m_collEvts.resize (m_tupleNames.size());
1234 for (size_t i = 0; i < m_collEvts.size(); i++) {
1235 m_collEvts[i].resize(m_inputCollectionsName.value().size(), zero);
1236 }
1237 }
1238
1239 m_tuple = fetchNtuple(m_inputCollectionsName.value()[0],
1240 m_tupleNames[0]);
1241 if (!m_tuple) {
1242 throw "RootNtupleEventSelector: Unable to fetch Ntuple";
1243 }
1244
1245 // std::cout << "::clear-root-addresses..." << std::endl;
1246 // reset the list of branches
1247 m_needReload = true;
1248
1249 // skip events we are asked to skip
1250 m_curEvt = m_skipEvts;
1251 m_nbrEvts = 0;
1252
1253 // std::cout << "::fetchNtuple...[done]" << std::endl;
1254 return StatusCode::SUCCESS;
1255}
TTree * fetchNtuple(const std::string &fname, const std::string &tupleName) const
helper method to retrieve the correct tuple
void zero(TH2 *h)
zero the contents of a 2d histogram

◆ endInputFile()

StatusCode Athena::RootNtupleEventSelector::endInputFile ( RootNtupleEventContext * rctx) const
private

Definition at line 433 of file RootNtupleEventSelector.cxx.

434{
435 // Fire EndInputFile via guard reset
436 m_inputFileGuard.reset();
437
438 // prepare for next file, if any...
439 // std::cout << "=========================================================="
440 // << std::endl;
441 // std::cerr << "::switch to next file...\n";
442
443 // iterate over proxies and
444 // mark as garbage and drop the RootBranchAddress (as a side effect of
445 // ::setAddress(NULL).
446 // this way, the next time we hit ::createRootBranchAddress or ::updateAddress
447 // all internal states are kosher.
448 for (const SG::DataProxy* cdp : m_dataStore->proxies()) {
449 if (dynamic_cast<Athena::RootBranchAddress*> (cdp->address()) != nullptr) {
450 if (SG::DataProxy* dp = m_dataStore->proxy_exact (cdp->sgkey())) {
451 dp->setAddress (nullptr);
452 }
453 }
454 }
455
456 const bool forceRemove = false;
457 CHECK( m_dataStore->clearStore(forceRemove) ); //must clear the storegate so that any tampering user did in EndInputFile incident is cleared
458 m_needReload = true;
459 // Defer BeginInputFile for the next file to the next BeginEvent.
460 // The actual file name is resolved in handle() from m_tuple.
461 m_fireBIF = true;
462
463 return StatusCode::SUCCESS;
464}
#define CHECK(...)
Evaluate an expression and check for errors.
bool m_fireBIF
Flag to fire BeginInputFile on the next BeginEvent incident.
std::optional< InputFileIncidentGuard > m_inputFileGuard
RAII guard: guarantees a matching EndInputFile for every BeginInputFile.

◆ fetchNtuple()

TTree * Athena::RootNtupleEventSelector::fetchNtuple ( const std::string & fname,
const std::string & tupleName ) const
private

helper method to retrieve the correct tuple

Definition at line 1094 of file RootNtupleEventSelector.cxx.

1096{
1097 // std::cout << "::fetchNtuple(" << fname << ")..." << std::endl;
1098 TTree* tree = NULL;
1099 RootGlobalsRestore rgr;
1100 // std::cout << "::TFile::Open()..." << std::endl;
1101 TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject(fname.c_str());
1102 TFile* fnew = nullptr;
1103 if (!f) {
1104 f = TFile::Open(fname.c_str(), "READ");
1105 fnew = f;
1106 if (f) {
1107 f->SetName(fname.c_str());
1108 }
1109 }
1110 if (!f || f->IsZombie()) {
1111 ATH_MSG_ERROR("could not open next file in input collection ["
1112 << fname << "]");
1113 if (f) {
1114 f->Close();
1115 }
1116 return tree;
1117 }
1118 // std::cout << "::TFile::GetTree(" << m_tupleName << ")..." << std::endl;
1119 tree = (TTree*)f->Get(tupleName.c_str());
1120 if (!tree) {
1121 ATH_MSG_ERROR("could not retrieve tree [" << tupleName << "]"
1122 << " from file [" << fname << "]");
1123 f->Close();
1124 return tree;
1125 }
1126
1127 if (fnew)
1128 m_files.push_back(fnew);
1129
1130 // std::cout << "::TTree::SetBranchStatus()..." << std::endl;
1131 // disable all branches
1132 tree->SetBranchStatus("*", 0);
1133 if (!m_eventNumberVar.value().empty()) {
1134 tree->SetBranchStatus(m_eventNumberVar.value().c_str(), 1);
1135 }
1136 if (!m_runNumberVar.value().empty()) {
1137 tree->SetBranchStatus(m_runNumberVar.value().c_str(), 1);
1138 }
1139 if (!m_lbnVar.value().empty()) {
1140 tree->SetBranchStatus(m_lbnVar.value().c_str(), 1);
1141 }
1142
1143 if (!m_imetaStore->clearStore().isSuccess()) {
1144 ATH_MSG_INFO("could not clear store [" << m_imetaStore.typeAndName() << "]");
1145 return tree;
1146 }
1147
1148 addMetadataFromDirectoryName(tupleName+"Meta", f);
1149 addMetadataFromDirectoryName("Lumi", f, "Lumi");
1150 return tree;
1151}
void addMetadataFromDirectoryName(const std::string &metadirname, TFile *fileObj, const std::string &prefix="") const

◆ finalize()

StatusCode Athena::RootNtupleEventSelector::finalize ( )
overridevirtual

Definition at line 412 of file RootNtupleEventSelector.cxx.

413{
414 ATH_MSG_INFO ("Finalize...");
415 // FIXME: this should be tweaked/updated if/when a selection function
416 // or filtering predicate is applied (one day?)
417 ATH_MSG_INFO ("Total events read: " << (m_nbrEvts - m_skipEvts));
418
419 // Explicitly delete all the files we created.
420 // If we leave it up to root, then xrootd can get cleaned up before
421 // the root destructors run, leading to a crash.
422 for (TFile* f : m_files)
423 delete f;
424 m_files.clear();
425
426 return StatusCode::SUCCESS;
427}

◆ handle()

void Athena::RootNtupleEventSelector::handle ( const Incident & incident)
overridevirtual

Definition at line 1313 of file RootNtupleEventSelector.cxx.

1313 {
1314 if (m_fireBIF && incident.type() == IncidentType::BeginEvent) {
1315 std::string fname = m_tuple->GetCurrentFile()->GetName();
1317 fname, {},
1318 /*endFileName=*/fname);
1319 m_fireBIF = false;
1320 }
1321}
static InputFileIncidentGuard begin(IIncidentSvc &incSvc, std::string_view source, std::string_view beginFileName, std::string_view guid, std::string_view endFileName={}, std::string_view beginType=IncidentType::BeginInputFile, std::string_view endType=IncidentType::EndInputFile)
Factory: fire the begin incident and return a guard whose destructor fires the matching end incident.

◆ initialize()

StatusCode Athena::RootNtupleEventSelector::initialize ( )
overridevirtual

Definition at line 274 of file RootNtupleEventSelector.cxx.

275{
276 ATH_MSG_INFO ("Enter RootNtupleEventSelector initialization...");
277
278 // retrieve clidsvc
279 if ( !m_clidsvc.retrieve().isSuccess() ) {
281 ("Could not retrieve [" << m_clidsvc.typeAndName() << "]");
282 return StatusCode::FAILURE;
283 }
284
285 // retrieve dictsvc
286 if ( !m_dictsvc.retrieve().isSuccess() ) {
288 ("Could not retrieve [" << m_dictsvc.typeAndName() << "]");
289 return StatusCode::FAILURE;
290 }
291
292 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
293 boost::char_separator<char> sep (" ;");
294 tokenizer tokens (m_tupleName.value(), sep);
295 m_tupleNames.assign (tokens.begin(), tokens.end());
296
297 if ( m_tupleNames.empty() ) {
299 ("You have to give a TTree name to read from the ROOT files !");
300 return StatusCode::FAILURE;
301 }
302
303 CHECK( m_incsvc.retrieve() );
304 m_incsvc->addListener(this,IncidentType::BeginEvent,99); //used to trigger BeginInputFile on start of first event of file - 99 priority so AFTER storegatesvc done
305
306
307 setupInputCollection( m_inputCollectionsName );
308 const std::size_t nbrInputFiles = m_inputCollectionsName.value().size();
309 if ( nbrInputFiles < 1 ) {
311 ("You need to give at least 1 input file !!" << endmsg
312 << "(Got [" << nbrInputFiles << "] file instead !)");
313 return StatusCode::FAILURE;
314 } else {
316 ("Selector configured to read [" << nbrInputFiles << "] file(s)..."
317 << endmsg
318 << " TTree [" << m_tupleName.value() << "]");
319 }
320
321 {
322 // register this service for 'I/O' events
323 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
324 if (!iomgr.retrieve().isSuccess()) {
325 ATH_MSG_FATAL("Could not retrieve IoComponentMgr !");
326 return StatusCode::FAILURE;
327 }
328 if (!iomgr->io_register(this).isSuccess()) {
329 ATH_MSG_FATAL("Could not register myself with the IoComponentMgr !");
330 return StatusCode::FAILURE;
331 }
332 // register input file's names with the I/O manager
333 const std::vector<std::string>& incol = m_inputCollectionsName.value();
334 bool allGood = true;
335 for (std::size_t icol = 0, imax = incol.size(); icol < imax; icol++) {
336 if (!iomgr->io_register(this,
337 IIoComponentMgr::IoMode::READ,
338 incol[icol]).isSuccess()) {
339 ATH_MSG_FATAL("could not register [" << incol[icol] << "] for output !");
340 allGood = false;
341 } else {
342 ATH_MSG_VERBOSE("io_register[" << this->name() << "](" << incol[icol] << ") [ok]");
343 }
344 }
345 if (!allGood) {
346 return StatusCode::FAILURE;
347 }
348 }
349
350 if (!do_init_io().isSuccess()) {
351 return StatusCode::FAILURE;
352 }
353 // retrieve event store
354 // this needs to happen *after* having initialized the i/o
355 // as our branches (which need a valid m_ntuple pointer)
356 // may be asked to be registered as we are a ProxyProvider.
357 // retrieving the event store will poke the ProxyProviderSvc...
358 /*
359 if ( !m_dataStore.retrieve().isSuccess() ) {
360 ATH_MSG_ERROR
361 ("Could not retrieve [" << m_dataStore.typeAndName() << "] !!");
362 return StatusCode::FAILURE;
363 }
364
365 // ditto for (input) meta data store
366 if (!m_imetaStore.retrieve().isSuccess()) {
367 ATH_MSG_ERROR
368 ("Could not retrieve [" << m_imetaStore.typeAndName() << "] !!");
369 return StatusCode::FAILURE;
370 }
371
372 // ditto for (output) meta data store
373 if (!m_ometaStore.retrieve().isSuccess()) {
374 ATH_MSG_ERROR
375 ("Could not retrieve [" << m_ometaStore.typeAndName() << "] !!");
376 return StatusCode::FAILURE;
377 }
378 */
379
380 //ensure the Athena::NtupleCnvSvc is in the EventPersistencySvc
381 ServiceHandle<IProperty> epSvc("EventPersistencySvc",name());
382 std::vector<std::string> propVal;
383 CHECK( Gaudi::Parsers::parse( propVal , epSvc->getProperty("CnvServices").toString() ) );
384 bool foundSvc(false);
385 for(const std::string& s : propVal) {
386 if(s=="Athena::xAODCnvSvc") { foundSvc=true; break; }
387 }
388 if(!foundSvc) {
389 propVal.push_back("Athena::NtupleCnvSvc");
390 CHECK( epSvc->setProperty("CnvServices", Gaudi::Utils::toString( propVal ) ));
391 }
392
393 //we should also add ourself as a proxy provider
394 ServiceHandle<IProxyProviderSvc> ppSvc("ProxyProviderSvc",name());
395 CHECK( ppSvc.retrieve() );
396 ppSvc->addProvider( this );
397
398
399
400 return StatusCode::SUCCESS;
401}
#define endmsg
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
int imax(int i, int j)
StatusCode do_init_io()
helper method to init the i/o components
StatusCode parse(std::tuple< Tup... > &tup, const Gaudi::Parsers::InputData &input)
bool allGood
Loop over the SDOs & Digits.

◆ io_reinit()

StatusCode Athena::RootNtupleEventSelector::io_reinit ( )
overridevirtual

Callback method to reinitialize the internal state of the component for I/O purposes (e.g.

upon fork(2))

Definition at line 762 of file RootNtupleEventSelector.cxx.

763{
764 ATH_MSG_INFO("I/O reinitialization...");
765
766 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
767 if (!iomgr.retrieve().isSuccess()) {
768 ATH_MSG_FATAL("Could not retrieve IoComponentMgr !");
769 return StatusCode::FAILURE;
770 }
771 if (!iomgr->io_hasitem(this)) {
772 ATH_MSG_FATAL("IoComponentMgr does not know about myself !");
773 return StatusCode::FAILURE;
774 }
775 std::vector<std::string> inputCollections = m_inputCollectionsName.value();
776
777 for (std::size_t
778 i = 0,
779 imax = m_inputCollectionsName.value().size();
780 i < imax;
781 ++i) {
782 std::string &fname = inputCollections[i];
783 // std::cout << "--retrieve new name for [" << fname << "]...\n";
784 if (!iomgr->io_contains(this, fname)) {
785 ATH_MSG_ERROR("IoComponentMgr does not know about [" << fname << "] !");
786 return StatusCode::FAILURE;
787 }
788 if (!iomgr->io_retrieve(this, fname).isSuccess()) {
789 ATH_MSG_FATAL("Could not retrieve new value for [" << fname << "] !");
790 return StatusCode::FAILURE;
791 }
792 // std::cout << "--> [" << fname << "]\n" << std::flush;
793 }
794 // all good... copy over.
795 m_inputCollectionsName = inputCollections;
796
797 // remove our EventInfo if any...
798 // {
799 // const bool force_remove = true;
800 // if (!m_dataStore->clearStore(force_remove).isSuccess()) {
801 // ATH_MSG_ERROR("could not clear event store!");
802 // return StatusCode::FAILURE;
803 // } else {
804 // ATH_MSG_INFO("sgdump: \n" << m_dataStore->dump());
805 // }
806 // }
807
808 // std::cout << "--> do_init_io...\n" << std::flush;
809 if (!do_init_io().isSuccess()) {
810 return StatusCode::FAILURE;
811 }
812
813 ATH_MSG_INFO("I/O reinitialization... [done]");
814 return StatusCode::SUCCESS;
815}

◆ last()

StatusCode Athena::RootNtupleEventSelector::last ( Context & refContext) const
overridevirtual

Definition at line 649 of file RootNtupleEventSelector.cxx.

650{
651 ATH_MSG_ERROR ("............. Last Event Not Implemented .............");
652 return StatusCode::FAILURE;
653}

◆ loadAddresses()

StatusCode Athena::RootNtupleEventSelector::loadAddresses ( StoreID::type storeID,
tadList & list )
overridevirtual

get all new addresses from Provider for this Event.

Definition at line 833 of file RootNtupleEventSelector.cxx.

834{
835 if (m_needReload) {
836 return createRootBranchAddresses(storeID, tads);
837 }
838
839 return StatusCode::SUCCESS;
840}
StatusCode createRootBranchAddresses(StoreID::type storeID, tadList &tads)
helper method to create proxies

◆ next() [1/2]

virtual StatusCode Athena::RootNtupleEventSelector::next ( Context & refCtxt) const
overridevirtual

◆ next() [2/2]

StatusCode Athena::RootNtupleEventSelector::next ( Context & refCtxt,
int jump ) const
overridevirtual

Definition at line 626 of file RootNtupleEventSelector.cxx.

627{
628 ATH_MSG_DEBUG ("next(" << jump << ") : iEvt " << m_curEvt);
629
630 if (self()->seek(ctx, m_curEvt + jump).isSuccess()) {
631 return StatusCode::FAILURE;
632 }
633 return next(ctx);
634}
virtual StatusCode seek(Context &refCtxt, int evtnum) const override
Seek to a given event number.
virtual StatusCode next(Context &refCtxt) const override

◆ preLoadAddresses()

StatusCode Athena::RootNtupleEventSelector::preLoadAddresses ( StoreID::type storeID,
tadList & list )
overridevirtual

IAddressProvider interface get all addresses from Provider : Called before Begin Event

Definition at line 822 of file RootNtupleEventSelector.cxx.

824{
825 // std::cerr << "TTES::preLoadAddresses(" << int(storeID)
826 // << "," << tads.size()
827 // << ")...\n";
828 return StatusCode::SUCCESS;
829}

◆ previous() [1/2]

virtual StatusCode Athena::RootNtupleEventSelector::previous ( Context & refCtxt) const
overridevirtual

◆ previous() [2/2]

StatusCode Athena::RootNtupleEventSelector::previous ( Context & refCtxt,
int jump ) const
overridevirtual

Definition at line 643 of file RootNtupleEventSelector.cxx.

644{
645 return next( ctx, -jump );
646}

◆ releaseContext()

StatusCode Athena::RootNtupleEventSelector::releaseContext ( Context *& refCtxt) const
overridevirtual

Definition at line 679 of file RootNtupleEventSelector.cxx.

680{
681 RootNtupleEventContext *ctx = dynamic_cast<RootNtupleEventContext*>(refCtxt);
682 if ( ctx ) {
683 delete ctx; ctx = 0;
684 return StatusCode::SUCCESS;
685 }
686
687 return StatusCode::FAILURE;
688}

◆ resetCriteria()

StatusCode Athena::RootNtupleEventSelector::resetCriteria ( const std::string & cr,
Context & ctx ) const
overridevirtual

Definition at line 691 of file RootNtupleEventSelector.cxx.

692{
693 ATH_MSG_ERROR ("............. resetCriteria Not Implemented .............");
694 return StatusCode::FAILURE;
695}

◆ rewind()

StatusCode Athena::RootNtupleEventSelector::rewind ( Context & refCtxt) const
overridevirtual

Definition at line 657 of file RootNtupleEventSelector.cxx.

658{
659 return self()->seek(ctxt, 0);
660}

◆ seek()

StatusCode Athena::RootNtupleEventSelector::seek ( Context & ctx,
int evtnum ) const
overridevirtual

Seek to a given event number.

IEvtSelectorSeek interface

Parameters
evtnumThe event number to which to seek.
evtnumThe event number to which to seek.

Definition at line 706 of file RootNtupleEventSelector.cxx.

707{
708 RootNtupleEventContext* rctx = dynamic_cast<RootNtupleEventContext*>(&ctx);
709 if (!rctx) {
710 return StatusCode::FAILURE;
711 }
712
713 // std::cout << "::seek - evtnum=" << evtnum
714 // << " curevt=" << m_curEvt
715 // << " curcol=" << rctx->fileIndex()
716 // << std::endl;
717 long coll_idx, tuple_idx;
718 find_coll_idx(evtnum, coll_idx, tuple_idx);
719 // std::cout << "::seek - evtnum=" << evtnum
720 // << " curevt=" << m_curEvt
721 // << " curcol=" << rctx->fileIndex()
722 // << " colidx=" << coll_idx
723 // << std::endl;
724 if ((coll_idx == -1 || tuple_idx == -1) && evtnum < m_curEvt) {
725 coll_idx = rctx->fileIndex();
726 tuple_idx = rctx->tupleIndex();
727 }
728
729 if (coll_idx == -1 || tuple_idx == -1) {
730 ATH_MSG_INFO("seek: reached end of input.");
731 return StatusCode::RECOVERABLE;
732 }
733
734 if (coll_idx != static_cast<int>(rctx->fileIndex()) ||
735 tuple_idx != static_cast<int>(rctx->tupleIndex()))
736 {
737 // tell everyone we switched files...
738 m_tuple = NULL;
739 CHECK( endInputFile (rctx) );
740 }
741
742 rctx->setFileIndex (coll_idx);
743 rctx->setTupleIndex (tuple_idx);
744 m_curEvt = evtnum;
745
746 return StatusCode::SUCCESS;
747}
StatusCode endInputFile(RootNtupleEventContext *rctx) const
find_coll_idx(-1, coll_idx, tuple_idx)

◆ setupInputCollection()

void Athena::RootNtupleEventSelector::setupInputCollection ( Gaudi::Details::PropertyBase & inputCollectionsName)
private

callback to synchronize the list of input files

Definition at line 864 of file RootNtupleEventSelector.cxx.

865{
866 // nothing ?
867 return;
868}

◆ size()

virtual int Athena::RootNtupleEventSelector::size ( Context & refCtxt) const
overridevirtual

ICollectionSize interface

◆ stop()

StatusCode Athena::RootNtupleEventSelector::stop ( )
overridevirtual

Definition at line 403 of file RootNtupleEventSelector.cxx.

404{
405 // Fire EndInputFile for any file still open (the event loop may end
406 // before the file is fully read).
407 m_inputFileGuard.reset();
408 m_fireBIF = false;
409 return StatusCode::SUCCESS;
410}

◆ updateAddress()

StatusCode Athena::RootNtupleEventSelector::updateAddress ( StoreID::type storeID,
SG::TransientAddress * tad,
const EventContext & ctx )
overridevirtual

update a transient Address

Definition at line 844 of file RootNtupleEventSelector.cxx.

846{
847 if (tad) {
848 if (m_dataStore->proxy_exact (tad->sgkey())) {
849 return StatusCode::SUCCESS;
850 }
851 return StatusCode::FAILURE;
852 }
853 // do nothing.
854 return StatusCode::SUCCESS;
855}
sgkey_t sgkey() const
Set the primary (hashed) SG key.

◆ Athena::RootNtupleEventContext

friend class Athena::RootNtupleEventContext
friend

Definition at line 53 of file RootNtupleEventSelector.h.

Member Data Documentation

◆ m_collEvts

std::vector<std::vector<CollMetaData> > Athena::RootNtupleEventSelector::m_collEvts
mutableprivate

helper method to get the collection index (into m_inputCollectionsName) and tuple index (into m_tupleNames') for a given event index evtidx`.

returns -1 if not found. */ void find_coll_idx(int evtidx, long& coll_idx, long& tuple_idx) const;

/ non-const access to self (b/c ::next() is const) RootNtupleEventSelector self() const { return const_cast<RootNtupleEventSelector>(this); }

///////////////////////////////////////////////////////////////// Private data: ///////////////////////////////////////////////////////////////// private:

typedef ServiceHandle<StoreGateSvc> StoreGateSvc_t; / Pointer to the StoreGateSvc event store StoreGateSvc_t m_dataStore;

/ Pointer to the StoreGateSvc input metadata store StoreGateSvc_t m_imetaStore;

/ Pointer to the StoreGateSvc output metadata store StoreGateSvc_t m_ometaStore;

typedef ServiceHandle<IClassIDSvc> ICLIDSvc_t; / Pointer to the IClassIDSvc ICLIDSvc_t m_clidsvc;

typedef ServiceHandle<IDictLoaderSvc> IDictSvc_t; / Pointer to the IDictLoaderSvc IDictSvc_t m_dictsvc;

typedef ServiceHandle<IIncidentSvc> IIncSvc_t; / Handle to the incident service IIncSvc_t m_incsvc;

/ List of input files containing TTree StringArrayProperty m_inputCollectionsName;

/ Name of TTree to load from collection of input files StringProperty m_tupleName;

/ List of branches to activate in the TTree StringArrayProperty m_activeBranchNames;

/ optional event number variable to propagate to EventInfo. StringProperty m_eventNumberVar { this, "EventNumberVar", "", "Optional event number variable to propagate to EventInfo" }; / optional run number variable to propagate to EventInfo. StringProperty m_runNumberVar { this, "RunNumberVar", "", "Optional run number variable to propagate to EventInfo" }; / optional LBN variable to propagate to EventInfo. StringProperty m_lbnVar { this, "LBNVar", "", "Optional LBN variable to propagate to EventInfo" };

/ Number of events to skip at the beginning long m_skipEvts;

/ Names of all trees over which to iterate. std::vector<std::string> m_tupleNames;

/ Number of Events read so far. mutable long m_nbrEvts;

/ current event index mutable long m_curEvt;

struct CollMetaData { / number of entries up to this collection long min_entries; / number of entries after this collection long max_entries; / number of entries in this collection. long entries; }; /** cache of the number of entries for each collection Indexed like [tuple][collection]

Definition at line 252 of file RootNtupleEventSelector.h.

◆ m_files

std::vector<TFile*> Athena::RootNtupleEventSelector::m_files
mutableprivate

Definition at line 278 of file RootNtupleEventSelector.h.

◆ m_fireBIF

bool Athena::RootNtupleEventSelector::m_fireBIF {true}
mutableprivate

Flag to fire BeginInputFile on the next BeginEvent incident.

Definition at line 269 of file RootNtupleEventSelector.h.

269{true};

◆ m_inputFileGuard

std::optional<InputFileIncidentGuard> Athena::RootNtupleEventSelector::m_inputFileGuard
mutableprivate

RAII guard: guarantees a matching EndInputFile for every BeginInputFile.

BeginInputFile is deferred to the next BeginEvent (data must be loaded in the store first), so the guard is created in handle(), not immediately.

Definition at line 267 of file RootNtupleEventSelector.h.

◆ m_needReload

bool Athena::RootNtupleEventSelector::m_needReload
mutableprivate

The (python) selection function to apply on the TChain we are reading.

Definition at line 262 of file RootNtupleEventSelector.h.

◆ m_tuple

TTree* Athena::RootNtupleEventSelector::m_tuple
mutableprivate

current tree being read

Definition at line 255 of file RootNtupleEventSelector.h.


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