36 #include "Framework/Conventions/GBuild.h"
49 using namespace genie;
50 using namespace genie::constants;
51 using namespace genie::utils;
52 using std::ostringstream;
78 int kpsdim = s!=
"<|E>"?1 + std::count(s.begin(), s.begin()+s.find(
'}'),
','):0;
82 LOG(
"SmithMoniz",
pWARN) <<
"not a valid process";
90 LOG(
"SmithMoniz",
pWARN) <<
"not valid kinematics";
114 else if (kpsdim == 2)
116 else if (kpsdim == 3)
148 bool prcok = proc_info.
IsWeakCC() && ((isP&&isnub) || (isN&&isnu));
149 if(!prcok)
return false;
164 Registry r(
"SmithMonizQELCCPXSec_specific",
false ) ;
165 r.
Set(
"sm_utils_algo",
RgAlg(
"genie::SmithMonizUtils",
"Default") ) ;
180 fVud2 = TMath::Power( Vud, 2 );
184 this->
SubAlg(
"FormFactorsAlg"));
195 this ->
SubAlg(
"sm_utils_algo" ) ) ) ;
204 const Kinematics & kinematics = interaction -> Kine();
206 const InitialState & init_state = interaction -> InitState();
207 const Target & target = init_state.
Tgt();
217 TParticlePDG * nucl_fin = pdglib->
Find( nucl_pdg_fin );
221 double mm_ini = m_ini*m_ini;
222 double m_fin = nucl_fin ->
Mass();
223 double mm_fin = m_fin*m_fin;
224 double m_tar = target.
Mass();
225 double mm_tar = m_tar*m_tar;
229 int n_NT = (is_neutrino) ? +1 : -1;
231 double E_p = TMath::Sqrt(mm_ini+kkF)-E_BIN;
234 double qv = TMath::Sqrt(qqv);
235 double cosT_p = ((v-E_BIN)*(2*E_p+v+E_BIN)-qqv+mm_ini-mm_fin)/(2*kF*qv);
236 if (cosT_p < -1.0 || cosT_p > 1.0 )
241 double pF = TMath::Sqrt(kkF+(2*kF*qv)*cosT_p+qqv);
243 double E_lep = E_nu-v;
245 double mm_lep = m_lep*m_lep;
250 double P_lep = TMath::Sqrt(E_lep*E_lep-mm_lep);
251 double k6 = (Q2+mm_lep)/(2*E_nu);
252 double cosT_lep= (E_lep-k6)/P_lep;
253 if (cosT_lep < -1.0 || cosT_lep > 1.0 )
return 0.0;
255 double cosT_k = (v+k6)/qv;
256 if (cosT_k < -1.0 || cosT_k > 1.0 )
return 0.0;
258 double b2_flux = (E_p-kF*cosT_k*cosT_p)*(E_p-kF*cosT_k*cosT_p);
259 double c2_flux = kkF*(1-cosT_p*cosT_p)*(1-cosT_k*cosT_k);
262 double k2 = mm_lep/(2*mm_tar);
263 double k7 = P_lep*cosT_lep;
266 double FV_SM = 4.0*TMath::Pi()/3*TMath::Power(P_Fermi, 3);
270 double a3 = a2*cosT_p*cosT_p;
277 double k4 = (3*a3-a2)/qqv;
286 double FF_V = F_V*F_V;
287 double FF_M = F_M*F_M;
288 double FF_A = F_A*F_A;
291 double W_1 = FF_A*(1+t)+t*(F_V+F_M)*(F_V+F_M);
292 double W_2 = FF_A+FF_V+t*FF_M;
293 double W_3 =-2*F_A*(F_V+F_M);
294 double W_4 =-0.5*F_V*F_M-F_A*F_P+t*F_P*F_P-0.25*(1-t)*FF_M;
295 double W_5 = FF_V+t*FF_M+FF_A;
297 double T_1 = 1.0*W_1+(a2-a3)*0.5*W_2;
298 double T_2 = ((a2-a3)*Q2/(2*qqv)+a4-k3*(a5-k3*a3))*W_2;
301 double T_5 = k5*W_5+m_tar*(a5/qv-v*k4)*W_2;
303 double xsec =
kGF2*factor*((E_lep-k7)*(T_1+k2*T_4)/m_tar+(E_lep+k7)*T_2/(2*m_tar)
304 +n_NT*T_3*((E_nu+E_lep)*(E_lep-k7)/(2*mm_tar)-k2)-k2*T_5)
313 Kinematics * kinematics = interaction -> KinePtr();
315 const InitialState & init_state = interaction -> InitState();
327 const Target & target = init_state.
Tgt();
332 double R[48]= { 0.16276744849602969579e-1,0.48812985136049731112e-1,
333 0.81297495464425558994e-1,1.13695850110665920911e-1,
334 1.45973714654896941989e-1,1.78096882367618602759e-1,
335 2.10031310460567203603e-1,2.41743156163840012328e-1,
336 2.73198812591049141487e-1,3.04364944354496353024e-1,
337 3.35208522892625422616e-1,3.65696861472313635031e-1,
338 3.95797649828908603285e-1,4.25478988407300545365e-1,
339 4.54709422167743008636e-1,4.83457973920596359768e-1,
340 5.11694177154667673586e-1,5.39388108324357436227e-1,
341 5.66510418561397168404e-1,5.93032364777572080684e-1,
342 6.18925840125468570386e-1,6.44163403784967106798e-1,
343 6.68718310043916153953e-1,6.92564536642171561344e-1,
344 7.15676812348967626225e-1,7.38030643744400132851e-1,
345 7.59602341176647498703e-1,7.80369043867433217604e-1,
346 8.00308744139140817229e-1,8.19400310737931675539e-1,
347 8.37623511228187121494e-1,8.54959033434601455463e-1,
348 8.71388505909296502874e-1,8.86894517402420416057e-1,
349 9.01460635315852341319e-1,9.15071423120898074206e-1,
350 9.27712456722308690965e-1,9.39370339752755216932e-1,
351 9.50032717784437635756e-1,9.59688291448742539300e-1,
352 9.68326828463264212174e-1,9.75939174585136466453e-1,
353 9.82517263563014677447e-1,9.88054126329623799481e-1,
354 9.92543900323762624572e-1,9.95981842987209290650e-1,
355 9.98364375863181677724e-1,9.99689503883230766828e-1};
357 double W[48]= { 0.00796792065552012429e-1,0.01853960788946921732e-1,
358 0.02910731817934946408e-1,0.03964554338444686674e-1,
359 0.05014202742927517693e-1,0.06058545504235961683e-1,
360 0.07096470791153865269e-1,0.08126876925698759217e-1,
361 0.09148671230783386633e-1,0.10160770535008415758e-1,
362 0.11162102099838498591e-1,0.12151604671088319635e-1,
363 0.13128229566961572637e-1,0.14090941772314860916e-1,
364 0.15038721026994938006e-1,0.15970562902562291381e-1,
365 0.16885479864245172450e-1,0.17782502316045260838e-1,
366 0.18660679627411467395e-1,0.19519081140145022410e-1,
367 0.20356797154333324595e-1,0.21172939892191298988e-1,
368 0.21966644438744349195e-1,0.22737069658329374001e-1,
369 0.23483399085926219842e-1,0.24204841792364691282e-1,
370 0.24900633222483610288e-1,0.25570036005349361499e-1,
371 0.26212340735672413913e-1,0.26826866725591762198e-1,
372 0.27412962726029242823e-1,0.27970007616848334440e-1,
373 0.28497411065085385646e-1,0.28994614150555236543e-1,
374 0.29461089958167905970e-1,0.29896344136328385984e-1,
375 0.30299915420827593794e-1,0.30671376123669149014e-1,
376 0.31010332586313837423e-1,0.31316425596861355813e-1,
377 0.31589330770727168558e-1,0.31828758894411006535e-1,
378 0.32034456231992663218e-1,0.32206204794030250669e-1,
379 0.32343822568575928429e-1,0.32447163714064269364e-1,
380 0.32516118713868835987e-1,0.32550614492363166242e-1};
383 for(
int i = 0;i<48;i++)
385 double kF = 0.5*(-R[i]*(rkF.
max-rkF.
min)+rkF.
min+rkF.
max);
393 double xsec = 0.5*Sum*(rkF.
max-rkF.
min);
410 const Kinematics & kinematics = interaction -> Kine();
411 const InitialState & init_state = interaction -> InitState();
412 const Target & target = init_state.
Tgt();
415 double E2 = TMath::Power(E,2);
418 double q2 = kinematics.
q2();
422 int sign = (is_neutrino) ? -1 : 1;
434 double ml2 = TMath::Power(ml, 2);
435 double M2 = TMath::Power(M, 2);
436 double M4 = TMath::Power(M2, 2);
437 double FA2 = TMath::Power(FA, 2);
438 double Fp2 = TMath::Power(Fp, 2);
439 double F1V2 = TMath::Power(F1V, 2);
440 double xiF2V2 = TMath::Power(xiF2V, 2);
442 double s_u = 4*E*M + q2 - ml2;
443 double q2_M2 = q2/M2;
446 double A = (0.25*(ml2-q2)/M2) * (
447 (4-q2_M2)*FA2 - (4+q2_M2)*F1V2 - q2_M2*xiF2V2*(1+0.25*q2_M2)
448 -4*q2_M2*F1V*xiF2V - (ml2/M2)*(
449 (F1V2+xiF2V2+2*F1V*xiF2V)+(FA2+4*Fp2+4*FA*Fp)+(q2_M2-4)*Fp2));
450 double B = -1 * q2_M2 * FA*(F1V+xiF2V);
451 double C = 0.25*(FA2 + F1V2 - 0.25*q2_M2*xiF2V2);
453 double xsec = Gfactor * (A + sign*B*s_u/M2 + C*s_u*s_u/M4);
460 if (1<target.
A() && target.
A()<4)
463 double fQES_Pauli = 1.0-0.529*TMath::Exp((Q2*(228.0-531.0*Q2)-48.0)*Q2);
484 const double Ee = E + ( (q2 - mn2 + mp2) / 2.0 / mp );
486 rc = 6.0 + (1.5 * TMath::Log(
kProtonMass / 2.0 / Ee));
void SetInteraction(const Interaction *i)
Cross Section Calculation Interface.
bool IsWeakCC(void) const
bool IsNeutrino(int pdgc)
double J(double q0, double q3, double Enu, double ml)
QELFormFactors fFormFactors
Cross Section Integrator Interface.
static const double kNucleonMass
double Q2(const Interaction *const i)
int HitNucPdg(void) const
void Configure(const Registry &config)
bool IsNeutron(void) const
double Integral(const Interaction *i) const
double fXSecScale
external xsec scaling factor
A simple [min,max] interval for doubles.
bool IsQuasiElastic(void) const
double HitNucMass(void) const
double d2sQES_dQ2dv_SM(const Interaction *i) const
static constexpr double s
Generated/set kinematical variables for an event.
int SwitchProtonNeutron(int pdgc)
double d3sQES_dQ2dvdkF_SM(const Interaction *interaction) const
double Mass(Resonance_t res)
resonance mass (GeV)
enum genie::EKinePhaseSpace KinePhaseSpace_t
static const double kElectronMass
double GetBindingEnergy(void) const
double W(const Interaction *const i)
Summary information for an interaction.
Range1D_t kFQES_SM_lim(double nu, double Q2) const
virtual bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
double q2(bool selected=false) const
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
static constexpr double A
static string AsString(KinePhaseSpace_t kps)
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
bool IsAntiNeutrino(int pdgc)
const QELFormFactorsModelI * fFormFactorsModel
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
virtual void Configure(const Registry &config)
double GetKV(KineVar_t kv) const
double XSec(const Interaction *i, KinePhaseSpace_t kps) const
Compute the cross section for the input interaction.
static const double kNucleonMass2
SmithMonizUtils * sm_utils
TParticlePDG * FSPrimLepton(void) const
final state primary lepton
virtual ~SmithMonizQELCCPXSec()
void SetKV(KineVar_t kv, double value)
const XSecIntegratorI * fXSecIntegrator
static PDGLibrary * Instance(void)
Contains auxiliary functions for Smith-Moniz model. .
static double rho(double P_Fermi, double T_Fermi, double p)
Singleton class to load & serve a TDatabasePDG.
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
A registry. Provides the container for algorithm configuration parameters.
double fVud2
|Vud|^2(square of magnitude ud-element of CKM-matrix)
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
const InitialState & InitState(void) const
const ProcessInfo & ProcInfo(void) const
TParticlePDG * Find(int pdgc, bool must_exist=true)
bool GetParamDef(const RgKey &name, T &p, const T &def) const
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
const Target & Tgt(void) const
double dsQES_dQ2_SM(const Interaction *interaction) const
static const double kProtonMass2
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
static const double kNeutronMass2
void Set(RgIMapPair entry)
bool IsProton(void) const
double ProbeE(RefFrame_t rf) const
static const double kProtonMass
const UInt_t kISkipProcessChk
if set, skip process validity checks
double GetFermiMomentum(void) const
Initial State information.
const Algorithm * SubAlg(const RgKey ®istry_key) const