Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
pyboei.f
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file pyboei.f
1 
2 C*********************************************************************
3 
4 C...PYBOEI
5 C...Modifies an event so as to approximately take into account
6 C...Bose-Einstein effects according to a simple phenomenological
7 C...parametrization.
8 
9  SUBROUTINE pyboei(NSAV)
10 
11 C...Double precision and integer declarations.
12  IMPLICIT DOUBLE PRECISION(a-h, o-z)
13  IMPLICIT INTEGER(i-n)
14  INTEGER pyk,pychge,pycomp
15 C...Parameter statement to help give large particle numbers.
16  parameter(ksusy1=1000000,ksusy2=2000000,ktechn=3000000,
17  &kexcit=4000000,kdimen=5000000)
18 C...Commonblocks.
19  common/pyjets/n,npad,k(4000,5),p(4000,5),v(4000,5)
20  common/pydat1/mstu(200),paru(200),mstj(200),parj(200)
21  common/pydat2/kchg(500,4),pmas(500,4),parf(2000),vckm(4,4)
22  common/pyint1/mint(400),vint(400)
23  SAVE /pyjets/,/pydat1/,/pydat2/,/pyint1/
24 C...Local arrays and data.
25  dimension dps(4),kfbe(9),nbe(0:10),bei(100),bei3(100),
26  &beiw(100),bei3w(100)
27  DATA kfbe/211,-211,111,321,-321,130,310,221,331/
28 C...Statement function: squared invariant mass.
29  sdip(i,j)=((p(i,4)+p(j,4))**2-(p(i,3)+p(j,3))**2-
30  &(p(i,2)+p(j,2))**2-(p(i,1)+p(j,1))**2)
31 
32 C...Boost event to overall CM frame. Calculate CM energy.
33  IF((mstj(51).NE.1.AND.mstj(51).NE.2).OR.n-nsav.LE.1) RETURN
34  DO 100 j=1,4
35  dps(j)=0d0
36  100 CONTINUE
37  DO 120 i=1,n
38  kfa=iabs(k(i,2))
39  IF(k(i,1).LE.10.AND.((kfa.GT.10.AND.kfa.LE.20).OR.kfa.EQ.22)
40  & .AND.k(i,3).GT.0) THEN
41  kfma=iabs(k(k(i,3),2))
42  IF(kfma.GT.10.AND.kfma.LE.80) k(i,1)=-k(i,1)
43  ENDIF
44  IF(k(i,1).LE.0.OR.k(i,1).GT.10) goto 120
45  DO 110 j=1,4
46  dps(j)=dps(j)+p(i,j)
47  110 CONTINUE
48  120 CONTINUE
49  CALL pyrobo(0,0,0d0,0d0,-dps(1)/dps(4),-dps(2)/dps(4),
50  &-dps(3)/dps(4))
51  pecm=0d0
52  DO 130 i=1,n
53  IF(k(i,1).GE.1.AND.k(i,1).LE.10) pecm=pecm+p(i,4)
54  130 CONTINUE
55 
56 C...Check if we have separated strings
57 
58 C...Reserve copy of particles by species at end of record.
59  iwp=0
60  iwn=0
61  nbe(0)=n+mstu(3)
62  nmax=nbe(0)
63  smmin=pecm
64  DO 190 ibe=1,min(10,mstj(52)+1)
65  nbe(ibe)=nbe(ibe-1)
66  DO 180 i=nsav+1,n
67  IF(ibe.EQ.min(10,mstj(52)+1)) THEN
68  DO 140 iibe=1,ibe-1
69  IF(k(i,2).EQ.kfbe(iibe)) goto 180
70  140 CONTINUE
71  ELSE
72  IF(k(i,2).NE.kfbe(ibe)) goto 180
73  ENDIF
74  IF(k(i,1).LE.0.OR.k(i,1).GT.10) goto 180
75  IF(nbe(ibe).GE.mstu(4)-mstu(32)-5) THEN
76  CALL pyerrm(11,'(PYBOEI:) no more memory left in PYJETS')
77  RETURN
78  ENDIF
79  nbe(ibe)=nbe(ibe)+1
80  nmax=nbe(ibe)
81  k(nbe(ibe),1)=i
82  k(nbe(ibe),2)=0
83  k(nbe(ibe),3)=0
84  k(nbe(ibe),4)=0
85  k(nbe(ibe),5)=0
86  p(nbe(ibe),1)=0.0d0
87  p(nbe(ibe),2)=0.0d0
88  p(nbe(ibe),3)=0.0d0
89  p(nbe(ibe),4)=0.0d0
90  p(nbe(ibe),5)=0.0d0
91  smmin=min(smmin,p(i,5))
92 C...Check if particles comes from different W's or Z's
93  IF((mstj(53).NE.0.OR.mstj(56).GT.0).AND.mint(32).EQ.0) THEN
94  im=i
95  150 IF(k(im,3).GT.0) THEN
96  im=k(im,3)
97  IF(abs(k(im,2)).NE.24.AND.k(im,2).NE.23) goto 150
98  k(nbe(ibe),5)=im
99  IF(iwp.EQ.0.AND.k(im,2).EQ.24) iwp=im
100  IF(iwn.EQ.0.AND.k(im,2).EQ.-24) iwn=im
101  IF(iwp.EQ.0.AND.k(im,2).EQ.23) iwp=im
102  IF(iwn.EQ.0.AND.k(im,2).EQ.23.AND.im.NE.iwp) iwn=im
103  ENDIF
104  ENDIF
105 C...Check if particles comes from different strings.
106  IF(parj(94).GT.0.0d0) THEN
107  im=i
108  160 IF(k(im,3).GT.0) THEN
109  im=k(im,3)
110  IF(k(im,2).NE.92.AND.k(im,2).NE.91) goto 160
111  k(nbe(ibe),5)=im
112  ENDIF
113  ENDIF
114  DO 170 j=1,3
115  p(nbe(ibe),j)=0d0
116  v(nbe(ibe),j)=0d0
117  170 CONTINUE
118  p(nbe(ibe),5)=-1.0d0
119  180 CONTINUE
120  190 CONTINUE
121  IF(nbe(min(9,mstj(52)))-nbe(0).LE.1) goto 510
122 
123 C...Calculate separation between W+ and W- or between two Z0's.
124 C...No separation if there has been re-connections.
125  sigw=parj(93)
126  IF(iwp.GT.0.AND.iwn.GT.0.AND.mstj(56).GT.0.AND.mint(32).EQ.0) THEN
127  IF(k(iwp,2).EQ.23) THEN
128  dmw=pmas(23,1)
129  dgw=pmas(23,2)
130  ELSE
131  dmw=pmas(24,1)
132  dgw=pmas(24,2)
133  ENDIF
134  dmp=p(iwp,5)
135  dmn=p(iwn,5)
136  taupd=dmp/sqrt((dmp**2-dmw**2)**2+(dgw*(dmp**2)/dmw)**2)
137  taund=dmn/sqrt((dmn**2-dmw**2)**2+(dgw*(dmn**2)/dmw)**2)
138  taup=-taupd*log(pyr(idum))
139  taun=-taund*log(pyr(idum))
140  dxp=taup*pyp(iwp,8)/dmp
141  dxn=taun*pyp(iwn,8)/dmn
142  dx=dxp+dxn
143  sigw=1.0d0/(1.0d0/parj(93)+REAL(mstj(56))*dx)
144  IF(parj(94).LT.0.0d0) sigw=1.0d0/(1.0d0/sigw-1.0d0/parj(94))
145  ENDIF
146 
147 C...Add separation between strings.
148  IF(parj(94).GT.0.0d0) THEN
149  sigw=1.0d0/(1.0d0/sigw+1.0d0/parj(94))
150  iwp=-1
151  iwn=-1
152  ENDIF
153 
154  IF(mstj(57).EQ.1.AND.mstj(54).LT.0) THEN
155  DO 220 ibe=1,min(9,mstj(52))
156  DO 210 i1m=nbe(ibe-1)+1,nbe(ibe)
157  q2min=pecm**2
158  i1=k(i1m,1)
159  DO 200 i2m=nbe(ibe-1)+1,nbe(ibe)
160  IF(i2m.EQ.i1m) goto 200
161  i2=k(i2m,1)
162  q2=(p(i1,4)+p(i2,4))**2-(p(i1,1)+p(i2,1))**2-
163  & (p(i1,2)+p(i2,2))**2-(p(i1,3)+p(i2,3))**2-
164  & (p(i1,5)+p(i2,5))**2
165  IF(q2.GT.0.0d0.AND.q2.LT.q2min) THEN
166  q2min=q2
167  ENDIF
168  200 CONTINUE
169  p(i1m,5)=q2min
170  210 CONTINUE
171  220 CONTINUE
172  ENDIF
173 
174 C...Tabulate integral for subsequent momentum shift.
175  DO 400 ibe=1,min(9,mstj(52))
176  IF(ibe.NE.1.AND.ibe.NE.4.AND.ibe.LE.7) goto 270
177  IF(ibe.EQ.1.AND.max(nbe(1)-nbe(0),nbe(2)-nbe(1),nbe(3)-nbe(2))
178  & .LE.1) goto 270
179  IF(ibe.EQ.4.AND.max(nbe(4)-nbe(3),nbe(5)-nbe(4),nbe(6)-nbe(5),
180  & nbe(7)-nbe(6)).LE.1) goto 270
181  IF(ibe.GE.8.AND.nbe(ibe)-nbe(ibe-1).LE.1) goto 270
182  IF(ibe.EQ.1) pmhq=2d0*pymass(211)
183  IF(ibe.EQ.4) pmhq=2d0*pymass(321)
184  IF(ibe.EQ.8) pmhq=2d0*pymass(221)
185  IF(ibe.EQ.9) pmhq=2d0*pymass(331)
186  qdel=0.1d0*min(pmhq,parj(93))
187  qdel3=0.1d0*min(pmhq,parj(93)*3.0d0)
188  qdelw=0.1d0*min(pmhq,sigw)
189  qdel3w=0.1d0*min(pmhq,sigw*3.0d0)
190  IF(mstj(51).EQ.1) THEN
191  nbin=min(100,nint(9d0*parj(93)/qdel))
192  nbin3=min(100,nint(27d0*parj(93)/qdel3))
193  nbinw=min(100,nint(9d0*sigw/qdelw))
194  nbin3w=min(100,nint(27d0*sigw/qdel3w))
195  beex=exp(0.5d0*qdel/parj(93))
196  beex3=exp(0.5d0*qdel3/(3.0d0*parj(93)))
197  beexw=exp(0.5d0*qdelw/sigw)
198  beex3w=exp(0.5d0*qdel3w/(3.0d0*sigw))
199  bert=exp(-qdel/parj(93))
200  bert3=exp(-qdel3/(3.0d0*parj(93)))
201  bertw=exp(-qdelw/sigw)
202  bert3w=exp(-qdel3w/(3.0d0*sigw))
203  ELSE
204  nbin=min(100,nint(3d0*parj(93)/qdel))
205  nbin3=min(100,nint(9d0*parj(93)/qdel3))
206  nbinw=min(100,nint(3d0*sigw/qdelw))
207  nbin3w=min(100,nint(9d0*sigw/qdel3w))
208  ENDIF
209  DO 230 ibin=1,nbin
210  qbin=qdel*(ibin-0.5d0)
211  bei(ibin)=qdel*(qbin**2+qdel**2/12d0)/sqrt(qbin**2+pmhq**2)
212  IF(mstj(51).EQ.1) THEN
213  beex=beex*bert
214  bei(ibin)=bei(ibin)*beex
215  ELSE
216  bei(ibin)=bei(ibin)*exp(-(qbin/parj(93))**2)
217  ENDIF
218  IF(ibin.GE.2) bei(ibin)=bei(ibin)+bei(ibin-1)
219  230 CONTINUE
220  DO 240 ibin=1,nbin3
221  qbin=qdel3*(ibin-0.5d0)
222  bei3(ibin)=qdel3*(qbin**2+qdel3**2/12d0)/sqrt(qbin**2+pmhq**2)
223  IF(mstj(51).EQ.1) THEN
224  beex3=beex3*bert3
225  bei3(ibin)=bei3(ibin)*beex3
226  ELSE
227  bei3(ibin)=bei3(ibin)*exp(-(qbin/(3.0d0*parj(93)))**2)
228  ENDIF
229  IF(ibin.GE.2) bei3(ibin)=bei3(ibin)+bei3(ibin-1)
230  240 CONTINUE
231  DO 250 ibin=1,nbinw
232  qbin=qdelw*(ibin-0.5d0)
233  beiw(ibin)=qdelw*(qbin**2+qdelw**2/12d0)/sqrt(qbin**2+pmhq**2)
234  IF(mstj(51).EQ.1) THEN
235  beexw=beexw*bertw
236  beiw(ibin)=beiw(ibin)*beexw
237  ELSE
238  beiw(ibin)=beiw(ibin)*exp(-(qbin/sigw)**2)
239  ENDIF
240  IF(ibin.GE.2) beiw(ibin)=beiw(ibin)+beiw(ibin-1)
241  250 CONTINUE
242  DO 260 ibin=1,nbin3w
243  qbin=qdel3w*(ibin-0.5d0)
244  bei3w(ibin)=qdel3w*(qbin**2+qdel3w**2/12d0)/
245  & sqrt(qbin**2+pmhq**2)
246  IF(mstj(51).EQ.1) THEN
247  beex3w=beex3w*bert3w
248  bei3w(ibin)=bei3w(ibin)*beex3w
249  ELSE
250  bei3w(ibin)=bei3w(ibin)*exp(-(qbin/(3.0d0*sigw))**2)
251  ENDIF
252  IF(ibin.GE.2) bei3w(ibin)=bei3w(ibin)+bei3w(ibin-1)
253  260 CONTINUE
254 
255 C...Loop through particle pairs and find old relative momentum.
256  270 DO 390 i1m=nbe(ibe-1)+1,nbe(ibe)-1
257  i1=k(i1m,1)
258  DO 380 i2m=i1m+1,nbe(ibe)
259  IF(mstj(53).EQ.1.AND.k(i1m,5).NE.k(i2m,5)) goto 380
260  IF(mstj(53).EQ.2.AND.k(i1m,5).EQ.k(i2m,5)) goto 380
261  i2=k(i2m,1)
262  q2old=(p(i1,4)+p(i2,4))**2-(p(i1,1)+p(i2,1))**2-(p(i1,2)+
263  & p(i2,2))**2-(p(i1,3)+p(i2,3))**2-(p(i1,5)+p(i2,5))**2
264  IF(q2old.LE.0.0d0) goto 380
265  qold=sqrt(q2old)
266 
267 C...Calculate new relative momentum.
268  qmov=0.0d0
269  qmov3=0.0d0
270  qmovw=0.0d0
271  qmov3w=0.0d0
272  IF(qold.LT.1d-3*qdel) THEN
273  goto 280
274  ELSEIF(qold.LE.qdel) THEN
275  qmov=qold/3d0
276  ELSEIF(qold.LT.(nbin-0.1d0)*qdel) THEN
277  rbin=qold/qdel
278  ibin=rbin
279  rinp=(rbin**3-ibin**3)/(3*ibin*(ibin+1)+1)
280  qmov=(bei(ibin)+rinp*(bei(ibin+1)-bei(ibin)))*
281  & sqrt(q2old+pmhq**2)/q2old
282  ELSE
283  qmov=bei(nbin)*sqrt(q2old+pmhq**2)/q2old
284  ENDIF
285  280 q2new=q2old*(qold/(qold+3d0*parj(92)*qmov))**(2d0/3d0)
286  IF(qold.LT.1d-3*qdel3) THEN
287  goto 290
288  ELSEIF(qold.LE.qdel3) THEN
289  qmov3=qold/3d0
290  ELSEIF(qold.LT.(nbin3-0.1d0)*qdel3) THEN
291  rbin3=qold/qdel3
292  ibin3=rbin3
293  rinp3=(rbin3**3-ibin3**3)/(3*ibin3*(ibin3+1)+1)
294  qmov3=(bei3(ibin3)+rinp3*(bei3(ibin3+1)-bei3(ibin3)))*
295  & sqrt(q2old+pmhq**2)/q2old
296  ELSE
297  qmov3=bei3(nbin3)*sqrt(q2old+pmhq**2)/q2old
298  ENDIF
299  290 q2new3=q2old*(qold/(qold+3d0*parj(92)*qmov3))**(2d0/3d0)
300  rscale=1.0d0
301  IF(mstj(54).EQ.2)
302  & rscale=1.0d0-exp(-(qold/(2d0*parj(93)))**2)
303  IF((iwp.NE.-1.AND.mstj(56).LE.0).OR.iwp.EQ.0.OR.iwn.EQ.0.OR.
304  & k(i1m,5).EQ.k(i2m,5)) goto 320
305 
306  IF(qold.LT.1d-3*qdelw) THEN
307  goto 300
308  ELSEIF(qold.LE.qdelw) THEN
309  qmovw=qold/3d0
310  ELSEIF(qold.LT.(nbinw-0.1d0)*qdelw) THEN
311  rbinw=qold/qdelw
312  ibinw=rbinw
313  rinpw=(rbinw**3-ibinw**3)/(3*ibinw*(ibinw+1)+1)
314  qmovw=(beiw(ibinw)+rinpw*(beiw(ibinw+1)-beiw(ibinw)))*
315  & sqrt(q2old+pmhq**2)/q2old
316  ELSE
317  qmovw=beiw(nbinw)*sqrt(q2old+pmhq**2)/q2old
318  ENDIF
319  300 q2new=q2old*(qold/(qold+3d0*parj(92)*qmovw))**(2d0/3d0)
320  IF(qold.LT.1d-3*qdel3w) THEN
321  goto 310
322  ELSEIF(qold.LE.qdel3w) THEN
323  qmov3w=qold/3d0
324  ELSEIF(qold.LT.(nbin3w-0.1d0)*qdel3w) THEN
325  rbin3w=qold/qdel3w
326  ibin3w=rbin3w
327  rinp3w=(rbin3w**3-ibin3w**3)/(3*ibin3w*(ibin3w+1)+1)
328  qmov3w=(bei3w(ibin3w)+rinp3w*(bei3w(ibin3w+1)-
329  & bei3w(ibin3w)))*sqrt(q2old+pmhq**2)/q2old
330  ELSE
331  qmov3w=bei3w(nbin3w)*sqrt(q2old+pmhq**2)/q2old
332  ENDIF
333  310 q2new3=q2old*(qold/(qold+3d0*parj(92)*qmov3w))**(2d0/3d0)
334  IF(mstj(54).EQ.2)
335  & rscale=1.0d0-exp(-(qold/(2d0*sigw))**2)
336 
337  320 CALL pybesq(i1,i2,nmax,q2old,q2new)
338  DO 330 j=1,3
339  p(i1m,j)=p(i1m,j)+p(nmax+1,j)
340  p(i2m,j)=p(i2m,j)+p(nmax+2,j)
341  330 CONTINUE
342  IF(mstj(54).GE.1) THEN
343  CALL pybesq(i1,i2,nmax,q2old,q2new3)
344  DO 340 j=1,3
345  v(i1m,j)=v(i1m,j)+p(nmax+1,j)*rscale
346  v(i2m,j)=v(i2m,j)+p(nmax+2,j)*rscale
347  340 CONTINUE
348  ELSEIF(mstj(54).LE.-1) THEN
349  edel=p(i1,4)+p(i2,4)-
350  & sqrt(max(q2new-q2old+(p(i1,4)+p(i2,4))**2,0.0d0))
351  a2=(p(i1,1)-p(i2,1))**2+(p(i1,2)-p(i2,2))**2+
352  & (p(i1,3)-p(i2,3))**2
353  wmax=-1.0d20
354  mi3=0
355  mi4=0
356  s12=sdip(i1,i2)
357  sm1=(p(i1,5)+smmin)**2
358  DO 360 i3m=nbe(0)+1,nbe(min(10,mstj(52)+1))
359  IF(i3m.EQ.i1m.OR.i3m.EQ.i2m) goto 360
360  IF(mstj(53).EQ.1.AND.k(i3m,5).NE.k(i1m,5)) goto 360
361  IF(mstj(53).EQ.-2.AND.k(i1m,5).EQ.k(i2m,5).AND.
362  & k(i3m,5).NE.k(i1m,5)) goto 360
363  i3=k(i3m,1)
364  IF(k(i3,2).EQ.k(i1,2)) goto 360
365  s13=sdip(i1,i3)
366  s23=sdip(i2,i3)
367  sm3=(p(i3,5)+smmin)**2
368  IF(mstj(54).EQ.-2) THEN
369  wi=(min(s12*sm3,s13*min(sm1,sm3),
370  & s23*min(sm1,sm3))*sm1)
371  ELSE
372  wi=((p(i1,4)+p(i2,4)+p(i3,4))**2-
373  & (p(i1,3)+p(i2,3)+p(i3,3))**2-
374  & (p(i1,2)+p(i2,2)+p(i3,2))**2-
375  & (p(i1,1)+p(i2,1)+p(i3,1))**2)
376  ENDIF
377  IF(mstj(57).EQ.1.AND.p(i3m,5).GT.0) THEN
378  IF (wmax*wi.GE.(1.0d0-exp(-p(i3m,5)/(parj(93)**2))))
379  & goto 360
380  ELSE
381  IF(wmax*wi.GE.1.0) goto 360
382  ENDIF
383  DO 350 i4m=i3m+1,nbe(min(10,mstj(52)+1))
384  IF(i4m.EQ.i1m.OR.i4m.EQ.i2m) goto 350
385  IF(mstj(53).EQ.1.AND.k(i4m,5).NE.k(i1m,5)) goto 350
386  IF(mstj(53).EQ.-2.AND.k(i1m,5).EQ.k(i2m,5).AND.
387  & k(i4m,5).NE.k(i1m,5)) goto 350
388  i4=k(i4m,1)
389  IF(k(i3,2).EQ.k(i4,2).OR.k(i4,2).EQ.k(i1,2))
390  & goto 350
391  IF((p(i3,4)+p(i4,4)+edel)**2.LT.
392  & (p(i3,1)+p(i4,1))**2+(p(i3,2)+p(i4,2))**2+
393  & (p(i3,3)+p(i4,3))**2+(p(i3,5)+p(i4,5))**2)
394  & goto 350
395  IF(mstj(54).EQ.-2) THEN
396  s14=sdip(i1,i4)
397  s24=sdip(i2,i4)
398  s34=sdip(i3,i4)
399  w=s12*min(min(s23,s24),min(s13,s14))*s34
400  w=min(w,s13*min(min(s23,s34),s12)*s24)
401  w=min(w,s14*min(min(s24,s34),s12)*s23)
402  w=min(w,min(s23,s24)*s13*s14)
403  w=1.0d0/w
404  ELSE
405 C...weight=1-cos(theta)/mtot2
406  s1234=(p(i1,4)+p(i2,4)+p(i3,4)+p(i4,4))**2-
407  & (p(i1,3)+p(i2,3)+p(i3,3)+p(i4,3))**2-
408  & (p(i1,2)+p(i2,2)+p(i3,2)+p(i4,2))**2-
409  & (p(i1,1)+p(i2,1)+p(i3,1)+p(i4,1))**2
410  w=1.0d0/s1234
411  IF(w.LE.wmax) goto 350
412  ENDIF
413  IF(mstj(57).EQ.1.AND.p(i3m,5).GT.0)
414  & w=w*(1.0d0-exp(-p(i3m,5)/(parj(93)**2)))
415  IF(mstj(57).EQ.1.AND.p(i4m,5).GT.0)
416  & w=w*(1.0d0-exp(-p(i4m,5)/(parj(93)**2)))
417  IF(w.LE.wmax) goto 350
418  mi3=i3m
419  mi4=i4m
420  wmax=w
421  350 CONTINUE
422  360 CONTINUE
423  IF(mi4.EQ.0) goto 380
424  i3=k(mi3,1)
425  i4=k(mi4,1)
426  eold=p(i3,4)+p(i4,4)
427  enew=eold+edel
428  p2=(p(i3,1)+p(i4,1))**2+(p(i3,2)+p(i4,2))**2+
429  & (p(i3,3)+p(i4,3))**2
430  q2newp=max(0.0d0,enew**2-p2-(p(i3,5)+p(i4,5))**2)
431  q2oldp=max(0.0d0,eold**2-p2-(p(i3,5)+p(i4,5))**2)
432  CALL pybesq(i3,i4,nmax,q2oldp,q2newp)
433  DO 370 j=1,3
434  v(mi3,j)=v(mi3,j)+p(nmax+1,j)
435  v(mi4,j)=v(mi4,j)+p(nmax+2,j)
436  370 CONTINUE
437  ENDIF
438  380 CONTINUE
439  390 CONTINUE
440  400 CONTINUE
441 
442 C...Shift momenta and recalculate energies.
443  esump=0.0d0
444  esum=0.0d0
445  prod=0.0d0
446  DO 430 im=nbe(0)+1,nbe(min(10,mstj(52)+1))
447  i=k(im,1)
448  esump=esump+p(i,4)
449  DO 410 j=1,3
450  p(i,j)=p(i,j)+p(im,j)
451  410 CONTINUE
452  p(i,4)=sqrt(p(i,5)**2+p(i,1)**2+p(i,2)**2+p(i,3)**2)
453  esum=esum+p(i,4)
454  DO 420 j=1,3
455  prod=prod+v(im,j)*p(i,j)/p(i,4)
456  420 CONTINUE
457  430 CONTINUE
458 
459  parj(96)=0.0d0
460  IF(mstj(54).NE.0.AND.prod.NE.0.0d0) THEN
461  440 alpha=(esump-esum)/prod
462  parj(96)=parj(96)+alpha
463  prod=0.0d0
464  esum=0.0d0
465  DO 470 im=nbe(0)+1,nbe(min(10,mstj(52)+1))
466  i=k(im,1)
467  DO 450 j=1,3
468  p(i,j)=p(i,j)+alpha*v(im,j)
469  450 CONTINUE
470  p(i,4)=sqrt(p(i,5)**2+p(i,1)**2+p(i,2)**2+p(i,3)**2)
471  esum=esum+p(i,4)
472  DO 460 j=1,3
473  prod=prod+v(im,j)*p(i,j)/p(i,4)
474  460 CONTINUE
475  470 CONTINUE
476  IF(prod.NE.0.0d0.AND.abs(esump-esum)/pecm.GT.0.00001d0)
477  & goto 440
478  ENDIF
479 
480 C...Rescale all momenta for energy conservation.
481  pes=0d0
482  pqs=0d0
483  DO 480 i=1,n
484  IF(k(i,1).LE.0.OR.k(i,1).GT.10) goto 480
485  pes=pes+p(i,4)
486  pqs=pqs+p(i,5)**2/p(i,4)
487  480 CONTINUE
488  parj(95)=pes-pecm
489  fac=(pecm-pqs)/(pes-pqs)
490  DO 500 i=1,n
491  IF(k(i,1).LE.0.OR.k(i,1).GT.10) goto 500
492  DO 490 j=1,3
493  p(i,j)=fac*p(i,j)
494  490 CONTINUE
495  p(i,4)=sqrt(p(i,5)**2+p(i,1)**2+p(i,2)**2+p(i,3)**2)
496  500 CONTINUE
497 
498 C...Boost back to correct reference frame.
499  510 CALL pyrobo(0,0,0d0,0d0,dps(1)/dps(4),dps(2)/dps(4),dps(3)/dps(4))
500  DO 520 i=1,n
501  IF(k(i,1).LT.0) k(i,1)=-k(i,1)
502  520 CONTINUE
503 
504  RETURN
505  END