]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - GEANT321/gdraw/gkhits.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / gdraw / gkhits.F
diff --git a/GEANT321/gdraw/gkhits.F b/GEANT321/gdraw/gkhits.F
new file mode 100644 (file)
index 0000000..9ef5fe9
--- /dev/null
@@ -0,0 +1,286 @@
+*
+* $Id$
+*
+* $Log$
+* Revision 1.1.1.1  1995/10/24 10:20:30  cernlib
+* Geant
+*
+*
+#include "geant321/pilot.h"
+*CMZ :  3.21/02 29/03/94  15.41.27  by  S.Giani
+*-- Author :
+      SUBROUTINE GKHITS (IUSET,IUDET,EPSILO)
+C.
+C.    ******************************************************************
+C.    *                                                                *
+C.    *       Prints the hit picked (using the graphics cursor)        *
+C.    *       from all the hits of all tracks in detector IUDET        *
+C.    *       of set IUSET, in case that the spatial coordinates       *
+C.    *       of the hits had been stored as the first three words     *
+C.    *       in the argument vector of GSAHIT.                        *
+C.    *       If the character typed to pick is 'K' or 'k' then the    *
+C.    *       kinematics of the corresponding track is also printed.   *
+C.    *       The picking is repeated until the character typed is     *
+C.    *       'Q' or 'q'.                                              *
+C.    *       EPSILO is the pick aperture, i.e. the first hit that     *
+C.    *       falls into the square centered at U0,V0 (the pick point) *
+C.    *       with half length EPSILO is kept.                         *
+C.    *       If EPSILO is negative then its absolute value is taken   *
+C.    *       and in addition the pick square is drawn.                *
+C.    *       If EPSILO is zero there is no pick aperture and over all *
+C.    *       the hits the one nearest to the pick point is taken.     *
+C.    *                                                                *
+C.    *    ==>Called by : <USER>, <GXINT>                              *
+C.    *       Authors : R.Brun, W.Gebel, P.Zanarini   *********        *
+C.    *                                                                *
+C.    ******************************************************************
+C.
+#include "geant321/gcbank.inc"
+#include "geant321/gcdraw.inc"
+#include "geant321/gcunit.inc"
+      DIMENSION HITS(3,10)
+      DIMENSION U(10),V(10)
+      DIMENSION UP(5),VP(5)
+      CHARACTER*4 IUSET,IUDET,KIUSET,KIUDET
+C.
+C.    ------------------------------------------------------------------
+C.
+      CALL UCTOH('OFF ',IOFF,4,4)
+C
+C            Set IOBJ to HIT
+C
+      IOBJ=3
+C
+   10 CONTINUE
+C
+      CALL GDCURS(U0,V0,KCHAR)
+      IF (KCHAR.EQ.0) GO TO 160
+C
+      IF (JHITS.LE.0)           GOTO 160
+      NSET = IQ(JSET-1)
+      NS1        = 1
+      NS2        = NSET
+      IF (IUSET(1:1).EQ.'*')   GOTO  20
+      CALL GLOOK(IUSET,IQ(JSET+1),NSET,ISET)
+      IF (ISET .LE.0)           GOTO 160
+      NS1        = ISET
+      NS2        = ISET
+C
+   20 CONTINUE
+C
+      EPSIL=ABS(EPSILO)
+      EPSU=PLTRNX*EPSIL/20.
+      EPSV=PLTRNY*EPSIL/20.
+      IHITNR=0
+      DISTPK=1000000.
+C
+C             Draw the pick box
+C
+      IF (EPSILO.LT.0) THEN
+         UP(1)=U0-EPSU
+         VP(1)=V0-EPSV
+         UP(2)=U0+EPSU
+         VP(2)=VP(1)
+         UP(3)=UP(2)
+         VP(3)=V0+EPSV
+         UP(4)=UP(1)
+         VP(4)=VP(3)
+         UP(5)=UP(1)
+         VP(5)=VP(1)
+         CALL GDRAWV(UP,VP,5)
+      ENDIF
+C
+C            loop on all selected sets
+C
+      DO 140   ISET=NS1,NS2
+C
+         JS = LQ(JSET-ISET)
+         JH = LQ(JHITS-ISET)
+         IF(JS.LE.0)GO TO 140
+         IF(JH.LE.0)GO TO 140
+         NDET = IQ(JS-1)
+         ND1 = 1
+         ND2 = NDET
+         IF (IUDET(1:1).EQ.'*') GOTO 30
+         CALL GLOOK(IUDET,IQ(JS+1),NDET,IDET)
+         IF (IDET .EQ.0) GOTO 140
+         ND1 = IDET
+         ND2 = IDET
+   30    CONTINUE
+C
+C            loop on selected detectors for this set
+C
+         DO 130 IDET=ND1,ND2
+C
+            JD = LQ(JS-IDET)
+            JHD = LQ(JH-IDET)
+            IF (JHD .LE.0) GOTO 130
+            JDH = LQ(JD-1)
+            ILAST = IQ(JH+IDET)
+            IF (ILAST.EQ.0) GOTO 130
+            NV = IQ(JD+2)
+            NH = IQ(JD+4)
+            NW = IQ(JD+1) + IQ(JD+3) + 1
+C
+C            Now loop on all hits to get their space coordinates
+C
+            MH = 0
+            IHIT = 0
+            DO 120 I=1,ILAST,NW
+               IHIT = IHIT + 1
+               ITRA = IQ(JHD+I)
+C
+C            Is THRZ option set on (R-Z projection)
+C            and the cut lateral (vertical or horizontal) ?
+C
+               IF (ITHRZ.NE.IOFF) THEN
+                  IF (ICUT.EQ.1.OR.ICUT.EQ.2) ITR3D=-ITRA
+               ELSE
+                  ITR3D=0
+               ENDIF
+C
+C            Skip words with volume numbers
+C
+               NK = 1
+               K = 1
+               IF (NV.LE.0) GOTO 50
+               DO 40 IV=1,NV
+                  NB = IQ(JD+2*IV+10)
+                  IF (NB.EQ.0) NB=32
+                  K = NB + K
+                  IF (K.LE.33) GOTO 40
+                  NK = NK + 1
+                  K = NB + 1
+   40          CONTINUE
+               NK = NK + 1
+C
+C            Get unpacked (first three !) HITS.
+C            Hits origin is shifted. Division by scale factor.
+C
+   50          CONTINUE
+               IF (NH.LE.2) GOTO 120
+               MH = MH + 1
+               K=1
+               DO 90 IH=1,3
+                  NB = IQ(JDH+4*IH-2)
+                  IF (NB.GT.0) GOTO 60
+                  IF (K.GT.1) THEN
+                     NK=NK+1
+                  ENDIF
+                  KHIT = IQ(JHD+I+NK)
+                  K = 1
+                  NK = NK + 1
+                  GOTO 80
+   60             IF (K+NB.LE.33) GOTO 70
+                  K = 1
+                  NK = NK + 1
+   70             KHIT = IBITS(IQ(JHD+I+NK),K-1,NB)
+                  K = K + NB
+   80             CONTINUE
+                  HITS(IH,MH)= FLOAT(KHIT)/Q(JDH+4*IH) - Q(JDH+4*IH-1)
+   90          CONTINUE
+C
+C            Scan the hits (usually 10 at a time);
+C            flush HITS vector if
+C             --loop on this detector volume is to finish,
+C             --loop on current track is to finish,
+C             --HITS vector is full.
+C
+               IF ((ILAST-I).LT.NW) GOTO 100
+               ITRN = IQ(JHD+I+NW)
+               IF (ITRA.NE.ITRN) GOTO 100
+               IF (MH .NE. 10) GOTO 120
+C
+  100          CONTINUE
+C
+               CALL GDFR3D(HITS(1,1),MH,U,V)
+C
+               DO 110 IP=1,MH
+C
+                  IF (EPSILO.NE.0) THEN
+                     IF (U(IP).LT.U0-EPSU) GO TO 110
+                     IF (U(IP).GT.U0+EPSU) GO TO 110
+                     IF (V(IP).LT.V0-EPSV) GO TO 110
+                     IF (V(IP).GT.V0+EPSV) GO TO 110
+                     II=IP
+                     IHITNR=IHIT-MH+II
+                     JS = LQ(JSET-ISET)
+                     CALL UHTOC(IQ(JSET+ISET),4,KIUSET,4)
+                     CALL UHTOC(IQ(JS+IDET)  ,4,KIUDET,4)
+                     KITRA=ITRA
+                     GO TO 150
+                  ELSE
+                     DIST=(U(IP)-U0)*(U(IP)-U0)+(V(IP)-V0)*(V(IP)-V0)
+                     IF (DIST.LT.DISTPK) THEN
+                        DISTPK=DIST
+                        II=IP
+                        IHITNR=IHIT-MH+II
+                        JS = LQ(JSET-ISET)
+                        CALL UHTOC(IQ(JSET+ISET),4,KIUSET,4)
+                        CALL UHTOC(IQ(JS+IDET)  ,4,KIUDET,4)
+                        KITRA=ITRA
+                     ENDIF
+                  ENDIF
+C
+  110          CONTINUE
+C
+               MH=0
+C
+  120       CONTINUE
+C
+  130    CONTINUE
+C
+  140 CONTINUE
+C
+      IF (EPSILO.EQ.0) GO TO 150
+C
+C             Hit not picked
+C
+      WRITE (CHMAIL,1000)
+      CALL GMAIL(0,0)
+C
+C             Restart for another pick operation
+C
+      GO TO 10
+C
+C             Hit picked
+C
+  150 CONTINUE
+C
+C             Highlight the picked hit
+C
+      UDELTA=0.05*PLTRNX/20.
+      VDELTA=0.05*PLTRNY/20.
+      UP(1)=U(II)-UDELTA
+      VP(1)=V(II)-VDELTA
+      UP(2)=U(II)+UDELTA
+      VP(2)=VP(1)
+      UP(3)=UP(2)
+      VP(3)=V(II)+VDELTA
+      UP(4)=UP(1)
+      VP(4)=VP(3)
+      UP(5)=UP(1)
+      VP(5)=VP(1)
+      CALL GDRAWV(UP,VP,5)
+C
+C             Print parameters of the picked hit
+C
+      IPKHIT=IHITNR
+      IF (IPKHIT.GT.0) CALL GPHITS(KIUSET,KIUDET)
+      IPKHIT=0
+      CALL GPKINE(KITRA)
+C
+C             Restart for another pick operation
+C
+      GO TO 10
+C
+  160 CONTINUE
+C
+C             Reset ITR3D to 'standard projection'
+C
+      ITR3D=0
+      IOBJ=0
+C
+ 1000 FORMAT (' GKHITS: No hit picked')
+      RETURN
+      END