Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 /// \file biasing/B02/src/B02ImportanceDetecto 27 /// \brief Implementation of the B02Importance 28 // 29 // 30 // 31 32 #include "B02ImportanceDetectorConstruction.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 // for importance biasing 55 #include "G4IStore.hh" 56 57 // for weight window technique 58 #include "G4WeightWindowStore.hh" 59 60 //....oooOO0OOooo........oooOO0OOooo........oo 61 62 B02ImportanceDetectorConstruction::B02Importan 63 : G4VUserParallelWorld(worldName), fLogicalV 64 { 65 // Construct(); 66 } 67 68 //....oooOO0OOooo........oooOO0OOooo........oo 69 70 B02ImportanceDetectorConstruction::~B02Importa 71 { 72 fLogicalVolumeVector.clear(); 73 } 74 75 //....oooOO0OOooo........oooOO0OOooo........oo 76 77 void B02ImportanceDetectorConstruction::Constr 78 { 79 G4cout << " constructing parallel world " << 80 81 G4Material* dummyMat = 0; 82 83 // GetWorld methods create a clone of the ma 84 // via the transportation manager 85 fGhostWorld = GetWorld(); 86 G4cout << " B02ImportanceDetectorConstructio 87 << G4endl; 88 G4LogicalVolume* worldLogical = fGhostWorld- 89 fLogicalVolumeVector.push_back(worldLogical) 90 91 // fPVolumeStore.AddPVolume(G4GeometryCell( 92 fPVolumeStore.AddPVolume(G4GeometryCell(*fGh 93 94 // creating 18 slobs of 10 cm thicknes 95 96 G4double innerRadiusShield = 0 * cm; 97 G4double outerRadiusShield = 100 * cm; 98 G4double heightShield = 5 * cm; 99 G4double startAngleShield = 0 * deg; 100 G4double spanningAngleShield = 360 * deg; 101 102 G4Tubs* aShield = new G4Tubs("aShield", inne 103 startAngleShiel 104 105 // logical parallel cells 106 107 G4LogicalVolume* aShield_log_imp = new G4Log 108 fLogicalVolumeVector.push_back(aShield_log_i 109 110 // physical parallel cells 111 G4String name = "none"; 112 G4int i = 1; 113 G4double startz = -85 * cm; 114 // for (i=1; i<=18; ++i) { 115 for (i = 1; i <= 18; i++) { 116 name = GetCellName(i); 117 118 G4double pos_x = 0 * cm; 119 G4double pos_y = 0 * cm; 120 G4double pos_z = startz + (i - 1) * (2 * h 121 G4VPhysicalVolume* pvol = new G4PVPlacemen 122 123 // 0); 124 G4GeometryCell cell(*pvol, i); 125 // G4GeometryCell cell(*pvol, 0); 126 fPVolumeStore.AddPVolume(cell); 127 } 128 129 // filling the rest of the world volumr behi 130 // another slob which should get the same im 131 // last slob 132 innerRadiusShield = 0 * cm; 133 // outerRadiusShield = 110*cm; exceeds worl 134 outerRadiusShield = 100 * cm; 135 // heightShield = 10*cm; 136 heightShield = 5 * cm; 137 startAngleShield = 0 * deg; 138 spanningAngleShield = 360 * deg; 139 140 G4Tubs* aRest = new G4Tubs("Rest", innerRadi 141 startAngleShield, 142 143 G4LogicalVolume* aRest_log = new G4LogicalVo 144 145 fLogicalVolumeVector.push_back(aRest_log); 146 147 name = GetCellName(19); 148 149 G4double pos_x = 0 * cm; 150 G4double pos_y = 0 * cm; 151 // G4double pos_z = 100*cm; 152 G4double pos_z = 95 * cm; 153 G4VPhysicalVolume* pvol = new G4PVPlacement( 154 155 // 0); 156 G4GeometryCell cell(*pvol, 19); 157 // G4GeometryCell cell(*pvol, 0); 158 fPVolumeStore.AddPVolume(cell); 159 160 SetSensitive(); 161 } 162 163 //....oooOO0OOooo........oooOO0OOooo........oo 164 165 const G4VPhysicalVolume& 166 B02ImportanceDetectorConstruction::GetPhysical 167 { 168 return *fPVolumeStore.GetPVolume(name); 169 } 170 171 //....oooOO0OOooo........oooOO0OOooo........oo 172 173 G4String B02ImportanceDetectorConstruction::Li 174 { 175 G4String names(fPVolumeStore.GetPNames()); 176 return names; 177 } 178 179 //....oooOO0OOooo........oooOO0OOooo........oo 180 181 G4String B02ImportanceDetectorConstruction::Ge 182 { 183 std::ostringstream os; 184 os << "cell_"; 185 if (i < 10) { 186 os << "0"; 187 } 188 os << i; 189 G4String name = os.str(); 190 return name; 191 } 192 193 //....oooOO0OOooo........oooOO0OOooo........oo 194 195 G4GeometryCell B02ImportanceDetectorConstructi 196 { 197 G4String name(GetCellName(i)); 198 const G4VPhysicalVolume* p = 0; 199 p = fPVolumeStore.GetPVolume(name); 200 if (p) { 201 return G4GeometryCell(*p, 0); 202 } 203 else { 204 G4cout << "B02ImportanceDetectorConstructi 205 << " couldn't get G4GeometryCell" < 206 return G4GeometryCell(*fGhostWorld, -2); 207 } 208 } 209 210 //....oooOO0OOooo........oooOO0OOooo........oo 211 212 G4VPhysicalVolume& B02ImportanceDetectorConstr 213 { 214 return *fGhostWorld; 215 } 216 217 //....oooOO0OOooo........oooOO0OOooo........oo 218 219 G4VPhysicalVolume* B02ImportanceDetectorConstr 220 { 221 return fGhostWorld; 222 } 223 224 //....oooOO0OOooo........oooOO0OOooo........oo 225 226 void B02ImportanceDetectorConstruction::SetSen 227 { 228 // ---------------------------------------- 229 // The collection names of defined Primiti 230 // 0 ConcreteSD/Collisions 231 // 1 ConcreteSD/CollWeight 232 // 2 ConcreteSD/Population 233 // 3 ConcreteSD/TrackEnter 234 // 4 ConcreteSD/SL 235 // 5 ConcreteSD/SLW 236 // 6 ConcreteSD/SLWE 237 // 7 ConcreteSD/SLW_V 238 // 8 ConcreteSD/SLWE_V 239 // ---------------------------------------- 240 241 // moved to ConstructSD() for MT compliance 242 } 243 244 //....oooOO0OOooo........oooOO0OOooo........oo 245 void B02ImportanceDetectorConstruction::Constr 246 { 247 G4SDManager* SDman = G4SDManager::GetSDMpoin 248 // 249 // Sensitive Detector Name 250 G4String concreteSDname = "ConcreteSD"; 251 252 //------------------------ 253 // MultiFunctionalDetector 254 //------------------------ 255 // 256 // Define MultiFunctionalDetector with name. 257 G4MultiFunctionalDetector* MFDet = new G4Mul 258 SDman->AddNewDetector(MFDet); // Register S 259 260 G4String fltName, particleName; 261 G4SDParticleFilter* neutronFilter = 262 new G4SDParticleFilter(fltName = "neutronF 263 264 MFDet->SetFilter(neutronFilter); 265 266 for (std::vector<G4LogicalVolume*>::iterator 267 it != fLogicalVolumeVector.end(); it++) 268 { 269 // (*it)->SetSensitiveDetector(MFDet) 270 SetSensitiveDetector((*it)->GetName(), MFD 271 } 272 273 G4String psName; 274 G4PSNofCollision* scorer0 = new G4PSNofColli 275 MFDet->RegisterPrimitive(scorer0); 276 277 G4PSNofCollision* scorer1 = new G4PSNofColli 278 scorer1->Weighted(true); 279 MFDet->RegisterPrimitive(scorer1); 280 281 G4PSPopulation* scorer2 = new G4PSPopulation 282 MFDet->RegisterPrimitive(scorer2); 283 284 G4PSTrackCounter* scorer3 = new G4PSTrackCou 285 MFDet->RegisterPrimitive(scorer3); 286 287 G4PSTrackLength* scorer4 = new G4PSTrackLeng 288 MFDet->RegisterPrimitive(scorer4); 289 290 G4PSTrackLength* scorer5 = new G4PSTrackLeng 291 scorer5->Weighted(true); 292 MFDet->RegisterPrimitive(scorer5); 293 294 G4PSTrackLength* scorer6 = new G4PSTrackLeng 295 scorer6->Weighted(true); 296 scorer6->MultiplyKineticEnergy(true); 297 MFDet->RegisterPrimitive(scorer6); 298 299 G4PSTrackLength* scorer7 = new G4PSTrackLeng 300 scorer7->Weighted(true); 301 scorer7->DivideByVelocity(true); 302 MFDet->RegisterPrimitive(scorer7); 303 304 G4PSTrackLength* scorer8 = new G4PSTrackLeng 305 scorer8->Weighted(true); 306 scorer8->MultiplyKineticEnergy(true); 307 scorer8->DivideByVelocity(true); 308 MFDet->RegisterPrimitive(scorer8); 309 } 310 311 //....oooOO0OOooo........oooOO0OOooo........oo 312 G4VIStore* B02ImportanceDetectorConstruction:: 313 { 314 G4cout << " B02ImportanceDetectorConstructio 315 if (!fPVolumeStore.Size()) { 316 G4Exception("B02ImportanceDetectorConstruc 317 RunMustBeAborted, "no physical 318 } 319 320 // creating and filling the importance store 321 322 // G4IStore *istore = new G4IStore(*fWorldV 323 324 G4IStore* istore = G4IStore::GetInstance(Get 325 326 G4GeometryCell gWorldVolumeCell(GetWorldVolu 327 328 G4double imp = 1; 329 330 istore->AddImportanceGeometryCell(1, gWorldV 331 332 // set importance values and create scorers 333 G4int cell(1); 334 for (cell = 1; cell <= 18; cell++) { 335 G4GeometryCell gCell = GetGeometryCell(cel 336 G4cout << " adding cell: " << cell << " re 337 << " name: " << gCell.GetPhysicalVo 338 imp = std::pow(2.0, cell - 1); 339 340 G4cout << "Going to assign importance: " < 341 << ", to volume: " << gCell.GetPhys 342 // x aIstore.AddImportanceGeometryCell( 343 istore->AddImportanceGeometryCell(imp, gCe 344 } 345 346 // creating the geometry cell and add both t 347 // G4GeometryCell gCell = GetGeometryCell(1 348 349 // create importance geometry cell pair for 350 // with the same importance as the last conc 351 G4GeometryCell gCell = GetGeometryCell(19); 352 // G4double imp = std::pow(2.0,18); 353 imp = std::pow(2.0, 17); 354 istore->AddImportanceGeometryCell(imp, gCell 355 356 return istore; 357 } 358 359 //....oooOO0OOooo........oooOO0OOooo........oo 360 361 G4VWeightWindowStore* B02ImportanceDetectorCon 362 { 363 G4cout << " B02ImportanceDetectorConstructio 364 if (!fPVolumeStore.Size()) { 365 G4Exception("B02ImportanceDetectorConstruc 366 RunMustBeAborted, "no physical 367 } 368 369 // creating and filling the importance store 370 371 // G4IStore *istore = new G4IStore(*fWorldV 372 373 G4WeightWindowStore* wwstore = G4WeightWindo 374 375 // create one energy region covering the ene 376 // 377 std::set<G4double, std::less<G4double>> enBo 378 enBounds.insert(1 * GeV); 379 wwstore->SetGeneralUpperEnergyBounds(enBound 380 381 G4int n = 0; 382 G4double lowerWeight = 1; 383 std::vector<G4double> lowerWeights; 384 385 lowerWeights.push_back(1); 386 G4GeometryCell gWorldCell(GetWorldVolumeAddr 387 wwstore->AddLowerWeights(gWorldCell, lowerWe 388 389 G4int cell(1); 390 for (cell = 1; cell <= 18; cell++) { 391 G4GeometryCell gCell = GetGeometryCell(cel 392 G4cout << " adding cell: " << cell << " re 393 << " name: " << gCell.GetPhysicalVo 394 395 lowerWeight = 1. / std::pow(2., n++); 396 G4cout << "Going to assign lower weight: " 397 << ", to volume: " << gCell.GetPhys 398 lowerWeights.clear(); 399 lowerWeights.push_back(lowerWeight); 400 wwstore->AddLowerWeights(gCell, lowerWeigh 401 } 402 403 // the remaining part pf the geometry (rest) 404 // lower weight bound as the last conrete c 405 // 406 407 // create importance geometry cell pair for 408 // with the same importance as the last conc 409 G4GeometryCell gCell = GetGeometryCell(19); 410 wwstore->AddLowerWeights(gCell, lowerWeights 411 412 return wwstore; 413 } 414