17#include <TChainElement.h>
20#include <TFriendElement.h>
22#include <TMethodCall.h>
33#ifndef XAOD_STANDALONE
92 "Did not call finishWritingTo() before destroying the TEvent object!");
108 if (pattern.size()) {
117 return StatusCode::SUCCESS;
131 std::string_view treeName) {
134 if (
file ==
nullptr) {
136 return StatusCode::SUCCESS;
162 ATH_MSG_ERROR(
"Couldn't find metadata tree on input. Object is unusable!");
163 return StatusCode::FAILURE;
170 return StatusCode::FAILURE;
175 ATH_MSG_WARNING(
"Was expecting a metadata tree with size 1, instead of "
177 ATH_MSG_WARNING(
"The input file was most probably produced by hadd...");
183 static const std::string eventFormatTypeName =
185 ::TClass* cl = ::TClass::GetClass(eventFormatTypeName.c_str());
192 auto readEventFormatMetadata =
193 [&](std::string_view thisTreeName) -> StatusCode {
195 TTree* metaTree =
file->Get<TTree>(thisTreeName.data());
196 if (metaTree ==
nullptr) {
197 ATH_MSG_ERROR(
"Couldn't find metadata tree \"" << thisTreeName
199 return StatusCode::FAILURE;
202 if (metaTree->LoadTree(0) < 0) {
204 << thisTreeName <<
"\"");
205 return StatusCode::FAILURE;
209 const std::string eventFormatBranchName =
211 if (!metaTree->GetBranch(eventFormatBranchName.c_str())) {
215 ATH_MSG_INFO(
"Input file provides no event or metadata");
216 return StatusCode::RECOVERABLE;
223 metaTree->SetBranchAddress(eventFormatBranchName.c_str(), &format, &br);
225 ATH_MSG_ERROR(
"Failed to connect to xAOD::EventFormat object");
226 return StatusCode::FAILURE;
231 for (
const auto &[key, element] : *format) {
242 return StatusCode::SUCCESS;
248 if (
sc.isRecoverable()) {
251 return StatusCode::SUCCESS;
258 std::set<std::string> lOtherMetaTreeNames = {};
259 TList* lKeys =
file->GetListOfKeys();
262 for (
int iKey = 0; iKey < lKeys->GetEntries(); iKey++) {
264 std::string keyName = lKeys->At(iKey)->GetName();
271 const char* className = ((::TKey* )lKeys->At(iKey))->GetClassName();
272 static constexpr Bool_t LOAD = kFALSE;
273 static constexpr Bool_t SILENT = kTRUE;
274 ::TClass* cl = ::TClass::GetClass(className, LOAD, SILENT);
275 if ((cl !=
nullptr) && cl->InheritsFrom(::TTree::Class())) {
277 lOtherMetaTreeNames.insert(std::move(keyName));
284 for (
const std::string &metaTreeName : lOtherMetaTreeNames) {
285 ATH_CHECK(readEventFormatMetadata(metaTreeName));
308 stats.setNEvents(stats.nEvents() +
m_inTree->GetEntries());
314 listener->handle(beginIncident);
323 listener->handle(endIncident);
327 return StatusCode::SUCCESS;
350 if (useTreeCache && (!
m_inChain->GetCacheSize())) {
360 ATH_MSG_ERROR(
"Couldn't get the list of files from the input TChain");
361 return StatusCode::FAILURE;
363 if (!
files->GetEntries()) {
364 ATH_MSG_ERROR(
"No files are present in the received TChain");
365 return StatusCode::FAILURE;
367 const ::TChainElement* chEl =
368 dynamic_cast<const ::TChainElement*
>(
files->At(0));
371 return StatusCode::FAILURE;
374 std::unique_ptr<TFile> dummyFile{TFile::Open(chEl->GetTitle())};
377 return StatusCode::FAILURE;
392 return StatusCode::SUCCESS;
402 ::TFile*
file =
tree->GetCurrentFile();
420 return StatusCode::SUCCESS;
432 std::string_view treeName) {
437 return StatusCode::FAILURE;
442 ATH_MSG_ERROR(
"Object already writing to a file. Close that file first!");
443 return StatusCode::FAILURE;
451 m_outTree = std::make_unique<TTree>(treeName.data(),
"xAOD event tree");
461 return StatusCode::SUCCESS;
484 ATH_MSG_ERROR(
"The object doesn't seem to be connected to an output file!");
485 return StatusCode::FAILURE;
495 listener->handle(incident);
509 return StatusCode::SUCCESS;
515 metatree->SetAutoSave(10000);
516 metatree->SetAutoFlush(-30000000);
517 metatree->SetDirectory(
file);
526 ::Error(
"xAOD::TEvent::finishWritingTo",
527 XAOD_MESSAGE(
"Class name parsing fails for %s ! "),
e.what());
528 return StatusCode::FAILURE;
534 std::vector<std::pair<std::string, TObjectManager* >> outputMetaObjects;
538 if (objMgr ==
nullptr) {
540 return StatusCode::FAILURE;
542 outputMetaObjects.emplace_back(key, objMgr);
547 for (
auto &[key, mgr] : outputMetaObjects) {
551 const ::Int_t splitLevel = (key.ends_with(
"Aux.") ? 1 : 0);
553 *(mgr->branchPtr()) =
554 metatree->Branch(key.c_str(), mgr->holder()->getClass()->GetName(),
555 mgr->holder()->getPtr(), 32000, splitLevel);
556 if (!mgr->branch()) {
558 << mgr->holder()->getClass()->GetName() <<
"/" << key
560 return StatusCode::FAILURE;
564 static constexpr bool METADATA =
true;
569 if (metatree->Fill() <= 0) {
570 ATH_MSG_ERROR(
"Failed to write event format metadata into the output");
571 metatree->SetDirectory(
nullptr);
572 return StatusCode::FAILURE;
577 metatree->SetDirectory(
nullptr);
583 return StatusCode::SUCCESS;
622 static constexpr bool TOP_STORE =
true;
623 if (
record(std::make_unique<TAuxStore>(key, TOP_STORE, mode), key)
625 ATH_MSG_ERROR(
"Couldn't connect TAuxStore object to the output");
694 const ::Long64_t fileEntry =
m_inChain->LoadTree(entry);
697 <<
" from the input chain");
711 static constexpr bool USE_TREE_CACHE =
false;
736 <<
" from the input file");
752 static const std::string dynStorePostfix =
"Aux.Dynamic";
753 if (key.ends_with(dynStorePostfix)) {
761 static constexpr bool SILENT =
true;
762 static constexpr bool METADATA =
false;
769 result += mgr->getEntry(getall);
777 listener->handle(incident);
796 return m_inChain->GetListOfFiles()->GetEntries();
832 ::Long64_t entry = 0;
833 for (::Long64_t i = 0; i <
file; ++i) {
874 std::string unsetObjects;
875 std::vector<std::pair<std::string, TVirtualManager* >> outputObjectsCopy;
878 outputObjectsCopy.emplace_back(key, mgr.get());
880 for (
auto &[key, mgr] : outputObjectsCopy) {
882 if (!mgr->create()) {
885 if (unsetObjects.size()) {
886 unsetObjects +=
", ";
888 unsetObjects.append(
"\"" + key +
"\"");
894 static constexpr bool METADATA =
false;
897 "in the output for object \""
904 if (unsetObjects.size()) {
905 ATH_MSG_ERROR(
"The following objects were not set in the current event: "
913 ATH_MSG_ERROR(
"Output tree filling failed with return value: " << ret);
933 std::vector<std::string> &vkeys,
934 bool metadata)
const {
936 std::set<std::string>
keys;
940 std::vector<TObjArray* > fullListOfBranches = {};
946 fullListOfBranches.push_back(
m_inMetaTree->GetListOfBranches());
952 fullListOfBranches.push_back(
m_inTree->GetListOfBranches());
957 TList* fList =
m_inTree->GetListOfFriends();
959 for (TObject* feObj : *fList) {
962 auto* pElement =
dynamic_cast<TFriendElement*
>(feObj);
963 if (pElement ==
nullptr) {
966 TTree* friendTree = pElement->GetTree();
968 fullListOfBranches.push_back(friendTree->GetListOfBranches());
976 for (
const TObjArray* in : fullListOfBranches) {
978 for (
const TObject* obj : *in) {
980 if (obj ==
nullptr) {
983 const TBranch* element =
dynamic_cast<const TBranch*
>(obj);
986 return StatusCode::FAILURE;
988 const std::string objClassName = element->GetClassName();
989 std::string key = obj->GetName();
992 if (objClassName == targetClassName) {
993 ATH_MSG_DEBUG(
"Matched \"" << targetClassName <<
"\" to key \"" << key
995 keys.insert(std::move(key));
1002 ATH_MSG_DEBUG(
"Scanning input objects for \"" << targetClassName <<
"\"");
1003 for (
const auto &[key, vmgr] : inAux) {
1007 if (mgr ==
nullptr) {
1010 const std::string &objClassName = mgr->holder()->getClass()->GetName();
1013 if (objClassName == targetClassName) {
1014 ATH_MSG_DEBUG(
"Matched \"" << targetClassName <<
"\" to key \"" << key
1022 const TObjArray* out =
m_outTree->GetListOfBranches();
1025 for (
const TObject* obj : *out) {
1026 if (obj ==
nullptr) {
1029 const TBranch* element =
dynamic_cast<const TBranch*
>(obj);
1030 if (element ==
nullptr) {
1032 return StatusCode::FAILURE;
1034 const std::string objClassName = element->GetClassName();
1035 std::string key = obj->GetName();
1038 if (objClassName == targetClassName) {
1039 ATH_MSG_DEBUG(
"Matched \"" << targetClassName <<
"\" to key \"" << key
1041 keys.insert(std::move(key));
1049 ATH_MSG_DEBUG(
"Scanning output objects for \"" << targetClassName <<
"\"");
1050 for (
const auto &[key, vmgr] : outAux) {
1053 if (mgr ==
nullptr) {
1056 const std::string &objClassName = mgr->holder()->getClass()->GetName();
1059 if (objClassName == targetClassName) {
1060 ATH_MSG_DEBUG(
"Matched \"" << targetClassName <<
"\" to key \"" << key
1066 vkeys.insert(vkeys.end(),
keys.begin(),
keys.end());
1069 return StatusCode::SUCCESS;
1094 return StatusCode::FAILURE;
1102 return StatusCode::SUCCESS;
1106 if (silent ==
false) {
1109 return StatusCode::RECOVERABLE;
1115 if (silent ==
false) {
1123 ::TBranch* br =
m_inTree->GetBranch(key.c_str());
1124 if (br ==
nullptr) {
1129 return StatusCode::RECOVERABLE;
1133 br->SetMakeClass(0);
1137 std::string className = br->GetClassName();
1138 if (className ==
"") {
1142 className = ef->className();
1145 "Couldn't find an appropriate type with a dictionary for branch \""
1147 return StatusCode::FAILURE;
1150 ::TClass* realClass = ::TClass::GetClass(className.c_str());
1151 if (((!realClass) || (!realClass->IsLoaded())) && ef) {
1155 className = ef->className();
1156 realClass = ::TClass::GetClass(className.c_str());
1158 if ((!realClass) || (!realClass->IsLoaded())) {
1161 "Couldn't find an appropriate type with a dictionary for branch \""
1163 return StatusCode::FAILURE;
1170 static const ::EDataType dataType = kOther_t;
1176 void* ptr =
nullptr;
1181 if (mgr ==
nullptr) {
1182 ATH_MSG_ERROR(
"Couldn't access output manager for: " << key);
1183 return StatusCode::FAILURE;
1186 ptr = mgr->holder()->get();
1192 if (ptr ==
nullptr) {
1193 ptr = realClass->New();
1198 auto mgr = std::make_unique<TObjectManager>(
1199 nullptr, std::make_unique<THolder>(ptr, realClass), renewOnRead);
1208 << key <<
"\" is " << br->GetSplitLevel()
1209 <<
". This can only be read in kAthenaAccess mode.");
1211 *(mgr->holder()->getPtr()) =
nullptr;
1213 return StatusCode::FAILURE;
1217 const ::Int_t status =
1218 m_inTree->SetBranchAddress(key.c_str(), mgr->holder()->getPtr(),
1219 mgr->branchPtr(), realClass, dataType, kTRUE);
1222 << className <<
"\" to input branch \"" << key
1223 <<
"\". Return code: " << status);
1225 *(mgr->holder()->getPtr()) = 0;
1227 return StatusCode::FAILURE;
1247 return StatusCode::SUCCESS;
1263 return StatusCode::FAILURE;
1268 return StatusCode::SUCCESS;
1273 if (br ==
nullptr) {
1274 if (silent ==
false) {
1276 <<
"\" not available on input");
1278 return StatusCode::RECOVERABLE;
1282 if (br->GetEntries() == 0) {
1283 if (silent ==
false) {
1285 <<
"\" doesn't hold any data");
1287 return StatusCode::RECOVERABLE;
1291 br->SetMakeClass(0);
1295 ::EDataType dt = kOther_t;
1296 if (br->GetExpectedType(cl, dt) || (!cl)) {
1297 ATH_MSG_ERROR(
"Couldn't get the type for metadata branch \"" << key
1299 return StatusCode::FAILURE;
1303 void* ptr = cl->New();
1305 auto mgr = std::make_unique<TObjectManager>(
1306 nullptr, std::make_unique<THolder>(ptr, cl), renewOnRead);
1310 key.c_str(), mgr->holder()->getPtr(), mgr->branchPtr(), cl, dt, kTRUE);
1313 << cl->GetName() <<
"\" to input branch \"" << key
1314 <<
"\". Return code: " << status);
1316 *(mgr->holder()->getPtr()) = 0;
1318 return StatusCode::FAILURE;
1327 ATH_MSG_ERROR(
"Couldn't read in metadata object with key \"" << key
1329 return StatusCode::FAILURE;
1342 static constexpr bool METADATA =
true;
1347 return StatusCode::SUCCESS;
1364 return StatusCode::FAILURE;
1368 if ((!
m_inTree->GetBranch(prefix.c_str())) &&
1372 return StatusCode::SUCCESS;
1377 return StatusCode::SUCCESS;
1385 static constexpr bool SILENT =
false;
1389 return StatusCode::SUCCESS;
1395 static constexpr bool TOP_STORE =
true;
1396 auto store = std::make_unique<TAuxStore>(
1409 static constexpr bool IS_OWNER =
true;
1411 std::make_unique<TAuxManager>(store.release(), IS_OWNER);
1414 return StatusCode::SUCCESS;
1419 return StatusCode::FAILURE;
1435 return StatusCode::SUCCESS;
1441 return StatusCode::FAILURE;
1449 static constexpr bool SILENT =
false;
1453 return StatusCode::SUCCESS;
1459 static constexpr bool TOP_STORE =
true;
1460 auto store = std::make_unique<TAuxStore>(
1473 static constexpr bool IS_OWNER =
true;
1475 std::make_unique<TAuxManager>(store.release(), IS_OWNER);
1478 return StatusCode::SUCCESS;
1483 return StatusCode::FAILURE;
1503 (isAuxStore ==
false)) {
1504 return StatusCode::SUCCESS;
1517 auto itr = objects.find(key +
"Aux.");
1518 if (itr == objects.end()) {
1521 return StatusCode::SUCCESS;
1523 auxMgr = itr->second.get();
1524 auxKey = key +
"Aux.";
1527 if (metadata ==
false) {
1529 const ::Int_t readBytes = auxMgr->
getEntry();
1530 if (readBytes < 0) {
1532 "Couldn't load current entry for auxiliary object with key \""
1534 return StatusCode::FAILURE;
1539 const std::string dynAuxKey = auxKey +
"Dynamic";
1540 auto dynAuxMgr = objects.find(dynAuxKey);
1542 if ((dynAuxMgr != objects.end()) &&
1548 dynAuxMgr->second->getEntry();
1559 auto dynAuxMgr = objects.find(dynAuxKey);
1560 if (dynAuxMgr == objects.end()) {
1562 return StatusCode::FAILURE;
1564 dynAuxMgr->second->getEntry();
1571 return StatusCode::SUCCESS;
1577 switch (mgr.holder()->typeKind()) {
1592 if (
vec && (!
vec->trackIndices())) {
1593 Details::forceTrackIndices(*
vec);
1597 if ((!
vec) && (!aux)) {
1599 << mgr.holder()->getClass()->GetName()
1600 <<
"\" as SG::AuxVectorBase or SG::AuxElement");
1601 return StatusCode::FAILURE;
1611 << auxKey <<
"\" is not of the right type");
1612 return StatusCode::FAILURE;
1628 << auxKey <<
"\" is not of the right type");
1629 return StatusCode::FAILURE;
1636 return StatusCode::FAILURE;
1641 vec->setStore(store);
1646 return StatusCode::FAILURE;
1650 return StatusCode::SUCCESS;
1669 const std::string &key,
bool overwrite,
bool metadata,
1675 "No output tree defined. Did you forget to call writeTo(...)?");
1676 return StatusCode::FAILURE;
1686 ATH_MSG_ERROR(
"Meta-object \"" << typeName <<
"\"/\"" << key
1687 <<
"\" already recorded");
1688 return StatusCode::FAILURE;
1691 TClass* cl = TClass::GetClass(typeName.c_str());
1693 ATH_MSG_ERROR(
"Didn't find dictionary for type: " << typeName);
1694 return StatusCode::FAILURE;
1699 nullptr, std::make_unique<THolder>(obj, cl, isOwner), renewOnRead);
1701 return StatusCode::SUCCESS;
1708 <<
"\" already accessed from the input, can't be "
1709 "overwritten in memory");
1710 return StatusCode::FAILURE;
1714 const Int_t splitLevel = (key.ends_with(
"Aux.") ? 1 : 0);
1721 TClass* cl = TClass::GetClass(typeName.c_str());
1722 if (cl ==
nullptr) {
1723 ATH_MSG_ERROR(
"Didn't find dictionary for type: " << typeName);
1724 return StatusCode::FAILURE;
1735 auto mgr = std::make_unique<TObjectManager>(
1736 nullptr, std::make_unique<THolder>(obj, cl, isOwner), renewOnRead);
1741 static constexpr Int_t basketSize = 32000;
1743 m_outTree->Branch(key.c_str(), cl->GetName(),
1746 ATH_MSG_ERROR(
"Failed to create branch \"" << key <<
"\" out of type \""
1747 << cl->GetName() <<
"\"");
1750 return StatusCode::FAILURE;
1755 static constexpr bool METADATA =
false;
1760 return StatusCode::SUCCESS;
1766 ATH_MSG_ERROR(
"Manager object of the wrong type encountered");
1767 return StatusCode::FAILURE;
1776 TClass* cl = TClass::GetClass(typeName.c_str());
1778 ::strcmp(cl->GetName(), omgr->
holder()->
getClass()->GetName())) {
1780 << key <<
"\" the previous type was \""
1782 <<
"\", but the newly requested type is \"" << typeName
1784 return StatusCode::FAILURE;
1792 static constexpr bool METADATA =
false;
1796 return StatusCode::SUCCESS;
1804 if (iomgr !=
nullptr) {
1806 static const bool OVERWRITE =
true;
1807 static const bool IS_OWNER =
true;
1809 key, OVERWRITE, metadata, IS_OWNER));
1810 return StatusCode::SUCCESS;
1815 if (auxmgr !=
nullptr) {
1819 "TAuxStore auxiliary objects can only be recorded for event data");
1820 return StatusCode::FAILURE;
1824 return StatusCode::SUCCESS;
1828 ATH_MSG_ERROR(
"Unknown auxiliary store manager type encountered");
1829 return StatusCode::FAILURE;
1842 return StatusCode::SUCCESS;
1847 ATH_MSG_ERROR(
"Function called on an uninitialised object");
1848 return StatusCode::FAILURE;
1857 for (; itr != end; ++itr) {
1860 const std::string &branchName = itr->second.branchName();
1863 if (branchName.find(
"Aux.") != std::string::npos) {
1872 const std::string intName = branchName.substr(0, branchName.size() - 4);
1880 ::Bool_t auxFound = kFALSE;
1883 std::vector<TObjArray* > fullListOfBranches = {};
1885 fullListOfBranches.push_back(
m_inTree->GetListOfBranches());
1888 if (
m_inTree->GetListOfFriends()) {
1890 TList* fList =
m_inTree->GetListOfFriends();
1892 for (TObject* feObj : *fList) {
1895 auto* pElement =
dynamic_cast<TFriendElement*
>(feObj);
1898 TTree* friendTree = pElement->GetTree();
1900 fullListOfBranches.push_back(friendTree->GetListOfBranches());
1905 for (TObjArray* branches : fullListOfBranches) {
1906 for (Int_t i = 0; i < branches->GetEntriesFast(); ++i) {
1907 if (!branches->At(i))
1910 const TString
name(branches->At(i)->GetName());
1911 if (
name.BeginsWith(branchName) ||
name.BeginsWith(dynName)) {
1919 << intName <<
"\" belonging to branch \""
1920 << branchName <<
"\"");
1927 ::TClass* cl = ::TClass::GetClass(el->className().c_str());
1928 if ((!cl) || (!cl->IsLoaded())) {
1930 << el->className() <<
"\"");
1937 static ::TClass*
const baseCl = ::TClass::GetClass(baseName.c_str());
1939 ATH_MSG_ERROR(
"Couldn't get dictionary for type \"" << baseName
1941 return StatusCode::FAILURE;
1951 static constexpr bool TOP_STORE =
true;
1952 TAuxStore temp(branchName, TOP_STORE, mode);
1953 static constexpr bool PRINT_WARNINGS =
false;
1961 stats.branch(branchName,
id);
1965 stats.setBranchNum(stats.branchNum() + temp.getAuxIDs().size());
1970 const ::TBranch* container =
m_inTree->GetBranch(branchName.c_str());
1979 return StatusCode::SUCCESS;
1995 const std::string &key) {
2000 "No output tree defined. Did you forget to call writeTo(...)?");
2001 return StatusCode::FAILURE;
2005 const std::set<std::string>* filter = 0;
2008 filter = &(filter_itr->second);
2017 store->selectAux(*filter);
2022 static constexpr bool OWNS_STORE =
true;
2024 std::make_unique<TAuxManager>(store.release(), OWNS_STORE);
2027 return StatusCode::SUCCESS;
2031 if (vitr->second->object() == store.get()) {
2033 return StatusCode::SUCCESS;
2042 if (mgr ==
nullptr) {
2044 << key <<
"\" already exists, and is not of type TAuxStore");
2045 return StatusCode::FAILURE;
2050 store->selectAux(*filter);
2057 mgr->setObject(store.release());
2060 return StatusCode::SUCCESS;
2074 ::TMethodCall setNameCall;
2078 setNameCall.InitWithPrototype(mgr.holder()->getClass(),
"setName",
2080 if (setNameCall.IsValid()) {
2083 const ::TString params =
2084 ::TString::Format(
"\"%s\"", mgr.branch()->GetName());
2085 const char* charParams = params.Data();
2086 setNameCall.Execute(mgr.holder()->get(), charParams);
2089 ATH_MSG_WARNING(
"Couldn't find setName(...) function for container \""
2090 << mgr.branch()->GetName() <<
"\" (type: "
2091 << mgr.holder()->getClass()->GetName() <<
")");
2096 static const TClass*
const holderClass =
2098 if (!mgr.holder()->getClass()->InheritsFrom(holderClass)) {
2100 return StatusCode::SUCCESS;
2108 return StatusCode::FAILURE;
2115 static constexpr bool TOP_STORE =
false;
2116 auto store = std::make_unique<TAuxStore>(
2117 mgr.branch()->GetName(), TOP_STORE,
2136 static constexpr bool SHARED_OWNER =
false;
2137 m_inputObjects[std::string(mgr.branch()->GetName()) +
"Dynamic"] =
2138 std::make_unique<TAuxManager>(store.get(), SHARED_OWNER);
2141 storeHolder->
setStore(store.release());
2144 return StatusCode::SUCCESS;
2167 return StatusCode::SUCCESS;
2171 if (!mgr->holder()->getClass()->InheritsFrom(
"SG::IAuxStoreIO")) {
2172 return StatusCode::SUCCESS;
2180 return StatusCode::FAILURE;
2187 auto item_itr =
m_auxItemList.find(mgr->branch()->GetName());
2189 sel.selectAux(item_itr->second);
2200 if (auxids.
empty()) {
2201 return StatusCode::SUCCESS;
2205 const std::string dynNamePrefix =
2214 typedef std::pair<std::string, SG::auxid_t> AuxVarSort_t;
2215 std::vector<AuxVarSort_t> varsort;
2216 varsort.reserve(auxids.
size());
2218 varsort.emplace_back(
r.getName(
id),
id);
2220 std::sort(varsort.begin(), varsort.end());
2223 for (
const auto &p : varsort) {
2229 const std::string brName = dynNamePrefix + p.first;
2232 Object_t::iterator bmgr = objects.find(brName);
2235 if (bmgr == objects.end()) {
2238 const std::type_info* brType = aux->
getIOType(
id);
2241 return StatusCode::FAILURE;
2244 std::string brProperTypeName =
"<unknown>";
2250 if (strlen(brType->name()) == 1) {
2253 brProperTypeName = brTypeName;
2257 if (rootType ==
'\0') {
2259 << brName <<
"\" of type \"" << brTypeName <<
"\"");
2260 return StatusCode::FAILURE;
2264 std::ostringstream leaflist;
2265 leaflist << brName <<
"/" << rootType;
2268 static constexpr bool IS_OWNER =
false;
2269 auto auxmgr = std::make_unique<TPrimitiveAuxBranchManager>(
2273 static constexpr Int_t BASKET_SIZE = 32000;
2274 *(auxmgr->branchPtr()) =
2275 outTree.Branch(brName.c_str(), auxmgr->holder()->get(),
2276 leaflist.str().c_str(), BASKET_SIZE);
2277 if (!auxmgr->branch()) {
2279 << brName <<
"\" out of type \"" << brProperTypeName
2282 *(auxmgr->holder()->getPtr()) = 0;
2283 return StatusCode::FAILURE;
2285 br = auxmgr->branch();
2288 objects[brName] = std::move(auxmgr);
2293 static constexpr Bool_t LOAD_IF_NOT_FOUND = kTRUE;
2294 static constexpr Bool_t SILENT = kTRUE;
2295 TClass* cl = TClass::GetClass(*brType, LOAD_IF_NOT_FOUND, SILENT);
2296 if (cl ==
nullptr) {
2299 cl = TClass::GetClass(brTypeName.c_str());
2301 if (cl ==
nullptr) {
2303 << brName <<
"\" of type \"" << brTypeName <<
"\"");
2304 return StatusCode::FAILURE;
2309 brProperTypeName = cl->GetName();
2312 static constexpr bool IS_OWNER =
false;
2313 auto auxmgr = std::make_unique<TAuxBranchManager>(
2317 static constexpr Int_t BASKET_SIZE = 32000;
2318 static constexpr Int_t SPLIT_LEVEL = 0;
2319 *(auxmgr->branchPtr()) = outTree.Branch(brName.c_str(), cl->GetName(),
2320 auxmgr->holder()->getPtr(),
2321 BASKET_SIZE, SPLIT_LEVEL);
2322 if (!auxmgr->branch()) {
2324 << brName <<
"\" out of type \"" << brProperTypeName
2327 *(auxmgr->holder()->getPtr()) = 0;
2328 return StatusCode::FAILURE;
2330 br = auxmgr->branch();
2333 objects[brName] = std::move(auxmgr);
2338 if (outTree.GetEntries()) {
2339 void* ptr = br->GetAddress();
2341 for (::Long64_t i = 0; i < outTree.GetEntries(); ++i) {
2344 br->SetAddress(ptr);
2351 mgr->branch()->GetName(),
2360 bmgr = objects.find(brName);
2361 if (bmgr == objects.end()) {
2362 ATH_MSG_FATAL(
"There is an internal logic error in the code...");
2363 return StatusCode::FAILURE;
2369 const_cast<void*
>(
static_cast<const void*
>(aux->
getIOData(
id)));
2370 bmgr->second->setObject(nc_data);
2374 return StatusCode::SUCCESS;
2382 return StatusCode::FAILURE;
2386 const std::set<std::string>* filter = 0;
2389 filter = &(filter_itr->second);
2398 store->selectAux(*filter);
2403 static constexpr bool OWNS_STORE =
false;
2404 m_outputObjects[key] = std::make_unique<TAuxManager>(store, OWNS_STORE);
2407 return StatusCode::SUCCESS;
2411 if (vitr->second->object() == store) {
2413 return StatusCode::SUCCESS;
2422 if (mgr ==
nullptr) {
2424 << key <<
"\" already exists, and is not of type TAuxStore");
2425 return StatusCode::FAILURE;
2430 store->selectAux(*filter);
2437 mgr->setObject(store);
2440 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Base class for elements of a container that can have aux data.
Handle mappings between names and auxid_t.
Manage index tracking and synchronization of auxiliary data.
std::vector< size_t > vec
Recursively separate out template arguments in a C++ class name.
Interface providing I/O for a generic auxiliary store.
void upgrade()
Convert the lock from upgrade to exclusive.
Exception to signal a malformed class name.
bit_t size() const
Count the number of 1 bits in the set.
bool empty() const
Return true if there are no 1 bits in the set.
Base class for elements of a container that can have aux data.
void setStore(const SG::IConstAuxStore *store)
Set the store associated with this object.
Handle mappings between names and auxid_t.
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Manage index tracking and synchronization of auxiliary data.
Interface for objects taking part in direct ROOT I/O.
AuxStoreType
Type of the auxiliary store.
@ AST_ContainerStore
The store describes a container.
@ AST_ObjectStore
The store describes a single object.
virtual AuxStoreType getStoreType() const =0
Return the type of the store object.
virtual void setStore(IAuxStore *store)=0
Give an auxiliary store object to the holder object.
Interface providing I/O for a generic auxiliary store.
virtual SG::auxid_set_t getSelectedAuxIDs() const
Get a list of dynamic variables that need to be written out.
virtual const std::type_info * getIOType(SG::auxid_t auxid) const =0
Return the type of the data to be stored for one aux data item.
virtual const void * getIOData(SG::auxid_t auxid) const =0
Return a pointer to the data to be stored for one aux data item.
Interface for non-const operations on an auxiliary store.
Interface for const operations on an auxiliary store.
A set of aux data identifiers.
Class helping in dealing with dynamic branch selection.
Manager for EDM objects created by ROOT.
const THolder * holder() const
Accessor to the Holder object.
EventFormat m_inputEventFormat
Format of the current input file.
const std::string & name() const override
Get the name of the instance.
std::set< std::string > m_inputMissingObjects
Objects that have been asked for, but were found to be missing in the current input.
const void * getInputObject(SG::sgkey_t key, const std::type_info &ti, bool silent) override
Function for retrieving an input object in a non-template way.
upgrade_mutex_t m_branchesMutex
Mutex for multithread synchronization.
AthContainers_detail::upgrading_lock< upgrade_mutex_t > upgrading_lock_t
Lock type for multithread synchronization.
Object_t m_inputObjects
Collection of all the managed input objects.
static const char *const METADATA_OBJECT_NAME
Name of the metadata tree or RNTuple.
Event(std::string_view name)
Constructor with a name.
std::unordered_map< std::string, std::unique_ptr< TVirtualManager > > Object_t
Definition of the internal data structure type.
StatusCode keys(std::vector< std::string > &vkeys, bool metadata) const
Provide a list of all data object keys associated with a specific type.
void setActive() const
Set this event object as the currently active one.
SG::sgkey_t getHash(const std::string &key) const override
Function returning the hash describing an object name.
Object_t m_inputMetaObjects
Collection of all the managed input meta-objects.
std::unordered_map< std::string, std::set< std::string > > m_auxItemList
Rules for selecting which auxiliary branches to write.
EventFormat * m_outputEventFormat
Format of the current output file.
Object_t m_outputObjects
Collection of all the managed output object.
SG::SGKeyMap< BranchInfo > m_branches ATLAS_THREAD_SAFE
Map from hashed sgkey to BranchInfo.
std::vector< TVirtualIncidentListener * > m_listeners
Listeners who should be notified when certain incidents happen.
Object_t m_outputMetaObjects
Collection of all the managed output meta-objects.
ReadStats & stats()
Access the object belonging to the current thread.
static IOStats & instance()
Singleton object accessor.
Class describing the access statistics of a collection of branches.
void nextEvent()
Function incrementing the processed event counter.
BranchStats * container(const std::string &name)
Access the description of a container. Creating it if necessary.
void setBranchNum(::Int_t num)
Set the total number of branches on the input.
void readContainer(const std::string &name)
Function incrementing the read counter on a specific container.
Manager for TAuxStore objects.
TAuxStore * getStore()
Get a type-specific pointer to the managed object.
const SG::IConstAuxStore * getConstStore() const
Get a convenience pointer to the managed object.
"ROOT @c TTree implementation" of IAuxStore
Helper class for making sure the current directory is preserved.
EAuxMode
Auxiliary store "mode".
@ kAthenaAccess
Access containers/objects like Athena does.
@ kClassAccess
Access auxiliary data using the aux containers.
@ kBranchAccess
Access auxiliary data branch-by-branch.
::TTree * m_inMetaTree
Pointer to the metadata tree in the input file.
StatusCode connectObject(const std::string &key, bool silent) override
Function setting up access to a particular object.
StatusCode connectMetaAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches for a metadata object.
StatusCode connectAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches.
bool hasOutput() const override
Check if an output file is connected to the object.
std::unique_ptr< TChainStateTracker > m_inChainTracker
Optional object for tracking the state changes of an input TChain.
::Int_t getEntry(::Long64_t entry, ::Int_t getall=0) override
Function loading a given entry of the input TTree.
StatusCode setAuxStore(const std::string &key, Details::IObjectManager &mgr, bool metadata) override
Function connecting a DV object to its auxiliary store.
EAuxMode auxMode() const
Get what auxiliary access mode the object was constructed with.
bool hasInput() const override
Check if an input file is connected to the object.
StatusCode initStats()
Function to initialise the statistics for all Tree content.
::Long64_t m_entry
The entry to look at from the input tree.
::Long64_t getFiles() const
Get how many files are available on the currently defined input.
void setOtherMetaDataTreeNamePattern(const std::string &pattern)
Change the pattern used for collecting information from other MetaData trees NB: Additional MetaData ...
StatusCode finishWritingTo(TFile &file) override
Finish writing to an output file.
StatusCode getNames(const std::string &targetClassName, std::vector< std::string > &vkeys, bool metadata) const override
Function determining the list keys associated with a type name.
StatusCode setUpDynamicStore(TObjectManager &mgr, ::TTree *tree)
Function adding dynamic variable reading capabilities to an auxiliary store object.
std::regex m_otherMetaDataTreeNamePattern
::TChain * m_inChain
The (optional) chain provided as input.
StatusCode putAux(::TTree &outTree, TVirtualManager &mgr, bool metadata)
Function saving the dynamically created auxiliary properties.
EAuxMode m_auxMode
The auxiliary access mode.
::Int_t fill() override
Function filling one event into the output tree.
StatusCode readFrom(::TFile &inFile) override
Set up the reading of an input file from TFile This method implements the interface from Event.
virtual ~TEvent()
Destructor.
TEvent(EAuxMode mode=kClassAccess)
Default constructor.
SG::IAuxStore * recordAux(const std::string &key, SG::IAuxStoreHolder::AuxStoreType type=SG::IAuxStoreHolder::AST_ContainerStore)
Add an auxiliary store object to the output.
StatusCode record(void *obj, const std::string &typeName, const std::string &key, bool overwrite, bool metadata, bool isOwner) override
Record an object into a connected output file.
std::unique_ptr<::TTree > m_outTree
The tree that we are writing to.
bool m_inTreeMissing
Internal status flag showing that an input file is open, but it doesn't contain an event tree.
::Int_t m_inTreeNumber
The number of the currently open tree in the input chain.
::Int_t getFile(::Long64_t file, ::Int_t getall=0)
Load the first event for a given file from the input TChain.
StatusCode writeTo(TFile &file) override
Connect the object to an output file.
::TTree * m_inTree
The main tree that we are reading from.
StatusCode connectMetaObject(const std::string &key, bool silent) override
Function setting up access to a particular metadata object.
::Long64_t getEntries() const override
Get how many entries are available from the current input file(s)
void add(std::string_view fileName)
Add information about a new file that got accessed.
static TFileAccessTracer & instance()
Access the singleton instance of this class.
This class takes care of holding EDM objects in memory.
void setOwner(::Bool_t state=kTRUE)
Set whether the holder should own its object.
void ** getPtr()
Return a typeless pointer to the held object's pointer.
const ::TClass * getClass() const
virtual void * getAs(const std::type_info &tid, ::Bool_t silent=kFALSE) const
Return the object as a specific pointer.
@ DATAVECTOR
A DataVector container.
@ AUXELEMENT
A type inheriting from SG::AuxElement.
Class describing a certain "incident" that is communicated to user code.
Manager for EDM objects created by ROOT.
::TBranch ** branchPtr()
Pointer to the branch's pointer.
virtual void setObject(void *obj) override
Function replacing the object being handled.
virtual::Int_t getEntry(::Int_t getall=0) override
Function for updating the object in memory if needed.
::TBranch * branch()
Accessor to the branch.
Class providing an interface for classes listening to xAOD incidents.
Interface class for the "manager classes".
virtual const void * object() const =0
Function getting a const pointer to the object being handled.
virtual::Int_t getEntry(::Int_t getall=0)=0
Function for updating the object in memory if needed.
void setStructMode(EStructMode mode)
Set the structure mode of the object to a new value.
EStructMode
"Structural" modes of the object
@ kUndefinedStore
The structure mode is not defined.
@ kObjectStore
The object describes a single object.
@ kContainerStore
The object describes an entire container.
EStructMode structMode() const
Get what structure mode the object was constructed with.
std::vector< std::string > files
file names and file pointers
std::string normalizedTypeinfoName(const std::type_info &info)
Convert a type_info to a normalized string representation (matching the names used in the root dictio...
size_t auxid_t
Identifier for a particular aux data item.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
bool hasAuxStore(const TClass &cl)
Helper function deciding if a given type "has an auxiliary store".
bool isAuxStore(const TClass &cl)
Helper function deciding if a given type "is an auxiliary store".
bool isStandalone(const TClass &cl)
Helper function deciding if a given type "is a standalone object".
static const ::Int_t BeginEvent
A new event was just loaded.
static const ::Int_t EndInputFile
The processing of an input file has finished.
static const ::Int_t MetaDataStop
The metadata for the output file should be written out.
static const ::Int_t BeginInputFile
A new input file was just opened.
std::string dynBranchPrefix(const std::string &key)
This function is used to figure out what to name dynamic auxiliary branches coming from a container c...
char rootType(char typeidType)
This function is used internally in the code when creating primitive dynamic auxiliary branches.
std::string getFirstBranchMatch(TTree *tree, const std::string &pre)
This function is used to search for a branch in a TTree that contains a given substring.
std::string getTypeName(const std::type_info &ti)
This function is necessary in order to create type names that ROOT can understand.
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
EventFormat_v1 EventFormat
Definition of the current event format version.
static const ::Int_t CACHE_SIZE
Size of a possible TTreeCache.
Helper to disable undefined behavior sanitizer for a function.
Convert a type_info to a normalized string representation (matching the names used in the root dictio...