2
C**************************************************************************
4
C**************************************************************************
10
include 'nexternal.inc'
18
parameter (ZERO = 0d0)
20
parameter( Pi = 3.14159265358979323846d0 )
27
integer icollider,detail_level
28
logical do_cuts(nexternal)
31
logical from_decay(-(nexternal+3):nexternal)
36
double precision pmass(nexternal)
38
DOUBLE PRECISION qmass(2)
40
double precision spole(maxinvar),swidth(maxinvar),bwjac
41
common/to_brietwigner/spole ,swidth ,bwjac
43
double precision etmin(nincoming+1:nexternal)
44
double precision etamax(nincoming+1:nexternal)
45
double precision emin(nincoming+1:nexternal)
46
double precision r2min(nincoming+1:nexternal,nincoming+1:nexternal)
47
double precision s_min(nexternal,nexternal)
48
double precision etmax(nincoming+1:nexternal)
49
double precision etamin(nincoming+1:nexternal)
50
double precision emax(nincoming+1:nexternal)
51
double precision r2max(nincoming+1:nexternal,nincoming+1:nexternal)
52
double precision s_max(nexternal,nexternal)
53
double precision ptll_min(nexternal,nexternal),ptll_max(nexternal,nexternal)
54
double precision inclHtmin,inclHtmax
55
common/to_cuts/ etmin, emin, etamax, r2min, s_min,
56
$ etmax, emax, etamin, r2max, s_max, ptll_min, ptll_max, inclHtmin,inclHtmax
58
double precision ptjmin4(4),ptjmax4(4),htjmin4(2:4),htjmax4(2:4)
60
common/to_jet_cuts/ ptjmin4,ptjmax4,htjmin4,htjmax4,jetor
62
double precision ptlmin4(4),ptlmax4(4)
63
common/to_lepton_cuts/ ptlmin4,ptlmax4
65
double precision xqcutij(nexternal,nexternal),xqcuti(nexternal)
66
common/to_xqcuts/xqcutij,xqcuti
68
c les houches accord stuff to identify neutrinos
71
integer idup(nexternal,maxproc,maxsproc)
72
integer mothup(2,nexternal)
73
integer icolup(2,nexternal,maxflow,maxsproc)
74
include 'leshouche.inc'
76
LOGICAL IS_A_J(NEXTERNAL),IS_A_L(NEXTERNAL)
77
LOGICAL IS_A_B(NEXTERNAL),IS_A_A(NEXTERNAL),IS_A_ONIUM(NEXTERNAL)
78
LOGICAL IS_A_NU(NEXTERNAL),IS_HEAVY(NEXTERNAL)
79
COMMON /TO_SPECISA/IS_A_J,IS_A_A,IS_A_L,IS_A_B,IS_A_NU,IS_HEAVY,
84
include '../../Source/run_config.inc'
85
character*20 param(maxpara),value(maxpara)
88
c setup masses for the final-state particles
97
c read the cuts from the run_card.dat - this should already be done in main program
102
c No pdfs for decay processes - set here since here we know the nincoming
103
c Also set stot here, and use mass of incoming particle for ren scale
105
if(nincoming.eq.1)then
108
ebeam(1)=pmass(1)/2d0
109
ebeam(2)=pmass(1)/2d0
111
fixed_ren_scale=.true.
112
fixed_fac_scale=.true.
115
c set ptj and s_min if xqcut and ktscheme = 1, to improve
116
c integration speed, and set drjj and drjl to 0.
119
if(auto_ptj_mjj.and.ptj.ge.0d0.and.ktscheme.eq.1)then
121
write(*,*) 'Warning! ptj set to xqcut=',xqcut,
122
$ ' to improve integration efficiency'
123
write(*,*) 'Note that this might affect non-radiated jets,'
124
write(*,*) 'e.g. from decays. Use cut_decays=F in run_card.'
125
else if(ptj.gt.xqcut)then
127
write(*,*) 'Warning! ptj set to 0 since xqcut > 0 and'
128
write(*,*) ' auto_ptj_mjj = F or ktscheme > 1'
130
if(auto_ptj_mjj.and.mmjj.ge.0d0)then
132
write(*,*) 'Warning! mmjj set to xqcut=',xqcut,
133
$ ' to improve integration efficiency'
134
write(*,*) 'Note that this might affect non-radiated jets,'
135
write(*,*) 'e.g. from decays. Use cut_decays=F in run_card.'
136
else if(mmjj.gt.xqcut)then
138
write(*,*) 'Warning! mmjj set to 0 since xqcut > 0 and'
139
write(*,*) ' auto_ptj_mjj = F'
142
write(*,*) 'Warning! drjj > 0 with xqcut > 0, set to 0'
146
write(*,*) 'Warning! drjl > 0 with xqcut > 0, set to 0'
151
c Check which particles come from decays
153
$ call check_decay(from_decay)
156
c check if I have to apply cuts on the particles
158
do i=nincoming+1,nexternal
160
if(nincoming.eq.1) do_cuts(i)=.false.
161
if(.not.cut_decays.and.from_decay(i)) do_cuts(i)=.false.
169
c-do not apply cuts to these
170
if (pmass(i).gt.20d0) do_cuts(i)=.false. ! no cuts on top,W,Z,H
171
if (abs(idup(i,1,1)).eq.12) do_cuts(i)=.false. ! no cuts on ve ve~
172
if (abs(idup(i,1,1)).eq.14) do_cuts(i)=.false. ! no cuts on vm vm~
173
if (abs(idup(i,1,1)).eq.16) do_cuts(i)=.false. ! no cuts on vt vt~
175
if (abs(idup(i,1,1)).le.min(maxjetflavor,5)) then
177
c write(*,*)'jet:ithe pdg is ',abs(idup(i,1,1)),' maxflavor=',maxjetflavor
178
else if (abs(idup(i,1,1)).ge.maxjetflavor+1 .and. abs(idup(i,1,1)).le.5) then
180
c write(*,*)'bjet:the pdg is ',abs(idup(i,1,1)),' maxflavor=',maxjetflavor
183
if (abs(idup(i,1,1)).eq.21) is_a_j(i)=.true. ! gluon is a jet
185
if (abs(idup(i,1,1)).eq.11) is_a_l(i)=.true. ! e+ e-
186
if (abs(idup(i,1,1)).eq.13) is_a_l(i)=.true. ! mu+ mu-
187
if (abs(idup(i,1,1)).eq.15) is_a_l(i)=.true. ! ta+ ta-
189
c if (abs(idup(i,1,1)).eq.5) is_a_b(i)=.true. ! b b~
191
if (idup(i,1,1).eq.22) is_a_a(i)=.true. ! photon
192
c-neutrino's for missing et
193
if (abs(idup(i,1,1)).eq.12) is_a_nu(i)=.true. ! no cuts on ve ve~
194
if (abs(idup(i,1,1)).eq.14) is_a_nu(i)=.true. ! no cuts on vm vm~
195
if (abs(idup(i,1,1)).eq.16) is_a_nu(i)=.true. ! no cuts on vt vt~
196
if (pmass(i).gt.10d0) is_heavy(i)=.true. ! heavy fs particle
198
if (idup(i,1,1).eq.441) is_a_onium(i)=.true. ! charmonium
199
if (idup(i,1,1).eq.10441) is_a_onium(i)=.true. ! charmonium
200
if (idup(i,1,1).eq.100441) is_a_onium(i)=.true. ! charmonium
201
if (idup(i,1,1).eq.443) is_a_onium(i)=.true. ! charmonium
202
if (idup(i,1,1).eq.10443) is_a_onium(i)=.true. ! charmonium
203
if (idup(i,1,1).eq.20443) is_a_onium(i)=.true. ! charmonium
204
if (idup(i,1,1).eq.100443) is_a_onium(i)=.true. ! charmonium
205
if (idup(i,1,1).eq.30443) is_a_onium(i)=.true. ! charmonium
206
if (idup(i,1,1).eq.9000443) is_a_onium(i)=.true. ! charmonium
207
if (idup(i,1,1).eq.9010443) is_a_onium(i)=.true. ! charmonium
208
if (idup(i,1,1).eq.9020443) is_a_onium(i)=.true. ! charmonium
209
if (idup(i,1,1).eq.445) is_a_onium(i)=.true. ! charmonium
210
if (idup(i,1,1).eq.9000445) is_a_onium(i)=.true. ! charmonium
212
if (idup(i,1,1).eq.551) is_a_onium(i)=.true. ! bottomonium
213
if (idup(i,1,1).eq.10551) is_a_onium(i)=.true. ! bottomonium
214
if (idup(i,1,1).eq.100551) is_a_onium(i)=.true. ! bottomonium
215
if (idup(i,1,1).eq.110551) is_a_onium(i)=.true. ! bottomonium
216
if (idup(i,1,1).eq.200551) is_a_onium(i)=.true. ! bottomonium
217
if (idup(i,1,1).eq.210551) is_a_onium(i)=.true. ! bottomonium
218
if (idup(i,1,1).eq.553) is_a_onium(i)=.true. ! bottomonium
219
if (idup(i,1,1).eq.10553) is_a_onium(i)=.true. ! bottomonium
220
if (idup(i,1,1).eq.20553) is_a_onium(i)=.true. ! bottomonium
221
if (idup(i,1,1).eq.30553) is_a_onium(i)=.true. ! bottomonium
222
if (idup(i,1,1).eq.100553) is_a_onium(i)=.true. ! bottomonium
223
if (idup(i,1,1).eq.110553) is_a_onium(i)=.true. ! bottomonium
224
if (idup(i,1,1).eq.120553) is_a_onium(i)=.true. ! bottomonium
225
if (idup(i,1,1).eq.130553) is_a_onium(i)=.true. ! bottomonium
226
if (idup(i,1,1).eq.200553) is_a_onium(i)=.true. ! bottomonium
227
if (idup(i,1,1).eq.210553) is_a_onium(i)=.true. ! bottomonium
228
if (idup(i,1,1).eq.220553) is_a_onium(i)=.true. ! bottomonium
229
if (idup(i,1,1).eq.300553) is_a_onium(i)=.true. ! bottomonium
230
if (idup(i,1,1).eq.9000553) is_a_onium(i)=.true. ! bottomonium
231
if (idup(i,1,1).eq.9010553) is_a_onium(i)=.true. ! bottomonium
232
if (idup(i,1,1).eq.555) is_a_onium(i)=.true. ! bottomonium
233
if (idup(i,1,1).eq.10555) is_a_onium(i)=.true. ! bottomonium
234
if (idup(i,1,1).eq.20555) is_a_onium(i)=.true. ! bottomonium
235
if (idup(i,1,1).eq.100555) is_a_onium(i)=.true. ! bottomonium
236
if (idup(i,1,1).eq.110555) is_a_onium(i)=.true. ! bottomonium
237
if (idup(i,1,1).eq.200555) is_a_onium(i)=.true. ! bottomonium
238
if (idup(i,1,1).eq.557) is_a_onium(i)=.true. ! bottomonium
239
if (idup(i,1,1).eq.100557) is_a_onium(i)=.true. ! bottomonium
241
if (idup(i,1,1).eq.541) is_a_onium(i)=.true. ! Bc
242
if (idup(i,1,1).eq.10541) is_a_onium(i)=.true. ! Bc
243
if (idup(i,1,1).eq.543) is_a_onium(i)=.true. ! Bc
244
if (idup(i,1,1).eq.10543) is_a_onium(i)=.true. ! Bc
245
if (idup(i,1,1).eq.20543) is_a_onium(i)=.true. ! Bc
246
if (idup(i,1,1).eq.545) is_a_onium(i)=.true. ! Bc
252
do i=nincoming+1,nexternal
265
if(is_a_j(i)) etmin(i)=ptj
266
if(is_a_l(i)) etmin(i)=ptl
267
if(is_a_b(i)) etmin(i)=ptb
268
if(is_a_a(i)) etmin(i)=pta
269
if(is_a_onium(i)) etmin(i)=ptonium
271
if(is_a_j(i)) etmax(i)=ptjmax
272
if(is_a_l(i)) etmax(i)=ptlmax
273
if(is_a_b(i)) etmax(i)=ptbmax
274
if(is_a_a(i)) etmax(i)=ptamax
277
if(is_a_j(i)) emin(i)=ej
278
if(is_a_l(i)) emin(i)=el
279
if(is_a_b(i)) emin(i)=eb
280
if(is_a_a(i)) emin(i)=ea
282
if(is_a_j(i)) emax(i)=ejmax
283
if(is_a_l(i)) emax(i)=elmax
284
if(is_a_b(i)) emax(i)=ebmax
285
if(is_a_a(i)) emax(i)=eamax
287
if(is_a_j(i)) etamax(i)=etaj
288
if(is_a_l(i)) etamax(i)=etal
289
if(is_a_b(i)) etamax(i)=etab
290
if(is_a_a(i)) etamax(i)=etaa
291
if(is_a_onium(i)) etamax(i)=etaonium
293
if(is_a_j(i)) etamin(i)=etajmin
294
if(is_a_l(i)) etamin(i)=etalmin
295
if(is_a_b(i)) etamin(i)=etabmin
296
if(is_a_a(i)) etamin(i)=etaamin
302
do i=nincoming+1,nexternal-1
306
if(do_cuts(i).and.do_cuts(j)) then
308
if(is_a_j(i).and.is_a_j(j)) r2min(j,i)=drjj
309
if(is_a_b(i).and.is_a_b(j)) r2min(j,i)=drbb
310
if(is_a_l(i).and.is_a_l(j)) r2min(j,i)=drll
311
if(is_a_a(i).and.is_a_a(j)) r2min(j,i)=draa
313
if((is_a_b(i).and.is_a_j(j)).or.
314
& (is_a_j(i).and.is_a_b(j))) r2min(j,i)=drbj
315
if((is_a_a(i).and.is_a_j(j)).or.
316
& (is_a_j(i).and.is_a_a(j))) r2min(j,i)=draj
317
if((is_a_l(i).and.is_a_j(j)).or.
318
& (is_a_j(i).and.is_a_l(j))) r2min(j,i)=drjl
319
if((is_a_b(i).and.is_a_a(j)).or.
320
& (is_a_a(i).and.is_a_b(j))) r2min(j,i)=drab
321
if((is_a_b(i).and.is_a_l(j)).or.
322
& (is_a_l(i).and.is_a_b(j))) r2min(j,i)=drbl
323
if((is_a_l(i).and.is_a_a(j)).or.
324
& (is_a_a(i).and.is_a_l(j))) r2min(j,i)=dral
326
if(is_a_j(i).and.is_a_j(j)) r2max(j,i)=drjjmax
327
if(is_a_b(i).and.is_a_b(j)) r2max(j,i)=drbbmax
328
if(is_a_l(i).and.is_a_l(j)) r2max(j,i)=drllmax
329
if(is_a_a(i).and.is_a_a(j)) r2max(j,i)=draamax
331
if((is_a_b(i).and.is_a_j(j)).or.
332
& (is_a_j(i).and.is_a_b(j))) r2max(j,i)=drbjmax
333
if((is_a_a(i).and.is_a_j(j)).or.
334
& (is_a_j(i).and.is_a_a(j))) r2max(j,i)=drajmax
335
if((is_a_l(i).and.is_a_j(j)).or.
336
& (is_a_j(i).and.is_a_l(j))) r2max(j,i)=drjlmax
337
if((is_a_b(i).and.is_a_a(j)).or.
338
& (is_a_a(i).and.is_a_b(j))) r2max(j,i)=drabmax
339
if((is_a_b(i).and.is_a_l(j)).or.
340
& (is_a_l(i).and.is_a_b(j))) r2max(j,i)=drblmax
341
if((is_a_l(i).and.is_a_a(j)).or.
342
& (is_a_a(i).and.is_a_l(j))) r2max(j,i)=dralmax
350
do i=nincoming+1,nexternal-1
354
if(do_cuts(i).and.do_cuts(j)) then
355
if(is_a_j(i).and.is_a_j(j)) s_min(j,i)=mmjj*dabs(mmjj)
356
if(is_a_a(i).and.is_a_a(j)) s_min(j,i)=mmaa*dabs(mmaa)
357
if( is_a_b(i).and.is_a_b(j) ) s_min(j,i)=mmbb*dabs(mmbb)
358
if((is_a_l(i).and.is_a_l(j)).and.
359
& (abs(idup(i,1,1)).eq.abs(idup(j,1,1))).and.
360
& (idup(i,1,1)*idup(j,1,1).lt.0))
361
& s_min(j,i)=mmll*dabs(mmll) !only on l+l- pairs (same flavour)
363
if(is_a_j(i).and.is_a_j(j)) s_max(j,i)=mmjjmax*dabs(mmjjmax)
364
if(is_a_a(i).and.is_a_a(j)) s_max(j,i)=mmaamax*dabs(mmaamax)
365
if( is_a_b(i).and.is_a_b(j) ) s_max(j,i)=mmbbmax*dabs(mmbbmax)
366
if((is_a_l(i).and.is_a_l(j)).and.
367
& (abs(idup(i,1,1)).eq.abs(idup(j,1,1))).and.
368
& (idup(i,1,1)*idup(j,1,1).lt.0))
369
& s_max(j,i)=mmllmax*dabs(mmllmax) !only on l+l- pairs (same flavour)
375
c ptll cut (min and max)
378
do i=nincoming+1,nexternal-1
380
ptll_min(j,i)=0.0d0**2
382
if(((is_a_l(i).and.is_a_l(j)).and.
383
& (abs(idup(i,1,1)).eq.abs(idup(j,1,1))).and.
384
& (idup(i,1,1)*idup(j,1,1).lt.0))! Leptons from same flavor but different charge
385
& .or.(is_a_nu(i).and.is_a_l(j))
386
& .or.(is_a_l(i).and.is_a_nu(j)) !a lepton and a neutrino
387
& .or.(is_a_nu(i).and.is_a_nu(j))) then ! two neutrinos
388
ptll_min(j,i)=ptllmin*dabs(ptllmin)
389
ptll_max(j,i)=ptllmax*dabs(ptllmax)
418
jetor = cutuse.eq.0d0
436
do i=nincoming+1,nexternal
437
if(is_a_j(i).and.etmin(i).eq.0.and.emin(i).eq.0) then
438
write (*,*) "Warning: pt or E min of a jet should in general be >0"
440
if(is_a_a(i).and.etmin(i).eq.0.and.emin(i).eq.0) then
441
write (*,*) "Warning: pt or E min of a gamma should in general be >0"
445
c count number of jets to see if special cuts are applicable or not
448
do i=nincoming+1,nexternal
449
if(is_a_j(i)) ncheck=ncheck+1
452
if(ncheck.eq.0.and. xptj .gt. 0d0) then
453
write (*,*) "Warning: cuts on the jet will be ignored"
457
if(ncheck.lt.2.and. xetamin .gt. 0 .and. deltaeta .gt.0) then
458
write (*,*) "Warning: WBF cuts not will be ignored"
463
c count number of photons to see if special cuts are applicable or not
466
do i=nincoming+1,nexternal
467
if(is_a_a(i)) ncheck=ncheck+1
470
if(ncheck.eq.0.and. xpta .gt. 0d0) then
471
write (*,*) "Warning: cuts on the photon will be ignored"
475
c count number of b-quarks to see if special cuts are applicable or not
478
do i=nincoming+1,nexternal
479
if(is_a_b(i)) ncheck=ncheck+1
482
if(ncheck.eq.0.and. xptb .gt. 0d0) then
483
write (*,*) "Warning: cuts on the b-quarks will be ignored"
487
c count number of leptons to see if special cuts are applicable or not
490
do i=nincoming+1,nexternal
491
if(is_a_l(i)) ncheck=ncheck+1
494
if(ncheck.eq.0.and. xptl .gt. 0d0) then
495
write (*,*) "Warning: cuts on the lepton will be ignored"
499
c set possible xqcut combinations (for better grid preparation)
509
subroutine setxqcuts()
510
c**************************************************
511
c Set xqcuti and xqcutij between all particles
512
c to allow for grid preparation based on xqcut
513
c**************************************************
516
include 'maxconfigs.inc'
517
include 'nexternal.inc'
520
double precision pmass(nexternal)
521
common/to_mass/ pmass
522
integer iforest(2,-max_branch:-1,lmaxconfigs)
523
common/to_forest/ iforest
524
integer mapconfig(0:lmaxconfigs), this_config
525
common/to_mconfigs/mapconfig, this_config
527
double precision xqcutij(nexternal,nexternal),xqcuti(nexternal)
528
common/to_xqcuts/xqcutij,xqcuti
533
include 'maxamps.inc'
534
integer idup(nexternal,maxproc,maxsproc)
535
integer mothup(2,nexternal)
536
integer icolup(2,nexternal,maxflow,maxsproc)
537
include 'leshouche.inc'
549
do k=-1,-(nexternal-3),-1
550
if(iforest(1,k,j).eq.i.and.iforest(2,k,j).gt.2.or.
551
$ iforest(2,k,j).eq.i.and.iforest(1,k,j).gt.2)then
553
if(iabs(idup(iforest(2,k,j),1,1)).le.maxjetflavor.or.
554
$ idup(iforest(2,k,j),1,1).eq.21.or.
555
$ iabs(idup(iforest(2,k,j),1,1)).le.maxjetflavor.or.
556
$ idup(iforest(2,k,j),1,1).eq.21)then
557
xqcutij(iforest(2,k,j),iforest(1,k,j))=xqcut
558
xqcutij(iforest(1,k,j),iforest(2,k,j))=xqcut
562
if(.not.foundpartner.and.(iabs(idup(i,1,1)).le.maxjetflavor.or.
563
$ idup(i,1,1).eq.21)) xqcuti(i)=max(0d0,sqrt(xqcut**2-pmass(i)**2))
570
c************************************************************************
571
c Subroutine to check which external particles are from decays
572
c************************************************************************
573
subroutine check_decay(from_decay)
576
include 'nexternal.inc'
577
include 'maxconfigs.inc'
579
include 'maxamps.inc'
583
logical from_decay(-(nexternal+3):nexternal)
587
integer iforest(2,-max_branch:-1,lmaxconfigs)
588
common/to_forest/ iforest
589
integer sprop(maxsproc,-max_branch:-1,lmaxconfigs)
590
integer tprid(-max_branch:-1,lmaxconfigs)
591
common/to_sprop/sprop,tprid
592
integer gForceBW(-max_branch:-1,lmaxconfigs) ! Forced BW
593
include 'decayBW.inc'
600
do i=-(nexternal-3),nexternal
601
from_decay(i)=.false.
604
c Set who comes from decay based on forced BW
605
do i=-(nexternal-3),-1
606
if(tprid(i,1).eq.0.and.gForceBW(i,1).eq.1.or.
607
$ from_decay(i)) then
609
from_decay(iforest(1,i,1))=.true.
610
from_decay(iforest(2,i,1))=.true.