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