Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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;
53static const G4double invGeV2 = 1.0/(CLHEP::GeV*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{
66 theProton = G4Proton::Proton();
67 theNeutron = G4Neutron::Neutron();
68 thePiPlus = G4PionPlus::PionPlus();
69
70 // strange
71 theKPlus = G4KaonPlus::KaonPlus();
72 theKMinus = G4KaonMinus::KaonMinus();
75
76 g4calc = G4Pow::GetInstance();
77}
78
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
93 const G4ParticleDefinition* nucleon, G4double ekin)
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
139//////////////////////////////////////////////////////////////////////////////
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,
146 const G4ParticleDefinition* nucleon, G4double ekin)
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
164 G4bool proton = (nucleon == theProton);
165 G4bool neutron = (nucleon == theNeutron);
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 }
309 fTotalXsc = CLHEP::millibarn*
310 (del*(H*blog*blog + P) + R1*G4Exp(-eta1*blog) + R2*G4Exp(-eta2*blog));
311 fInelasticXsc = 0.75*fTotalXsc;
312 fElasticXsc = fTotalXsc - fInelasticXsc;
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
331//////////////////////////////////////////////////////////////////////////////
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,
338 const G4ParticleDefinition* nucleon, G4double ekin0)
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.) {
362 fTotalXsc = HadronNucleonXscPDG(theParticle, nucleon, ekin)/CLHEP::millibarn;
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
369 G4bool proton = (nucleon == theProton);
370 G4bool neutron = (nucleon == theNeutron);
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));
396 fElasticXsc = fTotalXsc;
397 }
398 else if( pLab < 0.73 )
399 {
400 fTotalXsc = 23 + 50*std::sqrt(g4calc->powN(-x, 7));
401 fElasticXsc = fTotalXsc;
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);
419 fElasticXsc = fTotalXsc;
420 }
421 else if( pLab < 0.8 )
422 {
423 fTotalXsc = 33+30*g4calc->powN(G4Log(pLab/1.3),4);
424 fElasticXsc = fTotalXsc;
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 }
441 ////// proton //////////////////////////////////////////////
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));
466 fElasticXsc = fTotalXsc;
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);
485 fElasticXsc = fTotalXsc;
486 }
487 else if( pLab < 0.8 )
488 {
489 fTotalXsc = 33+30*g4calc->powN(G4Log(pLab/1.3),4);
490 fElasticXsc = fTotalXsc;
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);
514 fElasticXsc = fTotalXsc;
515 }
516 else if( pLab < 0.68 )
517 {
518 fTotalXsc = 14./((logP + 1.273)*(logP + 1.273) + 0.07);
519 fElasticXsc = fTotalXsc;
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 }
752 fTotalXsc *= CLHEP::millibarn;
753 fElasticXsc *= CLHEP::millibarn;
754 fElasticXsc = std::min(fElasticXsc, fTotalXsc);
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 }
762 fInelasticXsc = std::max(fTotalXsc - fElasticXsc,0.0);
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
773//////////////////////////////////////////////////////////////////////////////
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,
780 const G4ParticleDefinition* nucleon, G4double ekin)
781{
782 fTotalXsc = fElasticXsc = fInelasticXsc = 0.0;
783 if(theParticle == theKMinus || theParticle == theKPlus) {
784 KaonNucleonXscVG(theParticle, nucleon, ekin);
785
786 } else if(theParticle == theK0S || theParticle == theK0L) {
787 G4double stot = KaonNucleonXscVG(theKMinus, nucleon, ekin);
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
800//////////////////////////////////////////////////////////////////////////////
801//
802// Returns kaon-nucleon cross-section using NS
803
805 const G4ParticleDefinition* theParticle,
806 const G4ParticleDefinition* nucleon, G4double ekin)
807{
808 fTotalXsc = fElasticXsc = fInelasticXsc = 0.0;
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));
826 stot = HadronNucleonXscNS(theKMinus, nucleon, ekinmaxQB);
827 sel = fElasticXsc;
828 sinel = fInelasticXsc;
829 stot += HadronNucleonXscNS(theKPlus, nucleon, ekinmaxQB);
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
840//////////////////////////////////////////////////////////////////////////////
841//
842// Returns kaon-nucleon cross-section with smoothed NS parameterisation
843
845 const G4ParticleDefinition* theParticle,
846 const G4ParticleDefinition* nucleon, G4double ekin)
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
856 G4bool proton = (nucleon == theProton);
857 G4bool neutron = (nucleon == theNeutron);
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
969 fTotalXsc *= CLHEP::millibarn;
970 fElasticXsc *= CLHEP::millibarn;
971
972 if( proton && theParticle->GetPDGCharge() > 0. )
973 {
974 G4double cB = G4NuclearRadii::CoulombFactor(theParticle, nucleon, ekin);
975 fTotalXsc *= cB;
976 fElasticXsc *= cB;
977 }
978 fElasticXsc = std::min(fElasticXsc, fTotalXsc);
979 fInelasticXsc = std::max(fTotalXsc - fElasticXsc,0.0);
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
989//////////////////////////////////////////////////////////////////////////////
990//
991// Returns hyperon-nucleon cross-section using NS x-section for protons
992
994 const G4ParticleDefinition* theParticle,
995 const G4ParticleDefinition* nucleon, G4double ekin)
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 }
1045 fTotalXsc = coeff*HadronNucleonXscNS( theProton, nucleon, ekin);
1046 fInelasticXsc *= coeff;
1047 fElasticXsc *= coeff;
1048
1049 return fTotalXsc;
1050}
1051
1052//////////////////////////////////////////////////////////////////////////////
1053//
1054// Returns hyperon-nucleon cross-section using NS x-section for protons
1055
1057 const G4ParticleDefinition* theParticle,
1058 const G4ParticleDefinition* nucleon, G4double ekin )
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 }
1108 fTotalXsc = coeff*HadronNucleonXscNS(thePiPlus, nucleon, ekin);
1109 fElasticXsc *= coeff;
1110 fInelasticXsc *= coeff;
1111 return fTotalXsc;
1112}
1113////////////////////////////////////////////////////////////////////////////////
1114//
1115// Returns hadron-nucleon cross-section based on V. Uzjinsky parametrisation of
1116// data from G4FTFCrossSection class
1117
1119 const G4ParticleDefinition* theParticle,
1120 const G4ParticleDefinition* nucleon, G4double ekin)
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
1130 G4bool proton = (nucleon == theProton);
1131 G4bool neutron = (nucleon == theNeutron);
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
1248 fTotalXsc *= CLHEP::millibarn;
1249 fElasticXsc *= CLHEP::millibarn;
1250 fElasticXsc = std::min(fElasticXsc, fTotalXsc);
1251 fInelasticXsc = fTotalXsc - fElasticXsc;
1252
1253 return fTotalXsc;
1254}
1255
1256//////////////////////////////////////////////////////////////////////////////
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 =
1270 0.5*(CLHEP::proton_mass_c2 + CLHEP::neutron_mass_c2);
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;
1321 fElasticXsc = fTotalXsc - fInelasticXsc;
1322 return fTotalXsc;
1323}
1324
1325///////////////////////////////////////////////////////////////////////////////
1326
1327G4double
1329 const G4ParticleDefinition* nucleon,
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
1362//////////////////////////////////////////////////////////////////////////////
@ LE
Definition Evaluator.cc:68
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
G4double G4Log(G4double x)
Definition G4Log.hh:227
#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)
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
G4double HadronNucleonXscVU(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double HadronNucleonXsc(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double KaonNucleonXscVG(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double HyperonNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double HadronNucleonXscPDG(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double HadronNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
static G4KaonMinus * KaonMinus()
static G4KaonPlus * KaonPlus()
static G4KaonZeroLong * KaonZeroLong()
static G4KaonZeroShort * KaonZeroShort()
static G4Neutron * Neutron()
Definition G4Neutron.cc:101
static G4double CoulombFactor(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
static G4PionPlus * PionPlus()
Definition G4PionPlus.cc:93
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double powN(G4double x, G4int n) const
Definition G4Pow.cc:162
static G4Proton * Proton()
Definition G4Proton.cc:90