86 TPythia8* TPythia8::fgInstance = 0;
91 TPythia8::TPythia8(
bool printBanner ):
92 TGenerator(
"TPythia8",
"TPythia8"),
97 Fatal(
"TPythia8",
"There's already an instance of TPythia8");
101 fParticles =
new TClonesArray(
"TParticle",50);
103 fPythia =
new Pythia8::Pythia(
"../share/Pythia8/xmldoc", printBanner);
109 TPythia8::TPythia8(
const char *xmlDir,
bool printBanner ):
110 TGenerator(
"TPythia8",
"TPythia8"),
112 fNumberOfParticles(0)
115 Fatal(
"TPythia8",
"There's already an instance of TPythia8");
119 fParticles =
new TClonesArray(
"TParticle",50);
120 fPythia =
new Pythia8::Pythia(xmlDir, printBanner);
126 TPythia8::~TPythia8()
129 fParticles->Delete();
139 TPythia8* TPythia8::Instance()
141 return fgInstance ? fgInstance : (fgInstance =
new TPythia8()) ;
147 Bool_t TPythia8::Initialize(Int_t idAin, Int_t idBin, Double_t ecms)
149 AddParticlesToPdgDataBase();
152 fPythia->settings.mode(
"Beams:idA", idAin);
153 fPythia->settings.mode(
"Beams:idB", idBin);
154 fPythia->settings.mode(
"Beams:frameType", 1);
155 fPythia->settings.parm(
"Beams:eCM", ecms);
157 return fPythia->init();
165 Bool_t TPythia8::Initialize(Int_t idAin, Int_t idBin, Double_t eAin, Double_t eBin)
167 AddParticlesToPdgDataBase();
170 fPythia->settings.mode(
"Beams:idA", idAin);
171 fPythia->settings.mode(
"Beams:idB", idBin);
172 fPythia->settings.mode(
"Beams:frameType", 2);
173 fPythia->settings.parm(
"Beams:eA", eAin);
174 fPythia->settings.parm(
"Beams:eB", eBin);
177 return fPythia->init();
185 void TPythia8::GenerateEvent()
188 fNumberOfParticles = fPythia->event.size() - 1;
194 Int_t TPythia8::ImportParticles(TClonesArray *particles, Option_t *option)
196 if (particles == 0)
return 0;
197 TClonesArray &clonesParticles = *particles;
198 clonesParticles.Clear();
202 fNumberOfParticles = fPythia->event.size();
203 if (fPythia->event[0].id() == 90) {
207 if (!strcmp(option,
"") || !strcmp(option,
"Final")) {
208 for (i = 0; i < fNumberOfParticles; i++) {
209 if (fPythia->event[i].id() == 90)
continue;
210 if (fPythia->event[i].isFinal()) {
211 new(clonesParticles[nparts]) TParticle(
212 fPythia->event[i].id(),
213 fPythia->event[i].isFinal(),
214 fPythia->event[i].mother1() + ioff,
215 fPythia->event[i].mother2() + ioff,
216 fPythia->event[i].daughter1() + ioff,
217 fPythia->event[i].daughter2() + ioff,
218 fPythia->event[i].px(),
219 fPythia->event[i].py(),
220 fPythia->event[i].pz(),
221 fPythia->event[i].e(),
222 fPythia->event[i].xProd(),
223 fPythia->event[i].yProd(),
224 fPythia->event[i].zProd(),
225 fPythia->event[i].tProd());
229 }
else if (!strcmp(option,
"All")) {
230 for (i = 0; i < fNumberOfParticles; i++) {
231 if (fPythia->event[i].id() == 90)
continue;
232 new(clonesParticles[nparts]) TParticle(
233 fPythia->event[i].id(),
234 fPythia->event[i].isFinal(),
235 fPythia->event[i].mother1() + ioff,
236 fPythia->event[i].mother2() + ioff,
237 fPythia->event[i].daughter1() + ioff,
238 fPythia->event[i].daughter2() + ioff,
239 fPythia->event[i].px(),
240 fPythia->event[i].py(),
241 fPythia->event[i].pz(),
242 fPythia->event[i].e(),
243 fPythia->event[i].xProd(),
244 fPythia->event[i].yProd(),
245 fPythia->event[i].zProd(),
246 fPythia->event[i].tProd());
250 if(ioff==-1) fNumberOfParticles--;
257 TObjArray* TPythia8::ImportParticles(Option_t* )
261 Int_t numpart = fPythia->event.size();
262 if (fPythia->event[0].id() == 90) {
268 TClonesArray &a = *((TClonesArray*)fParticles);
269 for (Int_t i = 1; i <= numpart; i++) {
271 fPythia->event[i].id(),
272 fPythia->event[i].isFinal(),
273 fPythia->event[i].mother1() + ioff,
274 fPythia->event[i].mother2() + ioff,
275 fPythia->event[i].daughter1() + ioff,
276 fPythia->event[i].daughter2() + ioff,
277 fPythia->event[i].px(),
278 fPythia->event[i].py(),
279 fPythia->event[i].pz(),
280 fPythia->event[i].e(),
281 fPythia->event[i].xProd(),
282 fPythia->event[i].yProd(),
283 fPythia->event[i].zProd(),
284 fPythia->event[i].tProd());
292 Int_t TPythia8::GetN()
const
294 return (fPythia->event.size() - 1);
300 void TPythia8::ReadString(
const char*
string)
const
302 fPythia->readString(
string);
308 void TPythia8::ReadConfigFile(
const char*
string)
const
310 fPythia->readFile(
string);
316 void TPythia8::ListAll()
const
318 fPythia->settings.listAll();
324 void TPythia8::ListChanged()
const
326 fPythia->settings.listChanged();
332 void TPythia8::Plist(Int_t
id)
const
334 fPythia->particleData.list(
id);
340 void TPythia8::PlistAll()
const
342 fPythia->particleData.listAll();
348 void TPythia8::PlistChanged()
const
350 fPythia->particleData.listChanged();
356 void TPythia8::PrintStatistics()
const
364 void TPythia8::EventListing()
const
366 fPythia->event.list();
372 void TPythia8::AddParticlesToPdgDataBase()
374 TDatabasePDG *pdgDB = TDatabasePDG::Instance();
375 pdgDB->AddParticle(
"string",
"string", 0, kTRUE,
376 0, 0,
"QCD string", 90);
377 pdgDB->AddParticle(
"rho_diff0",
"rho_diff0", 0, kTRUE,
378 0, 0,
"QCD diffr. state", 9900110);
379 pdgDB->AddParticle(
"pi_diffr+",
"pi_diffr+", 0, kTRUE,
380 0, 1,
"QCD diffr. state", 9900210);
381 pdgDB->AddParticle(
"omega_di",
"omega_di", 0, kTRUE,
382 0, 0,
"QCD diffr. state", 9900220);
383 pdgDB->AddParticle(
"phi_diff",
"phi_diff", 0, kTRUE,
384 0, 0,
"QCD diffr. state", 9900330);
385 pdgDB->AddParticle(
"J/psi_di",
"J/psi_di", 0, kTRUE,
386 0, 0,
"QCD diffr. state", 9900440);
387 pdgDB->AddParticle(
"n_diffr0",
"n_diffr0",0,kTRUE,
388 0, 0,
"QCD diffr. state", 9902110);
389 pdgDB->AddParticle(
"p_diffr+",
"p_diffr+", 0, kTRUE,
390 0, 1,
"QCD diffr. state", 9902210);