      PROGRAM PYXTRA
C...Long example how to interface user-defined processes to PYTHIA
C...based on the Les Houches commonblock agreement. Generates events 
C...of several different kinds, to test the new code under varied 
C...conditions, but kinematics selection and cross sections are
C...completely unphysical.

C...Double precision and integer declarations.
      IMPLICIT DOUBLE PRECISION(A-H, O-Z)
      INTEGER PYK,PYCHGE,PYCOMP

C...User process event common block.
      INTEGER MAXNUP
      PARAMETER (MAXNUP=500) 
      INTEGER NUP,IDPRUP,IDUP,ISTUP,MOTHUP,ICOLUP
      DOUBLE PRECISION XWGTUP,SCALUP,AQEDUP,AQCDUP,PUP,VTIMUP,SPINUP  
      COMMON/HEPEUP/NUP,IDPRUP,XWGTUP,SCALUP,AQEDUP,AQCDUP,IDUP(MAXNUP),
     &ISTUP(MAXNUP),MOTHUP(2,MAXNUP),ICOLUP(2,MAXNUP),PUP(5,MAXNUP),
     &VTIMUP(MAXNUP),SPINUP(MAXNUP)  
 
C...Standard PYTHIA commonblocks.
      COMMON/PYJETS/N,NPAD,K(4000,5),P(4000,5),V(4000,5)
      COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
      COMMON/PYDAT3/MDCY(500,3),MDME(8000,2),BRAT(8000),KFDP(8000,5)
      COMMON/PYSUBS/MSEL,MSELPD,MSUB(500),KFIN(2,-40:40),CKIN(200)
      COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)

C...Extra commonblock to transfer run info.
      COMMON/PRIV/MODE,NLIM  

C...Local arrays.
      DIMENSION IPRID(100)

C...Switch process mode; agrees with IDWTUP code (+-1,+-2,+-3,+-4).
      MODE=2

C...Simulate limited suppy of events of Wbb kind.
      NLIM=100

C...Maximum number of events to generate.
      NEV=100

C...Set pi0 stable to trim event listings.
      MDCY(PYCOMP(111),1)=0

C...Expanded event listing (required for histogramming).
      MSTP(125)=2

C...Histograms.
      CALL PYBOOK(1,'charged multiplicity',100,-1D0,399D0)
      CALL PYBOOK(2,'starting virtualities, 2 -> 2',100,0D0,200D0)
      CALL PYBOOK(3,'starting virtualities, 2 -> 3',100,0D0,200D0)
      CALL PYBOOK(4,'starting virtualities, 2 -> 4',100,0D0,200D0)
      CALL PYBOOK(5,'starting virtualities, 2 -> 5',100,0D0,200D0)
      CALL PYBOOK(6,'starting virtualities, 2 -> 6',100,0D0,200D0)
      CALL PYBOOK(7,'starting virtualities, 2 -> 7',100,0D0,200D0)

C...Initialize with external process.
      CALL PYINIT('USER',' ',' ',0D0)
      NACC=0
      NPRID=0

C...Event loop; generate event; check it was obtained or quit.
      DO 130 IEV=1,NEV
        CALL PYEVNT
        IF(MSTI(51).EQ.1) GOTO 140  
        NACC=NACC+1

        IF(MOD(IEV-1,10).EQ.0) THEN
         PRINT*,' IEV = ',IEV
         CALL PYLIST(7)
         CALL PYLIST(2)
        ENDIF
 
        CALL PYEDIT(3)
        CALL PYFILL(1,DBLE(N),1D0)
  130 CONTINUE

C...Statistics and histograms.
  140 CALL PYSTAT(1)
      CALL PYHIST

      END
   
C*********************************************************************
 
C...UPINIT
C...Routine to be called by user to set up user-defined processes.
C...Code below only intended as example, without any claim of realism.
C...Especially it shows what info needs to be put in HEPRUP.
 
      SUBROUTINE UPINIT
 
C...Double precision and integer declarations.
      IMPLICIT DOUBLE PRECISION(A-H, O-Z)
      IMPLICIT INTEGER(I-N)

      CHARACTER*80 CHAR_READ

C...User process initialization commonblock.
      INTEGER MAXPUP
      PARAMETER (MAXPUP=100)
      INTEGER IDBMUP,PDFGUP,PDFSUP,IDWTUP,NPRUP,LPRUP
      DOUBLE PRECISION EBMUP,XSECUP,XERRUP,XMAXUP
      COMMON/HEPRUP/IDBMUP(2),EBMUP(2),PDFGUP(2),PDFSUP(2),
     &IDWTUP,NPRUP,XSECUP(MAXPUP),XERRUP(MAXPUP),XMAXUP(MAXPUP),
     &LPRUP(MAXPUP)
      SAVE /HEPRUP/

C...Extra commonblock to transfer run info.
      COMMON/PRIV/MODE,NLIM   
      SAVE/PRIV/

C....Pythia commonblock - needed for setting PDF's; see below.
C      COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
C      SAVE /PYPARS/      

