]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/gdraw/gd3d3d.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / GEANT321 / gdraw / gd3d3d.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:19 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/02 29/03/94 15.41.25 by S.Giani
11*-- Author :
12 SUBROUTINE GD3D3D(XIN,NPOINT,XOUT,INV)
13C.
14C. ******************************************************************
15C. * *
16C. * Routine to transform the 3D points given by array XIN *
17C. * into the 3D points in XOUT: *
18C. * if INV=0 the Z-axis for XOUT is the line of sight for XIN*
19C. * if INV=1 the Z-axis for XIN is the line of sight for XOUT*
20C. * *
21C. * ==>Called by : <USER>, GDCUT *
22C. * Author : P.Zanarini ********* *
23C. * *
24C. ******************************************************************
25C.
26#include "geant321/gcvolu.inc"
27#include "geant321/gcdraw.inc"
28 DIMENSION XC(3),XOUT(3,1),VL(3),VM(3),VN(3),XIN(3,1)
29 SAVE VL,VM,VN
30C.
31C. ------------------------------------------------------------------
32C.
33 IF(NPOINT.EQ.0)GO TO 999
34 N=NPOINT
35 IF(NPOINT.LT.0)N=-NPOINT
36 IF(NGVIEW.NE.0) GO TO 40
37C
38C First call compute the rotation matrix
39C
40 PH = ABS(MOD(GPHI,360.))
41 THET = ABS(MOD(GTHETA,360.))
42 IF(THET.LE.180.)GO TO 10
43 PH = PH + 180.
44 THET = 360. - THET
45C
46 10 ST = SIN(THET * 0.017453)
47 CT = COS(THET * 0.017453)
48 SP = SIN(PH * 0.017453)
49 CP = COS(PH * 0.017453)
50C
51C VN is new nu axis
52C
53 VN(1) = ST * CP
54 VN(2) = ST * SP
55 VN(3) = CT
56C
57 IF(ABS(VN(2)).GT.0.99999)GO TO 20
58C
59 VM(1) = 0.
60 VM(2) = 1.
61 VM(3) = 0.
62C
63C Define new lambda axis
64C
65 CALL CROSS(VM,VN,VL)
66 CALL VUNIT(VL,VL,3)
67C
68C Define new mu axis
69C
70 CALL CROSS(VN,VL,VM)
71 GO TO 30
72C
73C Special case when observer line of sight is along mu:
74C in this case one chooses arbitrarily the vertical axis of
75C plane of projection as the lambda axis and the horizontal
76C as the nu axis
77C
78 20 VL(1) = 0.
79 VL(2) = 0.
80 VL(3) = 1.
81 VM(1) = 1.
82 VM(2) = 0.
83 VM(3) = 0.
84 30 CONTINUE
85C
86 NGVIEW=1
87C
88 40 CONTINUE
89C
90C Begin of a normal call (i.e. with NGVIEW=1)
91C
92 DO 70 I=1,N
93C
94C Loop over the points
95C
96 IF (NPOINT.LT.0) THEN
97C
98C NPOINT < 0 : XIN is in general reference system
99C
100 IF (INV.EQ.1) THEN
101 XC(1)=VL(1)*XIN(1,I)+VM(1)*XIN(2,I)+VN(1)*XIN(3,I)
102 XC(2)=VL(2)*XIN(1,I)+VM(2)*XIN(2,I)+VN(2)*XIN(3,I)
103 XC(3)=VL(3)*XIN(1,I)+VM(3)*XIN(2,I)+VN(3)*XIN(3,I)
104 ELSE
105 XC(1)=XIN(1,I)*VL(1)+XIN(2,I)*VL(2)+XIN(3,I)*VL(3)
106 XC(2)=XIN(1,I)*VM(1)+XIN(2,I)*VM(2)+XIN(3,I)*VM(3)
107 XC(3)=XIN(1,I)*VN(1)+XIN(2,I)*VN(2)+XIN(3,I)*VN(3)
108 ENDIF
109C
110 DO 50 J=1,3
111 XOUT(J,I)=XC(J)
112 50 CONTINUE
113C
114 ELSE
115C
116C NPOINT > 0 : XIN is in volume reference system
117C
118 CALL GINROT(XIN(1,I),GRMAT(1,NLEVEL),XC)
119 DO 60 J=1,3
120 XOUT(J,I)=XC(J)+GTRAN(J,NLEVEL)
121 60 CONTINUE
122C
123 ENDIF
124C
125 70 CONTINUE
126C
127 999 RETURN
128 END