53 FTFXtotal(0.0), FTFXelastic(0.0), FTFXinelastic(0.0), FTFXannihilation(0.0),
54 ProbabilityOfAnnihilation(0.0), ProbabilityOfElasticScatt(0.0),
55 RadiusOfHNinteractions2(0.0), FTFSlope(0.0),
56 AvaragePt2ofElasticScattering(0.0), FTFGamma0(0.0),
57 MagQuarkExchange(0.0), SlopeQuarkExchange(0.0), DeltaProbAtQuarkExchange(0.0),
58 ProbOfSameQuarkExchange(0.0), ProjMinDiffMass(0.0), ProjMinNonDiffMass(0.0),
59 ProbabilityOfProjDiff(0.0), TarMinDiffMass(0.0), TarMinNonDiffMass(0.0),
60 ProbabilityOfTarDiff(0.0), AveragePt2(0.0), ProbLogDistr(0.0),
62 MaxNumberOfCollisions(0.0), ProbOfInelInteraction(0.0), CofNuclearDestruction(0.0),
63 R2ofNuclearDestruction(0.0), ExcitationEnergyPerWoundedNucleon(0.0),
64 DofNuclearDestruction(0.0), Pt2ofNuclearDestruction(0.0), MaxPt2ofNuclearDestruction(0.0)
83 G4int ProjectileabsPDGcode = std::abs(ProjectilePDGcode);
85 G4double ProjectileMass2 =ProjectileMass*ProjectileMass;
87 G4int ProjectileBaryonNumber(0), AbsProjectileBaryonNumber(0);
88 G4int AbsProjectileCharge(0);
89 G4bool ProjectileIsNucleus=
false;
93 ProjectileIsNucleus =
true;
95 AbsProjectileBaryonNumber=std::abs(ProjectileBaryonNumber);
98 if(ProjectileBaryonNumber > 1)
99 { ProjectilePDGcode= 2212; ProjectileabsPDGcode=2212;}
100 else { ProjectilePDGcode=-2212; ProjectileabsPDGcode=2212;}
103 ProjectileMass2=
sqr(ProjectileMass);
107 G4double TargetMass2 = TargetMass*TargetMass;
110 G4double Elab = std::sqrt(Plab*Plab+ProjectileMass2);
111 G4double KineticEnergy = Elab-ProjectileMass;
113 G4double S=ProjectileMass2 + TargetMass2 + 2.*TargetMass*Elab;
119 G4double Ylab,Xtotal,Xelastic,Xannihilation;
120 G4int NumberOfTargetNucleons;
122 Ylab=0.5*std::log((Elab+Plab)/(Elab-Plab));
128 TargetMass /=
GeV; TargetMass2 /=(
GeV*
GeV);
129 ProjectileMass /=
GeV; ProjectileMass2 /=(
GeV*
GeV);
138 G4int NumberOfTargetProtons = theZ;
139 G4int NumberOfTargetNeutrons = theA-theZ;
141 NumberOfTargetNucleons = NumberOfTargetProtons + NumberOfTargetNeutrons;
143 if( (ProjectilePDGcode == 2212) ||
144 (ProjectilePDGcode == 2112) )
147 GetTotalElementCrossSection( particle,KineticEnergy,1,0);
150 GetTotalElementCrossSection( Neutron,KineticEnergy,1,0);
154 GetElasticElementCrossSection(particle,KineticEnergy,1,0);
156 GetElasticElementCrossSection( Neutron,KineticEnergy,1,0);
159 if(!ProjectileIsNucleus)
161 Xtotal = ( NumberOfTargetProtons * XtotPP +
162 NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
163 Xelastic = ( NumberOfTargetProtons * XelPP +
164 NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
168 AbsProjectileCharge *NumberOfTargetProtons *XtotPP +
169 (AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetNeutrons*XtotPP +
170 ( AbsProjectileCharge *NumberOfTargetNeutrons +
171 (AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetProtons)*XtotPN
172 )/(AbsProjectileBaryonNumber*NumberOfTargetNucleons);
175 AbsProjectileCharge *NumberOfTargetProtons *XelPP +
176 (AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetNeutrons*XelPP +
177 ( AbsProjectileCharge *NumberOfTargetNeutrons +
178 (AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetProtons)*XelPN
179 )/(AbsProjectileBaryonNumber*NumberOfTargetNucleons);
186 else if( ProjectilePDGcode < -1000 )
189 G4double X_a(0.), X_b(0.), X_c(0.), X_d(0.);
190 G4double MesonProdThreshold=ProjectileMass+TargetMass+(2.*0.14+0.016);
192 if(PlabPerParticle < 40.*
MeV)
203 G4double LogS=std::log(ECMSsqr/33.0625);
204 G4double Xasmpt=36.04+0.304*LogS*LogS;
206 LogS=std::log(SqrtS/20.74);
207 G4double Basmpt=11.92+0.3036*LogS*LogS;
208 G4double R0=std::sqrt(0.40874044*Xasmpt-Basmpt);
211 std::sqrt(ECMSsqr*ECMSsqr+ProjectileMass2*ProjectileMass2+TargetMass2*TargetMass2-
212 2.*ECMSsqr*ProjectileMass2 -2.*ECMSsqr*TargetMass2 -2.*ProjectileMass2*TargetMass2);
214 Xtotal=Xasmpt*(1.+13.55*FlowF/R0/R0/R0*
215 (1.-4.47/SqrtS+12.38/ECMSsqr-12.43/SqrtS/ECMSsqr));
217 Xasmpt=4.4+0.101*LogS*LogS;
218 Xelastic=Xasmpt*(1.+59.27*FlowF/R0/R0/R0*
219 (1.-6.95/SqrtS+23.54/ECMSsqr-25.34/SqrtS/ECMSsqr));
225 if(SqrtS < MesonProdThreshold)
227 X_b=3.13+140.*std::pow(MesonProdThreshold-SqrtS,2.5);
235 X_c=2.*FlowF*
sqr(ProjectileMass+TargetMass)/ECMSsqr;
245 G4double Xann_on_P(0.), Xann_on_N(0.);
247 if(ProjectilePDGcode == -2212)
248 {Xann_on_P=X_a + X_b*5. + X_c*5. + X_d*6.; Xann_on_N=X_a + X_b*4. + X_c*4. + X_d*4.;}
249 else if(ProjectilePDGcode == -2112)
250 {Xann_on_P=X_a + X_b*4. + X_c*4. + X_d*4.; Xann_on_N=X_a + X_b*5. + X_c*5. + X_d*6.;}
251 else if(ProjectilePDGcode == -3122)
252 {Xann_on_P=X_a + X_b*3. + X_c*3. + X_d*2.; Xann_on_N=X_a + X_b*3. + X_c*3. + X_d*2.;}
253 else if(ProjectilePDGcode == -3112)
254 {Xann_on_P=X_a + X_b*2. + X_c*2. + X_d*0.; Xann_on_N=X_a + X_b*4. + X_c*4. + X_d*2.;}
255 else if(ProjectilePDGcode == -3212)
256 {Xann_on_P=X_a + X_b*3. + X_c*3. + X_d*2.; Xann_on_N=X_a + X_b*3. + X_c*3. + X_d*2.;}
257 else if(ProjectilePDGcode == -3222)
258 {Xann_on_P=X_a + X_b*4. + X_c*4. + X_d*2.; Xann_on_N=X_a + X_b*2. + X_c*2. + X_d*0.;}
259 else if(ProjectilePDGcode == -3312)
260 {Xann_on_P=X_a + X_b*1. + X_c*1. + X_d*0.; Xann_on_N=X_a + X_b*2. + X_c*2. + X_d*0.;}
261 else if(ProjectilePDGcode == -3322)
262 {Xann_on_P=X_a + X_b*2. + X_c*2. + X_d*0.; Xann_on_N=X_a + X_b*1. + X_c*1. + X_d*0.;}
263 else if(ProjectilePDGcode == -3334)
264 {Xann_on_P=X_a + X_b*0. + X_c*0. + X_d*0.; Xann_on_N=X_a + X_b*0. + X_c*0. + X_d*0.;}
265 else {
G4cout<<
"Unknown anti-baryon for FTF annihilation"<<
G4endl;}
270 if(!ProjectileIsNucleus)
272 Xannihilation = ( NumberOfTargetProtons * Xann_on_P +
273 NumberOfTargetNeutrons * Xann_on_N ) / NumberOfTargetNucleons;
277 ( AbsProjectileCharge *NumberOfTargetProtons+
278 (AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetNeutrons )*Xann_on_P +
279 ( AbsProjectileCharge *NumberOfTargetNeutrons+
280 (AbsProjectileBaryonNumber-AbsProjectileCharge)*NumberOfTargetProtons )*Xann_on_N
281 )/(AbsProjectileBaryonNumber*NumberOfTargetNucleons);
285 MesonProdThreshold=ProjectileMass+TargetMass+(0.14+0.08);
286 if(SqrtS > MesonProdThreshold) {Xftf=36.*(1.-MesonProdThreshold/SqrtS);}
288 Xtotal = Xelastic + Xannihilation + Xftf;
296 else if( ProjectilePDGcode == 211 )
299 GetTotalElementCrossSection( particle,KineticEnergy,1,0);
302 GetTotalElementCrossSection( PionMinus,KineticEnergy,1,0);
305 GetElasticElementCrossSection(particle,KineticEnergy,1,0);
307 GetElasticElementCrossSection( PionMinus,KineticEnergy,1,0);
309 Xtotal = ( NumberOfTargetProtons * XtotPiP +
310 NumberOfTargetNeutrons * XtotPiN ) / NumberOfTargetNucleons;
311 Xelastic = ( NumberOfTargetProtons * XelPiP +
312 NumberOfTargetNeutrons * XelPiN ) / NumberOfTargetNucleons;
317 else if( ProjectilePDGcode == -211 )
320 GetTotalElementCrossSection( particle,KineticEnergy,1,0);
323 GetTotalElementCrossSection( PionPlus,KineticEnergy,1,0);
326 GetElasticElementCrossSection(particle,KineticEnergy,1,0);
328 GetElasticElementCrossSection( PionPlus,KineticEnergy,1,0);
330 Xtotal = ( NumberOfTargetProtons * XtotPiP +
331 NumberOfTargetNeutrons * XtotPiN ) / NumberOfTargetNucleons;
332 Xelastic = ( NumberOfTargetProtons * XelPiP +
333 NumberOfTargetNeutrons * XelPiN ) / NumberOfTargetNucleons;
339 else if( ProjectilePDGcode == 111 )
343 GetTotalElementCrossSection( PionPlus,KineticEnergy,1,0);
347 GetTotalElementCrossSection( PionMinus,KineticEnergy,1,0);
350 GetElasticElementCrossSection( PionPlus,KineticEnergy,1,0);
352 GetElasticElementCrossSection( PionMinus,KineticEnergy,1,0);
354 G4double XtotPiP= (XtotPipP + XtotPimP)/2.;
356 G4double XelPiP = (XelPipP + XelPimP )/2.;
359 Xtotal = ( NumberOfTargetProtons * XtotPiP +
360 NumberOfTargetNeutrons * XtotPiN ) / NumberOfTargetNucleons;
361 Xelastic = ( NumberOfTargetProtons * XelPiP +
362 NumberOfTargetNeutrons * XelPiN ) / NumberOfTargetNucleons;
368 else if( ProjectilePDGcode == 321 )
371 GetTotalElementCrossSection( particle,KineticEnergy,1,0);
375 GetTotalElementCrossSection( KaonMinus,KineticEnergy,1,0);
378 GetElasticElementCrossSection(particle,KineticEnergy,1,0);
380 GetElasticElementCrossSection( KaonMinus,KineticEnergy,1,0);
382 Xtotal = ( NumberOfTargetProtons * XtotKP +
383 NumberOfTargetNeutrons * XtotKN ) / NumberOfTargetNucleons;
384 Xelastic = ( NumberOfTargetProtons * XelKP +
385 NumberOfTargetNeutrons * XelKN ) / NumberOfTargetNucleons;
391 else if( ProjectilePDGcode ==-321 )
394 GetTotalElementCrossSection( particle,KineticEnergy,1,0);
398 GetTotalElementCrossSection( KaonPlus,KineticEnergy,1,0);
401 GetElasticElementCrossSection(particle,KineticEnergy,1,0);
404 GetElasticElementCrossSection(KaonPlus,KineticEnergy,1,0);
406 Xtotal = ( NumberOfTargetProtons * XtotKP +
407 NumberOfTargetNeutrons * XtotKN ) / NumberOfTargetNucleons;
408 Xelastic = ( NumberOfTargetProtons * XelKP +
409 NumberOfTargetNeutrons * XelKN ) / NumberOfTargetNucleons;
415 else if((ProjectilePDGcode == 311) ||
416 (ProjectilePDGcode == 130) ||
417 (ProjectilePDGcode == 310))
421 GetTotalElementCrossSection( KaonPlus,KineticEnergy,1,0);
425 GetTotalElementCrossSection( KaonMinus,KineticEnergy,1,0);
428 GetElasticElementCrossSection( KaonPlus,KineticEnergy,1,0);
430 GetElasticElementCrossSection( KaonMinus,KineticEnergy,1,0);
432 G4double XtotKP=(XtotKpP+XtotKmP)/2.;
434 G4double XelKP =(XelKpP +XelKmP )/2.;
437 Xtotal = ( NumberOfTargetProtons * XtotKP +
438 NumberOfTargetNeutrons * XtotKN ) / NumberOfTargetNucleons;
439 Xelastic = ( NumberOfTargetProtons * XelKP +
440 NumberOfTargetNeutrons * XelKN ) / NumberOfTargetNucleons;
450 GetTotalElementCrossSection( Proton,KineticEnergy,1,0);
454 GetTotalElementCrossSection( Neutron,KineticEnergy,1,0);
457 GetElasticElementCrossSection(Proton,KineticEnergy,1,0);
459 GetElasticElementCrossSection( Neutron,KineticEnergy,1,0);
461 Xtotal = ( NumberOfTargetProtons * XtotPP +
462 NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
463 Xelastic = ( NumberOfTargetProtons * XelPP +
464 NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
493 if(Xtotal-Xelastic == 0.)
509 SetSlope( Xtotal*Xtotal/16./
pi/Xelastic/0.3894 );
524 if( ProjectilePDGcode > 1000 )
546 else if( ProjectilePDGcode < -1000 )
567 else if( ProjectileabsPDGcode == 211 ||
568 ProjectilePDGcode == 111)
589 else if( (ProjectileabsPDGcode == 321) ||
590 (ProjectileabsPDGcode == 311) ||
591 (ProjectilePDGcode == 130) ||
592 (ProjectilePDGcode == 310))
650 G4double Puubar(1./3.), Pddbar(1./3.), Pssbar(1./3.);
656 if( ProjectileabsPDGcode < 1000 )
660 (1.+std::exp(4.*(Ylab-2.1))));
666 (1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV);
671 }
else if( ProjectilePDGcode < -1000 )
677 (1.+std::exp(4.*(Ylab-2.1))));
683 (1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV);
701 (1.+std::exp(4.*(Ylab-2.1))));
707 (1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV);