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);