8 #include <FairLogger.h> 
    9 #include <FairPrimaryGenerator.h> 
   11 #include <TDatabasePDG.h> 
   13 #include <TParticlePDG.h> 
   21    : fPDGType(0), fMult(0), fPDGMass(0), fPtMin(0), fPtMax(0), fPhiMin(0), fPhiMax(0), fEtaMin(0), fEtaMax(0), fYMin(0),
 
   22      fYMax(0), fPMin(0), fPMax(0), fThetaMin(0), fThetaMax(0), fX(0), fY(0), fZ(0), fX1(0), fY1(0), fZ1(0), fX2(0),
 
   23      fY2(0), fZ2(0), fEtaRangeIsSet(false), fYRangeIsSet(false), fThetaRangeIsSet(false), fCosThetaIsSet(false),
 
   24      fPtRangeIsSet(false), fPRangeIsSet(false), fPointVtxIsSet(false), fBoxVtxIsSet(false), fDebug(false),
 
   25      fGammasDefinedInNuclearDecay(0), fBetaOfEmittingFragment(0), fGammaFactor(1), fLorentzBoostIsSet(false),
 
   26      fNuclearDecayChainIsSet(false)
 
   32    : fPDGType(pdgid), fMult(mult), fPDGMass(0), fPtMin(0), fPtMax(0), fPhiMin(0), fPhiMax(0), fEtaMin(0), fEtaMax(0),
 
   33      fYMin(0), fYMax(0), fPMin(0), fPMax(0), fThetaMin(0), fThetaMax(0), fX(0), fY(0), fZ(0), fX1(0), fY1(0), fZ1(0),
 
   34      fX2(0), fY2(0), fZ2(0), fEtaRangeIsSet(false), fYRangeIsSet(false), fThetaRangeIsSet(false), fCosThetaIsSet(false),
 
   35      fPtRangeIsSet(false), fPRangeIsSet(false), fPointVtxIsSet(false), fBoxVtxIsSet(false), fDebug(false),
 
   36      fGammasDefinedInNuclearDecay(0), fBetaOfEmittingFragment(0), fGammaFactor(1), fLorentzBoostIsSet(false),
 
   37      fNuclearDecayChainIsSet(false)
 
   49    if (fPhiMax - fPhiMin > 360)
 
   50       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: phi range is too wide: " << fPhiMin << 
