- Timestamp:
- Apr 6, 2009, 12:30:29 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/hadronic/models/rpg/src/G4RPGInelastic.cc
r819 r962 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4RPGInelastic.cc,v 1. 2 2007/08/15 20:38:25dennis Exp $27 // GEANT4 tag $Name: geant4-09-0 1-patch-02 $26 // $Id: G4RPGInelastic.cc,v 1.6 2008/03/22 00:03:24 dennis Exp $ 27 // GEANT4 tag $Name: geant4-09-02-ref-02 $ 28 28 // 29 29 … … 168 168 } 169 169 170 void G4RPGInelastic::CalculateMomenta(171 G4FastVector<G4ReactionProduct,256> &vec,172 G4int &vecLen,173 const G4HadProjectile *originalIncident,174 const G4DynamicParticle *originalTarget,175 G4ReactionProduct &modifiedOriginal,176 G4Nucleus &targetNucleus,177 G4ReactionProduct ¤tParticle,178 G4ReactionProduct &targetParticle,179 G4bool &incidentHasChanged,180 G4bool &targetHasChanged,181 G4bool quasiElastic)170 void 171 G4RPGInelastic::CalculateMomenta(G4FastVector<G4ReactionProduct,256>& vec, 172 G4int& vecLen, 173 const G4HadProjectile* originalIncident, 174 const G4DynamicParticle* originalTarget, 175 G4ReactionProduct& modifiedOriginal, 176 G4Nucleus& targetNucleus, 177 G4ReactionProduct& currentParticle, 178 G4ReactionProduct& targetParticle, 179 G4bool& incidentHasChanged, 180 G4bool& targetHasChanged, 181 G4bool quasiElastic) 182 182 { 183 183 cache = 0; … … 186 186 G4ReactionProduct leadingStrangeParticle; 187 187 188 strangeProduction.ReactionStage(originalIncident, modifiedOriginal,189 incidentHasChanged, originalTarget,190 targetParticle, targetHasChanged,191 targetNucleus, currentParticle,192 vec, vecLen,193 false, leadingStrangeParticle);188 // strangeProduction.ReactionStage(originalIncident, modifiedOriginal, 189 // incidentHasChanged, originalTarget, 190 // targetParticle, targetHasChanged, 191 // targetNucleus, currentParticle, 192 // vec, vecLen, 193 // false, leadingStrangeParticle); 194 194 195 195 if( quasiElastic ) … … 266 266 for (G4int i = 0; i < vecLen; i++) savevec.push_back(*vec[i]); 267 267 268 if( annihilation || (vecLen >= 6) || 269 (modifiedOriginal.GetKineticEnergy()/GeV >= 1.0) && 268 // Call fragmentation code if 269 // 1) there is annihilation, or 270 // 2) there are more than 5 secondaries, or 271 // 3) incident KE is > 1 GeV AND 272 // ( incident is a kaon AND rand < 0.5 OR twsup ) 273 // 274 275 if( annihilation || vecLen > 5 || 276 ( modifiedOriginal.GetKineticEnergy()/GeV >= 1.0 && 277 270 278 (((originalIncident->GetDefinition() == G4KaonPlus::KaonPlus() || 271 279 originalIncident->GetDefinition() == G4KaonMinus::KaonMinus() || 272 280 originalIncident->GetDefinition() == G4KaonZeroLong::KaonZeroLong() || 273 281 originalIncident->GetDefinition() == G4KaonZeroShort::KaonZeroShort()) && 274 rand1 < 0.5) || rand2 > twsup[vecLen]) ) 282 rand1 < 0.5) 283 || rand2 > twsup[vecLen]) ) ) 275 284 276 285 finishedGenXPt = … … 282 291 leadFlag, leadingStrangeParticle); 283 292 284 if( finishedGenXPt ) 285 { 286 Rotate(vec, vecLen); 287 return; 288 } 293 if (finishedGenXPt) return; 289 294 290 295 G4bool finishedTwoClu = false; 291 if( modifiedOriginal.GetTotalMomentum()/MeV < 1.0 ) 292 {293 for (G4int i=0; i<vecLen; i++) delete vec[i];296 297 if (modifiedOriginal.GetTotalMomentum() < 1.0) { 298 for (G4int i = 0; i < vecLen; i++) delete vec[i]; 294 299 vecLen = 0; 295 } 296 else 297 { 300 301 } else { 298 302 // Occaisionally, GenerateXandPt will fail in the annihilation channel. 299 303 // Restore current, target and secondaries to pre-GenerateXandPt state … … 313 317 } 314 318 315 pionSuppression.ReactionStage(originalIncident, modifiedOriginal, 316 incidentHasChanged, originalTarget, 317 targetParticle, targetHasChanged, 318 targetNucleus, currentParticle, 319 vec, vecLen, 320 false, leadingStrangeParticle); 319 // Big violations of energy conservation in this method - don't use 320 // 321 // pionSuppression.ReactionStage(originalIncident, modifiedOriginal, 322 // incidentHasChanged, originalTarget, 323 // targetParticle, targetHasChanged, 324 // targetNucleus, currentParticle, 325 // vec, vecLen, 326 // false, leadingStrangeParticle); 321 327 322 328 try … … 337 343 } 338 344 339 if( finishedTwoClu ) 340 { 341 Rotate(vec, vecLen); 342 return; 343 } 345 if (finishedTwoClu) return; 344 346 345 347 twoBody.ReactionStage(originalIncident, modifiedOriginal, … … 351 353 } 352 354 353 355 /* 354 356 void G4RPGInelastic:: 355 357 Rotate(G4FastVector<G4ReactionProduct,256> &vec, G4int &vecLen) … … 365 367 } 366 368 } 369 */ 367 370 368 371 void 369 G4RPGInelastic::SetUpChange(G4FastVector<G4ReactionProduct,256> &vec,370 G4int &vecLen,371 G4ReactionProduct ¤tParticle,372 G4ReactionProduct &targetParticle,373 G4bool &incidentHasChanged )372 G4RPGInelastic::SetUpChange(G4FastVector<G4ReactionProduct,256>& vec, 373 G4int& vecLen, 374 G4ReactionProduct& currentParticle, 375 G4ReactionProduct& targetParticle, 376 G4bool& incidentHasChanged ) 374 377 { 375 378 theParticleChange.Clear(); 376 G4ParticleDefinition *aKaonZL = G4KaonZeroLong::KaonZeroLong();377 G4ParticleDefinition *aKaonZS = G4KaonZeroShort::KaonZeroShort();379 G4ParticleDefinition* aKaonZL = G4KaonZeroLong::KaonZeroLong(); 380 G4ParticleDefinition* aKaonZS = G4KaonZeroShort::KaonZeroShort(); 378 381 G4int i; 379 if( currentParticle.GetDefinition() == aKaonZL ) 380 { 381 if( G4UniformRand() <= 0.5 ) 382 { 383 currentParticle.SetDefinition( aKaonZS ); 382 383 if (currentParticle.GetDefinition() == particleDef[k0]) { 384 if (G4UniformRand() < 0.5) { 385 currentParticle.SetDefinitionAndUpdateE(aKaonZL); 384 386 incidentHasChanged = true; 385 } 386 } 387 else if( currentParticle.GetDefinition() == aKaonZS ) 388 { 389 if( G4UniformRand() > 0.5 ) 390 { 391 currentParticle.SetDefinition( aKaonZL ); 387 } else { 388 currentParticle.SetDefinitionAndUpdateE(aKaonZS); 389 } 390 } else if (currentParticle.GetDefinition() == particleDef[k0b]) { 391 if (G4UniformRand() < 0.5) { 392 currentParticle.SetDefinitionAndUpdateE(aKaonZL); 393 } else { 394 currentParticle.SetDefinitionAndUpdateE(aKaonZS); 392 395 incidentHasChanged = true; 393 396 } 394 397 } 395 398 396 if( targetParticle.GetDefinition() == aKaonZL ) 397 { 398 if( G4UniformRand() <= 0.5 )targetParticle.SetDefinition( aKaonZS ); 399 } 400 else if( targetParticle.GetDefinition() == aKaonZS ) 401 { 402 if( G4UniformRand() > 0.5 )targetParticle.SetDefinition( aKaonZL ); 403 } 404 for( i=0; i<vecLen; ++i ) 405 { 406 if( vec[i]->GetDefinition() == aKaonZL ) 407 { 408 if( G4UniformRand() <= 0.5 )vec[i]->SetDefinition( aKaonZS ); 409 } 410 else if( vec[i]->GetDefinition() == aKaonZS ) 411 { 412 if( G4UniformRand() > 0.5 )vec[i]->SetDefinition( aKaonZL ); 413 } 414 } 415 416 if( incidentHasChanged ) 417 { 399 if (targetParticle.GetDefinition() == particleDef[k0] || 400 targetParticle.GetDefinition() == particleDef[k0b] ) { 401 if (G4UniformRand() < 0.5) { 402 targetParticle.SetDefinitionAndUpdateE(aKaonZL); 403 } else { 404 targetParticle.SetDefinitionAndUpdateE(aKaonZS); 405 } 406 } 407 408 for (i = 0; i < vecLen; ++i) { 409 if (vec[i]->GetDefinition() == particleDef[k0] || 410 vec[i]->GetDefinition() == particleDef[k0b] ) { 411 if (G4UniformRand() < 0.5) { 412 vec[i]->SetDefinitionAndUpdateE(aKaonZL); 413 } else { 414 vec[i]->SetDefinitionAndUpdateE(aKaonZS); 415 } 416 } 417 } 418 419 if (incidentHasChanged) { 418 420 G4DynamicParticle* p0 = new G4DynamicParticle; 419 p0->SetDefinition( 420 p0->SetMomentum( 421 p0->SetDefinition(currentParticle.GetDefinition() ); 422 p0->SetMomentum(currentParticle.GetMomentum() ); 421 423 theParticleChange.AddSecondary( p0 ); 422 424 theParticleChange.SetStatusChange( stopAndKill ); 423 425 theParticleChange.SetEnergyChange( 0.0 ); 424 } 425 else 426 { 426 427 } else { 427 428 G4double p = currentParticle.GetMomentum().mag()/MeV; 428 429 G4ThreeVector m = currentParticle.GetMomentum(); 429 if ( p > DBL_MIN)430 if (p > DBL_MIN) 430 431 theParticleChange.SetMomentumChange( m.x()/p, m.y()/p, m.z()/p ); 431 432 else … … 437 438 } 438 439 439 if ( targetParticle.GetMass() > 0.0) // Tgt particle can be eliminated in TwoBody440 if (targetParticle.GetMass() > 0.0) // Tgt particle can be eliminated in TwoBody 440 441 { 441 442 G4ThreeVector momentum = targetParticle.GetMomentum(); … … 455 456 456 457 G4DynamicParticle* p; 457 for( i=0; i<vecLen; ++i ) 458 { 458 for (i = 0; i < vecLen; ++i) { 459 459 G4double secKE = vec[i]->GetKineticEnergy(); 460 460 G4ThreeVector momentum = vec[i]->GetMomentum(); … … 470 470 } 471 471 } 472 472 473 474 std::pair<G4int, G4double> 475 G4RPGInelastic::interpolateEnergy(G4double e) const 476 { 477 G4int index = 29; 478 G4double fraction = 0.0; 479 480 for (G4int i = 1; i < 30; i++) { 481 if (e < energyScale[i]) { 482 index = i-1; 483 fraction = (e - energyScale[index]) / (energyScale[i] - energyScale[index]); 484 break; 485 } 486 } 487 return std::pair<G4int, G4double>(index, fraction); 488 } 489 490 491 G4int 492 G4RPGInelastic::sampleFlat(std::vector<G4double> sigma) const 493 { 494 G4int i; 495 G4double sum(0.); 496 for (i = 0; i < G4int(sigma.size()); i++) sum += sigma[i]; 497 498 G4double fsum = sum*G4UniformRand(); 499 G4double partialSum = 0.0; 500 G4int channel = 0; 501 502 for (i = 0; i < G4int(sigma.size()); i++) { 503 partialSum += sigma[i]; 504 if (fsum < partialSum) { 505 channel = i; 506 break; 507 } 508 } 509 510 return channel; 511 } 512 513 514 void G4RPGInelastic::CheckQnums(G4FastVector<G4ReactionProduct,256> &vec, 515 G4int &vecLen, 516 G4ReactionProduct ¤tParticle, 517 G4ReactionProduct &targetParticle, 518 G4double Q, G4double B, G4double S) 519 { 520 G4ParticleDefinition* projDef = currentParticle.GetDefinition(); 521 G4ParticleDefinition* targDef = targetParticle.GetDefinition(); 522 G4double chargeSum = projDef->GetPDGCharge() + targDef->GetPDGCharge(); 523 G4double baryonSum = projDef->GetBaryonNumber() + targDef->GetBaryonNumber(); 524 G4double strangenessSum = projDef->GetQuarkContent(3) - 525 projDef->GetAntiQuarkContent(3) + 526 targDef->GetQuarkContent(3) - 527 targDef->GetAntiQuarkContent(3); 528 529 G4ParticleDefinition* secDef = 0; 530 for (G4int i = 0; i < vecLen; i++) { 531 secDef = vec[i]->GetDefinition(); 532 chargeSum += secDef->GetPDGCharge(); 533 baryonSum += secDef->GetBaryonNumber(); 534 strangenessSum += secDef->GetQuarkContent(3) 535 - secDef->GetAntiQuarkContent(3); 536 } 537 538 G4bool OK = true; 539 if (chargeSum != Q) { 540 G4cout << " Charge not conserved " << G4endl; 541 OK = false; 542 } 543 if (baryonSum != B) { 544 G4cout << " Baryon number not conserved " << G4endl; 545 OK = false; 546 } 547 if (strangenessSum != S) { 548 G4cout << " Strangeness not conserved " << G4endl; 549 OK = false; 550 } 551 552 if (!OK) { 553 G4cout << " projectile: " << projDef->GetParticleName() 554 << " target: " << targDef->GetParticleName() << G4endl; 555 for (G4int i = 0; i < vecLen; i++) { 556 secDef = vec[i]->GetDefinition(); 557 G4cout << secDef->GetParticleName() << " " ; 558 } 559 G4cout << G4endl; 560 } 561 562 } 563 564 565 const G4double G4RPGInelastic::energyScale[30] = { 566 0.0, 0.01, 0.013, 0.018, 0.024, 0.032, 0.042, 0.056, 0.075, 0.1, 567 0.13, 0.18, 0.24, 0.32, 0.42, 0.56, 0.75, 1.0, 1.3, 1.8, 568 2.4, 3.2, 4.2, 5.6, 7.5, 10.0, 13.0, 18.0, 24.0, 32.0 }; 569 570 G4ParticleDefinition* p0 = G4PionZero::PionZero(); 571 G4ParticleDefinition* p1 = G4PionPlus::PionPlus(); 572 G4ParticleDefinition* p2 = G4PionMinus::PionMinus(); 573 G4ParticleDefinition* p3 = G4KaonPlus::KaonPlus(); 574 G4ParticleDefinition* p4 = G4KaonMinus::KaonMinus(); 575 G4ParticleDefinition* p5 = G4KaonZero::KaonZero(); 576 G4ParticleDefinition* p6 = G4AntiKaonZero::AntiKaonZero(); 577 G4ParticleDefinition* p7 = G4Proton::Proton(); 578 G4ParticleDefinition* p8 = G4Neutron::Neutron(); 579 G4ParticleDefinition* p9 = G4Lambda::Lambda(); 580 G4ParticleDefinition* p10 = G4SigmaPlus::SigmaPlus(); 581 G4ParticleDefinition* p11 = G4SigmaZero::SigmaZero(); 582 G4ParticleDefinition* p12 = G4SigmaMinus::SigmaMinus(); 583 G4ParticleDefinition* p13 = G4XiZero::XiZero(); 584 G4ParticleDefinition* p14 = G4XiMinus::XiMinus(); 585 G4ParticleDefinition* p15 = G4OmegaMinus::OmegaMinus(); 586 G4ParticleDefinition* p16 = G4AntiProton::AntiProton(); 587 G4ParticleDefinition* p17 = G4AntiNeutron::AntiNeutron(); 588 589 G4ParticleDefinition* G4RPGInelastic::particleDef[18] = { 590 p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, 591 p15, p16, p17 }; 592 473 593 /* end of file */
Note: See TracChangeset
for help on using the changeset viewer.