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