File indexing completed on 2025-08-03 08:16:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 PROGRAM JEWEL
0062 IMPLICIT NONE
0063
0064 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
0065 INTEGER N,NPAD,K
0066 DOUBLE PRECISION P,V
0067 COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
0068 INTEGER MSTU,MSTJ
0069 DOUBLE PRECISION PARU,PARJ
0070 COMMON/PYDAT3/MDCY(500,3),MDME(8000,2),BRAT(8000),KFDP(8000,5)
0071 INTEGER MDCY,MDME,KFDP
0072 DOUBLE PRECISION BRAT
0073 COMMON/PYSUBS/MSEL,MSELPD,MSUB(500),KFIN(2,-40:40),CKIN(200)
0074 INTEGER MSEL,MSELPD,MSUB,KFIN
0075 DOUBLE PRECISION CKIN
0076 COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
0077 INTEGER MSTP,MSTI
0078 DOUBLE PRECISION PARP,PARI
0079 COMMON/PYDATR/MRPY(6),RRPY(100)
0080 INTEGER MRPY
0081 DOUBLE PRECISION RRPY
0082
0083 common/hepmcid/hpmcfid,logfid
0084 integer hpmcfid,logfid
0085
0086 COMMON/NPDF/MASS,NSET,EPS09,INITSTR
0087 INTEGER NSET
0088 DOUBLE PRECISION MASS
0089 LOGICAL EPS09
0090 CHARACTER*10 INITSTR
0091
0092 common/np/nproton
0093 integer nproton
0094
0095 common/evrecord/nsim,npart,offset,hadrotype,sqrts,collider,hadro,
0096 &shorthepmc,channel,isochannel
0097 integer nsim,npart,offset,hadrotype
0098 double precision sqrts
0099 character*4 collider,channel
0100 character*2 isochannel
0101 logical hadro,shorthepmc
0102
0103 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
0104 LOGICAL DISCARD
0105 INTEGER NDISC,NSTRANGE,NGOOD,errcount
0106 double precision wdisc
0107
0108 COMMON/WEIGHT/EVWEIGHT,sumofweights
0109 double precision EVWEIGHT,sumofweights
0110
0111 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
0112 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
0113
0114 common/extrapolations/ntotspliti,noverspliti,ntotpdf,noverpdf,
0115 &ntotxsec,noverxsec,ntotsuda,noversuda
0116 integer ntotspliti,noverspliti,ntotpdf,noverpdf,
0117 &ntotxsec,noverxsec,ntotsuda,noversuda
0118
0119 integer j,i,kk,poissonian
0120 integer nsimpp,nsimpn,nsimnp,nsimnn,nsimsum,nsimchn
0121 double precision sumofweightstot,wdisctot,scalefac
0122 double precision gettemp,r,tau
0123 character*2 b1,b2
0124
0125 call init()
0126
0127 SUMOFWEIGHTSTOT=0.d0
0128 WDISCTOT=0.d0
0129
0130
0131 if (collider.eq.'EEJJ') then
0132 b1 = 'e+'
0133 b2 = 'e-'
0134 write(logfid,*)
0135 write(logfid,*)
0136 &'####################################################'
0137 write(logfid,*)
0138 write(logfid,*)'generating ',nsim,' events in ',b1,' + ',b2,
0139 &' channel'
0140 write(logfid,*)
0141 write(logfid,*)
0142 &'####################################################'
0143 write(logfid,*)
0144 SUMOFWEIGHTS=0.d0
0145 WDISC=0.d0
0146 call initpythia(b1,b2)
0147 write(logfid,*)
0148
0149 DO 100 J=1,NSIM
0150 call genevent(j,b1,b2)
0151 100 CONTINUE
0152 sumofweightstot = sumofweightstot+sumofweights
0153 wdisctot = wdisctot + wdisc
0154 write(logfid,*)
0155 write(logfid,*)'cross section in e+ + e- channel:',PARI(1),'mb'
0156 write(logfid,*)'sum of event weights in e+ + e- channel:',
0157 & sumofweights-wdisc
0158 write(logfid,*)
0159
0160 else
0161
0162 if (isochannel.eq.'PP') then
0163 nsimpp = nsim
0164 nsimpn = 0
0165 nsimnp = 0
0166 nsimnn = 0
0167 elseif (isochannel.eq.'PN') then
0168 nsimpp = 0
0169 nsimpn = nsim
0170 nsimnp = 0
0171 nsimnn = 0
0172 elseif (isochannel.eq.'NP') then
0173 nsimpp = 0
0174 nsimpn = 0
0175 nsimnp = nsim
0176 nsimnn = 0
0177 elseif (isochannel.eq.'NN') then
0178 nsimpp = 0
0179 nsimpn = 0
0180 nsimnp = 0
0181 nsimnn = nsim
0182 else
0183 nsimpp = poissonian(nsim*nproton**2/mass**2)
0184 nsimpn = poissonian(nsim*nproton*(mass-nproton*1.d0)/mass**2)
0185 nsimnp = poissonian(nsim*nproton*(mass-nproton*1.d0)/mass**2)
0186 nsimnn = poissonian(nsim*(mass-nproton*1.d0)**2/mass**2)
0187 nsimsum = nsimpp + nsimpn + nsimnp + nsimnn
0188 scalefac = nsim*1.d0/(nsimsum*1.d0)
0189 nsimpp = int(nsimpp*scalefac)
0190 nsimpn = int(nsimpn*scalefac)
0191 nsimnp = int(nsimnp*scalefac)
0192 nsimnn = int(nsimnn*scalefac)
0193 nsimsum = nsimpp + nsimpn + nsimnp + nsimnn
0194 endif
0195
0196 do 101 kk=1,4
0197 if (kk.eq.1) then
0198 b1 = 'p+'
0199 b2 = 'p+'
0200 nsimchn = nsimpp
0201 elseif (kk.eq.2) then
0202 b1 = 'p+'
0203 b2 = 'n0'
0204 nsimchn = nsimpn
0205 elseif (kk.eq.3) then
0206 b1 = 'n0'
0207 b2 = 'p+'
0208 nsimchn = nsimnp
0209 else
0210 b1 = 'n0'
0211 b2 = 'n0'
0212 nsimchn = nsimnn
0213 endif
0214 write(logfid,*)
0215 write(logfid,*)
0216 &'####################################################'
0217 write(logfid,*)
0218 write(logfid,*)'generating ',nsimchn,' events in ',
0219 &b1,' + ',b2,' channel'
0220 write(logfid,*)
0221 write(logfid,*)
0222 &'####################################################'
0223 write(logfid,*)
0224 SUMOFWEIGHTS=0.d0
0225 WDISC=0.d0
0226 call initpythia(b1,b2)
0227 write(logfid,*)
0228
0229 DO 102 J=1,nsimchn
0230 call genevent(j,b1,b2)
0231 102 CONTINUE
0232 sumofweightstot = sumofweightstot+sumofweights
0233 wdisctot = wdisctot + wdisc
0234 write(logfid,*)
0235 write(logfid,*)'cross section in ',b1,' + ',b2,' channel:',
0236 & PARI(1),'mb'
0237 write(logfid,*)'sum of event weights in ',b1,' + ',b2,
0238 & ' channel:',sumofweights-wdisc
0239 write(logfid,*)
0240 101 continue
0241 endif
0242
0243
0244 WRITE(HPMCFID,'(A)')'HepMC::IO_GenEvent-END_EVENT_LISTING'
0245 WRITE(HPMCFID,*)
0246 CLOSE(HPMCFID,status='keep')
0247
0248 write(logfid,*)
0249 write(logfid,*)'mean number of scatterings:',
0250 & NSCAT/(SUMOFWEIGHTSTOT-WDISCTOT)
0251 write(logfid,*)'mean number of effective scatterings:',
0252 & NSCATEFF/(SUMOFWEIGHTSTOT-WDISCTOT)
0253 write(logfid,*)'mean number of splittings:',
0254 & NSPLIT/(SUMOFWEIGHTSTOT-WDISCTOT)
0255 write(logfid,*)
0256 write(logfid,*)'number of extrapolations in splitting integral: ',
0257 & noverspliti,' (',(noverspliti*1.d0)/(ntotspliti*1.d0),'%)'
0258 write(logfid,*)
0259 & 'number of extrapolations in splitting partonic PDFs: ',
0260 & noverpdf,' (',(noverpdf*1.d0)/(ntotpdf*1.d0),'%)'
0261 write(logfid,*)
0262 & 'number of extrapolations in splitting cross sections: ',
0263 & noverxsec,' (',(noverxsec*1.d0)/(ntotxsec*1.d0),'%)'
0264 write(logfid,*)
0265 & 'number of extrapolations in Sudakov form factor: ',
0266 & noversuda,' (',(noversuda*1.d0)/(ntotsuda*1.d0),'%)'
0267 write(logfid,*)
0268 write(logfid,*)'number of good events: ',ngood
0269 write(logfid,*)'total number of discarded events: ',NDISC
0270 write(logfid,*)'number of events for which conversion '//
0271 &'to hepmc failed: ',NSTRANGE
0272 call printtime
0273
0274 close(logfid,status='keep')
0275
0276 END
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290 subroutine init()
0291 implicit none
0292 INTEGER PYCOMP
0293 INTEGER NMXHEP
0294
0295 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
0296 INTEGER N,NPAD,K
0297 DOUBLE PRECISION P,V
0298 COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
0299 INTEGER MSTU,MSTJ
0300 DOUBLE PRECISION PARU,PARJ
0301 COMMON/PYDAT3/MDCY(500,3),MDME(8000,2),BRAT(8000),KFDP(8000,5)
0302 INTEGER MDCY,MDME,KFDP
0303 DOUBLE PRECISION BRAT
0304 COMMON/PYSUBS/MSEL,MSELPD,MSUB(500),KFIN(2,-40:40),CKIN(200)
0305 INTEGER MSEL,MSELPD,MSUB,KFIN
0306 DOUBLE PRECISION CKIN
0307 COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
0308 INTEGER MSTP,MSTI
0309 DOUBLE PRECISION PARP,PARI
0310 COMMON/PYDATR/MRPY(6),RRPY(100)
0311 INTEGER MRPY
0312 DOUBLE PRECISION RRPY
0313
0314 COMMON/NPDF/MASS,NSET,EPS09,INITSTR
0315 INTEGER NSET
0316 DOUBLE PRECISION MASS
0317 LOGICAL EPS09
0318 CHARACTER*10 INITSTR
0319
0320 common/pdf/pdfset
0321 integer pdfset
0322
0323 common/np/nproton
0324 integer nproton
0325
0326 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
0327 &ALLHAD,compress,NF
0328 INTEGER NF
0329 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
0330 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
0331
0332 COMMON/SPLITINT/SPLITIGGV(1000,1000),SPLITIQQV(1000,1000),
0333 &SPLITIQGV(1000,1000),QVAL(1000),ZMVAL(1000),QMAX,ZMMIN,NPOINT
0334 INTEGER NPOINT
0335 DOUBLE PRECISION SPLITIGGV,SPLITIQQV,SPLITIQGV,
0336 &QVAL,ZMVAL,QMAX,ZMMIN
0337
0338 COMMON/PDFS/QINQX(2,1000),GINQX(2,1000),QINGX(2,1000),
0339 &GINGX(2,1000)
0340 DOUBLE PRECISION QINQX,GINQX,QINGX,GINGX
0341
0342 COMMON/XSECS/INTQ1(1001,101),INTQ2(1001,101),
0343 &INTG1(1001,101),INTG2(1001,101)
0344 DOUBLE PRECISION INTQ1,INTQ2,INTG1,INTG2
0345
0346 COMMON/INSUDA/SUDAQQ(1000,2),SUDAQG(1000,2),SUDAGG(1000,2)
0347 &,SUDAGC(1000,2)
0348 DOUBLE PRECISION SUDAQQ,SUDAQG,SUDAGG,SUDAGC
0349
0350 COMMON/EXPINT/EIX(3,1000),VALMAX,NVAL
0351 INTEGER NVAL
0352 DOUBLE PRECISION EIX,VALMAX
0353
0354 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
0355 LOGICAL DISCARD
0356 INTEGER NDISC,NSTRANGE,NGOOD,errcount
0357 double precision wdisc
0358
0359 COMMON/FTIMEFAC/FTFAC
0360 DOUBLE PRECISION FTFAC
0361
0362 COMMON/ALPHASFAC/PTFAC
0363 DOUBLE PRECISION PTFAC
0364
0365 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
0366 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
0367
0368 common/extrapolations/ntotspliti,noverspliti,ntotpdf,noverpdf,
0369 &ntotxsec,noverxsec,ntotsuda,noversuda
0370 integer ntotspliti,noverspliti,ntotpdf,noverpdf,
0371 &ntotxsec,noverxsec,ntotsuda,noversuda
0372
0373 COMMON/WEIGHT/EVWEIGHT,sumofweights
0374 double precision EVWEIGHT,sumofweights
0375
0376 COMMON/WEXPO/WEIGHTEX
0377 DOUBLE PRECISION WEIGHTEX
0378
0379 common/hepmcid/hpmcfid,logfid
0380 integer hpmcfid,logfid
0381
0382 common/rapmax/etamax
0383 double precision etamax
0384
0385 common/errline/errl
0386 integer errl
0387
0388 common/evrecord/nsim,npart,offset,hadrotype,sqrts,collider,hadro,
0389 &shorthepmc,channel,isochannel
0390 integer nsim,npart,offset,hadrotype
0391 double precision sqrts
0392 character*4 collider,channel
0393 character*2 isochannel
0394 logical hadro,shorthepmc
0395
0396 common/storescatcen/nscatcen,maxnscatcen,scatflav(10000),
0397 &scatcen(10000,5),writescatcen,writedummies
0398 integer nscatcen,maxnscatcen,scatflav
0399 double precision scatcen
0400 logical writescatcen,writedummies
0401
0402 common/pythiaparams/PTMIN,PTMAX,weighted
0403 double precision PTMIN,PTMAX
0404 LOGICAL WEIGHTED
0405
0406
0407 INTEGER NJOB,ios,pos,i,j,jj,intmass
0408 DOUBLE PRECISION GETLTIMEMAX,EOVEST,r,pyr
0409 character firstchar
0410 CHARACTER*2 SNSET
0411 CHARACTER*80 PDFFILE,XSECFILE,FILEMED,FILESPLIT,buffer,
0412 &label,value
0413 CHARACTER*100 HEPMCFILE,LOGFILE,FILENAME2
0414 CHARACTER(LEN=100) filename
0415 LOGICAL PDFEXIST,SPLITIEXIST,XSECEXIST
0416
0417 data maxnscatcen/10000/
0418
0419 HPMCFID = 4
0420 logfid = 3
0421
0422
0423 nsim = 10
0424 njob = 0
0425 logfile = 'out.log'
0426 hepmcfile = 'out.hepmc'
0427 filesplit = 'splitint.dat'
0428 pdffile = 'pdfs.dat'
0429 xsecfile = 'xsecs.dat'
0430 filemed = 'medium-params.dat'
0431 nf = 3
0432 lqcd = 0.4
0433 q0 = 1.5
0434 ptmin = 5.
0435 ptmax = 350.
0436 etamax = 3.1
0437 collider = 'PPJJ'
0438 isochannel = 'XX'
0439 channel = 'MUON'
0440 sqrts = 2760
0441 pdfset = 10042
0442 nset = 1
0443 mass = 208.
0444 nproton = 82
0445 weighted = .true.
0446 weightex = 5.
0447 angord = .true.
0448 allhad = .false.
0449 hadro = .true.
0450 hadrotype = 0
0451 shorthepmc = .true.
0452 compress = .true.
0453 writescatcen = .false.
0454 writedummies = .false.
0455
0456 lps = lqcd
0457 scatrecoil = .false.
0458 if (.not.hadro) shorthepmc = .true.
0459
0460 SCALEFACM=1.
0461 ptfac=1.
0462 ftfac=1.d0
0463
0464 if (iargc().eq.0) then
0465 write(*,*)'No parameter file given, '//
0466 &'will run with default settings.'
0467 else
0468 call getarg(1,filename)
0469 write(*,*)'Reading parameters from ',filename
0470 open(unit=1,file=filename,status='old',err=110)
0471 do 120 i=1,1000
0472 read(1, '(A)', iostat=ios) buffer
0473 if(ios.ne.0) goto 130
0474 firstchar = buffer(1:1)
0475 if (firstchar.eq.'#') goto 120
0476 pos=scan(buffer,' ')
0477 label=buffer(1:pos)
0478 value=buffer(pos+1:)
0479 if(label.eq."NEVENT")then
0480 read(value,*,iostat=ios) nsim
0481 elseif(label.eq."NJOB")then
0482 read(value,*,iostat=ios) njob
0483 elseif(label.eq."LOGFILE")then
0484 read(value,'(a)',iostat=ios) logfile
0485 elseif(label.eq."HEPMCFILE")then
0486 read(value,'(a)',iostat=ios) hepmcfile
0487 elseif(label.eq."SPLITINTFILE")then
0488 read(value,'(a)',iostat=ios) filesplit
0489 elseif(label.eq."PDFFILE")then
0490 read(value,'(a)',iostat=ios) pdffile
0491 elseif(label.eq."XSECFILE")then
0492 read(value,'(a)',iostat=ios) xsecfile
0493 elseif(label.eq."MEDIUMPARAMS")then
0494 read(value,'(a)',iostat=ios) filemed
0495 elseif(label.eq."NF")then
0496 read(value,*,iostat=ios) nf
0497 elseif(label.eq."LAMBDAQCD")then
0498 read(value,*,iostat=ios) lqcd
0499 elseif(label.eq."Q0")then
0500 read(value,*,iostat=ios) q0
0501 elseif(label.eq."PTMIN")then
0502 read(value,*,iostat=ios) ptmin
0503 elseif(label.eq."PTMAX")then
0504 read(value,*,iostat=ios) ptmax
0505 elseif(label.eq."ETAMAX")then
0506 read(value,*,iostat=ios) etamax
0507 elseif(label.eq."PROCESS")then
0508 read(value,*,iostat=ios) collider
0509 elseif(label.eq."ISOCHANNEL")then
0510 read(value,*,iostat=ios) isochannel
0511 elseif(label.eq."CHANNEL")then
0512 read(value,*,iostat=ios) channel
0513 elseif(label.eq."SQRTS")then
0514 read(value,*,iostat=ios) sqrts
0515 elseif(label.eq."PDFSET")then
0516 read(value,*,iostat=ios) pdfset
0517 elseif(label.eq."NSET")then
0518 read(value,*,iostat=ios) nset
0519 elseif(label.eq."MASS")then
0520 read(value,*,iostat=ios) mass
0521 elseif(label.eq."NPROTON")then
0522 read(value,*,iostat=ios) nproton
0523 elseif(label.eq."WEIGHTED")then
0524 read(value,*,iostat=ios) weighted
0525 elseif(label.eq."WEXPO")then
0526 read(value,*,iostat=ios) weightex
0527 elseif(label.eq."ANGORD")then
0528 read(value,*,iostat=ios) angord
0529 elseif(label.eq."KEEPRECOILS")then
0530 read(value,*,iostat=ios) allhad
0531 elseif(label.eq."HADRO")then
0532 read(value,*,iostat=ios) hadro
0533 elseif(label.eq."HADROTYPE")then
0534 read(value,*,iostat=ios) hadrotype
0535 elseif(label.eq."SHORTHEPMC")then
0536 read(value,*,iostat=ios) shorthepmc
0537 elseif(label.eq."COMPRESS")then
0538 read(value,*,iostat=ios) compress
0539 elseif(label.eq."WRITESCATCEN")then
0540 read(value,*,iostat=ios) writescatcen
0541 elseif(label.eq."WRITEDUMMIES")then
0542 read(value,*,iostat=ios) writedummies
0543 else
0544 write(*,*)'unknown label ',label
0545 endif
0546 120 continue
0547
0548
0549 110 write(*,*)
0550 & 'Unable to open parameter file, will exit the run.'
0551 call exit(1)
0552
0553 130 close(1,status='keep')
0554 write(*,*)'...done'
0555 endif
0556
0557 if (ptmin.lt.3.d0) ptmin = 3.d0
0558 if (.not.writescatcen) writedummies = .false.
0559
0560 OPEN(unit=logfid,file=LOGFILE,status='unknown')
0561 MSTU(11)=logfid
0562
0563 call printtime
0564 call printlogo(logfid)
0565
0566
0567 write(logfid,*)
0568 write(logfid,*)'parameters of the run:'
0569 write(logfid,*)'NEVENT = ',nsim
0570 write(logfid,*)'NJOB = ',njob
0571 write(logfid,*)'LOGFILE = ',logfile
0572 write(logfid,*)'HEPMCFILE = ',hepmcfile
0573 write(logfid,*)'SPLITINTFILE = ',filesplit
0574 write(logfid,*)'PDFFILE = ',pdffile
0575 write(logfid,*)'XSECFILE = ',xsecfile
0576 write(logfid,*)'MEDIUMPARAMS = ',filemed
0577 write(logfid,*)'NF = ',nf
0578 write(logfid,*)'LAMBDAQCD = ',lqcd
0579 write(logfid,*)'Q0 = ',q0
0580 write(logfid,*)'PTMIN = ',ptmin
0581 write(logfid,*)'PTMAX = ',ptmax
0582 write(logfid,*)'ETAMAX = ',etamax
0583 write(logfid,*)'PROCESS = ',collider
0584 write(logfid,*)'ISOCHANNEL = ',isochannel
0585 write(logfid,*)'CHANNEL = ',channel
0586 write(logfid,*)'SQRTS = ',sqrts
0587 write(logfid,*)'PDFSET = ',pdfset
0588 write(logfid,*)'NSET = ',nset
0589 write(logfid,*)'MASS = ',mass
0590 write(logfid,*)'NPROTON = ',nproton
0591 write(logfid,*)'WEIGHTED = ',weighted
0592 write(logfid,*)'WEXPO = ',weightex
0593 write(logfid,*)'ANGORD = ',angord
0594 write(logfid,*)'KEEPRECOILS = ',allhad
0595 write(logfid,*)'HADRO = ',hadro
0596 write(logfid,*)'HADROTYPE = ',hadrotype
0597 write(logfid,*)'SHORTHEPMC = ',shorthepmc
0598 write(logfid,*)'COMPRESS = ',compress
0599 write(logfid,*)'WRITESCATCEN = ',writescatcen
0600 write(logfid,*)'WRITEDUMMIES = ',writedummies
0601 write(logfid,*)
0602 call flush(logfid)
0603
0604 if ((collider.ne.'PPJJ').and.(collider.ne.'EEJJ')
0605 & .and.(collider.ne.'PPYJ').and.(collider.ne.'PPYQ')
0606 & .and.(collider.ne.'PPYG')
0607 & .and.(collider.ne.'PPZJ').and.(collider.ne.'PPZQ')
0608 & .and.(collider.ne.'PPZG').and.(collider.ne.'PPWJ')
0609 & .and.(collider.ne.'PPWQ').and.(collider.ne.'PPWG')
0610 & .and.(collider.ne.'PPDY')) then
0611 write(logfid,*)'Fatal error: colliding system unknown, '//
0612 & 'will exit now'
0613 call exit(1)
0614 endif
0615
0616
0617 intmass = int(mass)
0618 CALL MEDINIT(FILEMED,logfid,etamax,intmass)
0619 CALL MEDNEXTEVT
0620
0621 OPEN(unit=HPMCFID,file=HEPMCFILE,status='unknown')
0622 WRITE(HPMCFID,*)
0623 WRITE(HPMCFID,'(A)')'HepMC::Version 2.06.05'
0624 WRITE(HPMCFID,'(A)')'HepMC::IO_GenEvent-START_EVENT_LISTING'
0625
0626 NPART=2
0627
0628 if(ptmax.gt.0.)then
0629 EOVEST=MIN(1.5*(PTMAX+50.)*COSH(ETAMAX),sqrts/2.)
0630 else
0631 EOVEST=sqrts/2.
0632 endif
0633
0634
0635 CALL EIXINT
0636 CALL INSUDAINT(EOVEST)
0637
0638 write(logfid,*)
0639 INQUIRE(file=FILESPLIT,exist=SPLITIEXIST)
0640 IF(SPLITIEXIST)THEN
0641 write(logfid,*)'read splitting integrals from ',FILESPLIT
0642 OPEN(unit=10,file=FILESPLIT,status='old')
0643 READ(10,*)QMAX,ZMMIN,NPOINT
0644 DO 893 I=1,NPOINT+1
0645 READ(10,*) QVAL(I),ZMVAL(I)
0646 893 CONTINUE
0647 DO 891 I=1,NPOINT+1
0648 DO 892 J=1,NPOINT+1
0649 READ(10,*)SPLITIGGV(I,J),SPLITIQQV(I,J),SPLITIQGV(I,J)
0650 892 CONTINUE
0651 891 CONTINUE
0652 CLOSE(10,status='keep')
0653 ELSE
0654 write(logfid,*)'have to integrate splitting functions, '//
0655 &'this may take some time'
0656 CALL SPLITFNCINT(EOVEST)
0657 INQUIRE(file=FILESPLIT,exist=SPLITIEXIST)
0658 IF(.NOT.SPLITIEXIST)THEN
0659 write(logfid,*)'write splitting integrals to ',FILESPLIT
0660 OPEN(unit=10,file=FILESPLIT,status='new')
0661 WRITE(10,*)QMAX,ZMMIN,NPOINT
0662 DO 896 I=1,NPOINT+1
0663 WRITE(10,*) QVAL(I),ZMVAL(I)
0664 896 CONTINUE
0665 DO 897 I=1,NPOINT+1
0666 DO 898 J=1,NPOINT+1
0667 WRITE(10,*)SPLITIGGV(I,J),SPLITIQQV(I,J),SPLITIQGV(I,J)
0668 898 CONTINUE
0669 897 CONTINUE
0670 CLOSE(10,status='keep')
0671 ENDIF
0672 ENDIF
0673 write(logfid,*)
0674
0675 INQUIRE(file=PDFFILE,exist=PDFEXIST)
0676 IF(PDFEXIST)THEN
0677 write(logfid,*)'read pdfs from ',PDFFILE
0678 OPEN(unit=10,file=PDFFILE,status='old')
0679 DO 872 I=1,2
0680 DO 873 J=1,1000
0681 READ(10,*)QINQX(I,J),GINQX(I,J),QINGX(I,J),GINGX(I,J)
0682 873 CONTINUE
0683 872 CONTINUE
0684 CLOSE(10,status='keep')
0685 ELSE
0686 write(logfid,*)'have to integrate pdfs, this may take some time'
0687 CALL PDFINT(EOVEST)
0688 INQUIRE(file=PDFFILE,exist=PDFEXIST)
0689 IF(.NOT.PDFEXIST)THEN
0690 write(logfid,*)'write pdfs to ',PDFFILE
0691 OPEN(unit=10,file=PDFFILE,status='new')
0692 DO 876 I=1,2
0693 DO 877 J=1,1000
0694 WRITE(10,*)QINQX(I,J),GINQX(I,J),QINGX(I,J),GINGX(I,J)
0695 877 CONTINUE
0696 876 CONTINUE
0697 CLOSE(10,status='keep')
0698 ENDIF
0699 ENDIF
0700 write(logfid,*)
0701
0702 INQUIRE(file=XSECFILE,exist=XSECEXIST)
0703 IF(XSECEXIST)THEN
0704 write(logfid,*)'read cross sections from ',XSECFILE
0705 OPEN(unit=10,file=XSECFILE,status='old')
0706 DO 881 J=1,1001
0707 DO 885 JJ=1,101
0708 READ(10,*)INTQ1(J,JJ),INTQ2(J,JJ),
0709 &INTG1(J,JJ),INTG2(J,JJ)
0710 885 CONTINUE
0711 881 CONTINUE
0712 CLOSE(10,status='keep')
0713 ELSE
0714 write(logfid,*)'have to integrate cross sections, '//
0715 &'this may take some time'
0716 CALL XSECINT(EOVEST)
0717 INQUIRE(file=XSECFILE,exist=XSECEXIST)
0718 IF(.NOT.XSECEXIST)THEN
0719 write(logfid,*)'write cross sections to ',XSECFILE
0720 OPEN(unit=10,file=XSECFILE,status='new')
0721 DO 883 J=1,1001
0722 DO 884 JJ=1,101
0723 WRITE(10,*)INTQ1(J,JJ),INTQ2(J,JJ),
0724 &INTG1(J,JJ),INTG2(J,JJ)
0725 884 CONTINUE
0726 883 CONTINUE
0727 CLOSE(10,status='keep')
0728 ENDIF
0729 ENDIF
0730 write(logfid,*)
0731 CALL FLUSH(3)
0732
0733
0734
0735
0736 IF(NJOB.GT.0)THEN
0737 MRPY(1)=NJOB*1000
0738 MRPY(2)=0
0739 ENDIF
0740
0741
0742 R=PYR(0)
0743
0744 NDISC=0
0745 NGOOD=0
0746 NSTRANGE=0
0747
0748 ERRCOUNT=0
0749 errl = 0
0750
0751 NSCAT=0.d0
0752 NSCATEFF=0.d0
0753 NSPLIT=0.d0
0754
0755 ntotspliti=0
0756 noverspliti=0
0757 ntotpdf=0
0758 noverpdf=0
0759 ntotxsec=0
0760 noverxsec=0
0761 ntotsuda=0
0762 noversuda=0
0763
0764 IF(NSET.EQ.0)THEN
0765 EPS09=.FALSE.
0766 ELSE
0767 EPS09=.TRUE.
0768 IF(NSET.LT.10)THEN
0769 WRITE(SNSET,'(i1)') NSET
0770 ELSE
0771 WRITE(SNSET,'(i2)') NSET
0772 ENDIF
0773 INITSTR='EPS09LO,'//SNSET
0774 ENDIF
0775
0776 end
0777
0778
0779
0780
0781
0782
0783 subroutine initpythia(beam1,beam2)
0784 implicit none
0785 INTEGER PYCOMP
0786 INTEGER NMXHEP
0787
0788 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
0789 INTEGER N,NPAD,K
0790 DOUBLE PRECISION P,V
0791 COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
0792 INTEGER MSTU,MSTJ
0793 DOUBLE PRECISION PARU,PARJ
0794 COMMON/PYDAT3/MDCY(500,3),MDME(8000,2),BRAT(8000),KFDP(8000,5)
0795 INTEGER MDCY,MDME,KFDP
0796 DOUBLE PRECISION BRAT
0797 COMMON/PYSUBS/MSEL,MSELPD,MSUB(500),KFIN(2,-40:40),CKIN(200)
0798 INTEGER MSEL,MSELPD,MSUB,KFIN
0799 DOUBLE PRECISION CKIN
0800 COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
0801 INTEGER MSTP,MSTI
0802 DOUBLE PRECISION PARP,PARI
0803 COMMON/PYDATR/MRPY(6),RRPY(100)
0804 INTEGER MRPY
0805 DOUBLE PRECISION RRPY
0806
0807 COMMON/NPDF/MASS,NSET,EPS09,INITSTR
0808 INTEGER NSET
0809 DOUBLE PRECISION MASS
0810 LOGICAL EPS09
0811 CHARACTER*10 INITSTR
0812
0813 common/pdf/pdfset
0814 integer pdfset
0815
0816 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
0817 &ALLHAD,compress,NF
0818 INTEGER NF
0819 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
0820 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
0821
0822 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
0823 LOGICAL DISCARD
0824 INTEGER NDISC,NSTRANGE,NGOOD,errcount
0825 double precision wdisc
0826
0827 COMMON/WEIGHT/EVWEIGHT,sumofweights
0828 double precision EVWEIGHT,sumofweights
0829
0830 COMMON/WEXPO/WEIGHTEX
0831 DOUBLE PRECISION WEIGHTEX
0832
0833 common/errline/errl
0834 integer errl
0835
0836 common/evrecord/nsim,npart,offset,hadrotype,sqrts,collider,hadro,
0837 &shorthepmc,channel,isochannel
0838 integer nsim,npart,offset,hadrotype
0839 double precision sqrts
0840 character*4 collider,channel
0841 character*2 isochannel
0842 logical hadro,shorthepmc
0843
0844 common/pythiaparams/PTMIN,PTMAX,weighted
0845 double precision PTMIN,PTMAX
0846 LOGICAL WEIGHTED
0847
0848
0849 character*2 beam1,beam2
0850
0851
0852
0853
0854 MSTP(81) = 0
0855
0856 MSTP(61)=1
0857
0858 MSTP(71)=0
0859
0860 MSTP(111)=0
0861
0862 PARU(14)=1.
0863
0864 CKIN(1)=2.
0865
0866 CKIN(3)=PTMIN
0867 CKIN(4)=PTMAX
0868
0869 MSTP(52)=2
0870
0871
0872 MSTP(51)=PDFSET
0873 IF(COLLIDER.EQ.'PPYQ')THEN
0874 MSEL=0
0875 MSUB(29)=1
0876 ELSEIF(COLLIDER.EQ.'PPYG')THEN
0877 MSEL=0
0878 MSUB(14)=1
0879 MSUB(115)=1
0880 ELSEIF(COLLIDER.EQ.'PPYJ')THEN
0881 MSEL=0
0882 MSUB(14)=1
0883 MSUB(29)=1
0884 MSUB(115)=1
0885 ELSEIF((COLLIDER.EQ.'PPZJ').or.(COLLIDER.EQ.'PPZQ')
0886 & .or.(COLLIDER.EQ.'PPZG')
0887 & .or.(collider.eq.'PPDY'))THEN
0888 MSEL=0
0889 IF((COLLIDER.EQ.'PPZJ').or.(COLLIDER.EQ.'PPZQ')) MSUB(30)=1
0890 IF((COLLIDER.EQ.'PPZJ').or.(COLLIDER.EQ.'PPZG')) MSUB(15)=1
0891 IF(COLLIDER.EQ.'PPDY') MSUB(1)=1
0892 MDME(174,1)=0 !Z decay into d dbar',
0893 MDME(175,1)=0 !Z decay into u ubar',
0894 MDME(176,1)=0 !Z decay into s sbar',
0895 MDME(177,1)=0 !Z decay into c cbar',
0896 MDME(178,1)=0 !Z decay into b bbar',
0897 MDME(179,1)=0 !Z decay into t tbar',
0898 MDME(182,1)=0 !Z decay into e- e+',
0899 MDME(183,1)=0 !Z decay into nu_e nu_ebar',
0900 MDME(184,1)=0 !Z decay into mu- mu+',
0901 MDME(185,1)=0 !Z decay into nu_mu nu_mubar',
0902 MDME(186,1)=0 !Z decay into tau- tau+',
0903 MDME(187,1)=0 !Z decay into nu_tau nu_taubar',
0904 if (channel.EQ.'ELEC')THEN
0905 MDME(182,1)=1
0906 ELSEIF(channel.EQ.'MUON')THEN
0907 MDME(184,1)=1
0908 ENDIF
0909 ELSEIF((COLLIDER.EQ.'PPWJ').or.(COLLIDER.EQ.'PPWQ')
0910 & .or.(COLLIDER.EQ.'PPWG'))THEN
0911 MSEL=0
0912 IF((COLLIDER.EQ.'PPWJ').or.(COLLIDER.EQ.'PPWQ')) MSUB(31)=1
0913 IF((COLLIDER.EQ.'PPWJ').or.(COLLIDER.EQ.'PPWG')) MSUB(16)=1
0914 MDME(190,1)=0 ! W+ decay into dbar u,
0915 MDME(191,1)=0 ! W+ decay into dbar c,
0916 MDME(192,1)=0 ! W+ decay into dbar t,
0917 MDME(194,1)=0 ! W+ decay into sbar u,
0918 MDME(195,1)=0 ! W+ decay into sbar c,
0919 MDME(196,1)=0 ! W+ decay into sbar t,
0920 MDME(198,1)=0 ! W+ decay into bbar u,
0921 MDME(199,1)=0 ! W+ decay into bbar c,
0922 MDME(200,1)=0 ! W+ decay into bbar t,
0923 MDME(202,1)=0 ! W+ decay into b'bar u,
0924 MDME(203,1)=0 ! W+ decay into b'bar c,
0925 MDME(204,1)=0 ! W+ decay into b'bar t,
0926 MDME(206,1)=0 ! W+ decay into e+ nu_e,
0927 MDME(207,1)=0 ! W+ decay into mu+ nu_mu,
0928 MDME(208,1)=0 ! W+ decay into tau+ nu_tau,
0929 MDME(209,1)=0 ! W+ decay into tau'+ nu'_tau,
0930 if (channel.EQ.'ELEC')THEN
0931 MDME(206,1)=1
0932 ELSEIF(channel.EQ.'MUON')THEN
0933 MDME(207,1)=1
0934 ENDIF
0935 ELSE
0936 C--All QCD processes are active
0937 MSEL=1
0938 ENDIF
0939 ! MSEL=0
0940 ! MSUB(11)=1
0941 ! MSUB(12)=1
0942 ! MSUB(53)=1
0943 ! MSUB(13)=1
0944 ! MSUB(68)=1
0945 ! MSUB(28)=1
0946
0947 C--weighted events
0948 IF(WEIGHTED) MSTP(142)=1
0949
0950 C--number of errors to be printed
0951 MSTU(22)=MAX(10,INT(5.*NSIM/100.))
0952
0953 C--number of lines in event record
0954 MSTU(4)=23000
0955 MSTU(5)=23000
0956
0957 C--switch off pi0 decay
0958 MDCY(PYCOMP(111),1)=0
0959 C--initialisation call
0960 IF(COLLIDER.EQ.'EEJJ')THEN
0961 OFFSET=9
0962 CALL PYINIT('CMS',beam1,beam2,sqrts)
0963 ELSEIF((COLLIDER.EQ.'PPJJ').OR.(COLLIDER.EQ.'PPYJ').OR.
0964 & (COLLIDER.EQ.'PPYG').OR.(COLLIDER.EQ.'PPYQ'))THEN
0965 OFFSET=8
0966 CALL PYINIT('CMS',beam1,beam2,sqrts)
0967 ELSEIF((COLLIDER.EQ.'PPWJ').OR.(COLLIDER.EQ.'PPZJ').or.
0968 & (COLLIDER.EQ.'PPWQ').OR.(COLLIDER.EQ.'PPZQ').or.
0969 & (COLLIDER.EQ.'PPWG').OR.(COLLIDER.EQ.'PPZG'))THEN
0970 OFFSET=10
0971 CALL PYINIT('CMS',beam1,beam2,sqrts)
0972 elseif (collider.eq.'PPDY') then
0973 CALL PYINIT('CMS',beam1,beam2,sqrts)
0974 ENDIF
0975
0976 end
0977
0978
0979
0980 ***********************************************************************
0981 *** subroutine genevent
0982 ***********************************************************************
0983 subroutine genevent(j,b1,b2)
0984 implicit none
0985 C--identifier of file for hepmc output and logfile
0986 common/hepmcid/hpmcfid,logfid
0987 integer hpmcfid,logfid
0988 INTEGER PYCOMP
0989 INTEGER NMXHEP
0990 C--Common block of Pythia
0991 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
0992 INTEGER N,NPAD,K
0993 DOUBLE PRECISION P,V
0994 COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
0995 INTEGER MSTU,MSTJ
0996 DOUBLE PRECISION PARU,PARJ
0997 COMMON/PYDAT3/MDCY(500,3),MDME(8000,2),BRAT(8000),KFDP(8000,5)
0998 INTEGER MDCY,MDME,KFDP
0999 DOUBLE PRECISION BRAT
1000 COMMON/PYSUBS/MSEL,MSELPD,MSUB(500),KFIN(2,-40:40),CKIN(200)
1001 INTEGER MSEL,MSELPD,MSUB,KFIN
1002 DOUBLE PRECISION CKIN
1003 COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
1004 INTEGER MSTP,MSTI
1005 DOUBLE PRECISION PARP,PARI
1006 COMMON/PYDATR/MRPY(6),RRPY(100)
1007 INTEGER MRPY
1008 DOUBLE PRECISION RRPY
1009 C--Parameter common block
1010 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
1011 &ALLHAD,compress,NF
1012 INTEGER NF
1013 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
1014 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
1015 C--discard event flag
1016 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
1017 LOGICAL DISCARD
1018 INTEGER NDISC,NSTRANGE,NGOOD,errcount
1019 double precision wdisc
1020 C--variables for angular ordering
1021 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
1022 DOUBLE PRECISION ZA,ZD,THETAA
1023 LOGICAL QQBARD
1024 C--factor in front of formation times
1025 COMMON/FTIMEFAC/FTFAC
1026 DOUBLE PRECISION FTFAC
1027 C--time common block
1028 COMMON/TIME/MV(23000,5)
1029 DOUBLE PRECISION MV
1030 C--colour index common block
1031 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
1032 INTEGER TRIP,ANTI,COLMAX
1033 C--number of scattering events
1034 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
1035 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
1036 C--event weight
1037 COMMON/WEIGHT/EVWEIGHT,sumofweights
1038 double precision EVWEIGHT,sumofweights
1039 C--event weight exponent
1040 COMMON/WEXPO/WEIGHTEX
1041 DOUBLE PRECISION WEIGHTEX
1042 C--max rapidity
1043 common/rapmax/etamax
1044 double precision etamax
1045 C--production point
1046 common/jetpoint/x0,y0
1047 double precision x0,y0
1048 C--organisation of event record
1049 common/evrecord/nsim,npart,offset,hadrotype,sqrts,collider,hadro,
1050 &shorthepmc,channel,isochannel
1051 integer nsim,npart,offset,hadrotype
1052 double precision sqrts
1053 character*4 collider,channel
1054 character*2 isochannel
1055 logical hadro,shorthepmc
1056 C--extra storage for scattering centres before interactions
1057 common/storescatcen/nscatcen,maxnscatcen,scatflav(10000),
1058 &scatcen(10000,5),writescatcen,writedummies
1059 integer nscatcen,maxnscatcen,scatflav
1060 double precision scatcen
1061 logical writescatcen,writedummies
1062
1063 C--Variables local to this program
1064 INTEGER NOLD,PID,IPART,LME1,LME2,j,i,LME1ORIG,LME2ORIG,llep1,
1065 &llep2,lv
1066 DOUBLE PRECISION PYR,ENI,QMAX1,R,GETMASS,PYP,Q1,Q2,P21,P22,ETOT,
1067 &QMAX2,POLD,EN1,EN2,BETA(3),ENEW1,ENEW2,emax,lambda,x1,x2,x3,
1068 &MEWEIGHT,PSWEIGHT,WEIGHT,EPS1,EPS2,THETA1,THETA2,Z1,Z2,
1069 &getltimemax,pi,m1,m2
1070 character*2 b1,b2
1071 CHARACTER*2 TYPE1,TYPE2
1072 LOGICAL FIRSTTRIP,WHICH1,WHICH2,ISDIQUARK
1073 DATA PI/3.141592653589793d0/
1074
1075 N=0
1076 COLMAX=600
1077 DISCARD=.FALSE.
1078 DO 91 I=1,23000
1079 MV(I,1)=0.d0
1080 MV(I,2)=0.d0
1081 MV(I,3)=0.d0
1082 MV(I,4)=0.d0
1083 MV(I,5)=0.d0
1084 91 CONTINUE
1085 nscatcen = 0
1086
1087 CALL MEDNEXTEVT
1088
1089 C--initialisation with matrix element
1090 C--production vertex
1091 CALL PICKVTX(X0,Y0)
1092 LTIME=GETLTIMEMAX()
1093
1094 99 CALL PYEVNT
1095 NPART=N-OFFSET
1096 EVWEIGHT=PARI(10)
1097 SUMOFWEIGHTS=SUMOFWEIGHTS+EVWEIGHT
1098 IF((COLLIDER.EQ.'EEJJ').AND.(ABS(K(8,2)).GT.6))THEN
1099 WDISC=WDISC+EVWEIGHT
1100 NDISC=NDISC+1
1101 GOTO 102
1102 ELSE
1103 NGOOD=NGOOD+1
1104 ENDIF
1105
1106 C--DY: don't have to do anything
1107 if (collider.eq.'PPDY') then
1108 CALL PYEXEC
1109 call CONVERTTOHEPMC(HPMCFID,NGOOD,PID,b1,b2)
1110 goto 102
1111 endif
1112
1113
1114
1115 if((COLLIDER.EQ.'PPZJ').OR.(COLLIDER.EQ.'PPZQ').or.
1116 & (COLLIDER.EQ.'PPZG').or.(COLLIDER.EQ.'PPWJ').or.
1117 & (COLLIDER.EQ.'PPWQ').or.(COLLIDER.EQ.'PPWG'))THEN
1118 LME1ORIG=7
1119 LME2ORIG=8
1120 if(abs(k(7,2)).gt.21) then
1121 lv=7
1122 else
1123 lv=8
1124 endif
1125 ELSE
1126 LME1ORIG=OFFSET-1
1127 LME2ORIG=OFFSET
1128 ENDIF
1129 DO 180 IPART=OFFSET+1, OFFSET+NPART
1130
1131 if((COLLIDER.EQ.'PPZJ').OR.(COLLIDER.EQ.'PPZQ').or.
1132 & (COLLIDER.EQ.'PPZG').or.(COLLIDER.EQ.'PPWJ').or.
1133 & (COLLIDER.EQ.'PPWQ').or.(COLLIDER.EQ.'PPWG'))THEN
1134 if(k(ipart,3).eq.offset-1) llep1=ipart
1135 if(k(ipart,3).eq.offset) llep2=ipart
1136 endif
1137 IF(K(IPART,3).EQ.(LME1ORIG))THEN
1138 LME1=IPART
1139 IF(K(IPART,2).EQ.21)THEN
1140 TYPE1='GC'
1141 ELSE
1142 TYPE1='QQ'
1143 ENDIF
1144 ELSEIF(K(IPART,3).EQ.LME2ORIG)THEN
1145 LME2=IPART
1146 IF(K(IPART,2).EQ.21)THEN
1147 TYPE2='GC'
1148 ELSE
1149 TYPE2='QQ'
1150 ENDIF
1151 ELSE
1152 TRIP(IPART)=0
1153 ANTI(IPART)=0
1154 ZD(IPART)=0.d0
1155 THETAA(IPART)=0.d0
1156 ENDIF
1157
1158 IF(K(IPART,1).EQ.2)THEN
1159 IF(K(IPART-1,1).EQ.2)THEN
1160
1161 IF(FIRSTTRIP)THEN
1162 TRIP(IPART)=COLMAX+1
1163 ANTI(IPART)=TRIP(IPART-1)
1164 ELSE
1165 TRIP(IPART)=ANTI(IPART-1)
1166 ANTI(IPART)=COLMAX+1
1167 ENDIF
1168 COLMAX=COLMAX+1
1169 ELSE
1170
1171 IF(((ABS(K(IPART,2)).LT.10).AND.(K(IPART,2).GT.0))
1172 & .OR.(ISDIQUARK(K(IPART,2)).AND.(K(IPART,2).LT.0)))THEN
1173 TRIP(IPART)=COLMAX+1
1174 ANTI(IPART)=0
1175 FIRSTTRIP=.TRUE.
1176 ELSE
1177 TRIP(IPART)=0
1178 ANTI(IPART)=COLMAX+1
1179 FIRSTTRIP=.FALSE.
1180 ENDIF
1181 COLMAX=COLMAX+1
1182 ENDIF
1183 ENDIF
1184 IF(K(IPART,1).EQ.1)THEN
1185
1186 IF(FIRSTTRIP)THEN
1187 TRIP(IPART)=0
1188 ANTI(IPART)=TRIP(IPART-1)
1189 ELSE
1190 TRIP(IPART)=ANTI(IPART-1)
1191 ANTI(IPART)=0
1192 ENDIF
1193 ENDIF
1194 180 CONTINUE
1195 if (k(lme1,1).lt.11) K(LME1,1)=1
1196 if (k(lme2,1).lt.11) K(LME2,1)=1
1197 PID=K(LME1,2)
1198 ENI=MAX(P(LME1,4),P(LME2,4))
1199 DO 183 IPART=OFFSET+1, OFFSET+NPART
1200 IF((IPART.NE.LME1).AND.(IPART.NE.LME2).AND.(K(IPART,1).LT.11))
1201 & K(IPART,1)=4
1202 if (k(ipart,2).eq.22) k(ipart,1)=4
1203 183 CONTINUE
1204
1205
1206 if((COLLIDER.EQ.'PPZJ').OR.(COLLIDER.EQ.'PPZQ').or.
1207 & (COLLIDER.EQ.'PPZG').or.(COLLIDER.EQ.'PPWJ').or.
1208 & (COLLIDER.EQ.'PPWQ').or.(COLLIDER.EQ.'PPWG'))THEN
1209 if (abs(k(lme1,2)).gt.21) then
1210 QMAX1=0.d0
1211 QMAX2=sqrt(pari(18)+p(lme1,5)**2)
1212 else
1213 QMAX1=sqrt(pari(18)+p(lme2,5)**2)
1214 QMAX2=0.d0
1215 endif
1216 EMAX=P(LME1,4)+P(LME2,4)
1217 THETA1=-1.d0
1218 THETA2=-1.d0
1219 ELSEIF(COLLIDER.EQ.'PPJJ'.OR.COLLIDER.EQ.'PPYJ'
1220 & .OR.COLLIDER.EQ.'PPYQ'.OR.COLLIDER.EQ.'PPYG')THEN
1221 if (k(lme1,1).eq.4) then
1222 qmax1 = 0.d0
1223 else
1224 QMAX1=pari(17)
1225 endif
1226 if (k(lme2,1).eq.4) then
1227 qmax2 = 0.d0
1228 else
1229 QMAX2=pari(17)
1230 endif
1231 ! QMAX1=PYP(LME1,10)*exp(0.3*abs(pyp(lme1,17)-pyp(lme2,17))/2.)/2.
1232 ! QMAX2=PYP(LME2,10)*exp(0.3*abs(pyp(lme1,17)-pyp(lme2,17))/2.)/2.
1233 EMAX=P(LME1,4)+P(LME2,4)
1234 THETA1=-1.d0
1235 THETA2=-1.d0
1236 ENDIF
1237 EN1=P(LME1,4)
1238 EN2=P(LME2,4)
1239 BETA(1)=(P(LME1,1)+P(LME2,1))/(P(LME1,4)+P(LME2,4))
1240 BETA(2)=(P(LME1,2)+P(LME2,2))/(P(LME1,4)+P(LME2,4))
1241 BETA(3)=(P(LME1,3)+P(LME2,3))/(P(LME1,4)+P(LME2,4))
1242 CALL PYROBO(LME1,LME1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1243 CALL PYROBO(LME2,LME2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1244 ETOT=P(LME1,4)+P(LME2,4)
1245 IF(COLLIDER.EQ.'EEJJ')THEN
1246 QMAX1=ETOT
1247 QMAX2=ETOT
1248 EMAX=P(LME1,4)+P(LME2,4)
1249 THETA1=-1.d0
1250 THETA2=-1.d0
1251 ENDIF
1252
1253 Q1=GETMASS(0.d0,QMAX1,THETA1,EMAX,TYPE1,EMAX,.FALSE.,
1254 & Z1,WHICH1)
1255 Q2=GETMASS(0.d0,QMAX2,THETA2,EMAX,TYPE2,EMAX,.FALSE.,
1256 & Z2,WHICH2)
1257 182 if (abs(k(lme1,2)).gt.21) then
1258 m1=p(lme1,5)
1259 else
1260 m1=q1
1261 endif
1262 if (abs(k(lme2,2)).gt.21) then
1263 m2=p(lme2,5)
1264 else
1265 m2=q2
1266 endif
1267 ENEW1=ETOT/2.d0 + (m1**2-m2**2)/(2.*ETOT)
1268 ENEW2=ETOT/2.d0 - (m1**2-m2**2)/(2.*ETOT)
1269 P21 = (ETOT/2.d0 + (m1**2-m2**2)/(2.*ETOT))**2 - m1**2
1270 P22 = (ETOT/2.d0 - (m1**2-m2**2)/(2.*ETOT))**2 - m2**2
1271 WEIGHT=1.d0
1272 IF((PYR(0).GT.WEIGHT).OR.(P21.LT.0.d0).OR.(P22.LT.0.d0)
1273 & .OR.(ENEW1.LT.0.d0).OR.(ENEW2.LT.0.d0)
1274 & )THEN
1275 IF(Q1.GT.Q2)THEN
1276 Q1=GETMASS(0.d0,Q1,THETA1,EMAX,TYPE1,EMAX,.FALSE.,
1277 & Z1,WHICH1)
1278 ELSE
1279 Q2=GETMASS(0.d0,Q2,THETA2,EMAX,TYPE2,EMAX,.FALSE.,
1280 & Z2,WHICH2)
1281 ENDIF
1282 GOTO 182
1283 ENDIF
1284 POLD=PYP(LME1,8)
1285 P(LME1,1)=P(LME1,1)*SQRT(P21)/POLD
1286 P(LME1,2)=P(LME1,2)*SQRT(P21)/POLD
1287 P(LME1,3)=P(LME1,3)*SQRT(P21)/POLD
1288 P(LME1,4)=ENEW1
1289 P(LME1,5)=m1
1290 POLD=PYP(LME2,8)
1291 P(LME2,1)=P(LME2,1)*SQRT(P22)/POLD
1292 P(LME2,2)=P(LME2,2)*SQRT(P22)/POLD
1293 P(LME2,3)=P(LME2,3)*SQRT(P22)/POLD
1294 P(LME2,4)=ENEW2
1295 P(LME2,5)=m2
1296 CALL PYROBO(LME1,LME1,0d0,0d0,BETA(1),BETA(2),BETA(3))
1297 CALL PYROBO(LME2,LME2,0d0,0d0,BETA(1),BETA(2),BETA(3))
1298
1299 IF(Q1.GT.0.d0)THEN
1300 EPS1=0.5-0.5*SQRT(1.-Q0**2/Q1**2)
1301 & *SQRT(1.-Q1**2/P(LME1,4)**2)
1302 IF((Z1.LT.EPS1).OR.(Z1.GT.(1.-EPS1)))THEN
1303 Q1=GETMASS(0.d0,Q1,THETA1,EMAX,TYPE1,EMAX,.FALSE.,
1304 & Z1,WHICH1)
1305 CALL PYROBO(LME1,LME1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1306 CALL PYROBO(LME2,LME2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1307 GOTO 182
1308 ENDIF
1309 ENDIF
1310 IF(Q2.GT.0.d0)THEN
1311 EPS2=0.5-0.5*SQRT(1.-Q0**2/Q2**2)
1312 & *SQRT(1.-Q2**2/P(LME2,4)**2)
1313 IF((Z2.LT.EPS2).OR.(Z2.GT.(1.-EPS2)))THEN
1314 Q2=GETMASS(0.d0,Q2,THETA2,EMAX,TYPE2,EMAX,.FALSE.,
1315 & Z2,WHICH2)
1316 CALL PYROBO(LME1,LME1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1317 CALL PYROBO(LME2,LME2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1318 GOTO 182
1319 ENDIF
1320 ENDIF
1321
1322
1323 IF(COLLIDER.EQ.'EEJJ')THEN
1324 BETA(1)=(P(LME1,1)+P(LME2,1))/(P(LME1,4)+P(LME2,4))
1325 BETA(2)=(P(LME1,2)+P(LME2,2))/(P(LME1,4)+P(LME2,4))
1326 BETA(3)=(P(LME1,3)+P(LME2,3))/(P(LME1,4)+P(LME2,4))
1327 CALL PYROBO(LME1,LME1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1328 CALL PYROBO(LME2,LME2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1329 IF(Q1.GT.0.d0)THEN
1330
1331 X1=Z1*(ETOT**2+Q1**2)/ETOT**2
1332 X2=(ETOT**2-Q1**2)/ETOT**2
1333 X3=(1.-Z1)*(ETOT**2+Q1**2)/ETOT**2
1334 PSWEIGHT=(1.-X1)*(1.+(X1/(2.-X2))**2)/X3
1335 & + (1.-X2)*(1.+(X2/(2.-X1))**2)/X3
1336 MEWEIGHT=X1**2+X2**2
1337 WEIGHT=MEWEIGHT/PSWEIGHT
1338 IF(PYR(0).GT.WEIGHT)THEN
1339 184 Q1=GETMASS(0.d0,Q1,THETA1,EMAX,TYPE1,EMAX,.FALSE.,
1340 & Z1,WHICH1)
1341 ENDIF
1342 ENDIF
1343
1344 IF(Q2.GT.0.d0)THEN
1345
1346 X1=(ETOT**2-Q2**2)/ETOT**2
1347 X2=Z2*(ETOT**2+Q2**2)/ETOT**2
1348 X3=(1.-Z2)*(ETOT**2+Q2**2)/ETOT**2
1349 PSWEIGHT=(1.-X1)*(1.+(X1/(2.-X2))**2)/X3
1350 & + (1.-X2)*(1.+(X2/(2.-X1))**2)/X3
1351 MEWEIGHT=X1**2+X2**2
1352 WEIGHT=MEWEIGHT/PSWEIGHT
1353 IF(PYR(0).GT.WEIGHT)THEN
1354 185 Q2=GETMASS(0.d0,Q2,THETA2,EMAX,TYPE2,EMAX,.FALSE.,
1355 & Z2,WHICH2)
1356 ENDIF
1357 ENDIF
1358 186 ENEW1=ETOT/2.d0 + (Q1**2-Q2**2)/(2.*ETOT)
1359 ENEW2=ETOT/2.d0 - (Q1**2-Q2**2)/(2.*ETOT)
1360 P21 = (ETOT/2.d0 + (Q1**2-Q2**2)/(2.*ETOT))**2 - Q1**2
1361 P22 = (ETOT/2.d0 - (Q1**2-Q2**2)/(2.*ETOT))**2 - Q2**2
1362 POLD=PYP(LME1,8)
1363 P(LME1,1)=P(LME1,1)*SQRT(P21)/POLD
1364 P(LME1,2)=P(LME1,2)*SQRT(P21)/POLD
1365 P(LME1,3)=P(LME1,3)*SQRT(P21)/POLD
1366 P(LME1,4)=ENEW1
1367 P(LME1,5)=Q1
1368 POLD=PYP(LME2,8)
1369 P(LME2,1)=P(LME2,1)*SQRT(P22)/POLD
1370 P(LME2,2)=P(LME2,2)*SQRT(P22)/POLD
1371 P(LME2,3)=P(LME2,3)*SQRT(P22)/POLD
1372 P(LME2,4)=ENEW2
1373 P(LME2,5)=Q2
1374 CALL PYROBO(LME1,LME1,0d0,0d0,BETA(1),BETA(2),BETA(3))
1375 CALL PYROBO(LME2,LME2,0d0,0d0,BETA(1),BETA(2),BETA(3))
1376
1377 IF(Q1.GT.0.d0)THEN
1378 EPS1=0.5-0.5*SQRT(1.-Q0**2/Q1**2)
1379 & *SQRT(1.-Q1**2/P(LME1,4)**2)
1380 IF((Z1.LT.EPS1).OR.(Z1.GT.(1.-EPS1)))THEN
1381 Q1=GETMASS(0.d0,Q1,THETA1,EMAX,TYPE1,EMAX,.FALSE.,
1382 & Z1,WHICH1)
1383 CALL PYROBO(LME1,LME1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1384 CALL PYROBO(LME2,LME2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1385 GOTO 186
1386 ENDIF
1387 ENDIF
1388 IF(Q2.GT.0.d0)THEN
1389 EPS2=0.5-0.5*SQRT(1.-Q0**2/Q2**2)
1390 & *SQRT(1.-Q2**2/P(LME2,4)**2)
1391 IF((Z2.LT.EPS2).OR.(Z2.GT.(1.-EPS2)))THEN
1392 Q2=GETMASS(0.d0,Q2,THETA2,EMAX,TYPE2,EMAX,.FALSE.,
1393 & Z2,WHICH2)
1394 CALL PYROBO(LME1,LME1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1395 CALL PYROBO(LME2,LME2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1396 GOTO 186
1397 ENDIF
1398 ENDIF
1399 ENDIF
1400
1401
1402 if((COLLIDER.EQ.'PPZJ').OR.(COLLIDER.EQ.'PPZQ').or.
1403 & (COLLIDER.EQ.'PPZG').or.(COLLIDER.EQ.'PPWJ').or.
1404 & (COLLIDER.EQ.'PPWQ').or.(COLLIDER.EQ.'PPWG'))THEN
1405 beta(1)=p(lv,1)/p(lv,4)
1406 beta(2)=p(lv,2)/p(lv,4)
1407 beta(3)=p(lv,3)/p(lv,4)
1408 CALL PYROBO(llep1,llep1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1409 CALL PYROBO(llep2,llep2,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
1410 if (abs(k(lme1,2)).gt.21) then
1411 beta(1)=p(lme1,1)/p(lme1,4)
1412 beta(2)=p(lme1,2)/p(lme1,4)
1413 beta(3)=p(lme1,3)/p(lme1,4)
1414 else
1415 beta(1)=p(lme2,1)/p(lme2,4)
1416 beta(2)=p(lme2,2)/p(lme2,4)
1417 beta(3)=p(lme2,3)/p(lme2,4)
1418 endif
1419 CALL PYROBO(llep1,llep1,0d0,0d0,BETA(1),BETA(2),BETA(3))
1420 CALL PYROBO(llep2,llep2,0d0,0d0,BETA(1),BETA(2),BETA(3))
1421 endif
1422
1423
1424 ZA(LME1)=1.d0
1425 ZA(LME2)=1.d0
1426 THETAA(LME1)=P(LME1,5)/(SQRT(Z1*(1.-Z1))*P(LME1,4))
1427 THETAA(LME2)=P(LME2,5)/(SQRT(Z2*(1.-Z2))*P(LME2,4))
1428 ZD(LME1)=Z1
1429 ZD(LME2)=Z2
1430 QQBARD(LME1)=WHICH1
1431 QQBARD(LME2)=WHICH2
1432
1433 MV(LME1,1)=X0
1434 MV(LME1,2)=Y0
1435 MV(LME1,3)=0.d0
1436 MV(LME1,4)=0.d0
1437 IF(P(LME1,5).GT.0.d0)THEN
1438 LAMBDA=1.d0/(FTFAC*P(LME1,4)*0.2/Q1**2)
1439 MV(LME1,5)=-LOG(1.d0-PYR(0))/LAMBDA
1440 ELSE
1441 MV(LME1,5)=LTIME
1442 ENDIF
1443
1444 MV(LME2,1)=X0
1445 MV(LME2,2)=Y0
1446 MV(LME2,3)=0.d0
1447 MV(LME2,4)=0.d0
1448 IF(P(LME2,5).GT.0.d0)THEN
1449 LAMBDA=1.d0/(FTFAC*P(LME2,4)*0.2/Q2**2)
1450 MV(LME2,5)=-LOG(1.d0-PYR(0))/LAMBDA
1451 ELSE
1452 MV(LME2,5)=LTIME
1453 ENDIF
1454
1455
1456 CALL MAKECASCADE
1457 IF(DISCARD) THEN
1458 NGOOD=NGOOD-1
1459 WDISC=WDISC+EVWEIGHT
1460 NDISC=NDISC+1
1461 write(logfid,*)'discard event',J
1462 GOTO 102
1463 ENDIF
1464
1465 IF(.NOT.ALLHAD)THEN
1466 DO 86 I=1,N
1467 IF(K(I,1).EQ.3) K(I,1)=22
1468 86 CONTINUE
1469 ENDIF
1470 IF(HADRO)THEN
1471 CALL MAKESTRINGS(HADROTYPE)
1472 IF(DISCARD) THEN
1473 write(logfid,*)'discard event',J
1474 WDISC=WDISC+EVWEIGHT
1475 NDISC=NDISC+1
1476 NGOOD=NGOOD-1
1477 GOTO 102
1478 ENDIF
1479 CALL PYEXEC
1480 IF(MSTU(30).NE.ERRCOUNT)THEN
1481 write(logfid,*)'PYTHIA discards event',J,
1482 & ' (error number',MSTU(30),')'
1483 ERRCOUNT=MSTU(30)
1484 WDISC=WDISC+EVWEIGHT
1485 NDISC=NDISC+1
1486 NGOOD=NGOOD-1
1487 GOTO 102
1488 ENDIF
1489 ENDIF
1490
1491 IF(MSTU(30).NE.ERRCOUNT)THEN
1492 ERRCOUNT=MSTU(30)
1493 ELSE
1494 CALL CONVERTTOHEPMC(HPMCFID,NGOOD,PID,b1,b2)
1495 ENDIF
1496
1497
1498 102 IF(NSIM.GT.100)THEN
1499 IF(MOD(J,NSIM/100).EQ.0)THEN
1500 write(logfid,*) 'done with event number ',J
1501 ENDIF
1502 else
1503 write(logfid,*) 'done with event number ',J
1504 ENDIF
1505 call flush(logfid)
1506 end
1507
1508
1509
1510
1511
1512
1513 SUBROUTINE MAKESTRINGS(WHICH)
1514 IMPLICIT NONE
1515
1516 common/hepmcid/hpmcfid,logfid
1517 integer hpmcfid,logfid
1518 INTEGER WHICH
1519 IF(WHICH.EQ.0)THEN
1520 CALL MAKESTRINGS_VAC
1521 ELSEIF(WHICH.EQ.1)THEN
1522 CALL MAKESTRINGS_MINL
1523 ELSE
1524 WRITE(logfid,*)'error: unknown hadronisation type in MAKESTRINGS'
1525 ENDIF
1526 END
1527
1528
1529
1530
1531
1532 SUBROUTINE MAKESTRINGS_VAC
1533 IMPLICIT NONE
1534
1535 common/hepmcid/hpmcfid,logfid
1536 integer hpmcfid,logfid
1537
1538 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
1539 INTEGER N,NPAD,K
1540 DOUBLE PRECISION P,V
1541
1542 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
1543 &ALLHAD,compress,NF
1544 INTEGER NF
1545 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
1546 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
1547
1548 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
1549 INTEGER TRIP,ANTI,COLMAX
1550
1551 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
1552 LOGICAL DISCARD
1553 INTEGER NDISC,NSTRANGE,NGOOD,errcount
1554 double precision wdisc
1555
1556 INTEGER NOLD,I,J,LQUARK,LMATCH,LLOOSE,NOLD1
1557 DOUBLE PRECISION EADDEND,PYR,DIR
1558 LOGICAL ISDIQUARK,compressevent,roomleft
1559 DATA EADDEND/10.d0/
1560
1561 i = 0
1562 if (compress) roomleft = compressevent(i)
1563 NOLD1=N
1564
1565 DO 52 I=1,NOLD1
1566 IF((K(I,1).EQ.4).AND.(TRIP(I).EQ.0).AND.(ANTI(I).EQ.0))THEN
1567
1568 N=N+1
1569 IF(N.GT.22990) THEN
1570 write(logfid,*)'event too long for event record'
1571 DISCARD=.TRUE.
1572 RETURN
1573 ENDIF
1574 K(N,1)=11
1575 K(N,2)=K(I,2)
1576 K(N,3)=I
1577 K(N,4)=0
1578 K(N,5)=0
1579 P(N,1)=P(I,1)
1580 P(N,2)=P(I,2)
1581 P(N,3)=P(I,3)
1582 P(N,4)=P(I,4)
1583 P(N,5)=P(I,5)
1584 K(I,1)=17
1585 K(I,4)=N
1586 K(I,5)=N
1587 TRIP(N)=TRIP(I)
1588 ANTI(N)=ANTI(I)
1589 ENDIF
1590 52 CONTINUE
1591 NOLD=N
1592
1593
1594 43 LQUARK=0
1595 DO 40 I=1,NOLD
1596 IF((K(I,1).EQ.11).OR.(K(I,1).EQ.12).OR.(K(I,1).EQ.13)
1597 & .OR.(K(I,1).EQ.14)) K(I,1)=17
1598 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1).EQ.4).OR.
1599 & (K(I,1).EQ.5)).AND.((K(I,2).LT.6).OR.ISDIQUARK(K(I,2))))THEN
1600 LQUARK=I
1601 GOTO 41
1602 ENDIF
1603 40 CONTINUE
1604 GOTO 50
1605 41 CONTINUE
1606
1607 N=N+1
1608 IF(N.GT.22990) THEN
1609 write(logfid,*)'event too long for event record'
1610 DISCARD=.TRUE.
1611 RETURN
1612 ENDIF
1613 K(N,1)=2
1614 K(N,2)=K(LQUARK,2)
1615 K(N,3)=LQUARK
1616 K(N,4)=0
1617 K(N,5)=0
1618 P(N,1)=P(LQUARK,1)
1619 P(N,2)=P(LQUARK,2)
1620 P(N,3)=P(LQUARK,3)
1621 P(N,4)=P(LQUARK,4)
1622 P(N,5)=P(LQUARK,5)
1623 K(LQUARK,1)=16
1624 K(LQUARK,4)=N
1625 K(LQUARK,5)=N
1626 TRIP(N)=TRIP(LQUARK)
1627 ANTI(N)=ANTI(LQUARK)
1628
1629 LMATCH=0
1630 DO 44 J=1,10000000
1631 DO 42 I=1,NOLD
1632 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1).EQ.4)
1633 & .OR.(K(I,1).EQ.5))
1634 & .AND.(((TRIP(I).EQ.ANTI(N)).AND.(TRIP(I).NE.0))
1635 & .OR.((ANTI(I).EQ.TRIP(N)).AND.(ANTI(I).NE.0))))THEN
1636 N=N+1
1637 IF(N.GT.22990) THEN
1638 write(logfid,*)'event too long for event record'
1639 DISCARD=.TRUE.
1640 RETURN
1641 ENDIF
1642 K(N,2)=K(I,2)
1643 K(N,3)=I
1644 K(N,4)=0
1645 K(N,5)=0
1646 P(N,1)=P(I,1)
1647 P(N,2)=P(I,2)
1648 P(N,3)=P(I,3)
1649 P(N,4)=P(I,4)
1650 P(N,5)=P(I,5)
1651 TRIP(N)=TRIP(I)
1652 ANTI(N)=ANTI(I)
1653 K(I,1)=16
1654 K(I,4)=N
1655 K(I,5)=N
1656 IF(K(I,2).EQ.21)THEN
1657 K(N,1)=2
1658 GOTO 44
1659 ELSE
1660 K(N,1)=1
1661 GOTO 43
1662 ENDIF
1663 ENDIF
1664 42 CONTINUE
1665
1666 write(logfid,*)'Error in MAKESTRINGS_VAC: failed to reconstruct '//
1667 &'colour singlet system, will discard event'
1668 discard = .true.
1669 return
1670 44 CONTINUE
1671
1672
1673
1674 50 LLOOSE=0
1675 DO 45 I=1,NOLD
1676 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1).EQ.4)
1677 & .OR.(K(I,1).EQ.5)))THEN
1678 DO 46 J=1,NOLD
1679 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1).EQ.4)
1680 & .OR.(K(I,1).EQ.5)))THEN
1681 IF(ANTI(I).EQ.TRIP(J)) GOTO 45
1682 ENDIF
1683 46 CONTINUE
1684 LLOOSE=I
1685 GOTO 47
1686 ENDIF
1687 45 CONTINUE
1688 GOTO 51
1689 47 CONTINUE
1690
1691 write(logfid,*)'Error in MAKESTRINGS_VAC: failed to reconstruct '//
1692 &'colour singlet system, will discard event'
1693 discard = .true.
1694 return
1695
1696 N=N+1
1697 IF(N.GT.22990) THEN
1698 write(logfid,*)'event too long for event record'
1699 DISCARD=.TRUE.
1700 RETURN
1701 ENDIF
1702 K(N,1)=2
1703 K(N,2)=K(LLOOSE,2)
1704 K(N,3)=LLOOSE
1705 K(N,4)=0
1706 K(N,5)=0
1707 P(N,1)=P(LLOOSE,1)
1708 P(N,2)=P(LLOOSE,2)
1709 P(N,3)=P(LLOOSE,3)
1710 P(N,4)=P(LLOOSE,4)
1711 P(N,5)=P(LLOOSE,5)
1712 K(LLOOSE,1)=16
1713 K(LLOOSE,4)=N
1714 K(LLOOSE,5)=N
1715 TRIP(N)=TRIP(LLOOSE)
1716 ANTI(N)=ANTI(LLOOSE)
1717
1718 LMATCH=0
1719 DO 48 J=1,10000000
1720 DO 49 I=1,NOLD
1721 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1).EQ.4)
1722 & .OR.(K(I,1).EQ.5))
1723 & .AND.(ANTI(I).EQ.TRIP(N)))THEN
1724 N=N+1
1725 IF(N.GT.22990) THEN
1726 write(logfid,*)'event too long for event record'
1727 DISCARD=.TRUE.
1728 RETURN
1729 ENDIF
1730 K(N,2)=K(I,2)
1731 K(N,3)=I
1732 K(N,4)=0
1733 K(N,5)=0
1734 P(N,1)=P(I,1)
1735 P(N,2)=P(I,2)
1736 P(N,3)=P(I,3)
1737 P(N,4)=P(I,4)
1738 P(N,5)=P(I,5)
1739 TRIP(N)=TRIP(I)
1740 ANTI(N)=ANTI(I)
1741 K(I,1)=16
1742 K(I,4)=N
1743 K(I,5)=N
1744 K(N,1)=2
1745 GOTO 48
1746 ENDIF
1747 49 CONTINUE
1748
1749 write(logfid,*)'Error in MAKESTRINGS_VAC: failed to reconstruct '//
1750 &'colour singlet system, will discard event'
1751 discard = .true.
1752 return
1753 48 CONTINUE
1754 51 CONTINUE
1755 CALL CLEANUP(NOLD1)
1756 END
1757
1758
1759
1760
1761
1762 SUBROUTINE MAKESTRINGS_MINL
1763 IMPLICIT NONE
1764
1765 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
1766 INTEGER N,NPAD,K
1767 DOUBLE PRECISION P,V
1768
1769 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
1770 &ALLHAD,compress,NF
1771 INTEGER NF
1772 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
1773 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
1774
1775 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
1776 INTEGER TRIP,ANTI,COLMAX
1777
1778 INTEGER NOLD,I,J,LMAX,LMIN,LEND,nold1
1779 DOUBLE PRECISION EMAX,MINV,MMIN,Z,GENERATEZ,MCUT,EADDEND,PYR,DIR,
1780 &pyp
1781 DATA MCUT/1.d8/
1782 DATA EADDEND/10.d0/
1783
1784 common/hepmcid/hpmcfid,logfid
1785 integer hpmcfid,logfid
1786
1787 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
1788 LOGICAL DISCARD
1789 INTEGER NDISC,NSTRANGE,NGOOD,errcount
1790 double precision wdisc
1791 logical compressevent,roomleft
1792
1793 i = 0
1794 if (compress) roomleft = compressevent(i)
1795 NOLD1=N
1796
1797 DO 52 I=1,NOLD1
1798 IF((K(I,1).EQ.4).AND.(TRIP(I).EQ.0).AND.(ANTI(I).EQ.0))THEN
1799
1800 N=N+1
1801 IF(N.GT.22990) THEN
1802 write(logfid,*)'event too long for event record'
1803 DISCARD=.TRUE.
1804 RETURN
1805 ENDIF
1806 K(N,1)=11
1807 K(N,2)=K(I,2)
1808 K(N,3)=I
1809 K(N,4)=0
1810 K(N,5)=0
1811 P(N,1)=P(I,1)
1812 P(N,2)=P(I,2)
1813 P(N,3)=P(I,3)
1814 P(N,4)=P(I,4)
1815 P(N,5)=P(I,5)
1816 K(I,1)=17
1817 K(I,4)=N
1818 K(I,5)=N
1819 TRIP(N)=TRIP(I)
1820 ANTI(N)=ANTI(I)
1821 ENDIF
1822 52 CONTINUE
1823 NOLD=N
1824
1825 43 EMAX=0
1826 LMAX=0
1827 DO 40 I=1,NOLD
1828 IF((K(I,1).EQ.11).OR.(K(I,1).EQ.12).OR.(K(I,1).EQ.13)
1829 & .OR.(K(I,1).EQ.14)) K(I,1)=17
1830 if (abs(pyp(I,17)).gt.4.d0) k(i,1)=17
1831 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1).EQ.4)
1832 & .OR.(K(I,1).EQ.5)).AND.(P(I,4).GT.EMAX))THEN
1833 EMAX=P(I,4)
1834 LMAX=I
1835 ENDIF
1836 40 CONTINUE
1837
1838 IF(LMAX.EQ.0) GOTO 50
1839
1840 IF(K(LMAX,2).EQ.21)THEN
1841
1842
1843 N=N+2
1844 IF(N.GT.22990) THEN
1845 write(logfid,*)'event too long for event record'
1846 DISCARD=.TRUE.
1847 RETURN
1848 ENDIF
1849 IF((N-2).GT.NOLD)THEN
1850 DO 47 J=NOLD,N-3
1851 K(N+NOLD-J,1)=K(N+NOLD-J-2,1)
1852 K(N+NOLD-J,2)=K(N+NOLD-J-2,2)
1853 IF(K(N+NOLD-J-2,3).GT.NOLD) THEN
1854 K(N+NOLD-J,3)=K(N+NOLD-J-2,3)+2
1855 ELSE
1856 K(N+NOLD-J,3)=K(N+NOLD-J-2,3)
1857 ENDIF
1858 K(N+NOLD-J,4)=0
1859 K(N+NOLD-J,5)=0
1860 P(N+NOLD-J,1)=P(N+NOLD-J-2,1)
1861 P(N+NOLD-J,2)=P(N+NOLD-J-2,2)
1862 P(N+NOLD-J,3)=P(N+NOLD-J-2,3)
1863 P(N+NOLD-J,4)=P(N+NOLD-J-2,4)
1864 P(N+NOLD-J,5)=P(N+NOLD-J-2,5)
1865 K(K(N+NOLD-J-2,3),4)=K(K(N+NOLD-J-2,3),4)+2
1866 K(K(N+NOLD-J-2,3),5)=K(K(N+NOLD-J-2,3),5)+2
1867 47 CONTINUE
1868 ENDIF
1869 NOLD=NOLD+2
1870 K(LMAX,1)=18
1871 Z=GENERATEZ(0.d0,0.d0,1.d-3,'QG')
1872 IF(Z.GT.0.5)THEN
1873 K(NOLD-1,2)=1
1874 K(NOLD,2)=-1
1875 ELSE
1876 Z=1.-Z
1877 K(NOLD-1,2)=-1
1878 K(NOLD,2)=1
1879 ENDIF
1880 K(NOLD-1,1)=1
1881 K(NOLD-1,3)=LMAX
1882 K(NOLD-1,4)=0
1883 K(NOLD-1,5)=0
1884 P(NOLD-1,1)=(1.-Z)*P(LMAX,1)
1885 P(NOLD-1,2)=(1.-Z)*P(LMAX,2)
1886 P(NOLD-1,3)=(1.-Z)*P(LMAX,3)
1887 P(NOLD-1,4)=(1.-Z)*P(LMAX,4)
1888 P(NOLD-1,5)=P(LMAX,5)
1889 K(NOLD,1)=1
1890 K(NOLD,3)=LMAX
1891 K(NOLD,4)=0
1892 K(NOLD,5)=0
1893 P(NOLD,1)=Z*P(LMAX,1)
1894 P(NOLD,2)=Z*P(LMAX,2)
1895 P(NOLD,3)=Z*P(LMAX,3)
1896 P(NOLD,4)=Z*P(LMAX,4)
1897 P(NOLD,5)=P(LMAX,5)
1898 K(LMAX,1)=18
1899 K(LMAX,4)=NOLD-1
1900 K(LMAX,5)=NOLD
1901 LMAX=NOLD
1902 ENDIF
1903 N=N+1
1904 IF(N.GT.22990) THEN
1905 write(logfid,*)'event too long for event record'
1906 DISCARD=.TRUE.
1907 RETURN
1908 ENDIF
1909 K(N,1)=2
1910 K(N,2)=K(LMAX,2)
1911 K(N,3)=LMAX
1912 K(N,4)=0
1913 K(N,5)=0
1914 P(N,1)=P(LMAX,1)
1915 P(N,2)=P(LMAX,2)
1916 P(N,3)=P(LMAX,3)
1917 P(N,4)=P(LMAX,4)
1918 P(N,5)=P(LMAX,5)
1919 K(LMAX,1)=16
1920 K(LMAX,4)=N
1921 K(LMAX,5)=N
1922 LEND=LMAX
1923
1924 42 MMIN=1.d10
1925 LMIN=0
1926 DO 41 I=1,NOLD
1927 IF(((K(I,1).EQ.1).OR.(K(I,1).EQ.3).OR.(K(I,1)
1928 & .EQ.4).OR.(K(I,1).EQ.5))
1929 & .AND.((K(I,2).EQ.21).OR.((K(I,2)*K(LEND,2).LT.0.d0).AND.
1930 & (K(I,3).NE.K(LEND,3))))
1931 & .AND.(P(I,1)*P(LEND,1).GT.0.d0))THEN
1932 MINV=P(I,4)*P(LMAX,4)-P(I,1)*P(LMAX,1)-P(I,2)*P(LMAX,2)
1933 & -P(I,3)*P(LMAX,3)
1934 IF((MINV.LT.MMIN).AND.(MINV.GT.0.d0).AND.(MINV.LT.MCUT))THEN
1935 MMIN=MINV
1936 LMIN=I
1937 ENDIF
1938 ENDIF
1939 41 CONTINUE
1940
1941 IF(LMIN.EQ.0)THEN
1942 N=N+1
1943 IF(N.GT.22990) THEN
1944 write(logfid,*)'event too long for event record'
1945 DISCARD=.TRUE.
1946 RETURN
1947 ENDIF
1948 K(N,1)=1
1949 K(N,2)=-K(LEND,2)
1950 K(N,3)=0
1951 K(N,4)=0
1952 K(N,5)=0
1953 P(N,1)=0.d0
1954 P(N,2)=0.d0
1955 IF(PYR(0).LT.0.5)THEN
1956 DIR=1.d0
1957 ELSE
1958 DIR=-1.d0
1959 ENDIF
1960 P(N,3)=DIR*EADDEND
1961 P(N,4)=EADDEND
1962 P(N,5)=0.d0
1963 GOTO 43
1964 ELSE
1965
1966 N=N+1
1967 IF(N.GT.22990) THEN
1968 write(logfid,*)'event too long for event record'
1969 DISCARD=.TRUE.
1970 RETURN
1971 ENDIF
1972 K(N,2)=K(LMIN,2)
1973 K(N,3)=LMIN
1974 K(N,4)=0
1975 K(N,5)=0
1976 P(N,1)=P(LMIN,1)
1977 P(N,2)=P(LMIN,2)
1978 P(N,3)=P(LMIN,3)
1979 P(N,4)=P(LMIN,4)
1980 P(N,5)=P(LMIN,5)
1981 K(LMIN,1)=16
1982 K(LMIN,4)=N
1983 K(LMIN,5)=N
1984 IF(K(LMIN,2).EQ.21)THEN
1985 K(N,1)=2
1986 LMAX=LMIN
1987 GOTO 42
1988 ELSE
1989 K(N,1)=1
1990 GOTO 43
1991 ENDIF
1992 ENDIF
1993 50 CONTINUE
1994 CALL CLEANUP(NOLD)
1995 END
1996
1997
1998
1999
2000
2001 SUBROUTINE CLEANUP(NFIRST)
2002 IMPLICIT NONE
2003
2004 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
2005 INTEGER N,NPAD,K
2006 DOUBLE PRECISION P,V
2007
2008 INTEGER NFIRST,NLAST,I,J
2009
2010 NLAST=N
2011 DO 21 I=1,NLAST-NFIRST
2012 DO 22 J=1,5
2013 K(I,J)=K(NFIRST+I,J)
2014 P(I,J)=P(NFIRST+I,J)
2015 V(I,J)=V(NFIRST+I,J)
2016 22 CONTINUE
2017 K(I,3)=0
2018 21 CONTINUE
2019 N=NLAST-NFIRST
2020 END
2021
2022
2023
2024
2025
2026 SUBROUTINE MAKECASCADE
2027 IMPLICIT NONE
2028
2029 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
2030 INTEGER N,NPAD,K
2031 DOUBLE PRECISION P,V
2032
2033 COMMON/TIME/MV(23000,5)
2034 DOUBLE PRECISION MV
2035
2036 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
2037 &ALLHAD,compress,NF
2038 INTEGER NF
2039 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
2040 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
2041
2042 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
2043 LOGICAL DISCARD
2044 INTEGER NDISC,NSTRANGE,NGOOD,errcount
2045 double precision wdisc
2046
2047
2048 INTEGER NOLD,I
2049 LOGICAL CONT
2050
2051 10 NOLD=N
2052 CONT=.FALSE.
2053 DO 11 I=2,NOLD
2054 if (i.gt.n) goto 10
2055
2056 IF((K(I,1).EQ.1).OR.(K(I,1).EQ.2))THEN
2057 CONT=.TRUE.
2058 CALL MAKEBRANCH(I)
2059 IF(DISCARD) GOTO 12
2060 ENDIF
2061 11 CONTINUE
2062 IF(CONT) GOTO 10
2063 12 END
2064
2065
2066
2067
2068
2069 SUBROUTINE MAKEBRANCH(L)
2070 IMPLICIT NONE
2071
2072 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
2073 INTEGER N,NPAD,K
2074 DOUBLE PRECISION P,V
2075
2076 COMMON/TIME/MV(23000,5)
2077 DOUBLE PRECISION MV
2078
2079 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
2080 &ALLHAD,compress,NF
2081 INTEGER NF
2082 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
2083 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
2084
2085 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
2086 LOGICAL DISCARD
2087 INTEGER NDISC,NSTRANGE,NGOOD,errcount
2088 double precision wdisc
2089
2090 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
2091 DOUBLE PRECISION ZA,ZD,THETAA
2092 LOGICAL QQBARD
2093
2094 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
2095 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
2096
2097 COMMON/COHERENT/NSTART,NEND,ALLQS(10000,6),SCATCENTRES(10000,10),
2098 &QSUMVEC(4),QSUM2
2099 INTEGER NSTART,NEND
2100 DOUBLE PRECISION ALLQS,SCATCENTRES,QSUMVEC,QSUM2
2101
2102 COMMON/WEIGHT/EVWEIGHT,sumofweights
2103 double precision EVWEIGHT,sumofweights
2104
2105 common/hepmcid/hpmcfid,logfid
2106 integer hpmcfid,logfid
2107
2108 common/storescatcen/nscatcen,maxnscatcen,scatflav(10000),
2109 & scatcen(10000,5),writescatcen,writedummies
2110 integer nscatcen,maxnscatcen,scatflav
2111 double precision scatcen
2112 logical writescatcen,writedummies
2113
2114 INTEGER L,LINE,NOLD,TYPI,LINEOLD,LKINE,nendold,nscatcenold
2115 DOUBLE PRECISION THETA,PHI,PYP,FORMTIME,STARTTIME,TLEFT,
2116 &TSUM,DELTAT,NEWMASS,GETMASS,Q,GETMS,ZDEC,X,DTCORR
2117 LOGICAL OVERQ0,QQBARDEC
2118 CHARACTER TYP
2119 LOGICAL RADIATION,RETRYSPLIT,MEDIND,roomleft,compressevent
2120
2121 LINE=L
2122 NSTART=0
2123 NEND=0
2124 STARTTIME=MV(LINE,4)
2125 TSUM=0.d0
2126 QSUM2=0.d0
2127 QSUMVEC(1)=0.d0
2128 QSUMVEC(2)=0.d0
2129 QSUMVEC(3)=0.d0
2130 QSUMVEC(4)=0.d0
2131 RETRYSPLIT=.FALSE.
2132 MEDIND=.FALSE.
2133 X=0.d0
2134 Q=0.d0
2135 TYPI=0
2136
2137 IF ((N.GT.20000).and.compress) roomleft = compressevent(line)
2138
2139 20 IF(DISCARD) RETURN
2140 IF(((K(LINE,1).EQ.1).AND.(P(LINE,5).GT.0.d0))
2141 & .OR.((K(LINE,1).EQ.2).AND.(zd(line).gt.0.d0)))THEN
2142 IF(MEDIND)THEN
2143 FORMTIME=starttime
2144 ELSE
2145 FORMTIME=MIN(MV(LINE,5),LTIME)
2146 ENDIF
2147 RADIATION=.TRUE.
2148 ELSE
2149 FORMTIME=LTIME
2150 RADIATION=.FALSE.
2151 ENDIF
2152 TLEFT=FORMTIME-STARTTIME
2153 IF(K(LINE,2).EQ.21)THEN
2154 TYP='G'
2155 ELSE
2156 TYP='Q'
2157 ENDIF
2158 MEDIND=.FALSE.
2159
2160 IF(TLEFT.LE.1.d-10)THEN
2161
2162 IF(RADIATION)THEN
2163
2164
2165 NOLD=N
2166 nscatcenold=nscatcen
2167 THETA=PYP(LINE,13)
2168 PHI=PYP(LINE,15)
2169 CALL PYROBO(LINE,LINE,0d0,-PHI,0d0,0d0,0d0)
2170 CALL PYROBO(LINE,LINE,-THETA,0d0,0d0,0d0,0d0)
2171 CALL MAKESPLITTING(LINE)
2172
2173 CALL PYROBO(LINE,LINE,THETA,0d0,0d0,0d0,0d0)
2174 CALL PYROBO(LINE,LINE,0d0,PHI,0d0,0d0,0d0)
2175 IF(DISCARD) RETURN
2176 CALL PYROBO(N-1,N,THETA,0d0,0d0,0d0,0d0)
2177 CALL PYROBO(N-1,N,0d0,PHI,0d0,0d0,0d0)
2178
2179 MV(N-1,1)=MV(LINE,1)
2180 & +(MV(N-1,4)-MV(LINE,4))*P(LINE,1)/max(pyp(line,8),P(LINE,4))
2181 MV(N-1,2)=MV(LINE,2)
2182 & +(MV(N-1,4)-MV(LINE,4))*P(LINE,2)/max(pyp(line,8),P(LINE,4))
2183 MV(N-1,3)=MV(LINE,3)
2184 & +(MV(N-1,4)-MV(LINE,4))*P(LINE,3)/max(pyp(line,8),P(LINE,4))
2185 MV(N, 1)=MV(LINE,1)
2186 & +(MV(N, 4)-MV(LINE,4))*P(LINE,1)/max(pyp(line,8),P(LINE,4))
2187 MV(N, 2)=MV(LINE,2)
2188 & +(MV(N, 4)-MV(LINE,4))*P(LINE,2)/max(pyp(line,8),P(LINE,4))
2189 MV(N, 3)=MV(LINE,3)
2190 & +(MV(N, 4)-MV(LINE,4))*P(LINE,3)/max(pyp(line,8),P(LINE,4))
2191
2192 LINE=N
2193 NSTART=0
2194 NEND=0
2195 STARTTIME=MV(N,4)
2196 QSUMVEC(1)=0.d0
2197 QSUMVEC(2)=0.d0
2198 QSUMVEC(3)=0.d0
2199 QSUMVEC(4)=0.d0
2200 QSUM2=0.d0
2201 TSUM=0.d0
2202 GOTO 21
2203 ELSE
2204 NSTART=0
2205 NEND=0
2206 STARTTIME=FORMTIME
2207 QSUMVEC(1)=0.d0
2208 QSUMVEC(2)=0.d0
2209 QSUMVEC(3)=0.d0
2210 QSUMVEC(4)=0.d0
2211 QSUM2=0.d0
2212 TSUM=0.d0
2213 GOTO 21
2214 ENDIF
2215 ELSE
2216
2217
2218 DELTAT=TLEFT
2219 OVERQ0=.FALSE.
2220 CALL DOINSTATESCAT(LINE,X,TYPI,Q,STARTTIME+TSUM,DELTAT,
2221 & OVERQ0,.FALSE.)
2222 TSUM=TSUM+DELTAT
2223 TLEFT=TLEFT-DELTAT
2224
2225 NOLD=N
2226 LINEOLD=LINE
2227 ZDEC=ZD(LINE)
2228 QQBARDEC=QQBARD(LINE)
2229 nscatcenold=nscatcen
2230 25 IF(X.LT.1.d0) THEN
2231 CALL MAKEINSPLIT(LINE,X,QSUM2,Q,TYPI,STARTTIME+TSUM,DELTAT)
2232 IF(DISCARD) RETURN
2233 IF(X.LT.1.d0)THEN
2234 LINE=N
2235 LKINE=N
2236 IF(K(LINE,2).EQ.21)THEN
2237 NEWMASS=GETMASS(0.d0,SCALEFACM*SQRT(-QSUM2),-1.d0,P(LINE,4),
2238 & 'GC',SQRT(-QSUM2),.FALSE.,ZDEC,QQBARDEC)
2239 IF(ZDEC.GT.0.d0)THEN
2240 THETAA(LINE)=NEWMASS/(SQRT(ZDEC*(1.-ZDEC))*P(LINE,4))
2241 ELSE
2242 THETAA(LINE)=0.d0
2243 ENDIF
2244 ZD(LINE)=ZDEC
2245 QQBARD(LINE)=QQBARDEC
2246 ELSE
2247 NEWMASS=GETMASS(0.d0,SCALEFACM*SQRT(-QSUM2),-1.d0,P(LINE,4),
2248 & 'QQ',SQRT(-QSUM2),.FALSE.,ZDEC,QQBARDEC)
2249 IF(ZDEC.GT.0.d0)THEN
2250 THETAA(LINE)=NEWMASS/(SQRT(ZDEC*(1.-ZDEC))*P(LINE,4))
2251 ELSE
2252 THETAA(LINE)=0.d0
2253 ENDIF
2254 ZD(LINE)=ZDEC
2255 QQBARD(LINE)=QQBARDEC
2256 ENDIF
2257 ZDEC=ZD(LINE)
2258 QQBARDEC=QQBARD(LINE)
2259 ELSE
2260 LKINE=LINE
2261 NEND=NSTART
2262 QSUM2=ALLQS(NEND,1)
2263 QSUMVEC(1)=ALLQS(NEND,2)
2264 QSUMVEC(2)=ALLQS(NEND,3)
2265 QSUMVEC(3)=ALLQS(NEND,4)
2266 QSUMVEC(4)=ALLQS(NEND,5)
2267 IF(-ALLQS(NEND,1).GT.Q0**2/SCALEFACM**2)THEN
2268 OVERQ0=.TRUE.
2269 ELSE
2270 OVERQ0=.FALSE.
2271 ENDIF
2272 tleft = starttime+tsum+tleft-allqs(1,6)
2273 tsum = allqs(1,6)-starttime
2274 ENDIF
2275 ENDIF
2276 IF(X.EQ.1.d0)THEN
2277 NEWMASS=0.d0
2278 IF(NEND.GT.0)THEN
2279 CALL DOFISTATESCAT(LINE,STARTTIME+TSUM,TLEFT,DELTAT,
2280 & NEWMASS,OVERQ0,ZDEC,QQBARDEC)
2281 IF(NEWMASS.GT.(P(LINE,5)*(1.d0+1.d-6)))THEN
2282 MEDIND=.TRUE.
2283 ELSE
2284 MEDIND=.FALSE.
2285 ZDEC=ZD(LINE)
2286 QQBARDEC=QQBARD(LINE)
2287 ENDIF
2288 TSUM=TSUM+DELTAT
2289 TLEFT=TLEFT-DELTAT
2290 LKINE=LINE
2291 ENDIF
2292 ENDIF
2293
2294 RETRYSPLIT=.FALSE.
2295 IF(NEND.GT.0) THEN
2296 nendold=nend
2297 CALL DOKINEMATICS(LKINE,lineold,NSTART,NEND,NEWMASS,RETRYSPLIT,
2298 & STARTTIME+TSUM,X,ZDEC,QQBARDEC)
2299 IF(RETRYSPLIT) THEN
2300 tleft = starttime+tsum+tleft-allqs(1,6)
2301 tsum = allqs(1,6)-starttime
2302 if (x.lt.1.d0) then
2303 NEND=NSTART
2304 QSUM2=ALLQS(NEND,1)
2305 QSUMVEC(1)=ALLQS(NEND,2)
2306 QSUMVEC(2)=ALLQS(NEND,3)
2307 QSUMVEC(3)=ALLQS(NEND,4)
2308 QSUMVEC(4)=ALLQS(NEND,5)
2309 TYPI=K(L,2)
2310 IF(-ALLQS(NEND,1).GT.Q0**2/SCALEFACM**2)THEN
2311 OVERQ0=.TRUE.
2312 ELSE
2313 OVERQ0=.FALSE.
2314 ENDIF
2315 N=NOLD
2316 LINE=LINEOLD
2317 X=1.d0
2318 K(LINE,1)=1
2319 nscatcen=nscatcenold
2320 NSPLIT=NSPLIT-EVWEIGHT
2321 GOTO 25
2322 else
2323 LINE=N
2324 STARTTIME=STARTTIME+TSUM
2325 TSUM=0.d0
2326 endif
2327 ELSE
2328 LINE=N
2329 STARTTIME=STARTTIME+TSUM
2330 TSUM=0.d0
2331 ENDIF
2332 ELSE
2333 STARTTIME=STARTTIME+TSUM
2334 TSUM=0.d0
2335 ENDIF
2336 IF(P(LINE,5).GT.0.d0) RADIATION=.TRUE.
2337 ENDIF
2338
2339 21 IF(((K(LINE,1).EQ.1).AND.(P(LINE,5).GT.0.d0))
2340 & .OR.((K(LINE,1).EQ.2).AND.(zd(line).gt.0.d0))
2341 & .OR.(STARTTIME.LT.LTIME))THEN
2342 GOTO 20
2343 ENDIF
2344 IF((K(LINE,1).EQ.1).AND.(P(LINE,5).EQ.0.d0)) K(LINE,1)=4
2345 IF((K(LINE,1).EQ.2).AND.(zd(line).lt.0.d0)) K(LINE,1)=5
2346 END
2347
2348
2349
2350
2351
2352
2353 SUBROUTINE MAKESPLITTING(L)
2354 IMPLICIT NONE
2355
2356 common/hepmcid/hpmcfid,logfid
2357 integer hpmcfid,logfid
2358
2359 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
2360 INTEGER N,NPAD,K
2361 DOUBLE PRECISION P,V
2362
2363 COMMON/TIME/MV(23000,5)
2364 DOUBLE PRECISION MV
2365
2366 COMMON/FTIMEFAC/FTFAC
2367 DOUBLE PRECISION FTFAC
2368
2369 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
2370 INTEGER TRIP,ANTI,COLMAX
2371
2372 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
2373 &ALLHAD,compress,NF
2374 INTEGER NF
2375 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
2376 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
2377
2378 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
2379 LOGICAL DISCARD
2380 INTEGER NDISC,NSTRANGE,NGOOD,errcount
2381 double precision wdisc
2382
2383 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
2384 DOUBLE PRECISION ZA,ZD,THETAA
2385 LOGICAL QQBARD
2386
2387 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
2388 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
2389
2390 COMMON/WEIGHT/EVWEIGHT,sumofweights
2391 double precision EVWEIGHT,sumofweights
2392
2393
2394 INTEGER L,DIR
2395 DOUBLE PRECISION PHIQ,PYR,PI,GENERATEZ,BMAX1,CMAX1,PTS,MB,MC,
2396 &GETMASS,PZ,EPS,QH,Z,R,LAMBDA,WEIGHT,ZDECB,ZDECC,XDEC(3),THETA,
2397 &GETTEMP
2398 LOGICAL QUARK,QQBAR,QQBARDECB,QQBARDECC
2399 integer bin
2400 DATA PI/3.141592653589793d0/
2401
2402 IF((N+2).GT.22990) THEN
2403 write(logfid,*)'event too long for event record'
2404 DISCARD=.TRUE.
2405 RETURN
2406 ENDIF
2407
2408 XDEC(1)=MV(L,1)+(MV(L,5)-MV(L,4))*P(L,1)/P(L,4)
2409 XDEC(2)=MV(L,2)+(MV(L,5)-MV(L,4))*P(L,2)/P(L,4)
2410 XDEC(3)=MV(L,3)+(MV(L,5)-MV(L,4))*P(L,3)/P(L,4)
2411 IF(GETTEMP(XDEC(1),XDEC(2),XDEC(3),MV(L,5)).GT.0.d0)THEN
2412 THETA=-1.d0
2413 ELSE
2414 THETA=THETAA(L)
2415 ENDIF
2416
2417
2418 IF((P(L,5).EQ.0d0).OR.(K(L,1).EQ.11).OR.(K(L,1).EQ.12)
2419 & .OR.(K(L,1).EQ.13).OR.(K(L,1).EQ.14).OR.(K(L,1).EQ.3)
2420 & .or.(zd(l).lt.0.d0)) GOTO 31
2421
2422 IF(K(L,2).EQ.21)THEN
2423 QUARK=.FALSE.
2424 ELSE
2425 QUARK=.TRUE.
2426 QQBAR=.FALSE.
2427 ENDIF
2428
2429 QQBAR=QQBARD(L)
2430
2431 IF(QUARK.OR.QQBAR)THEN
2432 DIR=0
2433 ELSE
2434 IF(PYR(0).LT.0.5)THEN
2435 DIR=1
2436 ELSE
2437 DIR=-1
2438 ENDIF
2439 ENDIF
2440 Z=ZD(L)
2441 IF(Z.EQ.0.d0)THEN
2442 write(logfid,*)'makesplitting: z=0',L
2443 goto 36
2444 ENDIF
2445 GOTO 35
2446
2447 36 IF(ANGORD.AND.(ZA(L).NE.1.d0))THEN
2448
2449 QH=4.*P(L,5)**2*(1.-ZA(L))/(ZA(L)*P(K(L,3),5)**2)
2450 IF(QH.GT.1)THEN
2451 write(logfid,*)L,': reject event: angular ordering
2452 & conflict in medium'
2453 CALL PYLIST(3)
2454 DISCARD=.TRUE.
2455 GOTO 31
2456 ENDIF
2457 EPS=0.5-0.5*SQRT(1.-QH)
2458 ELSE
2459 EPS=0d0
2460 ENDIF
2461 IF(QUARK)THEN
2462 Z=GENERATEZ(P(L,5)**2,P(L,4),EPS,'QQ')
2463 ELSE
2464 IF(QQBAR)THEN
2465 Z=GENERATEZ(P(L,5)**2,P(L,4),EPS,'QG')
2466 ELSE
2467 Z=GENERATEZ(P(L,5)**2,P(L,4),EPS,'GG')
2468 ENDIF
2469 ENDIF
2470 35 CONTINUE
2471
2472 BMAX1=MIN(P(L,5),Z*P(L,4))
2473 CMAX1=MIN(P(L,5),(1.-Z)*P(L,4))
2474
2475 30 IF(QUARK.OR.QQBAR)THEN
2476 MB=GETMASS(0.d0,BMAX1,THETA,Z*P(L,4),'QQ',
2477 & BMAX1,.FALSE.,ZDECB,QQBARDECB)
2478 ELSE
2479 MB=GETMASS(0.d0,BMAX1,THETA,Z*P(L,4),'GC',
2480 & BMAX1,.FALSE.,ZDECB,QQBARDECB)
2481 ENDIF
2482
2483 IF(QUARK.OR.(.NOT.QQBAR))THEN
2484 MC=GETMASS(0.d0,CMAX1,THETA,(1.-Z)*P(L,4),'GC',
2485 & CMAX1,.FALSE.,ZDECC,QQBARDECC)
2486 ELSE
2487 MC=GETMASS(0.d0,CMAX1,THETA,(1.-Z)*P(L,4),'QQ',
2488 & CMAX1,.FALSE.,ZDECC,QQBARDECC)
2489 ENDIF
2490
2491 182 PZ=(2.*Z*P(L,4)**2-P(L,5)**2-MB**2+MC**2)/(2.*P(L,3))
2492 PTS=Z**2*(P(L,4)**2)-PZ**2-MB**2
2493
2494
2495
2496 IF((MB.EQ.0.d0).AND.(MC.EQ.0.d0).AND.(PTS.LT.0.d0)) GOTO 36
2497 WEIGHT=1.d0
2498 IF((PYR(0).GT.WEIGHT).OR.(PTS.LT.0.d0)
2499 & .OR.((MB+MC).GT.P(L,5)))THEN
2500 IF(MB.GT.MC)THEN
2501 IF(QUARK.OR.QQBAR)THEN
2502 MB=GETMASS(0.d0,MB,THETA,Z*P(L,4),'QQ',
2503 & BMAX1,.FALSE.,ZDECB,QQBARDECB)
2504 ELSE
2505 MB=GETMASS(0.d0,MB,THETA,Z*P(L,4),'GC',
2506 & BMAX1,.FALSE.,ZDECB,QQBARDECB)
2507 ENDIF
2508 ELSE
2509 IF(QUARK.OR.(.NOT.QQBAR))THEN
2510 MC=GETMASS(0.d0,MC,THETA,(1.-Z)*P(L,4),'GC',
2511 & CMAX1,.FALSE.,ZDECC,QQBARDECC)
2512 ELSE
2513 MC=GETMASS(0.d0,MC,THETA,(1.-Z)*P(L,4),'QQ',
2514 & CMAX1,.FALSE.,ZDECC,QQBARDECC)
2515 ENDIF
2516 ENDIF
2517 GOTO 182
2518 ENDIF
2519 N=N+2
2520
2521 K(N-1,1)=K(L,1)
2522 IF(QQBAR)THEN
2523 K(N-1,2)=-1
2524 TRIP(N-1)=0
2525 ANTI(N-1)=ANTI(L)
2526 ELSE
2527 K(N-1,2)=21
2528 IF((K(L,2).GT.0).AND.(DIR.GE.0))THEN
2529 TRIP(N-1)=TRIP(L)
2530 ANTI(N-1)=COLMAX+1
2531 ELSE
2532 TRIP(N-1)=COLMAX+1
2533 ANTI(N-1)=ANTI(L)
2534 ENDIF
2535 COLMAX=COLMAX+1
2536 ENDIF
2537 K(N-1,3)=L
2538 K(N-1,4)=0
2539 K(N-1,5)=0
2540 P(N-1,4)=(1-Z)*P(L,4)
2541 P(N-1,5)=MC
2542 ZA(N-1)=1.-Z
2543 IF(ZDECC.GT.0.d0)THEN
2544 THETAA(N-1)=P(N-1,5)/(SQRT(ZDECC*(1.-ZDECC))*P(N-1,4))
2545 ELSE
2546 THETAA(N-1)=0.d0
2547 ENDIF
2548 ZD(N-1)=ZDECC
2549 QQBARD(N-1)=QQBARDECC
2550
2551
2552 K(N,1)=K(L,1)
2553 IF(QUARK)THEN
2554 K(N,2)=K(L,2)
2555 IF(K(N,2).GT.0)THEN
2556 TRIP(N)=ANTI(N-1)
2557 ANTI(N)=0
2558 ELSE
2559 TRIP(N)=0
2560 ANTI(N)=TRIP(N-1)
2561 ENDIF
2562 ELSEIF(QQBAR)THEN
2563 K(N,2)=1
2564 TRIP(N)=TRIP(L)
2565 ANTI(N)=0
2566 ELSE
2567 K(N,2)=21
2568 IF(DIR.EQ.1)THEN
2569 TRIP(N)=ANTI(N-1)
2570 ANTI(N)=ANTI(L)
2571 ELSE
2572 TRIP(N)=TRIP(L)
2573 ANTI(N)=TRIP(N-1)
2574 ENDIF
2575 ENDIF
2576 K(N,3)=L
2577 K(N,4)=0
2578 K(N,5)=0
2579 P(N,3)=PZ
2580 P(N,4)=Z*P(L,4)
2581 P(N,5)=MB
2582 ZA(N)=Z
2583 IF(ZDECB.GT.0.d0)THEN
2584 THETAA(N)=P(N,5)/(SQRT(ZDECB*(1.-ZDECB))*P(N,4))
2585 ELSE
2586 THETAA(N)=0.d0
2587 ENDIF
2588 ZD(N)=ZDECB
2589 QQBARD(N)=QQBARDECB
2590
2591 PHIQ=2*PI*PYR(0)
2592 P(N,1)=SQRT(PTS)*COS(PHIQ)
2593 P(N,2)=SQRT(PTS)*SIN(PHIQ)
2594
2595 P(N-1,1)=P(L,1)-P(N,1)
2596 P(N-1,2)=P(L,2)-P(N,2)
2597 P(N-1,3)=P(L,3)-P(N,3)
2598 MV(N-1,4)=MV(L,5)
2599 IF(P(N-1,5).GT.0.d0)THEN
2600 LAMBDA=1.d0/(FTFAC*P(N-1,4)*0.2/P(N-1,5)**2)
2601 MV(N-1,5)=MV(L,5)-LOG(1.d0-PYR(0))/LAMBDA
2602 ELSE
2603 MV(N-1,5)=0.d0
2604 ENDIF
2605 MV(N,4)=MV(L,5)
2606 IF(P(N,5).GT.0.d0)THEN
2607 LAMBDA=1.d0/(FTFAC*P(N,4)*0.2/P(N,5)**2)
2608 MV(N,5)=MV(L,5)-LOG(1.d0-PYR(0))/LAMBDA
2609 ELSE
2610 MV(N,5)=0.d0
2611 ENDIF
2612
2613 IF(K(L,1).EQ.2)THEN
2614 K(L,1)=13
2615 ELSE
2616 K(L,1)=11
2617 ENDIF
2618 K(L,4)=N-1
2619 K(L,5)=N
2620 NSPLIT=NSPLIT+EVWEIGHT
2621 31 CONTINUE
2622 END
2623
2624
2625
2626
2627
2628 SUBROUTINE MAKEINSPLIT(L,X,TSUM,VIRT,TYPI,TIME,TAURAD)
2629 IMPLICIT NONE
2630
2631 common/hepmcid/hpmcfid,logfid
2632 integer hpmcfid,logfid
2633
2634 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
2635 INTEGER N,NPAD,K
2636 DOUBLE PRECISION P,V
2637
2638 COMMON/TIME/MV(23000,5)
2639 DOUBLE PRECISION MV
2640
2641 COMMON/FTIMEFAC/FTFAC
2642 DOUBLE PRECISION FTFAC
2643
2644 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
2645 INTEGER TRIP,ANTI,COLMAX
2646
2647 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
2648 DOUBLE PRECISION ZA,ZD,THETAA
2649 LOGICAL QQBARD
2650
2651 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
2652 LOGICAL DISCARD
2653 INTEGER NDISC,NSTRANGE,NGOOD,errcount
2654 double precision wdisc
2655
2656 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
2657 &ALLHAD,compress,NF
2658 INTEGER NF
2659 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
2660 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
2661
2662 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
2663 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
2664
2665 COMMON/WEIGHT/EVWEIGHT,sumofweights
2666 double precision EVWEIGHT,sumofweights
2667
2668
2669 INTEGER L,TYPI,NOLD,DIR
2670 DOUBLE PRECISION X,VIRT,MB2,MC2,GETMASS,PZ,KT2,THETA,PHI,PI,
2671 &PHIQ,PYP,PYR,R,TIME,TSUM,TAURAD,LAMBDA,ZDEC
2672 LOGICAL QQBARDEC
2673 CHARACTER*2 TYP2,TYPC
2674 integer bin
2675 DATA PI/3.141592653589793d0/
2676
2677 IF((N+2).GT.22990) THEN
2678 write(logfid,*)'event too long for event record'
2679 DISCARD=.TRUE.
2680 RETURN
2681 ENDIF
2682
2683 IF(K(L,2).EQ.21)THEN
2684 IF(TYPI.EQ.21)THEN
2685 TYP2='GG'
2686 TYPC='GC'
2687 ELSE
2688 TYP2='QG'
2689 TYPC='QQ'
2690 ENDIF
2691 ELSE
2692 IF(TYPI.EQ.21)THEN
2693 TYP2='GQ'
2694 TYPC='QQ'
2695 ELSE
2696 TYP2='QQ'
2697 TYPC='GC'
2698 ENDIF
2699 ENDIF
2700
2701
2702 IF(TYP2.EQ.'GG')THEN
2703 IF(PYR(0).LT.0.5)THEN
2704 DIR=1
2705 ELSE
2706 DIR=-1
2707 ENDIF
2708 ELSE
2709 DIR=0
2710 ENDIF
2711
2712 MB2=VIRT**2
2713 MB2=P(L,5)**2-MB2
2714 MC2=GETMASS(0.d0,SCALEFACM*SQRT(-TSUM),-1.d0,
2715 & (1.-X)*P(L,4),TYPC,(1.-X)*P(L,4),
2716 & .FALSE.,ZDEC,QQBARDEC)**2
2717
2718
2719 NOLD=N
2720 THETA=PYP(L,13)
2721 PHI=PYP(L,15)
2722 CALL PYROBO(L,L,0d0,-PHI,0d0,0d0,0d0)
2723 CALL PYROBO(L,L,-THETA,0d0,0d0,0d0,0d0)
2724 PZ=(2*X*P(L,4)**2-P(L,5)**2-MB2+MC2)/(2*P(L,3))
2725 KT2=X**2*(P(L,4)**2)-PZ**2-MB2
2726 IF(KT2.LT.0.d0)THEN
2727 MC2=0.d0
2728 PZ=(2*X*P(L,4)**2-P(L,5)**2-MB2+MC2)/(2*P(L,3))
2729 KT2=X**2*(P(L,4)**2)-PZ**2-MB2
2730 IF(KT2.LT.0.d0)THEN
2731 CALL PYROBO(L,L,THETA,0d0,0d0,0d0,0d0)
2732 CALL PYROBO(L,L,0d0,PHI,0d0,0d0,0d0)
2733 X=1.d0
2734 RETURN
2735 ENDIF
2736 ENDIF
2737 N=N+2
2738
2739 K(N-1,1)=K(L,1)
2740 IF(TYP2.EQ.'QG')THEN
2741 K(N-1,2)=-TYPI
2742 IF(K(N-1,2).GT.0)THEN
2743 TRIP(N-1)=TRIP(L)
2744 ANTI(N-1)=0
2745 ELSE
2746 TRIP(N-1)=0
2747 ANTI(N-1)=ANTI(L)
2748 ENDIF
2749 ELSEIF(TYP2.EQ.'GQ')THEN
2750 K(N-1,2)=K(L,2)
2751 IF(K(N-1,2).GT.0)THEN
2752 TRIP(N-1)=COLMAX+1
2753 ANTI(N-1)=0
2754 ELSE
2755 TRIP(N-1)=0
2756 ANTI(N-1)=COLMAX+1
2757 ENDIF
2758 COLMAX=COLMAX+1
2759 ELSE
2760 K(N-1,2)=21
2761 IF((K(L,2).GT.0).AND.(DIR.GE.0))THEN
2762 TRIP(N-1)=TRIP(L)
2763 ANTI(N-1)=COLMAX+1
2764 ELSE
2765 TRIP(N-1)=COLMAX+1
2766 ANTI(N-1)=ANTI(L)
2767 ENDIF
2768 COLMAX=COLMAX+1
2769 ENDIF
2770 K(N-1,3)=L
2771 K(N-1,4)=0
2772 K(N-1,5)=0
2773 P(N-1,4)=(1.-X)*P(L,4)
2774 P(N-1,5)=SQRT(MC2)
2775
2776
2777 K(N,1)=K(L,1)
2778 IF(TYP2.EQ.'QG')THEN
2779 K(N,2)=TYPI
2780 IF(K(N,2).GT.0)THEN
2781 TRIP(N)=TRIP(L)
2782 ANTI(N)=0
2783 ELSE
2784 TRIP(N)=0
2785 ANTI(N)=ANTI(L)
2786 ENDIF
2787 ELSEIF(TYPI.NE.21)THEN
2788 K(N,2)=K(L,2)
2789 IF(K(N,2).GT.0)THEN
2790 TRIP(N)=ANTI(N-1)
2791 ANTI(N)=0
2792 ELSE
2793 TRIP(N)=0
2794 ANTI(N)=TRIP(N-1)
2795 ENDIF
2796 ELSE
2797 K(N,2)=21
2798 IF(K(N-1,2).EQ.21)THEN
2799 IF(DIR.EQ.1)THEN
2800 TRIP(N)=ANTI(N-1)
2801 ANTI(N)=ANTI(L)
2802 ELSE
2803 TRIP(N)=TRIP(L)
2804 ANTI(N)=TRIP(N-1)
2805 ENDIF
2806 ELSEIF(K(N-1,2).GT.0)THEN
2807 TRIP(N)=TRIP(L)
2808 ANTI(N)=TRIP(N-1)
2809 ELSE
2810 TRIP(N)=ANTI(N-1)
2811 ANTI(N)=ANTI(L)
2812 ENDIF
2813 ENDIF
2814 K(N,3)=L
2815 K(N,4)=0
2816 K(N,5)=0
2817 P(N,3)=PZ
2818 P(N,4)=X*P(L,4)
2819 IF(MB2.LT.0.d0)THEN
2820 P(N,5)=-SQRT(-MB2)
2821 ELSE
2822 P(N,5)=SQRT(MB2)
2823 ENDIF
2824
2825 PHIQ=2*PI*PYR(0)
2826 P(N,1)=SQRT(KT2)*COS(PHIQ)
2827 P(N,2)=SQRT(KT2)*SIN(PHIQ)
2828
2829 P(N-1,1)=P(L,1)-P(N,1)
2830 P(N-1,2)=P(L,2)-P(N,2)
2831 P(N-1,3)=P(L,3)-P(N,3)
2832 MV(L,5)=TIME-TAURAD
2833 MV(N-1,4)=MV(L,5)
2834 IF(P(N-1,5).GT.0.d0)THEN
2835 LAMBDA=1.d0/(FTFAC*P(N-1,4)*0.2/P(N-1,5)**2)
2836 MV(N-1,5)=MV(L,5)-LOG(1.d0-PYR(0))/LAMBDA
2837 ELSE
2838 MV(N-1,5)=0.d0
2839 ENDIF
2840 MV(N,4)=MV(L,5)
2841 IF(P(N,5).GT.0.d0)THEN
2842 MV(N,5)=TIME
2843 ELSE
2844 MV(N,5)=0.d0
2845 ENDIF
2846 ZA(N-1)=1.d0
2847 THETAA(N-1)=-1.d0
2848 ZD(N-1)=ZDEC
2849 QQBARD(N-1)=QQBARDEC
2850 ZA(N)=1.d0
2851 THETAA(N)=-1.d0
2852 ZD(N)=0.d0
2853 QQBARD(N)=.FALSE.
2854
2855 IF(K(L,1).EQ.2)THEN
2856 K(L,1)=13
2857 ELSE
2858 K(L,1)=11
2859 ENDIF
2860 K(L,4)=N-1
2861 K(L,5)=N
2862 NSPLIT=NSPLIT+EVWEIGHT
2863 CALL PYROBO(L,L,THETA,0d0,0d0,0d0,0d0)
2864 CALL PYROBO(N-1,N,THETA,0d0,0d0,0d0,0d0)
2865 CALL PYROBO(L,L,0d0,PHI,0d0,0d0,0d0)
2866 CALL PYROBO(N-1,N,0d0,PHI,0d0,0d0,0d0)
2867
2868
2869 MV(N-1,1)=MV(L,1)+(MV(N-1,4)-MV(L,4))*P(L,1)/max(pyp(l,8),P(L,4))
2870 MV(N-1,2)=MV(L,2)+(MV(N-1,4)-MV(L,4))*P(L,2)/max(pyp(l,8),P(L,4))
2871 MV(N-1,3)=MV(L,3)+(MV(N-1,4)-MV(L,4))*P(L,3)/max(pyp(l,8),P(L,4))
2872 MV(N, 1)=MV(L,1)+(MV(N, 4)-MV(L,4))*P(L,1)/max(pyp(l,8),P(L,4))
2873 MV(N, 2)=MV(L,2)+(MV(N, 4)-MV(L,4))*P(L,2)/max(pyp(l,8),P(L,4))
2874 MV(N, 3)=MV(L,3)+(MV(N, 4)-MV(L,4))*P(L,3)/max(pyp(l,8),P(L,4))
2875
2876 END
2877
2878
2879
2880
2881
2882 SUBROUTINE DOINSTATESCAT(L,X,TYPI,Q,TSTART,DELTAT,OVERQ0,
2883 & RETRYSPLIT)
2884 IMPLICIT NONE
2885
2886 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
2887 INTEGER N,NPAD,K
2888 DOUBLE PRECISION P,V
2889
2890 COMMON/TIME/MV(23000,5)
2891 DOUBLE PRECISION MV
2892
2893 COMMON/FTIMEFAC/FTFAC
2894 DOUBLE PRECISION FTFAC
2895
2896 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
2897 &ALLHAD,compress,NF
2898 INTEGER NF
2899 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
2900 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
2901
2902 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
2903 LOGICAL DISCARD
2904 INTEGER NDISC,NSTRANGE,NGOOD,errcount
2905 double precision wdisc
2906
2907 COMMON/COHERENT/NSTART,NEND,ALLQS(10000,6),SCATCENTRES(10000,10),
2908 &QSUMVEC(4),QSUM2
2909 INTEGER NSTART,NEND
2910 DOUBLE PRECISION ALLQS,SCATCENTRES,QSUMVEC,QSUM2
2911
2912 common/hepmcid/hpmcfid,logfid
2913 integer hpmcfid,logfid
2914
2915 INTEGER L,TYPI,COUNTER,COUNTMAX,COUNT2
2916 DOUBLE PRECISION X,DELTAT,DELTAL,PYR,R,PNORAD,GETPNORAD1,GETNOSCAT,
2917 &WEIGHT,LOW,FMAX,GETPDF,SIGMATOT,GETSSCAT,PFCHANGE,PI,TNOW,TLEFT,
2918 &XMAX,PQQ,PQG,PGQ,PGG,ALPHAS,TSTART,TSUM,Q,QOLD,Q2OLD,GETNEWMASS,
2919 &GENERATEZ,TMAX,TMAXNEW,DT,XSC,YSC,ZSC,TSC,MS1,MD1,GETMS,GETMD,
2920 &GETTEMP,GETNEFF,LAMBDA,RTAU,PHI,TAUEST,QSUMVECOLD(4),ZDUM,WEIGHT,
2921 &pyp
2922 LOGICAL FCHANGE,NORAD,OVERQ0,NOSCAT,GETDELTAT,RETRYSPLIT,
2923 &QQBARDUM
2924 CHARACTER TYP
2925 CHARACTER*2 TYP2
2926 DATA PI/3.141592653589793d0/
2927 DATA COUNTMAX/10000/
2928
2929 COUNTER=0
2930
2931 XSC=MV(L,1)+(TSTART-MV(L,4))*P(L,1)/P(L,4)
2932 YSC=MV(L,2)+(TSTART-MV(L,4))*P(L,2)/P(L,4)
2933 ZSC=MV(L,3)+(TSTART-MV(L,4))*P(L,3)/P(L,4)
2934 TSC=TSTART
2935 MD1=GETMD(XSC,YSC,ZSC,TSC)
2936 MS1=GETMS(XSC,YSC,ZSC,TSC)
2937
2938 IF(MD1.LE.1.D-4.OR.MS1.LE.1.D-4)THEN
2939 write(logfid,*)'problem!',GETTEMP(XSC,YSC,ZSC,TSC),
2940 &GETNEFF(XSC,YSC,ZSC,TSC)
2941 ENDIF
2942
2943
2944 NOSCAT=.NOT.GETDELTAT(L,TSTART,DELTAT,DT)
2945 IF(NOSCAT.AND.(.NOT.RETRYSPLIT)) GOTO 116
2946
2947
2948 PNORAD=GETPNORAD1(L,xsc,ysc,zsc,tsc)
2949 IF((PYR(0).LT.PNORAD).OR.(P(L,4).LT.1.001*Q0))THEN
2950 NORAD=.TRUE.
2951 ELSE
2952 NORAD=.FALSE.
2953 ENDIF
2954
2955
2956 IF(K(L,2).EQ.21)THEN
2957 TYP='G'
2958 TYP2='GC'
2959 SIGMATOT=GETSSCAT(P(L,4),p(l,1),p(l,2),p(l,3),P(L,5),
2960 & Q0,'G','C',xsc,ysc,zsc,tsc,0)
2961 IF((SIGMATOT.EQ.0.d0).OR.(PNORAD.EQ.1.d0))THEN
2962 PFCHANGE=0.d0
2963 ELSE
2964 PFCHANGE=GETSSCAT(P(L,4),p(l,1),p(l,2),p(l,3),P(L,5),
2965 & Q0,'G','Q',xsc,ysc,zsc,tsc,0)
2966 & /SIGMATOT
2967 ENDIF
2968 SIGMATOT=GETSSCAT(P(L,4),p(l,1),p(l,2),p(l,3),P(L,5),
2969 & 0.d0,'G','C',xsc,ysc,zsc,tsc,0)
2970 ELSE
2971 TYP='Q'
2972 TYP2='QQ'
2973 SIGMATOT=GETSSCAT(P(L,4),p(l,1),p(l,2),p(l,3),P(L,5),
2974 & Q0,'Q','C',xsc,ysc,zsc,tsc,0)
2975 IF((SIGMATOT.EQ.0.d0).OR.(PNORAD.EQ.1.d0))THEN
2976 PFCHANGE=0.d0
2977 ELSE
2978 PFCHANGE=GETSSCAT(P(L,4),p(l,1),p(l,2),p(l,3),P(L,5),
2979 & Q0,'Q','G',xsc,ysc,zsc,tsc,0)
2980 & /SIGMATOT
2981 ENDIF
2982 SIGMATOT=GETSSCAT(P(L,4),p(l,1),p(l,2),p(l,3),P(L,5),
2983 & 0.d0,'Q','C',xsc,ysc,zsc,tsc,0)
2984 ENDIF
2985 IF((PFCHANGE.LT.-1.d-4).OR.(PFCHANGE.GT.1.d0+1.d-4)) THEN
2986 write(logfid,*)'error: flavour change probability=',
2987 & PFCHANGE,'for ',TYP
2988 ENDIF
2989 IF(PYR(0).LT.PFCHANGE)THEN
2990 FCHANGE=.TRUE.
2991 ELSE
2992 FCHANGE=.FALSE.
2993 ENDIF
2994 IF (NORAD) FCHANGE=.FALSE.
2995
2996 IF(TYP.EQ.'G')THEN
2997 IF(FCHANGE)THEN
2998 TYPI=INT(SIGN(2.d0,PYR(0)-0.5))
2999 ELSE
3000 TYPI=K(L,2)
3001 ENDIF
3002 ELSE
3003 IF(FCHANGE)THEN
3004 TYPI=21
3005 ELSE
3006 TYPI=K(L,2)
3007 ENDIF
3008 ENDIF
3009 LOW=Q0**2/SCALEFACM**2
3010 TMAX=4.*(P(L,4)**2-P(L,5)**2)
3011 XMAX=1.-Q0**2/(SCALEFACM**2*4.*TMAX)
3012
3013 IF(SIGMATOT.EQ.0.d0) GOTO 116
3014
3015 RTAU=PYR(0)
3016
3017
3018
3019 112 COUNTER=COUNTER+1
3020 IF(TYP.EQ.'G')THEN
3021 IF(FCHANGE)THEN
3022 X=GENERATEZ(0.d0,0.d0,1.-XMAX,'QG')
3023 ELSE
3024 X=GENERATEZ(0.d0,0.d0,1.-XMAX,'GG')
3025 ENDIF
3026 ELSE
3027 IF(FCHANGE)THEN
3028 X=1.-GENERATEZ(0.d0,0.d0,1.-XMAX,'QQ')
3029 ELSE
3030 X=GENERATEZ(0.d0,0.d0,1.-XMAX,'QQ')
3031 ENDIF
3032 ENDIF
3033 IF(NORAD) X=1.d0
3034
3035 TMAXNEW=(X*P(L,4))**2
3036 PHI=0.d0
3037 TLEFT=DELTAT
3038 TNOW=TSTART
3039 QSUMVEC(1)=0.d0
3040 QSUMVEC(2)=0.d0
3041 QSUMVEC(3)=0.d0
3042 QSUMVEC(4)=0.d0
3043 QSUM2=-1.d-10
3044 OVERQ0=.FALSE.
3045 Q=P(L,5)
3046 QOLD=P(L,5)
3047 TAUEST=DELTAT
3048
3049 DELTAL=DT
3050 NSTART=1
3051 NEND=1
3052 TNOW=TNOW+DELTAL
3053 TSUM=DELTAL
3054 TLEFT=TLEFT-DELTAL
3055 ALLQS(NEND,6)=TNOW
3056 Q2OLD=QSUM2
3057
3058 COUNT2=0
3059 118 CALL GETQVEC(L,NEND,TNOW-MV(L,4),X)
3060 IF(-QSUM2.GT.P(L,4)**2)THEN
3061 QSUMVEC(1)=0.d0
3062 QSUMVEC(2)=0.d0
3063 QSUMVEC(3)=0.d0
3064 QSUMVEC(4)=0.d0
3065 QSUM2=Q2OLD
3066 IF(COUNT2.LT.100)THEN
3067 COUNT2=COUNT2+1
3068 GOTO 118
3069 ELSE
3070 ALLQS(NEND,1)=0.d0
3071 ALLQS(NEND,2)=0.d0
3072 ALLQS(NEND,3)=0.d0
3073 ALLQS(NEND,4)=0.d0
3074 ALLQS(NEND,5)=0.d0
3075 ENDIF
3076 ENDIF
3077
3078 IF(-ALLQS(NEND,1).GT.LOW) OVERQ0=.TRUE.
3079
3080 IF(OVERQ0.AND.(.NOT.NORAD))THEN
3081 Q=GETNEWMASS(L,SCALEFACM**2*QSUM2,SCALEFACM**2*Q2OLD,0.d0,
3082 & .TRUE.,X,ZDUM,QQBARDUM)
3083 ELSE
3084 Q=0.d0
3085 ENDIF
3086
3087
3088 111 IF((Q.EQ.0.d0).OR.(Q.EQ.P(L,5)))THEN
3089 TAUEST=DELTAT
3090 ELSE
3091 TAUEST=FTFAC*(1.-PHI)*0.2*X*P(L,4)/Q**2
3092 ENDIF
3093 LAMBDA=1.d0/TAUEST
3094 TAUEST=-LOG(1.d0-RTAU)/LAMBDA
3095
3096
3097 NOSCAT=.NOT.GETDELTAT(L,TNOW,MIN(TLEFT,TAUEST),DELTAL)
3098 IF((.NOT.NOSCAT).AND.(.NOT.NORAD))THEN
3099
3100 NEND=NEND+1
3101 IF(NEND.GE.100)THEN
3102 nend=nend-1
3103 goto 114
3104 ENDIF
3105 TNOW=TNOW+DELTAL
3106 TSUM=TSUM+DELTAL
3107 TLEFT=TLEFT-DELTAL
3108
3109 IF((Q.NE.0.d0).AND.(Q.NE.P(L,5)))THEN
3110 PHI=PHI+5.*DELTAL*Q**2/(1.*X*P(L,4))
3111 ENDIF
3112
3113 ALLQS(NEND,6)=TNOW
3114 Q2OLD=QSUM2
3115 QSUMVECOLD(1)=QSUMVEC(1)
3116 QSUMVECOLD(2)=QSUMVEC(2)
3117 QSUMVECOLD(3)=QSUMVEC(3)
3118 QSUMVECOLD(4)=QSUMVEC(4)
3119 COUNT2=0
3120 119 CALL GETQVEC(L,NEND,TNOW-MV(L,4),X)
3121 IF(-QSUM2.GT.P(L,4)**2)THEN
3122 QSUMVEC(1)=QSUMVECOLD(1)
3123 QSUMVEC(2)=QSUMVECOLD(2)
3124 QSUMVEC(3)=QSUMVECOLD(3)
3125 QSUMVEC(4)=QSUMVECOLD(4)
3126 QSUM2=Q2OLD
3127 IF(COUNT2.LT.100)THEN
3128 COUNT2=COUNT2+1
3129 GOTO 119
3130 ELSE
3131 ALLQS(NEND,1)=0.d0
3132 ALLQS(NEND,2)=0.d0
3133 ALLQS(NEND,3)=0.d0
3134 ALLQS(NEND,4)=0.d0
3135 ALLQS(NEND,5)=0.d0
3136 ENDIF
3137 ENDIF
3138
3139 IF((-QSUM2.GT.LOW)
3140 & .OR.(-ALLQS(NEND,1).GT.LOW)) OVERQ0=.TRUE.
3141
3142 QOLD=Q
3143 IF(OVERQ0.AND.(.NOT.NORAD))THEN
3144 Q=GETNEWMASS(L,SCALEFACM**2*QSUM2,SCALEFACM**2*Q2OLD,0.d0,
3145 & .TRUE.,X,ZDUM,QQBARDUM)
3146 ELSE
3147 Q=0.d0
3148 ENDIF
3149 GOTO 111
3150 ENDIF
3151
3152
3153 114 TMAXNEW=X**2*P(L,4)**2
3154 IF(NORAD)THEN
3155 WEIGHT=1.d0
3156 Q=0.d0
3157 X=1.d0
3158 ELSEIF((-QSUM2.LT.LOW).OR.(Q.EQ.0.d0))THEN
3159 WEIGHT=0.d0
3160 ELSEIF(-QSUM2.GT.P(L,4)**2)THEN
3161 WEIGHT=0.d0
3162 ELSE
3163 IF(TYP.EQ.'G')THEN
3164 FMAX=2.*LOG(-SCALEFACM**2*QSUM2/Q0**2)
3165 & *ALPHAS(Q0**2/4.,LPS)/(2.*PI)
3166 IF(QSUM2.EQ.0.d0)THEN
3167 WEIGHT=0.d0
3168 NORAD=.TRUE.
3169 ELSE
3170 IF(FCHANGE)THEN
3171 WEIGHT=2.*GETPDF(X,SCALEFACM*SQRT(-QSUM2),'QG')/(PQG(X)*FMAX)
3172 IF((WEIGHT.GT.1.d0+1.d-4).OR.(WEIGHT.LT.-1.d-4))THEN
3173 write(logfid,*)'x,sqrt(qsum^2),getpdf,fmax:',X,
3174 & SQRT(-QSUM2),GETPDF(X,SCALEFACM*SQRT(-QSUM2),'QG'),'qg',
3175 & FMAX
3176 ENDIF
3177 ELSE
3178 WEIGHT=GETPDF(X,SCALEFACM*SQRT(-QSUM2),'GG')/(PGG(X)*FMAX)
3179 IF((WEIGHT.GT.1.d0+1.d-4).OR.(WEIGHT.LT.-1.d-4))THEN
3180 write(logfid,*)'x,sqrt(qsum^2),getpdf,fmax:',X,
3181 & SQRT(-QSUM2),GETPDF(X,SCALEFACM*SQRT(-QSUM2),'GG'),'gg',
3182 & FMAX
3183 ENDIF
3184 ENDIF
3185 ENDIF
3186 ELSE
3187 FMAX=LOG(-SCALEFACM**2*QSUM2/Q0**2)
3188 & *ALPHAS(Q0**2/4.,LPS)/(2.*PI)
3189 IF(QSUM2.EQ.0.d0)THEN
3190 WEIGHT=0.d0
3191 NORAD=.TRUE.
3192 ELSE
3193 IF(FCHANGE)THEN
3194 WEIGHT=GETPDF(X,SCALEFACM*SQRT(-QSUM2),'GQ')/(PGQ(X)*FMAX)
3195 IF((WEIGHT.GT.1.d0+1.d-4).OR.(WEIGHT.LT.-1.d-4))THEN
3196 write(logfid,*)'x,sqrt(qsum^2),getpdf:,fmax',X,
3197 & SQRT(-QSUM2),GETPDF(X,SCALEFACM*SQRT(-QSUM2),'GQ'),'gq',
3198 & FMAX
3199 ENDIF
3200 ELSE
3201 WEIGHT=GETPDF(X,SCALEFACM*SQRT(-QSUM2),'QQ')/(PQQ(X)*FMAX)
3202 IF((WEIGHT.GT.1.d0+1.d-4).OR.(WEIGHT.LT.-1.d-4))THEN
3203 write(logfid,*)'x,sqrt(qsum^2),getpdf,fmax:',X,
3204 & SQRT(-QSUM2),GETPDF(X,SCALEFACM*SQRT(-QSUM2),'QQ'),'qq',
3205 & FMAX
3206 ENDIF
3207 ENDIF
3208 ENDIF
3209 ENDIF
3210 ENDIF
3211 IF((WEIGHT.GT.1.d0+1.d-4).OR.(WEIGHT.LT.-1.d-4))
3212 & write(logfid,*)'error: weight=',WEIGHT
3213 115 IF(PYR(0).GT.WEIGHT)THEN
3214 IF(COUNTER.LT.COUNTMAX)THEN
3215 GOTO 112
3216 ELSE
3217 Q=0.d0
3218 X=1.d0
3219 NEND=NSTART
3220 QSUM2=ALLQS(NEND,1)
3221 QSUMVEC(1)=ALLQS(NEND,2)
3222 QSUMVEC(2)=ALLQS(NEND,3)
3223 QSUMVEC(3)=ALLQS(NEND,4)
3224 QSUMVEC(4)=ALLQS(NEND,5)
3225 TYPI=K(L,2)
3226 IF(-ALLQS(NEND,1).GT.LOW)THEN
3227 OVERQ0=.TRUE.
3228 ELSE
3229 OVERQ0=.FALSE.
3230 ENDIF
3231 DELTAT=ALLQS(NEND,6)-TSTART
3232 TNOW=ALLQS(1,6)
3233 RETURN
3234 ENDIF
3235 ENDIF
3236
3237
3238 IF(((TLEFT.LT.TAUEST).OR.(PYR(0).GT.1.d0/(NEND*1.d0)))
3239 & .AND.(.NOT.NORAD))THEN
3240 Q=0.d0
3241 X=1.d0
3242 NEND=NSTART
3243 QSUM2=ALLQS(NEND,1)
3244 QSUMVEC(1)=ALLQS(NEND,2)
3245 QSUMVEC(2)=ALLQS(NEND,3)
3246 QSUMVEC(3)=ALLQS(NEND,4)
3247 QSUMVEC(4)=ALLQS(NEND,5)
3248 TYPI=K(L,2)
3249 IF(-ALLQS(NEND,1).GT.LOW)THEN
3250 OVERQ0=.TRUE.
3251 ELSE
3252 OVERQ0=.FALSE.
3253 ENDIF
3254 DELTAT=ALLQS(NEND,6)-TSTART
3255 TNOW=ALLQS(1,6)
3256 ELSE
3257 IF(.NOT.NORAD)THEN
3258 TLEFT=TLEFT-TAUEST
3259 TNOW=TNOW+TAUEST
3260 TSUM=TSUM+TAUEST
3261 ENDIF
3262 DELTAT=TSUM
3263 ENDIF
3264 RETURN
3265
3266 116 Q=0.d0
3267 X=1.d0
3268 NSTART=0
3269 NEND=0
3270 QSUMVEC(1)=0.d0
3271 QSUMVEC(2)=0.d0
3272 QSUMVEC(3)=0.d0
3273 QSUMVEC(4)=0.d0
3274 QSUM2=0.d0
3275 OVERQ0=.FALSE.
3276 TYPI=K(L,2)
3277 RETURN
3278 END
3279
3280
3281
3282
3283
3284 SUBROUTINE DOFISTATESCAT(L,TNOW,DTLEFT,DELTAT,NEWMASS,
3285 & OVERQ0,Z,QQBAR)
3286 IMPLICIT NONE
3287
3288 common/hepmcid/hpmcfid,logfid
3289 integer hpmcfid,logfid
3290
3291 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
3292 INTEGER N,NPAD,K
3293 DOUBLE PRECISION P,V
3294
3295 COMMON/TIME/MV(23000,5)
3296 DOUBLE PRECISION MV
3297
3298 COMMON/FTIMEFAC/FTFAC
3299 DOUBLE PRECISION FTFAC
3300
3301 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
3302 &ALLHAD,compress,NF
3303 INTEGER NF
3304 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
3305 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
3306
3307 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
3308 LOGICAL DISCARD
3309 INTEGER NDISC,NSTRANGE,NGOOD,errcount
3310 double precision wdisc
3311
3312 COMMON/COHERENT/NSTART,NEND,ALLQS(10000,6),SCATCENTRES(10000,10),
3313 &QSUMVEC(4),QSUM2
3314 INTEGER NSTART,NEND
3315 DOUBLE PRECISION ALLQS,SCATCENTRES,QSUMVEC,QSUM2
3316
3317 INTEGER L,COUNTER,COUNTMAX,COUNT2
3318 DOUBLE PRECISION TNOW,DELTAT,NEWMASS,TLEFT,DELTAL,Q2OLD,
3319 &GETNEWMASS,PYR,TSUM,QSUMVECOLD(4),RTAU,LAMBDA,DTLEFT,PHI,
3320 &TAUEST,LOW,Z,pyp
3321 LOGICAL OVERQ0,NOSCAT,GETDELTAT,QQBAR
3322 CHARACTER TYP
3323 DATA COUNTMAX/100/
3324 DELTAL=0.d0
3325
3326 IF(-QSUM2.GT.P(L,4)**2)
3327 & write(logfid,*) 'DOFISTATESCAT has a problem:',-QSUM2,P(L,4)**2
3328
3329 IF(K(L,2).EQ.21)THEN
3330 TYP='G'
3331 ELSE
3332 TYP='Q'
3333 ENDIF
3334 LOW=Q0**2/SCALEFACM**2
3335
3336 TSUM=0.d0
3337 PHI=0.d0
3338 DELTAT=0.d0
3339
3340
3341 Q2OLD=0.d0
3342 IF(OVERQ0.OR.(-QSUM2.GT.LOW))THEN
3343 NEWMASS=GETNEWMASS(L,SCALEFACM**2*QSUM2,SCALEFACM**2*Q2OLD,
3344 & NEWMASS,.FALSE.,1.d0,Z,QQBAR)
3345 OVERQ0=.TRUE.
3346 ELSE
3347 NEWMASS=P(L,5)
3348 ENDIF
3349
3350 RTAU=PYR(0)
3351
3352 TLEFT=DTLEFT
3353 222 IF((NEWMASS.EQ.0.d0).OR.(NEWMASS.EQ.P(L,5)))THEN
3354 TAUEST=TLEFT
3355 ELSE
3356 TAUEST=FTFAC*(1.-PHI)*0.2*P(L,4)/NEWMASS**2
3357 ENDIF
3358 LAMBDA=1.d0/TAUEST
3359 TAUEST=-LOG(1.d0-RTAU)/LAMBDA
3360 NOSCAT=.NOT.GETDELTAT(L,TNOW+TSUM,MIN(TAUEST,TLEFT),DELTAL)
3361 IF(.NOT.NOSCAT)THEN
3362
3363 NEND=NEND+1
3364 IF(NEND.gt.countmax)THEN
3365 nend=nend-1
3366 goto 218
3367 ENDIF
3368 IF(NSTART.EQ.0) NSTART=1
3369 TSUM=TSUM+DELTAL
3370 TLEFT=TLEFT-DELTAL
3371 IF((NEWMASS.NE.0.d0).AND.(NEWMASS.NE.P(L,5)))THEN
3372 PHI=PHI+5.*DELTAL*NEWMASS**2/(1.*P(L,4))
3373 ENDIF
3374 ALLQS(NEND,6)=TNOW+TSUM
3375 QSUMVECOLD(1)=QSUMVEC(1)
3376 QSUMVECOLD(2)=QSUMVEC(2)
3377 QSUMVECOLD(3)=QSUMVEC(3)
3378 QSUMVECOLD(4)=QSUMVEC(4)
3379 Q2OLD=QSUM2
3380
3381 COUNT2=0
3382 219 CALL GETQVEC(L,NEND,TNOW+TSUM-MV(L,4),1.d0)
3383 IF(-QSUM2.GT.P(L,4)**2)THEN
3384 QSUMVEC(1)=QSUMVECOLD(1)
3385 QSUMVEC(2)=QSUMVECOLD(2)
3386 QSUMVEC(3)=QSUMVECOLD(3)
3387 QSUMVEC(4)=QSUMVECOLD(4)
3388 QSUM2=Q2OLD
3389 IF(COUNT2.LT.100)THEN
3390 COUNT2=COUNT2+1
3391 GOTO 219
3392 ELSE
3393 ALLQS(NEND,1)=0.d0
3394 ALLQS(NEND,2)=0.d0
3395 ALLQS(NEND,3)=0.d0
3396 ALLQS(NEND,4)=0.d0
3397 ALLQS(NEND,5)=0.d0
3398 ENDIF
3399 ENDIF
3400
3401 IF(OVERQ0.OR.(-QSUM2.GT.LOW))THEN
3402 NEWMASS=GETNEWMASS(L,SCALEFACM**2*QSUM2,SCALEFACM**2*Q2OLD,
3403 & NEWMASS,.FALSE.,1.d0,Z,QQBAR)
3404 OVERQ0=.TRUE.
3405 ENDIF
3406 GOTO 222
3407 ENDIF
3408
3409 218 if ((newmass**2.gt.low).and.(newmass.ne.p(l,5))) then
3410 if ((TLEFT.LT.TAUEST).OR.(PYR(0).GT.1.d0/(NEND*1.d0))) then
3411 if (nend.eq.countmax) then
3412 deltat=tsum
3413 else if (TLEFT.LT.TAUEST) then
3414 DELTAT=TSUM+tleft
3415 else
3416 DELTAT=TSUM+tauest
3417 endif
3418 NEWMASS=P(L,5)
3419 ELSE
3420 DELTAT=TSUM+TAUEST
3421 ENDIF
3422 else
3423 DELTAT=0.d0
3424 NSTART=1
3425 NEND=1
3426 QSUM2=ALLQS(NEND,1)
3427 QSUMVEC(1)=ALLQS(NEND,2)
3428 QSUMVEC(2)=ALLQS(NEND,3)
3429 QSUMVEC(3)=ALLQS(NEND,4)
3430 QSUMVEC(4)=ALLQS(NEND,5)
3431 IF(-ALLQS(NEND,1).GT.LOW)THEN
3432 OVERQ0=.TRUE.
3433 ELSE
3434 OVERQ0=.FALSE.
3435 ENDIF
3436 NEWMASS=P(L,5)
3437 endif
3438 return
3439 END
3440
3441
3442
3443
3444
3445 DOUBLE PRECISION FUNCTION GETNEWMASS(L,Q2,QOLD2,MASS,IN,X,
3446 & ZDEC,QQBARDEC)
3447 IMPLICIT NONE
3448
3449 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
3450 INTEGER N,NPAD,K
3451 DOUBLE PRECISION P,V
3452
3453 COMMON/TIME/MV(23000,5)
3454 DOUBLE PRECISION MV
3455
3456 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
3457 DOUBLE PRECISION ZA,ZD,THETAA
3458 LOGICAL QQBARD
3459
3460 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
3461 &ALLHAD,compress,NF
3462 INTEGER NF
3463 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
3464 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
3465
3466 INTEGER L
3467 DOUBLE PRECISION Q2,QOLD2,R,PYR,PNOSPLIT1,PNOSPLIT2,Z,QA,
3468 &GETSUDAKOV,GETMASS,PKEEP,X,MASS,ZDEC,QTMP,ZOLD
3469 LOGICAL IN,QQBARDEC,QQBAROLD
3470 CHARACTER*2 TYP
3471
3472 IF(x*P(L,4).LT.Q0)THEN
3473 GETNEWMASS=0.d0
3474 ZDEC=0.d0
3475 QQBARDEC=.FALSE.
3476 RETURN
3477 ENDIF
3478 IF (-Q2.LT.Q0**2)THEN
3479 GETNEWMASS=0.d0
3480 RETURN
3481 ENDIF
3482 IF(K(L,2).EQ.21)THEN
3483 TYP='GC'
3484 ELSE
3485 TYP='QQ'
3486 ENDIF
3487 IF(SQRT(-QOLD2).LE.Q0)THEN
3488 IF(IN)THEN
3489 GETNEWMASS=GETMASS(0.d0,SQRT(-Q2),-1.d0,
3490 & X*P(L,4),TYP,X*P(L,4),IN,ZDEC,QQBARDEC)
3491 ELSE
3492 GETNEWMASS=GETMASS(0.d0,SQRT(-Q2),-1.d0,P(L,4),TYP,
3493 & SQRT(-Q2),IN,ZDEC,QQBARDEC)
3494 ENDIF
3495 GETNEWMASS=MIN(GETNEWMASS,X*P(L,4))
3496 RETURN
3497 ENDIF
3498 Z=1.d0
3499 QA=1.d0
3500 IF(MAX(P(L,5),MASS).GT.0.d0)THEN
3501 IF(-Q2.GT.-QOLD2)THEN
3502 ZOLD=ZDEC
3503 QQBAROLD=QQBARDEC
3504 QTMP=GETMASS(0.d0,SQRT(-Q2),-1.d0,X*P(L,4),TYP,
3505 & SQRT(-Q2),IN,ZDEC,QQBARDEC)
3506 IF(QTMP.LT.SQRT(-QOLD2))THEN
3507 GETNEWMASS=MASS
3508 ZDEC=ZOLD
3509 QQBARDEC=QQBAROLD
3510 ELSE
3511 GETNEWMASS=QTMP
3512 ENDIF
3513 ELSE
3514 PNOSPLIT1=GETSUDAKOV(SQRT(-QOLD2),QA,Q0,Z,X*P(L,4),
3515 & TYP,MV(L,4),IN)
3516 PNOSPLIT2=GETSUDAKOV(SQRT(-Q2),QA,Q0,Z,X*P(L,4),
3517 & TYP,MV(L,4),IN)
3518 PKEEP=(1.-PNOSPLIT2)/(1.-PNOSPLIT1)
3519 IF(PYR(0).LT.PKEEP)THEN
3520 IF(P(L,5).LT.SQRT(-Q2))THEN
3521 GETNEWMASS=MASS
3522 ELSE
3523 55 GETNEWMASS=GETMASS(Q0,SQRT(-Q2),-1.d0,X*P(L,4),TYP,
3524 & SQRT(-Q2),IN,ZDEC,QQBARDEC)
3525 IF((GETNEWMASS.EQ.0.d0).AND.(X*P(L,4).GT.Q0)) GOTO 55
3526 ENDIF
3527 ELSE
3528 GETNEWMASS=0.d0
3529 ZDEC=0.d0
3530 QQBARDEC=.FALSE.
3531 ENDIF
3532 ENDIF
3533 ELSE
3534 IF(-Q2.GT.-QOLD2)THEN
3535 GETNEWMASS=GETMASS(0.d0,SQRT(-Q2),-1.d0,
3536 & X*P(L,4),TYP,X*P(L,4),IN,ZDEC,QQBARDEC)
3537 if(getnewmass.lt.SQRT(-QOLD2))then
3538 GETNEWMASS=0.d0
3539 ZDEC=0.d0
3540 QQBARDEC=.FALSE.
3541 endif
3542 ELSE
3543 GETNEWMASS=0.d0
3544 ZDEC=0.d0
3545 QQBARDEC=.FALSE.
3546 ENDIF
3547 ENDIF
3548 GETNEWMASS=MIN(GETNEWMASS,x*P(L,4))
3549 END
3550
3551
3552
3553
3554
3555 DOUBLE PRECISION FUNCTION GETPNORAD1(LINE,x,y,z,t)
3556 IMPLICIT NONE
3557
3558 common/hepmcid/hpmcfid,logfid
3559 integer hpmcfid,logfid
3560
3561 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
3562 INTEGER N,NPAD,K
3563 DOUBLE PRECISION P,V
3564
3565 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
3566 &ALLHAD,compress,NF
3567 INTEGER NF
3568 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
3569 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
3570
3571 INTEGER LINE
3572 DOUBLE PRECISION UP,LOW,CCOL,SIGMATOT,GETSSCAT,GETXSECINT,
3573 &SCATPRIMFUNC,MS1,MD1,shat,pcms2,avmom(5),x,y,z,t,getmd
3574
3575 md1 = getmd(x,y,z,t)
3576 call avscatcen(x,y,z,t,
3577 &avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
3578 ms1 = avmom(5)
3579 shat = avmom(5)**2 + p(line,5)**2 + 2.*(avmom(4)*p(line,4)
3580 & -avmom(1)*p(line,1)-avmom(2)*p(line,2)-avmom(3)*p(line,3))
3581 pcms2 = (shat+p(line,5)**2-ms1**2)**2/(4.*shat)-p(line,5)**2
3582 up = 4.*pcms2
3583 LOW=Q0**2/SCALEFACM**2
3584 IF((UP.LE.LOW).OR.(P(LINE,4).LT.Q0/SCALEFACM))THEN
3585 GETPNORAD1=1.d0
3586 RETURN
3587 ENDIF
3588 IF(K(LINE,2).EQ.21)THEN
3589 CCOL=3./2.
3590
3591 SIGMATOT=GETSSCAT(P(LINE,4),p(line,1),p(line,2),p(line,3),
3592 & P(LINE,5),0.d0,'G','C',x,y,z,t,0)
3593 IF(SIGMATOT.EQ.0.d0)THEN
3594 GETPNORAD1=-1.d0
3595 RETURN
3596 ENDIF
3597 GETPNORAD1=(CCOL*(SCATPRIMFUNC(LOW,MD1)-
3598 &SCATPRIMFUNC(0.d0,MD1))
3599 & + GETXSECINT(UP,MD1,'GB'))/SIGMATOT
3600 ELSE
3601 CCOL=2./3.
3602
3603 SIGMATOT=GETSSCAT(P(LINE,4),p(line,1),p(line,2),p(line,3),
3604 & P(LINE,5),0.d0,'Q','C',x,y,z,t,0)
3605 IF(SIGMATOT.EQ.0.d0)THEN
3606 GETPNORAD1=1.d0
3607 RETURN
3608 ENDIF
3609 GETPNORAD1=(CCOL*(SCATPRIMFUNC(LOW,MD1)-
3610 &SCATPRIMFUNC(0.d0,MD1))
3611 & + GETXSECINT(UP,MD1,'QB'))/SIGMATOT
3612 ENDIF
3613 IF((GETPNORAD1.LT.-1.d-4).OR.(GETPNORAD1.GT.1.d0+1.d-4))THEN
3614 write(logfid,*)'error: P_norad=',GETPNORAD1,
3615 & P(LINE,4),P(LINE,5),LOW,UP,K(LINE,2),MD1
3616 ENDIF
3617 END
3618
3619
3620
3621
3622
3623 SUBROUTINE GETQVEC(L,J,DT,X)
3624 IMPLICIT NONE
3625
3626 common/hepmcid/hpmcfid,logfid
3627 integer hpmcfid,logfid
3628
3629 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
3630 INTEGER N,NPAD,K
3631 DOUBLE PRECISION P,V
3632
3633 COMMON/TIME/MV(23000,5)
3634 DOUBLE PRECISION MV
3635
3636 COMMON/COHERENT/NSTART,NEND,ALLQS(10000,6),SCATCENTRES(10000,10),
3637 &QSUMVEC(4),QSUM2
3638 INTEGER NSTART,NEND
3639 DOUBLE PRECISION ALLQS,SCATCENTRES,QSUMVEC,QSUM2
3640
3641 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
3642 LOGICAL DISCARD
3643 INTEGER NDISC,NSTRANGE,NGOOD,errcount
3644 double precision wdisc
3645
3646 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
3647 &ALLHAD,compress,NF
3648 INTEGER NF
3649 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
3650 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
3651
3652 INTEGER L,J,COUNTER,COUNTMAX,COUNT2,i
3653 DOUBLE PRECISION XSC,YSC,ZSC,TSC,GETMD,GETTEMP,DT,X,PYR,NEWMOM(4),
3654 &T,PT,MAXT,PHI2,BETA(3),PHI,THETA,GETT,PYP,PI,PT2,GETMS,
3655 &savemom(5),theta2,mb2,pz,kt2,phiq,maxt2,xi,md,shat,pcms2,
3656 &avmom(5)
3657 CHARACTER TYPS
3658 DATA PI/3.141592653589793d0/
3659 DATA COUNTMAX/1000/
3660
3661 IF (J.GT.10000)THEN
3662 discard = .true.
3663 return
3664 ENDIF
3665
3666 COUNTER=0
3667 COUNT2=0
3668
3669 XSC=MV(L,1)+DT*P(L,1)/P(L,4)
3670 YSC=MV(L,2)+DT*P(L,2)/P(L,4)
3671 ZSC=MV(L,3)+DT*P(L,3)/P(L,4)
3672 TSC=MV(L,4)+DT
3673 md = GETMD(XSC,YSC,ZSC,TSC)
3674
3675 call AVSCATCEN(xsc,ysc,zsc,tsc,
3676 &avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
3677
3678 do 210 i=1,5
3679 savemom(i) = p(l,i)
3680 210 continue
3681
3682 xi = sqrt(max(x**2*p(l,4)**2,p(l,5)**2) - p(l,5)**2)/pyp(l,8)
3683 p(l,1) = xi*p(l,1)
3684 p(l,2) = xi*p(l,2)
3685 p(l,3) = xi*p(l,3)
3686 p(l,4) = max(x*p(l,4),p(l,5))
3687
3688
3689 444 CALL GETSCATTERER(XSC,YSC,ZSC,TSC,
3690 &K(1,2),P(1,1),P(1,2),P(1,3),P(1,4),P(1,5))
3691 MV(1,1)=XSC
3692 MV(1,2)=YSC
3693 MV(1,3)=ZSC
3694 MV(1,4)=TSC
3695 TYPS='Q'
3696 IF(K(1,2).EQ.21)TYPS='G'
3697
3698 shat = avmom(5)**2 + savemom(5)**2 + 2.*(avmom(4)*savemom(4)
3699 & -avmom(1)*savemom(1)-avmom(2)*savemom(2)-avmom(3)*savemom(3))
3700 pcms2 = (shat+savemom(5)**2-avmom(5)**2)**2/(4.*shat)
3701 & -savemom(5)**2
3702 maxt = 4.*pcms2
3703
3704 K(1,1)=13
3705 SCATCENTRES(J,1)=K(1,2)
3706 SCATCENTRES(J,2)=P(1,1)
3707 SCATCENTRES(J,3)=P(1,2)
3708 SCATCENTRES(J,4)=P(1,3)
3709 SCATCENTRES(J,5)=P(1,4)
3710 SCATCENTRES(J,6)=P(1,5)
3711 SCATCENTRES(J,7)=MV(1,1)
3712 SCATCENTRES(J,8)=MV(1,2)
3713 SCATCENTRES(J,9)=MV(1,3)
3714 SCATCENTRES(J,10)=MV(1,4)
3715
3716 BETA(1)=P(1,1)/P(1,4)
3717 BETA(2)=P(1,2)/P(1,4)
3718 BETA(3)=P(1,3)/P(1,4)
3719 CALL PYROBO(L,L,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
3720 CALL PYROBO(1,1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
3721 THETA=PYP(L,13)
3722 PHI=PYP(L,15)
3723 CALL PYROBO(L,L,0d0,-PHI,0d0,0d0,0d0)
3724 CALL PYROBO(1,1,0d0,-PHI,0d0,0d0,0d0)
3725 CALL PYROBO(L,L,-THETA,0d0,0d0,0d0,0d0)
3726 CALL PYROBO(1,1,-THETA,0d0,0d0,0d0,0d0)
3727
3728 204 T=-GETT(0.d0,MAXT,md)
3729 202 NEWMOM(4)=P(L,4)+T/(2.*p(1,5))
3730 NEWMOM(3)=(T-2.*P(L,5)**2+2.*p(l,4)*NEWMOM(4))/(2.*P(L,3))
3731 PT2=NEWMOM(4)**2-NEWMOM(3)**2-P(L,5)**2
3732 IF(DABS(PT2).LT.1.d-10) PT2=0.d0
3733 IF(T.EQ.0.d0) PT2=0.d0
3734 IF(PT2.LT.0.d0)THEN
3735 T=0.d0
3736 GOTO 202
3737 ENDIF
3738 PT=SQRT(PT2)
3739 PHI2=PYR(0)*2*PI
3740 NEWMOM(1)=PT*COS(PHI2)
3741 NEWMOM(2)=PT*SIN(PHI2)
3742 P(1,1)=NEWMOM(1)-P(L,1)
3743 P(1,2)=NEWMOM(2)-P(L,2)
3744 P(1,3)=NEWMOM(3)-P(L,3)
3745 P(1,4)=NEWMOM(4)-P(L,4)
3746 P(1,5)=0.d0
3747
3748 CALL PYROBO(L,L,THETA,0d0,0d0,0d0,0d0)
3749 CALL PYROBO(1,1,THETA,0d0,0d0,0d0,0d0)
3750 CALL PYROBO(L,L,0d0,PHI,0d0,0d0,0d0)
3751 CALL PYROBO(1,1,0d0,PHI,0d0,0d0,0d0)
3752 CALL PYROBO(L,L,0d0,0d0,BETA(1),BETA(2),BETA(3))
3753 CALL PYROBO(1,1,0d0,0d0,BETA(1),BETA(2),BETA(3))
3754 ALLQS(J,1)=T
3755 ALLQS(J,2)=P(1,1)
3756 ALLQS(J,3)=P(1,2)
3757 ALLQS(J,4)=P(1,3)
3758 ALLQS(J,5)=P(1,4)
3759 QSUMVEC(1)=QSUMVEC(1)+ALLQS(NEND,2)
3760 QSUMVEC(2)=QSUMVEC(2)+ALLQS(NEND,3)
3761 QSUMVEC(3)=QSUMVEC(3)+ALLQS(NEND,4)
3762 QSUMVEC(4)=QSUMVEC(4)+ALLQS(NEND,5)
3763 QSUM2=QSUMVEC(4)**2-QSUMVEC(1)**2-QSUMVEC(2)**2-QSUMVEC(3)**2
3764 IF(QSUM2.GT.0.d0)THEN
3765 QSUMVEC(1)=QSUMVEC(1)-ALLQS(NEND,2)
3766 QSUMVEC(2)=QSUMVEC(2)-ALLQS(NEND,3)
3767 QSUMVEC(3)=QSUMVEC(3)-ALLQS(NEND,4)
3768 QSUMVEC(4)=QSUMVEC(4)-ALLQS(NEND,5)
3769 QSUM2=QSUMVEC(4)**2-QSUMVEC(1)**2-QSUMVEC(2)**2-QSUMVEC(3)**2
3770 IF(COUNTER.GT.COUNTMAX)THEN
3771 write(logfid,*)'GETQVEC unable to find q vector'
3772 ALLQS(J,1)=0.d0
3773 ALLQS(J,2)=0.d0
3774 ALLQS(J,3)=0.d0
3775 ALLQS(J,4)=0.d0
3776 ALLQS(J,5)=0.d0
3777 ELSE
3778 COUNTER=COUNTER+1
3779 GOTO 444
3780 ENDIF
3781 ENDIF
3782 do 211 i=1,5
3783 p(l,i) = savemom(i)
3784 211 continue
3785 END
3786
3787
3788
3789
3790 SUBROUTINE DOKINEMATICS(L,lold,N1,N2,NEWM,RETRYSPLIT,
3791 & TIME,X,Z,QQBAR)
3792 IMPLICIT NONE
3793
3794 common/hepmcid/hpmcfid,logfid
3795 integer hpmcfid,logfid
3796
3797 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
3798 INTEGER N,NPAD,K
3799 DOUBLE PRECISION P,V
3800
3801 COMMON/TIME/MV(23000,5)
3802 DOUBLE PRECISION MV
3803
3804 COMMON/FTIMEFAC/FTFAC
3805 DOUBLE PRECISION FTFAC
3806
3807 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
3808 INTEGER TRIP,ANTI,COLMAX
3809
3810 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
3811 &ALLHAD,compress,NF
3812 INTEGER NF
3813 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
3814 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
3815
3816 COMMON/DISC/NDISC,NSTRANGE,NGOOD,errcount,wdisc,DISCARD
3817 LOGICAL DISCARD
3818 INTEGER NDISC,NSTRANGE,NGOOD,errcount
3819 double precision wdisc
3820
3821 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
3822 DOUBLE PRECISION ZA,ZD,THETAA
3823 LOGICAL QQBARD
3824
3825 COMMON/COHERENT/NSTART,NEND,ALLQS(10000,6),SCATCENTRES(10000,10),
3826 &QSUMVEC(4),QSUM2
3827 INTEGER NSTART,NEND
3828 DOUBLE PRECISION ALLQS,SCATCENTRES,QSUMVEC,QSUM2
3829
3830 COMMON/CHECK/NSCAT,NSCATEFF,NSPLIT
3831 DOUBLE PRECISION NSCAT,NSCATEFF,NSPLIT
3832
3833 COMMON/WEIGHT/EVWEIGHT,sumofweights
3834 double precision EVWEIGHT,sumofweights
3835
3836 common/storescatcen/nscatcen,maxnscatcen,scatflav(10000),
3837 &scatcen(10000,5),writescatcen,writedummies
3838 integer nscatcen,maxnscatcen,scatflav
3839 double precision scatcen
3840 logical writescatcen,writedummies
3841
3842 INTEGER L,LINE,N1,N2,J,DIR,lold,nold,colmaxold,statold,nscatcenold
3843 DOUBLE PRECISION PYR,PI,BETA(3),THETA,PHI,PYP,PHI2,MAXT,T,
3844 &NEWMASS,DELTAM,DM,TTOT,DMLEFT,LAMBDA,TIME,ENDTIME,X,tmp,
3845 &m32,newm2,shat,theta2,z,gettemp,E3new,E4new,p32,p42,p3old,
3846 &newm,mass2,enew,pt2,pt,pl,m12,firsttime,pcms2
3847 CHARACTER*2 TYP
3848 LOGICAL RETRYSPLIT,QQBAR,QQBARDEC,rejectt,redokin,reshuffle
3849 DATA PI/3.141592653589793d0/
3850
3851 IF((N+2*(n2-n1+1)).GT.22990)THEN
3852 write(logfid,*)'event too long for event record'
3853 DISCARD=.TRUE.
3854 RETURN
3855 ENDIF
3856
3857 firsttime = mv(l,5)
3858
3859 redokin = .false.
3860
3861 newm2=newm
3862 nold=n
3863 colmaxold=colmax
3864 statold=k(l,1)
3865 204 DELTAM=NEWM2-P(L,5)
3866 DMLEFT=DELTAM
3867
3868 TTOT=0.d0
3869 DO 220 J=N1,N2
3870 TTOT=TTOT+ALLQS(J,1)
3871 220 CONTINUE
3872
3873 LINE=L
3874
3875 DO 222 J=N1,N2
3876
3877
3878 IF(K(LINE,2).EQ.21)THEN
3879 TYP='GC'
3880 IF(PYR(0).LT.0.5)THEN
3881 DIR=1
3882 ELSE
3883 DIR=-1
3884 ENDIF
3885 ELSE
3886 TYP='QQ'
3887 DIR=0
3888 ENDIF
3889 K(1,1)=6
3890 K(1,2)=SCATCENTRES(J,1)
3891 P(1,1)=SCATCENTRES(J,2)
3892 P(1,2)=SCATCENTRES(J,3)
3893 P(1,3)=SCATCENTRES(J,4)
3894 P(1,4)=SCATCENTRES(J,5)
3895 P(1,5)=SCATCENTRES(J,6)
3896 MV(1,1)=SCATCENTRES(J,7)
3897 MV(1,2)=SCATCENTRES(J,8)
3898 MV(1,3)=SCATCENTRES(J,9)
3899 MV(1,4)=SCATCENTRES(J,10)
3900 T=ALLQS(J,1)
3901 if (t.eq.0.d0) then
3902 rejectt = .true.
3903 else
3904 rejectt = .false.
3905 endif
3906
3907
3908 BETA(1)=(P(1,1)+p(line,1))/(P(1,4)+p(line,4))
3909 BETA(2)=(P(1,2)+p(line,2))/(P(1,4)+p(line,4))
3910 BETA(3)=(P(1,3)+p(line,3))/(P(1,4)+p(line,4))
3911 IF ((BETA(1).GT.1.d0).OR.(BETA(2).GT.1.d0).OR.(BETA(3).GT.1.d0)
3912 & .or.(sqrt(beta(1)**2+beta(2)**2+beta(3)**2).gt.1.d0))THEN
3913 reshuffle = .false.
3914 else
3915 reshuffle = .true.
3916 endif
3917 205 if (.not.reshuffle) then
3918 BETA(1)=P(1,1)/P(1,4)
3919 BETA(2)=P(1,2)/P(1,4)
3920 BETA(3)=P(1,3)/P(1,4)
3921 CALL PYROBO(LINE,LINE,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
3922 CALL PYROBO(1,1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
3923 THETA=PYP(LINE,13)
3924 PHI=PYP(LINE,15)
3925 CALL PYROBO(LINE,LINE,0d0,-PHI,0d0,0d0,0d0)
3926 CALL PYROBO(1,1,0d0,-PHI,0d0,0d0,0d0)
3927 CALL PYROBO(LINE,LINE,-THETA,0d0,0d0,0d0,0d0)
3928 CALL PYROBO(1,1,-THETA,0d0,0d0,0d0,0d0)
3929
3930 maxt = -2.*p(1,5)*p(line,4)
3931 if (t.lt.maxt) then
3932 t=0.d0
3933 rejectt = .true.
3934 endif
3935 m12 = -p(line,5)**2
3936 203 enew = p(line,4)+t/(2.*p(1,5))
3937 pl = (t+2.*p(line,4)*enew-2.*m12)/(2.*p(line,3))
3938 pt2 = enew**2-pl**2-m12
3939 if (t.eq.0.d0) pt2 = 0.d0
3940 if (dabs(pt2).lt.1.d-8) pt2 = 0.d0
3941 if (pt2.lt.0.d0) then
3942 write(logfid,*)' This should not have happened: pt^2<0!'
3943 write(logfid,*)t,enew,pl,pt2
3944 t = 0.d0
3945 rejectt = .true.
3946 goto 203
3947 endif
3948 pt = sqrt(pt2)
3949 phi2 = pyr(0)*2.*pi
3950 n=n+2
3951 p(n,1)=pt*cos(phi2)
3952 p(n,2)=pt*sin(phi2)
3953 p(n,3)=pl
3954 p(n,4)=enew
3955 p(n,5)=p(line,5)
3956 !---------------------------------
3957 P(N-1,1)=P(1,1)+P(LINE,1)-P(N,1)
3958 P(N-1,2)=P(1,2)+P(LINE,2)-P(N,2)
3959 P(N-1,3)=P(1,3)+P(LINE,3)-P(N,3)
3960 P(N-1,4)=P(1,4)+P(LINE,4)-P(N,4)
3961 mass2 = P(N-1,4)**2-P(N-1,1)**2-P(N-1,2)**2-P(N-1,3)**2
3962 if ((mass2.lt.0.d0).and.(mass2.gt.-1.-6)) mass2=0.d0
3963 if (mass2.lt.0.d0)
3964 & write(logfid,*)'messed up scattering centres mass^2: ',
3965 & mass2,p(1,5)**2
3966 P(N-1,5)=SQRT(mass2)
3967 if (abs(p(n-1,5)-p(1,5)).gt.1.d-6)
3968 & write(logfid,*)'messed up scattering centres mass: ',
3969 & p(n-1,5),p(1,5),p(l,5)
3970 call flush(logfid)
3971 !---------------------------------
3972 ! P(N-1,1)=P(1,1)
3973 ! P(N-1,2)=P(1,2)
3974 ! P(N-1,3)=P(1,3)
3975 ! P(N-1,4)=P(1,4)
3976 ! P(N-1,5)=P(1,5)
3977 !---------------------------------
3978 else
3979 CALL PYROBO(LINE,LINE,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
3980 CALL PYROBO(1,1,0d0,0d0,-BETA(1),-BETA(2),-BETA(3))
3981 if ((p(1,4).lt.0.d0).or.(p(line,4).lt.0.d0)) then
3982 CALL PYROBO(1,1,0d0,0d0,BETA(1),BETA(2),BETA(3))
3983 CALL PYROBO(LINE,LINE,0d0,0d0,BETA(1),BETA(2),BETA(3))
3984 reshuffle = .false.
3985 goto 205
3986 endif
3987 THETA=PYP(LINE,13)
3988 PHI=PYP(LINE,15)
3989 CALL PYROBO(LINE,LINE,0d0,-PHI,0d0,0d0,0d0)
3990 CALL PYROBO(1,1,0d0,-PHI,0d0,0d0,0d0)
3991 CALL PYROBO(LINE,LINE,-THETA,0d0,0d0,0d0,0d0)
3992 CALL PYROBO(1,1,-THETA,0d0,0d0,0d0,0d0)
3993 shat = (p(1,4)+p(line,4))**2
3994 p3old = p(line,3)
3995
3996 maxt = -4.*p(line,3)**2
3997 if (t.lt.maxt) then
3998 t=0.d0
3999 rejectt = .true.
4000 endif
4001 theta2 = acos(1.d0+t/(2.*p(line,3)**2))
4002 phi2 = pyr(0)*2.*pi
4003 n=n+2
4004 p(n,1)=p(line,3)*sin(theta2)*cos(phi2)
4005 p(n,2)=p(line,3)*sin(theta2)*sin(phi2)
4006 p(n,3)=p(line,3)*cos(theta2)
4007 p(n,4)=p(line,4)
4008 p(n,5)=p(line,5)
4009 !---------------------------------
4010 P(N-1,1)=P(1,1)+P(LINE,1)-P(N,1)
4011 P(N-1,2)=P(1,2)+P(LINE,2)-P(N,2)
4012 P(N-1,3)=P(1,3)+P(LINE,3)-P(N,3)
4013 P(N-1,4)=P(1,4)+P(LINE,4)-P(N,4)
4014 mass2 = P(N-1,4)**2-P(N-1,1)**2-P(N-1,2)**2-P(N-1,3)**2
4015 if ((mass2.lt.0.d0).and.(mass2.gt.-1.-6)) mass2=0.d0
4016 if (mass2.lt.0.d0)
4017 & write(logfid,*)'messed up scattering centres mass^2: ',
4018 & mass2,p(1,5)**2
4019 P(N-1,5)=SQRT(mass2)
4020 if (abs(p(n-1,5)-p(1,5)).gt.1.d-6)
4021 & write(logfid,*)'messed up scattering centres mass: ',
4022 & p(n-1,5),p(1,5),p(l,5)
4023 call flush(logfid)
4024 !---------------------------------
4025 ! P(N-1,1)=P(1,1)
4026 ! P(N-1,2)=P(1,2)
4027 ! P(N-1,3)=P(1,3)
4028 ! P(N-1,4)=P(1,4)
4029 ! P(N-1,5)=P(1,5)
4030 !---------------------------------
4031 endif
4032
4033 ZA(N)=1.d0
4034 THETAA(N)=-1.d0
4035 ZD(N)=Z
4036 QQBARD(N)=QQBAR
4037 K(N,1)=K(LINE,1)
4038 K(N,2)=K(LINE,2)
4039 K(N,3)=L
4040 K(N,4)=0
4041 K(N,5)=0
4042 IF(ALLHAD.and.(.not.rejectt))THEN
4043 IF(K(N,2).EQ.21)THEN
4044 IF(DIR.EQ.1)THEN
4045 TRIP(N)=COLMAX+1
4046 ANTI(N)=ANTI(LINE)
4047 ELSE
4048 TRIP(N)=TRIP(LINE)
4049 ANTI(N)=COLMAX+1
4050 ENDIF
4051 ELSEIF(K(N,2).GT.0)THEN
4052 TRIP(N)=COLMAX+1
4053 ANTI(N)=0
4054 ELSE
4055 TRIP(N)=0
4056 ANTI(N)=COLMAX+1
4057 ENDIF
4058 COLMAX=COLMAX+1
4059 ELSE
4060 TRIP(N)=TRIP(LINE)
4061 ANTI(N)=ANTI(LINE)
4062 ENDIF
4063
4064 IF(K(LINE,1).EQ.1)THEN
4065 K(LINE,1)=12
4066 ELSE
4067 K(LINE,1)=14
4068 ENDIF
4069 K(LINE,4)=N-1
4070 K(LINE,5)=N
4071
4072 ZA(N-1)=1.d0
4073 THETAA(N-1)=-1.d0
4074 ZD(N-1)=-1.d0
4075 QQBARD(N-1)=.false.
4076
4077 K(N-1,1)=3
4078 K(N-1,2)=21
4079 K(N-1,3)=0
4080 K(N-1,4)=0
4081 K(N-1,5)=0
4082 IF(ALLHAD.and.(.not.rejectt))THEN
4083 IF((K(N,2).GT.0).AND.(DIR.GE.0))THEN
4084 TRIP(N-1)=TRIP(LINE)
4085 ANTI(N-1)=TRIP(N)
4086 ELSE
4087 TRIP(N-1)=ANTI(N)
4088 ANTI(N-1)=ANTI(LINE)
4089 ENDIF
4090 ELSE
4091 TRIP(N-1)=0
4092 ANTI(N-1)=0
4093 ENDIF
4094
4095 if (reshuffle.and.(dm.gt.0.d0)) then
4096
4097
4098 IF(TTOT.EQ.0.d0)THEN
4099 DM=0.d0
4100 ELSE
4101 if (dmleft.lt.0.d0) then
4102 DM=max(DMLEFT*T/TTOT*1.5d0,dmleft)
4103 else
4104 DM=min(DMLEFT*T/TTOT*1.5d0,dmleft)
4105 endif
4106 ENDIF
4107 TTOT=TTOT-ALLQS(J,1)
4108
4109 newmass = p(n,5)+dm
4110 if (newmass.lt.0.d0) then
4111 m32 = -NEWMASS**2
4112 else
4113 m32 = NEWMASS**2
4114 endif
4115 E3new = (shat + m32 - p(1,5)**2)/(2.d0*sqrt(shat))
4116 E4new = (shat - m32 + p(1,5)**2)/(2.d0*sqrt(shat))
4117 p32 = E3new**2 - m32
4118 p42 = E4new**2 - p(1,5)**2
4119 if ((p32.lt.0.d0).or.(p42.lt.0.d0).or.
4120 & (E3new.lt.0.d0).or.(E4new.lt.0.d0)) then
4121 p32 = 0.d0
4122 p42 = 0.d0
4123 E4new = p(n-1,5)
4124 E3new = sqrt(shat) - E4new
4125 m32 = E3new**2
4126 if ((E3new.lt.0.d0).or.(E4new.lt.0.d0)) then
4127 E3new = p(n,4)
4128 E4new = p(n-1,4)
4129 p32 = p3old**2
4130 p42 = p3old**2
4131 if (p(n,5).lt.0.d0) then
4132 m32 = -p(n,5)**2
4133 else
4134 m32 = p(n,5)**2
4135 endif
4136 endif
4137 endif
4138 p(n,1) = sqrt(p32)*p(n,1)/p3old
4139 p(n,2) = sqrt(p32)*p(n,2)/p3old
4140 p(n,3) = sqrt(p32)*p(n,3)/p3old
4141 p(n,4) = E3new
4142 p(n,5) = sign(sqrt(abs(m32)),newmass)
4143 tmp = p(n,4)**2-p(n,1)**2-p(n,2)**2-p(n,3)**2
4144 if (abs(tmp-m32).gt.1.d-6)
4145 & write(logfid,*) 'Oups, messed up projectiles mass:',
4146 & tmp,m32,p(n,5)
4147 !---------------------------------
4148 p(n-1,1) = sqrt(p42)*p(n-1,1)/p3old
4149 p(n-1,2) = sqrt(p42)*p(n-1,2)/p3old
4150 p(n-1,3) = sqrt(p42)*p(n-1,3)/p3old
4151 p(n-1,4) = E4new
4152 tmp = p(n-1,4)**2-p(n-1,1)**2-p(n-1,2)**2-p(n-1,3)**2
4153 & -p(n-1,5)**2
4154 if (abs(tmp).gt.1.d-6)
4155 & write(logfid,*) 'Oups, messed up scattering centres mass:',
4156 & tmp,p3old,p(n-1,1),p(n-1,2),p(n-1,3),p(n-1,4),p(n-1,5)
4157 if ((abs(p(n,1)+p(n-1,1)).gt.1.d-6).or.
4158 & (abs(p(n,2)+p(n-1,2)).gt.1.d-6).or.
4159 & (abs(p(n,3)+p(n-1,3)).gt.1.d-6))
4160 & write(logfid,*) 'Oups, momentum not conserved',
4161 & p(n,1)+p(n-1,1),p(n,2)+p(n-1,2),p(n,3)+p(n-1,3)
4162 !---------------------------------
4163 ! P(N-1,1)=P(1,1)
4164 ! P(N-1,2)=P(1,2)
4165 ! P(N-1,3)=P(1,3)
4166 ! P(N-1,4)=P(1,4)
4167 ! P(N-1,5)=P(1,5)
4168 !---------------------------------
4169 endif
4170
4171
4172 CALL PYROBO(N-1,N,THETA,0d0,0d0,0d0,0d0)
4173 CALL PYROBO(LINE,LINE,THETA,0d0,0d0,0d0,0d0)
4174 CALL PYROBO(N-1,N,0d0,PHI,0d0,0d0,0d0)
4175 CALL PYROBO(LINE,LINE,0d0,PHI,0d0,0d0,0d0)
4176 CALL PYROBO(N-1,N,0d0,0d0,BETA(1),BETA(2),BETA(3))
4177 CALL PYROBO(LINE,LINE,0d0,0d0,BETA(1),BETA(2),BETA(3))
4178 CALL PYROBO(1,1,THETA,0d0,0d0,0d0,0d0)
4179 CALL PYROBO(1,1,0d0,PHI,0d0,0d0,0d0)
4180 CALL PYROBO(1,1,0d0,0d0,BETA(1),BETA(2),BETA(3))
4181 if (.not.allhad) then
4182 k(n-1,1)=13
4183 else
4184 IF(SCATRECOIL.AND.(P(N-1,4).GT.(10.*3.*
4185 &GETTEMP(MV(1,1),MV(1,2),MV(1,3),MV(1,4)))))THEN
4186 K(N-1,1)=2
4187 ELSE
4188 K(N-1,1)=3
4189 ENDIF
4190 endif
4191 if (rejectt) k(n-1,1)=11
4192 MV(N,4)=MV(1,4)
4193 MV(N-1,4)=MV(1,4)
4194
4195 MV(N-1,1)=MV(line,1)
4196 & +(MV(N-1,4)-MV(line,4))*P(line,1)/max(pyp(line,8),P(line,4))
4197 MV(N-1,2)=MV(line,2)
4198 & +(MV(N-1,4)-MV(line,4))*P(line,2)/max(pyp(line,8),P(line,4))
4199 MV(N-1,3)=MV(line,3)
4200 & +(MV(N-1,4)-MV(line,4))*P(line,3)/max(pyp(line,8),P(line,4))
4201 MV(N, 1)=MV(line,1)
4202 & +(MV(N, 4)-MV(line,4))*P(line,1)/max(pyp(line,8),P(line,4))
4203 MV(N, 2)=MV(line,2)
4204 & +(MV(N, 4)-MV(line,4))*P(line,2)/max(pyp(line,8),P(line,4))
4205 MV(N, 3)=MV(line,3)
4206 & +(MV(N, 4)-MV(line,4))*P(line,3)/max(pyp(line,8),P(line,4))
4207 IF(P(N-1,5).GT.P(1,5))THEN
4208 LAMBDA=1.d0/(FTFAC*0.2*P(N-1,4)/P(N-1,5)**2)
4209 MV(N-1,5)=MV(N-1,4)-LOG(1.d0-PYR(0))/LAMBDA
4210 ELSE
4211 MV(N-1,5)=0.d0
4212 ENDIF
4213 IF(J.LT.N2)THEN
4214 MV(N,5)=SCATCENTRES(J+1,10)
4215 ELSE
4216 IF(P(N,5).GT.0.d0)THEN
4217 IF(DELTAM.EQ.0.d0)THEN
4218 ENDTIME=firsttime
4219 ELSE
4220 IF(X.LT.1.d0)THEN
4221 LAMBDA=1.d0/(FTFAC*P(N,4)*0.2/P(N,5)**2)
4222 ENDTIME=SCATCENTRES(J,10)-LOG(1.d0-PYR(0))/LAMBDA
4223 ELSE
4224 ENDTIME=TIME
4225 ENDIF
4226 ENDIF
4227 MV(N,5)=ENDTIME
4228 ELSE
4229 MV(N,5)=0.d0
4230 ENDIF
4231 ENDIF
4232 MV(LINE,5)=ALLQS(J,6)
4233
4234
4235
4236 if (writescatcen.and.(.not.rejectt).and.
4237 & (nscatcen.lt.maxnscatcen)) then
4238 nscatcen = nscatcen+1
4239 if (nscatcen.le.maxnscatcen) then
4240 scatflav(nscatcen) = k(1,2)
4241 scatcen(nscatcen,1) = p(1,1)
4242 scatcen(nscatcen,2) = p(1,2)
4243 scatcen(nscatcen,3) = p(1,3)
4244 scatcen(nscatcen,4) = p(1,4)
4245 scatcen(nscatcen,5) = p(1,5)
4246 else
4247 write(logfid,*)
4248 &'WARNING: no room left to store further scattering centres'
4249 endif
4250 endif
4251
4252 ! if ((p(line,4).gt.100.d0).and.(p(n,4)-p(line,4).gt.1.d0)) then
4253 ! write(*,*)p(line,1),p(line,2),p(line,3),p(line,4),p(line,5)
4254 ! write(*,*)p(n,1),p(n,2),p(n,3),p(n,4),p(n,5)
4255 ! write(*,*)p(1,1),p(1,2),p(1,3),p(1,4),p(1,5)
4256 ! write(*,*)p(n-1,1),p(n-1,2),p(n-1,3),p(n-1,4),p(n-1,5)
4257 ! write(*,*)t
4258 ! write(*,*)GETTEMP(MV(1,1),MV(1,2),MV(1,3),MV(1,4))
4259 ! write(*,*)
4260 ! endif
4261
4262 DMLEFT=DMLEFT-(p(n,5)-P(LINE,5))
4263 LINE=N
4264 tmp = abs(p(n,4)**2-p(n,1)**2-p(n,2)**2-p(n,3)**2)-p(n,5)**2
4265 if (abs(tmp).ge.1.d-6)
4266 & write(logfid,*)tmp,j,p(l,5),p(line,5),p(n,5)
4267 222 CONTINUE
4268 if (p(n,5).lt.0.d0) then
4269 RETRYSPLIT=.TRUE.
4270 return
4271 endif
4272 if (p(n,5).ne.newm2) then
4273 RETRYSPLIT=.TRUE.
4274 redokin = .true.
4275 n=nold
4276 colmax=colmaxold
4277 k(l,1)=statold
4278 if (p(l,5).le.0.d0) then
4279 newm2 = 0.d0
4280 else
4281 if (p(l,5).lt.q0) then
4282 if ((newm2.eq.newm).and.(newm.ne.q0+1.d-6)) then
4283 newm2=q0+1.d-6
4284 else
4285 RETRYSPLIT=.TRUE.
4286 return
4287 endif
4288 else
4289 newm2=p(l,5)
4290 endif
4291 n2=n1
4292 endif
4293 goto 204
4294 endif
4295 if ((k(n,1).eq.1).and.
4296 & ((p(n,5).lt.0.d0).or.((p(n,5).gt.0.d0).and.(p(n,5).lt.q0))))
4297 &write(logfid,*)'dokinematics did not reach sensible mass: ',
4298 &p(n,5),newm,p(l,5),newm2
4299 NSCATEFF=NSCATEFF+EVWEIGHT
4300 END
4301
4302
4303
4304
4305
4306
4307 DOUBLE PRECISION FUNCTION GETPROBA(QI,QF,QAA,ZAA,EBB,TYPE,
4308 & T1,INS2)
4309 IMPLICIT NONE
4310
4311 COMMON/SUDAINT/QA,ZA2,EB,T,INSTATE,TYP
4312 DOUBLE PRECISION QA,ZA2,EB,T
4313 CHARACTER*2 TYP
4314 LOGICAL INSTATE
4315
4316 DOUBLE PRECISION QI,QF,QAA,ZAA,EBB,GETSUDAKOV,DERIV,T1
4317 CHARACTER*2 TYPE
4318 LOGICAL INS2
4319
4320 QA=QAA
4321 ZA2=ZAA
4322 EB=EBB
4323 TYP=TYPE
4324 T=T1
4325 INSTATE=INS2
4326 GETPROBA=GETSUDAKOV(QI,QAA,QF,ZAA,EBB,TYPE,T1,INS2)
4327 & *DERIV(QF,1)
4328 END
4329
4330
4331
4332
4333
4334 DOUBLE PRECISION FUNCTION GETSUDAKOV(QMAX1,QA1,QB1,ZA1,EB1,
4335 & TYPE3,T2,INS)
4336 IMPLICIT NONE
4337
4338 common/hepmcid/hpmcfid,logfid
4339 integer hpmcfid,logfid
4340
4341 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4342 &ALLHAD,compress,NF
4343 INTEGER NF
4344 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4345 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4346
4347 COMMON/SUDAINT/QA,ZA2,EB,T,INSTATE,TYP
4348 DOUBLE PRECISION QA,ZA2,EB,T
4349 CHARACTER*2 TYP
4350 LOGICAL INSTATE
4351
4352 DOUBLE PRECISION QMAX1,QA1,QB1,ZA1,EB1,TMAX,TB,YSTART,EPSI,
4353 &HFIRST,T2,GETINSUDAFAST,QB2
4354 CHARACTER*2 TYPE3
4355 LOGICAL INS
4356 DATA EPSI/1.d-4/
4357
4358 QB2=QB1
4359 IF(INS)THEN
4360 IF(QB2.LT.Q0) write(logfid,*) 'error: Q < Q0',QB2,QMAX1
4361 IF(QB2.LT.(Q0+1.d-10)) QB2=QB2+1.d-10
4362 ELSE
4363 IF(QB2.LT.Q0) write(logfid,*) 'error: Q < min',QB2,QMAX1
4364 IF(QB2.LT.(Q0+1.d-10)) QB2=QB2+1.d-10
4365 ENDIF
4366 IF(QB2.GE.(QMAX1-1.d-10)) THEN
4367 GETSUDAKOV=1.d0
4368 ELSE
4369 IF(INS)THEN
4370 GETSUDAKOV=GETINSUDAFAST(QB1,QMAX1,TYPE3)
4371 ELSE
4372 QA=QA1
4373 ZA2=ZA1
4374 EB=EB1
4375 TYP=TYPE3
4376 T=T2
4377 INSTATE=.FALSE.
4378 HFIRST=0.01*(QMAX1-QB1)
4379 YSTART=0.d0
4380 CALL ODEINT(YSTART,QB2,QMAX1,EPSI,HFIRST,0.d0,1)
4381 GETSUDAKOV=EXP(-YSTART)
4382 ENDIF
4383 ENDIF
4384 END
4385
4386
4387
4388
4389
4390 DOUBLE PRECISION FUNCTION GETINSUDAKOV(QB,QMAX1,TYPE3)
4391 IMPLICIT NONE
4392
4393 common/hepmcid/hpmcfid,logfid
4394 integer hpmcfid,logfid
4395
4396 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4397 &ALLHAD,compress,NF
4398 INTEGER NF
4399 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4400 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4401
4402 COMMON/SUDAINT/QA,ZA2,EB,T,INSTATE,TYP
4403 DOUBLE PRECISION QA,ZA2,EB,T
4404 CHARACTER*2 TYP
4405 LOGICAL INSTATE
4406
4407 DOUBLE PRECISION QMAX1,QB,QB1,ZA1,EA1,YSTART,EPSI,
4408 &HFIRST
4409 CHARACTER*2 TYPE3
4410 DATA EPSI/1.d-4/
4411
4412 QB1=QB
4413 IF(QB1.LT.Q0) write(logfid,*) 'error: Q < Q0',QB1,QMAX1
4414 IF(QB1.LT.(Q0+1.d-12)) QB1=QB1+1.d-12
4415 IF(QB1.GE.(QMAX1-1.d-12)) THEN
4416 GETINSUDAKOV=1.d0
4417 ELSE
4418 TYP=TYPE3
4419 HFIRST=0.01*(QMAX1-QB1)
4420 YSTART=0.d0
4421 CALL ODEINT(YSTART,QB1,QMAX1,EPSI,HFIRST,0.d0,6)
4422 GETINSUDAKOV=EXP(-YSTART)
4423 ENDIF
4424 END
4425
4426
4427
4428
4429
4430 DOUBLE PRECISION FUNCTION DERIV(XVAL,W4)
4431 IMPLICIT NONE
4432
4433 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4434 &ALLHAD,compress,NF
4435 INTEGER NF
4436 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4437 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4438
4439 COMMON/INTSPLITF/QQUAD,FM
4440 DOUBLE PRECISION QQUAD,FM
4441
4442 COMMON/SUDAINT/QA,ZA2,EB,T,INSTATE,TYP
4443 DOUBLE PRECISION QA,ZA2,EB,T
4444 CHARACTER*2 TYP
4445 LOGICAL INSTATE
4446
4447 COMMON/PDFINTV/XMAX,Z
4448 DOUBLE PRECISION XMAX,Z
4449
4450 COMMON/XSECV/QLOW,MDX
4451 DOUBLE PRECISION QLOW,MDX
4452
4453 INTEGER W4
4454 DOUBLE PRECISION XVAL,GETSPLITI,PI,ALPHAS,GETINSPLITI,
4455 &GETINSUDAFAST,SCATPRIMFUNC,PQQ,PQG,PGG,PGQ,
4456 &MEDDERIV
4457 DATA PI/3.141592653589793d0/
4458
4459 IF(W4.EQ.1)THEN
4460
4461 IF(INSTATE)THEN
4462 DERIV=2.*GETINSPLITI(XVAL,TYP)/XVAL
4463 ELSE
4464 DERIV=2.*GETSPLITI(QA,XVAL,ZA2,EB,TYP)/XVAL
4465 ENDIF
4466 ELSEIF(W4.EQ.2)THEN
4467
4468 DERIV=(1.+FM)*ALPHAS(XVAL*(1.-XVAL)*QQUAD/1.,LPS)*
4469 & PQQ(XVAL)/(2.*PI)
4470 ELSEIF(W4.EQ.3)THEN
4471
4472 DERIV=(1.+FM)*ALPHAS(XVAL*(1.-XVAL)*QQUAD/1.,LPS)
4473 & *PGG(XVAL)/(2.*PI)
4474 ELSEIF(W4.EQ.4)THEN
4475
4476 DERIV=(1.+FM)*ALPHAS(XVAL*(1-XVAL)*QQUAD/1.,LPS)*
4477 & PQG(XVAL)/(2.*PI)
4478 ELSEIF(W4.EQ.5)THEN
4479 DERIV=EXP(-XVAL)/XVAL
4480 ELSEIF(W4.EQ.6)THEN
4481 DERIV=2.*GETINSPLITI(XVAL,TYP)/XVAL
4482 ELSEIF(W4.EQ.7)THEN
4483 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'QQ')
4484 & *ALPHAS((1.-Z)*XVAL**2/1.,LPS)
4485 & *PQQ(Z)/(2.*PI*XVAL)
4486 ELSEIF(W4.EQ.8)THEN
4487 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'GC')
4488 & *ALPHAS((1.-Z)*XVAL**2/1.,LPS)
4489 & *PGQ(Z)/(2.*PI*XVAL)
4490 ELSEIF(W4.EQ.9)THEN
4491 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'QQ')
4492 & *ALPHAS((1.-Z)*XVAL**2/1.,LPS)
4493 & *PQG(Z)/(2.*PI*XVAL)
4494 ELSEIF(W4.EQ.10)THEN
4495 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'GC')
4496 & *ALPHAS((1.-Z)*XVAL**2/1.,LPS)*
4497 & *2.*PGG(Z)/(2.*PI*XVAL)
4498 ELSEIF(W4.EQ.11)THEN
4499 DERIV=3.*GETINSPLITI(SCALEFACM*SQRT(XVAL),'GQ')
4500 & *SCATPRIMFUNC(XVAL,MDX)/(2.*XVAL)
4501 ELSEIF(W4.EQ.12)THEN
4502 DERIV=2.*GETINSPLITI(SCALEFACM*SQRT(XVAL),'QG')
4503 & *SCATPRIMFUNC(XVAL,MDX)/(3.*XVAL)
4504 ELSEIF(W4.EQ.13)THEN
4505 DERIV=GETINSUDAFAST(QLOW,SCALEFACM*SQRT(XVAL),'GC')
4506 & *3.*2.*PI*ALPHAS(XVAL+MDX**2,LQCD)**2/(2.*(XVAL+MDX**2)**2)
4507 ELSEIF(W4.EQ.14)THEN
4508 DERIV=GETINSUDAFAST(QLOW,SCALEFACM*SQRT(XVAL),'QQ')
4509 & *2.*2.*PI*ALPHAS(XVAL+MDX**2,LQCD)**2/(3.*(XVAL+MDX**2)**2)
4510 ELSEIF(W4.EQ.21)THEN
4511 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'QQ')*GETINSPLITI(XVAL,'QQ')
4512 & /XVAL
4513 ELSEIF(W4.EQ.22)THEN
4514 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'GC')*GETINSPLITI(XVAL,'GQ')
4515 & /XVAL
4516 ELSEIF(W4.EQ.23)THEN
4517 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'QQ')*GETINSPLITI(XVAL,'QG')
4518 & /XVAL
4519 ELSEIF(W4.EQ.24)THEN
4520 DERIV=2.*GETINSUDAFAST(XVAL,XMAX,'GC')*2.
4521 & *GETINSPLITI(XVAL,'GG')/XVAL
4522 ELSE
4523 DERIV=MEDDERIV(XVAL,W4-100)
4524 ENDIF
4525 END
4526
4527
4528
4529
4530
4531 DOUBLE PRECISION FUNCTION GETSPLITI(QA,QB,ZETA,EB,TYPE1)
4532 IMPLICIT NONE
4533
4534 common/hepmcid/hpmcfid,logfid
4535 integer hpmcfid,logfid
4536
4537 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4538 &ALLHAD,compress,NF
4539 INTEGER NF
4540 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4541 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4542
4543 COMMON/SPLITINT/SPLITIGGV(1000,1000),SPLITIQQV(1000,1000),
4544 &SPLITIQGV(1000,1000),QVAL(1000),ZMVAL(1000),QMAX,ZMMIN,NPOINT
4545 INTEGER NPOINT
4546 DOUBLE PRECISION SPLITIGGV,SPLITIQQV,SPLITIQGV,
4547 &QVAL,ZMVAL,QMAX,ZMMIN
4548
4549 COMMON/INTSPLITF/QQUAD,FM
4550 DOUBLE PRECISION QQUAD,FM
4551
4552 common/extrapolations/ntotspliti,noverspliti,ntotpdf,noverpdf,
4553 &ntotxsec,noverxsec,ntotsuda,noversuda
4554 integer ntotspliti,noverspliti,ntotpdf,noverpdf,
4555 &ntotxsec,noverxsec,ntotsuda,noversuda
4556
4557 INTEGER I,J,LT,QLMAX,ZLMAX,QLINE,ZLINE
4558 DOUBLE PRECISION QA,QB,ZETA,EB,LOW,X1A(2),X2A(2),YA(2,2),Y,
4559 &SPLITINTGG,SPLITINTQG,A,B,YB(2)
4560 CHARACTER*2 TYPE1
4561
4562 ntotspliti=ntotspliti+1
4563 if (qb.gt.qmax) then
4564 noverspliti=noverspliti+1
4565 if (noverspliti.le.25)
4566 & write(logfid,*)'WARNING in getspliti: need to extrapolate: ',
4567 & qb,qmax
4568 endif
4569
4570
4571 IF(ANGORD.AND.(ZETA.NE.1.d0))THEN
4572 LOW=MAX(0.5-0.5*SQRT(1.-Q0**2/QB**2)
4573 & *SQRT(1.-QB**2/EB**2),
4574 & 0.5-0.5*SQRT(1.-4.*QB**2*(1.-ZETA)/(ZETA*QA**2)))
4575 ELSE
4576 LOW=0.5-0.5*SQRT(1.-Q0**2/QB**2)
4577 & *SQRT(1.-QB**2/EB**2)
4578 ENDIF
4579
4580 QLMAX=INT((QB-QVAL(1))*NPOINT/(QVAL(1000)-QVAL(1))+1)
4581 QLINE=MAX(QLMAX,1)
4582 QLINE=MIN(QLINE,NPOINT)
4583 ZLMAX=INT((LOG(LOW)-LOG(ZMVAL(1)))*NPOINT/
4584 & (LOG(ZMVAL(1000))-LOG(ZMVAL(1)))+1)
4585 ZLINE=MAX(ZLMAX,1)
4586 ZLINE=MIN(ZLINE,NPOINT)
4587 IF((QLINE.GT.999).OR.(ZLINE.GT.999).OR.
4588 & (QLINE.LT.1).OR.(ZLINE.LT.1))THEN
4589 write(logfid,*)'ERROR in GETSPLITI: line number out of bound',
4590 & QLINE,ZLINE
4591 ENDIF
4592 IF((TYPE1.EQ.'GG').OR.(TYPE1.EQ.'GC'))THEN
4593 DO 17 I=1,2
4594 X1A(I)=QVAL(QLINE-1+I)
4595 X2A(I)=ZMVAL(ZLINE-1+I)
4596 DO 16 J=1,2
4597 YA(I,J)=SPLITIGGV(QLINE-1+I,ZLINE-1+J)
4598 16 CONTINUE
4599 17 CONTINUE
4600 DO 30 I=1,2
4601 A=(YA(I,2)-YA(I,1))/(X2A(2)-X2A(1))
4602 B=YA(I,1)-A*X2A(1)
4603 YB(I)=A*LOW+B
4604 30 CONTINUE
4605 IF(X1A(1).EQ.X1A(2))THEN
4606 Y=(YB(1)+YB(2))/2.
4607 ELSE
4608 A=(YB(2)-YB(1))/(X1A(2)-X1A(1))
4609 B=YB(1)-A*X1A(1)
4610 Y=A*QB+B
4611 ENDIF
4612 IF(TYPE1.EQ.'GG')THEN
4613 GETSPLITI=MIN(Y,10.d0)
4614 ELSE
4615 SPLITINTGG=MIN(Y,10.d0)
4616 ENDIF
4617 ENDIF
4618 IF((TYPE1.EQ.'QG').OR.(TYPE1.EQ.'GC'))THEN
4619 DO 19 I=1,2
4620 X1A(I)=QVAL(QLINE-1+I)
4621 X2A(I)=ZMVAL(ZLINE-1+I)
4622 DO 18 J=1,2
4623 YA(I,J)=SPLITIQGV(QLINE-1+I,ZLINE-1+J)
4624 18 CONTINUE
4625 19 CONTINUE
4626 DO 31 I=1,2
4627 A=(YA(I,2)-YA(I,1))/(X2A(2)-X2A(1))
4628 B=YA(I,1)-A*X2A(1)
4629 YB(I)=A*LOW+B
4630 31 CONTINUE
4631 IF(X1A(1).EQ.X1A(2))THEN
4632 Y=(YB(1)+YB(2))/2.
4633 ELSE
4634 A=(YB(2)-YB(1))/(X1A(2)-X1A(1))
4635 B=YB(1)-A*X1A(1)
4636 Y=A*QB+B
4637 ENDIF
4638 IF(TYPE1.EQ.'QG')THEN
4639 GETSPLITI=NF*MIN(Y,10.d0)
4640 ELSE
4641 SPLITINTQG=NF*MIN(Y,10.d0)
4642 ENDIF
4643 ENDIF
4644 IF(TYPE1.EQ.'QQ')THEN
4645 DO 21 I=1,2
4646 X1A(I)=QVAL(QLINE-1+I)
4647 X2A(I)=ZMVAL(ZLINE-1+I)
4648 DO 20 J=1,2
4649 YA(I,J)=SPLITIQQV(QLINE-1+I,ZLINE-1+J)
4650 20 CONTINUE
4651 21 CONTINUE
4652 DO 32 I=1,2
4653 A=(YA(I,2)-YA(I,1))/(X2A(2)-X2A(1))
4654 B=YA(I,1)-A*X2A(1)
4655 YB(I)=A*LOW+B
4656 32 CONTINUE
4657 IF(X1A(1).EQ.X1A(2))THEN
4658 Y=(YB(1)+YB(2))/2.
4659 ELSE
4660 A=(YB(2)-YB(1))/(X1A(2)-X1A(1))
4661 B=YB(1)-A*X1A(1)
4662 Y=A*QB+B
4663 ENDIF
4664 GETSPLITI=MIN(Y,10.d0)
4665 ENDIF
4666 IF(TYPE1.EQ.'GC') GETSPLITI=SPLITINTGG+SPLITINTQG
4667 END
4668
4669
4670
4671
4672
4673 DOUBLE PRECISION FUNCTION GETINSPLITI(QB,TYPE1)
4674 IMPLICIT NONE
4675
4676 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4677 &ALLHAD,compress,NF
4678 INTEGER NF
4679 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4680 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4681
4682 DOUBLE PRECISION QB,LOW,PI,Y,SPLITINTGG,SPLITINTQG,UP,EI
4683 CHARACTER*2 TYPE1
4684 DATA PI/3.141592653589793d0/
4685
4686
4687 UP = 1. - Q0**2/(4.*QB**2)
4688 IF((TYPE1.EQ.'GG').OR.(TYPE1.EQ.'GC'))THEN
4689 LOW=1.d0-UP
4690 IF (UP.LE.LOW) THEN
4691 GETINSPLITI=0.d0
4692 RETURN
4693 ENDIF
4694 Y = 2.* ( LOG(LOG((1.-LOW)*QB**2/LPS**2))
4695 & - LPS**2*EI(LOG((1.-LOW)*QB**2/LPS**2))/QB**2
4696 & + LPS**4*EI(2.*LOG((1.-LOW)*QB**2/LPS**2))/QB**4
4697 & - LPS**6*EI(3.*LOG((1.-LOW)*QB**2/LPS**2))/QB**6
4698 & - LOG(LOG((1.-UP)*QB**2/LPS**2))
4699 & + LPS**2*EI(LOG((1.-UP)*QB**2/LPS**2))/QB**2
4700 & - LPS**4*EI(2.*LOG((1.-UP)*QB**2/LPS**2))/QB**4
4701 & + LPS**6*EI(3.*LOG((1.-UP)*QB**2/LPS**2))/QB**6
4702 & + LOW - LOG(LOW) - UP + LOG(UP) )
4703 & *3.*12.*PI/(2.*PI*(33.-2.*NF))
4704 IF(TYPE1.EQ.'GG')THEN
4705 GETINSPLITI=Y
4706 ELSE
4707 SPLITINTGG=Y
4708 ENDIF
4709 ENDIF
4710 IF((TYPE1.EQ.'QG').OR.(TYPE1.EQ.'GC'))THEN
4711 LOW=0.d0
4712 IF (UP.LE.LOW) THEN
4713 GETINSPLITI=0.d0
4714 RETURN
4715 ENDIF
4716 Y = ( 2.*LPS**6*EI(3.*LOG((1.-LOW)*QB**2/LPS**2))/QB**6
4717 & - 2.*LPS**4*EI(2.*LOG((1.-LOW)*QB**2/LPS**2))/QB**4
4718 & + 2.*LPS**2*EI(LOG((1.-LOW)*QB**2/LPS**2))/QB**2
4719 & - 2.*LPS**6*EI(3.*LOG((1.-UP)*QB**2/LPS**2))/QB**6
4720 & + 2.*LPS**4*EI(2.*LOG((1.-UP)*QB**2/LPS**2))/QB**4
4721 & - 2.*LPS**2*EI(LOG((1.-UP)*QB**2/LPS**2))/QB**2 )
4722 & *12.*PI/(2.*2.*PI*(33.-2.*NF))
4723 IF(TYPE1.EQ.'QG')THEN
4724 GETINSPLITI=NF*Y
4725 ELSE
4726 SPLITINTQG=NF*Y
4727 ENDIF
4728 ENDIF
4729 IF(TYPE1.EQ.'QQ')THEN
4730 LOW=0.d0
4731 IF (UP.LE.LOW) THEN
4732 GETINSPLITI=0.d0
4733 RETURN
4734 ENDIF
4735 Y = ( 2.*LOG(LOG((1.-LOW)*QB**2/LPS**2))
4736 & - 2.*LPS**2*EI(LOG((1.-LOW)*QB**2/LPS**2))/QB**2
4737 & + LPS**4*EI(2.*LOG((1.-LOW)*QB**2/LPS**2))/QB**4
4738 & - 2.*LOG(LOG((1.-UP)*QB**2/LPS**2))
4739 & + 2.*LPS**2*EI(LOG((1.-UP)*QB**2/LPS**2))/QB**2
4740 & - LPS**4*EI(2.*LOG((1.-UP)*QB**2/LPS**2))/QB**4 )
4741 & *4.*12.*PI/(3.*2.*PI*(33.-2.*NF))
4742 GETINSPLITI=Y
4743 ENDIF
4744 IF(TYPE1.EQ.'GQ')THEN
4745 LOW=1.d0-UP
4746 IF (UP.LE.LOW) THEN
4747 GETINSPLITI=0.d0
4748 RETURN
4749 ENDIF
4750 Y = (UP**2/2.-2.*UP+2.*LOG(UP)-LOW**2/2.+2.*LOW- 2.*LOG(LOW))
4751 & *4.*12.*PI/(3.*2.*PI*(33.-2.*NF)*LOG(QB**2/LPS**2))
4752 GETINSPLITI=Y
4753 ENDIF
4754 IF(TYPE1.EQ.'GC') GETINSPLITI=SPLITINTGG+SPLITINTQG
4755 END
4756
4757
4758
4759
4760
4761 DOUBLE PRECISION FUNCTION GETPDF(X,Q,TYP)
4762 IMPLICIT NONE
4763
4764 common/hepmcid/hpmcfid,logfid
4765 integer hpmcfid,logfid
4766
4767 COMMON/PDFS/QINQX(2,1000),GINQX(2,1000),QINGX(2,1000),
4768 &GINGX(2,1000)
4769 DOUBLE PRECISION QINQX,GINQX,QINGX,GINGX
4770
4771 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4772 &ALLHAD,compress,NF
4773 INTEGER NF
4774 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4775 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4776
4777 COMMON/PDFINTV/XMAX,Z
4778 DOUBLE PRECISION XMAX,Z
4779
4780 DOUBLE PRECISION X,Q,QLOW,QHIGH,YSTART,EPSI,HFIRST
4781 CHARACTER*2 TYP
4782 DATA EPSI/1.d-4/
4783
4784 IF((X.LT.0.d0).OR.(X.GT.1.d0).OR.(Q.LT.Q0))THEN
4785 write(logfid,*)'error in GETPDF: parameter out of bound',X,Q
4786 GETPDF=0.d0
4787 RETURN
4788 ENDIF
4789
4790 IF(TYP.EQ.'QQ')THEN
4791 Z=X
4792 XMAX=Q
4793
4794 QLOW=MAX(Q0,Q0/(2.*SQRT(1.-X)))
4795 QHIGH=Q
4796 IF((QLOW.GE.QHIGH*(1.d0-1.d-10)).OR.(X.GT.1.d0-1.d-10))THEN
4797 YSTART=0.d0
4798 ELSE
4799 HFIRST=0.01*(QHIGH-QLOW)
4800 YSTART=0.d0
4801 CALL ODEINT(YSTART,QLOW,QHIGH,EPSI,HFIRST,0.d0,7)
4802 ENDIF
4803 GETPDF=YSTART
4804 ELSEIF(TYP.EQ.'GQ')THEN
4805 Z=X
4806 XMAX=Q
4807
4808 QLOW=MAX(Q0,MAX(Q0/(2.*SQRT(X)),Q0/(2.*SQRT(1.-X))))
4809 QHIGH=Q
4810 IF((QLOW.GE.QHIGH*(1.d0-1.d-10)).OR.(X.LT.0.d0+1.d-10)
4811 & .OR.(X.GT.1.d0-1.d-10))THEN
4812 YSTART=0.d0
4813 ELSE
4814 HFIRST=0.01*(QHIGH-QLOW)
4815 YSTART=0.d0
4816 CALL ODEINT(YSTART,QLOW,QHIGH,EPSI,HFIRST,0.d0,8)
4817 ENDIF
4818 GETPDF=YSTART
4819 ELSEIF(TYP.EQ.'QG')THEN
4820 Z=X
4821 XMAX=Q
4822
4823 QLOW=MAX(Q0,Q0/(2.*SQRT(1.-X)))
4824 QHIGH=Q
4825 IF((QLOW.GE.QHIGH*(1.d0-1.d-10)).OR.(X.GT.1.d0-1.d-10))THEN
4826 YSTART=0.d0
4827 ELSE
4828 HFIRST=0.01*(QHIGH-QLOW)
4829 YSTART=0.d0
4830 CALL ODEINT(YSTART,QLOW,QHIGH,EPSI,HFIRST,0.d0,9)
4831 ENDIF
4832 GETPDF=YSTART
4833 ELSEIF(TYP.EQ.'GG')THEN
4834 Z=X
4835 XMAX=Q
4836
4837 QLOW=MAX(Q0,MAX(Q0/(2.*SQRT(X)),Q0/(2.*SQRT(1.-X))))
4838 QHIGH=Q
4839 IF((QLOW.GE.QHIGH*(1.d0-1.d-10)).OR.(X.LT.0.d0+1.d-10)
4840 & .OR.(X.GT.1.d0-1d-10))THEN
4841 YSTART=0.d0
4842 ELSE
4843 HFIRST=0.01*(QHIGH-QLOW)
4844 YSTART=0.d0
4845 CALL ODEINT(YSTART,QLOW,QHIGH,EPSI,HFIRST,0.d0,10)
4846 ENDIF
4847 GETPDF=YSTART
4848 ELSE
4849 write(logfid,*)'error: pdf-type ',TYP,' does not exist'
4850 GETPDF=0.d0
4851 ENDIF
4852 END
4853
4854
4855
4856
4857 DOUBLE PRECISION FUNCTION GETPDFXINT(Q,TYP)
4858 IMPLICIT NONE
4859
4860 common/hepmcid/hpmcfid,logfid
4861 integer hpmcfid,logfid
4862
4863 COMMON/PDFS/QINQX(2,1000),GINQX(2,1000),QINGX(2,1000),
4864 &GINGX(2,1000)
4865 DOUBLE PRECISION QINQX,GINQX,QINGX,GINGX
4866
4867 common/extrapolations/ntotspliti,noverspliti,ntotpdf,noverpdf,
4868 &ntotxsec,noverxsec,ntotsuda,noversuda
4869 integer ntotspliti,noverspliti,ntotpdf,noverpdf,
4870 &ntotxsec,noverxsec,ntotsuda,noversuda
4871
4872 INTEGER J,Q2CLOSE,Q2LINE
4873 DOUBLE PRECISION Q,XA(2),YA(2),Y,A,B
4874 CHARACTER*2 TYP
4875
4876 ntotpdf=ntotpdf+1
4877 if (q**2.gt.QINQX(1,1000)) then
4878 noverpdf=noverpdf+1
4879 if (noverpdf.le.25)
4880 & write(logfid,*)'WARNING in getpdfxint: need to extrapolate: ',
4881 & q**2,QINQX(1,1000)
4882 endif
4883
4884 Q2CLOSE=INT((LOG(Q**2)-LOG(QINQX(1,1)))*999.d0/
4885 & (LOG(QINQX(1,1000))-LOG(QINQX(1,1)))+1)
4886 Q2LINE=MAX(Q2CLOSE,1)
4887 Q2LINE=MIN(Q2LINE,999)
4888 IF((Q2LINE.GT.999).OR.(Q2LINE.LT.1))THEN
4889 write(logfid,*)'ERROR in GETPDFXINT: line number out of bound',
4890 & Q2LINE
4891 ENDIF
4892
4893 IF(TYP.EQ.'QQ')THEN
4894 DO 11 J=1,2
4895 XA(J)=QINQX(1,Q2LINE-1+J)
4896 YA(J)=QINQX(2,Q2LINE-1+J)
4897 11 CONTINUE
4898 ELSEIF(TYP.EQ.'GQ')THEN
4899 DO 13 J=1,2
4900 XA(J)=GINQX(1,Q2LINE-1+J)
4901 YA(J)=GINQX(2,Q2LINE-1+J)
4902 13 CONTINUE
4903 ELSEIF(TYP.EQ.'QG')THEN
4904 DO 15 J=1,2
4905 XA(J)=QINGX(1,Q2LINE-1+J)
4906 YA(J)=QINGX(2,Q2LINE-1+J)
4907 15 CONTINUE
4908 ELSEIF(TYP.EQ.'GG')THEN
4909 DO 17 J=1,2
4910 XA(J)=GINGX(1,Q2LINE-1+J)
4911 YA(J)=GINGX(2,Q2LINE-1+J)
4912 17 CONTINUE
4913 ELSE
4914 write(logfid,*)'error in GETPDFXINT: unknown integral type ',TYP
4915 ENDIF
4916 A=(YA(2)-YA(1))/(XA(2)-XA(1))
4917 B=YA(1)-A*XA(1)
4918 Y=A*Q**2+B
4919 GETPDFXINT=Y
4920 END
4921
4922
4923
4924
4925
4926 DOUBLE PRECISION FUNCTION GETPDFXINTEXACT(Q,TYP)
4927 IMPLICIT NONE
4928
4929 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4930 &ALLHAD,compress,NF
4931 INTEGER NF
4932 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4933 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4934
4935 COMMON/PDFINTV/XMAX,Z
4936 DOUBLE PRECISION XMAX,Z
4937
4938 DOUBLE PRECISION Q,EPSI,YSTART,HFIRST
4939 CHARACTER*2 TYP
4940 DATA EPSI/1.d-4/
4941
4942 HFIRST=0.01d0
4943 YSTART=0.d0
4944 XMAX=Q
4945 Z=0.d0
4946 IF(TYP.EQ.'QQ')THEN
4947 CALL ODEINT(YSTART,Q0,Q,EPSI,HFIRST,0.d0,21)
4948 ELSEIF(TYP.EQ.'QG')THEN
4949 CALL ODEINT(YSTART,Q0,Q,EPSI,HFIRST,0.d0,23)
4950 ELSEIF(TYP.EQ.'GQ')THEN
4951 CALL ODEINT(YSTART,Q0,Q,EPSI,HFIRST,0.d0,22)
4952 ELSEIF(TYP.EQ.'GG')THEN
4953 CALL ODEINT(YSTART,Q0,Q,EPSI,HFIRST,0.d0,24)
4954 ENDIF
4955 GETPDFXINTEXACT=YSTART
4956 END
4957
4958
4959
4960
4961
4962 DOUBLE PRECISION FUNCTION GETXSECINT(TM,MD,TYP2)
4963 IMPLICIT NONE
4964
4965 common/hepmcid/hpmcfid,logfid
4966 integer hpmcfid,logfid
4967
4968 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
4969 &ALLHAD,compress,NF
4970 INTEGER NF
4971 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
4972 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
4973
4974 COMMON/XSECS/INTQ1(1001,101),INTQ2(1001,101),
4975 &INTG1(1001,101),INTG2(1001,101)
4976 DOUBLE PRECISION INTQ1,INTQ2,INTG1,INTG2
4977
4978 COMMON/XSECV/QLOW,MDX
4979 DOUBLE PRECISION QLOW,MDX
4980
4981 common/extrapolations/ntotspliti,noverspliti,ntotpdf,noverpdf,
4982 &ntotxsec,noverxsec,ntotsuda,noversuda
4983 integer ntotspliti,noverspliti,ntotpdf,noverpdf,
4984 &ntotxsec,noverxsec,ntotsuda,noversuda
4985
4986 INTEGER TLINE,TCLOSE,MDCLOSE,MDLINE,I,J
4987 DOUBLE PRECISION TM,X1A(2),X2A(2),YA(2,2),Y,MD,YB(2),A,B
4988 CHARACTER*2 TYP2
4989
4990 ntotxsec=ntotxsec+1
4991 if (tm.gt.intq1(1000,101)) then
4992 noverxsec=noverxsec+1
4993 if (noverpdf.le.25)
4994 & write(logfid,*)'WARNING in getxsecint: need to extrapolate: ',
4995 & tm,intq1(1000,101)
4996 endif
4997
4998 TCLOSE=INT((LOG(TM)-LOG(INTQ1(1,101)))*999.d0/
4999 & (LOG(INTQ1(1000,101))-LOG(INTQ1(1,101)))+1)
5000 TLINE=MAX(TCLOSE,1)
5001 TLINE=MIN(TLINE,999)
5002 MDCLOSE=INT((MD-INTQ1(1001,1))*99.d0/
5003 &(INTQ1(1001,100)-INTQ1(1001,1))+1)
5004 MDLINE=MAX(MDCLOSE,1)
5005 MDLINE=MIN(MDLINE,99)
5006 IF((TLINE.GT.999).OR.(MDLINE.GT.99)
5007 & .OR.(TLINE.LT.1).OR.(MDLINE.LT.1)) THEN
5008 write(logfid,*)'ERROR in GETXSECINT: line number out of bound',
5009 & TLINE,MDLINE
5010 ENDIF
5011
5012 IF(TYP2.EQ.'QA')THEN
5013
5014 DO 12 I=1,2
5015 X1A(I)=INTQ1(1001,MDLINE-1+I)
5016 X2A(I)=INTQ1(TLINE-1+I,101)
5017 DO 11 J=1,2
5018 YA(I,J)=INTQ1(TLINE-1+J,MDLINE-1+I)
5019 11 CONTINUE
5020 12 CONTINUE
5021 ELSEIF(TYP2.EQ.'QB')THEN
5022
5023 DO 18 I=1,2
5024 X1A(I)=INTQ2(1001,MDLINE-1+I)
5025 X2A(I)=INTQ2(TLINE-1+I,101)
5026 DO 17 J=1,2
5027 YA(I,J)=INTQ2(TLINE-1+J,MDLINE-1+I)
5028 17 CONTINUE
5029 18 CONTINUE
5030 ELSEIF(TYP2.EQ.'GA')THEN
5031
5032 DO 14 I=1,2
5033 X1A(I)=INTG1(1001,MDLINE-1+I)
5034 X2A(I)=INTG1(TLINE-1+I,101)
5035 DO 13 J=1,2
5036 YA(I,J)=INTG1(TLINE-1+J,MDLINE-1+I)
5037 13 CONTINUE
5038 14 CONTINUE
5039 ELSEIF(TYP2.EQ.'GB')THEN
5040
5041 DO 16 I=1,2
5042 X1A(I)=INTG2(1001,MDLINE-1+I)
5043 X2A(I)=INTG2(TLINE-1+I,101)
5044 DO 15 J=1,2
5045 YA(I,J)=INTG2(TLINE-1+J,MDLINE-1+I)
5046 15 CONTINUE
5047 16 CONTINUE
5048 ELSE
5049 write(logfid,*)'error in GETXSECINT: unknown integral type ',
5050 & TYP2
5051 ENDIF
5052 DO 19 I=1,2
5053 A=(YA(I,2)-YA(I,1))/(X2A(2)-X2A(1))
5054 B=YA(I,1)-A*X2A(1)
5055 YB(I)=A*TM+B
5056 19 CONTINUE
5057 IF(X1A(1).EQ.X1A(2))THEN
5058 Y=YB(1)
5059 ELSE
5060 A=(YB(2)-YB(1))/(X1A(2)-X1A(1))
5061 B=YB(1)-A*X1A(1)
5062 Y=A*MD+B
5063 ENDIF
5064 GETXSECINT=Y
5065 END
5066
5067
5068
5069
5070
5071 DOUBLE PRECISION FUNCTION GETINSUDAFAST(Q1,Q2,TYP)
5072 IMPLICIT NONE
5073
5074 common/hepmcid/hpmcfid,logfid
5075 integer hpmcfid,logfid
5076
5077 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5078 &ALLHAD,compress,NF
5079 INTEGER NF
5080 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5081 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5082
5083 DOUBLE PRECISION Q1,Q2,GETINSUDARED
5084 CHARACTER*2 TYP
5085
5086 IF(Q2.LE.Q1)THEN
5087 GETINSUDAFAST=1.d0
5088 ELSEIF(Q1.LE.Q0)THEN
5089 GETINSUDAFAST=GETINSUDARED(Q2,TYP)
5090 ELSE
5091 GETINSUDAFAST=GETINSUDARED(Q2,TYP)/GETINSUDARED(Q1,TYP)
5092 ENDIF
5093 IF(GETINSUDAFAST.GT.1.d0) GETINSUDAFAST=1.d0
5094 IF(GETINSUDAFAST.LT.(-1.d-10))THEN
5095 write(logfid,*)'ERROR: GETINSUDAFAST < 0:',
5096 & GETINSUDAFAST,' for',Q1,' ',Q2,' ',TYP
5097 ENDIF
5098 if (getinsudafast.lt.0.d0) getinsudafast = 0.d0
5099 END
5100
5101
5102
5103
5104
5105 DOUBLE PRECISION FUNCTION GETINSUDARED(Q,TYP2)
5106 IMPLICIT NONE
5107
5108 common/hepmcid/hpmcfid,logfid
5109 integer hpmcfid,logfid
5110
5111 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5112 &ALLHAD,compress,NF
5113 INTEGER NF
5114 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5115 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5116
5117 COMMON/INSUDA/SUDAQQ(1000,2),SUDAQG(1000,2),SUDAGG(1000,2),
5118 &SUDAGC(1000,2)
5119 DOUBLE PRECISION SUDAQQ,SUDAQG,SUDAGG,SUDAGC
5120
5121 common/extrapolations/ntotspliti,noverspliti,ntotpdf,noverpdf,
5122 &ntotxsec,noverxsec,ntotsuda,noversuda
5123 integer ntotspliti,noverspliti,ntotpdf,noverpdf,
5124 &ntotxsec,noverxsec,ntotsuda,noversuda
5125
5126 INTEGER QCLOSE,QBIN,I
5127 DOUBLE PRECISION Q,XA(2),YA(2),Y,A,B
5128 CHARACTER*2 TYP2
5129
5130 ntotsuda=ntotsuda+1
5131 if (q.gt.sudaqq(1000,1)) then
5132 noversuda=noversuda+1
5133 if (noversuda.le.25)
5134 & write(logfid,*)'WARNING in getinsudared: need to extrapolate: ',
5135 & q,sudaqq(1000,1)
5136 endif
5137
5138 QCLOSE=INT((LOG(Q)-LOG(SUDAQQ(1,1)))*999.d0
5139 & /(LOG(SUDAQQ(1000,1))-LOG(SUDAQQ(1,1)))+1)
5140 QBIN=MAX(QCLOSE,1)
5141 QBIN=MIN(QBIN,999)
5142 IF((QBIN.GT.999).OR.(QBIN.LT.1)) THEN
5143 write(logfid,*)
5144 & 'ERROR in GETINSUDARED: line number out of bound',QBIN
5145 ENDIF
5146 IF(TYP2.EQ.'QQ')THEN
5147 DO 16 I=1,2
5148 XA(I)=SUDAQQ(QBIN-1+I,1)
5149 YA(I)=SUDAQQ(QBIN-1+I,2)
5150 16 CONTINUE
5151 ELSEIF(TYP2.EQ.'QG')THEN
5152 DO 17 I=1,2
5153 XA(I)=SUDAQG(QBIN-1+I,1)
5154 YA(I)=SUDAQG(QBIN-1+I,2)
5155 17 CONTINUE
5156 ELSEIF(TYP2.EQ.'GG')THEN
5157 DO 18 I=1,2
5158 XA(I)=SUDAGG(QBIN-1+I,1)
5159 YA(I)=SUDAGG(QBIN-1+I,2)
5160 18 CONTINUE
5161 ELSEIF(TYP2.EQ.'GC')THEN
5162 DO 19 I=1,2
5163 XA(I)=SUDAGC(QBIN-1+I,1)
5164 YA(I)=SUDAGC(QBIN-1+I,2)
5165 19 CONTINUE
5166 ELSE
5167 write(logfid,*)'error in GETINSUDARED: unknown type ',TYP2
5168 ENDIF
5169 A=(YA(2)-YA(1))/(XA(2)-XA(1))
5170 B=YA(1)-A*XA(1)
5171 Y=A*Q+B
5172 GETINSUDARED=Y
5173 IF(GETINSUDARED.LT.(-1.d-10))THEN
5174 write(logfid,*) 'ERROR: GETINSUDARED < 0:',GETINSUDARED,Q,TYP2
5175 ENDIF
5176 if (getinsudared.lt.0.d0) getinsudared = 0.d0
5177 END
5178
5179
5180
5181
5182
5183 DOUBLE PRECISION FUNCTION GETSSCAT(EN,px,py,PZ,MP,LW,TYPE1,TYPE2,
5184 & x,y,z,t,mode)
5185 IMPLICIT NONE
5186
5187 common/hepmcid/hpmcfid,logfid
5188 integer hpmcfid,logfid
5189
5190 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5191 &ALLHAD,compress,NF
5192 INTEGER NF
5193 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5194 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5195
5196 COMMON/XSECV/QLOW,MDX
5197 DOUBLE PRECISION QLOW,MDX
5198
5199 integer mode
5200 DOUBLE PRECISION UP,EN,LW,SCATPRIMFUNC,CCOL,MP,
5201 &LOW,GETPDFXINT,GETXSECINT,MDEB,pz,pcms2,shat,gettemp,
5202 &x,y,z,t,getmd,avmom(5),px,py,getmdmin,getmdmax,pproj,psct
5203 CHARACTER TYPE1,TYPE2
5204
5205 IF(TYPE1.EQ.'Q')THEN
5206 CCOL=2./3.
5207 ELSE
5208 CCOL=3./2.
5209 ENDIF
5210 if (mode.eq.0) then
5211 mdeb = getmd(x,y,z,t)
5212 call avscatcen(x,y,z,t,
5213 & avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
5214 shat = avmom(5)**2 + mp**2 +
5215 & 2.*(avmom(4)*en - avmom(1)*px - avmom(2)*py - avmom(3)*pz)
5216 pcms2 = (shat+mp**2-avmom(5)**2)**2/(4.*shat)-mp**2
5217 up = 4.*pcms2
5218 else
5219 if (mode.eq.1) then
5220 mdeb = getmdmin()
5221 else
5222 mdeb = getmdmax()
5223 endif
5224 call maxscatcen(avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
5225 psct = sqrt(avmom(1)**2+avmom(2)**2+avmom(3)**2)
5226 pproj = sqrt(px**2+py**2+pz**2)
5227 shat = avmom(5)**2 + mp**2 + 2.*(en*avmom(4) + pproj*psct)
5228 pcms2 = (shat+mp**2-avmom(5)**2)**2/(4.*shat)-mp**2
5229 up = 4.*pcms2
5230 endif
5231 LOW=LW**2
5232 IF(LOW.GT.UP)THEN
5233 GETSSCAT=0.d0
5234 RETURN
5235 ENDIF
5236 IF((TYPE2.EQ.'C').OR.
5237 & ((TYPE1.EQ.'Q').AND.(TYPE2.EQ.'Q')).OR.
5238 & ((TYPE1.EQ.'G').AND.(TYPE2.EQ.'G')))THEN
5239 GETSSCAT=CCOL*(SCATPRIMFUNC(UP,MDEB)-SCATPRIMFUNC(LOW,MDEB))
5240 ELSE
5241 GETSSCAT=0.d0
5242 ENDIF
5243 LOW=Q0**2/SCALEFACM**2
5244 IF(UP.GT.LOW)THEN
5245 IF(TYPE1.EQ.'Q')THEN
5246 IF((TYPE2.EQ.'C').OR.(TYPE2.EQ.'G'))THEN
5247 GETSSCAT=GETSSCAT+GETPDFXINT(SCALEFACM*SQRT(UP),'GQ')
5248 & *3.*SCATPRIMFUNC(UP,MDEB)/2.
5249 GETSSCAT=GETSSCAT-GETXSECINT(UP,MDEB,'QA')
5250 ENDIF
5251 ELSE
5252 IF((TYPE2.EQ.'C').OR.(TYPE2.EQ.'G'))THEN
5253 GETSSCAT=GETSSCAT+CCOL*(SCATPRIMFUNC(UP,MDEB)-
5254 & SCATPRIMFUNC(LOW,MDEB))
5255 & - GETXSECINT(UP,MDEB,'GB')
5256 ENDIF
5257 IF((TYPE2.EQ.'C').OR.(TYPE2.EQ.'Q'))THEN
5258 GETSSCAT=GETSSCAT+2.*GETPDFXINT(SCALEFACM*SQRT(UP),'QG')
5259 & *2.*SCATPRIMFUNC(UP,MDEB)/3.
5260 GETSSCAT=GETSSCAT-2.*GETXSECINT(UP,MDEB,'GA')
5261 ENDIF
5262 ENDIF
5263 ENDIF
5264 IF(GETSSCAT.LT.-1.d-4)
5265 & write(logfid,*) 'error: cross section < 0',GETSSCAT,'for',
5266 & EN,MP,LW,TYPE1,TYPE2,LW**2,UP
5267 GETSSCAT=MAX(GETSSCAT,0.d0)
5268 END
5269
5270
5271
5272
5273
5274
5275 DOUBLE PRECISION FUNCTION GETMASS(QBMIN,QBMAX,THETA,EP,TYPE,
5276 & MAX2,INS,ZDEC,QQBARDEC)
5277 IMPLICIT NONE
5278
5279 common/hepmcid/hpmcfid,logfid
5280 integer hpmcfid,logfid
5281
5282 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
5283 INTEGER N,NPAD,K
5284 DOUBLE PRECISION P,V
5285 COMMON/PYDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
5286 INTEGER MSTU,MSTJ
5287 DOUBLE PRECISION PARU,PARJ
5288 COMMON/PYDAT3/MDCY(500,3),MDME(8000,2),BRAT(8000),KFDP(8000,5)
5289 INTEGER MDCY,MDME,KFDP
5290 DOUBLE PRECISION BRAT
5291
5292 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5293 &ALLHAD,compress,NF
5294 INTEGER NF
5295 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5296 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5297
5298 COMMON/TIME/MV(23000,5)
5299 DOUBLE PRECISION MV
5300
5301 COMMON/ALPHASFAC/PTFAC
5302 DOUBLE PRECISION PTFAC
5303
5304 DOUBLE PRECISION qbmin,qbmax,theta,ep,max2,zdec,
5305 &q2min,alphmax,alphas,log14,pref,q2max,sudaover,gmin,
5306 &gmax,arg,cand,eps,trueeps,trueval,oest,weight,getinspliti,
5307 &r,pyr,z,rz,thetanew,r2,pi,pqq,pgg,pqg,rmin
5308 CHARACTER*2 TYPE
5309 LOGICAL INS,QQBARDEC
5310 DATA PI/3.141592653589793d0/
5311
5312 q2min = q0**2
5313
5314 alphmax = alphas(3.*ptfac*q2min/16.,lps)
5315 log14 = log(0.25)
5316
5317 IF(TYPE.EQ.'QQ')THEN
5318 pref=4.*alphmax/(3.*2.*PI)
5319 ELSE
5320 pref=29.*alphmax/(8.*2.*PI)
5321 ENDIF
5322
5323
5324 IF((qbmax.LE.QBMIN).OR.(EP.LT.QBMIN)) THEN
5325 getmass=0.d0
5326 ZDEC=0.d0
5327 QQBARDEC=.FALSE.
5328 RETURN
5329 ENDIF
5330
5331 q2max = qbmax**2
5332 ! 21 sudaover = exp(-pref*(log(q2min/(4.*q2max))**2 - log14**2))
5333 ! IF(pyr(0).LE.sudaover)THEN
5334 21 if (q2max-qbmin**2.lt.1e-4)then
5335 getmass=qbmin
5336 zdec=0.5
5337 IF(TYPE.EQ.'QQ')THEN
5338 QQBARDEC=.FALSE.
5339 ELSE
5340 IF(PYR(0).LT.PQG(0.5d0)/(PQG(0.5d0)+PGG(0.5d0)))THEN
5341 QQBARDEC=.TRUE.
5342 ELSE
5343 QQBARDEC=.FALSE.
5344 ENDIF
5345 endif
5346 return
5347 endif
5348 gmax = pref*log(q2min/(4.*q2max))**2
5349 if (qbmin.gt.0.d0) then
5350 rmin = exp(pref*log(q2min/(4.*qbmin**2))**2-gmax)
5351 else
5352 rmin = 0.d0
5353 endif
5354
5355 r=pyr(0)*(1.d0-rmin)+rmin
5356 arg=gmax+log(r)
5357 if(arg.lt.0.d0)then
5358 getmass=0.d0
5359 ZDEC=0.d0
5360 QQBARDEC=.FALSE.
5361 RETURN
5362 endif
5363 ! r=pyr(0)
5364 ! gmin = pref*log14**2
5365 ! gmax = pref*log(q2min/(4.*q2max))**2
5366 ! arg = log(r*exp(gmax)+(1.-r)*exp(gmin))
5367 cand = q2min*exp(sqrt(arg/pref))/4.
5368 eps = q2min/(4.*cand)
5369
5370 if ((cand.lt.q2min).or.(cand.lt.qbmin**2)) then
5371 getmass=0.d0
5372 ZDEC=0.d0
5373 QQBARDEC=.FALSE.
5374 RETURN
5375 endif
5376
5377 IF((CAND.GT.MAX2**2).OR.(CAND.GT.EP**2))THEN
5378 q2max=cand
5379 goto 21
5380 ENDIF
5381
5382 if (ins) then
5383 trueval=getinspliti(sqrt(cand),type)
5384 oest = -2.*pref*log(eps)
5385 weight = trueval/oest
5386 else
5387
5388 TRUEEPS=0.5-0.5*SQRT(1.-q2min/cand)
5389 & *SQRT(1.-cand/EP**2)
5390 IF(TRUEEPS.LT.EPS)
5391 & WRITE(logfid,*)'error in getmass: true eps < eps',TRUEEPS,EPS
5392 RZ=PYR(0)
5393 z = 1.-eps**rz
5394 if ((z.lt.trueeps).or.(z.gt.(1.-trueeps))) then
5395 weight = 0.
5396 else
5397 if (type.eq.'QQ')then
5398 ! if (ins) then
5399 ! trueval = alphas(ptfac*(1.-z)*cand,lps)*pqq(z)/(2.*pi)
5400 ! else
5401 trueval = alphas(ptfac*z*(1.-z)*cand,lps)*pqq(z)/(2.*pi)
5402 ! endif
5403 oest = 2.*pref/(1.-z)
5404 weight = trueval/oest
5405 else
5406 if (pyr(0).lt.(17./29.)) z = 1.-z
5407 ! if (ins)then
5408 ! trueval = alphas(ptfac*(1.-z)*cand,lps)
5409 ! & *(pgg(z)+pqg(z))/(2.*pi)
5410 ! else
5411 trueval = alphas(ptfac*z*(1.-z)*cand,lps)
5412 & *(pgg(z)+pqg(z))/(2.*pi)
5413 ! endif
5414 oest = alphmax*(17./(4.*z)+3./(1.-z))/(2.*pi)
5415 weight = trueval/oest
5416 endif
5417 thetanew = sqrt(cand/(z*(1.-z)))/ep
5418 if (angord.and.(theta.gt.0.).and.(thetanew.gt.theta))
5419 & weight = 0.d0
5420 endif
5421 endif
5422 IF (WEIGHT.GT.1.d0) WRITE(logfid,*)
5423 & 'problem in getmass: weight> 1',
5424 & WEIGHT,TYPE,EPS,TRUEEPS,Z,CAND
5425 R2=PYR(0)
5426 IF(R2.GT.WEIGHT)THEN
5427 q2max=cand
5428 GOTO 21
5429 ELSE
5430 getmass=sqrt(cand)
5431 if (.not.ins) then
5432 ZDEC=Z
5433 IF(TYPE.EQ.'QQ')THEN
5434 QQBARDEC=.FALSE.
5435 ELSE
5436 IF(PYR(0).LT.PQG(Z)/(PQG(Z)+PGG(Z)))THEN
5437 QQBARDEC=.TRUE.
5438 ELSE
5439 QQBARDEC=.FALSE.
5440 ENDIF
5441 ENDIF
5442 endif
5443 ENDIF
5444 END
5445
5446
5447
5448
5449
5450
5451 DOUBLE PRECISION FUNCTION GENERATEZ(TI,EA,EPSI,TYPE)
5452 IMPLICIT NONE
5453
5454 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5455 &ALLHAD,compress,NF
5456 INTEGER NF
5457 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5458 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5459
5460 DOUBLE PRECISION TI,EA,EPS,PYR,X,R,HELP,R1,EPSI
5461 CHARACTER*2 TYPE
5462
5463 IF(TI.EQ.0.d0)THEN
5464 EPS=EPSI
5465 ELSE
5466 EPS=MAX(0.5-0.5*SQRT(1.-Q0**2/TI)
5467 & *SQRT(1.-TI/EA**2),EPSI)
5468 ENDIF
5469 IF(EPS.GT.0.5)THEN
5470 GENERATEZ=0.5
5471 GOTO 61
5472 ENDIF
5473 60 R=PYR(0)
5474 IF(TYPE.EQ.'QQ')THEN
5475 X=1.-(1.-EPS)*(EPS/(1.-EPS))**R
5476 R=PYR(0)
5477 IF(R.LT.((1.+X**2)/2.))THEN
5478 GENERATEZ=X
5479 ELSE
5480 GOTO 60
5481 ENDIF
5482 ELSEIF(TYPE.EQ.'GG')THEN
5483 X=1./(1.+((1.-EPS)/EPS)**(1.-2.*R))
5484 R=PYR(0)
5485 HELP=((1.-X)/X+X/(1.-X)+X*(1.-X))/(1./(1.-X)+1./X)
5486 IF(R.LT.HELP)THEN
5487 GENERATEZ=X
5488 ELSE
5489 GOTO 60
5490 ENDIF
5491 ELSE
5492 R=PYR(0)*(1.-2.*EPS)+EPS
5493 R1=PYR(0)/2.
5494 HELP=0.5*(R**2+(1.-R)**2)
5495 IF(R1.LT.HELP)THEN
5496 GENERATEZ=R
5497 ELSE
5498 GOTO 60
5499 ENDIF
5500 ENDIF
5501 61 END
5502
5503
5504
5505
5506
5507
5508 DOUBLE PRECISION FUNCTION SCATPRIMFUNC(T,MDEB)
5509 IMPLICIT NONE
5510
5511 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5512 &ALLHAD,compress,NF
5513 INTEGER NF
5514 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5515 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5516
5517 DOUBLE PRECISION T,PI,S,EI,ALPHAS,T1,MDEB
5518 DATA PI/3.141592653589793d0/
5519
5520 SCATPRIMFUNC = 2.*PI*(12.*PI)**2*(
5521 & - EI(-LOG((T+MDEB**2)/LQCD**2))/LQCD**2
5522 & - 1./((T+MDEB**2)*LOG((T+MDEB**2)/LQCD**2)))/(33.-2.*NF)**2
5523 END
5524
5525
5526
5527
5528
5529
5530 DOUBLE PRECISION FUNCTION INTPQQ(Z,Q)
5531 IMPLICIT NONE
5532
5533 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5534 &ALLHAD,compress,NF
5535 INTEGER NF
5536 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5537 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5538
5539 DOUBLE PRECISION Z,Q
5540
5541 INTPQQ=6.*4.*(-2.*LOG(LOG(Q**2/LPS**2)
5542 & +LOG(1.-Z)))/((33.-2.*NF)*3.)
5543 END
5544
5545
5546
5547
5548
5549
5550 DOUBLE PRECISION FUNCTION INTPGGLOW(Z,Q)
5551 IMPLICIT NONE
5552
5553 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5554 &ALLHAD,compress,NF
5555 INTEGER NF
5556 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5557 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5558
5559 DOUBLE PRECISION Z,Q
5560
5561 INTPGGLOW=6.*3.*(LOG(LOG(Q**2/LPS**2)+LOG(Z)))/(33.-2.*NF)
5562 END
5563
5564
5565
5566
5567
5568
5569 DOUBLE PRECISION FUNCTION INTPGGHIGH(Z,Q)
5570 IMPLICIT NONE
5571
5572 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5573 &ALLHAD,compress,NF
5574 INTEGER NF
5575 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5576 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5577
5578 DOUBLE PRECISION Z,Q
5579
5580 INTPGGHIGH=-6.*3.*(LOG(LOG(Q**2/LPS**2)+LOG(1.-Z)))/(33.-2.*NF)
5581 END
5582
5583
5584
5585
5586
5587
5588 DOUBLE PRECISION FUNCTION INTPQGLOW(Z,Q)
5589 IMPLICIT NONE
5590
5591 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5592 &ALLHAD,compress,NF
5593 INTEGER NF
5594 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5595 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5596
5597 DOUBLE PRECISION Z,Q,EI
5598
5599 INTPQGLOW=6.*(LPS**2*EI(LOG(Q**2/LPS**2)+LOG(Z))/Q**2
5600 & - 2.*LPS**4*EI(2.*(LOG(Q**2/LPS**2)+LOG(Z)))/Q**4
5601 & + 2.*LPS**6*EI(3.*(LOG(Q**2/LPS**2)+LOG(Z)))/Q**6)/
5602 &((33.-2.*NF)*2.)
5603 END
5604
5605
5606
5607
5608
5609
5610 DOUBLE PRECISION FUNCTION INTPQGHIGH(Z,Q)
5611 IMPLICIT NONE
5612
5613 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5614 &ALLHAD,compress,NF
5615 INTEGER NF
5616 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5617 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5618
5619 DOUBLE PRECISION Z,Q,EI
5620
5621 INTPQGHIGH=-6.*(LPS**2*EI(LOG(Q**2/LPS**2)+LOG(1.-Z))/Q**2
5622 & - 2.*LPS**4*EI(2.*(LOG(Q**2/LPS**2)+LOG(1.-Z)))/Q**4
5623 & + 2.*LPS**6*EI(3.*(LOG(Q**2/LPS**2)+LOG(1.-Z)))/Q**6)/
5624 &((33.-2.*NF)*2.)
5625 END
5626
5627
5628
5629
5630
5631
5632 DOUBLE PRECISION FUNCTION GETT(MINT,MAXT,MDEB)
5633 IMPLICIT NONE
5634
5635 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5636 &ALLHAD,compress,NF
5637 INTEGER NF
5638 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5639 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5640
5641 DOUBLE PRECISION TMIN,TMAX,MAXI,PYR,R1,R2,ALPHAS,PI,Y,MAXT,
5642 &MDEB,MINT,T
5643 DATA PI/3.141592653589793d0/
5644
5645 TMAX=MAXT+MDEB**2
5646 TMIN=MINT+MDEB**2
5647 IF(TMIN.GT.TMAX) THEN
5648 GETT=0.d0
5649 RETURN
5650 ENDIF
5651 20 R1=PYR(0)
5652 T=TMAX*TMIN/(TMAX+R1*(TMIN-TMAX))
5653 R2=PYR(0)
5654 IF(R2.LT.ALPHAS(T,LQCD)**2/ALPHAS(TMIN,LQCD)**2)THEN
5655 GETT=T-MDEB**2
5656 ELSE
5657 GOTO 20
5658 ENDIF
5659
5660 END
5661
5662
5663
5664
5665
5666
5667 DOUBLE PRECISION FUNCTION EI(X)
5668 IMPLICIT NONE
5669
5670 common/hepmcid/hpmcfid,logfid
5671 integer hpmcfid,logfid
5672
5673 COMMON/EXPINT/EIXS(3,1000),VALMAX,NVAL
5674 INTEGER NVAL
5675 DOUBLE PRECISION EIXS,VALMAX
5676
5677 INTEGER K,LINE,LMAX
5678 DOUBLE PRECISION X,R,GA,XA(2),YA(2),Y,DY,A,B
5679 DOUBLE PRECISION YSTART,EPSI,HFIRST
5680 DATA EPSI/1.e-5/
5681
5682 IF(DABS(X).GT.VALMAX)
5683 & write(logfid,*)'warning: value out of array in Ei(x)',X,VALMAX
5684
5685 IF(X.GE.0.d0)THEN
5686 LMAX=INT(X*NVAL/VALMAX)
5687 LINE=MAX(LMAX,1)
5688 LINE=MIN(LINE,999)
5689 IF((LINE.GT.999).OR.(LINE.LT.1)) THEN
5690 write(logfid,*)'ERROR in EI: line number out of bound',LINE
5691 ENDIF
5692 DO 26 K=1,2
5693 XA(K)=EIXS(1,LINE-1+K)
5694 YA(K)=EIXS(3,LINE-1+K)
5695 26 CONTINUE
5696 A=(YA(2)-YA(1))/(XA(2)-XA(1))
5697 B=YA(1)-A*XA(1)
5698 Y=A*X+B
5699 ELSE
5700 LMAX=INT(-X*NVAL/VALMAX)
5701 LINE=MAX(LMAX,1)
5702 LINE=MIN(LINE,999)
5703 IF((LINE.GT.999).OR.(LINE.LT.1)) THEN
5704 write(logfid,*)'ERROR in EI: line number out of bound',LINE
5705 ENDIF
5706 DO 27 K=1,2
5707 XA(K)=EIXS(1,LINE-1+K)
5708 YA(K)=EIXS(2,LINE-1+K)
5709 27 CONTINUE
5710 A=(YA(2)-YA(1))/(XA(2)-XA(1))
5711 B=YA(1)-A*XA(1)
5712 Y=-A*X+B
5713 ENDIF
5714 EI=Y
5715 END
5716
5717
5718
5719
5720
5721
5722 DOUBLE PRECISION FUNCTION PQQ(Z)
5723 IMPLICIT NONE
5724 DOUBLE PRECISION Z
5725 PQQ=4.*(1.+Z**2)/(3.*(1.-Z))
5726 END
5727
5728
5729
5730
5731
5732
5733 DOUBLE PRECISION FUNCTION PGQ(Z)
5734 IMPLICIT NONE
5735 DOUBLE PRECISION Z
5736 PGQ=4.*(1.+(1.-Z)**2)/(3.*Z)
5737 END
5738
5739
5740
5741
5742
5743
5744 DOUBLE PRECISION FUNCTION PGG(Z)
5745 IMPLICIT NONE
5746 DOUBLE PRECISION Z
5747 PGG=3.*((1.-Z)/Z + Z/(1.-Z) + Z*(1.-Z))
5748 END
5749
5750
5751
5752
5753
5754
5755 DOUBLE PRECISION FUNCTION PQG(Z)
5756 IMPLICIT NONE
5757 DOUBLE PRECISION Z
5758 PQG=0.5*(Z**2 + (1.-Z)**2)
5759 END
5760
5761
5762
5763
5764
5765
5766 DOUBLE PRECISION FUNCTION ALPHAS(T,LAMBDA)
5767 IMPLICIT NONE
5768
5769 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5770 &ALLHAD,compress,NF
5771 INTEGER NF
5772 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5773 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5774
5775 DOUBLE PRECISION T,L0,PI,LAMBDA
5776 DATA PI/3.141592653589793d0/
5777
5778 ALPHAS=4.*PI/((11.-2.*NF/3.)*LOG(T/LAMBDA**2))
5779 END
5780
5781
5782
5783
5784
5785
5786 SUBROUTINE SPLITFNCINT(EMAX)
5787 IMPLICIT NONE
5788
5789 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5790 &ALLHAD,compress,NF
5791 INTEGER NF
5792 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5793 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5794
5795 COMMON/SPLITINT/SPLITIGGV(1000,1000),SPLITIQQV(1000,1000),
5796 &SPLITIQGV(1000,1000),QVAL(1000),ZMVAL(1000),QMAX,ZMMIN,NPOINT
5797 INTEGER NPOINT
5798 DOUBLE PRECISION SPLITIGGV,SPLITIQQV,SPLITIQGV,
5799 &QVAL,ZMVAL,QMAX,ZMMIN
5800
5801 COMMON/INTSPLITF/QQUAD,FM
5802 DOUBLE PRECISION QQUAD,FM
5803
5804 common/rapmax/etamax
5805 double precision etamax
5806
5807 INTEGER NSTEP,I,J
5808 DOUBLE PRECISION EMAX,ZMMAX,EPSI,HFIRST,YSTART,LNZMMIN,
5809 &LNZMMAX,ZM,ZM2,Q,GETMSMAX,avmom(5),shat,pcms2
5810 DATA ZMMAX/0.5/
5811 DATA NSTEP/999/
5812 DATA EPSI/1.d-5/
5813
5814 call maxscatcen(avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
5815 shat = avmom(5)**2 +
5816 & 2.*emax*(avmom(4)+sqrt(avmom(1)**2+avmom(2)**2+avmom(3)**2))
5817 pcms2 = (shat-avmom(5)**2)**2/(4.*shat)
5818 qmax = sqrt(scalefacm*4.*pcms2)
5819
5820 ZMMIN=Q0/EMAX
5821
5822 LNZMMIN=LOG(ZMMIN)
5823 LNZMMAX=LOG(ZMMAX)
5824
5825 NPOINT=NSTEP
5826
5827 DO 100 I=1,NSTEP+1
5828 Q=(I-1)*(QMAX-Q0)/NSTEP+Q0
5829 QVAL(I)=Q
5830 QQUAD=Q**2
5831 DO 110 J=1,NSTEP+1
5832 ZM=EXP((J-1)*(LNZMMAX-LNZMMIN)/NSTEP+LNZMMIN)
5833 ZMVAL(J)=ZM
5834 IF(Q**2.LT.Q0**2)THEN
5835 ZM2=0.5
5836 ELSE
5837 ZM2=0.5-0.5*SQRT(1.-Q0**2/Q**2)
5838 ENDIF
5839 ZM=MAX(ZM,ZM2)
5840 IF(ZM.EQ.0.5)THEN
5841 SPLITIQQV(I,J)=0.d0
5842 SPLITIGGV(I,J)=0.d0
5843 SPLITIQGV(I,J)=0.d0
5844 ELSE
5845 YSTART=0d0
5846 HFIRST=0.01
5847 FM=0.d0
5848 CALL ODEINT(YSTART,ZM,1.-ZM,EPSI,HFIRST,0d0,2)
5849 SPLITIQQV(I,J)=YSTART
5850 YSTART=0d0
5851 HFIRST=0.01
5852 FM=0.d0
5853 CALL ODEINT(YSTART,ZM,1.-ZM,EPSI,HFIRST,0d0,3)
5854 SPLITIGGV(I,J)=YSTART
5855 YSTART=0d0
5856 HFIRST=0.01
5857 FM=0.d0
5858 CALL ODEINT(YSTART,ZM,1.-ZM,EPSI,HFIRST,0d0,4)
5859 SPLITIQGV(I,J)=YSTART
5860 ENDIF
5861 110 CONTINUE
5862 100 CONTINUE
5863
5864 END
5865
5866
5867
5868
5869
5870
5871 SUBROUTINE PDFINT(EMAX)
5872 IMPLICIT NONE
5873
5874 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5875 &ALLHAD,compress,NF
5876 INTEGER NF
5877 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5878 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5879
5880 COMMON/PDFS/QINQX(2,1000),GINQX(2,1000),QINGX(2,1000),
5881 &GINGX(2,1000)
5882 DOUBLE PRECISION QINQX,GINQX,QINGX,GINGX
5883
5884 COMMON/PDFINTV/XMAX,Z
5885 DOUBLE PRECISION XMAX,Z
5886
5887 common/rapmax/etamax
5888 double precision etamax
5889
5890 INTEGER I,J
5891 DOUBLE PRECISION EMAX,Q2,GETPDFXINTEXACT,YSTART,HFIRST,EPSI,
5892 &Q2MAX,DELTAQ2,avmom(5),shat,pcms2
5893 DATA EPSI/1.d-4/
5894
5895 call maxscatcen(avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
5896 shat = avmom(5)**2 +
5897 & 2.*emax*(avmom(4)+sqrt(avmom(1)**2+avmom(2)**2+avmom(3)**2))
5898 pcms2 = (shat-avmom(5)**2)**2/(4.*shat)
5899 q2max = scalefacm*4.*pcms2
5900
5901 DELTAQ2=LOG(Q2MAX)-LOG(Q0**2)
5902 QINQX(1,1)=Q0**2
5903 GINQX(1,1)=Q0**2
5904 QINGX(1,1)=Q0**2
5905 GINGX(1,1)=Q0**2
5906 QINQX(2,1)=0.d0
5907 GINQX(2,1)=0.d0
5908 QINGX(2,1)=0.d0
5909 GINGX(2,1)=0.d0
5910 DO 12 J=2,1000
5911 Q2 = EXP((J-1)*DELTAQ2/999.d0 + LOG(Q0**2))
5912 QINQX(1,J)=Q2
5913 GINQX(1,J)=Q2
5914 QINGX(1,J)=Q2
5915 GINGX(1,J)=Q2
5916 QINQX(2,J)=GETPDFXINTEXACT(SQRT(Q2),'QQ')
5917 GINQX(2,J)=GETPDFXINTEXACT(SQRT(Q2),'GQ')
5918 QINGX(2,J)=GETPDFXINTEXACT(SQRT(Q2),'QG')
5919 GINGX(2,J)=GETPDFXINTEXACT(SQRT(Q2),'GG')
5920 12 CONTINUE
5921 END
5922
5923
5924
5925
5926
5927
5928 SUBROUTINE XSECINT(EMAX)
5929 IMPLICIT NONE
5930
5931 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
5932 &ALLHAD,compress,NF
5933 INTEGER NF
5934 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
5935 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
5936
5937 COMMON/XSECS/INTQ1(1001,101),INTQ2(1001,101),
5938 &INTG1(1001,101),INTG2(1001,101)
5939 DOUBLE PRECISION INTQ1,INTQ2,INTG1,INTG2
5940
5941 COMMON/XSECV/QLOW,MDX
5942 DOUBLE PRECISION QLOW,MDX
5943
5944 common/rapmax/etamax
5945 double precision etamax
5946
5947 INTEGER J,K
5948 DOUBLE PRECISION EMAX,TMAX,TMAXMAX,DELTATMAX,YSTART,HFIRST,EPSI,
5949 &GETMSMAX,GETMDMAX,MDMIN,MDMAX,DELTAMD,GETMDMIN,avmom(5),shat,pcms2
5950 DATA EPSI/1.d-4/
5951
5952 call maxscatcen(avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
5953 shat = avmom(5)**2 +
5954 & 2.*emax*(avmom(4)+sqrt(avmom(1)**2+avmom(2)**2+avmom(3)**2))
5955 pcms2 = (shat-avmom(5)**2)**2/(4.*shat)
5956 tmaxmax = scalefacm*4.*pcms2
5957 DELTATMAX=(LOG(TMAXMAX)-
5958 & LOG(Q0**2*(1.d0+1.d-6)/SCALEFACM**2))/999.d0
5959 MDMIN=GETMDMIN()
5960 MDMAX=MAX(MDMIN,GETMDMAX())
5961 DELTAMD=(MDMAX-MDMIN)/99.d0
5962
5963 DO 12 J=1,1000
5964 TMAX = EXP((J-1)*DELTATMAX
5965 & + LOG(Q0**2*(1.d0+1.d-6)/SCALEFACM**2))
5966 INTQ1(J,101)=TMAX
5967 INTQ2(J,101)=TMAX
5968 INTG1(J,101)=TMAX
5969 INTG2(J,101)=TMAX
5970 DO 13 K=1,100
5971 MDX=MDMIN+(K-1)*DELTAMD
5972 INTQ1(1001,K)=MDX
5973 INTQ2(1001,K)=MDX
5974 INTG1(1001,K)=MDX
5975 INTG2(1001,K)=MDX
5976 IF(TMAX.LT.Q0**2/SCALEFACM**2)THEN
5977 INTQ1(J,K)=0.d0
5978 INTQ2(J,K)=0.d0
5979 INTG1(J,K)=0.d0
5980 INTG2(J,K)=0.d0
5981 ELSE
5982
5983 QLOW=Q0
5984 HFIRST=0.01*(TMAX-Q0**2/SCALEFACM**2)
5985 YSTART=0.d0
5986 CALL ODEINT(YSTART,Q0**2/SCALEFACM**2,TMAX,EPSI,HFIRST
5987 & ,0.d0,11)
5988 INTQ1(J,K)=YSTART
5989
5990 QLOW=Q0
5991 HFIRST=0.01*(TMAX-Q0**2/SCALEFACM**2)
5992 YSTART=0.d0
5993 CALL ODEINT(YSTART,Q0**2/SCALEFACM**2,TMAX,EPSI,HFIRST
5994 & ,0.d0,14)
5995 INTQ2(J,K)=YSTART
5996
5997 QLOW=Q0
5998 YSTART=0.d0
5999 CALL ODEINT(YSTART,Q0**2/SCALEFACM**2,TMAX,EPSI,HFIRST
6000 & ,0.d0,12)
6001 INTG1(J,K)=YSTART
6002
6003 QLOW=Q0
6004 YSTART=0.d0
6005 CALL ODEINT(YSTART,Q0**2/SCALEFACM**2,TMAX,EPSI,HFIRST
6006 & ,0.d0,13)
6007 INTG2(J,K)=YSTART
6008 ENDIF
6009 13 CONTINUE
6010 12 CONTINUE
6011 END
6012
6013
6014
6015
6016
6017
6018 SUBROUTINE INSUDAINT(EMAX)
6019 IMPLICIT NONE
6020
6021 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
6022 &ALLHAD,compress,NF
6023 INTEGER NF
6024 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
6025 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
6026
6027 COMMON/INSUDA/SUDAQQ(1000,2),SUDAQG(1000,2),SUDAGG(1000,2),
6028 &SUDAGC(1000,2)
6029 DOUBLE PRECISION SUDAQQ,SUDAQG,SUDAGG,SUDAGC
6030
6031 common/rapmax/etamax
6032 double precision etamax
6033
6034 INTEGER I
6035 DOUBLE PRECISION QMAX,Q,GETINSUDAKOV,DELTA,EMAX,avmom(5),
6036 &shat,pcms2
6037
6038 call maxscatcen(avmom(1),avmom(2),avmom(3),avmom(4),avmom(5))
6039 shat = avmom(5)**2 +
6040 & 2.*emax*(avmom(4)+sqrt(avmom(1)**2+avmom(2)**2+avmom(3)**2))
6041 pcms2 = (shat-avmom(5)**2)**2/(4.*shat)
6042 qmax = sqrt(scalefacm*4.*pcms2)
6043 DELTA=(LOG(3.*QMAX)-LOG(Q0**2*(1.d0+1.d-6)))/999.d0
6044 DO 22 I=1,1000
6045 Q = EXP((I-1)*DELTA + LOG(Q0**2*(1.d0+1.d-6)))
6046 SUDAQQ(I,1)=Q
6047 SUDAQG(I,1)=Q
6048 SUDAGG(I,1)=Q
6049 SUDAGC(I,1)=Q
6050 SUDAQQ(I,2)=GETINSUDAKOV(Q0,Q,'QQ')
6051 SUDAQG(I,2)=GETINSUDAKOV(Q0,Q,'QG')
6052 SUDAGG(I,2)=GETINSUDAKOV(Q0,Q,'GG')
6053 SUDAGC(I,2)=GETINSUDAKOV(Q0,Q,'GC')
6054 22 CONTINUE
6055 END
6056
6057
6058
6059
6060
6061
6062 SUBROUTINE EIXINT
6063 IMPLICIT NONE
6064
6065 COMMON/EXPINT/EIXS(3,1000),VALMAX,NVAL
6066 INTEGER NVAL
6067 DOUBLE PRECISION EIXS,VALMAX
6068
6069 INTEGER I,K
6070 DOUBLE PRECISION X,EPSI,HFIRST,YSTART,EI,GA,R
6071 DATA EPSI/1.d-5/
6072
6073 NVAL=1000
6074 VALMAX=55.
6075
6076 DO 10 I=1,NVAL
6077 X=I*VALMAX/(NVAL*1.d0)
6078 EIXS(1,I)=X
6079
6080 YSTART=0d0
6081 HFIRST=0.01
6082 CALL ODEINT(YSTART,X,1000.d0,EPSI,HFIRST,0.d0,5)
6083 EIXS(2,I)=-YSTART
6084
6085 IF (X.EQ.0.0) THEN
6086 EI=-1.0D+300
6087 ELSE IF (X.LE.40.0) THEN
6088 EI=1.0D0
6089 R=1.0D0
6090 DO 15 K=1,100
6091 R=R*K*X/(K+1.0D0)**2
6092 EI=EI+R
6093 IF (DABS(R/EI).LE.1.0D-15) GO TO 20
6094 15 CONTINUE
6095 20 GA=0.5772156649015328D0
6096 EI=GA+DLOG(X)+X*EI
6097 ELSE
6098 EI=1.0D0
6099 R=1.0D0
6100 DO 25 K=1,20
6101 R=R*K/X
6102 25 EI=EI+R
6103 EI=DEXP(X)/X*EI
6104 ENDIF
6105 EIXS(3,I)=EI
6106 10 CONTINUE
6107 END
6108
6109
6110
6111
6112
6113
6114 subroutine odeint(ystart,a,b,eps,h1,hmin,w1)
6115 implicit none
6116
6117 common/hepmcid/hpmcfid,logfid
6118 integer hpmcfid,logfid
6119
6120 integer nmax,nstep,w1
6121 double precision ystart,a,b,eps,h1,hmin,x,h,y,dydx,
6122 &deriv,yscale,hdid,hnew
6123 data nmax/100000/
6124
6125 x = a
6126 y = ystart
6127 h = sign(h1,b-a)
6128 do 20 nstep=1,nmax
6129 dydx = deriv(x,w1)
6130 yscale = abs(y) + abs(h*dydx) + 1.e-25
6131 if (((x + h - b)*h).gt.0.) h = b-x
6132 call rkstepper(x,y,dydx,h,hdid,hnew,yscale,eps,w1)
6133 if ((x - b)*h.ge.0) then
6134 ystart = y
6135 return
6136 endif
6137 h = hnew
6138 if (abs(h).lt.abs(hmin)) then
6139 write(logfid,*)'Error in odeint: stepsize too small',w1
6140 & ,ystart,a,b,h1
6141 return
6142 endif
6143 20 continue
6144 write(logfid,*)'Error in odeint: too many steps',w1
6145 & ,ystart,a,b,h1
6146 end
6147
6148
6149
6150
6151
6152
6153 subroutine rkstepper(x,y,dydx,htest,hdid,hnew,yscale,eps,w1)
6154 implicit none
6155
6156 common/hepmcid/hpmcfid,logfid
6157 integer hpmcfid,logfid
6158
6159 integer w1
6160 double precision x,y,dydx,htest,hdid,hnew,yscale,eps,
6161 &yhalf,y1,y2,rk4step,dydxhalf,xnew,delta,err,h,safety, powerdown,
6162 &powerup,maxup,maxdown,deriv,fac
6163 logical reject
6164 data powerdown/0.25/
6165 data powerup/0.2/
6166 data safety/0.9/
6167 data maxdown/10./
6168 data maxup/5./
6169
6170 reject = .false.
6171 h = htest
6172 10 xnew = x + h
6173 if (x.eq.xnew) then
6174 write(logfid,*)'Error in rkstepper: step size not significant'
6175 return
6176 endif
6177 yhalf = rk4step(x,y,dydx,h/2.,w1)
6178 dydxhalf = deriv(x+h/2.,w1)
6179 y2 = rk4step(x+h/2.,yhalf,dydxhalf,h/2.,w1)
6180 y1 = rk4step(x,y,dydx,h,w1)
6181 delta = y2-y1
6182 err = abs(delta)/(yscale*eps)
6183 if (err.gt.1.) then
6184 reject = .true.
6185 fac = max(1./maxdown,safety/err**powerdown)
6186 h = h*fac
6187 goto 10
6188 else
6189 if (reject) then
6190 hnew = h
6191 else
6192 fac = min(maxup,safety/err**powerup)
6193 hnew = fac*h
6194 endif
6195 x = xnew
6196 y = y2 + delta/15.
6197 hdid = h
6198 endif
6199 end
6200
6201
6202
6203
6204
6205
6206 double precision function rk4step(x,y,dydx,h,w1)
6207 implicit none
6208 integer w1
6209 double precision x,y,dydx,h,k1,k2,k4,yout,deriv
6210 k1 = h*dydx
6211 k2 = h*deriv(x+h/2.,w1)
6212 k4 = h*deriv(x+h,w1)
6213 yout = y+k1/6.+2.*k2/3.+k4/6.
6214 rk4step = yout
6215 end
6216
6217
6218
6219
6220
6221
6222 LOGICAL FUNCTION GETDELTAT(LINE,TSTART,DTMAX1,DELTAT)
6223 IMPLICIT NONE
6224
6225 common/hepmcid/hpmcfid,logfid
6226 integer hpmcfid,logfid
6227
6228 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6229 INTEGER N,NPAD,K
6230 DOUBLE PRECISION P,V
6231
6232 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
6233 &ALLHAD,compress,NF
6234 INTEGER NF
6235 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
6236 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
6237
6238 COMMON/TIME/MV(23000,5)
6239 DOUBLE PRECISION MV
6240
6241 common/rapmax/etamax
6242 double precision etamax
6243
6244 common/errline/errl
6245 integer errl
6246
6247 INTEGER LINE,I,NNULL
6248 DOUBLE PRECISION DTMAX,SIGMAMAX,NEFFMAX,LINVMAX,PYR,
6249 &R,TOFF,XS,YS,ZS,TS,GETSSCAT,GETMSMAX,GETMDMIN,MSMAX,MDMIN,
6250 &XSTART,YSTART,ZSTART,WEIGHT,MS,MD,NEFF,SIGMA,GETNEFF,
6251 &GETNEFFMAX,GETMS,GETMD,TAU,MDMAX,GETMDMAX,GETNATMDMIN,
6252 &SIGMAMIN,NEFFMIN,TSTART,DTMAX1,DELTAT
6253 CHARACTER PTYPE
6254 LOGICAL STOPNOW
6255
6256
6257 GETDELTAT=.FALSE.
6258 DELTAT=0.D0
6259 DTMAX=DTMAX1
6260 IF(K(LINE,2).EQ.21)THEN
6261 PTYPE='G'
6262 ELSE
6263 PTYPE='Q'
6264 ENDIF
6265
6266 NNULL=0
6267 STOPNOW=.FALSE.
6268
6269
6270 IF((TSTART+DTMAX).GE.LTIME)DTMAX=LTIME-TSTART
6271 IF(DTMAX.LT.0.D0) RETURN
6272
6273
6274 TOFF=TSTART-MV(LINE,4)
6275 XSTART=MV(LINE,1)+TOFF*P(LINE,1)/P(LINE,4)
6276 YSTART=MV(LINE,2)+TOFF*P(LINE,2)/P(LINE,4)
6277 ZSTART=MV(LINE,3)+TOFF*P(LINE,3)/P(LINE,4)
6278
6279
6280 SIGMAMAX=GETSSCAT(P(LINE,4),p(line,1),p(line,2),p(line,3),
6281 ! & xstart,ystart,-sign(abs(zstart),p(line,3)),zstart+1.d-6)
6282 & P(LINE,5),0.d0,PTYPE,'C',xstart,ystart,zstart,tstart,1)
6283 SIGMAMIN=GETSSCAT(P(LINE,4),p(line,1),p(line,2),p(line,3),
6284 ! & xstart,ystart,-sign(abs(zstart),p(line,3)),zstart+1.d-6)
6285 & P(LINE,5),0.d0,PTYPE,'C',xstart,ystart,zstart,tstart,2)
6286 NEFFMAX=GETNEFFMAX()
6287 NEFFMIN=GETNATMDMIN()
6288 LINVMAX=5.d0*MAX(NEFFMIN*SIGMAMAX,NEFFMAX*SIGMAMIN)
6289 if(linvmax.eq.0.d0) return
6290
6291 DO 333 I=1,1000000
6292 DELTAT=DELTAT-LOG(PYR(0))/LINVMAX
6293 XS=XSTART+DELTAT*P(LINE,1)/P(LINE,4)
6294 YS=YSTART+DELTAT*P(LINE,2)/P(LINE,4)
6295 ZS=ZSTART+DELTAT*P(LINE,3)/P(LINE,4)
6296 TS=TSTART+DELTAT
6297 IF(TS.LT.ZS)THEN
6298 TAU=-1.d0
6299 ELSE
6300 TAU=SQRT(TS**2-ZS**2)
6301 ENDIF
6302 NEFF=GETNEFF(XS,YS,ZS,TS)
6303 IF((TAU.GT.1.d0).AND.(NEFF.EQ.0.d0))THEN
6304 IF(NNULL.GT.4)THEN
6305 STOPNOW=.TRUE.
6306 ELSE
6307 NNULL=NNULL+1
6308 ENDIF
6309 ELSE
6310 NNULL=0
6311 ENDIF
6312 IF((DELTAT.GT.DTMAX).OR.STOPNOW) THEN
6313 DELTAT=DTMAX
6314 RETURN
6315 ENDIF
6316 IF(NEFF.GT.0.d0)THEN
6317 SIGMA=GETSSCAT(P(LINE,4),p(line,1),p(line,2),p(line,3),
6318 & P(LINE,5),0.d0,PTYPE,'C',xs,ys,zs,ts,0)
6319 ELSE
6320 SIGMA=0.d0
6321 ENDIF
6322 WEIGHT=5.d0*NEFF*SIGMA/LINVMAX
6323 IF(WEIGHT.GT.1.d0+1d-6) then
6324 if (line.ne.errl) then
6325 write(logfid,*)'error in GETDELTAT: weight > 1',WEIGHT,
6326 & NEFF*SIGMA/(NEFFMAX*SIGMAMIN),NEFF*SIGMA/(NEFFMIN*SIGMAMAX),
6327 & p(line,4)
6328 errl=line
6329 endif
6330 endif
6331 R=PYR(0)
6332 IF(R.LT.WEIGHT)THEN
6333 GETDELTAT=.TRUE.
6334 RETURN
6335 ENDIF
6336 333 CONTINUE
6337 END
6338
6339
6340 integer function poissonian(lambda)
6341 implicit none
6342 integer n
6343 double precision lambda,disc,p,pyr,u,v,pi
6344 data pi/3.141592653589793d0/
6345
6346 if (lambda.gt.745.d0) then
6347 u = pyr(0);
6348 v = pyr(0);
6349 poissonian =
6350 & int(sqrt(lambda)*sqrt(-2.*log(u))*cos(2.*pi*v)+lambda)
6351 else
6352 disc=exp(-lambda)
6353 p=1.d0
6354 n=0
6355 800 p = p*pyr(0)
6356 if (p.gt.disc) then
6357 n = n+1
6358 goto 800
6359 endif
6360 poissonian=n
6361 endif
6362 end
6363
6364
6365
6366
6367
6368 LOGICAL FUNCTION ISHADRON(ID)
6369 IMPLICIT NONE
6370
6371 INTEGER ID
6372 IF(ABS(ID).LT.100) THEN
6373 ISHADRON=.FALSE.
6374 ELSE
6375 IF(MOD(INT(ABS(ID)/10.),10).EQ.0) THEN
6376 ISHADRON = .FALSE.
6377 ELSE
6378 ISHADRON = .TRUE.
6379 ENDIF
6380 ENDIF
6381 END
6382
6383
6384
6385
6386
6387
6388 LOGICAL FUNCTION ISDIQUARK(ID)
6389 IMPLICIT NONE
6390
6391 INTEGER ID
6392 IF(ABS(ID).LT.1000) THEN
6393 ISDIQUARK=.FALSE.
6394 ELSE
6395 IF(MOD(INT(ID/10),10).EQ.0) THEN
6396 ISDIQUARK = .TRUE.
6397 ELSE
6398 ISDIQUARK = .FALSE.
6399 ENDIF
6400 ENDIF
6401 END
6402
6403
6404
6405
6406 LOGICAL FUNCTION ISLEPTON(ID)
6407 IMPLICIT NONE
6408
6409 INTEGER ID
6410 IF((ABS(ID).EQ.11).OR.(ABS(ID).EQ.13).OR.(ABS(ID).EQ.15)) THEN
6411 ISLEPTON=.TRUE.
6412 ELSE
6413 ISLEPTON=.FALSE.
6414 ENDIF
6415 END
6416
6417
6418
6419
6420 LOGICAL FUNCTION ISPARTON(ID)
6421 IMPLICIT NONE
6422
6423 INTEGER ID
6424 LOGICAL ISDIQUARK
6425 IF((ABS(ID).LT.6).OR.(ID.EQ.21).OR.ISDIQUARK(ID)) THEN
6426 ISPARTON=.TRUE.
6427 ELSE
6428 ISPARTON=.FALSE.
6429 ENDIF
6430 END
6431
6432
6433
6434
6435
6436
6437 logical function isprimstring(l)
6438 implicit none
6439 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6440 INTEGER N,NPAD,K
6441 DOUBLE PRECISION P,V
6442
6443 integer l
6444 logical isparton
6445 if ((K(l,2).ne.91).and.(K(l,2).ne.92)) then
6446 isprimstring=.false.
6447 return
6448 endif
6449 if ((K(K(l,3),3).eq.0).or.(isparton(K(K(K(l,3),3),2)))) then
6450 isprimstring=.true.
6451 else
6452 isprimstring=.false.
6453 endif
6454 end
6455
6456
6457
6458
6459
6460
6461 logical function issecstring(l)
6462 implicit none
6463 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6464 INTEGER N,NPAD,K
6465 DOUBLE PRECISION P,V
6466
6467 integer l
6468 logical isparton,isprimstring
6469 if ((K(l,2).ne.91).and.(K(l,2).ne.92)) then
6470 issecstring = .false.
6471 return
6472 endif
6473 if (isprimstring(l)) then
6474 issecstring = .false.
6475 return
6476 endif
6477 if (isparton(K(K(K(l,3),3),2))) then
6478 issecstring = .false.
6479 else
6480 issecstring = .true.
6481 endif
6482 end
6483
6484
6485
6486
6487
6488
6489 logical function isprimhadron(l)
6490 implicit none
6491 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6492 INTEGER N,NPAD,K
6493 DOUBLE PRECISION P,V
6494
6495 integer l
6496 logical isprimstring,isparton
6497 if (((K(K(l,3),2).EQ.91).OR.(K(K(l,3),2).EQ.92))
6498 & .and.isprimstring(K(l,3))
6499 & .and.(.not.isparton(K(l,2)))) then
6500 isprimhadron=.true.
6501 else
6502 isprimhadron=.false.
6503 endif
6504 if (k(l,1).eq.17) isprimhadron=.true.
6505 end
6506
6507
6508
6509
6510
6511
6512 logical function compressevent(l1)
6513 implicit none
6514
6515 common/hepmcid/hpmcfid,logfid
6516 integer hpmcfid,logfid
6517 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6518 INTEGER N,NPAD,K
6519 DOUBLE PRECISION P,V
6520
6521 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
6522 DOUBLE PRECISION ZA,ZD,THETAA
6523 LOGICAL QQBARD
6524
6525 COMMON/TIME/MV(23000,5)
6526 DOUBLE PRECISION MV
6527
6528 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
6529 INTEGER TRIP,ANTI,COLMAX
6530
6531 integer l1,i,j,nold,nnew,nstart
6532
6533 nold = n
6534
6535 do 777 i=2,nold
6536 if (((k(i,1).eq.11).or.(k(i,1).eq.12).or.(k(i,1).eq.13)).and.
6537 & (i.ne.l1)) then
6538 nnew = i
6539 goto 778
6540 endif
6541 777 continue
6542 compressevent = .false.
6543 return
6544 778 continue
6545 nstart = nnew
6546 do 779 i=nstart,nold
6547 if (((k(i,1).ne.11).and.(k(i,1).ne.12).and.(k(i,1).ne.13)).or.
6548 & (i.eq.l1)) then
6549 do 780 j=1,5
6550 p(nnew,j)=p(i,j)
6551 v(nnew,j)=v(i,j)
6552 mv(nnew,j)=mv(i,j)
6553 780 continue
6554 trip(nnew)=trip(i)
6555 anti(nnew)=anti(i)
6556 za(nnew)=za(i)
6557 zd(nnew)=zd(i)
6558 thetaa(nnew)=thetaa(i)
6559 qqbard(nnew)=qqbard(i)
6560 k(nnew,1)=k(i,1)
6561 k(nnew,2)=k(i,2)
6562 k(nnew,3)=0
6563 k(nnew,4)=0
6564 k(nnew,5)=0
6565 if (l1.eq.i) l1=nnew
6566 nnew=nnew+1
6567 endif
6568 779 continue
6569 n=nnew-1
6570 if ((nold-n).le.10) then
6571 compressevent = .false.
6572 else
6573 compressevent = .true.
6574 endif
6575 do 781 i=nnew,nold
6576 do 782 j=1,5
6577 k(i,j)=0
6578 p(i,j)=0.d0
6579 v(i,j)=0.d0
6580 mv(i,j)=0.d0
6581 782 continue
6582 trip(i)=0
6583 anti(i)=0
6584 za(i)=0.d0
6585 zd(i)=0.d0
6586 thetaa(i)=0.d0
6587 qqbard(i)=.false.
6588 781 continue
6589 if (n.gt.23000) write(logfid,*)'Error in compressevent: n = ',n
6590 if (l1.gt.n) write(logfid,*)'Error in compressevent: l1 = ',l1
6591 call flush(logfid)
6592 return
6593 end
6594
6595
6596
6597
6598
6599
6600 SUBROUTINE PEVREC(NUM,COL)
6601
6602 implicit none
6603 common/hepmcid/hpmcfid,logfid
6604 integer hpmcfid,logfid
6605 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6606 INTEGER N,NPAD,K
6607 DOUBLE PRECISION P,V
6608
6609 COMMON/ANGOR/ZA(23000),ZD(23000),THETAA(23000),QQBARD(23000)
6610 DOUBLE PRECISION ZA,ZD,THETAA
6611 LOGICAL QQBARD
6612
6613 COMMON/TIME/MV(23000,5)
6614 DOUBLE PRECISION MV
6615
6616 COMMON/COLOUR/TRIP(23000),ANTI(23000),COLMAX
6617 INTEGER TRIP,ANTI,COLMAX
6618 INTEGER NUM,i
6619 LOGICAL COL
6620
6621 DO 202 I=1,N
6622 V(I,1)=MV(I,1)
6623 V(I,2)=MV(I,2)
6624 V(I,3)=MV(I,3)
6625 V(I,4)=MV(I,4)
6626 V(I,5)=MV(I,5)
6627 IF(COL) write(logfid,*)I,' (',TRIP(I),',',ANTI(I),') [',
6628 &K(I,3),K(I,4),K(I,5),' ] {',K(I,2),K(I,1),' } ',
6629 &ZD(I),THETAA(I)
6630 202 CONTINUE
6631 CALL PYLIST(NUM)
6632
6633 END
6634
6635
6636
6637
6638
6639
6640 SUBROUTINE CONVERTTOHEPMC(J,EVNUM,PID,beam1,beam2)
6641 IMPLICIT NONE
6642 COMMON/PYJETS/N,NPAD,K(23000,5),P(23000,5),V(23000,5)
6643 INTEGER N,NPAD,K
6644 DOUBLE PRECISION P,V
6645 COMMON/PYPARS/MSTP(200),PARP(200),MSTI(200),PARI(200)
6646 INTEGER MSTP,MSTI
6647 DOUBLE PRECISION PARP,PARI
6648
6649 COMMON/PARAM/Q0,LPS,LQCD,LTIME,SCALEFACM,ANGORD,SCATRECOIL,
6650 &ALLHAD,compress,NF
6651 INTEGER NF
6652 DOUBLE PRECISION Q0,LQCD,LTIME,LPS,SCALEFACM
6653 LOGICAL ANGORD,SCATRECOIL,ALLHAD,compress
6654
6655 common/evrecord/nsim,npart,offset,hadrotype,sqrts,collider,hadro,
6656 &shorthepmc,channel,isochannel
6657 integer nsim,npart,offset,hadrotype
6658 double precision sqrts
6659 character*4 collider,channel
6660 character*2 isochannel
6661 logical hadro,shorthepmc
6662
6663 common/storescatcen/nscatcen,maxnscatcen,scatflav(10000),
6664 &scatcen(10000,5),writescatcen,writedummies
6665 integer nscatcen,maxnscatcen,scatflav
6666 double precision scatcen
6667 logical writescatcen,writedummies
6668
6669 INTEGER EVNUM,PBARCODE,VBARCODE,CODELIST(25000),I,PID,NSTART,
6670 &NFIRST,NVERTEX,NTOT,J,CODEFIRST
6671 DOUBLE PRECISION mproton,mneutron,pdummy,pscatcen
6672 LOGICAL ISHADRON,ISDIQUARK,ISPARTON,isprimhadron,isprimstring,
6673 &issecstring
6674 character*2 beam1,beam2
6675 data mproton/0.9383/
6676 data mneutron/0.9396/
6677 data pdummy/1.d-6/
6678
6679 5000 FORMAT(A2,I10,I3,3E14.6,2I2,I6,4I2,E14.6)
6680 5100 FORMAT(A2,2E14.6)
6681 5200 FORMAT(A2,6I7,2I2,1I7,4E14.6)
6682 5300 FORMAT(A2,2I2,5E14.6,2I2)
6683 5400 FORMAT(A2,I6,6I2,I6,I2)
6684 5500 FORMAT(A2,I6,I6,5E14.6,3I2,I6,I2)
6685
6686 PBARCODE=0
6687 VBARCODE=0
6688
6689 if (shorthepmc) then
6690
6691 IF(COLLIDER.EQ.'EEJJ')THEN
6692 NVERTEX=3
6693 PBARCODE=5
6694 ELSE
6695 NVERTEX=1
6696 PBARCODE=2
6697 ENDIF
6698 nfirst = 0
6699 do 131 i=1,N
6700 if (((k(i,1).lt.6).or.(k(i,1).eq.17)))
6701 & nfirst = nfirst+1
6702 131 continue
6703 if(writescatcen) NFIRST=NFIRST+nscatcen
6704 if(writedummies) NFIRST=NFIRST+nscatcen
6705
6706 WRITE(J,5000)'E ',EVNUM,-1,0.d0,0.d0,0.d0,0,0,NVERTEX,1,2,0,1,
6707 &PARI(10)
6708 WRITE(J,'(A2,I2,A5)')'N ',1,'"0"'
6709 WRITE(J,'(A)')'U GEV MM'
6710 WRITE(J,5100)'C ',PARI(1)*1.d9,0.d0
6711 WRITE(J,5200)'H ',0,0,0,0,0,0,0,0,0,0.d0,0.d0,0.d0,0.d0
6712 WRITE(J,5300)'F ',0,0,-1.d0,-1.d0,-1.d0,-1.d0,-1.d0,0,0
6713
6714 IF(COLLIDER.EQ.'EEJJ')THEN
6715 WRITE(J,5400)'V ',-1,0,0,0,0,0,2,1,0
6716 WRITE(J,5500)'P ',1,-11,0.d0,0.d0,sqrts/2.,sqrts/2.,
6717 & 0.00051,2,0,0,-1,0
6718 WRITE(J,5500)'P ',2,11,0.d0,0.d0,-sqrts/2.,sqrts/2.,
6719 & 0.00051,2,0,0,-1,0
6720 WRITE(J,5500)'P ',3,23,0.d0,0.d0,0.d0,sqrts,
6721 & 91.2,2,0,0,-2,0
6722 WRITE(J,5400)'V ',-2,0,0,0,0,0,0,2,0
6723 WRITE(J,5500)'P ',4,PID,sqrts/2.,0.d0,0.d0,sqrts/2.,
6724 & 0.000,2,0,0,-3,0
6725 WRITE(J,5500)'P ',5,-PID,-sqrts/2.,0.d0,0.d0,sqrts/2.,
6726 & 0.000,2,0,0,-3,0
6727 WRITE(J,5400)'V ',-3,0,0,0,0,0,0,NFIRST,0
6728 ELSE
6729 WRITE(J,5400)'V ',-1,0,0,0,0,0,2,NFIRST,0
6730 if (beam1.eq.'p+') then
6731 WRITE(J,5500)'P ',1,2212,0.d0,0.d0,
6732 & sqrt(sqrts**2/4.-mproton**2),sqrts/2.,mproton,2,0,0,-1,0
6733 else
6734 WRITE(J,5500)'P ',1,2112,0.d0,0.d0,
6735 & sqrt(sqrts**2/4.-mneutron**2),sqrts/2.,mneutron,2,0,0,-1,0
6736 endif
6737 if (beam2.eq.'p+') then
6738 WRITE(J,5500)'P ',2,2212,0.d0,0.d0,
6739 & -sqrt(sqrts**2/4.-mproton**2),sqrts/2.,mproton,2,0,0,-1,0
6740 else
6741 WRITE(J,5500)'P ',2,2112,0.d0,0.d0,
6742 & -sqrt(sqrts**2/4.-mneutron**2),sqrts/2.,mneutron,2,0,0,-1,0
6743 endif
6744 ENDIF
6745
6746 if(writescatcen) then
6747 do 133 i=1,nscatcen
6748 pbarcode=pbarcode+1
6749 WRITE(J,5500)'P ',pbarcode,scatflav(i),scatcen(I,1),
6750 & scatcen(I,2),scatcen(I,3),scatcen(I,4),scatcen(I,5),
6751 & 3,0,0,0,0
6752 133 continue
6753 endif
6754
6755 if(writedummies) then
6756 do 135 i=1,nscatcen
6757 pbarcode=pbarcode+1
6758 pscatcen=sqrt(scatcen(I,1)**2+scatcen(I,2)**2+
6759 & scatcen(I,3)**2)
6760 WRITE(J,5500)'P ',pbarcode,111,pdummy*scatcen(I,1)/pscatcen,
6761 & pdummy*scatcen(I,2)/pscatcen,pdummy*scatcen(I,3)/pscatcen,
6762 & pdummy,0.d0,1,0,0,0,0
6763 135 continue
6764 endif
6765
6766 do 132 i=1,N
6767 if(((k(i,1).lt.6).or.(k(i,1).eq.17))) then
6768 pbarcode=pbarcode+1
6769 if((k(i,1).eq.3).or.(k(i,1).eq.5)) then
6770 WRITE(J,5500)'P ',PBARCODE,K(I,2),P(I,1),P(I,2),P(I,3),
6771 & P(I,4),P(I,5),4,0,0,0,0
6772 else
6773 WRITE(J,5500)'P ',PBARCODE,K(I,2),P(I,1),P(I,2),P(I,3),
6774 & P(I,4),P(I,5),1,0,0,0,0
6775 endif
6776 endif
6777 132 continue
6778
6779 else
6780
6781 if (hadro) then
6782
6783 NFIRST=0
6784 IF(COLLIDER.EQ.'EEJJ')THEN
6785 NVERTEX=3
6786 ELSE
6787 NVERTEX=1
6788 ENDIF
6789 DO 123 I=1,N
6790 IF(K(i,3).ne.0)THEN
6791 NSTART=I
6792 GOTO 124
6793 ENDIF
6794 123 CONTINUE
6795 124 CONTINUE
6796 nstart=0
6797
6798 DO 126 I=NSTART+1,N
6799 IF(isprimhadron(i)) NFIRST=NFIRST+1
6800 IF((ISHADRON(K(I,2)).OR.(ABS(K(I,2)).EQ.15))
6801 & .AND.(K(I,4).NE.0)) NVERTEX=NVERTEX+1
6802 126 CONTINUE
6803 127 CONTINUE
6804
6805 if(writescatcen) NFIRST=NFIRST+nscatcen
6806 if(writedummies) NFIRST=NFIRST+nscatcen
6807
6808 WRITE(J,5000)'E ',EVNUM,-1,0.d0,0.d0,0.d0,0,0,NVERTEX,
6809 &1,2,0,1,PARI(10)
6810 WRITE(J,'(A2,I2,A5)')'N ',1,'"0"'
6811 WRITE(J,'(A)')'U GEV MM'
6812 WRITE(J,5100)'C ',PARI(1)*1.d9,0.d0
6813 WRITE(J,5200)'H ',0,0,0,0,0,0,0,0,0,0.d0,0.d0,0.d0,0.d0
6814 WRITE(J,5300)'F ',0,0,-1.d0,-1.d0,-1.d0,-1.d0,-1.d0,0,0
6815
6816
6817 IF(COLLIDER.EQ.'EEJJ')THEN
6818 VBARCODE=-3
6819 PBARCODE=5
6820 ELSE
6821 VBARCODE=-1
6822 PBARCODE=2
6823 ENDIF
6824 IF(COLLIDER.EQ.'EEJJ')THEN
6825 WRITE(J,5400)'V ',-1,0,0,0,0,0,2,1,0
6826 WRITE(J,5500)'P ',1,-11,0.d0,0.d0,sqrts/2.,sqrts/2.,
6827 & 0.00051,2,0,0,-1,0
6828 WRITE(J,5500)'P ',2,11,0.d0,0.d0,-sqrts/2.,sqrts/2.,
6829 & 0.00051,2,0,0,-1,0
6830 WRITE(J,5500)'P ',3,23,0.d0,0.d0,0.d0,sqrts,
6831 & 91.2,2,0,0,-2,0
6832 WRITE(J,5400)'V ',-2,0,0,0,0,0,0,2,0
6833 WRITE(J,5500)'P ',4,PID,sqrts/2.,0.d0,0.d0,sqrts/2.,
6834 & 0.000,2,0,0,-3,0
6835 WRITE(J,5500)'P ',5,-PID,-sqrts/2.,0.d0,0.d0,sqrts/2.,
6836 & 0.000,2,0,0,-3,0
6837 WRITE(J,5400)'V ',VBARCODE,0,0,0,0,0,0,NFIRST,0
6838 ELSE
6839 WRITE(J,5400)'V ',-1,0,0,0,0,0,2,NFIRST,0
6840 if (beam1.eq.'p+') then
6841 WRITE(J,5500)'P ',1,2212,0.d0,0.d0,
6842 & sqrt(sqrts**2/4.-mproton**2),sqrts/2.,mproton,2,0,0,-1,0
6843 else
6844 WRITE(J,5500)'P ',1,2112,0.d0,0.d0,
6845 & sqrt(sqrts**2/4.-mneutron**2),sqrts/2.,mneutron,2,0,0,-1,0
6846 endif
6847 if (beam2.eq.'p+') then
6848 WRITE(J,5500)'P ',2,2212,0.d0,0.d0,
6849 & -sqrt(sqrts**2/4.-mproton**2),sqrts/2.,mproton,2,0,0,-1,0
6850 else
6851 WRITE(J,5500)'P ',2,2112,0.d0,0.d0,
6852 & -sqrt(sqrts**2/4.-mneutron**2),sqrts/2.,mneutron,2,0,0,-1,0
6853 endif
6854 ENDIF
6855
6856 CODEFIRST=NFIRST+PBARCODE
6857
6858
6859 if(writescatcen) then
6860 do 134 i=1,nscatcen
6861 pbarcode=pbarcode+1
6862 WRITE(J,5500)'P ',PBARCODE,scatflav(I),scatcen(I,1),
6863 & scatcen(I,2),scatcen(I,3),scatcen(I,4),scatcen(I,5),
6864 & 3,0,0,0,0
6865 134 continue
6866 endif
6867
6868 if(writedummies) then
6869 do 136 i=1,nscatcen
6870 pbarcode=pbarcode+1
6871 pscatcen=sqrt(scatcen(I,1)**2+scatcen(I,2)**2+
6872 & scatcen(I,3)**2)
6873 WRITE(J,5500)'P ',pbarcode,111,pdummy*scatcen(I,1)/pscatcen,
6874 & pdummy*scatcen(I,2)/pscatcen,pdummy*scatcen(I,3)/pscatcen,
6875 & pdummy,0.d0,1,0,0,0,0
6876 136 continue
6877 endif
6878
6879
6880 DO 125 I=NSTART+1,N
6881 IF(.not.isprimhadron(i))THEN
6882 GOTO 125
6883 ELSE
6884 IF (PBARCODE.EQ.CODEFIRST) GOTO 130
6885 PBARCODE=PBARCODE+1
6886
6887 IF(K(I,4).GT.0)THEN
6888 VBARCODE=VBARCODE-1
6889 CODELIST(I)=VBARCODE
6890 WRITE(J,5500)'P ',PBARCODE,K(I,2),P(I,1),P(I,2),P(I,3),
6891 & P(I,4),P(I,5),2,0,0,VBARCODE,0
6892 ELSE
6893 WRITE(J,5500)'P ',PBARCODE,K(I,2),P(I,1),P(I,2),P(I,3),
6894 & P(I,4),P(I,5),1,0,0,0,0
6895 ENDIF
6896 ENDIF
6897 125 CONTINUE
6898 130 CONTINUE
6899
6900 DO 129 I=NSTART+1,N
6901 if (isprimhadron(i).or.isprimstring(i)) goto 129
6902 if (isparton(K(i,2))) then
6903 if (ishadron(K(K(i,3),2))) codelist(i)=codelist(K(i,3))
6904 goto 129
6905 endif
6906 if (issecstring(i)) then
6907 codelist(i)=codelist(K(i,3))
6908 goto 129
6909 endif
6910 PBARCODE=PBARCODE+1
6911 IF((K(I,3).NE.K(I-1,3)))THEN
6912
6913 WRITE(J,5400)'V ',CODELIST(K(I,3)),0,0,0,0,0,0,
6914 & K(K(I,3),5)-K(K(I,3),4)+1,0
6915 ENDIF
6916
6917 IF(K(I,4).GT.0)THEN
6918 VBARCODE=VBARCODE-1
6919 CODELIST(I)=VBARCODE
6920 WRITE(J,5500)'P ',PBARCODE,K(I,2),P(I,1),P(I,2),P(I,3),
6921 & P(I,4),P(I,5),2,0,0,VBARCODE,0
6922 ELSE
6923 WRITE(J,5500)'P ',PBARCODE,K(I,2),P(I,1),P(I,2),P(I,3),
6924 & P(I,4),P(I,5),1,0,0,0,0
6925 ENDIF
6926 129 CONTINUE
6927
6928 else
6929
6930 endif
6931 endif
6932 call flush(j)
6933 END
6934
6935
6936
6937
6938
6939
6940 subroutine printlogo(fid)
6941 implicit none
6942 integer fid
6943
6944 write(fid,*)
6945 write(fid,*)' _______________'//
6946 &'__________________________ '
6947 write(fid,*)' | '//
6948 &' | '
6949 write(fid,*)' | JJJJJ EEEEE '//
6950 &' W W EEEEE L | '
6951 write(fid,*)' | J E '//
6952 &' W W E L | '
6953 write(fid,*)' _________________| J EEE '//
6954 &' W W W EEE L |_________________ '
6955 write(fid,*)'| | J J E '//
6956 &' W W W W E L | |'
6957 write(fid,*)'| | JJJ EEEEE '//
6958 &' W W EEEEE LLLLL | |'
6959 write(fid,*)'| |_______________'//
6960 &'__________________________| |'
6961 write(fid,*)'| '//
6962 &' |'
6963 write(fid,*)'| '//
6964 &'this is JEWEL 2.1.0 |'
6965 write(fid,*)'| '//
6966 &' |'
6967 write(fid,*)'| Copyright Korinna C. Zapp (2016)'//
6968 &' [Korinna.Zapp@cern.ch] |'
6969 write(fid,*)'| '//
6970 &' |'
6971 write(fid,*)'| The JEWEL homepage is jewel.hepforge.org '//
6972 &' |'
6973 write(fid,*)'| '//
6974 &' |'
6975 write(fid,*)'| The medium model was partly '//
6976 &'implemented by Jochen Klein |'
6977 write(fid,*)'| [Jochen.Klein@cern.ch]. Raghav '//
6978 &'Kunnawalkam Elayavalli helped with the |'
6979 write(fid,*)'| implementation of the V+jet processes '//
6980 &'[raghav.k.e@cern.ch]. |'
6981 write(fid,*)'| '//
6982 &' |'
6983 write(fid,*)'| Please cite JHEP 1303 (2013) '//
6984 &'080 [arXiv:1212.1599] and optionally |'
6985 write(fid,*)'| EPJC C60 (2009) 617 [arXiv:0804.3568] '//
6986 &'for the physics and arXiv:1311.0048 |'
6987 write(fid,*)'| for the code. The reference for '//
6988 &'V+jet processes is EPJC 76 (2016) no.12 695 |'
6989 write(fid,*)'| [arXiv:1608.03099] and for recoil effects'//
6990 &' it is arXiv:1707.01539. |'
6991 write(fid,*)'| '//
6992 &' |'
6993 write(fid,*)'| JEWEL contains code provided by '//
6994 &'S. Zhang and J. M. Jing |'
6995 write(fid,*)'| (Computation of Special Functions, '//
6996 &'John Wiley & Sons, New York, 1996 and |'
6997 write(fid,*)'| http://jin.ece.illinois.edu) for '//
6998 &'computing the exponential integral Ei(x). |'
6999 write(fid,*)'| '//
7000 &' |'
7001 write(fid,*)'| JEWEL relies heavily on PYTHIA 6'//
7002 &' for the event generation. The modified |'
7003 write(fid,*)'| version of PYTHIA 6.4.25 that is'//
7004 &' shipped with JEWEL is, however, not an |'
7005 write(fid,*)'| official PYTHIA release and must'//
7006 &' not be used for anything else. Please |'
7007 write(fid,*)'| refer to results as "JEWEL+PYTHIA".'//
7008 &' |'
7009 write(fid,*)'| '//
7010 &' |'
7011 write(fid,*)'|_________________________________'//
7012 &'____________________________________________|'
7013 write(fid,*)
7014 write(fid,*)
7015 end
7016
7017
7018
7019
7020
7021 subroutine printtime
7022 implicit none
7023
7024 common/hepmcid/hpmcfid,logfid
7025 integer hpmcfid,logfid
7026
7027 integer*4 date(3),time(3)
7028
7029 1000 format (i2.2, '.', i2.2, '.', i4.4, ', ',
7030 & i2.2, ':', i2.2, ':', i2.2 )
7031 call idate(date)
7032 call itime(time)
7033 write(logfid,1000)date,time
7034 end
7035