File indexing completed on 2026-03-30 07:50:54
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
0095 man->FindOrBuildMaterial("G4_WATER");
0096 }
0097
0098
0099
0100 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0101 {
0102 G4GeometryManager::GetInstance()->OpenGeometry();
0103 G4PhysicalVolumeStore::GetInstance()->Clean();
0104 G4LogicalVolumeStore::GetInstance()->Clean();
0105 G4SolidStore::GetInstance()->Clean();
0106
0107
0108
0109 G4Sphere* sAbsor = new G4Sphere("Absorber",
0110 0., fAbsorRadius, 0., twopi, 0., pi);
0111
0112 fLogicalAbsor = new G4LogicalVolume(sAbsor,
0113 fAbsorMaterial,
0114 "Absorber");
0115
0116 fAbsor = new G4PVPlacement(0,
0117 G4ThreeVector(),
0118 fLogicalAbsor,
0119 "Absorber",
0120 0,
0121 false,
0122 0);
0123
0124 PrintParameters();
0125
0126 fLogicalAbsor->SetUserLimits(new G4UserLimits(DBL_MAX, DBL_MAX, DBL_MAX, fTrackingCut));
0127
0128
0129
0130 return fAbsor;
0131 }
0132
0133
0134
0135 void DetectorConstruction::PrintParameters() const
0136 {
0137 G4cout << "\n---------------------------------------------------------\n";
0138 G4cout << "---> The tracking cut is set to " << G4BestUnit(fTrackingCut, "Energy") << G4endl;
0139 G4cout << "---> The Absorber is a sphere of " << G4BestUnit(fAbsorRadius, "Length")
0140 << " radius of " << fAbsorMaterial->GetName() << " made of"
0141 << "\n \n"
0142 << fAbsorMaterial << G4endl;
0143 G4cout << "\n---------------------------------------------------------\n";
0144 }
0145
0146
0147
0148 void DetectorConstruction::SetTrackingCut(G4double value)
0149 {
0150 fTrackingCut = value;
0151 G4RunManager::GetRunManager()->ReinitializeGeometry();
0152 }
0153
0154
0155
0156 void DetectorConstruction::SetRadius(G4double value)
0157 {
0158 fAbsorRadius = value;
0159 G4RunManager::GetRunManager()->ReinitializeGeometry();
0160 }
0161
0162
0163
0164 void DetectorConstruction::SetMaterial(G4String materialChoice)
0165 {
0166
0167 G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice);
0168 if (pttoMaterial) fAbsorMaterial = pttoMaterial;
0169 G4RunManager::GetRunManager()->PhysicsHasBeenModified();
0170 }