47#ifdef __GENIE_PYTHIA8_ENABLED__
53#ifdef __GENIE_PYTHIA8_ENABLED__
63 TVector3 unit_nu = nu->
P4()->Vect().Unit();
73 long double costh = n1;
74 long double sinth = sqrtl(1-costh*costh);
76 long double mlout = 0;
80 long double mlout2 = mlout*mlout;
82 long double mL = mlout+
kMw;
83 long double Delta = sqrtl( powl(2.*Ev*Mtgt-mL*mL,2)-4.*powl(Mtgt*mL,2) );
84 long double s12_min = Ev/(2.*Ev+Mtgt)*(mL*mL+2.*Ev*Mtgt-Delta);
85 long double s12_max = Ev/(2.*Ev+Mtgt)*(mL*mL+2.*Ev*Mtgt+Delta);
86 long double s12 = expl( logl(s12_min)+(logl(s12_max)-logl(s12_min))*n2);
87 long double Q2_min = powl(s12,2)*Mtgt/(2.*Ev*(2.*Ev*Mtgt-s12));
88 long double Q2_max = s12 - mL*mL;
89 double Q2 = expl( logl(Q2_min) + (logl(Q2_max)-logl(Q2_min))*n3 );
90 double s_r = s12 - Q2;
92 long double EW = (s_r+
kMw2-mlout2)/sqrtl(s_r)/2.;
93 long double El = (s_r-
kMw2+mlout2)/sqrtl(s_r)/2.;
94 long double p = sqrtl( EW*EW -
kMw2 );
97 long double bz = 4.*Ev*Mtgt*Q2/(Q2+s_r)/(2.*Ev*Mtgt-Q2) - (2.*Ev*Mtgt+Q2)/(2.*Ev*Mtgt-Q2);
98 long double by = sqrtl(Mtgt*powl(Q2+s_r,2)/(2.*Ev*Q2*(s_r+Q2-2.*Ev*Mtgt))+1.);
103 TLorentzVector p4l_o(p4_lout.
Px(),p4_lout.
Py(),p4_lout.
Pz(),p4_lout.
E());
104 p4l_o.RotateX((
double)acosl(by)-
kPi/2.);
109 double phi = 2 *
kPi * rnd->
RndLep().Rndm();
114 p4l_o.RotateUz(unit_nu);
129 fPythia->event.reset();
130 fPythia->event.append(pdgboson, 23, 0, 0, 0., p*sinth, p*costh, EW,
kMw);
137 Pythia8::Event &fEvent = fPythia->event;
138 int np = fEvent.size();
141 for (
int i = 1; i < np; i++) {
143 int pdgc = fEvent[i].id();
146 int ks = fEvent[i].status();
148 LongLorentzVector p4longo(fEvent[i].px(), fEvent[i].py(), fEvent[i].pz(), fEvent[i].
e());
152 TLorentzVector p4o(p4longo.
Px(),p4longo.
Py(),p4longo.
Pz(),p4longo.
E());
153 p4o.RotateX((
double)acosl(by)-
kPi/2.);
155 p4o.RotateUz(unit_nu);
158 if ( ks>0 && p4o.E()<massPDG ) {
159 LOG(
"PhotonCOHGenerator",
pWARN) <<
"Putting at rest one stable particle generated by PYTHIA because E < m";
160 LOG(
"PhotonCOHGenerator",
pWARN) <<
"PDG = " << pdgc <<
" // State = " << ks;
161 LOG(
"PhotonCOHGenerator",
pWARN) <<
"E = " << p4o.E() <<
" // |p| = " << TMath::Sqrt(p4o.P());
162 LOG(
"PhotonCOHGenerator",
pWARN) <<
"p = [ " << p4o.Px() <<
" , " << p4o.Py() <<
" , " << p4o.Pz() <<
" ]";
163 LOG(
"PhotonCOHGenerator",
pWARN) <<
"m = " << p4o.M() <<
" // mpdg = " << massPDG;
164 p4o.SetXYZT(0,0,0,massPDG);
171 int firstmother = -1;
176 if (fEvent[i].mother1()==0) {
180 firstmother = fEvent[i].mother1() + 3;
181 if (fEvent[i].daughter1()!=0) firstchild = fEvent[i].daughter1() + 3;
182 if (fEvent[i].daughter2()!=0) lastchild = fEvent[i].daughter2() + 3;
186 double vx = nu->
X4()->X() + fEvent[i].xProd()*1e12;
187 double vy = nu->
X4()->Y() + fEvent[i].yProd()*1e12;
188 double vz = nu->
X4()->Z() + fEvent[i].zProd()*1e12;
190 TLorentzVector pos( vx, vy, vz, vt );
192 event->AddParticle(pdgc, ist, firstmother, lastmother, firstchild, lastchild, p4o, pos );
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
STDHEP-like event record entry that can fit a particle or a nucleus.
const TLorentzVector * P4(void) const
const TLorentzVector * X4(void) const