]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/gdraw/gdthrz.F
Fix needed on Sun and Alpha
[u/mrichter/AliRoot.git] / GEANT321 / gdraw / gdthrz.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:28 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/02 29/03/94 15.41.27 by S.Giani
11*-- Author :
12 SUBROUTINE GDTHRZ(XYZ)
13C.
14C. ******************************************************************
15C. * *
16C. * Routine processing R-Z projection of tracks and hits *
17C. * *
18C. * XYZ = Array of X,Y,Z coordinates (input/output) *
19C. * *
20C. * ==>Called by : GDFR3D *
21C. * Author : P.Zanarini ********* *
22C. * *
23C. ******************************************************************
24C.
25#include "geant321/gcdraw.inc"
26#include "geant321/gcflag.inc"
27#include "geant321/gcnum.inc"
28 DIMENSION XYZ(3),ITRSGN(20),ITRFLG(20)
29 LOGICAL BTEST
30 SAVE MAXITR,EPS,LIDEVT,LITR3D,ITRSGN,ITRFLG,IFACT
31 DATA MAXITR/20/,EPS/0.0001/,LIDEVT/0/
32C.
33C. ------------------------------------------------------------------
34C.
35 CALL UCTOH('360 ',I360,4,4)
36C
37C If ITHRZ='ON ' or '180 ' then use positive or negative ra
38C else if ITHRZ='360 ' then use only positive radius
39C
40 IF (ITHRZ.EQ.I360) THEN
41 XYZ(2)=SQRT(XYZ(2)*XYZ(2)+XYZ(3)*XYZ(3))
42 GO TO 999
43 ENDIF
44C
45C IDEVT = Event number (in common GCFLAG)
46C LIDEVT = Last event number
47C
48 IF (IDEVT.NE.LIDEVT) THEN
49 DO 10 I=1,MAXITR
50 ITRSGN(I)=0
51 ITRFLG(I)=0
52 10 CONTINUE
53 LIDEVT=IDEVT
54 ENDIF
55C
56C NBIT = Number of bit per machine word (in common GCNUM)
57C MAXITR = A maximum of NBIT*MAXITR significant track signs
58C can be stored (after that all signs will be posit
59C IWORD = 1,2,...,MAXITR
60C IOFSET = 0,1,...,NBIT-1
61C
62 IWORD=(IABS(ITR3D)/NBIT)+1
63 IOFSET=MAX(MOD(IABS(ITR3D),NBIT)-1,0)
64C
65 IF (IWORD.GT.MAXITR) THEN
66 IFACT=1
67 XYZ(2)=IFACT*SQRT(XYZ(2)*XYZ(2)+XYZ(3)*XYZ(3))
68 GO TO 999
69 ENDIF
70C
71C If being drawing an hit, with sign already
72C set by previous track, then use that sign
73C
74 IF (IOBJ.EQ.3.AND.BTEST(ITRFLG(IWORD),IOFSET)) THEN
75 IF(BTEST(ITRSGN(IWORD),IOFSET)) THEN
76 IFACT=1
77 ELSE
78 IFACT=-1
79 ENDIF
80 XYZ(2)=IFACT*SQRT(XYZ(2)*XYZ(2)+XYZ(3)*XYZ(3))
81 GO TO 999
82 ENDIF
83C
84 IF (ITR3D.LT.0) THEN
85C
86C First call to GDFR3D/GDTHRZ : initialize LITR3D and make I
87C
88 ITR3D=-ITR3D
89 IF (.NOT.BTEST(ITRFLG(IWORD),IOFSET)) THEN
90 ITRFLG(IWORD) = IBSET(ITRFLG(IWORD),IOFSET)
91 LITR3D=0
92 ENDIF
93 ENDIF
94C
95 IF (ITR3D.GT.0) THEN
96C
97C LITR3D contains the last ITR3D value,
98C or zero if last point was at U-V origin (0,0,...)
99C
100 IF (ITR3D.EQ.LITR3D) THEN
101C
102C Old track : get R sign from ITRSGN into IFACT
103C
104 IF(BTEST(ITRSGN(IWORD),IOFSET)) THEN
105 IFACT=1
106 ELSE
107 IFACT=-1
108 ENDIF
109C
110 ELSE
111C
112C New track : set R sign into ITRSGN and IFACT
113C
114 IF (ABS(XYZ(2)).GT.EPS) THEN
115 IF (XYZ(2)/ABS(XYZ(2)).GT.0.) THEN
116 ITRSGN(IWORD) = IBSET(ITRSGN(IWORD),IOFSET)
117 IFACT=1
118 ELSE
119 ITRSGN(IWORD) = IBCLR(ITRSGN(IWORD),IOFSET)
120 IFACT=-1
121 ENDIF
122 ENDIF
123C
124 LITR3D=ITR3D
125 IF ((ABS(XYZ(1)).LT.EPS).AND.(ABS(XYZ(2)).LT.EPS)) LITR3D=0
126C
127 ENDIF
128C
129 20 CONTINUE
130 XYZ(2)=IFACT*SQRT(XYZ(2)*XYZ(2)+XYZ(3)*XYZ(3))
131C
132 ENDIF
133 999 RETURN
134 END