// ALICE event generator based on the THERMINATOR model
// It reads the test output of the model and puts it onto
// the stack
+// It has an option to use the Lhyquid3D input freeze-out
+// hypersurface
// Author: Adam.Kisiel@cern.ch
#include <iostream>
fBWDelay(0.0)
{
// Default constructor
- fParticles = new TClonesArray("TParticle",20000);
}
AliGenTherminator::AliGenTherminator(Int_t npart):
AliGenMC(npart),
fBWDelay(0.0)
{
// Constructor specifying the size of the particle table
- fParticles = new TClonesArray("TParticle",20000);
fNprimaries = 0;
}
((TTherminator *) fMCEvGen)->GenerateEvent();
AliWarning("Generated");
- ((TTherminator *) fMCEvGen)->ImportParticles(fParticles);
+ ((TTherminator *) fMCEvGen)->ImportParticles(&fParticles);
- Int_t np = fParticles->GetEntriesFast();
+ Int_t np = fParticles.GetEntriesFast();
AliWarning(Form("Imported %d particles", np));
+ Int_t *idsOnStack;
+ idsOnStack = new Int_t[np];
+
TParticle *iparticle;
Double_t evrot = gRandom->Rndm()*TMath::Pi();
for (int i = 0; i < np; i++) {
- iparticle = (TParticle *) fParticles->At(i);
+ iparticle = (TParticle *) fParticles.At(i);
Bool_t hasMother = (iparticle->GetFirstMother() >=0);
Bool_t hasDaughter = (iparticle->GetFirstDaughter() >=0);
- kf = iparticle->GetPdgCode();
- ks = iparticle->GetStatusCode();
- Double_t aphi = TMath::ATan2(iparticle->Py(), iparticle->Px());
- Double_t arho = TMath::Hypot(iparticle->Px(), iparticle->Py());
- p[0] = arho*TMath::Cos(aphi + evrot);
- p[1] = arho*TMath::Sin(aphi + evrot);
-// p[0] = iparticle->Px();
-// p[1] = iparticle->Py();
- p[2] = iparticle->Pz();
- mass = TDatabasePDG::Instance()->GetParticle(kf)->Mass();
- energy = sqrt(mass*mass + p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
- origin[0] = origin0[0]+iparticle->Vx();
- origin[1] = origin0[1]+iparticle->Vy();
- origin[2] = origin0[2]+iparticle->Vz();
-
- imo = -1;
- TParticle* mother = 0;
- if (hasMother) {
- imo = iparticle->GetFirstMother();
- mother = (TParticle *) fParticles->At(imo);
- } // if has mother
- Bool_t tFlag = (!hasDaughter);
-
- printf("Pushing Track %d with status %d mother %d\n", kf, tFlag, imo);
- PushTrack(tFlag,imo,kf,
- p[0],p[1],p[2],energy,
- origin[0],origin[1],origin[2],iparticle->T()*0.197327*1e-13/300000000,
- polar[0],polar[1],polar[2],
- hasMother ? kPDecay:kPNoProcess,nt);
-
- fNprimaries++;
- KeepTrack(nt);
+ if (hasDaughter) {
+ // This particle has decayed
+ // It will not be tracked
+ // Add it only once with coorduinates not
+ // smeared with primary vertex position
+
+ kf = iparticle->GetPdgCode();
+ ks = iparticle->GetStatusCode();
+ Double_t aphi = TMath::ATan2(iparticle->Py(), iparticle->Px());
+ Double_t arho = TMath::Hypot(iparticle->Px(), iparticle->Py());
+ p[0] = arho*TMath::Cos(aphi + evrot);
+ p[1] = arho*TMath::Sin(aphi + evrot);
+ // p[0] = iparticle->Px();
+ // p[1] = iparticle->Py();
+ p[2] = iparticle->Pz();
+ mass = TDatabasePDG::Instance()->GetParticle(kf)->Mass();
+ energy = sqrt(mass*mass + p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
+
+ Double_t vphi = TMath::ATan2(iparticle->Vy(), iparticle->Vx());
+ Double_t vrho = TMath::Hypot(iparticle->Vx(), iparticle->Vy());
+ origin[0] = vrho*TMath::Cos(vphi + evrot);
+ origin[1] = vrho*TMath::Sin(vphi + evrot);
+ origin[2] = iparticle->Vz();
+
+ imo = -1;
+ TParticle* mother = 0;
+ if (hasMother) {
+ imo = iparticle->GetFirstMother();
+ mother = (TParticle *) fParticles.At(imo);
+ } // if has mother
+ Bool_t tFlag = (!hasDaughter);
+
+ printf("Pushing Track %d with status %d mother %d\n", kf, tFlag, imo>=0?idsOnStack[imo]:imo);
+ PushTrack(tFlag,imo>=0?idsOnStack[imo]:imo,kf,
+ p[0],p[1],p[2],energy,
+ origin[0],origin[1],origin[2],iparticle->T(),
+ polar[0],polar[1],polar[2],
+ hasMother ? kPDecay:kPNoProcess,nt);
+ idsOnStack[i] = nt;
+ fNprimaries++;
+ KeepTrack(nt);
+ }
+ else {
+ // This is a final state particle
+ // It will be tracked
+ // Add it TWICE to the stack !!!
+ // First time with event-wide coordicates (for femtoscopy) -
+ // this one will not be tracked
+ // Second time with event-wide ccordiantes and vertex smearing
+ // this one will be tracked
+
+ kf = iparticle->GetPdgCode();
+ ks = iparticle->GetStatusCode();
+ Double_t aphi = TMath::ATan2(iparticle->Py(), iparticle->Px());
+ Double_t arho = TMath::Hypot(iparticle->Px(), iparticle->Py());
+ p[0] = arho*TMath::Cos(aphi + evrot);
+ p[1] = arho*TMath::Sin(aphi + evrot);
+ // p[0] = iparticle->Px();
+ // p[1] = iparticle->Py();
+ p[2] = iparticle->Pz();
+ mass = TDatabasePDG::Instance()->GetParticle(kf)->Mass();
+ energy = sqrt(mass*mass + p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
+
+ Double_t vphi = TMath::ATan2(iparticle->Vy(), iparticle->Vx());
+ Double_t vrho = TMath::Hypot(iparticle->Vx(), iparticle->Vy());
+ origin[0] = vrho*TMath::Cos(vphi + evrot);
+ origin[1] = vrho*TMath::Sin(vphi + evrot);
+ origin[2] = iparticle->Vz();
+
+ imo = -1;
+ TParticle* mother = 0;
+ if (hasMother) {
+ imo = iparticle->GetFirstMother();
+ mother = (TParticle *) fParticles.At(imo);
+ } // if has mother
+ Bool_t tFlag = (hasDaughter);
+
+ printf("Found mother %i with true id %i\n", imo, imo>=0?idsOnStack[imo]:imo);
+ printf("Pushing Track %d with status %d mother %d\n", kf, tFlag, imo>=0?idsOnStack[imo]:imo);
+ PushTrack(tFlag,imo>=0?idsOnStack[imo]:imo,kf,
+ p[0],p[1],p[2],energy,
+ origin[0],origin[1],origin[2],iparticle->T(),
+ polar[0],polar[1],polar[2],
+ hasMother ? kPDecay:kPNoProcess,nt);
+ idsOnStack[i] = nt;
+ fNprimaries++;
+ KeepTrack(nt);
+
+ origin[0] = origin0[0]+vrho*TMath::Cos(vphi + evrot);
+ origin[1] = origin0[1]+vrho*TMath::Sin(vphi + evrot);
+ origin[2] = origin0[2]+iparticle->Vz();
+
+ imo = nt;
+ // mother = (TParticle *) fParticles.At(nt);
+ tFlag = (!hasDaughter);
+
+ printf("Pushing Track %d with status %d mother %d\n", kf, tFlag, imo);
+ PushTrack(tFlag,imo,kf,
+ p[0],p[1],p[2],energy,
+ origin[0],origin[1],origin[2],iparticle->T(),
+ polar[0],polar[1],polar[2],
+ hasMother ? kPDecay:kPNoProcess,nt);
+ fNprimaries++;
+ KeepTrack(nt);
+ }
}
+
+
SetHighWaterMark(fNprimaries);
TArrayF eventVertex;
AddHeader(header);
fCollisionGeometry = (AliGenHijingEventHeader*) header;
- gAlice->SetGenEventHeader(header);
+ delete idsOnStack;
+
+ // gAlice->SetGenEventHeader(header);
}
void AliGenTherminator::Init()
TParticlePDG *tParticleType;
AliWarning(Form("Reading particle types from particles.data"));
- ifstream in("particles.data");
+
+ TString aroot = gSystem->Getenv("ALICE_ROOT");
+ ifstream in((aroot+"/TTherminator/data/SHARE/particles.data").Data());
+ // ifstream in("particles.data");
int charge;
void AliGenTherminator::CreateTherminatorInputFile()
{
// Create Therminator input file
+ const char *aroot = gSystem->Getenv("ALICE_ROOT");
ofstream *ostr = new ofstream("therminator.in");
(*ostr) << "NumberOfEvents = 1" << endl;
(*ostr) << "Randomize = 1" << endl;
(*ostr) << "TableType = SHARE" << endl;
- (*ostr) << "InputDirSHARE = ." << endl;
+ (*ostr) << "InputDirSHARE = "<< aroot << "/TTherminator/data/SHARE" << endl;
(*ostr) << "EventOutputFile = " << fFileName.Data() << endl;
+ (*ostr) << "FOHSLocation = " << fFOHSlocation.Data() << endl;
(*ostr) << "FreezeOutModel = " << fFreezeOutModel.Data() << endl;
(*ostr) << "BWVt = " << fBWVt << endl;
(*ostr) << "Tau = " << fTau << endl;
// Set the freeze-out model to use
fFreezeOutModel = model;
}
+
+void AliGenTherminator::SetLhyquidSet(const char *set)
+{
+ // Select one of pregenerated Lhyquid hypersurfaces
+ const char *aroot = gSystem->Getenv("ALICE_ROOT");
+ if (strstr(set, "LHC500C0005")) {
+ AliWarning(Form("AliGenTherminator: Selected default Lhyquid hypersurface"));
+ AliWarning(Form(" Pb-Pb collisions, centrality 0-5%"));
+ AliWarning(Form(" initial temperature at tau=1 fm in the center Ti=500 MeV"));
+ AliWarning(Form(" freeze-out criteria Tf=145 MeV"));
+ AliWarning(Form(" for details see $(ALICE_ROOT)/TTherminator/data/LHC500C0005/FO.txt"));
+ fFOHSlocation = aroot;
+ fFOHSlocation += "/TTherminator/data/LHC500C0005";
+ }
+ else if (strstr(set, "LHC500C2030")) {
+ AliWarning(Form("AliGenTherminator: Selected default Lhyquid hypersurface"));
+ AliWarning(Form(" Pb-Pb collisions, centrality 20-30%"));
+ AliWarning(Form(" initial temperature at tau=1 fm in the center Ti=500 MeV"));
+ AliWarning(Form(" freeze-out criteria Tf=145 MeV"));
+ AliWarning(Form(" for details see $(ALICE_ROOT)/TTherminator/data/LHC500C2030/FO.txt"));
+ fFOHSlocation = aroot;
+ fFOHSlocation += "/TTherminator/data/LHC500C2030";
+ }
+ else {
+ AliWarning(Form("Did not find Lhyquid set %s", set));
+ AliWarning(Form("Reverting to default: current directory"));
+ fFOHSlocation = "";
+ }
+}
+
+void AliGenTherminator::SetLhyquidInputDir(const char *inputdir)
+{
+ // Select Your own Lhyquid hypersurface
+ fFOHSlocation = inputdir;
+}