6 #include <FairParticle.h>
7 #include <FairPrimaryGenerator.h>
8 #include <FairRunSim.h>
11 #include <TParticle.h>
20 constexpr
float amu = 931.494;
22 Int_t AtTPC_Background::fgNIon = 0;
32 std::vector<Int_t> *q, Int_t mult, std::vector<Double_t> *px,
33 std::vector<Double_t> *py, std::vector<Double_t> *pz, std::vector<Double_t> *mass,
34 std::vector<Double_t> *Ex)
35 : fPx(0.), fPy(0.), fPz(0.), fMult(mult), fVx(0.), fVy(0.), fVz(0.), fIon(0)
44 for (Int_t i = 0; i < fMult; i++) {
46 fPx.push_back(px->at(i));
47 fPy.push_back(py->at(i));
48 fPz.push_back(pz->at(i));
49 Masses.push_back(mass->at(i));
50 fExEnergy.push_back(Ex->at(i));
53 std::unique_ptr<FairIon> IonBuff =
nullptr;
54 std::unique_ptr<FairParticle> ParticleBuff =
nullptr;
55 sprintf(buffer,
"Product_Ion%d", i);
57 IonBuff = std::make_unique<FairIon>(buffer, z->at(i), a->at(i), q->at(i), 0.0, mass->at(i) *
amu / 1000.0);
58 ParticleBuff = std::make_unique<FairParticle>(
"dummyPart", 1, 1, 1.0, 0, 0.0, 0.0);
59 fPType.emplace_back(
"Ion");
60 std::cout <<
" Adding : " << buffer << std::endl;
62 }
else if (a->at(i) == 1 && z->at(i) == 1) {
64 IonBuff = std::make_unique<FairIon>(buffer, z->at(i), a->at(i), q->at(i), 0.0, mass->at(i) *
amu / 1000.0);
65 auto *kProton =
new TParticle();
66 kProton->SetPdgCode(2212);
67 ParticleBuff = std::make_unique<FairParticle>(2212, kProton);
68 fPType.emplace_back(
"Proton");
71 std::cout <<
" Z " << z->at(i) <<
" A " << a->at(i) << std::endl;
73 fIon.push_back(std::move(IonBuff));
74 fParticle.push_back(std::move(ParticleBuff));
77 FairRunSim *run = FairRunSim::Instance();
79 std::cout <<
"-E- FairIonGenerator: No FairRun instantised!" << std::endl;
80 Fatal(
"FairIonGenerator",
"No FairRun instantised!");
83 for (Int_t i = 0; i < fMult; i++) {
85 if (fPType.at(i) ==
"Ion") {
86 std::cout <<
" In position " << i <<
" adding an : " << fPType.at(i) << std::endl;
87 run->AddNewIon(fIon.at(i).get());
88 std::cout <<
" fIon name :" << fIon.at(i)->GetName() << std::endl;
89 std::cout <<
" fParticle name :" << fParticle.at(i)->GetName() << std::endl;
91 }
else if (fPType.at(i) ==
"Proton") {
92 std::cout <<
" In position " << i <<
" adding an : " << fPType.at(i) << std::endl;
93 run->AddNewParticle(fParticle.at(i).get());
94 std::cout <<
" fIon name :" << fIon.at(i)->GetName() << std::endl;
95 std::cout <<
" fParticle name :" << fParticle.at(i)->GetName() << std::endl;
96 std::cout << fParticle.at(i)->GetName() << std::endl;
103 return sqrt(x * x +
y *
y + z * z - 2 * x *
y - 2 *
y * z - 2 * x * z);
108 std::vector<Double_t>
112 static std::vector<double> vout(3);
114 double normn, normf, normt;
117 normf = sqrt(pow(from->at(0), 2) + pow(from->at(1), 2) + pow(from->at(2), 2));
118 normt = sqrt(pow(to->at(0), 2) + pow(to->at(1), 2) + pow(to->at(2), 2));
121 acos(((from->at(0)) * (to->at(0)) + (from->at(1)) * (to->at(1)) + (from->at(2)) * (to->at(2))) / (normf * normt));
123 b = 1.0 - cos(alpha);
125 if (fabs(alpha) < 0.000001) {
126 vout.at(0) = vin->at(0);
127 vout.at(1) = vin->at(1);
128 vout.at(2) = vin->at(2);
131 n[0] = ((from->at(1)) * (to->at(2)) - (from->at(2)) * (to->at(1)));
132 n[1] = ((from->at(2)) * (to->at(0)) - (from->at(0)) * (to->at(2)));
133 n[2] = ((from->at(0)) * (to->at(1)) - (from->at(1)) * (to->at(0)));
138 normn = sqrt(pow(n[0], 2) + pow(n[1], 2) + pow(n[2], 2));
143 vout.at(0) = (1 - b * (pow(n[2], 2) + pow(n[1], 2))) * (vin->at(0)) +
144 (-a * n[2] + b * n[0] * n[1]) * (vin->at(1)) + (a * n[1] + b * n[0] * n[2]) * (vin->at(2));
145 vout.at(1) = (a * n[2] + b * n[0] * n[1]) * (vin->at(0)) +
146 (1 - b * (pow(n[2], 2) + pow(n[0], 2))) * (vin->at(1)) +
147 (-a * n[0] + b * n[1] * n[2]) * (vin->at(2));
148 vout.at(2) = (-a * n[1] + b * n[0] * n[2]) * (vin->at(0)) + (a * n[0] + b * n[1] * n[2]) * (vin->at(1)) +
149 (1 - b * (pow(n[1], 2) + pow(n[0], 2))) * (vin->at(2));
158 static Double_t kinrec[2];
160 double Et1 = Kb + m1b;
163 double s = pow(m1b, 2) + pow(m2b, 2) + 2 * m2b * Et1;
167 double a = 4. * m2b * s;
168 double b = (pow(m3b, 2) - pow(m4b, 2) + s) * (pow(m1b, 2) - pow(m2b, 2) - s);
172 double Et3 = (
c * cos((180. - thetacm) * 3.1415926535 / 180) - b) / a;
175 double K3 = Et3 - m3b;
180 u = pow(m2b, 2) + pow(m3b, 2) - 2 * m2b * Et3;
182 double theta_lab = acos(
183 ((s - pow(m1b, 2) - pow(m2b, 2)) * (pow(m2b, 2) + pow(m3b, 2) - u) +
184 2. * pow(m2b, 2) * (pow(m2b, 2) + pow(m4b, 2) - s - u)) /
188 kinrec[1] = theta_lab;
198 static std::vector<double> Pproton(3);
200 double mp = 1.0078250322 * 931.494;
201 double mn = 1.0086649158 * 931.494;
202 double md = mp + mn + 1.0 * (gRandom->Uniform());
203 double pdL[3] = {Pdeuteron->at(0), Pdeuteron->at(1), Pdeuteron->at(2)};
204 double EdL = sqrt(pow(pdL[0], 2) + pow(pdL[1], 2) + pow(pdL[2], 2) + pow(md, 2));
207 double normPdL = sqrt(pow(pdL[0], 2) + pow(pdL[1], 2) + pow(pdL[2], 2));
208 double betad = normPdL / EdL;
209 double gammad = 1.0 / sqrt(1.0 - pow(betad, 2));
210 double S_pn = pow(md, 2);
214 double ran1 = (gRandom->Uniform());
215 double ran2 = (gRandom->Uniform());
216 double thetapn = acos(2 * ran1 - 1.);
217 double phipn = 2 * TMath::Pi() * ran2;
220 double pprest[3], pnrest[3];
221 pprest[2] = Pcpn * cos(thetapn);
222 pprest[0] = Pcpn * sin(thetapn) * cos(phipn);
223 pprest[1] = Pcpn * sin(thetapn) * sin(phipn);
224 pnrest[2] = -1 * pprest[2];
225 pnrest[0] = -1 * pprest[0];
226 pnrest[1] = -1 * pprest[1];
227 double Eprest = sqrt(pow(Pcpn, 2) + pow(mp, 2));
228 double Enrest = sqrt(pow(Pcpn, 2) + pow(mn, 2));
231 double ppL[3], pnL[3];
234 ppL[2] = gammad * (pprest[2] + betad * Eprest);
239 pnL[2] = gammad * (pnrest[2] + betad * Enrest);
243 std::vector<double> fvfrom(3);
244 std::vector<double> fvto(3);
245 std::vector<double> fvin(3);
246 std::vector<double> fvout(3);
257 Pproton.at(0) = fvout.at(0);
258 Pproton.at(1) = fvout.at(1);
259 Pproton.at(2) = fvout.at(2);
283 if (fBeamEnergy == 0) {
284 std::cout <<
"-I- AtTP_Background : No solution!" << std::endl;
307 m1 = Masses.at(0) *
amu + fExEnergy.at(0);
308 m2 = Masses.at(1) *
amu + fExEnergy.at(1);
309 m3 = Masses.at(2) *
amu;
310 m4 = Masses.at(3) *
amu + fExEnergy.at(3);
311 m7 = Masses.at(4) *
amu;
312 m8 = Masses.at(5) *
amu + fExEnergy.at(5);
313 K1 = sqrt(pow(fPx.at(0), 2) + pow(fPy.at(0), 2) + pow(fPz.at(0), 2) + pow(m1, 2)) - m1;
316 Double_t fThetaCmsMin = 0.;
317 Double_t fThetaCmsMax = 8;
319 Double_t costhetamin = TMath::Cos(fThetaCmsMin * TMath::DegToRad());
320 Double_t costhetamax = TMath::Cos(fThetaCmsMax * TMath::DegToRad());
351 Double_t thetacmsInput =
352 TMath::ACos((costhetamax - costhetamin) * gRandom->Uniform() + costhetamin) * TMath::RadToDeg();
354 Double_t phi1 = 2 * TMath::Pi() * gRandom->Uniform();
355 Double_t krec = *(kin2B1 + 0);
356 Double_t angrec = *(kin2B1 + 1);
357 Prec = sqrt(pow(krec, 2) + 2 * krec * m2);
358 std::vector<double> Pdeut(3);
359 Pdeut.at(0) = (Prec * sin(angrec) * cos(phi1));
360 Pdeut.at(1) = (Prec * sin(angrec) * sin(phi1));
361 Pdeut.at(2) = (Prec * cos(angrec));
363 fPx.at(2) = (Pprot1.at(0)) / 1000.0;
364 fPy.at(2) = (Pprot1.at(1)) / 1000.0;
365 fPz.at(2) = (Pprot1.at(2)) / 1000.0;
372 thetacmsInput = TMath::ACos((costhetamax - costhetamin) * gRandom->Uniform() + costhetamin) * TMath::RadToDeg();
374 Double_t phi2 = 2 * TMath::Pi() * gRandom->Uniform();
375 krec = *(kin2B2 + 0);
376 angrec = *(kin2B2 + 1);
377 Prec = sqrt(pow(krec, 2) + 2 * krec * m2);
378 Pdeut.at(0) = (Prec * sin(angrec) * cos(phi2));
379 Pdeut.at(1) = (Prec * sin(angrec) * sin(phi2));
380 Pdeut.at(2) = (Prec * cos(angrec));
382 fPx.at(3) = (Pprot2.at(0)) / 1000.0;
383 fPy.at(3) = (Pprot2.at(1)) / 1000.0;
384 fPz.at(3) = (Pprot2.at(2)) / 1000.0;
393 thetacmsInput = TMath::ACos((costhetamax - costhetamin) * gRandom->Uniform() + costhetamin) * TMath::RadToDeg();
395 Double_t phi3 = 2 * TMath::Pi() * gRandom->Uniform();
396 krec = *(kin2B3 + 0);
397 angrec = *(kin2B3 + 1);
398 Prec = sqrt(pow(krec, 2) + 2 * krec * m2);
399 Pdeut.at(0) = (Prec * sin(angrec) * cos(phi3));
400 Pdeut.at(1) = (Prec * sin(angrec) * sin(phi3));
401 Pdeut.at(2) = (Prec * cos(angrec));
403 fPx.at(4) = (Pprot3.at(0)) / 1000.0;
404 fPy.at(4) = (Pprot3.at(1)) / 1000.0;
405 fPz.at(4) = (Pprot3.at(2)) / 1000.0;
412 thetacmsInput = TMath::ACos((costhetamax - costhetamin) * gRandom->Uniform() + costhetamin) * TMath::RadToDeg();
414 Double_t phi4 = 2 * TMath::Pi() * gRandom->Uniform();
415 krec = *(kin2B4 + 0);
416 angrec = *(kin2B4 + 1);
417 Prec = sqrt(pow(krec, 2) + 2 * krec * m2);
418 Pdeut.at(0) = (Prec * sin(angrec) * cos(phi4));
419 Pdeut.at(1) = (Prec * sin(angrec) * sin(phi4));
420 Pdeut.at(2) = (Prec * cos(angrec));
422 fPx.at(5) = (Pprot4.at(0)) / 1000.0;
423 fPy.at(5) = (Pprot4.at(1)) / 1000.0;
424 fPz.at(5) = (Pprot4.at(2)) / 1000.0;
431 random_r = 1.0 * (gRandom->Gaus(0, 1));
432 random_phi = 2.0 * TMath::Pi() * (gRandom->Uniform());
434 }
while (fabs(random_r) > 4.7);
436 for (Int_t i = 0; i < fMult; i++) {
440 fVx = random_r * cos(random_phi);
441 fVy = random_r * sin(random_phi);
442 fVz = 100.0 * (gRandom->Uniform());
449 std::cout <<
" Momentum (" << fPx.at(i) <<
", " << fPy.at(i) <<
", " << fPz.at(i) <<
") Gev from vertex ("
450 << fVx <<
", " << fVy <<
", " << fVz <<
") cm" << std::endl;
452 primGen->AddTrack(pdgType, fPx.at(i), fPy.at(i), fPz.at(i), fVx, fVy, fVz);