BostedChristyEMPXSec.cxx
Go to the documentation of this file.
1 //_________________________________________________________________________
2 /*
3  Copyright (c) 2003-2021, The GENIE Collaboration
4  For the full text of the license visit http://copyright.genie-mc.org
5  or see $GENIE/LICENSE
6 
7  For the class documentation see the corresponding header file.
8 */
9 //_________________________________________________________________________
10 #include <vector>
11 #include <string>
12 #include <sstream>
13 
14 #include <TMath.h>
15 #include <TDecayChannel.h>
16 
19 #include "Framework/Conventions/GBuild.h"
29 
30 using namespace genie;
31 using namespace genie::constants;
32 using namespace genie::utils;
33 
34 //____________________________________________________________________________
36 XSecAlgorithmI("genie::BostedChristyEMPXSec")
37 {
38 }
39 //____________________________________________________________________________
41 XSecAlgorithmI("genie::BostedChristyEMPXSec", config)
42 {
43 }
44 //____________________________________________________________________________
46 {
47 
48 }
49 //____________________________________________________________________________
50 // resonance cross section fit of electron-proton and electron-deuterium scattering data
51 // sf=0 \sigma_T
52 // sf=1 \sigma_L
53 double BostedChristyEMPXSec::sigmaR(int sf, double Q2, double W, bool isDeuterium=false) const
54 {
55  const std::array<std::array<double, 3>, 7> &fBR = !isDeuterium?fBRp:fBRD;
56  const std::array<std::array<double, 4>, 7> &fRescoefT = !isDeuterium?fRescoefTp:fRescoefTD;
57  if (isDeuterium)
58  sf=0;
59 
60  double W2 = W*W;
61  // proton mass
62  double Mp = fMP;
63  // pion mass
64  double Mpi = fMpi0;
65  // eta-meson mass
66  double Meta = fMeta;
67 
68  double Mp2 = Mp*Mp;
69  double Mpi2 = Mpi*Mpi;
70  double Meta2 = Meta*Meta;
71 
72  // Calculate kinematics needed for threshold Relativistic B-W
73 
74  // Ref.1, Eq. (10)
75  double k = (W2 - Mp2)/2./Mp;
76  // Ref.1, Eq. (11)
77  double kcm = (W2 - Mp2)/2./W;
78  // mesons energy and momentim
79  double Epicm = (W2 + Mpi2 - Mp2)/2./W; // pion energy in CMS
80  double ppicm = TMath::Sqrt(TMath::Max(0.0, Epicm*Epicm - Mpi2)); // pion momentum in CMS
81  double Epi2cm = (W2 + 4*Mpi2 - Mp2)/2./W; // two pion energy in CMS
82  double ppi2cm = TMath::Sqrt(TMath::Max(0.0, Epi2cm*Epi2cm - 4*Mpi2)); // two pion energi n CMS
83  double Eetacm = (W2 + Meta2 - Mp2 )/2./W; // eta energy in CMS
84  double petacm = TMath::Sqrt(TMath::Max(0.0, Eetacm*Eetacm - Meta2)); // eta energy in CMS
85 
86  double xsec = 0.0;
87 
88  // going through seven resonances
89  for (int i=0;i<7;i++)
90  {
91  // resonance mass squared
92  double MassRes2 = fMassRes[i]*fMassRes[i];
93  // resonance damping parameter
94  double x0 = i!=0?0.215:!isDeuterium?0.14462:0.1446;
95  // Ref.1, Eq. (12)
96  double kr = (MassRes2-Mp2)/2./Mp;
97  // Ref.1, Eq. (13)
98  double kcmr = (MassRes2-Mp2)/2./fMassRes[i];
99 
100  // formulas analogous to the above with substitution W->MR_i
101  double Epicmr = (MassRes2 + Mpi2 - Mp2)/2./fMassRes[i];
102  double ppicmr = TMath::Sqrt(TMath::Max(0.0, Epicmr*Epicmr - Mpi2));
103  double Epi2cmr = (MassRes2 + 4.*Mpi2 - Mp2)/2./fMassRes[i];
104  double ppi2cmr = TMath::Sqrt(TMath::Max(0.0, Epi2cmr*Epi2cmr - 4.*Mpi2));
105  double Eetacmr = (MassRes2 + Meta2 - Mp2)/2./fMassRes[i];
106  double petacmr = TMath::Sqrt(TMath::Max(0.0, Eetacmr*Eetacmr - Meta2));
107 
108  // Calculate partial widths
109  // Ref.1, Eq. (15) for single pion
110  double pwid0 = fWidthRes[i]*TMath::Power(ppicm/ppicmr, 1.+2.*fAngRes[i])*
111  TMath::Power((ppicmr*ppicmr + x0*x0)/(ppicm*ppicm+x0*x0), fAngRes[i]); // 1-pion decay mode
112  // Ref.1, Eq. (16) for two pions
113  double pwid1 = 0;
114  if (!isDeuterium || (isDeuterium && i!=1))
115  pwid1 = W/fMassRes[i]*fWidthRes[i]*TMath::Power(ppi2cm/ppi2cmr, 4.+2.*fAngRes[i])*
116  TMath::Power((ppi2cmr*ppi2cmr + x0*x0)/(ppi2cm*ppi2cm + x0*x0), 2.+fAngRes[i]); // 2-pion decay mode
117  else
118  pwid1 = fWidthRes[i]*TMath::Power(petacm/petacmr, 1.+2.*fAngRes[i])*TMath::Power((ppi2cmr*ppi2cmr + x0*x0)/(ppi2cm*ppi2cm + x0*x0), fAngRes[i]);
119 
120 
121  double pwid2 = 0.; // eta decay mode
122  // Ref.1, Eq. (15) for eta
123  if(!isDeuterium && (i==1 || i==4))
124  pwid2 = fWidthRes[i]*TMath::Power(petacm/petacmr, 1.+2.*fAngRes[i])*TMath::Power((petacmr*petacmr + x0*x0)/(petacm*petacm + x0*x0), fAngRes[i]); // eta decay only for S11's
125 
126  // Ref.1, Eq. (17)
127  double pgam = fWidthRes[i]*(kcm/kcmr)*(kcm/kcmr)*(kcmr*kcmr+x0*x0)/(kcm*kcm+x0*x0);
128  // Ref.1, Eq. (14)
129  double width = fBR[i][0]*pwid0+fBR[i][1]*pwid1+fBR[i][2]*pwid2;
130 
131  // Begin resonance Q^2 dependence calculations
132  double A;
133 
134  if (sf==0)
135  // Ref.1, Eq. (18)
136  A = fRescoefT[i][0]*(1.+fRescoefT[i][1]*Q2/(1.+fRescoefT[i][2]*Q2))/TMath::Power(1.+Q2/0.91, fRescoefT[i][3]);
137  else
138  // Ref.1, Eq. (19)
139  A = fRescoefL[i][0]*Q2/(1.+fRescoefL[i][1]*Q2)*TMath::Exp(-1.*fRescoefL[i][2]*Q2);
140 
141 
142  // Ref.1, Eq. (9)
143  double BW = kr/k*kcmr/kcm/fWidthRes[i]*width*pgam/((W2 - MassRes2)*(W2 - MassRes2) + MassRes2*width*width);
144 
145  // Ref.1, Eq. (8) divided by W
146  xsec += BW*A*A;
147  }
148  // restore factor W in Ref.1, Eq. (8)
149  return W*xsec*units::ub;
150 }
151 //____________________________________________________________________________
152 // nonresonance cross section fit of electron-proton and electron-deuterium scattering data
153 // sf=0 \sigma_T
154 // sf=1 \sigma_L
155 double BostedChristyEMPXSec::sigmaNR(int sf, double Q2, double W, bool isDeuterium=false) const
156 {
157  const std::array<std::array<double, 5>, 2> &fNRcoefT = !isDeuterium?fNRcoefTp:fNRcoefTD;
158  if (isDeuterium)
159  sf=0;
160  double W2 = W*W;
161  double Mp = fMP;
162  double Mpi = fMpi0;
163  double Mp2 = Mp*Mp;
164 
165  double Wdif = W - (Mp + Mpi);
166 
167  double m0 = 4.2802; // GeV
168  double Q20 = sf==0?0.05:0.125;
169  double xpr = 1./(1.+(W2-(Mp+Mpi)*(Mp+Mpi))/(Q2+Q20)); // Ref.1, Eq.(22)
170 
171  double xsec = 0.0;
172 
173 
174  if (sf==0)
175  {
176 
177  for (int i=0;i<2;i++)
178  {
179  double h_nr = fNRcoefT[i][0]/TMath::Power(Q2+fNRcoefT[i][1], fNRcoefT[i][2]+fNRcoefT[i][3]*Q2+fNRcoefT[i][4]*Q2*Q2); // Ref.1, Eq. (21)
180  xsec += h_nr*TMath::Power(Wdif, 1.5+i);
181  }
182 
183  xsec *= xpr;
184  }
185  else
186  {
187  double xb = Q2/(Q2+W2-Mp2);
188  double t = TMath::Log(TMath::Log((Q2+m0)/0.330/0.330)/TMath::Log(m0/0.330/0.330)); // Ref.1, Eq. (24)
189  xsec += fNRcoefL[0]*TMath::Power(1.-xpr, fNRcoefL[2]+fNRcoefL[1]*t)/(1.-xb)/(Q2+Q20)
190  *TMath::Power(Q2/(Q2+Q20), fNRcoefL[3])*TMath::Power(xpr, fNRcoefL[4]+fNRcoefL[5]*t); // Ref.1, Eq. (23)
191  }
192 
193  return xsec*units::ub;
194 }
195 //___________________________________________________________________________
196 // Calculate proton and neutron with Fermi smearing of a nulei
197 void BostedChristyEMPXSec::FermiSmearingA(double Q2, double W, double pF, double Es, double & F1p, double & F1d, double & sigmaT, double & sigmaL) const
198 {
199  // The numbers in arrays bellow were not supposed to change in the original
200  // fortran code and therefore are not configurable
201  static constexpr std::array<double, 99> fyp
202  {0.0272,0.0326,0.0390,0.0464,0.0551,0.0651,0.0766,0.0898,0.1049,
203  0.1221,0.1416,0.1636,0.1883,0.2159,0.2466,0.2807,0.3182,0.3595,
204  0.4045,0.4535,0.5066,0.5637,0.6249,0.6901,0.7593,0.8324,0.9090,
205  0.9890,1.0720,1.1577,1.2454,1.3349,1.4254,1.5163,1.6070,1.6968,
206  1.7849,1.8705,1.9529,2.0313,2.1049,2.1731,2.2350,2.2901,2.3379,
207  2.3776,2.4090,2.4317,2.4454,2.4500,2.4454,2.4317,2.4090,2.3776,
208  2.3379,2.2901,2.2350,2.1731,2.1049,2.0313,1.9529,1.8705,1.7849,
209  1.6968,1.6070,1.5163,1.4254,1.3349,1.2454,1.1577,1.0720,0.9890,
210  0.9090,0.8324,0.7593,0.6901,0.6249,0.5637,0.5066,0.4535,0.4045,
211  0.3595,0.3182,0.2807,0.2466,0.2159,0.1883,0.1636,0.1416,0.1221,
212  0.1049,0.0898,0.0766,0.0651,0.0551,0.0464,0.0390,0.0326,0.0272};
213 
214  static constexpr std::array<double, 99> xxp
215  {-3.000,-2.939,-2.878,-2.816,-2.755,-2.694,-2.633,-2.571,-2.510,
216  -2.449,-2.388,-2.327,-2.265,-2.204,-2.143,-2.082,-2.020,-1.959,
217  -1.898,-1.837,-1.776,-1.714,-1.653,-1.592,-1.531,-1.469,-1.408,
218  -1.347,-1.286,-1.224,-1.163,-1.102,-1.041,-0.980,-0.918,-0.857,
219  -0.796,-0.735,-0.673,-0.612,-0.551,-0.490,-0.429,-0.367,-0.306,
220  -0.245,-0.184,-0.122,-0.061, 0.000, 0.061, 0.122, 0.184, 0.245,
221  0.306, 0.367, 0.429, 0.490, 0.551, 0.612, 0.673, 0.735, 0.796,
222  0.857, 0.918, 0.980, 1.041, 1.102, 1.163, 1.224, 1.286, 1.347,
223  1.408, 1.469, 1.531, 1.592, 1.653, 1.714, 1.776, 1.837, 1.898,
224  1.959, 2.020, 2.082, 2.143, 2.204, 2.265, 2.327, 2.388, 2.449,
225  2.510, 2.571, 2.633, 2.694, 2.755, 2.816, 2.878, 2.939, 3.000};
226 
227  double MN = fPM;
228  double MN2 = MN*MN;
229  double Mp = fMP;
230  double Mp2 = Mp*Mp;
231  double W2 = W*W;
232 
233  double nu = (W2 - MN2 + Q2)/2./MN;
234  double qv = TMath::Sqrt(nu*nu + Q2);
235  // assume this is 2*pf*qv
236  double dW2dpF = 2.*qv;
237  double dW2dEs = 2.*(nu + MN);
238  // switched to using 99 bins!
239 
240  for (int i=0; i<100; i++)
241  {
242  double fyuse = fyp[i+1]/100.;
243  double W2p = W2 + xxp[i+1]*pF*dW2dpF - Es*dW2dEs;
244  if(W2p>1.159)
245  {
246  //proton
247  double Wp = TMath::Sqrt(W2p);
248  double sigmaTp = sigmaR(0, Q2, Wp) + sigmaNR(0, Q2, Wp);
249  double sigmaLp = sigmaR(1, Q2, Wp) + sigmaNR(1, Q2, Wp);
250  double F1pp = sigmaTp*(W2p-Mp2)/8./kPi2/kAem;
251  //neutron
252  double sigmaTd = sigmaR(0, Q2, Wp, true) + sigmaNR(0, Q2, Wp, true);
253  double F1dp = sigmaTd*(W2p-Mp2)/8./kPi2/kAem;
254  F1d += F1dp*fyuse;
255  F1p += F1pp*fyuse;
256  sigmaT += sigmaTp*fyuse;
257  sigmaL += sigmaLp*fyuse;
258  }
259  }
260 
261 }
262 //___________________________________________________________________________
263 // Calculate proton and neutron with Fermi smearing of a deuteron
264 void BostedChristyEMPXSec::FermiSmearingD(double Q2, double W, double & F1, double & R, double & sigmaT, double & sigmaL, bool isDeuterium=false) const
265 {
266  // The numbers in arrays bellow were not supposed to change in the original
267  // fortran code and therefore are not configurable
268  static constexpr std::array<double, 20> fyd
269  {0.4965, 0.4988, 0.4958, 0.5008, 0.5027, 0.5041, 0.5029, 0.5034,
270  0.4993, 0.5147, 0.5140, 0.4975, 0.5007, 0.4992, 0.4994, 0.4977,
271  0.5023, 0.4964, 0.4966, 0.4767};
272 
273  static constexpr std::array<double, 20> avpz
274  {-0.1820,-0.0829,-0.0590,-0.0448,-0.0345,-0.0264,-0.0195, -0.0135,
275  -0.0079,-0.0025, 0.0029, 0.0083, 0.0139, 0.0199, 0.0268, 0.0349,
276  0.0453, 0.0598, 0.0844, 0.1853};
277 
278  static constexpr std::array<double, 20> avp2
279  {0.0938, 0.0219, 0.0137, 0.0101, 0.0081, 0.0068, 0.0060, 0.0054,
280  0.0051, 0.0049, 0.0050, 0.0051, 0.0055, 0.0060, 0.0069, 0.0081,
281  0.0102, 0.0140, 0.0225, 0.0964};
282 
283  // Look up tables for deuteron in fine bins for sub threshold
284  static constexpr std::array<double, 200> fydf
285  {0.00001,0.00002,0.00003,0.00005,0.00006,0.00009,0.00010,0.00013,
286  0.00015,0.00019,0.00021,0.00026,0.00029,0.00034,0.00038,0.00044,
287  0.00049,0.00057,0.00062,0.00071,0.00078,0.00089,0.00097,0.00109,
288  0.00119,0.00134,0.00146,0.00161,0.00176,0.00195,0.00211,0.00232,
289  0.00252,0.00276,0.00299,0.00326,0.00352,0.00383,0.00412,0.00447,
290  0.00482,0.00521,0.00560,0.00603,0.00648,0.00698,0.00747,0.00803,
291  0.00859,0.00921,0.00985,0.01056,0.01126,0.01205,0.01286,0.01376,
292  0.01467,0.01569,0.01671,0.01793,0.01912,0.02049,0.02196,0.02356,
293  0.02525,0.02723,0.02939,0.03179,0.03453,0.03764,0.04116,0.04533,
294  0.05004,0.05565,0.06232,0.07015,0.07965,0.09093,0.10486,0.12185,
295  0.14268,0.16860,0.20074,0.24129,0.29201,0.35713,0.44012,0.54757,
296  0.68665,0.86965,1.11199,1.43242,1.86532,2.44703,3.22681,4.24972,
297  5.54382,7.04016,8.48123,9.40627,9.40627,8.48123,7.04016,5.54382,
298  4.24972,3.22681,2.44703,1.86532,1.43242,1.11199,0.86965,0.68665,
299  0.54757,0.44012,0.35713,0.29201,0.24129,0.20074,0.16860,0.14268,
300  0.12185,0.10486,0.09093,0.07965,0.07015,0.06232,0.05565,0.05004,
301  0.04533,0.04116,0.03764,0.03453,0.03179,0.02939,0.02723,0.02525,
302  0.02356,0.02196,0.02049,0.01912,0.01793,0.01671,0.01569,0.01467,
303  0.01376,0.01286,0.01205,0.01126,0.01056,0.00985,0.00921,0.00859,
304  0.00803,0.00747,0.00698,0.00648,0.00603,0.00560,0.00521,0.00482,
305  0.00447,0.00412,0.00383,0.00352,0.00326,0.00299,0.00276,0.00252,
306  0.00232,0.00211,0.00195,0.00176,0.00161,0.00146,0.00134,0.00119,
307  0.00109,0.00097,0.00089,0.00078,0.00071,0.00062,0.00057,0.00049,
308  0.00044,0.00038,0.00034,0.00029,0.00026,0.00021,0.00019,0.00015,
309  0.00013,0.00010,0.00009,0.00006,0.00005,0.00003,0.00002,0.00001};
310 
311  static constexpr std::array<double, 200> avp2f
312  {1.0,0.98974,0.96975,0.96768,0.94782,0.94450,0.92494,0.92047,
313  0.90090,0.89563,0.87644,0.87018,0.85145,0.84434,0.82593,0.81841,
314  0.80021,0.79212,0.77444,0.76553,0.74866,0.73945,0.72264,0.71343,
315  0.69703,0.68740,0.67149,0.66182,0.64631,0.63630,0.62125,0.61154,
316  0.59671,0.58686,0.57241,0.56283,0.54866,0.53889,0.52528,0.51581,
317  0.50236,0.49291,0.47997,0.47063,0.45803,0.44867,0.43665,0.42744,
318  0.41554,0.40656,0.39511,0.38589,0.37488,0.36611,0.35516,0.34647,
319  0.33571,0.32704,0.31656,0.30783,0.29741,0.28870,0.27820,0.26945,
320  0.25898,0.25010,0.23945,0.23023,0.21943,0.20999,0.19891,0.18911,
321  0.17795,0.16793,0.15669,0.14667,0.13553,0.12569,0.11504,0.10550,
322  0.09557,0.08674,0.07774,0.06974,0.06184,0.05484,0.04802,0.04203,
323  0.03629,0.03129,0.02654,0.02247,0.01867,0.01545,0.01251,0.01015,
324  0.00810,0.00664,0.00541,0.00512,0.00512,0.00541,0.00664,0.00810,
325  0.01015,0.01251,0.01545,0.01867,0.02247,0.02654,0.03129,0.03629,
326  0.04203,0.04802,0.05484,0.06184,0.06974,0.07774,0.08674,0.09557,
327  0.10550,0.11504,0.12569,0.13553,0.14667,0.15669,0.16793,0.17795,
328  0.18911,0.19891,0.20999,0.21943,0.23023,0.23945,0.25010,0.25898,
329  0.26945,0.27820,0.28870,0.29741,0.30783,0.31656,0.32704,0.33571,
330  0.34647,0.35516,0.36611,0.37488,0.38589,0.39511,0.40656,0.41554,
331  0.42744,0.43665,0.44867,0.45803,0.47063,0.47997,0.49291,0.50236,
332  0.51581,0.52528,0.53889,0.54866,0.56283,0.57241,0.58686,0.59671,
333  0.61154,0.62125,0.63630,0.64631,0.66182,0.67149,0.68740,0.69703,
334  0.71343,0.72264,0.73945,0.74866,0.76553,0.77444,0.79212,0.80021,
335  0.81841,0.82593,0.84434,0.85145,0.87018,0.87644,0.89563,0.90090,
336  0.92047,0.92494,0.94450,0.94782,0.96768,0.96975,0.98974,1.0};
337 
338  double W2=W*W;
339  double MN = fAM;
340  double MN2 = MN*MN;
341  double MD = fMD;
342  double Mp = fMP;
343  double Mp2 = Mp*Mp;
344  double nu = (W2 - MN2 + Q2)/2./MN;
345  double qv = TMath::Sqrt(nu*nu + Q2);
346  F1 = 0.;
347  R = 0.;
348  sigmaT = 0.;
349  sigmaL = 0.;
350  // Do fast 20 bins if abvoe threshold
351  if(W2>1.30)
352  {
353  for (int ism = 0; ism<20; ism++)
354  {
355  double W2p = TMath::Power(MD + nu - sqrt(MN2 + avp2[ism]),2) - qv*qv + 2.*qv*avpz[ism] - avp2[ism];
356  if(W2p>1.155)
357  {
358  double Wp = TMath::Sqrt(W2p);
359  double sigtp = sigmaR(0, Q2, Wp, isDeuterium) + sigmaNR(0, Q2, Wp, isDeuterium);
360  double F1p = sigtp*(W2p-Mp2)/8./kPi2/kAem;
361  F1 += F1p*fyd[ism]/10.;
362  if (!isDeuterium)
363  {
364  double siglp = sigmaR(1, Q2, Wp) + sigmaNR(1, Q2, Wp);
365  sigmaL += siglp*fyd[ism]/10.;
366  sigmaT += sigtp*fyd[ism]/10.;
367  }
368  }
369  }
370  }
371  else
372  {
373  for (int ism = 0;ism<200;ism++)
374  {
375  double pz = -1. + 0.01*(ism + 0.5);
376  // Need avp2f term to get right behavior x>1!
377  double W2p = TMath::Power(MD + nu - sqrt(MN2 + avp2f[ism]),2) - qv*qv + 2.*qv*pz - avp2f[ism];
378  if(W2p>1.155)
379  {
380  double Wp = TMath::Sqrt(W2p);
381  double sigtp = sigmaR(0, Q2, Wp, isDeuterium) + sigmaNR(0, Q2, Wp, isDeuterium);
382  double F1p = sigtp*(W2p-Mp2)/8./kPi2/kAem;
383  F1 += F1p*fydf[ism]/100.;
384  if (!isDeuterium)
385  {
386  double siglp = sigmaR(1, Q2, Wp) + sigmaNR(1, Q2, Wp);
387  sigmaT += sigtp*fydf[ism]/100.;
388  sigmaL += siglp*fydf[ism]/100.;
389  }
390  }
391  }
392  }
393  if (isDeuterium && fUseMEC)
394  // Ref.2, Eq. (20)
395  F1 += fMECcoef[0]*TMath::Exp(-(W - fMECcoef[1])*(W - fMECcoef[1])/fMECcoef[2])/
396  TMath::Power(1. + TMath::Max(0.3,Q2)/fMECcoef[3],fMECcoef[4])*TMath::Power(nu, fMECcoef[5]);
397  if(!isDeuterium && sigmaT!=0.)
398  R = sigmaL/sigmaT;
399 
400 }
401 //____________________________________________________________________________
402 double BostedChristyEMPXSec::MEC2009(int A, double Q2, double W) const
403 {
404  double F1 = 0.0;
405  double W2 = W*W;
406  double Mp = fAM;
407  double Mp2 = Mp*Mp;
408  if(W2<=0.0)
409  return F1;
410  double nu = (W2 - Mp2 + Q2)/2./Mp;
411  double x = Q2/2.0/Mp/nu;
412 
413  if(A<=2)
414  return F1;
415 
416  double p18;
417  for (const auto& kv : fMEC2009p18)
418  {
419  p18 = kv.second;
420  if (A<=kv.first)
421  break;
422  }
423 
424  F1 = fMEC2009coef[0]*TMath::Exp(-(W - fMEC2009coef[1])*(W - fMEC2009coef[1])/fMEC2009coef[2])/
425  TMath::Power(1. + TMath::Max(0.3,Q2)/fMEC2009coef[3],fMEC2009coef[4])*TMath::Power(nu, fMEC2009coef[5])*(1.0 +
426  p18*TMath::Power(A, fMEC2009coef[6] + fMEC2009coef[7]*x));
427 
428  if(F1<=1.0E-9)
429  F1 = 0.0;
430 
431  return F1;
432 }
433 //____________________________________________________________________________
435  const Interaction * interaction, KinePhaseSpace_t kps) const
436 {
437  if(! this -> ValidProcess (interaction) ) return 0.;
438  if(! this -> ValidKinematics (interaction) ) return 0.;
439 
440  // Get kinematical parameters
441  const Kinematics & kinematics = interaction -> Kine();
442  const InitialState & init_state = interaction -> InitState();
443  const Target & target = init_state.Tgt();
444  int A = target.A();
445  int Z = target.Z();
446  double E = init_state.ProbeE(kRfHitNucRest);
447  double W = kinematics.W();
448  double Q2 = kinematics.Q2();
449  double W2 = W*W;
450  // Cross section for proton or neutron
451 
452  double Mp = fMP;
453  double Mp2 = Mp*Mp;
454  double MN = fPM;
455  double MN2 = MN*MN;
456 
457  double nu = (W2 - MN2 + Q2)/2./MN;
458  double x = Q2/2./MN/nu;
459 
460  double sigmaT, sigmaL, F1p, R, W1;
461  // Cross section for proton or neutron
462  if (A<2 && W2>1.155)
463  {
464  double xb = Q2/(W2+Q2-Mp2);
465  sigmaT = sigmaR(0, Q2, W) + sigmaNR(0, Q2, W);
466  sigmaL = sigmaR(1, Q2, W) + sigmaNR(1, Q2, W);
467  F1p = sigmaT*(W2-Mp2)/8./kPi2/kAem;
468  R = sigmaL/sigmaT;
469  // If neutron, subtract proton from deuteron. Factor of two to
470  // convert from per nucleon to per deuteron
471  if(Z==0)
472  {
473  sigmaT = sigmaR(0, Q2, W, true) + sigmaNR(0, Q2, W, true);
474  double F1d = sigmaT*(W2-Mp2)/8./kPi2/kAem;
475  F1p = 2.*F1d - F1p;
476  }
477  W1 = F1p/MN;
478  }
479 
480  // For deuteron
481  if(A==2)
482  {
483  double Rd, F1c, F1d;
484  //get Fermi-smeared R from Erics proton fit
485  FermiSmearingD(Q2, W, F1c, R, sigmaT, sigmaL);
486  //get fit to F1 in deuteron, per nucleon
487  FermiSmearingD(Q2, W, F1d, Rd, sigmaT, sigmaL, true);
488  //convert to W1 per deuteron
489  W1 = F1d/MN*2.0;
490  }
491 
492  //For nuclei
493  if (A>2)
494  {
495  // Modifed to use Superscaling from Ref. 3
496  double Es, pF, kF;
497  for (const auto& kv : fNucRmvE)
498  {
499  Es = kv.second;
500  if (A<=kv.first)
501  break;
502  }
503  for (const auto& kv : fKFTable)
504  {
505  kF = kv.second;
506  if (A<=kv.first)
507  break;
508  }
509  // adjust pf to give right width based on kf
510  pF = 0.5*kF;
511  double F1d;
512  FermiSmearingA(Q2, W, pF, Es, F1p, F1d, sigmaT, sigmaL);
513  if(sigmaT>0.)
514  R = sigmaL/sigmaT;
515  W1 = (2.*Z*F1d + (A - 2.*Z)*(2.*F1d - F1p))/MN;
516 
517  W1 *= (fAfitcoef[0] + x*(fAfitcoef[1] + x*(fAfitcoef[2] + x*(fAfitcoef[3] + x*(fAfitcoef[4] + x*fAfitcoef[5])))));
518 
519  if(W>0.)
520  W1 *= TMath::Power(fAfitcoef[6] + (fAfitcoef[7]*W + fAfitcoef[8]*W2)/(fAfitcoef[9] + fAfitcoef[10]*Q2),2);
521 
522  double F1M = MEC2009(A, Q2, W);
523 
524  W1 += F1M;
525  if(W2>0.)
526  R *= (fAfitcoef[11] + fAfitcoef[12]*A);
527  }
528 
529  double emcfac = FitEMC(x, A);
530 
531  double F1 = MN*W1*emcfac;
532 
533  double nu2 = nu*nu;
534  double K = (W2 - MN2)/2./MN;
535  double Eprime = E - nu;
536  double sin2theta_2 = Q2/4/E/Eprime;
537  double cos2theta_2 = 1 - sin2theta_2;
538  double tan2theta_2 = sin2theta_2/cos2theta_2;
539  double eps = 1./(1. + 2*(1+nu2/Q2)*tan2theta_2); // Ref.1, Eq. (4)
540  double Gamma = kAem*Eprime*K/Q2/E/(1-eps)/2/kPi2; // Ref.1, Eq. (5)
541  sigmaT = 4*kPi2*kAem*F1/K/MN;
542  sigmaL = R*sigmaT;
543  double xsec = Gamma*(sigmaT+eps*sigmaL); // Ref.1, Eq. (3) d2xsec/dOmegadEprime
544  double jacobian = W*kPi/E/Eprime/MN;
545  xsec*= jacobian; // d2xsec/dOmegadEprime-> d2xsec/dWdQ2
546 
547  // The algorithm computes d^2xsec/dWdQ2
548  // Check whether variable tranformation is needed
549  if(kps!=kPSWQ2fE) {
550  double J = utils::kinematics::Jacobian(interaction,kPSWQ2fE,kps);
551  xsec *= J;
552  }
553 
554  return xsec;
555 
556 }
557 //____________________________________________________________________________
558 // Fit to EMC effect. Steve Rock 8/3/94
559 // Funciton returns value of sigma(A)/sigma(d)
560 // with no isoscalerity correction
561 // A = atomic number
562 // x = Bjorken x.
563 //
564 // Fit of sigma(A)/sigma(d) to form C*A**alpha where A is atomic number
565 // First data at each x was fit to form C*A**alpha. The point A=2(d)
566 // was includded with a value of 1 and an error of about 2%.
567 // For x>=.125 Javier Gomez fit of 7/93 to E139 data was used.
568 // For .09 >=x>=.0085 NMC data from Amaudruz et al Z. Phys C. 51,387(91)
569 // Steve did the fit for alpha and C to the He/d. C/d and Ca/d NMC data.
570 // Alpha(x) was fit to a 9 term polynomial a0 +a1*x +a2*x**2 + a3*x**3 ..
571 // C(x) was fit to a 3 term polynomial in natural logs as
572 // Ln(C) = c0 + c1*Ln(x) + c2*[Ln(x)]**2.
573 //
574 // 6/2/98 ***** Bug (which set x= .00885 if x was out of range) fixed
575 // also gave value at x=.0085 if x>.88
576 // 11/05 PYB PEB modified to use value at x=0.7 if x>0.7, because
577 // beyond that assume Fermi motion is giving the rise, and we
578 // already are taking that into account with the y-smearing of
579 // the inelastic
580 //____________________________________________________________________________
581 double BostedChristyEMPXSec::FitEMC(double x, int A) const
582 {
583  double fitemc = 1.;
584  if(A<=2)
585  return fitemc;
586 
587  double x_u;
588  if (x>0.70 || x<0.0085)
589  //Out of range of fit
590  {
591  if(x<0.0085)
592  x_u = .0085;
593  if(x>0.70)
594  x_u = 0.70;
595  }
596  else
597  x_u = x;
598 
599  double ln_c = fEMCc[0];
600  for (int i = 1; i<=2; i++)
601  ln_c += fEMCc[i]*TMath::Power(TMath::Log(x_u), i);
602  double c = TMath::Exp(ln_c);
603 
604  double alpha = fEMCalpha[0];
605  for (int i = 1; i<=8; i++)
606  alpha += fEMCalpha[i]*TMath::Power(x_u, i);
607 
608  fitemc = c*TMath::Power(A, alpha);
609  return fitemc;
610 }
611 //____________________________________________________________________________
613 {
614  double xsec = fXSecIntegrator->Integrate(this,interaction);
615  return xsec;
616 }
617 //____________________________________________________________________________
619 {
620  if(interaction->TestBit(kISkipProcessChk)) return true;
621 
622  const InitialState & init_state = interaction->InitState();
623  const ProcessInfo & proc_info = interaction->ProcInfo();
624 
625  if(!proc_info.IsResonant() ) return false;
626 
627 
628  int hitnuc = init_state.Tgt().HitNucPdg();
629  bool is_pn = (pdg::IsProton(hitnuc) || pdg::IsNeutron(hitnuc));
630 
631  if (!is_pn) return false;
632 
633  int probe = init_state.ProbePdg();
634  bool is_em = proc_info.IsEM();
635 
636  bool l_em = (pdg::IsChargedLepton(probe) && is_em );
637 
638  if (!l_em) return false;
639 
640  return true;
641 }
642 //____________________________________________________________________________
644 {
645  const Kinematics & kinematics = interaction -> Kine();
646  double W = kinematics.W();
647  double Q2 = kinematics.Q2();
648  if (W<fWmin || W>fWmax)
649  return false;
650  if (Q2<fQ2min || Q2>fQ2max)
651  return false;
652 
653  return true;
654 }
655 //____________________________________________________________________________
657 {
658  Algorithm::Configure(config);
659  this->LoadConfig();
660 }
661 //____________________________________________________________________________
663 {
664  Algorithm::Configure(config);
665  this->LoadConfig();
666 }
667 //____________________________________________________________________________
668 void BostedChristyEMPXSec::BranchingRatios(int respdg, double & brpi, double & breta) const
669 {
670  brpi = 0.;
671  breta = 0.;
672  PDGLibrary * pdglib = PDGLibrary::Instance();
673  TParticlePDG * res_pdg = pdglib->Find(respdg);
674  if (res_pdg != 0)
675  {
676  for (int nch = 0; nch < res_pdg->NDecayChannels(); nch++)
677  {
678  TDecayChannel * ch = res_pdg->DecayChannel(nch);
679  if (ch->NDaughters() == 2)
680  {
681  int first_daughter_pdg = ch->DaughterPdgCode (0);
682  int second_daughter_pdg = ch->DaughterPdgCode (1);
683  if ((genie::pdg::IsNucleon(first_daughter_pdg ) && genie::pdg::IsPion(second_daughter_pdg)) ||
684  (genie::pdg::IsNucleon(second_daughter_pdg) && genie::pdg::IsPion(first_daughter_pdg )))
685  brpi += ch->BranchingRatio();
686  if (first_daughter_pdg == kPdgEta || second_daughter_pdg == kPdgEta)
687  breta += ch->BranchingRatio();
688  }
689  }
690  }
691 }
692 //____________________________________________________________________________
694 {
695 
696  PDGLibrary * pdglib = PDGLibrary::Instance();
697  GetParamDef("BostedChristyFitEM-PM", fPM, pdglib->Find(kPdgProton)->Mass());
698  GetParamDef("BostedChristyFitEM-MP", fMP, pdglib->Find(kPdgProton)->Mass());
699  GetParamDef("BostedChristyFitEM-AM", fAM, pdglib->Find(kPdgProton)->Mass());
700  GetParamDef("BostedChristyFitEM-MD", fMD, pdglib->Find(kPdgTgtDeuterium)->Mass());
701  GetParamDef("BostedChristyFitEM-Mpi0", fMpi0, pdglib->Find(kPdgPi0)->Mass());
702  GetParamDef("BostedChristyFitEM-Meta", fMeta, pdglib->Find(kPdgEta)->Mass());
703  GetParamDef("BostedChristyFitEM-Wmin", fWmin, 0.0);
704  GetParamDef("BostedChristyFitEM-Wmax", fWmax, 3.0);
705  GetParamDef("BostedChristyFitEM-Q2min", fQ2min, 0.0);
706  GetParamDef("BostedChristyFitEM-Q2max", fQ2max, 10.0);
707  GetParamDef("BostedChristyFitEM-UseMEC", fUseMEC, true);
708 
709  double BRpi, BReta;
710  double brpi, breta;
711 
712  std::vector<double> vBRpi1;
713  std::vector<double> vBRpi2;
714  std::vector<double> vBReta;
715 
716  // load braching ratios for pi
717  bool useBRpi1Default = (GetParamVect("BostedChristyFitEM-PionBRp", vBRpi1, false)<7);
718  bool useBRpi2Default = (GetParamVect("BostedChristyFitEM-PionBRD", vBRpi2, false)<7);
719  // load braching ratios for eta
720  bool useBRetaDefault = (GetParamVect("BostedChristyFitEM-EtaBR", vBReta, false)<7);
721 
722  if (useBRpi1Default || useBRpi2Default || useBRetaDefault)
723  {
724  // use default branching ratios from PDG table
725  // P33(1232)
726  BRpi = 0.;
727  BReta = 0.;
728  BranchingRatios(kPdgP33m1232_DeltaM, brpi, breta);
729  BRpi += brpi;
730  BReta += breta;
731  BranchingRatios(kPdgP33m1232_Delta0, brpi, breta);
732  BRpi += brpi;
733  BReta += breta;
734  BranchingRatios(kPdgP33m1232_DeltaP, brpi, breta);
735  BRpi += brpi;
736  BReta += breta;
738  BRpi += brpi;
739  BReta += breta;
740  BRpi /= 4.;
741  BReta /= 4.;
742  fBRp[0][0] = BRpi;
743  fBRp[0][2] = BReta;
744  fBRD[0][0] = BRpi;
745 
746  // S11(1535)
747  BRpi = 0.;
748  BReta = 0.;
749  BranchingRatios(kPdgS11m1535_N0, brpi, breta);
750  BRpi += brpi;
751  BReta += breta;
752  BranchingRatios(kPdgS11m1535_NP, brpi, breta);
753  BRpi += brpi;
754  BReta += breta;
755  BRpi /= 2.;
756  BReta /= 2.;
757  fBRp[1][0] = BRpi;
758  fBRp[1][2] = BReta;
759  fBRD[1][0] = BRpi;
760 
761  // D13(1520)
762  BRpi = 0.;
763  BReta = 0.;
764  BranchingRatios(kPdgD13m1520_N0, brpi, breta);
765  BRpi += brpi;
766  BReta += breta;
767  BranchingRatios(kPdgD13m1520_NP, brpi, breta);
768  BRpi += brpi;
769  BReta += breta;
770  BRpi /= 2.;
771  BReta /= 2.;
772  fBRp[2][0] = BRpi;
773  fBRp[2][2] = BReta;
774  fBRD[2][0] = BRpi;
775 
776  // F15(1680)
777  BRpi = 0.;
778  BReta = 0.;
779  BranchingRatios(kPdgF15m1680_N0, brpi, breta);
780  BRpi += brpi;
781  BReta += breta;
782  BranchingRatios(kPdgF15m1680_NP, brpi, breta);
783  BRpi += brpi;
784  BReta += breta;
785  BRpi /= 2.;
786  BReta /= 2.;
787  fBRp[3][0] = BRpi;
788  fBRp[3][2] = BReta;
789  fBRD[3][0] = BRpi;
790 
791  // S11(1650)
792  BRpi = 0.;
793  BReta = 0.;
794  BranchingRatios(kPdgS11m1650_N0, brpi, breta);
795  BRpi += brpi;
796  BReta += breta;
797  BranchingRatios(kPdgS11m1650_NP, brpi, breta);
798  BRpi += brpi;
799  BReta += breta;
800  BRpi /= 2.;
801  BReta /= 2.;
802  fBRp[4][0] = BRpi;
803  fBRp[4][2] = BReta;
804  fBRD[4][0] = BRpi;
805 
806  // P11(1440)
807  BRpi = 0.;
808  BReta = 0.;
809  BranchingRatios(kPdgP11m1440_N0, brpi, breta);
810  BRpi += brpi;
811  BReta += breta;
812  BranchingRatios(kPdgP11m1440_NP, brpi, breta);
813  BRpi += brpi;
814  BReta += breta;
815  BRpi /= 2.;
816  BReta /= 2.;
817  fBRp[5][0] = BRpi;
818  fBRp[5][2] = BReta;
819  fBRD[5][0] = BRpi;
820 
821  // F37(1950)
822  BRpi = 0.;
823  BReta = 0.;
824  BranchingRatios(kPdgF37m1950_DeltaM , brpi, breta);
825  BRpi += brpi;
826  BReta += breta;
827  BranchingRatios(kPdgF37m1950_Delta0, brpi, breta);
828  BRpi += brpi;
829  BReta += breta;
830  BranchingRatios(kPdgF37m1950_DeltaP, brpi, breta);
831  BRpi += brpi;
832  BReta += breta;
834  BRpi += brpi;
835  BReta += breta;
836  BRpi /= 4.;
837  BReta /= 4.;
838  fBRp[6][0] = BRpi;
839  fBRp[6][2] = BReta;
840  fBRD[6][0] = BRpi;
841  }
842  if (!useBRpi1Default)
843  // single pion branching ratios from config file
844  for (int i=0; i<7; i++)
845  fBRp[i][0] = vBRpi1[i];
846  if (!useBRpi2Default)
847  // single pion branching ratios from config file
848  for (int i=0; i<7; i++)
849  fBRD[i][0] = vBRpi2[i];
850  if (!useBRetaDefault)
851  // eta branching ratios from config file
852  for (int i=0; i<7; i++)
853  fBRp[i][2] = vBReta[i];
854 
855  for (int i=0; i<7; i++)
856  fBRD[i][2] = 0.;
857 
858  if (useBRpi1Default || useBRpi2Default)
859  LOG("BostedChristyEMPXSec", pALERT) << "*** Use branching ratios for pion decay from PDG table";
860 
861  if (useBRetaDefault)
862  LOG("BostedChristyEMPXSec", pALERT) << "*** Use branching ratios for eta decay from PDG table";
863 
864  // 2-pion branching ratios
865  for (int i=0;i<7;i++)
866  {
867  fBRp[i][1] = 1.-fBRp[i][0]-fBRp[i][2];
868  fBRD[i][1] = 1.-fBRD[i][0]-fBRD[i][2];
869  }
870 
871  // Meson angular momentum
879 
880  std::vector<double> vResMass;
881  // load resonance masses
882  bool useResMassDefault = (GetParamVect("BostedChristyFitEM-ResMass", vResMass, false)<7);
883 
884  if (useResMassDefault)
885  {
886  LOG("BostedChristyEMPXSec", pALERT) << "*** Use resonance masses from PDG table";
887  // Resonance mass
893  fMassRes[5] = res::Mass(res::FromPdgCode(kPdgP11m1440_N0)); // P11(1440) roper
895  }
896  else
897  // eta branching ratios from config file
898  for (int i=0; i<7; i++)
899  fMassRes[i] = vResMass[i];
900 
901  std::vector<double> vResWidth;
902  // load resonance masses
903  bool useResWidthDefault = (GetParamVect("BostedChristyFitEM-ResWidth", vResWidth, false)<7);
904 
905  if (useResWidthDefault)
906  {
907  LOG("BostedChristyEMPXSec", pALERT) << "*** Use resonance widths from PDG table";
908  // Resonance width
914  fWidthRes[5] = res::Width(res::FromPdgCode(kPdgP11m1440_N0)); // P11(1440) roper
916  }
917  else
918  // eta branching ratios from config file
919  for (int i=0; i<7; i++)
920  fWidthRes[i] = vResWidth[i];
921 
922  int length;
923 
924  std::vector<double> vRescoef;
925  length = 7;
926  bool isOk = (GetParamVect("BostedChristyFitEM-ResAT0p", vRescoef)>=length);
927  if (!isOk)
928  {
929  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton AT(0)-parameters for xsec^R_T in the config file!";
930  exit(1);
931  }
932  // Ref.1, Table III, AT(0)
933  for (int i=0;i<length;i++)
934  fRescoefTp[i][0] = vRescoef[i];
935 
936  length = 7;
937  isOk = (GetParamVect("BostedChristyFitEM-Resap", vRescoef)>=length);
938  if (!isOk)
939  {
940  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton a-parameters for xsec^R_T in the config file!";
941  exit(1);
942  }
943  // Ref.1, Table III, a
944  for (int i=0;i<length;i++)
945  fRescoefTp[i][1] = vRescoef[i];
946 
947  length = 7;
948  isOk = (GetParamVect("BostedChristyFitEM-Resbp", vRescoef)>=length);
949  if (!isOk)
950  {
951  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton b-parameters parameters for xsec^R_T in the config file!";
952  exit(1);
953  }
954  // Ref.1, Table III, b
955  for (int i=0;i<length;i++)
956  fRescoefTp[i][2] = vRescoef[i];
957 
958  length = 7;
959  isOk = (GetParamVect("BostedChristyFitEM-Rescp", vRescoef)>=length);
960  if (!isOk)
961  {
962  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton c-parameters parameters for xsec^R_T in the config file!";
963  exit(1);
964  }
965  // Ref.1, Table III, c
966  for (int i=0;i<length;i++)
967  fRescoefTp[i][3] = vRescoef[i];
968 
969  length = 7;
970  isOk = (GetParamVect("BostedChristyFitEM-ResAT0D", vRescoef)>=length);
971  if (!isOk)
972  {
973  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough deuterium AT(0)-parameters for xsec^R_T in the config file!";
974  exit(1);
975  }
976  // Ref.2, Table III, AT(0)
977  for (int i=0;i<length;i++)
978  fRescoefTD[i][0] = vRescoef[i];
979 
980  length = 7;
981  isOk = (GetParamVect("BostedChristyFitEM-ResaD", vRescoef)>=length);
982  if (!isOk)
983  {
984  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough deuterium a-parameters for xsec^R_T in the config file!";
985  exit(1);
986  }
987  // Ref.2, Table III, a
988  for (int i=0;i<length;i++)
989  fRescoefTD[i][1] = vRescoef[i];
990 
991  length = 7;
992  isOk = (GetParamVect("BostedChristyFitEM-ResbD", vRescoef)>=length);
993  if (!isOk)
994  {
995  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough deuterium b-parameters parameters for xsec^R_T in the config file!";
996  exit(1);
997  }
998  // Ref.2, Table III, b
999  for (int i=0;i<length;i++)
1000  fRescoefTD[i][2] = vRescoef[i];
1001 
1002  length = 7;
1003  isOk = (GetParamVect("BostedChristyFitEM-RescD", vRescoef)>=length);
1004  if (!isOk)
1005  {
1006  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough deuterium c-parameters parameters for xsec^R_T in the config file!";
1007  exit(1);
1008  }
1009  // Ref.2, Table III, c
1010  for (int i=0;i<length;i++)
1011  fRescoefTD[i][3] = vRescoef[i];
1012 
1013  length = 7;
1014  isOk = (GetParamVect("BostedChristyFitEM-ResAL0", vRescoef)>=length);
1015  if (!isOk)
1016  {
1017  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton AL0-parameters parameters for xsec^R_T in the config file!";
1018  exit(1);
1019  }
1020  // Ref.1, Table III, AL(0)
1021  for (int i=0;i<length;i++)
1022  fRescoefL[i][0] = vRescoef[i];
1023 
1024  length = 7;
1025  isOk = (GetParamVect("BostedChristyFitEM-Resd", vRescoef)>=length);
1026  if (!isOk)
1027  {
1028  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton d-parameters parameters for xsec^R_L in the config file!";
1029  exit(1);
1030  }
1031  // Ref.1, Table III, d
1032  for (int i=0;i<length;i++)
1033  fRescoefL[i][1] = vRescoef[i];
1034 
1035  length = 7;
1036  isOk = (GetParamVect("BostedChristyFitEM-Rese", vRescoef)>=length);
1037  if (!isOk)
1038  {
1039  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton e-parameters parameters for xsec^R_L in the config file!";
1040  exit(1);
1041  }
1042  // Ref.1, Table III, e
1043  for (int i=0;i<length;i++)
1044  fRescoefL[i][2] = vRescoef[i];
1045 
1046 
1047  std::vector<double> vNRcoef;
1048  length = 5;
1049  isOk = (GetParamVect("BostedChristyFitEM-NRXSecT1p", vNRcoef)>=length);
1050  if (!isOk)
1051  {
1052  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton bkg parameters for xsec^NR_T in the config file!";
1053  exit(1);
1054  }
1055  // Ref.1, Table IV: \sigma^NR,1_T(0), aT_1, bT_1, cT_1, dT_1
1056  for (int i=0;i<length;i++)
1057  fNRcoefTp[0][i] = vNRcoef[i];
1058 
1059  length = 5;
1060  isOk = (GetParamVect("BostedChristyFitEM-NRXSecT2p", vNRcoef)>=length);
1061  if (!isOk)
1062  {
1063  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton bkg parameters for xsec^NR_T in the config file!";
1064  exit(1);
1065  }
1066  // Ref.1, Table IV: \sigma^NR,2_T(0), aT_2, bT_2, cT_2, dT_2
1067  for (int i=0;i<length;i++)
1068  fNRcoefTp[1][i] = vNRcoef[i];
1069 
1070  length = 5;
1071  isOk = (GetParamVect("BostedChristyFitEM-NRXSecT1D", vNRcoef)>=length);
1072  if (!isOk)
1073  {
1074  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough deuterium bkg parameters for xsec^NR_T in the config file!";
1075  exit(1);
1076  }
1077  // Ref.2, Table IV: \sigma^NR,1_T(0), aT_1, bT_1, cT_1, dT_1
1078  for (int i=0;i<length;i++)
1079  fNRcoefTD[0][i] = vNRcoef[i];
1080 
1081  length = 5;
1082  isOk = (GetParamVect("BostedChristyFitEM-NRXSecT2D", vNRcoef)>=length);
1083  if (!isOk)
1084  {
1085  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough deuterium bkg parameters for xsec^NR_T in the config file!";
1086  exit(1);
1087  }
1088  // Ref.2, Table IV: \sigma^NR,2_T(0), aT_2, bT_2, cT_2, dT_2
1089  for (int i=0;i<length;i++)
1090  fNRcoefTD[1][i] = vNRcoef[i];
1091 
1092  length = 6;
1093  isOk = (GetParamVect("BostedChristyFitEM-NRXSecL", vNRcoef)>=length);
1094  if (!isOk)
1095  {
1096  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough proton bkg parameters for xsec^NR_L in the config file!";
1097  exit(1);
1098  }
1099  // Ref.1, Table IV: \sigma^NR_L, aL, bL, cL, dL, eL
1100  for (int i=0;i<length;i++)
1101  fNRcoefL[i] = vNRcoef[i];
1102 
1103  length = 6;
1104  isOk = (GetParamVect("BostedChristyFitEM-MEC", vNRcoef)>=length);
1105  if (!isOk)
1106  {
1107  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough parameters for MEC in the config file!";
1108  exit(1);
1109  }
1110  for (int i=0;i<length;i++)
1111  fMECcoef[i] = vNRcoef[i];
1112 
1113  length = 8;
1114  isOk = (GetParamVect("BostedChristyFitEM-MEC2009", vNRcoef)>=length);
1115  if (!isOk)
1116  {
1117  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough parameters for MEC2009 in the config file!";
1118  exit(1);
1119  }
1120  for (int i=0;i<length;i++)
1121  fMEC2009coef[i] = vNRcoef[i];
1122 
1123  length = 13;
1124  isOk = (GetParamVect("BostedChristyFitEM-Afit", vNRcoef)>=length);
1125  if (!isOk)
1126  {
1127  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough parameters for nuclei fit (A-fit) in the config file!";
1128  exit(1);
1129  }
1130  for (int i=0;i<length;i++)
1131  fAfitcoef[i] = vNRcoef[i];
1132 
1133 
1134  length = 9;
1135  isOk = (GetParamVect("BostedChristyFitEM-EMCalpha", vNRcoef)>=length);
1136  if (!isOk)
1137  {
1138  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough alpha coefficients for EMC correction in the config file!";
1139  exit(1);
1140  }
1141  for (int i=0;i<length;i++)
1142  fEMCalpha[i] = vNRcoef[i];
1143 
1144  length = 3;
1145  isOk = (GetParamVect("BostedChristyFitEM-EMCc", vNRcoef)>=length);
1146  if (!isOk)
1147  {
1148  LOG("BostedChristyEMPXSec", pFATAL) << "*** Can't find enough c coefficients for EMC correction in the config file!";
1149  exit(1);
1150  }
1151  for (int i=0;i<length;i++)
1152  fEMCc[i] = vNRcoef[i];
1153 
1154 
1155  std::string keyStart = "BostedChristy-SeparationE@Pdg=";
1156  RgIMap entries = GetConfig().GetItemMap();
1157  for(RgIMap::const_iterator it = entries.begin(); it != entries.end(); ++it)
1158  {
1159  const std::string& key = it->first;
1160  int pdg = 0;
1161  int A = 0;
1162  if (0 == key.compare(0, keyStart.size(), keyStart.c_str()))
1163  {
1164  pdg = atoi(key.c_str() + keyStart.size());
1165  A = pdg::IonPdgCodeToA(pdg);
1166  }
1167  if (0 != pdg && A != 0)
1168  {
1169  std::ostringstream key_ss ;
1170  key_ss << keyStart << pdg;
1171  RgKey rgkey = key_ss.str();
1172  double eb;
1173  GetParam( rgkey, eb) ;
1174  eb = TMath::Max(eb, 0.);
1175  fNucRmvE.insert(map<int,double>::value_type(A,eb));
1176  }
1177  }
1178 
1179  keyStart = "BostedChristy-FermiMomentum@Pdg=";
1180  for(RgIMap::const_iterator it = entries.begin(); it != entries.end(); ++it)
1181  {
1182  const std::string& key = it->first;
1183  int pdg = 0;
1184  int A = 0;
1185  if (0 == key.compare(0, keyStart.size(), keyStart.c_str()))
1186  {
1187  pdg = atoi(key.c_str() + keyStart.size());
1188  A = pdg::IonPdgCodeToA(pdg);
1189  }
1190  if (0 != pdg && A != 0)
1191  {
1192  std::ostringstream key_ss ;
1193  key_ss << keyStart << pdg;
1194  RgKey rgkey = key_ss.str();
1195  double pf;
1196  GetParam( rgkey, pf) ;
1197  pf = TMath::Max(pf, 0.);
1198  fKFTable.insert(map<int,double>::value_type(A,pf));
1199  }
1200  }
1201 
1202  keyStart = "BostedChristy-p18@Pdg=";
1203  for(RgIMap::const_iterator it = entries.begin(); it != entries.end(); ++it)
1204  {
1205  const std::string& key = it->first;
1206  int pdg = 0;
1207  int A = 0;
1208  if (0 == key.compare(0, keyStart.size(), keyStart.c_str()))
1209  {
1210  pdg = atoi(key.c_str() + keyStart.size());
1211  A = pdg::IonPdgCodeToA(pdg);
1212  }
1213  if (0 != pdg && A != 0)
1214  {
1215  std::ostringstream key_ss ;
1216  key_ss << keyStart << pdg;
1217  RgKey rgkey = key_ss.str();
1218  double p18;
1219  GetParam( rgkey, p18) ;
1220  fMEC2009p18.insert(map<int,double>::value_type(A,p18));
1221  }
1222  }
1223 
1224 }
std::array< double, 7 > fMassRes
resonance mass
bool IsResonant(void) const
Definition: ProcessInfo.cxx:94
Cross Section Calculation Interface.
const int kPdgP33m1232_DeltaPP
Definition: PDGCodes.h:107
double W(bool selected=false) const
Definition: Kinematics.cxx:157
bool IsPion(int pdgc)
Definition: PDGUtils.cxx:323
Basic constants.
void Configure(const Registry &config)
double J(double q0, double q3, double Enu, double ml)
Definition: MECUtils.cxx:147
THE MAIN GENIE PROJECT NAMESPACE
Definition: AlgCmp.h:25
#define F1(x, y, z)
Definition: md5.c:175
std::array< std::array< double, 4 >, 7 > fRescoefTp
tunable parameters from Ref.1, Table III for resonance
double Q2(const Interaction *const i)
Definition: KineUtils.cxx:1064
int HitNucPdg(void) const
Definition: Target.cxx:304
double Integral(const Interaction *i) const
std::array< std::array< double, 5 >, 2 > fNRcoefTp
tunable parameters from Ref.1, Table III for nonres bkg
std::string string
Definition: nybbler.cc:12
bool IsNucleon(int pdgc)
Definition: PDGUtils.cxx:343
int A(void) const
Definition: Target.h:70
std::array< double, 9 > fEMCalpha
tunable parameters for EMC fit
const int kPdgF15m1680_NP
Definition: PDGCodes.h:135
double sigmaR(int, double, double, bool) const
#define pFATAL
Definition: Messenger.h:56
std::array< double, 8 > fMEC2009coef
tunable parameters for MEC2009 function
int GetParamVect(const std::string &comm_name, std::vector< T > &v, bool is_top_call=true) const
Handle to load vectors of parameters.
int IonPdgCodeToA(int pdgc)
Definition: PDGUtils.cxx:60
Generated/set kinematical variables for an event.
Definition: Kinematics.h:39
bool IsChargedLepton(int pdgc)
Definition: PDGUtils.cxx:98
std::array< double, 3 > fEMCc
tunable parameters for EMC fit
double Mass(Resonance_t res)
resonance mass (GeV)
const int kPdgS11m1650_N0
Definition: PDGCodes.h:112
std::array< std::array< double, 3 >, 7 > fBRD
branching ratios of resonances for deterium fit
double Width(Resonance_t res)
resonance width (GeV)
intermediate_table::const_iterator const_iterator
const int kPdgF37m1950_DeltaM
Definition: PDGCodes.h:148
const int kPdgF37m1950_DeltaP
Definition: PDGCodes.h:150
enum genie::EKinePhaseSpace KinePhaseSpace_t
static constexpr double ub
Definition: Units.h:80
const int kPdgS11m1535_N0
Definition: PDGCodes.h:108
double const Meta
Definition: includeROOT.h:184
virtual const Registry & GetConfig(void) const
Definition: Algorithm.cxx:246
std::array< double, 6 > fMECcoef
tunable parameters for Eqs.(20), (21) Ref.2
const int kPdgP33m1232_DeltaP
Definition: PDGCodes.h:106
const int kPdgP33m1232_DeltaM
Definition: PDGCodes.h:104
void FermiSmearingA(double, double, double, double, double &, double &, double &, double &) const
static const double kAem
Definition: Constants.h:56
bool IsNeutron(int pdgc)
Definition: PDGUtils.cxx:338
#define pALERT
Definition: Messenger.h:57
Summary information for an interaction.
Definition: Interaction.h:56
std::array< double, 13 > fAfitcoef
tunable parameters for nuclei fit
const int kPdgF37m1950_Delta0
Definition: PDGCodes.h:149
bool IsProton(int pdgc)
Definition: PDGUtils.cxx:333
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
Definition: Messenger.h:96
const RgIMap & GetItemMap(void) const
Definition: Registry.h:161
def key(type, name=None)
Definition: graph.py:13
static Config * config
Definition: config.cpp:1054
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
Definition: ProcessInfo.h:46
A Neutrino Interaction Target. Is a transparent encapsulation of quite different physical systems suc...
Definition: Target.h:40
virtual void Configure(const Registry &config)
Definition: Algorithm.cxx:62
int ProbePdg(void) const
Definition: InitialState.h:64
void BranchingRatios(int, double &, double &) const
double alpha
Definition: doAna.cpp:15
const int kPdgEta
Definition: PDGCodes.h:161
const int kPdgPi0
Definition: PDGCodes.h:160
int OrbitalAngularMom(Resonance_t res)
orbital angular momentum
int Z(void) const
Definition: Target.h:68
const int kPdgF37m1950_DeltaPP
Definition: PDGCodes.h:151
std::array< std::array< double, 3 >, 7 > fBRp
branching ratios of resonances for proton fit
const int kPdgD13m1520_NP
Definition: PDGCodes.h:111
const int kPdgF15m1680_N0
Definition: PDGCodes.h:134
std::array< double, 7 > fWidthRes
resonance width
const int kPdgS11m1650_NP
Definition: PDGCodes.h:113
Resonance_t FromPdgCode(int pdgc)
PDG code -> resonance id.
const int kPdgP33m1232_Delta0
Definition: PDGCodes.h:105
const int kPdgP11m1440_N0
Definition: PDGCodes.h:126
std::array< std::array< double, 5 >, 2 > fNRcoefTD
tunable parameters from Ref.1, Table IV for nonres bkg
bool IsEM(void) const
const int kPdgD13m1520_N0
Definition: PDGCodes.h:110
const XSecIntegratorI * fXSecIntegrator
const int kPdgP11m1440_NP
Definition: PDGCodes.h:127
static PDGLibrary * Instance(void)
Definition: PDGLibrary.cxx:57
bool fUseMEC
account for MEC contribution?
Singleton class to load & serve a TDatabasePDG.
Definition: PDGLibrary.h:32
string RgKey
A registry. Provides the container for algorithm configuration parameters.
Definition: Registry.h:65
virtual double Integrate(const XSecAlgorithmI *model, const Interaction *interaction) const =0
std::array< std::array< double, 4 >, 7 > fRescoefTD
tunable parameters from Ref.2, Table III for resonance
#define A
Definition: memgrp.cpp:38
double Jacobian(const Interaction *const i, KinePhaseSpace_t f, KinePhaseSpace_t t)
Definition: KineUtils.cxx:130
double FitEMC(double, int) const
std::array< double, 6 > fNRcoefL
tunable parameters from Ref.1, Table III for nonres bkg
const InitialState & InitState(void) const
Definition: Interaction.h:69
const ProcessInfo & ProcInfo(void) const
Definition: Interaction.h:70
list x
Definition: train.py:276
const int kPdgProton
Definition: PDGCodes.h:81
TParticlePDG * Find(int pdgc, bool must_exist=true)
Definition: PDGLibrary.cxx:75
std::array< int, 7 > fAngRes
resonance angular momentum
double MEC2009(int, double, double) const
double Q2(bool selected=false) const
Definition: Kinematics.cxx:125
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
Definition: InitialState.h:66
void FermiSmearingD(double, double, double &, double &, double &, double &, bool) const
const int kPdgS11m1535_NP
Definition: PDGCodes.h:109
bool ValidKinematics(const Interaction *i) const
Is the input kinematical point a physically allowed one?
const int kPdgTgtDeuterium
Definition: PDGCodes.h:201
double ProbeE(RefFrame_t rf) const
static const double kPi
Definition: Constants.h:37
Most commonly used PDG codes. A set of utility functions to handle PDG codes is provided in PDGUtils...
std::array< std::array< double, 3 >, 7 > fRescoefL
tunable parameters from Ref.1, Table III for resonance
bool ValidProcess(const Interaction *i) const
Can this cross section algorithm handle the input process?
static const double kPi2
Definition: Constants.h:38
Root of GENIE utility namespaces.
const UInt_t kISkipProcessChk
if set, skip process validity checks
Definition: Interaction.h:47
double sigmaNR(int, double, double, bool) const
double XSec(const Interaction *i, KinePhaseSpace_t k) const
Compute the cross section for the input interaction.
Initial State information.
Definition: InitialState.h:48
map< RgKey, RegistryItemI * > RgIMap
Definition: Registry.h:45