Geant4-11
G4HadronNucleonXsc.cc
Go to the documentation of this file.
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// 14.03.07 V. Grichine - first implementation
27//
28// 04.09.18 V. Ivantchenko Major revision of interfaces and implementation
29// 30.09.18 V. Grichine hyperon-nucleon xsc first implementation
30
31#include "G4HadronNucleonXsc.hh"
32#include "G4Element.hh"
33#include "G4Proton.hh"
34#include "G4Nucleus.hh"
36#include "G4SystemOfUnits.hh"
37#include "G4ParticleTable.hh"
38#include "G4IonTable.hh"
39#include "G4HadTmpUtil.hh"
40#include "G4Log.hh"
41#include "G4Exp.hh"
42#include "G4Pow.hh"
43#include "G4NuclearRadii.hh"
44
45#include "G4Neutron.hh"
46#include "G4PionPlus.hh"
47#include "G4KaonPlus.hh"
48#include "G4KaonMinus.hh"
49#include "G4KaonZeroShort.hh"
50#include "G4KaonZeroLong.hh"
51
52static const G4double invGeV = 1.0/CLHEP::GeV;
54// PDG fit constants
55static const G4double minLogP = 3.5; // min of (lnP-minLogP)^2
56static const G4double cofLogE = .0557; // elastic (lnP-minLogP)^2
57static const G4double cofLogT = .3; // total (lnP-minLogP)^2
58static const G4double pMin = .1; // fast LE calculation
59static const G4double pMax = 1000.; // fast HE calculation
60static const G4double ekinmin = 0.1*CLHEP::MeV; // protection against zero ekin
61static const G4double ekinmaxQB = 100*CLHEP::MeV; // max kinetic energy for Coulomb barrier
62
64 : fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0)
65{
69
70 // strange
75
77}
78
80{}
81
82void G4HadronNucleonXsc::CrossSectionDescription(std::ostream& outFile) const
83{
84 outFile << "G4HadronNucleonXsc calculates the total, inelastic and elastic\n"
85 << "hadron-nucleon cross sections using several different\n"
86 << "parameterizations within the Glauber-Gribov approach. It is\n"
87 << "valid for all incident gammas and long-lived hadrons at\n"
88 << "energies above 30 keV. This is a cross section component which\n"
89 << "is to be used to build a cross section data set.\n";
90}
91
94{
95 G4double xsc(0.);
96 G4int pdg = std::abs(theParticle->GetPDGEncoding());
97
98 // p, n, pi+-, pbar, nbar
99 if ( pdg == 2212 || pdg == 2112 || pdg == 211 ) {
100 xsc = HadronNucleonXscNS(theParticle, nucleon, ekin);
101 }
102 else if ( pdg == 22 ) // gamma
103 {
104 xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
105 }
106 else if ( pdg == 321 || pdg == 310 || pdg == 130 ) // K+-, K0L, K0S
107 {
108 xsc = KaonNucleonXscNS(theParticle, nucleon, ekin);
109 }
110 else if (pdg > 3000)
111 {
112 if (pdg == 3122 || pdg == 3222 || pdg == 3112 || pdg == 3212 || pdg == 3322 || pdg == 3312 || pdg == 3324 ||
113 pdg == 4122 || pdg == 4332 || pdg == 4122 || pdg == 4212 || pdg == 4222 || pdg == 4112 || pdg == 4232 || pdg == 4132 ||
114 pdg == 5122 || pdg == 5332 || pdg == 5122 || pdg == 5112 || pdg == 5222 || pdg == 5212 || pdg == 5132 || pdg == 5232
115 ) // heavy s-,c-,b-hyperons
116 {
117 xsc = HyperonNucleonXscNS(theParticle, nucleon, ekin);
118 }
119 else
120 {
121 xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
122 }
123 } else if (pdg > 220) {
124 if (pdg == 511 || pdg == 421 || pdg == 531 || pdg == 541 || pdg == 431 || pdg == 411 || pdg == 521 ||
125 pdg == 221 || pdg == 331 || pdg == 441 || pdg == 443 || pdg == 543) // s-,c-,b-mesons
126 {
127 xsc = SCBMesonNucleonXscNS(theParticle, nucleon, ekin);
128 }
129 else
130 {
131 xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
132 }
133 } else {
134 xsc = HadronNucleonXscPDG(theParticle, nucleon, ekin);
135 }
136 return xsc;
137}
138
140//
141// Returns hadron-nucleon Xsc according to PDG parametrisation (2017):
142// http://pdg.lbl.gov/2017/reviews/hadronicrpp.pdf
143
145 const G4ParticleDefinition* theParticle,
147{
148 static const G4double M = 2.1206; // in Gev
149 static const G4double eta1 = 0.4473;
150 static const G4double eta2 = 0.5486;
151 static const G4double H = 0.272;
152
153 G4int pdg = theParticle->GetPDGEncoding();
154
155 G4double mass1 = (pdg == 22) ? 770. : theParticle->GetPDGMass();
156 G4double mass2 = nucleon->GetPDGMass();
157
158 G4double sMand = CalcMandelstamS(ekin, mass1, mass2)*invGeV2;
159 G4double x = (mass1 + mass2)*invGeV + M;
160 G4double blog = G4Log(sMand/(x*x));
161
162 G4double P(0.0), R1(0.0), R2(0.0), del(1.0);
163
166
167 if(theParticle == theNeutron)
168 {
169 if ( proton )
170 {
171 P = 34.71;
172 R1 = 12.52;
173 R2 = -6.66;
174 }
175 else
176 {
177 P = 34.41;
178 R1 = 13.07;
179 R2 = -7.394;
180 }
181 }
182 else if(theParticle == theProton)
183 {
184 if ( neutron )
185 {
186 P = 34.71;
187 R1 = 12.52;
188 R2 = -6.66;
189 }
190 else
191 {
192 P = 34.41;
193 R1 = 13.07;
194 R2 = -7.394;
195 }
196 }
197 // pbar
198 else if(pdg == -2212)
199 {
200 if ( neutron )
201 {
202 P = 34.71;
203 R1 = 12.52;
204 R2 = 6.66;
205 }
206 else
207 {
208 P = 34.41;
209 R1 = 13.07;
210 R2 = 7.394;
211 }
212 }
213 // nbar
214 else if(pdg == -2112)
215 {
216 if ( proton )
217 {
218 P = 34.71;
219 R1 = 12.52;
220 R2 = 6.66;
221 }
222 else
223 {
224 P = 34.41;
225 R1 = 13.07;
226 R2 = 7.394;
227 }
228 }
229 // pi+
230 else if(pdg == 211)
231 {
232 P = 18.75;
233 R1 = 9.56;
234 R2 = -1.767;
235 }
236 // pi-
237 else if(pdg == -211)
238 {
239 P = 18.75;
240 R1 = 9.56;
241 R2 = 1.767;
242 }
243 else if(theParticle == theKPlus)
244 {
245 if ( proton )
246 {
247 P = 16.36;
248 R1 = 4.29;
249 R2 = -3.408;
250 }
251 else
252 {
253 P = 16.31;
254 R1 = 3.7;
255 R2 = -1.826;
256 }
257 }
258 else if(theParticle == theKMinus)
259 {
260 if ( proton )
261 {
262 P = 16.36;
263 R1 = 4.29;
264 R2 = 3.408;
265 }
266 else
267 {
268 P = 16.31;
269 R1 = 3.7;
270 R2 = 1.826;
271 }
272 }
273 else if(theParticle == theK0S || theParticle == theK0L)
274 {
275 P = 16.36;
276 R1 = 2.5;
277 R2 = 0.;
278 }
279 // sigma-
280 else if(pdg == 3112)
281 {
282 P = 34.7;
283 R1 = -46.;
284 R2 = 48.;
285 }
286 // gamma
287 else if(pdg == 22) // modify later on
288 {
289 del= 0.003063;
290 P = 34.71*del;
291 R1 = (neutron) ? 0.0231 : 0.0139;
292 R2 = 0.;
293 }
294 else // as proton ???
295 {
296 if ( neutron )
297 {
298 P = 34.71;
299 R1 = 12.52;
300 R2 = -6.66;
301 }
302 else
303 {
304 P = 34.41;
305 R1 = 13.07;
306 R2 = -7.394;
307 }
308 }
310 (del*(H*blog*blog + P) + R1*G4Exp(-eta1*blog) + R2*G4Exp(-eta2*blog));
313
314 if( proton && theParticle->GetPDGCharge() > 0. && ekin < ekinmaxQB )
315 {
316 G4double cB = CoulombBarrier(theParticle, nucleon, ekin);
317 fTotalXsc *= cB;
318 fElasticXsc *= cB;
319 fInelasticXsc *= cB;
320 }
321 /*
322 G4cout << "## HadronNucleonXscPDG: ekin(MeV)= " << ekin
323 << " tot= " << fTotalXsc/CLHEP::millibarn
324 << " inel= " << fInelasticXsc/CLHEP::millibarn
325 << " el= " << fElasticXsc/CLHEP::millibarn
326 << G4endl;
327 */
328 return fTotalXsc;
329}
330
332//
333// Returns hadron-nucleon cross-section based on N. Starkov parametrisation of
334// data from mainly http://wwwppds.ihep.su:8001/c5-6A.html database
335
337 const G4ParticleDefinition* theParticle,
339{
340 const G4double ekin = std::max(ekin0, ekinmin);
341 G4int pdg = theParticle->GetPDGEncoding();
342 /*
343 G4cout<< "HadronNucleonXscNS: Ekin(GeV)= " << ekin/GeV << " "
344 << theParticle->GetParticleName() << " + "
345 << nucleon->GetParticleName() << G4endl;
346 */
347 if(pdg == -2212 || pdg == -2112) {
348 return HadronNucleonXscPDG(theParticle, nucleon, ekin);
349 }
350
351 G4double pM = theParticle->GetPDGMass();
352 G4double tM = nucleon->GetPDGMass();
353 G4double pE = ekin + pM;
354 G4double pLab = std::sqrt(ekin*(ekin + 2*pM));
355
356 G4double sMand = CalcMandelstamS(ekin, pM, tM)*invGeV2;
357
358 pLab *= invGeV;
359 pE *= invGeV;
360
361 if(pLab >= 10.) {
363 } else { fTotalXsc = 0.0; }
364 fElasticXsc = 0.0;
365 //G4cout << "Stot(mb)= " << fTotalXsc << " pLab= " << pLab
366 // << " Smand= " << sMand <<G4endl;
367 G4double logP = G4Log(pLab);
368
371
372 if( theParticle == theNeutron)
373 {
374 if( pLab >= 373.)
375 {
376 fElasticXsc = 6.5 + 0.308*G4Exp(G4Log(G4Log(sMand/400.)*1.65))
377 + 9.19*G4Exp(-G4Log(sMand)*0.458);
378 }
379 else if( pLab >= 100.)
380 {
381 fElasticXsc = 5.53 + 0.308*G4Exp(G4Log(G4Log(sMand/28.9))*1.1)
382 + 9.19*G4Exp(-G4Log(sMand)*0.458);
383 }
384 else if( pLab >= 10.)
385 {
386 fElasticXsc = 6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
387 }
388 else // pLab < 10 GeV/c
389 {
390 if( neutron ) // nn to be pp
391 {
392 G4double x = G4Log(pLab/0.73);
393 if( pLab < 0.4 )
394 {
395 fTotalXsc = 23 + 50*std::sqrt(g4calc->powN(-x, 7));
397 }
398 else if( pLab < 0.73 )
399 {
400 fTotalXsc = 23 + 50*std::sqrt(g4calc->powN(-x, 7));
402 }
403 else if( pLab < 1.05 )
404 {
405 fTotalXsc = 23 + 40*x*x;
406 fElasticXsc = 23 + 20*x*x;
407 }
408 else // 1.05 - 10 GeV/c
409 {
410 fTotalXsc = 39.0+75*(pLab - 1.2)/(g4calc->powN(pLab,3) + 0.15);
411 fElasticXsc = 6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
412 }
413 }
414 if( proton ) // pn to be np
415 {
416 if( pLab < 0.02 )
417 {
418 fTotalXsc = 4100+30*G4Exp(G4Log(G4Log(1.3/pLab))*3.6);
420 }
421 else if( pLab < 0.8 )
422 {
423 fTotalXsc = 33+30*g4calc->powN(G4Log(pLab/1.3),4);
425 }
426 else if( pLab < 1.4 )
427 {
428 fTotalXsc = 33+30*g4calc->powN(G4Log(pLab/0.95),2);
429 G4double x = G4Log(0.511/pLab);
430 fElasticXsc = 6 + 52/( x*x + 1.6 );
431 }
432 else // 1.4 < pLab < 10. )
433 {
434 fTotalXsc = 33.3 + 20.8*(pLab*pLab - 1.35)
435 /(std::sqrt(g4calc->powN(pLab,5)) + 0.95);
436 fElasticXsc = 6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
437 }
438 }
439 }
440 }
442 else if(theParticle == theProton)
443 {
444 if( pLab >= 373.) // pdg due to TOTEM data
445 {
446 fElasticXsc = 6.5 + 0.308*G4Exp(G4Log(G4Log(sMand/400.))*1.65)
447 + 9.19*G4Exp(-G4Log(sMand)*0.458);
448 }
449 else if( pLab >= 100.)
450 {
451 fElasticXsc = 5.53 + 0.308*G4Exp(G4Log(G4Log(sMand/28.9))*1.1)
452 + 9.19*G4Exp(-G4Log(sMand)*0.458);
453 }
454 else if( pLab >= 10.)
455 {
456 fElasticXsc = 6. + 20./( (logP-0.182)*(logP-0.182) + 1.0 );
457 }
458 else
459 {
460 // pp
461 if( proton )
462 {
463 if( pLab < 0.73 )
464 {
465 fTotalXsc = 23 + 50*std::sqrt(g4calc->powN(G4Log(0.73/pLab),7));
467 }
468 else if( pLab < 1.05 )
469 {
470 G4double x = G4Log(pLab/0.73);
471 fTotalXsc = 23 + 40*x*x;
472 fElasticXsc = 23 + 20*x*x;
473 }
474 else // 1.05 - 10 GeV/c
475 {
476 fTotalXsc = 39.0+75*(pLab - 1.2)/(g4calc->powN(pLab,3) + 0.15);
477 fElasticXsc = 6. + 20./( (logP-0.182)*(logP-0.182) + 1.0 );
478 }
479 }
480 else if( neutron ) // pn to be np
481 {
482 if( pLab < 0.02 )
483 {
484 fTotalXsc = 4100+30*G4Exp(G4Log(G4Log(1.3/pLab))*3.6);
486 }
487 else if( pLab < 0.8 )
488 {
489 fTotalXsc = 33+30*g4calc->powN(G4Log(pLab/1.3),4);
491 }
492 else if( pLab < 1.4 )
493 {
494 G4double x1 = G4Log(pLab/0.95);
495 G4double x2 = G4Log(0.511/pLab);
496 fTotalXsc = 33+30*x1*x1;
497 fElasticXsc = 6 + 52/(x2*x2 + 1.6);
498 }
499 else // 1.4 < pLab < 10. )
500 {
501 fTotalXsc = 33.3 + 20.8*(pLab*pLab - 1.35)
502 /(std::sqrt(g4calc->powN(pLab,5)) + 0.95);
503 fElasticXsc = 6. + 20./( (logP-0.182)*(logP-0.182) + 1.0 );
504 }
505 }
506 }
507 }
508 // pi+ p; pi- n
509 else if((pdg == 211 && proton) || (pdg == -211 && neutron))
510 {
511 if( pLab < 0.28 )
512 {
513 fTotalXsc = 10./((logP + 1.273)*(logP + 1.273) + 0.05);
515 }
516 else if( pLab < 0.68 )
517 {
518 fTotalXsc = 14./((logP + 1.273)*(logP + 1.273) + 0.07);
520 }
521 else if( pLab < 0.85 )
522 {
523 G4double x = G4Log(pLab/0.77);
524 fTotalXsc = 88.*x*x + 14.9;
525 fElasticXsc = fTotalXsc*G4Exp(-3.*(pLab - 0.68));
526 }
527 else if( pLab < 1.15 )
528 {
529 G4double x = G4Log(pLab/0.77);
530 fTotalXsc = 88.*x*x + 14.9;
531 fElasticXsc = 6.0 + 1.4/(( pLab - 1.4)*( pLab - 1.4) + 0.1);
532 }
533 else if( pLab < 1.4) // ns original
534 {
535 G4double Ex1 = 3.2*G4Exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
536 G4double Ex2 = 12*G4Exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
537 fTotalXsc = Ex1 + Ex2 + 27.5;
538 fElasticXsc = 6.0 + 1.4/(( pLab - 1.4)*( pLab - 1.4) + 0.1);
539 }
540 else if( pLab < 2.0 ) // ns original
541 {
542 G4double Ex1 = 3.2*G4Exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
543 G4double Ex2 = 12*G4Exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
544 fTotalXsc = Ex1 + Ex2 + 27.5;
545 fElasticXsc = 3.0 + 1.36/( (logP - 0.336)*(logP - 0.336) + 0.08);
546 }
547 else if( pLab < 3.5 ) // ns original
548 {
549 G4double Ex1 = 3.2*G4Exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
550 G4double Ex2 = 12*G4Exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
551 fTotalXsc = Ex1 + Ex2 + 27.5;
552 fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);
553 }
554 else if( pLab < 10. ) // my
555 {
556 fTotalXsc = 10.6 + 2.*G4Log(pE) + 25*G4Exp(-G4Log(pE)*0.43 );
557 fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);
558 }
559 else // pLab > 10 // my
560 {
561 fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);
562 }
563 }
564 // pi+ n; pi- p
565 else if((pdg == 211 && neutron) || (pdg == -211 && proton))
566 {
567 if( pLab < 0.28 )
568 {
569 fTotalXsc = 0.288/((pLab - 0.28)*(pLab - 0.28) + 0.004);
570 fElasticXsc = 1.8/((logP + 1.273)*(logP + 1.273) + 0.07);
571 }
572 else if( pLab < 0.395676 ) // first peak
573 {
574 fTotalXsc = 0.648/((pLab - 0.28)*(pLab - 0.28) + 0.009);
575 fElasticXsc = 0.257/((pLab - 0.28)*(pLab - 0.28) + 0.01);
576 }
577 else if( pLab < 0.5 )
578 {
579 G4double y = G4Log(pLab/0.48);
580 fTotalXsc = 26 + 110*y*y;
581 fElasticXsc = 0.37*fTotalXsc;
582 }
583 else if( pLab < 0.65 )
584 {
585 G4double x = G4Log(pLab/0.48);
586 fTotalXsc = 26. + 110.*x*x;
587 fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
588 }
589 else if( pLab < 0.72 )
590 {
591 fTotalXsc = 36.1 + 10*G4Exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
592 24*G4Exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
593 fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
594 }
595 else if( pLab < 0.88 )
596 {
597 fTotalXsc = 36.1 + 10.*G4Exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
598 24*G4Exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
599 fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
600 }
601 else if( pLab < 1.03 )
602 {
603 fTotalXsc = 36.1 + 10.*G4Exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
604 24*G4Exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
605 fElasticXsc = 2.0 + 0.4/((pLab - 1.03)*(pLab - 1.03) + 0.016);
606 }
607 else if( pLab < 1.15 )
608 {
609 fTotalXsc = 36.1 + 10.*G4Exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
610 24*G4Exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
611 fElasticXsc = 2.0 + 0.4/((pLab - 1.03)*(pLab - 1.03) + 0.016);
612 }
613 else if( pLab < 1.3 )
614 {
615 fTotalXsc = 36.1 + 10.*G4Exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
616 24*G4Exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
617 fElasticXsc = 3. + 13./pLab;
618 }
619 else if( pLab < 10.) // < 3.0) // ns original
620 {
621 fTotalXsc = 36.1 + 0.079-4.313*logP+
622 3*G4Exp(-(pLab-2.1)*(pLab-2.1)/0.4/0.4)+
623 1.5*G4Exp(-(pLab-1.4)*(pLab-1.4)/0.12/0.12);
624 fElasticXsc = 3. + 13./pLab;
625 }
626 else // mb
627 {
628 fElasticXsc = 3. + 13./pLab;
629 }
630 }
631 else if( (theParticle == theKMinus) && proton ) // K-p
632 {
633 if( pLab < pMin)
634 {
635 G4double psp = pLab*std::sqrt(pLab);
636 fElasticXsc = 5.2/psp;
637 fTotalXsc = 14./psp;
638 }
639 else if( pLab > pMax )
640 {
641 G4double ld = logP - minLogP;
642 G4double ld2 = ld*ld;
643 fElasticXsc = cofLogE*ld2 + 2.23;
644 fTotalXsc = 1.1*cofLogT*ld2 + 19.7;
645 }
646 else
647 {
648 G4double ld = logP - minLogP;
649 G4double ld2 = ld*ld;
650 G4double sp = std::sqrt(pLab);
651 G4double psp = pLab*sp;
652 G4double p2 = pLab*pLab;
653 G4double p4 = p2*p2;
654
655 G4double lh = pLab - 1.01;
656 G4double hd = lh*lh + .011;
657
658 G4double lm = pLab - .39;
659 G4double md = lm*lm + .000356;
660 G4double lh1 = pLab - 0.78;
661 G4double hd1 = lh1*lh1 + .00166;
662 G4double lh2 = pLab - 1.63;
663 G4double hd2 = lh2*lh2 + .007;
664
665 // small peaks were added but commented out now
666 fElasticXsc = 5.2/psp + (1.1*cofLogE*ld2 + 2.23)/(1. - .7/sp + .075/p4)
667 + .004/md + 0.005/hd1+ 0.01/hd2 +.15/hd;
668
669 fTotalXsc = 14./psp + (1.1*cofLogT*ld2 + 19.5)/(1. - .21/sp + .52/p4)
670 + .006/md + 0.01/hd1+ 0.02/hd2 + .20/hd ;
671 }
672 }
673 else if( (theParticle == theKMinus) && neutron ) // K-n
674 {
675 if( pLab > pMax )
676 {
677 G4double ld = logP - minLogP;
678 G4double ld2 = ld*ld;
679 fElasticXsc = cofLogE*ld2 + 2.23;
680 fTotalXsc = 1.1*cofLogT*ld2 + 19.7;
681 }
682 else
683 {
684 G4double lh = pLab - 0.98;
685 G4double hd = lh*lh + .021;
686 G4double sqrLogPlab = logP*logP;
687
688 fElasticXsc = 5.0 + 8.1*G4Exp(-logP*1.8) + 0.16*sqrLogPlab
689 - 1.3*logP + .15/hd;
690 fTotalXsc = 25.2 + 0.38*sqrLogPlab - 2.9*logP + 0.30/hd;
691 }
692 }
693 else if( (theParticle == theKPlus) && proton ) // K+p
694 {
695 // VI: modified low-energy part
696 if( pLab < 0.631 )
697 {
698 fElasticXsc = fTotalXsc = 12.03;
699 }
700 else if( pLab > pMax )
701 {
702 G4double ld = logP - minLogP;
703 G4double ld2 = ld*ld;
704 fElasticXsc = cofLogE*ld2 + 2.23;
705 fTotalXsc = cofLogT*ld2 + 19.2;
706 }
707 else
708 {
709 G4double ld = logP - minLogP;
710 G4double ld2 = ld*ld;
711 G4double lr = pLab - .38;
712 G4double LE = .7/(lr*lr + .076);
713 G4double sp = std::sqrt(pLab);
714 G4double p2 = pLab*pLab;
715 G4double p4 = p2*p2;
716 // VI: tuned elastic
717 fElasticXsc = LE + (cofLogE*ld2 + 2.23)/(1. - .7/sp + .1/p4)
718 + 2./((pLab - 0.8)*(pLab - 0.8) + 0.652);
719 fTotalXsc = LE + (cofLogT*ld2 + 19.5)/(1. + .46/sp + 1.6/p4)
720 + 2.6/((pLab - 1.)*(pLab - 1.) + 0.392);
721 }
722 }
723 else if( (theParticle == theKPlus) && neutron) // K+n
724 {
725 if( pLab < pMin )
726 {
727 G4double lm = pLab - 0.94;
728 G4double md = lm*lm + .392;
729 fElasticXsc = 2./md;
730 fTotalXsc = 4.6/md;
731 }
732 else if( pLab > pMax )
733 {
734 G4double ld = logP - minLogP;
735 G4double ld2 = ld*ld;
736 fElasticXsc = cofLogE*ld2 + 2.23;
737 fTotalXsc = cofLogT*ld2 + 19.2;
738 }
739 else
740 {
741 G4double ld = logP - minLogP;
742 G4double ld2 = ld*ld;
743 G4double sp = std::sqrt(pLab);
744 G4double p2 = pLab*pLab;
745 G4double p4 = p2*p2;
746 G4double lm = pLab - 0.94;
747 G4double md = lm*lm + .392;
748 fElasticXsc = (cofLogE*ld2 + 2.23)/(1. - .7/sp + .1/p4) + 2./md;
749 fTotalXsc = (cofLogT*ld2 + 19.5)/(1. + .46/sp + 1.6/p4) + 4.6/md;
750 }
751 }
755
756 if( proton && theParticle->GetPDGCharge() > 0. && ekin < ekinmaxQB )
757 {
758 G4double cB = G4NuclearRadii::CoulombFactor(theParticle, nucleon, ekin);
759 fTotalXsc *= cB;
760 fElasticXsc *= cB;
761 }
763 /*
764 G4cout<< "HNXsc: Ekin(GeV)= " << ekin/GeV << "; tot(mb)= " << fTotalXsc/millibarn
765 <<"; el(mb)= " <<fElasticXsc/millibarn
766 <<"; inel(mb)= " <<fInelasticXsc/millibarn<<" "
767 << theParticle->GetParticleName() << " + "
768 << nucleon->GetParticleName() << G4endl;
769 */
770 return fTotalXsc;
771}
772
774//
775// Returns kaon-nucleon cross-section based on smoothed NS
776// tuned for the Glauber-Gribov hadron model for Z>1
777
779 const G4ParticleDefinition* theParticle,
781{
783 if(theParticle == theKMinus || theParticle == theKPlus) {
784 KaonNucleonXscVG(theParticle, nucleon, ekin);
785
786 } else if(theParticle == theK0S || theParticle == theK0L) {
788 G4double sel = fElasticXsc;
789 G4double sinel = fInelasticXsc;
790 stot += KaonNucleonXscVG(theKPlus, nucleon, ekin);
791 sel += fElasticXsc;
792 sinel += fInelasticXsc;
793 fTotalXsc = stot*0.5;
794 fElasticXsc = sel*0.5;
795 fInelasticXsc = sinel*0.5;
796 }
797 return fTotalXsc;
798}
799
801//
802// Returns kaon-nucleon cross-section using NS
803
805 const G4ParticleDefinition* theParticle,
807{
809 if(theParticle == theKMinus || theParticle == theKPlus) {
810 HadronNucleonXscNS(theParticle, nucleon, ekin);
811
812 } else if(theParticle == theK0S || theParticle == theK0L) {
813 G4double fact = 0.5;
814 G4double stot = 0.0;
815 G4double sel = 0.0;
816 G4double sinel= 0.0;
817 if(ekin > ekinmaxQB) {
818 stot = HadronNucleonXscNS(theKMinus, nucleon, ekin);
819 sel = fElasticXsc;
820 sinel = fInelasticXsc;
821 stot += HadronNucleonXscNS(theKPlus, nucleon, ekin);
822 sel += fElasticXsc;
823 sinel += fInelasticXsc;
824 } else {
825 fact *= std::sqrt(ekinmaxQB/std::max(ekin, ekinmin));
827 sel = fElasticXsc;
828 sinel = fInelasticXsc;
830 sel += fElasticXsc;
831 sinel += fInelasticXsc;
832 }
833 fTotalXsc = stot*fact;
834 fElasticXsc = sel*fact;
835 fInelasticXsc = sinel*fact;
836 }
837 return fTotalXsc;
838}
839
841//
842// Returns kaon-nucleon cross-section with smoothed NS parameterisation
843
845 const G4ParticleDefinition* theParticle,
847{
848 G4double pM = theParticle->GetPDGMass();
849 G4double pLab = std::sqrt(ekin*(ekin + 2*pM));
850
851 pLab *= invGeV;
852 G4double logP = G4Log(pLab);
853
854 fTotalXsc = 0.0;
855
858
859 if( (theParticle == theKMinus) && proton ) // K-p
860 {
861 if( pLab < pMin)
862 {
863 G4double psp = pLab*std::sqrt(pLab);
864 fElasticXsc = 5.2/psp;
865 fTotalXsc = 14./psp;
866 }
867 else if( pLab > pMax )
868 {
869 G4double ld = logP - minLogP;
870 G4double ld2 = ld*ld;
871 fElasticXsc = cofLogE*ld2 + 2.23;
872 fTotalXsc = 1.1*cofLogT*ld2 + 19.7;
873 }
874 else
875 {
876 G4double ld = logP - minLogP;
877 G4double ld2 = ld*ld;
878 G4double sp = std::sqrt(pLab);
879 G4double psp = pLab*sp;
880 G4double p2 = pLab*pLab;
881 G4double p4 = p2*p2;
882
883 G4double lh = pLab - 1.01;
884 G4double hd = lh*lh + .011;
885 fElasticXsc = 5.2/psp + (cofLogE*ld2 + 2.23)/(1. - .7/sp + .075/p4) + .15/hd;
886 fTotalXsc = 14./psp + (1.1*cofLogT*ld2 + 19.5)/(1. - .21/sp + .52/p4) + .60/hd;
887 }
888 }
889 else if( (theParticle == theKMinus) && neutron ) // K-n
890 {
891 if( pLab > pMax )
892 {
893 G4double ld = logP - minLogP;
894 G4double ld2 = ld*ld;
895 fElasticXsc = cofLogE*ld2 + 2.23;
896 fTotalXsc = 1.1*cofLogT*ld2 + 19.7;
897 }
898 else
899 {
900 G4double lh = pLab - 0.98;
901 G4double hd = lh*lh + .045; // vg version
902 G4double sqrLogPlab = logP*logP;
903
904 fElasticXsc = 5.0 + 8.1*G4Exp(-logP*1.8) + 0.16*sqrLogPlab
905 - 1.3*logP + .15/hd;
906 fTotalXsc = 25.2 + 0.38*sqrLogPlab - 2.9*logP + 0.60/hd; // vg version
907 }
908 }
909 else if( (theParticle == theKPlus) && proton ) // K+p
910 {
911 // VI: modified low-energy part
912 if( pLab < 0.631 )
913 {
914 fElasticXsc = fTotalXsc = 12.03;
915 }
916 else if( pLab > pMax )
917 {
918 G4double ld = logP - minLogP;
919 G4double ld2 = ld*ld;
920 fElasticXsc = cofLogE*ld2 + 2.23;
921 fTotalXsc = cofLogT*ld2 + 19.2;
922 }
923 else
924 {
925 G4double ld = logP - minLogP;
926 G4double ld2 = ld*ld;
927 G4double lr = pLab - .38;
928 G4double LE = .7/(lr*lr + .076);
929 G4double sp = std::sqrt(pLab);
930 G4double p2 = pLab*pLab;
931 G4double p4 = p2*p2;
932 // VI: tuned elastic
933 fElasticXsc = LE + (cofLogE*ld2 + 2.23)/(1. - .7/sp + .1/p4)
934 + 2./((pLab - 0.8)*(pLab - 0.8) + 0.652);
935 fTotalXsc = LE + (cofLogT*ld2 + 19.5)/(1. + .46/sp + 1.6/p4)
936 + 2.6/((pLab - 1.)*(pLab - 1.) + 0.392);
937 }
938 }
939 else if( (theParticle == theKPlus) && neutron) // K+n
940 {
941 if( pLab < pMin )
942 {
943 G4double lm = pLab - 0.94;
944 G4double md = lm*lm + .392;
945 fElasticXsc = 2./md;
946 fTotalXsc = 4.6/md;
947 }
948 else if( pLab > pMax )
949 {
950 G4double ld = logP - minLogP;
951 G4double ld2 = ld*ld;
952 fElasticXsc = cofLogE*ld2 + 2.23;
953 fTotalXsc = cofLogT*ld2 + 19.2;
954 }
955 else
956 {
957 G4double ld = logP - minLogP;
958 G4double ld2 = ld*ld;
959 G4double sp = std::sqrt(pLab);
960 G4double p2 = pLab*pLab;
961 G4double p4 = p2*p2;
962 G4double lm = pLab - 0.94;
963 G4double md = lm*lm + .392;
964 fElasticXsc = (cofLogE*ld2 + 2.23)/(1. - .7/sp + .1/p4) + 2./md;
965 fTotalXsc = (cofLogT*ld2 + 19.5)/(1. + .46/sp + 1.6/p4) + 4.6/md;
966 }
967 }
968
971
972 if( proton && theParticle->GetPDGCharge() > 0. )
973 {
974 G4double cB = G4NuclearRadii::CoulombFactor(theParticle, nucleon, ekin);
975 fTotalXsc *= cB;
976 fElasticXsc *= cB;
977 }
980 /*
981 G4cout << "HNXscVG: E= " << ekin << " " << theParticle->GetParticleName()
982 << " P: " << proton << " xtot(b)= " << fTotalXsc/barn
983 << " xel(b)= " << fElasticXsc/barn << " xinel(b)= " << fInelasticXsc/barn
984 << G4endl;
985 */
986 return fTotalXsc;
987}
988
990//
991// Returns hyperon-nucleon cross-section using NS x-section for protons
992
994 const G4ParticleDefinition* theParticle,
996{
997 G4double coeff = 1.0;
998 G4int pdg = std::abs(theParticle->GetPDGEncoding());
999
1000 // lambda, sigma+-0 and anti-hyperons
1001 if( pdg == 3122 || pdg == 3112 || pdg == 3212 || pdg == 3222 )
1002 {
1003 coeff = 0.88;
1004 }
1005 // Xi hyperons and anti-hyperons
1006 else if( pdg == 3312 || pdg == 3322 )
1007 {
1008 coeff = 0.76;
1009 }
1010 // omega, anti_omega
1011 else if( pdg == 3334 )
1012 {
1013 coeff = 0.64;
1014 }
1015 // lambdaC, sigmaC+-0 and anti-hyperonsC
1016 else if( pdg == 4122 || pdg == 4112 || pdg == 4212 || pdg == 4222 )
1017 {
1018 coeff = 0.784378;
1019 }
1020 // omegaC0, anti_omegaC0
1021 else if( pdg == 4332 )
1022 {
1023 coeff = 0.544378;
1024 }
1025 // XiC+0 and anti-hyperonC
1026 else if( pdg == 4132 || pdg == 4232 )
1027 {
1028 coeff = 0.664378;
1029 }
1030 // lambdaB, sigmaB+-0 and anti-hyperonsB
1031 else if( pdg == 5122 || pdg == 5112 || pdg == 5212 || pdg == 5222 )
1032 {
1033 coeff = 0.740659;
1034 }
1035 // omegaB0, anti_omegaB0
1036 else if( pdg == 5332 )
1037 {
1038 coeff = 0.500659;
1039 }
1040 // XiB+0 and anti-hyperonB
1041 else if( pdg == 5132 || pdg == 5232 )
1042 {
1043 coeff = 0.620659;
1044 }
1046 fInelasticXsc *= coeff;
1047 fElasticXsc *= coeff;
1048
1049 return fTotalXsc;
1050}
1051
1053//
1054// Returns hyperon-nucleon cross-section using NS x-section for protons
1055
1057 const G4ParticleDefinition* theParticle,
1059{
1060 G4double coeff(1.0);
1061 G4int pdg = std::abs(theParticle->GetPDGEncoding());
1062
1063 // B+-0 anti
1064 if( pdg == 511 || pdg == 521 )
1065 {
1066 coeff = 0.610989;
1067 }
1068 // D+-0 anti
1069 else if( pdg == 411 || pdg == 421 )
1070 {
1071 coeff = 0.676568;
1072 }
1073 // Bs, antiBs
1074 else if( pdg == 531 )
1075 {
1076 coeff = 0.430989;
1077 }
1078 // Bc+-
1079 else if( pdg == 541 )
1080 {
1081 coeff = 0.287557;
1082 }
1083 // Ds+-
1084 else if( pdg == 431 )
1085 {
1086 coeff = 0.496568;
1087 }
1088 // etaC, J/Psi
1089 else if( pdg == 441 || pdg == 443 )
1090 {
1091 coeff = 0.353135;
1092 }
1093 // Upsilon
1094 else if( pdg == 553 )
1095 {
1096 coeff = 0.221978;
1097 }
1098 // eta
1099 else if( pdg == 221 )
1100 {
1101 coeff = 0.76;
1102 }
1103 // eta'
1104 else if( pdg == 331 )
1105 {
1106 coeff = 0.88;
1107 }
1109 fElasticXsc *= coeff;
1110 fInelasticXsc *= coeff;
1111 return fTotalXsc;
1112}
1114//
1115// Returns hadron-nucleon cross-section based on V. Uzjinsky parametrisation of
1116// data from G4FTFCrossSection class
1117
1119 const G4ParticleDefinition* theParticle,
1121{
1122 G4int PDGcode = theParticle->GetPDGEncoding();
1123 G4int absPDGcode = std::abs(PDGcode);
1124 G4double mass = theParticle->GetPDGMass();
1125 G4double Plab = std::sqrt(ekin*(ekin + 2.*mass))*invGeV;
1126
1127 G4double logPlab = G4Log( Plab );
1128 G4double sqrLogPlab = logPlab * logPlab;
1129
1132
1133 if( absPDGcode > 1000) //------Projectile is baryon -
1134 {
1135 if(proton)
1136 {
1137 fTotalXsc = 48.0 + 0.522*sqrLogPlab - 4.51*logPlab;
1138 fElasticXsc = 11.9 + 26.9*G4Exp(-logPlab*1.21) + 0.169*sqrLogPlab - 1.85*logPlab;
1139 }
1140 if(neutron)
1141 {
1142 fTotalXsc = 47.3 + 0.513*sqrLogPlab - 4.27*logPlab;
1143 fElasticXsc = 11.9 + 26.9*G4Exp(-logPlab*1.21) + 0.169*sqrLogPlab - 1.85*logPlab;
1144 }
1145 }
1146 else if( PDGcode == 211) //------Projectile is PionPlus ----
1147 {
1148 if(proton)
1149 {
1150 fTotalXsc = 16.4 + 19.3 *G4Exp(-logPlab*0.42) + 0.19 *sqrLogPlab - 0.0 *logPlab;
1151 fElasticXsc = 0.0 + 11.4*G4Exp(-logPlab*0.40) + 0.079*sqrLogPlab - 0.0 *logPlab;
1152 }
1153 if(neutron)
1154 {
1155 fTotalXsc = 33.0 + 14.0 *G4Exp(-logPlab*1.36) + 0.456*sqrLogPlab - 4.03*logPlab;
1156 fElasticXsc = 1.76 + 11.2*G4Exp(-logPlab*0.64) + 0.043*sqrLogPlab - 0.0 *logPlab;
1157 }
1158 }
1159 else if( PDGcode == -211) //------Projectile is PionMinus ----
1160 {
1161 if(proton)
1162 {
1163 fTotalXsc = 33.0 + 14.0 *G4Exp(-logPlab*1.36) + 0.456*sqrLogPlab - 4.03*logPlab;
1164 fElasticXsc = 1.76 + 11.2*G4Exp(-logPlab*0.64) + 0.043*sqrLogPlab - 0.0 *logPlab;
1165 }
1166 if(neutron)
1167 {
1168 fTotalXsc = 16.4 + 19.3 *G4Exp(-logPlab*0.42) + 0.19 *sqrLogPlab - 0.0 *logPlab;
1169 fElasticXsc = 0.0 + 11.4*G4Exp(-logPlab*0.40) + 0.079*sqrLogPlab - 0.0 *logPlab;
1170 }
1171 }
1172 else if( PDGcode == 111) //------Projectile is PionZero --
1173 {
1174 if(proton)
1175 {
1176 fTotalXsc = (16.4 + 19.3 *G4Exp(-logPlab*0.42) + 0.19 *sqrLogPlab - 0.0 *logPlab + //Pi+
1177 33.0 + 14.0 *G4Exp(-logPlab*1.36) + 0.456*sqrLogPlab - 4.03*logPlab)/2; //Pi-
1178
1179 fElasticXsc = (0.0 + 11.4*G4Exp(-logPlab*0.40) + 0.079*sqrLogPlab - 0.0 *logPlab + //Pi+
1180 1.76 + 11.2*G4Exp(-logPlab*0.64) + 0.043*sqrLogPlab - 0.0 *logPlab)/2;//Pi-
1181
1182 }
1183 if(neutron)
1184 {
1185 fTotalXsc = (33.0 + 14.0 *G4Exp(-logPlab*1.36) + 0.456*sqrLogPlab - 4.03*logPlab + //Pi+
1186 16.4 + 19.3 *G4Exp(-logPlab*0.42) + 0.19 *sqrLogPlab - 0.0 *logPlab)/2; //Pi-
1187 fElasticXsc = (1.76 + 11.2*G4Exp(-logPlab*0.64) + 0.043*sqrLogPlab - 0.0 *logPlab + //Pi+
1188 0.0 + 11.4*G4Exp(-logPlab*0.40) + 0.079*sqrLogPlab - 0.0 *logPlab)/2;//Pi-
1189 }
1190 }
1191 else if( PDGcode == 321 ) //------Projectile is KaonPlus --
1192 {
1193 if(proton)
1194 {
1195 fTotalXsc = 18.1 + 0.26 *sqrLogPlab - 1.0 *logPlab;
1196 fElasticXsc = 5.0 + 8.1*G4Exp(-logPlab*1.8 ) + 0.16 *sqrLogPlab - 1.3 *logPlab;
1197 }
1198 if(neutron)
1199 {
1200 fTotalXsc = 18.7 + 0.21 *sqrLogPlab - 0.89*logPlab;
1201 fElasticXsc = 7.3 + 0.29 *sqrLogPlab - 2.4 *logPlab;
1202 }
1203 }
1204 else if( PDGcode ==-321 ) //------Projectile is KaonMinus ----
1205 {
1206 if(proton)
1207 {
1208 fTotalXsc = 32.1 + 0.66*sqrLogPlab - 5.6*logPlab;
1209 fElasticXsc = 7.3 + 0.29*sqrLogPlab - 2.4*logPlab;
1210 }
1211 if(neutron)
1212 {
1213 fTotalXsc = 25.2 + 0.38*sqrLogPlab - 2.9*logPlab;
1214 fElasticXsc = 5.0 + 8.1*G4Exp(-logPlab*1.8 ) + 0.16*sqrLogPlab - 1.3*logPlab;
1215 }
1216 }
1217 else if( PDGcode == 311 ) //------Projectile is KaonZero -----
1218 {
1219 if(proton)
1220 {
1221 fTotalXsc = ( 18.1 + 0.26 *sqrLogPlab - 1.0 *logPlab + //K+
1222 32.1 + 0.66 *sqrLogPlab - 5.6 *logPlab)/2; //K-
1223 fElasticXsc = ( 5.0 + 8.1*G4Exp(-logPlab*1.8 ) + 0.16 *sqrLogPlab - 1.3 *logPlab + //K+
1224 7.3 + 0.29 *sqrLogPlab - 2.4 *logPlab)/2; //K-
1225 }
1226 if(neutron)
1227 {
1228 fTotalXsc = ( 18.7 + 0.21 *sqrLogPlab - 0.89*logPlab + //K+
1229 25.2 + 0.38 *sqrLogPlab - 2.9 *logPlab)/2; //K-
1230 fElasticXsc = ( 7.3 + 0.29 *sqrLogPlab - 2.4 *logPlab + //K+
1231 5.0 + 8.1*G4Exp(-logPlab*1.8 ) + 0.16 *sqrLogPlab - 1.3 *logPlab)/2; //K-
1232 }
1233 }
1234 else //------Projectile is undefined, Nucleon assumed
1235 {
1236 if(proton)
1237 {
1238 fTotalXsc = 48.0 + 0.522*sqrLogPlab - 4.51*logPlab;
1239 fElasticXsc = 11.9 + 26.9*G4Exp(-logPlab*1.21) + 0.169*sqrLogPlab - 1.85*logPlab;
1240 }
1241 if(neutron)
1242 {
1243 fTotalXsc = 47.3 + 0.513*sqrLogPlab - 4.27*logPlab;
1244 fElasticXsc = 11.9 + 26.9*G4Exp(-logPlab*1.21) + 0.169*sqrLogPlab - 1.85*logPlab;
1245 }
1246 }
1247
1252
1253 return fTotalXsc;
1254}
1255
1257//
1258// Returns hadron-nucleon Xsc according to different parametrisations:
1259// [2] E. Levin, hep-ph/9710546
1260// [3] U. Dersch, et al, hep-ex/9910052
1261// [4] M.J. Longo, et al, Phys.Rev.Lett. 33 (1974) 725
1262
1264 const G4ParticleDefinition* theParticle,
1265 const G4ParticleDefinition*, G4double ekin)
1266{
1267 G4int pdg = theParticle->GetPDGEncoding();
1268 G4double xsection(0.);
1269 static const G4double targ_mass =
1271 G4double sMand =
1272 CalcMandelstamS(ekin, theParticle->GetPDGMass(), targ_mass)*invGeV2;
1273
1274 G4double x1 = G4Exp(G4Log(sMand)*0.0808);
1275 G4double x2 = G4Exp(G4Log(-sMand)*0.4525);
1276
1277 if(pdg == 22)
1278 {
1279 xsection = 0.0677*x1 + 0.129*x2;
1280 }
1281 else if(theParticle == theNeutron)
1282 {
1283 xsection = 21.70*x1 + 56.08*x2;
1284 }
1285 else if(theParticle == theProton)
1286 {
1287 xsection = 21.70*x1 + 56.08*x2;
1288 }
1289 // pbar
1290 else if(pdg == -2212)
1291 {
1292 xsection = 21.70*x1 + 98.39*x2;
1293 }
1294 else if(theParticle == thePiPlus)
1295 {
1296 xsection = 13.63*x1 + 27.56*x2;
1297 }
1298 // pi-
1299 else if(pdg == -211)
1300 {
1301 xsection = 13.63*x1 + 36.02*x2;
1302 }
1303 else if(theParticle == theKPlus)
1304 {
1305 xsection = 11.82*x1 + 8.15*x2;
1306 }
1307 else if(theParticle == theKMinus)
1308 {
1309 xsection = 11.82*x1 + 26.36*x2;
1310 }
1311 else if(theParticle == theK0S || theParticle == theK0L)
1312 {
1313 xsection = 11.82*x1 + 17.25*x2;
1314 }
1315 else
1316 {
1317 xsection = 21.70*x1 + 56.08*x2;
1318 }
1319 fTotalXsc = xsection*CLHEP::millibarn;
1320 fInelasticXsc = 0.83*fTotalXsc;
1322 return fTotalXsc;
1323}
1324
1326
1327G4double
1330 G4double ekin)
1331{
1332 G4double tR = 0.895*CLHEP::fermi;
1333 G4double pR = 0.5*CLHEP::fermi;
1334
1335 if ( theParticle == theProton ) pR = 0.895*CLHEP::fermi;
1336 else if( theParticle == thePiPlus ) pR = 0.663*CLHEP::fermi;
1337 else if( theParticle == theKPlus ) pR = 0.340*CLHEP::fermi;
1338
1339 G4double pZ = theParticle->GetPDGCharge();
1340 G4double tZ = nucleon->GetPDGCharge();
1341
1342 G4double pM = theParticle->GetPDGMass();
1343 G4double tM = nucleon->GetPDGMass();
1344
1345 G4double pElab = ekin + pM;
1346
1347 G4double totEcm = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
1348
1349 G4double totTcm = totEcm - pM -tM;
1350
1351 G4double bC = fine_structure_const*hbarc*pZ*tZ/(2.*(pR + tR));
1352
1353 //G4cout<<"##CB: ekin = "<<ekin<<"; pElab= " << pElab
1354 // <<"; bC = "<<bC<<"; Tcm = "<< totTcm <<G4endl;
1355
1356 G4double ratio = (totTcm > bC) ? 1. - bC/totTcm : 0.0;
1357
1358 // G4cout <<"ratio = "<<ratio<<G4endl;
1359 return ratio;
1360}
1361
@ LE
Definition: Evaluator.cc:65
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:179
static const G4double invGeV2
static const G4double minLogP
static const G4double ekinmaxQB
static const G4double cofLogT
static const G4double invGeV
static const G4double pMax
static const G4double pMin
static const G4double ekinmin
static const G4double cofLogE
G4double G4Log(G4double x)
Definition: G4Log.hh:226
#define M(row, col)
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4double CoulombBarrier(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
const G4ParticleDefinition * theK0S
const G4ParticleDefinition * theK0L
G4double HadronNucleonXscEL(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double KaonNucleonXscGG(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double KaonNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double SCBMesonNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
void CrossSectionDescription(std::ostream &) const
const G4ParticleDefinition * theKPlus
G4double HadronNucleonXscVU(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double HadronNucleonXsc(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
const G4ParticleDefinition * theNeutron
G4double CalcMandelstamS(G4double ekin1, G4double mass1, G4double mass2)
G4double KaonNucleonXscVG(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
const G4ParticleDefinition * thePiPlus
G4double HyperonNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
const G4ParticleDefinition * theProton
G4double HadronNucleonXscPDG(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double HadronNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
const G4ParticleDefinition * theKMinus
static G4KaonMinus * KaonMinus()
Definition: G4KaonMinus.cc:112
static G4KaonPlus * KaonPlus()
Definition: G4KaonPlus.cc:112
static G4KaonZeroLong * KaonZeroLong()
static G4KaonZeroShort * KaonZeroShort()
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
static G4double CoulombFactor(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double GetPDGCharge() const
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:97
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:166
static G4Proton * Proton()
Definition: G4Proton.cc:92
static constexpr double millibarn
Definition: SystemOfUnits.h:87
static constexpr double proton_mass_c2
static constexpr double GeV
static constexpr double neutron_mass_c2
static constexpr double MeV
static constexpr double fermi
Definition: SystemOfUnits.h:84
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4bool nucleon(G4int ityp)
float hbarc
Definition: hepunit.py:264
int fine_structure_const
Definition: hepunit.py:286
static double P[]