332 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 334 <<
"AbsorbHN() is invoked for a : " << p->
Name()
359 int pcode, t1code, t2code, scode, s2code;
360 double M1, M2_1, M2_2, M3, M4;
361 double E1L, P1L, E2L, P2L, E3L, P3L, E4L, P4L;
366 double Theta1, Theta2, theta5;
368 double E1CM, E3CM, E4CM, P3CM;
369 double P3zL, P3tL, P4zL, P4tL;
371 TVector3 tP2_1L, tP2_2L, tP1L, tP2L, tPtot, P1zCM, P2zCM;
373 TVector3 bDir, tTrans, tbeta, tVect;
410 <<
"AbsorbHN() cannot handle probe: " << pdgc;
415 M1 = pLib->
Find(pcode) ->Mass();
416 M2_1 = pLib->
Find(t1code)->Mass();
417 M2_2 = pLib->
Find(t2code)->Mass();
418 M3 = pLib->
Find(scode) ->Mass();
419 M4 = pLib->
Find(s2code)->Mass();
424 target.SetHitNucPdg(t1code);
427 E2_1L = TMath::Sqrt(tP2_1L.Mag2() + M2_1*M2_1);
429 target.SetHitNucPdg(t2code);
432 E2_2L = TMath::Sqrt(tP2_2L.Mag2() + M2_2*M2_2);
436 tP2_1L.SetXYZ(0.0, 0.0, 0.0);
439 tP2_2L.SetXYZ(0.0, 0.0, 0.0);
454 S3CM = TMath::Sqrt(1.0 - C3CM*C3CM);
458 if(E1L<0.001) E1L=0.001;
459 P1L = TMath::Sqrt(E1L*E1L - M1*M1);
460 tP1L = p->
P4()->Vect();
461 tP2L = tP2_1L + tP2_2L;
467 Theta1 = tP1L.Angle(bDir);
468 Theta2 = tP2L.Angle(bDir);
471 P1zL = P1L*TMath::Cos(Theta1);
472 P2zL = P2L*TMath::Cos(Theta2);
474 if(TMath::Abs((tVect - bDir).Mag())<.01) tVect.SetXYZ(0,1,0);
475 theta5 = tVect.Angle(bDir);
476 tTrans = (tVect - TMath::Cos(theta5)*bDir).Unit();
479 tbeta = tPtot * (1.0 / (E1L + E2L));
481 gm = 1.0 / TMath::Sqrt(1.0 - beta*beta);
484 E1CM = gm*E1L - gm*beta*P1zL;
485 P1zCM = gm*P1zL*bDir - gm*tbeta*E1L;
486 E2CM = gm*E2L - gm*beta*P2zL;
487 P2zCM = gm*P2zL*bDir - gm*tbeta*E2L;
489 E3CM = (Et*Et + (M3*M3) - (M4*M4)) / (2.0*Et);
491 P3CM = TMath::Sqrt(E3CM*E3CM - M3*M3);
494 P3zL = gm*beta*E3CM + gm*P3CM*C3CM;
496 P4zL = gm*beta*E4CM + gm*P3CM*(-C3CM);
499 P3L = TMath::Sqrt(P3zL*P3zL + P3tL*P3tL);
500 P4L = TMath::Sqrt(P4zL*P4zL + P4tL*P4tL);
504 if(!(TMath::Finite(P3L))||P3L<.001)
507 <<
"Particle 3 " << M3 <<
" momentum small or non-finite: " << P3L
508 <<
"\n" <<
"--> Assigning .001 as new momentum";
512 E3L = TMath::Sqrt(P3L*P3L + M3*M3);
515 if(!(TMath::Finite(P4L))||P4L<.001)
518 <<
"Particle 4 " << M4 <<
" momentum small or non-finite: " << P4L
519 <<
"\n" <<
"--> Assigning .001 as new momentum";
523 E4L = TMath::Sqrt(P4L*P4L + M4*M4);
529 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 530 LOG(
"HNIntranuke",
pINFO) <<
"AbsorbHN failed: Pauli blocking";
541 fRemnP4 -= TLorentzVector(tP2_1L,E2_1L);
542 fRemnP4 -= TLorentzVector(tP2_2L,E2_2L);
547 tP3L = P3zL*bDir + P3tL*tTrans;
548 tP4L = P4zL*bDir + P4tL*tTrans;
550 tP3L.Rotate(PHI3,bDir);
551 tP4L.Rotate(PHI3,bDir);
553 E3L = TMath::Sqrt(P3L*P3L + M3*M3);
554 E4L = TMath::Sqrt(P4L*P4L + M4*M4);
562 TLorentzVector t4P4L(tP4L,E4L);
568 TLorentzVector t4P3L(tP3L,E3L);
573 #ifdef __GENIE_LOW_LEVEL_MESG_ENABLED__ 575 <<
"|p3| = " << (P3L) <<
", E3 = " << (E3L);
577 <<
"|p4| = " << (P4L) <<
", E4 = " << (E4L);
double fFermiMomentum
whether or not particle collision is pauli blocked
void SetFirstMother(int m)
TRandom3 & RndFsi(void) const
rnd number generator used by intranuclear cascade monte carlos
INukeHadroData * fHadroData
a collection of h+N,h+A data & calculations
double E(void) const
Get energy.
TLorentzVector fRemnP4
P4 of remnant system.
static RandomGen * Instance()
Access instance.
double fFreeStep
produced particle free stem, in fm
double fTrackingRadius
tracking radius for the nucleus in the current event
void SetMomentum(const TLorentzVector &p4)
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.
#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
int fRemnA
remnant nucleus A
double IntBounce(const GHepParticle *p, int target, int s1, INukeFateHN_t fate)
static PDGLibrary * Instance(void)
void SetLastMother(int m)
void StepParticle(GHepParticle *p, double step, double nuclear_radius=-1.)
Step particle.
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)
int fRemnZ
remnant nucleus Z
bool fDoFermi
whether or not to do fermi mom.
virtual bool GenerateNucleon(const Target &) const =0
virtual void AddParticle(const GHepParticle &p)
double fFermiFac
testing parameter to modify fermi momentum
TLorentzVector * P4(void) const
STDHEP-like event record entry that can fit a particle or a nucleus.
const NuclearModelI * fNuclmodel
nuclear model used to generate fermi momentum