C----------------------------------------------------------------------
C
C   Code to calculate the PDFs
C
C   PDF actaully calculates the PDFs at scale EMSCAB and x_1=XXB(1)
C                                                        x_2=XXB(2)
C   is returns DISFB(13,2) where the second index is the beam particle
C   and the first is the type of parton
C   1, 2, 3, 4, 5, 6 = d,u,s,b,c,b,t
C   7, 8, 9,10,11,12 = dbar,ubar,sbar,cbar,bbar,tbar
C    13=gluon
C
C   there are also dummy subroutines to use if PDFLIB is not linked.
C   The code may be specified with the following options
C 
C   -DPYTHIA  use PYTHIA default PDFs
C   -DHERWIG  use HERWIG default PDFs
C   -DPDFLIB  use PDFLIB 
C
C   in each case the correct code must be linked.
C
C----------------------------------------------------------------------
CDECK  ID>, PDF.
*-- Author :    Peter Richardson
C----------------------------------------------------------------------
      SUBROUTINE PDF(EMSCAB,XXB,DISFB)
C----------------------------------------------------------------------
C     Subroutine to calculate the pdfs
C     generator dependent
C----------------------------------------------------------------------
#if defined(HERWIG)
      INCLUDE 'HERWIG65.INC'
      DOUBLE PRECISION EMSCAB,XXB(2),DISFB(13,2),I,J,
     &     BHRUNI,UPV,DNV,USEA,DSEA,STR,CHM,BTM,TOP,GLU
      INTEGER IDB(2)
      CHARACTER *8 DUMMY
      DOUBLE PRECISION VALUE(20)
      CHARACTER*20 PARM(20)
      LOGICAL FIRST
      EXTERNAL BHRUNI
      DATA VALUE/20*0D0/,PARM/20*' '/
      DATA FIRST/.TRUE./
C--Les Houches run common block
      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)
C--use generator internal pdfs
      IF(PDFGUP(1).LT.0) THEN
C---SET UP INITIAL STATE
         CALL HWUIDT(1,IDBMUP(1),IDB(1),DUMMY)
         PART1=DUMMY
         CALL HWUIDT(1,IDBMUP(2),IDB(2),DUMMY)
         PART2=DUMMY
         IPART1 = IDB(1)
         IPART2 = IDB(2)
         NHEP=1
         ISTHEP(NHEP)=101
         PHEP(1,NHEP)=0.
         PHEP(2,NHEP)=0.
         PHEP(3,NHEP)=EBMUP(1)
         PHEP(4,NHEP)=EBMUP(1)
         PHEP(5,NHEP)=RMASS(IDB(1))
         JMOHEP(1,NHEP)=0
         JMOHEP(2,NHEP)=0
         JDAHEP(1,NHEP)=0
         JDAHEP(2,NHEP)=0
         IDHW(NHEP)=IPART1
         IDHEP(NHEP)=IDPDG(IDB(1))
         NHEP=NHEP+1
         ISTHEP(NHEP)=102
         PHEP(1,NHEP)=0.
         PHEP(2,NHEP)=0.
         PHEP(3,NHEP)=-EBMUP(2)
         PHEP(4,NHEP)=EBMUP(2)
         PHEP(5,NHEP)=RMASS(IDB(2))
         JMOHEP(1,NHEP)=0
         JMOHEP(2,NHEP)=0
         JDAHEP(1,NHEP)=0
         JDAHEP(2,NHEP)=0
         IDHW(NHEP)=IPART2
         IDHEP(NHEP)=IDPDG(IPART2)
C---NEXT ENTRY IS OVERALL CM FRAME
         NHEP=NHEP+1
         IDHW(NHEP)=14
         IDHEP(NHEP)=0
         ISTHEP(NHEP)=103
         JMOHEP(1,NHEP)=NHEP-2
         JMOHEP(2,NHEP)=NHEP-1
         JDAHEP(1,NHEP)=0
         JDAHEP(2,NHEP)=0
         CALL BHVSUM(4,PHEP(1,NHEP-1),PHEP(1,NHEP-2),PHEP(1,NHEP))
         CALL BHUMAS(PHEP(1,NHEP))
         XLMIN = XLMINB
         EMSCA = EMSCAB
         DO I=1,2
            XX(I)=XXB(I)
         ENDDO
         CALL HWSGEN(.TRUE.)
         DO I=1,2
            DO J=1,13
               DISFB(J,I) = DISF(J,I)
            ENDDO
         ENDDO
      ELSE
#endif
#if defined(PYTHIA)
      IMPLICIT NONE
