6 #include <FairParticle.h>
7 #include <FairPrimaryGenerator.h>
8 #include <FairRunSim.h>
10 #include <TDatabasePDG.h>
12 #include <TMathBase.h>
13 #include <TParticle.h>
14 #include <TParticlePDG.h>
23 constexpr
auto cRED =
"\033[1;31m";
26 constexpr
auto cGREEN =
"\033[1;32m";
27 constexpr
auto cBLUE =
"\033[1;34m";
29 constexpr
float amu = 931.494;
31 Int_t AtTPC_d2He::fgNIon = 0;
39 inline Double_t
sign(Double_t num)
43 return (num == 0) ? 1 : -1;
48 Int_t mult, std::vector<Double_t> *px, std::vector<Double_t> *py, std::vector<Double_t> *pz,
49 std::vector<Double_t> *mass, std::vector<Double_t> *Ex, std::vector<Double_t> *cross1,
50 std::vector<Double_t> *cross2, std::vector<Double_t> *cross3, Int_t N_data)
51 : fPx(0.), fPy(0.), fPz(0.), fMult(mult), fVx(0.), fVy(0.), fVz(0.), fIon(0)
59 auto *kProton =
new TParticle();
60 kProton->SetPdgCode(2212);
62 auto *kNeutron =
new TParticle();
63 kNeutron->SetPdgCode(2112);
66 for (Int_t i = 0; i < N_data; i++) {
67 inp1.push_back(cross1->at(i));
68 inp2.push_back(cross2->at(i));
69 inp3.push_back(cross3->at(i));
78 for (Int_t i = 0; i < fMult; i++) {
80 fPx.push_back(px->at(i));
81 fPy.push_back(py->at(i));
82 fPz.push_back(pz->at(i));
83 Masses.push_back(mass->at(i));
84 fExEnergy.push_back(Ex->at(i));
88 FairParticle *ParticleBuff;
89 sprintf(buffer,
"Product_Ion%d", i);
91 IonBuff =
new FairIon(buffer, z->at(i), a->at(i), q->at(i), 0.0,
92 mass->at(i) *
amu / 1000.0);
93 ParticleBuff =
new FairParticle(
"dummyPart", 1, 1, 1.0, 0, 0.0, 0.0);
94 fPType.emplace_back(
"Ion");
97 }
else if (a->at(i) == 1 && z->at(i) == 1) {
99 IonBuff =
new FairIon(buffer, z->at(i), a->at(i), q->at(i), 0.0,
100 mass->at(i) *
amu / 1000.0);
101 ParticleBuff =
new FairParticle(2212, kProton);
102 fPType.emplace_back(
"Proton");
104 }
else if (a->at(i) == 1 && z->at(i) == 0) {
106 IonBuff =
new FairIon(buffer, z->at(i), a->at(i), q->at(i), 0.0,
107 mass->at(i) *
amu / 1000.0);
108 ParticleBuff =
new FairParticle(2112, kNeutron);
109 fPType.emplace_back(
"Neutron");
114 fIon.push_back(IonBuff);
115 fParticle.push_back(ParticleBuff);
118 FairRunSim *run = FairRunSim::Instance();
120 std::cout <<
"-E- FairIonGenerator: No FairRun instantised!" << std::endl;
121 Fatal(
"FairIonGenerator",
"No FairRun instantised!");
124 for (Int_t i = 0; i < fMult; i++) {
126 if (fPType.at(i) ==
"Ion") {
128 run->AddNewIon(fIon.at(i));
132 }
else if (fPType.at(i) ==
"Proton") {
139 }
else if (fPType.at(i) ==
"Neutron") {
152 std::vector<Double_t>
153 AtTPC_d2He::TRANSF(std::vector<Double_t> *from, std::vector<Double_t> *to, std::vector<Double_t> *vin)
156 static std::vector<double> vout(3);
158 double normn, normf, normt;
161 normf = sqrt(pow(from->at(0), 2) + pow(from->at(1), 2) + pow(from->at(2), 2));
162 normt = sqrt(pow(to->at(0), 2) + pow(to->at(1), 2) + pow(to->at(2), 2));
165 acos(((from->at(0)) * (to->at(0)) + (from->at(1)) * (to->at(1)) + (from->at(2)) * (to->at(2))) / (normf * normt));
167 b = 1.0 - cos(alpha);
169 if (fabs(alpha) < 0.000001) {
170 vout.at(0) = vin->at(0);
171 vout.at(1) = vin->at(1);
172 vout.at(2) = vin->at(2);
175 n[0] = ((from->at(1)) * (to->at(2)) - (from->at(2)) * (to->at(1)));
176 n[1] = ((from->at(2)) * (to->at(0)) - (from->at(0)) * (to->at(2)));
177 n[2] = ((from->at(0)) * (to->at(1)) - (from->at(1)) * (to->at(0)));
182 normn = sqrt(pow(n[0], 2) + pow(n[1], 2) + pow(n[2], 2));
187 vout.at(0) = (1 - b * (pow(n[2], 2) + pow(n[1], 2))) * (vin->at(0)) +
188 (-a * n[2] + b * n[0] * n[1]) * (vin->at(1)) + (a * n[1] + b * n[0] * n[2]) * (vin->at(2));
189 vout.at(1) = (a * n[2] + b * n[0] * n[1]) * (vin->at(0)) +
190 (1 - b * (pow(n[2], 2) + pow(n[0], 2))) * (vin->at(1)) +
191 (-a * n[0] + b * n[1] * n[2]) * (vin->at(2));
192 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)) +
193 (1 - b * (pow(n[1], 2) + pow(n[0], 2))) * (vin->at(2));
201 return sqrt(x * x +
y *
y + z * z - 2 * x *
y - 2 *
y * z - 2 * x * z);
208 std::vector<Double_t> Ang;
209 std::vector<Double_t> Ene;
226 if (fBeamEnergy == 0) {
227 std::cout <<
"-I- AtTP_d2He : No solution!" << std::endl;
264 theta_cm = (inp2.at(0) + 0.25 * gRandom->Uniform()) *
267 theta_cm = (inp2.at(0) - 0.25 + 0.5 * gRandom->Uniform()) * TMath::DegToRad();
268 phi_cm = 2 * TMath::Pi() * (gRandom->Uniform());
269 epsilon = inp1.at(0) - 0.125 + 0.25 * gRandom->Uniform();
272 ran_theta = fN * gRandom->Uniform();
273 ranX = fCStot * gRandom->Uniform();
274 }
while (ranX > inp3.at(ran_theta));
277 theta_cm = TMath::Abs(inp2.at(ran_theta) - 0.5 + gRandom->Uniform()) * TMath::DegToRad();
278 phi_cm = 2 * TMath::Pi() * (gRandom->Uniform());
279 epsilon = TMath::Abs(inp1.at(ran_theta) - 0.25 + 0.5 * gRandom->Uniform());
294 Ex_ejectile = fExEnergy.at(2);
296 m1 = Masses.at(0) *
amu + fExEnergy.at(0);
297 m2 = Masses.at(1) *
amu + fExEnergy.at(1);
298 m3 = Masses.at(2) *
amu + Ex_ejectile;
299 m4 = Masses.at(3) *
amu + epsilon;
300 m7 = Masses.at(4) *
amu;
301 m8 = Masses.at(5) *
amu;
303 K1 = sqrt(pow(fPxBeam * 1000.0, 2) + pow(fPyBeam * 1000.0, 2) + pow(fPzBeam * 1000.0, 2) + pow(m1, 2)) - m1;
305 p1L[0] = fPxBeam * 1000.0;
306 p1L[1] = fPyBeam * 1000.0;
307 p1L[2] = fPzBeam * 1000.0;
315 beta_cm = p1L[2] / (E1L + m2);
316 gamma_cm = 1.0 / sqrt(1.0 - pow(beta_cm, 2));
317 S = 2. * E1L * m2 + pow(m1, 2) + pow(m2, 2);
324 p4C[2] = Pcm * cos(TMath::Pi() - theta_cm);
325 p4C[0] = Pcm * sin(TMath::Pi() - theta_cm) * cos(phi_cm);
326 p4C[1] = Pcm * sin(TMath::Pi() - theta_cm) * sin(phi_cm);
327 E4C = sqrt(pow(Pcm, 2) + pow(m4, 2));
329 for (
int i = 0; i < 3; i++) {
330 p3C[i] = -1. * p4C[i];
332 E3C = sqrt(pow(Pcm, 2) + pow(m3, 2));
337 p3L[2] = gamma_cm * (p3C[2] + beta_cm * E3C);
338 E3L = sqrt(pow(p3L[0], 2) + pow(p3L[1], 2) + pow(p3L[2], 2) + pow(m3, 2));
342 p4L[2] = gamma_cm * (p4C[2] + beta_cm * E4C);
343 E4L = sqrt(pow(p4L[0], 2) + pow(p4L[1], 2) + pow(p4L[2], 2) + pow(m4, 2));
366 p3L[0] = fvout.at(0);
367 p3L[1] = fvout.at(1);
368 p3L[2] = fvout.at(2);
369 E3L = sqrt(pow(p3L[0], 2) + pow(p3L[1], 2) + pow(p3L[2], 2) + pow(m3, 2));
375 p4L[0] = fvout.at(0);
376 p4L[1] = fvout.at(1);
377 p4L[2] = fvout.at(2);
378 E4L = sqrt(pow(p4L[0], 2) + pow(p4L[1], 2) + pow(p4L[2], 2) + pow(m4, 2));
381 normP4L = sqrt(pow(p4L[0], 2) + pow(p4L[1], 2) + pow(p4L[2], 2));
382 beta4 = normP4L / E4L;
383 gamma4 = 1.0 / sqrt(1.0 - pow(beta4, 2));
388 ran1 = (gRandom->Uniform());
389 ran2 = (gRandom->Uniform());
390 theta78 = acos(2 * ran1 - 1.);
391 phi78 = 2 * TMath::Pi() * ran2;
394 p7rest[2] = Pc78 * cos(theta78);
395 p7rest[0] = Pc78 * sin(theta78) * cos(phi78);
396 p7rest[1] = Pc78 * sin(theta78) * sin(phi78);
397 p8rest[2] = -1 * p7rest[2];
398 p8rest[0] = -1 * p7rest[0];
399 p8rest[1] = -1 * p7rest[1];
400 E7rest = sqrt(pow(Pc78, 2) + pow(m7, 2));
401 E8rest = sqrt(pow(Pc78, 2) + pow(m8, 2));
406 p7L[2] = gamma4 * (p7rest[2] + beta4 * E7rest);
407 E7L = sqrt(pow(m7, 2) + pow(p7L[0], 2) + pow(p7L[1], 2) + pow(p7L[2], 2));
411 p8L[2] = gamma4 * (p8rest[2] + beta4 * E8rest);
412 E8L = sqrt(pow(m8, 2) + pow(p8L[0], 2) + pow(p8L[1], 2) + pow(p8L[2], 2));
422 p7L[0] = fvout.at(0);
423 p7L[1] = fvout.at(1);
424 p7L[2] = fvout.at(2);
430 p8L[0] = fvout.at(0);
431 p8L[1] = fvout.at(1);
432 p8L[2] = fvout.at(2);
434 E7L = sqrt(pow(m7, 2) + pow(p7L[0], 2) + pow(p7L[1], 2) + pow(p7L[2], 2));
435 E8L = sqrt(pow(m8, 2) + pow(p8L[0], 2) + pow(p8L[1], 2) + pow(p8L[2], 2));
437 fPx.at(2) = p3L[0] / 1000.0;
438 fPy.at(2) = p3L[1] / 1000.0;
439 fPz.at(2) = p3L[2] / 1000.0;
441 fPx.at(3) = p4L[0] / 1000.0;
442 fPy.at(3) = p4L[1] / 1000.0;
443 fPz.at(3) = p4L[2] / 1000.0;
445 fPx.at(4) = p7L[0] / 1000.0;
446 fPy.at(4) = p7L[1] / 1000.0;
447 fPz.at(4) = p7L[2] / 1000.0;
449 fPx.at(5) = p8L[0] / 1000.0;
450 fPy.at(5) = p8L[1] / 1000.0;
451 fPz.at(5) = p8L[2] / 1000.0;
453 Ene.at(0) = E3L - m3;
454 Ang.at(0) = acos((p1L[0] * p3L[0] + p1L[1] * p3L[1] + p1L[2] * p3L[2]) /
455 (sqrt(pow(p1L[0], 2) + pow(p1L[1], 2) + pow(p1L[2], 2)) *
456 sqrt(pow(p3L[0], 2) + pow(p3L[1], 2) + pow(p3L[2], 2)))) *
458 Ene.at(1) = E4L - m4;
459 Ang.at(1) = acos((p1L[0] * p4L[0] + p1L[1] * p4L[1] + p1L[2] * p4L[2]) /
460 (sqrt(pow(p1L[0], 2) + pow(p1L[1], 2) + pow(p1L[2], 2)) *
461 sqrt(pow(p4L[0], 2) + pow(p4L[1], 2) + pow(p4L[2], 2)))) *
463 Ene.at(2) = E7L - m7;
464 Ang.at(2) = acos((p1L[0] * p7L[0] + p1L[1] * p7L[1] + p1L[2] * p7L[2]) /
465 (sqrt(pow(p1L[0], 2) + pow(p1L[1], 2) + pow(p1L[2], 2)) *
466 sqrt(pow(p7L[0], 2) + pow(p7L[1], 2) + pow(p7L[2], 2)))) *
468 Ene.at(3) = E8L - m8;
469 Ang.at(3) = acos((p1L[0] * p8L[0] + p1L[1] * p8L[1] + p1L[2] * p8L[2]) /
470 (sqrt(pow(p1L[0], 2) + pow(p1L[1], 2) + pow(p1L[2], 2)) *
471 sqrt(pow(p8L[0], 2) + pow(p8L[1], 2) + pow(p8L[2], 2)))) *
474 if (std::isnan(Ene.at(0)) || std::isnan(Ene.at(1)) || std::isnan(Ene.at(2)) || std::isnan(Ene.at(3))) {
523 TVector3 ScatP(fPx.at(2), fPy.at(2), fPz.at(2));
540 std::cout <<
cYELLOW <<
"vertex in AtTPC_d2He " << fVx <<
" " << fVy <<
" " << fVz <<
cNORMAL << std::endl;
542 for (Int_t i = 0; i < fMult; i++) {
543 TParticlePDG *thisPart;
545 if (fPType.at(i) ==
"Ion")
546 thisPart = TDatabasePDG::Instance()->GetParticle(fIon.at(i)->GetName());
547 else if (fPType.at(i) ==
"Proton")
548 thisPart = TDatabasePDG::Instance()->GetParticle(fParticle.at(i)->GetName());
549 else if (fPType.at(i) ==
"Neutron")
550 thisPart = TDatabasePDG::Instance()->GetParticle(fParticle.at(i)->GetName());
553 if (fPType.at(i) ==
"Ion")
554 std::cout <<
"-W- FairIonGenerator: Ion " << fIon.at(i)->GetName() <<
" not found in database!"
556 else if (fPType.at(i) ==
"Proton")
557 std::cout <<
"-W- FairIonGenerator: Particle " << fParticle.at(i)->GetName() <<
" not found in database!"
559 else if (fPType.at(i) ==
"Neutron")
560 std::cout <<
"-W- FairIonGenerator: Particle " << fParticle.at(i)->GetName() <<
" not found in database!"
565 int pdgType = thisPart->PdgCode();
585 fPType.at(i) ==
"Ion") {
594 primGen->AddTrack(pdgType, fPx.at(i), fPy.at(i), fPz.at(i), fVx, fVy, fVz);
597 fPType.at(i) ==
"Proton") {
606 primGen->AddTrack(pdgType, fPx.at(i), fPy.at(i), fPz.at(i), fVx, fVy, fVz);
609 fPType.at(i) ==
"Neutron") {
617 primGen->AddTrack(pdgType, fPx.at(i), fPy.at(i), fPz.at(i), fVx, fVy, fVz);