51#include "FullModelReactionDynamics.hh"
52#include "G4Version.hh"
53#include "G4AntiProton.hh"
54#include "G4AntiNeutron.hh"
55#include "Randomize.hh"
57#if G4VERSION_NUMBER < 1100
58#include "G4HadReentrentException.hh"
60#include "G4HadronicException.hh"
105G4bool FullModelReactionDynamics::GenerateXandPt(
106 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
108 G4ReactionProduct &modifiedOriginal,
109 const G4HadProjectile *originalIncident,
110 G4ReactionProduct ¤tParticle,
111 G4ReactionProduct &targetParticle,
112 const G4Nucleus &targetNucleus,
113 G4bool &incidentHasChanged,
114 G4bool &targetHasChanged,
116 G4ReactionProduct &leadingStrangeParticle )
131 if(vecLen == 0)
return false;
133 G4ParticleDefinition *aPiMinus = G4PionMinus::PionMinus();
136 G4ParticleDefinition *aProton = G4Proton::Proton();
137 G4ParticleDefinition *aNeutron = G4Neutron::Neutron();
138 G4ParticleDefinition *aPiPlus = G4PionPlus::PionPlus();
139 G4ParticleDefinition *aPiZero = G4PionZero::PionZero();
140 G4ParticleDefinition *aKaonPlus = G4KaonPlus::KaonPlus();
141 G4ParticleDefinition *aKaonMinus = G4KaonMinus::KaonMinus();
142 G4ParticleDefinition *aKaonZeroS = G4KaonZeroShort::KaonZeroShort();
143 G4ParticleDefinition *aKaonZeroL = G4KaonZeroLong::KaonZeroLong();
147 G4bool veryForward =
false;
149 const G4double ekOriginal = modifiedOriginal.GetKineticEnergy()/CLHEP::GeV;
150 const G4double etOriginal = modifiedOriginal.GetTotalEnergy()/CLHEP::GeV;
151 const G4double mOriginal = modifiedOriginal.GetMass()/CLHEP::GeV;
152 const G4double pOriginal = modifiedOriginal.GetMomentum().mag()/CLHEP::GeV;
153 G4double targetMass = targetParticle.GetDefinition()->GetPDGMass()/CLHEP::GeV;
154 G4double centerofmassEnergy = std::sqrt( mOriginal*mOriginal +
155 targetMass*targetMass +
156 2.0*targetMass*etOriginal );
157 G4double currentMass = currentParticle.GetMass()/CLHEP::GeV;
158 targetMass = targetParticle.GetMass()/CLHEP::GeV;
163 for( i=0;
i<vecLen; ++
i )
165 G4int itemp = G4int( G4UniformRand()*vecLen );
166 G4ReactionProduct pTemp = *
vec[itemp];
172 if( currentMass == 0.0 && targetMass == 0.0 )
175 G4double ek = currentParticle.GetKineticEnergy();
176 G4ThreeVector
m = currentParticle.GetMomentum();
177 currentParticle = *
vec[0];
178 targetParticle = *
vec[1];
179 for( i=0;
i<(vecLen-2); ++
i )*
vec[i] = *
vec[i+2];
180 G4ReactionProduct *temp =
vec[vecLen-1];
182 temp =
vec[vecLen-2];
185 currentMass = currentParticle.GetMass()/CLHEP::GeV;
186 targetMass = targetParticle.GetMass()/CLHEP::GeV;
187 incidentHasChanged =
true;
188 targetHasChanged =
true;
189 currentParticle.SetKineticEnergy( ek );
190 currentParticle.SetMomentum( m );
194 const G4double atomicWeight = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
196 const G4double atomicNumber = targetNucleus.GetZ_asInt();
197 const G4double protonMass = aProton->GetPDGMass()/CLHEP::MeV;
198 if( (originalIncident->GetDefinition() == aKaonMinus ||
199 originalIncident->GetDefinition() == aKaonZeroL ||
200 originalIncident->GetDefinition() == aKaonZeroS ||
201 originalIncident->GetDefinition() == aKaonPlus) &&
202 G4UniformRand() >= 0.7 )
204 G4ReactionProduct temp = currentParticle;
205 currentParticle = targetParticle;
206 targetParticle = temp;
207 incidentHasChanged =
true;
208 targetHasChanged =
true;
209 currentMass = currentParticle.GetMass()/CLHEP::GeV;
210 targetMass = targetParticle.GetMass()/CLHEP::GeV;
212 const G4double afc = std::min( 0.75,
213 0.312+0.200*std::log(std::log(centerofmassEnergy*centerofmassEnergy))+
214 std::pow(centerofmassEnergy*centerofmassEnergy,1.5)/6000.0 );
218 G4double freeEnergy = centerofmassEnergy-currentMass-targetMass;
222 G4cout<<
"Free energy < 0!"<<G4endl;
223 G4cout<<
"E_CMS = "<<centerofmassEnergy<<
" GeV"<<G4endl;
224 G4cout<<
"m_curr = "<<currentMass<<
" GeV"<<G4endl;
225 G4cout<<
"m_orig = "<<mOriginal<<
" GeV"<<G4endl;
226 G4cout<<
"m_targ = "<<targetMass<<
" GeV"<<G4endl;
227 G4cout<<
"E_free = "<<freeEnergy<<
" GeV"<<G4endl;
230 G4double forwardEnergy = freeEnergy/2.;
231 G4int forwardCount = 1;
233 G4double backwardEnergy = freeEnergy/2.;
234 G4int backwardCount = 1;
237 if(currentParticle.GetSide()==-1)
239 forwardEnergy += currentMass;
241 backwardEnergy -= currentMass;
244 if(targetParticle.GetSide()!=-1)
246 backwardEnergy += targetMass;
248 forwardEnergy -= targetMass;
252 for( i=0;
i<vecLen; ++
i )
254 if(
vec[i]->GetSide() == -1 )
257 backwardEnergy -=
vec[
i]->GetMass()/CLHEP::GeV;
260 forwardEnergy -=
vec[
i]->GetMass()/CLHEP::GeV;
269 if( centerofmassEnergy < (2.0+G4UniformRand()) )
270 xtarg = afc * (std::pow(atomicWeight,0.33)-1.0) * (2.0*backwardCount+vecLen+2)/2.0;
272 xtarg = afc * (std::pow(atomicWeight,0.33)-1.0) * (2.0*backwardCount);
273 if( xtarg <= 0.0 )xtarg = 0.01;
274 G4int nuclearExcitationCount =
Poisson( xtarg );
275 if(atomicWeight<1.0001) nuclearExcitationCount = 0;
276 G4int extraNucleonCount = 0;
277 if( nuclearExcitationCount > 0 )
279 const G4double nucsup[] = { 1.00, 0.7, 0.5, 0.4, 0.35, 0.3 };
280 const G4double psup[] = { 3., 6., 20., 50., 100., 1000. };
281 G4int momentumBin = 0;
282 while( (momentumBin < 6) &&
283 (modifiedOriginal.GetTotalMomentum()/CLHEP::GeV > psup[momentumBin]) )
285 momentumBin = std::min( 5, momentumBin );
291 for( i=0;
i<nuclearExcitationCount; ++
i )
293 G4ReactionProduct * pVec =
new G4ReactionProduct();
294 if( G4UniformRand() < nucsup[momentumBin] )
296 if( G4UniformRand() > 1.0-atomicNumber/atomicWeight )
297 pVec->SetDefinition( aProton );
299 pVec->SetDefinition( aNeutron );
302 backwardEnergy += pVec->GetMass()/CLHEP::GeV;
306 G4double ran = G4UniformRand();
308 pVec->SetDefinition( aPiPlus );
309 else if( ran < 0.6819 )
310 pVec->SetDefinition( aPiZero );
312 pVec->SetDefinition( aPiMinus );
315 pVec->SetNewlyAdded(
true );
316 vec.SetElement( vecLen++, pVec );
318 backwardEnergy -= pVec->GetMass()/CLHEP::GeV;
326 while( forwardEnergy <= 0.0 )
329 iskip = G4int(G4UniformRand()*forwardCount) + 1;
331 G4int forwardParticlesLeft = 0;
332 for( i=(vecLen-1);
i>=0; --
i )
334 if(
vec[i]->GetSide() == 1 &&
vec[i]->GetMayBeKilled())
336 forwardParticlesLeft = 1;
339 forwardEnergy +=
vec[
i]->GetMass()/CLHEP::GeV;
340 for( G4int j=i; j<(vecLen-1); j++ )*
vec[j] = *
vec[j+1];
342 G4ReactionProduct *temp =
vec[vecLen-1];
344 if( --vecLen == 0 )
return false;
350 if( forwardParticlesLeft == 0 )
352 forwardEnergy += currentParticle.GetMass()/CLHEP::GeV;
353 currentParticle.SetDefinitionAndUpdateE( targetParticle.GetDefinition() );
354 targetParticle.SetDefinitionAndUpdateE(
vec[0]->GetDefinition() );
357 for( G4int j=0; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
358 G4ReactionProduct *temp =
vec[vecLen-1];
360 if( --vecLen == 0 )
return false;
365 while( backwardEnergy <= 0.0 )
368 iskip = G4int(G4UniformRand()*backwardCount) + 1;
370 G4int backwardParticlesLeft = 0;
371 for( i=(vecLen-1);
i>=0; --
i )
373 if(
vec[i]->GetSide() < 0 &&
vec[i]->GetMayBeKilled())
375 backwardParticlesLeft = 1;
378 if(
vec[i]->GetSide() == -2 )
381 backwardEnergy -=
vec[
i]->GetTotalEnergy()/CLHEP::GeV;
383 backwardEnergy +=
vec[
i]->GetTotalEnergy()/CLHEP::GeV;
384 for( G4int j=i; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
386 G4ReactionProduct *temp =
vec[vecLen-1];
388 if( --vecLen == 0 )
return false;
394 if( backwardParticlesLeft == 0 )
396 backwardEnergy += targetParticle.GetMass()/CLHEP::GeV;
397 targetParticle = *
vec[0];
399 for( G4int j=0; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
400 G4ReactionProduct *temp =
vec[vecLen-1];
402 if( --vecLen == 0 )
return false;
411 G4ReactionProduct pseudoParticle[10];
412 for( i=0;
i<10; ++
i )pseudoParticle[i].SetZero();
414 pseudoParticle[0].SetMass( mOriginal*CLHEP::GeV );
415 pseudoParticle[0].SetMomentum( 0.0, 0.0, pOriginal*CLHEP::GeV );
416 pseudoParticle[0].SetTotalEnergy(
417 std::sqrt( pOriginal*pOriginal + mOriginal*mOriginal )*CLHEP::GeV );
419 pseudoParticle[1].SetMass( protonMass*CLHEP::MeV );
420 pseudoParticle[1].SetTotalEnergy( protonMass*CLHEP::MeV );
422 pseudoParticle[3].SetMass( protonMass*(1+extraNucleonCount)*CLHEP::MeV );
423 pseudoParticle[3].SetTotalEnergy( protonMass*(1+extraNucleonCount)*CLHEP::MeV );
425 pseudoParticle[8].SetMomentum( 1.0*CLHEP::GeV, 0.0, 0.0 );
427 pseudoParticle[2] = pseudoParticle[0] + pseudoParticle[1];
428 pseudoParticle[3] = pseudoParticle[3] + pseudoParticle[0];
430 pseudoParticle[0].Lorentz( pseudoParticle[0], pseudoParticle[2] );
431 pseudoParticle[1].Lorentz( pseudoParticle[1], pseudoParticle[2] );
438 G4double aspar,
pt,
et,
x, pp, pp1, rthnve, phinve, rmb, wgt;
439 G4int innerCounter, outerCounter;
440 G4bool eliminateThisParticle, resetEnergies, constantCrossSection;
442 G4double forwardKinetic = 0.0, backwardKinetic = 0.0;
448 G4double binl[20] = {0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.11,1.25,
449 1.43,1.67,2.0,2.5,3.33,5.00,10.00};
450 G4int backwardNucleonCount = 0;
451 G4double totalEnergy, kineticEnergy, vecMass;
453 for( i=(vecLen-1);
i>=0; --
i )
455 G4double
phi = G4UniformRand()*CLHEP::twopi;
456 if(
vec[i]->GetNewlyAdded() )
458 if(
vec[i]->GetSide() == -2 )
460 if( backwardNucleonCount < 18 )
462 if(
vec[i]->GetDefinition() == G4PionMinus::PionMinus() ||
463 vec[i]->GetDefinition() == G4PionPlus::PionPlus() ||
464 vec[i]->GetDefinition() == G4PionZero::PionZero() )
466 for(G4int i=0;
i<vecLen;
i++)
delete vec[i];
468#if G4VERSION_NUMBER < 1100
469 throw G4HadReentrentException(__FILE__, __LINE__,
471 throw G4HadronicException(__FILE__, __LINE__,
473 "FullModelReactionDynamics::GenerateXandPt : a pion has been counted as a backward nucleon");
475 vec[
i]->SetSide( -3 );
476 ++backwardNucleonCount;
485 vecMass =
vec[
i]->GetMass()/CLHEP::GeV;
486 G4double ran = -std::log(1.0-G4UniformRand())/3.5;
487 if(
vec[i]->GetSide() == -2 )
489 if(
vec[i]->GetDefinition() == aKaonMinus ||
490 vec[i]->GetDefinition() == aKaonZeroL ||
491 vec[i]->GetDefinition() == aKaonZeroS ||
492 vec[i]->GetDefinition() == aKaonPlus ||
493 vec[i]->GetDefinition() == aPiMinus ||
494 vec[i]->GetDefinition() == aPiZero ||
495 vec[i]->GetDefinition() == aPiPlus )
498 pt = std::sqrt( std::pow( ran, 1.7 ) );
501 pt = std::sqrt( std::pow( ran, 1.2 ) );
504 if(
vec[i]->GetDefinition() == aPiMinus ||
505 vec[i]->GetDefinition() == aPiZero ||
506 vec[i]->GetDefinition() == aPiPlus )
509 pt = std::sqrt( std::pow( ran, 1.7 ) );
510 }
else if(
vec[i]->GetDefinition() == aKaonMinus ||
511 vec[i]->GetDefinition() == aKaonZeroL ||
512 vec[i]->GetDefinition() == aKaonZeroS ||
513 vec[i]->GetDefinition() == aKaonPlus )
516 pt = std::sqrt( std::pow( ran, 1.7 ) );
519 pt = std::sqrt( std::pow( ran, 1.5 ) );
522 pt = std::max( 0.001, pt );
523 vec[
i]->SetMomentum( pt*std::cos(
phi)*CLHEP::GeV, pt*std::sin(
phi)*CLHEP::GeV );
524 for( G4int j=0; j<20; ++j )binl[j] = j/(19.*pt);
525 if(
vec[i]->GetSide() > 0 )
526 et = pseudoParticle[0].GetTotalEnergy()/CLHEP::GeV;
528 et = pseudoParticle[1].GetTotalEnergy()/CLHEP::GeV;
534 eliminateThisParticle =
true;
535 resetEnergies =
true;
536 while( ++outerCounter < 3 )
538 for( l=1;
l<20; ++
l )
540 x = (binl[
l]+binl[
l-1])/2.;
541 pt = std::max( 0.001, pt );
543 dndl[
l] += dndl[
l-1];
545 dndl[
l] =
et * aspar/std::sqrt( std::pow((1.+aspar*
x*aspar*
x),3) )
546 * (binl[
l]-binl[
l-1]) / std::sqrt( pt*
x*
et*pt*
x*
et + pt*pt + vecMass*vecMass )
550 vec[
i]->SetMomentum( pt*std::cos(
phi)*CLHEP::GeV, pt*std::sin(
phi)*CLHEP::GeV );
554 while( ++innerCounter < 7 )
556 ran = G4UniformRand()*dndl[19];
558 while(l<19 && ran>=dndl[l])
l++;
559 x = std::min( 1.0, pt*(binl[l-1] + G4UniformRand()*(binl[l]-binl[l-1])/2.) );
560 if(
vec[i]->GetSide() < 0 )
x *= -1.;
561 vec[
i]->SetMomentum(
x*
et*CLHEP::GeV );
562 totalEnergy = std::sqrt(
x*
et*
x*
et + pt*pt + vecMass*vecMass );
563 vec[
i]->SetTotalEnergy( totalEnergy*CLHEP::GeV );
564 kineticEnergy =
vec[
i]->GetKineticEnergy()/CLHEP::GeV;
565 if(
vec[i]->GetSide() > 0 )
567 if( (forwardKinetic+kineticEnergy) < 0.95*forwardEnergy )
569 pseudoParticle[4] = pseudoParticle[4] + (*
vec[
i]);
570 forwardKinetic += kineticEnergy;
571 pseudoParticle[6] = pseudoParticle[4] + pseudoParticle[5];
572 pseudoParticle[6].SetMomentum( 0.0 );
573 phi = pseudoParticle[6].Angle( pseudoParticle[8] );
574 if( pseudoParticle[6].GetMomentum().
y()/CLHEP::MeV < 0.0 )
phi = CLHEP::twopi -
phi;
575 phi += CLHEP::pi + normal()*CLHEP::pi/12.0;
576 if(
phi > CLHEP::twopi )
phi -= CLHEP::twopi;
579 eliminateThisParticle =
false;
580 resetEnergies =
false;
583 if( innerCounter > 5 )
break;
584 if( backwardEnergy >= vecMass )
586 vec[
i]->SetSide( -1 );
587 forwardEnergy += vecMass;
588 backwardEnergy -= vecMass;
592 if( extraNucleonCount > 19 )
594 G4double xxx = 0.95+0.05*extraNucleonCount/20.0;
595 if( (backwardKinetic+kineticEnergy) < xxx*backwardEnergy )
597 pseudoParticle[5] = pseudoParticle[5] + (*
vec[
i]);
598 backwardKinetic += kineticEnergy;
599 pseudoParticle[6] = pseudoParticle[4] + pseudoParticle[5];
600 pseudoParticle[6].SetMomentum( 0.0 );
601 phi = pseudoParticle[6].Angle( pseudoParticle[8] );
602 if( pseudoParticle[6].GetMomentum().
y()/CLHEP::MeV < 0.0 )
phi = CLHEP::twopi -
phi;
603 phi += CLHEP::pi + normal() * CLHEP::pi / 12.0;
604 if(
phi > CLHEP::twopi )
phi -= CLHEP::twopi;
607 eliminateThisParticle =
false;
608 resetEnergies =
false;
611 if( innerCounter > 5 )
break;
612 if( forwardEnergy >= vecMass )
614 vec[
i]->SetSide( 1 );
615 forwardEnergy -= vecMass;
616 backwardEnergy += vecMass;
632 forwardKinetic = 0.0;
633 backwardKinetic = 0.0;
634 pseudoParticle[4].SetZero();
635 pseudoParticle[5].SetZero();
636 for( l=i+1;
l<vecLen; ++
l )
638 if(
vec[l]->GetSide() > 0 ||
639 vec[l]->GetDefinition() == aKaonMinus ||
640 vec[l]->GetDefinition() == aKaonZeroL ||
641 vec[l]->GetDefinition() == aKaonZeroS ||
642 vec[l]->GetDefinition() == aKaonPlus ||
643 vec[l]->GetDefinition() == aPiMinus ||
644 vec[l]->GetDefinition() == aPiZero ||
645 vec[l]->GetDefinition() == aPiPlus )
647 G4double tempMass =
vec[
l]->GetMass()/CLHEP::MeV;
648 totalEnergy = 0.95*
vec[
l]->GetTotalEnergy()/CLHEP::MeV + 0.05*tempMass;
649 totalEnergy = std::max( tempMass, totalEnergy );
650 vec[
l]->SetTotalEnergy( totalEnergy*CLHEP::MeV );
651 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - tempMass*tempMass ) );
652 pp1 =
vec[
l]->GetMomentum().mag()/CLHEP::MeV;
653 if( pp1 < 1.0e-6*CLHEP::GeV )
655 G4double rthnve = CLHEP::pi*G4UniformRand();
656 G4double phinve = CLHEP::twopi*G4UniformRand();
657 G4double srth = std::sin(rthnve);
658 vec[
l]->SetMomentum( pp*srth*std::cos(phinve)*CLHEP::MeV,
659 pp*srth*std::sin(phinve)*CLHEP::MeV,
660 pp*std::cos(rthnve)*CLHEP::MeV ) ;
662 vec[
l]->SetMomentum(
vec[l]->GetMomentum() * (pp/pp1) );
664 G4double
px =
vec[
l]->GetMomentum().x()/CLHEP::MeV;
665 G4double
py =
vec[
l]->GetMomentum().y()/CLHEP::MeV;
666 pt = std::max( 1.0, std::sqrt( px*px + py*py ) )/CLHEP::GeV;
667 if(
vec[l]->GetSide() > 0 )
669 forwardKinetic +=
vec[
l]->GetKineticEnergy()/CLHEP::GeV;
670 pseudoParticle[4] = pseudoParticle[4] + (*
vec[
l]);
672 backwardKinetic +=
vec[
l]->GetKineticEnergy()/CLHEP::GeV;
673 pseudoParticle[5] = pseudoParticle[5] + (*
vec[
l]);
680 if( eliminateThisParticle &&
vec[i]->GetMayBeKilled())
682 if(
vec[i]->GetSide() > 0 )
685 forwardEnergy += vecMass;
687 if(
vec[i]->GetSide() == -2 )
690 backwardEnergy -= vecMass;
693 backwardEnergy += vecMass;
695 for( G4int j=i; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
696 G4ReactionProduct *temp =
vec[vecLen-1];
699 if( --vecLen == 0 )
return false;
700 pseudoParticle[6] = pseudoParticle[4] + pseudoParticle[5];
701 pseudoParticle[6].SetMomentum( 0.0 );
702 phi = pseudoParticle[6].Angle( pseudoParticle[8] );
703 if( pseudoParticle[6].GetMomentum().
y()/CLHEP::MeV < 0.0 )
phi = CLHEP::twopi -
phi;
704 phi += CLHEP::pi + normal() * CLHEP::pi / 12.0;
705 if(
phi > CLHEP::twopi )
phi -= CLHEP::twopi;
715 G4double
phi = G4UniformRand()*CLHEP::twopi;
716 G4double ran = -std::log(1.0-G4UniformRand());
717 if( currentParticle.GetDefinition() == aPiMinus ||
718 currentParticle.GetDefinition() == aPiZero ||
719 currentParticle.GetDefinition() == aPiPlus )
722 pt = std::sqrt( std::pow( ran/6.0, 1.7 ) );
723 }
else if( currentParticle.GetDefinition() == aKaonMinus ||
724 currentParticle.GetDefinition() == aKaonZeroL ||
725 currentParticle.GetDefinition() == aKaonZeroS ||
726 currentParticle.GetDefinition() == aKaonPlus )
729 pt = std::sqrt( std::pow( ran/5.0, 1.4 ) );
732 pt = std::sqrt( std::pow( ran/4.0, 1.2 ) );
734 for( G4int j=0; j<20; ++j )binl[j] = j/(19.*pt);
735 currentParticle.SetMomentum( pt*std::cos(
phi)*CLHEP::GeV, pt*std::sin(
phi)*CLHEP::GeV );
736 et = pseudoParticle[0].GetTotalEnergy()/CLHEP::GeV;
738 vecMass = currentParticle.GetMass()/CLHEP::GeV;
739 for( l=1;
l<20; ++
l )
741 x = (binl[
l]+binl[
l-1])/2.;
743 dndl[
l] += dndl[
l-1];
745 dndl[
l] = aspar/std::sqrt( std::pow((1.+
sqr(aspar*
x)),3) ) *
746 (binl[
l]-binl[
l-1]) *
et / std::sqrt( pt*
x*
et*pt*
x*
et + pt*pt + vecMass*vecMass ) +
749 ran = G4UniformRand()*dndl[19];
751 while( (l<20) && (ran>dndl[l]) )
l++;
752 l = std::min( 19, l );
753 x = std::min( 1.0, pt*(binl[l-1] + G4UniformRand()*(binl[l]-binl[l-1])/2.) );
754 currentParticle.SetMomentum(
x*
et*CLHEP::GeV );
755 if( forwardEnergy < forwardKinetic )
756 totalEnergy = vecMass + 0.04*std::fabs(normal());
758 totalEnergy = vecMass + forwardEnergy - forwardKinetic;
759 currentParticle.SetTotalEnergy( totalEnergy*CLHEP::GeV );
760 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - vecMass*vecMass ) )*CLHEP::GeV;
761 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
762 if( pp1 < 1.0e-6*CLHEP::GeV )
764 G4double rthnve = CLHEP::pi*G4UniformRand();
765 G4double phinve = CLHEP::twopi*G4UniformRand();
766 G4double srth = std::sin(rthnve);
767 currentParticle.SetMomentum( pp*srth*std::cos(phinve)*CLHEP::MeV,
768 pp*srth*std::sin(phinve)*CLHEP::MeV,
769 pp*std::cos(rthnve)*CLHEP::MeV );
771 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
773 pseudoParticle[4] = pseudoParticle[4] + currentParticle;
778 if( backwardNucleonCount < 18 )
780 targetParticle.SetSide( -3 );
781 ++backwardNucleonCount;
788 vecMass = targetParticle.GetMass()/CLHEP::GeV;
789 ran = -std::log(1.0-G4UniformRand());
791 pt = std::max( 0.001, std::sqrt( std::pow( ran/4.0, 1.2 ) ) );
792 targetParticle.SetMomentum( pt*std::cos(
phi)*CLHEP::GeV, pt*std::sin(
phi)*CLHEP::GeV );
793 for( G4int j=0; j<20; ++j )binl[j] = (j-1.)/(19.*
pt);
794 et = pseudoParticle[1].GetTotalEnergy()/CLHEP::GeV;
797 eliminateThisParticle =
true;
798 resetEnergies =
true;
799 while( ++outerCounter < 3 )
801 for( l=1;
l<20; ++
l )
803 x = (binl[
l]+binl[
l-1])/2.;
805 dndl[
l] += dndl[
l-1];
807 dndl[
l] = aspar/std::sqrt( std::pow((1.+aspar*
x*aspar*
x),3) ) *
808 (binl[
l]-binl[
l-1])*
et / std::sqrt( pt*
x*
et*pt*
x*
et+pt*pt+vecMass*vecMass ) +
812 while( ++innerCounter < 7 )
815 ran = G4UniformRand()*dndl[19];
816 while( ( l < 20 ) && ( ran >= dndl[l] ) )
l++;
817 l = std::min( 19, l );
818 x = std::min( 1.0, pt*(binl[l-1] + G4UniformRand()*(binl[l]-binl[l-1])/2.) );
819 if( targetParticle.GetSide() < 0 )
x *= -1.;
820 targetParticle.SetMomentum(
x*
et*CLHEP::GeV );
821 totalEnergy = std::sqrt(
x*
et*
x*
et + pt*pt + vecMass*vecMass );
822 targetParticle.SetTotalEnergy( totalEnergy*CLHEP::GeV );
823 if( targetParticle.GetSide() < 0 )
825 if( extraNucleonCount > 19 )
x=0.999;
826 G4double xxx = 0.95+0.05*extraNucleonCount/20.0;
827 if( (backwardKinetic+totalEnergy-vecMass) < xxx*backwardEnergy )
829 pseudoParticle[5] = pseudoParticle[5] + targetParticle;
830 backwardKinetic += totalEnergy - vecMass;
831 pseudoParticle[6] = pseudoParticle[4] + pseudoParticle[5];
832 pseudoParticle[6].SetMomentum( 0.0 );
833 phi = pseudoParticle[6].Angle( pseudoParticle[8] );
834 if( pseudoParticle[6].GetMomentum().
y()/CLHEP::MeV < 0.0 )
phi = CLHEP::twopi -
phi;
835 phi += CLHEP::pi + normal() * CLHEP::pi / 12.0;
836 if(
phi > CLHEP::twopi )
phi -= CLHEP::twopi;
839 eliminateThisParticle =
false;
840 resetEnergies =
false;
843 if( innerCounter > 5 )
break;
844 if( forwardEnergy >= vecMass )
846 targetParticle.SetSide( 1 );
847 forwardEnergy -= vecMass;
848 backwardEnergy += vecMass;
851 G4ThreeVector
momentum = targetParticle.GetMomentum();
858 if( forwardEnergy < forwardKinetic )
859 totalEnergy = vecMass + 0.04*std::fabs(normal());
861 totalEnergy = vecMass + forwardEnergy - forwardKinetic;
862 targetParticle.SetTotalEnergy( totalEnergy*CLHEP::GeV );
863 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - vecMass*vecMass ) )*CLHEP::GeV;
864 pp1 = targetParticle.GetMomentum().mag()/CLHEP::MeV;
865 if( pp1 < 1.0e-6*CLHEP::GeV )
867 G4double rthnve = CLHEP::pi*G4UniformRand();
868 G4double phinve = CLHEP::twopi*G4UniformRand();
869 G4double srth = std::sin(rthnve);
870 targetParticle.SetMomentum( pp*srth*std::cos(phinve)*CLHEP::MeV,
871 pp*srth*std::sin(phinve)*CLHEP::MeV,
872 pp*std::cos(rthnve)*CLHEP::MeV );
875 targetParticle.SetMomentum( targetParticle.GetMomentum() * (pp/pp1) );
877 pseudoParticle[4] = pseudoParticle[4] + targetParticle;
879 eliminateThisParticle =
false;
880 resetEnergies =
false;
891 forwardKinetic = backwardKinetic = 0.0;
892 pseudoParticle[4].SetZero();
893 pseudoParticle[5].SetZero();
894 for( l=0;
l<vecLen; ++
l )
896 if(
vec[l]->GetSide() > 0 ||
897 vec[l]->GetDefinition() == aKaonMinus ||
898 vec[l]->GetDefinition() == aKaonZeroL ||
899 vec[l]->GetDefinition() == aKaonZeroS ||
900 vec[l]->GetDefinition() == aKaonPlus ||
901 vec[l]->GetDefinition() == aPiMinus ||
902 vec[l]->GetDefinition() == aPiZero ||
903 vec[l]->GetDefinition() == aPiPlus )
905 G4double tempMass =
vec[
l]->GetMass()/CLHEP::GeV;
907 std::max( tempMass, 0.95*
vec[l]->GetTotalEnergy()/CLHEP::GeV + 0.05*tempMass );
908 vec[
l]->SetTotalEnergy( totalEnergy*CLHEP::GeV );
909 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - tempMass*tempMass ) )*CLHEP::GeV;
910 pp1 =
vec[
l]->GetMomentum().mag()/CLHEP::MeV;
911 if( pp1 < 1.0e-6*CLHEP::GeV )
913 G4double rthnve = CLHEP::pi*G4UniformRand();
914 G4double phinve = CLHEP::twopi*G4UniformRand();
915 G4double srth = std::sin(rthnve);
916 vec[
l]->SetMomentum( pp*srth*std::cos(phinve)*CLHEP::MeV,
917 pp*srth*std::sin(phinve)*CLHEP::MeV,
918 pp*std::cos(rthnve)*CLHEP::MeV );
921 vec[
l]->SetMomentum(
vec[l]->GetMomentum() * (pp/pp1) );
923 pt = std::max( 0.001*CLHEP::GeV, std::sqrt(
sqr(
vec[l]->GetMomentum().
x()/CLHEP::MeV) +
924 sqr(
vec[l]->GetMomentum().
y()/CLHEP::MeV) ) )/CLHEP::GeV;
925 if(
vec[l]->GetSide() > 0)
927 forwardKinetic +=
vec[
l]->GetKineticEnergy()/CLHEP::GeV;
928 pseudoParticle[4] = pseudoParticle[4] + (*
vec[
l]);
930 backwardKinetic +=
vec[
l]->GetKineticEnergy()/CLHEP::GeV;
931 pseudoParticle[5] = pseudoParticle[5] + (*
vec[
l]);
947 pseudoParticle[6].Lorentz( pseudoParticle[3], pseudoParticle[2] );
948 pseudoParticle[6] = pseudoParticle[6] - pseudoParticle[4];
949 pseudoParticle[6] = pseudoParticle[6] - pseudoParticle[5];
950 if( backwardNucleonCount == 1 )
953 std::min( backwardEnergy-backwardKinetic, centerofmassEnergy/2.0-protonMass/CLHEP::GeV );
954 if( ekin < 0.04 )ekin = 0.04 * std::fabs( normal() );
955 vecMass = targetParticle.GetMass()/CLHEP::GeV;
956 totalEnergy = ekin+vecMass;
957 targetParticle.SetTotalEnergy( totalEnergy*CLHEP::GeV );
958 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - vecMass*vecMass ) )*CLHEP::GeV;
959 pp1 = pseudoParticle[6].GetMomentum().mag()/CLHEP::MeV;
960 if( pp1 < 1.0e-6*CLHEP::GeV )
962 rthnve = CLHEP::pi*G4UniformRand();
963 phinve = CLHEP::twopi*G4UniformRand();
964 G4double srth = std::sin(rthnve);
965 targetParticle.SetMomentum( pp*srth*std::cos(phinve)*CLHEP::MeV,
966 pp*srth*std::sin(phinve)*CLHEP::MeV,
967 pp*std::cos(rthnve)*CLHEP::MeV );
969 targetParticle.SetMomentum( pseudoParticle[6].GetMomentum() * (pp/pp1) );
971 pseudoParticle[5] = pseudoParticle[5] + targetParticle;
975 const G4double cpar[] = { 0.6, 0.6, 0.35, 0.15, 0.10 };
976 const G4double gpar[] = { 2.6, 2.6, 1.80, 1.30, 1.20 };
980 if (backwardNucleonCount < 5)
982 tempCount = backwardNucleonCount;
992 if( targetParticle.GetSide() == -3 )
993 rmb0 += targetParticle.GetMass()/CLHEP::GeV;
994 for( i=0;
i<vecLen; ++
i )
996 if(
vec[i]->GetSide() == -3 )rmb0 +=
vec[
i]->GetMass()/CLHEP::GeV;
998 rmb = rmb0 + std::pow(-std::log(1.0-G4UniformRand()),cpar[tempCount]) / gpar[tempCount];
999 totalEnergy = pseudoParticle[6].GetTotalEnergy()/CLHEP::GeV;
1000 vecMass = std::min( rmb, totalEnergy );
1001 pseudoParticle[6].SetMass( vecMass*CLHEP::GeV );
1002 pp = std::sqrt( std::abs( totalEnergy*totalEnergy - vecMass*vecMass ) )*CLHEP::GeV;
1003 pp1 = pseudoParticle[6].GetMomentum().mag()/CLHEP::MeV;
1004 if( pp1 < 1.0e-6*CLHEP::GeV )
1006 rthnve = CLHEP::pi * G4UniformRand();
1007 phinve = CLHEP::twopi * G4UniformRand();
1008 G4double srth = std::sin(rthnve);
1009 pseudoParticle[6].SetMomentum( -pp*srth*std::cos(phinve)*CLHEP::MeV,
1010 -pp*srth*std::sin(phinve)*CLHEP::MeV,
1011 -pp*std::cos(rthnve)*CLHEP::MeV );
1014 pseudoParticle[6].SetMomentum( pseudoParticle[6].GetMomentum() * (-pp/pp1) );
1016 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> tempV;
1017 tempV.Initialize( backwardNucleonCount );
1019 if( targetParticle.GetSide() == -3 )tempV.SetElement( tempLen++, &targetParticle );
1020 for( i=0;
i<vecLen; ++
i )
1022 if(
vec[i]->GetSide() == -3 )tempV.SetElement( tempLen++,
vec[i] );
1024 if( tempLen != backwardNucleonCount )
1026 G4cerr <<
"tempLen is not the same as backwardNucleonCount" << G4endl;
1027 G4cerr <<
"tempLen = " << tempLen;
1028 G4cerr <<
", backwardNucleonCount = " << backwardNucleonCount << G4endl;
1029 G4cerr <<
"targetParticle side = " << targetParticle.GetSide() << G4endl;
1030 G4cerr <<
"currentParticle side = " << currentParticle.GetSide() << G4endl;
1031 for( i=0;
i<vecLen; ++
i )
1032 G4cerr <<
"particle #" << i <<
" side = " <<
vec[i]->GetSide() << G4endl;
1033 throw std::runtime_error(
"FullModelReactionDynamics::GenerateXandPt: "
1034 "tempLen is not the same as backwardNucleonCount");
1036 constantCrossSection =
true;
1040 wgt = GenerateNBodyEvent(
1041 pseudoParticle[6].GetMass(), constantCrossSection, tempV, tempLen );
1043 if( targetParticle.GetSide() == -3 )
1045 targetParticle.Lorentz( targetParticle, pseudoParticle[6] );
1047 pseudoParticle[5] = pseudoParticle[5] + targetParticle;
1049 for( i=0;
i<vecLen; ++
i )
1051 if(
vec[i]->GetSide() == -3 )
1053 vec[
i]->Lorentz( *
vec[i], pseudoParticle[6] );
1054 pseudoParticle[5] = pseudoParticle[5] + (*
vec[
i]);
1063 if( vecLen == 0 )
return false;
1066 G4int numberofFinalStateNucleons = 0;
1067 if( currentParticle.GetDefinition() ==aProton ||
1068 currentParticle.GetDefinition() == aNeutron ||
1069 currentParticle.GetDefinition() == G4SigmaMinus::SigmaMinus()||
1070 currentParticle.GetDefinition() == G4SigmaPlus::SigmaPlus()||
1071 currentParticle.GetDefinition() == G4SigmaZero::SigmaZero()||
1072 currentParticle.GetDefinition() == G4XiZero::XiZero()||
1073 currentParticle.GetDefinition() == G4XiMinus::XiMinus()||
1074 currentParticle.GetDefinition() == G4OmegaMinus::OmegaMinus()||
1075 currentParticle.GetDefinition() == G4Lambda::Lambda()) ++numberofFinalStateNucleons;
1076 currentParticle.Lorentz( currentParticle, pseudoParticle[1] );
1078 if( targetParticle.GetDefinition() ==aProton ||
1079 targetParticle.GetDefinition() == aNeutron ||
1080 targetParticle.GetDefinition() == G4Lambda::Lambda() ||
1081 targetParticle.GetDefinition() == G4XiZero::XiZero()||
1082 targetParticle.GetDefinition() == G4XiMinus::XiMinus()||
1083 targetParticle.GetDefinition() == G4OmegaMinus::OmegaMinus()||
1084 targetParticle.GetDefinition() == G4SigmaZero::SigmaZero()||
1085 targetParticle.GetDefinition() == G4SigmaPlus::SigmaPlus()||
1086 targetParticle.GetDefinition() == G4SigmaMinus::SigmaMinus()) ++numberofFinalStateNucleons;
1087 if( targetParticle.GetDefinition() ==G4AntiProton::AntiProton()) --numberofFinalStateNucleons;
1088 if( targetParticle.GetDefinition() ==G4AntiNeutron::AntiNeutron()) --numberofFinalStateNucleons;
1089 if( targetParticle.GetDefinition() ==G4AntiSigmaMinus::AntiSigmaMinus()) --numberofFinalStateNucleons;
1090 if( targetParticle.GetDefinition() ==G4AntiSigmaPlus::AntiSigmaPlus()) --numberofFinalStateNucleons;
1091 if( targetParticle.GetDefinition() ==G4AntiSigmaZero::AntiSigmaZero()) --numberofFinalStateNucleons;
1092 if( targetParticle.GetDefinition() ==G4AntiXiZero::AntiXiZero()) --numberofFinalStateNucleons;
1093 if( targetParticle.GetDefinition() ==G4AntiXiMinus::AntiXiMinus()) --numberofFinalStateNucleons;
1094 if( targetParticle.GetDefinition() ==G4AntiOmegaMinus::AntiOmegaMinus()) --numberofFinalStateNucleons;
1095 if( targetParticle.GetDefinition() ==G4AntiLambda::AntiLambda()) --numberofFinalStateNucleons;
1096 targetParticle.Lorentz( targetParticle, pseudoParticle[1] );
1098 for( i=0;
i<vecLen; ++
i )
1100 if(
vec[i]->GetDefinition() ==aProton ||
1101 vec[i]->GetDefinition() == aNeutron ||
1102 vec[i]->GetDefinition() == G4Lambda::Lambda() ||
1103 vec[i]->GetDefinition() == G4XiZero::XiZero() ||
1104 vec[i]->GetDefinition() == G4XiMinus::XiMinus() ||
1105 vec[i]->GetDefinition() == G4OmegaMinus::OmegaMinus() ||
1106 vec[i]->GetDefinition() == G4SigmaPlus::SigmaPlus()||
1107 vec[i]->GetDefinition() == G4SigmaZero::SigmaZero()||
1108 vec[i]->GetDefinition() == G4SigmaMinus::SigmaMinus()) ++numberofFinalStateNucleons;
1109 if(
vec[i]->GetDefinition() ==G4AntiProton::AntiProton()) --numberofFinalStateNucleons;
1110 if(
vec[i]->GetDefinition() ==G4AntiNeutron::AntiNeutron()) --numberofFinalStateNucleons;
1111 if(
vec[i]->GetDefinition() ==G4AntiSigmaMinus::AntiSigmaMinus()) --numberofFinalStateNucleons;
1112 if(
vec[i]->GetDefinition() ==G4AntiSigmaPlus::AntiSigmaPlus()) --numberofFinalStateNucleons;
1113 if(
vec[i]->GetDefinition() ==G4AntiSigmaZero::AntiSigmaZero()) --numberofFinalStateNucleons;
1114 if(
vec[i]->GetDefinition() ==G4AntiLambda::AntiLambda()) --numberofFinalStateNucleons;
1115 if(
vec[i]->GetDefinition() ==G4AntiXiZero::AntiXiZero()) --numberofFinalStateNucleons;
1116 if(
vec[i]->GetDefinition() ==G4AntiXiMinus::AntiXiMinus()) --numberofFinalStateNucleons;
1117 if(
vec[i]->GetDefinition() ==G4AntiOmegaMinus::AntiOmegaMinus()) --numberofFinalStateNucleons;
1118 vec[
i]->Lorentz( *
vec[i], pseudoParticle[1] );
1121 if(veryForward) numberofFinalStateNucleons++;
1122 numberofFinalStateNucleons = std::max( 1, numberofFinalStateNucleons );
1133 G4bool leadingStrangeParticleHasChanged =
true;
1136 if( currentParticle.GetDefinition() == leadingStrangeParticle.GetDefinition() )
1137 leadingStrangeParticleHasChanged =
false;
1138 if( leadingStrangeParticleHasChanged &&
1139 ( targetParticle.GetDefinition() == leadingStrangeParticle.GetDefinition() ) )
1140 leadingStrangeParticleHasChanged =
false;
1141 if( leadingStrangeParticleHasChanged )
1143 for( i=0;
i<vecLen;
i++ )
1145 if(
vec[i]->GetDefinition() == leadingStrangeParticle.GetDefinition() )
1147 leadingStrangeParticleHasChanged =
false;
1152 if( leadingStrangeParticleHasChanged )
1155 (leadingStrangeParticle.GetDefinition() == aKaonMinus ||
1156 leadingStrangeParticle.GetDefinition() == aKaonZeroL ||
1157 leadingStrangeParticle.GetDefinition() == aKaonZeroS ||
1158 leadingStrangeParticle.GetDefinition() == aKaonPlus ||
1159 leadingStrangeParticle.GetDefinition() == aPiMinus ||
1160 leadingStrangeParticle.GetDefinition() == aPiZero ||
1161 leadingStrangeParticle.GetDefinition() == aPiPlus);
1162 G4bool targetTest =
false;
1173 if( (leadTest&&targetTest) || !(leadTest||targetTest) )
1175 targetParticle.SetDefinitionAndUpdateE( leadingStrangeParticle.GetDefinition() );
1176 targetHasChanged =
true;
1181 currentParticle.SetDefinitionAndUpdateE( leadingStrangeParticle.GetDefinition() );
1182 incidentHasChanged =
false;
1188 pseudoParticle[3].SetMomentum( 0.0, 0.0, pOriginal*CLHEP::GeV );
1189 pseudoParticle[3].SetMass( mOriginal*CLHEP::GeV );
1190 pseudoParticle[3].SetTotalEnergy(
1191 std::sqrt( pOriginal*pOriginal + mOriginal*mOriginal )*CLHEP::GeV );
1195 const G4ParticleDefinition * aOrgDef = modifiedOriginal.GetDefinition();
1197 if(aOrgDef == G4Proton::Proton() || aOrgDef == G4Neutron::Neutron() )
diff = 1;
1198 if(numberofFinalStateNucleons == 1)
diff = 0;
1199 pseudoParticle[4].SetMomentum( 0.0, 0.0, 0.0 );
1200 pseudoParticle[4].SetMass( protonMass*(numberofFinalStateNucleons-
diff)*CLHEP::MeV );
1201 pseudoParticle[4].SetTotalEnergy( protonMass*(numberofFinalStateNucleons-
diff)*CLHEP::MeV );
1203 G4double theoreticalKinetic =
1204 pseudoParticle[3].GetTotalEnergy()/CLHEP::MeV +
1205 pseudoParticle[4].GetTotalEnergy()/CLHEP::MeV -
1206 currentParticle.GetMass()/CLHEP::MeV -
1207 targetParticle.GetMass()/CLHEP::MeV;
1209 G4double simulatedKinetic =
1210 currentParticle.GetKineticEnergy()/CLHEP::MeV + targetParticle.GetKineticEnergy()/CLHEP::MeV;
1212 pseudoParticle[5] = pseudoParticle[3] + pseudoParticle[4];
1213 pseudoParticle[3].Lorentz( pseudoParticle[3], pseudoParticle[5] );
1214 pseudoParticle[4].Lorentz( pseudoParticle[4], pseudoParticle[5] );
1216 pseudoParticle[7].SetZero();
1217 pseudoParticle[7] = pseudoParticle[7] + currentParticle;
1218 pseudoParticle[7] = pseudoParticle[7] + targetParticle;
1220 for( i=0;
i<vecLen; ++
i )
1222 pseudoParticle[7] = pseudoParticle[7] + *
vec[
i];
1223 simulatedKinetic +=
vec[
i]->GetKineticEnergy()/CLHEP::MeV;
1224 theoreticalKinetic -=
vec[
i]->GetMass()/CLHEP::MeV;
1226 if( vecLen <= 16 && vecLen > 0 )
1231 G4ReactionProduct tempR[130];
1233 tempR[0] = currentParticle;
1234 tempR[1] = targetParticle;
1235 for( i=0;
i<vecLen; ++
i )tempR[i+2] = *
vec[i];
1236 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> tempV;
1237 tempV.Initialize( vecLen+2 );
1239 for( i=0;
i<vecLen+2; ++
i )tempV.SetElement( tempLen++, &tempR[i] );
1240 constantCrossSection =
true;
1242 wgt = GenerateNBodyEvent( pseudoParticle[3].GetTotalEnergy()/CLHEP::MeV+
1243 pseudoParticle[4].GetTotalEnergy()/CLHEP::MeV,
1244 constantCrossSection, tempV, tempLen );
1247 theoreticalKinetic = 0.0;
1248 for( i=0;
i<tempLen; ++
i )
1250 pseudoParticle[6].Lorentz( *tempV[i], pseudoParticle[4] );
1251 theoreticalKinetic += pseudoParticle[6].GetKineticEnergy()/CLHEP::MeV;
1260 if( simulatedKinetic != 0.0 )
1262 wgt = (theoreticalKinetic)/simulatedKinetic;
1263 theoreticalKinetic = currentParticle.GetKineticEnergy()/CLHEP::MeV * wgt;
1264 simulatedKinetic = theoreticalKinetic;
1265 currentParticle.SetKineticEnergy( theoreticalKinetic*CLHEP::MeV );
1266 pp = currentParticle.GetTotalMomentum()/CLHEP::MeV;
1267 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
1268 if( pp1 < 1.0e-6*CLHEP::GeV )
1270 rthnve = CLHEP::pi*G4UniformRand();
1271 phinve = CLHEP::twopi*G4UniformRand();
1272 currentParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
1273 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
1274 pp*std::cos(rthnve)*CLHEP::MeV );
1278 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
1280 theoreticalKinetic = targetParticle.GetKineticEnergy()/CLHEP::MeV * wgt;
1281 targetParticle.SetKineticEnergy( theoreticalKinetic*CLHEP::MeV );
1282 simulatedKinetic += theoreticalKinetic;
1283 pp = targetParticle.GetTotalMomentum()/CLHEP::MeV;
1284 pp1 = targetParticle.GetMomentum().mag()/CLHEP::MeV;
1286 if( pp1 < 1.0e-6*CLHEP::GeV )
1288 rthnve = CLHEP::pi*G4UniformRand();
1289 phinve = CLHEP::twopi*G4UniformRand();
1290 targetParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
1291 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
1292 pp*std::cos(rthnve)*CLHEP::MeV );
1294 targetParticle.SetMomentum( targetParticle.GetMomentum() * (pp/pp1) );
1296 for( i=0;
i<vecLen; ++
i )
1298 theoreticalKinetic =
vec[
i]->GetKineticEnergy()/CLHEP::MeV * wgt;
1299 simulatedKinetic += theoreticalKinetic;
1300 vec[
i]->SetKineticEnergy( theoreticalKinetic*CLHEP::MeV );
1301 pp =
vec[
i]->GetTotalMomentum()/CLHEP::MeV;
1302 pp1 =
vec[
i]->GetMomentum().mag()/CLHEP::MeV;
1303 if( pp1 < 1.0e-6*CLHEP::GeV )
1305 rthnve = CLHEP::pi*G4UniformRand();
1306 phinve = CLHEP::twopi*G4UniformRand();
1307 vec[
i]->SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
1308 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
1309 pp*std::cos(rthnve)*CLHEP::MeV );
1312 vec[
i]->SetMomentum(
vec[i]->GetMomentum() * (pp/pp1) );
1316 Rotate( numberofFinalStateNucleons, pseudoParticle[3].GetMomentum(),
1317 modifiedOriginal, originalIncident, targetNucleus,
1318 currentParticle, targetParticle,
vec, vecLen );
1325 if( atomicWeight >= 1.5 )
1332 G4double epnb, edta;
1336 epnb = targetNucleus.GetPNBlackTrackEnergy();
1337 edta = targetNucleus.GetDTABlackTrackEnergy();
1338 const G4double pnCutOff = 0.001;
1339 const G4double dtaCutOff = 0.001;
1340 const G4double kineticMinimum = 1.e-6;
1341 const G4double kineticFactor = -0.010;
1342 G4double sprob = 0.0;
1343 const G4double ekIncident = originalIncident->GetKineticEnergy()/CLHEP::GeV;
1344 if( ekIncident >= 5.0 )sprob = std::min( 1.0, 0.6*std::log(ekIncident-4.0) );
1345 if( epnb >= pnCutOff )
1347 npnb =
Poisson((1.5+1.25*numberofFinalStateNucleons)*epnb/(epnb+edta));
1348 if( numberofFinalStateNucleons + npnb > atomicWeight )
1349 npnb = G4int(atomicWeight+0.00001 - numberofFinalStateNucleons);
1350 npnb = std::min( npnb, 127-vecLen );
1352 if( edta >= dtaCutOff )
1354 ndta =
Poisson( (1.5+1.25*numberofFinalStateNucleons)*edta/(epnb+edta) );
1355 ndta = std::min( ndta, 127-vecLen );
1357 G4double spall = numberofFinalStateNucleons;
1360 AddBlackTrackParticles( epnb, npnb, edta, ndta, sprob, kineticMinimum, kineticFactor,
1361 modifiedOriginal, spall, targetNucleus,
1376 if( (atomicWeight >= 1.5) && (atomicWeight <= 230.0) && (ekOriginal <= 0.2) )
1377 currentParticle.SetTOF( 1.0-500.0*std::exp(-ekOriginal/0.04)*std::log(G4UniformRand()) );
1379 currentParticle.SetTOF( 1.0 );
1384void FullModelReactionDynamics::SuppressChargedPions(
1385 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
1387 const G4ReactionProduct &modifiedOriginal,
1388 G4ReactionProduct ¤tParticle,
1390 const G4Nucleus &targetNucleus,
1391 G4bool &incidentHasChanged
1399 const G4double atomicWeight = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
1400 const G4double atomicNumber = targetNucleus.GetZ_asInt();
1401 const G4double pOriginal = modifiedOriginal.GetTotalMomentum()/CLHEP::GeV;
1404 G4ParticleDefinition *aProton = G4Proton::Proton();
1405 G4ParticleDefinition *anAntiProton = G4AntiProton::AntiProton();
1406 G4ParticleDefinition *aNeutron = G4Neutron::Neutron();
1407 G4ParticleDefinition *anAntiNeutron = G4AntiNeutron::AntiNeutron();
1408 G4ParticleDefinition *aPiMinus = G4PionMinus::PionMinus();
1409 G4ParticleDefinition *aPiPlus = G4PionPlus::PionPlus();
1411 const G4bool antiTest =
1412 modifiedOriginal.GetDefinition() != anAntiProton &&
1413 modifiedOriginal.GetDefinition() != anAntiNeutron;
1416 currentParticle.GetDefinition() == aPiPlus ||
1417 currentParticle.GetDefinition() == aPiMinus ) &&
1418 ( G4UniformRand() <= (10.0-pOriginal)/6.0 ) &&
1419 ( G4UniformRand() <= atomicWeight/300.0 ) )
1421 if( G4UniformRand() > atomicNumber/atomicWeight )
1422 currentParticle.SetDefinitionAndUpdateE( aNeutron );
1424 currentParticle.SetDefinitionAndUpdateE( aProton );
1425 incidentHasChanged =
true;
1441 for( G4int i=0;
i<vecLen; ++
i )
1445 vec[i]->GetDefinition() == aPiPlus ||
1446 vec[i]->GetDefinition() == aPiMinus ) &&
1447 ( G4UniformRand() <= (10.0-pOriginal)/6.0 ) &&
1448 ( G4UniformRand() <= atomicWeight/300.0 ) )
1450 if( G4UniformRand() > atomicNumber/atomicWeight )
1451 vec[
i]->SetDefinitionAndUpdateE( aNeutron );
1453 vec[
i]->SetDefinitionAndUpdateE( aProton );
1460G4bool FullModelReactionDynamics::TwoCluster(
1461 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
1463 G4ReactionProduct &modifiedOriginal,
1464 const G4HadProjectile *originalIncident,
1465 G4ReactionProduct ¤tParticle,
1466 G4ReactionProduct &targetParticle,
1467 const G4Nucleus &targetNucleus,
1468 G4bool &incidentHasChanged,
1469 G4bool &targetHasChanged,
1471 G4ReactionProduct &leadingStrangeParticle )
1487 G4ParticleDefinition *aPiMinus = G4PionMinus::PionMinus();
1488 G4ParticleDefinition *aProton = G4Proton::Proton();
1489 G4ParticleDefinition *aNeutron = G4Neutron::Neutron();
1490 G4ParticleDefinition *aPiPlus = G4PionPlus::PionPlus();
1491 G4ParticleDefinition *aPiZero = G4PionZero::PionZero();
1492 G4ParticleDefinition *aSigmaMinus = G4SigmaMinus::SigmaMinus();
1493 const G4double protonMass = aProton->GetPDGMass()/CLHEP::MeV;
1494 const G4double ekOriginal = modifiedOriginal.GetKineticEnergy()/CLHEP::GeV;
1495 const G4double etOriginal = modifiedOriginal.GetTotalEnergy()/CLHEP::GeV;
1496 const G4double mOriginal = modifiedOriginal.GetMass()/CLHEP::GeV;
1497 const G4double pOriginal = modifiedOriginal.GetMomentum().mag()/CLHEP::GeV;
1498 G4double targetMass = targetParticle.GetDefinition()->GetPDGMass()/CLHEP::GeV;
1499 G4double centerofmassEnergy = std::sqrt( mOriginal*mOriginal +
1500 targetMass*targetMass +
1501 2.0*targetMass*etOriginal );
1502 G4double currentMass = currentParticle.GetMass()/CLHEP::GeV;
1503 targetMass = targetParticle.GetMass()/CLHEP::GeV;
1505 if( currentMass == 0.0 && targetMass == 0.0 )
1507 G4double ek = currentParticle.GetKineticEnergy();
1508 G4ThreeVector
m = currentParticle.GetMomentum();
1509 currentParticle = *
vec[0];
1510 targetParticle = *
vec[1];
1511 for( i=0;
i<(vecLen-2); ++
i )*
vec[i] = *
vec[i+2];
1514 for(G4int i=0;
i<vecLen;
i++)
delete vec[i];
1516#if G4VERSION_NUMBER < 1100
1517 throw G4HadReentrentException(__FILE__, __LINE__,
1519 throw G4HadronicException(__FILE__, __LINE__,
1521 "FullModelReactionDynamics::TwoCluster: Negative number of particles");
1523 delete vec[vecLen-1];
1524 delete vec[vecLen-2];
1526 currentMass = currentParticle.GetMass()/CLHEP::GeV;
1527 targetMass = targetParticle.GetMass()/CLHEP::GeV;
1528 incidentHasChanged =
true;
1529 targetHasChanged =
true;
1530 currentParticle.SetKineticEnergy( ek );
1531 currentParticle.SetMomentum( m );
1533 const G4double atomicWeight = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
1534 const G4double atomicNumber = targetNucleus.GetZ_asInt();
1540 G4int forwardCount = 1;
1541 currentParticle.SetSide( 1 );
1542 G4double forwardMass = currentParticle.GetMass()/CLHEP::GeV;
1545 G4int backwardCount = 1;
1546 targetParticle.SetSide( -1 );
1547 G4double backwardMass = targetParticle.GetMass()/CLHEP::GeV;
1549 for( i=0;
i<vecLen; ++
i )
1551 if(
vec[i]->GetSide() < 0 )
vec[
i]->SetSide( -1 );
1554 if(
vec[i]->GetSide() == -1 )
1557 backwardMass +=
vec[
i]->GetMass()/CLHEP::GeV;
1562 forwardMass +=
vec[
i]->GetMass()/CLHEP::GeV;
1568 G4double term1 = std::log(centerofmassEnergy*centerofmassEnergy);
1569 if(term1 < 0) term1 = 0.0001;
1570 const G4double afc = 0.312 + 0.2 * std::log(term1);
1572 if( centerofmassEnergy < 2.0+G4UniformRand() )
1573 xtarg = afc * (std::pow(atomicWeight,0.33)-1.0) * (2*backwardCount+vecLen+2)/2.0;
1575 xtarg = afc * (std::pow(atomicWeight,0.33)-1.0) * (2*backwardCount);
1576 if( xtarg <= 0.0 )xtarg = 0.01;
1577 G4int nuclearExcitationCount =
Poisson( xtarg );
1578 if(atomicWeight<1.0001) nuclearExcitationCount = 0;
1580 if( nuclearExcitationCount > 0 )
1582 G4int momentumBin = std::min( 4, G4int(pOriginal/3.0) );
1583 const G4double nucsup[] = { 1.0, 0.8, 0.6, 0.5, 0.4 };
1589 for( i=0;
i<nuclearExcitationCount; ++
i )
1591 G4ReactionProduct* pVec =
new G4ReactionProduct();
1592 if( G4UniformRand() < nucsup[momentumBin] )
1594 if( G4UniformRand() > 1.0-atomicNumber/atomicWeight )
1596 pVec->SetDefinition( aProton );
1598 pVec->SetDefinition( aNeutron );
1602 G4double ran = G4UniformRand();
1604 pVec->SetDefinition( aPiPlus );
1605 else if( ran < 0.6819 )
1606 pVec->SetDefinition( aPiZero );
1608 pVec->SetDefinition( aPiMinus );
1610 pVec->SetSide( -2 );
1612 pVec->SetNewlyAdded(
true );
1613 vec.SetElement( vecLen++, pVec );
1618 G4double eAvailable = centerofmassEnergy - (forwardMass+backwardMass);
1619 G4bool secondaryDeleted;
1621 while( eAvailable <= 0.0 )
1623 secondaryDeleted =
false;
1624 for( i=(vecLen-1);
i>=0; --
i )
1626 if(
vec[i]->GetSide() == 1 &&
vec[i]->GetMayBeKilled())
1629 for( G4int j=i; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
1631 forwardMass -=
pMass;
1632 secondaryDeleted =
true;
1635 else if(
vec[i]->GetSide() == -1 &&
vec[i]->GetMayBeKilled())
1638 for( G4int j=i; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
1640 backwardMass -=
pMass;
1641 secondaryDeleted =
true;
1645 if( secondaryDeleted )
1647 G4ReactionProduct *temp =
vec[vecLen-1];
1658 if( targetParticle.GetSide() == -1 )
1660 pMass = targetParticle.GetMass()/CLHEP::GeV;
1661 targetParticle = *
vec[0];
1662 for( G4int j=0; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
1664 backwardMass -=
pMass;
1665 secondaryDeleted =
true;
1667 else if( targetParticle.GetSide() == 1 )
1669 pMass = targetParticle.GetMass()/CLHEP::GeV;
1670 targetParticle = *
vec[0];
1671 for( G4int j=0; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
1673 forwardMass -=
pMass;
1674 secondaryDeleted =
true;
1676 if( secondaryDeleted )
1678 G4ReactionProduct *temp =
vec[vecLen-1];
1685 if( currentParticle.GetSide() == -1 )
1687 pMass = currentParticle.GetMass()/CLHEP::GeV;
1688 currentParticle = *
vec[0];
1689 for( G4int j=0; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
1691 backwardMass -=
pMass;
1692 secondaryDeleted =
true;
1694 else if( currentParticle.GetSide() == 1 )
1696 pMass = currentParticle.GetMass()/CLHEP::GeV;
1697 currentParticle = *
vec[0];
1698 for( G4int j=0; j<(vecLen-1); ++j )*
vec[j] = *
vec[j+1];
1700 forwardMass -=
pMass;
1701 secondaryDeleted =
true;
1703 if( secondaryDeleted )
1705 G4ReactionProduct *temp =
vec[vecLen-1];
1713 eAvailable = centerofmassEnergy - (forwardMass+backwardMass);
1722 G4double rmc = 0.0, rmd = 0.0;
1723 const G4double cpar[] = { 0.6, 0.6, 0.35, 0.15, 0.10 };
1724 const G4double gpar[] = { 2.6, 2.6, 1.8, 1.30, 1.20 };
1726 if( forwardCount == 0)
return false;
1728 if( forwardCount == 1 )rmc = forwardMass;
1732 G4int ntc = std::max(1, std::min(5,forwardCount))-1;
1733 rmc = forwardMass + std::pow(-std::log(1.0-G4UniformRand()),cpar[ntc-1])/gpar[ntc-1];
1735 if( backwardCount == 1 )rmd = backwardMass;
1739 G4int ntc = std::max(1, std::min(5,backwardCount));
1740 rmd = backwardMass + std::pow(-std::log(1.0-G4UniformRand()),cpar[ntc-1])/gpar[ntc-1];
1742 while( rmc+rmd > centerofmassEnergy )
1744 if( (rmc <= forwardMass) && (rmd <= backwardMass) )
1746 G4double temp = 0.999*centerofmassEnergy/(rmc+rmd);
1752 rmc = 0.1*forwardMass + 0.9*rmc;
1753 rmd = 0.1*backwardMass + 0.9*rmd;
1768 G4ReactionProduct pseudoParticle[8];
1769 for( i=0;
i<8; ++
i )pseudoParticle[i].SetZero();
1771 pseudoParticle[1].SetMass( mOriginal*CLHEP::GeV );
1772 pseudoParticle[1].SetTotalEnergy( etOriginal*CLHEP::GeV );
1773 pseudoParticle[1].SetMomentum( 0.0, 0.0, pOriginal*CLHEP::GeV );
1775 pseudoParticle[2].SetMass( protonMass*CLHEP::MeV );
1776 pseudoParticle[2].SetTotalEnergy( protonMass*CLHEP::MeV );
1777 pseudoParticle[2].SetMomentum( 0.0, 0.0, 0.0 );
1781 pseudoParticle[0] = pseudoParticle[1] + pseudoParticle[2];
1782 pseudoParticle[1].Lorentz( pseudoParticle[1], pseudoParticle[0] );
1783 pseudoParticle[2].Lorentz( pseudoParticle[2], pseudoParticle[0] );
1785 const G4double pfMin = 0.0001;
1786 G4double
pf = (centerofmassEnergy*centerofmassEnergy+rmd*rmd-rmc*rmc);
1788 pf -= 4*centerofmassEnergy*centerofmassEnergy*rmd*rmd;
1789 pf = std::sqrt( std::max(pf,pfMin) )/(2.0*centerofmassEnergy);
1793 pseudoParticle[3].SetMass( rmc*CLHEP::GeV );
1794 pseudoParticle[3].SetTotalEnergy( std::sqrt(pf*pf+rmc*rmc)*CLHEP::GeV );
1796 pseudoParticle[4].SetMass( rmd*CLHEP::GeV );
1797 pseudoParticle[4].SetTotalEnergy( std::sqrt(pf*pf+rmd*rmd)*CLHEP::GeV );
1801 const G4double bMin = 0.01;
1802 const G4double b1 = 4.0;
1803 const G4double b2 = 1.6;
1804 G4double
t = std::log( 1.0-G4UniformRand() ) / std::max( bMin, b1+b2*std::log(pOriginal) );
1806 pseudoParticle[1].GetTotalEnergy()/CLHEP::GeV - pseudoParticle[3].GetTotalEnergy()/CLHEP::GeV;
1807 G4double pin = pseudoParticle[1].GetMomentum().mag()/CLHEP::GeV;
1808 G4double tacmin =
t1*
t1 - (pin-
pf)*(pin-pf);
1812 const G4double smallValue = 1.0e-10;
1813 G4double dumnve = 4.0*pin*
pf;
1814 if( dumnve == 0.0 )dumnve = smallValue;
1815 G4double ctet = std::max( -1.0, std::min( 1.0, 1.0+2.0*(t-tacmin)/dumnve ) );
1816 dumnve = std::max( 0.0, 1.0-ctet*ctet );
1817 G4double stet = std::sqrt(dumnve);
1818 G4double
phi = G4UniformRand() * CLHEP::twopi;
1822 pseudoParticle[3].SetMomentum( pf*stet*std::sin(
phi)*CLHEP::GeV,
1823 pf*stet*std::cos(
phi)*CLHEP::GeV,
1824 pf*ctet*CLHEP::GeV );
1825 pseudoParticle[4].SetMomentum( pseudoParticle[3].GetMomentum() * (-1.0) );
1829 G4double pp, pp1, rthnve, phinve;
1830 if( nuclearExcitationCount > 0 )
1832 const G4double ga = 1.2;
1833 G4double ekit1 = 0.04;
1834 G4double ekit2 = 0.6;
1835 if( ekOriginal <= 5.0 )
1837 ekit1 *= ekOriginal*ekOriginal/25.0;
1838 ekit2 *= ekOriginal*ekOriginal/25.0;
1840 const G4double
a = (1.0-ga)/(std::pow(ekit2,(1.0-ga)) - std::pow(ekit1,(1.0-ga)));
1841 for( i=0;
i<vecLen; ++
i )
1843 if(
vec[i]->GetSide() == -2 )
1846 std::pow( (G4UniformRand()*(1.0-ga)/
a+std::pow(ekit1,(1.0-ga))), (1.0/(1.0-ga)) );
1847 vec[
i]->SetKineticEnergy( kineticE*CLHEP::GeV );
1848 G4double vMass =
vec[
i]->GetMass()/CLHEP::MeV;
1849 G4double totalE = kineticE + vMass;
1850 pp = std::sqrt( std::abs(totalE*totalE-vMass*vMass) );
1851 G4double
cost = std::min( 1.0, std::max( -1.0, std::log(2.23*G4UniformRand()+0.383)/0.96 ) );
1852 G4double sint = std::sqrt( std::max( 0.0, (1.0-
cost*
cost) ) );
1853 phi = CLHEP::twopi*G4UniformRand();
1854 vec[
i]->SetMomentum( pp*sint*std::sin(
phi)*CLHEP::MeV,
1855 pp*sint*std::cos(
phi)*CLHEP::MeV,
1856 pp*
cost*CLHEP::MeV );
1857 vec[
i]->Lorentz( *
vec[i], pseudoParticle[0] );
1865 currentParticle.SetMomentum( pseudoParticle[3].GetMomentum() );
1866 currentParticle.SetTotalEnergy( pseudoParticle[3].GetTotalEnergy() );
1868 targetParticle.SetMomentum( pseudoParticle[4].GetMomentum() );
1869 targetParticle.SetTotalEnergy( pseudoParticle[4].GetTotalEnergy() );
1871 pseudoParticle[5].SetMomentum( pseudoParticle[3].GetMomentum() * (-1.0) );
1872 pseudoParticle[5].SetMass( pseudoParticle[3].GetMass() );
1873 pseudoParticle[5].SetTotalEnergy( pseudoParticle[3].GetTotalEnergy() );
1875 pseudoParticle[6].SetMomentum( pseudoParticle[4].GetMomentum() * (-1.0) );
1876 pseudoParticle[6].SetMass( pseudoParticle[4].GetMass() );
1877 pseudoParticle[6].SetTotalEnergy( pseudoParticle[4].GetTotalEnergy() );
1881 if( forwardCount > 1 )
1883 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> tempV;
1884 tempV.Initialize( forwardCount );
1885 G4bool constantCrossSection =
true;
1887 if( currentParticle.GetSide() == 1 )
1888 tempV.SetElement( tempLen++, ¤tParticle );
1889 if( targetParticle.GetSide() == 1 )
1890 tempV.SetElement( tempLen++, &targetParticle );
1891 for( i=0;
i<vecLen; ++
i )
1893 if(
vec[i]->GetSide() == 1 )
1896 tempV.SetElement( tempLen++,
vec[i] );
1899 vec[
i]->SetSide( -1 );
1906 wgt = GenerateNBodyEvent( pseudoParticle[3].GetMass()/CLHEP::MeV,
1907 constantCrossSection, tempV, tempLen );
1908 if( currentParticle.GetSide() == 1 )
1909 currentParticle.Lorentz( currentParticle, pseudoParticle[5] );
1910 if( targetParticle.GetSide() == 1 )
1911 targetParticle.Lorentz( targetParticle, pseudoParticle[5] );
1912 for( i=0;
i<vecLen; ++
i )
1914 if(
vec[i]->GetSide() == 1 )
vec[
i]->Lorentz( *
vec[i], pseudoParticle[5] );
1919 if( backwardCount > 1 )
1921 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> tempV;
1922 tempV.Initialize( backwardCount );
1923 G4bool constantCrossSection =
true;
1925 if( currentParticle.GetSide() == -1 )
1926 tempV.SetElement( tempLen++, ¤tParticle );
1927 if( targetParticle.GetSide() == -1 )
1928 tempV.SetElement( tempLen++, &targetParticle );
1929 for( i=0;
i<vecLen; ++
i )
1931 if(
vec[i]->GetSide() == -1 )
1934 tempV.SetElement( tempLen++,
vec[i] );
1937 vec[
i]->SetSide( -2 );
1938 vec[
i]->SetKineticEnergy( 0.0 );
1939 vec[
i]->SetMomentum( 0.0, 0.0, 0.0 );
1946 wgt = GenerateNBodyEvent( pseudoParticle[4].GetMass()/CLHEP::MeV,
1947 constantCrossSection, tempV, tempLen );
1948 if( currentParticle.GetSide() == -1 )
1949 currentParticle.Lorentz( currentParticle, pseudoParticle[6] );
1950 if( targetParticle.GetSide() == -1 )
1951 targetParticle.Lorentz( targetParticle, pseudoParticle[6] );
1952 for( i=0;
i<vecLen; ++
i )
1954 if(
vec[i]->GetSide() == -1 )
vec[
i]->Lorentz( *
vec[i], pseudoParticle[6] );
1962 G4int numberofFinalStateNucleons = 0;
1963 if( currentParticle.GetDefinition() ==aProton ||
1964 currentParticle.GetDefinition() == aNeutron ||
1965 currentParticle.GetDefinition() == aSigmaMinus||
1966 currentParticle.GetDefinition() == G4SigmaPlus::SigmaPlus()||
1967 currentParticle.GetDefinition() == G4SigmaZero::SigmaZero()||
1968 currentParticle.GetDefinition() == G4XiZero::XiZero()||
1969 currentParticle.GetDefinition() == G4XiMinus::XiMinus()||
1970 currentParticle.GetDefinition() == G4OmegaMinus::OmegaMinus()||
1971 currentParticle.GetDefinition() == G4Lambda::Lambda()) ++numberofFinalStateNucleons;
1972 currentParticle.Lorentz( currentParticle, pseudoParticle[2] );
1973 if( targetParticle.GetDefinition() ==aProton ||
1974 targetParticle.GetDefinition() == aNeutron ||
1975 targetParticle.GetDefinition() == G4Lambda::Lambda() ||
1976 targetParticle.GetDefinition() == G4XiZero::XiZero()||
1977 targetParticle.GetDefinition() == G4XiMinus::XiMinus()||
1978 targetParticle.GetDefinition() == G4OmegaMinus::OmegaMinus()||
1979 targetParticle.GetDefinition() == G4SigmaZero::SigmaZero()||
1980 targetParticle.GetDefinition() == G4SigmaPlus::SigmaPlus()||
1981 targetParticle.GetDefinition() == aSigmaMinus) ++numberofFinalStateNucleons;
1982 if( targetParticle.GetDefinition() ==G4AntiProton::AntiProton()) --numberofFinalStateNucleons;
1983 if( targetParticle.GetDefinition() ==G4AntiNeutron::AntiNeutron()) --numberofFinalStateNucleons;
1984 if( targetParticle.GetDefinition() ==G4AntiSigmaMinus::AntiSigmaMinus()) --numberofFinalStateNucleons;
1985 if( targetParticle.GetDefinition() ==G4AntiSigmaPlus::AntiSigmaPlus()) --numberofFinalStateNucleons;
1986 if( targetParticle.GetDefinition() ==G4AntiSigmaZero::AntiSigmaZero()) --numberofFinalStateNucleons;
1987 if( targetParticle.GetDefinition() ==G4AntiXiZero::AntiXiZero()) --numberofFinalStateNucleons;
1988 if( targetParticle.GetDefinition() ==G4AntiXiMinus::AntiXiMinus()) --numberofFinalStateNucleons;
1989 if( targetParticle.GetDefinition() ==G4AntiOmegaMinus::AntiOmegaMinus()) --numberofFinalStateNucleons;
1990 if( targetParticle.GetDefinition() ==G4AntiLambda::AntiLambda()) --numberofFinalStateNucleons;
1991 targetParticle.Lorentz( targetParticle, pseudoParticle[2] );
1992 for( i=0;
i<vecLen; ++
i )
1994 if(
vec[i]->GetDefinition() ==aProton ||
1995 vec[i]->GetDefinition() == aNeutron ||
1996 vec[i]->GetDefinition() == G4Lambda::Lambda() ||
1997 vec[i]->GetDefinition() == G4XiZero::XiZero() ||
1998 vec[i]->GetDefinition() == G4XiMinus::XiMinus() ||
1999 vec[i]->GetDefinition() == G4OmegaMinus::OmegaMinus() ||
2000 vec[i]->GetDefinition() == G4SigmaPlus::SigmaPlus()||
2001 vec[i]->GetDefinition() == G4SigmaZero::SigmaZero()||
2002 vec[i]->GetDefinition() == aSigmaMinus) ++numberofFinalStateNucleons;
2003 if(
vec[i]->GetDefinition() ==G4AntiProton::AntiProton()) --numberofFinalStateNucleons;
2004 if(
vec[i]->GetDefinition() ==G4AntiNeutron::AntiNeutron()) --numberofFinalStateNucleons;
2005 if(
vec[i]->GetDefinition() ==G4AntiSigmaMinus::AntiSigmaMinus()) --numberofFinalStateNucleons;
2006 if(
vec[i]->GetDefinition() ==G4AntiSigmaPlus::AntiSigmaPlus()) --numberofFinalStateNucleons;
2007 if(
vec[i]->GetDefinition() ==G4AntiSigmaZero::AntiSigmaZero()) --numberofFinalStateNucleons;
2008 if(
vec[i]->GetDefinition() ==G4AntiLambda::AntiLambda()) --numberofFinalStateNucleons;
2009 if(
vec[i]->GetDefinition() ==G4AntiXiZero::AntiXiZero()) --numberofFinalStateNucleons;
2010 if(
vec[i]->GetDefinition() ==G4AntiXiMinus::AntiXiMinus()) --numberofFinalStateNucleons;
2011 if(
vec[i]->GetDefinition() ==G4AntiOmegaMinus::AntiOmegaMinus()) --numberofFinalStateNucleons;
2012 vec[
i]->Lorentz( *
vec[i], pseudoParticle[2] );
2015 numberofFinalStateNucleons = std::max( 1, numberofFinalStateNucleons );
2031 if( currentParticle.GetDefinition() == leadingStrangeParticle.GetDefinition() )
2033 else if( targetParticle.GetDefinition() == leadingStrangeParticle.GetDefinition() )
2037 for( i=0;
i<vecLen; ++
i )
2039 if(
vec[i]->GetDefinition() == leadingStrangeParticle.GetDefinition() )
2048 G4double leadMass = leadingStrangeParticle.GetMass()/CLHEP::MeV;
2050 if( ((leadMass < protonMass) && (targetParticle.GetMass()/CLHEP::MeV < protonMass)) ||
2051 ((leadMass >= protonMass) && (targetParticle.GetMass()/CLHEP::MeV >= protonMass)) )
2053 ekin = targetParticle.GetKineticEnergy()/CLHEP::GeV;
2054 pp1 = targetParticle.GetMomentum().mag()/CLHEP::MeV;
2055 targetParticle.SetDefinition( leadingStrangeParticle.GetDefinition() );
2056 targetParticle.SetKineticEnergy( ekin*CLHEP::GeV );
2057 pp = targetParticle.GetTotalMomentum()/CLHEP::MeV;
2060 rthnve = CLHEP::pi*G4UniformRand();
2061 phinve = CLHEP::twopi*G4UniformRand();
2062 targetParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(rthnve)*CLHEP::MeV,
2063 pp*std::sin(rthnve)*std::sin(rthnve)*CLHEP::MeV,
2064 pp*std::cos(rthnve)*CLHEP::MeV );
2067 targetParticle.SetMomentum( targetParticle.GetMomentum() * (pp/pp1) );
2069 targetHasChanged =
true;
2073 ekin = currentParticle.GetKineticEnergy()/CLHEP::GeV;
2074 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
2075 currentParticle.SetDefinition( leadingStrangeParticle.GetDefinition() );
2076 currentParticle.SetKineticEnergy( ekin*CLHEP::GeV );
2077 pp = currentParticle.GetTotalMomentum()/CLHEP::MeV;
2080 rthnve = CLHEP::pi*G4UniformRand();
2081 phinve = CLHEP::twopi*G4UniformRand();
2082 currentParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(rthnve)*CLHEP::MeV,
2083 pp*std::sin(rthnve)*std::sin(rthnve)*CLHEP::MeV,
2084 pp*std::cos(rthnve)*CLHEP::MeV );
2087 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
2089 incidentHasChanged =
true;
2097 pseudoParticle[4].SetMass( mOriginal*CLHEP::GeV );
2098 pseudoParticle[4].SetTotalEnergy( etOriginal*CLHEP::GeV );
2099 pseudoParticle[4].SetMomentum( 0.0, 0.0, pOriginal*CLHEP::GeV );
2101 const G4ParticleDefinition * aOrgDef = modifiedOriginal.GetDefinition();
2103 if(aOrgDef == G4Proton::Proton() || aOrgDef == G4Neutron::Neutron() )
diff = 1;
2104 if(numberofFinalStateNucleons == 1)
diff = 0;
2105 pseudoParticle[5].SetMomentum( 0.0, 0.0, 0.0 );
2106 pseudoParticle[5].SetMass( protonMass*(numberofFinalStateNucleons-
diff)*CLHEP::MeV );
2107 pseudoParticle[5].SetTotalEnergy( protonMass*(numberofFinalStateNucleons-
diff)*CLHEP::MeV );
2110 G4double theoreticalKinetic =
2111 pseudoParticle[4].GetTotalEnergy()/CLHEP::GeV + pseudoParticle[5].GetTotalEnergy()/CLHEP::GeV;
2113 pseudoParticle[6] = pseudoParticle[4] + pseudoParticle[5];
2114 pseudoParticle[4].Lorentz( pseudoParticle[4], pseudoParticle[6] );
2115 pseudoParticle[5].Lorentz( pseudoParticle[5], pseudoParticle[6] );
2119 G4ReactionProduct tempR[130];
2121 tempR[0] = currentParticle;
2122 tempR[1] = targetParticle;
2123 for( i=0;
i<vecLen; ++
i )tempR[i+2] = *
vec[i];
2125 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> tempV;
2126 tempV.Initialize( vecLen+2 );
2127 G4bool constantCrossSection =
true;
2129 for( i=0;
i<vecLen+2; ++
i )tempV.SetElement( tempLen++, &tempR[i] );
2134 wgt = GenerateNBodyEvent(
2135 pseudoParticle[4].GetTotalEnergy()/CLHEP::MeV+pseudoParticle[5].GetTotalEnergy()/CLHEP::MeV,
2136 constantCrossSection, tempV, tempLen );
2137 theoreticalKinetic = 0.0;
2138 for( i=0;
i<vecLen+2; ++
i )
2140 pseudoParticle[7].SetMomentum( tempV[i]->GetMomentum() );
2141 pseudoParticle[7].SetMass( tempV[i]->GetMass() );
2142 pseudoParticle[7].SetTotalEnergy( tempV[i]->GetTotalEnergy() );
2143 pseudoParticle[7].Lorentz( pseudoParticle[7], pseudoParticle[5] );
2144 theoreticalKinetic += pseudoParticle[7].GetKineticEnergy()/CLHEP::GeV;
2152 theoreticalKinetic -=
2153 ( currentParticle.GetMass()/CLHEP::GeV + targetParticle.GetMass()/CLHEP::GeV );
2154 for( i=0;
i<vecLen; ++
i )theoreticalKinetic -=
vec[i]->GetMass()/CLHEP::GeV;
2156 G4double simulatedKinetic =
2157 currentParticle.GetKineticEnergy()/CLHEP::GeV + targetParticle.GetKineticEnergy()/CLHEP::GeV;
2158 for( i=0;
i<vecLen; ++
i )simulatedKinetic +=
vec[i]->GetKineticEnergy()/CLHEP::GeV;
2164 if( simulatedKinetic != 0.0 )
2166 wgt = (theoreticalKinetic)/simulatedKinetic;
2167 currentParticle.SetKineticEnergy( wgt*currentParticle.GetKineticEnergy() );
2168 pp = currentParticle.GetTotalMomentum()/CLHEP::MeV;
2169 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
2170 if( pp1 < 0.001*CLHEP::MeV )
2172 rthnve = CLHEP::pi * G4UniformRand();
2173 phinve = CLHEP::twopi * G4UniformRand();
2174 currentParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
2175 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
2176 pp*std::cos(rthnve)*CLHEP::MeV );
2179 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
2181 targetParticle.SetKineticEnergy( wgt*targetParticle.GetKineticEnergy() );
2182 pp = targetParticle.GetTotalMomentum()/CLHEP::MeV;
2183 pp1 = targetParticle.GetMomentum().mag()/CLHEP::MeV;
2184 if( pp1 < 0.001*CLHEP::MeV )
2186 rthnve = CLHEP::pi * G4UniformRand();
2187 phinve = CLHEP::twopi * G4UniformRand();
2188 targetParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
2189 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
2190 pp*std::cos(rthnve)*CLHEP::MeV );
2193 targetParticle.SetMomentum( targetParticle.GetMomentum() * (pp/pp1) );
2195 for( i=0;
i<vecLen; ++
i )
2197 vec[
i]->SetKineticEnergy( wgt*
vec[i]->GetKineticEnergy() );
2198 pp =
vec[
i]->GetTotalMomentum()/CLHEP::MeV;
2199 pp1 =
vec[
i]->GetMomentum().mag()/CLHEP::MeV;
2202 rthnve = CLHEP::pi * G4UniformRand();
2203 phinve = CLHEP::twopi * G4UniformRand();
2204 vec[
i]->SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
2205 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
2206 pp*std::cos(rthnve)*CLHEP::MeV );
2209 vec[
i]->SetMomentum(
vec[i]->GetMomentum() * (pp/pp1) );
2213 Rotate( numberofFinalStateNucleons, pseudoParticle[4].GetMomentum(),
2214 modifiedOriginal, originalIncident, targetNucleus,
2215 currentParticle, targetParticle,
vec, vecLen );
2221 if( atomicWeight >= 1.5 )
2228 G4double epnb, edta;
2232 epnb = targetNucleus.GetPNBlackTrackEnergy();
2233 edta = targetNucleus.GetDTABlackTrackEnergy();
2234 const G4double pnCutOff = 0.001;
2235 const G4double dtaCutOff = 0.001;
2236 const G4double kineticMinimum = 1.e-6;
2237 const G4double kineticFactor = -0.005;
2239 G4double sprob = 0.0;
2240 const G4double ekIncident = originalIncident->GetKineticEnergy()/CLHEP::GeV;
2241 if( ekIncident >= 5.0 )sprob = std::min( 1.0, 0.6*std::log(ekIncident-4.0) );
2243 if( epnb >= pnCutOff )
2245 npnb =
Poisson((1.5+1.25*numberofFinalStateNucleons)*epnb/(epnb+edta));
2246 if( numberofFinalStateNucleons + npnb > atomicWeight )
2247 npnb = G4int(atomicWeight - numberofFinalStateNucleons);
2248 npnb = std::min( npnb, 127-vecLen );
2250 if( edta >= dtaCutOff )
2252 ndta =
Poisson( (1.5+1.25*numberofFinalStateNucleons)*edta/(epnb+edta) );
2253 ndta = std::min( ndta, 127-vecLen );
2255 G4double spall = numberofFinalStateNucleons;
2258 AddBlackTrackParticles( epnb, npnb, edta, ndta, sprob, kineticMinimum, kineticFactor,
2259 modifiedOriginal, spall, targetNucleus,
2269 if( (atomicWeight >= 1.5) && (atomicWeight <= 230.0) && (ekOriginal <= 0.2) )
2270 currentParticle.SetTOF( 1.0-500.0*std::exp(-ekOriginal/0.04)*std::log(G4UniformRand()) );
2272 currentParticle.SetTOF( 1.0 );
2278void FullModelReactionDynamics::TwoBody(
2279 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
2281 G4ReactionProduct &modifiedOriginal,
2282 const G4DynamicParticle *,
2283 G4ReactionProduct ¤tParticle,
2284 G4ReactionProduct &targetParticle,
2285 const G4Nucleus &targetNucleus,
2298 G4ParticleDefinition *aPiMinus = G4PionMinus::PionMinus();
2299 G4ParticleDefinition *aPiPlus = G4PionPlus::PionPlus();
2300 G4ParticleDefinition *aPiZero = G4PionZero::PionZero();
2301 G4ParticleDefinition *aKaonPlus = G4KaonPlus::KaonPlus();
2302 G4ParticleDefinition *aKaonMinus = G4KaonMinus::KaonMinus();
2303 G4ParticleDefinition *aKaonZeroS = G4KaonZeroShort::KaonZeroShort();
2304 G4ParticleDefinition *aKaonZeroL = G4KaonZeroLong::KaonZeroLong();
2307 static const G4double expxu = 82.;
2308 static const G4double expxl = -expxu;
2310 const G4double ekOriginal = modifiedOriginal.GetKineticEnergy()/CLHEP::GeV;
2311 const G4double pOriginal = modifiedOriginal.GetMomentum().mag()/CLHEP::GeV;
2312 G4double currentMass = currentParticle.GetMass()/CLHEP::GeV;
2313 G4double targetMass = targetParticle.GetDefinition()->GetPDGMass()/CLHEP::GeV;
2315 targetMass = targetParticle.GetMass()/CLHEP::GeV;
2316 const G4double atomicWeight = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
2318 G4double etCurrent = currentParticle.GetTotalEnergy()/CLHEP::GeV;
2319 G4double pCurrent = currentParticle.GetTotalMomentum()/CLHEP::GeV;
2321 G4double cmEnergy = std::sqrt( currentMass*currentMass +
2322 targetMass*targetMass +
2323 2.0*targetMass*etCurrent );
2331 if( (pCurrent < 0.1) || (cmEnergy < 0.01) )
2333 targetParticle.SetMass( 0.0 );
2366 G4double
pf = cmEnergy*cmEnergy + targetMass*targetMass - currentMass*currentMass;
2367 pf =
pf*
pf - 4*cmEnergy*cmEnergy*targetMass*targetMass;
2372 for(G4int i=0;
i<vecLen;
i++)
delete vec[i];
2374 throw G4HadronicException(__FILE__, __LINE__,
"FullModelReactionDynamics::TwoBody: pf is too small ");
2377 pf = std::sqrt( pf ) / ( 2.0*cmEnergy );
2381 G4ReactionProduct pseudoParticle[3];
2407 pseudoParticle[0].SetMass( currentMass*CLHEP::GeV );
2408 pseudoParticle[0].SetTotalEnergy( etCurrent*CLHEP::GeV );
2409 pseudoParticle[0].SetMomentum( 0.0, 0.0, pCurrent*CLHEP::GeV );
2411 pseudoParticle[1].SetMomentum( 0.0, 0.0, 0.0 );
2412 pseudoParticle[1].SetMass( targetMass*CLHEP::GeV );
2413 pseudoParticle[1].SetKineticEnergy( 0.0 );
2418 pseudoParticle[2] = pseudoParticle[0] + pseudoParticle[1];
2419 pseudoParticle[0].Lorentz( pseudoParticle[0], pseudoParticle[2] );
2420 pseudoParticle[1].Lorentz( pseudoParticle[1], pseudoParticle[2] );
2424 currentParticle.SetTotalEnergy( std::sqrt(pf*pf+currentMass*currentMass)*CLHEP::GeV );
2425 targetParticle.SetTotalEnergy( std::sqrt(pf*pf+targetMass*targetMass)*CLHEP::GeV );
2429 const G4double cb = 0.01;
2430 const G4double b1 = 4.225;
2431 const G4double b2 = 1.795;
2436 G4double
b = std::max( cb, b1+b2*std::log(pOriginal) );
2438 G4double btrang =
b * 4.0 *
pf * pseudoParticle[0].GetMomentum().mag()/CLHEP::GeV;
2440 G4double exindt = -1.0;
2441 exindt += std::exp(std::max(-btrang,expxl));
2445 G4double ctet = 1.0 + 2*std::log( 1.0+G4UniformRand()*exindt ) / btrang;
2446 if( std::fabs(ctet) > 1.0 )ctet > 0.0 ? ctet = 1.0 : ctet = -1.0;
2447 G4double stet = std::sqrt( (1.0-ctet)*(1.0+ctet) );
2448 G4double
phi = CLHEP::twopi * G4UniformRand();
2453 targetParticle.GetDefinition() == aKaonMinus ||
2454 targetParticle.GetDefinition() == aKaonZeroL ||
2455 targetParticle.GetDefinition() == aKaonZeroS ||
2456 targetParticle.GetDefinition() == aKaonPlus ||
2457 targetParticle.GetDefinition() == aPiMinus ||
2458 targetParticle.GetDefinition() == aPiZero ||
2459 targetParticle.GetDefinition() == aPiPlus )
2461 currentParticle.SetMomentum( -pf*stet*std::sin(
phi)*CLHEP::GeV,
2462 -pf*stet*std::cos(
phi)*CLHEP::GeV,
2463 -pf*ctet*CLHEP::GeV );
2467 currentParticle.SetMomentum( pf*stet*std::sin(
phi)*CLHEP::GeV,
2468 pf*stet*std::cos(
phi)*CLHEP::GeV,
2469 pf*ctet*CLHEP::GeV );
2471 targetParticle.SetMomentum( currentParticle.GetMomentum() * (-1.0) );
2475 currentParticle.Lorentz( currentParticle, pseudoParticle[1] );
2476 targetParticle.Lorentz( targetParticle, pseudoParticle[1] );
2486 Defs1( modifiedOriginal, currentParticle, targetParticle,
vec, vecLen );
2488 G4double pp, pp1, ekin;
2489 if( atomicWeight >= 1.5 )
2491 const G4double cfa = 0.025*((atomicWeight-1.)/120.)*std::exp(-(atomicWeight-1.)/120.);
2492 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
2495 ekin = currentParticle.GetKineticEnergy()/CLHEP::MeV - cfa*(1.0+0.5*normal())*CLHEP::GeV;
2496 ekin = std::max( 0.0001*CLHEP::GeV, ekin );
2497 currentParticle.SetKineticEnergy( ekin*CLHEP::MeV );
2498 pp = currentParticle.GetTotalMomentum()/CLHEP::MeV;
2499 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
2501 pp1 = targetParticle.GetMomentum().mag()/CLHEP::MeV;
2504 ekin = targetParticle.GetKineticEnergy()/CLHEP::MeV - cfa*(1.0+normal()/2.)*CLHEP::GeV;
2505 ekin = std::max( 0.0001*CLHEP::GeV, ekin );
2506 targetParticle.SetKineticEnergy( ekin*CLHEP::MeV );
2507 pp = targetParticle.GetTotalMomentum()/CLHEP::MeV;
2508 targetParticle.SetMomentum( targetParticle.GetMomentum() * (pp/pp1) );
2513 if( atomicWeight >= 1.5 )
2525 G4double epnb, edta;
2526 G4int npnb=0, ndta=0;
2528 epnb = targetNucleus.GetPNBlackTrackEnergy();
2529 edta = targetNucleus.GetDTABlackTrackEnergy();
2530 const G4double pnCutOff = 0.0001;
2531 const G4double dtaCutOff = 0.0001;
2532 const G4double kineticMinimum = 0.0001;
2533 const G4double kineticFactor = -0.010;
2534 G4double sprob = 0.0;
2535 if( epnb >= pnCutOff )
2543 if( npnb > atomicWeight )npnb = G4int(atomicWeight);
2544 if( (epnb > pnCutOff) && (npnb <= 0) )npnb = 1;
2545 npnb = std::min( npnb, 127-vecLen );
2547 if( edta >= dtaCutOff )
2549 ndta = G4int(2.0 * std::log(atomicWeight));
2550 ndta = std::min( ndta, 127-vecLen );
2552 G4double spall = 0.0;
2571 AddBlackTrackParticles( epnb, npnb, edta, ndta, sprob, kineticMinimum, kineticFactor,
2572 modifiedOriginal, spall, targetNucleus,
2580 if( (atomicWeight >= 1.5) && (atomicWeight <= 230.0) && (ekOriginal <= 0.2) )
2581 currentParticle.SetTOF( 1.0-500.0*std::exp(-ekOriginal/0.04)*std::log(G4UniformRand()) );
2583 currentParticle.SetTOF( 1.0 );
2587G4double FullModelReactionDynamics::GenerateNBodyEvent(
2588 const G4double totalEnergy,
2589 const G4bool constantCrossSection,
2590 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
2598 const G4double expxu = 82.;
2599 const G4double expxl = -expxu;
2602 G4cerr <<
"*** Error in FullModelReactionDynamics::GenerateNBodyEvent" << G4endl;
2603 G4cerr <<
" number of particles < 2" << G4endl;
2604 G4cerr <<
"totalEnergy = " << totalEnergy <<
"MeV, vecLen = " << vecLen << G4endl;
2609 G4double pcm[3][18];
2616 G4double totalMass = 0.0;
2620 for( i=0;
i<vecLen; ++
i )
2623 vec[
i]->SetMomentum( 0.0, 0.0, 0.0 );
2628 totalMass +=
mass[
i];
2631 G4double totalE = totalEnergy/CLHEP::GeV;
2632 if( totalMass > totalE )
2645 G4double kineticEnergy = totalE - totalMass;
2649 emm[vecLen-1] = totalE;
2653 for( i=0;
i<vecLen; ++
i )ran[i] = G4UniformRand();
2654 for( i=0;
i<vecLen-2; ++
i )
2656 for( G4int j=vecLen-2; j>
i; --j )
2658 if( ran[i] > ran[j] )
2660 G4double temp = ran[
i];
2666 for( i=1;
i<vecLen-1; ++
i )emm[i] = ran[i-1]*kineticEnergy + sm[i];
2669 G4bool lzero =
true;
2670 G4double wtmax = 0.0;
2671 if( constantCrossSection )
2673 G4double emmax = kineticEnergy +
mass[0];
2674 G4double emmin = 0.0;
2675 for( i=1;
i<vecLen; ++
i )
2679 G4double wtfc = 0.0;
2680 if( emmax*emmax > 0.0 )
2682 G4double
arg = emmax*emmax
2683 + (emmin*emmin-
mass[
i]*
mass[
i])*(emmin*emmin-mass[i]*mass[i])/(emmax*emmax)
2684 - 2.0*(emmin*emmin+mass[i]*mass[i]);
2685 if( arg > 0.0 )wtfc = 0.5*std::sqrt( arg );
2692 wtmax += std::log( wtfc );
2702 const G4double ffq[18] = { 0., 3.141592, 19.73921, 62.01255, 129.8788, 204.0131,
2703 256.3704, 268.4705, 240.9780, 189.2637,
2704 132.1308, 83.0202, 47.4210, 24.8295,
2705 12.0006, 5.3858, 2.2560, 0.8859 };
2706 wtmax = std::log( std::pow( kineticEnergy, vecLen-2 ) * ffq[vecLen-1] / totalE );
2711 for( i=0;
i<vecLen-1; ++
i )
2714 if( emm[i+1]*emm[i+1] > 0.0 )
2716 G4double
arg = emm[
i+1]*emm[
i+1]
2717 + (emm[
i]*emm[
i]-
mass[
i+1]*
mass[
i+1])*(emm[i]*emm[i]-mass[i+1]*mass[i+1])
2718 /(emm[
i+1]*emm[
i+1])
2719 - 2.0*(emm[i]*emm[i]+mass[i+1]*mass[i+1]);
2720 if( arg > 0.0 )
pd[
i] = 0.5*std::sqrt( arg );
2725 wtmax += std::log( pd[i] );
2728 if( lzero )
weight = std::exp( std::max(std::min(wtmax,expxu),expxl) );
2730 G4double bang, cb,
sb,
s0,
s1,
s2,
c,
s, esys,
a,
b, gama,
beta;
2734 for( i=1;
i<vecLen; ++
i )
2737 pcm[1][
i] = -
pd[
i-1];
2739 bang = CLHEP::twopi*G4UniformRand();
2740 cb = std::cos(bang);
2741 sb = std::sin(bang);
2742 c = 2.0*G4UniformRand() - 1.0;
2743 s = std::sqrt( std::fabs( 1.0-c*c ) );
2746 esys = std::sqrt(pd[i]*pd[i] + emm[i]*emm[i]);
2749 for( G4int j=0; j<=
i; ++j )
2754 energy[j] = std::sqrt(
s0*
s0 + s1*s1 + s2*s2 + mass[j]*mass[j] );
2758 pcm[0][j] =
a*cb -
b*
sb;
2759 pcm[2][j] =
a*
sb +
b*cb;
2760 pcm[1][j] = gama*(pcm[1][j] +
beta*
energy[j]);
2765 for( G4int j=0; j<=
i; ++j )
2770 energy[j] = std::sqrt(
s0*
s0 + s1*s1 + s2*s2 + mass[j]*mass[j] );
2774 pcm[0][j] =
a*cb -
b*
sb;
2775 pcm[2][j] =
a*
sb +
b*cb;
2779 for( i=0;
i<vecLen; ++
i )
2781 vec[
i]->SetMomentum( pcm[0][i]*CLHEP::GeV, pcm[1][i]*CLHEP::GeV, pcm[2][i]*CLHEP::GeV );
2782 vec[
i]->SetTotalEnergy( energy[i]*CLHEP::GeV );
2796FullModelReactionDynamics::normal()
2798 G4double ran = -6.0;
2799 for( G4int i=0;
i<12; ++
i )ran += G4UniformRand();
2804FullModelReactionDynamics::Poisson( G4double
x )
2810 iran =
static_cast<G4int
>(std::max( 0.0,
x+normal()*std::sqrt(
x) ) );
2812 G4int
mm = G4int(5.0*
x);
2815 G4double
p1 =
x*std::exp(-
x);
2816 G4double
p2 =
x*
p1/2.0;
2817 G4double
p3 =
x*
p2/3.0;
2818 ran = G4UniformRand();
2831 G4double
r = std::exp(-
x);
2832 ran = G4UniformRand();
2837 for( G4int i=1;
i<=
mm; ++
i )
2841 rrr = std::exp(i*std::log(
x)-(i+0.5)*std::log((G4double)i)+i-0.9189385);
2843 rrr = std::pow(
x,i)/Factorial(i);
2845 if( ran <=
rr )
break;
2854FullModelReactionDynamics::Factorial( G4int n )
2856 G4int
m = std::min(n,10);
2858 if( m <= 1 )
return result;
2863void FullModelReactionDynamics::Defs1(
2864 const G4ReactionProduct &modifiedOriginal,
2865 G4ReactionProduct ¤tParticle,
2866 G4ReactionProduct &targetParticle,
2867 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
2870 const G4double pjx = modifiedOriginal.GetMomentum().x()/CLHEP::MeV;
2871 const G4double pjy = modifiedOriginal.GetMomentum().y()/CLHEP::MeV;
2872 const G4double pjz = modifiedOriginal.GetMomentum().z()/CLHEP::MeV;
2873 const G4double
p = modifiedOriginal.GetMomentum().mag()/CLHEP::MeV;
2874 if( pjx*pjx+pjy*pjy > 0.0 )
2876 G4double
cost, sint, ph, cosp, sinp,
pix, piy, piz;
2878 sint = 0.5 * ( std::sqrt(std::abs((1.0-
cost)*(1.0+
cost))) + std::sqrt(pjx*pjx+pjy*pjy)/
p );
2880 ph = 3*CLHEP::halfpi;
2883 if( std::abs( pjx ) > 0.001*CLHEP::MeV )ph = std::atan2(pjy,pjx);
2884 cosp = std::cos(ph);
2885 sinp = std::sin(ph);
2886 pix = currentParticle.GetMomentum().x()/CLHEP::MeV;
2887 piy = currentParticle.GetMomentum().y()/CLHEP::MeV;
2888 piz = currentParticle.GetMomentum().z()/CLHEP::MeV;
2889 currentParticle.SetMomentum(
cost*cosp*
pix*CLHEP::MeV - sinp*piy+sint*cosp*piz*CLHEP::MeV,
2890 cost*sinp*
pix*CLHEP::MeV + cosp*piy+sint*sinp*piz*CLHEP::MeV,
2891 -sint*
pix*CLHEP::MeV +
cost*piz*CLHEP::MeV );
2892 pix = targetParticle.GetMomentum().x()/CLHEP::MeV;
2893 piy = targetParticle.GetMomentum().y()/CLHEP::MeV;
2894 piz = targetParticle.GetMomentum().z()/CLHEP::MeV;
2895 targetParticle.SetMomentum(
cost*cosp*
pix*CLHEP::MeV - sinp*piy+sint*cosp*piz*CLHEP::MeV,
2896 cost*sinp*
pix*CLHEP::MeV + cosp*piy+sint*sinp*piz*CLHEP::MeV,
2897 -sint*
pix*CLHEP::MeV +
cost*piz*CLHEP::MeV );
2898 for( G4int i=0;
i<vecLen; ++
i )
2900 pix =
vec[
i]->GetMomentum().x()/CLHEP::MeV;
2901 piy =
vec[
i]->GetMomentum().y()/CLHEP::MeV;
2902 piz =
vec[
i]->GetMomentum().z()/CLHEP::MeV;
2903 vec[
i]->SetMomentum(
cost*cosp*
pix*CLHEP::MeV - sinp*piy+sint*cosp*piz*CLHEP::MeV,
2904 cost*sinp*
pix*CLHEP::MeV + cosp*piy+sint*sinp*piz*CLHEP::MeV,
2905 -sint*
pix*CLHEP::MeV +
cost*piz*CLHEP::MeV );
2912 currentParticle.SetMomentum( -currentParticle.GetMomentum().z() );
2913 targetParticle.SetMomentum( -targetParticle.GetMomentum().z() );
2914 for( G4int i=0;
i<vecLen; ++
i )
2915 vec[i]->SetMomentum( -
vec[i]->GetMomentum().
z() );
2920void FullModelReactionDynamics::Rotate(
2921 const G4double numberofFinalStateNucleons,
2922 const G4ThreeVector &temp,
2923 const G4ReactionProduct &modifiedOriginal,
2924 const G4HadProjectile *originalIncident,
2925 const G4Nucleus &targetNucleus,
2926 G4ReactionProduct ¤tParticle,
2927 G4ReactionProduct &targetParticle,
2928 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
2936 const G4double atomicWeight = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
2937 const G4double logWeight = std::log(atomicWeight);
2939 G4ParticleDefinition *aPiMinus = G4PionMinus::PionMinus();
2940 G4ParticleDefinition *aPiPlus = G4PionPlus::PionPlus();
2941 G4ParticleDefinition *aPiZero = G4PionZero::PionZero();
2944 G4ThreeVector pseudoParticle[4];
2945 for( i=0;
i<4; ++
i )pseudoParticle[i].
set(0,0,0);
2946 pseudoParticle[0] = currentParticle.GetMomentum()
2947 + targetParticle.GetMomentum();
2948 for( i=0;
i<vecLen; ++
i )
2949 pseudoParticle[0] = pseudoParticle[0] + (
vec[i]->GetMomentum());
2954 G4double alekw,
p, rthnve, phinve;
2955 G4double
r1,
r2, a1, ran1, ran2, xxh, exh, pxTemp, pyTemp, pzTemp;
2957 r1 = CLHEP::twopi*G4UniformRand();
2958 r2 = G4UniformRand();
2959 a1 = std::sqrt(-2.0*std::log(r2));
2960 ran1 = a1*std::sin(r1)*0.020*numberofFinalStateNucleons*CLHEP::GeV;
2961 ran2 = a1*std::cos(r1)*0.020*numberofFinalStateNucleons*CLHEP::GeV;
2962 G4ThreeVector Fermi(ran1, ran2, 0);
2964 pseudoParticle[0] = pseudoParticle[0]+Fermi;
2965 pseudoParticle[2] = temp;
2966 pseudoParticle[3] = pseudoParticle[0];
2968 pseudoParticle[1] = pseudoParticle[2].cross(pseudoParticle[3]);
2969 G4double
rotation = 2.*CLHEP::pi*G4UniformRand();
2970 pseudoParticle[1] = pseudoParticle[1].rotate(rotation, pseudoParticle[3]);
2971 pseudoParticle[2] = pseudoParticle[3].cross(pseudoParticle[1]);
2972 for(G4int ii=1; ii<=3; ii++)
2974 p = pseudoParticle[ii].mag();
2976 pseudoParticle[ii]= G4ThreeVector( 0.0, 0.0, 0.0 );
2978 pseudoParticle[ii]= pseudoParticle[ii] * (1./
p);
2981 pxTemp = pseudoParticle[1].dot(currentParticle.GetMomentum());
2982 pyTemp = pseudoParticle[2].dot(currentParticle.GetMomentum());
2983 pzTemp = pseudoParticle[3].dot(currentParticle.GetMomentum());
2984 currentParticle.SetMomentum( pxTemp, pyTemp, pzTemp );
2986 pxTemp = pseudoParticle[1].dot(targetParticle.GetMomentum());
2987 pyTemp = pseudoParticle[2].dot(targetParticle.GetMomentum());
2988 pzTemp = pseudoParticle[3].dot(targetParticle.GetMomentum());
2989 targetParticle.SetMomentum( pxTemp, pyTemp, pzTemp );
2991 for( i=0;
i<vecLen; ++
i )
2993 pxTemp = pseudoParticle[1].dot(
vec[i]->GetMomentum());
2994 pyTemp = pseudoParticle[2].dot(
vec[i]->GetMomentum());
2995 pzTemp = pseudoParticle[3].dot(
vec[i]->GetMomentum());
2996 vec[
i]->SetMomentum( pxTemp, pyTemp, pzTemp );
3002 Defs1( modifiedOriginal, currentParticle, targetParticle,
vec, vecLen );
3004 G4double dekin = 0.0;
3007 if( atomicWeight >= 1.5 )
3011 const G4double alem[] = { 1.40, 2.30, 2.70, 3.00, 3.40, 4.60, 7.00 };
3012 const G4double val0[] = { 0.00, 0.40, 0.48, 0.51, 0.54, 0.60, 0.65 };
3013 alekw = std::log( originalIncident->GetKineticEnergy()/CLHEP::GeV );
3015 if( alekw > alem[0] )
3018 for( G4int j=1; j<7; ++j )
3020 if( alekw < alem[j] )
3022 G4double rcnve = (val0[j] - val0[j-1]) / (alem[j] - alem[j-1]);
3023 exh = rcnve * alekw + val0[j-1] - rcnve * alem[j-1];
3029 const G4double cfa = 0.025*((atomicWeight-1.)/120.)*std::exp(-(atomicWeight-1.)/120.);
3030 ekin = currentParticle.GetKineticEnergy()/CLHEP::GeV - cfa*(1+normal()/2.0);
3031 ekin = std::max( 1.0e-6, ekin );
3037 dekin += ekin*(1.0-xxh);
3046 currentParticle.SetKineticEnergy( ekin*CLHEP::GeV );
3047 pp = currentParticle.GetTotalMomentum()/CLHEP::MeV;
3048 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
3049 if( pp1 < 0.001*CLHEP::MeV )
3051 rthnve = CLHEP::pi*G4UniformRand();
3052 phinve = CLHEP::twopi*G4UniformRand();
3053 currentParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
3054 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
3055 pp*std::cos(rthnve)*CLHEP::MeV );
3058 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
3059 ekin = targetParticle.GetKineticEnergy()/CLHEP::GeV - cfa*(1+normal()/2.0);
3060 ekin = std::max( 1.0e-6, ekin );
3062 if( ( (modifiedOriginal.GetDefinition() == aPiPlus) ||
3063 (modifiedOriginal.GetDefinition() == aPiMinus) ) &&
3064 (targetParticle.GetDefinition() == aPiZero) &&
3065 (G4UniformRand() < logWeight) )xxh = exh;
3066 dekin += ekin*(1.0-xxh);
3068 if( (targetParticle.GetDefinition() == aPiPlus) ||
3069 (targetParticle.GetDefinition() == aPiZero) ||
3070 (targetParticle.GetDefinition() == aPiMinus) )
3075 targetParticle.SetKineticEnergy( ekin*CLHEP::GeV );
3076 pp = targetParticle.GetTotalMomentum()/CLHEP::MeV;
3077 pp1 = targetParticle.GetMomentum().mag()/CLHEP::MeV;
3078 if( pp1 < 0.001*CLHEP::MeV )
3080 rthnve = CLHEP::pi*G4UniformRand();
3081 phinve = CLHEP::twopi*G4UniformRand();
3082 targetParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
3083 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
3084 pp*std::cos(rthnve)*CLHEP::MeV );
3087 targetParticle.SetMomentum( targetParticle.GetMomentum() * (pp/pp1) );
3088 for( i=0;
i<vecLen; ++
i )
3090 ekin =
vec[
i]->GetKineticEnergy()/CLHEP::GeV - cfa*(1+normal()/2.0);
3091 ekin = std::max( 1.0e-6, ekin );
3093 if( ( (modifiedOriginal.GetDefinition() == aPiPlus) ||
3094 (modifiedOriginal.GetDefinition() == aPiMinus) ) &&
3095 (
vec[i]->GetDefinition() == aPiZero) &&
3096 (G4UniformRand() < logWeight) )xxh = exh;
3097 dekin += ekin*(1.0-xxh);
3099 if( (
vec[i]->GetDefinition() == aPiPlus) ||
3100 (
vec[i]->GetDefinition() == aPiZero) ||
3101 (
vec[i]->GetDefinition() == aPiMinus) )
3106 vec[
i]->SetKineticEnergy( ekin*CLHEP::GeV );
3107 pp =
vec[
i]->GetTotalMomentum()/CLHEP::MeV;
3108 pp1 =
vec[
i]->GetMomentum().mag()/CLHEP::MeV;
3109 if( pp1 < 0.001*CLHEP::MeV )
3111 rthnve = CLHEP::pi*G4UniformRand();
3112 phinve = CLHEP::twopi*G4UniformRand();
3113 vec[
i]->SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
3114 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
3115 pp*std::cos(rthnve)*CLHEP::MeV );
3118 vec[
i]->SetMomentum(
vec[i]->GetMomentum() * (pp/pp1) );
3121 if( (ek1 != 0.0) && (npions > 0) )
3123 dekin = 1.0 + dekin/ek1;
3127 if( (currentParticle.GetDefinition() == aPiPlus) ||
3128 (currentParticle.GetDefinition() == aPiZero) ||
3129 (currentParticle.GetDefinition() == aPiMinus) )
3131 currentParticle.SetKineticEnergy(
3132 std::max( 0.001*CLHEP::MeV, dekin*currentParticle.GetKineticEnergy() ) );
3133 pp = currentParticle.GetTotalMomentum()/CLHEP::MeV;
3134 pp1 = currentParticle.GetMomentum().mag()/CLHEP::MeV;
3137 rthnve = CLHEP::pi*G4UniformRand();
3138 phinve = CLHEP::twopi*G4UniformRand();
3139 currentParticle.SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
3140 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
3141 pp*std::cos(rthnve)*CLHEP::MeV );
3144 currentParticle.SetMomentum( currentParticle.GetMomentum() * (pp/pp1) );
3165 for( i=0;
i<vecLen; ++
i )
3167 if( (
vec[i]->GetDefinition() == aPiPlus) ||
3168 (
vec[i]->GetDefinition() == aPiZero) ||
3169 (
vec[i]->GetDefinition() == aPiMinus) )
3171 vec[
i]->SetKineticEnergy( std::max( 0.001*CLHEP::MeV, dekin*
vec[i]->GetKineticEnergy() ) );
3172 pp =
vec[
i]->GetTotalMomentum()/CLHEP::MeV;
3173 pp1 =
vec[
i]->GetMomentum().mag()/CLHEP::MeV;
3176 rthnve = CLHEP::pi*G4UniformRand();
3177 phinve = CLHEP::twopi*G4UniformRand();
3178 vec[
i]->SetMomentum( pp*std::sin(rthnve)*std::cos(phinve)*CLHEP::MeV,
3179 pp*std::sin(rthnve)*std::sin(phinve)*CLHEP::MeV,
3180 pp*std::cos(rthnve)*CLHEP::MeV );
3183 vec[
i]->SetMomentum(
vec[i]->GetMomentum() * (pp/pp1) );
3189void FullModelReactionDynamics::AddBlackTrackParticles(
3190 const G4double epnb,
3192 const G4double edta,
3194 const G4double sprob,
3195 const G4double kineticMinimum,
3196 const G4double kineticFactor,
3197 const G4ReactionProduct &modifiedOriginal,
3199 const G4Nucleus &targetNucleus,
3200 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
3211 G4ParticleDefinition *aProton = G4Proton::Proton();
3212 G4ParticleDefinition *aNeutron = G4Neutron::Neutron();
3213 G4ParticleDefinition *aDeuteron = G4Deuteron::Deuteron();
3214 G4ParticleDefinition *aTriton = G4Triton::Triton();
3215 G4ParticleDefinition *anAlpha = G4Alpha::Alpha();
3217 const G4double ekOriginal = modifiedOriginal.GetKineticEnergy()/CLHEP::MeV;
3218 const G4double atomicWeight = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
3220 const G4double atomicNumber = targetNucleus.GetZ_asInt();
3223 const G4double ika1 = 3.6;
3224 const G4double ika2 = 35.56;
3225 const G4double ika3 = 6.45;
3226 const G4double sp1 = 1.066;
3232 G4double cfa = 0.025*((atomicWeight-1.0)/120.0) * std::exp(-(atomicWeight-1.0)/120.0);
3235 G4double backwardKinetic = 0.0;
3236 G4int local_npnb = npnb;
3237 for( i=0;
i<npnb; ++
i )
if( G4UniformRand() < sprob ) local_npnb--;
3238 G4double ekin = epnb/local_npnb;
3240 for( i=0;
i<local_npnb; ++
i )
3242 G4ReactionProduct *
p1 =
new G4ReactionProduct();
3243 if( backwardKinetic > epnb )
3248 G4double ran = G4UniformRand();
3249 G4double kinetic = -ekin*std::log(ran) - cfa*(1.0+0.5*normal());
3250 if( kinetic < 0.0 )kinetic = -0.010*std::log(ran);
3251 backwardKinetic += kinetic;
3252 if( backwardKinetic > epnb )
3253 kinetic = std::max( kineticMinimum, epnb-(backwardKinetic-kinetic) );
3254 if( G4UniformRand() > (1.0-atomicNumber/atomicWeight) )
3255 p1->SetDefinition( aProton );
3257 p1->SetDefinition( aNeutron );
3258 vec.SetElement( vecLen, p1 );
3260 G4double
cost = G4UniformRand() * 2.0 - 1.0;
3261 G4double sint = std::sqrt(std::fabs(1.0-
cost*
cost));
3262 G4double
phi = CLHEP::twopi * G4UniformRand();
3263 vec[vecLen]->SetNewlyAdded(
true );
3264 vec[vecLen]->SetKineticEnergy( kinetic*CLHEP::GeV );
3266 pp =
vec[vecLen]->GetTotalMomentum()/CLHEP::MeV;
3267 vec[vecLen]->SetMomentum( pp*sint*std::sin(
phi)*CLHEP::MeV,
3268 pp*sint*std::cos(
phi)*CLHEP::MeV,
3269 pp*
cost*CLHEP::MeV );
3273 if( (atomicWeight >= 10.0) && (ekOriginal <= 2.0*CLHEP::GeV) )
3275 G4double ekw = ekOriginal/CLHEP::GeV;
3277 if( ekw > 1.0 )ekw *= ekw;
3278 ekw = std::max( 0.1, ekw );
3279 ika = G4int(ika1*std::exp((atomicNumber*atomicNumber/atomicWeight-ika2)/ika3)/ekw);
3282 for( i=(vecLen-1);
i>=0; --
i )
3284 if( (
vec[i]->GetDefinition() == aProton) &&
vec[i]->GetNewlyAdded() )
3286 vec[
i]->SetDefinitionAndUpdateE( aNeutron );
3287 if( ++kk > ika )
break;
3295 G4double backwardKinetic = 0.0;
3296 G4int local_ndta=ndta;
3297 for( i=0;
i<ndta; ++
i )
if( G4UniformRand() < sprob )local_ndta--;
3298 G4double ekin = edta/local_ndta;
3300 for( i=0;
i<local_ndta; ++
i )
3302 G4ReactionProduct *
p2 =
new G4ReactionProduct();
3303 if( backwardKinetic > edta )
3308 G4double ran = G4UniformRand();
3309 G4double kinetic = -ekin*std::log(ran)-cfa*(1.+0.5*normal());
3310 if( kinetic < 0.0 )kinetic = kineticFactor*std::log(ran);
3311 backwardKinetic += kinetic;
3312 if( backwardKinetic > edta )kinetic = edta-(backwardKinetic-kinetic);
3313 if( kinetic < 0.0 )kinetic = kineticMinimum;
3314 G4double
cost = 2.0*G4UniformRand() - 1.0;
3315 G4double sint = std::sqrt(std::max(0.0,(1.0-
cost*
cost)));
3316 G4double
phi = CLHEP::twopi*G4UniformRand();
3317 ran = G4UniformRand();
3319 p2->SetDefinition( aDeuteron );
3320 else if( ran <= 0.90 )
3321 p2->SetDefinition( aTriton );
3323 p2->SetDefinition( anAlpha );
3324 spall +=
p2->GetMass()/CLHEP::GeV * sp1;
3325 if( spall > atomicWeight )
3330 vec.SetElement( vecLen, p2 );
3331 vec[vecLen]->SetNewlyAdded(
true );
3332 vec[vecLen]->SetKineticEnergy( kinetic*CLHEP::GeV );
3334 pp =
vec[vecLen]->GetTotalMomentum()/CLHEP::MeV;
3335 vec[vecLen++]->SetMomentum( pp*sint*std::sin(
phi)*CLHEP::MeV,
3336 pp*sint*std::cos(
phi)*CLHEP::MeV,
3337 pp*
cost*CLHEP::MeV );
3344void FullModelReactionDynamics::MomentumCheck(
3345 const G4ReactionProduct &modifiedOriginal,
3346 G4ReactionProduct ¤tParticle,
3347 G4ReactionProduct &targetParticle,
3348 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
3351 const G4double pOriginal = modifiedOriginal.GetTotalMomentum()/CLHEP::MeV;
3352 G4double testMomentum = currentParticle.GetMomentum().mag()/CLHEP::MeV;
3354 if( testMomentum >= pOriginal )
3356 pMass = currentParticle.GetMass()/CLHEP::MeV;
3357 currentParticle.SetTotalEnergy(
3358 std::sqrt( pMass*pMass + pOriginal*pOriginal )*CLHEP::MeV );
3359 currentParticle.SetMomentum(
3360 currentParticle.GetMomentum() * (pOriginal/testMomentum) );
3362 testMomentum = targetParticle.GetMomentum().mag()/CLHEP::MeV;
3363 if( testMomentum >= pOriginal )
3365 pMass = targetParticle.GetMass()/CLHEP::MeV;
3366 targetParticle.SetTotalEnergy(
3367 std::sqrt( pMass*pMass + pOriginal*pOriginal )*CLHEP::MeV );
3368 targetParticle.SetMomentum(
3369 targetParticle.GetMomentum() * (pOriginal/testMomentum) );
3371 for( G4int i=0;
i<vecLen; ++
i )
3373 testMomentum =
vec[
i]->GetMomentum().mag()/CLHEP::MeV;
3374 if( testMomentum >= pOriginal )
3377 vec[
i]->SetTotalEnergy(
3378 std::sqrt( pMass*pMass + pOriginal*pOriginal )*CLHEP::MeV );
3379 vec[
i]->SetMomentum(
vec[i]->GetMomentum() * (pOriginal/testMomentum) );
3384void FullModelReactionDynamics::ProduceStrangeParticlePairs(
3385 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> &
vec,
3387 const G4ReactionProduct &modifiedOriginal,
3388 const G4DynamicParticle *originalTarget,
3389 G4ReactionProduct ¤tParticle,
3390 G4ReactionProduct &targetParticle,
3391 G4bool &incidentHasChanged,
3392 G4bool &targetHasChanged )
3403 if( vecLen == 0 )
return;
3407 if( currentParticle.GetMass() == 0.0 || targetParticle.GetMass() == 0.0 )
return;
3409 const G4double etOriginal = modifiedOriginal.GetTotalEnergy()/CLHEP::GeV;
3410 const G4double mOriginal = modifiedOriginal.GetDefinition()->GetPDGMass()/CLHEP::GeV;
3411 G4double targetMass = originalTarget->GetDefinition()->GetPDGMass()/CLHEP::GeV;
3412 G4double centerofmassEnergy = std::sqrt( mOriginal*mOriginal +
3413 targetMass*targetMass +
3414 2.0*targetMass*etOriginal );
3415 G4double currentMass = currentParticle.GetMass()/CLHEP::GeV;
3416 G4double availableEnergy = centerofmassEnergy-(targetMass+currentMass);
3417 if( availableEnergy <= 1.0 )
return;
3419 G4ParticleDefinition *aProton = G4Proton::Proton();
3420 G4ParticleDefinition *anAntiProton = G4AntiProton::AntiProton();
3421 G4ParticleDefinition *aNeutron = G4Neutron::Neutron();
3422 G4ParticleDefinition *anAntiNeutron = G4AntiNeutron::AntiNeutron();
3423 G4ParticleDefinition *aSigmaMinus = G4SigmaMinus::SigmaMinus();
3424 G4ParticleDefinition *aSigmaPlus = G4SigmaPlus::SigmaPlus();
3425 G4ParticleDefinition *aSigmaZero = G4SigmaZero::SigmaZero();
3426 G4ParticleDefinition *anAntiSigmaMinus = G4AntiSigmaMinus::AntiSigmaMinus();
3427 G4ParticleDefinition *anAntiSigmaPlus = G4AntiSigmaPlus::AntiSigmaPlus();
3428 G4ParticleDefinition *anAntiSigmaZero = G4AntiSigmaZero::AntiSigmaZero();
3429 G4ParticleDefinition *aKaonMinus = G4KaonMinus::KaonMinus();
3430 G4ParticleDefinition *aKaonPlus = G4KaonPlus::KaonPlus();
3431 G4ParticleDefinition *aKaonZL = G4KaonZeroLong::KaonZeroLong();
3432 G4ParticleDefinition *aKaonZS = G4KaonZeroShort::KaonZeroShort();
3433 G4ParticleDefinition *aLambda = G4Lambda::Lambda();
3434 G4ParticleDefinition *anAntiLambda = G4AntiLambda::AntiLambda();
3436 const G4double protonMass = aProton->GetPDGMass()/CLHEP::GeV;
3437 const G4double sigmaMinusMass = aSigmaMinus->GetPDGMass()/CLHEP::GeV;
3441 const G4double avrs[] = {3.,4.,5.,6.,7.,8.,9.,10.,20.,30.,40.,50.};
3444 G4double avk, avy, avn, ran;
3446 while( (i<12) && (centerofmassEnergy>avrs[i]) )++
i;
3462 G4double ran = G4UniformRand();
3463 while( ran == 1.0 )ran = G4UniformRand();
3464 i4 = i3 = G4int( vecLen*ran );
3467 ran = G4UniformRand();
3468 while( ran == 1.0 )ran = G4UniformRand();
3469 i4 = G4int( vecLen*ran );
3475 const G4double avkkb[] = { 0.0015, 0.005, 0.012, 0.0285, 0.0525, 0.075,
3476 0.0975, 0.123, 0.28, 0.398, 0.495, 0.573 };
3477 const G4double avky[] = { 0.005, 0.03, 0.064, 0.095, 0.115, 0.13,
3478 0.145, 0.155, 0.20, 0.205, 0.210, 0.212 };
3479 const G4double avnnb[] = { 0.00001, 0.0001, 0.0006, 0.0025, 0.01, 0.02,
3480 0.04, 0.05, 0.12, 0.15, 0.18, 0.20 };
3482 avk = (std::log(avkkb[ibin])-std::log(avkkb[ibin-1]))*(centerofmassEnergy-avrs[ibin-1])
3483 /(avrs[ibin]-avrs[ibin-1]) + std::log(avkkb[ibin-1]);
3484 avk = std::exp(avk);
3486 avy = (std::log(avky[ibin])-std::log(avky[ibin-1]))*(centerofmassEnergy-avrs[ibin-1])
3487 /(avrs[ibin]-avrs[ibin-1]) + std::log(avky[ibin-1]);
3488 avy = std::exp(avy);
3490 avn = (std::log(avnnb[ibin])-std::log(avnnb[ibin-1]))*(centerofmassEnergy-avrs[ibin-1])
3491 /(avrs[ibin]-avrs[ibin-1]) + std::log(avnnb[ibin-1]);
3492 avn = std::exp(avn);
3494 if( avk+avy+avn <= 0.0 )
return;
3496 if( currentMass < protonMass )avy /= 2.0;
3497 if( targetMass < protonMass )avy = 0.0;
3500 ran = G4UniformRand();
3503 if( availableEnergy < 2.0 )
return;
3506 G4ReactionProduct *
p1 =
new G4ReactionProduct;
3507 if( G4UniformRand() < 0.5 )
3509 vec[0]->SetDefinition( aNeutron );
3510 p1->SetDefinition( anAntiNeutron );
3511 (G4UniformRand() < 0.5) ?
p1->SetSide( -1 ) :
p1->SetSide( 1 );
3512 vec[0]->SetMayBeKilled(
false);
3513 p1->SetMayBeKilled(
false);
3517 vec[0]->SetDefinition( aProton );
3518 p1->SetDefinition( anAntiProton );
3519 (G4UniformRand() < 0.5) ?
p1->SetSide( -1 ) :
p1->SetSide( 1 );
3520 vec[0]->SetMayBeKilled(
false);
3521 p1->SetMayBeKilled(
false);
3523 vec.SetElement( vecLen++, p1 );
3528 if( G4UniformRand() < 0.5 )
3530 vec[i3]->SetDefinition( aNeutron );
3531 vec[i4]->SetDefinition( anAntiNeutron );
3532 vec[i3]->SetMayBeKilled(
false);
3533 vec[i4]->SetMayBeKilled(
false);
3537 vec[i3]->SetDefinition( aProton );
3538 vec[i4]->SetDefinition( anAntiProton );
3539 vec[i3]->SetMayBeKilled(
false);
3540 vec[i4]->SetMayBeKilled(
false);
3544 else if( ran < avk )
3546 if( availableEnergy < 1.0 )
return;
3548 const G4double kkb[] = { 0.2500, 0.3750, 0.5000, 0.5625, 0.6250,
3549 0.6875, 0.7500, 0.8750, 1.000 };
3550 const G4int ipakkb1[] = { 10, 10, 10, 11, 11, 12, 12, 11, 12 };
3551 const G4int ipakkb2[] = { 13, 11, 12, 11, 12, 11, 12, 13, 13 };
3552 ran = G4UniformRand();
3554 while( (i<9) && (ran>=kkb[i]) )++
i;
3560 switch( ipakkb1[i] )
3563 vec[i3]->SetDefinition( aKaonPlus );
3564 vec[i3]->SetMayBeKilled(
false);
3567 vec[i3]->SetDefinition( aKaonZS );
3568 vec[i3]->SetMayBeKilled(
false);
3571 vec[i3]->SetDefinition( aKaonZL );
3572 vec[i3]->SetMayBeKilled(
false);
3577 G4ReactionProduct *
p1 =
new G4ReactionProduct;
3578 switch( ipakkb2[i] )
3581 p1->SetDefinition( aKaonZS );
3582 p1->SetMayBeKilled(
false);
3585 p1->SetDefinition( aKaonZL );
3586 p1->SetMayBeKilled(
false);
3589 p1->SetDefinition( aKaonMinus );
3590 p1->SetMayBeKilled(
false);
3593 (G4UniformRand() < 0.5) ?
p1->SetSide( -1 ) :
p1->SetSide( 1 );
3594 vec.SetElement( vecLen++, p1 );
3599 switch( ipakkb2[i] )
3602 vec[i4]->SetDefinition( aKaonZS );
3603 vec[i4]->SetMayBeKilled(
false);
3606 vec[i4]->SetDefinition( aKaonZL );
3607 vec[i4]->SetMayBeKilled(
false);
3610 vec[i4]->SetDefinition( aKaonMinus );
3611 vec[i4]->SetMayBeKilled(
false);
3616 else if( ran < avy )
3618 if( availableEnergy < 1.6 )
return;
3620 const G4double ky[] = { 0.200, 0.300, 0.400, 0.550, 0.625, 0.700,
3621 0.800, 0.850, 0.900, 0.950, 0.975, 1.000 };
3622 const G4int ipaky1[] = { 18, 18, 18, 20, 20, 20, 21, 21, 21, 22, 22, 22 };
3623 const G4int ipaky2[] = { 10, 11, 12, 10, 11, 12, 10, 11, 12, 10, 11, 12 };
3624 const G4int ipakyb1[] = { 19, 19, 19, 23, 23, 23, 24, 24, 24, 25, 25, 25 };
3625 const G4int ipakyb2[] = { 13, 12, 11, 13, 12, 11, 13, 12, 11, 13, 12, 11 };
3626 ran = G4UniformRand();
3628 while( (i<12) && (ran>ky[i]) )++
i;
3629 if( i == 12 )
return;
3630 if( (currentMass<protonMass) || (G4UniformRand()<0.5) )
3640 targetParticle.SetDefinition( aLambda );
3643 targetParticle.SetDefinition( aSigmaPlus );
3646 targetParticle.SetDefinition( aSigmaZero );
3649 targetParticle.SetDefinition( aSigmaMinus );
3652 targetHasChanged =
true;
3656 vec[i3]->SetDefinition( aKaonPlus );
3657 vec[i3]->SetMayBeKilled(
false);
3660 vec[i3]->SetDefinition( aKaonZS );
3661 vec[i3]->SetMayBeKilled(
false);
3664 vec[i3]->SetDefinition( aKaonZL );
3665 vec[i3]->SetMayBeKilled(
false);
3673 if( (currentParticle.GetDefinition() == anAntiProton) ||
3674 (currentParticle.GetDefinition() == anAntiNeutron) ||
3675 (currentParticle.GetDefinition() == anAntiLambda) ||
3676 (currentMass > sigmaMinusMass) )
3678 switch( ipakyb1[i] )
3681 currentParticle.SetDefinitionAndUpdateE( anAntiLambda );
3684 currentParticle.SetDefinitionAndUpdateE( anAntiSigmaPlus );
3687 currentParticle.SetDefinitionAndUpdateE( anAntiSigmaZero );
3690 currentParticle.SetDefinitionAndUpdateE( anAntiSigmaMinus );
3693 incidentHasChanged =
true;
3694 switch( ipakyb2[i] )
3697 vec[i3]->SetDefinition( aKaonZS );
3698 vec[i3]->SetMayBeKilled(
false);
3701 vec[i3]->SetDefinition( aKaonZL );
3702 vec[i3]->SetMayBeKilled(
false);
3705 vec[i3]->SetDefinition( aKaonMinus );
3706 vec[i3]->SetMayBeKilled(
false);
3715 currentParticle.SetDefinitionAndUpdateE( aLambda );
3718 currentParticle.SetDefinitionAndUpdateE( aSigmaPlus );
3721 currentParticle.SetDefinitionAndUpdateE( aSigmaZero );
3724 currentParticle.SetDefinitionAndUpdateE( aSigmaMinus );
3727 incidentHasChanged =
true;
3731 vec[i3]->SetDefinition( aKaonPlus );
3732 vec[i3]->SetMayBeKilled(
false);
3735 vec[i3]->SetDefinition( aKaonZS );
3736 vec[i3]->SetMayBeKilled(
false);
3739 vec[i3]->SetDefinition( aKaonZL );
3740 vec[i3]->SetMayBeKilled(
false);
3756 currentMass = currentParticle.GetMass()/CLHEP::GeV;
3757 targetMass = targetParticle.GetMass()/CLHEP::GeV;
3759 G4double energyCheck = centerofmassEnergy-(currentMass+targetMass);
3760 for( i=0;
i<vecLen; ++
i )
3762 energyCheck -=
vec[
i]->GetMass()/CLHEP::GeV;
3763 if( energyCheck < 0.0 )
3765 vecLen = std::max( 0, --i );
3767 for(j=i; j<vecLen; j++)
delete vec[j];
3775FullModelReactionDynamics::NuclearReaction(
3776 G4FastVector<G4ReactionProduct,4> &
vec,
3778 const G4HadProjectile *originalIncident,
3779 const G4Nucleus &targetNucleus,
3780 const G4double theAtomicMass,
3781 const G4double *mass )
3787 G4ParticleDefinition *aGamma = G4Gamma::Gamma();
3788 G4ParticleDefinition *aProton = G4Proton::Proton();
3789 G4ParticleDefinition *aNeutron = G4Neutron::Neutron();
3790 G4ParticleDefinition *aDeuteron = G4Deuteron::Deuteron();
3791 G4ParticleDefinition *aTriton = G4Triton::Triton();
3792 G4ParticleDefinition *anAlpha = G4Alpha::Alpha();
3794 const G4double aProtonMass = aProton->GetPDGMass()/CLHEP::MeV;
3795 const G4double aNeutronMass = aNeutron->GetPDGMass()/CLHEP::MeV;
3796 const G4double aDeuteronMass = aDeuteron->GetPDGMass()/CLHEP::MeV;
3797 const G4double aTritonMass = aTriton->GetPDGMass()/CLHEP::MeV;
3798 const G4double anAlphaMass = anAlpha->GetPDGMass()/CLHEP::MeV;
3800 G4ReactionProduct currentParticle;
3801 currentParticle = *originalIncident;
3807 G4double
p = currentParticle.GetTotalMomentum();
3808 G4double pp = currentParticle.GetMomentum().mag();
3809 if( pp <= 0.001*CLHEP::MeV )
3811 G4double phinve = CLHEP::twopi*G4UniformRand();
3812 G4double rthnve = std::acos( std::max( -1.0, std::min( 1.0, -1.0 + 2.0*G4UniformRand() ) ) );
3813 currentParticle.SetMomentum( p*std::sin(rthnve)*std::cos(phinve),
3814 p*std::sin(rthnve)*std::sin(phinve),
3815 p*std::cos(rthnve) );
3818 currentParticle.SetMomentum( currentParticle.GetMomentum() * (p/pp) );
3822 G4double currentKinetic = currentParticle.GetKineticEnergy()/CLHEP::MeV;
3823 G4double currentMass = currentParticle.GetDefinition()->GetPDGMass()/CLHEP::MeV;
3824 G4double qv = currentKinetic + theAtomicMass + currentMass;
3827 qval[0] = qv -
mass[0];
3828 qval[1] = qv -
mass[1] - aNeutronMass;
3829 qval[2] = qv -
mass[2] - aProtonMass;
3830 qval[3] = qv -
mass[3] - aDeuteronMass;
3831 qval[4] = qv -
mass[4] - aTritonMass;
3832 qval[5] = qv -
mass[5] - anAlphaMass;
3833 qval[6] = qv -
mass[6] - aNeutronMass - aNeutronMass;
3834 qval[7] = qv -
mass[7] - aNeutronMass - aProtonMass;
3835 qval[8] = qv -
mass[8] - aProtonMass - aProtonMass;
3837 if( currentParticle.GetDefinition() == aNeutron )
3840 const G4double
A = targetNucleus.AtomicMass(targetNucleus.GetA_asInt(),targetNucleus.GetZ_asInt());
3841 if( G4UniformRand() > ((
A-1.0)/230.0)*((
A-1.0)/230.0) )
3843 if( G4UniformRand() >= currentKinetic/7.9254*
A )
3844 qval[2] = qval[3] = qval[4] = qval[5] = qval[8] = 0.0;
3851 for( i=0;
i<9; ++
i )
3853 if( mass[i] < 500.0*CLHEP::MeV )qval[
i] = 0.0;
3854 if( qval[i] < 0.0 )qval[
i] = 0.0;
3858 G4double ran = G4UniformRand();
3862 if( qval[
index] > 0.0 )
3864 qv1 += qval[
index]/qv;
3865 if( ran <= qv1 )
break;
3870 throw G4HadronicException(__FILE__, __LINE__,
3871 "FullModelReactionDynamics::NuclearReaction: inelastic reaction kinematically not possible");
3873 G4double ke = currentParticle.GetKineticEnergy()/CLHEP::GeV;
3875 if( (
index>=6) || (G4UniformRand()<std::min(0.5,ke*10.0)) )
nt = 3;
3877 G4ReactionProduct **
v =
new G4ReactionProduct * [3];
3878 v[0] =
new G4ReactionProduct;
3879 v[1] =
new G4ReactionProduct;
3880 v[2] =
new G4ReactionProduct;
3882 v[0]->SetMass( mass[
index]*CLHEP::MeV );
3886 v[1]->SetDefinition( aGamma );
3887 v[2]->SetDefinition( aGamma );
3890 v[1]->SetDefinition( aNeutron );
3891 v[2]->SetDefinition( aGamma );
3894 v[1]->SetDefinition( aProton );
3895 v[2]->SetDefinition( aGamma );
3898 v[1]->SetDefinition( aDeuteron );
3899 v[2]->SetDefinition( aGamma );
3902 v[1]->SetDefinition( aTriton );
3903 v[2]->SetDefinition( aGamma );
3906 v[1]->SetDefinition( anAlpha );
3907 v[2]->SetDefinition( aGamma );
3910 v[1]->SetDefinition( aNeutron );
3911 v[2]->SetDefinition( aNeutron );
3914 v[1]->SetDefinition( aNeutron );
3915 v[2]->SetDefinition( aProton );
3918 v[1]->SetDefinition( aProton );
3919 v[2]->SetDefinition( aProton );
3925 G4ReactionProduct pseudo1;
3926 pseudo1.SetMass( theAtomicMass*CLHEP::MeV );
3927 pseudo1.SetTotalEnergy( theAtomicMass*CLHEP::MeV );
3928 G4ReactionProduct pseudo2 = currentParticle + pseudo1;
3929 pseudo2.SetMomentum( pseudo2.GetMomentum() * (-1.0) );
3933 G4FastVector<G4ReactionProduct,MYGHADLISTSIZE> tempV;
3934 tempV.Initialize( nt );
3936 tempV.SetElement( tempLen++, v[0] );
3937 tempV.SetElement( tempLen++, v[1] );
3938 if( nt == 3 )tempV.SetElement( tempLen++, v[2] );
3939 G4bool constantCrossSection =
true;
3940 GenerateNBodyEvent( pseudo2.GetMass()/CLHEP::MeV, constantCrossSection, tempV, tempLen );
3941 v[0]->Lorentz( *v[0], pseudo2 );
3942 v[1]->Lorentz( *v[1], pseudo2 );
3943 if( nt == 3 )
v[2]->Lorentz( *v[2], pseudo2 );
3945 G4bool particleIsDefined =
false;
3946 if( v[0]->GetMass()/CLHEP::MeV - aProtonMass < 0.1 )
3948 v[0]->SetDefinition( aProton );
3949 particleIsDefined =
true;
3951 else if( v[0]->GetMass()/CLHEP::MeV - aNeutronMass < 0.1 )
3953 v[0]->SetDefinition( aNeutron );
3954 particleIsDefined =
true;
3956 else if( v[0]->GetMass()/CLHEP::MeV - aDeuteronMass < 0.1 )
3958 v[0]->SetDefinition( aDeuteron );
3959 particleIsDefined =
true;
3961 else if( v[0]->GetMass()/CLHEP::MeV - aTritonMass < 0.1 )
3963 v[0]->SetDefinition( aTriton );
3964 particleIsDefined =
true;
3966 else if( v[0]->GetMass()/CLHEP::MeV - anAlphaMass < 0.1 )
3968 v[0]->SetDefinition( anAlpha );
3969 particleIsDefined =
true;
3971 currentParticle.SetKineticEnergy(
3972 std::max( 0.001, currentParticle.GetKineticEnergy()/CLHEP::MeV ) );
3973 p = currentParticle.GetTotalMomentum();
3974 pp = currentParticle.GetMomentum().mag();
3975 if( pp <= 0.001*CLHEP::MeV )
3977 G4double phinve = CLHEP::twopi*G4UniformRand();
3978 G4double rthnve = std::acos( std::max( -1.0, std::min( 1.0, -1.0 + 2.0*G4UniformRand() ) ) );
3979 currentParticle.SetMomentum( p*std::sin(rthnve)*std::cos(phinve),
3980 p*std::sin(rthnve)*std::sin(phinve),
3981 p*std::cos(rthnve) );
3984 currentParticle.SetMomentum( currentParticle.GetMomentum() * (p/pp) );
3986 if( particleIsDefined )
3988 v[0]->SetKineticEnergy(
3989 std::max( 0.001, 0.5*G4UniformRand()*v[0]->GetKineticEnergy()/CLHEP::MeV ) );
3990 p =
v[0]->GetTotalMomentum();
3991 pp =
v[0]->GetMomentum().mag();
3992 if( pp <= 0.001*CLHEP::MeV )
3994 G4double phinve = CLHEP::twopi*G4UniformRand();
3995 G4double rthnve = std::acos( std::max(-1.0,std::min(1.0,-1.0+2.0*G4UniformRand())) );
3996 v[0]->SetMomentum( p*std::sin(rthnve)*std::cos(phinve),
3997 p*std::sin(rthnve)*std::sin(phinve),
3998 p*std::cos(rthnve) );
4001 v[0]->SetMomentum( v[0]->GetMomentum() * (p/pp) );
4003 if( (v[1]->GetDefinition() == aDeuteron) ||
4004 (v[1]->GetDefinition() == aTriton) ||
4005 (v[1]->GetDefinition() == anAlpha) )
4006 v[1]->SetKineticEnergy(
4007 std::max( 0.001, 0.5*G4UniformRand()*v[1]->GetKineticEnergy()/CLHEP::MeV ) );
4009 v[1]->SetKineticEnergy( std::max( 0.001, v[1]->GetKineticEnergy()/CLHEP::MeV ) );
4011 p =
v[1]->GetTotalMomentum();
4012 pp =
v[1]->GetMomentum().mag();
4013 if( pp <= 0.001*CLHEP::MeV )
4015 G4double phinve = CLHEP::twopi*G4UniformRand();
4016 G4double rthnve = std::acos( std::max(-1.0,std::min(1.0,-1.0+2.0*G4UniformRand())) );
4017 v[1]->SetMomentum( p*std::sin(rthnve)*std::cos(phinve),
4018 p*std::sin(rthnve)*std::sin(phinve),
4019 p*std::cos(rthnve) );
4022 v[1]->SetMomentum( v[1]->GetMomentum() * (p/pp) );
4026 if( (v[2]->GetDefinition() == aDeuteron) ||
4027 (v[2]->GetDefinition() == aTriton) ||
4028 (v[2]->GetDefinition() == anAlpha) )
4029 v[2]->SetKineticEnergy(
4030 std::max( 0.001, 0.5*G4UniformRand()*v[2]->GetKineticEnergy()/CLHEP::MeV ) );
4032 v[2]->SetKineticEnergy( std::max( 0.001, v[2]->GetKineticEnergy()/CLHEP::MeV ) );
4034 p =
v[2]->GetTotalMomentum();
4035 pp =
v[2]->GetMomentum().mag();
4036 if( pp <= 0.001*CLHEP::MeV )
4038 G4double phinve = CLHEP::twopi*G4UniformRand();
4039 G4double rthnve = std::acos( std::max(-1.0,std::min(1.0,-1.0+2.0*G4UniformRand())) );
4040 v[2]->SetMomentum( p*std::sin(rthnve)*std::cos(phinve),
4041 p*std::sin(rthnve)*std::sin(phinve),
4042 p*std::cos(rthnve) );
4045 v[2]->SetMomentum( v[2]->GetMomentum() * (p/pp) );
4048 for(del=0; del<vecLen; del++)
delete vec[del];
4050 if( particleIsDefined )
4052 vec.SetElement( vecLen++, v[0] );
4058 vec.SetElement( vecLen++, v[1] );
4061 vec.SetElement( vecLen++, v[2] );
const boost::regex rr(r_r)
Scalar phi() const
phi method
std::vector< size_t > vec
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
int cost(std::vector< std::string > &files, node &n, const std::string &directory="", bool deleteref=false, bool relocate=false)
std::vector< ALFA_RawDataCollection_p1 > t1
l
Printing final latex table to .tex output file.
hold the test vectors and ease the comparison
Extra patterns decribing particle interation process.