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 ExGflash3ParallelWorld.cc 28 /// \brief Implementation of the ExGflash3ParallelWorld class 29 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 33 // User Classes 34 #include "ExGflash3ParallelWorld.hh" 35 36 #include "ExGflash3SensitiveDetector.hh" 37 38 // G4 Classes 39 #include "G4AutoDelete.hh" 40 #include "G4Box.hh" 41 #include "G4Colour.hh" 42 #include "G4LogicalVolume.hh" 43 #include "G4Material.hh" 44 #include "G4NistManager.hh" 45 #include "G4PVPlacement.hh" 46 #include "G4SDManager.hh" 47 #include "G4SystemOfUnits.hh" 48 #include "G4ThreeVector.hh" 49 #include "G4VPhysicalVolume.hh" 50 #include "G4VisAttributes.hh" 51 #include "globals.hh" 52 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 54 55 ExGflash3ParallelWorld::ExGflash3ParallelWorld(G4String aWorldName) 56 : G4VUserParallelWorld(aWorldName) 57 { 58 G4cout << "ExGflash3ParallelWorld::Parralel world constructor" << G4endl; 59 } 60 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 62 63 ExGflash3ParallelWorld::~ExGflash3ParallelWorld() = default; 64 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 66 67 void ExGflash3ParallelWorld::Construct() 68 { 69 // In parallel world material does not matter 70 G4Material* dummy = nullptr; 71 72 // Build parallel/ghost geometry: 73 auto ghostLogicalVolume = GetWorld()->GetLogicalVolume(); 74 75 // Use part of the Ex1GflashDetectorConstruction (without individual crystals) 76 77 G4int nbOfCrystals = 10; // this are the crystals PER ROW in this example 78 // cube of 10 x 10 crystals 79 // don't change it @the moment, since 80 // the readout in event action assumes this 81 // dimensions and is not automatically adapted 82 // in this version of the example :-( 83 // Simplified `CMS-like` PbWO4 crystal calorimeter 84 G4double calo_xside = 31 * cm; 85 G4double calo_yside = 31 * cm; 86 G4double calo_zside = 24 * cm; 87 88 G4double crystalWidth = 3 * cm; 89 G4double crystalLength = 24 * cm; 90 91 calo_xside = (crystalWidth * nbOfCrystals) + 1 * cm; 92 calo_yside = (crystalWidth * nbOfCrystals) + 1 * cm; 93 calo_zside = crystalLength; 94 95 auto calo_box = new G4Box("CMS calorimeter", // its name 96 calo_xside / 2., // size 97 calo_yside / 2., calo_zside / 2.); 98 auto caloLog = new G4LogicalVolume(calo_box, // its solid 99 dummy, // its material 100 "calo log", // its name 101 nullptr, // opt: fieldManager 102 nullptr, // opt: SensitiveDetector 103 nullptr); // opt: UserLimit 104 105 G4double xpos = 0.0; 106 G4double ypos = 0.0; 107 G4double zpos = 100.0 * cm; 108 new G4PVPlacement(nullptr, G4ThreeVector(xpos, ypos, zpos), caloLog, "calorimeter", 109 ghostLogicalVolume, false, 1); 110 111 // Crystals 112 G4VSolid* crystal_box = new G4Box("Crystal", // its name 113 crystalWidth / 2, crystalWidth / 2, crystalLength / 2); 114 // size 115 fCrystalLog = new G4LogicalVolume(crystal_box, // its solid 116 dummy, // its material 117 "CrystalLog"); // its name 118 119 for (G4int i = 0; i < nbOfCrystals; i++) { 120 for (G4int j = 0; j < nbOfCrystals; j++) { 121 G4int n = i * 10 + j; 122 G4ThreeVector crystalPos((i * crystalWidth) - 135, (j * crystalWidth) - 135, 0); 123 fCrystalPhys[n] = new G4PVPlacement(nullptr, // no rotation 124 crystalPos, // translation 125 fCrystalLog, 126 "crystal", // its name 127 caloLog, false, i); 128 } 129 } 130 G4cout << "There are " << nbOfCrystals << " crystals per row in the calorimeter, so in total " 131 << nbOfCrystals * nbOfCrystals << " crystals" << G4endl; 132 G4cout << "They have width of " << crystalWidth / cm << " cm and a length of " 133 << crystalLength / cm << " cm. " << G4endl; 134 135 auto caloVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0)); 136 auto crystalVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0)); 137 caloLog->SetVisAttributes(caloVisAtt); 138 fCrystalLog->SetVisAttributes(crystalVisAtt); 139 } 140 141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 142 143 void ExGflash3ParallelWorld::ConstructSD() 144 { 145 // -- sensitive detectors: 146 G4SDManager* SDman = G4SDManager::GetSDMpointer(); 147 auto CaloSD = new ExGflash3SensitiveDetector("Calorimeter", this); 148 SDman->AddNewDetector(CaloSD); 149 fCrystalLog->SetSensitiveDetector(CaloSD); 150 } 151 152 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 153