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 // $Id: GammaRayTelDetectorConstruction.cc 101905 2016-12-07 11:34:39Z gunter $ 27 // ------------------------------------------- 28 // ------------------------------------------------------------ 28 // GEANT 4 class implementation file 29 // GEANT 4 class implementation file 29 // CERN Geneva Switzerland 30 // CERN Geneva Switzerland 30 // 31 // 31 // 32 // 32 // ------------ GammaRayTelDetectorConstr 33 // ------------ GammaRayTelDetectorConstruction ------ 33 // by F.Longo, R.Giannitrapani & G.S 34 // by F.Longo, R.Giannitrapani & G.Santin (13 nov 2000) 34 // 35 // 35 // ******************************************* 36 // ************************************************************ >> 37 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 38 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 36 39 37 #include "GammaRayTelAnticoincidenceSD.hh" << 38 #include "GammaRayTelCalorimeterSD.hh" << 39 #include "GammaRayTelDetectorConstruction.hh" 40 #include "GammaRayTelDetectorConstruction.hh" 40 #include "GammaRayTelDetectorMessenger.hh" 41 #include "GammaRayTelDetectorMessenger.hh" >> 42 41 #include "GammaRayTelTrackerSD.hh" 43 #include "GammaRayTelTrackerSD.hh" 42 44 43 #include "G4AutoDelete.hh" << 45 #include "GammaRayTelAnticoincidenceSD.hh" >> 46 #include "GammaRayTelCalorimeterSD.hh" >> 47 >> 48 #include "G4PhysicalConstants.hh" >> 49 #include "G4SystemOfUnits.hh" >> 50 #include "G4Material.hh" 44 #include "G4Box.hh" 51 #include "G4Box.hh" 45 #include "G4Colour.hh" << 46 #include "G4FieldManager.hh" << 47 #include "G4GlobalMagFieldMessenger.hh" << 48 #include "G4LogicalVolume.hh" 52 #include "G4LogicalVolume.hh" 49 #include "G4Material.hh" << 50 #include "G4PhysicalConstants.hh" << 51 #include "G4PVPlacement.hh" 53 #include "G4PVPlacement.hh" 52 #include "G4PVReplica.hh" 54 #include "G4PVReplica.hh" 53 #include "G4RegionStore.hh" << 54 #include "G4RunManager.hh" << 55 #include "G4SDManager.hh" << 56 #include "G4SystemOfUnits.hh" << 57 #include "G4TransportationManager.hh" << 58 #include "G4UImanager.hh" << 59 #include "G4UniformMagField.hh" 55 #include "G4UniformMagField.hh" >> 56 #include "G4FieldManager.hh" >> 57 #include "G4TransportationManager.hh" >> 58 #include "G4SDManager.hh" >> 59 #include "G4RunManager.hh" >> 60 #include "G4GlobalMagFieldMessenger.hh" >> 61 #include "G4AutoDelete.hh" 60 #include "G4VisAttributes.hh" 62 #include "G4VisAttributes.hh" >> 63 #include "G4Colour.hh" >> 64 #include "G4UImanager.hh" 61 65 62 //....oooOO0OOooo........oooOO0OOooo........oo << 63 66 64 G4ThreadLocal G4GlobalMagFieldMessenger *Gamma << 67 #include "G4RegionStore.hh" >> 68 >> 69 G4ThreadLocal G4GlobalMagFieldMessenger* >> 70 GammaRayTelDetectorConstruction::fMagFieldMessenger = 0; >> 71 >> 72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 65 73 66 GammaRayTelDetectorConstruction::GammaRayTelDe 74 GammaRayTelDetectorConstruction::GammaRayTelDetectorConstruction() >> 75 :solidWorld(0),logicWorld(0),physiWorld(0), >> 76 solidPayload(0),logicPayload(0),physiPayload(0), >> 77 solidTKR(0),logicTKR(0),physiTKR(0), >> 78 solidCAL(0),logicCAL(0),physiCAL(0), >> 79 solidACT(0),logicACT(0),physiACT(0), >> 80 solidACL1(0),logicACL1(0),physiACL1(0), >> 81 solidACL2(0),logicACL2(0),physiACL2(0), >> 82 solidTKRDetectorX(0),logicTKRDetectorX(0),physiTKRDetectorX(0), >> 83 solidTKRDetectorY(0),logicTKRDetectorY(0),physiTKRDetectorY(0), >> 84 solidCALLayerX(0),logicCALLayerX(0),physiCALLayerX(0), >> 85 solidCALLayerY(0),logicCALLayerY(0),physiCALLayerY(0), >> 86 solidCALDetectorX(0),logicCALDetectorX(0),physiCALDetectorX(0), >> 87 solidCALDetectorY(0),logicCALDetectorY(0),physiCALDetectorY(0), >> 88 solidPlane(0),logicPlane(0),physiPlane(0), >> 89 solidConverter(0),logicConverter(0),physiConverter(0), >> 90 logicTKRStripX(0),logicTKRStripY(0) >> 91 // aTKRRegion(0), aCALRegion(0) 67 { 92 { 68 // Initialize thread-local sensitive detecto << 93 // default parameter values of the payload 69 trackerSD.Put(nullptr); << 94 70 calorimeterSD.Put(nullptr); << 95 ConverterThickness = 300.*micrometer; 71 anticoincidenceSD.Put(nullptr); << 96 TKRSiliconThickness = 400.*micrometer; 72 << 97 TKRSiliconTileXY = 9.*cm; 73 ComputePayloadParameters(); << 98 TKRSiliconPitch = 200.*micrometer; 74 << 99 TKRLayerDistance = 3.*cm; 75 // create commands for interactive definitio << 100 SiliconGuardRing = 1.5*mm; 76 detectorMessenger = new GammaRayTelDetectorM << 101 TKRViewsDistance = 1.*mm; 77 } << 102 NbOfTKRLayers = 15; 78 << 103 NbOfTKRTiles = 4; 79 //....oooOO0OOooo........oooOO0OOooo........oo << 104 CALBarThickness = 1.5*cm; 80 << 105 NbOfCALBars = 12; 81 GammaRayTelDetectorConstruction::~GammaRayTelD << 106 NbOfCALLayers = 5; 82 delete detectorMessenger; << 107 ACDThickness = 1.*cm; 83 } << 108 NbOfACDTopTiles = 1; 84 << 109 NbOfACDLateralTiles = 2; 85 //....oooOO0OOooo........oooOO0OOooo........oo << 86 << 87 auto GammaRayTelDetectorConstruction::Construc << 88 DefineMaterials(); << 89 return ConstructPayload(); << 90 } << 91 << 92 //....oooOO0OOooo........oooOO0OOooo........oo << 93 << 94 void GammaRayTelDetectorConstruction::DefineMa << 95 G4String name; << 96 G4String symbol; << 97 << 98 G4int numberOfAtoms; << 99 G4int numberOfComponents; << 100 << 101 // << 102 // define Elements << 103 // << 104 << 105 constexpr auto HYDROGEN_ATOMIC_NUMBER{1.}; << 106 constexpr auto HYDROGEN_MOLAR_MASS{1.01 * g << 107 auto *hydrogen = new G4Element(name = "Hydro << 108 << 109 constexpr auto CARBON_ATOMIC_NUMBER{6.}; << 110 constexpr auto CARBON_MOLAR_MASS{12.01 * g << 111 auto *carbon = new G4Element(name = "Carbon" << 112 << 113 constexpr auto NITROGEN_ATOMIC_NUMBER{7.}; << 114 constexpr auto NITROGEN_MOLAR_MASS{14.006 << 115 auto *nitrogen = new G4Element(name = "Nitro << 116 << 117 constexpr auto OXYGEN_ATOMIC_NUMBER{8.}; << 118 constexpr auto OXYGEN_MOLAR_MASS{15.99 * g / << 119 auto *oxygen = new G4Element(name = "Oxygen" << 120 << 121 constexpr auto ALUMINIUM_ATOMIC_NUMBER{13.}; << 122 constexpr auto ALUMINIUM_MOLAR_MASS{26.98 << 123 auto *aluminium = new G4Element(name = "Alum << 124 << 125 constexpr auto SILICON_ATOMIC_NUMBER{14.}; << 126 constexpr auto SILICON_MOLAR_MASS{28.09 * << 127 auto *silicon = new G4Element(name = "Silico << 128 << 129 constexpr auto IRON_ATOMIC_NUMBER{26.}; << 130 constexpr auto IRON_MOLAR_MASS{55.845 * g << 131 auto *iron = new G4Element(name = "Iron", sy << 132 << 133 constexpr auto IODINE_ATOMIC_NUMBER{53.}; << 134 constexpr auto IODINE_MOLAR_MASS{126.904 * << 135 auto *iodine = new G4Element(name = "Iodine" << 136 << 137 constexpr auto CESIUM_ATOMIC_NUMBER{55}; << 138 constexpr auto CESIUM_MOLAR_MASS{132.905 * << 139 auto *cesium = new G4Element(name = "Cesium" << 140 << 141 constexpr auto LEAD_ATOMIC_NUMBER{82}; << 142 constexpr auto LEAD_MOLAR_MASS{207.19 * g << 143 auto *lead = new G4Element(name = "Lead", sy << 144 << 145 // << 146 // define simple materials << 147 // << 148 << 149 constexpr auto TUNGSTEN_ATOMIC_NUMBER{74.} << 150 constexpr auto TUNGSTEN_DENSITY{19.3 * g / << 151 constexpr auto TUNGSTEN_MOLAR_MASS{183.84 << 152 auto *tungsten = new G4Material(name = "Tung << 153 << 154 // << 155 // Define a material from elements. << 156 // Case 1: chemical molecule << 157 // << 158 << 159 constexpr auto SCINTILLATOR_MATERIAL_DENSITY << 160 auto *scintillatorMaterial = new G4Material( << 161 scintillatorMaterial->AddElement(carbon, num << 162 scintillatorMaterial->AddElement(hydrogen, n << 163 << 164 constexpr auto CESIUM_IODIDE_DENSITY{4.53 * << 165 auto *cesiumIodide = new G4Material(name = " << 166 cesiumIodide->AddElement(cesium, numberOfAto << 167 cesiumIodide->AddElement(iodine, numberOfAto << 168 << 169 // << 170 // Define a material from elements. << 171 // Case 2: mixture by fractional mass << 172 // << 173 << 174 constexpr auto AIR_DENSITY{1.290 * mg / cm3} << 175 constexpr auto AIR_NITROGEN_MASS_FRACTION{0. << 176 constexpr auto AIR_OXYGEN_MASS_FRACTION{0.3} << 177 << 178 auto *air = new G4Material(name = "Air", AIR << 179 air->AddElement(nitrogen, AIR_NITROGEN_MASS_ << 180 air->AddElement(oxygen, AIR_OXYGEN_MASS_FRAC << 181 << 182 constexpr auto ALUMINIUM_DENSITY{2.700 * g / << 183 constexpr auto ALUMINIUM_MASS_FRACTION{1.}; << 184 auto *Al = new G4Material(name = "Aluminum", << 185 Al->AddElement(aluminium, ALUMINIUM_MASS_FRA << 186 << 187 constexpr auto SILICON_DENSITY{2.333 * g / c << 188 constexpr auto SILICON_MASS_FRACTION{1.}; << 189 auto *Si = new G4Material(name = "Silicon", << 190 Si->AddElement(silicon, SILICON_MASS_FRACTIO << 191 << 192 constexpr auto IRON_DENSITY{7.87 * g / cm3}; << 193 constexpr auto IRON_MASS_FRACTION{1.}; << 194 auto *Fe = new G4Material(name = "Iron", IRO << 195 Fe->AddElement(iron, IRON_MASS_FRACTION); << 196 << 197 constexpr auto LEAD_DENSITY{11.35 * g / cm3} << 198 constexpr auto LEAD_MASS_FRACTION{1.}; << 199 auto *Pb = new G4Material(name = "Lead", LEA << 200 Pb->AddElement(lead, LEAD_MASS_FRACTION); << 201 << 202 // << 203 // examples of vacuum << 204 // << 205 constexpr auto VACUUM_ATOMIC_NUMBER{1.}; << 206 constexpr auto VACUUM_DENSITY{universe_mean_ << 207 constexpr auto VACUUM_MOLAR_MASS{1.01 * g / << 208 constexpr auto VACUUM_PRESSURE{3.e-18 * pa << 209 constexpr auto VACUUM_TEMPERATURE{2.73 * k << 210 auto *vacuum = new G4Material(name = "Galact << 211 << 212 constexpr auto BEAM_DENSITY{1.e-5 * g / cm3} << 213 constexpr auto BEAM_MASS_FRACTION{1.}; << 214 constexpr auto BEAM_PRESSURE{2.e-2 * bar}; << 215 constexpr auto BEAM_TEMPERATURE{STP_Temperat << 216 auto *beam = new G4Material(name = "Beam", B << 217 beam->AddMaterial(air, BEAM_MASS_FRACTION); << 218 << 219 G4cout << *(G4Material::GetMaterialTable()) << 220 << 221 // default materials of the payload << 222 << 223 defaultMaterial = vacuum; << 224 << 225 converterMaterial = tungsten; << 226 acdMaterial = scintillatorMaterial; // antic << 227 calMaterial = cesiumIodide; // calorimeter ( << 228 tkrMaterial = Si; // tracker (TKR) << 229 } << 230 << 231 //....oooOO0OOooo........oooOO0OOooo........oo << 232 << 233 auto GammaRayTelDetectorConstruction::Construc << 234 // complete the payload parameters definitio << 235 ComputePayloadParameters(); << 236 << 237 // << 238 // World << 239 // << 240 << 241 solidWorld = new G4Box("World", worldSizeXY << 242 logicWorld = new G4LogicalVolume(solidWorld, << 243 physiWorld = new G4PVPlacement(nullptr, G4Th << 244 << 245 // << 246 // Payload << 247 // << 248 << 249 solidPayload = new G4Box("Payload", payloadS << 250 logicPayload = new G4LogicalVolume(solidPayl << 251 physiPayload = new G4PVPlacement(nullptr, G4 << 252 << 253 // << 254 // Calorimeter (CAL) << 255 // << 256 << 257 solidCAL = new G4Box("CAL", calSizeXY / 2, c << 258 logicCAL = new G4LogicalVolume(solidCAL, def << 259 physiCAL = new G4PVPlacement(nullptr, << 260 G4ThreeVector(0, 0, << 261 -payloadSizeZ / 2 + calSizeZ << 262 "CAL", logicCAL, physiPayload, fal << 263 << 264 // << 265 // Tracker (TKR) << 266 // << 267 << 268 solidTKR = new G4Box("TKR", tkrSizeXY / 2, t << 269 logicTKR = new G4LogicalVolume(solidTKR, def << 270 physiTKR = new G4PVPlacement(nullptr, << 271 G4ThreeVector(0, 0, << 272 -payloadSizeZ / 2 + calSizeZ << 273 + tkrSizeZ / 2), << 274 "TKR", logicTKR, physiPayload, fal << 275 << 276 // << 277 // Anticoincidence, Top Side (ACT) << 278 // << 279 << 280 solidACT = new G4Box("ACT", actSizeXY / 2, a << 281 logicACT = new G4LogicalVolume(solidACT, acd << 282 physiACT = new G4PVPlacement(nullptr, << 283 G4ThreeVector(0, 0, << 284 -payloadSizeZ / 2 + calSizeZ + calTK << 285 + acdTKRDistance + actSizeZ / 2) << 286 "ACT", logicACT, physiPayload, fal << 287 << 288 // << 289 // Anticoincidence, Lateral Side (ACL) << 290 // << 291 << 292 solidACL1 = new G4Box("ACL1", acl1SizeX / 2, << 293 logicACL1 = new G4LogicalVolume(solidACL1, a << 294 << 295 physiACL1 = new G4PVPlacement(nullptr, << 296 G4ThreeVector(-payloadSizeXY / 2 + acl1S << 297 -payloadSizeXY / 2 + acl1SizeY / 2, << 298 -payloadSizeZ / 2 + acl1SizeZ / 2), << 299 "ACL1", logicACL1, physiPayload, f << 300 << 301 physiACL1 = new G4PVPlacement(nullptr, << 302 G4ThreeVector(payloadSizeXY / 2 - acl1Si << 303 payloadSizeXY / 2 - acl1SizeY / 2, << 304 -payloadSizeZ / 2 + acl1SizeZ / 2), << 305 "ACL1", logicACL1, physiPayload, f << 306 << 307 solidACL2 = new G4Box("ACL2", acl2SizeX / 2, << 308 logicACL2 = new G4LogicalVolume(solidACL2, a << 309 << 310 physiACL2 = new G4PVPlacement(nullptr, << 311 G4ThreeVector(-payloadSizeXY / 2 + acl2S << 312 payloadSizeXY / 2 - acl2SizeY / 2, << 313 -payloadSizeZ / 2 + acl2SizeZ / 2), << 314 "ACL2", logicACL2, physiPayload, f << 315 << 316 physiACL2 = new G4PVPlacement(nullptr, << 317 G4ThreeVector(payloadSizeXY / 2 - acl2Si << 318 -payloadSizeXY / 2 + acl2SizeY / 2, << 319 -payloadSizeZ / 2 + acl2SizeZ / 2), << 320 "ACL2", logicACL2, physiPayload, f << 321 << 322 // << 323 // Tracker Structure (Plane + Converter + TK << 324 // << 325 << 326 solidPlane = new G4Box("Plane", tkrSizeXY / << 327 logicPlane = new G4LogicalVolume(solidPlane, << 328 << 329 solidTKRDetectorY = new G4Box("TKRDetectorY" << 330 logicTKRDetectorY = new G4LogicalVolume(soli << 331 << 332 solidTKRDetectorX = new G4Box("TKRDetectorX" << 333 logicTKRDetectorX = new G4LogicalVolume(soli << 334 << 335 solidConverter = new G4Box("Converter", tkrS << 336 logicConverter = new G4LogicalVolume(solidCo << 337 << 338 G4int i = 0; << 339 << 340 for (i = 0; i < numberOfTKRLayers; i++) { << 341 physiTKRDetectorY = new G4PVPlacement(null << 342 G4ThreeVector(0., 0., << 343 -tkrSizeZ / 2 + tkrSiliconThic << 344 + (i) * tkrLayerDistance), << 345 "TKRDetectorY", logicTKRDetectorY, << 346 << 347 physiTKRDetectorX = new G4PVPlacement(null << 348 G4ThreeVector(0., 0., << 349 -tkrSizeZ / 2 + tkrSiliconThic << 350 + tkrViewsDistance + tkrSi << 351 + (i) * tkrLayerDistance), << 352 "TKRDetectorX", logicTKRDetectorX, << 353 << 354 physiConverter = new G4PVPlacement(nullptr << 355 G4ThreeVector(0., 0., << 356 -tkrSizeZ / 2 + 2 * tkrSilicon << 357 + tkrViewsDistance + conve << 358 + (i) * tkrLayerDistance), << 359 "Converter", logicConverter, physi << 360 << 361 physiPlane = new G4PVPlacement(nullptr, << 362 G4ThreeVector(0., 0., << 363 -tkrSizeZ / 2 + 2 * tkrSilicon << 364 + tkrViewsDistance + conve << 365 + tkrSupportThickness / 2 << 366 + (i) * tkrLayerDistance), << 367 "Plane", logicPlane, physiTKR, fal << 368 } << 369 110 370 auto *solidTKRActiveTileX = new G4Box("Activ << 111 TilesSeparation = 100.*micrometer; 371 auto *solidTKRActiveTileY = new G4Box("Activ << 112 ACDTKRDistance = 5.*cm; >> 113 CALTKRDistance = 1.5*cm; 372 114 373 auto *logicTKRActiveTileX = new G4LogicalVol << 115 //Initialize thread-local sensitive detectors 374 auto *logicTKRActiveTileY = new G4LogicalVol << 116 trackerSD.Put(0); >> 117 calorimeterSD.Put(0); >> 118 anticoincidenceSD.Put(0); 375 119 376 G4int j = 0; << 120 ComputePayloadParameters(); 377 G4int k = 0; << 378 121 379 G4double x = 0.; << 122 // create commands for interactive definition of the payload 380 G4double y = 0.; << 123 detectorMessenger = new GammaRayTelDetectorMessenger(this); 381 G4double z = 0.; << 382 << 383 for (i = 0; i < numberOfTKRTiles; i++) { << 384 for (j = 0; j < numberOfTKRTiles; j++) { << 385 k = i * numberOfTKRTiles + j; << 386 << 387 x = -tkrSizeXY / 2 + tilesSeparation + s << 388 + tkrActiveTileXY / 2 << 389 + (i) << 390 * ((2 * siliconGuardRi << 391 + tkrActiveTileXY) << 392 << 393 y = -tkrSizeXY / 2 + tilesSeparation + s << 394 + tkrActiveTileXY / 2 << 395 + (j) << 396 * ((2 * siliconGuardRi << 397 + tkrActiveTileXY) << 398 z = 0.; << 399 << 400 new G4PVPlacement(nullptr, G4ThreeVector << 401 << 402 x = -tkrSizeXY / 2 + tilesSeparation + s << 403 + tkrActiveTileXY / 2 << 404 + (j) << 405 * ((2 * siliconGuardRi << 406 + tkrActiveTileXY) << 407 << 408 y = -tkrSizeXY / 2 + tilesSeparation + s << 409 + tkrActiveTileXY / 2 << 410 + (i) << 411 * ((2 * siliconGuardRi << 412 + tkrActiveTileXY) << 413 z = 0.; << 414 124 415 new G4PVPlacement(nullptr, G4ThreeVector << 125 } 416 } << 417 } << 418 126 419 // Strips << 127 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 420 128 421 // Silicon Strips << 129 GammaRayTelDetectorConstruction::~GammaRayTelDetectorConstruction() >> 130 { delete detectorMessenger;} 422 131 423 /* << 132 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 424 G4double tkrXStripX{0.}; << 425 G4double tkrYStripY{0.}; << 426 G4double tkrYStripX{0.}; << 427 G4double tkrXStripY{0.}; << 428 */ << 429 << 430 tkrXStripX = tkrYStripY = tkrSiliconPitch; << 431 tkrYStripX = tkrXStripY = tkrActiveTileXY; << 432 tkrZStrip = tkrSiliconThickness; << 433 << 434 auto *solidTKRStripX = new G4Box("Strip X", << 435 logicTKRStripX = new G4LogicalVolume(solidTK << 436 << 437 auto *solidTKRStripY = new G4Box("Strip Y", << 438 logicTKRStripY = new G4LogicalVolume(solidTK << 439 << 440 for (i = 0; i < numberOfTKRStrips; i++) { << 441 new G4PVPlacement(nullptr, << 442 G4ThreeVector( << 443 -tkrActiveTileXY / 2 + tkrSili << 444 + (i) * tkrSiliconPitch, 0 << 445 logicTKRStripX, "Strip X", logicTK << 446 << 447 new G4PVPlacement(nullptr, << 448 G4ThreeVector(0., << 449 -tkrActiveTileXY / 2 + tkrSili << 450 + (i) * tkrSiliconPitch, 0 << 451 logicTKRStripY, "Strip Y", logicTK << 452 } << 453 133 454 // << 134 G4VPhysicalVolume* GammaRayTelDetectorConstruction::Construct() 455 // Calorimeter Structure (CALLayerX + CALLay << 135 { 456 // << 136 DefineMaterials(); 457 << 137 return ConstructPayload(); 458 solidCALLayerX = new G4Box("CALLayerX", calS << 138 } 459 logicCALLayerX = new G4LogicalVolume(solidCA << 460 << 461 solidCALLayerY = new G4Box("CALLayerY", calS << 462 logicCALLayerY = new G4LogicalVolume(solidCA << 463 << 464 for (i = 0; i < numberOfCALLayers; i++) { << 465 physiCALLayerY = new G4PVPlacement(nullptr << 466 G4ThreeVector(0, 0, << 467 -calSizeZ / 2 + calBarThicknes << 468 + (i) * 2 * calBarThicknes << 469 "CALLayerY", logicCALLayerY, physi << 470 << 471 physiCALLayerX = new G4PVPlacement(nullptr << 472 G4ThreeVector(0, 0, << 473 -calSizeZ / 2 + calBarThicknes << 474 + (i) * 2 * calBarThicknes << 475 "CALLayerX", logicCALLayerX, physi << 476 } << 477 139 478 // << 140 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 479 // Calorimeter Structure (CALDetectorX + CAL << 480 // << 481 << 482 solidCALDetectorX = new G4Box("CALDetectorX" << 483 logicCALDetectorX = new G4LogicalVolume(soli << 484 << 485 solidCALDetectorY = new G4Box("CALDetectorY" << 486 logicCALDetectorY = new G4LogicalVolume(soli << 487 << 488 for (i = 0; i < numberOfCALBars; i++) { << 489 physiCALDetectorY = new G4PVPlacement(null << 490 G4ThreeVector(-calSizeXY / 2 + cal << 491 logicCALDetectorY, "CALDetectorY", << 492 << 493 physiCALDetectorX = new G4PVPlacement(null << 494 G4ThreeVector(0, -calSizeXY / 2 + << 495 logicCALDetectorX, "CALDetectorX", << 496 } << 497 141 498 /* << 142 void GammaRayTelDetectorConstruction::DefineMaterials() 499 // Cuts by Region << 143 { >> 144 >> 145 G4String name, symbol; >> 146 G4double a, z, density; >> 147 >> 148 G4int ncomponents, natoms; >> 149 G4double fractionmass; >> 150 G4double temperature, pressure; >> 151 >> 152 // >> 153 // define Elements >> 154 // >> 155 >> 156 a = 1.01*g/mole; >> 157 G4Element* H = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); >> 158 >> 159 a = 12.01*g/mole; >> 160 G4Element* C = new G4Element(name="Carbon" ,symbol="C" , z= 6., a); >> 161 >> 162 a = 14.006*g/mole; >> 163 G4Element* N = new G4Element(name="Nitrogen" ,symbol="N" , z= 7., a); >> 164 >> 165 a = 15.99*g/mole; >> 166 G4Element* O = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a); >> 167 >> 168 a = 26.98*g/mole; >> 169 G4Element* Alumin = new G4Element(name="Aluminum" ,symbol="Al" , z= 13., a); >> 170 >> 171 a = 28.09*g/mole; >> 172 G4Element* Silicon = new G4Element(name="Silicon", symbol="Si", z=14., a); >> 173 >> 174 a= 55.845*g/mole; >> 175 G4Element* Iron = new G4Element(name="Iron", symbol="Fe", z=26.,a); >> 176 >> 177 a = 126.904*g/mole; >> 178 G4Element* I = new G4Element(name="Iodine" ,symbol="I" , z= 53., a); >> 179 >> 180 a = 132.905*g/mole; >> 181 G4Element* Cs = new G4Element(name="Cesium" ,symbol="Cs" , z= 55., a); >> 182 >> 183 a = 207.19*g/mole; >> 184 G4Element* Lead = new G4Element(name="Lead", symbol="Pb", z=82., a); >> 185 >> 186 // >> 187 // define simple materials >> 188 // >> 189 >> 190 density = 19.3*g/cm3; >> 191 a = 183.84*g/mole; >> 192 G4Material* W = new G4Material(name="Tungsten", z=74., a, density); >> 193 >> 194 >> 195 // >> 196 // define a material from elements. case 1: chemical molecule >> 197 // >> 198 >> 199 density = 1.032*g/cm3; >> 200 G4Material* Sci = new G4Material(name="Scintillator", density, ncomponents=2); >> 201 Sci->AddElement(C, natoms=9); >> 202 Sci->AddElement(H, natoms=10); >> 203 >> 204 density = 4.53*g/cm3; >> 205 G4Material* CsI = new G4Material(name="CesiumIodide", density, ncomponents=2); >> 206 CsI->AddElement(Cs, natoms=5); >> 207 CsI->AddElement(I, natoms=5); >> 208 >> 209 // >> 210 // define a material from elements. case 2: mixture by fractional mass >> 211 // >> 212 >> 213 density = 1.290*mg/cm3; >> 214 G4Material* Air = new G4Material(name="Air" , density, ncomponents=2); >> 215 Air->AddElement(N, fractionmass=0.7); >> 216 Air->AddElement(O, fractionmass=0.3); >> 217 >> 218 density = 2.700*g/cm3; >> 219 G4Material* Al = new G4Material(name="Aluminum", density, ncomponents=1); >> 220 Al->AddElement(Alumin, fractionmass=1.); >> 221 >> 222 density = 2.333*g/cm3; >> 223 G4Material* Si = new G4Material(name="Silicon", density, ncomponents=1); >> 224 Si->AddElement(Silicon, fractionmass=1.); >> 225 >> 226 density = 7.87*g/cm3; >> 227 G4Material* Fe = new G4Material(name="Iron", density, ncomponents=1); >> 228 Fe->AddElement(Iron, fractionmass=1.); >> 229 >> 230 density = 11.35*g/cm3; >> 231 G4Material* Pb = new G4Material(name="Lead", density, ncomponents=1); >> 232 Pb->AddElement(Lead, fractionmass=1.); >> 233 >> 234 // >> 235 // examples of vacuum >> 236 // >> 237 >> 238 density = universe_mean_density; //from PhysicalConstants.h >> 239 pressure = 3.e-18*pascal; >> 240 temperature = 2.73*kelvin; >> 241 G4Material* vacuum = new G4Material(name="Galactic", z=1., a=1.01*g/mole, density,kStateGas,temperature,pressure); >> 242 >> 243 density = 1.e-5*g/cm3; >> 244 pressure = 2.e-2*bar; >> 245 temperature = STP_Temperature; //from PhysicalConstants.h >> 246 G4Material* beam = new G4Material(name="Beam", density, ncomponents=1, >> 247 kStateGas,temperature,pressure); >> 248 beam->AddMaterial(Air, fractionmass=1.); >> 249 >> 250 G4cout << *(G4Material::GetMaterialTable()) << G4endl; >> 251 >> 252 //default materials of the payload >> 253 >> 254 ConverterMaterial = W; >> 255 defaultMaterial = vacuum; >> 256 ACDMaterial = Sci; >> 257 CALMaterial = CsI; >> 258 TKRMaterial = Si; 500 259 501 G4String regionName[] = {"Calorimeter", "T << 260 } 502 261 503 if (calorimeterCutRegion) { << 262 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 504 delete calorimeterCutRegion; << 505 } << 506 calorimeterCutRegion = new G4Region(region << 507 logicCAL->SetRegion(calorimeterCutRegion); << 508 calorimeterCutRegion->AddRootLogicalVolume << 509 263 510 if (trackerCutRegion != nullptr) { << 264 G4VPhysicalVolume* GammaRayTelDetectorConstruction::ConstructPayload() 511 delete trackerCutRegion; << 265 { >> 266 // complete the Payload parameters definition >> 267 ComputePayloadParameters(); >> 268 >> 269 // >> 270 // World >> 271 // >> 272 >> 273 solidWorld = new G4Box("World", >> 274 WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/2); >> 275 >> 276 logicWorld = new G4LogicalVolume(solidWorld, >> 277 defaultMaterial, >> 278 "World"); >> 279 >> 280 physiWorld = new G4PVPlacement(0,G4ThreeVector(),"World",logicWorld, >> 281 0,false,0); >> 282 >> 283 // >> 284 // Payload >> 285 // >> 286 >> 287 /* solidPayload=0; logicPayload=0; physiPayload=0; >> 288 solidTKR=0;logicTKR=0;physiTKR=0; >> 289 solidCAL=0;logicCAL=0;physiCAL=0; >> 290 solidACT=0;logicACT=0;physiACT=0; >> 291 solidACL1=0;logicACL1=0;physiACL1=0; >> 292 solidACL2=0;logicACL2=0;physiACL2=0; >> 293 solidConverter=0;logicConverter=0;physiConverter=0; >> 294 solidTKRDetectorX=0;logicTKRDetectorX=0; >> 295 solidTKRDetectorY=0;logicTKRDetectorY=0; >> 296 physiTKRDetectorX=0;physiTKRDetectorY=0; >> 297 solidCALDetectorX=0;logicCALDetectorX=0;physiCALDetectorX=0; >> 298 solidCALDetectorY=0;logicCALDetectorY=0;physiCALDetectorY=0; >> 299 solidPlane=0;logicPlane=0;physiPlane=0; >> 300 aCALRegion=0; aTKRRegion=0; >> 301 */ >> 302 // >> 303 // Payload >> 304 // >> 305 >> 306 solidPayload = new G4Box("Payload", >> 307 PayloadSizeXY/2, >> 308 PayloadSizeXY/2, >> 309 PayloadSizeZ/2); >> 310 >> 311 logicPayload = new G4LogicalVolume(solidPayload, >> 312 defaultMaterial, >> 313 "Payload"); >> 314 >> 315 physiPayload = new G4PVPlacement(0, >> 316 G4ThreeVector(), >> 317 "Payload", >> 318 logicPayload, >> 319 physiWorld, >> 320 false, >> 321 0); >> 322 // >> 323 // Calorimeter (CAL) >> 324 // >> 325 >> 326 solidCAL = new G4Box("CAL", >> 327 CALSizeXY/2,CALSizeXY/2,CALSizeZ/2); >> 328 >> 329 logicCAL = new G4LogicalVolume(solidCAL, >> 330 defaultMaterial, >> 331 "CAL"); >> 332 physiCAL = new G4PVPlacement(0, >> 333 G4ThreeVector(0,0, >> 334 -PayloadSizeZ/2+CALSizeZ/2), >> 335 "CAL", >> 336 logicCAL, >> 337 physiPayload, >> 338 false, >> 339 0); >> 340 // >> 341 // Tracker (TKR) >> 342 // >> 343 >> 344 solidTKR = new G4Box("TKR", >> 345 TKRSizeXY/2,TKRSizeXY/2,TKRSizeZ/2); >> 346 >> 347 logicTKR = new G4LogicalVolume(solidTKR, >> 348 defaultMaterial, >> 349 "TKR"); >> 350 physiTKR = new G4PVPlacement(0, >> 351 G4ThreeVector(0,0, >> 352 -PayloadSizeZ/2+CALSizeZ+ >> 353 CALTKRDistance+TKRSizeZ/2), >> 354 "TKR", >> 355 logicTKR, >> 356 physiPayload, >> 357 false, >> 358 0); >> 359 >> 360 >> 361 // >> 362 // Anticoincidence Top (ACT) >> 363 // >> 364 >> 365 solidACT = new G4Box("ACT", >> 366 ACTSizeXY/2,ACTSizeXY/2,ACTSizeZ/2); >> 367 >> 368 logicACT = new G4LogicalVolume(solidACT,ACDMaterial,"ACT"); >> 369 >> 370 physiACT = new G4PVPlacement(0, >> 371 G4ThreeVector(0,0, >> 372 -PayloadSizeZ/2+CALSizeZ+ >> 373 CALTKRDistance+TKRSizeZ+ >> 374 ACDTKRDistance+ACTSizeZ/2), >> 375 "ACT", >> 376 logicACT, >> 377 physiPayload, >> 378 false, >> 379 0); >> 380 >> 381 // >> 382 // Anticoincidence Lateral Side (ACL) >> 383 // >> 384 >> 385 solidACL1 = new G4Box("ACL1", >> 386 ACL1SizeX/2,ACL1SizeY/2,ACL1SizeZ/2); >> 387 >> 388 logicACL1 = new G4LogicalVolume(solidACL1,ACDMaterial,"ACL"); >> 389 >> 390 physiACL1 = new G4PVPlacement(0, >> 391 G4ThreeVector(-PayloadSizeXY/2+ACL1SizeX/2, >> 392 -PayloadSizeXY/2+ACL1SizeY/2, >> 393 -PayloadSizeZ/2+ACL1SizeZ/2), >> 394 "ACL1", >> 395 logicACL1, >> 396 physiPayload, >> 397 false, >> 398 0); >> 399 >> 400 physiACL1 = new G4PVPlacement(0, >> 401 G4ThreeVector(PayloadSizeXY/2-ACL1SizeX/2, >> 402 PayloadSizeXY/2-ACL1SizeY/2, >> 403 -PayloadSizeZ/2+ACL1SizeZ/2), >> 404 "ACL1", >> 405 logicACL1, >> 406 physiPayload, >> 407 false, >> 408 1); >> 409 >> 410 solidACL2 = new G4Box("ACL2", >> 411 ACL2SizeX/2,ACL2SizeY/2,ACL2SizeZ/2); >> 412 >> 413 logicACL2 = new G4LogicalVolume(solidACL2, >> 414 ACDMaterial, >> 415 "ACL2"); >> 416 >> 417 >> 418 physiACL2 = new G4PVPlacement(0, >> 419 G4ThreeVector(-PayloadSizeXY/2+ACL2SizeX/2, >> 420 PayloadSizeXY/2-ACL2SizeY/2, >> 421 -PayloadSizeZ/2+ACL2SizeZ/2), >> 422 "ACL2", >> 423 logicACL2, >> 424 physiPayload, >> 425 false, >> 426 0); >> 427 >> 428 physiACL2 = new G4PVPlacement(0, >> 429 G4ThreeVector(PayloadSizeXY/2-ACL2SizeX/2, >> 430 -PayloadSizeXY/2+ACL2SizeY/2, >> 431 -PayloadSizeZ/2+ACL2SizeZ/2), >> 432 "ACL2", >> 433 logicACL2, >> 434 physiPayload, >> 435 false, >> 436 1); >> 437 >> 438 >> 439 // Tracker Structure (Plane + Converter + TKRDetectorX + TKRDetectorY) >> 440 >> 441 solidPlane = new G4Box("Plane", >> 442 TKRSizeXY/2,TKRSizeXY/2,TKRSupportThickness/2); >> 443 >> 444 logicPlane = new G4LogicalVolume(solidPlane, >> 445 defaultMaterial, >> 446 "Plane"); >> 447 >> 448 solidTKRDetectorY = new G4Box >> 449 ("TKRDetectorY",TKRSizeXY/2,TKRSizeXY/2,TKRSiliconThickness/2); >> 450 >> 451 logicTKRDetectorY = new G4LogicalVolume(solidTKRDetectorY, >> 452 TKRMaterial, >> 453 "TKRDetector Y"); >> 454 >> 455 >> 456 solidTKRDetectorX = new G4Box >> 457 ("TKRDetectorX",TKRSizeXY/2,TKRSizeXY/2,TKRSiliconThickness/2); >> 458 >> 459 logicTKRDetectorX = new G4LogicalVolume(solidTKRDetectorX, >> 460 TKRMaterial, >> 461 "TKRDetector X"); >> 462 >> 463 >> 464 solidConverter = new G4Box >> 465 ("Converter",TKRSizeXY/2,TKRSizeXY/2,ConverterThickness/2); >> 466 >> 467 logicConverter = new G4LogicalVolume(solidConverter, >> 468 ConverterMaterial, >> 469 "Converter"); >> 470 >> 471 G4int i=0; >> 472 >> 473 for (i = 0; i < NbOfTKRLayers; i++) >> 474 { >> 475 >> 476 physiTKRDetectorY = >> 477 new G4PVPlacement(0,G4ThreeVector(0.,0.,-TKRSizeZ/2 >> 478 +TKRSiliconThickness/2 >> 479 +(i)*TKRLayerDistance), >> 480 "TKRDetectorY", >> 481 logicTKRDetectorY, >> 482 physiTKR, >> 483 false, >> 484 i); >> 485 >> 486 physiTKRDetectorX = >> 487 new G4PVPlacement(0,G4ThreeVector(0.,0., >> 488 -TKRSizeZ/2+ >> 489 TKRSiliconThickness/2 + >> 490 TKRViewsDistance+ >> 491 TKRSiliconThickness+ >> 492 (i)*TKRLayerDistance), >> 493 "TKRDetectorX", >> 494 logicTKRDetectorX, >> 495 physiTKR, >> 496 false, >> 497 i); >> 498 >> 499 >> 500 physiConverter = >> 501 new G4PVPlacement(0,G4ThreeVector(0.,0., >> 502 -TKRSizeZ/2+ >> 503 2*TKRSiliconThickness + >> 504 TKRViewsDistance+ >> 505 ConverterThickness/2+ >> 506 (i)*TKRLayerDistance), >> 507 "Converter", >> 508 logicConverter, >> 509 physiTKR, >> 510 false, >> 511 i); >> 512 >> 513 >> 514 >> 515 physiPlane = >> 516 new G4PVPlacement(0,G4ThreeVector(0.,0., >> 517 -TKRSizeZ/2+ >> 518 2*TKRSiliconThickness + >> 519 TKRViewsDistance+ >> 520 ConverterThickness+ >> 521 TKRSupportThickness/2+ >> 522 (i)*TKRLayerDistance), >> 523 "Plane", >> 524 logicPlane, >> 525 physiTKR, >> 526 false, >> 527 i); >> 528 512 } 529 } 513 trackerCutRegion = new G4Region(regionName << 530 514 logicTKR->SetRegion(trackerCutRegion); << 531 515 trackerCutRegion->AddRootLogicalVolume(log << 532 516 */ << 533 G4VSolid * solidTKRActiveTileX = new 517 << 534 G4Box("Active Tile X", TKRActiveTileXY/2, 518 // << 535 TKRActiveTileXY/2,TKRActiveTileZ/2); 519 // Visualization attributes << 536 520 // << 537 521 // Invisible Volume << 538 G4VSolid * solidTKRActiveTileY = new 522 logicWorld->SetVisAttributes(G4VisAttributes << 539 G4Box("Active Tile Y", TKRActiveTileXY/2, 523 logicPayload->SetVisAttributes(G4VisAttribut << 540 TKRActiveTileXY/2,TKRActiveTileZ/2); 524 logicTKR->SetVisAttributes(G4VisAttributes:: << 541 525 logicTKRActiveTileX->SetVisAttributes(G4VisA << 542 526 logicTKRActiveTileY->SetVisAttributes(G4VisA << 543 G4LogicalVolume* logicTKRActiveTileX = 527 logicPlane->SetVisAttributes(G4VisAttributes << 544 new G4LogicalVolume(solidTKRActiveTileX, TKRMaterial, 528 logicConverter->SetVisAttributes(G4VisAttrib << 545 "Active Tile X",0,0,0); 529 logicCAL->SetVisAttributes(G4VisAttributes:: << 546 530 logicCALLayerX->SetVisAttributes(G4VisAttrib << 547 531 logicCALLayerY->SetVisAttributes(G4VisAttrib << 548 G4LogicalVolume* logicTKRActiveTileY = 532 logicTKRStripX->SetVisAttributes(G4VisAttrib << 549 new G4LogicalVolume(solidTKRActiveTileY, TKRMaterial, 533 logicTKRStripY->SetVisAttributes(G4VisAttrib << 550 "Active Tile Y",0,0,0); 534 << 551 535 // Some visualization styles << 552 536 << 553 537 auto *visualizationStyle1 = new G4VisAttribu << 554 538 visualizationStyle1->SetVisibility(true); << 555 G4int j=0; 539 visualizationStyle1->SetForceSolid(TRUE); << 556 G4int k=0; 540 << 557 541 auto *visualizationStyle2 = new G4VisAttribu << 558 G4double x=0.; 542 visualizationStyle2->SetVisibility(true); << 559 G4double y=0.; 543 visualizationStyle2->SetForceSolid(FALSE); << 560 G4double z=0.; 544 << 561 545 auto *visualizationStyle3 = new G4VisAttribu << 562 for (i=0;i< NbOfTKRTiles; i++) 546 visualizationStyle3->SetVisibility(true); << 563 { 547 visualizationStyle3->SetForceWireframe(TRUE) << 564 for (j=0;j< NbOfTKRTiles; j++) 548 << 565 { 549 // Visible Volumes << 566 k = i*NbOfTKRTiles + j; 550 << 567 551 logicCALDetectorX->SetVisAttributes(visualiz << 568 552 logicCALDetectorY->SetVisAttributes(visualiz << 569 x = -TKRSizeXY/2+TilesSeparation+SiliconGuardRing+ 553 logicTKRDetectorX->SetVisAttributes(visualiz << 570 TKRActiveTileXY/2+(i)*((2*SiliconGuardRing)+ 554 logicTKRDetectorY->SetVisAttributes(visualiz << 571 TilesSeparation+TKRActiveTileXY); 555 logicACT->SetVisAttributes(visualizationStyl << 572 y = -TKRSizeXY/2+TilesSeparation+SiliconGuardRing+ 556 logicACL1->SetVisAttributes(visualizationSty << 573 TKRActiveTileXY/2+(j)*((2*SiliconGuardRing)+TilesSeparation+ 557 logicACL2->SetVisAttributes(visualizationSty << 574 TKRActiveTileXY); 558 << 575 z = 0.; 559 // << 576 560 // always return the physical World << 577 new G4PVPlacement(0, 561 // << 578 G4ThreeVector(x,y,z), 562 PrintPayloadParameters(); << 579 logicTKRActiveTileY, 563 << 580 "Active Tile Y", 564 return physiWorld; << 581 logicTKRDetectorY, 565 } << 582 false, 566 << 583 k); 567 //....oooOO0OOooo........oooOO0OOooo........oo << 584 568 << 585 569 void GammaRayTelDetectorConstruction::Construc << 586 x = -TKRSizeXY/2+TilesSeparation+SiliconGuardRing+ 570 // << 587 TKRActiveTileXY/2+(j)*((2*SiliconGuardRing)+ 571 // Sensitive detector: Tracker << 588 TilesSeparation+TKRActiveTileXY); 572 // << 589 y = -TKRSizeXY/2+TilesSeparation+SiliconGuardRing+ 573 if (trackerSD.Get() == nullptr) { << 590 TKRActiveTileXY/2+(i)*((2*SiliconGuardRing)+ 574 constexpr auto TRACKER_SENSITIVE_DETECTO << 591 TilesSeparation+TKRActiveTileXY); 575 auto *sensitiveDetector = new GammaRayTelT << 592 z = 0.; 576 trackerSD.Put(sensitiveDetector); << 593 >> 594 new G4PVPlacement(0, >> 595 G4ThreeVector(x,y,z), >> 596 logicTKRActiveTileX, >> 597 "Active Tile X", >> 598 logicTKRDetectorX, >> 599 false, >> 600 k); >> 601 577 } 602 } >> 603 } 578 604 579 G4SDManager::GetSDMpointer()->AddNewDetector << 580 605 581 // Flags the strips as sensitive . << 606 // STRIPS (not any more in the Readout Geometry) 582 if (logicTKRStripX != nullptr) { << 583 SetSensitiveDetector(logicTKRStripX, track << 584 } << 585 if (logicTKRStripY != nullptr) { << 586 SetSensitiveDetector(logicTKRStripY, track << 587 } << 588 607 589 // << 608 // Silicon Strips 590 // Sensitive detector: Calorimeter << 609 591 // << 610 /* 592 if (calorimeterSD.Get() == nullptr) { << 611 G4double TKRXStripX=0.; 593 constexpr auto CALORIMETER_SENSITIVE_DET << 612 G4double TKRYStripY=0.; 594 auto *sensitiveDetector = new GammaRayTelC << 613 G4double TKRYStripX=0.; 595 calorimeterSD.Put(sensitiveDetector); << 614 G4double TKRXStripY=0.; 596 } << 615 */ >> 616 >> 617 TKRXStripX = TKRYStripY = TKRSiliconPitch; >> 618 TKRYStripX = TKRXStripY = TKRActiveTileXY; >> 619 TKRZStrip = TKRSiliconThickness; >> 620 >> 621 >> 622 G4VSolid* solidTKRStripX = new G4Box("Strip X", >> 623 TKRXStripX/2,TKRYStripX/2, >> 624 TKRZStrip/2); >> 625 >> 626 logicTKRStripX = >> 627 new G4LogicalVolume(solidTKRStripX,TKRMaterial,"Strip X",0,0,0); >> 628 >> 629 >> 630 G4VSolid* solidTKRStripY = new G4Box("Strip Y", >> 631 TKRXStripY/2,TKRYStripY/2, >> 632 TKRZStrip/2); >> 633 >> 634 >> 635 logicTKRStripY = >> 636 new G4LogicalVolume(solidTKRStripY,TKRMaterial,"Strip Y",0,0,0); >> 637 >> 638 >> 639 for (i=0;i< NbOfTKRStrips; i++) >> 640 { >> 641 new G4PVPlacement(0, >> 642 G4ThreeVector(-TKRActiveTileXY/2 +TKRSiliconPitch/2 + >> 643 (i)*TKRSiliconPitch, 0., 0.), >> 644 logicTKRStripX, >> 645 "Strip X", >> 646 logicTKRActiveTileX, >> 647 false, >> 648 i); >> 649 >> 650 >> 651 new G4PVPlacement(0, >> 652 G4ThreeVector(0.,-TKRActiveTileXY/2 >> 653 +TKRSiliconPitch/2 + >> 654 (i)*TKRSiliconPitch, 0.), >> 655 logicTKRStripY, >> 656 "Strip Y", >> 657 logicTKRActiveTileY, >> 658 false, >> 659 i); >> 660 >> 661 >> 662 >> 663 597 664 598 G4SDManager::GetSDMpointer()->AddNewDetector << 665 } 599 if (logicCALDetectorX != nullptr) { << 666 600 SetSensitiveDetector(logicCALDetectorX, ca << 601 } << 602 if (logicCALDetectorY != nullptr) { << 603 SetSensitiveDetector(logicCALDetectorY, ca << 604 } << 605 667 606 // << 607 // Sensitive detector: Anticoincidence << 608 // << 609 if (anticoincidenceSD.Get() == nullptr) { << 610 constexpr auto ANTICOINCIDENCE_SENSITIVE << 611 auto *sensitiveDetector = new GammaRayTelA << 612 anticoincidenceSD.Put(sensitiveDetector); << 613 } << 614 668 615 G4SDManager::GetSDMpointer()->AddNewDetector << 669 // Calorimeter Structure (CALLayerX + CALLayerY) 616 if (logicACT != nullptr) { << 670 617 SetSensitiveDetector(logicACT, anticoincid << 671 618 } << 672 solidCALLayerX = new G4Box("CALLayerX", 619 if (logicACL1 != nullptr) { << 673 CALSizeXY/2,CALSizeXY/2,CALBarThickness/2); 620 SetSensitiveDetector(logicACL1, anticoinci << 674 621 } << 675 logicCALLayerX = new G4LogicalVolume(solidCALLayerX, 622 if (logicACL2 != nullptr) { << 676 CALMaterial, 623 SetSensitiveDetector(logicACL2, anticoinci << 677 "CALLayerX"); 624 } << 678 >> 679 solidCALLayerY = new G4Box("CALLayerY", >> 680 CALSizeXY/2,CALSizeXY/2,CALBarThickness/2); >> 681 >> 682 logicCALLayerY = new G4LogicalVolume(solidCALLayerY, >> 683 CALMaterial, >> 684 "CALLayerY"); >> 685 >> 686 for (i = 0; i < NbOfCALLayers; i++) >> 687 { >> 688 >> 689 physiCALLayerY = >> 690 new G4PVPlacement(0,G4ThreeVector(0,0, >> 691 -CALSizeZ/2+ >> 692 CALBarThickness/2 + >> 693 (i)*2*CALBarThickness), >> 694 "CALLayerY", >> 695 logicCALLayerY, >> 696 physiCAL, >> 697 false, >> 698 i); >> 699 >> 700 physiCALLayerX = >> 701 new G4PVPlacement(0,G4ThreeVector(0,0, >> 702 -CALSizeZ/2+ >> 703 CALBarThickness/2 + >> 704 CALBarThickness + >> 705 (i)*2*CALBarThickness), >> 706 "CALLayerX", >> 707 logicCALLayerX, >> 708 physiCAL, >> 709 false, >> 710 i); >> 711 >> 712 } >> 713 >> 714 // Calorimeter Structure (CALDetectorX + CALDetectorY) >> 715 >> 716 solidCALDetectorX = new G4Box("CALDetectorX", >> 717 CALBarX/2,CALBarY/2,CALBarThickness/2); >> 718 >> 719 logicCALDetectorX = new G4LogicalVolume(solidCALDetectorX, >> 720 CALMaterial, >> 721 "CALDetectorX"); >> 722 >> 723 solidCALDetectorY = new G4Box("CALDetectorY", >> 724 CALBarY/2,CALBarX/2,CALBarThickness/2); >> 725 >> 726 logicCALDetectorY = new G4LogicalVolume(solidCALDetectorY, >> 727 CALMaterial, >> 728 "CALDetectorY"); >> 729 >> 730 for (i = 0; i < NbOfCALBars; i++) >> 731 { >> 732 >> 733 physiCALDetectorY = >> 734 new G4PVPlacement(0, >> 735 G4ThreeVector(-CALSizeXY/2+ CALBarY/2 + >> 736 (i)*CALBarY, 0, 0), >> 737 logicCALDetectorY, >> 738 "CALDetectorY", >> 739 logicCALLayerY, >> 740 false, >> 741 i); >> 742 >> 743 physiCALDetectorX = >> 744 new G4PVPlacement(0, >> 745 G4ThreeVector(0,-CALSizeXY/2+ CALBarY/2 + >> 746 (i)*CALBarY, 0), >> 747 logicCALDetectorX, >> 748 "CALDetectorX", >> 749 logicCALLayerX, >> 750 false, >> 751 i); >> 752 >> 753 } >> 754 >> 755 >> 756 // Cuts by Regions >> 757 >> 758 /* >> 759 G4String regName[] = {"Calorimeter","Tracker"}; >> 760 if (aCALRegion) delete aCALRegion; >> 761 >> 762 aCALRegion = new G4Region(regName[0]); >> 763 logicCAL->SetRegion(aCALRegion); >> 764 aCALRegion->AddRootLogicalVolume(logicCAL); >> 765 >> 766 if (aTKRRegion) delete aTKRRegion; >> 767 >> 768 aTKRRegion = new G4Region(regName[1]); >> 769 logicTKR->SetRegion(aTKRRegion); >> 770 aTKRRegion->AddRootLogicalVolume(logicTKR); >> 771 */ >> 772 >> 773 >> 774 // >> 775 // Visualization attributes >> 776 // >> 777 >> 778 // Invisible Volume >> 779 logicWorld->SetVisAttributes (G4VisAttributes::GetInvisible()); >> 780 logicPayload->SetVisAttributes (G4VisAttributes::GetInvisible()); >> 781 logicTKR->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 782 logicTKRActiveTileX->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 783 logicTKRActiveTileY->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 784 logicPlane->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 785 logicConverter->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 786 logicCAL->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 787 logicCALLayerX->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 788 logicCALLayerY->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 789 logicTKRStripX->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 790 logicTKRStripY->SetVisAttributes(G4VisAttributes::GetInvisible()); >> 791 >> 792 // Some visualization styles >> 793 >> 794 G4VisAttributes* VisAtt1= new G4VisAttributes(G4Colour(0.3,0.8,0.1)); >> 795 VisAtt1->SetVisibility(true); >> 796 VisAtt1->SetForceSolid(TRUE); >> 797 >> 798 G4VisAttributes* VisAtt2= new G4VisAttributes(G4Colour(0.2,0.3,0.8)); >> 799 VisAtt2->SetVisibility(true); >> 800 VisAtt2->SetForceSolid(FALSE); >> 801 >> 802 G4VisAttributes* VisAtt3= new G4VisAttributes(G4Colour(0.8,0.2,0.3)); >> 803 VisAtt3->SetVisibility(true); >> 804 VisAtt3->SetForceWireframe(TRUE); >> 805 >> 806 // Visible Volumes >> 807 >> 808 logicCALDetectorX->SetVisAttributes(VisAtt1); >> 809 logicCALDetectorY->SetVisAttributes(VisAtt1); >> 810 logicTKRDetectorX->SetVisAttributes(VisAtt2); >> 811 logicTKRDetectorY->SetVisAttributes(VisAtt2); >> 812 logicACT->SetVisAttributes(VisAtt3); >> 813 logicACL1->SetVisAttributes(VisAtt3); >> 814 logicACL2->SetVisAttributes(VisAtt3); >> 815 >> 816 >> 817 // >> 818 //always return the physical World >> 819 // >> 820 PrintPayloadParameters(); >> 821 return physiWorld; >> 822 } >> 823 >> 824 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 825 >> 826 void GammaRayTelDetectorConstruction::ConstructSDandField() >> 827 { >> 828 >> 829 // >> 830 // Sensitive Detectors - Tracker >> 831 // >> 832 if(trackerSD.Get()==0) >> 833 { >> 834 GammaRayTelTrackerSD* SD = new GammaRayTelTrackerSD("TrackerSD"); >> 835 trackerSD.Put(SD); >> 836 } 625 837 626 // Create global magnetic field messenger. << 838 G4SDManager::GetSDMpointer()->AddNewDetector(trackerSD.Get()); 627 // Uniform magnetic field is then created au << 839 //Flags the strips as sensitive . 628 auto fieldValue = G4ThreeVector(); << 840 if (logicTKRStripX) 629 fMagFieldMessenger = new G4GlobalMagFieldMes << 841 SetSensitiveDetector(logicTKRStripX,trackerSD.Get()); // ActiveStripX 630 fMagFieldMessenger->SetVerboseLevel(1); << 842 if (logicTKRStripY) >> 843 SetSensitiveDetector(logicTKRStripY,trackerSD.Get()); // ActiveStripY >> 844 >> 845 >> 846 // >> 847 // Sensitive Detectors: Calorimeter >> 848 // >> 849 if(calorimeterSD.Get()==0) >> 850 { >> 851 GammaRayTelCalorimeterSD* SD = new GammaRayTelCalorimeterSD("CalorimeterSD"); >> 852 calorimeterSD.Put(SD); >> 853 } >> 854 G4SDManager::GetSDMpointer()->AddNewDetector(calorimeterSD.Get()); >> 855 if (logicCALDetectorX) >> 856 SetSensitiveDetector(logicCALDetectorX,calorimeterSD.Get()); // BarX >> 857 if (logicCALDetectorY) >> 858 SetSensitiveDetector(logicCALDetectorY,calorimeterSD.Get()); // BarY >> 859 >> 860 // >> 861 // Sensitive Detectors: Anticoincidence >> 862 // >> 863 >> 864 if(anticoincidenceSD.Get()==0) >> 865 { >> 866 GammaRayTelAnticoincidenceSD* SD = new GammaRayTelAnticoincidenceSD >> 867 ("AnticoincidenceSD"); >> 868 anticoincidenceSD.Put(SD); >> 869 } >> 870 G4SDManager::GetSDMpointer()->AddNewDetector(anticoincidenceSD.Get()); >> 871 if (logicACT) >> 872 SetSensitiveDetector(logicACT,anticoincidenceSD.Get()); // ACD top >> 873 if (logicACL1) >> 874 SetSensitiveDetector(logicACL1,anticoincidenceSD.Get()); // ACD lateral side >> 875 if (logicACL2) >> 876 SetSensitiveDetector(logicACL2,anticoincidenceSD.Get()); // ACD lateral side >> 877 >> 878 // Create global magnetic field messenger. >> 879 // Uniform magnetic field is then created automatically if >> 880 // the field value is not zero. >> 881 G4ThreeVector fieldValue = G4ThreeVector(); >> 882 fMagFieldMessenger = new G4GlobalMagFieldMessenger(fieldValue); >> 883 fMagFieldMessenger->SetVerboseLevel(1); >> 884 >> 885 // Register the field messenger for deleting >> 886 G4AutoDelete::Register(fMagFieldMessenger); 631 887 632 // Register the field messenger for deleting << 888 return; 633 G4AutoDelete::Register (fMagFieldMessenger); << 889 634 } 890 } 635 891 636 //....oooOO0OOooo........oooOO0OOooo........oo << 892 void GammaRayTelDetectorConstruction::PrintPayloadParameters() 637 << 893 { 638 void GammaRayTelDetectorConstruction::PrintPay << 894 G4cout << "\n------------------------------------------------------------" 639 G4cout << 895 << "\n---> The Tracker is " << NbOfTKRLayers << " layers of: " 640 << "\n---------------------------------- << 896 << ConverterThickness/mm << "mm of " << ConverterMaterial->GetName() 641 << "---> The tracker is composed by " << n << 897 << "\n------------------------------------------------------------\n"; 642 << ", each made of " << converterMaterial- << 643 << " and " << converterThickness / mm << " << 644 << "\n------------------------------------ << 645 } 898 } 646 899 647 //....oooOO0OOooo........oooOO0OOooo........oo 900 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 648 901 649 void GammaRayTelDetectorConstruction::SetConve << 650 // search the material by its name << 651 G4Material *material = G4Material::GetMateri << 652 if (material != nullptr) { << 653 converterMaterial = material; << 654 logicConverter->SetMaterial(material); << 655 PrintPayloadParameters(); << 656 } << 657 } << 658 902 659 //....oooOO0OOooo........oooOO0OOooo........oo 903 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 660 904 661 void GammaRayTelDetectorConstruction::SetConve << 905 void GammaRayTelDetectorConstruction::SetConverterMaterial(G4String materialChoice) 662 converterThickness = value; << 906 { >> 907 // search the material by its name >> 908 G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); >> 909 if (pttoMaterial) >> 910 { >> 911 ConverterMaterial = pttoMaterial; >> 912 logicConverter->SetMaterial(pttoMaterial); >> 913 PrintPayloadParameters(); >> 914 } 663 } 915 } 664 916 >> 917 void GammaRayTelDetectorConstruction::SetConverterThickness(G4double val) >> 918 { >> 919 ConverterThickness = val; >> 920 } >> 921 665 //....oooOO0OOooo........oooOO0OOooo........oo 922 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 666 923 667 void GammaRayTelDetectorConstruction::SetTKRSi << 924 void GammaRayTelDetectorConstruction::SetTKRSiliconThickness(G4double val) 668 tkrSiliconThickness = value; << 925 { 669 } << 926 TKRSiliconThickness = val; >> 927 } 670 928 671 //....oooOO0OOooo........oooOO0OOooo........oo << 672 929 673 void GammaRayTelDetectorConstruction::SetTKRSi << 930 void GammaRayTelDetectorConstruction::SetTKRSiliconPitch(G4double val) 674 tkrSiliconPitch = value; << 931 { 675 } << 932 TKRSiliconPitch = val; >> 933 } 676 934 677 //....oooOO0OOooo........oooOO0OOooo........oo << 678 935 679 void GammaRayTelDetectorConstruction::SetTKRTi << 936 void GammaRayTelDetectorConstruction::SetTKRTileSizeXY(G4double val) 680 tkrSiliconTileXY = value; << 937 { 681 } << 938 TKRSiliconTileXY = val; >> 939 } 682 940 683 //....oooOO0OOooo........oooOO0OOooo........oo << 684 941 685 void GammaRayTelDetectorConstruction::SetNbOfT << 942 void GammaRayTelDetectorConstruction::SetNbOfTKRLayers(G4int val) 686 numberOfTKRLayers = value; << 943 { >> 944 NbOfTKRLayers = val; 687 } 945 } 688 946 689 //....oooOO0OOooo........oooOO0OOooo........oo << 690 947 691 void GammaRayTelDetectorConstruction::SetNbOfT << 948 void GammaRayTelDetectorConstruction::SetNbOfTKRTiles(G4int val) 692 numberOfTKRTiles = value; << 949 { >> 950 NbOfTKRTiles = val; 693 } 951 } 694 952 695 //....oooOO0OOooo........oooOO0OOooo........oo << 953 void GammaRayTelDetectorConstruction::SetTKRLayerDistance(G4double val) >> 954 { >> 955 TKRLayerDistance = val; >> 956 } 696 957 697 void GammaRayTelDetectorConstruction::SetTKRLa << 958 void GammaRayTelDetectorConstruction::SetTKRViewsDistance(G4double val) 698 tkrLayerDistance = value; << 959 { >> 960 TKRViewsDistance = val; 699 } 961 } 700 962 >> 963 701 //....oooOO0OOooo........oooOO0OOooo........oo 964 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 702 965 703 void GammaRayTelDetectorConstruction::SetTKRVi << 966 void GammaRayTelDetectorConstruction::SetNbOfCALLayers(G4int val) 704 tkrViewsDistance = value; << 967 { >> 968 NbOfCALLayers = val; 705 } 969 } 706 970 707 //....oooOO0OOooo........oooOO0OOooo........oo << 971 void GammaRayTelDetectorConstruction::SetNbOfCALBars(G4int val) >> 972 { >> 973 NbOfCALBars = val; >> 974 } 708 975 709 void GammaRayTelDetectorConstruction::SetNbOfC << 976 void GammaRayTelDetectorConstruction::SetCALBarThickness(G4double val) 710 numberOfCALLayers = value; << 977 { >> 978 CALBarThickness = val; 711 } 979 } 712 980 713 //....oooOO0OOooo........oooOO0OOooo........oo 981 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 714 982 715 void GammaRayTelDetectorConstruction::SetNbOfC << 983 void GammaRayTelDetectorConstruction::SetACDThickness(G4double val) 716 numberOfCALBars = value; << 984 { >> 985 ACDThickness = val; 717 } 986 } 718 987 719 //....oooOO0OOooo........oooOO0OOooo........oo 988 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 720 989 721 void GammaRayTelDetectorConstruction::SetCALBa << 990 void GammaRayTelDetectorConstruction::SetMagField(G4double fieldValue) 722 calBarThickness = value; << 991 { >> 992 // Just invoke manually the MT-safe command >> 993 // /globalField/setValue >> 994 // instantiated by the GlobalFieldMessenger >> 995 std::stringstream sss; >> 996 sss << "/globalField/setValue 0 0 " << fieldValue/tesla << " tesla"; >> 997 >> 998 G4String command = sss.str(); >> 999 G4cout << "Going to execute: " << command << G4endl; >> 1000 >> 1001 G4UImanager* UImanager = G4UImanager::GetUIpointer(); >> 1002 UImanager->ApplyCommand(command); >> 1003 723 } 1004 } 724 1005 725 //....oooOO0OOooo........oooOO0OOooo........oo 1006 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 1007 >> 1008 void GammaRayTelDetectorConstruction::UpdateGeometry() >> 1009 { >> 1010 // delete payloadSD; >> 1011 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructPayload()); >> 1012 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); >> 1013 G4RegionStore::GetInstance()->UpdateMaterialList(physiWorld); >> 1014 >> 1015 G4RunManager::GetRunManager()->ReinitializeGeometry(); 726 1016 727 void GammaRayTelDetectorConstruction::SetACDTh << 728 acdThickness = value; << 729 } 1017 } 730 1018 731 //....oooOO0OOooo........oooOO0OOooo........oo 1019 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 732 1020 733 void GammaRayTelDetectorConstruction::SetMagFi << 734 // Just invoke manually the MT-safe comman << 735 std::stringstream stream; << 736 stream << "/globalField/setValue 0 0 " << << 737 1021 738 G4String command = stream.str(); << 739 G4cout << "Going to execute: " << command << 740 1022 741 auto *uiManager = G4UImanager::GetUIpointe << 742 uiManager->ApplyCommand(command); << 743 } << 744 1023 745 //....oooOO0OOooo........oooOO0OOooo........oo << 746 1024 747 void GammaRayTelDetectorConstruction::UpdateGe << 1025 748 // delete payloadSD; << 1026 749 G4RunManager::GetRunManager()->DefineWorld << 1027 750 G4RunManager::GetRunManager()->PhysicsHasB << 1028 751 G4RegionStore::GetInstance()->UpdateMateri << 1029 752 G4RunManager::GetRunManager()->Reinitializ << 1030 753 } << 1031 >> 1032 >> 1033 >> 1034 >> 1035 >> 1036 754 1037