GENIEGenerator
Loading...
Searching...
No Matches
ZExpELFormFactorModel.cxx
Go to the documentation of this file.
1//____________________________________________________________________________
2/*
3 Copyright (c) 2003-2025, The GENIE Collaboration
4 For the full text of the license visit http://copyright.genie-mc.org
5 or see $GENIE/LICENSE
6
7\author Kaushik Borah <kaushik.borah99 \at uky.edu>
8 University of Kentucky, Lexington, KY 40506, USA
9 based off ZExpAxialFormFactorModel by
10 Aaron Meyer <asmeyer2012 \at uchicago.edu>
11 University of Chicago, Chicago, Illinois, 60637, USA
12
13 For the class documentation see the corresponding header file.
14
15
16
17*/
18//____________________________________________________________________________
19
20#include <TMath.h>
21#include <sstream>
22
28
29using std::ostringstream;
30
31using namespace genie;
32
33//____________________________________________________________________________
35ELFormFactorsModelI("genie::ZExpELFormFactorModel")
36{
37
38}
39//____________________________________________________________________________
41ELFormFactorsModelI("genie::ZExpELFormFactorModel", config)
42{
43
44}
45//____________________________________________________________________________
49//____________________________________________________________________________
50double ZExpELFormFactorModel::Gep(const Interaction * interaction) const
51{
52 // calculate and return Gep
53 double q2 = interaction->KinePtr()->q2();
54 double zparam = this->CalculateZ(q2);
55 if (zparam != zparam) // checks for nan
56 {
57 LOG("ZExpELFormFactorModel",pWARN) << "Undefined expansion parameter";
58 return 0.;
59 }
60 double gep = 0.;
61 for (int ki=0;ki<=fKmax+(fQ4limit ? 4 : 0);ki++)
62 {
63 gep = gep + TMath::Power(zparam,ki) * fZ_APn[ki];
64 }
65
66 return gep;
67}
68//____________________________________________________________________________
69double ZExpELFormFactorModel::Gmp(const Interaction * interaction) const
70{
71 // calculate and return Gmp
72 double q2 = interaction->KinePtr()->q2();
73 double zparam = this->CalculateZ(q2);
74 if (zparam != zparam) // checks for nan
75 {
76 LOG("ZExpELFormFactorModel",pWARN) << "Undefined expansion parameter";
77 return 0.;
78 }
79 double gmp = 0.;
80 for (int ki=0;ki<=fKmax+(fQ4limit ? 4 : 0);ki++)
81 {
82 gmp = gmp + TMath::Power(zparam,ki) * fZ_BPn[ki];
83 }
84
85 return gmp;
86}
87
88//____________________________________________________________________________
89double ZExpELFormFactorModel::Gen(const Interaction * interaction) const
90{
91 // calculate and return Gen
92 double q2 = interaction->KinePtr()->q2();
93 double zparam = this->CalculateZ(q2);
94 if (zparam != zparam) // checks for nan
95 {
96 LOG("ZExpELFormFactorModel",pWARN) << "Undefined expansion parameter";
97 return 0.;
98 }
99 double gen = 0.;
100 for (int ki=0;ki<=fKmax+(fQ4limit ? 4 : 0);ki++)
101 {
102 gen = gen + TMath::Power(zparam,ki) * fZ_ANn[ki];
103 }
104
105 return gen;
106}
107//____________________________________________________________________________
108double ZExpELFormFactorModel::Gmn(const Interaction * interaction) const
109{
110 // calculate and return Gmn
111 double q2 = interaction->KinePtr()->q2();
112 double zparam = this->CalculateZ(q2);
113 if (zparam != zparam) // checks for nan
114 {
115 LOG("ZExpELFormFactorModel",pWARN) << "Undefined expansion parameter";
116 return 0.;
117 }
118 double gmn = 0.;
119 for (int ki=0;ki<=fKmax+(fQ4limit ? 4 : 0);ki++)
120 {
121 gmn = gmn + TMath::Power(zparam,ki) * fZ_BNn[ki];
122 }
123
124 return gmn;
125}
126//____________________________________________________________________________
128{
129
130 // calculate z expansion parameter
131 double znum = TMath::Sqrt(fTcut - q2) - TMath::Sqrt(fTcut - fT0);
132 double zden = TMath::Sqrt(fTcut - q2) + TMath::Sqrt(fTcut - fT0);
133
134 return znum/zden;
135}
136//____________________________________________________________________________
138{
139 //if (fKmax < 1 ) { fKmax = 1; }
140 //else if (fKmax > 10) { fKmax = 10; }
141
142 if (fQ4limit) this->FixQ4Limit();
143 else this->FixEL0();
144}
145//____________________________________________________________________________
147{
148 // Function to fix form factor such that Gep(q2=0) = 1
149 // For T0 = 0, this will set Gep0 = 1
150 double zparam = this->CalculateZ(0.);
151 double gep = 0.;
152 for (int ki=1;ki<=fKmax;ki++)
153 {
154 gep = gep + TMath::Power(zparam,ki) * fZ_APn[ki];
155 }
156 fZ_APn[0] = fGep0 - gep;
157
158 // Function to fix form factor such that Gmp(q2=0) = 2.7928
159 // For T0 = 0, this will set Gmp0 = 2.7928
160
161 double gmp = 0.;
162 for (int ki=1;ki<=fKmax;ki++)
163 {
164 gmp = gmp + TMath::Power(zparam,ki) * fZ_BPn[ki];
165 }
166 fZ_BPn[0] = fGmp0 - gmp;
167
168 // Function to fix form factor such that Gen(q2=0) = 0
169 // For T0 = 0, this will set Gen0 = 0
170
171 double gen = 0.;
172 for (int ki=1;ki<=fKmax;ki++)
173 {
174 gen = gen + TMath::Power(zparam,ki) * fZ_ANn[ki];
175 }
176 fZ_ANn[0] = fGen0 - gen;
177
178 // Function to fix form factor such that Gmn(q2=0) = -1.9130
179 // For T0 = 0, this will set Gmn0 = -1.9130
180
181 double gmn = 0.;
182 for (int ki=1;ki<=fKmax;ki++)
183 {
184 gmn = gmn + TMath::Power(zparam,ki) * fZ_BNn[ki];
185 }
186 fZ_BNn[0] = fGmn0 - gmn;
187
188}
189//____________________________________________________________________________
191{
192 // fixes parameters such that the model limits to 1/Q^4 at large t
193 // -- requires at least 5 parameters to do so --
194 // 4 parameters for Q^4 behavior
195
196 // will use AP_0 and AP_Kmax through AP_Kmax-3 to do the fitting
197 // calculate some useful numbers (redundancy for readability)
198 double kp4 = (double)fKmax+4;
199 double kp3 = (double)fKmax+3;
200 double kp2 = (double)fKmax+2;
201 double kp1 = (double)fKmax+1;
202 double kp0 = (double)fKmax ;
203 //double km5 = (double)fKmax-5;
204 double z0 = this->CalculateZ(0.);
205 double zkp4 = TMath::Power(z0,(int)kp4);
206 double zkp3 = TMath::Power(z0,(int)kp3);
207 double zkp2 = TMath::Power(z0,(int)kp2);
208 double zkp1 = TMath::Power(z0,(int)kp1);
209
210 // denominator
211 double denom = \
212 6. - kp4*kp3*kp2*zkp1 + 3.*kp4*kp3*kp1*zkp2 \
213 - 3.*kp4*kp2*kp1*zkp3 + kp3*kp2*kp1*zkp4;
214
215 // extra parameters (effectively constants)
216 // number refers to the number of derivatives
217 double b0 = 0.;
218 for (int ki = 1;ki <= fKmax;ki++)
219 {
220 b0 = b0 + fZ_APn[ki];
221 }
222
223 double b0z = -fGep0;
224 for (int ki = 1;ki <= fKmax;ki++)
225 {
226 b0z = b0z + fZ_APn[ki]*TMath::Power(z0,ki);
227 }
228
229 double b1 = 0.;
230 for (int ki = 1;ki <= fKmax;ki++)
231 {
232 b1 = b1 + ki*fZ_APn[ki];
233 }
234
235 double b2 = 0.;
236 for (int ki = 1;ki <= fKmax;ki++)
237 {
238 b2 = b2 + ki*(ki-1)*fZ_APn[ki];
239 }
240
241 double b3 = 0.;
242 for (int ki = 1;ki <= fKmax;ki++)
243 {
244 b3 = b3 + ki*(ki-1)*(ki-2)*fZ_APn[ki];
245 }
246
247 // Assign new parameters
248 fZ_APn[(int)kp4] = (1./denom) * \
249 ( (b0-b0z)*kp3*kp2*kp1 \
250 + b3*( -1. + .5*kp3*kp2*zkp1 - kp3*kp1*zkp2 \
251 +.5*kp2*kp1*zkp3 ) \
252 + b2*( 3.*kp1 - kp3*kp2*kp1*zkp1 \
253 +kp3*kp1*(2*fKmax+1)*zkp2 - kp2*kp1*kp0*zkp3 ) \
254 + b1*( -3.*kp2*kp1 + .5*kp3*kp2*kp2*kp1*zkp1 \
255 -kp3*kp2*kp1*kp0*zkp2 + .5*kp2*kp1*kp1*kp0*zkp3) );
256
257 fZ_APn[(int)kp3] = (1./denom) * \
258 ( -3.*(b0-b0z)*kp4*kp2*kp1 \
259 + b3*( 3. - kp4*kp2*zkp1 + (3./2.)*kp4*kp1*zkp2 \
260 -.5*kp2*kp1*zkp4 ) \
261 + b2*( -3.*(3*fKmax+4) + kp4*kp2*(2*fKmax+3)*zkp1 \
262 -3.*kp4*kp1*kp1*zkp2 + kp2*kp1*kp0*zkp4 ) \
263 + b1*( 3.*kp1*(3*fKmax+8) - kp4*kp3*kp2*kp1*zkp1 \
264 +(3./2.)*kp4*kp3*kp1*kp0*zkp2 - .5*kp2*kp1*kp1*kp0*zkp4) );
265
266 fZ_APn[(int)kp2] = (1./denom) * \
267 ( 3.*(b0-b0z)*kp4*kp3*kp1 \
268 + b3*( -3. + .5*kp4*kp3*zkp1 - (3./2.)*kp4*kp1*zkp3 \
269 +kp3*kp1*zkp4 ) \
270 + b2*( 3.*(3*fKmax+5) - kp4*kp3*kp2*zkp1 \
271 +3.*kp4*kp1*kp1*zkp3 - kp3*kp1*(2*fKmax+1)*zkp4) \
272 + b1*( -3.*kp3*(3*fKmax+4) + .5*kp4*kp3*kp3*kp2*zkp1 \
273 -(3./2.)*kp4*kp3*kp1*kp0*zkp3 + kp3*kp2*kp1*kp0*zkp4) );
274
275 fZ_APn[(int)kp1] = (1./denom) * \
276 ( -(b0-b0z)*kp4*kp3*kp2 \
277 + b3*( 1. - .5*kp4*kp3*zkp2 + kp4*kp2*zkp3 \
278 -.5*kp3*kp2*zkp4 ) \
279 + b2*( -3.*kp2 + kp4*kp3*kp2*zkp2 \
280 -kp4*kp2*(2*fKmax+3)*zkp3 + kp3*kp2*kp1*zkp4) \
281 + b1*( 3.*kp3*kp2 - .5*kp4*kp3*kp3*kp2*zkp2 \
282 +kp4*kp3*kp2*kp1*zkp3 - .5*kp3*kp2*kp2*kp1*zkp4) );
283
284 fZ_APn[0] = (1./denom) * \
285 ( -6.*b0z \
286 + b0*( kp4*kp3*kp2*zkp1 - 3.*kp4*kp3*kp1*zkp2 \
287 +3.*kp4*kp2*kp1*zkp3 - kp3*kp2*kp1*zkp4 ) \
288 + b3*( -zkp1 + 3.*zkp2 - 3.*zkp3 + zkp4 ) \
289 + b2*( 3.*kp2*zkp1 - 3.*(3*fKmax+5)*zkp2 \
290 +3.*(3*fKmax+4)*zkp3 - 3.*kp1*zkp4 ) \
291 + b1*( -3.*kp3*kp2*zkp1 + 3.*kp3*(3*fKmax+4)*zkp2 \
292 -3.*kp1*(3*fKmax+8)*zkp3 + 3.*kp2*kp1*zkp4 ) );
293
294
295
296
297
298
299 // fixes parameters such that the model limits to 1/Q^4 at large t
300 // -- requires at least 5 parameters to do so --
301 // 4 parameters for Q^4 behavior
302
303 // will use BP_0 and BP_Kmax through BP_Kmax-3 to do the fitting
304 // calculate some useful numbers (redundancy for readability)
305 double kkp4 = (double)fKmax+4;
306 double kkp3 = (double)fKmax+3;
307 double kkp2 = (double)fKmax+2;
308 double kkp1 = (double)fKmax+1;
309 double kkp0 = (double)fKmax ;
310 //double km5 = (double)fKmax-5;
311 double kz0 = this->CalculateZ(0.);
312 double zkkp4 = TMath::Power(kz0,(int)kkp4);
313 double zkkp3 = TMath::Power(kz0,(int)kkp3);
314 double zkkp2 = TMath::Power(kz0,(int)kkp2);
315 double zkkp1 = TMath::Power(kz0,(int)kkp1);
316
317 // denominator
318 double kdenom = \
319 6. - kkp4*kkp3*kkp2*zkkp1 + 3.*kkp4*kkp3*kkp1*zkkp2 \
320 - 3.*kkp4*kkp2*kkp1*zkkp3 + kkp3*kkp2*kkp1*zkkp4;
321
322 // extra parameters (effectively constants)
323 // number refers to the number of derivatives
324 double kb0 = 0.;
325 for (int ki = 1;ki <= fKmax;ki++)
326 {
327 kb0 = kb0 + fZ_BPn[ki];
328 }
329
330 double kb0z = -fGmp0;
331 for (int ki = 1;ki <= fKmax;ki++)
332 {
333 kb0z = kb0z + fZ_BPn[ki]*TMath::Power(kz0,ki);
334 }
335
336 double kb1 = 0.;
337 for (int ki = 1;ki <= fKmax;ki++)
338 {
339 kb1 = kb1 + ki*fZ_BPn[ki];
340 }
341
342 double kb2 = 0.;
343 for (int ki = 1;ki <= fKmax;ki++)
344 {
345 kb2 = kb2 + ki*(ki-1)*fZ_BPn[ki];
346 }
347
348 double kb3 = 0.;
349 for (int ki = 1;ki <= fKmax;ki++)
350 {
351 kb3 = kb3 + ki*(ki-1)*(ki-2)*fZ_BPn[ki];
352 }
353
354 // Assign new parameters
355 fZ_BPn[(int)kkp4] = (1./kdenom) * \
356 ( (kb0-kb0z)*kkp3*kkp2*kkp1 \
357 + kb3*( -1. + .5*kkp3*kkp2*zkkp1 - kkp3*kkp1*zkkp2 \
358 +.5*kkp2*kkp1*zkkp3 ) \
359 + kb2*( 3.*kkp1 - kkp3*kkp2*kkp1*zkkp1 \
360 +kkp3*kkp1*(2*fKmax+1)*zkkp2 - kkp2*kkp1*kkp0*zkkp3 ) \
361 + kb1*( -3.*kkp2*kkp1 + .5*kkp3*kkp2*kkp2*kkp1*zkkp1 \
362 -kkp3*kkp2*kkp1*kkp0*zkkp2 + .5*kkp2*kkp1*kkp1*kkp0*zkkp3) );
363
364 fZ_BPn[(int)kkp3] = (1./kdenom) * \
365 ( -3.*(kb0-kb0z)*kkp4*kkp2*kkp1 \
366 + kb3*( 3. - kkp4*kkp2*zkkp1 + (3./2.)*kkp4*kkp1*zkkp2 \
367 -.5*kkp2*kkp1*zkkp4 ) \
368 + kb2*( -3.*(3*fKmax+4) + kkp4*kkp2*(2*fKmax+3)*zkkp1 \
369 -3.*kkp4*kkp1*kkp1*zkkp2 + kkp2*kkp1*kkp0*zkkp4 ) \
370 + kb1*( 3.*kkp1*(3*fKmax+8) - kkp4*kkp3*kkp2*kkp1*zkkp1 \
371 +(3./2.)*kkp4*kkp3*kkp1*kkp0*zkkp2 - .5*kkp2*kkp1*kkp1*kkp0*zkkp4) );
372
373 fZ_BPn[(int)kkp2] = (1./kdenom) * \
374 ( 3.*(kb0-kb0z)*kkp4*kkp3*kkp1 \
375 + kb3*( -3. + .5*kkp4*kkp3*zkkp1 - (3./2.)*kkp4*kkp1*zkkp3 \
376 +kkp3*kkp1*zkkp4 ) \
377 + kb2*( 3.*(3*fKmax+5) - kkp4*kkp3*kkp2*zkkp1 \
378 +3.*kkp4*kkp1*kkp1*zkkp3 - kkp3*kkp1*(2*fKmax+1)*zkkp4) \
379 + kb1*( -3.*kkp3*(3*fKmax+4) + .5*kkp4*kkp3*kkp3*kkp2*zkkp1 \
380 -(3./2.)*kkp4*kkp3*kkp1*kkp0*zkkp3 + kkp3*kkp2*kkp1*kkp0*zkkp4) );
381
382 fZ_BPn[(int)kkp1] = (1./kdenom) * \
383 ( -(kb0-kb0z)*kkp4*kkp3*kkp2 \
384 + kb3*( 1. - .5*kkp4*kkp3*zkkp2 + kkp4*kkp2*zkkp3 \
385 -.5*kkp3*kkp2*zkkp4 ) \
386 + kb2*( -3.*kkp2 + kkp4*kkp3*kkp2*zkkp2 \
387 -kkp4*kkp2*(2*fKmax+3)*zkkp3 + kkp3*kkp2*kkp1*zkkp4) \
388 + kb1*( 3.*kkp3*kkp2 - .5*kkp4*kkp3*kkp3*kkp2*zkkp2 \
389 +kkp4*kkp3*kkp2*kkp1*zkkp3 - .5*kkp3*kkp2*kkp2*kkp1*zkkp4) );
390
391 fZ_BPn[0] = (1./kdenom) * \
392 ( -6.*kb0z \
393 + kb0*( kkp4*kkp3*kkp2*zkkp1 - 3.*kkp4*kkp3*kkp1*zkkp2 \
394 +3.*kkp4*kkp2*kkp1*zkkp3 - kkp3*kkp2*kkp1*zkkp4 ) \
395 + kb3*( -zkkp1 + 3.*zkkp2 - 3.*zkkp3 + zkkp4 ) \
396 + kb2*( 3.*kkp2*zkkp1 - 3.*(3*fKmax+5)*zkkp2 \
397 +3.*(3*fKmax+4)*zkkp3 - 3.*kkp1*zkkp4 ) \
398 + kb1*( -3.*kkp3*kkp2*zkkp1 + 3.*kkp3*(3*fKmax+4)*zkkp2 \
399 -3.*kkp1*(3*fKmax+8)*zkkp3 + 3.*kkp2*kkp1*zkkp4 ) );
400
401
402
403
404
405
406 // fixes parameters such that the model limits to 1/Q^4 at large t
407 // -- requires at least 5 parameters to do so --
408 // 4 parameters for Q^4 behavior
409
410 // will use AN_0 and AN_Kmax through AN_Kmax-3 to do the fitting
411 // calculate some useful numbers (redundancy for readability)
412 double lp4 = (double)fKmax+4;
413 double lp3 = (double)fKmax+3;
414 double lp2 = (double)fKmax+2;
415 double lp1 = (double)fKmax+1;
416 double lp0 = (double)fKmax ;
417 //double km5 = (double)fKmax-5;
418 double lz0 = this->CalculateZ(0.);
419 double zlp4 = TMath::Power(lz0,(int)lp4);
420 double zlp3 = TMath::Power(lz0,(int)lp3);
421 double zlp2 = TMath::Power(lz0,(int)lp2);
422 double zlp1 = TMath::Power(lz0,(int)lp1);
423
424 // ldenominator
425 double ldenom = \
426 6. - lp4*lp3*lp2*zlp1 + 3.*lp4*lp3*lp1*zlp2 \
427 - 3.*lp4*lp2*lp1*zlp3 + lp3*lp2*lp1*zlp4;
428
429 // extra parameters (effectively constants)
430 // number refers to the number of derivatives
431 double lb0 = 0.;
432 for (int ki = 1;ki <= fKmax;ki++)
433 {
434 lb0 = lb0 + fZ_ANn[ki];
435 }
436
437 double lb0z = -fGen0;
438 for (int ki = 1;ki <= fKmax;ki++)
439 {
440 lb0z = lb0z + fZ_ANn[ki]*TMath::Power(lz0,ki);
441 }
442
443 double lb1 = 0.;
444 for (int ki = 1;ki <= fKmax;ki++)
445 {
446 lb1 = lb1 + ki*fZ_ANn[ki];
447 }
448
449 double lb2 = 0.;
450 for (int ki = 1;ki <= fKmax;ki++)
451 {
452 lb2 = lb2 + ki*(ki-1)*fZ_ANn[ki];
453 }
454
455 double lb3 = 0.;
456 for (int ki = 1;ki <= fKmax;ki++)
457 {
458 lb3 = lb3 + ki*(ki-1)*(ki-2)*fZ_ANn[ki];
459 }
460
461 // Assign new parameters
462 fZ_ANn[(int)lp4] = (1./ldenom) * \
463 ( (lb0-lb0z)*lp3*lp2*lp1 \
464 + lb3*( -1. + .5*lp3*lp2*zlp1 - lp3*lp1*zlp2 \
465 +.5*lp2*lp1*zlp3 ) \
466 + lb2*( 3.*lp1 - lp3*lp2*lp1*zlp1 \
467 +lp3*lp1*(2*fKmax+1)*zlp2 - lp2*lp1*lp0*zlp3 ) \
468 + lb1*( -3.*lp2*lp1 + .5*lp3*lp2*lp2*lp1*zlp1 \
469 -lp3*lp2*lp1*lp0*zlp2 + .5*lp2*lp1*lp1*lp0*zlp3) );
470
471 fZ_ANn[(int)lp3] = (1./ldenom) * \
472 ( -3.*(lb0-lb0z)*lp4*lp2*lp1 \
473 + lb3*( 3. - lp4*lp2*zlp1 + (3./2.)*lp4*lp1*zlp2 \
474 -.5*lp2*lp1*zlp4 ) \
475 + lb2*( -3.*(3*fKmax+4) + lp4*lp2*(2*fKmax+3)*zlp1 \
476 -3.*lp4*lp1*lp1*zlp2 + lp2*lp1*lp0*zlp4 ) \
477 + lb1*( 3.*lp1*(3*fKmax+8) - lp4*lp3*lp2*lp1*zlp1 \
478 +(3./2.)*lp4*lp3*lp1*lp0*zlp2 - .5*lp2*lp1*lp1*lp0*zlp4) );
479
480 fZ_ANn[(int)lp2] = (1./ldenom) * \
481 ( 3.*(lb0-lb0z)*lp4*lp3*lp1 \
482 + lb3*( -3. + .5*lp4*lp3*zlp1 - (3./2.)*lp4*lp1*zlp3 \
483 +lp3*lp1*zlp4 ) \
484 + lb2*( 3.*(3*fKmax+5) - lp4*lp3*lp2*zlp1 \
485 +3.*lp4*lp1*lp1*zlp3 - lp3*lp1*(2*fKmax+1)*zlp4) \
486 + lb1*( -3.*lp3*(3*fKmax+4) + .5*lp4*lp3*lp3*lp2*zlp1 \
487 -(3./2.)*lp4*lp3*lp1*lp0*zlp3 + lp3*lp2*lp1*lp0*zlp4) );
488
489 fZ_ANn[(int)lp1] = (1./ldenom) * \
490 ( -(lb0-lb0z)*lp4*lp3*lp2 \
491 + lb3*( 1. - .5*lp4*lp3*zlp2 + lp4*lp2*zlp3 \
492 -.5*lp3*lp2*zlp4 ) \
493 + lb2*( -3.*lp2 + lp4*lp3*lp2*zlp2 \
494 -lp4*lp2*(2*fKmax+3)*zlp3 + lp3*lp2*lp1*zlp4) \
495 + lb1*( 3.*lp3*lp2 - .5*lp4*lp3*lp3*lp2*zlp2 \
496 +lp4*lp3*lp2*lp1*zlp3 - .5*lp3*lp2*lp2*lp1*zlp4) );
497
498 fZ_ANn[0] = (1./ldenom) * \
499 ( -6.*lb0z \
500 + lb0*( lp4*lp3*lp2*zlp1 - 3.*lp4*lp3*lp1*zlp2 \
501 +3.*lp4*lp2*lp1*zlp3 - lp3*lp2*lp1*zlp4 ) \
502 + lb3*( -zlp1 + 3.*zlp2 - 3.*zlp3 + zlp4 ) \
503 + lb2*( 3.*lp2*zlp1 - 3.*(3*fKmax+5)*zlp2 \
504 +3.*(3*fKmax+4)*zlp3 - 3.*lp1*zlp4 ) \
505 + lb1*( -3.*lp3*lp2*zlp1 + 3.*lp3*(3*fKmax+4)*zlp2 \
506 -3.*lp1*(3*fKmax+8)*zlp3 + 3.*lp2*lp1*zlp4 ) );
507
508
509
510
511
512
513
514 // fixes parameters such that the model limits to 1/Q^4 at large t
515 // -- requires at least 5 parameters to do so --
516 // 4 parameters for Q^4 behavior
517
518 // will use BN_0 and BN_Kmax through BN_Kmax-3 to do the fitting
519 // calculate some useful numbers (redundancy for readability)
520 double llp4 = (double)fKmax+4;
521 double llp3 = (double)fKmax+3;
522 double llp2 = (double)fKmax+2;
523 double llp1 = (double)fKmax+1;
524 double llp0 = (double)fKmax ;
525 //double km5 = (double)fKmax-5;
526 double llz0 = this->CalculateZ(0.);
527 double zllp4 = TMath::Power(llz0,(int)llp4);
528 double zllp3 = TMath::Power(llz0,(int)llp3);
529 double zllp2 = TMath::Power(llz0,(int)llp2);
530 double zllp1 = TMath::Power(llz0,(int)llp1);
531
532 // denominator
533 double lldenom = \
534 6. - llp4*llp3*llp2*zllp1 + 3.*llp4*llp3*llp1*zllp2 \
535 - 3.*llp4*llp2*llp1*zllp3 + llp3*llp2*llp1*zllp4;
536
537 // extra parameters (effectively constants)
538 // number refers to the number of derivatives
539 double llb0 = 0.;
540 for (int ki = 1;ki <= fKmax;ki++)
541 {
542 llb0 = llb0 + fZ_BNn[ki];
543 }
544
545 double llb0z = -fGmn0;
546 for (int ki = 1;ki <= fKmax;ki++)
547 {
548 llb0z = llb0z + fZ_BNn[ki]*TMath::Power(llz0,ki);
549 }
550
551 double llb1 = 0.;
552 for (int ki = 1;ki <= fKmax;ki++)
553 {
554 llb1 = llb1 + ki*fZ_BNn[ki];
555 }
556
557 double llb2 = 0.;
558 for (int ki = 1;ki <= fKmax;ki++)
559 {
560 llb2 = llb2 + ki*(ki-1)*fZ_BNn[ki];
561 }
562
563 double llb3 = 0.;
564 for (int ki = 1;ki <= fKmax;ki++)
565 {
566 llb3 = llb3 + ki*(ki-1)*(ki-2)*fZ_BNn[ki];
567 }
568
569 // Assign new parameters
570 fZ_BNn[(int)llp4] = (1./lldenom) * \
571 ( (llb0-llb0z)*llp3*llp2*llp1 \
572 + llb3*( -1. + .5*llp3*llp2*zllp1 - llp3*llp1*zllp2 \
573 +.5*llp2*llp1*zllp3 ) \
574 + llb2*( 3.*llp1 - llp3*llp2*llp1*zllp1 \
575 +llp3*llp1*(2*fKmax+1)*zllp2 - llp2*llp1*llp0*zllp3 ) \
576 + llb1*( -3.*llp2*llp1 + .5*llp3*llp2*llp2*llp1*zllp1 \
577 -llp3*llp2*llp1*llp0*zllp2 + .5*llp2*llp1*llp1*llp0*zllp3) );
578
579 fZ_BNn[(int)llp3] = (1./lldenom) * \
580 ( -3.*(llb0-llb0z)*llp4*llp2*llp1 \
581 + llb3*( 3. - llp4*llp2*zllp1 + (3./2.)*llp4*llp1*zllp2 \
582 -.5*llp2*llp1*zllp4 ) \
583 + llb2*( -3.*(3*fKmax+4) + llp4*llp2*(2*fKmax+3)*zllp1 \
584 -3.*llp4*llp1*llp1*zllp2 + llp2*llp1*llp0*zllp4 ) \
585 + llb1*( 3.*llp1*(3*fKmax+8) - llp4*llp3*llp2*llp1*zllp1 \
586 +(3./2.)*llp4*llp3*llp1*llp0*zllp2 - .5*llp2*llp1*llp1*llp0*zllp4) );
587
588 fZ_BNn[(int)llp2] = (1./lldenom) * \
589 ( 3.*(llb0-llb0z)*llp4*llp3*llp1 \
590 + llb3*( -3. + .5*llp4*llp3*zllp1 - (3./2.)*llp4*llp1*zllp3 \
591 +llp3*llp1*zllp4 ) \
592 + llb2*( 3.*(3*fKmax+5) - llp4*llp3*llp2*zllp1 \
593 +3.*llp4*llp1*llp1*zllp3 - llp3*llp1*(2*fKmax+1)*zllp4) \
594 + llb1*( -3.*llp3*(3*fKmax+4) + .5*llp4*llp3*llp3*llp2*zllp1 \
595 -(3./2.)*llp4*llp3*llp1*llp0*zllp3 + llp3*llp2*llp1*llp0*zllp4) );
596
597 fZ_BNn[(int)llp1] = (1./lldenom) * \
598 ( -(llb0-llb0z)*llp4*llp3*llp2 \
599 + llb3*( 1. - .5*llp4*llp3*zllp2 + llp4*llp2*zllp3 \
600 -.5*llp3*llp2*zllp4 ) \
601 + llb2*( -3.*llp2 + llp4*llp3*llp2*zllp2 \
602 -llp4*llp2*(2*fKmax+3)*zllp3 + llp3*llp2*llp1*zllp4) \
603 + llb1*( 3.*llp3*llp2 - .5*llp4*llp3*llp3*llp2*zllp2 \
604 +llp4*llp3*llp2*llp1*zllp3 - .5*llp3*llp2*llp2*llp1*zllp4) );
605
606 fZ_BNn[0] = (1./lldenom) * \
607 ( -6.*llb0z \
608 + llb0*( llp4*llp3*llp2*zllp1 - 3.*llp4*llp3*llp1*zllp2 \
609 +3.*llp4*llp2*llp1*zllp3 - llp3*llp2*llp1*zllp4 ) \
610 + llb3*( -zllp1 + 3.*zllp2 - 3.*zllp3 + zllp4 ) \
611 + llb2*( 3.*llp2*zllp1 - 3.*(3*fKmax+5)*zllp2 \
612 +3.*(3*fKmax+4)*zllp3 - 3.*llp1*zllp4 ) \
613 + llb1*( -3.*llp3*llp2*zllp1 + 3.*llp3*(3*fKmax+4)*zllp2 \
614 -3.*llp1*(3*fKmax+8)*zllp3 + 3.*llp2*llp1*zllp4 ) );
615
616
617
618
619}
620//____________________________________________________________________________
622{
623 Algorithm::Configure(config);
624 this->LoadConfig();
625}
626//____________________________________________________________________________
628{
629 Algorithm::Configure(param_set);
630 this->LoadConfig();
631}
632//____________________________________________________________________________
634{
635// get config options from the configuration registry or set defaults
636// from the global parameter list
637
638 GetParam( "QEL-Q4limit", fQ4limit ) ;
639 GetParam( "QEL-Kmax", fKmax ) ;
640
641 GetParam( "QEL-T0", fT0 ) ;
642 GetParam( "QEL-Tcut", fTcut ) ;
643
644 GetParam( "QEL-Gep0", fGep0 ) ;
645 GetParam( "QEL-Gmp0", fGmp0 ) ;
646 GetParam( "QEL-Gen0", fGen0 ) ;
647 GetParam( "QEL-Gmn0", fGmn0 ) ;
648 assert(fKmax > 0);
649
650 // z expansion coefficients
651 std::vector<double> tmp_fZ_APn, tmp_fZ_BPn, tmp_fZ_ANn, tmp_fZ_BNn;
652 if(fQ4limit){
653 fZ_APn.resize(fKmax+5);
654 fZ_BPn.resize(fKmax+5);
655 fZ_ANn.resize(fKmax+5);
656 fZ_BNn.resize(fKmax+5);
657 }
658 else{
659 fZ_APn.resize(fKmax+1);
660 fZ_BPn.resize(fKmax+1);
661 fZ_ANn.resize(fKmax+1);
662 fZ_BNn.resize(fKmax+1);
663 }
664 if(this->GetParamVect("QEL-Z_AP", tmp_fZ_APn) != fKmax){
665 LOG("ZExpELFormFactorModel",pERROR) << "Wrong size of AP coefficients " << tmp_fZ_APn.size();
666 exit(1);
667 }
668 if(this->GetParamVect("QEL-Z_BP", tmp_fZ_BPn) != fKmax){
669 LOG("ZExpELFormFactorModel",pERROR) << "Wrong size of BP coefficients " << tmp_fZ_BPn.size();
670 exit(1);
671 }
672 if(this->GetParamVect("QEL-Z_AN", tmp_fZ_ANn) != fKmax){
673 LOG("ZExpELFormFactorModel",pERROR) << "Wrong size of AN coefficients " << tmp_fZ_ANn.size();
674 exit(1);
675 }
676 if(this->GetParamVect("QEL-Z_BN", tmp_fZ_BNn) != fKmax){
677 LOG("ZExpELFormFactorModel",pERROR) << "Wrong size of BN coefficients " << tmp_fZ_BNn.size();
678 exit(1);
679 }
680
681 // load the user-defined coefficient values
682 // -- AP0 and APn for n<fKmax are calculated from other means
683 for (int ip=1;ip<fKmax+1;ip++) {
684 fZ_APn[ip] = tmp_fZ_APn[ip-1];
685 fZ_BPn[ip] = tmp_fZ_BPn[ip-1];
686 fZ_ANn[ip] = tmp_fZ_ANn[ip-1];
687 fZ_BNn[ip] = tmp_fZ_BNn[ip-1];
688 }
689
690 this->FixCoeffs();
691 Interaction * interaction = new Interaction();
692 for (int i=0;i<10;i++) {
693 double Q2 = i*0.1;
694 interaction->KinePtr()->SetQ2( Q2);
695 LOG("ZExpELFormFactorModel",pNOTICE)
696 << "Q2=" <<Q2
697 <<" : Gep(Q2)= " <<this->Gep( interaction);
698 }
699 for (int i=0;i<10;i++) {
700 double Q2 = i*0.1;
701 interaction->KinePtr()->SetQ2( Q2);
702 LOG("ZExpELFormFactorModel",pNOTICE)
703 << "Q2=" <<Q2
704 <<" : Gmp(Q2)= " <<this->Gmp( interaction);
705 }
706 for (int i=0;i<10;i++) {
707 double Q2 = i*0.1;
708 interaction->KinePtr()->SetQ2( Q2);
709 LOG("ZExpELFormFactorModel",pNOTICE)
710 << "Q2=" <<Q2
711 <<" : Gen(Q2)= " <<this->Gen( interaction);
712 }
713 for (int i=0;i<10;i++) {
714 double Q2 = i*0.1;
715 interaction->KinePtr()->SetQ2( Q2);
716 LOG("ZExpELFormFactorModel",pNOTICE)
717 << "Q2=" <<Q2
718 <<" : Gmn(Q2)= " <<this->Gmn( interaction);
719 }
720 delete interaction;
721}
722//____________________________________________________________________________
723
#define pNOTICE
Definition Messenger.h:61
#define pERROR
Definition Messenger.h:59
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE,...
Definition Messenger.h:96
#define pWARN
Definition Messenger.h:60
std::mt19937 gen(rd())
bool GetParam(const RgKey &name, T &p, bool is_top_call=true) const
int GetParamVect(const std::string &comm_name, std::vector< T > &v, bool is_top_call=true) const
Handle to load vectors of parameters.
virtual void Configure(const Registry &config)
Definition Algorithm.cxx:62
Summary information for an interaction.
Definition Interaction.h:56
Kinematics * KinePtr(void) const
Definition Interaction.h:76
void SetQ2(double Q2, bool selected=false)
double q2(bool selected=false) const
A registry. Provides the container for algorithm configuration parameters.
Definition Registry.h:65
double Gen(const Interaction *interaction) const override
Compute the elastic form factor G_{en} for the input interaction.
void Configure(const Registry &config) override
double Gmp(const Interaction *interaction) const override
Compute the elastic form factor G_{mp} for the input interaction.
double Gep(const Interaction *interaction) const override
Compute the elastic form factor G_{ep} for the input interaction.
double Gmn(const Interaction *interaction) const override
Compute the elastic form factor G_{mn} for the input interaction.
THE MAIN GENIE PROJECT NAMESPACE
Definition AlgCmp.h:25