Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 /// \file ExGflash1DetectorConstruction.cc 27 /// \file ExGflash1DetectorConstruction.cc 28 /// \brief Implementation of the ExGflash1Dete 28 /// \brief Implementation of the ExGflash1DetectorConstruction class 29 // 29 // 30 // Created by Joanna Weng 26.11.2004 30 // Created by Joanna Weng 26.11.2004 31 31 32 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 33 //....oooOO0OOooo........oooOO0OOooo........oo 33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 34 34 35 // User Classes 35 // User Classes 36 #include "ExGflash1DetectorConstruction.hh" 36 #include "ExGflash1DetectorConstruction.hh" 37 << 38 #include "ExGflash1SensitiveDetector.hh" 37 #include "ExGflash1SensitiveDetector.hh" 39 38 40 // G4 Classes 39 // 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" 40 #include "G4NistManager.hh" 47 #include "G4PVPlacement.hh" << 41 #include "G4Material.hh" 48 #include "G4SDManager.hh" << 49 #include "G4SystemOfUnits.hh" << 50 #include "G4ThreeVector.hh" 42 #include "G4ThreeVector.hh" >> 43 #include "G4PVPlacement.hh" 51 #include "G4VPhysicalVolume.hh" 44 #include "G4VPhysicalVolume.hh" >> 45 #include "G4LogicalVolume.hh" >> 46 #include "G4Box.hh" >> 47 #include "G4SDManager.hh" 52 #include "G4VisAttributes.hh" 48 #include "G4VisAttributes.hh" >> 49 #include "G4Colour.hh" >> 50 #include "G4SystemOfUnits.hh" >> 51 #include "G4AutoDelete.hh" 53 #include "globals.hh" 52 #include "globals.hh" 54 53 55 // fast simulation << 54 //fast simulation 56 #include "GFlashHitMaker.hh" << 57 #include "GFlashHomoShowerParameterisation.hh" 55 #include "GFlashHomoShowerParameterisation.hh" 58 #include "GFlashParticleBounds.hh" << 56 #include "G4FastSimulationManager.hh" 59 #include "GFlashShowerModel.hh" 57 #include "GFlashShowerModel.hh" >> 58 #include "GFlashHitMaker.hh" >> 59 #include "GFlashParticleBounds.hh" 60 60 61 #include "G4FastSimulationManager.hh" << 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 62 >> 63 G4ThreadLocal GFlashShowerModel* ExGflash1DetectorConstruction::fFastShowerModel = 0; >> 64 G4ThreadLocal >> 65 GFlashHomoShowerParameterisation* ExGflash1DetectorConstruction::fParameterisation = 0; >> 66 G4ThreadLocal GFlashParticleBounds* ExGflash1DetectorConstruction::fParticleBounds = 0; >> 67 G4ThreadLocal GFlashHitMaker* ExGflash1DetectorConstruction::fHitMaker = 0; 62 68 63 //....oooOO0OOooo........oooOO0OOooo........oo 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 70 65 ExGflash1DetectorConstruction::ExGflash1Detect 71 ExGflash1DetectorConstruction::ExGflash1DetectorConstruction() >> 72 :G4VUserDetectorConstruction(), fCrystalLog(nullptr), fCrystalPhys{}, fRegion(nullptr) 66 { 73 { 67 G4cout << "ExGflash1DetectorConstruction::De << 74 G4cout<<"ExGflash1DetectorConstruction::Detector constructor"<<G4endl; 68 } 75 } 69 76 70 //....oooOO0OOooo........oooOO0OOooo........oo 77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 71 78 72 ExGflash1DetectorConstruction::~ExGflash1Detec 79 ExGflash1DetectorConstruction::~ExGflash1DetectorConstruction() 73 { 80 { 74 delete fFastShowerModel; << 81 delete fFastShowerModel; 75 delete fParameterisation; 82 delete fParameterisation; 76 delete fParticleBounds; 83 delete fParticleBounds; 77 delete fHitMaker; 84 delete fHitMaker; 78 } 85 } 79 86 80 //....oooOO0OOooo........oooOO0OOooo........oo 87 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 81 88 82 G4VPhysicalVolume* ExGflash1DetectorConstructi 89 G4VPhysicalVolume* ExGflash1DetectorConstruction::Construct() 83 { 90 { 84 //--------- Definitions of Solids, Logical V 91 //--------- Definitions of Solids, Logical Volumes, Physical Volumes --------- 85 G4cout << "Defining the materials" << G4endl 92 G4cout << "Defining the materials" << G4endl; 86 // Get nist material manager 93 // Get nist material manager 87 G4NistManager* nistManager = G4NistManager:: 94 G4NistManager* nistManager = G4NistManager::Instance(); 88 // Build materials 95 // Build materials 89 G4Material* air = nistManager->FindOrBuildMa << 96 G4Material* air = nistManager->FindOrBuildMaterial("G4_AIR"); 90 G4Material* pbWO4 = nistManager->FindOrBuild 97 G4Material* pbWO4 = nistManager->FindOrBuildMaterial("G4_PbWO4"); 91 << 98 92 /******************************* 99 /******************************* 93 * The Experimental Hall * 100 * The Experimental Hall * 94 *******************************/ 101 *******************************/ 95 G4double experimentalHall_x = 1000. * cm; << 102 G4double experimentalHall_x=1000.*cm; 96 G4double experimentalHall_y = 1000. * cm; << 103 G4double experimentalHall_y=1000.*cm; 97 G4double experimentalHall_z = 1000. * cm; << 104 G4double experimentalHall_z=1000.*cm; 98 << 105 99 G4VSolid* experimentalHall_box = new G4Box(" << 106 G4VSolid* experimentalHall_box 100 e << 107 = new G4Box("expHall_box", // World Volume 101 e << 108 experimentalHall_x, // x size 102 e << 109 experimentalHall_y, // y size 103 << 110 experimentalHall_z); // z size 104 auto experimentalHallLog = new G4LogicalVolu << 111 105 << 112 G4LogicalVolume* experimentalHallLog 106 << 113 = new G4LogicalVolume(experimentalHall_box, 107 << 114 air, 108 G4VPhysicalVolume* experimentalHallPhys = << 115 "expHallLog", 109 new G4PVPlacement(nullptr, << 116 0, //opt: fieldManager 110 G4ThreeVector(), // at << 117 0, //opt: SensitiveDetector 111 "expHall", experimentalH << 118 0); //opt: UserLimits 112 << 119 G4VPhysicalVolume* experimentalHallPhys 113 //------------------------------ << 120 = new G4PVPlacement(0, >> 121 G4ThreeVector(), //at (0,0,0) >> 122 "expHall", >> 123 experimentalHallLog, >> 124 0, >> 125 false, >> 126 0); >> 127 >> 128 >> 129 //------------------------------ 114 // Calorimeter segments 130 // Calorimeter segments 115 //------------------------------ 131 //------------------------------ 116 // Simplified `CMS-like` PbWO4 crystal calor << 132 // Simplified `CMS-like` PbWO4 crystal calorimeter 117 << 133 118 G4int nbOfCrystals = 10; // this are the cr << 134 G4int nbOfCrystals = 10; // this are the crystals PER ROW in this example 119 // cube of 10 x 10 << 135 // cube of 10 x 10 crystals 120 // don't change it << 136 // don't change it @the moment, since 121 // the readout in << 137 // the readout in event action assumes this 122 // dimensions and << 138 // dimensions and is not automatically adapted 123 // in this version << 139 // in this version of the example :-( 124 // Simplified `CMS-like` PbWO4 crystal calor << 140 // Simplified `CMS-like` PbWO4 crystal calorimeter 125 G4double calo_xside = 31 * cm; << 141 G4double calo_xside = 31*cm; 126 G4double calo_yside = 31 * cm; << 142 G4double calo_yside = 31*cm; 127 G4double calo_zside = 24 * cm; << 143 G4double calo_zside = 24*cm; 128 144 129 G4double crystalWidth = 3 * cm; << 145 G4double crystalWidth = 3*cm; 130 G4double crystalLength = 24 * cm; << 146 G4double crystalLength = 24*cm; 131 147 132 calo_xside = (crystalWidth * nbOfCrystals) + << 148 calo_xside = (crystalWidth*nbOfCrystals)+1*cm; 133 calo_yside = (crystalWidth * nbOfCrystals) + << 149 calo_yside = (crystalWidth*nbOfCrystals)+1*cm; 134 calo_zside = crystalLength; 150 calo_zside = crystalLength; 135 << 151 136 auto calo_box = new G4Box("CMS calorimeter", << 152 G4Box* calo_box= new G4Box("CMS calorimeter", // its name 137 calo_xside / 2., << 153 calo_xside/2., // size 138 calo_yside / 2., c << 154 calo_yside/2., 139 auto caloLog = new G4LogicalVolume(calo_box, << 155 calo_zside/2.); 140 air, // << 156 G4LogicalVolume* caloLog 141 "calo log << 157 = new G4LogicalVolume(calo_box, // its solid 142 nullptr, << 158 air, // its material 143 nullptr, << 159 "calo log", // its name 144 nullptr); << 160 0, // opt: fieldManager 145 << 161 0, // opt: SensitiveDetector >> 162 0); // opt: UserLimit >> 163 146 G4double xpos = 0.0; 164 G4double xpos = 0.0; 147 G4double ypos = 0.0; 165 G4double ypos = 0.0; 148 G4double zpos = 100.0 * cm; << 166 G4double zpos = 100.0*cm; 149 new G4PVPlacement(nullptr, G4ThreeVector(xpo << 167 new G4PVPlacement(0, 150 experimentalHallLog, false << 168 G4ThreeVector(xpos, ypos, zpos), 151 << 169 caloLog, >> 170 "calorimeter", >> 171 experimentalHallLog, >> 172 false, >> 173 1); >> 174 152 // Crystals 175 // Crystals 153 G4VSolid* crystal_box = new G4Box("Crystal", << 176 G4VSolid* crystal_box 154 crystalWid << 177 = new G4Box("Crystal", // its name 155 // size << 178 crystalWidth/2, 156 fCrystalLog = new G4LogicalVolume(crystal_bo << 179 crystalWidth/2, 157 pbWO4, // << 180 crystalLength/2); 158 "CrystalLo << 181 // size 159 << 182 fCrystalLog 160 for (G4int i = 0; i < nbOfCrystals; i++) { << 183 = new G4LogicalVolume(crystal_box, // its solid 161 for (G4int j = 0; j < nbOfCrystals; j++) { << 184 pbWO4, // its material 162 G4int n = i * 10 + j; << 185 "CrystalLog"); // its name 163 G4ThreeVector crystalPos((i * crystalWid << 186 164 fCrystalPhys[n] = new G4PVPlacement(null << 187 for (G4int i=0; i<nbOfCrystals; i++) 165 crys << 188 { 166 fCry << 189 167 "cry << 190 for (G4int j=0; j<nbOfCrystals; j++) 168 calo << 191 { 169 } << 192 G4int n = i*10+j; 170 } << 193 G4ThreeVector crystalPos((i*crystalWidth)-135, 171 G4cout << "There are " << nbOfCrystals << " << 194 (j*crystalWidth)-135,0 ); 172 << nbOfCrystals * nbOfCrystals << " c << 195 fCrystalPhys[n] 173 G4cout << "They have width of " << crystalW << 196 = new G4PVPlacement(0, // no rotation 174 << crystalLength / cm << " cm. The Ma << 197 crystalPos, // translation 175 << 198 fCrystalLog, >> 199 "crystal", // its name >> 200 caloLog, >> 201 false, >> 202 i); >> 203 } >> 204 } >> 205 G4cout << "There are " << nbOfCrystals << >> 206 " crystals per row in the calorimeter, so in total "<< >> 207 nbOfCrystals*nbOfCrystals << " crystals" << G4endl; >> 208 G4cout << "They have width of " << crystalWidth /cm << >> 209 " cm and a length of " << crystalLength /cm >> 210 <<" cm. The Material is "<< pbWO4 << G4endl; >> 211 >> 212 176 experimentalHallLog->SetVisAttributes(G4VisA 213 experimentalHallLog->SetVisAttributes(G4VisAttributes::GetInvisible()); 177 auto caloVisAtt = new G4VisAttributes(G4Colo << 214 G4VisAttributes* caloVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,1.0)); 178 auto crystalVisAtt = new G4VisAttributes(G4C << 215 G4VisAttributes* crystalVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,0.0)); 179 caloLog->SetVisAttributes(caloVisAtt); 216 caloLog->SetVisAttributes(caloVisAtt); 180 fCrystalLog->SetVisAttributes(crystalVisAtt) 217 fCrystalLog->SetVisAttributes(crystalVisAtt); 181 218 182 // define the fParameterisation region 219 // define the fParameterisation region 183 fRegion = new G4Region("crystals"); 220 fRegion = new G4Region("crystals"); 184 caloLog->SetRegion(fRegion); 221 caloLog->SetRegion(fRegion); 185 fRegion->AddRootLogicalVolume(caloLog); 222 fRegion->AddRootLogicalVolume(caloLog); 186 << 223 187 return experimentalHallPhys; 224 return experimentalHallPhys; 188 } 225 } 189 226 190 //....oooOO0OOooo........oooOO0OOooo........oo 227 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 191 228 192 void ExGflash1DetectorConstruction::ConstructS 229 void ExGflash1DetectorConstruction::ConstructSDandField() 193 { 230 { 194 // -- sensitive detectors: 231 // -- sensitive detectors: 195 G4SDManager* SDman = G4SDManager::GetSDMpoin 232 G4SDManager* SDman = G4SDManager::GetSDMpointer(); 196 auto CaloSD = new ExGflash1SensitiveDetector << 233 ExGflash1SensitiveDetector* CaloSD >> 234 = new ExGflash1SensitiveDetector("Calorimeter",this); 197 SDman->AddNewDetector(CaloSD); 235 SDman->AddNewDetector(CaloSD); 198 fCrystalLog->SetSensitiveDetector(CaloSD); 236 fCrystalLog->SetSensitiveDetector(CaloSD); 199 << 237 200 // Get nist material manager 238 // Get nist material manager 201 G4NistManager* nistManager = G4NistManager:: 239 G4NistManager* nistManager = G4NistManager::Instance(); 202 G4Material* pbWO4 = nistManager->FindOrBuild << 240 G4Material* pbWO4 = nistManager->FindOrBuildMaterial("G4_PbWO4"); 203 // -- fast simulation models: 241 // -- fast simulation models: 204 // ***************************************** 242 // ********************************************** 205 // * Initializing shower modell 243 // * Initializing shower modell 206 // ***************************************** 244 // *********************************************** 207 G4cout << "Creating shower parameterization 245 G4cout << "Creating shower parameterization models" << G4endl; 208 fFastShowerModel = new GFlashShowerModel("fF 246 fFastShowerModel = new GFlashShowerModel("fFastShowerModel", fRegion); 209 fParameterisation = new GFlashHomoShowerPara 247 fParameterisation = new GFlashHomoShowerParameterisation(pbWO4); 210 fFastShowerModel->SetParameterisation(*fPara 248 fFastShowerModel->SetParameterisation(*fParameterisation); 211 // Energy Cuts to kill particles: 249 // Energy Cuts to kill particles: 212 fParticleBounds = new GFlashParticleBounds() 250 fParticleBounds = new GFlashParticleBounds(); 213 fFastShowerModel->SetParticleBounds(*fPartic 251 fFastShowerModel->SetParticleBounds(*fParticleBounds); 214 // Makes the EnergieSpots 252 // Makes the EnergieSpots 215 fHitMaker = new GFlashHitMaker(); 253 fHitMaker = new GFlashHitMaker(); 216 fFastShowerModel->SetHitMaker(*fHitMaker); 254 fFastShowerModel->SetHitMaker(*fHitMaker); 217 G4cout << "end shower parameterization." << << 255 G4cout<<"end shower parameterization."<<G4endl; 218 // ***************************************** 256 // ********************************************** 219 } 257 } 220 258 221 //....oooOO0OOooo........oooOO0OOooo........oo 259 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 222 260