51   G4cout << 
"WARNING: model G4HEAntiLambdaInelastic is being deprecated and will\n" 
   52          << 
"disappear in Geant4 version 10.0"  << 
G4endl;  
 
   58   outFile << 
"G4HEAntiLambdaInelastic is one of the High Energy\n" 
   59           << 
"Parameterized (HEP) models used to implement inelastic\n" 
   60           << 
"anti-Lambda scattering from nuclei.  It is a re-engineered\n" 
   61           << 
"version of the GHEISHA code of H. Fesefeldt.  It divides the\n" 
   62           << 
"initial collision products into backward- and forward-going\n" 
   63           << 
"clusters which are then decayed into final state hadrons.\n" 
   64           << 
"The model does not conserve energy on an event-by-event\n" 
   65           << 
"basis.  It may be applied to anti-Lambdas with initial energies\n" 
   84   G4double incidentKineticEnergy = incidentTotalEnergy - incidentMass;
 
   86   if (incidentKineticEnergy < 1.)
 
   87     G4cout << 
"GHEAntiLambdaInelastic: incident energy < 1 GeV" << 
G4endl;
 
   90     G4cout << 
"G4HEAntiLambdaInelastic::ApplyYourself" << 
G4endl;
 
   92            << 
"mass "              << incidentMass
 
   93            << 
"kinetic energy "    << incidentKineticEnergy
 
   95     G4cout << 
"target material with (A,Z) = ("  
   96            << atomicWeight << 
"," << atomicNumber << 
")" << 
G4endl;
 
  100                                               atomicWeight, atomicNumber);
 
  102     G4cout << 
"nuclear inelasticity = " << inelasticity << 
G4endl;
 
  104   incidentKineticEnergy -= inelasticity;
 
  110                                           atomicWeight, atomicNumber,
 
  112                                           excitationEnergyDTA);
 
  114     G4cout << 
"nuclear excitation = " << excitation << excitationEnergyGNP 
 
  115            << excitationEnergyDTA << 
G4endl;             
 
  117   incidentKineticEnergy -= excitation;
 
  118   incidentTotalEnergy = incidentKineticEnergy + incidentMass;
 
  132        std::sqrt( incidentMass*incidentMass + targetMass*targetMass
 
  133        + 2.0*targetMass*incidentTotalEnergy);
 
  134   G4double availableEnergy = centerOfMassEnergy - targetMass - incidentMass;
 
  140     G4cout << 
"ApplyYourself: CallFirstIntInCascade for particle " 
  141            << incidentCode << 
G4endl;
 
  143   G4bool successful = 
false; 
 
  146                           incidentParticle, targetParticle, atomicWeight);
 
  149     G4cout << 
"ApplyYourself::StrangeParticlePairProduction" << 
G4endl;  
 
  151   if ((
vecLength > 0) && (availableEnergy > 1.)) 
 
  154                                   incidentParticle, targetParticle);
 
  156                       excitationEnergyGNP, excitationEnergyDTA,
 
  157                       incidentParticle, targetParticle,
 
  158                       atomicWeight, atomicNumber);
 
  161                                 excitationEnergyGNP, excitationEnergyDTA,
 
  162                                 incidentParticle, targetParticle,
 
  163                                 atomicWeight, atomicNumber);
 
  166                           excitationEnergyGNP, excitationEnergyDTA, 
 
  167                           incidentParticle, targetParticle,
 
  168                           atomicWeight, atomicNumber);
 
  172                                   excitationEnergyGNP, excitationEnergyDTA,       
 
  173                                   incidentParticle, targetParticle,
 
  174                                   atomicWeight, atomicNumber);
 
  177                            excitationEnergyGNP, excitationEnergyDTA,
 
  178                            incidentParticle, targetParticle, 
 
  179                            atomicWeight, atomicNumber);
 
  183                       atomicWeight, atomicNumber);
 
  186     G4cout << 
"GHEInelasticInteraction::ApplyYourself fails to produce final state particles"  
  215   static const G4double expxl = -expxu;  
 
  221   static const G4int   numMul   = 1200;
 
  222   static const G4int   numMulAn = 400;
 
  223   static const G4int   numSec   = 60;
 
  230   static G4bool first = 
true;
 
  231   static G4double protmul[numMul],  protnorm[numSec];   
 
  232   static G4double protmulAn[numMulAn],protnormAn[numSec]; 
 
  233   static G4double neutmul[numMul],  neutnorm[numSec];   
 
  234   static G4double neutmulAn[numMulAn],neutnormAn[numSec];
 
  239   G4int i, counter, 
nt, npos, nneg, nzero;
 
  244        for( i=0; i<numMul  ; i++ ) protmul[i]  = 0.0;
 
  245        for( i=0; i<numSec  ; i++ ) protnorm[i] = 0.0;
 
  247        for( npos=0; npos<(numSec/3); npos++ ) 
 
  249             for( nneg=std::max(0,npos-2); nneg<=(npos+1); nneg++ ) 
 
  251                  for( nzero=0; nzero<numSec/3; nzero++ ) 
 
  253                       if( ++counter < numMul ) 
 
  255                           nt = npos+nneg+nzero;
 
  256                           if( (nt>0) && (nt<=numSec) ) 
 
  258                               protmul[counter] = 
