2 //###################################################################
3 //# EPOS 1.67 K. WERNER, T. PIEROG, S. PORTEBOEUF. #
4 //# Contact: werner@subatech.in2p3.fr #
5 //###################################################################
9 // Wraper class for interfacing EPOS model, derived from ROOT's TGenerator.
10 // It generates temporary input file for the model, providing user with
11 // ability to add his/hers own lines to the input.
12 // Output is read directly from common blocks.
14 // Author: Piotr Ostrowski, postrow@if.pw.edu.pl
18 #include <TClonesArray.h>
19 #include <TDatabasePDG.h>
20 #include <TObjArray.h>
21 #include <TParticle.h>
30 #include "EPOScommon.h"
31 #include "AliGenEposIsajetToPdgConverter.h"
38 TEpos::TEpos() : TGenerator("EPOS", "Epos event generator"),
46 fPhimax(TMath::TwoPi()),
53 fIdConverter=new AliGenEposIsajetToPdgConverter();
56 TEpos::TEpos(const TEpos&) : TGenerator("EPOS", "Epos event generator"),
64 fPhimax(TMath::TwoPi()),
71 fIdConverter = new AliGenEposIsajetToPdgConverter();
78 TEpos& TEpos::operator=(const TEpos& epos) {
83 fIdConverter = new AliGenEposIsajetToPdgConverter(*epos.fIdConverter);
87 fLaproj = epos.fLaproj;
88 fMaproj = epos.fMaproj;
89 fLatarg = epos.fLatarg;
90 fMatarg = epos.fMatarg;
91 fBminim = epos.fBminim;
92 fBmaxim = epos.fBmaxim;
93 fPhimin = epos.fPhimin;
94 fPhimax = epos.fPhimax;
96 fSplitting = epos.fSplitting;
97 for(UInt_t i = 0; i < epos.fNoDecays.size(); ++i) {
98 fNoDecays.push_back(epos.fNoDecays[i]);
100 for(UInt_t i = 0; i < epos.fExtraInputLines.size(); ++i) {
101 fExtraInputLines.push_back(epos.fExtraInputLines[i]);
107 void TEpos::Initialize() {
108 // Generates input file and prepares EPOS to read from it.
115 const char *inputFileName = GetInputFileName();
116 Int_t nameLength = strlen(inputFileName);
117 setinp(inputFileName, nameLength, nameLength);
119 while(copen.nopen == -1) {
126 utpri("aamain",prnt1.ish,ishini,4,6);
128 IniModel(appli.model);
134 void TEpos::GenerateEvent() {
135 // cseed.seedj = gRandom->Rndm() * 1e10;
140 Int_t TEpos::ImportParticles(TClonesArray *particles, Option_t *) {
141 //Fills provided ClonesArray with generated particles
143 if (!cevt.nevt) return 0;
144 Int_t numpart = cptl.nptl;
145 printf("%d particles generated\n", numpart);
146 for (Int_t iPart=0; iPart<numpart; iPart++) {
147 Int_t tFather = cptl.iorptl[iPart] - 1;
148 tFather = tFather < -1 ? -1 : tFather;
150 TParticle *mother = (TParticle*) (particles->UncheckedAt(tFather));
151 mother->SetLastDaughter(iPart);
152 if (mother->GetFirstDaughter()==-1)
153 mother->SetFirstDaughter(iPart);
155 Int_t status = cptl.istptl[iPart] + 1;
156 Int_t pdg = fIdConverter->ConvertIsajetToPdg(cptl.idptl[iPart]);
157 new((*particles)[iPart]) TParticle(pdg, status,
159 cptl.pptl[iPart][0], cptl.pptl[iPart][1],cptl.pptl[iPart][2],cptl.pptl[iPart][3],
160 cptl.xorptl[iPart][0]*1.e-12, cptl.xorptl[iPart][1]*1.e-12, cptl.xorptl[iPart][2]*1.e-12, cptl.xorptl[iPart][3]*1e-12);
161 (*particles)[iPart]->SetUniqueID(iPart);
167 TObjArray* TEpos::ImportParticles(Option_t *) {
168 //Creates new particle array
170 if (!cevt.nevt) return NULL;
171 Int_t numpart = cptl.nptl;
172 printf("%d particles generated\n", numpart);
173 for (Int_t iPart=0; iPart<numpart; iPart++) {
174 Int_t tFather = cptl.iorptl[iPart] - 1;
175 tFather = tFather < -1 ? -1 : tFather;
177 TParticle *mother = (TParticle*) (fParticles->UncheckedAt(tFather));
178 mother->SetLastDaughter(iPart);
179 if (mother->GetFirstDaughter()==-1)
180 mother->SetFirstDaughter(iPart);
182 Int_t status = cptl.istptl[iPart] + 1;
183 Int_t pdg = fIdConverter->ConvertIsajetToPdg(cptl.idptl[iPart]);
184 TParticle* p = new TParticle(pdg, status,
186 cptl.pptl[iPart][0], cptl.pptl[iPart][1],cptl.pptl[iPart][2],cptl.pptl[iPart][3],
187 cptl.xorptl[iPart][0]*1.e-12, cptl.xorptl[iPart][1]*1.e-12, cptl.xorptl[iPart][2]*1.e-12, cptl.xorptl[iPart][3]*1e-12);
188 p->SetUniqueID(iPart);
195 void TEpos::AddNoDecay(Int_t nodecay) {
196 fNoDecays.push_back(nodecay);
199 void TEpos::AddExtraInputLine(const char *line) {
200 fExtraInputLines.push_back(line);
203 void TEpos::GenerateInputFile() {
204 // Generate input file in EPOS format
205 ofstream file(GetInputFileName(), ios_base::out | ios_base::trunc);
207 char *epoEnv = getenv("EPO");
209 strncpy(epo, epoEnv, 255);
211 strncpy(epo, getenv("ALICE_ROOT"), 255);
213 strncat(epo, "/EPOS/epos167", 255);
215 file << "fname pathnx " << epo << "/" << endl;
216 file << "fname histo none" << endl;
217 file << "fname copy none" << endl;
218 file << "fname log none" << endl;
219 file << "fname check none" << endl;
220 // file << "fname data /tmp/epos.out" << endl;
221 file << "fname initl " << epo << "/epos.initl" << endl;
222 file << "fname inidi " << epo << "/epos.inidi" << endl;
223 file << "fname inidr " << epo << "/epos.inidr" << endl;
224 file << "fname iniev " << epo << "/epos.iniev" << endl;
225 file << "fname inirj " << epo << "/epos.inirj" << endl;
226 file << "fname inics " << epo << "/epos.inics" << endl;
227 file << "fname inigrv " << epo << "/epos.inigrv" << endl;
228 file << "fqgsjet dat " << epo << "/qgsjet/qgsjet.dat" << endl;
229 file << "fqgsjet ncs " << epo << "/qgsjet/qgsjet.ncs" << endl;
230 file << "fqgsjetII dat " << epo << "/qgsjetII/qgsdat-II-03" << endl;
231 file << "fqgsjetII ncs " << epo << "/qgsjetII/sectnu-II-03" << endl;
232 file << "nodecay 120" << endl;
233 file << "nodecay -120" << endl;
234 file << "nodecay 130" << endl;
235 file << "nodecay -130" << endl;
236 file << "nodecay -20" << endl;
237 file << "nodecay 20" << endl;
238 file << "nodecay 14" << endl;
239 file << "nodecay -14" << endl;
240 file << "set ndecay 1111110" << endl;
241 file << "echo on" << endl;
244 int precision = file.precision();
246 file << "set seedj " << (gRandom->Rndm() * 1e14) << endl;
247 file.precision(precision);
248 file << "application hadron" << endl;
249 file << "set laproj " << fLaproj << endl;
250 file << "set maproj " << fMaproj << endl;
251 file << "set latarg " << fLatarg << endl;
252 file << "set matarg " << fMatarg << endl;
253 file << "set bminim " << fBminim << endl;
254 file << "set bmaxim " << fBmaxim << endl;
255 file << "set phimin " << fPhimin << endl;
256 file << "set phimax " << fPhimax << endl;
257 file << "set ecms " << fEcms << endl;
259 for(unsigned int i = 0; i < fNoDecays.size(); ++i) {
260 file << "nodecay " << fNoDecays[i] << endl;
263 file << "switch splitting " << (fSplitting ? "on" : "off") << endl;
265 file << "frame nucleon-nucleon" << endl;
267 for(unsigned int i = 0; i < fExtraInputLines.size(); ++i) {
268 file << fExtraInputLines[i] << endl;
271 // file << "output epos" << endl;
272 // file << "record event nevt nptl b endrecord" << endl;
273 // file << "record particle i id fa mo c1 c2 st endrecord" << endl;
275 file << "input " << epo << "/epos.param" << endl;
276 file << "runprogram" << endl;
280 Float_t TEpos::GetBimevt() const { return cevt.bimevt; }
281 Float_t TEpos::GetPhievt() const { return cevt.phievt; }
282 Int_t TEpos::GetKolevt() const { return cevt.kolevt; }
283 Int_t TEpos::GetKoievt() const { return cevt.koievt; }
284 Float_t TEpos::GetPmxevt() const { return cevt.pmxevt; }
285 Float_t TEpos::GetEgyevt() const { return cevt.egyevt; }
286 Int_t TEpos::GetNpjevt() const { return cevt.npjevt; }
287 Int_t TEpos::GetNtgevt() const { return cevt.ntgevt; }
288 Int_t TEpos::GetNpnevt() const { return cevt.npnevt; }
289 Int_t TEpos::GetNppevt() const { return cevt.nppevt; }
290 Int_t TEpos::GetNtnevt() const { return cevt.ntnevt; }
291 Int_t TEpos::GetNtpevt() const { return cevt.ntpevt; }
292 Int_t TEpos::GetJpnevt() const { return cevt.jpnevt; }
293 Int_t TEpos::GetJppevt() const { return cevt.jppevt; }
294 Int_t TEpos::GetJtnevt() const { return cevt.jtnevt; }
295 Int_t TEpos::GetJtpevt() const { return cevt.jtpevt; }
296 Float_t TEpos::GetXbjevt() const { return cevt.xbjevt; }
297 Float_t TEpos::GetQsqevt() const { return cevt.qsqevt; }
298 Int_t TEpos::GetNglevt() const { return cevt.nglevt; }
299 Float_t TEpos::GetZppevt() const { return cevt.zppevt; }
300 Float_t TEpos::GetZptevt() const { return cevt.zptevt; }