6 #include <FairPrimaryGenerator.h>
7 #include <FairRunSim.h>
9 #include <TDatabasePDG.h>
10 #include <TGenPhaseSpace.h>
11 #include <TLorentzVector.h>
13 #include <TParticlePDG.h>
21 Int_t AtTPCIonPhaseSpace::fgNIon = 0;
24 : fMult(0), fPx(0.), fPy(0.), fPz(0.), fVx(0.), fVy(0.), fVz(0.), fIon(0), fQ(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,
34 std::vector<Double_t> *mass, Double_t ResEner, Int_t ZB, Int_t AB, Double_t PxB,
35 Double_t PyB, Double_t PzB, Double_t BMass, Double_t TMass)
36 : fMult(mult), fPx(0.), fPy(0.), fPz(0.), fVx(0.), fVy(0.), fVz(0.), fIon(0), fQ(0), fBeamEnergy_buff(ResEner),
37 fBeamMass(BMass), fTargetMass(TMass), fZBeam(ZB), fABeam(AB), fPxBeam(PxB), fPyBeam(PyB), fPzBeam(PzB)
42 for (Int_t i = 0; i < fMult; i++) {
44 fPx.push_back(Double_t(a->at(i)) * px->at(i));
45 fPy.push_back(Double_t(a->at(i)) * py->at(i));
46 fPz.push_back(Double_t(a->at(i)) * pz->at(i));
47 Masses.push_back(mass->at(i));
50 new FairIon(TString::Format(
"Product_Ion%d", i).Data(), z->at(i), a->at(i), q->at(i), 0.0, mass->at(i));
54 std::cout <<
" Particle " << fMult <<
" mass " << IonBuff->GetMass() << std::endl;
55 fIon.push_back(IonBuff);
58 FairRunSim *run = FairRunSim::Instance();
60 std::cout <<
"-E- FairIonGenerator: No FairRun instantised!" << std::endl;
61 Fatal(
"FairIonGenerator",
"No FairRun instantised!");
64 for (Int_t i = 0; i < fMult; i++) {
65 run->AddNewIon(fIon.at(i));
66 std::cout <<
" Z " << z->at(i) <<
" A " << a->at(i) << std::endl;
67 std::cout << fIon.at(i)->GetName() << std::endl;
102 TLorentzVector fEnergyImpulsionLab_beam;
103 TLorentzVector fEnergyImpulsionLab_target;
104 TLorentzVector fEnergyImpulsionLab_Total;
105 TLorentzVector fEnergyImpulsionFinal;
106 TVector3 fImpulsionLab_beam;
107 TVector3 fImpulsionLab_target;
108 TLorentzVector *p1 =
nullptr;
109 TLorentzVector *p2 =
nullptr;
110 TLorentzVector *p3 =
nullptr;
111 std::vector<TLorentzVector *> p_vector;
112 TGenPhaseSpace event1;
165 Double_t mass_1[10] = {0.0};
177 fImpulsionLab_beam = TVector3(fPxBeam, fPyBeam, fPzBeam);
179 fEnergyImpulsionLab_beam = TLorentzVector(fImpulsionLab_beam, fBeamMass + fBeamEnergy);
182 fEnergyImpulsionLab_target = TLorentzVector(TVector3(0, 0, 0), fTargetMass);
184 fEnergyImpulsionLab_Total = fEnergyImpulsionLab_beam + fEnergyImpulsionLab_target;
185 s = fEnergyImpulsionLab_Total.M2();
187 std::cout <<
" fABeam : " << fABeam <<
" fPzBeam : " << fPzBeam <<
" fBeamEnergy : " << fBeamEnergy << std::endl;
189 for (Int_t i = 0; i < fMult; i++) {
191 M_tot += Masses.at(i) / 1000.0;
192 mass_1[i] = Masses.at(i) / 1000.0;
201 std::cout <<
" S : " << s <<
" Pow(M) " << pow(M_tot, 2) << std::endl;
203 if (s > pow(M_tot, 2)) {
207 event1.SetDecay(fEnergyImpulsionLab_Total, fMult, mass_1);
214 std::vector<Double_t> KineticEnergy;
215 std::vector<Double_t> ThetaLab;
217 std::cout <<
" ==== Phase Space Information ==== " << std::endl;
218 for (Int_t i = 0; i < fMult; i++) {
220 p_vector.push_back(event1.GetDecay(i));
221 fPx.at(i) = p_vector.at(i)->Px();
222 fPy.at(i) = p_vector.at(i)->Py();
223 fPz.at(i) = p_vector.at(i)->Pz();
224 KineticEnergy.push_back((p_vector.at(i)->E() - mass_1[i]) * 1000);
225 ThetaLab.push_back(p_vector.at(i)->Theta() * 180. / TMath::Pi());
226 std::cout <<
" Particle " << i <<
" - TKE (MeV) : " << KineticEnergy.at(i)
227 <<
" - Lab Angle (deg) : " << ThetaLab.at(i) << std::endl;
258 for (Int_t i = 0; i < fMult; i++) {
260 TParticlePDG *thisPart = TDatabasePDG::Instance()->GetParticle(fIon.at(i)->GetName());
263 std::cout <<
"-W- FairIonGenerator: Ion " << fIon.at(i)->GetName() <<
" not found in database!" << std::endl;
267 int pdgType = thisPart->PdgCode();
275 std::cout <<
"-I- FairIonGenerator: Generating " << fMult <<
" with mass " << thisPart->Mass() <<
" ions of type "
276 << fIon.at(i)->GetName() <<
" (PDG code " << pdgType <<
")" << std::endl;
277 std::cout <<
" Momentum (" << fPx.at(i) <<
", " << fPy.at(i) <<
", " << fPz.at(i) <<
") Gev from vertex ("
278 << fVx <<
", " << fVy <<
", " << fVz <<
") cm" << std::endl;
281 primGen->AddTrack(pdgType, fPx.at(i), fPy.at(i), fPz.at(i), fVx, fVy, fVz);