120 G4cout <<
" >>> G4ElementaryParticleCollider::collide" <<
G4endl;
123 G4cerr <<
" ElementaryParticleCollider -> can collide only particle with particle "
128#ifdef G4CASCADE_DEBUG_SAMPLER
129 static G4bool doPrintTables =
true;
131 printFinalStateTables();
132 doPrintTables =
false;
145 if (!particle1 || !particle2) {
146 G4cerr <<
" ElementaryParticleCollider -> can only collide hadrons"
154 G4cerr <<
" ElementaryParticleCollider -> cannot collide "
179 generateSCMfinalState(ekin, etot_scm, pscm, particle1, particle2,
182 if (particles.empty()) {
184 G4cerr <<
" ElementaryParticleCollider -> failed to collide "
192 for(ipart = particles.begin(); ipart != particles.end(); ipart++) {
194 ipart->setMomentum(mom);
199 G4cout <<
" incoming particles: \n" << *particle1 <<
G4endl
201 <<
" outgoing particles: " <<
G4endl;
202 for(ipart = particles.begin(); ipart != particles.end(); ipart++)
205 G4cout <<
" <<< Non-conservation in G4ElementaryParticleCollider"
214 if (particle1->
pion() || particle2->
pion() ||
227 generateSCMpionAbsorption(etot_scm, particle1, particle2);
229 if (particles.empty()) {
231 G4cerr <<
" ElementaryParticleCollider -> failed to collide "
239 for(ipart = particles.begin(); ipart != particles.end(); ipart++) {
241 ipart->setMomentum(mom);
250 G4cerr <<
" ElementaryParticleCollider -> can only collide pions with dibaryons "
254 G4cerr <<
" ElementaryParticleCollider -> can only collide something with nucleon or dibaryon "
262G4ElementaryParticleCollider::generateMultiplicity(
G4int is,
271 G4cerr <<
" G4ElementaryParticleCollider: Unknown interaction channel "
272 << is <<
" - multiplicity not generated " <<
G4endl;
276 G4cout <<
" G4ElementaryParticleCollider::generateMultiplicity: "
277 <<
" multiplicity = " << mul <<
G4endl;
285G4ElementaryParticleCollider::generateSCMfinalState(
G4double ekin,
292 G4cout <<
" >>> G4ElementaryParticleCollider::generateSCMfinalState"
297 const G4double difr_const = 0.3678794;
298 const G4int itry_max = 10;
304 G4int is = type1 * type2;
310 G4int multiplicity = 0;
315 particle_kinds.clear();
318 multiplicity = generateMultiplicity(is, ekin);
320 generateOutgoingPartTypes(is, multiplicity, ekin);
321 if (particle_kinds.empty()) {
323 G4cout <<
" generateOutgoingPartTypes failed mult " << multiplicity
329 if (multiplicity == 2) {
331 G4int finaltype = particle_kinds[0]*particle_kinds[1];
332 G4int kw = (finaltype != is) ? 2 : 1;
340 if (etot_scm < mone+mtwo) {
342 G4cerr <<
" bad final state " << particle_kinds[0]
343 <<
" , " << particle_kinds[1] <<
" etot_scm " << etot_scm
344 <<
" < mone+mtwo " << mone+mtwo <<
" , but ekin " << ekin
350 G4double ecm_sq = etot_scm*etot_scm;
351 G4double msumsq = mone+mtwo; msumsq *= msumsq;
352 G4double mdifsq = mone-mtwo; mdifsq *= mdifsq;
354 G4double a = (ecm_sq - msumsq) * (ecm_sq - mdifsq);
356 pmod = std::sqrt(a)/(2.*etot_scm);
362 G4cout <<
" Particle kinds = " << particle_kinds[0] <<
" , "
363 << particle_kinds[1] <<
G4endl
364 <<
" pscm " << pscm <<
" pmod " << pmod <<
G4endl
365 <<
" before rotation px " << mom.
x() <<
" py " << mom.
y()
366 <<
" pz " << mom.
z() <<
G4endl;
372 G4cout <<
" after rotation px " << mom.
x() <<
" py " << mom.
y() <<
377 particles.resize(multiplicity);
384 G4int knd_last = particle_kinds[multiplicity - 1];
388 G4cout <<
" knd_last " << knd_last <<
" mass " << mass_last <<
G4endl;
391 while (bad && itry < itry_max) {
395 G4cout <<
" itry in generateSCMfinalState " << itry <<
G4endl;
398 generateMomModules(multiplicity, is, ekin, etot_scm);
399 if (
G4int(modules.size()) != multiplicity) {
401 G4cerr <<
" generateMomModule failed at mult " << multiplicity
402 <<
" ekin " << ekin <<
" etot_scm " << etot_scm <<
G4endl;
407 if (multiplicity == 3) {
409 particleSCMmomentumFor2to3(is, knd_last, ekin, modules[2]);
411 mom3 = toSCM->
rotate(mom3);
414 G4double ct = -0.5 * (modules[2] * modules[2] +
415 modules[0] * modules[0] -
416 modules[1] * modules[1]) /
417 modules[2] / modules[0];
419 if(std::fabs(ct) < ang_cut) {
426 mom1 = toSCM->
rotate(mom3, mom1);
435 particles.resize(multiplicity);
444 scm_momentums.clear();
446 for (
G4int i = 0; i < multiplicity - 2; i++) {
447 G4double p0 = particle_kinds[i] < 3 ? 0.36 : 0.25;
448 G4double alf = 1.0 / p0 / (p0 - (modules[i] + p0) *
449 std::exp(-modules[i] / p0));
453 while (std::fabs(st) > ang_cut && itry1 < itry_max) {
459 G4cout <<
" s1 * alf * std::exp(-s1 / p0) "
460 << s1 * alf * std::exp(-s1 / p0)
461 <<
" s2 " << s2 <<
G4endl;
464 if(s1 * alf * std::exp(-s1 / p0) > s2) st = s1 / modules[i];
468 G4cout <<
" itry1 " << itry1 <<
" i " << i <<
" st " << st
472 if(itry1 == itry_max) {
474 G4cout <<
" high energy angles generation: itry1 " << itry1
481 G4double ct = std::sqrt(1.0 - st * st);
488 scm_momentums.push_back(mom);
493 G4double ct = -0.5 * (tot_mod * tot_mod +
494 modules[multiplicity - 2] * modules[multiplicity - 2] -
495 modules[multiplicity - 1] * modules[multiplicity - 1]) / tot_mod /
496 modules[multiplicity - 2];
502 if (std::fabs(ct) < ang_cut) {
504 for (i = 0; i < multiplicity - 2; i++)
505 scm_momentums[i] = toSCM->
rotate(scm_momentums[i]);
507 tot_mom = toSCM->
rotate(tot_mom);
512 mom = toSCM->
rotate(tot_mom, mom);
513 scm_momentums.push_back(mom);
519 scm_momentums.push_back(mom1);
527 particles.resize(multiplicity);
528 for (i = 0; i < multiplicity; i++) {
529 particles[i].fill(scm_momentums[i], particle_kinds[i],
536 if (itry == itry_max) {
538 G4cout <<
" cannot generate the distr. for mult " << multiplicity
547 G4cout <<
" <<< G4ElementaryParticleCollider::generateSCMfinalState"
555G4ElementaryParticleCollider::generateMomModules(
G4int mult,
560 G4cout <<
" >>> G4ElementaryParticleCollider::generateMomModules"
565 G4cout <<
" mult " << mult <<
" is " << is <<
" ekin " << ekin
566 <<
" etot_cm " << etot_cm <<
G4endl;
569 const G4int itry_max = 10;
575 modules.resize(mult,0.);
578 masses2.resize(mult,0.);
580 for (
G4int i = 0; i < mult; i++) {
582 masses2[i] = mass * mass;
585 G4double mass_last = std::sqrt(masses2[mult - 1]);
588 G4cout <<
" knd_last " << particle_kinds[mult - 1] <<
" mass_last "
592 while (itry < itry_max) {
595 G4cout <<
" itry in generateMomModules " << itry <<
G4endl;
601 for (
G4int i = 0; i < mult - 1; i++) {
603 getMomModuleFor2toMany(is, mult, particle_kinds[i], ekin);
605 if (pmod < small)
break;
606 eleft -= std::sqrt(pmod * pmod + masses2[i]);
609 G4cout <<
" kp " << particle_kinds[i] <<
" pmod " << pmod
610 <<
" mass2 " << masses2[i] <<
" eleft " << eleft
611 <<
"\n x1 " << eleft - mass_last <<
G4endl;
614 if (eleft <= mass_last)
break;
619 if (ilast == mult - 2) {
620 G4double plast = eleft * eleft - masses2[mult - 1];
626 plast = std::sqrt(plast);
627 modules[mult - 1] = plast;
630 if (satisfyTriangle(modules))
return;
637 G4cerr <<
" Unable to generate momenta for multiplicity " << mult <<
G4endl;
645G4ElementaryParticleCollider::satisfyTriangle(
646 const std::vector<G4double>& pmod)
const
649 G4cout <<
" >>> G4ElementaryParticleCollider::satisfyTriangle"
653 G4bool good = ( (pmod.size() != 3) ||
654 !(std::fabs(pmod[1] - pmod[2]) > pmod[0] ||
655 pmod[0] > pmod[1] + pmod[2] ||
656 std::fabs(pmod[0] - pmod[2]) > pmod[1] ||
657 pmod[1] > pmod[0] + pmod[2] ||
658 std::fabs(pmod[0] - pmod[1]) > pmod[2] ||
659 pmod[2] > pmod[1] + pmod[0]));
666G4ElementaryParticleCollider::generateOutgoingPartTypes(
G4int is,
G4int mult,
669 particle_kinds.clear();
676 G4cerr <<
" G4ElementaryParticleCollider: Unknown interaction channel "
677 << is <<
" - outgoing kinds not generated " <<
G4endl;
685G4ElementaryParticleCollider::getMomModuleFor2toMany(
G4int is,
G4int ,
690 G4cout <<
" >>> G4ElementaryParticleCollider::getMomModuleFor2toMany "
691 <<
" is " << is <<
" knd " << knd <<
" ekin " << ekin <<
G4endl;
704 if (is == 1 || is == 2 || is == 4) KM = 1;
705 if (knd == 1 || knd == 2) JK = 0;
708 G4cout <<
" S " << S <<
" KM " << KM <<
" IL " << IL <<
" JK " << JK
709 <<
" JM " << JM <<
" IM " << IM <<
G4endl;
712 for(
G4int i = 0; i < 4; i++) {
714 for(
G4int k = 0; k < 4; k++) {
716 G4cout <<
" k " << k <<
" : rmn[k+JK][i+IL][KM-1] "
717 << rmn[k+JK][i+IL][KM-1] <<
" ekin^k " << std::pow(ekin, k)
721 V += rmn[k + JK][i + IL][KM - 1] * std::pow(ekin, k);
725 G4cout <<
" i " << i <<
" : V " << V <<
" S^i " << std::pow(S, i)
729 PR += V * std::pow(S, i);
735 if (knd == 1 || knd == 2) JM = 1;
738 for(
G4int im = 0; im < 3; im++) {
740 G4cout <<
" im " << im <<
" : rmn[8+IM+im][7+JM][KM-1] "
741 << rmn[8+IM+im][7+JM][KM-1] <<
" ekin^im " << std::pow(ekin, im)
744 PS += rmn[8 + IM + im][7 + JM][KM - 1] * std::pow(ekin, im);
747 G4double PRA = PS * std::sqrt(S) * (PR + (1 - PQ) * (S*S*S*S));
750 G4cout <<
" PS " << PS <<
" PRA = PS*sqrt(S)*(PR+(1-PQ)*S^4) " << PRA
753 return std::fabs(PRA);
758G4ElementaryParticleCollider::particleSCMmomentumFor2to3(
765 G4cout <<
" >>> G4ElementaryParticleCollider::particleSCMmomentumFor2to3"
769 const G4int itry_max = 100;
774 if(is == 1 || is == 2 || is == 4) K = 1;
776 if(knd == 1 || knd == 2) J = 0;
780 while(std::fabs(ct) > 1.0 && itry < itry_max) {
786 for(
G4int l = 0; l < 4; l++) {
789 for(
G4int im = 0; im < 4; im++) {
790 V += abn[im][l][K+J-1] * std::pow(ekin, im);
794 W += V * std::pow(S, l);
796 ct = 2.0 * std::sqrt(S) * (W + (1.0 - U) * (S*S*S*S)) - 1.0;
799 if(itry == itry_max) {
802 G4cout <<
" particleSCMmomentumFor2to3 -> itry = itry_max " << itry <<
G4endl;
813G4ElementaryParticleCollider::sampleCMmomentumFor2to2(
G4int is,
G4int kw,
818 G4cout <<
" >>> G4ElementaryParticleCollider::sampleCMmomentumFor2to2"
819 <<
" is " << is <<
" kw " << kw <<
" ekin " << ekin <<
" pscm "
822 G4double pA=0.0, pC=0.0, pCos=0.0, pFrac=0.0;
827 if (is == 1 || is == 2 || is == 4 ||
828 is == 21 || is == 23 || is == 25 || is == 27 || is ==29 || is == 31 ||
829 is == 42 || is == 46 || is == 50 || is == 54 || is ==58 || is == 62) {
833 static const G4double nnke[9] = { 0.0, 0.44, 0.59, 0.80, 1.00, 2.24, 4.40, 6.15, 10.00};
834 static const G4double nnA[9] = { 0.0, 0.34, 2.51, 4.59, 4.2, 5.61, 6.38, 7.93, 8.7};
835 static const G4double nnC[9] = { 0.0, 0.0, 1.21, 1.54, 1.88, 1.24, 1.91, 4.04, 8.7};
836 static const G4double nnCos[9] = {-1.0, -1.0, 0.4226, 0.4226, 0.4384, 0.7193, 0.8788, 0.9164, 0.95};
837 static const G4double nnFrac[9] = {1.0, 1.0, 0.4898, 0.7243, 0.7990, 0.8892, 0.8493, 0.9583, 1.0};
840 pA = interp.interpolate(ekin, nnA);
841 pC = interp.interpolate(ekin, nnC);
842 pCos = interp.interpolate(ekin, nnCos);
843 pFrac = interp.interpolate(ekin, nnFrac);
845 }
else if (kw == 2 && (is == 9 || is == 18)) {
850 G4cout <<
" gamma-nucleon inelastic with 2-body final state" <<
G4endl;
852 static const G4double gnke[10] = {0.0, 0.11, 0.22, 0.26, 0.30, 0.34, 0.42, 0.59, 0.79, 10.0};
853 static const G4double gnA[10] = {0.0, 0.0, 5.16, 5.55, 5.33, 7.40, 13.55, 13.44, 13.31, 7.3};
854 static const G4double gnC[10] = {0.0, -10.33, -5.44, -5.92, -4.27, -0.66, 1.37, 1.07, 0.52, 7.3};
855 static const G4double gnCos[10] = {1.0, 1.0, 0.906, 0.940, 0.940, 0.906, 0.906, 0.91, 0.91, 0.94};
856 static const G4double gnFrac[10] = {0.0, 0.0, 0.028, 0.012, 0.014, 0.044, 0.087, 0.122, 0.16, 1.0};
859 pA = interp.interpolate(ekin, gnA);
860 pC = interp.interpolate(ekin, gnC);
861 pCos = interp.interpolate(ekin, gnCos);
862 pFrac = interp.interpolate(ekin, gnFrac);
864 }
else if (kw == 2) {
868 G4cout <<
" pion-nucleon inelastic with 2-body final state " <<
G4endl;
870 static const G4double qxke[10] = {0.0, 0.062, 0.12, 0.217, 0.533, 0.873, 1.34, 2.86, 5.86, 10.0};
871 static const G4double qxA[10] = {0.0, 0.0, 2.48, 7.93, 10.0, 9.78, 5.08, 8.13, 8.13, 8.13};
872 static const G4double qxC[10] = {0.0, -39.58, -12.55, -4.38, 1.81, -1.99, -0.33, 1.2, 1.43, 8.13};
873 static const G4double qxCos[10] = {1.0, 1.0, 0.604, -0.033, 0.25, 0.55, 0.65, 0.80, 0.916, 0.916};
874 static const G4double qxFrac[10] = {0.0, 0.0, 0.1156, 0.5832, 0.8125, 0.3357, 0.3269, 0.7765, 0.8633, 1.0};
877 pA = interp.interpolate(ekin, qxA);
878 pC = interp.interpolate(ekin, qxC);
879 pCos = interp.interpolate(ekin, qxCos);
880 pFrac = interp.interpolate(ekin, qxFrac);
882 }
else if (is == 3 || is == 7 || is == 9 || is == 11 || is == 17 ||
883 is == 10 || is == 14 || is == 18 || is == 26 || is == 30) {
887 static const G4double hn1ke[10] = {0.0, 0.062, 0.12, 0.217, 0.533, 0.873, 1.34, 2.86, 5.86, 10.0};
888 static const G4double hn1A[10] = {0.0, 0.0, 27.58, 19.83, 6.46, 4.59, 6.47, 6.68, 6.43, 6.7};
889 static const G4double hn1C[10] = {0.0, -26.4, -30.55, -19.42, -5.05, -5.24, -1.00, 2.14, 2.9, 6.7};
890 static const G4double hn1Cos[10] = {1.0, 1.0, 0.174, -0.174, -0.7, -0.295, 0.5, 0.732, 0.837, 0.89};
891 static const G4double hn1Frac[10] = {0.0, 0.0, 0.2980, 0.7196, 0.9812, 0.8363, 0.5602, 0.9601, 0.9901, 1.0};
894 pA = interp.interpolate(ekin, hn1A);
895 pC = interp.interpolate(ekin, hn1C);
896 pCos = interp.interpolate(ekin, hn1Cos);
897 pFrac = interp.interpolate(ekin, hn1Frac);
899 }
else if (is == 5 || is == 6 || is == 13 || is == 34 || is == 22 ||
904 static const G4double hn2ke[10] = {0.0, 0.062, 0.12, 0.217, 0.533, 0.873, 1.34, 2.86, 5.86, 10.0};
905 static const G4double hn2A[10] = {0.0, 27.08, 19.32, 9.92, 7.74, 9.86, 5.51, 7.25, 7.23, 7.3};
906 static const G4double hn2C[10] = {0.0, 0.0, -19.49, -15.78, -9.78, -2.74, -1.16, 2.31, 2.96, 7.3};
907 static const G4double hn2Cos[10] = {-1.0, -1.0, -0.235, -0.259, -0.276, 0.336, 0.250, 0.732, 0.875, 0.9};
908 static const G4double hn2Frac[10] = {1.0, 1.0, 0.6918, 0.6419, 0.7821, 0.6542, 0.8382, 0.9722, 0.9784, 1.0};
911 pA = interp.interpolate(ekin, hn2A);
912 pC = interp.interpolate(ekin, hn2C);
913 pCos = interp.interpolate(ekin, hn2Cos);
914 pFrac = interp.interpolate(ekin, hn2Frac);
918 G4cerr <<
" G4ElementaryParticleCollider::sampleCMmomentumFor2to2:"
919 <<
" interaction is=" << is <<
" not recognized " <<
G4endl;
923 pCos = std::max(-1.,std::min(pCos,1.));
924 pFrac = std::max(0.,std::min(pFrac,1.));
927 G4double ct = sampleCMcosFor2to2(pscm, pFrac, pA, pC, pCos);
934G4ElementaryParticleCollider::sampleCMcosFor2to2(
G4double pscm,
G4double pFrac,
939 G4cout <<
" sampleCMcosFor2to2: pscm " << pscm <<
" pFrac " << pFrac
940 <<
" pA " << pA <<
" pC " << pC <<
" pCos " << pCos <<
G4endl;
945 G4double term1 = 2.0 * pscm*pscm * (smallAngle ? pA : pC);
947 if (std::abs(term1) < 1e-7)
return 1.0;
948 if (term1 > DBL_MAX_EXP)
return 1.0;
950 G4double term2 = std::exp(-2.0*term1);
951 G4double randScale = (std::exp(-term1*(1.0 - pCos)) - term2)/(1.0 - term2);
954 if (smallAngle) randVal = (1.0 - randScale)*
G4UniformRand() + randScale;
957 G4double costheta = 1.0 + std::log(randVal*(1.0 - term2) + term2)/term1;
960 G4cout <<
" term1 " << term1 <<
" term2 " << term2 <<
" randVal "
961 << randVal <<
" => costheta " << costheta <<
G4endl;
969G4ElementaryParticleCollider::generateSCMpionAbsorption(
G4double etot_scm,
973 G4cout <<
" >>> G4ElementaryParticleCollider::generateSCMpionAbsorption"
982 particle_kinds.clear();
994 particle_kinds.push_back(
proton);
995 particle_kinds.push_back(
proton);
997 particle_kinds.push_back(
proton);
998 particle_kinds.push_back(
neutron);
1002 particle_kinds.push_back(
proton);
1003 particle_kinds.push_back(
neutron);
1005 particle_kinds.push_back(
neutron);
1006 particle_kinds.push_back(
neutron);
1008 G4cerr <<
" pion absorption: pi- + NN -> ? " <<
G4endl;
1013 particle_kinds.push_back(
proton);
1014 particle_kinds.push_back(
proton);
1016 particle_kinds.push_back(
proton);
1017 particle_kinds.push_back(
neutron);
1019 particle_kinds.push_back(
neutron);
1020 particle_kinds.push_back(
neutron);
1032 G4double a = 0.5 * (etot_scm * etot_scm - m1sq - m2sq);
1034 G4double pmod = std::sqrt((a * a - m1sq * m2sq) / (m1sq + m2sq + 2.0 * a));
1048void G4ElementaryParticleCollider::
1049printFinalStateTables(std::ostream& os)
const {
1080 os <<
" * * * PRELIMINARY -- GAMMA-NUCLEON TABLES * * *" <<
G4endl;
1087const G4double G4ElementaryParticleCollider::rmn[14][10][2] = {
1088 {{0.5028, 0.6305}, {3.1442, -3.7333}, {-7.8172, 13.464}, {8.1667, -18.594},
1089 {1.6208, 1.9439}, {-4.3139, -4.6268}, {12.291, 9.7879}, {-15.288, -9.6074},
1090 { 0.0, 0.0}, { 0.0, 0.0}},
1092 {{0.9348, 2.1801}, {-10.59, 1.5163}, { 29.227, -16.38}, {-34.55, 27.944},
1093 {-0.2009, -0.3464}, {1.3641, 1.1093}, {-3.403, -1.9313}, { 3.8559, 1.7064},
1094 { 0.0, 0.0}, { 0.0, 0.0}},
1096 {{-0.0967, -1.2886}, {4.7335, -2.457}, {-14.298, 15.129}, {17.685, -23.295},
1097 { 0.0126, 0.0271}, {-0.0835, -0.1164}, { 0.186, 0.2697}, {-0.2004, -0.3185},
1098 { 0.0, 0.0}, { 0.0, 0.0}},
1100 {{-0.025, 0.2091}, {-0.6248, 0.5228}, { 2.0282, -2.8687}, {-2.5895, 4.2688},
1101 {-0.0002, -0.0007}, {0.0014, 0.0051}, {-0.0024, -0.015}, { 0.0022, 0.0196},
1102 { 0.0, 0.0}, { 0.0, 0.0}},
1104 {{1.1965, 0.9336}, {-0.8289,-1.8181}, { 1.0426, 5.5157}, { -1.909,-8.5216},
1105 { 1.2419, 1.8693}, {-4.3633, -5.5678}, { 13.743, 14.795}, {-18.592, -16.903},
1106 { 0.0, 0.0}, { 0.0, 0.0}},
1108 {{0.287, 1.7811}, {-4.9065,-8.2927}, { 16.264, 20.607}, {-19.904,-20.827},
1109 {-0.244, -0.4996}, {1.3158, 1.7874}, {-3.5691, -4.133}, { 4.3867, 3.8393},
1110 { 0.0, 0.0}, { 0.0, 0.0}},
1112 {{-0.2449, -1.5264}, { 2.9191, 6.8433}, {-9.5776, -16.067}, { 11.938, 16.845},
1113 {0.0157, 0.0462}, {-0.0826, -0.1854}, { 0.2143, 0.4531}, {-0.2585, -0.4627},
1114 { 0.0, 0.0}, { 0.0, 0.0}},
1116 {{0.0373, 0.2713}, {-0.422, -1.1944}, { 1.3883, 2.7495}, {-1.7476,-2.9045},
1117 {-0.0003, -0.0013}, {0.0014, 0.0058}, {-0.0034,-0.0146}, { 0.0039, 0.0156},
1118 { 0.0, 0.0}, { 0.0, 0.0}},
1120 {{ 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1121 { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1122 { 0.1451, 0.0929},{ 0.1538, 0.1303}},
1124 {{ 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1125 { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1126 { 0.4652, 0.5389},{ 0.2744, 0.4071}},
1128 {{ 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1129 { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1130 { -0.033, -0.0545},{-0.0146, -0.0288}},
1132 {{ 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1133 { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1134 { 0.6296, 0.1491},{ 0.8381, 0.1802}},
1136 {{ 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1137 { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1138 { 0.1787, 0.385},{ 0.0086, 0.3302}},
1140 {{ 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1141 { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0},
1142 {-0.0026, -0.0128},{ 0.0033, -0.0094}}
1145const G4double G4ElementaryParticleCollider::abn[4][4][4] = {
1146 {{0.0856, 0.0716, 0.1729, 0.0376}, {5.0390, 3.0960, 7.1080, 1.4331},
1147 {-13.782, -11.125, -17.961, -3.1350}, {14.661, 18.130, 16.403, 6.4864}},
1148 {{0.0543, 0.0926, -0.1450, 0.2383}, {-9.2324, -3.2186, -13.032, 1.8253},
1149 {36.397, 20.273, 41.781, 1.7648}, {-42.962, -33.245, -40.799, -16.735}},
1150 {{-0.0511, -0.0515, 0.0454, -0.1541}, {4.6003, 0.8989, 8.3515, -1.5201},
1151 {-20.534, -7.5084, -30.260, -1.5692}, {27.731, 13.188, 32.882, 17.185}},
1152 {{0.0075, 0.0058, -0.0048, 0.0250}, {-0.6253, -0.0017, -1.4095, 0.3059},
1153 {2.9159, 0.7022, 5.3505, 0.3252}, {-4.1101, -1.4854, -6.0946, -3.5277}}
std::vector< G4InuclElementaryParticle >::iterator particleIterator
std::vector< G4InuclElementaryParticle >::iterator particleIterator
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
void setVectM(const Hep3Vector &spatial, double mass)
static const G4CascadeChannel * GetTable(G4int initialState)
static void PrintTable(G4int initialState, std::ostream &os=G4cout)
virtual G4int getMultiplicity(G4double ke) const =0
virtual void getOutgoingParticleTypes(std::vector< G4int > &kinds, G4int mult, G4double ke) const =0
virtual G4bool useEPCollider(G4InuclParticle *bullet, G4InuclParticle *target) const
G4InteractionCase interCase
virtual G4bool validateOutput(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
void addOutgoingParticles(const std::vector< G4InuclElementaryParticle > &particles)
G4ElementaryParticleCollider()
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
void set(G4InuclParticle *part1, G4InuclParticle *part2)
G4bool quasi_deutron() const
static G4double getParticleMass(G4int type)
G4ParticleDefinition * getDefinition() const
G4double getMomModule() const
G4double getTotalSCMEnergy() const
void setVerbose(G4int vb=0)
void setBullet(const G4InuclParticle *bullet)
G4double getSCMMomentum() const
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
G4LorentzVector rotate(const G4LorentzVector &mom) const
G4double getKinEnergyInTheTRS() const
void setTarget(const G4InuclParticle *target)
const G4String & GetParticleName() const
G4LorentzVector generateWithFixedTheta(G4double ct, G4double p, G4double mass=0.)
G4LorentzVector generateWithRandomAngles(G4double p, G4double mass=0.)