File indexing completed on 2025-12-16 09:20:19
0001 #include "PHFieldUtility.h"
0002
0003 #include "PHField.h"
0004 #include "PHField2D.h"
0005 #include "PHField3DCartesian.h"
0006 #include "PHField3DCylindrical.h"
0007 #include "PHFieldInterpolated.h"
0008 #include "PHFieldConfig.h"
0009 #include "PHFieldConfigv1.h"
0010 #include "PHFieldUniform.h"
0011
0012 #include <fun4all/Fun4AllServer.h>
0013
0014 #include <phool/PHCompositeNode.h>
0015 #include <phool/PHDataNode.h>
0016 #include <phool/PHIODataNode.h>
0017 #include <phool/PHNodeIterator.h>
0018 #include <phool/PHObject.h>
0019 #include <phool/getClass.h>
0020 #include <phool/phool.h> // for PHWHERE
0021
0022 #include <TSystem.h>
0023
0024 #include <cassert>
0025 #include <cstdlib> // for getenv
0026 #include <iostream>
0027
0028 PHField *
0029 PHFieldUtility::BuildFieldMap(const PHFieldConfig *field_config, float inner_radius, float outer_radius, float size_z, const int verbosity)
0030 {
0031 assert(field_config);
0032
0033 if (verbosity)
0034 {
0035 std::cout << "PHFieldUtility::BuildFieldMap - construction field with configuration: ";
0036 field_config->identify();
0037 }
0038
0039 PHField *field(nullptr);
0040
0041 switch (field_config->get_field_config())
0042 {
0043 case PHFieldConfig::kFieldUniform:
0044
0045
0046 field = new PHFieldUniform(
0047 field_config->get_field_mag_x(),
0048 field_config->get_field_mag_y(),
0049 field_config->get_field_mag_z());
0050
0051 break;
0052 case PHFieldConfig::kField2D:
0053
0054 field = new PHField2D(
0055 field_config->get_filename(),
0056 verbosity,
0057 field_config->get_magfield_rescale());
0058 break;
0059
0060 case PHFieldConfig::kField3DCylindrical:
0061
0062 field = new PHField3DCylindrical(
0063 field_config->get_filename(),
0064 verbosity,
0065 field_config->get_magfield_rescale());
0066 break;
0067
0068 case PHFieldConfig::Field3DCartesian:
0069
0070 field = new PHField3DCartesian(
0071 field_config->get_filename(),
0072 field_config->get_magfield_rescale(),
0073 inner_radius,
0074 outer_radius,
0075 size_z);
0076 break;
0077 case PHFieldConfig::FieldInterpolated:
0078
0079 field = new PHFieldInterpolated;
0080 field->Verbosity(1);
0081 try {
0082 dynamic_cast<PHFieldInterpolated*>(field)->load_fieldmap (
0083 field_config->get_filename(),
0084 field_config->get_magfield_rescale()
0085 );
0086 } catch (std::exception const& e) {
0087 delete field;
0088 field = nullptr;
0089 std::cout << e.what() << std::endl;
0090 gSystem->Exit(1);
0091 }
0092 break;
0093
0094 default:
0095 std::cout << "PHFieldUtility::BuildFieldMap - Invalid Field Configuration: " << field_config->get_field_config() << std::endl;
0096 gSystem->Exit(1);
0097 }
0098 assert(field);
0099 return field;
0100 }
0101
0102
0103
0104
0105
0106 PHFieldConfig *PHFieldUtility::DefaultFieldConfig()
0107 {
0108 char *calibrationroot = getenv("CALIBRATIONROOT");
0109 std::string fieldmap = "sphenix3dbigmapxyz_gap_rebuild.root";
0110 if (calibrationroot != nullptr)
0111 {
0112 fieldmap = std::string(calibrationroot) + "/Field/Map/" + fieldmap;
0113 }
0114 return new PHFieldConfigv1(PHFieldConfigv1::Field3DCartesian, fieldmap, 1.);
0115 }
0116
0117
0118 PHField *
0119 PHFieldUtility::GetFieldMapNode(const PHFieldConfig *default_config, PHCompositeNode *topNode, const int verbosity)
0120 {
0121 if (topNode == nullptr)
0122 {
0123 topNode = Fun4AllServer::instance()->topNode();
0124 }
0125 assert(topNode);
0126 PHNodeIterator iter(topNode);
0127
0128
0129 PHCompositeNode *parNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "PAR"));
0130 if (!parNode)
0131 {
0132 std::cout << PHWHERE << ": PAR Node missing, request aborting.";
0133 gSystem->Exit(1);
0134 }
0135
0136 PHField *field = findNode::getClass<PHField>(parNode, GetDSTFieldMapNodeName());
0137 if (!field)
0138 {
0139 PHFieldConfig *field_config = GetFieldConfigNode(default_config, topNode, verbosity);
0140 assert(field_config);
0141
0142 field = BuildFieldMap(field_config, verbosity > 0 ? verbosity - 1 : verbosity);
0143 assert(field);
0144
0145 parNode->addNode(new PHDataNode<PHField>(field, GetDSTFieldMapNodeName()));
0146 }
0147
0148 return field;
0149 }
0150
0151
0152 PHFieldConfig *
0153 PHFieldUtility::GetFieldConfigNode(const PHFieldConfig *default_config, PHCompositeNode *topNode, const int verbosity)
0154 {
0155 if (topNode == nullptr)
0156 {
0157 topNode = Fun4AllServer::instance()->topNode();
0158 }
0159 assert(topNode);
0160
0161 PHNodeIterator iter(topNode);
0162
0163
0164 PHCompositeNode *runNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "RUN"));
0165 if (!runNode)
0166 {
0167 std::cout << PHWHERE << ": RUN Node missing, aborting.";
0168 gSystem->Exit(1);
0169 }
0170
0171 PHFieldConfig *field = findNode::getClass<PHFieldConfig>(runNode, GetDSTConfigNodeName());
0172 if (!field)
0173 {
0174 if (!default_config)
0175 {
0176 field = DefaultFieldConfig();
0177 if (verbosity)
0178 {
0179 std::cout << "PHFieldUtility::GetFieldConfigNode - field map with configuration from build-in default: ";
0180 field->identify();
0181 }
0182 }
0183 else
0184 {
0185 field = dynamic_cast<PHFieldConfig *>(default_config->CloneMe());
0186 if (verbosity)
0187 {
0188 std::cout << "PHFieldUtility::GetFieldConfigNode - field map with configuration from input default: ";
0189 field->identify();
0190 }
0191 }
0192
0193 assert(field);
0194 runNode->addNode(new PHIODataNode<PHObject>(field, GetDSTConfigNodeName(), "PHObject"));
0195 }
0196 else
0197 {
0198 if (verbosity)
0199 {
0200 std::cout << "PHFieldUtility::GetFieldConfigNode - field map with configuration from DST/RUN: ";
0201 field->identify();
0202 }
0203 }
0204
0205 return field;
0206 }