2 C*********************************************************************
4 SUBROUTINE LUCLUS(NJET)
6 C...Purpose: to subdivide the particle content of an event into
8 COMMON/LUJETS/N,K(4000,5),P(4000,5),V(4000,5)
9 COMMON/LUDAT1/MSTU(200),PARU(200),MSTJ(200),PARJ(200)
10 COMMON/LUDAT2/KCHG(500,3),PMAS(500,4),PARF(2000),VCKM(4,4)
11 SAVE /LUJETS/,/LUDAT1/,/LUDAT2/
13 SAVE NSAV,NP,PS,PSS,RINIT,NPRE,NREM
15 C...Functions: distance measure in pT or (pseudo)mass.
16 R2T(I1,I2)=(P(I1,5)*P(I2,5)-P(I1,1)*P(I2,1)-P(I1,2)*P(I2,2)-
17 &P(I1,3)*P(I2,3))*2.*P(I1,5)*P(I2,5)/(0.0001+P(I1,5)+P(I2,5))**2
18 R2M(I1,I2)=2.*P(I1,4)*P(I2,4)*(1.-(P(I1,1)*P(I2,1)+P(I1,2)*
19 &P(I2,2)+P(I1,3)*P(I2,3))/(P(I1,5)*P(I2,5)))
21 C...If first time, reset. If reentering, skip preliminaries.
22 IF(MSTU(48).LE.0) THEN
30 IF(MSTU(43).GE.2) N=N-NJET
32 P(I,5)=SQRT(P(I,1)**2+P(I,2)**2+P(I,3)**2)
34 IF(MSTU(46).LE.3) R2ACC=PARU(44)**2
35 IF(MSTU(46).GE.4) R2ACC=PARU(45)*PS(5)**2
40 C...Find which particles are to be considered in cluster search.
42 IF(K(I,1).LE.0.OR.K(I,1).GT.10) GOTO 140
43 IF(MSTU(41).GE.2) THEN
45 IF(KC.EQ.0.OR.KC.EQ.12.OR.KC.EQ.14.OR.KC.EQ.16.OR.
47 IF(MSTU(41).GE.3.AND.KCHG(KC,2).EQ.0.AND.LUCHGE(K(I,2)).EQ.0)
50 IF(N+2*NP.GE.MSTU(4)-MSTU(32)-5) THEN
51 CALL LUERRM(11,'(LUCLUS:) no more memory left in LUJETS')
56 C...Take copy of these particles, with space left for jets later on.
62 IF(MSTU(42).EQ.0) P(N+NP,5)=0.
63 IF(MSTU(42).EQ.1.AND.K(I,2).NE.22) P(N+NP,5)=PMAS(101,1)
64 P(N+NP,4)=SQRT(P(N+NP,5)**2+P(I,1)**2+P(I,2)**2+P(I,3)**2)
65 P(N+NP,5)=SQRT(P(I,1)**2+P(I,2)**2+P(I,3)**2)
77 PS(5)=SQRT(MAX(0.,PS(4)**2-PS(1)**2-PS(2)**2-PS(3)**2))
79 C...Very low multiplicities not considered.
80 IF(NP.LT.MSTU(47)) THEN
81 CALL LUERRM(8,'(LUCLUS:) too few particles for analysis')
86 C...Find precluster configuration. If too few jets, make harder cuts.
88 IF(MSTU(46).LE.3) R2ACC=PARU(44)**2
89 IF(MSTU(46).GE.4) R2ACC=PARU(45)*PS(5)**2
91 IF(NP.LE.MSTU(47)+2) RINIT=0.
95 DO 180 I=N+NP+1,N+2*NP
99 C...Sum up small momentum region. Jet if enough absolute momentum.
100 IF(MSTU(46).LE.2) THEN
104 DO 210 I=N+NP+1,N+2*NP
105 IF(P(I,5).GT.2.*RINIT) GOTO 210
109 P(N+1,J)=P(N+1,J)+P(I,J)
112 P(N+1,5)=SQRT(P(N+1,1)**2+P(N+1,2)**2+P(N+1,3)**2)
113 IF(P(N+1,5).GT.2.*RINIT) NPRE=1
114 IF(RINIT.GE.0.2*PARU(43).AND.NPRE+NREM.LT.MSTU(47)) GOTO 170
115 IF(NREM.EQ.0) GOTO 170
118 C...Find fastest remaining particle.
121 DO 230 I=N+NP+1,N+2*NP
122 IF(K(I,4).NE.0.OR.P(I,5).LE.PMAX) GOTO 230
127 P(N+NPRE,J)=P(IMAX,J)
132 C...Sum up precluster around it according to pT separation.
133 IF(MSTU(46).LE.2) THEN
134 DO 260 I=N+NP+1,N+2*NP
135 IF(K(I,4).NE.0) GOTO 260
137 IF(R2.GT.RINIT**2) GOTO 260
141 P(N+NPRE,J)=P(N+NPRE,J)+P(I,J)
144 P(N+NPRE,5)=SQRT(P(N+NPRE,1)**2+P(N+NPRE,2)**2+P(N+NPRE,3)**2)
146 C...Sum up precluster around it according to mass separation.
150 DO 280 I=N+NP+1,N+2*NP
151 IF(K(I,4).NE.0) GOTO 280
153 IF(R2.GE.R2MIN) GOTO 280
159 P(N+NPRE,J)=P(N+NPRE,J)+P(IMIN,J)
161 P(N+NPRE,5)=SQRT(P(N+NPRE,1)**2+P(N+NPRE,2)**2+P(N+NPRE,3)**2)
168 C...Check if more preclusters to be found. Start over if too few.
169 IF(RINIT.GE.0.2*PARU(43).AND.NPRE+NREM.LT.MSTU(47)) GOTO 170
170 IF(NREM.GT.0) GOTO 220
173 C...Reassign all particles to nearest jet. Sum up new jet momenta.
176 310 IF(MSTU(46).LE.1) THEN
182 DO 360 I=N+NP+1,N+2*NP
184 DO 340 IJET=N+1,N+NJET
185 IF(P(IJET,5).LT.RINIT) GOTO 340
187 IF(R2.GE.R2MIN) GOTO 340
193 V(IMIN,J)=V(IMIN,J)+P(I,J)
201 P(I,5)=SQRT(P(I,1)**2+P(I,2)**2+P(I,3)**2)
206 C...Find two closest jets.
207 R2MIN=2.*MAX(R2ACC,PS(5)**2)
208 DO 400 ITRY1=N+1,N+NJET-1
209 DO 390 ITRY2=ITRY1+1,N+NJET
210 IF(MSTU(46).LE.2) R2=R2T(ITRY1,ITRY2)
211 IF(MSTU(46).GE.3) R2=R2M(ITRY1,ITRY2)
212 IF(R2.GE.R2MIN) GOTO 390
219 C...If allowed, join two closest jets and start over.
220 IF(NJET.GT.MSTU(47).AND.R2MIN.LT.R2ACC) THEN
221 IREC=MIN(IMIN1,IMIN2)
222 IDEL=MAX(IMIN1,IMIN2)
224 P(IREC,J)=P(IMIN1,J)+P(IMIN2,J)
226 P(IREC,5)=SQRT(P(IREC,1)**2+P(IREC,2)**2+P(IREC,3)**2)
227 DO 430 I=IDEL+1,N+NJET
232 IF(MSTU(46).GE.2) THEN
233 DO 440 I=N+NP+1,N+2*NP
235 IF(IORI.EQ.IDEL) K(I,4)=IREC-N
236 IF(IORI.GT.IDEL) K(I,4)=K(I,4)-1
242 C...Divide up broad jet if empty cluster in list of final ones.
243 ELSEIF(NJET.EQ.MSTU(47).AND.MSTU(46).LE.1.AND.NLOOP.LE.2) THEN
247 DO 460 I=N+NP+1,N+2*NP
248 K(N+K(I,4),5)=K(N+K(I,4),5)+1
252 IF(K(I,5).EQ.0) IEMP=I
258 DO 480 I=N+NP+1,N+2*NP
259 IF(K(N+K(I,4),5).LE.1.OR.P(I,5).LT.RINIT) GOTO 480
262 IF(R2.LE.R2MAX) GOTO 480
270 P(IJET,J)=P(IJET,J)-P(ISPL,J)
273 P(IJET,5)=SQRT(P(IJET,1)**2+P(IJET,2)**2+P(IJET,3)**2)
274 IF(NLOOP.LE.2) GOTO 300
279 C...If generalized thrust has not yet converged, continue iteration.
280 IF(MSTU(46).LE.1.AND.NLOOP.LE.2.AND.PSJT/PSS.GT.TSAV+PARU(48))
286 C...Reorder jets according to energy.
292 DO 540 INEW=N+1,N+NJET
294 DO 520 ITRY=N+1,N+NJET
295 IF(V(ITRY,4).LE.PEMAX) GOTO 520
310 C...Clean up particle-jet assignments and jet information.
311 DO 550 I=N+NP+1,N+2*NP
314 IF(K(K(I,3),1).NE.3) K(K(I,3),4)=IORI-N
315 K(IORI,4)=K(IORI,4)+1
322 P(I,5)=SQRT(MAX(P(I,4)**2-P(I,5)**2,0.))
326 IF(K(I,4).EQ.0) IEMP=I
329 C...Select storing option. Output variables. Check for failure.
336 IF(NJET.LE.1) PARU(63)=0.
338 CALL LUERRM(8,'(LUCLUS:) failed to reconstruct as requested')
341 IF(MSTU(43).LE.1) MSTU(3)=NJET
342 IF(MSTU(43).GE.2) N=N+NJET