// @(#)root/pythia:$Name:  $:$Id: TPythia.h,v 1.2 2000/12/13 15:13:53 brun Exp $
// Author: Piotr Golonka   10/09/97

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TPythia
#define ROOT_TPythia


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TPythia                                                              //
//                                                                      //
// This class implements an interface to the Pythia event generator.    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TGenerator
#include "TGenerator.h"
#endif

class TPrimary;

class TPythia : public TGenerator {

private:
   void                Unsupported(const char *name) const
                              {printf("TPythia::%s unsupported !\n",name);}

   virtual TPrimary   *GetPrimary(Int_t) const {Unsupported("GetPrimary");return 0;};
   virtual void        ShowNeutrons(Bool_t)    {Unsupported("ShowNeutrons");};

public:
                       TPythia();
   virtual            ~TPythia();

   virtual void        Initialize(const char *frame, const char *beam, const char *target, float win);

   virtual Int_t       ImportParticles(TClonesArray *particles, Option_t *option="");
   virtual TObjArray  *ImportParticles(Option_t *option="");


   virtual void        SetupTest();

   // common PYSUBS access routines: (you don't need to care about indexes of
   // arrays - just provide values from PYTHIA documentation!


   //Generic functions:
   virtual void        SetMSEL(Int_t sel);
   virtual Int_t       GetMSEL() const;

   virtual void        SetMSUB(Int_t isub, Bool_t msub=1);
   virtual Bool_t      GetMSUB(Int_t isub) const;

   virtual void        SetKFIN(Int_t i, Int_t j, Bool_t kfin=1);
   virtual Bool_t      GetKFIN(Int_t i, Int_t j) const;

   virtual void        SetCKIN(Int_t key, Float_t value);
   virtual Float_t     GetCKIN(Int_t key) const;

   // common PYPARS access routines:
   virtual void        SetMSTP(Int_t key, Int_t value);
   virtual Int_t       GetMSTP(Int_t key) const;

   virtual void        SetPARP(Int_t key, Float_t value);
   virtual Float_t     GetPARP(Int_t key) const;

   virtual void        SetMSTI(Int_t key, Int_t value);
   virtual Int_t       GetMSTI(Int_t key) const;

   virtual void        SetPARI(Int_t key, Float_t value);
   virtual Float_t     GetPARI(Int_t key) const;

   //common PYINT1 access routines:
   virtual void        SetMINT(Int_t key, Int_t value);
   virtual Int_t       GetMINT(Int_t key) const;

   virtual void        SetVINT(Int_t key, Float_t value);
   virtual Float_t     GetVINT(Int_t key) const;

   //common PYINT2 access routines:
   virtual void        SetISET(Int_t isub,Int_t iset);
   virtual Int_t       GetISET(Int_t isub) const;

   virtual void        SetKFPR(Int_t isub, Int_t j, Int_t kfpr);
   virtual Int_t       GetKFPR(Int_t isub, Int_t j) const;

   virtual void        SetCOEF(Int_t isub, Int_t j, Float_t coef);
   virtual Float_t     GetCOEF(Int_t isub, Int_t j) const;

   virtual void        SetICOL(Int_t kf,Int_t i, Int_t j,Int_t value);
   virtual Int_t       GetICOL(Int_t kf,Int_t i, Int_t j) const;

   // common PYINT3 access routines - this common is "read only" !!!
   virtual Float_t     GetXSFX(Int_t side, Int_t kf) const;
   virtual Int_t       GetISIG(Int_t ichn, Int_t isig) const;
   virtual Float_t     GetSIGH(Int_t ichn) const;

   // common PYINT4 access routines - this common is "read only" !!!
   virtual Float_t     GetWIDP(Int_t kf, Int_t j) const;
   virtual Float_t     GetWIDE(Int_t kf, Int_t j) const;
   virtual Float_t     GetWIDS(Int_t kf, Int_t j) const;

   // common PYINT5 access routines - this common is "read only" !!!
   virtual Int_t       GetNGEN(Int_t isub, Int_t key) const;
   virtual Float_t     GetXSEC(Int_t isub, Int_t key) const;

   //common LUDAT1 access:
   virtual Int_t       GetMSTU(Int_t key) const;
   virtual void        SetMSTU(Int_t key, Int_t value);

   virtual Float_t     GetPARU(Int_t key) const;
   virtual void        SetPARU(Int_t key, Float_t value);

   virtual Int_t       GetMSTJ(Int_t key) const;
   virtual void        SetMSTJ(Int_t key, Int_t value);


   virtual Float_t     GetPARJ(Int_t key) const;
   virtual void        SetPARJ(Int_t key, Float_t value);

   //common LUDAT2 access:
   virtual Int_t       GetKCHG(Int_t kc, Int_t key) const;
   virtual void        SetKCHG(Int_t kc, Int_t key, Int_t value);

   virtual Float_t     GetPMAS(Int_t kc, Int_t key) const;
   virtual void        SetPMAS(Int_t kc, Int_t key, Float_t value);

   virtual Float_t     GetPARF(Int_t key) const;
   virtual void        SetPARF(Int_t key, Float_t value);

   virtual Float_t     GetVCKM(Int_t i, Int_t j) const;
   virtual void        SetVCKM(Int_t i, Int_t j, Float_t value);

   //common LUDAT3 access:
   virtual Int_t       GetMDCY(Int_t kc, Int_t key) const;
   virtual void        SetMDCY(Int_t kc, Int_t key, Int_t value);

   virtual Int_t       GetMDME(Int_t idc, Int_t key) const;
   virtual void        SetMDME(Int_t idc, Int_t key, Int_t value);

   virtual Float_t     GetBRAT(Int_t idc) const;
   virtual void        SetBRAT(Int_t idc, Float_t value);

   virtual Int_t       GetKFDP(Int_t idc, Int_t j) const;
   virtual void        SetKFDP(Int_t idc, Int_t j, Int_t value);

   //common LUDAT4 access:
   virtual char       *GetCHAF(Int_t kc) const;
   virtual void        SetCHAF(Int_t kc,char *value);

   //common LUDATR access:
   virtual void        SetMRLU(Int_t key, Int_t seed);
   virtual Int_t       GetMRLU(Int_t key) const;

   virtual void        SetRRLU(Int_t key, Float_t value);
   virtual Float_t     GetRRLU(Int_t key) const;

   // pythia and lujets subroutines access:
   virtual void        Pystat(Int_t mstat=1);
   virtual void        Pytest(Int_t key=1);
   virtual void        Pyevnt();
   virtual void        Lulist(Int_t mlist=1);
   virtual void        Luexec();
   virtual Int_t       Lucomp(Int_t kf);

   virtual void        Pyinit(char *frame, char *beam, char *target, float win);

   virtual void        GenerateEvent();

   virtual void        Draw(Option_t *option="");

   ClassDef(TPythia,1)  //Interface to Pythia Event Generator
};

#endif
