Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id: G4OpWLS.cc,v 1.9 2007/10/30 03:53:36 gum Exp $ >> 28 // GEANT4 tag $Name: geant4-09-01-patch-03 $ 27 // 29 // 28 ////////////////////////////////////////////// 30 //////////////////////////////////////////////////////////////////////// 29 // Optical Photon WaveLength Shifting (WLS) Cl 31 // Optical Photon WaveLength Shifting (WLS) Class Implementation 30 ////////////////////////////////////////////// 32 //////////////////////////////////////////////////////////////////////// 31 // 33 // 32 // File: G4OpWLS.cc 34 // File: G4OpWLS.cc 33 // Description: Discrete Process -- Wavelength 35 // Description: Discrete Process -- Wavelength Shifting of Optical Photons 34 // Version: 1.0 36 // Version: 1.0 35 // Created: 2003-05-13 37 // Created: 2003-05-13 36 // Author: John Paul Archambault 38 // Author: John Paul Archambault 37 // (Adaptation of G4Scintillation 39 // (Adaptation of G4Scintillation and G4OpAbsorption) 38 // Updated: 2005-07-28 - add G4ProcessType 40 // Updated: 2005-07-28 - add G4ProcessType to constructor 39 // 2006-05-07 - add G4VWLSTimeGen 41 // 2006-05-07 - add G4VWLSTimeGeneratorProfile >> 42 // mail: gum@triumf.ca >> 43 // jparcham@phys.ualberta.ca 40 // 44 // 41 ////////////////////////////////////////////// 45 //////////////////////////////////////////////////////////////////////// 42 46 43 #include "G4OpWLS.hh" << 44 #include "G4ios.hh" 47 #include "G4ios.hh" 45 #include "G4PhysicalConstants.hh" << 48 #include "G4OpWLS.hh" 46 #include "G4SystemOfUnits.hh" << 47 #include "G4OpProcessSubType.hh" << 48 #include "G4Poisson.hh" << 49 #include "G4OpticalParameters.hh" << 50 #include "G4WLSTimeGeneratorProfileDelta.hh" 49 #include "G4WLSTimeGeneratorProfileDelta.hh" 51 #include "G4WLSTimeGeneratorProfileExponential 50 #include "G4WLSTimeGeneratorProfileExponential.hh" 52 51 53 //....oooOO0OOooo........oooOO0OOooo........oo << 52 ///////////////////////// >> 53 // Class Implementation >> 54 ///////////////////////// >> 55 >> 56 ///////////////// >> 57 // Constructors >> 58 ///////////////// >> 59 54 G4OpWLS::G4OpWLS(const G4String& processName, 60 G4OpWLS::G4OpWLS(const G4String& processName, G4ProcessType type) 55 : G4VDiscreteProcess(processName, type) 61 : G4VDiscreteProcess(processName, type) 56 { 62 { 57 WLSTimeGeneratorProfile = nullptr; << 63 theIntegralTable = 0; 58 Initialise(); << 64 59 SetProcessSubType(fOpWLS); << 65 if (verboseLevel>0) { 60 theIntegralTable = nullptr; << 61 << 62 if(verboseLevel > 0) << 63 G4cout << GetProcessName() << " is created 66 G4cout << GetProcessName() << " is created " << G4endl; >> 67 } >> 68 >> 69 WLSTimeGeneratorProfile = >> 70 new G4WLSTimeGeneratorProfileDelta("WLSTimeGeneratorProfileDelta"); >> 71 >> 72 BuildThePhysicsTable(); 64 } 73 } 65 74 66 //....oooOO0OOooo........oooOO0OOooo........oo << 75 //////////////// >> 76 // Destructors >> 77 //////////////// >> 78 67 G4OpWLS::~G4OpWLS() 79 G4OpWLS::~G4OpWLS() 68 { 80 { 69 if(theIntegralTable) << 81 if (theIntegralTable != 0) { 70 { << 71 theIntegralTable->clearAndDestroy(); 82 theIntegralTable->clearAndDestroy(); 72 delete theIntegralTable; 83 delete theIntegralTable; 73 } 84 } 74 delete WLSTimeGeneratorProfile; 85 delete WLSTimeGeneratorProfile; 75 } 86 } 76 87 77 //....oooOO0OOooo........oooOO0OOooo........oo << 88 //////////// 78 void G4OpWLS::PreparePhysicsTable(const G4Part << 89 // Methods 79 << 90 //////////// 80 //....oooOO0OOooo........oooOO0OOooo........oo << 81 void G4OpWLS::Initialise() << 82 { << 83 G4OpticalParameters* params = G4OpticalParam << 84 SetVerboseLevel(params->GetWLSVerboseLevel() << 85 UseTimeProfile(params->GetWLSTimeProfile()); << 86 } << 87 91 88 //....oooOO0OOooo........oooOO0OOooo........oo << 92 // PostStepDoIt 89 G4VParticleChange* G4OpWLS::PostStepDoIt(const << 93 // ------------- 90 const << 94 // >> 95 G4VParticleChange* >> 96 G4OpWLS::PostStepDoIt(const G4Track& aTrack, const G4Step& aStep) 91 { 97 { 92 std::vector<G4Track*> proposedSecondaries; << 93 aParticleChange.Initialize(aTrack); 98 aParticleChange.Initialize(aTrack); >> 99 94 aParticleChange.ProposeTrackStatus(fStopAndK 100 aParticleChange.ProposeTrackStatus(fStopAndKill); 95 101 96 if(verboseLevel > 1) << 102 if (verboseLevel>0) { 97 { << 103 G4cout << "\n** Photon absorbed! **" << G4endl; 98 G4cout << "\n** G4OpWLS: Photon absorbed! << 99 } 104 } >> 105 >> 106 const G4Material* aMaterial = aTrack.GetMaterial(); 100 107 101 G4StepPoint* pPostStepPoint = aStep.GetPostS 108 G4StepPoint* pPostStepPoint = aStep.GetPostStepPoint(); 102 G4MaterialPropertiesTable* MPT = << 109 103 aTrack.GetMaterial()->GetMaterialPropertie << 110 G4MaterialPropertiesTable* aMaterialPropertiesTable = 104 if(!MPT) << 111 aMaterial->GetMaterialPropertiesTable(); 105 { << 112 if (!aMaterialPropertiesTable) 106 return G4VDiscreteProcess::PostStepDoIt(aT 113 return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); 107 } << 114 108 if(!MPT->GetProperty(kWLSCOMPONENT)) << 115 const G4MaterialPropertyVector* WLS_Intensity = 109 { << 116 aMaterialPropertiesTable->GetProperty("WLSCOMPONENT"); >> 117 >> 118 if (!WLS_Intensity) 110 return G4VDiscreteProcess::PostStepDoIt(aT 119 return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); 111 } << 112 120 113 G4int NumPhotons = 1; 121 G4int NumPhotons = 1; 114 if(MPT->ConstPropertyExists(kWLSMEANNUMBERPH << 115 { << 116 G4double MeanNumberOfPhotons = MPT->GetCon << 117 NumPhotons = G4int(G4Poi << 118 if(NumPhotons <= 0) << 119 { << 120 // return unchanged particle and no seco << 121 aParticleChange.SetNumberOfSecondaries(0 << 122 return G4VDiscreteProcess::PostStepDoIt( << 123 } << 124 } << 125 122 126 // Retrieve the WLS Integral for this materi << 123 if (aMaterialPropertiesTable->ConstPropertyExists("WLSMEANNUMBERPHOTONS")) { 127 // new G4PhysicsFreeVector allocated to hold << 128 G4double primaryEnergy = aTrack.GetDynamicPa << 129 G4double WLSTime = 0.; << 130 G4PhysicsFreeVector* WLSIntegral = nullptr; << 131 << 132 WLSTime = MPT->GetConstProperty(kWLSTIME << 133 WLSIntegral = (G4PhysicsFreeVector*) ((*theI << 134 aTrack.GetMaterial()->GetIndex())); << 135 124 136 // Max WLS Integral << 125 G4double MeanNumberOfPhotons = aMaterialPropertiesTable-> 137 G4double CIImax = WLSIntegral->GetMaxV << 126 GetConstProperty("WLSMEANNUMBERPHOTONS"); 138 G4int NumberOfPhotons = NumPhotons; << 127 >> 128 NumPhotons = G4int(G4Poisson(MeanNumberOfPhotons)); >> 129 >> 130 if (NumPhotons <= 0) { 139 131 140 for(G4int i = 0; i < NumPhotons; ++i) << 141 { << 142 G4double sampledEnergy; << 143 // Make sure the energy of the secondary i << 144 for(G4int j = 1; j <= 100; ++j) << 145 { << 146 // Determine photon energy << 147 G4double CIIvalue = G4UniformRand() * CI << 148 sampledEnergy = WLSIntegral->GetEner << 149 if(sampledEnergy <= primaryEnergy) << 150 break; << 151 } << 152 // If no such energy can be sampled, retur << 153 if(sampledEnergy > primaryEnergy) << 154 { << 155 if(verboseLevel > 1) << 156 { << 157 G4cout << " *** G4OpWLS: One less WLS << 158 << G4endl; << 159 } << 160 NumberOfPhotons--; << 161 if(NumberOfPhotons == 0) << 162 { << 163 if(verboseLevel > 1) << 164 { << 165 G4cout << 166 << " *** G4OpWLS: No WLS photon ca << 167 << G4endl; << 168 } << 169 // return unchanged particle and no se 132 // return unchanged particle and no secondaries >> 133 170 aParticleChange.SetNumberOfSecondaries 134 aParticleChange.SetNumberOfSecondaries(0); >> 135 171 return G4VDiscreteProcess::PostStepDoI 136 return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); 172 } << 173 continue; << 174 } << 175 else if(verboseLevel > 1) << 176 { << 177 G4cout << "G4OpWLS: Created photon with << 178 << G4endl; << 179 } << 180 137 181 // Generate random photon direction << 138 } 182 G4double cost = 1. - 2. * G4UniformRand(); << 183 G4double sint = std::sqrt((1. - cost) * (1 << 184 G4double phi = twopi * G4UniformRand(); << 185 G4double sinp = std::sin(phi); << 186 G4double cosp = std::cos(phi); << 187 G4ParticleMomentum photonMomentum(sint * c << 188 139 189 G4ThreeVector photonPolarization(cost * co << 140 } 190 G4ThreeVector perp = photonMomentum.cross( << 191 141 192 phi = twopi * G4UniformRand << 142 aParticleChange.SetNumberOfSecondaries(NumPhotons); 193 sinp = std::sin(phi); << 194 cosp = std::cos(phi); << 195 photonPolarization = (cosp * photonPolariz << 196 143 197 // Generate a new photon: << 144 G4int materialIndex = aMaterial->GetIndex(); 198 auto sec_dp = << 199 new G4DynamicParticle(G4OpticalPhoton::O << 200 sec_dp->SetPolarization(photonPolarization << 201 sec_dp->SetKineticEnergy(sampledEnergy); << 202 << 203 G4double secTime = pPostStepPoint->GetGlob << 204 WLSTimeGeneratorProfile << 205 G4ThreeVector secPos = pPostStepPoint->Get << 206 G4Track* secTrack = new G4Track(sec_dp, << 207 145 208 secTrack->SetTouchableHandle(aTrack.GetTou << 146 // Retrieve the WLS Integral for this material 209 secTrack->SetParentID(aTrack.GetTrackID()) << 147 // new G4PhysicsOrderedFreeVector allocated to hold CII's 210 148 211 proposedSecondaries.push_back(secTrack); << 149 G4double WLSTime = 0.*ns; 212 } << 150 G4PhysicsOrderedFreeVector* WLSIntegral = 0; 213 151 214 aParticleChange.SetNumberOfSecondaries((G4in << 152 WLSTime = aMaterialPropertiesTable-> 215 for(auto sec : proposedSecondaries) << 153 GetConstProperty("WLSTIMECONSTANT"); 216 { << 154 WLSIntegral = 217 aParticleChange.AddSecondary(sec); << 155 (G4PhysicsOrderedFreeVector*)((*theIntegralTable)(materialIndex)); 218 } << 156 219 if(verboseLevel > 1) << 157 // Max WLS Integral 220 { << 158 221 G4cout << "\n Exiting from G4OpWLS::DoIt - << 159 G4double CIImax = WLSIntegral->GetMaxValue(); 222 << aParticleChange.GetNumberOfSecon << 160 223 } << 161 for (G4int i = 0; i < NumPhotons; i++) { >> 162 >> 163 // Determine photon momentum >> 164 >> 165 G4double CIIvalue = G4UniformRand()*CIImax; >> 166 G4double sampledMomentum = >> 167 WLSIntegral->GetEnergy(CIIvalue); >> 168 >> 169 if (verboseLevel>1) { >> 170 G4cout << "sampledMomentum = " << sampledMomentum << G4endl; >> 171 G4cout << "CIIvalue = " << CIIvalue << G4endl; >> 172 } >> 173 >> 174 // Generate random photon direction >> 175 >> 176 G4double cost = 1. - 2.*G4UniformRand(); >> 177 G4double sint = std::sqrt((1.-cost)*(1.+cost)); 224 178 >> 179 G4double phi = twopi*G4UniformRand(); >> 180 G4double sinp = std::sin(phi); >> 181 G4double cosp = std::cos(phi); >> 182 >> 183 G4double px = sint*cosp; >> 184 G4double py = sint*sinp; >> 185 G4double pz = cost; >> 186 >> 187 // Create photon momentum direction vector >> 188 >> 189 G4ParticleMomentum photonMomentum(px, py, pz); >> 190 >> 191 // Determine polarization of new photon >> 192 >> 193 G4double sx = cost*cosp; >> 194 G4double sy = cost*sinp; >> 195 G4double sz = -sint; >> 196 >> 197 G4ThreeVector photonPolarization(sx, sy, sz); >> 198 >> 199 G4ThreeVector perp = photonMomentum.cross(photonPolarization); >> 200 >> 201 phi = twopi*G4UniformRand(); >> 202 sinp = std::sin(phi); >> 203 cosp = std::cos(phi); >> 204 >> 205 photonPolarization = cosp * photonPolarization + sinp * perp; >> 206 >> 207 photonPolarization = photonPolarization.unit(); >> 208 >> 209 // Generate a new photon: >> 210 >> 211 G4DynamicParticle* aWLSPhoton = >> 212 new G4DynamicParticle(G4OpticalPhoton::OpticalPhoton(), >> 213 photonMomentum); >> 214 aWLSPhoton->SetPolarization >> 215 (photonPolarization.x(), >> 216 photonPolarization.y(), >> 217 photonPolarization.z()); >> 218 >> 219 aWLSPhoton->SetKineticEnergy(sampledMomentum); >> 220 >> 221 // Generate new G4Track object: >> 222 >> 223 // Must give position of WLS optical photon >> 224 >> 225 G4double TimeDelay = WLSTimeGeneratorProfile->GenerateTime(WLSTime); >> 226 G4double aSecondaryTime = (pPostStepPoint->GetGlobalTime()) + TimeDelay; >> 227 >> 228 G4ThreeVector aSecondaryPosition = pPostStepPoint->GetPosition(); >> 229 >> 230 G4Track* aSecondaryTrack = >> 231 new G4Track(aWLSPhoton,aSecondaryTime,aSecondaryPosition); >> 232 >> 233 aSecondaryTrack->SetTouchableHandle((G4VTouchable*)0); >> 234 >> 235 aSecondaryTrack->SetParentID(aTrack.GetTrackID()); >> 236 >> 237 aParticleChange.AddSecondary(aSecondaryTrack); >> 238 } >> 239 >> 240 if (verboseLevel>0) { >> 241 G4cout << "\n Exiting from G4OpWLS::DoIt -- NumberOfSecondaries = " >> 242 << aParticleChange.GetNumberOfSecondaries() << G4endl; >> 243 } >> 244 225 return G4VDiscreteProcess::PostStepDoIt(aTra 245 return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); 226 } 246 } 227 247 228 //....oooOO0OOooo........oooOO0OOooo........oo << 248 // BuildThePhysicsTable for the wavelength shifting process 229 void G4OpWLS::BuildPhysicsTable(const G4Partic << 249 // -------------------------------------------------- 230 { << 250 // 231 if(theIntegralTable) << 232 { << 233 theIntegralTable->clearAndDestroy(); << 234 delete theIntegralTable; << 235 theIntegralTable = nullptr; << 236 } << 237 << 238 const G4MaterialTable* materialTable = G4Mat << 239 std::size_t numOfMaterials = G4Mat << 240 theIntegralTable = new G << 241 251 >> 252 void G4OpWLS::BuildThePhysicsTable() >> 253 { >> 254 if (theIntegralTable) return; >> 255 >> 256 const G4MaterialTable* theMaterialTable = >> 257 G4Material::GetMaterialTable(); >> 258 G4int numOfMaterials = G4Material::GetNumberOfMaterials(); >> 259 >> 260 // create new physics table >> 261 >> 262 if(!theIntegralTable)theIntegralTable = new G4PhysicsTable(numOfMaterials); >> 263 242 // loop for materials 264 // loop for materials 243 for(std::size_t i = 0; i < numOfMaterials; + << 265 244 { << 266 for (G4int i=0 ; i < numOfMaterials; i++) 245 auto physVector = new G4PhysicsFreeVector( << 246 << 247 // Retrieve vector of WLS wavelength inten << 248 // the material from the material's optica << 249 G4MaterialPropertiesTable* MPT = << 250 (*materialTable)[i]->GetMaterialProperti << 251 if(MPT) << 252 { 267 { 253 G4MaterialPropertyVector* wlsVector = MP << 268 G4PhysicsOrderedFreeVector* aPhysicsOrderedFreeVector = 254 if(wlsVector) << 269 new G4PhysicsOrderedFreeVector(); 255 { << 270 256 // Retrieve the first intensity point << 271 // Retrieve vector of WLS wavelength intensity for 257 // of (photon energy, intensity) pairs << 272 // the material from the material's optical properties table. 258 G4double currentIN = (*wlsVector)[0]; << 273 259 if(currentIN >= 0.0) << 274 G4Material* aMaterial = (*theMaterialTable)[i]; 260 { << 275 261 // Create first (photon energy) << 276 G4MaterialPropertiesTable* aMaterialPropertiesTable = 262 G4double currentPM = wlsVector->Ene << 277 aMaterial->GetMaterialPropertiesTable(); 263 G4double currentCII = 0.0; << 278 264 physVector->InsertValues(currentPM, << 279 if (aMaterialPropertiesTable) { 265 << 280 266 // Set previous values to current on << 281 G4MaterialPropertyVector* theWLSVector = 267 G4double prevPM = currentPM; << 282 aMaterialPropertiesTable->GetProperty("WLSCOMPONENT"); 268 G4double prevCII = currentCII; << 283 269 G4double prevIN = currentIN; << 284 if (theWLSVector) { 270 << 285 271 // loop over all (photon energy, int << 286 // Retrieve the first intensity point in vector 272 // pairs stored for this material << 287 // of (photon momentum, intensity) pairs 273 for(std::size_t j = 1; j < wlsVector << 288 274 { << 289 theWLSVector->ResetIterator(); 275 currentPM = wlsVector->Energy(j); << 290 ++(*theWLSVector); // advance to 1st entry 276 currentIN = (*wlsVector)[j]; << 291 277 currentCII = << 292 G4double currentIN = theWLSVector-> 278 prevCII + 0.5 * (currentPM - pre << 293 GetProperty(); 279 << 294 280 physVector->InsertValues(currentPM << 295 if (currentIN >= 0.0) { 281 << 296 282 prevPM = currentPM; << 297 // Create first (photon momentum) 283 prevCII = currentCII; << 298 284 prevIN = currentIN; << 299 G4double currentPM = theWLSVector-> 285 } << 300 GetPhotonMomentum(); 286 } << 301 >> 302 G4double currentCII = 0.0; >> 303 >> 304 aPhysicsOrderedFreeVector-> >> 305 InsertValues(currentPM , currentCII); >> 306 >> 307 // Set previous values to current ones prior to loop >> 308 >> 309 G4double prevPM = currentPM; >> 310 G4double prevCII = currentCII; >> 311 G4double prevIN = currentIN; >> 312 >> 313 // loop over all (photon momentum, intensity) >> 314 // pairs stored for this material >> 315 >> 316 while(++(*theWLSVector)) >> 317 { >> 318 currentPM = theWLSVector-> >> 319 GetPhotonMomentum(); >> 320 >> 321 currentIN=theWLSVector-> >> 322 GetProperty(); >> 323 >> 324 currentCII = 0.5 * (prevIN + currentIN); >> 325 >> 326 currentCII = prevCII + >> 327 (currentPM - prevPM) * currentCII; >> 328 >> 329 aPhysicsOrderedFreeVector-> >> 330 InsertValues(currentPM, currentCII); >> 331 >> 332 prevPM = currentPM; >> 333 prevCII = currentCII; >> 334 prevIN = currentIN; >> 335 } >> 336 } >> 337 } 287 } 338 } >> 339 // The WLS integral for a given material >> 340 // will be inserted in the table according to the >> 341 // position of the material in the material table. >> 342 >> 343 theIntegralTable->insertAt(i,aPhysicsOrderedFreeVector); 288 } 344 } 289 theIntegralTable->insertAt(i, physVector); << 290 } << 291 } 345 } 292 346 293 //....oooOO0OOooo........oooOO0OOooo........oo << 347 // GetMeanFreePath 294 G4double G4OpWLS::GetMeanFreePath(const G4Trac << 348 // --------------- 295 G4ForceCondi << 349 // >> 350 G4double G4OpWLS::GetMeanFreePath(const G4Track& aTrack, >> 351 G4double , >> 352 G4ForceCondition* ) 296 { 353 { 297 G4double thePhotonEnergy = aTrack.GetDynamic << 354 const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); 298 G4double attLength = DBL_MAX; << 355 const G4Material* aMaterial = aTrack.GetMaterial(); 299 G4MaterialPropertiesTable* MPT = << 356 300 aTrack.GetMaterial()->GetMaterialPropertie << 357 G4double thePhotonMomentum = aParticle->GetTotalMomentum(); 301 << 358 302 if(MPT) << 359 G4MaterialPropertiesTable* aMaterialPropertyTable; 303 { << 360 G4MaterialPropertyVector* AttenuationLengthVector; 304 G4MaterialPropertyVector* attVector = MPT- << 361 305 if(attVector) << 362 G4double AttenuationLength = DBL_MAX; 306 { << 363 307 attLength = attVector->Value(thePhotonEn << 364 aMaterialPropertyTable = aMaterial->GetMaterialPropertiesTable(); >> 365 >> 366 if ( aMaterialPropertyTable ) { >> 367 AttenuationLengthVector = aMaterialPropertyTable-> >> 368 GetProperty("WLSABSLENGTH"); >> 369 if ( AttenuationLengthVector ){ >> 370 AttenuationLength = AttenuationLengthVector-> >> 371 GetProperty (thePhotonMomentum); >> 372 } >> 373 else { >> 374 // G4cout << "No WLS absorption length specified" << G4endl; 308 } 375 } 309 } 376 } 310 return attLength; << 377 else { >> 378 // G4cout << "No WLS absortion length specified" << G4endl; >> 379 } >> 380 >> 381 return AttenuationLength; 311 } 382 } 312 383 313 //....oooOO0OOooo........oooOO0OOooo........oo << 314 void G4OpWLS::UseTimeProfile(const G4String na 384 void G4OpWLS::UseTimeProfile(const G4String name) 315 { 385 { 316 if(WLSTimeGeneratorProfile) << 386 if (name == "delta") 317 { << 387 { 318 delete WLSTimeGeneratorProfile; << 388 delete WLSTimeGeneratorProfile; 319 WLSTimeGeneratorProfile = nullptr; << 389 WLSTimeGeneratorProfile = 320 } << 390 new G4WLSTimeGeneratorProfileDelta("delta"); 321 if(name == "delta") << 391 } 322 { << 392 else if (name == "exponential") 323 WLSTimeGeneratorProfile = new G4WLSTimeGen << 393 { 324 } << 394 delete WLSTimeGeneratorProfile; 325 else if(name == "exponential") << 395 WLSTimeGeneratorProfile = 326 { << 396 new G4WLSTimeGeneratorProfileExponential("exponential"); 327 WLSTimeGeneratorProfile = << 397 } 328 new G4WLSTimeGeneratorProfileExponential << 329 } << 330 else 398 else 331 { << 399 { 332 G4Exception("G4OpWLS::UseTimeProfile", "em << 400 G4Exception("G4OpWLS::UseTimeProfile - generator does not exist"); 333 "generator does not exist"); << 401 } 334 } << 335 G4OpticalParameters::Instance()->SetWLSTimeP << 336 } << 337 << 338 //....oooOO0OOooo........oooOO0OOooo........oo << 339 void G4OpWLS::SetVerboseLevel(G4int verbose) << 340 { << 341 verboseLevel = verbose; << 342 G4OpticalParameters::Instance()->SetWLSVerbo << 343 } 402 } 344 403