Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-15 09:13:00

0001 // Copyright 2024, Jefferson Science Associates, LLC.
0002 // Subject to the terms in the LICENSE file found in the top-level directory.
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 };