File indexing completed on 2025-08-05 08:17:46
0001 #include "PHG4DetectorGroupSubsystem.h"
0002
0003 #include <g4main/PHG4Subsystem.h> // for PHG4Subsystem
0004
0005 #include <phparameter/PHParameters.h>
0006 #include <phparameter/PHParametersContainer.h>
0007
0008 #include <pdbcalbase/PdbParameterMapContainer.h>
0009
0010 #include <phool/PHCompositeNode.h>
0011 #include <phool/PHDataNode.h>
0012 #include <phool/PHNode.h> // for PHNode
0013 #include <phool/PHNodeIterator.h>
0014 #include <phool/getClass.h>
0015 #include <phool/phool.h>
0016
0017 #include <TSystem.h>
0018
0019 #include <boost/format.hpp>
0020
0021
0022 #pragma GCC diagnostic push
0023 #pragma GCC diagnostic ignored "-Wshadow"
0024 #include <boost/stacktrace.hpp>
0025 #pragma GCC diagnostic pop
0026
0027 #include <cassert> // for assert
0028 #include <cstdlib> // for exit
0029 #include <iostream>
0030 #include <sstream>
0031
0032 PHG4DetectorGroupSubsystem::PHG4DetectorGroupSubsystem(const std::string &name, const int lyr)
0033 : PHG4Subsystem(name)
0034 , m_ParamsContainerDefault(new PHParametersContainer(Name()))
0035 , m_Layer(lyr)
0036 {
0037
0038
0039 std::ostringstream nam;
0040 nam << name << "_" << lyr;
0041 Name(nam.str());
0042 }
0043
0044 int PHG4DetectorGroupSubsystem::Init(PHCompositeNode *topNode)
0045 {
0046 m_SaveTopNode = topNode;
0047 m_ParamsContainerDefault->set_name(Name());
0048 int iret = InitSubsystem(topNode);
0049 return iret;
0050 }
0051
0052 int PHG4DetectorGroupSubsystem::InitRun(PHCompositeNode *topNode)
0053 {
0054 PHNodeIterator iter(topNode);
0055 PHCompositeNode *parNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "PAR"));
0056 PHCompositeNode *runNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "RUN"));
0057
0058 std::string g4geonodename = "G4GEO_";
0059 std::string paramnodename = "G4GEOPARAM_";
0060 std::string calibdetname;
0061 int isSuperDetector = 0;
0062 if (m_SuperDetector != "NONE")
0063 {
0064 g4geonodename += SuperDetector();
0065 m_ParamsContainer = findNode::getClass<PHParametersContainer>(parNode, g4geonodename);
0066 if (!m_ParamsContainer)
0067 {
0068 PHNodeIterator parIter(parNode);
0069 PHCompositeNode *DetNode = dynamic_cast<PHCompositeNode *>(parIter.findFirst("PHCompositeNode", SuperDetector()));
0070 if (!DetNode)
0071 {
0072 DetNode = new PHCompositeNode(SuperDetector());
0073 parNode->addNode(DetNode);
0074 }
0075 m_ParamsContainer = new PHParametersContainer(m_SuperDetector);
0076 DetNode->addNode(new PHDataNode<PHParametersContainer>(m_ParamsContainer, g4geonodename));
0077 }
0078 paramnodename += m_SuperDetector;
0079 calibdetname = m_SuperDetector;
0080 isSuperDetector = 1;
0081 }
0082 else
0083 {
0084 m_ParamsContainer = new PHParametersContainer(Name());
0085 g4geonodename += m_ParamsContainer->Name();
0086 parNode->addNode(new PHDataNode<PHParametersContainer>(m_ParamsContainer, g4geonodename));
0087 paramnodename += m_ParamsContainer->Name();
0088 calibdetname = m_ParamsContainer->Name();
0089 }
0090
0091 PHParametersContainer::ConstRange begin_end = m_ParamsContainerDefault->GetAllParameters();
0092 for (PHParametersContainer::ConstIterator piter = begin_end.first; piter != begin_end.second; ++piter)
0093 {
0094 m_ParamsContainer->AddPHParameters(piter->first, piter->second);
0095 }
0096
0097
0098 m_ParamsContainerDefault->clear();
0099 delete m_ParamsContainerDefault;
0100 m_ParamsContainerDefault = nullptr;
0101
0102
0103
0104
0105
0106 if (get_filetype() != PHG4DetectorGroupSubsystem::none)
0107 {
0108 ReadParamsFromFile(calibdetname, get_filetype(), isSuperDetector);
0109 }
0110 else
0111 {
0112
0113
0114
0115 PdbParameterMapContainer *nodeparams = findNode::getClass<PdbParameterMapContainer>(topNode, paramnodename);
0116 if (nodeparams)
0117 {
0118 m_ParamsContainer->FillFrom(nodeparams);
0119 }
0120 }
0121
0122
0123 UpdateParametersWithMacro();
0124
0125 PHCompositeNode *RunDetNode = runNode;
0126 if (m_SuperDetector != "NONE")
0127 {
0128 PHNodeIterator runIter(runNode);
0129 RunDetNode = dynamic_cast<PHCompositeNode *>(runIter.findFirst("PHCompositeNode", SuperDetector()));
0130 if (!RunDetNode)
0131 {
0132 RunDetNode = new PHCompositeNode(SuperDetector());
0133 runNode->addNode(RunDetNode);
0134 }
0135 }
0136 m_ParamsContainer->SaveToNodeTree(RunDetNode, paramnodename);
0137
0138
0139
0140 DefineMaterials();
0141 int iret = InitRunSubsystem(topNode);
0142 m_ParamsContainer->UpdateNodeTree(RunDetNode, paramnodename);
0143 if (Verbosity() > 0)
0144 {
0145 PdbParameterMapContainer *nodeparams = findNode::getClass<PdbParameterMapContainer>(topNode, paramnodename);
0146 std::cout << Name() << std::endl;
0147 nodeparams->print();
0148 }
0149 m_BeginRunExecutedFlag = 1;
0150 return iret;
0151 }
0152
0153 void PHG4DetectorGroupSubsystem::SuperDetector(const std::string &name)
0154 {
0155 m_SuperDetector = name;
0156 return;
0157 }
0158
0159 double PHG4DetectorGroupSubsystem::get_double_param(const int detid, const std::string &name) const
0160 {
0161 const PHParameters *params = m_ParamsContainer->GetParameters(detid);
0162 if (params)
0163 {
0164 return params->get_double_param(name);
0165 }
0166 else
0167 {
0168 std::cout << PHWHERE << " no parameters for detid " << detid << std::endl;
0169 gSystem->Exit(1);
0170 exit(1);
0171 }
0172 }
0173
0174 int PHG4DetectorGroupSubsystem::get_int_param(const int detid, const std::string &name) const
0175 {
0176 const PHParameters *params = m_ParamsContainer->GetParameters(detid);
0177 if (params)
0178 {
0179 return params->get_int_param(name);
0180 }
0181 else
0182 {
0183 std::cout << PHWHERE << " no parameters for detid " << detid << std::endl;
0184 gSystem->Exit(1);
0185 exit(1);
0186 }
0187 }
0188
0189 std::string
0190 PHG4DetectorGroupSubsystem::get_string_param(const int detid, const std::string &name) const
0191 {
0192 const PHParameters *params = m_ParamsContainer->GetParameters(detid);
0193 if (params)
0194 {
0195 return params->get_string_param(name);
0196 }
0197 else
0198 {
0199 std::cout << PHWHERE << " no parameters for detid " << detid << std::endl;
0200 gSystem->Exit(1);
0201 exit(1);
0202 }
0203 }
0204
0205 void PHG4DetectorGroupSubsystem::set_double_param(const int detid, const std::string &name, const double dval)
0206 {
0207 auto iter = m_DefaultDoubleParamsMap.find(detid);
0208 if (iter == m_DefaultDoubleParamsMap.end())
0209 {
0210 std::cout << "called like set_double_param(" << detid << ", \""
0211 << name << "\", " << dval << ")" << std::endl;
0212 std::cout << "detid " << detid << " not implemented" << std::endl;
0213 std::cout << "implemented detector ids: " << std::endl;
0214 for (auto &iter2 : m_DefaultDoubleParamsMap)
0215 {
0216 std::cout << "detid: " << iter2.first << std::endl;
0217 }
0218 return;
0219 }
0220 if (iter->second.find(name) == iter->second.end())
0221 {
0222 std::cout << "double parameter " << name << " not implemented for detid "
0223 << detid << std::endl;
0224 std::cout << "implemented double parameters are:" << std::endl;
0225 for (auto &iter2 : iter->second)
0226 {
0227 std::cout << iter2.first << std::endl;
0228 }
0229 return;
0230 }
0231
0232
0233
0234
0235
0236
0237 std::map<const std::string, double> newdmap;
0238 auto ret = m_MacroDoubleParamsMap.insert(make_pair(detid, newdmap));
0239
0240
0241
0242
0243
0244 ret.first->second[name] = dval;
0245 return;
0246 }
0247
0248 void PHG4DetectorGroupSubsystem::set_int_param(const int detid, const std::string &name, const int ival)
0249 {
0250 auto iter = m_DefaultIntegerParamsMap.find(detid);
0251 if (iter == m_DefaultIntegerParamsMap.end())
0252 {
0253 std::cout << "called like set_int_param(" << detid << ", \""
0254 << name << "\", " << ival << ")" << std::endl;
0255 std::cout << "detid " << detid << " not implemented" << std::endl;
0256 std::cout << "implemented detector ids: " << std::endl;
0257 for (auto &iter2 : m_DefaultIntegerParamsMap)
0258 {
0259 std::cout << "detid: " << iter2.first << std::endl;
0260 }
0261 return;
0262 }
0263 if (iter->second.find(name) == iter->second.end())
0264 {
0265 std::cout << "int parameter " << name << " not implemented for detid"
0266 << detid << std::endl;
0267 std::cout << "implemented int parameters are:" << std::endl;
0268 for (auto &iter2 : iter->second)
0269 {
0270 std::cout << iter2.first << std::endl;
0271 }
0272 return;
0273 }
0274
0275
0276 std::map<const std::string, int> newintmap;
0277 auto ret = m_MacroIntegerParamsMap.insert(make_pair(detid, newintmap));
0278
0279
0280
0281
0282
0283 ret.first->second[name] = ival;
0284 }
0285
0286 void PHG4DetectorGroupSubsystem::set_string_param(const int detid, const std::string &name, const std::string &sval)
0287 {
0288 auto iter = m_DefaultStringParamsMap.find(detid);
0289 if (iter == m_DefaultStringParamsMap.end())
0290 {
0291 std::cout << "called like set_string_param(" << detid << ", \""
0292 << name << "\", " << sval << ")" << std::endl;
0293 std::cout << "detid " << detid << " not implemented" << std::endl;
0294 std::cout << "implemented detector ids: " << std::endl;
0295 for (auto &iter2 : m_DefaultStringParamsMap)
0296 {
0297 std::cout << "detid: " << iter2.first << std::endl;
0298 }
0299 return;
0300 }
0301 if (iter->second.find(name) == iter->second.end())
0302 {
0303 std::cout << "string parameter " << name << " not implemented for detid "
0304 << detid << std::endl;
0305 std::cout << "implemented string parameters are:" << std::endl;
0306 for (auto &iter2 : iter->second)
0307 {
0308 std::cout << iter2.first << std::endl;
0309 }
0310 return;
0311 }
0312
0313
0314
0315
0316
0317
0318
0319 std::map<const std::string, std::string> newdmap;
0320 auto ret = m_MacroStringParamsMap.insert(make_pair(detid, newdmap));
0321
0322
0323
0324
0325
0326 ret.first->second[name] = sval;
0327 return;
0328 }
0329
0330 void PHG4DetectorGroupSubsystem::UpdateParametersWithMacro()
0331 {
0332 for (auto &iter1 : m_MacroDoubleParamsMap)
0333 {
0334 PHParameters *params = GetParamsContainer()->GetParametersToModify(iter1.first);
0335 for (auto &iter2 : iter1.second)
0336 {
0337 params->set_double_param(iter2.first, iter2.second);
0338 }
0339 }
0340
0341 for (auto &iter1 : m_MacroIntegerParamsMap)
0342 {
0343 PHParameters *params = GetParamsContainer()->GetParametersToModify(iter1.first);
0344 for (auto &iter2 : iter1.second)
0345 {
0346 params->set_int_param(iter2.first, iter2.second);
0347 }
0348 }
0349
0350 for (auto &iter1 : m_MacroStringParamsMap)
0351 {
0352 PHParameters *params = GetParamsContainer()->GetParametersToModify(iter1.first);
0353 for (auto &iter2 : iter1.second)
0354 {
0355 params->set_string_param(iter2.first, iter2.second);
0356 }
0357 }
0358 return;
0359 }
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373 void PHG4DetectorGroupSubsystem::set_default_double_param(const int detid, const std::string &name, const double dval)
0374 {
0375 std::map<const std::string, double> newdoublemap;
0376 auto ret = m_DefaultDoubleParamsMap.insert(make_pair(detid, newdoublemap));
0377 auto ret2 = ret.first->second.insert(make_pair(name, dval));
0378 if (ret2.second == false)
0379 {
0380 std::cout << PHWHERE << "Default double Parameter " << name
0381 << " for detid " << detid << " already set to "
0382 << ret.first->second[name] << " will not overwrite with " << dval << std::endl;
0383 std::cout << "Means: You are calling set_default_double_param twice for the same parameter" << std::endl;
0384 std::cout << "Please make up your mind and call it only once using the correct default" << std::endl;
0385 gSystem->Exit(1);
0386 exit(1);
0387 }
0388 return;
0389 }
0390
0391 void PHG4DetectorGroupSubsystem::set_default_int_param(const int detid, const std::string &name, const int ival)
0392 {
0393 std::map<const std::string, int> newintmap;
0394 auto ret = m_DefaultIntegerParamsMap.insert(make_pair(detid, newintmap));
0395 auto ret2 = ret.first->second.insert(make_pair(name, ival));
0396 if (ret2.second == false)
0397 {
0398 std::cout << PHWHERE << "Default integer Parameter " << name
0399 << " for detid " << detid << " already set to "
0400 << ret.first->second[name] << " will not overwrite with " << ival << std::endl;
0401 std::cout << "Means: You are calling set_default_int_param twice for the same parameter" << std::endl;
0402 std::cout << "Please make up your mind and call it only once using the correct default" << std::endl;
0403 gSystem->Exit(1);
0404 exit(1);
0405 }
0406 return;
0407 }
0408
0409 void PHG4DetectorGroupSubsystem::set_default_string_param(const int detid, const std::string &name, const std::string &sval)
0410 {
0411 std::map<const std::string, std::string> newstringmap;
0412 auto ret = m_DefaultStringParamsMap.insert(make_pair(detid, newstringmap));
0413 auto ret2 = ret.first->second.insert(make_pair(name, sval));
0414 if (ret2.second == false)
0415 {
0416 std::cout << PHWHERE << "Default String Parameter " << name
0417 << " for detid " << detid << " already set to "
0418 << ret.first->second[name] << " will not overwrite with " << sval << std::endl;
0419 std::cout << "Means: You are calling set_default_string_param twice for the same parameter" << std::endl;
0420 std::cout << "Please make up your mind and call it only once using the correct default" << std::endl;
0421 gSystem->Exit(1);
0422 exit(1);
0423 }
0424 return;
0425 }
0426
0427 void PHG4DetectorGroupSubsystem::InitializeParameters()
0428 {
0429 for (auto &iter : m_LayerSet)
0430 {
0431 set_default_int_param(iter, "absorberactive", 0);
0432 set_default_int_param(iter, "absorbertruth", 0);
0433 set_default_int_param(iter, "blackhole", 0);
0434 set_default_int_param(iter, "supportactive", 0);
0435 }
0436 SetDefaultParameters();
0437
0438 for (const auto &iter1 : m_DefaultDoubleParamsMap)
0439 {
0440 PHParameters *detidparams = m_ParamsContainerDefault->GetParametersToModify(iter1.first);
0441 if (!detidparams)
0442 {
0443 detidparams = new PHParameters((boost::format("%s_%d") % Name() % iter1.first).str());
0444 m_ParamsContainerDefault->AddPHParameters(iter1.first, detidparams);
0445 }
0446 for (auto &iter2 : iter1.second)
0447 {
0448 detidparams->set_double_param(iter2.first, iter2.second);
0449 }
0450 }
0451
0452 for (auto &iter1 : m_DefaultIntegerParamsMap)
0453 {
0454 PHParameters *detidparams = m_ParamsContainerDefault->GetParametersToModify(iter1.first);
0455 if (!detidparams)
0456 {
0457 detidparams = new PHParameters((boost::format("%s_%d") % Name() % iter1.first).str());
0458 m_ParamsContainerDefault->AddPHParameters(iter1.first, detidparams);
0459 }
0460 for (auto &iter2 : iter1.second)
0461 {
0462 detidparams->set_int_param(iter2.first, iter2.second);
0463 }
0464 }
0465
0466 for (auto &iter1 : m_DefaultStringParamsMap)
0467 {
0468 PHParameters *detidparams = m_ParamsContainerDefault->GetParametersToModify(iter1.first);
0469 if (!detidparams)
0470 {
0471 detidparams = new PHParameters((boost::format("%s_%d") % Name() % iter1.first).str());
0472 m_ParamsContainerDefault->AddPHParameters(iter1.first, detidparams);
0473 }
0474 for (auto &iter2 : iter1.second)
0475 {
0476 detidparams->set_string_param(iter2.first, iter2.second);
0477 }
0478 }
0479 }
0480
0481 int PHG4DetectorGroupSubsystem::SaveParamsToFile(const PHG4DetectorGroupSubsystem::FILE_TYPE ftyp)
0482 {
0483 std::string extension;
0484 switch (ftyp)
0485 {
0486 case xml:
0487 extension = "xml";
0488 break;
0489 case root:
0490 extension = "root";
0491 break;
0492 default:
0493 std::cout << PHWHERE << "filetype " << ftyp << " not implemented" << std::endl;
0494 exit(1);
0495 }
0496 int iret = 0;
0497 assert(m_ParamsContainer);
0498 iret = m_ParamsContainer->WriteToFile(extension, m_CalibFileDir);
0499 if (iret)
0500 {
0501 std::cout << "problem saving to " << extension << " file " << std::endl;
0502 }
0503 return iret;
0504 }
0505
0506 int PHG4DetectorGroupSubsystem::ReadParamsFromFile(const std::string & , const PHG4DetectorGroupSubsystem::FILE_TYPE ftyp, const int )
0507 {
0508 std::string extension;
0509 switch (ftyp)
0510 {
0511 case xml:
0512 extension = "xml";
0513 break;
0514 case root:
0515 extension = "root";
0516 break;
0517 default:
0518 std::cout << PHWHERE << "filetype " << ftyp << " not implemented" << std::endl;
0519 exit(1);
0520 }
0521 int iret = 1;
0522
0523
0524 std::cout << boost::stacktrace::stacktrace();
0525 std::cout << std::endl
0526 << "DO NOT PANIC - this is not a segfault" << std::endl;
0527 std::cout << "This method is a dummy, tell the offline gurus about it and give this stack trace" << std::endl;
0528 std::cout << "problem reading from " << extension << " file " << std::endl;
0529 std::cout << "problem reading from DB" << std::endl;
0530 gSystem->Exit(1);
0531 return iret;
0532 }
0533
0534 void PHG4DetectorGroupSubsystem::SetActive(const int detid, const int i)
0535 {
0536 set_int_param(detid, "active", i);
0537 }
0538
0539 void PHG4DetectorGroupSubsystem::SetActive(const int i)
0540 {
0541 for (auto &detid : m_LayerSet)
0542 {
0543 set_int_param(detid, "active", i);
0544 }
0545 }
0546
0547 void PHG4DetectorGroupSubsystem::SetAbsorberActive(const int detid, const int i)
0548 {
0549 set_int_param(detid, "absorberactive", i);
0550 }
0551
0552 void PHG4DetectorGroupSubsystem::SetAbsorberActive(const int i)
0553 {
0554 for (auto &detid : m_LayerSet)
0555 {
0556 set_int_param(detid, "absorberactive", i);
0557 }
0558 }
0559
0560 void PHG4DetectorGroupSubsystem::SetSupportActive(const int detid, const int i)
0561 {
0562 set_int_param(detid, "supportactive", i);
0563 }
0564
0565 void PHG4DetectorGroupSubsystem::SetSupportActive(const int i)
0566 {
0567 for (auto &detid : m_LayerSet)
0568 {
0569 set_int_param(detid, "supportactive", i);
0570 }
0571 }
0572
0573 void PHG4DetectorGroupSubsystem::BlackHole(const int detid, const int i)
0574 {
0575 set_int_param(detid, "blackhole", i);
0576 }
0577
0578 void PHG4DetectorGroupSubsystem::BlackHole(const int i)
0579 {
0580 for (auto &detid : m_LayerSet)
0581 {
0582 set_int_param(detid, "blackhole", i);
0583 }
0584 }
0585
0586 void PHG4DetectorGroupSubsystem::SetAbsorberTruth(const int detid, const int i)
0587 {
0588 set_int_param(detid, "absorbertruth", i);
0589 }
0590
0591 void PHG4DetectorGroupSubsystem::SetAbsorberTruth(const int i)
0592 {
0593 for (auto &detid : m_LayerSet)
0594 {
0595 set_int_param(detid, "absorbertruth", i);
0596 }
0597 }
0598
0599 void PHG4DetectorGroupSubsystem::PrintDefaultParams() const
0600 {
0601 std::cout << "Default Parameters: " << std::endl;
0602 std::cout << "int values: " << std::endl;
0603 for (auto &iter1 : m_DefaultIntegerParamsMap)
0604 {
0605 std::cout << "Detector id: " << iter1.first << std::endl;
0606 for (auto &iter2 : iter1.second)
0607 {
0608 std::cout << iter2.first << " : " << iter2.second << std::endl;
0609 }
0610 }
0611 std::cout << "double values: " << std::endl;
0612 for (auto &iter1 : m_DefaultDoubleParamsMap)
0613 {
0614 std::cout << "Detector id: " << iter1.first << std::endl;
0615 for (auto &iter2 : iter1.second)
0616 {
0617 std::cout << iter2.first << " : " << iter2.second << std::endl;
0618 }
0619 }
0620 std::cout << "string values: " << std::endl;
0621 for (auto &iter1 : m_DefaultStringParamsMap)
0622 {
0623 std::cout << "Detector id: " << iter1.first << std::endl;
0624 for (auto &iter2 : iter1.second)
0625 {
0626 std::cout << iter2.first << " : " << iter2.second << std::endl;
0627 }
0628 }
0629 return;
0630 }
0631
0632 void PHG4DetectorGroupSubsystem::PrintMacroParams() const
0633 {
0634 std::cout << "Macro Parameters: " << std::endl;
0635 std::cout << "int values: " << std::endl;
0636 for (auto &iter1 : m_MacroIntegerParamsMap)
0637 {
0638 std::cout << "Detector id: " << iter1.first << std::endl;
0639 for (auto &iter2 : iter1.second)
0640 {
0641 std::cout << iter2.first << " : " << iter2.second << std::endl;
0642 }
0643 }
0644 std::cout << "double values: " << std::endl;
0645 for (auto &iter1 : m_MacroDoubleParamsMap)
0646 {
0647 std::cout << "Detector id: " << iter1.first << std::endl;
0648 for (auto &iter2 : iter1.second)
0649 {
0650 std::cout << iter2.first << " : " << iter2.second << std::endl;
0651 }
0652 }
0653 std::cout << "string values: " << std::endl;
0654 for (auto &iter1 : m_MacroStringParamsMap)
0655 {
0656 std::cout << "Detector id: " << iter1.first << std::endl;
0657 for (auto &iter2 : iter1.second)
0658 {
0659 std::cout << iter2.first << " : " << iter2.second << std::endl;
0660 }
0661 }
0662 return;
0663 }