File indexing completed on 2025-02-23 09:21:20
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 "globals.hh"
0048
0049 #include <VecGeom/management/GeoManager.h>
0050
0051 G4double VG01DetectorConstruction::fglobFieldValue = 0.0;
0052
0053 VG01DetectorConstruction::VG01DetectorConstruction()
0054 : G4VUserDetectorConstruction(),
0055 fWorld(nullptr),
0056 fFieldMgr(nullptr),
0057 fUniformMagField(nullptr),
0058 fDetectorMessenger(nullptr)
0059 {
0060 fGDMLFileName = "TestNTST.gdml";
0061 fDetectorMessenger = new VG01DetectorMessenger(this);
0062 }
0063
0064
0065
0066 VG01DetectorConstruction::~VG01DetectorConstruction()
0067 {
0068 delete fDetectorMessenger;
0069 if (fUniformMagField) {
0070 delete fUniformMagField;
0071 }
0072 }
0073
0074
0075
0076 G4VPhysicalVolume* VG01DetectorConstruction::Construct()
0077 {
0078
0079 G4TransportationManager* trMgr = G4TransportationManager::GetTransportationManager();
0080 assert(trMgr);
0081
0082 fParser.Read(fGDMLFileName, false);
0083 fWorld = (G4VPhysicalVolume*)fParser.GetWorldVolume();
0084
0085
0086 G4Navigator* nav = trMgr->GetNavigatorForTracking();
0087 assert(nav);
0088 nav->CheckMode(true);
0089
0090 std::cout << "Enabled Check mode in G4Navigator";
0091
0092
0093
0094
0095 fFieldMgr = trMgr->GetFieldManager();
0096 fWorld->GetLogicalVolume()->SetVisAttributes(G4VisAttributes::GetInvisible());
0097 if (fWorld == nullptr) {
0098 G4ExceptionDescription ed;
0099 ed << "World volume not set properly check your setup selection criteria"
0100 << "or GDML input!" << G4endl;
0101 G4Exception("VG01DetectorConstruction::Construct()", "G4VecGeomNavExtExample_0001",
0102 FatalException, ed);
0103 }
0104 CreateMagFieldAndIntegrator();
0105
0106 if (fUseVecGeom) {
0107
0108
0109 G4VecGeomConverter::Instance().SetVerbose(1);
0110 G4VecGeomConverter::Instance().ConvertG4Geometry(fWorld);
0111 G4cout << vecgeom::GeoManager::Instance().getMaxDepth() << "\n";
0112 }
0113 return fWorld;
0114 }
0115
0116
0117
0118 void VG01DetectorConstruction::CreateMagFieldAndIntegrator()
0119 {
0120 delete fUniformMagField;
0121
0122 if (std::abs(fglobFieldValue) > 0.0) {
0123
0124
0125
0126 fUniformMagField = new G4UniformMagField(G4ThreeVector(0.0, 0.0, fglobFieldValue));
0127 fFieldMgr->SetDetectorField(fUniformMagField);
0128 fFieldMgr->CreateChordFinder(fUniformMagField);
0129 G4cout << G4endl << " *** SETTING MAGNETIC FIELD in Z direction : fieldValue = "
0130 << fglobFieldValue / tesla << " tesla *** " << G4endl << G4endl;
0131 }
0132 else {
0133 fFieldMgr->SetDetectorField(nullptr);
0134 G4cout << G4endl << " *** NO MAGNETIC FIELD SET *** " << G4endl << G4endl;
0135 }
0136 }