File indexing completed on 2026-09-15 09:13:00
0001
0002
0003
0004 #pragma once
0005 #include <JANA/JException.h>
0006 #include <ostream>
0007 #include <sstream>
0008 #include <vector>
0009 #include <map>
0010
0011 enum class JEventLevel { Run, Subrun, SlowControls, Timeframe, Timeslice, Block, PhysicsEvent, Subevent, Task, None };
0012
0013 inline std::ostream& operator<<(std::ostream& os, JEventLevel level) {
0014 switch (level) {
0015 case JEventLevel::Run: os << "Run"; break;
0016 case JEventLevel::Subrun: os << "Subrun"; break;
0017 case JEventLevel::Timeframe: os << "Timeframe"; break;
0018 case JEventLevel::Timeslice: os << "Timeslice"; break;
0019 case JEventLevel::Block: os << "Block"; break;
0020 case JEventLevel::SlowControls: os << "SlowControls"; break;
0021 case JEventLevel::PhysicsEvent: os << "PhysicsEvent"; break;
0022 case JEventLevel::Subevent: os << "Subevent"; break;
0023 case JEventLevel::Task: os << "Task"; break;
0024 default: os << "None"; break;
0025 }
0026 return os;
0027 }
0028
0029 inline char toChar(JEventLevel level) {
0030 switch (level) {
0031 case JEventLevel::Run: return 'R';
0032 case JEventLevel::Subrun: return 'r';
0033 case JEventLevel::Timeframe: return 'F';
0034 case JEventLevel::Timeslice: return 'T';
0035 case JEventLevel::Block: return 'B';
0036 case JEventLevel::SlowControls: return 'C';
0037 case JEventLevel::PhysicsEvent: return 'P';
0038 case JEventLevel::Subevent: return 'p';
0039 case JEventLevel::Task: return 't';
0040 default: return 'X';
0041 }
0042 }
0043
0044 inline std::string toString(JEventLevel level) {
0045 std::stringstream ss;
0046 ss << level;
0047 return ss.str();
0048 }
0049
0050 inline JEventLevel parseEventLevel(const std::string& level) {
0051 if (level == "Run") return JEventLevel::Run;
0052 if (level == "Subrun") return JEventLevel::Subrun;
0053 if (level == "Timeframe") return JEventLevel::Timeframe;
0054 if (level == "Timeslice") return JEventLevel::Timeslice;
0055 if (level == "Block") return JEventLevel::Block;
0056 if (level == "SlowControls") return JEventLevel::SlowControls;
0057 if (level == "PhysicsEvent") return JEventLevel::PhysicsEvent;
0058 if (level == "Subevent") return JEventLevel::Subevent;
0059 if (level == "Task") return JEventLevel::Task;
0060 if (level == "None") return JEventLevel::None;
0061 throw JException("Invalid JEventLevel '%s'", level.c_str());
0062 }
0063
0064
0065 inline JEventLevel next_level(JEventLevel current_level) {
0066 switch (current_level) {
0067 case JEventLevel::Run: return JEventLevel::Subrun;
0068 case JEventLevel::Subrun: return JEventLevel::Timeslice;
0069 case JEventLevel::Timeframe: return JEventLevel::Timeslice;
0070 case JEventLevel::Timeslice: return JEventLevel::Block;
0071 case JEventLevel::Block: return JEventLevel::SlowControls;
0072 case JEventLevel::SlowControls: return JEventLevel::PhysicsEvent;
0073 case JEventLevel::PhysicsEvent: return JEventLevel::Subevent;
0074 case JEventLevel::Subevent: return JEventLevel::Task;
0075 case JEventLevel::Task: return JEventLevel::None;
0076 default: return JEventLevel::None;
0077 }
0078 }
0079
0080 class JEventLevelHierarchy {
0081 std::vector<JEventLevel> m_bottom_levels;
0082 std::vector<JEventLevel> m_parent_levels;
0083 std::vector<JEventLevel> m_all_levels;
0084 std::map<JEventLevel, std::vector<JEventLevel>> parents;
0085 std::map<JEventLevel, std::vector<JEventLevel>> children;
0086
0087 private:
0088 void ToString(std::stringstream& ss, JEventLevel current) {
0089 ss << current;
0090 auto it = parents.find(current);
0091 if (it != parents.end()) {
0092 ss << "(";
0093 size_t parent_count = it->second.size();
0094 for (size_t i=0; i<parent_count; ++i) {
0095 ToString(ss, it->second[i]);
0096 if (i != parent_count-1) {
0097 ss << ", ";
0098 }
0099 }
0100 ss << ")";
0101 }
0102 }
0103
0104 public:
0105
0106 const std::vector<JEventLevel>& GetAllLevels() const {
0107 return m_all_levels;
0108 }
0109 const std::vector<JEventLevel>& GetParentLevels() const {
0110 return m_parent_levels;
0111 }
0112 const std::vector<JEventLevel>& GetBottomLevels() const {
0113 return m_bottom_levels;
0114 }
0115 void AddBottomLevel(JEventLevel level) {
0116 m_all_levels.push_back(level);
0117 m_bottom_levels.push_back(level);
0118 }
0119 void AddParentLevel(JEventLevel child, JEventLevel parent) {
0120 m_all_levels.push_back(parent);
0121 m_parent_levels.push_back(parent);
0122 parents[child].push_back(parent);
0123 children[parent].push_back(child);
0124 }
0125 std::string ToString() {
0126 std::stringstream ss;
0127 for (size_t i=0; i<m_bottom_levels.size(); ++i) {
0128 ToString(ss, m_bottom_levels[i]);
0129 if (i != m_bottom_levels.size()-1) {
0130 ss << ", ";
0131 }
0132 }
0133 return ss.str();
0134 }
0135 };