00001 // 00002 // ******************************************************************** 00003 // * License and Disclaimer * 00004 // * * 00005 // * The Geant4 software is copyright of the Copyright Holders of * 00006 // * the Geant4 Collaboration. It is provided under the terms and * 00007 // * conditions of the Geant4 Software License, included in the file * 00008 // * LICENSE and available at http://cern.ch/geant4/license . These * 00009 // * include a list of copyright holders. * 00010 // * * 00011 // * Neither the authors of this software system, nor their employing * 00012 // * institutes,nor the agencies providing financial support for this * 00013 // * work make any representation or warranty, express or implied, * 00014 // * regarding this software system or assume any liability for its * 00015 // * use. Please see the license in the file LICENSE and URL above * 00016 // * for the full disclaimer and the limitation of liability. * 00017 // * * 00018 // * This code implementation is the result of the scientific and * 00019 // * technical work of the GEANT4 collaboration. * 00020 // * By using, copying, modifying or distributing the software (or * 00021 // * any work based on the software) you agree to acknowledge its * 00022 // * use in resulting scientific publications, and indicate your * 00023 // * acceptance of all terms of the Geant4 Software license. * 00024 // ******************************************************************** 00025 // 00026 // 00027 // $Id$ 00028 // 00029 // 00030 // class G4LogicalVolume Inline Implementation file 00031 // 00032 // 10.20.97 - P. MoraDeFreitas : Added SetFastSimulation method. 00033 // 05.11.98 - M. Verderi: Add Get/Set methods for fBiasWeight 00034 // 09.11.98 - J. Apostolakis: Changed MagneticField to FieldManager 00035 // 12.02.99 - S.Giani: Added set/get methods for voxelization quality 00036 // 18.04.01 - G.Cosmo: Migrated to STL vector 00037 // 17.05.02 - G.Cosmo: Added IsToOptimise() method 00038 // -------------------------------------------------------------------- 00039 00040 // ******************************************************************** 00041 // GetName 00042 // ******************************************************************** 00043 // 00044 inline 00045 G4String G4LogicalVolume::GetName() const 00046 { 00047 return fName; 00048 } 00049 00050 // ******************************************************************** 00051 // SetName 00052 // ******************************************************************** 00053 // 00054 inline 00055 void G4LogicalVolume::SetName(const G4String& pName) 00056 { 00057 fName = pName; 00058 } 00059 00060 // ******************************************************************** 00061 // GetFieldManager 00062 // ******************************************************************** 00063 // 00064 inline 00065 G4FieldManager* G4LogicalVolume::GetFieldManager() const 00066 { 00067 return fFieldManager; 00068 } 00069 00070 // ******************************************************************** 00071 // GetNoDaughters 00072 // ******************************************************************** 00073 // 00074 inline 00075 G4int G4LogicalVolume::GetNoDaughters() const 00076 { 00077 return fDaughters.size(); 00078 } 00079 00080 // ******************************************************************** 00081 // GetDaughter 00082 // ******************************************************************** 00083 // 00084 inline 00085 G4VPhysicalVolume* G4LogicalVolume::GetDaughter(const G4int i) const 00086 { 00087 return fDaughters[i]; 00088 } 00089 00090 // ******************************************************************** 00091 // GetFastSimulationManager 00092 // ******************************************************************** 00093 // 00094 inline 00095 G4FastSimulationManager* G4LogicalVolume::GetFastSimulationManager () const 00096 { 00097 G4FastSimulationManager* fFSM = 0; 00098 if(fRegion) fFSM = fRegion->GetFastSimulationManager(); 00099 return fFSM; 00100 } 00101 00102 // ******************************************************************** 00103 // AddDaughter 00104 // ******************************************************************** 00105 // 00106 inline 00107 void G4LogicalVolume::AddDaughter(G4VPhysicalVolume* pNewDaughter) 00108 { 00109 if( !fDaughters.empty() && fDaughters[0]->IsReplicated() ) 00110 { 00111 std::ostringstream message; 00112 message << "ERROR - Attempt to place a volume in a mother volume" << G4endl 00113 << " already containing a replicated volume." << G4endl 00114 << " A volume can either contain several placements" << G4endl 00115 << " or a unique replica or parameterised volume !" << G4endl 00116 << " Mother logical volume: " << GetName() << G4endl 00117 << " Placing volume: " << pNewDaughter->GetName() << G4endl; 00118 G4Exception("G4LogicalVolume::AddDaughter()", "GeomMgt0002", 00119 FatalException, message, 00120 "Replica or parameterised volume must be the only daughter !"); 00121 } 00122 00123 fMass = 0.; 00124 fDaughters.push_back(pNewDaughter); 00125 00126 G4LogicalVolume* pDaughterLogical = pNewDaughter->GetLogicalVolume(); 00127 00128 // Propagate the Field Manager, if the daughter has no field Manager. 00129 // 00130 G4FieldManager* pDaughterFieldManager = pDaughterLogical->GetFieldManager(); 00131 00132 if( pDaughterFieldManager == 0 ) 00133 { 00134 pDaughterLogical->SetFieldManager(fFieldManager, false); 00135 } 00136 if (fRegion) 00137 { 00138 PropagateRegion(); 00139 fRegion->RegionModified(true); 00140 } 00141 } 00142 00143 // ******************************************************************** 00144 // IsDaughter 00145 // ******************************************************************** 00146 // 00147 inline 00148 G4bool G4LogicalVolume::IsDaughter(const G4VPhysicalVolume* p) const 00149 { 00150 G4PhysicalVolumeList::const_iterator i; 00151 for ( i=fDaughters.begin(); i!=fDaughters.end(); ++i ) 00152 { 00153 if (**i==*p) return true; 00154 } 00155 return false; 00156 } 00157 00158 // ******************************************************************** 00159 // RemoveDaughter 00160 // ******************************************************************** 00161 // 00162 inline 00163 void G4LogicalVolume::RemoveDaughter(const G4VPhysicalVolume* p) 00164 { 00165 G4PhysicalVolumeList::iterator i; 00166 for ( i=fDaughters.begin(); i!=fDaughters.end(); ++i ) 00167 { 00168 if (**i==*p) 00169 { 00170 fDaughters.erase(i); 00171 break; 00172 } 00173 } 00174 if (fRegion) 00175 { 00176 fRegion->RegionModified(true); 00177 } 00178 fMass = 0.; 00179 } 00180 00181 // ******************************************************************** 00182 // ClearDaughters 00183 // ******************************************************************** 00184 // 00185 inline 00186 void G4LogicalVolume::ClearDaughters() 00187 { 00188 G4PhysicalVolumeList::iterator i; 00189 for ( i=fDaughters.begin(); i!=fDaughters.end(); ++i ) 00190 { 00191 fDaughters.erase(i); 00192 } 00193 if (fRegion) 00194 { 00195 fRegion->RegionModified(true); 00196 } 00197 fMass = 0.; 00198 } 00199 00200 // ******************************************************************** 00201 // GetSolid 00202 // ******************************************************************** 00203 // 00204 inline 00205 G4VSolid* G4LogicalVolume::GetSolid() const 00206 { 00207 return fSolid; 00208 } 00209 00210 // ******************************************************************** 00211 // SetSolid 00212 // ******************************************************************** 00213 // 00214 inline 00215 void G4LogicalVolume::SetSolid(G4VSolid *pSolid) 00216 { 00217 assert(pSolid != 0); 00218 fSolid=pSolid; 00219 fMass = 0.; 00220 } 00221 00222 // ******************************************************************** 00223 // GetMaterial 00224 // ******************************************************************** 00225 // 00226 inline 00227 G4Material* G4LogicalVolume::GetMaterial() const 00228 { 00229 return fMaterial; 00230 } 00231 00232 // ******************************************************************** 00233 // SetMaterial 00234 // ******************************************************************** 00235 // 00236 inline 00237 void G4LogicalVolume::SetMaterial(G4Material *pMaterial) 00238 { 00239 fMaterial=pMaterial; 00240 fMass = 0.; 00241 } 00242 00243 // ******************************************************************** 00244 // UpdateMaterial 00245 // ******************************************************************** 00246 // 00247 inline 00248 void G4LogicalVolume::UpdateMaterial(G4Material *pMaterial) 00249 { 00250 fMaterial=pMaterial; 00251 if(fRegion) { fCutsCouple = fRegion->FindCouple(pMaterial); } 00252 fMass = 0.; 00253 } 00254 00255 // ******************************************************************** 00256 // GetSensitiveDetector 00257 // ******************************************************************** 00258 // 00259 inline 00260 G4VSensitiveDetector* G4LogicalVolume::GetSensitiveDetector() const 00261 { 00262 return fSensitiveDetector; 00263 } 00264 00265 // ******************************************************************** 00266 // SetSensitiveDetector 00267 // ******************************************************************** 00268 // 00269 inline 00270 void G4LogicalVolume::SetSensitiveDetector(G4VSensitiveDetector* pSDetector) 00271 { 00272 fSensitiveDetector = pSDetector; 00273 } 00274 00275 // ******************************************************************** 00276 // GetUserLimits 00277 // ******************************************************************** 00278 // 00279 inline 00280 G4UserLimits* G4LogicalVolume::GetUserLimits() const 00281 { 00282 if(fUserLimits) return fUserLimits; 00283 if(fRegion) return fRegion->GetUserLimits(); 00284 return 0; 00285 } 00286 00287 // ******************************************************************** 00288 // SetUserLimits 00289 // ******************************************************************** 00290 // 00291 inline 00292 void G4LogicalVolume::SetUserLimits(G4UserLimits* pULimits) 00293 { 00294 fUserLimits = pULimits; 00295 } 00296 00297 // ******************************************************************** 00298 // GetVoxelHeader 00299 // ******************************************************************** 00300 // 00301 inline 00302 G4SmartVoxelHeader* G4LogicalVolume::GetVoxelHeader() const 00303 { 00304 return fVoxel; 00305 } 00306 00307 // ******************************************************************** 00308 // SetVoxelHeader 00309 // ******************************************************************** 00310 // 00311 inline 00312 void G4LogicalVolume::SetVoxelHeader(G4SmartVoxelHeader* pVoxel) 00313 { 00314 fVoxel = pVoxel; 00315 } 00316 00317 // ******************************************************************** 00318 // GetSmartless 00319 // ******************************************************************** 00320 // 00321 inline 00322 G4double G4LogicalVolume::GetSmartless() const 00323 { 00324 return fSmartless; 00325 } 00326 00327 // ******************************************************************** 00328 // SetSmartless 00329 // ******************************************************************** 00330 // 00331 inline 00332 void G4LogicalVolume::SetSmartless(G4double smt) 00333 { 00334 fSmartless = smt; 00335 } 00336 00337 // ******************************************************************** 00338 // IsToOptimise 00339 // ******************************************************************** 00340 // 00341 inline 00342 G4bool G4LogicalVolume::IsToOptimise() const 00343 { 00344 return fOptimise; 00345 } 00346 00347 // ******************************************************************** 00348 // SetOptimisation 00349 // ******************************************************************** 00350 // 00351 inline 00352 void G4LogicalVolume::SetOptimisation(G4bool optim) 00353 { 00354 fOptimise = optim; 00355 } 00356 00357 // ******************************************************************** 00358 // IsRootRegion 00359 // ******************************************************************** 00360 // 00361 inline 00362 G4bool G4LogicalVolume::IsRootRegion() const 00363 { 00364 return fRootRegion; 00365 } 00366 00367 // ******************************************************************** 00368 // SetRegionRootFlag 00369 // ******************************************************************** 00370 // 00371 inline 00372 void G4LogicalVolume::SetRegionRootFlag(G4bool rreg) 00373 { 00374 fRootRegion = rreg; 00375 } 00376 00377 // ******************************************************************** 00378 // IsRegion 00379 // ******************************************************************** 00380 // 00381 inline 00382 G4bool G4LogicalVolume::IsRegion() const 00383 { 00384 G4bool reg = false; 00385 if (fRegion) reg = true; 00386 return reg; 00387 } 00388 00389 // ******************************************************************** 00390 // SetRegion 00391 // ******************************************************************** 00392 // 00393 inline 00394 void G4LogicalVolume::SetRegion(G4Region* reg) 00395 { 00396 fRegion = reg; 00397 } 00398 00399 // ******************************************************************** 00400 // GetRegion 00401 // ******************************************************************** 00402 // 00403 inline 00404 G4Region* G4LogicalVolume::GetRegion() const 00405 { 00406 return fRegion; 00407 } 00408 00409 // ******************************************************************** 00410 // PropagateRegion 00411 // ******************************************************************** 00412 // 00413 inline 00414 void G4LogicalVolume::PropagateRegion() 00415 { 00416 fRegion->ScanVolumeTree(this, true); 00417 } 00418 00419 // ******************************************************************** 00420 // GetMaterialCutsCouple 00421 // ******************************************************************** 00422 // 00423 inline 00424 const G4MaterialCutsCouple* G4LogicalVolume::GetMaterialCutsCouple() const 00425 { 00426 return fCutsCouple; 00427 } 00428 00429 // ******************************************************************** 00430 // SetMaterialCutsCouple 00431 // ******************************************************************** 00432 // 00433 inline 00434 void G4LogicalVolume::SetMaterialCutsCouple(G4MaterialCutsCouple* cuts) 00435 { 00436 fCutsCouple = cuts; 00437 } 00438 00439 // ******************************************************************** 00440 // Lock 00441 // ******************************************************************** 00442 // 00443 inline 00444 void G4LogicalVolume::Lock() 00445 { 00446 fLock = true; 00447 } 00448 00449 // ******************************************************************** 00450 // Operator == 00451 // ******************************************************************** 00452 // 00453 inline 00454 G4bool G4LogicalVolume::operator == ( const G4LogicalVolume& lv) const 00455 { 00456 return (this==&lv) ? true : false; 00457 } 00458 00459 // ******************************************************************** 00460 // GetVisAttributes 00461 // ******************************************************************** 00462 // 00463 inline 00464 const G4VisAttributes* G4LogicalVolume::GetVisAttributes () const 00465 { 00466 return fVisAttributes; 00467 } 00468 00469 // ******************************************************************** 00470 // SetVisAttributes 00471 // ******************************************************************** 00472 // 00473 inline 00474 void G4LogicalVolume::SetVisAttributes (const G4VisAttributes* pVA) 00475 { 00476 fVisAttributes = pVA; 00477 } 00478 00479 // ******************************************************************** 00480 // SetBiasWeight 00481 // ******************************************************************** 00482 // 00483 inline 00484 void G4LogicalVolume::SetBiasWeight(G4double weight) 00485 { 00486 fBiasWeight = weight; 00487 } 00488 00489 // ******************************************************************** 00490 // GetBiasWeight 00491 // ******************************************************************** 00492 // 00493 inline 00494 G4double G4LogicalVolume::GetBiasWeight() const 00495 { 00496 return fBiasWeight; 00497 } 00498