/[PAMELA software]/DarthVader/TrackerLevel2/src/F77/tricircle.f
ViewVC logotype

Contents of /DarthVader/TrackerLevel2/src/F77/tricircle.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations) (download)
Thu Jan 16 15:30:00 2014 UTC (10 years, 11 months ago) by mocchiut
Branch: MAIN
Changes since 1.4: +12 -6 lines
Compilation warnings using GCC4.7 fixed

1 *************************************************************************
2 *
3 * Subroutine tricircle.f
4 *
5 * - find the best circle passing through npoints: compute the circle
6 * passing through every combination of 3 of them and average the
7 * resulting centres and radii
8 *
9 * output variables:
10 * - angle(npoints) angle of the tangent in the input points, in degrees, range -90..+90
11 * - residual(npoints) residuals
12 * - chi sum of squared residuals
13 * - xc,zc,radius circle parameters
14 * - eflag error flag
15 *
16 * to be called inside ./fitxy.f
17 *
18 *************************************************************************
19
20
21 subroutine tricircle(npoints,dep,indep,angle,residual,chi
22 $ ,xc,zc,radius,eflag)
23
24
25 c------------------------------------------------------------------------
26 c
27 c local variables
28 c
29 c------------------------------------------------------------------------
30
31 integer npoints !fit number of points
32 real dep(npoints),indep(npoints) !dependent and independent variables
33
34 c real angle(npoints) !angle between the tangent line in the input points and
35 c ! the independent variable axis
36 c real residual(npoints) !residuals
37 c real chi !sum of squared residuals
38 c real xc,zc,radius !circle parameters
39 double precision angle(npoints) !angle between the tangent line in the input points and
40 ! the independent variable axis
41 double precision residual(npoints) !residuals EM GCC4.7
42 double precision chi !sum of squared residuals EM GCC4.7
43 double precision xc,zc,radius !circle parameters EM GCC4.7
44
45 integer eflag !error flag =1 if the procedure fails
46
47 c integer nloops !number of combinations of 3 points out of npoints
48 integer index(3) !indexes of the 3 chosen points
49
50 parameter(scale=1000.)
51 double precision z(3),x(3),unit(3),zzxx(3) !temp variables
52 double precision a(3,3),d(3,3),e(3,3),f(3,3)
53 double precision ir(3)
54 double precision deta,detd,dete,detf !determinants
55 integer ifail !=-1 if singular matrix error, =0 if not singular
56 integer jfail !=0 if determinant can be evaluated, =-1 if determinat is probably too small, =+1 if too large
57
58 integer ibig ! EM GCC4.7
59 c parameter (ibig=1.e4) !just a number greater than C(npoints,3)
60 parameter (ibig=10000) !just a number greater than C(npoints,3) EM GCC 4.7
61 double precision xxc(ibig),zzc(ibig),rrr(ibig) !centres and radii to be averaged
62
63 double precision tmp1,tmp2,tmp(npoints) !temp variables
64
65 logical DEBUG
66
67 real pigr !3.1415...
68 pigr=ACOS(-1.)
69
70
71 DEBUG = .false.
72 if(eflag.eq.1)DEBUG = .true.
73
74 eflag = 0
75
76
77 c------------------------------------------------------------------------
78 c choose 3 points out of npoints
79 c------------------------------------------------------------------------
80 c nloops = fact(npoints) / (fact(3) * fact(npoints-3))
81
82 k=0
83 do i1=1,npoints-2
84 index(1)=i1
85 do i2=i1+1,npoints-1
86 index(2)=i2
87 do i3=i2+1,npoints
88 index(3)=i3
89
90 k=k+1 !number of combinations
91 c$$$ print*,' ' !???
92 c$$$ print*,'k =',k,' index =',index
93
94 c------------------------------------------------------------------------
95 c build temp vectors
96 c------------------------------------------------------------------------
97 do i=1,3
98 z(i)=indep(index(i))/scale !to avoid too big numbers in matrix computation
99 x(i)=dep(index(i))/scale
100 unit(i)=1.
101 zzxx(i)=z(i)**2.+x(i)**2.
102 enddo
103 c$$$ print*,'z =',z,' x =',x !???
104 c$$$ print*,'unit =',unit,' zzxx =',zzxx
105
106 c------------------------------------------------------------------------
107 c build the matrixes
108 c------------------------------------------------------------------------
109 do i=1,3
110 a(i,1)=z(i) !A has (z x 1) as columns
111 a(i,2)=x(i)
112 a(i,3)=unit(i)
113 d(i,1)=zzxx(i) !D has (zzxx x 1) as columns
114 d(i,2)=x(i)
115 d(i,3)=unit(i)
116 e(i,1)=zzxx(i) !E has (zzxx z 1) as columns
117 e(i,2)=z(i)
118 e(i,3)=unit(i)
119 f(i,1)=zzxx(i) !F has (zzxx z x) as columns
120 f(i,2)=z(i)
121 f(i,3)=x(i)
122 enddo
123
124 c$$$ print*,'matrix A:' !???
125 c$$$ do i=1,3
126 c$$$ print*,(a(i,j),j=1,3)
127 c$$$ enddo
128 c$$$ print*,'matrix D:' !???
129 c$$$ do i=1,3
130 c$$$ print*,(d(i,j),j=1,3)
131 c$$$ enddo
132 c$$$ print*,'matrix E:' !???
133 c$$$ do i=1,3
134 c$$$ print*,(e(i,j),j=1,3)
135 c$$$ enddo
136 c$$$ print*,'matrix F:' !???
137 c$$$ do i=1,3
138 c$$$ print*,(f(i,j),j=1,3)
139 c$$$ enddo
140
141 c------------------------------------------------------------------------
142 c compute the determinants of A, D, E and F matrixes
143 c using DFACT (http://wwwasdoc.web.cern.ch/wwwasdoc/shortwrupsdir/f011/top.html)
144 c------------------------------------------------------------------------
145
146 ifail=0
147 jfail=0
148 call DFACT(3,a,3,ir,ifail,deta,jfail)
149 if(ifail.eq.-1) then
150 if(DEBUG)then
151 print*,'tricircle: ERROR: singular matrix A:'
152 do i=1,3
153 print*,(a(i,j),j=1,3)
154 enddo
155 endif
156 eflag=1
157 endif
158 if(jfail.eq.-1) then
159 if(DEBUG)then
160 print*
161 $ ,'tricircle: ERROR: matrix A: determinant too small?'
162 do i=1,3
163 print*,(d(i,j),j=1,3)
164 enddo
165 endif
166 eflag=1
167 elseif(jfail.eq.1) then
168 if(DEBUG)then
169 print*
170 $ ,'tricircle: ERROR: matrix A: determinant too large?'
171 do i=1,3
172 print*,(d(i,j),j=1,3)
173 enddo
174 endif
175 eflag=1
176 endif
177
178 ifail=0
179 jfail=0
180 call DFACT(3,d,3,ir,ifail,detd,jfail)
181 if(ifail.eq.-1) then
182 if(DEBUG)then
183 print*,'tricircle: ERROR: singular matrix D:'
184 do i=1,3
185 print*,(d(i,j),j=1,3)
186 enddo
187 endif
188 eflag=1
189 endif
190 if(jfail.eq.-1) then
191 if(DEBUG)then
192 print*
193 $ ,'tricircle: ERROR: matrix D: determinant too small?'
194 do i=1,3
195 print*,(d(i,j),j=1,3)
196 enddo
197 endif
198 eflag=1
199 elseif(jfail.eq.1) then
200 if(DEBUG)then
201 print*
202 $ ,'tricircle: ERROR: matrix D: determinant too large?'
203 do i=1,3
204 print*,(d(i,j),j=1,3)
205 enddo
206 endif
207 eflag=1
208 endif
209
210 ifail=0
211 jfail=0
212 call DFACT(3,e,3,ir,ifail,dete,jfail)
213 if(ifail.eq.-1) then
214 if(DEBUG)then
215 print*,'tricircle: ERROR: singular matrix E:'
216 do i=1,3
217 print*,(e(i,j),j=1,3)
218 enddo
219 endif
220 eflag=1
221 endif
222 if(jfail.eq.-1) then
223 if(DEBUG)then
224 print*
225 $ ,'tricircle: ERROR: matrix E: determinant too small?'
226 do i=1,3
227 print*,(e(i,j),j=1,3)
228 enddo
229 endif
230 eflag=1
231 elseif(jfail.eq.1) then
232 if(DEBUG)then
233 print*
234 $ ,'tricircle: ERROR: matrix E: determinant too large?'
235 do i=1,3
236 print*,(e(i,j),j=1,3)
237 enddo
238 endif
239 eflag=1
240 endif
241
242 ifail=0
243 jfail=0
244 call DFACT(3,f,3,ir,ifail,detf,jfail)
245 c ifail=-1 !???
246 if(ifail.eq.-1) then
247 if(DEBUG)then
248 print*,'tricircle: ERROR: singular matrix F:'
249 do i=1,3
250 print*,(f(i,j),j=1,3)
251 enddo
252 endif
253 eflag=1
254 endif
255 if(jfail.eq.-1) then
256 if(DEBUG)then
257 print*
258 $ ,'tricircle: ERROR: matrix F: determinant too small?'
259 do i=1,3
260 print*,(f(i,j),j=1,3)
261 enddo
262 endif
263 eflag=1
264 elseif(jfail.eq.1) then
265 if(DEBUG)then
266 print*
267 $ ,'tricircle: ERROR: matrix F: determinant too large?'
268 do i=1,3
269 print*,(f(i,j),j=1,3)
270 enddo
271 endif
272 eflag=1
273 endif
274
275 c------------------------------------------------------------------------
276 c compute the centre and radius
277 c------------------------------------------------------------------------
278 detd=-detd
279 detf=-detf
280
281 c xxc(k)=-detd/(2.*deta)
282 c zzc(k)=-dete/(2.*deta)
283 xxc(k)=-dete/(2.*deta)
284 zzc(k)=-detd/(2.*deta)
285 rrr(k)=SQRT((detd**2+dete**2)/(4.*deta**2.)-detf/deta)
286
287 c$$$ write(30,*) xxc(k)*scale !???
288 c$$$ write(31,*) zzc(k)*scale !???
289 c$$$ write(32,*) rrr(k)*scale !???
290 c$$$ print*,'xxc =',xxc(k)*scale,' zzc =',zzc(k)*scale
291 c$$$ $ ,' rrr =',rrr(k)*scale !???
292
293 enddo !index loops
294 enddo
295 enddo
296
297
298 c------------------------------------------------------------------------
299 c averages the centres and the radii
300 c------------------------------------------------------------------------
301 xc=0.
302 zc=0.
303 radius=0.
304 do i=1,k
305 xc=xc+xxc(i)
306 zc=zc+zzc(i)
307 radius=radius+rrr(i)
308 enddo
309 xc=xc/k * scale !back to micrometers
310 zc=zc/k * scale
311 radius=radius/k * scale
312
313 c$$$ c------------------------------------------------------------------------
314 c$$$ c check for small radius...!???
315 c$$$ c------------------------------------------------------------------------
316 c$$$ num=200
317 c$$$ height=ABS(indep(1)-indep(6))
318 c$$$ if(radius.lt.(num*height)) then
319 c$$$ xc=0.
320 c$$$ zc=0.
321 c$$$ radius=0.
322 c$$$ print*,'tricircle: ERROR: bad circle'
323 c$$$ print*,'radius' ,radius,' < ', num,' x',height
324 c$$$ c$$$ print*,dep !???
325 c$$$ c$$$ print*,indep !???
326 c$$$ eflag=1
327 c$$$ endif
328
329
330 c------------------------------------------------------------------------
331 c computes residuals and chi-squared
332 c------------------------------------------------------------------------
333 chi=0.
334
335 c print*,xc,zc,radius !???
336 do i=1,npoints
337 tmp1 = SQRT(radius**2.-(indep(i)-zc)**2.)
338 tmp2 = dep(i)-xc
339 if(ABS(tmp2-tmp1).le.ABS(tmp2+tmp1)) then !it chooses the right sign
340 tmp(i)=tmp1 !according to residuals
341 else
342 tmp(i)=-tmp1
343 endif
344 residual(i)=tmp2 - tmp(i)
345 chi=chi + residual(i)**2.
346 c print*,dep(i) !???
347 c print*,indep(i) !???
348 c print*,tmp1,tmp2,tmp(i),residual(i) !???
349 enddo
350
351 c------------------------------------------------------------------------
352 c it computes the angle between the tangent to the circumference and the
353 c independent variable axis
354 c------------------------------------------------------------------------
355 do i=1,npoints
356 angle(i)=(zc-indep(i)) / tmp(i)
357 angle(i)=ATAN(angle(i)) !-pi/2 <= angle <= pi/2
358 angle(i)=angle(i)/pigr*180.
359 enddo
360
361 return
362 end
363
364
365
366
367
368
369
370
371
372
373 c------------------------------------------------------------------------
374 c------------------------------------------------------------------------
375 c------------------------------------------------------------------------
376
377
378 c$$$c------------------------------------------------------------------------
379 c$$$c Function to find the factorial value
380 c$$$c------------------------------------------------------------------------
381 c$$$
382 c$$$c from http://www.digitalcoding.com/programming/fortran/tutorial/ftute10.htm
383 c$$$
384 c$$$
385 c$$$ FUNCTION FACT(N)
386 c$$$ FACT=1
387 c$$$ DO 10 J=2,N
388 c$$$ FACT=FACT*J
389 c$$$10 CONTINUE
390 c$$$ RETURN
391 c$$$ END
392 c$$$
393 c$$$c------------------------------------------------------------------------

  ViewVC Help
Powered by ViewVC 1.1.23