You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

101 lines
3.7 KiB

!
! SPDX-License-Identifier: GPL-3.0-or-later
! Copyright (C) 2019-2022, respective authors of MCFM.
!
subroutine checkjets(jetsfound,qfinal,isub,failed)
implicit none
include 'types.f'
c--- performs checks on the jets that are found by the clustering algorithm,
c--- to ensure that the correct number of heavy quark jets is found,
c--- in the right invariant mass range
c--- given integer:: 'jetsfound' jets with momenta 'qfinal', 'isub'
c--- returns logical:: 'failed'
include 'bbproc.f'
include 'mxpart.f'
include 'jetlabel.f'
include 'kprocess.f'
include 'removebr.f'
include 'npart.f'
include 'nproc.f'
real(dp):: qfinal(mxpart,4),m56,m57,m67
logical:: failed
integer:: countb,jetsfound,nbq,nba,isub
failed=.false.
! 2024/03/28: Let the user decide instead of enforcing it here
if (kcase == kbq_tpq .or. kcase == ktopanom) then
return
endif
if (nproc == 1610 .or. nproc == 1650) then
! we no longer rely on this routine, since at
! NNLO in kbq_tpq and NLO in kbq_tpq_jet there
! are contributions with different b final states
return
endif
c--- check that particle 5 is a b for H+b, W+c, Z+Q and W+b+jet processes
c--- also check for t-channel single top when the BR is not removed
if ( (kcase==kH_1jet)
& .or.(kcase==kW_cjet) .or. (kcase==kWcjet0)
& .or.(kcase==kgQ__ZQ) .or. (kcase==kW_bjet)
& .or.(kcase==kZ_bjet)
& .or.(kcase==ktopanom)
& .or.((kcase==kbq_tpq) .and. (removebr .eqv. .false.))
& .or.((kcase==kttdkay) .and. (removebr .eqv. .false.))
& .or.((kcase==kW_twdk) .and. (removebr .eqv. .false.))
& .or.((kcase==kWtdkay) .and. (removebr .eqv. .false.)) ) then
countb=0
if ((jetsfound >= 1) .and. ((jetlabel(1) == 'bq')
& .or. (jetlabel(1) == 'ba'))) countb=1
if ((jetsfound >= 2) .and. ((jetlabel(2) == 'bq')
& .or. (jetlabel(2) == 'ba'))) countb=countb+1
if ((jetsfound >= 3) .and. ((jetlabel(3) == 'bq')
& .or. (jetlabel(3) == 'ba'))) countb=countb+1
if ((jetsfound == 1) .and. (countb == 0)) failed=.true.
if ( ( (kcase==kbq_tpq) .or. (kcase==kttdkay)
& .or. (kcase==kW_bjet) .or. (kcase==kZ_bjet)
& .or. (kcase==ktopanom) )
& .and. (countb < 1) ) failed=.true.
if ((nproc == 132) .and. (jetsfound == 2)
& .and. (countb /= 1)) failed=.true.
if ((nproc == 133) .and. (jetsfound == 2)
& .and. (countb /= 2)) failed=.true.
if (((nproc == 342) .or. (nproc == 352)) .and. (jetsfound == 2)
& .and. (countb /= 1) .and. (isub == 0)) failed=.true.
endif
c--- check that 5 and 6 are b and b-bar (if appropriate)
if (bbproc) then
call getbs(qfinal,nbq,nba)
if ((nbq == 0) .or. (nba == 0)) failed=.true.
endif
c--- perform m56 mass cut if there are 2 or more jets found
c--- and there are at least 6 particles in the final state
if ((npart > 3) .and. (jetsfound >= 2)) then
m56=(qfinal(5,4)+qfinal(6,4))**2
& -(qfinal(5,1)+qfinal(6,1))**2
& -(qfinal(5,2)+qfinal(6,2))**2
& -(qfinal(5,3)+qfinal(6,3))**2
if (jetsfound >= 3) then
m57=(qfinal(5,4)+qfinal(7,4))**2
& -(qfinal(5,1)+qfinal(7,1))**2
& -(qfinal(5,2)+qfinal(7,2))**2
& -(qfinal(5,3)+qfinal(7,3))**2
m67=(qfinal(6,4)+qfinal(7,4))**2
& -(qfinal(6,1)+qfinal(7,1))**2
& -(qfinal(6,2)+qfinal(7,2))**2
& -(qfinal(6,3)+qfinal(7,3))**2
m56=max(m56,max(m57,m67))
endif
c if ((m56 < bbsqmin) .or. (m56 > bbsqmax)) then
c failed=.true.
c endif
endif
return
end