File indexing completed on 2026-09-23 08:29:52
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
0035
0036
0037
0038
0039
0040 #include "DetectorConstruction.hh"
0041
0042 #include "DetectorMessenger.hh"
0043
0044 #include "G4GeometryManager.hh"
0045 #include "G4LogicalVolumeStore.hh"
0046 #include "G4NistManager.hh"
0047 #include "G4PVPlacement.hh"
0048 #include "G4PhysicalConstants.hh"
0049 #include "G4PhysicalVolumeStore.hh"
0050 #include "G4RunManager.hh"
0051 #include "G4SolidStore.hh"
0052 #include "G4Sphere.hh"
0053 #include "G4SystemOfUnits.hh"
0054 #include "G4UnitsTable.hh"
0055 #include "G4UserLimits.hh"
0056
0057
0058
0059 DetectorConstruction::DetectorConstruction()
0060 : G4VUserDetectorConstruction(), fAbsorMaterial(0), fAbsor(0), fDetectorMessenger(0)
0061 {
0062
0063 fTrackingCut = 7.4 * eV;
0064
0065
0066 fAbsorRadius = 1 * m;
0067
0068 DefineMaterials();
0069 SetMaterial("G4_WATER");
0070
0071
0072 fDetectorMessenger = new DetectorMessenger(this);
0073 }
0074
0075
0076
0077 DetectorConstruction::~DetectorConstruction()
0078 {
0079 delete fDetectorMessenger;
0080 }
0081
0082
0083
0084 G4VPhysicalVolume* DetectorConstruction::Construct()
0085 {
0086 return ConstructVolumes();
0087 }
0088
0089
0090
0091 void DetectorConstruction::DefineMaterials()
0092 {
0093 G4NistManager* man = G4NistManager::Instance();
0094 man->FindOrBuildMaterial("G4_WATER");
0095 }
0096
0097
0098
0099 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0100 {
0101 G4GeometryManager::GetInstance()->OpenGeometry();
0102 G4PhysicalVolumeStore::GetInstance()->Clean();
0103 G4LogicalVolumeStore::GetInstance()->Clean();
0104 G4SolidStore::GetInstance()->Clean();
0105
0106
0107 G4Sphere* sAbsor = new G4Sphere("Absorber",
0108 0., fAbsorRadius, 0., twopi, 0., pi);
0109
0110 fLogicalAbsor = new G4LogicalVolume(sAbsor,
0111 fAbsorMaterial,
0112 "Absorber");
0113
0114 fAbsor = new G4PVPlacement(0,
0115 G4ThreeVector(),
0116 fLogicalAbsor,
0117 "Absorber",
0118 0,
0119 false,
0120 0);
0121
0122 PrintParameters();
0123
0124 fLogicalAbsor->SetUserLimits(new G4UserLimits(DBL_MAX, DBL_MAX, DBL_MAX, fTrackingCut));
0125
0126
0127 return fAbsor;
0128 }
0129
0130
0131
0132 void DetectorConstruction::PrintParameters() const
0133 {
0134 G4cout << "\n---------------------------------------------------------\n";
0135 G4cout << "---> The tracking cut to all particles is set to "
0136 << G4BestUnit(fTrackingCut, "Energy") << G4endl;
0137 G4cout << "---> The Absorber is a sphere of " << G4BestUnit(fAbsorRadius, "Length")
0138 << " radius of " << fAbsorMaterial->GetName() << " made of"
0139 << "\n \n"
0140 << fAbsorMaterial << G4endl;
0141 G4cout << "\n---------------------------------------------------------\n";
0142 }
0143
0144
0145
0146 void DetectorConstruction::SetTrackingCut(G4double value)
0147 {
0148 fTrackingCut = value;
0149 G4RunManager::GetRunManager()->ReinitializeGeometry();
0150 }
0151
0152
0153
0154 void DetectorConstruction::SetRadius(G4double value)
0155 {
0156 fAbsorRadius = value;
0157 G4RunManager::GetRunManager()->ReinitializeGeometry();
0158 }
0159
0160
0161
0162 void DetectorConstruction::SetMaterial(G4String materialChoice)
0163 {
0164 G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
0165
0166 G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice);
0167 if (pttoMaterial) fAbsorMaterial = pttoMaterial;
0168 G4RunManager::GetRunManager()->PhysicsHasBeenModified();
0169 }