"<phi<" << fPhiMax;
 
   51    if (fPRangeIsSet && fPtRangeIsSet)
 
   52       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: Cannot set P and Pt ranges simultaneously";
 
   53    if (fPRangeIsSet && fYRangeIsSet)
 
   54       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: Cannot set P and Y ranges simultaneously";
 
   55    if ((fThetaRangeIsSet && fYRangeIsSet) || (fThetaRangeIsSet && fEtaRangeIsSet) || (fYRangeIsSet && fEtaRangeIsSet))
 
   56       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: Cannot set Y, Theta or Eta ranges simultaneously";
 
   57    if (fPointVtxIsSet && fBoxVtxIsSet)
 
   58       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: Cannot set point and box vertices simultaneously";
 
   61    if (fBetaOfEmittingFragment > 1)
 
   62       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: beta of fragment larger than 1!";
 
   64    Double32_t sumBranchingRatios = 0;
 
   65    for (Int_t i = 0; i < fGammasDefinedInNuclearDecay; i++) {
 
   66       if (fGammaBranchingRatios[i] > 1)
 
   67          LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: gamma branching ratio in position " << i << 
" larger than 1!";
 
   68       sumBranchingRatios += fGammaBranchingRatios[i];
 
   70    if (sumBranchingRatios > 1)
 
   71       LOG(fatal) << 
"Init(): AtTPCGammaDummyGenerator: gamma branching ratio sum larger than 1!";
 
   74    TDatabasePDG *pdgBase = TDatabasePDG::Instance();
 
   75    TParticlePDG *particle = pdgBase->GetParticle(fPDGType);
 
   77       LOG(fatal) << 
"AtTPCGammaDummyGenerator: PDG code " << fPDGType << 
" not defined.";
 
   78    fPDGMass = particle->Mass(); 
 
   90    Double32_t pabs = 0, phi, pt = 0, theta = 0, eta, 
y, mt, px, py, pz = 0;
 
   92    Bool_t doNotBoost = 
false;
 
   95    for (Int_t k = 0; k < fMult; k++) {
 
   96       phi = gRandom->Uniform(fPhiMin, fPhiMax) * TMath::DegToRad();
 
   99          pabs = gRandom->Uniform(fPMin, fPMax);
 
  100       else if (fPtRangeIsSet)
 
  101          pt = gRandom->Uniform(fPtMin, fPtMax);
 
  103       if (fThetaRangeIsSet) {
 
  105             theta = acos(gRandom->Uniform(cos(fThetaMin * TMath::DegToRad()), cos(fThetaMax * TMath::DegToRad())));
 
  107             theta = gRandom->Uniform(fThetaMin, fThetaMax) * TMath::DegToRad();
 
  108       } 
else if (fEtaRangeIsSet) {
 
  109          eta = gRandom->Uniform(fEtaMin, fEtaMax);
 
  110          theta = 2 * TMath::ATan(TMath::Exp(-eta));
 
  111       } 
else if (fYRangeIsSet) {
 
  112          y = gRandom->Uniform(fYMin, fYMax);
 
  113          mt = TMath::Sqrt(fPDGMass * fPDGMass + pt * pt);
 
  114          pz = mt * TMath::SinH(
y);
 
  117       if (fThetaRangeIsSet || fEtaRangeIsSet) {
 
  119             pz = pabs * TMath::Cos(theta);
 
  120             pt = pabs * TMath::Sin(theta);
 
  121          } 
else if (fPtRangeIsSet)
 
  122             pz = pt / TMath::Tan(theta);
 
  125       px = pt * TMath::Cos(phi);
 
  126       py = pt * TMath::Sin(phi);
 
  129          fX = gRandom->Uniform(fX1, fX2);
 
  130          fY = gRandom->Uniform(fY1, fY2);
 
  131          fZ = gRandom->Uniform(fZ1, fZ2);
 
  134       if (fNuclearDecayChainIsSet) {
 
  136             LOG(fatal) << 
"AtTPCGammaDummyGenerator: PDG code " << fPDGType << 
" is not a gamma!";
 
  137          br = gRandom->Uniform();
 
  138          for (Int_t i = 0; i < fGammasDefinedInNuclearDecay; i++) {
 
  139             if (br < fGammaBranchingRatios[i]) {
 
  140                Double32_t gammaMomentum = TMath::Sqrt(px * px + py * py + pz * pz);
 
  141                px = px * fGammaEnergies[i] / gammaMomentum;
 
  142                py = py * fGammaEnergies[i] / gammaMomentum;
 
  143                pz = pz * fGammaEnergies[i] / gammaMomentum;
 
  146                br = br - fGammaBranchingRatios[i];
 
  161       if (fPDGType == 22 && fLorentzBoostIsSet && !doNotBoost) { 
 
  165          Double32_t gammaMomentum = TMath::Sqrt(px * px + py * py + pz * pz);
 
  166          pz = (pz + fBetaOfEmittingFragment * gammaMomentum) / fGammaFactor;
 
  167       } 
else if (fLorentzBoostIsSet && !doNotBoost) { 
 
  171          Double32_t particleEnergy = TMath::Sqrt(px * px + py * py + pz * pz + fPDGMass * fPDGMass);
 
  172          pz = (pz + fBetaOfEmittingFragment * particleEnergy) / fGammaFactor;
 
  176          printf(
"CALIFAtestGen: kf=%d, p=(%.2f, %.2f, %.2f) GeV, x=(%.1f, %.1f, %.1f) cm\n", fPDGType, px, py, pz, fX,
 
  179       primGen->AddTrack(fPDGType, px, py, pz, fX, fY, fZ);
 
  187    fBetaOfEmittingFragment = beta;
 
  188    fGammaFactor = TMath::Sqrt(1 - fBetaOfEmittingFragment * fBetaOfEmittingFragment);
 
  196    if (fGammasDefinedInNuclearDecay > 7)
 
  197       printf(
"CALIFAtestGen: Maximum number (8) of gammas defined in the chain\n");
 
  199       fGammaEnergies[fGammasDefinedInNuclearDecay] = gammaEnergy;
 
  200       fGammaBranchingRatios[fGammasDefinedInNuclearDecay] = branchingRatio;
 
  201       fGammasDefinedInNuclearDecay++;