- Timestamp:
- Apr 6, 2009, 12:21:12 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/electromagnetic/standard/src/G4PAIxSection.cc
r819 r961 25 25 // 26 26 // 27 // $Id: G4PAIxSection.cc,v 1.2 1 2006/06/29 19:53:20 gunterExp $28 // GEANT4 tag $Name: $27 // $Id: G4PAIxSection.cc,v 1.24 2008/05/30 16:04:40 grichine Exp $ 28 // GEANT4 tag $Name: geant4-09-02-ref-02 $ 29 29 // 30 30 // … … 70 70 70.0 , 100.0 , 300.0 , 600.0 , 1000.0 , 3000.0 , 71 71 10000.0 , 50000.0 72 } 72 }; 73 73 74 74 const G4int G4PAIxSection:: 75 fRefGammaNumber = 29 75 fRefGammaNumber = 29; // The number of gamma for creation of 76 76 // spline (9) 77 77 … … 80 80 // Local class constants 81 81 82 const G4double G4PAIxSection::fDelta = 0.005 83 const G4double G4PAIxSection::fError = 0.005 84 85 const G4int G4PAIxSection::fMaxSplineSize = 500 82 const G4double G4PAIxSection::fDelta = 0.005; // energy shift from interval border 83 const G4double G4PAIxSection::fError = 0.005; // error in lin-log approximation 84 85 const G4int G4PAIxSection::fMaxSplineSize = 500; // Max size of output spline 86 86 // arrays 87 87 … … 95 95 fDensity = matCC->GetMaterial()->GetDensity(); 96 96 G4int matIndex = matCC->GetMaterial()->GetIndex(); 97 fMaterialIndex = matIndex; 97 98 fSandia = new G4SandiaTable(matIndex); 98 99 … … 108 109 (*(*fMatSandiaMatrix)[i])[0] = fSandia->GetSandiaMatTable(i,0); 109 110 110 for(j = 1; j < 5 111 for(j = 1; j < 5; j++) 111 112 { 112 113 (*(*fMatSandiaMatrix)[i])[j] = fSandia->GetSandiaMatTable(i,j)*fDensity; 113 114 } 114 115 } 115 116 117 118 116 } 117 118 //////////////////////////////////////////////////////////////// 119 119 120 120 G4PAIxSection::G4PAIxSection(G4int materialIndex, 121 121 G4double maxEnergyTransfer) 122 122 { 123 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable() ; 124 G4int i, j ; 125 126 fDensity = (*theMaterialTable)[materialIndex]->GetDensity() ; 123 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); 124 G4int i, j; 125 126 fMaterialIndex = materialIndex; 127 fDensity = (*theMaterialTable)[materialIndex]->GetDensity(); 127 128 fElectronDensity = (*theMaterialTable)[materialIndex]-> 128 GetElectronDensity() 129 GetElectronDensity(); 129 130 fIntervalNumber = (*theMaterialTable)[materialIndex]-> 130 GetSandiaTable()->GetMatNbOfIntervals() 131 GetSandiaTable()->GetMatNbOfIntervals(); 131 132 fIntervalNumber--; 132 // G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl 133 134 fEnergyInterval = new G4double[fIntervalNumber+2] 135 fA1 = new G4double[fIntervalNumber+2] 136 fA2 = new G4double[fIntervalNumber+2] 137 fA3 = new G4double[fIntervalNumber+2] 138 fA4 = new G4double[fIntervalNumber+2] 139 140 for(i = 1 ; i <= fIntervalNumber; i++ )133 // G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl; 134 135 fEnergyInterval = new G4double[fIntervalNumber+2]; 136 fA1 = new G4double[fIntervalNumber+2]; 137 fA2 = new G4double[fIntervalNumber+2]; 138 fA3 = new G4double[fIntervalNumber+2]; 139 fA4 = new G4double[fIntervalNumber+2]; 140 141 for(i = 1; i <= fIntervalNumber; i++ ) 141 142 { 142 143 if(((*theMaterialTable)[materialIndex]-> … … 144 145 i > fIntervalNumber ) 145 146 { 146 fEnergyInterval[i] = maxEnergyTransfer 147 fIntervalNumber = i 147 fEnergyInterval[i] = maxEnergyTransfer; 148 fIntervalNumber = i; 148 149 break; 149 150 } … … 159 160 GetSandiaTable()->GetSandiaCofForMaterial(i-1,4); 160 161 // G4cout<<i<<"\t"<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t" 161 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl 162 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl; 162 163 } 163 164 if(fEnergyInterval[fIntervalNumber] != maxEnergyTransfer) 164 165 { 165 166 fIntervalNumber++; 166 fEnergyInterval[fIntervalNumber] = maxEnergyTransfer 167 fEnergyInterval[fIntervalNumber] = maxEnergyTransfer; 167 168 } 168 169 … … 174 175 1.5*fDelta*(fEnergyInterval[i+1]+fEnergyInterval[i])) 175 176 { 176 continue 177 continue; 177 178 } 178 179 else … … 180 181 for(j=i;j<fIntervalNumber;j++) 181 182 { 182 fEnergyInterval[j] = fEnergyInterval[j+1] 183 fA1[j] = fA1[j+1] 184 fA2[j] = fA2[j+1] 185 fA3[j] = fA3[j+1] 186 fA4[j] = fA4[j+1] 183 fEnergyInterval[j] = fEnergyInterval[j+1]; 184 fA1[j] = fA1[j+1]; 185 fA2[j] = fA2[j+1]; 186 fA3[j] = fA3[j+1]; 187 fA4[j] = fA4[j+1]; 187 188 } 188 fIntervalNumber-- 189 i-- 189 fIntervalNumber--; 190 i--; 190 191 } 191 192 } … … 194 195 /* ********************************* 195 196 196 fSplineEnergy = new G4double[fMaxSplineSize] 197 fRePartDielectricConst = new G4double[fMaxSplineSize] 198 fImPartDielectricConst = new G4double[fMaxSplineSize] 199 fIntegralTerm = new G4double[fMaxSplineSize] 200 fDifPAIxSection = new G4double[fMaxSplineSize] 201 fIntegralPAIxSection = new G4double[fMaxSplineSize] 197 fSplineEnergy = new G4double[fMaxSplineSize]; 198 fRePartDielectricConst = new G4double[fMaxSplineSize]; 199 fImPartDielectricConst = new G4double[fMaxSplineSize]; 200 fIntegralTerm = new G4double[fMaxSplineSize]; 201 fDifPAIxSection = new G4double[fMaxSplineSize]; 202 fIntegralPAIxSection = new G4double[fMaxSplineSize]; 202 203 203 204 for(i=0;i<fMaxSplineSize;i++) 204 205 { 205 fSplineEnergy[i] = 0.0 206 fRePartDielectricConst[i] = 0.0 207 fImPartDielectricConst[i] = 0.0 208 fIntegralTerm[i] = 0.0 209 fDifPAIxSection[i] = 0.0 210 fIntegralPAIxSection[i] = 0.0 206 fSplineEnergy[i] = 0.0; 207 fRePartDielectricConst[i] = 0.0; 208 fImPartDielectricConst[i] = 0.0; 209 fIntegralTerm[i] = 0.0; 210 fDifPAIxSection[i] = 0.0; 211 fIntegralPAIxSection[i] = 0.0; 211 212 } 212 213 ************************************************** */ 213 214 214 InitPAI() 215 InitPAI(); // create arrays allocated above 215 216 216 delete[] fEnergyInterval 217 delete[] fA1 218 delete[] fA2 219 delete[] fA3 220 delete[] fA4 217 delete[] fEnergyInterval; 218 delete[] fA1; 219 delete[] fA2; 220 delete[] fA3; 221 delete[] fA4; 221 222 } 222 223 … … 232 233 { 233 234 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); 234 G4int i, j ; 235 235 G4int i, j; 236 237 fMaterialIndex = materialIndex; 236 238 fDensity = (*theMaterialTable)[materialIndex]->GetDensity(); 237 239 fElectronDensity = (*theMaterialTable)[materialIndex]-> 238 GetElectronDensity() 239 240 fIntervalNumber = intNumber 240 GetElectronDensity(); 241 242 fIntervalNumber = intNumber; 241 243 fIntervalNumber--; 242 // G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl 244 // G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl; 243 245 244 fEnergyInterval = new G4double[fIntervalNumber+2] 245 fA1 = new G4double[fIntervalNumber+2] 246 fA2 = new G4double[fIntervalNumber+2] 247 fA3 = new G4double[fIntervalNumber+2] 248 fA4 = new G4double[fIntervalNumber+2] 249 250 for( i = 1 ; i <= fIntervalNumber; i++ )246 fEnergyInterval = new G4double[fIntervalNumber+2]; 247 fA1 = new G4double[fIntervalNumber+2]; 248 fA2 = new G4double[fIntervalNumber+2]; 249 fA3 = new G4double[fIntervalNumber+2]; 250 fA4 = new G4double[fIntervalNumber+2]; 251 252 for( i = 1; i <= fIntervalNumber; i++ ) 251 253 { 252 254 if( ( photoAbsCof[i-1][0] >= maxEnergyTransfer ) || 253 255 i > fIntervalNumber ) 254 256 { 255 fEnergyInterval[i] = maxEnergyTransfer 256 fIntervalNumber = i 257 fEnergyInterval[i] = maxEnergyTransfer; 258 fIntervalNumber = i; 257 259 break; 258 260 } 259 fEnergyInterval[i] = photoAbsCof[i-1][0] 260 fA1[i] = photoAbsCof[i-1][1] 261 fA2[i] = photoAbsCof[i-1][2] 262 fA3[i] = photoAbsCof[i-1][3] 263 fA4[i] = photoAbsCof[i-1][4] 261 fEnergyInterval[i] = photoAbsCof[i-1][0]; 262 fA1[i] = photoAbsCof[i-1][1]; 263 fA2[i] = photoAbsCof[i-1][2]; 264 fA3[i] = photoAbsCof[i-1][3]; 265 fA4[i] = photoAbsCof[i-1][4]; 264 266 // G4cout<<i<<"\t"<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t" 265 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl 267 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl; 266 268 } 267 269 // G4cout<<"i last = "<<i<<"; "<<"fIntervalNumber = "<<fIntervalNumber<<G4endl; … … 269 271 { 270 272 fIntervalNumber++; 271 fEnergyInterval[fIntervalNumber] = maxEnergyTransfer 273 fEnergyInterval[fIntervalNumber] = maxEnergyTransfer; 272 274 } 273 275 for(i=1;i<=fIntervalNumber;i++) 274 276 { 275 277 // G4cout<<i<<"\t"<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t" 276 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl 278 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl; 277 279 } 278 280 // Now checking, if two borders are too close together 279 281 280 for( i = 1 ; i < fIntervalNumber; i++ )282 for( i = 1; i < fIntervalNumber; i++ ) 281 283 { 282 284 if(fEnergyInterval[i+1]-fEnergyInterval[i] > 283 285 1.5*fDelta*(fEnergyInterval[i+1]+fEnergyInterval[i])) 284 286 { 285 continue 287 continue; 286 288 } 287 289 else … … 289 291 for(j=i;j<fIntervalNumber;j++) 290 292 { 291 fEnergyInterval[j] = fEnergyInterval[j+1] 292 fA1[j] = fA1[j+1] 293 fA2[j] = fA2[j+1] 294 fA3[j] = fA3[j+1] 295 fA4[j] = fA4[j+1] 293 fEnergyInterval[j] = fEnergyInterval[j+1]; 294 fA1[j] = fA1[j+1]; 295 fA2[j] = fA2[j+1]; 296 fA3[j] = fA3[j+1]; 297 fA4[j] = fA4[j+1]; 296 298 } 297 fIntervalNumber-- 298 i-- 299 fIntervalNumber--; 300 i--; 299 301 } 300 302 } … … 305 307 fLorentzFactor[fRefGammaNumber]*fLorentzFactor[fRefGammaNumber] - 1; 306 308 307 NormShift(betaGammaSqRef) 308 SplainPAI(betaGammaSqRef) 309 NormShift(betaGammaSqRef); 310 SplainPAI(betaGammaSqRef); 309 311 310 312 // Preparation of integral PAI cross section for input betaGammaSq 311 313 312 for(i = 1 ; i <= fSplineNumber; i++)314 for(i = 1; i <= fSplineNumber; i++) 313 315 { 314 316 fdNdxCerenkov[i] = PAIdNdxCerenkov(i,betaGammaSq); 317 fdNdxMM[i] = PAIdNdxMM(i,betaGammaSq); 315 318 fdNdxPlasmon[i] = PAIdNdxPlasmon(i,betaGammaSq); 319 fdNdxResonance[i] = PAIdNdxResonance(i,betaGammaSq); 316 320 fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq); 321 317 322 // G4cout<<i<<"; dNdxC = "<<fdNdxCerenkov[i]<<"; dNdxP = "<<fdNdxPlasmon[i] 318 323 // <<"; dNdxPAI = "<<fDifPAIxSection[i]<<G4endl; 319 324 } 320 IntegralCerenkov() ; 321 IntegralPlasmon() ; 322 IntegralPAIxSection() ; 325 IntegralCerenkov(); 326 IntegralMM(); 327 IntegralPlasmon(); 328 IntegralResonance(); 329 IntegralPAIxSection(); 323 330 324 delete[] fEnergyInterval 325 delete[] fA1 326 delete[] fA2 327 delete[] fA3 328 delete[] fA4 331 delete[] fEnergyInterval; 332 delete[] fA1; 333 delete[] fA2; 334 delete[] fA3; 335 delete[] fA4; 329 336 } 330 337 … … 339 346 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); 340 347 341 G4int i, j, numberOfElements ; 342 348 G4int i, j, numberOfElements; 349 350 fMaterialIndex = materialIndex; 343 351 fDensity = (*theMaterialTable)[materialIndex]->GetDensity(); 344 fElectronDensity = (*theMaterialTable)[materialIndex]->GetElectronDensity() 345 numberOfElements = (*theMaterialTable)[materialIndex]->GetNumberOfElements() 346 347 G4int* thisMaterialZ = new G4int[numberOfElements] 348 349 for( i = 0 ; i < numberOfElements; i++ )352 fElectronDensity = (*theMaterialTable)[materialIndex]->GetElectronDensity(); 353 numberOfElements = (*theMaterialTable)[materialIndex]->GetNumberOfElements(); 354 355 G4int* thisMaterialZ = new G4int[numberOfElements]; 356 357 for( i = 0; i < numberOfElements; i++ ) 350 358 { 351 359 thisMaterialZ[i] = (G4int)(*theMaterialTable)[materialIndex]-> 352 GetElement(i)->GetZ() ; 353 } 354 G4SandiaTable thisMaterialSandiaTable(materialIndex) ; 360 GetElement(i)->GetZ(); 361 } 362 // fSandia = new G4SandiaTable(materialIndex); 363 fSandia = (*theMaterialTable)[materialIndex]-> 364 GetSandiaTable(); 365 G4SandiaTable thisMaterialSandiaTable(materialIndex); 355 366 fIntervalNumber = thisMaterialSandiaTable.SandiaIntervals 356 (thisMaterialZ,numberOfElements) 367 (thisMaterialZ,numberOfElements); 357 368 fIntervalNumber = thisMaterialSandiaTable.SandiaMixing 358 369 ( thisMaterialZ , 359 370 (*theMaterialTable)[materialIndex]->GetFractionVector() , 360 numberOfElements,fIntervalNumber) 371 numberOfElements,fIntervalNumber); 361 372 362 373 fIntervalNumber--; 363 374 364 fEnergyInterval = new G4double[fIntervalNumber+2] 365 fA1 = new G4double[fIntervalNumber+2] 366 fA2 = new G4double[fIntervalNumber+2] 367 fA3 = new G4double[fIntervalNumber+2] 368 fA4 = new G4double[fIntervalNumber+2] 369 370 for( i=1;i<=fIntervalNumber;i++)375 fEnergyInterval = new G4double[fIntervalNumber+2]; 376 fA1 = new G4double[fIntervalNumber+2]; 377 fA2 = new G4double[fIntervalNumber+2]; 378 fA3 = new G4double[fIntervalNumber+2]; 379 fA4 = new G4double[fIntervalNumber+2]; 380 381 for( i = 1; i <= fIntervalNumber; i++ ) 371 382 { 372 383 if((thisMaterialSandiaTable.GetPhotoAbsorpCof(i,0) >= maxEnergyTransfer) || 373 384 i > fIntervalNumber) 374 385 { 375 fEnergyInterval[i] = maxEnergyTransfer 376 fIntervalNumber = i 386 fEnergyInterval[i] = maxEnergyTransfer; 387 fIntervalNumber = i; 377 388 break; 378 389 } 379 fEnergyInterval[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,0) 380 fA1[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,1)*fDensity 381 fA2[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,2)*fDensity 382 fA3[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,3)*fDensity 383 fA4[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,4)*fDensity 390 fEnergyInterval[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,0); 391 fA1[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,1)*fDensity; 392 fA2[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,2)*fDensity; 393 fA3[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,3)*fDensity; 394 fA4[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,4)*fDensity; 384 395 385 396 } … … 387 398 { 388 399 fIntervalNumber++; 389 fEnergyInterval[fIntervalNumber] = maxEnergyTransfer 390 fA1[fIntervalNumber] = fA1[fIntervalNumber-1] 391 fA2[fIntervalNumber] = fA2[fIntervalNumber-1] 392 fA3[fIntervalNumber] = fA3[fIntervalNumber-1] 393 fA4[fIntervalNumber] = fA4[fIntervalNumber-1] 400 fEnergyInterval[fIntervalNumber] = maxEnergyTransfer; 401 fA1[fIntervalNumber] = fA1[fIntervalNumber-1]; 402 fA2[fIntervalNumber] = fA2[fIntervalNumber-1]; 403 fA3[fIntervalNumber] = fA3[fIntervalNumber-1]; 404 fA4[fIntervalNumber] = fA4[fIntervalNumber-1]; 394 405 } 395 406 for(i=1;i<=fIntervalNumber;i++) 396 407 { 397 408 // G4cout<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t" 398 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl 409 // <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl; 399 410 } 400 411 // Now checking, if two borders are too close together 401 412 402 for( i=1;i<fIntervalNumber;i++)413 for( i = 1; i < fIntervalNumber; i++ ) 403 414 { 404 415 if(fEnergyInterval[i+1]-fEnergyInterval[i] > 405 416 1.5*fDelta*(fEnergyInterval[i+1]+fEnergyInterval[i])) 406 417 { 407 continue 418 continue; 408 419 } 409 420 else 410 421 { 411 for( j=i;j<fIntervalNumber;j++)422 for( j = i; j < fIntervalNumber; j++ ) 412 423 { 413 fEnergyInterval[j] = fEnergyInterval[j+1] 414 fA1[j] = fA1[j+1] 415 fA2[j] = fA2[j+1] 416 fA3[j] = fA3[j+1] 417 fA4[j] = fA4[j+1] 424 fEnergyInterval[j] = fEnergyInterval[j+1]; 425 fA1[j] = fA1[j+1]; 426 fA2[j] = fA2[j+1]; 427 fA3[j] = fA3[j+1]; 428 fA4[j] = fA4[j+1]; 418 429 } 419 fIntervalNumber-- 420 i-- 430 fIntervalNumber--; 431 i--; 421 432 } 422 433 } 423 434 424 435 /* ********************************* 425 fSplineEnergy = new G4double[fMaxSplineSize] 426 fRePartDielectricConst = new G4double[fMaxSplineSize] 427 fImPartDielectricConst = new G4double[fMaxSplineSize] 428 fIntegralTerm = new G4double[fMaxSplineSize] 429 fDifPAIxSection = new G4double[fMaxSplineSize] 430 fIntegralPAIxSection = new G4double[fMaxSplineSize] 436 fSplineEnergy = new G4double[fMaxSplineSize]; 437 fRePartDielectricConst = new G4double[fMaxSplineSize]; 438 fImPartDielectricConst = new G4double[fMaxSplineSize]; 439 fIntegralTerm = new G4double[fMaxSplineSize]; 440 fDifPAIxSection = new G4double[fMaxSplineSize]; 441 fIntegralPAIxSection = new G4double[fMaxSplineSize]; 431 442 432 443 for(i=0;i<fMaxSplineSize;i++) 433 444 { 434 fSplineEnergy[i] = 0.0 435 fRePartDielectricConst[i] = 0.0 436 fImPartDielectricConst[i] = 0.0 437 fIntegralTerm[i] = 0.0 438 fDifPAIxSection[i] = 0.0 439 fIntegralPAIxSection[i] = 0.0 445 fSplineEnergy[i] = 0.0; 446 fRePartDielectricConst[i] = 0.0; 447 fImPartDielectricConst[i] = 0.0; 448 fIntegralTerm[i] = 0.0; 449 fDifPAIxSection[i] = 0.0; 450 fIntegralPAIxSection[i] = 0.0; 440 451 } 441 452 */ //////////////////////// … … 446 457 fLorentzFactor[fRefGammaNumber]*fLorentzFactor[fRefGammaNumber] - 1; 447 458 448 NormShift(betaGammaSqRef) 449 SplainPAI(betaGammaSqRef) 459 NormShift(betaGammaSqRef); 460 SplainPAI(betaGammaSqRef); 450 461 451 462 // Preparation of integral PAI cross section for input betaGammaSq 452 463 453 for(i = 1 ; i <= fSplineNumber; i++)464 for(i = 1; i <= fSplineNumber; i++) 454 465 { 455 466 fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq); 456 467 fdNdxCerenkov[i] = PAIdNdxCerenkov(i,betaGammaSq); 468 fdNdxMM[i] = PAIdNdxMM(i,betaGammaSq); 457 469 fdNdxPlasmon[i] = PAIdNdxPlasmon(i,betaGammaSq); 458 } 459 IntegralPAIxSection() ; 460 IntegralCerenkov() ; 461 IntegralPlasmon() ; 470 fdNdxResonance[i] = PAIdNdxResonance(i,betaGammaSq); 471 } 472 IntegralPAIxSection(); 473 IntegralCerenkov(); 474 IntegralMM(); 475 IntegralPlasmon(); 476 IntegralResonance(); 462 477 463 // delete[] fEnergyInterval 464 delete[] fA1 465 delete[] fA2 466 delete[] fA3 467 delete[] fA4 478 // delete[] fEnergyInterval; 479 delete[] fA1; 480 delete[] fA2; 481 delete[] fA3; 482 delete[] fA4; 468 483 } 469 484 … … 476 491 { 477 492 /* ************************ 478 delete[] fSplineEnergy 479 delete[] fRePartDielectricConst 480 delete[] fImPartDielectricConst 481 delete[] fIntegralTerm 482 delete[] fDifPAIxSection 483 delete[] fIntegralPAIxSection 493 delete[] fSplineEnergy ; 494 delete[] fRePartDielectricConst; 495 delete[] fImPartDielectricConst; 496 delete[] fIntegralTerm ; 497 delete[] fDifPAIxSection ; 498 delete[] fIntegralPAIxSection ; 484 499 */ //////////////////////// 485 500 } … … 492 507 void G4PAIxSection::InitPAI() 493 508 { 494 G4int i 509 G4int i; 495 510 G4double betaGammaSq = fLorentzFactor[fRefGammaNumber]* 496 511 fLorentzFactor[fRefGammaNumber] - 1; … … 498 513 // Preparation of integral PAI cross section for reference gamma 499 514 500 NormShift(betaGammaSq) ; 501 SplainPAI(betaGammaSq) ; 502 503 IntegralPAIxSection() ; 504 IntegralCerenkov() ; 505 IntegralPlasmon() ; 506 507 for(i = 0 ; i<=fSplineNumber ; i++) 508 { 509 fPAItable[i][fRefGammaNumber] = fIntegralPAIxSection[i] ; 515 NormShift(betaGammaSq); 516 SplainPAI(betaGammaSq); 517 518 IntegralPAIxSection(); 519 IntegralCerenkov(); 520 IntegralMM(); 521 IntegralPlasmon(); 522 IntegralResonance(); 523 524 for(i = 0; i<= fSplineNumber; i++) 525 { 526 fPAItable[i][fRefGammaNumber] = fIntegralPAIxSection[i]; 510 527 if(i != 0) 511 528 { 512 fPAItable[i][0] = fSplineEnergy[i] 513 } 514 } 515 fPAItable[0][0] = fSplineNumber 516 517 for(G4int j = 1 ; j < 112; j++) // for other gammas518 { 519 if( j == fRefGammaNumber ) continue 529 fPAItable[i][0] = fSplineEnergy[i]; 530 } 531 } 532 fPAItable[0][0] = fSplineNumber; 533 534 for(G4int j = 1; j < 112; j++) // for other gammas 535 { 536 if( j == fRefGammaNumber ) continue; 520 537 521 betaGammaSq = fLorentzFactor[j]*fLorentzFactor[j] - 1 538 betaGammaSq = fLorentzFactor[j]*fLorentzFactor[j] - 1; 522 539 523 for(i = 1 ; i <= fSplineNumber; i++)540 for(i = 1; i <= fSplineNumber; i++) 524 541 { 525 542 fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq); 526 543 fdNdxCerenkov[i] = PAIdNdxCerenkov(i,betaGammaSq); 544 fdNdxMM[i] = PAIdNdxMM(i,betaGammaSq); 527 545 fdNdxPlasmon[i] = PAIdNdxPlasmon(i,betaGammaSq); 528 } 529 IntegralPAIxSection() ; 530 IntegralCerenkov() ; 531 IntegralPlasmon() ; 546 fdNdxResonance[i] = PAIdNdxResonance(i,betaGammaSq); 547 } 548 IntegralPAIxSection(); 549 IntegralCerenkov(); 550 IntegralMM(); 551 IntegralPlasmon(); 552 IntegralResonance(); 532 553 533 for(i = 0 ; i <= fSplineNumber; i++)534 { 535 fPAItable[i][j] = fIntegralPAIxSection[i] 554 for(i = 0; i <= fSplineNumber; i++) 555 { 556 fPAItable[i][j] = fIntegralPAIxSection[i]; 536 557 } 537 558 } … … 546 567 void G4PAIxSection::NormShift(G4double betaGammaSq) 547 568 { 548 G4int i, j 549 550 for( i = 1 ; i <= fIntervalNumber-1; i++ )551 { 552 for( j = 1 ; j <= 2; j++ )569 G4int i, j; 570 571 for( i = 1; i <= fIntervalNumber-1; i++ ) 572 { 573 for( j = 1; j <= 2; j++ ) 553 574 { 554 fSplineNumber = (i-1)*2 + j 575 fSplineNumber = (i-1)*2 + j; 555 576 556 577 if( j == 1 ) fSplineEnergy[fSplineNumber] = fEnergyInterval[i ]*(1+fDelta); … … 562 583 fIntegralTerm[1]=RutherfordIntegral(1,fEnergyInterval[1],fSplineEnergy[1]); 563 584 564 j = 1 565 566 for( i=2;i<=fSplineNumber;i++)585 j = 1; 586 587 for( i = 2; i <= fSplineNumber; i++ ) 567 588 { 568 589 if(fSplineEnergy[i]<fEnergyInterval[j+1]) … … 570 591 fIntegralTerm[i] = fIntegralTerm[i-1] + 571 592 RutherfordIntegral(j,fSplineEnergy[i-1], 572 fSplineEnergy[i] ) 593 fSplineEnergy[i] ); 573 594 } 574 595 else 575 596 { 576 597 G4double x = RutherfordIntegral(j,fSplineEnergy[i-1], 577 fEnergyInterval[j+1] ) 598 fEnergyInterval[j+1] ); 578 599 j++; 579 600 fIntegralTerm[i] = fIntegralTerm[i-1] + x + 580 601 RutherfordIntegral(j,fEnergyInterval[j], 581 fSplineEnergy[i] ) 602 fSplineEnergy[i] ); 582 603 } 583 604 // G4cout<<i<<"\t"<<fSplineEnergy[i]<<"\t"<<fIntegralTerm[i]<<"\n"<<G4endl; 584 605 } 585 fNormalizationCof = 2*pi*pi*hbarc*hbarc*fine_structure_const/electron_mass_c2 586 fNormalizationCof *= fElectronDensity/fIntegralTerm[fSplineNumber] 587 588 // G4cout<<"fNormalizationCof = "<<fNormalizationCof<<G4endl 606 fNormalizationCof = 2*pi*pi*hbarc*hbarc*fine_structure_const/electron_mass_c2; 607 fNormalizationCof *= fElectronDensity/fIntegralTerm[fSplineNumber]; 608 609 // G4cout<<"fNormalizationCof = "<<fNormalizationCof<<G4endl; 589 610 590 611 // Calculation of PAI differrential cross-section (1/(keV*cm)) 591 612 // in the energy points near borders of energy intervals 592 613 593 for(G4int k =1;k<=fIntervalNumber-1;k++)594 { 595 for( j=1;j<=2;j++)596 { 597 i = (k-1)*2 + j 614 for(G4int k = 1; k <= fIntervalNumber-1; k++ ) 615 { 616 for( j = 1; j <= 2; j++ ) 617 { 618 i = (k-1)*2 + j; 598 619 fImPartDielectricConst[i] = fNormalizationCof* 599 620 ImPartDielectricConst(k,fSplineEnergy[i]); … … 604 625 fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq); 605 626 fdNdxCerenkov[i] = PAIdNdxCerenkov(i,betaGammaSq); 627 fdNdxMM[i] = PAIdNdxMM(i,betaGammaSq); 606 628 fdNdxPlasmon[i] = PAIdNdxPlasmon(i,betaGammaSq); 629 fdNdxResonance[i] = PAIdNdxResonance(i,betaGammaSq); 607 630 } 608 631 } … … 616 639 // linear approximation would be smaller than 'fError' 617 640 618 void 619 G4PAIxSection::SplainPAI(G4double betaGammaSq) 641 void G4PAIxSection::SplainPAI(G4double betaGammaSq) 620 642 { 621 G4int k = 1 622 G4int i = 1 643 G4int k = 1; 644 G4int i = 1; 623 645 624 646 while ( (i < fSplineNumber) && (fSplineNumber < fMaxSplineSize-1) ) … … 626 648 if(fSplineEnergy[i+1] > fEnergyInterval[k+1]) 627 649 { 628 k++ 650 k++; // Here next energy point is in next energy interval 629 651 i++; 630 652 continue; … … 634 656 fSplineNumber++; 635 657 636 for(G4int j = fSplineNumber; j >= i+2 658 for(G4int j = fSplineNumber; j >= i+2; j-- ) 637 659 { 638 660 fSplineEnergy[j] = fSplineEnergy[j-1]; … … 643 665 fDifPAIxSection[j] = fDifPAIxSection[j-1]; 644 666 fdNdxCerenkov[j] = fdNdxCerenkov[j-1]; 667 fdNdxMM[j] = fdNdxMM[j-1]; 645 668 fdNdxPlasmon[j] = fdNdxPlasmon[j-1]; 669 fdNdxResonance[j] = fdNdxResonance[j-1]; 646 670 } 647 671 G4double x1 = fSplineEnergy[i]; … … 658 682 G4double a = log10(y2/yy1)/log10(x2/x1); 659 683 G4double b = log10(yy1) - a*log10(x1); 660 G4double y = a*log10(en1) + b 684 G4double y = a*log10(en1) + b; 661 685 y = pow(10.,y); 662 686 … … 673 697 fDifPAIxSection[i+1] = DifPAIxSection(i+1,betaGammaSq); 674 698 fdNdxCerenkov[i+1] = PAIdNdxCerenkov(i+1,betaGammaSq); 699 fdNdxMM[i+1] = PAIdNdxMM(i+1,betaGammaSq); 675 700 fdNdxPlasmon[i+1] = PAIdNdxPlasmon(i+1,betaGammaSq); 701 fdNdxResonance[i+1] = PAIdNdxResonance(i+1,betaGammaSq); 676 702 677 703 // Condition for next division of this segment or to pass … … 682 708 if( x < 0 ) 683 709 { 684 x = -x 710 x = -x; 685 711 } 686 712 if( x > fError && fSplineNumber < fMaxSplineSize-1 ) … … 704 730 G4double x2 ) 705 731 { 706 G4double c1, c2, c3 732 G4double c1, c2, c3; 707 733 // G4cout<<"RI: x1 = "<<x1<<"; "<<"x2 = "<<x2<<G4endl; 708 c1 = (x2 - x1)/x1/x2 709 c2 = (x2 - x1)*(x2 + x1)/x1/x1/x2/x2 710 c3 = (x2 - x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2 734 c1 = (x2 - x1)/x1/x2; 735 c2 = (x2 - x1)*(x2 + x1)/x1/x1/x2/x2; 736 c3 = (x2 - x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2; 711 737 // G4cout<<" RI: c1 = "<<c1<<"; "<<"c2 = "<<c2<<"; "<<"c3 = "<<c3<<G4endl; 712 738 713 return fA1[k]*log(x2/x1) + fA2[k]*c1 + fA3[k]*c2/2 + fA4[k]*c3/3 739 return fA1[k]*log(x2/x1) + fA2[k]*c1 + fA3[k]*c2/2 + fA4[k]*c3/3; 714 740 715 741 } // end of RutherfordIntegral … … 730 756 energy4 = energy3*energy1; 731 757 732 result = fA1[k]/energy1+fA2[k]/energy2+fA3[k]/energy3+fA4[k]/energy4 733 result *=hbarc/energy1 734 735 return result 758 result = fA1[k]/energy1+fA2[k]/energy2+fA3[k]/energy3+fA4[k]/energy4; 759 result *=hbarc/energy1; 760 761 return result; 736 762 737 763 } // end of ImPartDielectricConst 738 764 765 ///////////////////////////////////////////////////////////////// 766 // 767 // Returns lambda of photon with energy1 in current material 768 769 G4double G4PAIxSection::GetPhotonRange( G4double energy1 ) 770 { 771 G4int i; 772 G4double energy2, energy3, energy4, result, lambda; 773 774 energy2 = energy1*energy1; 775 energy3 = energy2*energy1; 776 energy4 = energy3*energy1; 777 778 // G4double* SandiaCof = fSandia->GetSandiaCofForMaterialPAI(energy1); 779 // result = SandiaCof[0]/energy1+SandiaCof[1]/energy2+SandiaCof[2]/energy3+SandiaCof[3]/energy4; 780 // result *= fDensity; 781 782 for( i = 1; i <= fIntervalNumber; i++ ) 783 { 784 if( energy1 < fEnergyInterval[i]) break; 785 } 786 i--; 787 if(i == 0) i = 1; 788 789 result = fA1[i]/energy1+fA2[i]/energy2+fA3[i]/energy3+fA4[i]/energy4; 790 791 if( result > DBL_MIN ) lambda = 1./result; 792 else lambda = DBL_MAX; 793 794 return lambda; 795 } 796 797 ///////////////////////////////////////////////////////////////// 798 // 799 // Return lambda of electron with energy1 in current material 800 // parametrisation from NIM A554(2005)474-493 801 802 G4double G4PAIxSection::GetElectronRange( G4double energy ) 803 { 804 G4double range; 805 /* 806 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); 807 808 G4double Z = (*theMaterialTable)[fMaterialIndex]->GetIonisation()->GetZeffective(); 809 G4double A = (*theMaterialTable)[fMaterialIndex]->GetA(); 810 811 energy /= keV; // energy in keV in parametrised formula 812 813 if (energy < 10.) 814 { 815 range = 3.872e-3*A/Z; 816 range *= pow(energy,1.492); 817 } 818 else 819 { 820 range = 6.97e-3*pow(energy,1.6); 821 } 822 */ 823 // Blum&Rolandi Particle Detection with Drift Chambers, p. 7 824 825 G4double cofA = 5.37e-4*g/cm2/keV; 826 G4double cofB = 0.9815; 827 G4double cofC = 3.123e-3/keV; 828 // energy /= keV; 829 830 range = cofA*energy*( 1 - cofB/(1 + cofC*energy) ); 831 832 // range *= g/cm2; 833 range /= fDensity; 834 835 return range; 836 } 739 837 740 838 ////////////////////////////////////////////////////////////////////////////// … … 747 845 { 748 846 G4double x0, x02, x03, x04, x05, x1, x2, xx1 ,xx2 , xx12, 749 c1, c2, c3, cof1, cof2, xln1, xln2, xln3, result 750 751 x0 = enb 752 result = 0 847 c1, c2, c3, cof1, cof2, xln1, xln2, xln3, result; 848 849 x0 = enb; 850 result = 0; 753 851 754 852 for(G4int i=1;i<=fIntervalNumber-1;i++) 755 853 { 756 x1 = fEnergyInterval[i] 757 x2 = fEnergyInterval[i+1] 758 xx1 = x1 - x0 759 xx2 = x2 - x0 760 xx12 = xx2/xx1 854 x1 = fEnergyInterval[i]; 855 x2 = fEnergyInterval[i+1]; 856 xx1 = x1 - x0; 857 xx2 = x2 - x0; 858 xx12 = xx2/xx1; 761 859 762 860 if(xx12<0) … … 764 862 xx12 = -xx12; 765 863 } 766 xln1 = log(x2/x1) 767 xln2 = log(xx12) 768 xln3 = log((x2 + x0)/(x1 + x0)) 769 x02 = x0*x0 770 x03 = x02*x0 771 x04 = x03*x0 864 xln1 = log(x2/x1); 865 xln2 = log(xx12); 866 xln3 = log((x2 + x0)/(x1 + x0)); 867 x02 = x0*x0; 868 x03 = x02*x0; 869 x04 = x03*x0; 772 870 x05 = x04*x0; 773 c1 = (x2 - x1)/x1/x2 774 c2 = (x2 - x1)*(x2 +x1)/x1/x1/x2/x2 775 c3 = (x2 -x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2 776 777 result -= (fA1[i]/x02 + fA3[i]/x04)*xln1 778 result -= (fA2[i]/x02 + fA4[i]/x04)*c1 779 result -= fA3[i]*c2/2/x02 780 result -= fA4[i]*c3/3/x02 781 782 cof1 = fA1[i]/x02 + fA3[i]/x04 783 cof2 = fA2[i]/x03 + fA4[i]/x05 784 785 result += 0.5*(cof1 +cof2)*xln2 786 result += 0.5*(cof1 - cof2)*xln3 871 c1 = (x2 - x1)/x1/x2; 872 c2 = (x2 - x1)*(x2 +x1)/x1/x1/x2/x2; 873 c3 = (x2 -x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2; 874 875 result -= (fA1[i]/x02 + fA3[i]/x04)*xln1; 876 result -= (fA2[i]/x02 + fA4[i]/x04)*c1; 877 result -= fA3[i]*c2/2/x02; 878 result -= fA4[i]*c3/3/x02; 879 880 cof1 = fA1[i]/x02 + fA3[i]/x04; 881 cof2 = fA2[i]/x03 + fA4[i]/x05; 882 883 result += 0.5*(cof1 +cof2)*xln2; 884 result += 0.5*(cof1 - cof2)*xln3; 787 885 } 788 result *= 2*hbarc/pi 789 790 return result 886 result *= 2*hbarc/pi; 887 888 return result; 791 889 792 890 } // end of RePartDielectricConst … … 801 899 G4double betaGammaSq ) 802 900 { 803 G4double be2,cof,x1,x2,x3,x4,x5,x6,x7,x8,result 804 //G4double beta, be4 805 G4double be4 806 G4double betaBohr2 = fine_structure_const*fine_structure_const 807 G4double betaBohr4 = betaBohr2*betaBohr2*4.0 808 be2 = betaGammaSq/(1 + betaGammaSq) 809 be4 = be2*be2 810 // beta = sqrt(be2) 811 cof = 1 812 x1 = log(2*electron_mass_c2/fSplineEnergy[i]) 813 814 if( betaGammaSq < 0.01 ) x2 = log(be2) 901 G4double be2,cof,x1,x2,x3,x4,x5,x6,x7,x8,result; 902 //G4double beta, be4; 903 G4double be4; 904 G4double betaBohr2 = fine_structure_const*fine_structure_const; 905 G4double betaBohr4 = betaBohr2*betaBohr2*4.0; 906 be2 = betaGammaSq/(1 + betaGammaSq); 907 be4 = be2*be2; 908 // beta = sqrt(be2); 909 cof = 1; 910 x1 = log(2*electron_mass_c2/fSplineEnergy[i]); 911 912 if( betaGammaSq < 0.01 ) x2 = log(be2); 815 913 else 816 914 { 817 915 x2 = -log( (1/betaGammaSq - fRePartDielectricConst[i])* 818 916 (1/betaGammaSq - fRePartDielectricConst[i]) + 819 fImPartDielectricConst[i]*fImPartDielectricConst[i] )/2 917 fImPartDielectricConst[i]*fImPartDielectricConst[i] )/2; 820 918 } 821 919 if( fImPartDielectricConst[i] == 0.0 ||betaGammaSq < 0.01 ) 822 920 { 823 x6=0 921 x6=0; 824 922 } 825 923 else 826 924 { 827 x3 = -fRePartDielectricConst[i] + 1/betaGammaSq 925 x3 = -fRePartDielectricConst[i] + 1/betaGammaSq; 828 926 x5 = -1 - fRePartDielectricConst[i] + 829 927 be2*((1 +fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) + 830 fImPartDielectricConst[i]*fImPartDielectricConst[i]) 831 832 x7 = atan2(fImPartDielectricConst[i],x3) 833 x6 = x5 * x7 834 } 835 // if(fImPartDielectricConst[i] == 0) x6 = 0 836 837 x4 = ((x1 + x2)*fImPartDielectricConst[i] + x6)/hbarc 838 // if( x4 < 0.0 ) x4 = 0.0 928 fImPartDielectricConst[i]*fImPartDielectricConst[i]); 929 930 x7 = atan2(fImPartDielectricConst[i],x3); 931 x6 = x5 * x7; 932 } 933 // if(fImPartDielectricConst[i] == 0) x6 = 0; 934 935 x4 = ((x1 + x2)*fImPartDielectricConst[i] + x6)/hbarc; 936 // if( x4 < 0.0 ) x4 = 0.0; 839 937 x8 = (1 + fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) + 840 fImPartDielectricConst[i]*fImPartDielectricConst[i] 841 842 result = (x4 + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i]) 843 if(result < 1.0e-8) result = 1.0e-8 844 result *= fine_structure_const/be2/pi 845 // result *= (1-exp(-beta/betaBohr))*(1-exp(-beta/betaBohr)) 846 // result *= (1-exp(-be2/betaBohr2)) 847 result *= (1-exp(-be4/betaBohr4)) 938 fImPartDielectricConst[i]*fImPartDielectricConst[i]; 939 940 result = (x4 + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i]); 941 if(result < 1.0e-8) result = 1.0e-8; 942 result *= fine_structure_const/be2/pi; 943 // result *= (1-exp(-beta/betaBohr))*(1-exp(-beta/betaBohr)); 944 // result *= (1-exp(-be2/betaBohr2)); 945 result *= (1-exp(-be4/betaBohr4)); 848 946 if(fDensity >= 0.1) 849 947 { 850 result /= x8 851 } 852 return result 948 result /= x8; 949 } 950 return result; 853 951 854 952 } // end of DifPAIxSection … … 861 959 G4double betaGammaSq ) 862 960 { 863 G4double cof, logarithm, x3, x5, argument, modul2, dNdxC ; 864 G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr ; 865 866 cof = 1.0 ; 867 cofBetaBohr = 4.0 ; 868 betaBohr2 = fine_structure_const*fine_structure_const ; 869 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr ; 870 871 be2 = betaGammaSq/(1 + betaGammaSq) ; 872 be4 = be2*be2 ; 873 874 if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq) ; // 0.0 ; 961 G4double logarithm, x3, x5, argument, modul2, dNdxC; 962 G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr; 963 964 cofBetaBohr = 4.0; 965 betaBohr2 = fine_structure_const*fine_structure_const; 966 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr; 967 968 be2 = betaGammaSq/(1 + betaGammaSq); 969 be4 = be2*be2; 970 971 if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq); // 0.0; 875 972 else 876 973 { 877 974 logarithm = -log( (1/betaGammaSq - fRePartDielectricConst[i])* 878 975 (1/betaGammaSq - fRePartDielectricConst[i]) + 879 fImPartDielectricConst[i]*fImPartDielectricConst[i] )*0.5 880 logarithm += log(1+1.0/betaGammaSq) 976 fImPartDielectricConst[i]*fImPartDielectricConst[i] )*0.5; 977 logarithm += log(1+1.0/betaGammaSq); 881 978 } 882 979 883 980 if( fImPartDielectricConst[i] == 0.0 || betaGammaSq < 0.01 ) 884 981 { 885 argument = 0.0 982 argument = 0.0; 886 983 } 887 984 else 888 985 { 889 x3 = -fRePartDielectricConst[i] + 1.0/betaGammaSq 986 x3 = -fRePartDielectricConst[i] + 1.0/betaGammaSq; 890 987 x5 = -1.0 - fRePartDielectricConst[i] + 891 988 be2*((1.0 +fRePartDielectricConst[i])*(1.0 + fRePartDielectricConst[i]) + 892 fImPartDielectricConst[i]*fImPartDielectricConst[i]) 989 fImPartDielectricConst[i]*fImPartDielectricConst[i]); 893 990 if( x3 == 0.0 ) argument = 0.5*pi; 894 else argument = atan2(fImPartDielectricConst[i],x3) 895 argument *= x5 991 else argument = atan2(fImPartDielectricConst[i],x3); 992 argument *= x5 ; 896 993 } 897 dNdxC = ( logarithm*fImPartDielectricConst[i] + argument )/hbarc 994 dNdxC = ( logarithm*fImPartDielectricConst[i] + argument )/hbarc; 898 995 899 if(dNdxC < 1.0e-8) dNdxC = 1.0e-8 900 901 dNdxC *= fine_structure_const/be2/pi 902 903 dNdxC *= (1-exp(-be4/betaBohr4)) 996 if(dNdxC < 1.0e-8) dNdxC = 1.0e-8; 997 998 dNdxC *= fine_structure_const/be2/pi; 999 1000 dNdxC *= (1-exp(-be4/betaBohr4)); 904 1001 905 1002 if(fDensity >= 0.1) 906 1003 { 907 1004 modul2 = (1.0 + fRePartDielectricConst[i])*(1.0 + fRePartDielectricConst[i]) + 908 fImPartDielectricConst[i]*fImPartDielectricConst[i] 909 dNdxC /= modul2 910 } 911 return dNdxC 1005 fImPartDielectricConst[i]*fImPartDielectricConst[i]; 1006 dNdxC /= modul2; 1007 } 1008 return dNdxC; 912 1009 913 1010 } // end of PAIdNdxCerenkov 1011 1012 ////////////////////////////////////////////////////////////////////////// 1013 // 1014 // Calculation od dN/dx of collisions of MM with creation of Cerenkov pseudo-photons 1015 1016 G4double G4PAIxSection::PAIdNdxMM( G4int i , 1017 G4double betaGammaSq ) 1018 { 1019 G4double logarithm, x3, x5, argument, dNdxC; 1020 G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr; 1021 1022 cofBetaBohr = 4.0; 1023 betaBohr2 = fine_structure_const*fine_structure_const; 1024 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr; 1025 1026 be2 = betaGammaSq/(1 + betaGammaSq); 1027 be4 = be2*be2; 1028 1029 if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq); // 0.0; 1030 else 1031 { 1032 logarithm = -log( (1/betaGammaSq - fRePartDielectricConst[i])* 1033 (1/betaGammaSq - fRePartDielectricConst[i]) + 1034 fImPartDielectricConst[i]*fImPartDielectricConst[i] )*0.5; 1035 logarithm += log(1+1.0/betaGammaSq); 1036 } 1037 1038 if( fImPartDielectricConst[i] == 0.0 || betaGammaSq < 0.01 ) 1039 { 1040 argument = 0.0; 1041 } 1042 else 1043 { 1044 x3 = -fRePartDielectricConst[i] + 1.0/betaGammaSq; 1045 x5 = be2*( 1.0 + fRePartDielectricConst[i] ) - 1.0; 1046 if( x3 == 0.0 ) argument = 0.5*pi; 1047 else argument = atan2(fImPartDielectricConst[i],x3); 1048 argument *= x5 ; 1049 } 1050 dNdxC = ( logarithm*fImPartDielectricConst[i]*be2 + argument )/hbarc; 1051 1052 if(dNdxC < 1.0e-8) dNdxC = 1.0e-8; 1053 1054 dNdxC *= fine_structure_const/be2/pi; 1055 1056 dNdxC *= (1-exp(-be4/betaBohr4)); 1057 return dNdxC; 1058 1059 } // end of PAIdNdxMM 914 1060 915 1061 ////////////////////////////////////////////////////////////////////////// … … 921 1067 G4double betaGammaSq ) 922 1068 { 923 G4double cof, resonance, modul2, dNdxP;924 G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr 925 926 cof = 1 ;927 cofBetaBohr = 4.0 928 betaBohr2 = fine_structure_const*fine_structure_const 929 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr 930 931 be2 = betaGammaSq/(1 + betaGammaSq) 932 be4 = be2*be2 1069 G4double resonance, modul2, dNdxP, cof = 1.; 1070 G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr; 1071 1072 1073 cofBetaBohr = 4.0; 1074 betaBohr2 = fine_structure_const*fine_structure_const; 1075 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr; 1076 1077 be2 = betaGammaSq/(1 + betaGammaSq); 1078 be4 = be2*be2; 933 1079 934 resonance = log(2*electron_mass_c2*be2/fSplineEnergy[i]) 935 resonance *= fImPartDielectricConst[i]/hbarc 936 937 938 dNdxP = ( resonance + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i] ) 939 940 if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8 941 942 dNdxP *= fine_structure_const/be2/pi 943 dNdxP *= (1-exp(-be4/betaBohr4)) 1080 resonance = log(2*electron_mass_c2*be2/fSplineEnergy[i]); 1081 resonance *= fImPartDielectricConst[i]/hbarc; 1082 1083 1084 dNdxP = ( resonance + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i] ); 1085 1086 if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8; 1087 1088 dNdxP *= fine_structure_const/be2/pi; 1089 dNdxP *= (1-exp(-be4/betaBohr4)); 944 1090 945 1091 if( fDensity >= 0.1 ) 946 1092 { 947 1093 modul2 = (1 + fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) + 948 fImPartDielectricConst[i]*fImPartDielectricConst[i] 949 dNdxP /= modul2 950 } 951 return dNdxP 1094 fImPartDielectricConst[i]*fImPartDielectricConst[i]; 1095 dNdxP /= modul2; 1096 } 1097 return dNdxP; 952 1098 953 1099 } // end of PAIdNdxPlasmon 1100 1101 ////////////////////////////////////////////////////////////////////////// 1102 // 1103 // Calculation od dN/dx of collisions with creation of longitudinal EM 1104 // resonance excitations (plasmons, delta-electrons) 1105 1106 G4double G4PAIxSection::PAIdNdxResonance( G4int i , 1107 G4double betaGammaSq ) 1108 { 1109 G4double resonance, modul2, dNdxP; 1110 G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr; 1111 1112 cofBetaBohr = 4.0; 1113 betaBohr2 = fine_structure_const*fine_structure_const; 1114 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr; 1115 1116 be2 = betaGammaSq/(1 + betaGammaSq); 1117 be4 = be2*be2; 1118 1119 resonance = log(2*electron_mass_c2*be2/fSplineEnergy[i]); 1120 resonance *= fImPartDielectricConst[i]/hbarc; 1121 1122 1123 dNdxP = resonance; 1124 1125 if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8; 1126 1127 dNdxP *= fine_structure_const/be2/pi; 1128 dNdxP *= (1-exp(-be4/betaBohr4)); 1129 1130 if( fDensity >= 0.1 ) 1131 { 1132 modul2 = (1 + fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) + 1133 fImPartDielectricConst[i]*fImPartDielectricConst[i]; 1134 dNdxP /= modul2; 1135 } 1136 return dNdxP; 1137 1138 } // end of PAIdNdxResonance 954 1139 955 1140 //////////////////////////////////////////////////////////////////////// … … 961 1146 void G4PAIxSection::IntegralPAIxSection() 962 1147 { 963 fIntegralPAIxSection[fSplineNumber] = 0 964 fIntegralPAIdEdx[fSplineNumber] = 0 965 fIntegralPAIxSection[0] = 0 966 G4int k = fIntervalNumber -1 967 968 for(G4int i = fSplineNumber-1 ; i >= 1; i--)1148 fIntegralPAIxSection[fSplineNumber] = 0; 1149 fIntegralPAIdEdx[fSplineNumber] = 0; 1150 fIntegralPAIxSection[0] = 0; 1151 G4int k = fIntervalNumber -1; 1152 1153 for(G4int i = fSplineNumber-1; i >= 1; i--) 969 1154 { 970 1155 if(fSplineEnergy[i] >= fEnergyInterval[k]) 971 1156 { 972 fIntegralPAIxSection[i] = fIntegralPAIxSection[i+1] + SumOverInterval(i) 973 fIntegralPAIdEdx[i] = fIntegralPAIdEdx[i+1] + SumOverIntervaldEdx(i) 1157 fIntegralPAIxSection[i] = fIntegralPAIxSection[i+1] + SumOverInterval(i); 1158 fIntegralPAIdEdx[i] = fIntegralPAIdEdx[i+1] + SumOverIntervaldEdx(i); 974 1159 } 975 1160 else 976 1161 { 977 1162 fIntegralPAIxSection[i] = fIntegralPAIxSection[i+1] + 978 SumOverBorder(i+1,fEnergyInterval[k]) 1163 SumOverBorder(i+1,fEnergyInterval[k]); 979 1164 fIntegralPAIdEdx[i] = fIntegralPAIdEdx[i+1] + 980 SumOverBorderdEdx(i+1,fEnergyInterval[k]) 981 k-- 1165 SumOverBorderdEdx(i+1,fEnergyInterval[k]); 1166 k--; 982 1167 } 983 1168 } … … 992 1177 void G4PAIxSection::IntegralCerenkov() 993 1178 { 994 G4int i, k 995 fIntegralCerenkov[fSplineNumber] = 0 996 fIntegralCerenkov[0] = 0 997 k = fIntervalNumber -1 998 999 for( i = fSplineNumber-1 ; i >= 1; i-- )1179 G4int i, k; 1180 fIntegralCerenkov[fSplineNumber] = 0; 1181 fIntegralCerenkov[0] = 0; 1182 k = fIntervalNumber -1; 1183 1184 for( i = fSplineNumber-1; i >= 1; i-- ) 1000 1185 { 1001 1186 if(fSplineEnergy[i] >= fEnergyInterval[k]) 1002 1187 { 1003 fIntegralCerenkov[i] = fIntegralCerenkov[i+1] + SumOverInterCerenkov(i) 1188 fIntegralCerenkov[i] = fIntegralCerenkov[i+1] + SumOverInterCerenkov(i); 1004 1189 // G4cout<<"int: i = "<<i<<"; sumC = "<<fIntegralCerenkov[i]<<G4endl; 1005 1190 } … … 1007 1192 { 1008 1193 fIntegralCerenkov[i] = fIntegralCerenkov[i+1] + 1009 SumOverBordCerenkov(i+1,fEnergyInterval[k]) 1010 k-- 1194 SumOverBordCerenkov(i+1,fEnergyInterval[k]); 1195 k--; 1011 1196 // G4cout<<"bord: i = "<<i<<"; sumC = "<<fIntegralCerenkov[i]<<G4endl; 1012 1197 } … … 1014 1199 1015 1200 } // end of IntegralCerenkov 1201 1202 //////////////////////////////////////////////////////////////////////// 1203 // 1204 // Calculation of the PAI MM-Cerenkov integral cross-section 1205 // fIntegralMM[1] = specific MM-Cerenkov ionisation, 1/cm 1206 // and fIntegralMM[0] = mean MM-Cerenkov loss per cm in keV/cm 1207 1208 void G4PAIxSection::IntegralMM() 1209 { 1210 G4int i, k; 1211 fIntegralMM[fSplineNumber] = 0; 1212 fIntegralMM[0] = 0; 1213 k = fIntervalNumber -1; 1214 1215 for( i = fSplineNumber-1; i >= 1; i-- ) 1216 { 1217 if(fSplineEnergy[i] >= fEnergyInterval[k]) 1218 { 1219 fIntegralMM[i] = fIntegralMM[i+1] + SumOverInterMM(i); 1220 // G4cout<<"int: i = "<<i<<"; sumC = "<<fIntegralMM[i]<<G4endl; 1221 } 1222 else 1223 { 1224 fIntegralMM[i] = fIntegralMM[i+1] + 1225 SumOverBordMM(i+1,fEnergyInterval[k]); 1226 k--; 1227 // G4cout<<"bord: i = "<<i<<"; sumC = "<<fIntegralMM[i]<<G4endl; 1228 } 1229 } 1230 1231 } // end of IntegralMM 1016 1232 1017 1233 //////////////////////////////////////////////////////////////////////// … … 1023 1239 void G4PAIxSection::IntegralPlasmon() 1024 1240 { 1025 fIntegralPlasmon[fSplineNumber] = 0 1026 fIntegralPlasmon[0] = 0 1027 G4int k = fIntervalNumber -1 1241 fIntegralPlasmon[fSplineNumber] = 0; 1242 fIntegralPlasmon[0] = 0; 1243 G4int k = fIntervalNumber -1; 1028 1244 for(G4int i=fSplineNumber-1;i>=1;i--) 1029 1245 { 1030 1246 if(fSplineEnergy[i] >= fEnergyInterval[k]) 1031 1247 { 1032 fIntegralPlasmon[i] = fIntegralPlasmon[i+1] + SumOverInterPlasmon(i) 1248 fIntegralPlasmon[i] = fIntegralPlasmon[i+1] + SumOverInterPlasmon(i); 1033 1249 } 1034 1250 else 1035 1251 { 1036 1252 fIntegralPlasmon[i] = fIntegralPlasmon[i+1] + 1037 SumOverBordPlasmon(i+1,fEnergyInterval[k]) 1038 k-- 1253 SumOverBordPlasmon(i+1,fEnergyInterval[k]); 1254 k--; 1039 1255 } 1040 1256 } 1041 1257 1042 1258 } // end of IntegralPlasmon 1259 1260 //////////////////////////////////////////////////////////////////////// 1261 // 1262 // Calculation of the PAI resonance integral cross-section 1263 // fIntegralResonance[1] = resonance primary ionisation, 1/cm 1264 // and fIntegralResonance[0] = mean resonance loss per cm in keV/cm 1265 1266 void G4PAIxSection::IntegralResonance() 1267 { 1268 fIntegralResonance[fSplineNumber] = 0; 1269 fIntegralResonance[0] = 0; 1270 G4int k = fIntervalNumber -1; 1271 for(G4int i=fSplineNumber-1;i>=1;i--) 1272 { 1273 if(fSplineEnergy[i] >= fEnergyInterval[k]) 1274 { 1275 fIntegralResonance[i] = fIntegralResonance[i+1] + SumOverInterResonance(i); 1276 } 1277 else 1278 { 1279 fIntegralResonance[i] = fIntegralResonance[i+1] + 1280 SumOverBordResonance(i+1,fEnergyInterval[k]); 1281 k--; 1282 } 1283 } 1284 1285 } // end of IntegralResonance 1043 1286 1044 1287 ////////////////////////////////////////////////////////////////////// … … 1050 1293 G4double G4PAIxSection::SumOverInterval( G4int i ) 1051 1294 { 1052 G4double x0,x1,y0,yy1,a,b,c,result 1053 1054 x0 = fSplineEnergy[i] 1055 x1 = fSplineEnergy[i+1] 1056 y0 = fDifPAIxSection[i] 1295 G4double x0,x1,y0,yy1,a,b,c,result; 1296 1297 x0 = fSplineEnergy[i]; 1298 x1 = fSplineEnergy[i+1]; 1299 y0 = fDifPAIxSection[i]; 1057 1300 yy1 = fDifPAIxSection[i+1]; 1058 1301 c = x1/x0; 1059 a = log10(yy1/y0)/log10(c) 1060 // b = log10(y0) - a*log10(x0) 1061 b = y0/pow(x0,a) 1062 a += 1 1302 a = log10(yy1/y0)/log10(c); 1303 // b = log10(y0) - a*log10(x0); 1304 b = y0/pow(x0,a); 1305 a += 1; 1063 1306 if(a == 0) 1064 1307 { 1065 result = b*log(x1/x0) 1308 result = b*log(x1/x0); 1066 1309 } 1067 1310 else 1068 1311 { 1069 result = y0*(x1*pow(c,a-1) - x0)/a 1312 result = y0*(x1*pow(c,a-1) - x0)/a; 1070 1313 } 1071 1314 a++; 1072 1315 if(a == 0) 1073 1316 { 1074 fIntegralPAIxSection[0] += b*log(x1/x0) 1317 fIntegralPAIxSection[0] += b*log(x1/x0); 1075 1318 } 1076 1319 else 1077 1320 { 1078 fIntegralPAIxSection[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a 1079 } 1080 return result 1321 fIntegralPAIxSection[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a; 1322 } 1323 return result; 1081 1324 1082 1325 } // end of SumOverInterval … … 1086 1329 G4double G4PAIxSection::SumOverIntervaldEdx( G4int i ) 1087 1330 { 1088 G4double x0,x1,y0,yy1,a,b,c,result 1089 1090 x0 = fSplineEnergy[i] 1091 x1 = fSplineEnergy[i+1] 1092 y0 = fDifPAIxSection[i] 1331 G4double x0,x1,y0,yy1,a,b,c,result; 1332 1333 x0 = fSplineEnergy[i]; 1334 x1 = fSplineEnergy[i+1]; 1335 y0 = fDifPAIxSection[i]; 1093 1336 yy1 = fDifPAIxSection[i+1]; 1094 1337 c = x1/x0; 1095 a = log10(yy1/y0)/log10(c) 1096 // b = log10(y0) - a*log10(x0) 1097 b = y0/pow(x0,a) 1098 a += 2 1338 a = log10(yy1/y0)/log10(c); 1339 // b = log10(y0) - a*log10(x0); 1340 b = y0/pow(x0,a); 1341 a += 2; 1099 1342 if(a == 0) 1100 1343 { 1101 result = b*log(x1/x0) 1344 result = b*log(x1/x0); 1102 1345 } 1103 1346 else 1104 1347 { 1105 result = y0*(x1*x1*pow(c,a-2) - x0*x0)/a 1106 } 1107 return result 1348 result = y0*(x1*x1*pow(c,a-2) - x0*x0)/a; 1349 } 1350 return result; 1108 1351 1109 1352 } // end of SumOverInterval … … 1117 1360 G4double G4PAIxSection::SumOverInterCerenkov( G4int i ) 1118 1361 { 1119 G4double x0,x1,y0,yy1,a,b,c,result 1120 1121 x0 = fSplineEnergy[i] 1122 x1 = fSplineEnergy[i+1] 1123 y0 = fdNdxCerenkov[i] 1362 G4double x0,x1,y0,yy1,a,b,c,result; 1363 1364 x0 = fSplineEnergy[i]; 1365 x1 = fSplineEnergy[i+1]; 1366 y0 = fdNdxCerenkov[i]; 1124 1367 yy1 = fdNdxCerenkov[i+1]; 1125 1368 // G4cout<<"SumC, i = "<<i<<"; x0 ="<<x0<<"; x1 = "<<x1 … … 1127 1370 1128 1371 c = x1/x0; 1129 a = log10(yy1/y0)/log10(c) 1130 b = y0/pow(x0,a) 1131 1132 a += 1.0 1133 if(a == 0) result = b*log(c) 1134 else result = y0*(x1*pow(c,a-1) - x0)/a 1135 a += 1.0 1136 1137 if( a == 0 ) fIntegralCerenkov[0] += b*log(x1/x0) 1138 else fIntegralCerenkov[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a 1372 a = log10(yy1/y0)/log10(c); 1373 b = y0/pow(x0,a); 1374 1375 a += 1.0; 1376 if(a == 0) result = b*log(c); 1377 else result = y0*(x1*pow(c,a-1) - x0)/a; 1378 a += 1.0; 1379 1380 if( a == 0 ) fIntegralCerenkov[0] += b*log(x1/x0); 1381 else fIntegralCerenkov[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a; 1139 1382 // G4cout<<"a = "<<a<<"; b = "<<b<<"; result = "<<result<<G4endl; 1140 return result 1383 return result; 1141 1384 1142 1385 } // end of SumOverInterCerenkov 1386 1387 ////////////////////////////////////////////////////////////////////// 1388 // 1389 // Calculation the PAI MM-Cerenkov integral cross-section inside 1390 // of interval of continuous values of photo-ionisation Cerenkov 1391 // cross-section. Parameter 'i' is the number of interval. 1392 1393 G4double G4PAIxSection::SumOverInterMM( G4int i ) 1394 { 1395 G4double x0,x1,y0,yy1,a,b,c,result; 1396 1397 x0 = fSplineEnergy[i]; 1398 x1 = fSplineEnergy[i+1]; 1399 y0 = fdNdxMM[i]; 1400 yy1 = fdNdxMM[i+1]; 1401 // G4cout<<"SumC, i = "<<i<<"; x0 ="<<x0<<"; x1 = "<<x1 1402 // <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl; 1403 1404 c = x1/x0; 1405 a = log10(yy1/y0)/log10(c); 1406 b = y0/pow(x0,a); 1407 1408 a += 1.0; 1409 if(a == 0) result = b*log(c); 1410 else result = y0*(x1*pow(c,a-1) - x0)/a; 1411 a += 1.0; 1412 1413 if( a == 0 ) fIntegralMM[0] += b*log(x1/x0); 1414 else fIntegralMM[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a; 1415 // G4cout<<"a = "<<a<<"; b = "<<b<<"; result = "<<result<<G4endl; 1416 return result; 1417 1418 } // end of SumOverInterMM 1143 1419 1144 1420 ////////////////////////////////////////////////////////////////////// … … 1150 1426 G4double G4PAIxSection::SumOverInterPlasmon( G4int i ) 1151 1427 { 1152 G4double x0,x1,y0,yy1,a,b,c,result 1153 1154 x0 = fSplineEnergy[i] 1155 x1 = fSplineEnergy[i+1] 1156 y0 = fdNdxPlasmon[i] 1428 G4double x0,x1,y0,yy1,a,b,c,result; 1429 1430 x0 = fSplineEnergy[i]; 1431 x1 = fSplineEnergy[i+1]; 1432 y0 = fdNdxPlasmon[i]; 1157 1433 yy1 = fdNdxPlasmon[i+1]; 1158 1434 c =x1/x0; 1159 a = log10(yy1/y0)/log10(c) 1160 // b = log10(y0) - a*log10(x0) 1161 b = y0/pow(x0,a) 1162 1163 a += 1.0 1164 if(a == 0) result = b*log(x1/x0) 1165 else result = y0*(x1*pow(c,a-1) - x0)/a 1166 a += 1.0 1167 1168 if( a == 0 ) fIntegralPlasmon[0] += b*log(x1/x0) 1169 else fIntegralPlasmon[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a 1170 1171 return result 1435 a = log10(yy1/y0)/log10(c); 1436 // b = log10(y0) - a*log10(x0); 1437 b = y0/pow(x0,a); 1438 1439 a += 1.0; 1440 if(a == 0) result = b*log(x1/x0); 1441 else result = y0*(x1*pow(c,a-1) - x0)/a; 1442 a += 1.0; 1443 1444 if( a == 0 ) fIntegralPlasmon[0] += b*log(x1/x0); 1445 else fIntegralPlasmon[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a; 1446 1447 return result; 1172 1448 1173 1449 } // end of SumOverInterPlasmon 1450 1451 ////////////////////////////////////////////////////////////////////// 1452 // 1453 // Calculation the PAI resonance integral cross-section inside 1454 // of interval of continuous values of photo-ionisation resonance 1455 // cross-section. Parameter 'i' is the number of interval. 1456 1457 G4double G4PAIxSection::SumOverInterResonance( G4int i ) 1458 { 1459 G4double x0,x1,y0,yy1,a,b,c,result; 1460 1461 x0 = fSplineEnergy[i]; 1462 x1 = fSplineEnergy[i+1]; 1463 y0 = fdNdxResonance[i]; 1464 yy1 = fdNdxResonance[i+1]; 1465 c =x1/x0; 1466 a = log10(yy1/y0)/log10(c); 1467 // b = log10(y0) - a*log10(x0); 1468 b = y0/pow(x0,a); 1469 1470 a += 1.0; 1471 if(a == 0) result = b*log(x1/x0); 1472 else result = y0*(x1*pow(c,a-1) - x0)/a; 1473 a += 1.0; 1474 1475 if( a == 0 ) fIntegralResonance[0] += b*log(x1/x0); 1476 else fIntegralResonance[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a; 1477 1478 return result; 1479 1480 } // end of SumOverInterResonance 1174 1481 1175 1482 /////////////////////////////////////////////////////////////////////////////// … … 1181 1488 G4double en0 ) 1182 1489 { 1183 G4double x0,x1,y0,yy1,a,b,c,d,e0,result 1184 1185 e0 = en0 1186 x0 = fSplineEnergy[i] 1187 x1 = fSplineEnergy[i+1] 1188 y0 = fDifPAIxSection[i] 1189 yy1 = fDifPAIxSection[i+1] 1490 G4double x0,x1,y0,yy1,a,b,c,d,e0,result; 1491 1492 e0 = en0; 1493 x0 = fSplineEnergy[i]; 1494 x1 = fSplineEnergy[i+1]; 1495 y0 = fDifPAIxSection[i]; 1496 yy1 = fDifPAIxSection[i+1]; 1190 1497 1191 1498 c = x1/x0; 1192 1499 d = e0/x0; 1193 a = log10(yy1/y0)/log10(x1/x0) 1194 // b0 = log10(y0) - a*log10(x0) 1195 b = y0/pow(x0,a); // pow(10.,b) 1196 1197 a += 1 1500 a = log10(yy1/y0)/log10(x1/x0); 1501 // b0 = log10(y0) - a*log10(x0); 1502 b = y0/pow(x0,a); // pow(10.,b); 1503 1504 a += 1; 1198 1505 if(a == 0) 1199 1506 { 1200 result = b*log(x0/e0) 1507 result = b*log(x0/e0); 1201 1508 } 1202 1509 else 1203 1510 { 1204 result = y0*(x0 - e0*pow(d,a-1))/a 1205 } 1206 a++ 1511 result = y0*(x0 - e0*pow(d,a-1))/a; 1512 } 1513 a++; 1207 1514 if(a == 0) 1208 1515 { 1209 fIntegralPAIxSection[0] += b*log(x0/e0) 1516 fIntegralPAIxSection[0] += b*log(x0/e0); 1210 1517 } 1211 1518 else 1212 1519 { 1213 fIntegralPAIxSection[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a 1214 } 1215 x0 = fSplineEnergy[i - 1] 1216 x1 = fSplineEnergy[i - 2] 1217 y0 = fDifPAIxSection[i - 1] 1218 yy1 = fDifPAIxSection[i - 2] 1520 fIntegralPAIxSection[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a; 1521 } 1522 x0 = fSplineEnergy[i - 1]; 1523 x1 = fSplineEnergy[i - 2]; 1524 y0 = fDifPAIxSection[i - 1]; 1525 yy1 = fDifPAIxSection[i - 2]; 1219 1526 1220 1527 c = x1/x0; 1221 1528 d = e0/x0; 1222 a = log10(yy1/y0)/log10(x1/x0) 1223 // b0 = log10(y0) - a*log10(x0) 1224 b = y0/pow(x0,a) 1225 a += 1 1529 a = log10(yy1/y0)/log10(x1/x0); 1530 // b0 = log10(y0) - a*log10(x0); 1531 b = y0/pow(x0,a); 1532 a += 1; 1226 1533 if(a == 0) 1227 1534 { 1228 result += b*log(e0/x0) 1535 result += b*log(e0/x0); 1229 1536 } 1230 1537 else 1231 1538 { 1232 result += y0*(e0*pow(d,a-1) - x0)/a 1233 } 1234 a++ 1539 result += y0*(e0*pow(d,a-1) - x0)/a; 1540 } 1541 a++; 1235 1542 if(a == 0) 1236 1543 { 1237 fIntegralPAIxSection[0] += b*log(e0/x0) 1544 fIntegralPAIxSection[0] += b*log(e0/x0); 1238 1545 } 1239 1546 else 1240 1547 { 1241 fIntegralPAIxSection[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a 1242 } 1243 return result 1548 fIntegralPAIxSection[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a; 1549 } 1550 return result; 1244 1551 1245 1552 } … … 1250 1557 G4double en0 ) 1251 1558 { 1252 G4double x0,x1,y0,yy1,a,b,c,d,e0,result 1253 1254 e0 = en0 1255 x0 = fSplineEnergy[i] 1256 x1 = fSplineEnergy[i+1] 1257 y0 = fDifPAIxSection[i] 1258 yy1 = fDifPAIxSection[i+1] 1559 G4double x0,x1,y0,yy1,a,b,c,d,e0,result; 1560 1561 e0 = en0; 1562 x0 = fSplineEnergy[i]; 1563 x1 = fSplineEnergy[i+1]; 1564 y0 = fDifPAIxSection[i]; 1565 yy1 = fDifPAIxSection[i+1]; 1259 1566 1260 1567 c = x1/x0; 1261 1568 d = e0/x0; 1262 a = log10(yy1/y0)/log10(x1/x0) 1263 // b0 = log10(y0) - a*log10(x0) 1264 b = y0/pow(x0,a); // pow(10.,b) 1265 1266 a += 2 1569 a = log10(yy1/y0)/log10(x1/x0); 1570 // b0 = log10(y0) - a*log10(x0); 1571 b = y0/pow(x0,a); // pow(10.,b); 1572 1573 a += 2; 1267 1574 if(a == 0) 1268 1575 { 1269 result = b*log(x0/e0) 1576 result = b*log(x0/e0); 1270 1577 } 1271 1578 else 1272 1579 { 1273 result = y0*(x0*x0 - e0*e0*pow(d,a-2))/a 1274 } 1275 x0 = fSplineEnergy[i - 1] 1276 x1 = fSplineEnergy[i - 2] 1277 y0 = fDifPAIxSection[i - 1] 1278 yy1 = fDifPAIxSection[i - 2] 1580 result = y0*(x0*x0 - e0*e0*pow(d,a-2))/a; 1581 } 1582 x0 = fSplineEnergy[i - 1]; 1583 x1 = fSplineEnergy[i - 2]; 1584 y0 = fDifPAIxSection[i - 1]; 1585 yy1 = fDifPAIxSection[i - 2]; 1279 1586 1280 1587 c = x1/x0; 1281 1588 d = e0/x0; 1282 a = log10(yy1/y0)/log10(x1/x0) 1283 // b0 = log10(y0) - a*log10(x0) 1284 b = y0/pow(x0,a) 1285 a += 2 1589 a = log10(yy1/y0)/log10(x1/x0); 1590 // b0 = log10(y0) - a*log10(x0); 1591 b = y0/pow(x0,a); 1592 a += 2; 1286 1593 if(a == 0) 1287 1594 { 1288 result += b*log(e0/x0) 1595 result += b*log(e0/x0); 1289 1596 } 1290 1597 else 1291 1598 { 1292 result += y0*(e0*e0*pow(d,a-2) - x0*x0)/a 1293 } 1294 return result 1599 result += y0*(e0*e0*pow(d,a-2) - x0*x0)/a; 1600 } 1601 return result; 1295 1602 1296 1603 } … … 1304 1611 G4double en0 ) 1305 1612 { 1306 G4double x0,x1,y0,yy1,a,b,e0,c,d,result 1307 1308 e0 = en0 1309 x0 = fSplineEnergy[i] 1310 x1 = fSplineEnergy[i+1] 1311 y0 = fdNdxCerenkov[i] 1312 yy1 = fdNdxCerenkov[i+1] 1613 G4double x0,x1,y0,yy1,a,b,e0,c,d,result; 1614 1615 e0 = en0; 1616 x0 = fSplineEnergy[i]; 1617 x1 = fSplineEnergy[i+1]; 1618 y0 = fdNdxCerenkov[i]; 1619 yy1 = fdNdxCerenkov[i+1]; 1313 1620 1314 1621 // G4cout<<G4endl; 1315 1622 // G4cout<<"SumBordC, i = "<<i<<"; en0 = "<<en0<<"; x0 ="<<x0<<"; x1 = "<<x1 1316 1623 // <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl; 1317 c = x1/x0 1318 d = e0/x0 1319 a = log10(yy1/y0)/log10(c) 1320 // b0 = log10(y0) - a*log10(x0) 1321 b = y0/pow(x0,a); // pow(10.,b0) 1322 1323 a += 1.0 1324 if( a == 0 ) result = b*log(x0/e0) 1325 else result = y0*(x0 - e0*pow(d,a-1))/a 1326 a += 1.0 1327 1328 if( a == 0 ) fIntegralCerenkov[0] += b*log(x0/e0) 1329 else fIntegralCerenkov[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a 1624 c = x1/x0; 1625 d = e0/x0; 1626 a = log10(yy1/y0)/log10(c); 1627 // b0 = log10(y0) - a*log10(x0); 1628 b = y0/pow(x0,a); // pow(10.,b0); 1629 1630 a += 1.0; 1631 if( a == 0 ) result = b*log(x0/e0); 1632 else result = y0*(x0 - e0*pow(d,a-1))/a; 1633 a += 1.0; 1634 1635 if( a == 0 ) fIntegralCerenkov[0] += b*log(x0/e0); 1636 else fIntegralCerenkov[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a; 1330 1637 1331 1638 // G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = "<<b<<"; result = "<<result<<G4endl; 1332 1639 1333 x0 = fSplineEnergy[i - 1] 1334 x1 = fSplineEnergy[i - 2] 1335 y0 = fdNdxCerenkov[i - 1] 1336 yy1 = fdNdxCerenkov[i - 2] 1640 x0 = fSplineEnergy[i - 1]; 1641 x1 = fSplineEnergy[i - 2]; 1642 y0 = fdNdxCerenkov[i - 1]; 1643 yy1 = fdNdxCerenkov[i - 2]; 1337 1644 1338 1645 // G4cout<<"x0 ="<<x0<<"; x1 = "<<x1 1339 1646 // <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl; 1340 1647 1341 c = x1/x0 1342 d = e0/x0 1343 a = log10(yy1/y0)/log10(x1/x0) 1344 // b0 = log10(y0) - a*log10(x0) 1345 b = y0/pow(x0,a); // pow(10.,b0) 1346 1347 a += 1.0 1348 if( a == 0 ) result += b*log(e0/x0) 1349 else result += y0*(e0*pow(d,a-1) - x0 )/a 1350 a += 1.0 1351 1352 if( a == 0 ) fIntegralCerenkov[0] += b*log(e0/x0) 1353 else fIntegralCerenkov[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a 1648 c = x1/x0; 1649 d = e0/x0; 1650 a = log10(yy1/y0)/log10(x1/x0); 1651 // b0 = log10(y0) - a*log10(x0); 1652 b = y0/pow(x0,a); // pow(10.,b0); 1653 1654 a += 1.0; 1655 if( a == 0 ) result += b*log(e0/x0); 1656 else result += y0*(e0*pow(d,a-1) - x0 )/a; 1657 a += 1.0; 1658 1659 if( a == 0 ) fIntegralCerenkov[0] += b*log(e0/x0); 1660 else fIntegralCerenkov[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a; 1354 1661 1355 1662 // G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = " 1356 1663 // <<b<<"; result = "<<result<<G4endl; 1357 1664 1358 return result ; 1665 return result; 1666 1667 } 1668 1669 /////////////////////////////////////////////////////////////////////////////// 1670 // 1671 // Integration of MM-Cerenkov cross-section for the case of 1672 // passing across border between intervals 1673 1674 G4double G4PAIxSection::SumOverBordMM( G4int i , 1675 G4double en0 ) 1676 { 1677 G4double x0,x1,y0,yy1,a,b,e0,c,d,result; 1678 1679 e0 = en0; 1680 x0 = fSplineEnergy[i]; 1681 x1 = fSplineEnergy[i+1]; 1682 y0 = fdNdxMM[i]; 1683 yy1 = fdNdxMM[i+1]; 1684 1685 // G4cout<<G4endl; 1686 // G4cout<<"SumBordC, i = "<<i<<"; en0 = "<<en0<<"; x0 ="<<x0<<"; x1 = "<<x1 1687 // <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl; 1688 c = x1/x0; 1689 d = e0/x0; 1690 a = log10(yy1/y0)/log10(c); 1691 // b0 = log10(y0) - a*log10(x0); 1692 b = y0/pow(x0,a); // pow(10.,b0); 1693 1694 a += 1.0; 1695 if( a == 0 ) result = b*log(x0/e0); 1696 else result = y0*(x0 - e0*pow(d,a-1))/a; 1697 a += 1.0; 1698 1699 if( a == 0 ) fIntegralMM[0] += b*log(x0/e0); 1700 else fIntegralMM[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a; 1701 1702 // G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = "<<b<<"; result = "<<result<<G4endl; 1703 1704 x0 = fSplineEnergy[i - 1]; 1705 x1 = fSplineEnergy[i - 2]; 1706 y0 = fdNdxMM[i - 1]; 1707 yy1 = fdNdxMM[i - 2]; 1708 1709 // G4cout<<"x0 ="<<x0<<"; x1 = "<<x1 1710 // <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl; 1711 1712 c = x1/x0; 1713 d = e0/x0; 1714 a = log10(yy1/y0)/log10(x1/x0); 1715 // b0 = log10(y0) - a*log10(x0); 1716 b = y0/pow(x0,a); // pow(10.,b0); 1717 1718 a += 1.0; 1719 if( a == 0 ) result += b*log(e0/x0); 1720 else result += y0*(e0*pow(d,a-1) - x0 )/a; 1721 a += 1.0; 1722 1723 if( a == 0 ) fIntegralMM[0] += b*log(e0/x0); 1724 else fIntegralMM[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a; 1725 1726 // G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = " 1727 // <<b<<"; result = "<<result<<G4endl; 1728 1729 return result; 1359 1730 1360 1731 } … … 1368 1739 G4double en0 ) 1369 1740 { 1370 G4double x0,x1,y0,yy1,a,b,c,d,e0,result 1371 1372 e0 = en0 1373 x0 = fSplineEnergy[i] 1374 x1 = fSplineEnergy[i+1] 1375 y0 = fdNdxPlasmon[i] 1376 yy1 = fdNdxPlasmon[i+1] 1377 1378 c = x1/x0 1379 d = e0/x0 1380 a = log10(yy1/y0)/log10(c) 1381 // b0 = log10(y0) - a*log10(x0) 1382 b = y0/pow(x0,a); //pow(10.,b) 1383 1384 a += 1.0 1385 if( a == 0 ) result = b*log(x0/e0) 1386 else result = y0*(x0 - e0*pow(d,a-1))/a 1387 a += 1.0 1388 1389 if( a == 0 ) fIntegralPlasmon[0] += b*log(x0/e0) 1390 else fIntegralPlasmon[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a 1391 1392 x0 = fSplineEnergy[i - 1] 1393 x1 = fSplineEnergy[i - 2] 1394 y0 = fdNdxPlasmon[i - 1] 1395 yy1 = fdNdxPlasmon[i - 2] 1396 1397 c = x1/x0 1398 d = e0/x0 1399 a = log10(yy1/y0)/log10(c) 1400 // b0 = log10(y0) - a*log10(x0) 1401 b = y0/pow(x0,a);// pow(10.,b0) 1402 1403 a += 1.0 1404 if( a == 0 ) result += b*log(e0/x0) 1405 else result += y0*(e0*pow(d,a-1) - x0)/a 1406 a += 1.0 1407 1408 if( a == 0 ) fIntegralPlasmon[0] += b*log(e0/x0) 1409 else fIntegralPlasmon[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a 1410 1411 return result 1741 G4double x0,x1,y0,yy1,a,b,c,d,e0,result; 1742 1743 e0 = en0; 1744 x0 = fSplineEnergy[i]; 1745 x1 = fSplineEnergy[i+1]; 1746 y0 = fdNdxPlasmon[i]; 1747 yy1 = fdNdxPlasmon[i+1]; 1748 1749 c = x1/x0; 1750 d = e0/x0; 1751 a = log10(yy1/y0)/log10(c); 1752 // b0 = log10(y0) - a*log10(x0); 1753 b = y0/pow(x0,a); //pow(10.,b); 1754 1755 a += 1.0; 1756 if( a == 0 ) result = b*log(x0/e0); 1757 else result = y0*(x0 - e0*pow(d,a-1))/a; 1758 a += 1.0; 1759 1760 if( a == 0 ) fIntegralPlasmon[0] += b*log(x0/e0); 1761 else fIntegralPlasmon[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a; 1762 1763 x0 = fSplineEnergy[i - 1]; 1764 x1 = fSplineEnergy[i - 2]; 1765 y0 = fdNdxPlasmon[i - 1]; 1766 yy1 = fdNdxPlasmon[i - 2]; 1767 1768 c = x1/x0; 1769 d = e0/x0; 1770 a = log10(yy1/y0)/log10(c); 1771 // b0 = log10(y0) - a*log10(x0); 1772 b = y0/pow(x0,a);// pow(10.,b0); 1773 1774 a += 1.0; 1775 if( a == 0 ) result += b*log(e0/x0); 1776 else result += y0*(e0*pow(d,a-1) - x0)/a; 1777 a += 1.0; 1778 1779 if( a == 0 ) fIntegralPlasmon[0] += b*log(e0/x0); 1780 else fIntegralPlasmon[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a; 1781 1782 return result; 1412 1783 1413 1784 } 1414 1785 1786 /////////////////////////////////////////////////////////////////////////////// 1787 // 1788 // Integration of resonance cross-section for the case of 1789 // passing across border between intervals 1790 1791 G4double G4PAIxSection::SumOverBordResonance( G4int i , 1792 G4double en0 ) 1793 { 1794 G4double x0,x1,y0,yy1,a,b,c,d,e0,result; 1795 1796 e0 = en0; 1797 x0 = fSplineEnergy[i]; 1798 x1 = fSplineEnergy[i+1]; 1799 y0 = fdNdxResonance[i]; 1800 yy1 = fdNdxResonance[i+1]; 1801 1802 c = x1/x0; 1803 d = e0/x0; 1804 a = log10(yy1/y0)/log10(c); 1805 // b0 = log10(y0) - a*log10(x0); 1806 b = y0/pow(x0,a); //pow(10.,b); 1807 1808 a += 1.0; 1809 if( a == 0 ) result = b*log(x0/e0); 1810 else result = y0*(x0 - e0*pow(d,a-1))/a; 1811 a += 1.0; 1812 1813 if( a == 0 ) fIntegralResonance[0] += b*log(x0/e0); 1814 else fIntegralResonance[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a; 1815 1816 x0 = fSplineEnergy[i - 1]; 1817 x1 = fSplineEnergy[i - 2]; 1818 y0 = fdNdxResonance[i - 1]; 1819 yy1 = fdNdxResonance[i - 2]; 1820 1821 c = x1/x0; 1822 d = e0/x0; 1823 a = log10(yy1/y0)/log10(c); 1824 // b0 = log10(y0) - a*log10(x0); 1825 b = y0/pow(x0,a);// pow(10.,b0); 1826 1827 a += 1.0; 1828 if( a == 0 ) result += b*log(e0/x0); 1829 else result += y0*(e0*pow(d,a-1) - x0)/a; 1830 a += 1.0; 1831 1832 if( a == 0 ) fIntegralResonance[0] += b*log(e0/x0); 1833 else fIntegralResonance[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a; 1834 1835 return result; 1836 1837 } 1838 1415 1839 ///////////////////////////////////////////////////////////////////////// 1416 1840 // 1417 // 1841 // Returns random PAI-total energy loss over step 1418 1842 1419 1843 G4double G4PAIxSection::GetStepEnergyLoss( G4double step ) 1420 1844 { 1421 G4int iTransfer ; 1422 G4long numOfCollisions ; 1423 G4double loss = 0.0 ; 1424 G4double meanNumber, position ; 1425 1426 // G4cout<<" G4PAIxSection::GetStepEnergyLoss "<<G4endl ; 1427 1428 1429 1430 meanNumber = fIntegralPAIxSection[1]*step ; 1431 numOfCollisions = G4Poisson(meanNumber) ; 1432 1433 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl ; 1845 G4long numOfCollisions; 1846 G4double meanNumber, loss = 0.0; 1847 1848 // G4cout<<" G4PAIxSection::GetStepEnergyLoss "<<G4endl; 1849 1850 meanNumber = fIntegralPAIxSection[1]*step; 1851 numOfCollisions = G4Poisson(meanNumber); 1852 1853 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl; 1434 1854 1435 1855 while(numOfCollisions) 1436 1856 { 1437 position = fIntegralPAIxSection[1]*G4UniformRand() ; 1438 1439 for( iTransfer=1 ; iTransfer<=fSplineNumber ; iTransfer++ ) 1440 { 1441 if( position >= fIntegralPAIxSection[iTransfer] ) break ; 1442 } 1443 loss += fSplineEnergy[iTransfer] ; 1444 numOfCollisions-- ; 1857 loss += GetEnergyTransfer(); 1858 numOfCollisions--; 1445 1859 } 1446 // G4cout<<"PAI energy loss = "<<loss/keV<<" keV"<<G4endl 1447 1448 return loss 1860 // G4cout<<"PAI energy loss = "<<loss/keV<<" keV"<<G4endl; 1861 1862 return loss; 1449 1863 } 1450 1864 1451 1865 ///////////////////////////////////////////////////////////////////////// 1452 1866 // 1453 // 1867 // Returns random PAI-total energy transfer in one collision 1868 1869 G4double G4PAIxSection::GetEnergyTransfer() 1870 { 1871 G4int iTransfer ; 1872 1873 G4double energyTransfer, position; 1874 1875 position = fIntegralPAIxSection[1]*G4UniformRand(); 1876 1877 for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ ) 1878 { 1879 if( position >= fIntegralPAIxSection[iTransfer] ) break; 1880 } 1881 if(iTransfer > fSplineNumber) iTransfer--; 1882 1883 energyTransfer = fSplineEnergy[iTransfer]; 1884 1885 if(iTransfer > 1) 1886 { 1887 energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand(); 1888 } 1889 return energyTransfer; 1890 } 1891 1892 ///////////////////////////////////////////////////////////////////////// 1893 // 1894 // Returns random Cerenkov energy loss over step 1454 1895 1455 1896 G4double G4PAIxSection::GetStepCerenkovLoss( G4double step ) 1456 1897 { 1457 G4int iTransfer ; 1458 G4long numOfCollisions ; 1459 G4double loss = 0.0 ; 1460 G4double meanNumber, position ; 1461 1462 // G4cout<<" G4PAIxSection::GetStepCreLosnkovs "<<G4endl ; 1463 1464 1465 1466 meanNumber = fIntegralCerenkov[1]*step ; 1467 numOfCollisions = G4Poisson(meanNumber) ; 1468 1469 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl ; 1898 G4long numOfCollisions; 1899 G4double meanNumber, loss = 0.0; 1900 1901 // G4cout<<" G4PAIxSection::GetStepCerenkovLoss "<<G4endl; 1902 1903 meanNumber = fIntegralCerenkov[1]*step; 1904 numOfCollisions = G4Poisson(meanNumber); 1905 1906 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl; 1470 1907 1471 1908 while(numOfCollisions) 1472 1909 { 1473 position = fIntegralCerenkov[1]*G4UniformRand() ; 1474 1475 for( iTransfer=1 ; iTransfer<=fSplineNumber ; iTransfer++ ) 1476 { 1477 if( position >= fIntegralCerenkov[iTransfer] ) break ; 1478 } 1479 loss += fSplineEnergy[iTransfer] ; 1480 numOfCollisions-- ; 1910 loss += GetCerenkovEnergyTransfer(); 1911 numOfCollisions--; 1481 1912 } 1482 // G4cout<<"PAI Cerenkov loss = "<<loss/keV<<" keV"<<G4endl 1483 1484 return loss 1913 // G4cout<<"PAI Cerenkov loss = "<<loss/keV<<" keV"<<G4endl; 1914 1915 return loss; 1485 1916 } 1486 1917 1487 1918 ///////////////////////////////////////////////////////////////////////// 1488 1919 // 1489 // 1920 // Returns random MM-Cerenkov energy loss over step 1921 1922 G4double G4PAIxSection::GetStepMMLoss( G4double step ) 1923 { 1924 G4long numOfCollisions; 1925 G4double meanNumber, loss = 0.0; 1926 1927 // G4cout<<" G4PAIxSection::GetStepMMLoss "<<G4endl; 1928 1929 meanNumber = fIntegralMM[1]*step; 1930 numOfCollisions = G4Poisson(meanNumber); 1931 1932 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl; 1933 1934 while(numOfCollisions) 1935 { 1936 loss += GetMMEnergyTransfer(); 1937 numOfCollisions--; 1938 } 1939 // G4cout<<"PAI MM-Cerenkov loss = "<<loss/keV<<" keV"<<G4endl; 1940 1941 return loss; 1942 } 1943 1944 ///////////////////////////////////////////////////////////////////////// 1945 // 1946 // Returns Cerenkov energy transfer in one collision 1947 1948 G4double G4PAIxSection::GetCerenkovEnergyTransfer() 1949 { 1950 G4int iTransfer ; 1951 1952 G4double energyTransfer, position; 1953 1954 position = fIntegralCerenkov[1]*G4UniformRand(); 1955 1956 for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ ) 1957 { 1958 if( position >= fIntegralCerenkov[iTransfer] ) break; 1959 } 1960 if(iTransfer > fSplineNumber) iTransfer--; 1961 1962 energyTransfer = fSplineEnergy[iTransfer]; 1963 1964 if(iTransfer > 1) 1965 { 1966 energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand(); 1967 } 1968 return energyTransfer; 1969 } 1970 1971 ///////////////////////////////////////////////////////////////////////// 1972 // 1973 // Returns MM-Cerenkov energy transfer in one collision 1974 1975 G4double G4PAIxSection::GetMMEnergyTransfer() 1976 { 1977 G4int iTransfer ; 1978 1979 G4double energyTransfer, position; 1980 1981 position = fIntegralMM[1]*G4UniformRand(); 1982 1983 for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ ) 1984 { 1985 if( position >= fIntegralMM[iTransfer] ) break; 1986 } 1987 if(iTransfer > fSplineNumber) iTransfer--; 1988 1989 energyTransfer = fSplineEnergy[iTransfer]; 1990 1991 if(iTransfer > 1) 1992 { 1993 energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand(); 1994 } 1995 return energyTransfer; 1996 } 1997 1998 ///////////////////////////////////////////////////////////////////////// 1999 // 2000 // Returns random plasmon energy loss over step 1490 2001 1491 2002 G4double G4PAIxSection::GetStepPlasmonLoss( G4double step ) 1492 2003 { 1493 G4int iTransfer ; 1494 G4long numOfCollisions ; 1495 G4double loss = 0.0 ; 1496 G4double meanNumber, position ; 1497 1498 // G4cout<<" G4PAIxSection::GetStepCreLosnkovs "<<G4endl ; 1499 1500 1501 1502 meanNumber = fIntegralPlasmon[1]*step ; 1503 numOfCollisions = G4Poisson(meanNumber) ; 1504 1505 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl ; 2004 G4long numOfCollisions; 2005 G4double meanNumber, loss = 0.0; 2006 2007 // G4cout<<" G4PAIxSection::GetStepPlasmonLoss "<<G4endl; 2008 2009 meanNumber = fIntegralPlasmon[1]*step; 2010 numOfCollisions = G4Poisson(meanNumber); 2011 2012 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl; 1506 2013 1507 2014 while(numOfCollisions) 1508 2015 { 1509 position = fIntegralPlasmon[1]*G4UniformRand() ; 1510 1511 for( iTransfer=1 ; iTransfer<=fSplineNumber ; iTransfer++ ) 1512 { 1513 if( position >= fIntegralPlasmon[iTransfer] ) break ; 1514 } 1515 loss += fSplineEnergy[iTransfer] ; 1516 numOfCollisions-- ; 2016 loss += GetPlasmonEnergyTransfer(); 2017 numOfCollisions--; 1517 2018 } 1518 // G4cout<<"PAI Plasmon loss = "<<loss/keV<<" keV"<<G4endl 1519 1520 return loss 2019 // G4cout<<"PAI Plasmon loss = "<<loss/keV<<" keV"<<G4endl; 2020 2021 return loss; 1521 2022 } 1522 2023 2024 ///////////////////////////////////////////////////////////////////////// 2025 // 2026 // Returns plasmon energy transfer in one collision 2027 2028 G4double G4PAIxSection::GetPlasmonEnergyTransfer() 2029 { 2030 G4int iTransfer ; 2031 2032 G4double energyTransfer, position; 2033 2034 position = fIntegralPlasmon[1]*G4UniformRand(); 2035 2036 for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ ) 2037 { 2038 if( position >= fIntegralPlasmon[iTransfer] ) break; 2039 } 2040 if(iTransfer > fSplineNumber) iTransfer--; 2041 2042 energyTransfer = fSplineEnergy[iTransfer]; 2043 2044 if(iTransfer > 1) 2045 { 2046 energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand(); 2047 } 2048 return energyTransfer; 2049 } 2050 2051 ///////////////////////////////////////////////////////////////////////// 2052 // 2053 // Returns random resonance energy loss over step 2054 2055 G4double G4PAIxSection::GetStepResonanceLoss( G4double step ) 2056 { 2057 G4long numOfCollisions; 2058 G4double meanNumber, loss = 0.0; 2059 2060 // G4cout<<" G4PAIxSection::GetStepCreLosnkovs "<<G4endl; 2061 2062 meanNumber = fIntegralResonance[1]*step; 2063 numOfCollisions = G4Poisson(meanNumber); 2064 2065 // G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl; 2066 2067 while(numOfCollisions) 2068 { 2069 loss += GetResonanceEnergyTransfer(); 2070 numOfCollisions--; 2071 } 2072 // G4cout<<"PAI resonance loss = "<<loss/keV<<" keV"<<G4endl; 2073 2074 return loss; 2075 } 2076 2077 2078 ///////////////////////////////////////////////////////////////////////// 2079 // 2080 // Returns resonance energy transfer in one collision 2081 2082 G4double G4PAIxSection::GetResonanceEnergyTransfer() 2083 { 2084 G4int iTransfer ; 2085 2086 G4double energyTransfer, position; 2087 2088 position = fIntegralResonance[1]*G4UniformRand(); 2089 2090 for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ ) 2091 { 2092 if( position >= fIntegralResonance[iTransfer] ) break; 2093 } 2094 if(iTransfer > fSplineNumber) iTransfer--; 2095 2096 energyTransfer = fSplineEnergy[iTransfer]; 2097 2098 if(iTransfer > 1) 2099 { 2100 energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand(); 2101 } 2102 return energyTransfer; 2103 } 2104 2105 2106 ///////////////////////////////////////////////////////////////////////// 2107 // 2108 // Returns Rutherford energy transfer in one collision 2109 2110 G4double G4PAIxSection::GetRutherfordEnergyTransfer() 2111 { 2112 G4int iTransfer ; 2113 2114 G4double energyTransfer, position; 2115 2116 position = (fIntegralPlasmon[1]-fIntegralResonance[1])*G4UniformRand(); 2117 2118 for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ ) 2119 { 2120 if( position >= (fIntegralPlasmon[iTransfer]-fIntegralResonance[iTransfer]) ) break; 2121 } 2122 if(iTransfer > fSplineNumber) iTransfer--; 2123 2124 energyTransfer = fSplineEnergy[iTransfer]; 2125 2126 if(iTransfer > 1) 2127 { 2128 energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand(); 2129 } 2130 return energyTransfer; 2131 } 1523 2132 1524 2133 … … 1528 2137 // 1529 2138 1530 G4int G4PAIxSection::fNumberOfGammas = 111 2139 G4int G4PAIxSection::fNumberOfGammas = 111; 1531 2140 1532 2141 const G4double G4PAIxSection::fLorentzFactor[112] = // fNumberOfGammas+1 … … 1556 2165 5.658206e+04, 6.422112e+04, 7.289153e+04, 8.273254e+04, 9.390219e+04, // 110 1557 2166 1.065799e+05 1558 } 2167 }; 1559 2168 1560 2169 /////////////////////////////////////////////////////////////////////// … … 1564 2173 1565 2174 const 1566 G4int G4PAIxSection::fRefGammaNumber = 29 2175 G4int G4PAIxSection::fRefGammaNumber = 29; 1567 2176 1568 2177
Note: See TracChangeset
for help on using the changeset viewer.