C...Set incoming beams: Tevatron Run II.
      IDBMUP(1)=2212
      IDBMUP(2)=-2212
      EBMUP(1)=980D0
      EBMUP(2)=980D0

C...Set PDF's of incoming beams: CTEQ 5L.
C...Note that Pythia will not look at PDFGUP and PDFSUP.  
      PDFGUP(1)=4
      PDFSUP(1)=46
      PDFGUP(2)=PDFGUP(1)
      PDFSUP(2)=PDFSUP(1)
      
C...If you want Pythia to use PDFLIB, you have to set it by hand.
C...(You also have to ensure that the dummy routines
C...PDFSET, STRUCTM and STRUCTP in Pythia are not linked.)      
C      MSTP(52)=2
C      MSTP(51)=1000*PDFGUP(1)+PDFSUP(1)

C...Decide on weighting strategy: unweighted on input.
      IDWTUP=MODE

C...Number of external processes. 
      NPRUP=1

C.....read through data file to find maximum weight....only first time
      WTMAX=0D0
      XSTOT=0D0
      DO I=1,10000000
       READ(77,*,END=777) NPARTS,KNTEV,WTEVNT
       IF(WTEVNT.GT.WTMAX) WTMAX=WTEVNT
       XSTOT=XSTOT+WTEVNT
       DO J=1,12
        READ(77,*) CHAR_READ
       ENDDO
      ENDDO
 777  CONTINUE
      REWIND(77)

      XSECUP(1)=XSTOT
      XMAXUP(1)=WTMAX
      LPRUP(1)=661

      RETURN
      END
 
C*********************************************************************
 
C...UPEVNT
C...Sample routine to generate events of various kinds.
C...Not intended to be realistic, but rather to show in closed
C...and understandable form what such a routine might look like.
C...Especially it shows what info needs to be put in HEPEUP.
 
      SUBROUTINE UPEVNT

C...Double precision and integer declarations.
      IMPLICIT DOUBLE PRECISION(A-H, O-Z)
      IMPLICIT INTEGER(I-N)

      COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200) 

C...Extra commonblock to transfer run info.
      COMMON/PRIV/MODE,NLIM   
      SAVE/PRIV/

C...User process event common block.
      INTEGER MAXNUP
      PARAMETER (MAXNUP=500) 
      INTEGER NUP,IDPRUP,IDUP,ISTUP,MOTHUP,ICOLUP
      DOUBLE PRECISION XWGTUP,SCALUP,AQEDUP,AQCDUP,PUP,VTIMUP,SPINUP  
      COMMON/HEPEUP/NUP,IDPRUP,XWGTUP,SCALUP,AQEDUP,AQCDUP,IDUP(MAXNUP),
     &ISTUP(MAXNUP),MOTHUP(2,MAXNUP),ICOLUP(2,MAXNUP),PUP(5,MAXNUP),
     &VTIMUP(MAXNUP),SPINUP(MAXNUP)  
      SAVE /HEPEUP/ 

C...If PYTHIA is supposed to select event type, do not modify this choice.
      IF(IABS(MODE).LE.2) THEN
       IDPRUP=661
C...Else free hands to mix; here evenly.
      ELSE  

      ENDIF

 99   CONTINUE

C...Zero some arrays in common blocks to simplify filling.
      NUP=12
      DO 100 I=1,NUP
        MOTHUP(1,I)=0
        MOTHUP(2,I)=0
        ICOLUP(1,I)=0
        ICOLUP(2,I)=0
        SPINUP(I)=0D0
        PUP(1,I)=0D0    
        PUP(2,I)=0D0    
        PUP(5,I)=0D0
        VTIMUP(I)=0D0
  100 CONTINUE

      READ(77,*,END=888) NUP,ID,XWGTUP
      READ(77,*,END=888) (IDUP(I),I=1,NUP)
      ISTUP(1)=-1
      ISTUP(2)=-1
      DO I=3,NUP
       ISTUP(I)=1
      ENDDO
      READ(77,*,END=888) (MOTHUP(1,I),I=1,NUP)
      READ(77,*,END=888) (MOTHUP(2,I),I=1,NUP)
      READ(77,*,END=888) (ICOLUP(1,I),I=1,NUP)
      READ(77,*,END=888) (ICOLUP(2,I),I=1,NUP)
      DO I=1,NUP
       READ(77,*,END=888) IDUMB,PUP(4,I),(PUP(J,I),J=1,3)
       TEST=PUP(1,I)**2+PUP(2,I)**2+PUP(3,I)**2-PUP(4,I)**2
       IF(TEST.LE.0D0) THEN
        PUP(5,I)=DSQRT(-TEST)
       ELSEIF(DABS(TEST).LT.1D-6) THEN
        PUP(5,I)=0D0
       ELSE
        PUP(5,I)=-1D0
        PRINT*,' NEGATIVE MASS '
       ENDIF
      ENDDO

C...Some other compulsory quantities.
      SCALUP=-1D0

      RETURN

 888  CONTINUE
      REWIND(77)
      GOTO 99

      RETURN
      END
 
