source: trunk/source/processes/hadronic/cross_sections/src/G4HadronNucleonXsc.cc@ 1340

Last change on this file since 1340 was 1340, checked in by garnier, 15 years ago

update ti head

File size: 29.5 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// 14.03.07 V. Grichine - first implementation
28//
29
30#include "G4HadronNucleonXsc.hh"
31
32#include "G4ParticleTable.hh"
33#include "G4IonTable.hh"
34#include "G4ParticleDefinition.hh"
35#include "G4HadTmpUtil.hh"
36
37
38G4HadronNucleonXsc::G4HadronNucleonXsc()
39: fUpperLimit( 10000 * GeV ),
40 fLowerLimit( 0.03 * MeV )
41{
42 theGamma = G4Gamma::Gamma();
43 theProton = G4Proton::Proton();
44 theNeutron = G4Neutron::Neutron();
45 theAProton = G4AntiProton::AntiProton();
46 theANeutron = G4AntiNeutron::AntiNeutron();
47 thePiPlus = G4PionPlus::PionPlus();
48 thePiMinus = G4PionMinus::PionMinus();
49 thePiZero = G4PionZero::PionZero();
50 theKPlus = G4KaonPlus::KaonPlus();
51 theKMinus = G4KaonMinus::KaonMinus();
52 theK0S = G4KaonZeroShort::KaonZeroShort();
53 theK0L = G4KaonZeroLong::KaonZeroLong();
54 theL = G4Lambda::Lambda();
55 theAntiL = G4AntiLambda::AntiLambda();
56 theSPlus = G4SigmaPlus::SigmaPlus();
57 theASPlus = G4AntiSigmaPlus::AntiSigmaPlus();
58 theSMinus = G4SigmaMinus::SigmaMinus();
59 theASMinus = G4AntiSigmaMinus::AntiSigmaMinus();
60 theS0 = G4SigmaZero::SigmaZero();
61 theAS0 = G4AntiSigmaZero::AntiSigmaZero();
62 theXiMinus = G4XiMinus::XiMinus();
63 theXi0 = G4XiZero::XiZero();
64 theAXiMinus = G4AntiXiMinus::AntiXiMinus();
65 theAXi0 = G4AntiXiZero::AntiXiZero();
66 theOmega = G4OmegaMinus::OmegaMinus();
67 theAOmega = G4AntiOmegaMinus::AntiOmegaMinus();
68 theD = G4Deuteron::Deuteron();
69 theT = G4Triton::Triton();
70 theA = G4Alpha::Alpha();
71 theHe3 = G4He3::He3();
72}
73
74///////////////////////////////////////////////////////////////////////////////////////
75//
76//
77
78G4HadronNucleonXsc::~G4HadronNucleonXsc()
79{}
80
81
82////////////////////////////////////////////////////////////////////////////////////////
83//
84//
85
86
87G4bool
88G4HadronNucleonXsc::IsApplicable(const G4DynamicParticle* aDP,
89 const G4Element* anElement)
90{
91 G4int Z = G4lrint(anElement->GetZ());
92 G4int A = G4lrint(anElement->GetN());
93 return IsIsoApplicable(aDP, Z, A);
94}
95
96////////////////////////////////////////////////////////////////////////////////////////
97//
98
99G4bool
100G4HadronNucleonXsc::IsIsoApplicable(const G4DynamicParticle* aDP,
101 G4int Z, G4int)
102{
103 G4bool applicable = false;
104 // G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber();
105 G4double kineticEnergy = aDP->GetKineticEnergy();
106
107 const G4ParticleDefinition* theParticle = aDP->GetDefinition();
108
109 if ( ( kineticEnergy >= fLowerLimit &&
110 Z > 1 && // >= He
111 ( theParticle == theAProton ||
112 theParticle == theGamma ||
113 theParticle == theKPlus ||
114 theParticle == theKMinus ||
115 theParticle == theSMinus) ) ||
116
117 ( kineticEnergy >= 0.1*fLowerLimit &&
118 Z > 1 && // >= He
119 ( theParticle == theProton ||
120 theParticle == theNeutron ||
121 theParticle == thePiPlus ||
122 theParticle == thePiMinus ) ) ) applicable = true;
123
124 return applicable;
125}
126
127
128/////////////////////////////////////////////////////////////////////////////////////
129//
130// Returns hadron-nucleon Xsc according to differnt parametrisations:
131// [2] E. Levin, hep-ph/9710546
132// [3] U. Dersch, et al, hep-ex/9910052
133// [4] M.J. Longo, et al, Phys.Rev.Lett. 33 (1974) 725
134
135G4double
136G4HadronNucleonXsc::GetHadronNucleonXscEL(const G4DynamicParticle* aParticle,
137 const G4ParticleDefinition* nucleon )
138{
139 G4double xsection;
140
141
142 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
143
144 G4double proj_mass = aParticle->GetMass();
145 G4double proj_momentum = aParticle->GetMomentum().mag();
146 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
147
148 sMand /= GeV*GeV; // in GeV for parametrisation
149 proj_momentum /= GeV;
150
151 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
152
153 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
154
155
156 if(theParticle == theGamma && pORn )
157 {
158 xsection = (0.0677*std::pow(sMand,0.0808) + 0.129*std::pow(sMand,-0.4525));
159 }
160 else if(theParticle == theNeutron && pORn ) // as proton ???
161 {
162 xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
163 }
164 else if(theParticle == theProton && pORn )
165 {
166 xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
167
168 // xsection = At*( 49.51*std::pow(sMand,-0.097) + 0.314*std::log(sMand)*std::log(sMand) );
169 // xsection = At*( 38.4 + 0.85*std::abs(std::pow(log(sMand),1.47)) );
170 }
171 else if(theParticle == theAProton && pORn )
172 {
173 xsection = ( 21.70*std::pow(sMand,0.0808) + 98.39*std::pow(sMand,-0.4525));
174 }
175 else if(theParticle == thePiPlus && pORn )
176 {
177 xsection = (13.63*std::pow(sMand,0.0808) + 27.56*std::pow(sMand,-0.4525));
178 }
179 else if(theParticle == thePiMinus && pORn )
180 {
181 // xsection = At*( 55.2*std::pow(sMand,-0.255) + 0.346*std::log(sMand)*std::log(sMand) );
182 xsection = (13.63*std::pow(sMand,0.0808) + 36.02*std::pow(sMand,-0.4525));
183 }
184 else if(theParticle == theKPlus && pORn )
185 {
186 xsection = (11.82*std::pow(sMand,0.0808) + 8.15*std::pow(sMand,-0.4525));
187 }
188 else if(theParticle == theKMinus && pORn )
189 {
190 xsection = (11.82*std::pow(sMand,0.0808) + 26.36*std::pow(sMand,-0.4525));
191 }
192 else // as proton ???
193 {
194 xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
195 }
196 xsection *= millibarn;
197
198 fTotalXsc = xsection;
199 fInelasticXsc = 0.83*xsection;
200 fElasticXsc = fTotalXsc - fInelasticXsc;
201 if (fElasticXsc < 0.)fElasticXsc = 0.;
202
203 return xsection;
204}
205
206
207/////////////////////////////////////////////////////////////////////////////////////
208//
209// Returns hadron-nucleon Xsc according to PDG parametrisation (2005):
210// http://pdg.lbl.gov/2006/reviews/hadronicrpp.pdf
211// At = number of nucleons, Zt = number of protons
212
213G4double
214G4HadronNucleonXsc::GetHadronNucleonXscPDG(const G4DynamicParticle* aParticle,
215 const G4ParticleDefinition* nucleon )
216{
217 G4double xsection(0);
218 G4int Zt=1, Nt=1, At=1;
219
220 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
221
222 G4double proj_mass = aParticle->GetMass();
223 G4double proj_momentum = aParticle->GetMomentum().mag();
224
225 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
226
227 sMand /= GeV*GeV; // in GeV for parametrisation
228
229 // General PDG fit constants
230
231 G4double s0 = 5.38*5.38; // in Gev^2
232 G4double eta1 = 0.458;
233 G4double eta2 = 0.458;
234 G4double B = 0.308;
235
236 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
237
238 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
239 G4bool proton = (nucleon == theProton);
240 G4bool neutron = (nucleon == theNeutron);
241
242 if(theParticle == theNeutron) // proton-neutron fit
243 {
244 if ( proton )
245 {
246 xsection = Zt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
247 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));// on p
248 }
249 if ( neutron )
250 {
251 xsection = Nt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
252 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // on n pp for nn
253 }
254 }
255 else if(theParticle == theProton)
256 {
257 if ( proton )
258 {
259 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
260 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
261 }
262 if ( neutron )
263 {
264 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
265 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
266 }
267 }
268 else if(theParticle == theAProton)
269 {
270 if ( proton )
271 {
272 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
273 + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
274 }
275 if ( neutron )
276 {
277 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
278 + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
279 }
280 }
281 else if(theParticle == thePiPlus && pORn )
282 {
283 xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
284 + 19.24*std::pow(sMand,-eta1) - 6.03*std::pow(sMand,-eta2));
285 }
286 else if(theParticle == thePiMinus && pORn )
287 {
288 xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
289 + 19.24*std::pow(sMand,-eta1) + 6.03*std::pow(sMand,-eta2));
290 }
291 else if(theParticle == theKPlus)
292 {
293 if ( proton )
294 {
295 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
296 + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
297 }
298 if ( neutron )
299 {
300 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
301 + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
302 }
303 }
304 else if(theParticle == theKMinus)
305 {
306 if ( proton )
307 {
308 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
309 + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
310 }
311 if ( neutron )
312 {
313 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
314 + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2) );
315 }
316 }
317 else if(theParticle == theSMinus && pORn )
318 {
319 xsection = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.)
320 - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2) );
321 }
322 else if(theParticle == theGamma && pORn ) // modify later on
323 {
324 xsection = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.)
325 + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2) );
326
327 }
328 else // as proton ???
329 {
330 if ( proton )
331 {
332 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
333 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2) );
334 }
335 if ( neutron )
336 {
337 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
338 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
339 }
340 }
341 xsection *= millibarn; // parametrised in mb
342
343 fTotalXsc = xsection;
344 fInelasticXsc = 0.83*xsection;
345 fElasticXsc = fTotalXsc - fInelasticXsc;
346 if (fElasticXsc < 0.)fElasticXsc = 0.;
347
348 return xsection;
349}
350
351
352/////////////////////////////////////////////////////////////////////////////////////
353//
354// Returns hadron-nucleon cross-section based on N. Starkov parametrisation of
355// data from mainly http://wwwppds.ihep.su:8001/c5-6A.html database
356
357G4double
358G4HadronNucleonXsc::GetHadronNucleonXscNS(const G4DynamicParticle* aParticle,
359 const G4ParticleDefinition* nucleon )
360{
361 G4double xsection(0), Delta, A0, B0;
362 G4int Zt=1, Nt=1, At=1;
363 G4double hpXsc(0);
364 G4double hnXsc(0);
365
366
367 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
368
369 G4double proj_mass = aParticle->GetMass();
370 G4double proj_energy = aParticle->GetTotalEnergy();
371 G4double proj_momentum = aParticle->GetMomentum().mag();
372
373 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
374
375 sMand /= GeV*GeV; // in GeV for parametrisation
376 proj_momentum /= GeV;
377 proj_energy /= GeV;
378 proj_mass /= GeV;
379
380 // General PDG fit constants
381
382 G4double s0 = 5.38*5.38; // in Gev^2
383 G4double eta1 = 0.458;
384 G4double eta2 = 0.458;
385 G4double B = 0.308;
386
387
388 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
389
390 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
391 G4bool proton = (nucleon == theProton);
392 G4bool neutron = (nucleon == theNeutron);
393
394 if( theParticle == theNeutron && pORn)
395 {
396 if( proj_momentum >= 10.)
397 // if( proj_momentum >= 2.)
398 {
399 Delta = 1.;
400
401 if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy;
402
403 if(proj_momentum >= 10.)
404 {
405 B0 = 7.5;
406 A0 = 100. - B0*std::log(3.0e7);
407
408 xsection = A0 + B0*std::log(proj_energy) - 11
409 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
410 0.93827*0.93827,-0.165); // mb
411 }
412 fTotalXsc = xsection;
413 }
414 else
415 {
416 // nn to be pp
417
418 if(neutron)
419 {
420 if( proj_momentum < 0.73 )
421 {
422 hnXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
423 }
424 else if( proj_momentum < 1.05 )
425 {
426 hnXsc = 23 + 40*(std::log(proj_momentum/0.73))*
427 (std::log(proj_momentum/0.73));
428 }
429 else // if( proj_momentum < 10. )
430 {
431 hnXsc = 39.0+
432 75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
433 }
434 fTotalXsc = hnXsc;
435 }
436 // pn to be np
437
438 if(proton)
439 {
440 if( proj_momentum < 0.8 )
441 {
442 hpXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
443 }
444 else if( proj_momentum < 1.4 )
445 {
446 hpXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
447 }
448 else // if( proj_momentum < 10. )
449 {
450 hpXsc = 33.3+
451 20.8*(std::pow(proj_momentum,2.0)-1.35)/
452 (std::pow(proj_momentum,2.50)+0.95);
453 }
454 fTotalXsc = hpXsc;
455 }
456 // xsection = hpXsc*Zt + hnXsc*Nt;
457 }
458 }
459 else if(theParticle == theProton && pORn)
460 {
461 if( proj_momentum >= 10.)
462 // if( proj_momentum >= 2.)
463 {
464 Delta = 1.;
465
466 if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy;
467
468 if(proj_momentum >= 10.)
469 {
470 B0 = 7.5;
471 A0 = 100. - B0*std::log(3.0e7);
472
473 xsection = A0 + B0*std::log(proj_energy) - 11
474 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
475 0.93827*0.93827,-0.165); // mb
476 }
477 fTotalXsc = xsection;
478 }
479 else
480 {
481 // pp
482
483 if(proton)
484 {
485 if( proj_momentum < 0.73 )
486 {
487 hpXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
488 }
489 else if( proj_momentum < 1.05 )
490 {
491 hpXsc = 23 + 40*(std::log(proj_momentum/0.73))*
492 (std::log(proj_momentum/0.73));
493 }
494 else // if( proj_momentum < 10. )
495 {
496 hpXsc = 39.0+
497 75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
498 }
499 fTotalXsc = hpXsc;
500 }
501 // pn to be np
502
503 if(neutron)
504 {
505 if( proj_momentum < 0.8 )
506 {
507 hnXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
508 }
509 else if( proj_momentum < 1.4 )
510 {
511 hnXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
512 }
513 else // if( proj_momentum < 10. )
514 {
515 hnXsc = 33.3+
516 20.8*(std::pow(proj_momentum,2.0)-1.35)/
517 (std::pow(proj_momentum,2.50)+0.95);
518 }
519 fTotalXsc = hnXsc;
520 }
521 // xsection = hpXsc*Zt + hnXsc*Nt;
522 // xsection = hpXsc*(Zt + Nt);
523 // xsection = hnXsc*(Zt + Nt);
524 }
525 // xsection *= 0.95;
526 }
527 else if(theParticle == theAProton && pORn)
528 {
529 if(proton)
530 {
531 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
532 + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
533 }
534 if(proton)
535 {
536 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
537 + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
538 }
539 fTotalXsc = xsection;
540 }
541 else if(theParticle == thePiPlus && pORn)
542 {
543 if(proton)
544 {
545 if(proj_momentum < 0.4)
546 {
547 G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
548 hpXsc = Ex3+20.0;
549 }
550 else if(proj_momentum < 1.15)
551 {
552 G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
553 hpXsc = Ex4+14.0;
554 }
555 else if(proj_momentum < 3.5)
556 {
557 G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
558 G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
559 hpXsc = Ex1+Ex2+27.5;
560 }
561 else // if(proj_momentum > 3.5) // mb
562 {
563 hpXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
564 }
565 fTotalXsc = hpXsc;
566 }
567
568// pi+n = pi-p??
569
570 if(neutron)
571 {
572 if(proj_momentum < 0.37)
573 {
574 hnXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
575 }
576 else if(proj_momentum<0.65)
577 {
578 hnXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
579 }
580 else if(proj_momentum<1.3)
581 {
582 hnXsc = 36.1+
583 10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
584 24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
585 }
586 else if(proj_momentum<3.0)
587 {
588 hnXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
589 3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
590 1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
591 }
592 else // mb
593 {
594 hnXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
595 }
596 fTotalXsc = hnXsc;
597 }
598 // xsection = hpXsc*Zt + hnXsc*Nt;
599 }
600 else if(theParticle == thePiMinus && pORn)
601 {
602 // pi-n = pi+p??
603
604 if(neutron)
605 {
606 if(proj_momentum < 0.4)
607 {
608 G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
609 hnXsc = Ex3+20.0;
610 }
611 else if(proj_momentum < 1.15)
612 {
613 G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
614 hnXsc = Ex4+14.0;
615 }
616 else if(proj_momentum < 3.5)
617 {
618 G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
619 G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
620 hnXsc = Ex1+Ex2+27.5;
621 }
622 else // if(proj_momentum > 3.5) // mb
623 {
624 hnXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
625 }
626 fTotalXsc = hnXsc;
627 }
628 // pi-p
629
630 if(proton)
631 {
632 if(proj_momentum < 0.37)
633 {
634 hpXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
635 }
636 else if(proj_momentum<0.65)
637 {
638 hpXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
639 }
640 else if(proj_momentum<1.3)
641 {
642 hpXsc = 36.1+
643 10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
644 24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
645 }
646 else if(proj_momentum<3.0)
647 {
648 hpXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
649 3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
650 1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
651 }
652 else // mb
653 {
654 hpXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
655 }
656 fTotalXsc = hpXsc;
657 }
658 // xsection = hpXsc*Zt + hnXsc*Nt;
659 }
660 else if(theParticle == theKPlus && pORn)
661 {
662 if(proton)
663 {
664 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
665 + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
666 }
667 if(neutron)
668 {
669 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
670 + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
671 }
672 fTotalXsc = xsection;
673 }
674 else if(theParticle == theKMinus && pORn)
675 {
676 if(proton)
677 {
678 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
679 + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
680 }
681 if(neutron)
682 {
683 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
684 + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2));
685 }
686 fTotalXsc = xsection;
687 }
688 else if(theParticle == theSMinus && pORn)
689 {
690 xsection = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.)
691 - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2));
692 }
693 else if(theParticle == theGamma && pORn) // modify later on
694 {
695 xsection = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.)
696 + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2));
697 fTotalXsc = xsection;
698 }
699 else // as proton ???
700 {
701 if(proton)
702 {
703 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
704 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
705 }
706 if(neutron)
707 {
708 xsection += Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
709 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
710 }
711 fTotalXsc = xsection;
712 }
713 fTotalXsc *= millibarn; // parametrised in mb
714 // xsection *= millibarn; // parametrised in mb
715
716 fInelasticXsc = 0.83*fTotalXsc;
717 fElasticXsc = fTotalXsc - fInelasticXsc;
718 if (fElasticXsc < 0.)fElasticXsc = 0.;
719
720 return fTotalXsc;
721}
722
723/////////////////////////////////////////////////////////////////////////////////////
724//
725// Returns hadron-nucleon cross-section based on V. Uzjinsky parametrisation of
726// data from G4FTFCrossSection class
727
728G4double
729G4HadronNucleonXsc::GetHadronNucleonXscVU(const G4DynamicParticle* aParticle,
730 const G4ParticleDefinition* nucleon )
731{
732 G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
733 G4int absPDGcode = std::abs(PDGcode);
734 G4double Elab = aParticle->GetTotalEnergy();
735 // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
736 G4double Plab = aParticle->GetMomentum().mag();
737 // std::sqrt(Elab * Elab - 0.88);
738
739 Elab /= GeV;
740 Plab /= GeV;
741
742 G4double LogPlab = std::log( Plab );
743 G4double sqrLogPlab = LogPlab * LogPlab;
744
745 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
746 G4bool proton = (nucleon == theProton);
747 G4bool neutron = (nucleon == theNeutron);
748
749
750 if( absPDGcode > 1000 && pORn ) //------Projectile is baryon -
751 {
752 if(proton)
753 {
754 fTotalXsc = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
755 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
756 }
757 if(neutron)
758 {
759 fTotalXsc = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
760 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
761 }
762 }
763 else if( PDGcode == 211 && pORn ) //------Projectile is PionPlus ----
764 {
765 if(proton)
766 {
767 fTotalXsc = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
768 fElasticXsc = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
769 }
770 if(neutron)
771 {
772 fTotalXsc = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
773 fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
774 }
775 }
776 else if( PDGcode == -211 && pORn ) //------Projectile is PionMinus ----
777 {
778 if(proton)
779 {
780 fTotalXsc = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
781 fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
782 }
783 if(neutron)
784 {
785 fTotalXsc = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
786 fElasticXsc = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
787 }
788 }
789 else if( PDGcode == 111 && pORn ) //------Projectile is PionZero --
790 {
791 if(proton)
792 {
793 fTotalXsc = (16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab + //Pi+
794 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab)/2; //Pi-
795
796 fElasticXsc = ( 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab + //Pi+
797 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
798
799 }
800 if(neutron)
801 {
802 fTotalXsc = (33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab + //Pi+
803 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
804 fElasticXsc = ( 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab + //Pi+
805 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
806 }
807 }
808 else if( PDGcode == 321 && pORn ) //------Projectile is KaonPlus --
809 {
810 if(proton)
811 {
812 fTotalXsc = 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab;
813 fElasticXsc = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab;
814 }
815 if(neutron)
816 {
817 fTotalXsc = 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab;
818 fElasticXsc = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab;
819 }
820 }
821 else if( PDGcode ==-321 && pORn ) //------Projectile is KaonMinus ----
822 {
823 if(proton)
824 {
825 fTotalXsc = 32.1 + 0. *std::pow(Plab, 0. ) + 0.66*sqrLogPlab - 5.6*LogPlab;
826 fElasticXsc = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29*sqrLogPlab - 2.4*LogPlab;
827 }
828 if(neutron)
829 {
830 fTotalXsc = 25.2 + 0. *std::pow(Plab, 0. ) + 0.38*sqrLogPlab - 2.9*LogPlab;
831 fElasticXsc = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16*sqrLogPlab - 1.3*LogPlab;
832 }
833 }
834 else if( PDGcode == 311 && pORn ) //------Projectile is KaonZero -----
835 {
836 if(proton)
837 {
838 fTotalXsc = ( 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab + //K+
839 32.1 + 0. *std::pow(Plab, 0. ) + 0.66 *sqrLogPlab - 5.6 *LogPlab)/2; //K-
840 fElasticXsc = ( 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab + //K+
841 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab)/2; //K-
842 }
843 if(neutron)
844 {
845 fTotalXsc = ( 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab + //K+
846 25.2 + 0. *std::pow(Plab, 0. ) + 0.38 *sqrLogPlab - 2.9 *LogPlab)/2; //K-
847 fElasticXsc = ( 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab + //K+
848 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab)/2; //K-
849 }
850 }
851 else //------Projectile is undefined, Nucleon assumed
852 {
853 if(proton)
854 {
855 fTotalXsc = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
856 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
857 }
858 if(neutron)
859 {
860 fTotalXsc = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
861 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
862 }
863 }
864 fTotalXsc *= millibarn;
865 fElasticXsc *= millibarn;
866 fInelasticXsc = fTotalXsc - fElasticXsc;
867 if (fInelasticXsc < 0.) fInelasticXsc = 0.;
868
869 return fTotalXsc;
870}
871
872////////////////////////////////////////////////////////////////////////////////////
873//
874//
875
876G4double G4HadronNucleonXsc::CalculateEcmValue( const G4double mp ,
877 const G4double mt ,
878 const G4double Plab )
879{
880 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
881 G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
882 // G4double Pcm = Plab * mt / Ecm;
883 // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
884
885 return Ecm ; // KEcm;
886}
887
888
889////////////////////////////////////////////////////////////////////////////////////
890//
891//
892
893G4double G4HadronNucleonXsc::CalcMandelstamS( const G4double mp ,
894 const G4double mt ,
895 const G4double Plab )
896{
897 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
898 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
899
900 return sMand;
901}
902
903
904//
905//
906///////////////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.