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 ExGflash2DetectorConstruction.cc 28 /// \brief Implementation of the ExGflash2DetectorConstruction class 29 // 30 // Created by Joanna Weng 26.11.2004 31 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 34 35 // User Classes 36 #include "ExGflash2DetectorConstruction.hh" 37 38 #include "ExGflash2SensitiveDetector.hh" 39 40 // G4 Classes 41 #include "G4AutoDelete.hh" 42 #include "G4Box.hh" 43 #include "G4Colour.hh" 44 #include "G4LogicalVolume.hh" 45 #include "G4Material.hh" 46 #include "G4NistManager.hh" 47 #include "G4PVPlacement.hh" 48 #include "G4SDManager.hh" 49 #include "G4SystemOfUnits.hh" 50 #include "G4ThreeVector.hh" 51 #include "G4VPhysicalVolume.hh" 52 #include "G4VisAttributes.hh" 53 #include "globals.hh" 54 55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 56 57 ExGflash2DetectorConstruction::ExGflash2DetectorConstruction() 58 { 59 G4cout << "ExGflash2DetectorConstruction::Detector constructor" << G4endl; 60 } 61 62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 63 64 ExGflash2DetectorConstruction::~ExGflash2DetectorConstruction() = default; 65 66 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 67 68 G4VPhysicalVolume* ExGflash2DetectorConstruction::Construct() 69 { 70 //--------- Definitions of Solids, Logical Volumes, Physical Volumes --------- 71 G4cout << "Defining the materials" << G4endl; 72 // Get nist material manager 73 G4NistManager* nistManager = G4NistManager::Instance(); 74 // Build materials 75 G4Material* air = nistManager->FindOrBuildMaterial("G4_AIR"); 76 G4Material* pbWO4 = nistManager->FindOrBuildMaterial("G4_PbWO4"); 77 78 /******************************* 79 * The Experimental Hall * 80 *******************************/ 81 G4double experimentalHall_x = 1000. * cm; 82 G4double experimentalHall_y = 1000. * cm; 83 G4double experimentalHall_z = 1000. * cm; 84 85 G4VSolid* experimentalHall_box = new G4Box("expHall_box", // World Volume 86 experimentalHall_x, // x size 87 experimentalHall_y, // y size 88 experimentalHall_z); // z size 89 90 auto experimentalHallLog = new G4LogicalVolume(experimentalHall_box, air, "expHallLog", 91 nullptr, // opt: fieldManager 92 nullptr, // opt: SensitiveDetector 93 nullptr); // opt: UserLimits 94 G4VPhysicalVolume* experimentalHallPhys = 95 new G4PVPlacement(nullptr, 96 G4ThreeVector(), // at (0,0,0) 97 "expHall", experimentalHallLog, nullptr, false, 0); 98 99 //------------------------------ 100 // Calorimeter segments 101 //------------------------------ 102 // Simplified `CMS-like` PbWO4 crystal calorimeter 103 104 G4int nbOfCrystals = 10; // this are the crystals PER ROW in this example 105 // cube of 10 x 10 crystals 106 // don't change it @the moment, since 107 // the readout in event action assumes this 108 // dimensions and is not automatically adapted 109 // in this version of the example :-( 110 // Simplified `CMS-like` PbWO4 crystal calorimeter 111 G4double calo_xside = 31 * cm; 112 G4double calo_yside = 31 * cm; 113 G4double calo_zside = 24 * cm; 114 115 G4double crystalWidth = 3 * cm; 116 G4double crystalLength = 24 * cm; 117 118 calo_xside = (crystalWidth * nbOfCrystals) + 1 * cm; 119 calo_yside = (crystalWidth * nbOfCrystals) + 1 * cm; 120 calo_zside = crystalLength; 121 122 auto calo_box = new G4Box("CMS calorimeter", // its name 123 calo_xside / 2., // size 124 calo_yside / 2., calo_zside / 2.); 125 auto caloLog = new G4LogicalVolume(calo_box, // its solid 126 air, // its material 127 "calo log", // its name 128 nullptr, // opt: fieldManager 129 nullptr, // opt: SensitiveDetector 130 nullptr); // opt: UserLimit 131 132 G4double xpos = 0.0; 133 G4double ypos = 0.0; 134 G4double zpos = 100.0 * cm; 135 new G4PVPlacement(nullptr, G4ThreeVector(xpos, ypos, zpos), caloLog, "calorimeter", 136 experimentalHallLog, false, 1); 137 138 // Crystals 139 G4VSolid* crystal_box = new G4Box("Crystal", // its name 140 crystalWidth / 2, crystalWidth / 2, crystalLength / 2); 141 // size 142 fCrystalLog = new G4LogicalVolume(crystal_box, // its solid 143 pbWO4, // its material 144 "CrystalLog"); // its name 145 146 for (G4int i = 0; i < nbOfCrystals; i++) { 147 for (G4int j = 0; j < nbOfCrystals; j++) { 148 G4int n = i * 10 + j; 149 G4ThreeVector crystalPos((i * crystalWidth) - 135, (j * crystalWidth) - 135, 0); 150 fCrystalPhys[n] = new G4PVPlacement(nullptr, // no rotation 151 crystalPos, // translation 152 fCrystalLog, 153 "crystal", // its name 154 caloLog, false, i); 155 } 156 } 157 G4cout << "There are " << nbOfCrystals << " crystals per row in the calorimeter, so in total " 158 << nbOfCrystals * nbOfCrystals << " crystals" << G4endl; 159 G4cout << "They have width of " << crystalWidth / cm << " cm and a length of " 160 << crystalLength / cm << " cm. The Material is " << pbWO4 << G4endl; 161 162 experimentalHallLog->SetVisAttributes(G4VisAttributes::GetInvisible()); 163 auto caloVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0)); 164 auto crystalVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0)); 165 caloLog->SetVisAttributes(caloVisAtt); 166 fCrystalLog->SetVisAttributes(crystalVisAtt); 167 168 // Parametrisation region defined in ExGflash2ParallelWorld 169 170 return experimentalHallPhys; 171 } 172 173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 174 175 void ExGflash2DetectorConstruction::ConstructSDandField() 176 { 177 // -- sensitive detectors: 178 G4SDManager* SDman = G4SDManager::GetSDMpointer(); 179 auto CaloSD = new ExGflash2SensitiveDetector("Calorimeter", this); 180 SDman->AddNewDetector(CaloSD); 181 fCrystalLog->SetSensitiveDetector(CaloSD); 182 183 // Fast simulation implemented in ExGflash2ParallelWorld 184 } 185 186 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 187