c******************************************************************************
c* ... SUB_TRIGGER.FOR		  					      *
c*									      *
c* Die Routinen dieser Datei dienen der Berechnung und der Ausgabe	      *
c* von Flugbahnen geladener Teilchen innerhalb des NEMU - Triggerdetektors.   *
c*									      *
c* Die Daten fuer die DetektorGEOmetrie (dx1 bis dx11, bzw. dy1 bis dy15)     *
c* werden beim Compilieren aus 'GEO_TRIGGER.INC' eingelesen.		      *
c*									      *
c*    F -> FOLIE							      *
c*    V -> Gitter VORNE							      *
c*    H -> Gitter HINTEN						      *
c*    G -> Gitter GROUND (geerdetes Gitter nach HINTEN)			      *
c*    3 -> MCP3 (front)							      *
c*									      *
c******************************************************************************

	OPTIONS /EXTEND_SOURCE

	SUBROUTINE READ_TRIGGER_GEO
c	===========================

	implicit none

	INCLUDE 'mutrack$sourcedirectory:GEO_TRIGGER.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_LUNS.INC'

	integer iostat

c namelist:

	namelist /trigger_grids/
     +	    dist_Wires_V1,dist_Wires_V2,dist_Wires_V3,
     +	    dist_Wires_H1,dist_Wires_H2,dist_Wires_G, 
     +	    dWires_V1,dWires_V2,dWires_V3,dWires_H1,dWires_H2,dWires_G


	read(lunREAD,nml=trigger_grids,iostat=iostat)	    ! wurde in SUB_INPUT geoeffnet
	! iostat notwendig, da bei aelteren Files keine namelist 'trigger_grids'
	! vorhanden ist. Dort: Defaultwerte.

	WireRadiusQuad_V1 = dwires_V1*dWires_V1/4.
	WireRadiusQuad_V2 = dwires_V2*dWires_V2/4.
	WireRadiusQuad_V3 = dwires_V3*dWires_V3/4.
	WireRadiusQuad_H1 = dwires_H1*dWires_H1/4.
	WireRadiusQuad_H2 = dwires_H2*dWires_H2/4.
	WireRadiusQuad_G  = dwires_G *dWires_G /4.


	END


c===============================================================================

	OPTIONS /EXTEND_SOURCE

	SUBROUTINE TRIGGER(m_,q_,t_,x_,v_,DEBUG_,GRAPHICS_,n_return_)
c	=============================================================


c Deklarationen:
	
	implicit none

	real m_,q_,t_,x_(3),v_(3)	! die Aufruf-Parameter
	real E, vSquare			! EnergieFkt und Geschw.Quadrat
	real dt,delta_x,delta_y,delta_xs,delta_xp,v_s,v_p,a
	real sqrt_2,c

	real barriere_FV,barriere_VH,barriere_HG,barriere_V3

	integer	n_return_

	integer vorne_hinten		!
	integer vorne_hinten_refl	! die Label
	integer vorne_mcp3		! fuer GOTO-Anweisungen
	integer vorne_mcp3_refl		!

	logical log_p4			! notiert, ob Pfosten P4 getroffen wird.
	logical DEBUG_,GRAPHICS_


c Die Trigger-Geometrie

	INCLUDE 'mutrack$sourcedirectory:GEO_TRIGGER.INC'


c Variablen fuer Test ob Draht getroffen wurde:

	integer DrahtNr
	real	help,DistToWire(2)
	logical WireHit

	logical TestOnWireHit
	COMMON /TestOnWireHit/ TestOnWireHit

	integer seed
	COMMON /seed/ seed


c Konstanten-Definitionen:

        parameter (sqrt_2=1.414213562, c=299.7925) ! c in [mm/ns]


c Common-Bloecke:

	INCLUDE 'mutrack$sourcedirectory:COM_TD_INT.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_TD_EXT.INC'


c Funktionen-Deklarationen:

	E(vSquare) = m/2.*vSquare/c**2.	! E in [keV]; vSquare==v**2.


c hier werden die Labels getauft:

	assign  100 to vorne_hinten
	assign  200 to vorne_hinten_refl
	assign  300 to vorne_mcp3
	assign  400 to vorne_mcp3_refl