pmltpc(npos,nneg,nzero,nt,protb,c);
 
  259                               protnorm[nt-1] += protmul[counter];
 
  265        for( i=0; i<numMul; i++ )neutmul[i]  = 0.0;
 
  266        for( i=0; i<numSec; i++ )neutnorm[i] = 0.0;
 
  268        for( npos=0; npos<numSec/3; npos++ ) 
 
  270             for( nneg=std::max(0,npos-1); nneg<=(npos+2); nneg++ ) 
 
  272                  for( nzero=0; nzero<numSec/3; nzero++ ) 
 
  274                       if( ++counter < numMul ) 
 
  276                           nt = npos+nneg+nzero;
 
  277                           if( (nt>0) && (nt<=numSec) ) 
 
  279                                neutmul[counter] = 
pmltpc(npos,nneg,nzero,nt,neutb,c);
 
  280                                neutnorm[nt-1] += neutmul[counter];
 
  286        for( i=0; i<numSec; i++ ) 
 
  288             if( protnorm[i] > 0.0 )protnorm[i] = 1.0/protnorm[i];
 
  289             if( neutnorm[i] > 0.0 )neutnorm[i] = 1.0/neutnorm[i];
 
  292        for( i=0; i<numMulAn  ; i++ ) protmulAn[i]  = 0.0;
 
  293        for( i=0; i<numSec    ; i++ ) protnormAn[i] = 0.0;
 
  295        for( npos=1; npos<(numSec/3); npos++ ) 
 
  297             nneg = std::max(0,npos-1); 
 
  298             for( nzero=0; nzero<numSec/3; nzero++ ) 
 
  300                  if( ++counter < numMulAn ) 
 
  302                      nt = npos+nneg+nzero;
 
  303                      if( (nt>1) && (nt<=numSec) ) 
 
  305                          protmulAn[counter] = 
pmltpc(npos,nneg,nzero,nt,protb,c);
 
  306                          protnormAn[nt-1] += protmulAn[counter];
 
  311        for( i=0; i<numMulAn; i++ ) neutmulAn[i]  = 0.0;
 
  312        for( i=0; i<numSec;   i++ ) neutnormAn[i] = 0.0;
 
  314        for( npos=0; npos<numSec/3; npos++ ) 
 
  317             for( nzero=0; nzero<numSec/3; nzero++ ) 
 
  319                  if( ++counter < numMulAn ) 
 
  321                      nt = npos+nneg+nzero;
 
  322                      if( (nt>1) && (nt<=numSec) ) 
 
  324                           neutmulAn[counter] = 
pmltpc(npos,nneg,nzero,nt,neutb,c);
 
  325                           neutnormAn[nt-1] += neutmulAn[counter];
 
  330        for( i=0; i<numSec; i++ ) 
 
  332             if( protnormAn[i] > 0.0 )protnormAn[i] = 1.0/protnormAn[i];
 
  333             if( neutnormAn[i] > 0.0 )neutnormAn[i] = 1.0/neutnormAn[i];
 
  340    pv[0] = incidentParticle;
 
  341    pv[1] = targetParticle;
 
  346        G4double cech[] = {0.50, 0.45, 0.40, 0.35, 0.30, 0.25, 0.06, 0.04, 0.005, 0.};
 
  348        G4int iplab = std::min(9, 
G4int( incidentTotalMomentum*2.5));
 
  349        if( 
G4UniformRand() < cech[iplab]/std::pow(atomicWeight,0.42) ) 
 
  353            if ( targetCode == protonCode)
 
  415   npos = 0; nneg = 0; nzero = 0;
 
  416   G4double anhl[] = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 0.97, 0.88, 
 
  417                      0.85, 0.81, 0.75, 0.64, 0.64, 0.55, 0.55, 0.45, 0.47, 0.40, 
 
  418                      0.39, 0.36, 0.33, 0.10, 0.01};
 
  419   G4int            iplab =      
G4int( incidentTotalMomentum*10.);
 
  420   if ( iplab >  9) iplab = 10 + 
G4int( (incidentTotalMomentum  -1.)*5. );          
 
  421   if ( iplab > 14) iplab = 15 + 
G4int(  incidentTotalMomentum  -2.     );
 
  422   if ( iplab > 22) iplab = 23 + 
