File indexing completed on 2026-09-17 08:31:57
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 "G4NistManager.hh"
0045 #include "G4RunManager.hh"
0046 #include "G4SystemOfUnits.hh"
0047 #include "G4UnitsTable.hh"
0048 #include "G4UserLimits.hh"
0049
0050
0051
0052 DetectorConstruction::DetectorConstruction() : G4VUserDetectorConstruction(), fWaterMaterial(0)
0053 {
0054
0055 fDetectorMessenger = new DetectorMessenger(this);
0056
0057
0058 fTrackingCut = 7.4 * eV;
0059 }
0060
0061
0062
0063 DetectorConstruction::~DetectorConstruction()
0064 {
0065 delete fDetectorMessenger;
0066 }
0067
0068
0069
0070 G4VPhysicalVolume* DetectorConstruction::Construct()
0071 {
0072 DefineMaterials();
0073 return ConstructDetector();
0074 }
0075
0076
0077
0078 void DetectorConstruction::DefineMaterials()
0079 {
0080
0081 G4NistManager* man = G4NistManager::Instance();
0082
0083 G4Material* H2O = man->FindOrBuildMaterial("G4_WATER");
0084
0085 fWaterMaterial = H2O;
0086
0087 G4cout << *(G4Material::GetMaterialTable()) << G4endl;
0088 }
0089
0090
0091
0092 G4VPhysicalVolume* DetectorConstruction::ConstructDetector()
0093 {
0094
0095
0096 G4double worldSizeX = 1 * m;
0097 G4double worldSizeY = worldSizeX;
0098 G4double worldSizeZ = worldSizeX;
0099
0100 G4Box* solidWorld = new G4Box("World",
0101 worldSizeX / 2, worldSizeY / 2, worldSizeZ / 2);
0102
0103 fLogicWorld = new G4LogicalVolume(solidWorld,
0104 fWaterMaterial,
0105 "World");
0106
0107 G4PVPlacement* physiWorld = new G4PVPlacement(0,
0108 G4ThreeVector(),
0109 fLogicWorld,
0110 "World",
0111 0,
0112 false,
0113 0);
0114
0115
0116 G4VisAttributes* worldVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0));
0117 worldVisAtt->SetVisibility(true);
0118 fLogicWorld->SetVisAttributes(worldVisAtt);
0119
0120 G4VisAttributes* worldVisAtt1 = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0));
0121 worldVisAtt1->SetVisibility(true);
0122
0123
0124 fLogicWorld->SetUserLimits(new G4UserLimits(DBL_MAX, DBL_MAX, DBL_MAX, fTrackingCut));
0125
0126 PrintParameters();
0127
0128 return physiWorld;
0129 }
0130
0131
0132
0133 void DetectorConstruction::SetMaterial(G4String materialChoice)
0134 {
0135
0136 G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice);
0137 if (pttoMaterial) fWaterMaterial = pttoMaterial;
0138 G4RunManager::GetRunManager()->PhysicsHasBeenModified();
0139 }
0140
0141
0142
0143 void DetectorConstruction::SetTrackingCut(G4double value)
0144 {
0145 fTrackingCut = value;
0146 G4RunManager::GetRunManager()->ReinitializeGeometry();
0147 }
0148
0149
0150
0151 void DetectorConstruction::PrintParameters() const
0152 {
0153 G4cout << "\n---------------------------------------------------------\n";
0154 G4cout << "---> The tracking cut is set to " << G4BestUnit(fTrackingCut, "Energy") << G4endl;
0155 G4cout << "\n---------------------------------------------------------\n";
0156 }