129#ifdef __GENIE_PYTHIA8_ENABLED__
135#ifdef __GENIE_PYTHIA8_ENABLED__
142 LOG(
"LeptoHad",
pDEBUG) <<
"v [LAB']: " << p4v.
E() <<
" // " << p4v.
M2() <<
" // [ " << p4v.
Dx() <<
" , " << p4v.
Dy() <<
" , " << p4v.
Dz() <<
" ]";
143 LOG(
"LeptoHad",
pDEBUG) <<
"N [LAB']: " << p4N.
E() <<
" // " << p4N.
M2() <<
" // [ " << p4N.
Dx() <<
" , " << p4N.
Dy() <<
" , " << p4N.
Dz() <<
" ]";
144 LOG(
"LeptoHad",
pDEBUG) <<
"l [LAB']: " << p4l.
E() <<
" // " << p4l.
M2() <<
" // [ " << p4l.
Dx() <<
" , " << p4l.
Dy() <<
" , " << p4l.
Dz() <<
" ]";
145 LOG(
"LeptoHad",
pDEBUG) <<
"H [LAB']: " << p4Hadlong.
E() <<
" // " << p4Hadlong.
M2() <<
" // [ " << p4Hadlong.
Dx() <<
" , " << p4Hadlong.
Dy() <<
" , " << p4Hadlong.
Dz() <<
" ]";
148 const TLorentzVector & vtx = *(
event->Probe()->X4());
149 TLorentzVector p4Had( (
double)p4Hadlong.
Px(), (
double)p4Hadlong.
Py(), (
double)p4Hadlong.
Pz(), (
double)p4Hadlong.
E() );
152 const Interaction * interaction =
event->Summary();
156 double W = interaction->
Kine().
W();
158 LOG(
"LeptoHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV!!";
171 LOG(
"LeptoHad",
pDEBUG) <<
"Hit nucleon pdgc = " << target.
HitNucPdg() <<
", W = " << W;
172 LOG(
"LeptoHad",
pDEBUG) <<
"Selected hit quark pdgc = " << hit_quark <<
" // Fragmentation quark = " << frag_quark;
179 fPythia->event.reset();
195 LOG(
"LeptoHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV! Returning a null list";
196 LOG(
"LeptoHad",
pWARN) <<
"frag_quark = " << frag_quark <<
" -> m = " << m_frag;
197 LOG(
"LeptoHad",
pWARN) <<
"diquark = " << diquark <<
" -> m = " << m_diquark;
201 double e_frag = (W*W - m_diquark*m_diquark + m_frag*m_frag)/2./W;
202 double e_diquark = (W*W + m_diquark*m_diquark - m_frag*m_frag)/2./W;
203 double pz_cm = Pythia8::sqrtpos( e_frag*e_frag - m_frag*m_frag );
204 fPythia->event.append(frag_quark, 23, 101, 0, 0., 0., pz_cm, e_frag, m_frag);
205 fPythia->event.append(diquark, 23, 0, 101, 0., 0., -pz_cm, e_diquark, m_diquark);
222 LOG(
"LeptoHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV! Returning a null list";
223 LOG(
"LeptoHad",
pWARN) <<
"frag_quark = " << frag_quark <<
" -> m = " << m_frag;
224 LOG(
"LeptoHad",
pWARN) <<
"diquark = " << diquark <<
" -> m = " << m_diquark;
228 double e_frag = (W*W - m_diquark*m_diquark + m_frag*m_frag)/2./W;
229 double e_diquark = (W*W + m_diquark*m_diquark - m_frag*m_frag)/2./W;
230 double pz_cm = Pythia8::sqrtpos( e_frag*e_frag - m_frag*m_frag );
231 fPythia->event.append(frag_quark, 23, 101, 0, 0., 0., pz_cm, e_frag, m_frag);
232 fPythia->event.append(diquark, 23, 0, 101, 0., 0., -pz_cm, e_diquark, m_diquark);
245 int rema_hit_quark = -hit_quark;
251 LOG(
"LeptoHad",
pWARN) <<
"Low invariant mass, W = " << W <<
" GeV! Returning a null list";
252 LOG(
"LeptoHad",
pWARN) <<
" frag_quark = " << frag_quark <<
" -> m = " << m_frag;
253 LOG(
"LeptoHad",
pWARN) <<
" rema_hit_quark = " << rema_hit_quark <<
" -> m = " << m_rema_hit;
261 int ntwoq = isp ? 2 : 1;
274 int valquark = int(1.+ntwoq/3.+rnd->
RndHadro().Rndm());
277 else diquark = 1000*ntwoq+100*ntwoq+3;
280 if ( rema_hit_quark>0 ) {
295 double pT2 = TMath::Power(pT,2);
296 double pr = TMath::Power(m_hadron,2)+pT2;
304 double tm_hadron = pr / z / W;
305 double E_hadron = 0.5 * ( z*W + tm_hadron );
306 double E_pz = W - tm_hadron;
307 double WT = (1-z) * W * E_pz - pT2;
310 if ( WT > TMath::Power(m_frag+m_rema+
fMinESinglet,2) ) {
314 WT = TMath::Sqrt( WT + pT2 );
315 double tm_rema = TMath::Power(m_rema,2) + pT2;
316 double E_frag = 0.5 * ( WT + ( TMath::Power(m_frag,2) - tm_rema)/WT );
317 double E_rema = 0.5 * ( WT + (-TMath::Power(m_frag,2) + tm_rema)/WT );
318 double x_rema = -1 * TMath::Sqrt( TMath::Power(E_rema,2) - tm_rema );
320 theta_rema = TMath::ATan2(pT,x_rema);
325 double dbez = (E_pz-(1-z)*W)/(E_pz+(1-z)*W);
326 double pz_hadron = -0.5 * ( z*W - tm_hadron );
330 fPythia->event.append(frag_quark, 23, 101, 0, 0., 0., sqrt(E_frag*E_frag-m_frag*m_frag), E_frag, m_frag);
332 double p_rema = sqrt(E_rema*E_rema-m_rema*m_rema);
333 fPythia->event.append(rema, 23, 0, 101, p_rema*sin(theta_rema)*sin(phi), p_rema*sin(theta_rema)*cos(phi), p_rema*cos(theta_rema), E_rema, m_rema);
335 fPythia->event.bst(0,0,dbez);
337 double theta_hadron = TMath::ATan2(pT,pz_hadron);
339 double p_hadron = sqrt(E_hadron*E_hadron-m_hadron*m_hadron);
340 fPythia->event.append(hadron, 23, 0, 0, p_hadron*sin(theta_hadron)*sin(phi+
kPi), p_hadron*sin(theta_hadron)*cos(phi+
kPi), p_hadron*cos(theta_hadron), E_hadron, m_hadron);
343 int nsize = fPythia->event.size();
344 if ( fPythia->event[nsize-1].pz()<0 && fPythia->event[nsize-2].pz()<0 )
break;
348 LOG(
"LeptoHad",
pINFO) <<
"Not backward hadron or rema";
349 LOG(
"LeptoHad",
pINFO) <<
"hadron = " << hadron <<
" -> Pz = " << fPythia->event[nsize-1].pz() ;
350 LOG(
"LeptoHad",
pINFO) <<
"rema = " << rema <<
" -> Pz = " << fPythia->event[nsize-2].pz() ;
351 fPythia->event.reset();
355 LOG(
"LeptoHad",
pINFO) <<
"Low WT value ... ";
356 LOG(
"LeptoHad",
pINFO) <<
"WT = " << TMath::Sqrt(WT) <<
" // m_frag = " << m_frag <<
" // m_rema = " << m_rema;
359 LOG(
"LeptoHad",
pINFO) <<
"Hadronization paricles not suitable. Trying again... " << counter;
362 LOG(
"LeptoHad",
pWARN) <<
"Hadronization particles failed after " << counter <<
" iterations! Returning a null list";
375 fPythia->event.rot(theta,phi);
377 theta = TMath::ATan(2.*pT/W);
378 fPythia->event.rot(theta,phi);
387 Pythia8::Event &fEvent = fPythia->event;
388 int np = fEvent.size();
392 long double beta = p4Hadlong.
P()/p4Hadlong.
E();
399 int mom =
event->FinalStateHadronicSystemPosition();
402 for (
int i = 1; i < np; i++) {
404 int pdgc = fEvent[i].id();
407 int ks = fEvent[i].status();
412 LOG(
"LeptoHad",
pERROR) <<
"Hadronization failed! Bare quark/di-quarks appear in final state!";
421 if (
pdg::IsTQuark( TMath::Abs(pdgc) ) ) { isTop=
true;
continue; }
425 (fEvent[i].mother1()==0) ? fEvent[i].mothers(fEvent[i].mother1()-1,fEvent[i].mother2()) : fEvent[i].mothers(fEvent[i].mother1()-2,fEvent[i].mother2());
426 fEvent[i].daughters(fEvent[i].daughter1()-2,fEvent[i].daughter2()-2);
429 fEvent[i].mothers(fEvent[i].mother1()-1,fEvent[i].mother2());
430 fEvent[i].daughters(fEvent[i].daughter1()-1,fEvent[i].daughter2()-1);
433 LongLorentzVector p4long( fEvent[i].px(), fEvent[i].py(), fEvent[i].pz(), fEvent[i].
e() );
438 TLorentzVector p4( (
double)p4long.
Px(), (
double)p4long.
Py(), (
double)p4long.
Pz(), (
double)p4long.
E() );
443 if ( ks>0 && p4.E()<massPDG ) {
444 LOG(
"LeptoHad",
pINFO) <<
"Putting at rest one stable particle generated by PYTHIA because E < m";
445 LOG(
"LeptoHad",
pINFO) <<
"PDG = " << pdgc <<
" // State = " << ks;
446 LOG(
"LeptoHad",
pINFO) <<
"E = " << p4.E() <<
" // |p| = " << p4.P();
447 LOG(
"LeptoHad",
pINFO) <<
"p = [ " << p4.Px() <<
" , " << p4.Py() <<
" , " << p4.Pz() <<
" ]";
448 LOG(
"LeptoHad",
pINFO) <<
"m = " << p4.M() <<
" // mpdg = " << massPDG;
449 p4.SetXYZT(0,0,0,massPDG);
455 int im = mom + 1 + fEvent[i].mother1();
456 int ifc = (fEvent[i].daughter1() <= -1) ? -1 : mom + 1 + fEvent[i].daughter1();
457 int ilc = (fEvent[i].daughter2() <= -1) ? -1 : mom + 1 + fEvent[i].daughter2();
459 double vx = vtx.X() + fEvent[i].xProd()*1e12;
460 double vy = vtx.Y() + fEvent[i].yProd()*1e12;
461 double vz = vtx.Z() + fEvent[i].zProd()*1e12;
463 TLorentzVector pos( vx, vy, vz, vt );
465 event->AddParticle( pdgc, ist, im,-1, ifc, ilc, p4, pos );