c Uebertragen der Aufruf-Parameter auf die lokalen Variablen:

	m = m_
	q = q_

	t = t_

	x = 0.
	y = x_(2)
	z = x_(3)

	v_x = v_(1)
	v_y = v_(2)
	v_z = v_(3)

	DEBUG = DEBUG_
	GRAPHICS = GRAPHICS_
	n_return = 0			! n_return > 100  <->  Fehlermeldungen


c sonstige Start-Werte:

	E0 = E(v_x**2+v_y**2.+v_z**2.)

      	barriere_FV =  q * (U_V - U_F)
      	barriere_VH =  q * (U_H - U_V)
      	barriere_HG =  q * (0.  - U_H)
      	barriere_V3 =  q * (U_MCP3 - U_V)

	log_refl_VH = .false.		! das Teilchen ist noch 
	log_refl_V3 = .false.		!    nirgends reflektiert worden
	log_p4	    = .false.		!    und hat Pfosten 4 nicht beruehrt


c...............................................................................
c hier startet das Teilchen:
c --------------------------

	dt = 0
	call TestAndOut('F  ',*800)
	if (v_x.LT.0.) then			! Start in neg. x-Richtung
	    n_return = 103
		if (DEBUG) call outText(n_return)
            GOTO 800
	endif


C zwischen 'FOLIE' und 'VORNE': -----------------------------

	if (E(v_x**2.).LT.barriere_FV) then	! Potentialbarriere F-V zu gross
	    n_return = 104
	    if (DEBUG) call outText(n_return)
            GOTO 800
        endif

	if (barriere_FV.EQ.0.) then		! keine Spannung zwischen F und V
	    if (v_x.EQ.0.) then			! U=0 und v_x=0 =>
		n_return = 105			!    Teilchen bleibt stehen
		if (DEBUG) call outText(n_return)
		GOTO 800
	    endif
	    dt = dx1/v_x			! v_x > 0
	else
	    a = -barriere_FV/(m*dx1) * c**2.	! <- a = F/m = q/m*(U_F-U_V)/dx1
					        !      = -barriere_FV/(m*dx1)
    	    dt = (sqrt(v_x**2.+2.*a*dx1)-v_x)/a	! <- ergibt sich aus x=v*t+1/2*a*t**2
					        !      mit richtiger V.Z.-Wahl ('+')
	    v_x = v_x + a*dt
	endif

	x = dx1
	y = y + v_y*dt
	z = z + v_z*dt
	t = t + dt

