Ignore:
Timestamp:
Apr 6, 2009, 12:30:29 PM (15 years ago)
Author:
garnier
Message:

update processes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/processes/hadronic/models/rpg/src/G4RPGInelastic.cc

    r819 r962  
    2424// ********************************************************************
    2525//
    26 // $Id: G4RPGInelastic.cc,v 1.2 2007/08/15 20:38:25 dennis Exp $
    27 // GEANT4 tag $Name: geant4-09-01-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 $
    2828//
    2929
     
    168168  }
    169169 
    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 &currentParticle,
    178   G4ReactionProduct &targetParticle,
    179   G4bool &incidentHasChanged,
    180   G4bool &targetHasChanged,
    181   G4bool quasiElastic )
     170void
     171G4RPGInelastic::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)
    182182{
    183183  cache = 0;
     
    186186  G4ReactionProduct leadingStrangeParticle;
    187187
    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);
    194194
    195195  if( quasiElastic )
     
    266266  for (G4int i = 0; i < vecLen; i++) savevec.push_back(*vec[i]);
    267267
    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
    270278      (((originalIncident->GetDefinition() == G4KaonPlus::KaonPlus() ||
    271279         originalIncident->GetDefinition() == G4KaonMinus::KaonMinus() ||
    272280         originalIncident->GetDefinition() == G4KaonZeroLong::KaonZeroLong() ||
    273281         originalIncident->GetDefinition() == G4KaonZeroShort::KaonZeroShort()) &&
    274         rand1 < 0.5) || rand2 > twsup[vecLen]) )
     282          rand1 < 0.5)
     283       || rand2 > twsup[vecLen]) ) )
    275284
    276285    finishedGenXPt =
     
    282291                                  leadFlag, leadingStrangeParticle);
    283292
    284   if( finishedGenXPt )
    285   {
    286     Rotate(vec, vecLen);
    287     return;
    288   }
     293  if (finishedGenXPt) return;
    289294
    290295  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];
    294299    vecLen = 0;
    295   }
    296   else
    297   {
     300
     301  } else {
    298302    // Occaisionally, GenerateXandPt will fail in the annihilation channel.
    299303    // Restore current, target and secondaries to pre-GenerateXandPt state
     
    313317    }
    314318
    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);
    321327
    322328    try
     
    337343  }
    338344
    339   if( finishedTwoClu )
    340   {
    341     Rotate(vec, vecLen);
    342     return;
    343   }
     345  if (finishedTwoClu) return;
    344346
    345347  twoBody.ReactionStage(originalIncident, modifiedOriginal,
     
    351353}
    352354
    353  
     355/*
    354356 void G4RPGInelastic::
    355357 Rotate(G4FastVector<G4ReactionProduct,256> &vec, G4int &vecLen)
     
    365367   }
    366368 }     
     369*/
    367370
    368371void
    369 G4RPGInelastic::SetUpChange(G4FastVector<G4ReactionProduct,256> &vec,
    370                             G4int &vecLen,
    371                             G4ReactionProduct &currentParticle,
    372                             G4ReactionProduct &targetParticle,
    373                             G4bool &incidentHasChanged )
     372G4RPGInelastic::SetUpChange(G4FastVector<G4ReactionProduct,256>& vec,
     373                            G4int& vecLen,
     374                            G4ReactionProduct& currentParticle,
     375                            G4ReactionProduct& targetParticle,
     376                            G4bool& incidentHasChanged )
    374377{
    375378  theParticleChange.Clear();
    376   G4ParticleDefinition *aKaonZL = G4KaonZeroLong::KaonZeroLong();
    377   G4ParticleDefinition *aKaonZS = G4KaonZeroShort::KaonZeroShort();
     379  G4ParticleDefinition* aKaonZL = G4KaonZeroLong::KaonZeroLong();
     380  G4ParticleDefinition* aKaonZS = G4KaonZeroShort::KaonZeroShort();
    378381  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);
    384386      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);
    392395      incidentHasChanged = true;
    393396    }
    394397  }
    395398
    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) {
    418420    G4DynamicParticle* p0 = new G4DynamicParticle;
    419     p0->SetDefinition( currentParticle.GetDefinition() );
    420     p0->SetMomentum( currentParticle.GetMomentum() );
     421    p0->SetDefinition(currentParticle.GetDefinition() );
     422    p0->SetMomentum(currentParticle.GetMomentum() );
    421423    theParticleChange.AddSecondary( p0 );
    422424    theParticleChange.SetStatusChange( stopAndKill );
    423425    theParticleChange.SetEnergyChange( 0.0 );
    424   }
    425   else
    426   {
     426
     427  } else {
    427428    G4double p = currentParticle.GetMomentum().mag()/MeV;
    428429    G4ThreeVector m = currentParticle.GetMomentum();
    429     if( p > DBL_MIN )
     430    if (p > DBL_MIN)
    430431      theParticleChange.SetMomentumChange( m.x()/p, m.y()/p, m.z()/p );
    431432    else
     
    437438  }
    438439
    439   if( targetParticle.GetMass() > 0.0 )  // Tgt particle can be eliminated in TwoBody
     440  if (targetParticle.GetMass() > 0.0)  // Tgt particle can be eliminated in TwoBody
    440441  {
    441442    G4ThreeVector momentum = targetParticle.GetMomentum();
     
    455456
    456457  G4DynamicParticle* p;
    457   for( i=0; i<vecLen; ++i )
    458   {
     458  for (i = 0; i < vecLen; ++i) {
    459459    G4double secKE = vec[i]->GetKineticEnergy();
    460460    G4ThreeVector momentum = vec[i]->GetMomentum();
     
    470470  }
    471471}
    472  
     472
     473
     474std::pair<G4int, G4double>
     475G4RPGInelastic::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
     491G4int
     492G4RPGInelastic::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
     514void G4RPGInelastic::CheckQnums(G4FastVector<G4ReactionProduct,256> &vec,
     515                                G4int &vecLen,
     516                                G4ReactionProduct &currentParticle,
     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
     565const 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
     570G4ParticleDefinition* p0 = G4PionZero::PionZero();
     571G4ParticleDefinition* p1 = G4PionPlus::PionPlus();
     572G4ParticleDefinition* p2 = G4PionMinus::PionMinus();
     573G4ParticleDefinition* p3 = G4KaonPlus::KaonPlus();
     574G4ParticleDefinition* p4 = G4KaonMinus::KaonMinus();
     575G4ParticleDefinition* p5 = G4KaonZero::KaonZero();
     576G4ParticleDefinition* p6 = G4AntiKaonZero::AntiKaonZero();
     577G4ParticleDefinition* p7 = G4Proton::Proton();
     578G4ParticleDefinition* p8 = G4Neutron::Neutron();
     579G4ParticleDefinition* p9 = G4Lambda::Lambda();
     580G4ParticleDefinition* p10 = G4SigmaPlus::SigmaPlus();
     581G4ParticleDefinition* p11 = G4SigmaZero::SigmaZero();
     582G4ParticleDefinition* p12 = G4SigmaMinus::SigmaMinus();
     583G4ParticleDefinition* p13 = G4XiZero::XiZero();
     584G4ParticleDefinition* p14 = G4XiMinus::XiMinus();
     585G4ParticleDefinition* p15 = G4OmegaMinus::OmegaMinus();
     586G4ParticleDefinition* p16 = G4AntiProton::AntiProton();
     587G4ParticleDefinition* p17 = G4AntiNeutron::AntiNeutron();
     588
     589G4ParticleDefinition* G4RPGInelastic::particleDef[18] = {
     590  p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14,
     591  p15, p16, p17 };
     592
    473593/* end of file */
Note: See TracChangeset for help on using the changeset viewer.