/[PAMELA software]/tracker/ground/source/common/functions.f
ViewVC logotype

Contents of /tracker/ground/source/common/functions.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Wed Mar 8 15:00:39 2006 UTC (18 years, 9 months ago) by pam-fi
Branch: trk-ground
CVS Tags: R3v02
Changes since 1.1: +0 -0 lines
First CVS release of tracker ground software (R3v02) 

1 *************************************************************************
2 *
3 * functions.f
4 *
5 * - !???
6 *
7 * needs:
8 * - !???
9 *
10 * output variables:
11 * - !???
12 *
13 * to be called inside !???
14 *
15 *
16 * MODIFIED in order to have in input a
17 * REAL-defined strip number instead of INTEGER
18 *
19 *************************************************************************
20
21
22 function pitch(view) !it gives the strip pitch, knowing the view number
23
24 real pitch
25 integer view
26
27 include './commontracker.f'
28
29 if(mod(view,2).eq.0) then !X
30 pitch=pitchX
31 else !Y
32 pitch=pitchY
33 endif
34
35 end
36
37
38
39 c------------------------------------------------------------------------
40
41
42
43 function npl(view) !it gives the plane number, knowing the view number.
44 ! plane 1 = views 11+12, calorimeter side
45 ! ...
46 ! plane 6 = views 1+2, TRD side
47 integer npl,view
48
49 npl=7-(INT((view-1)/2)+1)
50
51 end
52
53
54
55 c------------------------------------------------------------------------
56
57
58
59 function nld(istrip,view)
60 * it gives the number of the ladder, knowing the
61 * strip number (1..3072) and the view number.
62 * the first strip belongs to ladder 1
63
64 integer istrip,view,nld
65
66 include './commontracker.f'
67
68
69 nld=INT((istrip-1)/nstrips_ladder)+1
70
71 end
72
73
74 c------------------------------------------------------------------------
75
76
77 function nviewx(iplane) !it gives the view number of a X plane
78
79 integer nviewx,iplane
80
81 nviewx=2*(7-iplane)
82
83 end
84
85
86 c------------------------------------------------------------------------
87
88 function nviewy(iplane) !it gives the view number of a Y plane
89
90 integer nviewy,iplane
91
92 nviewy=2*(7-iplane)-1
93
94 end
95
96 c------------------------------------------------------------------------
97
98
99
100
101 function nvk(istrip)
102
103 * it gives the number of the VA1, knowing the strip
104 * number (1..3072).
105 * the first strip belongs to VA1 1
106 integer istrip,nvk
107
108 include './commontracker.f'
109
110 nvk=INT((istrip-1)/nstrips_va1)+1
111
112 end
113
114
115
116 c------------------------------------------------------------------------
117
118
119
120 function nst(istrip)
121
122 * it gives the VA1 strip, knowing the strip number
123 * (1..3072).
124 * the first strip belongs to VA1 1
125
126 integer istrip,nst
127
128 include './commontracker.f'
129
130 nst=INT(mod((istrip-1),nstrips_va1))+1
131
132
133 end
134
135
136 c$$$c------------------------------------------------------------------------
137 c$$$
138 c$$$c NB: le coordinate in mech_pos.dat sono calcolate a partire da alcuni dati
139 c$$$c contenuti in commontracker.f. forse si puo' evitare mech_pos.dat e mettere
140 c$$$c tutto in commontracker.f
141 c$$$
142 c$$$
143 c$$$ subroutine mech_sensor !it reads sensors coordinates (in PAMELA reference
144 c$$$ ! frame) from a text file and it uses them to fill
145 c$$$ ! x/y/z_mech_sensor variables, taking into account
146 c$$$ ! last plane inversion
147 c$$$
148 c$$$ include './commontracker.f'
149 c$$$ include './common_tracks.f'
150 c$$$
151 c$$$ real xvec(nladders_view),yvec(2),zvec(nplanes)
152 c$$$
153 c$$$ integer id !file identifier
154 c$$$ logical od !.true. if the specified unit is connected to a file
155 c$$$
156 c$$$ do id=20,100,1 !opens the file using a free file id
157 c$$$ inquire (id, opened=od)
158 c$$$ if(.not.od) goto 666
159 c$$$ enddo
160 c$$$ 666 continue
161 c$$$
162 c$$$ open(id,FILE='../common/mech_pos.dat') !sensors centres coordinates in mm in
163 c$$$ ! PAMELA reference frame:
164 c$$$ ! the first plane is the one with lowest Z (the one
165 c$$$ ! nearest the calorimeter)
166 c$$$ ! the first ladder is the one with lowest X (the
167 c$$$ ! one on which the first X strip is)
168 c$$$ ! the first sensor is the one with lowest Y (the
169 c$$$ ! one on which the first Y strip is) for planes
170 c$$$ ! 2..6. for plane 1 the first sensor has higher Y
171 c$$$
172 c$$$ read(20,*) xvec
173 c$$$ read(20,*) yvec
174 c$$$ read(20,*) zvec
175 c$$$
176 c$$$ do i=1,nplanes
177 c$$$ do j=1,nladders_view
178 c$$$ do k=1,2
179 c$$$ x_mech_sensor(i,j,k)=xvec(j)
180 c$$$ y_mech_sensor(i,j,k)=yvec(k)
181 c$$$ z_mech_sensor(i,j,k)=zvec(i)
182 c$$$ if(i.eq.1) then !y coordinates of first plane (11th view) are
183 c$$$ y_mech_sensor(i,j,k)=-yvec(k) ! exchanged due to last plane inversion
184 c$$$ endif
185 c$$$ enddo
186 c$$$ enddo
187 c$$$ enddo
188 c$$$
189 c$$$ close(id)
190 c$$$
191 c$$$
192 c$$$c$$$ ! *** INIZIO DEBUG ***
193 c$$$c$$$ do i=1,6
194 c$$$c$$$ do j=1,3
195 c$$$c$$$ do k=1,2
196 c$$$c$$$ c print*,x_mech_sensor(1,j,k)
197 c$$$c$$$ print*,y_mech_sensor(i,j,k)
198 c$$$c$$$ c print*,z_mech_sensor(i,j,k)
199 c$$$c$$$ enddo
200 c$$$c$$$ enddo
201 c$$$c$$$ print*,' '
202 c$$$c$$$ enddo
203 c$$$c$$$ ! *** FINE DEBUG ***
204 c$$$
205 c$$$
206 c$$$ return
207 c$$$ end
208
209
210 c------------------------------------------------------------------------
211
212 c NB: le coordinate in mech_pos.dat sono calcolate a partire da alcuni dati
213 c contenuti in commontracker.f. forse si puo' evitare mech_pos.dat e mettere
214 c tutto in commontracker.f
215
216
217 subroutine mech_sensor
218 c !it reads sensors coordinates (in PAMELA reference
219 c ! frame) from a text file and it uses them to fill
220 c ! x/y/z_mech_sensor variables, taking into account
221 c ! last plane inversion
222
223 include './commontracker.f'
224 include './common_tracks.f'
225
226 real xvec(nladders_view),yvec(2),zvec(nplanes)
227
228 integer id !file identifier
229 logical od !.true. if the specified unit is connected to a file
230
231 do id=20,100,1 !opens the file using a free file id
232 inquire (id, opened=od)
233 if(.not.od) goto 666
234 enddo
235 666 continue
236
237 c open(id,FILE='../common/mech_pos.dat') !sensors centres coordinates in mm in
238 c open(id,FILE='source/common/mech_pos.dat')
239 c call system('cp $TRK_GRND/source/common/mech_pos.dat .')
240 print *,'Opening file: mech_pos.dat'
241 open(id,FILE='./bin-aux/mech_pos.dat',IOSTAT=iostat)
242 c !sensors centres coordinates in mm in
243 c ! PAMELA reference frame:
244 c ! the first plane is the one with lowest Z (the one
245 c ! nearest the calorimeter)
246 c ! the first ladder is the one with lowest X (the
247 c ! one on which the first X strip is)
248 c ! the first sensor is the one with lowest Y (the
249 c ! one on which the first Y strip is) for planes
250 c ! 2..6. for plane 1 the first sensor has higher Y
251
252 if(iostat.ne.0)then
253 print*,'MECH_SENSOR: *** Error in opening file ***'
254 return
255 endif
256
257 read(id,*) xvec
258 read(id,*) yvec
259 read(id,*) zvec
260
261 do i=1,nplanes
262 do j=1,nladders_view
263 do k=1,2
264 x_mech_sensor(i,j,k)=xvec(j)
265 y_mech_sensor(i,j,k)=yvec(k)
266 z_mech_sensor(i,j,k)=zvec(i)
267 if(i.eq.1) then !y coordinates of first plane (11th view) are
268 y_mech_sensor(i,j,k)=-yvec(k) ! exchanged due to last plane inversion
269 endif
270 enddo
271 enddo
272 enddo
273
274 close(id)
275 c call system('rm -f mech_pos.dat')
276
277 c$$$ ! *** INIZIO DEBUG ***
278 c$$$ do i=1,6
279 c$$$c do j=1,3
280 c$$$ do k=1,2
281 c$$$ j=1
282 c$$$c print*,x_mech_sensor(1,j,k)
283 c$$$ print*,y_mech_sensor(i,j,k)
284 c$$$c print*,z_mech_sensor(i,j,k)
285 c$$$ enddo
286 c$$$c enddo
287 c$$$ print*,' '
288 c$$$ enddo
289 c$$$ ! *** FINE DEBUG ***
290
291
292 return
293 end
294
295
296 c------------------------------------------------------------------------
297
298
299 function coordsi(istrip,view)
300 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
301 * it gives the strip coordinate in micrometers,
302 * knowing the strip number (1..3072) and the view
303 * number. the origin of the coordinate is on the
304 * centre of the sensor the strip belongs to.
305 * the axes directions are the same as in the PAMELA
306 * reference frame (i.e.: the 11th view coordinate
307 * direction has to be inverted here)
308 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
309
310 c integer is,view,istrip
311
312 integer view,is,istrip
313 real coordsi
314
315 include './commontracker.f'
316
317 c NB mettere il 1024 nel commontracker...!???
318
319
320
321 is=istrip !it stores istrip number
322 is=mod(is-1,1024)+1 !it puts all clusters on a single ladder
323
324 coordsi=0.
325
326 if(mod(view,2).eq.0) then !X view
327
328 if((is.le.3).or.(is.ge.1022)) then !X has 1018 strips...
329 print*,'functions: WARNING: false X strip: strip ',is
330 endif
331
332 is=is-3 !4 =< is =< 1021 --> 1 =< is =< 1018
333
334 edge=edgeX
335 dim=SiDimX
336
337 elseif(mod(view,2).eq.1) then !Y view
338
339 edge=edgeY
340 dim=SiDimY
341
342 c$$$ if(view.eq.11) then !INVERSIONE!???
343 c$$$ is=1025-is
344 c$$$ endif
345
346 endif
347
348 p=pitch(view)
349
350 coord1=(is-1)*p !referred to 1st sensor strip
351 coord1=coord1+edge !referred to sensor edge
352
353 coordsi=coord1-dim/2 !referred to the centre of the sensor
354
355 if(view.eq.11) then !INVERSION: it puts y axis in the same direction for all views
356 coordsi=-coordsi
357 endif
358
359 end
360
361
362 c------------------------------------------------------------------------
363
364
365 function acoordsi(strip,view)
366 *
367 * same as COORDSI, but accept a real value of strip!!!
368 *
369 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
370 * it gives the strip coordinate in micrometers,
371 * knowing the strip number (1..3072) and the view
372 * number. the origin of the coordinate is on the
373 * centre of the sensor the strip belongs to.
374 * the axes directions are the same as in the PAMELA
375 * reference frame (i.e.: the 11th view coordinate
376 * direction has to be inverted here)
377 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
378
379 c integer is,view,istrip
380
381 integer view,is,istrip
382 real coordsi,acoordsi
383 real strip,stripladder
384
385
386 include './commontracker.f'
387
388 c NB mettere il 1024 nel commontracker...!???
389
390 istrip = int(strip+0.5) !istrip stores the closest integer to strip
391
392 is=istrip !it stores istrip number
393 is=mod(is-1,1024)+1 !it puts all clusters on a single ladder
394
395 coordsi=0.
396
397 if(mod(view,2).eq.0) then !X view
398
399 if((is.le.3).or.(is.ge.1022)) then !X has 1018 strips...
400 print*,'functions: WARNING: false X strip: strip ',is
401 endif
402
403 is=is-3 !4 =< is =< 1021 --> 1 =< is =< 1018
404
405 edge=edgeX
406 dim=SiDimX
407
408 elseif(mod(view,2).eq.1) then !Y view
409
410 edge=edgeY
411 dim=SiDimY
412
413 c$$$ if(view.eq.11) then !INVERSIONE!???
414 c$$$ is=1025-is
415 c$$$ endif
416
417 endif
418
419
420 stripladder = float(is)+(strip-float(istrip))!cluster position relative to ladder
421 p=pitch(view)
422
423 ccccc coord1=(is-1)*p !referred to 1st sensor strip
424 coord1=(stripladder-1)*p !referred to 1st sensor strip
425 coord1=coord1+edge !referred to sensor edge
426 acoordsi=coord1-dim/2 !referred to the centre of the sensor
427
428 if(view.eq.11) then !INVERSION: it puts y axis in the same direction for all views
429 acoordsi=-acoordsi
430 endif
431
432 end
433
434
435
436 c------------------------------------------------------------------------
437
438
439 function coord(coordsi,view,ladder,sen)
440 * it gives the coordinate in
441 * micrometers, knowing the coordinate in the sensor
442 * frame, the view, the ladder and the sensor numbers.
443 * the origin is in the centre of the magnet (PAMELA
444 * reference frame)
445
446 include './commontracker.f'
447 include './common_tracks.f'
448
449 integer view,ladder,sen
450 integer sx,sy,sz
451
452 real coord,coordsi,trasl
453
454 c$$$c parameter (offset=4365.) !??? ! in um !CONTROLLARE SE HA SENSO:
455 c$$$ ! dalle misure sul piano dovrebbe essere 4970,
456 c$$$ ! dallo shift dei residui viene 4365
457 c$$$ ! va messo .ne.0. se in mech_sensor assegno ai
458 c$$$ ! sensori del sesto piano coordinate Y uguali
459 c$$$ ! a quelle degli altri sensori
460 c$$$ parameter (offset=0.) !??? altrimenti se il sesto piano ha coordinate
461 c$$$ ! Y diverse offset dovrebbe essere .eq.0.
462 c$$$ ! CONTROLLARE CON I GRAFICI DEI RESIDUI!!!
463
464
465 coord=0.
466
467 sx=ladder
468 sy=sen
469 sz=npl(view)
470
471 if(mod(view,2).eq.0) then !X view
472
473 trasl=x_mech_sensor(sz,sx,sy) !in mm
474
475 elseif(mod(view,2).eq.1) then !Y view
476
477 trasl=y_mech_sensor(sz,sx,sy) !in mm
478
479 c$$$ if(view.eq.11) then !INVERSIONE!???INUTILE, ne e' gia' tenuto conto
480 c$$$ coordsi=coordsi+offset ! in y_mech_pos...
481 c$$$ endif
482
483 endif
484
485 coord=coordsi+trasl*1000.
486
487 end
488
489
490 c------------------------------------------------------------------------
491 c------------------------------------------------------------------------
492
493 c double precision version of the above subroutine
494
495 double precision function dcoord(coordsi,view,ladder,sen) !it gives the coordinate in
496 ! micrometers, knowing the coordinate in the sensor
497 ! frame, the view, the ladder and the sensor numbers.
498 ! the origin is in the centre of the magnet (PAMELA
499 ! reference frame)
500
501 include './commontracker.f'
502 include './common_tracks.f'
503
504 integer view,ladder,sen
505 integer sx,sy,sz
506
507 c double precision dcoord
508 double precision coordsi,trasl
509
510 c$$$c parameter (offset=4365.) !??? ! in um !CONTROLLARE SE HA SENSO:
511 c$$$ ! dalle misure sul piano dovrebbe essere 4970,
512 c$$$ ! dallo shift dei residui viene 4365
513 c$$$ ! va messo .ne.0. se in mech_sensor assegno ai
514 c$$$ ! sensori del sesto piano coordinate Y uguali
515 c$$$ ! a quelle degli altri sensori
516 c$$$ parameter (offset=0.) !??? altrimenti se il sesto piano ha coordinate
517 c$$$ ! Y diverse offset dovrebbe essere .eq.0.
518 c$$$ ! CONTROLLARE CON I GRAFICI DEI RESIDUI!!!
519
520
521 dcoord=0.
522
523 sx=ladder
524 sy=sen
525 sz=npl(view)
526
527 if(mod(view,2).eq.0) then !X view
528
529 trasl=x_mech_sensor(sz,sx,sy) !in mm
530
531 elseif(mod(view,2).eq.1) then !Y view
532
533 trasl=y_mech_sensor(sz,sx,sy) !in mm
534
535 c$$$ if(view.eq.11) then !INVERSIONE!???INUTILE, ne e' gia' tenuto conto
536 c$$$ dcoordsi=dcoordsi+offset ! in y_mech_pos...
537 c$$$ endif
538
539 endif
540
541 dcoord=coordsi+trasl*1000.
542
543 end
544
545
546 c------------------------------------------------------------------------
547
548
549

  ViewVC Help
Powered by ViewVC 1.1.23