File indexing completed on 2025-08-05 08:17:47
0001 #include "PHG4DetectorSubsystem.h"
0002
0003 #include <phparameter/PHParameters.h>
0004 #include <phparameter/PHParametersContainer.h>
0005 #include <phparameter/PHParameterUtils.h>
0006
0007 #include <pdbcalbase/PdbParameterMapContainer.h>
0008
0009 #include <g4main/PHG4Subsystem.h> // for PHG4Subsystem
0010
0011 #include <phool/PHCompositeNode.h>
0012 #include <phool/PHDataNode.h>
0013 #include <phool/PHNode.h> // for PHNode
0014 #include <phool/PHNodeIterator.h>
0015 #include <phool/getClass.h>
0016 #include <phool/phool.h>
0017
0018 #include <cstdlib> // for exit, NULL
0019 #include <iostream>
0020 #include <utility> // for pair
0021
0022 PHG4DetectorSubsystem::PHG4DetectorSubsystem(const std::string &name, const int lyr)
0023 : PHG4Subsystem(name)
0024 , params(new PHParameters(Name()))
0025 , layer(lyr)
0026 {
0027
0028
0029 Name(name + "_" + std::to_string(lyr));
0030 }
0031
0032 int PHG4DetectorSubsystem::Init(PHCompositeNode *topNode)
0033 {
0034 savetopNode = topNode;
0035 params->set_name(Name());
0036 int iret = InitSubsystem(topNode);
0037 return iret;
0038 }
0039
0040 int PHG4DetectorSubsystem::InitRun(PHCompositeNode *topNode)
0041 {
0042 PHNodeIterator iter(topNode);
0043 PHCompositeNode *parNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "PAR"));
0044 PHCompositeNode *runNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "RUN"));
0045
0046 std::string g4geonodename = "G4GEO_";
0047 std::string paramnodename = "G4GEOPARAM_";
0048 std::string calibdetname;
0049 int isSuperDetector = 0;
0050 if (superdetector != "NONE")
0051 {
0052 g4geonodename += SuperDetector();
0053 paramscontainer = findNode::getClass<PHParametersContainer>(parNode, g4geonodename);
0054 if (!paramscontainer)
0055 {
0056 PHNodeIterator parIter(parNode);
0057 PHCompositeNode *DetNode = dynamic_cast<PHCompositeNode *>(parIter.findFirst("PHCompositeNode", SuperDetector()));
0058 if (!DetNode)
0059 {
0060 DetNode = new PHCompositeNode(SuperDetector());
0061 parNode->addNode(DetNode);
0062 }
0063 paramscontainer = new PHParametersContainer(superdetector);
0064 DetNode->addNode(new PHDataNode<PHParametersContainer>(paramscontainer, g4geonodename));
0065 }
0066 paramscontainer->AddPHParameters(layer, params);
0067 paramnodename += superdetector;
0068 calibdetname = superdetector;
0069 isSuperDetector = 1;
0070 }
0071 else
0072 {
0073 g4geonodename += params->Name();
0074 parNode->addNode(new PHDataNode<PHParameters>(params, g4geonodename));
0075 paramnodename += params->Name();
0076 calibdetname = params->Name();
0077 }
0078
0079
0080
0081
0082
0083
0084 if (ReadDB() || get_filetype() != PHG4DetectorSubsystem::none)
0085 {
0086 if (!m_Domain.empty())
0087 {
0088 ReadParamsFromCDB(m_Domain);
0089 }
0090 else
0091 {
0092 if (get_filetype() != PHG4DetectorSubsystem::none)
0093 {
0094 ReadParamsFromFile(calibdetname, get_filetype(), isSuperDetector);
0095 }
0096 }
0097 }
0098 else
0099 {
0100 PdbParameterMapContainer *nodeparams = findNode::getClass<PdbParameterMapContainer>(topNode, paramnodename);
0101 if (nodeparams)
0102 {
0103 params->FillFrom(nodeparams, layer);
0104 }
0105 }
0106
0107
0108 UpdateParametersWithMacro();
0109
0110 PHCompositeNode *RunDetNode = runNode;
0111 if (superdetector != "NONE")
0112 {
0113 PHNodeIterator runIter(runNode);
0114 RunDetNode = dynamic_cast<PHCompositeNode *>(runIter.findFirst("PHCompositeNode", SuperDetector()));
0115 if (!RunDetNode)
0116 {
0117 RunDetNode = new PHCompositeNode(SuperDetector());
0118 runNode->addNode(RunDetNode);
0119 }
0120 }
0121
0122 params->SaveToNodeTree(RunDetNode, paramnodename, layer);
0123
0124
0125
0126 DefineMaterials();
0127 int iret = InitRunSubsystem(topNode);
0128
0129
0130 params->UpdateNodeTree(RunDetNode, paramnodename, layer);
0131 if (Verbosity() > 0)
0132 {
0133 PdbParameterMapContainer *nodeparams = findNode::getClass<PdbParameterMapContainer>(topNode, paramnodename);
0134 std::cout << Name() << std::endl;
0135 nodeparams->print();
0136 }
0137 beginrunexecuted = 1;
0138 return iret;
0139 }
0140
0141 void PHG4DetectorSubsystem::SuperDetector(const std::string &name)
0142 {
0143 superdetector = name;
0144 return;
0145 }
0146
0147 void PHG4DetectorSubsystem::set_double_param(const std::string &name, const double dval)
0148 {
0149 if (default_double.find(name) == default_double.end())
0150 {
0151 std::cout << "double parameter " << name << " not implemented" << std::endl;
0152 std::cout << "implemented double parameters are:" << std::endl;
0153 for (std::map<const std::string, double>::const_iterator iter = default_double.begin(); iter != default_double.end(); ++iter)
0154 {
0155 std::cout << iter->first << std::endl;
0156 }
0157 return;
0158 }
0159 dparams[name] = dval;
0160 }
0161
0162 double
0163 PHG4DetectorSubsystem::get_double_param(const std::string &name) const
0164 {
0165 return params->get_double_param(name);
0166 }
0167
0168 void PHG4DetectorSubsystem::set_int_param(const std::string &name, const int ival)
0169 {
0170 if (default_int.find(name) == default_int.end())
0171 {
0172 std::cout << "integer parameter " << name << " not implemented" << std::endl;
0173 std::cout << "implemented integer parameters are:" << std::endl;
0174 for (std::map<const std::string, int>::const_iterator iter = default_int.begin(); iter != default_int.end(); ++iter)
0175 {
0176 std::cout << iter->first << std::endl;
0177 }
0178 return;
0179 }
0180 iparams[name] = ival;
0181 }
0182
0183 int PHG4DetectorSubsystem::get_int_param(const std::string &name) const
0184 {
0185 return params->get_int_param(name);
0186 }
0187
0188 void PHG4DetectorSubsystem::set_string_param(const std::string &name, const std::string &sval)
0189 {
0190 if (default_string.find(name) == default_string.end())
0191 {
0192 std::cout << "string parameter " << name << " not implemented" << std::endl;
0193 std::cout << "implemented string parameters are:" << std::endl;
0194 for (std::map<const std::string, std::string>::const_iterator iter = default_string.begin(); iter != default_string.end(); ++iter)
0195 {
0196 std::cout << iter->first << std::endl;
0197 }
0198 return;
0199 }
0200 cparams[name] = sval;
0201 }
0202
0203 std::string
0204 PHG4DetectorSubsystem::get_string_param(const std::string &name) const
0205 {
0206 return params->get_string_param(name);
0207 }
0208
0209 void PHG4DetectorSubsystem::UpdateParametersWithMacro()
0210 {
0211 for (std::map<const std::string, double>::const_iterator iter = dparams.begin(); iter != dparams.end(); ++iter)
0212 {
0213 params->set_double_param(iter->first, iter->second);
0214 }
0215 for (std::map<const std::string, int>::const_iterator iter = iparams.begin(); iter != iparams.end(); ++iter)
0216 {
0217 params->set_int_param(iter->first, iter->second);
0218 }
0219 for (std::map<const std::string, std::string>::const_iterator iter = cparams.begin(); iter != cparams.end(); ++iter)
0220 {
0221 params->set_string_param(iter->first, iter->second);
0222 }
0223 return;
0224 }
0225
0226 void PHG4DetectorSubsystem::set_default_double_param(const std::string &name, const double dval)
0227 {
0228 if (default_double.find(name) == default_double.end())
0229 {
0230 default_double[name] = dval;
0231 }
0232 else
0233 {
0234 std::cout << "trying to overwrite default double " << name << " "
0235 << default_double[name] << " with " << dval << std::endl;
0236 exit(1);
0237 }
0238 return;
0239 }
0240
0241 void PHG4DetectorSubsystem::set_default_int_param(const std::string &name, const int ival)
0242 {
0243 if (default_int.find(name) == default_int.end())
0244 {
0245 default_int[name] = ival;
0246 }
0247 else
0248 {
0249 std::cout << "trying to overwrite default int " << name << " "
0250 << default_int[name] << " with " << ival << std::endl;
0251 exit(1);
0252 }
0253 return;
0254 }
0255
0256 void PHG4DetectorSubsystem::set_default_string_param(const std::string &name, const std::string &sval)
0257 {
0258 if (default_string.find(name) == default_string.end())
0259 {
0260 default_string[name] = sval;
0261 }
0262 else
0263 {
0264 std::cout << "trying to overwrite default string " << name << " "
0265 << default_string[name] << " with " << sval << std::endl;
0266 exit(1);
0267 }
0268 return;
0269 }
0270
0271 void PHG4DetectorSubsystem::InitializeParameters()
0272 {
0273 set_default_int_param("absorberactive", 0);
0274 set_default_int_param("absorbertruth", 0);
0275 set_default_int_param("active", 0);
0276 set_default_int_param("blackhole", 0);
0277 set_default_int_param("supportactive", 0);
0278
0279 SetDefaultParameters();
0280
0281 for( const auto& [key, value]:default_double )
0282 {
0283 params->set_double_param(key,value);
0284 }
0285 for( const auto& [key, value]:default_int )
0286 {
0287 params->set_int_param(key,value);
0288 }
0289 for( const auto& [key, value]:default_string )
0290 {
0291 params->set_string_param(key,value);
0292 }
0293 }
0294
0295
0296 int PHG4DetectorSubsystem::SaveParamsToFile(const PHG4DetectorSubsystem::FILE_TYPE ftyp)
0297 {
0298 std::string extension;
0299 switch (ftyp)
0300 {
0301 case xml:
0302 extension = "xml";
0303 break;
0304 case root:
0305 extension = "root";
0306 break;
0307 default:
0308 std::cout << PHWHERE << "filetype " << ftyp << " not implemented" << std::endl;
0309 exit(1);
0310 }
0311 int iret = 0;
0312 if (paramscontainer)
0313 {
0314 iret = paramscontainer->WriteToFile(extension, calibfiledir);
0315 }
0316 else
0317 {
0318 iret = params->WriteToFile(extension, calibfiledir);
0319 }
0320 if (iret)
0321 {
0322 std::cout << "problem saving to " << extension << " file " << std::endl;
0323 }
0324 return iret;
0325 }
0326
0327 int PHG4DetectorSubsystem::ReadParamsFromFile(const std::string &name, const PHG4DetectorSubsystem::FILE_TYPE ftyp, const int issuper)
0328 {
0329 std::string extension;
0330 switch (ftyp)
0331 {
0332 case xml:
0333 extension = "xml";
0334 break;
0335 case root:
0336 extension = "root";
0337 break;
0338 default:
0339 std::cout << PHWHERE << "filetype " << ftyp << " not implemented" << std::endl;
0340 exit(1);
0341 }
0342 int iret = params->ReadFromFile(name, extension, layer, issuper, calibfiledir);
0343 if (iret)
0344 {
0345 std::cout << "problem reading from " << extension << " file " << std::endl;
0346 }
0347 return iret;
0348 }
0349
0350 void PHG4DetectorSubsystem::SetActive(const int i)
0351 {
0352 iparams["active"] = i;
0353 }
0354
0355 void PHG4DetectorSubsystem::SetAbsorberActive(const int i)
0356 {
0357 iparams["absorberactive"] = i;
0358 }
0359
0360 void PHG4DetectorSubsystem::SetSupportActive(const int i)
0361 {
0362 iparams["supportactive"] = i;
0363 }
0364
0365 void PHG4DetectorSubsystem::BlackHole(const int i)
0366 {
0367 iparams["blackhole"] = i;
0368 }
0369
0370 void PHG4DetectorSubsystem::SetAbsorberTruth(const int i)
0371 {
0372 iparams["absorbertruth"] = i;
0373 }
0374
0375 int PHG4DetectorSubsystem::ReadParamsFromCDB(const std::string &domain)
0376 {
0377 if (params)
0378 {
0379 PHParameterUtils::FillPHParametersFromCDB(*params,domain);
0380 }
0381 return 0;
0382 }