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);
G4DLLIMPORT std::ostream G4cout
void SetTarMinNonDiffMass(const G4double aValue)
void SetProjMinDiffMass(const G4double aValue)
void SetTotalCrossSection(const G4double Xtotal)
void SetExcitationEnergyPerWoundedNucleon(const G4double aValue)
G4ChipsComponentXS * FTFxsManager
void SetProbabilityOfElasticScatt(const G4double Xtotal, const G4double Xelastic)
void SetElastisCrossSection(const G4double Xelastic)
void SetQuarkProbabilitiesAtGluonSplitUp(const G4double Puubar, const G4double Pddbar, const G4double Pssbar)
void SetProbabilityOfTarDiff(const G4double aValue)
void SetMaxPt2ofNuclearDestruction(const G4double aValue)
G4double ProbOfSameQuarkExchange
void SetPt2Kink(const G4double aValue)
void SetSlope(const G4double Slope)
void SetDeltaProbAtQuarkExchange(const G4double aValue)
void SetMagQuarkExchange(const G4double aValue)
void SetAvaragePt2ofElasticScattering(const G4double aPt2)
void SetTarMinDiffMass(const G4double aValue)
void SetProjMinNonDiffMass(const G4double aValue)
void SetR2ofNuclearDestruction(const G4double aValue)
void SetGamma0(const G4double Gamma0)
void SetAveragePt2(const G4double aValue)
void SetProbabilityOfAnnihilation(const G4double aValue)
void SetDofNuclearDestruction(const G4double aValue)
void SetRadiusOfHNinteractions2(const G4double Radius2)
void SetPt2ofNuclearDestruction(const G4double aValue)
void SetProbLogDistr(const G4double aValue)
void SetCofNuclearDestruction(const G4double aValue)
void SetMaxNumberOfCollisions(const G4double aValue, const G4double bValue)
void SetSlopeQuarkExchange(const G4double aValue)
void SetProbOfSameQuarkExchange(const G4double aValue)
G4double FTFXannihilation
void SetProbabilityOfProjDiff(const G4double aValue)
void SetInelasticCrossSection(const G4double Xinelastic)
static G4KaonMinus * KaonMinus()
static G4KaonPlus * KaonPlus()
static G4Neutron * Neutron()
G4double GetPDGMass() const
G4int GetPDGEncoding() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
static G4PionMinus * PionMinus()
static G4PionPlus * PionPlus()
static G4Proton * Proton()