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

Last change on this file since 1315 was 1228, checked in by garnier, 16 years ago

update geant4.9.3 tag

File size: 29.5 KB
RevLine 
[819]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//
888
889G4double G4HadronNucleonXsc::CalculateEcmValue( const G4double mp ,
890 const G4double mt ,
891 const G4double Plab )
892{
893 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
894 G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
895 // G4double Pcm = Plab * mt / Ecm;
896 // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
897
898 return Ecm ; // KEcm;
899}
900
901
902////////////////////////////////////////////////////////////////////////////////////
903//
904//
905
906G4double G4HadronNucleonXsc::CalcMandelstamS( const G4double mp ,
907 const G4double mt ,
908 const G4double Plab )
909{
910 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
911 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
912
913 return sMand;
914}
915
916
917//
918//
919///////////////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.