4 #include "TTreeIndex.h"
7 #include <unordered_map>
12 switch (m_accessMode) {
13 case AccessMode::Read:
14 m_data.chain =
new TChain(
"NAIAChain");
15 m_rti.chain =
new TChain(
"RTI");
16 m_file.chain =
new TChain(
"FileInfo");
18 case AccessMode::Write:
19 m_data.tree =
new TTree(
"NAIAChain",
"AMS-Italy ntuple tree");
20 m_rti.tree =
new TTree(
"RTI",
"RTIInfo tree");
21 m_file.tree =
new TTree(
"FileInfo",
"FileInfo tree");
24 throw std::runtime_error(
"NAIAChain::GetEntries - Unrecognized access mode");
29 static int currentTree = -1;
34 spdlog::trace(
"Event {} -> CHANGING TREE", iEv);
49 static unsigned int lastSec = 0;
52 throw(std::runtime_error(
"GetEventRTIInfo called on a MC chain"));
58 throw std::runtime_error(
59 fmt::format(
"Failed to read entry for UTC second {} from RTI tree. (ec: {})",
m_event.
header->
UTCTime, rc));
67 static unsigned int lastRun = 0;
78 static unsigned int lastRun = 0;
81 throw(std::runtime_error(
"GetEventMCFileInfo called on a non-MC chain"));
92 static const std::string &fnName =
"NAIAChain::GetRTITree";
99 logger->error(
"Not supported in Write mode");
102 throw std::runtime_error(
"NAIAChain::GetRTITree - Unrecognized access mode");
107 static const std::string &fnName =
"NAIAChain::GetFileInfoTree";
114 logger->error(
"Not supported in Write mode");
117 throw std::runtime_error(
"NAIAChain::GetFileInfoTree - Unrecognized access mode");
141 throw std::runtime_error(
"NAIAChain::Add - Unrecognized access mode");
152 throw std::runtime_error(
"NAIAChain::Fill - Unrecognized access mode");
163 throw std::runtime_error(
"NAIAChain::FillRTI - Unrecognized access mode");
174 throw std::runtime_error(
"NAIAChain::FillFileInfo - Unrecognized access mode");
185 throw std::runtime_error(
"NAIAChain::GetEntries - Unrecognized access mode");
200 throw std::runtime_error(
"NAIAChain::Print - Unrecognized access mode");
215 spdlog::debug(
"Building RTIInfo index");
216 m_rti.
tree->BuildIndex(
"RTIInfo.UTCTime");
220 m_data.
tree->BuildIndex(
"HeaderData.Run",
"HeaderData.EventNo");
223 throw std::runtime_error(
"NAIAChain::Write - Unrecognized access mode");
247 if (create_MC_branches)
252 throw std::runtime_error(
"NAIAChain::SetupBranches - Unrecognized access mode");
257 {
"EventSummary", [](
Event &event) {
event.evSummary.DisableIO(); }},
258 {
"DAQ", [](
Event &event) {
event.daq.DisableIO(); }},
259 {
"TofBase", [](
Event &event) {
event.tofBase.DisableIO(); }},
260 {
"TofPlus", [](
Event &event) {
event.tofPlus.DisableIO(); }},
261 {
"TofBaseStandalone", [](
Event &event) {
event.tofBaseSt.DisableIO(); }},
262 {
"TofPlusStandalone", [](
Event &event) {
event.tofPlusSt.DisableIO(); }},
263 {
"EcalBase", [](
Event &event) {
event.ecalBase.DisableIO(); }},
264 {
"EcalPlus", [](
Event &event) {
event.ecalPlus.DisableIO(); }},
265 {
"TrTrackBase", [](
Event &event) {
event.trTrackBase.DisableIO(); }},
266 {
"TrTrackPlus", [](
Event &event) {
event.trTrackPlus.DisableIO(); }},
267 {
"SecondTrTrackBase", [](
Event &event) {
event.secondTrTrackBase.DisableIO(); }},
268 {
"TrTrackBaseStandalone", [](
Event &event) {
event.trTrackBaseSt.DisableIO(); }},
269 {
"TrdKBase", [](
Event &event) {
event.trdKBase.DisableIO(); }},
270 {
"TrdKBaseStandalone", [](
Event &event) {
event.trdKBaseSt.DisableIO(); }},
271 {
"RichBase", [](
Event &event) {
event.richBase.DisableIO(); }},
272 {
"RichPlus", [](
Event &event) {
event.richPlus.DisableIO(); }},
273 {
"UnbExtHitBase", [](
Event &event) {
event.extHitBase.DisableIO(); }},
274 {
"MCTruthBase", [](
Event &event) {
event.mcTruthBase.DisableIO(); }},
275 {
"MCTruthPlus", [](
Event &event) {
event.mcTruthPlus.DisableIO(); }},
279 static const std::string &fnName =
"NAIAChain::CreateSkimTree";
282 auto outFile = std::make_unique<TFile>(filename.c_str(),
"recreate");
284 newChain->m_isMC =
m_isMC;
286 if (!exclBranches.empty()) {
287 for (
const std::string &container :
TokenizeString(exclBranches,
';')) {
289 logger->info(
"Disabling container {}", container);
292 logger->error(
"Unknown container {}", container);
298 newChain->m_event.MirrorBranches(newChain->m_data.tree,
m_event);
300 return {std::move(outFile), std::move(newChain),
this};
304 static const std::string &fnName =
"NAIAChain::SetEntryList";
309 logger->error(
"TEntryList not supported in Write mode");
320 static const std::string &fnName =
"NAIAChain::CheckVersion";
323 NAIA::Version this_version{};
325 auto file = std::unique_ptr<TFile>(TFile::Open(filePath.c_str()));
326 NAIA::Version *file_version = file->Get<NAIA::Version>(
"VersionHeader");
328 logger->error(
"NAIA version header not found in file {}. This file will be skipped.", filePath);
332 if (file_version->major != this_version.major) {
333 logger->error(
"Major version mismatch in file {} ({} on file vs {} in this library). This file will be skipped.",
334 filePath, file_version->major, this_version.major);
338 if (file_version->minor != this_version.minor) {
339 logger->warn(
"Minor version mismatch in file {} ({} on file vs {} in this library). This should be fine, however "
340 "please report any issue to the NAIA development team.",
341 filePath, file_version->minor, this_version.minor);