/*
<img src="picts/AliGeneratorClass.gif">
</pre>
<br clear=left>
<font size=+2 color=red>
<p>The responsible person for this module is
<a href="mailto:andreas.morsch@cern.ch">Andreas Morsch</a>.
</font>
<pre>
*/
//End_Html
#include <TGenerator.h>
#include <TMCProcess.h>
#include "AliLog.h"
#include "AliCollisionGeometry.h"
#include "AliConfig.h"
#include "AliGenerator.h"
#include "AliRun.h"
#include "AliStack.h"
#include "AliMC.h"
#include "AliVertexGenerator.h"
ClassImp(AliGenerator)
AliGenerator::AliGenerator():
TNamed(),
AliRndm(),
fMCEvGen(0),
fThetaMin(0),
fThetaMax(0),
fPhiMin(0),
fPhiMax(0),
fPMin(0),
fPMax(0),
fPtMin(0),
fPtMax(0),
fYMin(0),
fYMax(0),
fVMin(3),
fVMax(3),
fNpart(0),
fParentWeight(0),
fChildWeight(0),
fAnalog(0),
fVertexSmear(kNoSmear),
fVertexSource(kInternal),
fCutVertexZ(0),
fPileUpTimeWindow(-1.),
fTrackIt(0),
fVertexGenerator(0),
fOrigin(3),
fOsigma(3),
fVertex(3),
fTimeOrigin(0.),
fTime(0.),
fEvPlane(0),
fStack(0),
fContainer(0),
fCollisionGeometry(0),
fEnergyCMS(0),
fAProjectile(0),
fZProjectile(0),
fATarget(0),
fZTarget(0),
fProjectile(""),
fTarget("")
{
if (gAlice) {
AliDebug(1, "AliGenerator Default Constructor");
AliMC * mc = gAlice->GetMCApp();
if (mc) mc->SetGenerator(this);
}
SetThetaRange(); ResetBit(kThetaRange);
SetPhiRange(); ResetBit(kPhiRange);
SetMomentumRange(); ResetBit(kMomentumRange);
SetPtRange(); ResetBit(kPtRange);
SetYRange(); ResetBit(kYRange);
SetNumberParticles();
SetTrackingFlag();
SetCutVertexZ();
fOrigin[0]=fOrigin[1]=fOrigin[2]=0;
fOsigma[0]=fOsigma[1]=fOsigma[2]=0;
fVertex[0]=fVertex[1]=fVertex[2]=0;
fVMin[0]=fVMin[1]=fVMin[2]=0;
fVMax[0]=fVMax[1]=fVMax[2]=10000;
}
AliGenerator::AliGenerator(Int_t npart):
TNamed(),
AliRndm(),
fMCEvGen(0),
fThetaMin(0),
fThetaMax(0),
fPhiMin(0),
fPhiMax(0),
fPMin(0),
fPMax(0),
fPtMin(0),
fPtMax(0),
fYMin(0),
fYMax(0),
fVMin(3),
fVMax(3),
fNpart(0),
fParentWeight(0),
fChildWeight(0),
fAnalog(0),
fVertexSmear(kNoSmear),
fVertexSource(kInternal),
fCutVertexZ(0),
fPileUpTimeWindow(-1.),
fTrackIt(0),
fVertexGenerator(0),
fOrigin(3),
fOsigma(3),
fVertex(3),
fTimeOrigin(0.),
fTime(0.),
fEvPlane(0),
fStack(0),
fContainer(0),
fCollisionGeometry(0),
fEnergyCMS(0),
fAProjectile(0),
fZProjectile(0),
fATarget(0),
fZTarget(0),
fProjectile(""),
fTarget("")
{
if (gAlice) {
AliDebug(1, "AliGenerator Constructor initializing number of particles");
AliMC * mc = gAlice->GetMCApp();
if (mc) mc->SetGenerator(this);
}
SetThetaRange(); ResetBit(kThetaRange);
SetPhiRange(); ResetBit(kPhiRange);
SetMomentumRange(); ResetBit(kMomentumRange);
SetPtRange(); ResetBit(kPtRange);
SetYRange(); ResetBit(kYRange);
SetTrackingFlag();
SetCutVertexZ();
fOrigin[0]=fOrigin[1]=fOrigin[2]=0;
fOsigma[0]=fOsigma[1]=fOsigma[2]=0;
fVertex[0]=fVertex[1]=fVertex[2]=0;
fVMin[0]=fVMin[1]=fVMin[2]=0;
fVMax[0]=fVMax[1]=fVMax[2]=10000;
SetNumberParticles(npart);
AliConfig::Instance()->Add(this);
}
AliGenerator::~AliGenerator()
{
fOrigin.Set(0);
fOsigma.Set(0);
if (fMCEvGen) {
delete fMCEvGen;
fMCEvGen=0;
}
}
void AliGenerator::Init()
{
}
void AliGenerator::GenerateN(Int_t ntimes)
{
for (Int_t i=0; i < ntimes; i++) {
Generate();
}
}
void AliGenerator::SetOrigin(Float_t ox, Float_t oy, Float_t oz)
{
fOrigin[0]=ox;
fOrigin[1]=oy;
fOrigin[2]=oz;
}
void AliGenerator::SetOrigin(const TLorentzVector &o)
{
fOrigin[0]=o[0];
fOrigin[1]=o[1];
fOrigin[2]=o[2];
}
void AliGenerator::SetSigma(Float_t sx, Float_t sy, Float_t sz)
{
fOsigma[0]=sx;
fOsigma[1]=sy;
fOsigma[2]=sz;
}
void AliGenerator::SetMomentumRange(Float_t pmin, Float_t pmax)
{
fPMin = pmin;
fPMax = pmax;
SetBit(kMomentumRange);
}
void AliGenerator::SetPtRange(Float_t ptmin, Float_t ptmax)
{
fPtMin = ptmin;
fPtMax = ptmax;
SetBit(kPtRange);
}
void AliGenerator::SetPhiRange(Float_t phimin, Float_t phimax)
{
fPhiMin = TMath::Pi()*phimin/180;
fPhiMax = TMath::Pi()*phimax/180;
SetBit(kPhiRange);
}
void AliGenerator::SetYRange(Float_t ymin, Float_t ymax)
{
fYMin=ymin;
fYMax=ymax;
SetBit(kYRange);
}
void AliGenerator::SetVRange(Float_t vxmin, Float_t vxmax,
Float_t vymin, Float_t vymax,
Float_t vzmin, Float_t vzmax)
{
fVMin[0]=vxmin; fVMin[1]=vymin; fVMin[2]=vzmin;
fVMax[0]=vxmax; fVMax[1]=vymax; fVMax[2]=vzmax;
SetBit(kVertexRange);
}
void AliGenerator::SetThetaRange(Float_t thetamin, Float_t thetamax)
{
fThetaMin = TMath::Pi()*thetamin/180;
fThetaMax = TMath::Pi()*thetamax/180;
SetBit(kThetaRange);
}
void AliGenerator::Vertex()
{
if (fVertexSource == kInternal) {
VertexInternal();
} else if (fVertexSource == kContainer) {
;
} else if (fVertexSource == kExternal) {
VertexExternal();
}
}
void AliGenerator::VertexExternal()
{
TVector3 vertex = fVertexGenerator->GetVertex();
fVertex[0] = vertex.X();
fVertex[1] = vertex.Y();
fVertex[2] = vertex.Z();
fTime = 0.;
}
void AliGenerator::VertexInternal()
{
Float_t random[6];
Float_t dv[3];
Int_t j;
dv[2] = 1.e10;
if (!TestBit(kVertexRange)) {
while(TMath::Abs(dv[2]) > fCutVertexZ*fOsigma[2]) {
Rndm(random,6);
for (j=0; j < 3; j++) {
dv[j] = fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
}
}
for (j=0; j < 3; j++) fVertex[j] = fOrigin[j] + dv[j];
Rndm(random,2);
fTime = fTimeOrigin + fOsigma[2]/TMath::Ccgs()*
TMath::Cos(2*random[0]*TMath::Pi())*
TMath::Sqrt(-2*TMath::Log(random[1]));
} else {
Rndm(random,3);
for (j=0; j < 3; j++)
fVertex[j] = fVMin[j] + random[j] * (fVMax[j] - fVMin[j]);
fTime = 0.;
}
}
void AliGenerator::PushTrack(Int_t done, Int_t parent, Int_t pdg,
Float_t *pmom, Float_t *vpos, Float_t *polar,
Float_t tof, TMCProcess mech, Int_t &ntr,
Float_t weight, Int_t is)
{
if (fStack)
fStack->PushTrack(done, parent, pdg, pmom, vpos, polar, tof,
mech, ntr, weight, is);
else
gAlice->GetMCApp()->PushTrack(done, parent, pdg, pmom, vpos, polar, tof,
mech, ntr, weight, is);
}
void AliGenerator::PushTrack(Int_t done, Int_t parent, Int_t pdg,
Double_t px, Double_t py, Double_t pz, Double_t e,
Double_t vx, Double_t vy, Double_t vz, Double_t tof,
Double_t polx, Double_t poly, Double_t polz,
TMCProcess mech, Int_t &ntr, Float_t weight, Int_t is)
{
if (fStack)
fStack->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
polx, poly, polz, mech, ntr, weight, is);
else
gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,
polx, poly, polz, mech, ntr, weight, is);
}
void AliGenerator:: KeepTrack(Int_t itrack)
{
if (fStack)
fStack->KeepTrack(itrack);
else
gAlice->GetMCApp()->KeepTrack(itrack);
}
void AliGenerator:: SetHighWaterMark(Int_t nt)
{
if (fStack)
fStack->SetHighWaterMark(nt);
else
gAlice->GetMCApp()->SetHighWaterMark(nt);
}
void AliGenerator::FinishRun()
{
;
}
void AliGenerator::SetSeed(UInt_t seed)
{
AliFatal("Not implemented!");
}