All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
ckern.f
Go to the documentation of this file.
1 CDECK ID>, CKERN.
2  SUBROUTINE ckern(ITKDM,NT,PT,NJREQ,IERR)
3 *.-----------------------------------------------------------------------
4 *.
5 *. CKERN: Resolves the clustering, and stores information
6 *. in common block CKCOM.
7 *. INPUT: ITKDM (integer) First dimension of PT array
8 *. (>=4 required)
9 *. NT (integer) Number of tracks
10 *. PT(ITKDM,*)(real) Four-momenta of tracks
11 *. NJREQ (integer) Clustering limit. Note that the CPU
12 *. consumption is roughly proportional to
13 *. calling JADE/Durham algorithm NJREQ
14 *. times!!
15 *. 1) If interested in ALL possible N-jet
16 *. configurations, set NJREQ equal to
17 *. NT. Note the remark on CPU time!
18 *. 2) If interested in first N-jet
19 *. configuration (with largest
20 *. ycut values), set NJREQ equal
21 *. to number of jets N-jet.
22 *. OUTPUT: IERR (integer) Error flag, 0=OK.
23 *. CALLS: CKSORD
24 *.
25 *.
26 *. Once CKERN is called, all information on the event clustering,
27 *. final state jets and particle association can be accessed
28 *. without additional CPU time using the utility routines.
29 *.
30 *.---CAMBRIDGE JET CLUSTERING ALGORITHM
31 *. BASED ON YCLUS BY S BETHKE
32 *. REF: YU L DOKSHITZER, G D LEDER, S MORETTI, B R WEBBER
33 *. CAVENDISH-HEP-97/06 (JUNE 1997)
34 *. 07/07/97 FIRST RELEASED BY BRW
35 *. 23/08/97 COMMENTS REVISED BY BRW
36 *. 23/09/97 IMPLEMENT FOR PX LIBRARY BY STK AND SB
37 *.
38 *.
39 *. CREATED : 11-12-1997, STAN BENTVELSEN
40 *. LAST MOD: 11-02-1998, Z. Troscyani, Add factor epsilon
41 *.-----------------------------------------------------------------------
42  IMPLICIT NONE
43  INTEGER nmxy , nmxp
44  parameter(nmxy = 300)
45  parameter(nmxp = 30)
46  DOUBLE PRECISION ytrans(nmxy)
47  DOUBLE PRECISION pcmj(nmxp,4,nmxp)
48  INTEGER ntrans(nmxy), njiter, njmax, ntrack
49  INTEGER icmj(nmxp,nmxy)
50  COMMON / ckcom / ytrans, pcmj, ntrans, icmj, njiter, njmax, ntrack
51  INTEGER itkdm,nt,nj,njreq,ierr
52  REAL pt(itkdm,*)
53  INTEGER ntrk,nv
54  parameter( ntrk=300, nv=ntrk*(ntrk-2)+ntrk-(ntrk-2)*(ntrk-1)/2 )
55  LOGICAL ip(ntrk),lcall
56  INTEGER i,ii,j,k,l,imini,jmini,iad,ij(ntrk),jj(ntrk)
57  DOUBLE PRECISION pp(5),pl(5,ntrk),v(nv),pm,vmini,ysca,evis
58 C
59  DOUBLE PRECISION epsilon
60  DOUBLE PRECISION ycur(ntrk)
61  INTEGER icur, kix(ntrk)
62 C
63 
64  SAVE lcall
65  DATA lcall / .false. /
66  DATA epsilon / 1d-12 /
67  SAVE epsilon
68 
69 C Welcome message:
70  IF( .NOT.lcall ) THEN
71 c PRINT *, ' '
72 c PRINT *, 'Cambridge jet finding algorithm, please refer to:'
73 c PRINT *, 'Yu.L. Dokshitzer, G.D. Leder, S. Moretti, B.R. Webber'
74 c PRINT *, 'CAVENDISH-HEP-97/06 (June 1997)'
75  print *, ' '
76  print *, ' #################################################'
77  print *, ' ### C K E R N V E R S I O N 104 ###'
78 c PRINT *, ' ### S. Bentvelsen and I. Meyer, EPXXX, 1998 ###'
79  print *, ' #################################################'
80  WRITE(*,'(A,I2,A)')
81  + ' ##### CAMBRIDGE JET CLUSTERING 1 - ',njreq,' JETS #####'
82  print *, ' #################################################'
83  lcall= .true.
84  ENDIF
85 C---WARNINGS
86  ierr = 0
87  evis = 0d0
88  icur = 0
89  ntrack = nt
90  njreq = min(njreq,nt)
91  IF( nt.GT.ntrk ) THEN
92  WRITE(*,'(''CAMJET: More than '',I3,'' input particles: '',I5)')
93  & ntrk,nt
94  ierr= 1
95  RETURN
96  ELSEIF( nt.LT.2 ) THEN
97  WRITE(*,'(''CAMJET: Less than 2 input particles: '',I5)') nt
98  ierr= 2
99  RETURN
100  ENDIF
101 C
102 C.. RESET ALL VALUES
103 C
104  njiter = 0
105  DO i=1,nmxy
106  ytrans(i) = 0d0
107  ntrans(i) = 0
108  DO j=1,nmxp
109  icmj(j,i) = 0
110  ENDDO
111  ENDDO
112 
113  DO i=1,nt
114  evis = evis + dble(pt(4,i))
115  ENDDO
116  ysca = evis*evis
117 C---COPY MOMENTA INTO PL-ARRAY
118  2 DO i=1,nt
119  ycur(i) = 0d0
120  ip(i)=.true.
121  ij(i)=i
122  DO ii=1,4
123  pl(ii,i)= dble(pt(ii,i))
124  ENDDO
125  pm=pl(1,i)**2+pl(2,i)**2+pl(3,i)**2
126  IF (pm.GT.0d0) THEN
127  pl(5,i)=1d0/sqrt(pm)
128  ELSE
129  pl(5,i)=1d0
130  ENDIF
131  ENDDO
132 C--- FILL V-ARRAY: V(I,J) IS V(NT*(I-1)+J-I(I+1)/2)
133  iad = 0
134  DO i=1,nt-1
135  DO ii=1,5
136  pp(ii)=pl(ii,i)
137  ENDDO
138  DO j=i+1,nt
139  iad = iad + 1
140  v(iad) = 2d0*(1d0-(pp(1)*pl(1,j) +pp(2)*pl(2,j)
141  & +pp(3)*pl(3,j))*pp(5)*pl(5,j))
142  ENDDO
143  ENDDO
144  nj=nt
145 C---START MAIN LOOP. FIRST LOOK FOR MINIMUM V
146  1 vmini = 1d10
147  imini = 0
148  iad = 0
149  DO i=1,nt-1
150  IF (ip(i)) THEN
151  DO j=i+1,nt
152  iad = iad + 1
153  IF (ip(j).AND.v(iad).LT.vmini) THEN
154  vmini = v(iad)
155  imini = i
156  jmini = j
157  ENDIF
158  ENDDO
159  ELSE
160  iad=iad+nt-i
161  ENDIF
162  ENDDO
163 C--- END OF CLUSTER SEARCH FOR VMINI
164  IF (imini.NE.0) THEN
165 C--- NOT FINISHED YET
166  icur = icur + 1
167  ycur(icur) = vmini*min(pl(4,imini),pl(4,jmini))**2
168  IF (ycur(icur)+epsilon.GE.ysca) THEN
169 C--- SOFT FREEZING HERE
170  IF (pl(4,imini).LT.pl(4,jmini)) THEN
171  ip(imini)=.false.
172  ELSE
173  ip(jmini)=.false.
174  ENDIF
175  ELSE
176 C--- COMBINE PARTICLES IMINI AND JMINI
177  DO ii=1,4
178  pl(ii,imini)=pl(ii,imini)+pl(ii,jmini)
179  ENDDO
180  pm=pl(1,imini)**2+pl(2,imini)**2+pl(3,imini)**2
181  IF (pm.GT.0d0) THEN
182  pl(5,imini)=1d0/sqrt(pm)
183  ELSE
184  pl(5,imini)=1d0
185  ENDIF
186 C--- FLAG PARTICLE JMINI AS COMBINED
187  ip(jmini)=.false.
188  ij(jmini)=imini
189  nj=nj-1
190 C--- CALCULATE RELEVANT NEW V VALUES
191  DO i=1,nt
192  IF (i.NE.imini) THEN
193  IF (ij(i).EQ.jmini) ij(i)=imini
194  IF (ip(i)) THEN
195  k = min(i,imini)
196  l = max(i,imini)
197  iad = nt*(k-1) + l - (k*(k+1))/2
198  v(iad) = 2d0*(1d0-(pl(1,k)*pl(1,l) +pl(2,k)*pl(2,l)
199  & +pl(3,k)*pl(3,l))*pl(5,k)*pl(5,l))
200  ENDIF
201  ENDIF
202  ENDDO
203  ENDIF
204 C--- BACK TO START OF LOOP
205  go to 1
206  ELSE
207 C
208 C.. ITERATION IN JET-FINDING FINISHED
209 C
210  njiter = njiter + 1
211  IF(njiter.LE.nmxy) THEN
212 C
213 C.. STORE THE VALUE OF YFLIP AND THE CORRESPONDING NUMBER OF JETS
214 C
215  ytrans(njiter) = ysca
216  ntrans(njiter) = nj
217 
218  IF(njiter.LE.nmxp) THEN
219 C
220 C.. STORE THE JET-DIRECTIONS AND PARTICLE ASSOCIATION
221 C
222  j=0
223  DO i=1,nt
224  IF (ij(i).EQ.i) THEN
225  j=j+1
226  jj(i)=j
227  DO ii=1,4
228  pcmj(njiter,ii,j)= pl(ii,i)
229  ENDDO
230  ENDIF
231  ENDDO
232  DO i=1,nt
233  icmj(njiter,i)=jj(ij(i))
234  ENDDO
235  ENDIF
236  IF(nj.LE.njreq) THEN
237 C
238 C.. ANOTHER ITERATION?
239 C
240  CALL cksord(nt,ycur,kix,'I')
241  DO i=1,nt
242 C
243 C.. DETERMINE THE NEXT VALUE FOR YSCA, RESET VARIABLES
244 C
245  IF(ycur(kix(i)).LT.ysca) THEN
246  ysca = ycur(kix(i))
247  icur = 0
248  DO j=1,nt
249  ycur(j) = 0d0
250  ENDDO
251 C
252 C.. YUP, GO FOR THE NEXT ROUND
253 C
254  IF(ysca.NE.0) goto 2
255  ENDIF
256  ENDDO
257  ENDIF
258  ENDIF
259  ENDIF
260 C
261 C.. DEVIDE BY ECM**2
262 C
263  njmax = -1
264  DO i=1,njiter
265  ytrans(i) = ytrans(i)/evis**2
266  IF(ntrans(i).GT.njmax) njmax = ntrans(i)
267  ENDDO
268 
269  END
subroutine ckern(ITKDM, NT, PT, NJREQ, IERR)
Definition: ckern.f:2
double min(double a, double b)
subroutine cksord(ISZ, ARY, KIX, COPT)
Definition: cksord.f:2