GeneralBrokenLines  Rev:70
 All Classes Files Functions Variables Pages
gbltst.f90
Go to the documentation of this file.
1 !
2 
3 ! Code converted using TO_F90 by Alan Miller
4 ! Date: 2012-03-03 Time: 17:00:22
5 
8 
19 
20 PROGRAM test
21  use gbltraj, only: gblini, gbladp, gbladm, gblads, gbladl, gbladg, gbladx, &
23 
24  parameter(nloc=2) ! number of 'local' parameters
25  parameter(mp=5+nloc)
26  parameter(mp2=(mp+1)*mp/2)
27  DOUBLE PRECISION :: dpar(mp), dcov(mp2), dpseed(mp2), djac(5,5),daux(15), &
28  ajacp,ajacn,pm2l,pl2m,det
29 
30  dimension clpar(5),dirt(3),dirm(3,2),tmp(5),sarc(100), &
31  dif(2),sig(2),prec(2),ajacp(5,5),ajacn(5,5), &
32  dirz(3),diru(3),dirv(3),pm2l(2,2),pl2m(2,2),beta0(2), &
33  clerr(5),lder(nloc),derlc(2,nloc),thsig(2),thprec(2)
34 
35  DATA dirz / 0.0, 0.0, 1.0 / ! Z direction
36 
37 
38  ! (type of) local system
39 
40  ! ITYPE=0 ! curvilinear track parameter (q/p,lambda,phi,x_t,y_t)
41  itype=1 ! curvilinear local system (q/p,v',w',v,w), (v,w)=(x_t,y_t)
42  ! ITYPE=2 ! 'magnetic' local system (q/p,v',w',v,w), (v,w)=(x_t,z)
43  ! (perpendicular, parallel to B)
44  print *, ' GBLTST ITYPE: ', itype
45 
46  bz=1.0 ! magnetic field
47  bfac=bz*0.2998
48  ! initial track direction (from prefit)
49  sinl=0.3 ! sin(lambda)
50  cosl=sqrt(1.0-sinl**2) ! cos(lambla)
51  phi=0. ! move in X direction
52  ! preset to unit matrix
53  DO i=1,5
54  DO j=1,5
55  ajacp(i,j)=0.0d0
56  ajacn(i,j)=0.0d0
57  END DO
58  ajacp(i,i)=1.0d0
59  ajacn(i,i)=1.0d0
60  END DO
61  beta0(1)=0.0
62  beta0(2)=0.0
63  ! distortions to track parameters
64  clerr(1)= 0.001
65  clerr(2)=-0.1
66  clerr(3)= 0.2
67  clerr(4)=-0.15
68  clerr(5)= 0.25
69 
70  ip=0
71  DO i=1,mp
72  DO j=1,i
73  dpseed(ip+j)=0.0d0
74  END DO
75  ip=ip+i
76  IF (i <= 5) dpseed(ip)=1.0d0/dble(clerr(i)**2)
77  END DO
78  ! print *, ' DPSEED '
79  ! CALL DBPRV(6,DPSEED,MP)
80 
81  ntr=10000 ! number of tracks
82  schi2=0.0
83  DO itr=1,ntr
84  n=10
85  s=0.0 ! at vertex
86  s0=10. ! first measurement
87  step1=1.0/cosl ! constant steps
88  step2=2.0/cosl ! in RPhi
89  dert0=1.0
90  ! curvilinear distortions d(q/p,theta,phi,xt,yt)
91  DO k=1,5
92  ! CLPAR(K)=0.0
93  ! CLPAR(K)=CLERR(K)
94  clpar(k)=clerr(k)*unrm()
95  END DO
96 
97  ipnt1=0 ! first measurement, distortions defined here
98 
99  theta0=1.0e-3 ! 1 mrad multiple scatt.
100  IF (itype == 1) THEN
101  thsig(1)=theta0 ! MS error in v' (dx_t/dz_t)
102  thsig(2)=theta0 ! MS error in w' (dy_t/dz_t)
103  ELSE IF (itype == 2) THEN
104  thsig(1)=theta0/cosl ! MS error in v' (dx_t/ds_2D)
105  thsig(2)=theta0/cosl**2 ! MS error in w' (dz/ds_2D)
106  ELSE
107  thsig(1)=theta0 ! MS error in lambda
108  thsig(2)=theta0/cosl ! MS error in phi
109  END IF
110  thprec(1)=1.0/thsig(1)**2 ! diagonal of inverse
111  thprec(2)=1.0/thsig(2)**2 ! covariance matrix
112 
113  sig(1)=1.0e-3 ! 10 mu resolution
114  sig(2)=1.0e-3 ! 10 mu resolution
115  prec(1)=1.0/sig(1)**2 ! diagonal of inverse
116  prec(2)=1.0/sig(2)**2 ! covariance matrix
117  CALL gblini(1)
118  ! CALL GBLINP(1,1)
119  ! point at vertex
120  ! CALL gbladp(ajacn,ipnt)
121  ! sarc(ipnt)=s
122  ! CALL gbltjc(itype,s0,bfac,cosl,ajacn)
123 
124  ! create track
125  s=s0
126 
127  DO i=1,n
128  ! print *, ' measurement ', I, S, OFF, SLP
129  ! track direction
130  cphi=cos(phi)
131  sphi=sin(phi)
132  dirt(1)= cosl*cphi
133  dirt(2)= cosl*sphi
134  dirt(3)= sinl
135  ! U = Z x T / |Z x T|
136  diru(1)=-sphi
137  diru(2)= cphi
138  diru(3)= 0.
139  ! V = T x U
140  dirv(1)=-sinl*cphi
141  dirv(2)=-sinl*sphi
142  dirv(3)= cosl
143  ! V = Z
144  IF (itype == 2) THEN
145  dirv(1)=0.
146  dirv(2)=0.
147  dirv(3)=1.
148  END IF
149  ! RPhi meas. ( = Y as track moves in X direction)
150  eps=0.
151  IF (mod(i,2) == 0) eps=0.5
152  dirm(1,1)=eps ! direction of measurement
153  dirm(2,1)=sqrt(1.0-eps**2)
154  dirm(3,1)=0.0
155  ! Z meas.
156  eps=0.
157  ! IF (MOD(I,2).EQ.0) EPS=0.3
158  dirm(1,2)=0.0 ! direction of measurement
159  dirm(2,2)=eps
160  dirm(3,2)=sqrt(1.0-eps**2)
161  ! projection (du/dm: measurement to local (curvilinear))
162  DO l=1,2
163  pm2l(l,1)= dble(dirm(1,l)*diru(1)+dirm(2,l)*diru(2)+dirm(3,l)*diru(3))
164  pm2l(l,2)= dble(dirm(1,l)*dirv(1)+dirm(2,l)*dirv(2)+dirm(3,l)*dirv(3))
165  END DO
166  ! projection (dm/du: local to measurement)
167  det=pm2l(1,1)*pm2l(2,2)-pm2l(1,2)*pm2l(2,1)
168  pl2m(1,1)= pm2l(2,2)/det
169  pl2m(1,2)=-pm2l(1,2)/det
170  pl2m(2,1)=-pm2l(2,1)/det
171  pl2m(2,2)= pm2l(1,1)/det
172  ! measurement - prediction in measurement system with error
173  DO m=1,2
174  dif(m)=clpar(4)*sngl(pl2m(m,1)) +clpar(5)*sngl(pl2m(m,2))+sig(m)*unrm()
175  END DO
176  ! distort with local parameters
177  ! DIF(1)=DIF(1)+DERT0*0.0075
178  ! DIF(2)=DIF(2)-DERT0*0.0025
179 
180  CALL gbladp(ajacn,ipnt)
181  sarc(ipnt)=s
182  CALL gbladm(pl2m,dif,prec)
183  IF (ipnt1 == 0) ipnt1=ipnt
184  ! local or global parameters
185  lder(1)=4711
186  lder(2)=4712
187  derlc(1,1)= dert0
188  derlc(2,1)=0.0
189  derlc(1,2)=0.0
190  derlc(2,2)=-dert0
191  ! CALL GBLADL(2,DERLC,IRET)
192  ! CALL GBLADG(2,LDER,DERLC,IRET)
193  dert0=-dert0
194  ! propagate by STEP1
195  ds=step1
196  CALL gbltjc(itype,step1,bfac,cosl,ajacn)
197 
198  DO k=1,5
199  tmp(k)=clpar(k)
200  END DO
201  DO k=1,5
202  clpar(k)=0.0
203  DO l=1,5
204  clpar(k)=clpar(k)+sngl(ajacn(k,l))*tmp(l)
205  END DO
206  END DO
207  s=s+step1
208  IF (i < n) THEN
209  CALL gbladp(ajacn,ipnt)
210  sarc(ipnt)=s
211  CALL gblads(beta0,thprec)
212  END IF
213  ! scatter a little
214  clpar(2)=clpar(2)+thsig(1)*unrm()
215  clpar(3)=clpar(3)+thsig(2)*unrm()
216  ! propagate by STEP1
217  CALL gbltjc(itype,step2,bfac,cosl,ajacn)
218 
219  DO k=1,5
220  tmp(k)=clpar(k)
221  END DO
222  DO k=1,5
223  clpar(k)=0.0
224  DO l=1,5
225  clpar(k)=clpar(k)+sngl(ajacn(k,l))*tmp(l)
226  END DO
227  END DO
228  s=s+step2
229  END DO
230 
231  npnt=ipnt
232  CALL gbladx(ipnt1,dpseed)
233 
234  ! CALL GBLDMP
235  CALL gblfit('',mrank,np,ndf,chi2,wls)
236  ! print *, ' GBLFIT ', MRANK, NP, NDF, CHI2, WLS
237  schi2=schi2+chi2/float(ndf)
238  ! CALL GBLFIT('HT',MRANK,NDF,CHI2,WLS)
239  IF (itr <= 1) THEN
240  print *, ' GBLFIT ', mrank, np, ndf, chi2, wls
241  CALL gblres(ipnt1,dpar,dcov)
242  print *, ' DPAR ', (dpar(k),k=1,np)
243  print *, ' DCOV(loc) '
244  CALL dbprv(6,dcov,np)
245  CALL gbll2c(itype,cosl,djac)
246  CALL dbavat(dcov,djac,daux,5,5)
247  print *, ' DCOV(cvl) '
248  CALL dbprv(6,daux,5)
249  END IF
250 
251  ! CALL GBLMP2(IRET) ! prepare input for Millepede-II
252 
253  END DO
254 
255  schi2=schi2/float(ntr)
256  print *, ' === <Chi2/ndf> === ', ntr, schi2
257 
258 END PROGRAM test
259 
261 
262 SUBROUTINE gbltjc(itype,ds,bfac,cosl,ajac)
263 
264 
265  INTEGER, INTENT(IN) :: itype
266  REAL, INTENT(IN) :: ds
267  REAL, INTENT(IN) :: bfac
268  REAL, INTENT(IN OUT) :: cosl
269  DOUBLE PRECISION, INTENT(OUT) :: ajac(5,5)
270 
271 
272  IF (itype == 1) THEN
273  ! curvilinear local system (q/p,v',w',v,w), (v,w)=(x_t,y_t)
274  ajac(1,1)= 1.0d0
275  ajac(2,1)=-dble(bfac*ds*cosl)
276  ajac(2,2)= 1.0d0
277  ajac(3,3)= 1.0d0
278  ajac(4,1)=-dble(0.5*bfac*ds*ds*cosl)
279  ajac(4,2)= dble(ds)
280  ajac(4,4)= 1.0d0
281  ajac(5,3)= dble(ds)
282  ajac(5,5)= 1.0d0
283  ELSE IF (itype == 2) THEN
284  ! local system (q/p,v',w',v,w), (v,w)=(x_t,z)
285  ajac(1,1)= 1.0d0
286  ajac(2,1)=-dble(bfac*ds)
287  ajac(2,2)= 1.0d0
288  ajac(3,3)= 1.0d0
289  ajac(4,1)=-dble(0.5*bfac*ds*ds*cosl)
290  ajac(4,2)= dble(ds*cosl)
291  ajac(4,4)= 1.0d0
292  ajac(5,3)= dble(ds*cosl)
293  ajac(5,5)= 1.0d0
294  ELSE
295  ! curvilinear track parameter (q/p,lambda,phi,x_t,y_t)
296  ajac(1,1)= 1.0d0
297  ajac(2,2)= 1.0d0
298  ajac(3,1)=-dble(bfac*ds)
299  ajac(3,3)= 1.0d0
300  ajac(4,1)=-dble(0.5*bfac*ds*ds*cosl)
301  ajac(4,3)= dble(ds*cosl)
302  ajac(4,4)= 1.0d0
303  ajac(5,2)= dble(ds)
304  ajac(5,5)= 1.0d0
305  END IF
306 
307  return
308 END SUBROUTINE gbltjc
309 
311 
312 SUBROUTINE gbll2c(itype,cosl,djac)
313 
314 
315  INTEGER, INTENT(IN) :: itype
316  REAL, INTENT(IN OUT) :: cosl
317  DOUBLE PRECISION, INTENT(OUT) :: djac(5,5)
318 
319  ! preset with unit matrix
320  DO k=1,5
321  DO l=1,5
322  djac(k,l)=0.0d0
323  END DO
324  djac(k,k)=1.0d0
325  END DO
326 
327  IF (itype == 1) THEN
328  ! curvilinear local system (q/p,v',w',v,w), (v,w)=(x_t,y_t)
329  djac(2,2)=0.0d0
330  djac(2,3)=1.0d0/dble(cosl)
331  djac(3,2)=1.0d0
332  djac(3,3)=0.0d0
333  ELSE IF (itype == 2) THEN
334  ! local system (q/p,v',w',v,w), (v,w)=(x_t,z)
335  djac(2,2)=0.0d0
336  djac(2,3)=1.0d0
337  djac(3,2)=dble(cosl)**2
338  djac(3,3)=0.0d0
339  djac(5,5)=dble(cosl)
340  END IF
341 
342  return
343 END SUBROUTINE gbll2c
344 
346 FUNCTION unrm()
347  dimension r(12)
348  ! DATA IX / 4711 / ! use for gcc3
349  CALL random_number(r) ! comment out for gcc3
350  unrm=-6.0
351  DO k=1,12
352  ! R(K)=UNIF(IX) ! use for gcc3
353  unrm=unrm+r(k)
354  END DO
355 END
356 
358 FUNCTION unif(ix)
359  ! portable random number generator using the recursion:
360  ! IX = 16807 * IX MOD (2**31-1)
361  k1 = ix/127773
362  ix = 16807* (ix - k1*127773) - k1 * 2836
363  IF (ix < 0) ix = ix + 2147483647
364  unif = ix*4.656612875e-10
365  return
366 END FUNCTION unif
367