G4int( (incidentTotalMomentum -10.)/10.); 
 
  423                    iplab = std::min(24, iplab);
 
  428     G4double aleab = std::log(availableEnergy);
 
  429     G4double n = 3.62567+aleab*(0.665843+aleab*(0.336514
 
  430                         + aleab*(0.117712+0.0136912*aleab))) - 2.0;
 
  436     for (nt = 1; nt <= numSec; nt++) {
 
  437       test = std::exp( std::min( expxu, std::max( expxl, -(
pi/4.0)*(nt*nt)/(n*n) ) ) );
 
  438       dum = 
pi*nt/(2.0*n*
n);
 
  439       if (std::fabs(dum) < 1.0) { 
 
  440         if (test >= 1.0
e-10) anpn += dum*
test;
 
  448     if (targetCode == protonCode) {
 
  450       for (npos = 0; npos < numSec/3; npos++) {
 
  451         for (nneg = std::max(0,npos-2); nneg <= (npos+1); nneg++) {
 
  452           for (nzero = 0; nzero < numSec/3; nzero++) {
 
  453             if (++counter < numMul) {
 
  454               nt = npos+nneg+nzero;
 
  455               if ((nt > 0) && (nt <= numSec) ) {
 
  456                 test = std::exp( std::min( expxu, std::max( expxl, -(
pi/4.0)*(nt*nt)/(n*n) ) ) );
 
  457                 dum = (
pi/anpn)*nt*protmul[counter]*protnorm[nt-1]/(2.0*n*n);
 
  459                 if (std::fabs(dum) < 1.0) { 
 
  460                   if (test >= 1.0
e-10) excs += dum*
test;
 
  465                 if (ran < excs) 
goto outOfLoop;      
 
  476                for( npos=0; npos<numSec/3; npos++ ) 
 
  478                     for( nneg=std::max(0,npos-1); nneg<=(npos+2); nneg++ ) 
 
  480                          for( nzero=0; nzero<numSec/3; nzero++ ) 
 
  482                               if( ++counter < numMul ) 
 
  484                                   nt = npos+nneg+nzero;
 
  485                                   if( (nt>0) && (nt<=numSec) ) 
 
  487                                       test = std::exp( std::min( expxu, std::max( expxl, -(
pi/4.0)*(nt*nt)/(n*n) ) ) );
 
  488                                       dum = (
pi/anpn)*nt*neutmul[counter]*neutnorm[nt-1]/(2.0*n*n);
 
  489                                       if (std::fabs(dum) < 1.0) { 
 
  490                                         if( test >= 1.0
e-10 )excs += dum*
test;
 
  495                                       if (ran < excs) 
goto outOfLoop;       
 
  510        if( targetCode == protonCode)
 
  527            else if (npos == (nneg+1))
 
  543            else if (npos == (nneg-1))
 
  570            else if ( npos == (nneg-1))
 
  586            else if (npos == (nneg+1))
 
  603            G4double aleab = std::log(availableEnergy);
 
  604            G4double n     = 3.62567+aleab*(0.665843+aleab*(0.336514
 
  605                             + aleab*(0.117712+0.0136912*aleab))) - 2.0;
 
  611            for (nt=2; nt<=numSec; nt++) {
 
  612              test = std::exp( std::min( expxu, std::max( expxl, -(
pi/4.0)*(nt*nt)/(n*n) ) ) );
 
  613              dum = 
pi*nt/(2.0*n*
n);
 
  615              if (std::fabs(dum) < 1.0) { 
 
  616                if( test >= 1.0
e-10 )anpn += dum*
test;
 
  624            if (targetCode == protonCode) {
 
  626              for (npos=1; npos<numSec/3; npos++) {
 
  628                for( nzero=0; nzero<numSec/3; nzero++ ) 
 
  630                    if( ++counter < numMulAn ) 
 
  632                        nt = npos+nneg+nzero;
 
  633                        if( (nt>1) && (nt<=numSec) ) {
 
  634                          test = std::exp( std::min( expxu, std::max( expxl, -(
pi/4.0)*(nt*nt)/(n*n) ) ) );
 
  635                          dum = (
pi/anpn)*nt*protmulAn[counter]*protnormAn[nt-1]/(2.0*n*n);
 
  637                          if (std::fabs(dum) < 1.0) { 
 
  638                            if( test >= 1.0
e-10 )excs += dum*
test;
 
  643                          if (ran < excs) 
goto outOfLoopAn;      
 
  654              for (npos=0; npos<numSec/3; npos++) { 
 
  656                for( nzero=0; nzero<numSec/3; nzero++ ) {
 
  657                  if (++counter < numMulAn) {
 
  658                    nt = npos+nneg+nzero;
 
  659                    if( (nt>1) && (nt<=numSec) ) {
 
  660                      test = std::exp( std::min( expxu, std::max( expxl, -(
pi/4.0)*(nt*nt)/(n*n) ) ) );
 
  661                      dum = (
pi/anpn)*nt*neutmulAn[counter]*neutnormAn[nt-1]/(2.0*n*n);
 
  663                      if (std::fabs(dum) < 1.0) { 
 
  664                        if( test >= 1.0
e-10 )excs += dum*
test;
 
  669                      if (ran < excs) 
goto outOfLoopAn;       
 
  683    nt = npos + nneg + nzero;
 
  694          else if ( ran < (
G4double)(npos+nneg)/nt)
 
  710          nt = npos + nneg + nzero;
 
  714         G4cout << 
"Particles produced: " ;
 
  717         for (i=2; i < vecLen; i++)