c haben wir vielleicht einen Pfosten getroffen? Wenn nein, gib die Trajektorien-Daten aus

        if (y.GT.dy3) then		  	! (Bahn FV1)
	    call pfosten(1,*800)
	elseif (y.GT.dy5) then			! (Bahn FV2)
	    call pfosten(3,*800)
	elseif (y.LT.-dy4) then			! (Bahn FV5)
	    call pfosten(2,*800)
	elseif (y.LT.-dy6) then	    		! (Bahn FV4)
	    call pfosten(4,*800)
	else					! (Bahn FV3)
	    call TestAndOut('V1 ',*800)
	    ! Treffen wir einen Gitterstab von V1?
	    if (testOnWireHit) then
		DrahtNr = nInt(y/dist_Wires_V1)
		distToWire(1) = 0.
		distToWire(2) = y - DrahtNr*dist_Wires_V1
		call Test_WireHit(distToWire,WireRadiusQuad_V1,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	endif


c innerhalb von 'VORNE':
c ----------------------

	if (y+dy6.LT.-dx7*v_y/v_x) log_p4=.true.! Teilchen trifft auf Pfosten 4

	if (v_y.LE.-v_x) goto 20 		! Flugbahn ist parallel zu Ebene V2
						!     bzw. Schnitt bei dt < 0


c Schnittpunkt der Bahn (y'=y+delta_x*v_y/v_x) mit Ebene V2 (y'=dx2-delta_x):

	if (v_x.EQ.0.) then
	    if (v_y.LT.0.) then
		dt = (-dy4-y)/v_y
		x = dx1
		y = -dy4
		z = z + v_z*dt
		t = t + dt
		call pfosten(2,*800)
	    endif
	    delta_x = 0
	else 
	    delta_x = (dx2-y)/(1+v_y/v_x)
	endif

	if (delta_x.GT.dx2+dy8) goto 20		! Bahn schneidet erst Ebene V3

	if (v_x.NE.0.) then
	    dt = delta_x/v_x
	else
	    dt = (dx2-delta_x-y)/v_y
	endif
	x = x + delta_x
	y = dx2 - delta_x
	z = z + v_z*dt
	t = t + dt

	if (log_p4) call pfosten(4,*800)	! (Bahn VV8)

	if (y.GT.dy5) then			! (Bahn VV1)
	    call pfosten(3,*800)
	elseif (y.GE.-dy11) then		! (Bahn VV2)
	    call TestAndOut('V2 ',*800)
	    ! Treffen wir einen Gitterstab von V2?
	    if (testOnWireHit) then
		DrahtNr = nInt(y/(.5*sqrt_2*dist_Wires_V2))
		distToWire(2) = y - DrahtNr*.5*sqrt_2*dist_Wires_V2
		distToWire(1) = -distToWire(2)
		call Test_WireHit(distToWire,WireRadiusQuad_V2,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	    goto vorne_hinten
	else
	    call pfosten(5,*800)		! (Bahn VV3)
	endif


c Schnittpunkt der Bahn (y'=y+delta_x*v_y/v_x) mit Ebene V3 (y'=-dy8):

20	delta_y = -dy8-y
	dt = delta_y/v_y
	x = x + v_x*dt
	y = -dy8
	z = z + v_z*dt
	t = t + dt 

	if (log_p4) call pfosten(4,*800)	! (Bahn VV8)

	if (x.GT.dx1+dx2+dy11) then		! (Bahn VV3)
	    call pfosten(5,*800)
	elseif (x.GT.dx1+dx2+dy8-dx10) then	! (Bahn VV4)
	    call pfosten(13,*800)
	elseif (x.GE.dx1+dx8) then		! (Bahn VV5)
	    call TestAndOut('V3 ',*800)
	    ! Treffen wir einen Gitterstab von V3?
	    if (testOnWireHit) then
		help = x-dx1-dx8
		DrahtNr = nInt(help/dist_Wires_V3)
		distToWire(1) = help - DrahtNr*dist_Wires_V3
		distToWire(2) = 0.
		call Test_WireHit(distToWire,WireRadiusQuad_V3,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	    goto vorne_mcp3
	else					! (Bahn VV6)
	    call pfosten(12,*800)
	endif


c zwischen 'VORNE' und 'HINTEN': vorne_hinten
c -------------------------------------------

100	v_s = (v_x + v_y)/sqrt_2		! v_s: v senkrecht zur Spiegelebene
	v_p = (v_x - v_y)/sqrt_2		! v_p: v parallel zur Spiegelebene

	if (barriere_VH.EQ.0.) then		! keine Spannung zwischen V und H
	    dt = dx3/sqrt_2 / v_s		! v_s > 0, sonst waere V3 gar nicht
	    x = x + v_x*dt			!    erreicht worden
	    y = y + v_y*dt
	else
	    a = -barriere_VH * sqrt_2/(m*dx3) * c**2.

      	    if (E(v_s**2.).LT.barriere_VH) goto vorne_hinten_refl
	
	    dt = (sqrt(v_s**2.+sqrt_2*a*dx3)-v_s)/a  ! aus x=v*t+a/2*t**2
	    delta_xs = dx3/sqrt_2		! = Versetzung senkrecht zur Spiegelebene
	    delta_xp = v_p*dt			! = Versetzung parallel zur Spiegelebene
	    v_s = v_s + a*dt

	    x = x + (delta_xs + delta_xp)/sqrt_2
	    y = y + (delta_xs - delta_xp)/sqrt_2
	    v_x = (v_s + v_p)/sqrt_2
	    v_y = (v_s - v_p)/sqrt_2
	endif

	z = z + v_z*dt
	t = t + dt
	if (y.GT.dy7) then			! (Bahn VH1)
	    call pfosten(6,*800)
	elseif (y.GE.-dy13) then		! (Bahn VH2)
	    call TestAndOut('H1 ',*800)
	    ! Treffen wir einen Gitterstab von H1?
	    if (testOnWireHit) then
		DrahtNr = nInt(y/(.5*sqrt_2*dist_Wires_H1))
		distToWire(2) = y - DrahtNr*.5*sqrt_2*dist_Wires_H1
		distToWire(1) = -distToWire(2)
		call Test_WireHit(distToWire,WireRadiusQuad_H1,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	else					! (Bahn VH3)
	    call pfosten(9,*800)
	endif


c innerhalb von 'HINTEN':
c -----------------------

	if (v_y.LE.0.) goto 30			! Flugbahn parallel zu (y'=dy9)
						! bzw. Schnitt bei dt < 0


c Schnittpunkt mit (y'=dy9):

	delta_x = (dy9-y)*v_x/v_y		! v_y <> 0.
	if (x+delta_x.GT.d_Folie_Hinten2) goto 30

	dt = (dy9-y)/v_y
	x = x + delta_x
	y = dy9
	z = z + v_z*dt
	t = t + dt
	
	if (x.LT.d_Folie_Hinten2-dx4-dy7) then	! (Bahn HH1)
	    call pfosten(6,*800)
	elseif (x.LT.d_Folie_Hinten2 -dx6) then	! (Bahn HH2)
	    call pfosten(7,*800)
	else					! (Bahn HH3)
	    call pfosten(8,*800)
	endif


c Schnittpunkt mit Ebene H2 (x'=d_Folie_Hinten2):

30	delta_x = d_Folie_Hinten2 - x
	dt = delta_x/v_x			! v_x > 0.
	x = d_Folie_Hinten2
	y = y + v_y*dt
	z = z + v_z*dt
	t = t + dt

	if (y.GT.dy12) then			! (Bahn HH3)
	    call pfosten(8,*800)
	elseif (y.GT.dy14) then			! (Bahn HH4)
	    call pfosten(10,*800)
	elseif (y.LT.-dy13) then		! (Bahn HH7)
	    call pfosten(9,*800)
	elseif (y.LT.-dy15) then		! (Bahn HH6)
	    call pfosten(11,*800)
	else					! (Bahn HH5)
	    call TestAndOut('H2 ',*800)
	    ! Treffen wir einen Gitterstab von H2?
	    if (testOnWireHit) then
		DrahtNr = nInt(y/dist_Wires_H2)
		distToWire(1) = 0.
		distToWire(2) = y - DrahtNr*dist_Wires_H2
		call Test_WireHit(distToWire,WireRadiusQuad_H2,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	endif

	
c zwischen 'HINTEN' und 'GROUND':
c -------------------------------

        if (E(v_x**2.).LT.barriere_HG) then	! Potentialbarriere H-G zu gross
	    n_return = 106
	    if (DEBUG) call outText(n_return)
            GOTO 800
        endif

	if (barriere_HG.EQ.0.) then		! keine Spannung zwischen H und G
	    dt = dx5/v_x			! v_x > 0.
	else
	    a = -barriere_HG/(m*dx5) * c**2. 
	    dt = (sqrt(v_x**2.+2.*a*dx5)-v_x)/a
	    v_x = v_x + a*dt
	endif

	x = d_Folie_Hinten2 + dx5
	y = y + v_y*dt
	z = z + v_z*dt
	t = t + dt
 	if (y.GT.dy14) then			! (Bahn HG1)
	    call pfosten(10,*800)
	elseif (y.GE.-dy15) then		! (Bahn HG2) 
	    if (z.GT.dz1) then
		call pfosten(12,*800)
	    elseif (z.LT.-dz2) then
		call pfosten(13,*800)
	    else
	        call TestAndOut('G  ',*800)
		! Treffen wir einen Gitterstab von G?
		if (testOnWireHit) then
		    DrahtNr = nInt(y/dist_Wires_G)
		    distToWire(1) = 0.
		    distToWire(2) = y - DrahtNr*dist_Wires_G
		    call Test_WireHit(distToWire,WireRadiusQuad_G,v_x,v_y,WireHit)
		    if (WireHit) then
			n_return = -5
			goto 800
		    endif
		endif
		n_return = 0			! Teilchen verlaesst TD durch G
	    endif
	    GOTO 800
	else					! (Bahn HG3)
	    call pfosten(11,*800)
	endif


c REFLEKTION zwischen 'VORNE' und 'HINTEN': vorne_hinten_refl
c -----------------------------------------------------------

200	if (log_refl_V3) then			! schon an MCP3, jetzt an
	    n_return = 107			!     HINTEN reflektiert
	    if (DEBUG) call outText(n_return)
	    GOTO 800
	endif
		
	log_refl_VH = .true.			! die Reflektion notieren

	dt = -2.*v_s/a				! folgt aus v'=-v und v'=v+a*t
	x = x + v_p * dt / sqrt_2		! senkrecht zur Spiegelflaeche
	y = y - v_p * dt / sqrt_2		!     findet keine Versetzung statt
	z = z + v_z*dt
	t = t + dt
	v_x = (-v_s + v_p)/sqrt_2		! v_s geht bei der Spiegelung
	v_y = (-v_s - v_p)/sqrt_2		!     in -(v_s) ueber

	if (y.GT.dy5) then			! (Bahn VHr1)
	    call pfosten(3,*800)
	elseif (y.GE.-dy11) then		! (Bahn VHr2)
	    call TestAndOut('V2 ',*800)
	    ! Treffen wir einen Gitterstab von V2?
	    if (testOnWireHit) then
		DrahtNr = nInt(y/(.5*sqrt_2*dist_Wires_V2))
		distToWire(2) = y - DrahtNr*.5*sqrt_2*dist_Wires_V2
		distToWire(1) = -distToWire(2)
		call Test_WireHit(distToWire,WireRadiusQuad_V2,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	else					! (Bahn VHr3)
	    call pfosten(5,*800)
	endif


c innerhalb von 'VORNE' (nach Reflektion an 'HINTEN'):
c ----------------------------------------------------

	if (v_x.GE.0.) goto 40			! Flugbahn parallel zu V1
						! bzw. Schnitt bei dt < 0


c Schnittpunkt mit V1-Ebene (x'=dx1):

	delta_y = (dx1-x)*v_y/v_x
	if (y+delta_y.LT.-dy8) goto 40

	dt = (dx1-x)/v_x
	x = dx1
	y = y + delta_y
	z = z + v_z*dt
	t = t + dt

	if (y.GT.dy5) then			! (Bahn VVr1)
	    call pfosten(3,*800)
	elseif (y.GT.dy3) then			! (Bahn VVr2)
	    call pfosten(1,*800)
	elseif (y.LT.-dy6) then			! (Bahn VVr5)
	    call pfosten(4,*800)
	elseif (y.LT.-dy4) then			! (Bahn VVr4)
	    call pfosten(2,*800)
	else					! (Bahn VVr3)
	    n_return = 108			! Teilchen zurueck auf V1
	    if (DEBUG) call outText(n_return)
            RETURN
	endif


c Schnittpunkt mit V3-Ebene (y'=-dy8):
 
40	delta_y = -dy8-y
	dt = delta_y/v_y			! v_y < 0.
	x = x + v_x*dt
	y = -dy8
	z = z + v_z*dt
	t = t + dt

	if (x.LT.dx1+dx7) then			! (Bahn VVr5)
	    call pfosten(4,*800)
	elseif (x.LT.dx1+dx8) then		! (Bahn VVr4)
	    call pfosten(14,*800)
	elseif (x.GT.dx1+dx2+dy11) then		! (Bahn VVr9)
	    call pfosten(5,*800)
	elseif (x.GT.dx1+dx2+dy8-dx10) then	! (Bahn VVr8)
	    call pfosten(15,*800)
	else					! (Bahn VVr7)
	    call TestAndOut('V3 ',*800)
	    ! Treffen wir einen Gitterstab von V3?
	    if (testOnWireHit) then
		help = x-dx1-dx8
		DrahtNr = nInt(help/dist_Wires_V3)
		distToWire(1) = help - DrahtNr*dist_Wires_V3
		distToWire(2) = 0.
		call Test_WireHit(distToWire,WireRadiusQuad_V3,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	endif


c zwischen 'VORNE' und 'MCP3': vorne_mcp3
c ----------------------------------------

300	a = +barriere_V3/(m*dy10) * c**2.

        if (E(v_y**2.).LT.barriere_V3) goto vorne_mcp3_refl

	if (a.EQ.0.) then
	    dt = -dy10/v_y			! v_y < 0.
	else
	    dt = (-sqrt(v_y**2.-2.*a*dy10)-v_y)/a  ! aus dy=v*dt+a/2*dt**2 mit 
	    v_y = v_y + a * dt			!    richtiger V.Z.-Wahl ('-')
	endif

	x = x + v_x*dt
	y = -dy8-dy10
	z = z + v_z*dt
	t = t + dt

	if (x.LT.dx1+dx8) then			! (Bahn V31)
	    call pfosten(14,*800)
	elseif (x.LT.dx1+dx9) then		! (Bahn V32) 
	    call pfosten(16,*800)
	elseif (x.GT.dx1+dx2+dy8-dx10) then	! (Bahn V35)
	    call pfosten(15,*800)
	elseif (x.GT.dx1+dx2+dy8-dx11) then	! (Bahn V34)
	    call pfosten(17,*800)
	else					! (Bahn V33)
	    if (((x - xCenter_MCP3)**2.+z**2).GT.radiusQuad_MCP3) then
		if (z.GE.0 .AND. x.GE. xCenter_MCP3) then
		    call pfosten(19,*800)
		elseif (z.GE.0 .AND. x.LT. xCenter_MCP3) then
		    call pfosten(18,*800)
		elseif (z.LT.0 .AND. x.LT. xCenter_MCP3) then
		    call pfosten(20,*800)
		else
		    call pfosten(21,*800)
		endif
	    else
	        call TestAndOut('M3 ',*800)
		if (testOnWireHit .AND. ran(seed).GT.efficiencyM3) then
		    n_return = -9			! Teilchen NICHT in MCP3
		else					!     nachgewiesen
		    n_return = -10			! Teilchen in MCP3
		endif					!     nachgewiesen
	    endif
	    GOTO 800
	endif


c REFLEKTION zwischen 'VORNE' und 'MCP3': vorne_mcp3_refl
c --------------------------------------------------------

400	if (log_refl_VH) then			! schon an HINTEN, jetzt an
	    n_return = 109			!     MCP3 reflektiert
	    if (DEBUG) call outText(n_return)
	    GOTO 800
	endif

	log_refl_V3 = .true.			! die Reflektion notieren

	if (v_x.LE.0.) then			! Reflektion an MCP3 mit
	    n_return = 110			!    negativem v_x
	    if (DEBUG) call outText(n_return)
	    GOTO 800
	endif

	dt = -2.*v_y/a
	x = x + v_x*dt				! y'=y
	z = z + v_z*dt
	t = t + dt

	if (x.GT.dx1+dx2+dy8-dx10) then		! (Bahn V3r1)
	    call pfosten(15,*800)
	elseif (x.GT.dx1+dx2+dy11) then		! (Bahn V3r2)
	    call pfosten(5,*800)
	else					! (Bahn V3r3)
	    v_y = -v_y				! v_x'=v_x
	    call TestAndOut('V3 ',*800)
	    ! Treffen wir einen Gitterstab von V3?
	    if (testOnWireHit) then
		help = x-dx1-dx8
		DrahtNr = nInt(help/dist_Wires_V3)
		distToWire(1) = help - DrahtNr*dist_Wires_V3
		distToWire(2) = 0.
		call Test_WireHit(distToWire,WireRadiusQuad_V3,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	endif


c innerhalb von 'VORNE' (nach Reflektion an 'MCP3'):
c ---------------------------------------------------


c Schnittpunkt mit Ebene V2 (y'=dx2-(x'-dx1)):

	delta_x = (dx1+dx2-y+x*v_y/v_x)/(1+v_y/v_x)-x	! v_x,v_y > 0.
	dt = delta_x/v_x
	x = x + delta_x
	y = y + v_y*dt
	z = z + v_z*dt
	t = t + dt
				
	if (y.GT.dy5) then			! (Bahn VVrr1)
	    call pfosten(3,*800)
	elseif (y.GE.-dy11) then		! (Bahn VVrr2)
	    call TestAndOut('V2 ',*800)
	    ! Treffen wir einen Gitterstab von V2?
	    if (testOnWireHit) then
		DrahtNr = nInt(y/(.5*sqrt_2*dist_Wires_V2))
		distToWire(2) = y - DrahtNr*.5*sqrt_2*dist_Wires_V2
		distToWire(1) = -distToWire(2)
		call Test_WireHit(distToWire,WireRadiusQuad_V2,v_x,v_y,WireHit)
		if (WireHit) then
		    n_return = -5
		    goto 800
		endif
	    endif
	    goto vorne_hinten
	else					! (Bahn VVrr3)
	    call pfosten(5,*800)
	endif
	    


c...............................................................................
800	continue

c Die Trajektorienberechnung innerhalb des TDs ist beendeet -> bringe die
c Aufruf-Variablen auf den aktuellen Stand und gehe zurueck ins Hauptprogramm.

 	t_ = t

	x_(1) = x
	x_(2) = y
	x_(3) = z

	v_(1) = v_x
	v_(2) = v_y

	n_return_ = n_return	

	RETURN


	END


c===============================================================================

	OPTIONS /EXTEND_SOURCE

	SUBROUTINE PFOSTEN(p,*)
c	=======================

        implicit  none
	integer	  p 
	character pfo*3   /'P  '/

	INCLUDE 'mutrack$sourcedirectory:COM_TD_INT.INC'

	write(pfo(2:3),'(I2)') p
	call TestAndOut(pfo)

	if (log_refl_V3) then
	    n_return = p+50
	elseif (log_refl_VH) then
	    n_return = p+25
	else
	    n_return = p
	endif

	RETURN 1

	END


c===============================================================================

	OPTIONS /EXTEND_SOURCE

	SUBROUTINE TestAndOut(text,*)
c	=============================

        implicit    none

	INCLUDE 'mutrack$sourcedirectory:COM_TD_INT.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_TD_EXT.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_WINKEL.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_KAMMER.INC'
	INCLUDE 'mutrack$sourcedirectory:GEO_TRIGGER.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_OUTPUT.INC'


c Variablen fuer die Graphikausgabe:

	real	xKoord(1000)		    ! Koordinatenfelder fuer die
	real	yKoord(1000)		    !    Graphikausgabe
	real	zKoord(1000)		    !
cMBc	real	tKoord(1000)		    !
	integer nKoord			    ! Anzahl der Koordinaten

cMBc	COMMON /GRAPHIX/ xKoord,yKoord,zKoord,nKoord,tKoord ! fuer Graphikaufruf
	COMMON /GRAPHIX/ xKoord,yKoord,zKoord,nKoord ! fuer Graphikaufruf

	real	    Ekin, help1, help2, help3, help4, c
	character   text*3

	parameter (c=299.7925)		! <- c in [mm/ns]!


c Ausgabe der DEBUG-Informationen:

	if (DEBUG) then
	    Ekin = m/2.*(v_x**2.+v_y**2.+v_z**2.) / c**2.
	    if (alfaTD.NE.0) then
		help1 = (x-d_Folie_Achse)*Cos_alfaTD - y*Sin_alfaTD + xTD
		help2 = (x-d_Folie_Achse)*Sin_alfaTD + y*Cos_alfaTD
		help3 = v_x*Cos_alfaTD - v_y*Sin_alfaTD + xTD
		help4 = v_x*Sin_alfaTD + v_y*Cos_alfaTD

		write(lun(1),1)text,help1,help2,z,help3,help4,v_z,Ekin
	    else
		write(lun(1),1)text,t,x-d_Folie_Achse+xTD,y,z,
     +						     v_x,v_y,v_z,Ekin
	    endif
	endif
1	format(5X,A4,3X,F6.1,2X,F7.2,X,F6.2,X,F6.2,2X,F6.2,X,
     +		      F6.2,X,F6.2,2X,G13.6)


c Speichern der Koordinaten fuer GRAPHICS:

	if (Graphics) then
	    nKoord = nKoord + 1
	    if (alfaTD.NE.0) then
		xKoord(nKoord) = (x-d_Folie_Achse)*Cos_alfaTD -
     +						      y*Sin_alfaTD + xTD
		yKoord(nKoord) = (x-d_Folie_Achse)*Sin_alfaTD +
     +						      y*Cos_alfaTD
	    else
		xKoord(nKoord) =  x-d_Folie_Achse + xTD
		yKoord(nKoord) =  y
	    endif
	    zKoord(nKoord) = z
cMBc	    tKoord(nKoord) = t

	    if (nKoord.EQ.1000) then
		call plot_vertikal
		xKoord(1) = xKoord( 999)            ! die letzten beiden uebernehme
		yKoord(1) = yKoord( 999)            ! damit gegebenenfalls der Rich
		zKoord(1) = zKoord( 999)            ! pfeil gezeichnet werden kann.
cMBc		tKoord(1) = tKoord( 999)
		xKoord(2) = xKoord(1000)
		yKoord(2) = yKoord(1000)
		zKoord(2) = zKoord(1000)
cMBc		tKoord(2) = tKoord(1000)
		nKoord = 2
	    endif


	endif


c Testen, ob Teilchen stehen bleibt:

	if (v_x.EQ.0. .AND.v_y.EQ.0.) then 
	    if (text(1:1).NE.'F') then
		n_return = 111
		if (DEBUG) call outText(n_return)
		RETURN 1
	    endif
	endif


	END


c===============================================================================

	OPTIONS /EXTEND_SOURCE

	SUBROUTINE outText(n)
c	=====================	

	implicit    none
	integer	    n
	character   text*70

	INCLUDE 'mutrack$sourcedirectory:COM_OUTPUT.INC'


c	  -10: Teilchen in MCP3 nachgewiesen
c	  - 9: Teilchen nicht in MCP3 nachgewiesen
c	  - 5: Teilchen traf auf Gitterstab

c	    0:  TD durch G verlassen

c	 1-25: Nummer der direkt getroffenen Pfosten
c	26-50: Nummer der nach Refl. an Hinten getroffenen Pfosten + 15
c	51-75: Nummer der nach Refl. an MCP3   getroffenen Pfosten + 30

c	12: oberhalb von G  
c	13: unterhalb von G
c	18: rechts oben von MCP3 (in Flugrichtung)
c	19: links oben von MCP3 (in Flugrichtung)
c	20: rechts unten von MCP3 (in Flugrichtung)
c	21: links unten von MCP3 (in Flugrichtung)


	if (n.EQ.101) then
	    text='Startposition auf Folientraeger'
	elseif (n.EQ.103) then
	    text='Start in negative x-Richtung'
	elseif (n.EQ.104) then
	    text='Teilchen zwischen FOLIE und VORNE reflektiert'
	elseif (n.EQ.105) then
	    text='v_x=0 und U(FOLIE,VORNE)=0 -> Teilchen steht'
	elseif (n.EQ.106) then
	    text='Teilchen zwischen HINTEN und GROUND reflektiert'
	elseif (n.EQ.107) then
	    text='Reflektion bei MCP3 und bei HINTEN'
	elseif (n.EQ.108) then
	    text='Teilchen zurueck auf Gitter V1'
	elseif (n.EQ.109) then
	    text='Reflektion bei HINTEN und bei MCP3'
	elseif (n.EQ.110) then
	    text='Teilchen zwischen VORNE und MCP3 reflektiert '//
     +							'mit v_x <=0'
	elseif (n.EQ.111) then
	    text='Teilchen bleibt stehen'
	endif

	write(lun(1),*) ' >>> ',text

	END


c===============================================================================


