--- DarthVader/TrackerLevel2/src/F77/track.f 2008/03/05 17:00:20 1.3 +++ DarthVader/TrackerLevel2/src/F77/track.f 2009/02/03 13:57:16 1.4 @@ -26,7 +26,7 @@ * - old routine * * DOTRACK2(NPOINT,ZIN,XOUT,YOUT,THXOUT,THYOUT,TLOUT,AL_P,IFAIL) -* - as the old one, but: +* - as the previous one, but: * -- the projected angles are given as output * -- the track lengths are given as output: * ---- for planes above the reference plane, the length until @@ -35,10 +35,18 @@ * the higher closest plane (reference plane included) * * March 2008 --> optimized by Paolo +* +* DOTRACK3(NPOINT,ZIN,XOUT,YOUT,THXOUT,THYOUT,TLOUT,AL_P,IFAIL) +* - as the previous one, but with the coordinate ZINI of the reference +* plane given as input parameter +* +* ************************************************************** + SUBROUTINE - $ DOTRACK2(NPOINT,ZIN,XOUT,YOUT,THXOUT,THYOUT,TLOUT,AL_P,IFAIL) + $ DOTRACK3(NPOINT,ZIN,XOUT,YOUT,THXOUT,THYOUT,TLOUT,AL_P + $ ,ZINI,IFAIL) IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -56,7 +64,7 @@ DIMENSION TLOUT(NPOINT_MAX) DIMENSION AL_P(5) * ----------------------------------------------- - DATA ZINI/23.5/ !z coordinate of the reference plane +* DATA ZINI/23.5/ !z coordinate of the reference plane REAL*8 L * ================================================================== @@ -202,6 +210,185 @@ RETURN END +************************************************************************ +* +* +* +* +************************************************************************ + + SUBROUTINE + $ DOTRACK2(NPOINT,ZIN,XOUT,YOUT,THXOUT,THYOUT,TLOUT,AL_P,IFAIL) + + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + + +ccc DIMENSION VECT(7),VECTINI(7),VOUT(7) +ccc DATA TOLL/1.d-8/ + +* tolerance in reaching the next plane during the tracking procedure +* ----------------------------------------------- +* I/O parameters + PARAMETER (NPOINT_MAX=100) + DIMENSION ZIN(NPOINT_MAX) + DIMENSION XOUT(NPOINT_MAX),YOUT(NPOINT_MAX) + DIMENSION THXOUT(NPOINT_MAX),THYOUT(NPOINT_MAX) + DIMENSION TLOUT(NPOINT_MAX) + DIMENSION AL_P(5) +* ----------------------------------------------- + DATA ZINI/23.5/ !z coordinate of the reference plane +ccc REAL*8 L + + CALL DOTRACK3(NPOINT,ZIN,XOUT,YOUT,THXOUT,THYOUT,TLOUT,AL_P + $ ,ZINI,IFAIL) + +ccc +ccc OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD-OLD +ccc + +c$$$* ================================================================== +c$$$* divide the track in two parts: below and above the reference plane +c$$$* ================================================================== +c$$$ IUPDOWN=0 +c$$$ DO I=1,NPOINT +c$$$ IF(ZIN(I).LT.ZINI)THEN +c$$$ if(i.ne.1)IUPDOWN=I +c$$$ GOTO 88 +c$$$ ENDIF +c$$$ IUPDOWN=NPOINT+1 +c$$$ ENDDO +c$$$ 88 CONTINUE +c$$$ +c$$$* ================================================================== +c$$$* track from reference plane DOWN +c$$$* ================================================================== +c$$$* parameters for GRKUTA +c$$$ IF(AL_P(5).NE.0) CHARGE=AL_P(5)/DABS(AL_P(5)) +c$$$ IF(AL_P(5).EQ.0) CHARGE=1. +c$$$ VOUT(1)=AL_P(1) +c$$$ VOUT(2)=AL_P(2) +c$$$ VOUT(3)=ZINI +c$$$ VOUT(4)=AL_P(3)*DCOS(AL_P(4)) +c$$$ VOUT(5)=AL_P(3)*DSIN(AL_P(4)) +c$$$ VOUT(6)=-1.*DSQRT(1.-AL_P(3)**2) +c$$$ IF(AL_P(5).NE.0.) VOUT(7)=DABS(1./AL_P(5)) +c$$$ IF(AL_P(5).EQ.0.) VOUT(7)=1.E8 +c$$$ DO I=MAX(IUPDOWN,1),NPOINT +c$$$ L = 0.0 +c$$$ 10 DO J=1,7 +c$$$ VECT(J)=VOUT(J) +c$$$ VECTINI(J)=VOUT(J) +c$$$ ENDDO +c$$$ IF(VOUT(6).GE.0.) THEN +c$$$ IFAIL=1 +c$$$c$$$ if(TRKVERBOSE) +c$$$c$$$ $ PRINT *,'dofit (grkuta): WARNING ===> backward track!!' +c$$$ RETURN +c$$$ ENDIF +c$$$ step=(zin(i)-vect(3))/VOUT(6) +c$$$ 11 continue +c$$$ CALL GRKUTA(CHARGE,STEP,VECT,VOUT) +c$$$ L = L + STEP +c$$$ IF(VOUT(3).GT.VECT(3)) THEN +c$$$ IFAIL=1 +c$$$c$$$ if(TRKVERBOSE) +c$$$c$$$ $ PRINT *,'dofit (grkuta): WARNING ===> backward track!!' +c$$$c$$$ if(TRKVERBOSE)print*,'charge',charge +c$$$c$$$ if(TRKVERBOSE)print*,'vect',vect +c$$$c$$$ if(TRKVERBOSE)print*,'vout',vout +c$$$c$$$ if(TRKVERBOSE)print*,'step',step +c$$$c$$$ if(TRKVERBOSE)print*,'DeltaB',DELTA0,DELTA1 +c$$$ RETURN +c$$$ ENDIF +c$$$ Z=VOUT(3) +c$$$ IF(Z.LE.ZIN(I)+TOLL.AND.Z.GE.ZIN(I)-TOLL) GOTO 100 +c$$$ IF(Z.GT.ZIN(I)+TOLL) GOTO 10 +c$$$ IF(Z.LE.ZIN(I)-TOLL) THEN +c$$$ L = L - STEP +c$$$ STEP=STEP*(ZIN(I)-VECT(3))/(Z-VECT(3)) +c$$$ DO J=1,7 +c$$$ VECT(J)=VECTINI(J) +c$$$ ENDDO +c$$$ GOTO 11 +c$$$ ENDIF +c$$$ 100 XOUT(I)=VOUT(1) +c$$$ YOUT(I)=VOUT(2) +c$$$ ZIN(I)=VOUT(3) +c$$$ IF(VOUT(3).ne.0)THEN +c$$$ THXOUT(I)=DATAN(VOUT(4)/VOUT(6))*180./ACOS(-1.) +c$$$ THYOUT(I)=DATAN(VOUT(5)/VOUT(6))*180./ACOS(-1.) +c$$$ ENDIF +c$$$ TLOUT(I) = L +c$$$c print*,'D ',VECT(3),VOUT(3),VOUT(8),STEP +c$$$ ENDDO +c$$$ +c$$$* ================================================================== +c$$$* track from reference plane UP +c$$$* ================================================================== +c$$$* parameters for GRKUTA: +c$$$* -opposite charge +c$$$* -opposite momentum direction +c$$$ IF(AL_P(5).NE.0) CHARGE=-AL_P(5)/DABS(AL_P(5)) +c$$$ IF(AL_P(5).EQ.0) CHARGE=-1. +c$$$ VOUT(1)=AL_P(1) +c$$$ VOUT(2)=AL_P(2) +c$$$ VOUT(3)=ZINI +c$$$ VOUT(4)=-AL_P(3)*DCOS(AL_P(4)) +c$$$ VOUT(5)=-AL_P(3)*DSIN(AL_P(4)) +c$$$ VOUT(6)=1.*DSQRT(1.-AL_P(3)**2) +c$$$ IF(AL_P(5).NE.0.) VOUT(7)=DABS(1./AL_P(5)) +c$$$ IF(AL_P(5).EQ.0.) VOUT(7)=1.E8 +c$$$ DO I=MIN((IUPDOWN-1),NPOINT),1,-1 +c$$$ L = 0.0 +c$$$ +c$$$ 20 DO J=1,7 +c$$$ VECT(J)=VOUT(J) +c$$$ VECTINI(J)=VOUT(J) +c$$$ ENDDO +c$$$ IF(VOUT(6).LE.0.) THEN +c$$$ IFAIL=1 +c$$$c$$$ if(TRKVERBOSE) +c$$$c$$$ $ PRINT *,'dofit (grkuta): WARNING ===> backward track!!' +c$$$ RETURN +c$$$ ENDIF +c$$$ step=(zin(i)-vect(3))/VOUT(6) +c$$$ 22 continue +c$$$ CALL GRKUTA(CHARGE,STEP,VECT,VOUT) +c$$$ L = L + STEP +c$$$ IF(VOUT(3).LT.VECT(3)) THEN +c$$$ IFAIL=1 +c$$$c$$$ if(TRKVERBOSE) +c$$$c$$$ $ PRINT *,'dofit (grkuta): WARNING ===> backward track!!' +c$$$c$$$ if(TRKVERBOSE)print*,'charge',charge +c$$$c$$$ if(TRKVERBOSE)print*,'vect',vect +c$$$c$$$ if(TRKVERBOSE)print*,'vout',vout +c$$$c$$$ if(TRKVERBOSE)print*,'step',step +c$$$c$$$ if(TRKVERBOSE)print*,'DeltaB',DELTA0,DELTA1 +c$$$ RETURN +c$$$ ENDIF +c$$$ Z=VOUT(3) +c$$$ IF(Z.LE.ZIN(I)+TOLL.AND.Z.GE.ZIN(I)-TOLL) GOTO 200 +c$$$ IF(Z.LT.ZIN(I)-TOLL) GOTO 20 +c$$$ IF(Z.GE.ZIN(I)+TOLL) THEN +c$$$ L = L - STEP +c$$$ STEP=STEP*(ZIN(I)-VECT(3))/(Z-VECT(3)) +c$$$ DO J=1,7 +c$$$ VECT(J)=VECTINI(J) +c$$$ ENDDO +c$$$ GOTO 22 +c$$$ ENDIF +c$$$ 200 XOUT(I)=VOUT(1) +c$$$ YOUT(I)=VOUT(2) +c$$$ ZIN(I)=VOUT(3) +c$$$ IF(VOUT(3).ne.0)THEN +c$$$ THXOUT(I)=DATAN(VOUT(4)/VOUT(6))*180./ACOS(-1.) +c$$$ THYOUT(I)=DATAN(VOUT(5)/VOUT(6))*180./ACOS(-1.) +c$$$ ENDIF +c$$$ TLOUT(I) = L +c$$$ ENDDO +c$$$ + RETURN + END ************************************************************************ *