FairRoot/PandaRoot
PndFixStepParticleGun.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndFixStepParticleGun source file -----
3 // ----- Created 10/30/08 by Tobias Stockmanns
4 // -------------------------------------------------------------------------
5 
6 
8 
9 #include "FairPrimaryGenerator.h"
10 
11 #include "TRandom.h"
12 #include "TParticlePDG.h"
13 #include "TDatabasePDG.h"
14 #include "TMath.h"
15 
16 // ------------------------------------------------------------------------
18  fPDGType(0),fMult(0),fEvent(0), fPDGMass(0),
19  fX(0),fY(0),fZ(0),
20  fX1(0),fY1(0),fX2(0),fY2(0),
21  fEtaRangeIsSet(0),fYRangeIsSet(0),fThetaRangeIsSet(0),
22  fCosThetaIsSet(0),fPtRangeIsSet(0),fPRangeIsSet(0),
23  fPointVtxIsSet(0),fBoxVtxIsSet(0),fDebug(0), fDoit(kTRUE), fFirstRun(kTRUE)
24 {
25  fPt.SetStart(0); fPt.SetStop(0); fPt.SetStep(0);
29  fP.SetStart(0);fP.SetStop(0); fP.SetStep(0);
31 }
32 
33 // ------------------------------------------------------------------------
35  fPDGType(pdgid),fMult(mult), fEvent(0),fPDGMass(0),
36  fX(0),fY(0),fZ(0),
37  fX1(0),fY1(0),fX2(0),fY2(0),
38  fEtaRangeIsSet(0),fYRangeIsSet(0),fThetaRangeIsSet(0),
39  fCosThetaIsSet(0),fPtRangeIsSet(0),fPRangeIsSet(0),
40  fPointVtxIsSet(0),fBoxVtxIsSet(0),fDebug(1), fDoit(kTRUE), fFirstRun(kTRUE)
41 {
42  // Constructor. Set default kinematics limits
43  fPt.SetStart(0); fPt.SetStop(0); fPt.SetStep(0);
47  fP.SetStart(0);fP.SetStop(0); fP.SetStep(0);
49 
50  SetPhiRange();
51 }
52 // ------------------------------------------------------------------------
54 {
55  // Initialize generator
56 
57  if (fPhi.fStop-fPhi.fStart>360)
58  Fatal("Init()","PndFixStepParticleGun: phi range is too wide: %f<phi<%f",
61  Fatal("Init()","PndFixStepParticleGun: Cannot set P and Pt ranges simultaneously");
63  Fatal("Init()","PndFixStepParticleGun: Cannot set P and Y ranges simultaneously");
64  if ( (fThetaRangeIsSet && fYRangeIsSet) ||
67  Fatal("Init()","PndFixStepParticleGun: Cannot set Y, Theta or Eta ranges simultaneously");
69  Fatal("Init()","PndFixStepParticleGun: Cannot set point and box vertices simultaneously");
70 
71  // Check for particle type
72  TDatabasePDG* pdgBase = TDatabasePDG::Instance();
73  TParticlePDG *particle = pdgBase->GetParticle(fPDGType);
74  if (! particle) Fatal("PndFixStepParticleGun","PDG code %d not defined.",fPDGType);
75  fPDGMass = particle->Mass();
76  return kTRUE;
77 }
78 
79 // ------------------------------------------------------------------------
81 {
82  // Generate one event: produce primary particles emitted from one vertex.
83  // Primary particles are distributed uniformly along
84  // those kinematics variables which were limitted by setters.
85  // if SetCosTheta() function is used, the distribution will be uniform in
86  // cos(theta)
87 
88  Double32_t pabs=0, phi, pt=0, theta=0, eta, y, mt, px, py, pz=0;
89 
90  // Generate particles
91  PndRangeValues* outerVal = &fPhi;
92  PndRangeValues* midVal = 0;
93  PndRangeValues* innerVal = 0;
94  if (fThetaRangeIsSet){
95  if (fCosThetaIsSet){
96  midVal = &fCosTheta;
97  //std::cout << "CosTheta selected: " << midVal->fStart << " " << midVal->fStop << " " << midVal->fStep << " " << midVal->fActualValue << " " <<std::endl;
98  } else
99  midVal = &fTheta;
100  }
101  else if (fEtaRangeIsSet)
102  midVal = &fEta;
103  else if (fYRangeIsSet)
104  midVal = &fRapidity;
105 
106  if (fPtRangeIsSet)
107  innerVal = &fPt;
108  else if (fPRangeIsSet)
109  innerVal = &fP;
110 
111  if (IsEndOfRanges(outerVal, midVal, innerVal) == true) return kTRUE;
112 
113  CalcActValues(outerVal, midVal, innerVal);
114  // std::cout << "outerVal, midVal, innerVal: " << outerVal->fActualValue << " " << midVal->fActualValue << " " << innerVal->fActualValue << std::endl;
115  // std::cout << "phi, cosTheta, p: " << fPhi.fActualValue << " " << fCosTheta.fActualValue << " " << fP.fActualValue << std::endl;
116 
117  if (fPRangeIsSet ) pabs = fP.fActualValue;
118  else if (fPtRangeIsSet) pt = fPt.fActualValue;
119 
120  phi = fPhi.fActualValue * TMath::DegToRad();
121 
122 
123  if(fThetaRangeIsSet) {
124  if (fCosThetaIsSet)
126  else
127  theta = fTheta.fActualValue * TMath::DegToRad();
128  }
129 
130  else if (fEtaRangeIsSet) {
132  theta = 2*TMath::ATan(TMath::Exp(-eta));
133  }
134  else if (fYRangeIsSet) {
136  mt = TMath::Sqrt(fPDGMass*fPDGMass + pt*pt);
137  pz = mt * TMath::SinH(y);
138  }
139 
141  if (fPRangeIsSet ) {
142  pz = pabs*TMath::Cos(theta);
143  pt = pabs*TMath::Sin(theta);
144  }
145  else if (fPtRangeIsSet)
146  pz = pt/TMath::Tan(theta);
147  }
148 
149  px = pt*TMath::Cos(phi);
150  py = pt*TMath::Sin(phi);
151 
152 /* if (fBoxVtxIsSet) {
153  fX = gRandom->Uniform(fX1,fX2);
154  fY = gRandom->Uniform(fY1,fY2);
155  }
156 */
157  if (fDebug)
158  printf("FlatGen: kf=%d, p=(%.2f, %.2f, %.2f) GeV, x=(%.1f, %.1f, %.1f) cm, Theta=%.1f phi=%.1f\n",
159  fPDGType, px, py, pz, fX, fY, fZ, theta*TMath::RadToDeg(), phi*TMath::RadToDeg());
160 
161  primGen->AddTrack(fPDGType, px, py, pz, fX, fY, fZ);
162  // }
163  return kTRUE;
164 
165 }
166 // ------------------------------------------------------------------------
168 {
169  if (val1 == 0)
170  val1 = new PndRangeValues();
171  if (val2 == 0)
172  val2 = new PndRangeValues();
173  if (val3 == 0)
174  val3 = new PndRangeValues();
175 
176  if (fDoit){
177  if (fFirstRun == kTRUE){
178  fFirstRun = kFALSE;
179  }
180  else {
181  val3->fActualValue += val3->fStep;
182  }
183  if (val3->fActualValue > val3->fStop && fDoit){
184  val3->fActualValue = val3->fStart;
185  val2->fActualValue += val2->fStep;
186  if (val2->fActualValue > val2->fStop && fDoit){
187  val2->fActualValue = val2->fStart;
188  val1->fActualValue += val1->fStep;
189  if (val1->fActualValue > val1->fStop && fDoit){
190  fDoit = false;
191  }
192  }
193  }
194  }
195  if (fDoit) fEvent++;
196  else
197  std::cout << "End of range reached at EventNr: " << fEvent << std::endl;
198 }
199 
201  if ((val1 == 0 || (val1->fActualValue + val1->fStep) > val1->fStop) &&
202  (val2 == 0 || (val2->fActualValue + val2->fStep) > val2->fStop) &&
203  (val3 == 0 || (val3->fActualValue + val3->fStep) > val3->fStop))
204  return true;
205  else
206  return false;
207 }
208 
211 }
212 
friend F32vec4 acos(const F32vec4 &a)
Definition: P4_F32vec4.h:113
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
void SetStep(Double32_t val)
void SetPhiRange(Double32_t phimin=0, Double32_t phimax=360, Double32_t phistep=1)
static T Sqrt(const T &x)
Definition: PndCAMath.h:37
static T Sin(const T &x)
Definition: PndCAMath.h:42
Double_t fX
Definition: PndCaloDraw.cxx:34
bool IsEndOfRanges(PndRangeValues *val1, PndRangeValues *val2, PndRangeValues *val3)
float Tan(float x)
Definition: PndCAMath.h:165
static T Cos(const T &x)
Definition: PndCAMath.h:43
Double_t fZ
Definition: PndCaloDraw.cxx:34
FairPrimaryGenerator * primGen
Definition: sim_emc_apd.C:81
TString pt(TString pts, TString exts="px py pz")
Definition: invexp.C:133
const int particle
virtual Bool_t ReadEvent(FairPrimaryGenerator *primGen)
void SetStop(Double32_t val)
void SetStart(Double32_t val)
Double_t fY
Definition: PndCaloDraw.cxx:34
void CalcActValues(PndRangeValues *val1, PndRangeValues *val2, PndRangeValues *val3)
ClassImp(PndAnaContFact)
TParticlePDG * eta
Double_t y
Double_t mult
double pz[39]
Definition: pipisigmas.h:14