CMS 3D CMS Logo

CMSSQNeutronAnnih.cc
Go to the documentation of this file.
1 
2 #include "G4PhysicalConstants.hh"
3 #include "G4SystemOfUnits.hh"
4 #include "G4ParticleTable.hh"
5 #include "G4ParticleDefinition.hh"
6 #include "Randomize.hh"
7 #include "G4NucleiProperties.hh"
8 #include <math.h>
9 #include "TMath.h"
10 
12 
15 
16 CMSSQNeutronAnnih::CMSSQNeutronAnnih(double mass) : G4HadronicInteraction("SexaQuark-neutron annihilation") {
17  SetMinEnergy(0.0 * GeV);
18  SetMaxEnergy(100. * TeV);
19 
20  theSQ = CMSSQ::SQ(mass);
21  theK0S = G4KaonZeroShort::KaonZeroShort();
22  theAntiL = G4AntiLambda::AntiLambda();
23  theProton = G4Proton::
24  Proton(); //proton only used when the particle which the sexaquark hits is a deutereon and the neutron dissapears, so what stays behind is a proton
25 }
26 
28 
29 //9Be momentum distribution from Jan Ryckebusch
30 G4double CMSSQNeutronAnnih::momDistr(G4double x_in) {
31  const int n_entries = 50;
32 
33  G4double CDF_k[n_entries] = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6,
34  1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3,
35  3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4., 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9};
36 
37  G4double x[n_entries] = {0,
38  0.0038033182,
39  0.0187291764,
40  0.0510409777,
41  0.1048223609,
42  0.1807862863,
43  0.2756514534,
44  0.3825832103,
45  0.4926859745,
46  0.5970673837,
47  0.6887542272,
48  0.7637748784,
49  0.8212490273,
50  0.8627259608,
51  0.8911605331,
52  0.9099115186,
53  0.9220525854,
54  0.9300190818,
55  0.9355376091,
56  0.9397242185,
57  0.9432387722,
58  0.946438928,
59  0.9495023924,
60  0.9525032995,
61  0.9554669848,
62  0.9583936672,
63  0.9612770117,
64  0.9641067202,
65  0.9668727859,
66  0.9695676121,
67  0.9721815799,
68  0.9747092981,
69  0.9771426396,
70  0.9794740235,
71  0.9816956807,
72  0.9838003583,
73  0.9857816165,
74  0.9876331761,
75  0.9893513365,
76  0.9909333198,
77  0.992378513,
78  0.9936885054,
79  0.9948665964,
80  0.9959179448,
81  0.9968491104,
82  0.9976680755,
83  0.9983832508,
84  0.9990041784,
85  0.9995400073,
86  1};
87 
88  //now interpolate the above points for x_in
89  G4double result = 9999;
90  for (int i = 0; i < n_entries; i++) {
91  if (x[i] > x_in) {
92  result = (CDF_k[i] - CDF_k[i - 1]) / (x[i] - x[i - 1]) * (x_in - x[i - 1]) + CDF_k[i - 1];
93  break;
94  }
95  }
96  //ROOT::Math::Interpolator inter(n_entries, ROOT::Math::Interpolation::kAKIMA);
97  //inter.SetData(n_entries,x,CDF_k);
98  //result = inter.Eval(x_in);
99 
100  return result;
101  //return 1;
102 }
103 
104 G4HadFinalState* CMSSQNeutronAnnih::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleus) {
105  theParticleChange.Clear();
106  const G4HadProjectile* aParticle = &aTrack;
107  G4double ekin = aParticle->GetKineticEnergy();
108 
109  G4int A = targetNucleus.GetA_asInt();
110  G4int Z = targetNucleus.GetZ_asInt();
111 
112  G4double m_K0S = G4KaonZeroShort::KaonZeroShort()->GetPDGMass();
113  G4double m_L = G4AntiLambda::AntiLambda()->GetPDGMass();
114 
115  //G4double plab = aParticle->GetTotalMomentum();
116 
117  // edm::LogVerbatim("CMSSWNeutronAnnih") << "CMSSQNeutronAnnih: Incident particle p (GeV), total Energy (GeV), particle name, eta ="
118  // << plab/GeV << " "
119  // << aParticle->GetTotalEnergy()/GeV << " "
120  // << aParticle->GetDefinition()->GetParticleName() << " "
121  // << aParticle->Get4Momentum();
122 
123  // Scattered particle referred to axis of incident particle
124  //const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
125 
126  //G4int projPDG = theParticle->GetPDGEncoding();
127  // edm::LogVerbatim("CMSSWNeutronAnnih") << "CMSSQNeutronAnnih: for " << theParticle->GetParticleName()
128  // << " PDGcode= " << projPDG << " on nucleus Z= " << Z
129  // << " A= " << A << " N= " << N;
130 
131  G4LorentzVector lv1 = aParticle->Get4Momentum();
132  edm::LogVerbatim("CMSSWNeutronAnnih") << "The neutron Fermi momentum (mag, x, y, z) "
133  << targetNucleus.GetFermiMomentum().mag() / MeV << " "
134  << targetNucleus.GetFermiMomentum().x() / MeV << " "
135  << targetNucleus.GetFermiMomentum().y() / MeV << " "
136  << targetNucleus.GetFermiMomentum().z() / MeV;
137 
138  //calculate fermi momentum
139 
140  G4double k_neutron = momDistr(G4UniformRand());
141  G4double momentum_neutron = 0.1973 * GeV * k_neutron;
142 
143  G4double theta_neutron = TMath::ACos(2 * G4UniformRand() - 1);
144  G4double phi_neutron = 2. * TMath::Pi() * G4UniformRand();
145 
146  G4double p_neutron_x = momentum_neutron * TMath::Sin(theta_neutron) * TMath::Cos(phi_neutron);
147  G4double p_neutron_y = momentum_neutron * TMath::Sin(theta_neutron) * TMath::Sin(phi_neutron);
148  G4double p_neutron_z = momentum_neutron * TMath::Cos(theta_neutron);
149 
150  //G4LorentzVector lv0(targetNucleus.GetFermiMomentum(), sqrt( pow(G4Neutron::Neutron()->GetPDGMass(),2) + targetNucleus.GetFermiMomentum().mag2() ) );
151  G4LorentzVector lv0(p_neutron_x,
152  p_neutron_y,
153  p_neutron_z,
154  sqrt(pow(G4Neutron::Neutron()->GetPDGMass(), 2) + momentum_neutron * momentum_neutron));
155 
156  //const G4Nucleus* aNucleus = &targetNucleus;
157  G4double BENeutronInNucleus = 0;
158  if (A != 0)
159  BENeutronInNucleus = G4NucleiProperties::GetBindingEnergy(A, Z) / (A);
160 
161  edm::LogVerbatim("CMSSWNeutronAnnih") << "BE of nucleon in the nucleus (GeV): " << BENeutronInNucleus / GeV;
162 
163  G4LorentzVector lvBE(0, 0, 0, BENeutronInNucleus / GeV);
164  G4LorentzVector lv = lv0 + lv1 - lvBE;
165 
166  // kinematiacally impossible ?
167  G4double etot = lv0.e() + lv1.e() - lvBE.e();
168  if (etot < theK0S->GetPDGMass() + theAntiL->GetPDGMass()) {
169  theParticleChange.SetEnergyChange(ekin);
170  theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit());
171  return &theParticleChange;
172  }
173 
174  float newIonMass = targetNucleus.AtomicMass(A - 1, Z) * 931.5 * MeV;
175  ;
176  G4LorentzVector nlvIon(0, 0, 0, newIonMass);
177 
178  G4double theta_KS0_star = TMath::ACos(2 * G4UniformRand() - 1);
179  G4double phi_KS0_star = 2. * TMath::Pi() * G4UniformRand();
180 
181  G4double p_K0S_star_x = TMath::Sin(theta_KS0_star) * TMath::Cos(phi_KS0_star);
182  G4double p_K0S_star_y = TMath::Sin(theta_KS0_star) * TMath::Sin(phi_KS0_star);
183  G4double p_K0S_star_z = TMath::Cos(theta_KS0_star);
184 
185  G4ThreeVector p(p_K0S_star_x, p_K0S_star_y, p_K0S_star_z);
186  double m0 = lv.m();
187  double m0_2 = m0 * m0;
188  double m1_2 = m_K0S * m_K0S;
189  double m2_2 = m_L * m_L;
190 
191  p *= 0.5 / m0 * sqrt(m0_2 * m0_2 + m1_2 * m1_2 + m2_2 * m2_2 - 2 * m0_2 * m1_2 - 2 * m0_2 * m2_2 - 2 * m1_2 * m2_2);
192  double p2 = p.mag2();
193 
194  G4LorentzVector nlvK0S(p, sqrt(p2 + m1_2));
195  G4LorentzVector nlvAntiL(-p, sqrt(p2 + m2_2));
196 
197  // Boost out of the rest frame.
198  nlvK0S.boost(lv.boostVector());
199  nlvAntiL.boost(lv.boostVector());
200 
201  // now move to implement the interaction
202  theParticleChange.SetStatusChange(stopAndKill);
203  //theParticleChange.SetEnergyChange(ekin); // was 0.0
204 
205  G4DynamicParticle* aSec1 = new G4DynamicParticle(theK0S, nlvK0S);
206  theParticleChange.AddSecondary(aSec1);
207  G4DynamicParticle* aSec2 = new G4DynamicParticle(theAntiL, nlvAntiL);
208  theParticleChange.AddSecondary(aSec2);
209 
210  const G4ParticleDefinition* theRemainingNucleusDef = theProton;
211  if (A != 1)
212  theRemainingNucleusDef = G4IonTable::GetIonTable()->GetIon(Z, A - 1);
213  G4DynamicParticle* aSec3 = new G4DynamicParticle(theRemainingNucleusDef, nlvIon);
214  theParticleChange.AddSecondary(aSec3);
215 
216  // return as is; we don't care about what happens to the nucleus
217  return &theParticleChange;
218 }
const double Pi
Log< level::Info, true > LogVerbatim
G4ParticleDefinition * theProton
G4double momDistr(G4double x_in)
~CMSSQNeutronAnnih() override
G4ParticleDefinition * theAntiL
G4ParticleDefinition * theK0S
T sqrt(T t)
Definition: SSEVec.h:23
static CMSSQ * SQ(double mass)
Definition: CMSSQ.cc:41
CMSSQNeutronAnnih(double mass)
G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus) override
G4ParticleDefinition * theSQ
Definition: APVGainStruct.h:7
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29