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