C--Les Houches run common block
      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)
      DOUBLE PRECISION EMSCAB,XXB(2),DISFB(13,2),I,J,XXMINB,
     &     XLMINB,BHRUNI,XPQ(-25:25),Q2,UPV,DNV,USEA,DSEA,STR,CHM,BTM,
     &     TOP,GLU
      EXTERNAL BHRUNI
      DOUBLE PRECISION VALUE(20)
      CHARACTER*20 PARM(20)
      LOGICAL FIRST
      DATA VALUE/20*0D0/,PARM/20*' '/
      DATA FIRST/.TRUE./
      IF(PDFGUP(1).LT.0) THEN
      XXB(1)=EXP(BHRUNI(0,0.0D0,XLMINB))
      XXB(2)=XXMINB/XXB(1)
      Q2 = EMSCAB**2
      CALL PYPDFU(IDBMUP(1),XXB(1),Q2,XPQ)
      DO I=1,6
         DISFB(I,1) = XPQ(I)
         DISFB(I+6,1) = XPQ(I-6)
      ENDDO
      DISFB(13,1) = XPQ(21)
      CALL PYPDFU(IDBMUP(2),XXB(2),Q2,XPQ)
      DO I=1,6
         DISFB(I,2) = XPQ(I)
         DISFB(I+6,2) = XPQ(I-6)
      ENDDO
      DISFB(13,2) = XPQ(21)
      ELSE
#else
      IMPLICIT NONE
C--Les Houches run common block
      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)
      DOUBLE PRECISION EMSCAB,XXB(2),DISFB(13,2),UPV,DNV,USEA,DSEA,
     &     STR,CHM,BTM,TOP,GLU,VALUE(20)
      INTEGER I
      CHARACTER*20 PARM(20)
      LOGICAL FIRST
      DATA VALUE/20*0D0/,PARM/20*' '/
      DATA FIRST/.TRUE./
      IF(PDFGUP(1).LT.0) THEN
         print *,'testing'
         stop
      ELSE
#endif
C--initialisation
         IF(FIRST) THEN
            IF(PDFGUP(1).NE.PDFGUP(2).OR.PDFSUP(1).NE.PDFSUP(2)) THEN
               print *,'MUST HAVE SAME PDF FOR BOTH BEAMS'
               STOP
            ENDIF
            PARM(1)='NPTYPE'
            VALUE(1)=1
            PARM(2)='NGROUP'
            VALUE(2)=PDFGUP(1)
            PARM(3)='NSET'
            VALUE(3)=PDFSUP(1)
            CALL PDFSET(PARM,VALUE)
            FIRST = .FALSE.
         ENDIF
         DO I=1,2
            CALL STRUCTM(XXB(I),EMSCAB,
     &           UPV,DNV,USEA,DSEA,STR,CHM,BTM,TOP,GLU)
            DISFB( 3,I) = STR
            DISFB( 4,I) = CHM
            DISFB( 5,I) = BTM
            DISFB( 6,I) = TOP
            DISFB( 9,I) = STR
            DISFB(10,I) = CHM
            DISFB(11,I) = BTM
            DISFB(12,I) = TOP
            DISFB(13,I) = GLU
            IF(IDBMUP(I).GT.0) THEN
               DISFB(1,I) = DNV+DSEA
               DISFB(2,I) = UPV+USEA
               DISFB(7,I) = DSEA
               DISFB(8,I) = USEA
            ELSE
               DISFB(1,I) = DSEA
               DISFB(2,I) = USEA
               DISFB(7,I) = DNV+DSEA
               DISFB(8,I) = UPV+USEA
            ENDIF
         ENDDO
      ENDIF
      END

#if !defined(PDFLIB)  
CDECK  ID>, PDFSET.
*CMZ :-        -26/04/91  11.11.54  by  Bryan Webber
*-- Author :    Bryan Webber
C----------------------------------------------------------------------
      SUBROUTINE PDFSET(PARM,VAL)
C----------------------------------------------------------------------
C     DUMMY SUBROUTINE: DELETE AND SET MODPDF(I)
C     IN MAIN PROGRAM IF YOU USE PDFLIB CERN-LIBRARY
C     PACKAGE FOR NUCLEON STRUCTURE FUNCTIONS
C----------------------------------------------------------------------
      DOUBLE PRECISION VAL(20)
      CHARACTER*20 PARM(20)
      WRITE (6,10)
   10 FORMAT(/10X,'PDFSET CALLED BUT NOT LINKED')
      STOP
      END
CDECK  ID>, STRUCTM.
*CMZ :-        -26/04/91  11.11.54  by  Bryan Webber
*-- Author :    Bryan Webber
C-----------------------------------------------------------------------
      SUBROUTINE STRUCTM(X,QSCA,UPV,DNV,USEA,DSEA,STR,CHM,BOT,TOP,GLU)
C-----------------------------------------------------------------------
C     DUMMY SUBROUTINE: DELETE IF YOU USE PDFLIB CERN-LIBRARY
C     PACKAGE FOR NUCLEON STRUCTURE FUNCTIONS
C-----------------------------------------------------------------------
      DOUBLE PRECISION X,QSCA,UPV,DNV,USEA,DSEA,STR,CHM,BOT,TOP,GLU
      WRITE (6,10)
  10  FORMAT(/10X,'STRUCTM CALLED BUT NOT LINKED')
      STOP
      END
#endif