2
c*****************************************************************
3
c tests traversing directories to find all events
4
c****************************************************************
9
include 'run_config.inc'
10
integer maxsubprocesses
11
parameter (maxsubprocesses=9999)
13
parameter (cmax_events=500000)
15
parameter (sfnum=17) !Unit number for scratch file
17
parameter (maxexternal=17)
19
parameter (maxpara=1000)
23
character*30 subname(maxsubprocesses)
24
integer i,j,m,ns,nreq,ievent
25
integer kevent,revent,iarray(cmax_events)
26
double precision sum, xsec, xerr, goal_wgt,xarray(cmax_events)
27
integer i4,r8,record_length
30
double precision wgt,maxwgt
31
double precision p(0:4,maxexternal)
32
integer ic(7,maxexternal),n
33
double precision scale,aqcd,aqed
34
character*20 param(maxpara),value(maxpara)
36
double precision xtrunc, min_goal,max_goal
37
logical keep(cmax_events),done
39
logical gridrun,gridpack
48
c Get requested number of events
50
call load_para(npara,param,value)
51
call get_logical(npara,param,value," gridrun ",gridrun,.false.)
52
call get_logical(npara,param,value," gridpack ",gridpack,.false.)
53
if (gridrun.and.gridpack) then
54
call get_integer(npara,param,value," gevents " ,nreq ,2000 )
56
call get_integer(npara,param,value," nevents " ,nreq ,10000 )
59
c Get information for the <init> block
64
c Get total cross section
68
open(unit=15,file='results.dat',status='old',err=21)
69
read(15,*,err=20) xsec,xerr
70
write(*,*) "Results.dat xsec = ",xsec
72
21 if (nreq .gt. 0 .and. xsec .gt. 0) then
73
goal_wgt = xsec/nreq/4d0 !Extra factor of 4 for weighted events
75
goal_wgt = 0d0 !Write out everything
78
c Get list of subprocesses
80
call get_subprocess(subname,ns)
83
c Create scratch file to hold events
87
record_length = 4*I4+maxexternal*I4*7+maxexternal*5*R8+3*R8+
89
open(unit=sfnum,access='direct',file='scratch',err=999,
92
c Loop through subprocesses filling up scratch file with events
98
write(*,*) 'SubProcess/Channel kept read xsec '
100
c write(*,*) 'Subprocess: ',subname(ns)
101
call read_channels(subname(i),sum,kevent,revent,goal_wgt,maxwgt)
104
c Get Random order for events
108
xarray(i)=xran1(iseed)
110
call sortO3(xarray,iarray,kevent)
112
c Write out the events in iarray order
114
open(unit=15,file='events.lhe',status='unknown',err=98)
115
call writebanner(15,kevent,sum,maxwgt,xerr)
117
read(sfnum,rec=iarray(i)) wgt,n,
118
& ((ic(m,j),j=1,maxexternal),m=1,7),ievent,
119
& ((p(m,j),m=0,4),j=1,maxexternal),scale,aqcd,aqed,
121
call write_event(15,P,wgt,n,ic,ievent,scale,aqcd,aqed,buff)
125
c Now select unweighted events.
127
goal_wgt = sum/(nreq*1.03)
128
min_goal = goal_wgt/5d0
129
max_goal = goal_wgt*5d0
132
c Loop to refine guess for goal_wgt while keeping xtrunc<0.01
140
read(sfnum,rec=iarray(i)) wgt,n,
141
& ((ic(m,j),j=1,maxexternal),m=1,7),ievent,
142
& ((p(m,j),m=0,4),j=1,maxexternal),scale,aqcd,aqed,
144
if (wgt .gt. goal_wgt*xran1(iseed)) then
147
if (wgt .gt. goal_wgt) then
148
xtrunc=xtrunc+wgt-goal_wgt
154
if (xtrunc .gt. 0.01d0*sum) then
156
min_goal = max(goal_wgt,min_goal)
157
goal_wgt = goal_wgt*1.3d0
158
write(*,*) 'Iteration ',ntry, ' too large truncation ',xtrunc/sum,nunwgt
159
c write(*,*) min_goal,goal_wgt,max_goal
160
elseif (nunwgt .lt. nreq) then
162
max_goal = min(goal_wgt,max_goal)
163
goal_wgt = goal_wgt*0.95d0
164
write(*,*) 'Iteration ',ntry, ' too few events ',xtrunc/sum,nunwgt
165
c write(*,*) min_goal,goal_wgt,max_goal
166
if (goal_wgt .lt. min_goal) then
168
write(*,*) 'Failed to find requested number of unweighted events',nreq,nunwgt
172
if (ntry .gt. 20) done=.true.
174
if (nunwgt .lt. nreq) then
175
write(*,*) 'Unable to get ',nreq,' events. Writing ',nunwgt
178
write(*,*) 'Found ',nunwgt,' events writing first ',nreq
180
write(*,*) 'Unweighting selected ',nreq, ' events.'
181
write(*,'(a,f5.2,a)') 'Truncated ',xtrunc*100./sum, '% of cross section'
182
open(unit=15,file='unweighted_events.lhe',status='unknown',err=99)
183
call writebanner_u(15,nreq,xsec,xtrunc,xerr)
186
if (keep(i) .and. ntry .lt. nreq) then
187
read(sfnum,rec=iarray(i)) wgt,n,
188
& ((ic(m,j),j=1,maxexternal),m=1,7),ievent,
189
& ((p(m,j),m=0,4),j=1,maxexternal),scale,aqcd,aqed,
191
call write_event(15,P,xsec/nreq,n,ic,ievent,scale,aqcd,aqed,buff)
198
98 write(*,*) 'Error writing events.dat'
200
99 write(*,*) 'Error writing unweighted_events.dat'
202
999 write(*,*) 'Error opening scratch file'
206
subroutine writebanner(lunw,nevent,sum,maxwgt,xerr)
207
c**************************************************************************************
208
c Writes out banner information at top of event file
209
c**************************************************************************************
215
double precision sum,maxwgt,xerr
222
c Les Houches init block (for the <init> info)
225
parameter(maxpup=100)
226
integer idbmup,pdfgup,pdfsup,idwtup,nprup,lprup
227
double precision ebmup,xsecup,xerrup,xmaxup
228
common /heprup/ idbmup(2),ebmup(2),pdfgup(2),pdfsup(2),
229
& idwtup,nprup,xsecup(maxpup),xerrup(maxpup),
230
& xmaxup(maxpup),lprup(maxpup)
235
c double precision etmin(3:nexternal),etamax(3:nexternal)
236
c double precision r2min(3:nexternal,3:nexternal)
237
c double precision s_min(nexternal,nexternal)
238
c common/to_cuts/ etmin ,etamax , r2min, s_min
246
c call setpara('param_card.dat')
251
c call write_para(lunw)
252
c write(lunw,'(a70)') '## '
253
c write(lunw,'(a70)') '##------------------- '
254
c write(lunw,'(a70)') '## Run-time options '
255
c write(lunw,'(a70)') '##------------------- '
256
c write(lunw,'(a70)') '## '
257
c write(lunw,'(a70)') '##********************************************************************'
258
c write(lunw,'(a70)') '## Standard Cuts *'
259
c write(lunw,'(a70)') '##********************************************************************'
260
c write(lunw,'(a13,8i8)') '## Particle ',(i,i=3,nexternal)
261
c write(lunw,'(a13,8f8.1)') '## Et >',(etmin(i),i=3,nexternal)
262
c write(lunw,'(a13,8f8.1)') '## Eta <',(etamax(i),i=3,nexternal)
264
c write(lunw,'(a,i2,a,8f8.1)') '## d R #',j,' >',(-0.0,i=3,j),
265
c & (r2min(i,j),i=j+1,nexternal)
267
c r2min(i,j)=r2min(i,j)**2 !Since r2 returns distance squared
271
c write(lunw,'(a,i2,a,8f8.1)') '## s min #',j,'>',
272
c & (s_min(i,j),i=3,nexternal)
274
c write(lunw,'(a70)') '#********************************************************************'
276
c Now write out specific information on the event set
279
write(lunw,'(a)') '<MGGenerationInfo>'
280
write(lunw,'(a30,i10)') '# Number of Events : ',nevent
281
write(lunw,'(a30,e10.5)') '# Integrated weight (pb) : ',sum
282
write(lunw,'(a30,e10.5)') '# Max wgt : ',maxwgt
283
write(lunw,'(a30,e10.5)') '# Average wgt : ',sum/nevent
284
write(lunw,'(a)') '</MGGenerationInfo>'
288
C Write out compulsory init info
289
write(lunw,'(a)') '</header>'
290
write(lunw,'(a)') '<init>'
291
write(lunw,90) (idbmup(i),i=1,2),(ebmup(i),i=1,2),(pdfgup(i),i=1,2),
292
$ (pdfsup(i),i=1,2),2,nprup
294
write(lunw,91) xsecup(i),xerr*xsecup(i)/sum,maxwgt,lprup(i) ! FACTOR OF nevts for maxwgt and wgt? error?
296
write(lunw,'(a)') '</init>'
297
90 FORMAT(2i6,2e19.11,2i2,2i6,i2,i3)
298
91 FORMAT(3e19.11,i4)
302
subroutine writebanner_u(lunw,nevent,sum,maxwgt,xerr)
303
c**************************************************************************************
304
c Writes out banner information at top of event file
305
c**************************************************************************************
311
double precision sum,maxwgt,xerr
317
c Les Houches init block (for the <init> info)
320
parameter(maxpup=100)
321
integer idbmup,pdfgup,pdfsup,idwtup,nprup,lprup
322
double precision ebmup,xsecup,xerrup,xmaxup
323
common /heprup/ idbmup(2),ebmup(2),pdfgup(2),pdfsup(2),
324
& idwtup,nprup,xsecup(maxpup),xerrup(maxpup),
325
& xmaxup(maxpup),lprup(maxpup)
329
c double precision etmin(3:nexternal),etamax(3:nexternal)
330
c double precision r2min(3:nexternal,3:nexternal)
331
c double precision s_min(nexternal,nexternal)
332
c common/to_cuts/ etmin ,etamax , r2min, s_min
340
c call setpara('param_card.dat')
345
c call write_para(lunw)
346
c write(lunw,'(a70)') '## '
347
c write(lunw,'(a70)') '##------------------- '
348
c write(lunw,'(a70)') '## Run-time options '
349
c write(lunw,'(a70)') '##------------------- '
350
c write(lunw,'(a70)') '## '
351
c write(lunw,'(a70)') '##********************************************************************'
352
c write(lunw,'(a70)') '## Standard Cuts *'
353
c write(lunw,'(a70)') '##********************************************************************'
354
c write(lunw,'(a13,8i8)') '## Particle ',(i,i=3,nexternal)
355
c write(lunw,'(a13,8f8.1)') '## Et >',(etmin(i),i=3,nexternal)
356
c write(lunw,'(a13,8f8.1)') '## Eta <',(etamax(i),i=3,nexternal)
358
c write(lunw,'(a,i2,a,8f8.1)') '## d R #',j,' >',(-0.0,i=3,j),
359
c & (r2min(i,j),i=j+1,nexternal)
361
c r2min(i,j)=r2min(i,j)**2 !Since r2 returns distance squared
365
c write(lunw,'(a,i2,a,8f8.1)') '## s min #',j,'>',
366
c & (s_min(i,j),i=3,nexternal)
368
c write(lunw,'(a70)') '##********************************************************************'
370
c Now write out specific information on the event set
373
write(lunw,'(a)') '<MGGenerationInfo>'
374
write(lunw,'(a30,i10)') '# Number of Events : ',nevent
375
write(lunw,'(a30,e10.5)') '# Integrated weight (pb) : ',sum
376
write(lunw,'(a30,e10.5)') '# Truncated wgt (pb) : ',maxwgt
377
write(lunw,'(a30,e10.5)') '# Unit wgt : ',sum/nevent
378
write(lunw,'(a)') '</MGGenerationInfo>'
380
C Write out compulsory init info
381
write(lunw,'(a)') '</header>'
382
write(lunw,'(a)') '<init>'
383
write(lunw,90) (idbmup(i),i=1,2),(ebmup(i),i=1,2),(pdfgup(i),i=1,2),
384
$ (pdfsup(i),i=1,2),3,nprup
386
write(lunw,91) xsecup(i),xerr*xsecup(i)/sum,sum/nevent,lprup(i) ! FACTOR OF nevts for maxwgt and wgt? error?
388
write(lunw,'(a)') '</init>'
389
90 FORMAT(2i6,2e19.11,2i2,2i6,i2,i3)
390
91 FORMAT(3e19.11,i4)
395
subroutine read_channels(dir,sum,kevent,revent,goal_wgt,maxwgt)
396
c*****************************************************************
397
c tests traversing directories to find all events
398
c****************************************************************
403
character*(*) symfile
404
parameter (symfile='symfact.dat')
409
integer kevent,revent
410
double precision sum,goal_wgt,maxwgt
416
character*50 dirname,dname,channame
421
dname = dir(1:i-1)// "/" // symfile
422
open(unit=35, file=dname ,status='old',err=59)
424
read(35,*,err=99,end=99) xi,j
426
if ( (xi-int(xi+.01)) .lt. 1d-5) then
429
write(dirname,'(a,i1,a)') 'G',k,'/'
430
else if (k .lt. 100) then
431
write(dirname,'(a,i2,a)') 'G',k,'/'
432
else if (k .lt. 1000) then
433
write(dirname,'(a,i3,a)') 'G',k,'/'
434
else if (k .lt. 10000) then
435
write(dirname,'(a,i4,a)') 'G',k,'/'
439
write(dirname,'(a,f5.3,a,a)') 'G',xi,'/'
440
else if (xi .lt. 100) then
441
write(dirname,'(a,f6.3,a,a)') 'G',xi,'/'
442
else if (xi .lt. 1000) then
443
write(dirname,'(a,f7.3,a,a)') 'G',xi,'/'
444
else if (xi .lt. 10000) then
445
write(dirname,'(a,f8.3,a,a)') 'G',xi,'/'
448
ip = index(dirname,'/')
449
channame = dname(1:i-1)// "/" //dirname(1:ip)
450
call read_dir_events(channame(1:i+ip),j,kevent,revent,sum,goal_wgt,maxwgt)
451
write(*,'(a,2i8,e10.3)') channame(1:i+ip),kevent,revent,sum
457
c Come here if there isn't a symfact file. Means we will work on
463
channame = dirname(1:ip)
464
call read_dir_events(channame,j,kevent,revent,sum,goal_wgt,maxwgt)
465
write(*,'(a30,i8,e10.3)') channame(1:i+ip),kevent,sum
469
subroutine read_dir_events(channame,nj,kevent,revent,sum,goal_wgt,maxwgt)
470
c********************************************************************
471
c********************************************************************
477
parameter (sfnum=17) !Unit number for scratch file
478
character*(*) scaled_file
479
parameter (scaled_file='events.lhe')
481
parameter (maxexternal=17)
482
include 'run_config.inc'
484
parameter (max_read = 2000000)
488
character*(*) channame
489
integer nj,kevent,revent
490
double precision sum,goal_wgt,maxwgt
495
double precision p(0:4,maxexternal)
496
double precision gsfact
497
real xwgt(max_read),xtot
498
integer i,j,k,m, ic(7,maxexternal),n
499
double precision scale,aqcd,aqed
503
character*60 fullname
505
c Les Houches init block (for the <init> info)
508
parameter(maxpup=100)
509
integer idbmup,pdfgup,pdfsup,idwtup,nprup,lprup
510
double precision ebmup,xsecup,xerrup,xmaxup
511
common /heprup/ idbmup(2),ebmup(2),pdfgup(2),pdfsup(2),
512
& idwtup,nprup,xsecup(maxpup),xerrup(maxpup),
513
& xmaxup(maxpup),lprup(maxpup)
526
fullname = channame // "gscalefact.dat"
528
open (unit=15,file=fullname,status='old',err=12)
529
read(15,*) gsfact !Scale factor for grid runs that only use some channels
531
if (gsfact .eq. 0d0) return
532
fullname = channame // scaled_file
533
open(unit=15,file=fullname, status='old',err=999)
536
c Start by initializing all event variables to zero (not really necessary)
547
c Now loop through events
549
do while (.not. done)
550
call read_event(15,P,wgt,n,ic,ievent,scale,aqcd,aqed,buff,done)
553
wgt = wgt*nj*gsfact !symmetry factor * grid factor
554
if (wgt .gt. maxwgt) maxwgt=wgt
555
if (wgt .ge. goal_wgt*xran1(iseed)) then
557
if (wgt .lt. goal_wgt) wgt = goal_wgt
558
write(sfnum,rec=kevent) wgt,n,
559
& ((ic(i,j),j=1,maxexternal),i=1,7),ievent,
560
& ((p(i,j),i=0,4),j=1,maxexternal),scale,aqcd,aqed,buff
564
if(ievent.eq.lprup(i))then
565
xsecup(i)=xsecup(i)+wgt
576
if (kevent .ge. max_read) then
577
write(*,*) 'Error too many events to read in select_events'
579
write(*,*) 'Reset max_read in Source/select_events.f'
584
55 format(i3,4e19.11)
585
c write(*,*) 'Found ',kevent,' events'
586
c write(*,*) 'Integrated weight',sum
588
999 write(*,*) 'Error opening file ',channame,scaled_file
594
subroutine get_subprocess(subname,ns)
595
c*****************************************************************
596
c tests traversing directories to find all events
597
c****************************************************************
603
parameter (plist='subproc.mg')
604
integer maxsubprocesses
605
parameter (maxsubprocesses=999)
609
character*30 subname(maxsubprocesses)
615
open(unit=15, file=plist,status='old',err=99)
617
read(15,*,err=999,end=999) subname(ns)
620
99 subname(ns) = './'
621
write(*,*) "Did not find ", plist
624
write(*,*) "Found ", ns," subprocesses"
631
parameter (m1=259200,ia1=7141,ic1=54773,rm1=3.8580247e-6)
632
parameter (m2=134456,ia2=8121,ic2=28411,rm2=7.4373773e-6)
633
parameter (m3=243000,ia3=4561,ic3=51349)
636
if (idum.lt.0.or.iff.eq.0) then
639
ix1=mod(ia1*ix1+ic1,m1)
641
ix1=mod(ia1*ix1+ic1,m1)
644
ix1=mod(ia1*ix1+ic1,m1)
645
ix2=mod(ia2*ix2+ic2,m2)
646
r(j)=(float(ix1)+float(ix2)*rm2)*rm1
650
ix1=mod(ia1*ix1+ic1,m1)
651
ix2=mod(ia2*ix2+ic2,m2)
652
ix3=mod(ia3*ix3+ic3,m3)
654
if(j.gt.97.or.j.lt.1)then
655
write(*,*) 'j is bad in ran1.f',j, 97d0*ix3/m3
659
r(j)=(float(ix1)+float(ix2)*rm2)*rm1
664
subroutine sort2(array,aux1,n)
669
double precision array(n)
672
double precision temp
681
if (array(k) .lt. array(k+1)) then
683
array(k) = array(k+1)
695
subroutine sortO3(array,aux1,n)
697
c O-Sort Version 3, Sorting routine by Erik Oosterwal
698
c http://www.geocities.com/oosterwal/computer/sortroutines.html
705
double precision array(n)
708
double precision SngPhi,SngFib
710
SngPhi = 0.78 ! Define phi value
711
SngFib = n * SngPhi ! Set initial real step size
712
step = int(SngFib) ! set initial integer step size
715
do i = 1,n-step ! Set the range of the lower search cells
716
if (array(aux1(i))<array(aux1(i+step))) then ! Compare cells
718
aux1(i) = aux1(i+step) ! | Swap cells
719
aux1(i+step) = itemp ! /
723
SngFib = SngFib * SngPhi ! Decrease the Real step size
724
Step = Int(SngFib) ! Set the integer step value