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/B03/src/B03ImportanceDetecto 27 /// \brief Implementation of the B03Importance 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........oo 55 56 B03ImportanceDetectorConstruction::B03Importan 57 : G4VUserParallelWorld(worldName), fLogicalV 58 { 59 // Construct(); 60 } 61 62 //....oooOO0OOooo........oooOO0OOooo........oo 63 64 B03ImportanceDetectorConstruction::~B03Importa 65 { 66 fLogicalVolumeVector.clear(); 67 } 68 69 //....oooOO0OOooo........oooOO0OOooo........oo 70 71 void B03ImportanceDetectorConstruction::Constr 72 { 73 G4cout << " constructing parallel world " << 74 75 G4Material* dummyMat = 0; 76 77 // GetWorld methods create a clone of the ma 78 // via the transportation manager 79 fGhostWorld = GetWorld(); 80 G4cout << " B03ImportanceDetectorConstructio 81 << G4endl; 82 G4LogicalVolume* worldLogical = fGhostWorld- 83 fLogicalVolumeVector.push_back(worldLogical) 84 85 G4String name("none"); 86 // fPVolumeStore.AddPVolume(G4GeometryCell( 87 fPVolumeStore.AddPVolume(G4GeometryCell(*fGh 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", inne 98 startAngleShiel 99 100 // logical parallel cells 101 102 G4LogicalVolume* aShield_log_imp = new G4Log 103 fLogicalVolumeVector.push_back(aShield_log_i 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 * h 116 G4VPhysicalVolume* pvol = new G4PVPlacemen 117 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 behi 125 // another slob which should get the same im 126 // last slob 127 innerRadiusShield = 0 * cm; 128 // outerRadiusShield = 110*cm; exceeds worl 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", innerRadi 136 startAngleShield, 137 138 G4LogicalVolume* aRest_log = new G4LogicalVo 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( 149 150 // 0); 151 G4GeometryCell cell(*pvol, 19); 152 // G4GeometryCell cell(*pvol, 0); 153 fPVolumeStore.AddPVolume(cell); 154 155 SetSensitive(); 156 } 157 158 //....oooOO0OOooo........oooOO0OOooo........oo 159 160 const G4VPhysicalVolume& 161 B03ImportanceDetectorConstruction::GetPhysical 162 { 163 return *fPVolumeStore.GetPVolume(name); 164 } 165 166 //....oooOO0OOooo........oooOO0OOooo........oo 167 168 G4String B03ImportanceDetectorConstruction::Li 169 { 170 G4String names(fPVolumeStore.GetPNames()); 171 return names; 172 } 173 174 //....oooOO0OOooo........oooOO0OOooo........oo 175 176 G4String B03ImportanceDetectorConstruction::Ge 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........oo 189 190 G4GeometryCell B03ImportanceDetectorConstructi 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 << "B03ImportanceDetectorConstructi 200 << " couldn't get G4GeometryCell" < 201 return G4GeometryCell(*fGhostWorld, -2); 202 } 203 } 204 205 //....oooOO0OOooo........oooOO0OOooo........oo 206 207 G4VPhysicalVolume& B03ImportanceDetectorConstr 208 { 209 return *fGhostWorld; 210 } 211 212 //....oooOO0OOooo........oooOO0OOooo........oo 213 214 G4VPhysicalVolume* B03ImportanceDetectorConstr 215 { 216 return fGhostWorld; 217 } 218 219 //....oooOO0OOooo........oooOO0OOooo........oo 220 221 void B03ImportanceDetectorConstruction::SetSen 222 { 223 // ---------------------------------------- 224 // The collection names of defined Primiti 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........oo 240 void B03ImportanceDetectorConstruction::Constr 241 { 242 G4SDManager* SDman = G4SDManager::GetSDMpoin 243 // 244 // Sensitive Detector Name 245 G4String concreteSDname = "ConcreteSD"; 246 247 //------------------------ 248 // MultiFunctionalDetector 249 //------------------------ 250 // 251 // Define MultiFunctionalDetector with name. 252 G4MultiFunctionalDetector* MFDet = new G4Mul 253 SDman->AddNewDetector(MFDet); // Register S 254 255 G4String fltName, particleName; 256 G4SDParticleFilter* neutronFilter = 257 new G4SDParticleFilter(fltName = "neutronF 258 259 MFDet->SetFilter(neutronFilter); 260 261 for (std::vector<G4LogicalVolume*>::iterator 262 it != fLogicalVolumeVector.end(); it++) 263 { 264 // (*it)->SetSensitiveDetector(MFDet) 265 SetSensitiveDetector((*it)->GetName(), MFD 266 } 267 268 G4String psName; 269 G4PSNofCollision* scorer0 = new G4PSNofColli 270 MFDet->RegisterPrimitive(scorer0); 271 272 G4PSNofCollision* scorer1 = new G4PSNofColli 273 scorer1->Weighted(true); 274 MFDet->RegisterPrimitive(scorer1); 275 276 G4PSPopulation* scorer2 = new G4PSPopulation 277 MFDet->RegisterPrimitive(scorer2); 278 279 G4PSTrackCounter* scorer3 = new G4PSTrackCou 280 MFDet->RegisterPrimitive(scorer3); 281 282 G4PSTrackLength* scorer4 = new G4PSTrackLeng 283 MFDet->RegisterPrimitive(scorer4); 284 285 G4PSTrackLength* scorer5 = new G4PSTrackLeng 286 scorer5->Weighted(true); 287 MFDet->RegisterPrimitive(scorer5); 288 289 G4PSTrackLength* scorer6 = new G4PSTrackLeng 290 scorer6->Weighted(true); 291 scorer6->MultiplyKineticEnergy(true); 292 MFDet->RegisterPrimitive(scorer6); 293 294 G4PSTrackLength* scorer7 = new G4PSTrackLeng 295 scorer7->Weighted(true); 296 scorer7->DivideByVelocity(true); 297 MFDet->RegisterPrimitive(scorer7); 298 299 G4PSTrackLength* scorer8 = new G4PSTrackLeng 300 scorer8->Weighted(true); 301 scorer8->MultiplyKineticEnergy(true); 302 scorer8->DivideByVelocity(true); 303 MFDet->RegisterPrimitive(scorer8); 304 } 305 306 //....oooOO0OOooo........oooOO0OOooo........oo 307