Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
C...Extract parton-level events according to Les Houches Accord.
C...The Les Houches Event File produced here can then be used  
C...as input for hadron-level event simulation, also in Pythia8.

C...Note: you need to create two temporary files for MSTP(161) and MSTP(162). 
C...The final call to PYLHEF will pack them into a standard-compliant 
C...Les Houches Event File on your unit MSTP(163), and erase the two
C...temporary files (unless you set MSTP(164)=1).

C...IMPORTANT: the PYLHEF routine attached below is necessary if you run
C...with PYTHIA versions up to and including 6.403. Starting with 6.404
C...this routine is already part of the standard distribution, so you
C...should remove the copy in this file.

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

C...Three PYTHIA functios retunr integers, so need declaring.	
      INTEGER PYK,PYCHGE,PYCOMP

C...EXTERNAL statement links PYDATA on most machines.
      EXTERNAL PYDATA

C...Commonblocks.
      COMMON/PYJETS/N,NPAD,K(4000,5),P(4000,5),V(4000,5)

c...pythia common block.
      PARAMETER (MAXNUP=500)
      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/

      PARAMETER (MAXPUP=100)
      INTEGER PDFGUP,PDFSUP,LPRUP
      COMMON/HEPRUP/IDBMUP(2),EBMUP(2),PDFGUP(2),PDFSUP(2),
     &IDWTUP,NPRUP,XSECUP(MAXPUP),XERRUP(MAXPUP),XMAXUP(MAXPUP),
     &LPRUP(MAXPUP)
      SAVE /HEPRUP/

c...user process event common block.
      COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
      COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
      COMMON/PYDAT2/KCHG(500,4),PMAS(500,4),PARF(2000),VCKM(4,4)
      COMMON/PYSUBS/MSEL,MSELPD,MSUB(500),KFIN(2,-40:40),CKIN(200)
      COMMON/PYDATR/MRPY(6),RRPY(100)
      COMMON/HCLPAR/ECM,NEV


C...Temporary files for initialization/event output.
      MSTP(161)=21
      OPEN(21,FILE='HARDCOL.init',STATUS='unknown')
      MSTP(162)=22
      OPEN(22,FILE='HARDCOL.evnt',STATUS='unknown')

C...Final Les Houches Event File, obtained by combining above two.
      MSTP(163)=23
      OPEN(23,FILE='HARDCOL.lhe',STATUS='unknown')

c*********************************************
c... HARDCOL
c*********************************************
      CALL SETPARAMETERS
      CALL read_hcs_file

C...Initialize.
      CALL EVNTINIT

C...Fills the HEPRUP commonblock with info on incoming beams and allowed
C...processes, and optionally stores that information on file.
c      CALL HARDCOL_PYUPIN
c      CALL PYUPIN

C...Event loop. List first few events.
      DO 200 IEV=1,NEV
        CALL PYUPEV
        IF(IEV.LE.2) THEN
           CALL PYLIST(2)
	   CALL PYLIST(7)
	ENDIF
 200  CONTINUE

C...Final statistics.
      CALL PYSTAT(1)
      CALL PYUPIN

C...Produce final Les Houches Event File.
      CALL PYLHEF

      END

C*********************************************************************

C...Combine the two old-style Pythia initialization and event files
C...into a single Les Houches Event File.
 
      SUBROUTINE PYLHEF
 
C...Double precision and integer declarations.
      IMPLICIT DOUBLE PRECISION(A-H, O-Z)
      IMPLICIT INTEGER(I-N)
 
C...PYTHIA commonblock: only used to provide read/write units and version.
      COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
      SAVE /PYPARS/
 
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...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...Lines to read in assumed never longer than 200 characters. 
      PARAMETER (MAXLEN=200)
      CHARACTER*(MAXLEN) STRING

C...Format for reading lines.
      CHARACTER*6 STRFMT
      STRFMT='(A000)'
      WRITE(STRFMT(3:5),'(I3)') MAXLEN

C...Rewind initialization and event files. 
      REWIND MSTP(161)
      REWIND MSTP(162)

C...Write header info.
      WRITE(MSTP(163),'(A)') '<LesHouchesEvents version="1.0">'
      WRITE(MSTP(163),'(A)') '<!--'
      WRITE(MSTP(163),'(A,I1,A1,I3)') 'File generated with PYTHIA ',
     &MSTP(181),'.',MSTP(182)
      WRITE(MSTP(163),'(A)') '-->'       

C...Read first line of initialization info and get number of processes.
      READ(MSTP(161),'(A)',END=300,ERR=300) STRING                  
      READ(STRING,*,ERR=300) IDBMUP(1),IDBMUP(2),EBMUP(1),
     &EBMUP(2),PDFGUP(1),PDFGUP(2),PDFSUP(1),PDFSUP(2),IDWTUP,NPRUP

C...Copy initialization lines, omitting trailing blanks. 
C...Embed in <init> ... </init> block.
      WRITE(MSTP(163),'(A)') '<init>' 
      DO 120 IPR=0,NPRUP
        IF(IPR.GT.0) READ(MSTP(161),'(A)',END=300,ERR=300) STRING
        LEN=MAXLEN+1  
  110   LEN=LEN-1
        IF(LEN.GT.1.AND.STRING(LEN:LEN).EQ.' ') GOTO 110
        WRITE(MSTP(163),'(A)',ERR=300) STRING(1:LEN)
  120 CONTINUE
      WRITE(MSTP(163),'(A)') '</init>' 

C...Begin event loop.
  200 CONTINUE

C...Read first line of event info and get number of particles.
      READ(MSTP(162),'(A)',END=280,ERR=300) STRING                  
      READ(STRING,*,ERR=300) NUP,IDPRUP,XWGTUP,SCALUP,AQEDUP,AQCDUP

C...Copy event lines, omitting trailing blanks. 
C...Embed in <event> ... </event> block.
      WRITE(MSTP(163),'(A)') '<event>' 
      DO 220 I=0,NUP
        IF(I.GT.0) READ(MSTP(162),'(A)',END=300,ERR=300) STRING
        LEN=MAXLEN+1  
  210   LEN=LEN-1
        IF(LEN.GT.1.AND.STRING(LEN:LEN).EQ.' ') GOTO 210
        WRITE(MSTP(163),'(A)',ERR=300) STRING(1:LEN)
  220 CONTINUE
      WRITE(MSTP(163),'(A)') '</event>' 

C...Loop back to look for next event.
      GOTO 200

C...Successfully reached end of event loop: write closing tag
C...and remove temporary intermediate files (unless asked not to).
  280 WRITE(MSTP(163),'(A)') '</LesHouchesEvents>' 
      IF(MSTP(164).EQ.1) RETURN
      CLOSE(MSTP(161),ERR=300,STATUS='DELETE')
      CLOSE(MSTP(162),ERR=300,STATUS='DELETE')
      RETURN

C...Error exit.
  300 WRITE(*,*) ' PYLHEF file joining failed!'

      RETURN
      END