342 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 344 <<
"AbsorbHN() is invoked for a : " << p->
Name()
369 int pcode, t1code, t2code, scode, s2code;
370 double M1, M2_1, M2_2, M3, M4;
371 double E1L, P1L, E2L, P2L, E3L, P3L, E4L, P4L;
376 double Theta1, Theta2, theta5;
378 double E1CM, E3CM, E4CM, P3CM;
379 double P3zL, P3tL, P4zL, P4tL;
381 TVector3 tP2_1L, tP2_2L, tP1L, tP2L, tPtot, P1zCM, P2zCM;
383 TVector3 bDir, tTrans, tbeta, tVect;
420 <<
"AbsorbHN() cannot handle probe: " << pdgc;
425 M1 = pLib->
Find(pcode) ->Mass();
426 M2_1 = pLib->
Find(t1code)->Mass();
427 M2_2 = pLib->
Find(t2code)->Mass();
428 M3 = pLib->
Find(scode) ->Mass();
429 M4 = pLib->
Find(s2code)->Mass();
434 target.SetHitNucPdg(t1code);
437 E2_1L = TMath::Sqrt(tP2_1L.Mag2() + M2_1*M2_1);
439 target.SetHitNucPdg(t2code);
442 E2_2L = TMath::Sqrt(tP2_2L.Mag2() + M2_2*M2_2);
446 tP2_1L.SetXYZ(0.0, 0.0, 0.0);
449 tP2_2L.SetXYZ(0.0, 0.0, 0.0);
464 S3CM = TMath::Sqrt(1.0 - C3CM*C3CM);
468 if(E1L<0.001) E1L=0.001;
469 P1L = TMath::Sqrt(E1L*E1L - M1*M1);
470 tP1L = p->
P4()->Vect();
471 tP2L = tP2_1L + tP2_2L;
477 Theta1 = tP1L.Angle(bDir);
478 Theta2 = tP2L.Angle(bDir);
481 P1zL = P1L*TMath::Cos(Theta1);
482 P2zL = P2L*TMath::Cos(Theta2);
484 if(TMath::Abs((tVect - bDir).Mag())<.01) tVect.SetXYZ(0,1,0);
485 theta5 = tVect.Angle(bDir);
486 tTrans = (tVect - TMath::Cos(theta5)*bDir).Unit();
489 tbeta = tPtot * (1.0 / (E1L + E2L));
491 gm = 1.0 / TMath::Sqrt(1.0 - beta*beta);
494 E1CM = gm*E1L - gm*beta*P1zL;
495 P1zCM = gm*P1zL*bDir - gm*tbeta*E1L;
496 E2CM = gm*E2L - gm*beta*P2zL;
497 P2zCM = gm*P2zL*bDir - gm*tbeta*E2L;
499 E3CM = (Et*Et + (M3*M3) - (M4*M4)) / (2.0*Et);
501 P3CM = TMath::Sqrt(E3CM*E3CM - M3*M3);
504 P3zL = gm*beta*E3CM + gm*P3CM*C3CM;
506 P4zL = gm*beta*E4CM + gm*P3CM*(-C3CM);
509 P3L = TMath::Sqrt(P3zL*P3zL + P3tL*P3tL);
510 P4L = TMath::Sqrt(P4zL*P4zL + P4tL*P4tL);
514 if(!(TMath::Finite(P3L))||P3L<.001)
517 <<
"Particle 3 " << M3 <<
" momentum small or non-finite: " << P3L
518 <<
"\n" <<
"--> Assigning .001 as new momentum";
522 E3L = TMath::Sqrt(P3L*P3L + M3*M3);
525 if(!(TMath::Finite(P4L))||P4L<.001)
528 <<
"Particle 4 " << M4 <<
" momentum small or non-finite: " << P4L
529 <<
"\n" <<
"--> Assigning .001 as new momentum";
533 E4L = TMath::Sqrt(P4L*P4L + M4*M4);
539 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 540 LOG(
"HNIntranuke2014",
pINFO) <<
"AbsorbHN failed: Pauli blocking";
553 fRemnP4 -= TLorentzVector(tP2_1L,E2_1L);
554 fRemnP4 -= TLorentzVector(tP2_2L,E2_2L);
559 tP3L = P3zL*bDir + P3tL*tTrans;
560 tP4L = P4zL*bDir + P4tL*tTrans;
562 tP3L.Rotate(PHI3,bDir);
563 tP4L.Rotate(PHI3,bDir);
565 E3L = TMath::Sqrt(P3L*P3L + M3*M3);
566 E4L = TMath::Sqrt(P4L*P4L + M4*M4);
574 TLorentzVector t4P4L(tP4L,E4L);
580 TLorentzVector t4P3L(tP3L,E3L);
585 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 587 <<
"|p3| = " << (P3L) <<
", E3 = " << (E3L);
589 <<
"|p4| = " << (P4L) <<
", E4 = " << (E4L);
void SetFirstMother(int m)
TRandom3 & RndFsi(void) const
rnd number generator used by intranuclear cascade monte carlos
double E(void) const
Get energy.
static RandomGen * Instance()
Access instance.
int fRemnZ
remnant nucleus Z
INukeHadroData2014 * fHadroData2014
a collection of h+N,h+A data & calculations
void SetMomentum(const TLorentzVector &p4)
double fFermiMomentum
whether or not particle collision is pauli blocked
A singleton holding random number generator classes. All random number generation in GENIE should tak...
int LastMother(void) const
int FirstMother(void) const
string Name(void) const
Name that corresponds to the PDG code.
int fRemnA
remnant nucleus A
const NuclearModelI * fNuclmodel
nuclear model used to generate fermi momentum
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
virtual GHepParticle * TargetNucleus(void) const
double fFermiFac
testing parameter to modify fermi momentum
static PDGLibrary * Instance(void)
void SetLastMother(int m)
Singleton class to load & serve a TDatabasePDG.
void SetStatus(GHepStatus_t s)
virtual TVector3 Momentum3(void) const
static string AsString(INukeFateHN_t fate)
TParticlePDG * Find(int pdgc)
virtual bool GenerateNucleon(const Target &) const =0
virtual void AddParticle(const GHepParticle &p)
TLorentzVector * P4(void) const
STDHEP-like event record entry that can fit a particle or a nucleus.
TLorentzVector fRemnP4
P4 of remnant system.
double IntBounce(const GHepParticle *p, int target, int s1, INukeFateHN_t fate)
bool fDoFermi
whether or not to do fermi mom.