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

Last change on this file since 962 was 819, checked in by garnier, 17 years ago

import all except CVS

File size: 38.6 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
36//////////////////////////////////////////////////////////////////////////////////////
37//
38//
39
40
41G4HadronNucleonXsc::G4HadronNucleonXsc()
42: fUpperLimit( 10000 * GeV ),
43 fLowerLimit( 0.03 * MeV )
44{
45 theGamma = G4Gamma::Gamma();
46 theProton = G4Proton::Proton();
47 theNeutron = G4Neutron::Neutron();
48 theAProton = G4AntiProton::AntiProton();
49 theANeutron = G4AntiNeutron::AntiNeutron();
50 thePiPlus = G4PionPlus::PionPlus();
51 thePiMinus = G4PionMinus::PionMinus();
52 thePiZero = G4PionZero::PionZero();
53 theKPlus = G4KaonPlus::KaonPlus();
54 theKMinus = G4KaonMinus::KaonMinus();
55 theK0S = G4KaonZeroShort::KaonZeroShort();
56 theK0L = G4KaonZeroLong::KaonZeroLong();
57 theL = G4Lambda::Lambda();
58 theAntiL = G4AntiLambda::AntiLambda();
59 theSPlus = G4SigmaPlus::SigmaPlus();
60 theASPlus = G4AntiSigmaPlus::AntiSigmaPlus();
61 theSMinus = G4SigmaMinus::SigmaMinus();
62 theASMinus = G4AntiSigmaMinus::AntiSigmaMinus();
63 theS0 = G4SigmaZero::SigmaZero();
64 theAS0 = G4AntiSigmaZero::AntiSigmaZero();
65 theXiMinus = G4XiMinus::XiMinus();
66 theXi0 = G4XiZero::XiZero();
67 theAXiMinus = G4AntiXiMinus::AntiXiMinus();
68 theAXi0 = G4AntiXiZero::AntiXiZero();
69 theOmega = G4OmegaMinus::OmegaMinus();
70 theAOmega = G4AntiOmegaMinus::AntiOmegaMinus();
71 theD = G4Deuteron::Deuteron();
72 theT = G4Triton::Triton();
73 theA = G4Alpha::Alpha();
74 theHe3 = G4He3::He3();
75}
76
77///////////////////////////////////////////////////////////////////////////////////////
78//
79//
80
81G4HadronNucleonXsc::~G4HadronNucleonXsc()
82{
83}
84
85
86////////////////////////////////////////////////////////////////////////////////////////
87//
88//
89
90
91G4bool
92G4HadronNucleonXsc::IsApplicable(const G4DynamicParticle* aDP,
93 const G4Element* anElement)
94{
95 return IsZAApplicable(aDP, anElement->GetZ(), anElement->GetN());
96}
97
98////////////////////////////////////////////////////////////////////////////////////////
99//
100//
101
102G4bool
103G4HadronNucleonXsc::IsZAApplicable(const G4DynamicParticle* aDP,
104 G4double Z, G4double)
105{
106 G4bool applicable = false;
107 // G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber();
108 G4double kineticEnergy = aDP->GetKineticEnergy();
109
110 const G4ParticleDefinition* theParticle = aDP->GetDefinition();
111
112 if ( ( kineticEnergy >= fLowerLimit &&
113 Z > 1.5 && // >= He
114 ( theParticle == theAProton ||
115 theParticle == theGamma ||
116 theParticle == theKPlus ||
117 theParticle == theKMinus ||
118 theParticle == theSMinus) ) ||
119
120 ( kineticEnergy >= 0.1*fLowerLimit &&
121 Z > 1.5 && // >= He
122 ( theParticle == theProton ||
123 theParticle == theNeutron ||
124 theParticle == thePiPlus ||
125 theParticle == thePiMinus ) ) ) applicable = true;
126
127 return applicable;
128}
129
130
131
132
133/////////////////////////////////////////////////////////////////////////////////////
134//
135// Returns hadron-nucleon Xsc according to differnt parametrisations:
136// [2] E. Levin, hep-ph/9710546
137// [3] U. Dersch, et al, hep-ex/9910052
138// [4] M.J. Longo, et al, Phys.Rev.Lett. 33 (1974) 725
139
140G4double
141G4HadronNucleonXsc::GetHadronNucleonXscEL(const G4DynamicParticle* aParticle,
142 const G4ParticleDefinition* nucleon )
143{
144 G4double xsection;
145
146
147 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
148
149 G4double proj_mass = aParticle->GetMass();
150 G4double proj_momentum = aParticle->GetMomentum().mag();
151 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
152
153 sMand /= GeV*GeV; // in GeV for parametrisation
154 proj_momentum /= GeV;
155
156 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
157
158 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
159
160
161 if(theParticle == theGamma && pORn )
162 {
163 xsection = (0.0677*std::pow(sMand,0.0808) + 0.129*std::pow(sMand,-0.4525));
164 }
165 else if(theParticle == theNeutron && pORn ) // as proton ???
166 {
167 xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
168 }
169 else if(theParticle == theProton && pORn )
170 {
171 xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
172
173 // xsection = At*( 49.51*std::pow(sMand,-0.097) + 0.314*std::log(sMand)*std::log(sMand) );
174 // xsection = At*( 38.4 + 0.85*std::abs(std::pow(log(sMand),1.47)) );
175 }
176 else if(theParticle == theAProton && pORn )
177 {
178 xsection = ( 21.70*std::pow(sMand,0.0808) + 98.39*std::pow(sMand,-0.4525));
179 }
180 else if(theParticle == thePiPlus && pORn )
181 {
182 xsection = (13.63*std::pow(sMand,0.0808) + 27.56*std::pow(sMand,-0.4525));
183 }
184 else if(theParticle == thePiMinus && pORn )
185 {
186 // xsection = At*( 55.2*std::pow(sMand,-0.255) + 0.346*std::log(sMand)*std::log(sMand) );
187 xsection = (13.63*std::pow(sMand,0.0808) + 36.02*std::pow(sMand,-0.4525));
188 }
189 else if(theParticle == theKPlus && pORn )
190 {
191 xsection = (11.82*std::pow(sMand,0.0808) + 8.15*std::pow(sMand,-0.4525));
192 }
193 else if(theParticle == theKMinus && pORn )
194 {
195 xsection = (11.82*std::pow(sMand,0.0808) + 26.36*std::pow(sMand,-0.4525));
196 }
197 else // as proton ???
198 {
199 xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
200 }
201 xsection *= millibarn;
202
203 fTotalXsc = xsection;
204 fInelasticXsc = 0.83*xsection;
205 fElasticXsc = fTotalXsc - fInelasticXsc;
206 if (fElasticXsc < 0.)fElasticXsc = 0.;
207
208 return xsection;
209}
210
211
212
213
214
215/////////////////////////////////////////////////////////////////////////////////////
216//
217// Returns hadron-nucleon Xsc according to PDG parametrisation (2005):
218// http://pdg.lbl.gov/2006/reviews/hadronicrpp.pdf
219// At = number of nucleons, Zt = number of protons
220
221G4double
222G4HadronNucleonXsc::GetHadronNucleonXscPDG(const G4DynamicParticle* aParticle,
223 const G4ParticleDefinition* nucleon )
224{
225 G4double xsection(0);
226 G4int Zt=1, Nt=1, At=1;
227
228 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
229
230 G4double proj_mass = aParticle->GetMass();
231 G4double proj_momentum = aParticle->GetMomentum().mag();
232
233 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
234
235 sMand /= GeV*GeV; // in GeV for parametrisation
236
237 // General PDG fit constants
238
239 G4double s0 = 5.38*5.38; // in Gev^2
240 G4double eta1 = 0.458;
241 G4double eta2 = 0.458;
242 G4double B = 0.308;
243
244
245 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
246
247 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
248 G4bool proton = (nucleon == theProton);
249 G4bool neutron = (nucleon == theNeutron);
250
251
252 if(theParticle == theNeutron) // proton-neutron fit
253 {
254 if ( proton )
255 {
256 xsection = Zt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
257 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));// on p
258 }
259 if ( neutron )
260 {
261 xsection = Nt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
262 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // on n pp for nn
263 }
264 }
265 else if(theParticle == theProton)
266 {
267 if ( proton )
268 {
269 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
270 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
271 }
272 if ( neutron )
273 {
274 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
275 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
276 }
277 }
278 else if(theParticle == theAProton)
279 {
280 if ( proton )
281 {
282 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
283 + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
284 }
285 if ( neutron )
286 {
287 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
288 + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
289 }
290 }
291 else if(theParticle == thePiPlus && pORn )
292 {
293 xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
294 + 19.24*std::pow(sMand,-eta1) - 6.03*std::pow(sMand,-eta2));
295 }
296 else if(theParticle == thePiMinus && pORn )
297 {
298 xsection = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.)
299 + 19.24*std::pow(sMand,-eta1) + 6.03*std::pow(sMand,-eta2));
300 }
301 else if(theParticle == theKPlus)
302 {
303 if ( proton )
304 {
305 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
306 + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
307 }
308 if ( neutron )
309 {
310 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
311 + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
312 }
313 }
314 else if(theParticle == theKMinus)
315 {
316 if ( proton )
317 {
318 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
319 + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
320 }
321 if ( neutron )
322 {
323 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
324 + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2) );
325 }
326 }
327 else if(theParticle == theSMinus && pORn )
328 {
329 xsection = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.)
330 - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2) );
331 }
332 else if(theParticle == theGamma && pORn ) // modify later on
333 {
334 xsection = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.)
335 + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2) );
336
337 }
338 else // as proton ???
339 {
340 if ( proton )
341 {
342 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
343 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2) );
344 }
345 if ( neutron )
346 {
347 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
348 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
349 }
350 }
351 xsection *= millibarn; // parametrised in mb
352
353 fTotalXsc = xsection;
354 fInelasticXsc = 0.83*xsection;
355 fElasticXsc = fTotalXsc - fInelasticXsc;
356 if (fElasticXsc < 0.)fElasticXsc = 0.;
357
358 return xsection;
359}
360
361
362
363/////////////////////////////////////////////////////////////////////////////////////
364//
365// Returns hadron-nucleon cross-section based on N. Starkov parametrisation of
366// data from mainly http://wwwppds.ihep.su:8001/c5-6A.html database
367
368G4double
369G4HadronNucleonXsc::GetHadronNucleonXscNS(const G4DynamicParticle* aParticle,
370 const G4ParticleDefinition* nucleon )
371{
372 G4double xsection(0), Delta, A0, B0;
373 G4int Zt=1, Nt=1, At=1;
374 G4double hpXsc(0);
375 G4double hnXsc(0);
376
377
378 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ???
379
380 G4double proj_mass = aParticle->GetMass();
381 G4double proj_energy = aParticle->GetTotalEnergy();
382 G4double proj_momentum = aParticle->GetMomentum().mag();
383
384 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
385
386 sMand /= GeV*GeV; // in GeV for parametrisation
387 proj_momentum /= GeV;
388 proj_energy /= GeV;
389 proj_mass /= GeV;
390
391 // General PDG fit constants
392
393 G4double s0 = 5.38*5.38; // in Gev^2
394 G4double eta1 = 0.458;
395 G4double eta2 = 0.458;
396 G4double B = 0.308;
397
398
399 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
400
401 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
402 G4bool proton = (nucleon == theProton);
403 G4bool neutron = (nucleon == theNeutron);
404
405 if( theParticle == theNeutron && pORn)
406 {
407 if( proj_momentum >= 10.)
408 // if( proj_momentum >= 2.)
409 {
410 Delta = 1.;
411
412 if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy;
413
414 if(proj_momentum >= 10.)
415 {
416 B0 = 7.5;
417 A0 = 100. - B0*std::log(3.0e7);
418
419 xsection = A0 + B0*std::log(proj_energy) - 11
420 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
421 0.93827*0.93827,-0.165); // mb
422 }
423 fTotalXsc = xsection;
424 }
425 else
426 {
427 // nn to be pp
428
429 if(neutron)
430 {
431 if( proj_momentum < 0.73 )
432 {
433 hnXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
434 }
435 else if( proj_momentum < 1.05 )
436 {
437 hnXsc = 23 + 40*(std::log(proj_momentum/0.73))*
438 (std::log(proj_momentum/0.73));
439 }
440 else // if( proj_momentum < 10. )
441 {
442 hnXsc = 39.0+
443 75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
444 }
445 fTotalXsc = hnXsc;
446 }
447 // pn to be np
448
449 if(proton)
450 {
451 if( proj_momentum < 0.8 )
452 {
453 hpXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
454 }
455 else if( proj_momentum < 1.4 )
456 {
457 hpXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
458 }
459 else // if( proj_momentum < 10. )
460 {
461 hpXsc = 33.3+
462 20.8*(std::pow(proj_momentum,2.0)-1.35)/
463 (std::pow(proj_momentum,2.50)+0.95);
464 }
465 fTotalXsc = hpXsc;
466 }
467 // xsection = hpXsc*Zt + hnXsc*Nt;
468 }
469 }
470 else if(theParticle == theProton && pORn)
471 {
472 if( proj_momentum >= 10.)
473 // if( proj_momentum >= 2.)
474 {
475 Delta = 1.;
476
477 if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy;
478
479 if(proj_momentum >= 10.)
480 {
481 B0 = 7.5;
482 A0 = 100. - B0*std::log(3.0e7);
483
484 xsection = A0 + B0*std::log(proj_energy) - 11
485 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
486 0.93827*0.93827,-0.165); // mb
487 }
488 fTotalXsc = xsection;
489 }
490 else
491 {
492 // pp
493
494 if(proton)
495 {
496 if( proj_momentum < 0.73 )
497 {
498 hpXsc = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
499 }
500 else if( proj_momentum < 1.05 )
501 {
502 hpXsc = 23 + 40*(std::log(proj_momentum/0.73))*
503 (std::log(proj_momentum/0.73));
504 }
505 else // if( proj_momentum < 10. )
506 {
507 hpXsc = 39.0+
508 75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
509 }
510 fTotalXsc = hpXsc;
511 }
512 // pn to be np
513
514 if(neutron)
515 {
516 if( proj_momentum < 0.8 )
517 {
518 hnXsc = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
519 }
520 else if( proj_momentum < 1.4 )
521 {
522 hnXsc = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
523 }
524 else // if( proj_momentum < 10. )
525 {
526 hnXsc = 33.3+
527 20.8*(std::pow(proj_momentum,2.0)-1.35)/
528 (std::pow(proj_momentum,2.50)+0.95);
529 }
530 fTotalXsc = hnXsc;
531 }
532 // xsection = hpXsc*Zt + hnXsc*Nt;
533 // xsection = hpXsc*(Zt + Nt);
534 // xsection = hnXsc*(Zt + Nt);
535 }
536 // xsection *= 0.95;
537 }
538 else if(theParticle == theAProton && pORn)
539 {
540 if(proton)
541 {
542 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
543 + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
544 }
545 if(proton)
546 {
547 xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
548 + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
549 }
550 fTotalXsc = xsection;
551 }
552 else if(theParticle == thePiPlus && pORn)
553 {
554 if(proton)
555 {
556 if(proj_momentum < 0.4)
557 {
558 G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
559 hpXsc = Ex3+20.0;
560 }
561 else if(proj_momentum < 1.15)
562 {
563 G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
564 hpXsc = Ex4+14.0;
565 }
566 else if(proj_momentum < 3.5)
567 {
568 G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
569 G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
570 hpXsc = Ex1+Ex2+27.5;
571 }
572 else // if(proj_momentum > 3.5) // mb
573 {
574 hpXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
575 }
576 fTotalXsc = hpXsc;
577 }
578
579// pi+n = pi-p??
580
581 if(neutron)
582 {
583 if(proj_momentum < 0.37)
584 {
585 hnXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
586 }
587 else if(proj_momentum<0.65)
588 {
589 hnXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
590 }
591 else if(proj_momentum<1.3)
592 {
593 hnXsc = 36.1+
594 10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
595 24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
596 }
597 else if(proj_momentum<3.0)
598 {
599 hnXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
600 3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
601 1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
602 }
603 else // mb
604 {
605 hnXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
606 }
607 fTotalXsc = hnXsc;
608 }
609 // xsection = hpXsc*Zt + hnXsc*Nt;
610 }
611 else if(theParticle == thePiMinus && pORn)
612 {
613 // pi-n = pi+p??
614
615 if(neutron)
616 {
617 if(proj_momentum < 0.4)
618 {
619 G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085);
620 hnXsc = Ex3+20.0;
621 }
622 else if(proj_momentum < 1.15)
623 {
624 G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75));
625 hnXsc = Ex4+14.0;
626 }
627 else if(proj_momentum < 3.5)
628 {
629 G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55);
630 G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225);
631 hnXsc = Ex1+Ex2+27.5;
632 }
633 else // if(proj_momentum > 3.5) // mb
634 {
635 hnXsc = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43);
636 }
637 fTotalXsc = hnXsc;
638 }
639 // pi-p
640
641 if(proton)
642 {
643 if(proj_momentum < 0.37)
644 {
645 hpXsc = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07);
646 }
647 else if(proj_momentum<0.65)
648 {
649 hpXsc = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48));
650 }
651 else if(proj_momentum<1.3)
652 {
653 hpXsc = 36.1+
654 10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+
655 24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075);
656 }
657 else if(proj_momentum<3.0)
658 {
659 hpXsc = 36.1+0.079-4.313*std::log(proj_momentum)+
660 3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+
661 1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12);
662 }
663 else // mb
664 {
665 hpXsc = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43);
666 }
667 fTotalXsc = hpXsc;
668 }
669 // xsection = hpXsc*Zt + hnXsc*Nt;
670 }
671 else if(theParticle == theKPlus && pORn)
672 {
673 if(proton)
674 {
675 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
676 + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
677 }
678 if(neutron)
679 {
680 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
681 + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
682 }
683 fTotalXsc = xsection;
684 }
685 else if(theParticle == theKMinus && pORn)
686 {
687 if(proton)
688 {
689 xsection = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.)
690 + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
691 }
692 if(neutron)
693 {
694 xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.)
695 + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2));
696 }
697 fTotalXsc = xsection;
698 }
699 else if(theParticle == theSMinus && pORn)
700 {
701 xsection = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.)
702 - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2));
703 }
704 else if(theParticle == theGamma && pORn) // modify later on
705 {
706 xsection = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.)
707 + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2));
708 fTotalXsc = xsection;
709 }
710 else // as proton ???
711 {
712 if(proton)
713 {
714 xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.)
715 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
716 }
717 if(neutron)
718 {
719 xsection += Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.)
720 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
721 }
722 fTotalXsc = xsection;
723 }
724 fTotalXsc *= millibarn; // parametrised in mb
725 // xsection *= millibarn; // parametrised in mb
726
727 fInelasticXsc = 0.83*fTotalXsc;
728 fElasticXsc = fTotalXsc - fInelasticXsc;
729 if (fElasticXsc < 0.)fElasticXsc = 0.;
730
731 return fTotalXsc;
732}
733
734/////////////////////////////////////////////////////////////////////////////////////
735//
736// Returns hadron-nucleon cross-section based on V. Uzjinsky parametrisation of
737// data from G4FTFCrossSection class
738
739G4double
740G4HadronNucleonXsc::GetHadronNucleonXscVU(const G4DynamicParticle* aParticle,
741 const G4ParticleDefinition* nucleon )
742{
743 G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
744 G4int absPDGcode = std::abs(PDGcode);
745 G4double Elab = aParticle->GetTotalEnergy();
746 // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
747 G4double Plab = aParticle->GetMomentum().mag();
748 // std::sqrt(Elab * Elab - 0.88);
749
750 Elab /= GeV;
751 Plab /= GeV;
752
753 G4double LogPlab = std::log( Plab );
754 G4double sqrLogPlab = LogPlab * LogPlab;
755
756 G4bool pORn = (nucleon == theProton || nucleon == theNeutron );
757 G4bool proton = (nucleon == theProton);
758 G4bool neutron = (nucleon == theNeutron);
759
760
761
762
763 if( absPDGcode > 1000 && pORn ) //------Projectile is baryon -
764 {
765 if(proton)
766 {
767 fTotalXsc = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
768 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
769 }
770 if(neutron)
771 {
772 fTotalXsc = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
773 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
774 }
775 }
776 else if( PDGcode == 211 && pORn ) //------Projectile is PionPlus ----
777 {
778 if(proton)
779 {
780 fTotalXsc = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
781 fElasticXsc = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
782 }
783 if(neutron)
784 {
785 fTotalXsc = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
786 fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
787 }
788 }
789 else if( PDGcode == -211 && pORn ) //------Projectile is PionMinus ----
790 {
791 if(proton)
792 {
793 fTotalXsc = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
794 fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
795 }
796 if(neutron)
797 {
798 fTotalXsc = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
799 fElasticXsc = 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
800 }
801 }
802 else if( PDGcode == 111 && pORn ) //------Projectile is PionZero --
803 {
804 if(proton)
805 {
806 fTotalXsc = (16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab + //Pi+
807 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab)/2; //Pi-
808
809 fElasticXsc = ( 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab + //Pi+
810 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
811
812 }
813 if(neutron)
814 {
815 fTotalXsc = (33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab + //Pi+
816 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
817 fElasticXsc = ( 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab + //Pi+
818 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
819 }
820 }
821 else if( PDGcode == 321 && pORn ) //------Projectile is KaonPlus --
822 {
823 if(proton)
824 {
825 fTotalXsc = 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab;
826 fElasticXsc = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab;
827 }
828 if(neutron)
829 {
830 fTotalXsc = 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab;
831 fElasticXsc = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab;
832 }
833 }
834 else if( PDGcode ==-321 && pORn ) //------Projectile is KaonMinus ----
835 {
836 if(proton)
837 {
838 fTotalXsc = 32.1 + 0. *std::pow(Plab, 0. ) + 0.66*sqrLogPlab - 5.6*LogPlab;
839 fElasticXsc = 7.3 + 0. *std::pow(Plab,-0. ) + 0.29*sqrLogPlab - 2.4*LogPlab;
840 }
841 if(neutron)
842 {
843 fTotalXsc = 25.2 + 0. *std::pow(Plab, 0. ) + 0.38*sqrLogPlab - 2.9*LogPlab;
844 fElasticXsc = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16*sqrLogPlab - 1.3*LogPlab;
845 }
846 }
847 else if( PDGcode == 311 && pORn ) //------Projectile is KaonZero -----
848 {
849 if(proton)
850 {
851 fTotalXsc = ( 18.1 + 0. *std::pow(Plab, 0. ) + 0.26 *sqrLogPlab - 1.0 *LogPlab + //K+
852 32.1 + 0. *std::pow(Plab, 0. ) + 0.66 *sqrLogPlab - 5.6 *LogPlab)/2; //K-
853 fElasticXsc = ( 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab + //K+
854 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab)/2; //K-
855 }
856 if(neutron)
857 {
858 fTotalXsc = ( 18.7 + 0. *std::pow(Plab, 0. ) + 0.21 *sqrLogPlab - 0.89*LogPlab + //K+
859 25.2 + 0. *std::pow(Plab, 0. ) + 0.38 *sqrLogPlab - 2.9 *LogPlab)/2; //K-
860 fElasticXsc = ( 7.3 + 0. *std::pow(Plab,-0. ) + 0.29 *sqrLogPlab - 2.4 *LogPlab + //K+
861 5.0 + 8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab)/2; //K-
862 }
863 }
864 else //------Projectile is undefined, Nucleon assumed
865 {
866 if(proton)
867 {
868 fTotalXsc = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
869 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
870 }
871 if(neutron)
872 {
873 fTotalXsc = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
874 fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
875 }
876 }
877 fTotalXsc *= millibarn;
878 fElasticXsc *= millibarn;
879 fInelasticXsc = fTotalXsc - fElasticXsc;
880 if (fInelasticXsc < 0.) fInelasticXsc = 0.;
881
882 return fTotalXsc;
883}
884
885/////////////////////////////////////////////////////////////////////////////////////
886//
887// Returns hadron-nucleon cross-section based on Mikhail Kossov parametrisation of
888// data from G4QuasiFreeRatios class
889
890G4double
891G4HadronNucleonXsc::GetHadronNucleonXscMK(const G4DynamicParticle* aParticle,
892 const G4ParticleDefinition* nucleon )
893{
894 G4int I = -1;
895 G4int PDG = aParticle->GetDefinition()->GetPDGEncoding();
896
897 // G4int absPDG = std::abs(PDG);
898
899 G4double p = aParticle->GetMomentum().mag()/GeV;
900
901 G4bool F = false;
902 if(nucleon == theProton) F = true;
903 else if(nucleon == theNeutron) F = false;
904 else
905 {
906 G4cout << "nucleon is not proton or neutron, return xsc for proton" << G4endl;
907 F = true;
908 }
909
910 G4bool kfl = true; // Flag of K0/aK0 oscillation
911 G4bool kf = false;
912
913 if( PDG == 130 || PDG == 310 )
914 {
915 kf = true;
916 if( G4UniformRand() > .5 ) kfl = false;
917 }
918 if ( (PDG == 2212 && F) || (PDG == 2112 && !F) ) I = 0; // pp/nn
919 else if( (PDG == 2112 && F) || (PDG == 2212 && !F) ) I = 1; // np/pn
920
921 else if( (PDG == -211 && F) || (PDG == 211 && !F) ) I = 2; // pimp/pipn
922 else if( (PDG == 211 && F) || (PDG ==-211 && !F) ) I = 3; // pipp/pimn
923
924 else if( PDG == -321 || PDG == -311 || ( kf && !kfl ) ) I = 4; // KmN/K0N
925 else if( PDG == 321 || PDG == 311 || ( kf && kfl ) ) I = 5; // KpN/aK0N
926
927 else if( PDG > 3000 && PDG < 3335) I = 6; // @@ for all hyperons - take Lambda
928 else if( PDG < -2000 && PDG > -3335) I = 7; // @@ for all anti-baryons - anti-p/anti-n
929 else
930 {
931 G4cout<<"MK PDG = "<<PDG
932 <<", while it is defined only for p,n,hyperons,anti-baryons,pi,K/antiK"<<G4endl;
933 G4Exception("G4QuasiFreeRatio::FetchElTot:","22",FatalException,"CHIPScrash");
934 }
935
936 // Each parameter set can have not more than nPoints = 128 parameters
937
938 static const G4double lmi = 3.5; // min of (lnP-lmi)^2 parabola
939 static const G4double pbe = .0557; // elastic (lnP-lmi)^2 parabola coefficient
940 static const G4double pbt = .3; // total (lnP-lmi)^2 parabola coefficient
941 static const G4double pmi = .1; // Below that fast LE calculation is made
942 static const G4double pma = 1000.; // Above that fast HE calculation is made
943
944 if( p <= 0.)
945 {
946 G4cout<<" p = "<<p<<" is zero or negative"<<G4endl;
947
948 fElasticXsc = 0.;
949 fInelasticXsc = 0.;
950 fTotalXsc = 0.;
951
952 return fTotalXsc;
953 }
954 if (!I) // pp/nn
955 {
956 if( p < pmi )
957 {
958 G4double p2 = p*p;
959 fElasticXsc = 1./(.00012 + p2*.2);
960 fTotalXsc = fElasticXsc;
961 }
962 else if(p>pma)
963 {
964 G4double lp = std::log(p)-lmi;
965 G4double lp2 = lp*lp;
966 fElasticXsc = pbe*lp2 + 6.72;
967 fTotalXsc = pbt*lp2 + 38.2;
968 }
969 else
970 {
971 G4double p2 = p*p;
972 G4double LE = 1./( .00012 + p2*.2);
973 G4double lp = std::log(p) - lmi;
974 G4double lp2 = lp*lp;
975 G4double rp2 = 1./p2;
976 fElasticXsc = LE + ( pbe*lp2 + 6.72+32.6/p)/( 1. + rp2/p);
977 fTotalXsc = LE + ( pbt*lp2 + 38.2+52.7*rp2)/( 1. + 2.72*rp2*rp2);
978 }
979 }
980 else if( I==1 ) // np/pn
981 {
982 if( p < pmi )
983 {
984 G4double p2 = p*p;
985 fElasticXsc = 1./( .00012 + p2*( .051 + .1*p2));
986 fTotalXsc = fElasticXsc;
987 }
988 else if( p > pma )
989 {
990 G4double lp = std::log(p) - lmi;
991 G4double lp2 = lp*lp;
992 fElasticXsc = pbe*lp2 + 6.72;
993 fTotalXsc = pbt*lp2 + 38.2;
994 }
995 else
996 {
997 G4double p2 = p*p;
998 G4double LE = 1./( .00012 + p2*( .051 + .1*p2 ) );
999 G4double lp = std::log(p) - lmi;
1000 G4double lp2 = lp*lp;
1001 G4double rp2 = 1./p2;
1002 fElasticXsc = LE + (pbe*lp2 + 6.72 + 30./p)/( 1. + .49*rp2/p);
1003 fTotalXsc = LE + (pbt*lp2 + 38.2)/( 1. + .54*rp2*rp2);
1004 }
1005 }
1006 else if( I == 2 ) // pimp/pipn
1007 {
1008 G4double lp = std::log(p);
1009
1010 if(p<pmi)
1011 {
1012 G4double lr = lp + 1.27;
1013 fElasticXsc = 1.53/( lr*lr + .0676);
1014 fTotalXsc = fElasticXsc*3;
1015 }
1016 else if( p > pma )
1017 {
1018 G4double ld = lp - lmi;
1019 G4double ld2 = ld*ld;
1020 G4double sp = std::sqrt(p);
1021 fElasticXsc = pbe*ld2 + 2.4 + 7./sp;
1022 fTotalXsc = pbt*ld2 + 22.3 + 12./sp;
1023 }
1024 else
1025 {
1026 G4double lr = lp + 1.27;
1027 G4double LE = 1.53/( lr*lr + .0676);
1028 G4double ld = lp - lmi;
1029 G4double ld2 = ld*ld;
1030 G4double p2 = p*p;
1031 G4double p4 = p2*p2;
1032 G4double sp = std::sqrt(p);
1033 G4double lm = lp + .36;
1034 G4double md = lm*lm + .04;
1035 G4double lh = lp - .017;
1036 G4double hd = lh*lh + .0025;
1037 fElasticXsc = LE + (pbe*ld2 + 2.4 + 7./sp)/( 1. + .7/p4) + .6/md + .05/hd;
1038 fTotalXsc = LE*3 + (pbt*ld2 + 22.3 + 12./sp)/(1. + .4/p4) + 1./md + .06/hd;
1039 }
1040 }
1041 else if( I == 3 ) // pipp/pimn
1042 {
1043 G4double lp = std::log(p);
1044
1045 if( p < pmi )
1046 {
1047 G4double lr = lp + 1.27;
1048 G4double lr2 = lr*lr;
1049 fElasticXsc = 13./( lr2 + lr2*lr2 + .0676);
1050 fTotalXsc = fElasticXsc;
1051 }
1052 else if( p > pma )
1053 {
1054 G4double ld = lp - lmi;
1055 G4double ld2 = ld*ld;
1056 G4double sp = std::sqrt(p);
1057 fElasticXsc = pbe*ld2 + 2.4 + 6./sp;
1058 fTotalXsc = pbt*ld2 + 22.3 + 5./sp;
1059 }
1060 else
1061 {
1062 G4double lr = lp + 1.27;
1063 G4double lr2 = lr*lr;
1064 G4double LE = 13./(lr2 + lr2*lr2 + .0676);
1065 G4double ld = lp - lmi;
1066 G4double ld2 = ld*ld;
1067 G4double p2 = p*p;
1068 G4double p4 = p2*p2;
1069 G4double sp = std::sqrt(p);
1070 G4double lm = lp - .32;
1071 G4double md = lm*lm + .0576;
1072 fElasticXsc = LE + (pbe*ld2 + 2.4 + 6./sp)/(1. + 3./p4) + .7/md;
1073 fTotalXsc = LE + (pbt*ld2 + 22.3 + 5./sp)/(1. + 1./p4) + .8/md;
1074 }
1075 }
1076 else if( I == 4 ) // Kmp/Kmn/K0p/K0n
1077 {
1078 if( p < pmi)
1079 {
1080 G4double psp = p*std::sqrt(p);
1081 fElasticXsc = 5.2/psp;
1082 fTotalXsc = 14./psp;
1083 }
1084 else if( p > pma )
1085 {
1086 G4double ld = std::log(p) - lmi;
1087 G4double ld2 = ld*ld;
1088 fElasticXsc = pbe*ld2 + 2.23;
1089 fTotalXsc = pbt*ld2 + 19.5;
1090 }
1091 else
1092 {
1093 G4double ld = std::log(p) - lmi;
1094 G4double ld2 = ld*ld;
1095 G4double sp = std::sqrt(p);
1096 G4double psp = p*sp;
1097 G4double p2 = p*p;
1098 G4double p4 = p2*p2;
1099 G4double lm = p - .39;
1100 G4double md = lm*lm + .000156;
1101 G4double lh = p - 1.;
1102 G4double hd = lh*lh + .0156;
1103 fElasticXsc = 5.2/psp + (pbe*ld2 + 2.23)/(1. - .7/sp + .075/p4) + .004/md + .15/hd;
1104 fTotalXsc = 14./psp + (pbt*ld2 + 19.5)/(1. - .21/sp + .52/p4) + .006/md + .30/hd;
1105 }
1106 }
1107 else if( I == 5 ) // Kpp/Kpn/aKp/aKn
1108 {
1109 if( p < pmi )
1110 {
1111 G4double lr = p - .38;
1112 G4double lm = p - 1.;
1113 G4double md = lm*lm + .372;
1114 fElasticXsc = .7/(lr*lr + .0676) + 2./md;
1115 fTotalXsc = fElasticXsc + .6/md;
1116 }
1117 else if( p > pma )
1118 {
1119 G4double ld = std::log(p) - lmi;
1120 G4double ld2 = ld*ld;
1121 fElasticXsc = pbe*ld2 + 2.23;
1122 fTotalXsc = pbt*ld2 + 19.5;
1123 }
1124 else
1125 {
1126 G4double ld = std::log(p) - lmi;
1127 G4double ld2 = ld*ld;
1128 G4double lr = p - .38;
1129 G4double LE = .7/(lr*lr + .0676);
1130 G4double sp = std::sqrt(p);
1131 G4double p2 = p*p;
1132 G4double p4 = p2*p2;
1133 G4double lm = p - 1.;
1134 G4double md = lm*lm + .372;
1135 fElasticXsc = LE + (pbe*ld2 + 2.23)/(1. - .7/sp + .1/p4) + 2./md;
1136 fTotalXsc = LE + (pbt*ld2 + 19.5)/(1. + .46/sp + 1.6/p4) + 2.6/md;
1137 }
1138 }
1139 else if( I == 6 ) // hyperon-N
1140 {
1141 if( p < pmi )
1142 {
1143 G4double p2 = p*p;
1144 fElasticXsc = 1./(.002 + p2*(.12 + p2));
1145 fTotalXsc = fElasticXsc;
1146 }
1147 else if( p > pma )
1148 {
1149 G4double lp = std::log(p) - lmi;
1150 G4double lp2 = lp*lp;
1151 G4double sp = std::sqrt(p);
1152 fElasticXsc = (pbe*lp2 + 6.72)/(1. + 2./sp);
1153 fTotalXsc = (pbt*lp2 + 38.2 + 900./sp)/(1. + 27./sp);
1154 }
1155 else
1156 {
1157 G4double p2 = p*p;
1158 G4double LE = 1./(.002 + p2*(.12 + p2));
1159 G4double lp = std::log(p) - lmi;
1160 G4double lp2 = lp*lp;
1161 G4double p4 = p2*p2;
1162 G4double sp = std::sqrt(p);
1163 fElasticXsc = LE + (pbe*lp2 + 6.72 + 99./p2)/(1. + 2./sp + 2./p4);
1164 fTotalXsc = LE + (pbt*lp2 + 38.2 + 900./sp)/(1. + 27./sp + 3./p4);
1165 }
1166 }
1167 else if( I == 7 ) // antibaryon-N
1168 {
1169 if( p > pma )
1170 {
1171 G4double lp = std::log(p) - lmi;
1172 G4double lp2 = lp*lp;
1173 fElasticXsc = pbe*lp2 + 6.72;
1174 fTotalXsc = pbt*lp2 + 38.2;
1175 }
1176 else
1177 {
1178 G4double ye = std::pow(p, 1.25);
1179 G4double yt = std::pow(p, .35);
1180 G4double lp = std::log(p) - lmi;
1181 G4double lp2 = lp*lp;
1182 fElasticXsc = 80./(ye + 1.) + pbe*lp2 + 6.72;
1183 fTotalXsc = (80./yt + .3)/yt +pbt*lp2 + 38.2;
1184 }
1185 }
1186 else
1187 {
1188 G4cout<<"PDG incoding = "<<I<<" is not defined (0-7)"<<G4endl;
1189
1190 }
1191 if( fElasticXsc > fTotalXsc ) fElasticXsc = fTotalXsc;
1192
1193 fTotalXsc *= millibarn;
1194 fElasticXsc *= millibarn;
1195 fInelasticXsc = fTotalXsc - fElasticXsc;
1196 if (fInelasticXsc < 0.) fInelasticXsc = 0.;
1197
1198
1199 return fTotalXsc;
1200}
1201
1202
1203
1204
1205
1206////////////////////////////////////////////////////////////////////////////////////
1207//
1208//
1209
1210G4double G4HadronNucleonXsc::CalculateEcmValue( const G4double mp ,
1211 const G4double mt ,
1212 const G4double Plab )
1213{
1214 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
1215 G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
1216 // G4double Pcm = Plab * mt / Ecm;
1217 // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
1218
1219 return Ecm ; // KEcm;
1220}
1221
1222
1223////////////////////////////////////////////////////////////////////////////////////
1224//
1225//
1226
1227G4double G4HadronNucleonXsc::CalcMandelstamS( const G4double mp ,
1228 const G4double mt ,
1229 const G4double Plab )
1230{
1231 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
1232 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
1233
1234 return sMand;
1235}
1236
1237
1238//
1239//
1240///////////////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.