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 /// \file biasing/B03/src/B03ImportanceDetectorConstruction.cc 27 /// \brief Implementation of the B03ImportanceDetectorConstruction class 28 // 29 // 30 // 31 32 #include "B03ImportanceDetectorConstruction.hh" 33 34 #include "G4LogicalVolume.hh" 35 #include "G4Material.hh" 36 #include "G4PVPlacement.hh" 37 #include "G4PhysicalConstants.hh" 38 #include "G4SystemOfUnits.hh" 39 #include "G4ThreeVector.hh" 40 #include "G4Tubs.hh" 41 #include "globals.hh" 42 43 #include <sstream> 44 45 // For Primitive Scorers 46 #include "G4MultiFunctionalDetector.hh" 47 #include "G4PSNofCollision.hh" 48 #include "G4PSPopulation.hh" 49 #include "G4PSTrackCounter.hh" 50 #include "G4PSTrackLength.hh" 51 #include "G4SDManager.hh" 52 #include "G4SDParticleFilter.hh" 53 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 55 56 B03ImportanceDetectorConstruction::B03ImportanceDetectorConstruction(G4String worldName) 57 : G4VUserParallelWorld(worldName), fLogicalVolumeVector() 58 { 59 // Construct(); 60 } 61 62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 63 64 B03ImportanceDetectorConstruction::~B03ImportanceDetectorConstruction() 65 { 66 fLogicalVolumeVector.clear(); 67 } 68 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 70 71 void B03ImportanceDetectorConstruction::Construct() 72 { 73 G4cout << " constructing parallel world " << G4endl; 74 75 G4Material* dummyMat = 0; 76 77 // GetWorld methods create a clone of the mass world to the parallel world (!) 78 // via the transportation manager 79 fGhostWorld = GetWorld(); 80 G4cout << " B03ImportanceDetectorConstruction:: ghostWorldName = " << fGhostWorld->GetName() 81 << G4endl; 82 G4LogicalVolume* worldLogical = fGhostWorld->GetLogicalVolume(); 83 fLogicalVolumeVector.push_back(worldLogical); 84 85 G4String name("none"); 86 // fPVolumeStore.AddPVolume(G4GeometryCell(*pWorldVolume, 0)); 87 fPVolumeStore.AddPVolume(G4GeometryCell(*fGhostWorld, 0)); 88 89 // creating 18 slobs of 10 cm thicknes 90 91 G4double innerRadiusShield = 0 * cm; 92 G4double outerRadiusShield = 100 * cm; 93 G4double heightShield = 5 * cm; 94 G4double startAngleShield = 0 * deg; 95 G4double spanningAngleShield = 360 * deg; 96 97 G4Tubs* aShield = new G4Tubs("aShield", innerRadiusShield, outerRadiusShield, heightShield, 98 startAngleShield, spanningAngleShield); 99 100 // logical parallel cells 101 102 G4LogicalVolume* aShield_log_imp = new G4LogicalVolume(aShield, dummyMat, "aShield_log_imp"); 103 fLogicalVolumeVector.push_back(aShield_log_imp); 104 105 // physical parallel cells 106 107 G4int i = 1; 108 G4double startz = -85 * cm; 109 // for (i=1; i<=18; ++i) { 110 for (i = 1; i <= 18; i++) { 111 name = GetCellName(i); 112 113 G4double pos_x = 0 * cm; 114 G4double pos_y = 0 * cm; 115 G4double pos_z = startz + (i - 1) * (2 * heightShield); 116 G4VPhysicalVolume* pvol = new G4PVPlacement(0, G4ThreeVector(pos_x, pos_y, pos_z), 117 aShield_log_imp, name, worldLogical, false, i); 118 // 0); 119 G4GeometryCell cell(*pvol, i); 120 // G4GeometryCell cell(*pvol, 0); 121 fPVolumeStore.AddPVolume(cell); 122 } 123 124 // filling the rest of the world volumr behind the concrete with 125 // another slob which should get the same importance value as the 126 // last slob 127 innerRadiusShield = 0 * cm; 128 // outerRadiusShield = 110*cm; exceeds world volume!!!! 129 outerRadiusShield = 100 * cm; 130 // heightShield = 10*cm; 131 heightShield = 5 * cm; 132 startAngleShield = 0 * deg; 133 spanningAngleShield = 360 * deg; 134 135 G4Tubs* aRest = new G4Tubs("Rest", innerRadiusShield, outerRadiusShield, heightShield, 136 startAngleShield, spanningAngleShield); 137 138 G4LogicalVolume* aRest_log = new G4LogicalVolume(aRest, dummyMat, "aRest_log"); 139 140 fLogicalVolumeVector.push_back(aRest_log); 141 142 name = GetCellName(19); 143 144 G4double pos_x = 0 * cm; 145 G4double pos_y = 0 * cm; 146 // G4double pos_z = 100*cm; 147 G4double pos_z = 95 * cm; 148 G4VPhysicalVolume* pvol = new G4PVPlacement(0, G4ThreeVector(pos_x, pos_y, pos_z), aRest_log, 149 name, worldLogical, false, 19); 150 // 0); 151 G4GeometryCell cell(*pvol, 19); 152 // G4GeometryCell cell(*pvol, 0); 153 fPVolumeStore.AddPVolume(cell); 154 155 SetSensitive(); 156 } 157 158 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 159 160 const G4VPhysicalVolume& 161 B03ImportanceDetectorConstruction::GetPhysicalVolumeByName(const G4String& name) const 162 { 163 return *fPVolumeStore.GetPVolume(name); 164 } 165 166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 167 168 G4String B03ImportanceDetectorConstruction::ListPhysNamesAsG4String() 169 { 170 G4String names(fPVolumeStore.GetPNames()); 171 return names; 172 } 173 174 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 175 176 G4String B03ImportanceDetectorConstruction::GetCellName(G4int i) 177 { 178 std::ostringstream os; 179 os << "cell_"; 180 if (i < 10) { 181 os << "0"; 182 } 183 os << i; 184 G4String name = os.str(); 185 return name; 186 } 187 188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 189 190 G4GeometryCell B03ImportanceDetectorConstruction::GetGeometryCell(G4int i) 191 { 192 G4String name(GetCellName(i)); 193 const G4VPhysicalVolume* p = 0; 194 p = fPVolumeStore.GetPVolume(name); 195 if (p) { 196 return G4GeometryCell(*p, 0); 197 } 198 else { 199 G4cout << "B03ImportanceDetectorConstruction::GetGeometryCell: " << G4endl 200 << " couldn't get G4GeometryCell" << G4endl; 201 return G4GeometryCell(*fGhostWorld, -2); 202 } 203 } 204 205 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 206 207 G4VPhysicalVolume& B03ImportanceDetectorConstruction::GetWorldVolumeAddress() const 208 { 209 return *fGhostWorld; 210 } 211 212 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 213 214 G4VPhysicalVolume* B03ImportanceDetectorConstruction::GetWorldVolume() 215 { 216 return fGhostWorld; 217 } 218 219 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 220 221 void B03ImportanceDetectorConstruction::SetSensitive() 222 { 223 // ------------------------------------------------- 224 // The collection names of defined Primitives are 225 // 0 ConcreteSD/Collisions 226 // 1 ConcreteSD/CollWeight 227 // 2 ConcreteSD/Population 228 // 3 ConcreteSD/TrackEnter 229 // 4 ConcreteSD/SL 230 // 5 ConcreteSD/SLW 231 // 6 ConcreteSD/SLWE 232 // 7 ConcreteSD/SLW_V 233 // 8 ConcreteSD/SLWE_V 234 // ------------------------------------------------- 235 236 // now moved to ConstructSD() 237 } 238 239 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 240 void B03ImportanceDetectorConstruction::ConstructSD() 241 { 242 G4SDManager* SDman = G4SDManager::GetSDMpointer(); 243 // 244 // Sensitive Detector Name 245 G4String concreteSDname = "ConcreteSD"; 246 247 //------------------------ 248 // MultiFunctionalDetector 249 //------------------------ 250 // 251 // Define MultiFunctionalDetector with name. 252 G4MultiFunctionalDetector* MFDet = new G4MultiFunctionalDetector(concreteSDname); 253 SDman->AddNewDetector(MFDet); // Register SD to SDManager 254 255 G4String fltName, particleName; 256 G4SDParticleFilter* neutronFilter = 257 new G4SDParticleFilter(fltName = "neutronFilter", particleName = "neutron"); 258 259 MFDet->SetFilter(neutronFilter); 260 261 for (std::vector<G4LogicalVolume*>::iterator it = fLogicalVolumeVector.begin(); 262 it != fLogicalVolumeVector.end(); it++) 263 { 264 // (*it)->SetSensitiveDetector(MFDet); 265 SetSensitiveDetector((*it)->GetName(), MFDet); 266 } 267 268 G4String psName; 269 G4PSNofCollision* scorer0 = new G4PSNofCollision(psName = "Collisions"); 270 MFDet->RegisterPrimitive(scorer0); 271 272 G4PSNofCollision* scorer1 = new G4PSNofCollision(psName = "CollWeight"); 273 scorer1->Weighted(true); 274 MFDet->RegisterPrimitive(scorer1); 275 276 G4PSPopulation* scorer2 = new G4PSPopulation(psName = "Population"); 277 MFDet->RegisterPrimitive(scorer2); 278 279 G4PSTrackCounter* scorer3 = new G4PSTrackCounter(psName = "TrackEnter", fCurrent_In); 280 MFDet->RegisterPrimitive(scorer3); 281 282 G4PSTrackLength* scorer4 = new G4PSTrackLength(psName = "SL"); 283 MFDet->RegisterPrimitive(scorer4); 284 285 G4PSTrackLength* scorer5 = new G4PSTrackLength(psName = "SLW"); 286 scorer5->Weighted(true); 287 MFDet->RegisterPrimitive(scorer5); 288 289 G4PSTrackLength* scorer6 = new G4PSTrackLength(psName = "SLWE"); 290 scorer6->Weighted(true); 291 scorer6->MultiplyKineticEnergy(true); 292 MFDet->RegisterPrimitive(scorer6); 293 294 G4PSTrackLength* scorer7 = new G4PSTrackLength(psName = "SLW_V"); 295 scorer7->Weighted(true); 296 scorer7->DivideByVelocity(true); 297 MFDet->RegisterPrimitive(scorer7); 298 299 G4PSTrackLength* scorer8 = new G4PSTrackLength(psName = "SLWE_V"); 300 scorer8->Weighted(true); 301 scorer8->MultiplyKineticEnergy(true); 302 scorer8->DivideByVelocity(true); 303 MFDet->RegisterPrimitive(scorer8); 304 } 305 306 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 307