Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 /// \file DetectorConstruction.cc 28 /// \brief Implementation of the DetectorConstruction class 29 30 #include "DetectorConstruction.hh" 31 32 #include "ScreenSD.hh" 33 34 #include "G4AutoDelete.hh" 35 #include "G4Box.hh" 36 #include "G4Colour.hh" 37 #include "G4GlobalMagFieldMessenger.hh" 38 #include "G4LogicalVolume.hh" 39 #include "G4Material.hh" 40 #include "G4NistManager.hh" 41 #include "G4PVPlacement.hh" 42 #include "G4SDManager.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "G4VisAttributes.hh" 45 46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 47 48 G4ThreadLocal G4GlobalMagFieldMessenger* DetectorConstruction::fMagFieldMessenger = nullptr; 49 50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 51 52 G4VPhysicalVolume* DetectorConstruction::Construct() 53 { 54 // Get nist material manager 55 G4NistManager* nistManager = G4NistManager::Instance(); 56 57 // Build materials 58 G4Material* air = nistManager->FindOrBuildMaterial("G4_AIR"); 59 G4Material* csi = nistManager->FindOrBuildMaterial("G4_CESIUM_IODIDE"); 60 // There is no need to test if materials were built/found 61 // as G4NistManager would issue an error otherwise 62 // Try the code with "XYZ". 63 64 // Print all materials 65 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 66 67 // Option to switch on/off checking of volumes overlaps 68 G4bool checkOverlaps = true; 69 70 // 71 // World 72 // 73 74 // The world dimensions 75 G4double worldHxyz = 2. * m; 76 77 // world volume 78 auto worldS = new G4Box("World", worldHxyz, worldHxyz, worldHxyz); 79 80 auto worldLV = new G4LogicalVolume(worldS, air, "World"); 81 82 G4VPhysicalVolume* worldPV = 83 new G4PVPlacement(nullptr, G4ThreeVector(), worldLV, "World", nullptr, false, 0, checkOverlaps); 84 85 // 86 // Box 87 // 88 89 // The box dimensions 90 G4double boxHxy = 1. * m; 91 G4double boxHz = 10. * cm; 92 93 // box volume 94 auto boxS = new G4Box("World", boxHxy, boxHxy, boxHz); 95 96 auto boxLV = new G4LogicalVolume(boxS, csi, "Box"); 97 98 // The box position 99 G4double posz = 0. * m; 100 101 new G4PVPlacement(nullptr, G4ThreeVector(0, 0, posz), boxLV, "Box", worldLV, false, 0, 102 checkOverlaps); 103 104 // 105 // Scoring screen 106 // 107 // The screen dimensions 108 G4double screenHxy = 1.999 * m; 109 G4double screenHz = 1. * mm; 110 111 // Screen volume 112 auto screenS = new G4Box("World", screenHxy, screenHxy, screenHz); 113 114 auto screenLV = new G4LogicalVolume(screenS, air, "Screen"); 115 116 // The screen position 117 posz += boxHz + screenHz; 118 119 new G4PVPlacement(nullptr, G4ThreeVector(0, 0, posz), screenLV, "Screen", worldLV, false, 0, 120 checkOverlaps); 121 122 // 123 // Visualization attributes 124 // 125 worldLV->SetVisAttributes(G4VisAttributes::GetInvisible()); 126 127 auto simpleBoxVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0)); 128 simpleBoxVisAtt->SetVisibility(true); 129 boxLV->SetVisAttributes(simpleBoxVisAtt); 130 screenLV->SetVisAttributes(simpleBoxVisAtt); 131 132 // 133 // Always return the physical World 134 // 135 return worldPV; 136 } 137 138 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 139 140 void DetectorConstruction::ConstructSDandField() 141 { 142 // G4SDManager::GetSDMpointer()->SetVerboseLevel(1); 143 144 // 145 // Sensitive detectors 146 // 147 auto screenSD = new ScreenSD("ScreenSD"); 148 G4SDManager::GetSDMpointer()->AddNewDetector(screenSD); 149 SetSensitiveDetector("Screen", screenSD); 150 151 // 152 // Magnetic field 153 // 154 // Create global magnetic field messenger. 155 // Uniform magnetic field is then created automatically if 156 // the field value is not zero. 157 G4ThreeVector fieldValue; 158 fMagFieldMessenger = new G4GlobalMagFieldMessenger(fieldValue); 159 fMagFieldMessenger->SetVerboseLevel(1); 160 161 // Register the field messenger for deleting 162 G4AutoDelete::Register(fMagFieldMessenger); 163 } 164 165 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 166