55#ifdef __GENIE_PYTHIA6_ENABLED__
61#ifdef __GENIE_PYTHIA6_ENABLED__
71 TVector3 unit_nu = nu->
P4()->Vect().Unit();
81 long double costh = n1;
82 long double sinth = sqrtl(1-costh*costh);
84 long double mlout = 0;
88 long double mlout2 = mlout*mlout;
90 long double mL = mlout+
kMw;
91 long double Delta = sqrtl( powl(2.*Ev*Mtgt-mL*mL,2)-4.*powl(Mtgt*mL,2) );
92 long double s12_min = Ev/(2.*Ev+Mtgt)*(mL*mL+2.*Ev*Mtgt-Delta);
93 long double s12_max = Ev/(2.*Ev+Mtgt)*(mL*mL+2.*Ev*Mtgt+Delta);
94 long double s12 = expl( logl(s12_min)+(logl(s12_max)-logl(s12_min))*n2);
95 long double Q2_min = powl(s12,2)*Mtgt/(2.*Ev*(2.*Ev*Mtgt-s12));
96 long double Q2_max = s12 - mL*mL;
97 double Q2 = expl( logl(Q2_min) + (logl(Q2_max)-logl(Q2_min))*n3 );
98 double s_r = s12 - Q2;
100 long double EW = (s_r+
kMw2-mlout2)/sqrtl(s_r)/2.;
101 long double El = (s_r-
kMw2+mlout2)/sqrtl(s_r)/2.;
102 long double p = sqrtl( EW*EW -
kMw2 );
105 long double bz = 4.*Ev*Mtgt*Q2/(Q2+s_r)/(2.*Ev*Mtgt-Q2) - (2.*Ev*Mtgt+Q2)/(2.*Ev*Mtgt-Q2);
106 long double by = sqrtl(Mtgt*powl(Q2+s_r,2)/(2.*Ev*Q2*(s_r+Q2-2.*Ev*Mtgt))+1.);
111 TLorentzVector p4l_o(p4_lout.
Px(),p4_lout.
Py(),p4_lout.
Pz(),p4_lout.
E());
112 p4l_o.RotateX((
double)acosl(by)-
kPi/2.);
117 double phi = 2 *
kPi * rnd->
RndLep().Rndm();
122 p4l_o.RotateUz(unit_nu);
137 int def61 = fPythia->GetMSTP(61);
138 int def71 = fPythia->GetMSTP(71);
139 fPythia->SetMSTP(61,0);
140 fPythia->SetMSTP(71,0);
142 fPythia->Py1ent( -1, pdgboson, EW, acosl(costh),
kPi/2. );
145 fPythia->SetMSTP(61,def61);
146 fPythia->SetMSTP(71,def71);
148 fPythia->GetPrimaries();
149 TClonesArray * pythia_particles = (TClonesArray *) fPythia->ImportParticles(
"All");
150 int np = pythia_particles->GetEntries();
153 TMCParticle * particle = 0;
154 TIter piter(pythia_particles);
155 while( (particle = (TMCParticle *) piter.Next()) ) {
157 int pdgc = particle->GetKF();
158 int ks = particle->GetKS();
160 LongLorentzVector p4longo(particle->GetPx(), particle->GetPy(), particle->GetPz(), particle->GetEnergy());
164 TLorentzVector p4o(p4longo.
Px(),p4longo.
Py(),p4longo.
Pz(),p4longo.
E());
165 p4o.RotateX((
double)acosl(by)-
kPi/2.);
167 p4o.RotateUz(unit_nu);
170 if ( (ks==1 || ks==4) && p4o.E()<massPDG ) {
171 LOG(
"PhotonCOHGenerator",
pWARN) <<
"Putting at rest one stable particle generated by PYTHIA because E < m";
172 LOG(
"PhotonCOHGenerator",
pWARN) <<
"PDG = " << pdgc <<
" // State = " << ks;
173 LOG(
"PhotonCOHGenerator",
pWARN) <<
"E = " << p4o.E() <<
" // |p| = " << TMath::Sqrt(p4o.P());
174 LOG(
"PhotonCOHGenerator",
pWARN) <<
"p = [ " << p4o.Px() <<
" , " << p4o.Py() <<
" , " << p4o.Pz() <<
" ]";
175 LOG(
"PhotonCOHGenerator",
pWARN) <<
"m = " << p4o.M() <<
" // mpdg = " << massPDG;
176 p4o.SetXYZT(0,0,0,massPDG);
183 int firstmother = -1;
188 if (particle->GetParent()==0) {
192 firstmother = particle->GetParent() + 3;
193 if (particle->GetFirstChild()!=0) firstchild = particle->GetFirstChild() + 3;
194 if (particle->GetLastChild() !=0) lastchild = particle->GetLastChild() + 3;
198 double vx = nu->
X4()->X() + particle->GetVx()*1e12;
199 double vy = nu->
X4()->Y() + particle->GetVy()*1e12;
200 double vz = nu->
X4()->Z() + particle->GetVz()*1e12;
202 TLorentzVector pos( vx, vy, vz, vt );
204 event->AddParticle(pdgc, ist, firstmother, lastmother, firstchild, lastchild, p4o, pos );
209 pythia_particles->Clear(
"C");
233#ifdef __GENIE_PYTHIA6_ENABLED__
246 double wmin;
GetParam(
"Xsec-Wmin", wmin ) ;
247 int warnings;
GetParam(
"Warnings", warnings ) ;
248 int errors;
GetParam(
"Errors", errors ) ;
249 int qrk_mass;
GetParam(
"QuarkMass", qrk_mass ) ;
250 fPythia->SetPARP(2, wmin);
251 fPythia->SetMSTU(26, warnings);
252 fPythia->SetMSTU(22, errors);
253 fPythia->SetMSTJ(93, qrk_mass);
254 fPythia->SetPMAS(24,1,
kMw);
255 fPythia->SetPMAS(24,2,0.);
256 fPythia->SetPMAS(6,2,0.);
257 fPythia->SetMDME(192,1,0);
258 fPythia->SetMDME(196,1,0);
259 fPythia->SetMDME(200,1,0);
269 fPythia->SetPARJ(41,
fLunda );
270 fPythia->SetPARJ(42,
fLundb );
STDHEP-like event record entry that can fit a particle or a nucleus.
const TLorentzVector * P4(void) const
const TLorentzVector * X4(void) const