File indexing completed on 2025-10-26 08:01:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #include "VG01DetectorConstruction.hh"
0035
0036 #include "G4VecGeomConverter.h"
0037 #include "VG01DetectorMessenger.hh"
0038
0039 #include "G4FieldManager.hh"
0040 #include "G4PropagatorInField.hh"
0041 #include "G4RunManager.hh"
0042 #include "G4SystemOfUnits.hh"
0043 #include "G4TransportationManager.hh"
0044 #include "G4UniformMagField.hh"
0045 #include "G4VPhysicalVolume.hh"
0046 #include "G4VisAttributes.hh"
0047 #include "G4ios.hh"
0048 #include "globals.hh"
0049
0050
0051
0052 #include <VecGeom/base/Version.h>
0053 #include <VecGeom/management/GeoManager.h>
0054 #include <VecGeom/management/LoggerTypes.h>
0055
0056 #if VECGEOM_VERSION >= 0x010208
0057
0058
0059 # include <VecGeom/management/Logger.h>
0060 # define VECGEOM_HAS_LOGGER 1
0061 #endif
0062
0063 #ifdef VECGEOM_HAS_LOGGER
0064 namespace
0065 {
0066 using vecgeom::LogLevel;
0067 using vecgeom::Provenance;
0068
0069
0070 void G4VecGeomLogger(Provenance prov, LogLevel lev, std::string str)
0071 {
0072 std::ostringstream where;
0073 if (!prov.file.empty()) {
0074
0075 auto pos = prov.file.rfind('/') + 1;
0076 where << prov.file.substr(pos);
0077 }
0078 if (prov.line != 0) {
0079 where << ':' << prov.line;
0080 }
0081
0082 if (lev < LogLevel::warning) {
0083 G4cout << "VecGeom: " << where.str() << ": " << vecgeom::to_cstring(lev) << ": " << str << std::endl;
0084 return;
0085 }
0086
0087 G4Exception(where.str().c_str(), "VecGeom",
0088 lev == LogLevel::warning ? JustWarning : FatalException, str.c_str());
0089 }
0090 }
0091 #endif
0092
0093 G4double VG01DetectorConstruction::fglobFieldValue = 0.0;
0094
0095 VG01DetectorConstruction::VG01DetectorConstruction()
0096 : G4VUserDetectorConstruction(),
0097 fWorld(nullptr),
0098 fFieldMgr(nullptr),
0099 fUniformMagField(nullptr),
0100 fDetectorMessenger(nullptr)
0101 {
0102 fGDMLFileName = "TestNTST.gdml";
0103 fDetectorMessenger = new VG01DetectorMessenger(this);
0104 #ifdef VECGEOM_HAS_LOGGER
0105
0106 auto orig_level = vecgeom::logger().level();
0107 vecgeom::Logger new_logger(&G4VecGeomLogger);
0108 new_logger.level(orig_level);
0109 vecgeom::logger() = std::move(new_logger);
0110 #endif
0111 }
0112
0113
0114
0115 VG01DetectorConstruction::~VG01DetectorConstruction()
0116 {
0117 delete fDetectorMessenger;
0118 if (fUniformMagField) {
0119 delete fUniformMagField;
0120 }
0121 }
0122
0123
0124
0125 G4VPhysicalVolume* VG01DetectorConstruction::Construct()
0126 {
0127
0128 G4TransportationManager* trMgr = G4TransportationManager::GetTransportationManager();
0129 assert(trMgr);
0130
0131 fParser.Read(fGDMLFileName, false);
0132 fWorld = (G4VPhysicalVolume*)fParser.GetWorldVolume();
0133
0134
0135 G4Navigator* nav = trMgr->GetNavigatorForTracking();
0136 assert(nav);
0137 nav->CheckMode(true);
0138
0139 std::cout << "Enabled Check mode in G4Navigator";
0140
0141
0142
0143
0144 fFieldMgr = trMgr->GetFieldManager();
0145 fWorld->GetLogicalVolume()->SetVisAttributes(G4VisAttributes::GetInvisible());
0146 if (fWorld == nullptr) {
0147 G4ExceptionDescription ed;
0148 ed << "World volume not set properly check your setup selection criteria"
0149 << "or GDML input!" << G4endl;
0150 G4Exception("VG01DetectorConstruction::Construct()", "G4VecGeomNavExtExample_0001",
0151 FatalException, ed);
0152 }
0153 CreateMagFieldAndIntegrator();
0154
0155 if (fUseVecGeom) {
0156
0157
0158 G4VecGeomConverter::Instance().SetVerbose(1);
0159 G4VecGeomConverter::Instance().ConvertG4Geometry(fWorld);
0160 G4cout << vecgeom::GeoManager::Instance().getMaxDepth() << "\n";
0161 }
0162 return fWorld;
0163 }
0164
0165
0166
0167 void VG01DetectorConstruction::CreateMagFieldAndIntegrator()
0168 {
0169 delete fUniformMagField;
0170
0171 if (std::abs(fglobFieldValue) > 0.0) {
0172
0173
0174
0175 fUniformMagField = new G4UniformMagField(G4ThreeVector(0.0, 0.0, fglobFieldValue));
0176 fFieldMgr->SetDetectorField(fUniformMagField);
0177 fFieldMgr->CreateChordFinder(fUniformMagField);
0178 G4cout << G4endl << " *** SETTING MAGNETIC FIELD in Z direction : fieldValue = "
0179 << fglobFieldValue / tesla << " tesla *** " << G4endl << G4endl;
0180 }
0181 else {
0182 fFieldMgr->SetDetectorField(nullptr);
0183 G4cout << G4endl << " *** NO MAGNETIC FIELD SET *** " << G4endl << G4endl;
0184 }
0185 }