2
c*****************************************************************
3
c Program to combine results from channels that have been
4
c split into multiple jobs. Multi-job channels are identified
5
c by local file mjobs.dat in the channel directory.
6
c****************************************************************
11
include 'run_config.inc'
12
integer maxsubprocesses
13
parameter (maxsubprocesses=999)
17
character*300 procname(maxsubprocesses)
18
character*300 channame(maxsubprocesses)
19
character*300 pathname
29
c Get list of subprocesses
31
call get_subprocess(procname,nproc)
33
do iproc = 1, nproc !Loop over each subprocess
34
jc = index(procname(iproc),' ')
35
pathname = procname(iproc)(1:jc)
37
c get list of integration channels for this subprocess
39
call get_channels(pathname,channame,nchan)
41
call sum_multichannel(channame(ichan))
47
subroutine get_subprocess(subname,ns)
48
c*****************************************************************
49
c Opens file subproc.mg to determine all subprocesses
50
c****************************************************************
56
parameter (plist='subproc.mg')
57
integer maxsubprocesses
58
parameter (maxsubprocesses=999)
62
character*(*) subname(maxsubprocesses)
68
open(unit=15, file=plist,status='old',err=99)
70
read(15,*,err=999,end=999) subname(ns)
74
write(*,*) "Did not find ", plist
77
write(*,*) "Found ", ns," subprocesses"
81
subroutine get_channels(pathname,channame,nchan)
82
c*****************************************************************
83
c Opens file symfact.dat to determine all channels
84
c****************************************************************
90
parameter (symfile='symfact.dat')
91
include 'maxparticles.inc'
92
integer maxsubprocesses
93
parameter (maxsubprocesses=999)
97
character*(*) channame(maxsubprocesses)
98
character*(*) pathname
113
jc = index(pathname," ")
114
c ncode is number of digits needed for the bw coding
115
ncode=int(dlog10(3d0)*(max_particles-3))+1
116
fname = pathname(1:jc-1) // "/" // symfile
118
open(unit=35, file=fname,status='old',err=99)
120
read(35,*,err=99,end=99) xi,j
122
k = int(xi*(1+10**(-ncode)))
123
npos=int(dlog10(dble(k)))+1
124
if ( (xi-k) .eq. 0) then
125
c Write with correct number of digits
126
write(formstr,'(a,i1,a)') '(a,i',npos,',a)'
127
write(dirname, formstr) 'G',k,'/'
129
c Write with correct number of digits
130
write(formstr,'(a,i1,a,i1,a)') '(a,f',npos+ncode+1,
132
write(dirname,formstr) 'G',xi,'/'
134
ip = index(dirname,'/')
136
channame(nchan) = fname(1:jc-1)// "/" //dirname(1:ip)
140
write(*,*) "Found ", nchan, " channels."
143
subroutine sum_multichannel(channame)
144
c*****************************************************************
145
c Looks in channel to see if there are multiple runs that
146
c need to be combined. If so combines them into single run
147
c****************************************************************
153
parameter (mfile='multijob.dat')
155
parameter (maxjobs=26)
159
character*(*) channame
164
character*300 pathname
165
character*26 alphabet
168
double precision xsec(maxjobs),xerr(maxjobs),rxsec(maxjobs)
169
double precision xsec_it(9,maxjobs),xerr_it(9,maxjobs)
170
double precision rxsec_it(9,maxjobs)
171
double precision eff(9,maxjobs),wmax(9,maxjobs)
172
integer nevents(maxjobs),ntry(maxjobs)
173
double precision xsec_tot, rxsec_tot, xerr_tot
174
integer tot_nevents, tot_ntry
180
alphabet="abcdefghijklmnopqrstuvwxyz"
181
jc = index(channame," ")
182
fname = channame(1:jc-1) // mfile
184
open(unit=35, file=fname,status='old',err=99)
185
read(35,*,err=99,end=99) njobs
187
if(njobs .gt. 0) then
188
write(*,*) "Found ", njobs, " jobs in ",fname
190
c Read in results from each of the jobs
193
pathname = channame(1:jc-2) // alphabet(i:i)
194
call get_results(pathname,xsec(i),rxsec(i),xerr(i),ntry(i),nevents(i),
195
$ xsec_it(1,i),xerr_it(1,i),rxsec_it(1,i),eff(1,i),wmax(1,i))
198
c Process results from each job to get final statistics
206
xsec_tot = xsec_tot+xsec(i)
207
rxsec_tot = rxsec_tot+rxsec(i)
208
xerr_tot = xerr_tot+xerr(i)**2
209
tot_ntry = tot_ntry+ntry(i)
210
tot_nevents = tot_nevents+nevents(i)
212
xsec_tot = xsec_tot / njobs
213
rxsec_tot = rxsec_tot / njobs
214
xerr_tot = sqrt(xerr_tot)/njobs
216
pathname = channame(1:jc-2)
218
call put_results(pathname,xsec_tot,rxsec_tot,xerr_tot,tot_ntry,
219
$ tot_nevents,xsec_it(1,i),rxsec_it(1,i),xerr_it(1,i),eff(1,i),
221
call write_logfile(pathname,xsec,rxsec,xerr,ntry,nevents,
222
$ xsec_it,rxsec_it,xerr_it,eff,wmax,njobs)
224
c Now read in all of the events and write them
225
c back out with the appropriate scaled weight
228
jc = index(pathname," ")
229
open(unit=lunw,file=pathname(1:jc-1)//"/"//"events.lhe",
230
$ status="unknown",err=999)
231
write(*,*) "Placing combined events in ",
232
$ pathname(1:jc-1)//"/"//"events.lhe"
233
wgt = xsec_tot / tot_nevents
236
jc = index(channame," ")
237
pathname = channame(1:jc-2) // alphabet(i:i)
238
call copy_events(pathname,lunw,wgt,nw)
239
tot_nevents=tot_nevents+nw
240
write(*,*) "Added ",nw," events from run ", alphabet(i:i)
241
if (nw .ne. nevents(i)) then
242
write(*,*) "Error writing events ",i,nw,nevents(i),
247
write(*,*) "Combined ",tot_nevents," to ",channame(1:jc-2)
252
write(*,*) "Error, unable to open events.lhe file for output"
256
subroutine copy_events(pathname,lunw,wgt,nw)
257
c*********************************************************************
258
c Copy events from separate runs into one file w/ appropriate wgts
259
c*********************************************************************
264
character*(*) eventfname
265
parameter (eventfname="events.lhe")
266
include 'maxparticles.inc'
267
integer maxexternal !Max number external momenta
268
parameter (maxexternal=2*max_particles-3)
272
character*(*) pathname
280
double precision P(0:4,maxexternal),xwgt
281
integer n,ic(7,maxexternal),ievent
282
double precision scale,aqcd,aqed
288
jc = index(pathname," ")
289
fname = pathname(1:jc-1) // "/" // eventfname
291
write(*,*) "Copy from ",fname(1:jc+10)
292
open(unit=35, file=fname,status='old',err=999)
294
do while (.not. done .and. nw < 999999)
296
call read_event(35,P,xwgt,n,ic,ievent,scale,
297
$ aqcd,aqed,buff,done)
299
wgt = dsign(wgt,xwgt)
300
call write_event(lunw,P,wgt,n,ic,ievent,scale,
308
write(*,*) "Error unable to open ",fname
311
subroutine get_results(pathname,xsec,rxsec,xerr,ntry,nevents,
312
$ xsec_it,xerr_it,rxsec_it,eff,wmax)
313
c*********************************************************************
314
c Read run results from file results.dat
315
c*********************************************************************
320
character*(*) resultfname
321
parameter (resultfname="results.dat")
325
character*(*) pathname
326
double precision xsec,rxsec,xerr
327
double precision xsec_it(9),rxsec_it(9),xerr_it(9)
328
double precision eff(9),wmax(9)
335
double precision x1,x2,x3,x4
339
jc = index(pathname," ")
340
fname = pathname(1:jc-1) // "/" // resultfname
343
open(unit=35, file=fname,status='old',err=99)
344
read(35,*,err=99,end=99) xsec,xerr, x1, ntry,x3,x4,nevents,x1,x1,rxsec
346
read(35,*,end=99,err=99) x1,xsec_it(i),xerr_it(i),
347
$ eff(i),wmax(i),rxsec_it(i)
353
if (nevents .gt. 0) then
354
write(*,*) "Found ",nevents, " events in ", pathname(1:jc-1)
356
do while (xsec_it(i) .gt. 0d0)
357
write(*,*) i,rxsec_it(i),xsec_it(i),xerr_it(i),eff(i),wmax(i)
363
subroutine write_logfile(pathname,xsec,rxsec,xerr,ntry,nevents,
364
$ xsec_it,rxsec_it,xerr_it,eff,wmax,njobs)
365
c*********************************************************************
366
c Read run results from file results.dat
367
c*********************************************************************
373
parameter (maxjobs=26)
374
character*(*) logfname
375
parameter (logfname="log.txt")
379
character*(*) pathname
380
double precision xsec(maxjobs),rxsec(maxjobs),xerr(maxjobs)
381
double precision xsec_it(9,maxjobs),xerr_it(9,maxjobs)
382
double precision rxsec_it(9,maxjobs)
383
double precision eff(9,maxjobs),wmax(9,maxjobs)
384
integer nevents(maxjobs),ntry(maxjobs)
385
double precision xsec_tot, rxsec_tot, xerr_tot
386
integer tot_nevents, tot_ntry
392
character*26 alphabet
397
alphabet="abcdefghijklmnopqrstuvwxyz"
398
jc = index(pathname," ")
399
fname = pathname(1:jc-1) // "/" // logfname
400
open(unit=35,file=fname,status="old",access="append",err=999)
402
write(35,*) '--------------------- Multi run with ',njobs,
403
$ ' jobs. ','---------------------'
405
write(35,*) "job ",alphabet(i:i),":",rxsec(i),xsec(i),nevents(i)
409
999 write(*,*) "Error opening ",fname(1:jc+10), "for append"
413
subroutine put_results(pathname,xsec,rxsec,xerr,ntry,nevents,
414
$ xsec_it,rxsec_it,xerr_it,eff,wmax)
415
c*********************************************************************
416
c Read run results from file results.dat
417
c*********************************************************************
422
character*(*) resultfname
423
parameter (resultfname="results.dat")
427
character*(*) pathname
428
double precision xsec,rxsec,xerr
429
double precision xsec_it(9),rxsec_it(9),xerr_it(9)
430
double precision eff(9),wmax(9)
437
double precision x1,x2
442
jc = index(pathname," ")
443
fname = pathname(1:jc-1) // "/" // resultfname
448
open(unit=35, file=fname,status='unknown',err=99)
449
write(35,'(3e12.5,2i9,i5,i9,e10.3,e11.3,e13.5)') xsec,xerr, x1, ntry,i3,i4
450
$ ,nevents,(1.00*nevents)/xsec,0d0,rxsec
452
do while (xsec_it(i) .gt. 0 .and. i .lt. 10)
453
write(35,'(i4,5e15.5)') i,xsec_it(i),xerr_it(i),
454
$ eff(i),wmax(i),rxsec_it(i)