~pwhg-stj/+junk/PWHG_STJ_ninja_collier

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
      subroutine setvirtual(p,vflav,virtual)
c Virtual needs to be provided by the user and put here
      implicit none
      include 'nlegborn.h'
      include 'pwhg_st.h'
      include 'pwhg_kn.h'
      include 'pwhg_math.h'
      include 'coupl.inc'
      real * 8 p(0:3,nlegborn)
      integer vflav(nlegborn)
      real * 8 virtual
      LOGICAL INIT
      DATA INIT/.TRUE./
      INTEGER MATELEM_ARRAY_DIM
      REAL*8 , ALLOCATABLE :: MATELEM(:,:)
      INTEGER NSQUAREDSO_LOOP
      REAL*8 , ALLOCATABLE :: PREC_FOUND(:)
      INTEGER RETURNCODE
      REAL*8 PREC_REQ
      PARAMETER (PREC_REQ=1d-4)
      character*512 procdir
      character*512 path
      integer i,j,k
      integer lstr
      character*140 str
c following are from coupl.inc used in MadLoop
      DOUBLE PRECISION MU_R
      COMMON/RSCALE/ MU_R
      DOUBLE PRECISION G_ML
      COMMON/STRONG/ G_ML
      IF (INIT) THEN
         INIT=.FALSE.
         procdir="/home/ucapkha/software/POWHEG-BOX-V2/PWHG_STJ/"
         path=trim(procdir)//"/virtual/SubProcesses/MadLoop5_resources"
         CALL SETMADLOOPPATH(path)
         CALL ML5_0_GET_ANSWER_DIMENSION(MATELEM_ARRAY_DIM)
         ALLOCATE(MATELEM(0:3,0:MATELEM_ARRAY_DIM))
         CALL ML5_0_GET_NSQSO_LOOP(NSQUAREDSO_LOOP)
         ALLOCATE(PREC_FOUND(0:NSQUAREDSO_LOOP))
         path=trim(procdir)//"/virtual/Cards/param_card.dat"
         CALL setparaml(path)
      ENDIF
      virtual =0d0

c If kn_jacborn=0 we are probably in some cut out region of phase space
c and in any case the total contribution from this phase space point 
c should be zero, so we don't bother computing the virtuals. A better
c solution would be to not generate these phase space regions in the 
c first place. 
      if(kn_jacborn.eq.0d0) then
        virtual=0d0
        return
      endif

c$$$  DO NOT INCLUDE THE VIRTUAL CORRECTIONS:
c$$$      return
      
c Update the scale and strong coupling      
      call set_ebe_couplings
      mu_R=sqrt(st_muren2)
      G_ML=G
      call update_as_param()

      call convert_to_string(nlegborn,vflav,str,lstr)
      
c compute the correct one-loop matrix element
      if (str.eq."-156-20") then
         CALL ML5_0_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."25610") then
         CALL ML5_1_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."-356-40") then
         CALL ML5_2_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."45630") then
         CALL ML5_3_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."5-16-20") then
         CALL ML5_4_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."52610") then
         CALL ML5_5_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."5-36-40") then
         CALL ML5_6_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."54630") then
         CALL ML5_7_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."-106-2-5") then
         CALL ML5_8_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."2061-5") then
         CALL ML5_9_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."-306-4-5") then
         CALL ML5_10_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."4063-5") then
         CALL ML5_11_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."5061-2") then
         CALL ML5_12_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."5063-4") then
         CALL ML5_13_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."0-16-2-5") then
         CALL ML5_14_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."0261-5") then
         CALL ML5_15_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."0-36-4-5") then
         CALL ML5_16_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."0463-5") then
         CALL ML5_17_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."0561-2") then
         CALL ML5_18_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      elseif (str.eq."0563-4") then
         CALL ML5_19_SLOOPMATRIX_THRES(P,MATELEM,PREC_REQ,PREC_FOUND
     $        ,RETURNCODE)
      else
         write (*,*) 'error, vflav not correct',vflav
         stop
      endif
      
      virtual=MATELEM(1,0)/(st_alpha/(2d0*pi))

c For unstable points, set the virtual to zero
      if (RETURNCODE/100.eq.4 .and. PREC_FOUND(0).gt.0.01d0) then
         write (*,*) "UNSTABLE PS POINT IN VIRTUALS WITH INACCURACY "/
     $        /"ESTIMATE LARGER THAN 0.01. SETTING "/
     $        /"THIS PS POINT TO ZERO FOR THE VIRTUALS."
         virtual=0d0
      endif
      
      end