File indexing completed on 2024-09-28 07:03:04
0001
0002
0003
0004
0005 #include <JANA/JException.h>
0006 #include <Parsers/Printout.h>
0007 #include <TGeoManager.h>
0008 #include <fmt/color.h>
0009 #include <fmt/core.h>
0010 #include <fmt/format.h>
0011 #include <algorithm>
0012 #include <cstdlib>
0013 #include <exception>
0014 #include <filesystem>
0015 #include <iostream>
0016 #include <stdexcept>
0017 #include <utility>
0018 #include <vector>
0019
0020 #include "DD4hep_service.h"
0021 #include "services/log/Log_service.h"
0022
0023
0024
0025
0026 void DD4hep_service::acquire_services(JServiceLocator *srv_locator) {
0027
0028 auto log_service = srv_locator->get<Log_service>();
0029 m_log = log_service->logger("dd4hep");
0030
0031
0032 std::string print_level_str{"WARNING"};
0033 m_app->SetDefaultParameter("dd4hep:print_level", print_level_str, "Set DD4hep print level (see DD4hep/Printout.h)");
0034 dd4hep::setPrintLevel(dd4hep::decodePrintLevel(print_level_str));
0035
0036
0037 TGeoManager::SetVerboseLevel(dd4hep::printLevel() <= dd4hep::PrintLevel::INFO ? 1 : 0);
0038 }
0039
0040
0041
0042
0043 DD4hep_service::~DD4hep_service(){
0044 try {
0045 if(m_dd4hepGeo) m_dd4hepGeo->destroyInstance();
0046 m_dd4hepGeo = nullptr;
0047 } catch (...) {}
0048 }
0049
0050
0051
0052
0053
0054
0055
0056 gsl::not_null<const dd4hep::Detector*>
0057 DD4hep_service::detector() {
0058 std::call_once(init_flag, &DD4hep_service::Initialize, this);
0059 return m_dd4hepGeo.get();
0060 }
0061
0062
0063
0064
0065
0066
0067
0068 gsl::not_null<const dd4hep::rec::CellIDPositionConverter*>
0069 DD4hep_service::converter() {
0070 std::call_once(init_flag, &DD4hep_service::Initialize, this);
0071 return m_cellid_converter.get();
0072 }
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082 void DD4hep_service::Initialize() {
0083
0084 if (m_dd4hepGeo) {
0085 m_log->warn("DD4hep_service already initialized!");
0086 }
0087
0088
0089
0090
0091
0092 auto *detector_config_env = std::getenv("DETECTOR_CONFIG");
0093 auto *detector_path_env = std::getenv("DETECTOR_PATH");
0094
0095 std::string detector_config;
0096
0097 if(detector_config_env != nullptr) {
0098 detector_config = detector_config_env;
0099 }
0100
0101
0102 if(!detector_config.empty()) {
0103 m_xml_files.push_back(std::string(detector_path_env ? detector_path_env : ".") + "/" + detector_config + ".xml");
0104 }
0105
0106
0107
0108 m_app->SetDefaultParameter("dd4hep:xml_files", m_xml_files, "Comma separated list of XML files describing the DD4hep geometry. (Defaults to ${DETECTOR_PATH}/${DETECTOR_CONFIG}.xml using envars.)");
0109
0110 if( m_xml_files.empty() ){
0111 m_log->error("No dd4hep XML file specified for the geometry!");
0112 m_log->error("Set your DETECTOR_PATH and DETECTOR_CONFIG environment variables");
0113 m_log->error("(the latter is typically done by sourcing the thisepic.sh");
0114 m_log->error("script the epic directory.)");
0115 throw std::runtime_error("No dd4hep XML file specified.");
0116 }
0117
0118
0119
0120
0121 auto tickerEnabled = m_app->IsTickerEnabled();
0122 m_app->SetTicker( false );
0123
0124
0125 auto detector = dd4hep::Detector::make_unique("");
0126 try {
0127 m_log->info("Loading DD4hep geometry from {} files", m_xml_files.size());
0128 for (auto &filename : m_xml_files) {
0129
0130 auto resolved_filename = resolveFileName(filename, detector_path_env);
0131
0132 m_log->info(" - loading geometry file: '{}' (patience ....)", resolved_filename);
0133 try {
0134 detector->fromCompact(resolved_filename);
0135 } catch(std::runtime_error &e) {
0136 throw JException(e.what());
0137 }
0138 }
0139 detector->volumeManager();
0140 detector->apply("DD4hepVolumeManager", 0, nullptr);
0141 m_cellid_converter = std::make_unique<const dd4hep::rec::CellIDPositionConverter>(*detector);
0142 m_dd4hepGeo = std::move(detector);
0143
0144 m_log->info("Geometry successfully loaded.");
0145 } catch(std::exception &e) {
0146 m_log->error("Problem loading geometry: {}", e.what());
0147 throw std::runtime_error(fmt::format("Problem loading geometry: {}", e.what()));
0148 }
0149
0150
0151 m_app->SetTicker( tickerEnabled );
0152 }
0153
0154 std::string DD4hep_service::resolveFileName(const std::string &filename, char *detector_path_env) {
0155
0156 std::string result(filename);
0157
0158
0159 if( ! std::filesystem::exists(result) ){
0160
0161
0162 if(detector_path_env) {
0163
0164
0165 result = std::string(detector_path_env) + "/" + filename;
0166
0167 if( ! std::filesystem::exists(result) ) {
0168
0169
0170
0171 auto mess = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), "ERROR: ");
0172 mess += fmt::format(fmt::emphasis::bold, "file: {} does not exist!", filename);
0173 mess += "\nCheck that your DETECTOR_PATH and DETECTOR_CONFIG environment variables are set correctly.";
0174 std::cerr << std::endl << std::endl << mess << std::endl << std::endl;
0175 std::_Exit(EXIT_FAILURE);
0176 }
0177 }
0178 }
0179 return result;
0180 }