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);