c - Zuweisungen fuer 'dx5' und 'gridInFrontOfFoil' vielleicht besser in
c   'geo_kammer.input' verlegen!
c - Zuweisung fuer 'dx5' fuer Run10 ist noch zu pruefen! (15mm richtig?)
c - bei Use_MUTRACK und use_ACCEL pruefen lassen, ob verwendete Geometrien
c   kompatibel sind (damit naechste Simulation wirklich dort weiterrechnet,
c   wo die andere aufgehoert hat (gegebenenfalls bei verschiedenen Runs
c   Bestaetigung einholen)
c - bei 'createFoilFile' alle Schleifen die raeumlich nach der Triggerfolie
c   liegen auf 0,-1e10,1e10 (oder entsprechend) setzen, damit diese
c   ungenutzten Schleifen nur einmal durchlaufen werden!
c - kann Text zwischen 'Marke 1' und 'Marke 2' nicht mit vorherigen Passagen
c   bzgl. des Triggerdetektors zusammengefasst werden? (Vielleicht nicht!)
c-------------------------------------------------------------------------------

	OPTIONS /EXTEND_SOURCE

	SUBROUTINE read_inputFile
c	=========================

        IMPLICIT NONE

c Diese Subroutine liest das Eingabe-file 'MUTRACK.INPUT' und stellt
c die Simulationsparameter fuer das Programm entsprechend ein. Die Parameter
c befinden sich alle in einem COMMON-Block und sind so im gesamten Programm
c vorhanden.

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
c name-lists:

c - /acVersion/:

	namelist /acVersion/ accelVersion

c - /muVersion/:

	namelist /muVersion/ mutrackVersion,accelVersion

c - /loop_params/:
c    diese Variablen sind zwar auch in der nameList /parameter_liste/ enthalten,
c    werden hier aber noch einmal separat gefuehrt fuer das Einlesen der 
c    Schleifensettings von ACCEL bzw. vom 'foilfile':

	namelist /loop_params/ 
     + U_Tgt_,U_Gua_,U_G1_,U_L1_,U_Sp_,U_L2_,U_Folie_, B_Helm_,B_TD_, 
     + alfaTgt_,alfaSp_,alfaTD_,Masse_,Ladung_,
     + E0_,y0_,z0_,theta0_,phi0_,deltaL1_
c nur fuer das Einlesen aelterer foilFile-Versionen:
     + ,U_KL_

c - /parameter_liste/:

c (Die Variablen
c		    randomStarts_prevSim,   artList_prevSim,
c		    E0InterFromFile,	    UseDecay_prevSim,
c
c sind nicht fuer die Dateneinlesung aus MUTRACK.INPUT sondern werden fuer das
c Einlesen der INFO-Files von ACCEL bzw. einer frueheren 'foilFile'-MUTRACK-
c Rechnung benoetigt. 'useDecay_AH', 'artList_AH' und 'randomStarts_AH' sind
c die Vorgaenger der jetztigen Variablen mit den 'prevSim'-Endungen und
c und sind nur noch fuer das Einlesen aelterer Infofiles vorhanden. Sie koennen
c in der Zukunft problemlos entfernt werden).

	namelist /parameter_liste/

     + TestRun,Startflaeche,x0_,KammerTeil,alfaTgtVertically,

     + randomStarts,randomStarts_prevSim, random_energy,lowerE0,upperE0,sigmaE0,
     + random_position,StartBreite,StartHoehe,StartRadius,sigmaPosition,
     + random_winkel,StartLambertOrd,SigmaWinkel,

     + U_Tgt_,U_Gua_,U_G1_,U_L1_,U_Sp_,U_L2_,U_L3_,U_Folie_,U_Vorne_,U_Hinten_,
     + U_MCP3_,U_MCP2_,alfaTgt_,alfaSp_,alfaTD_, B_Helm_,B_TD_, Masse_,Ladung_,
     + E0_,y0_,z0_,theta0_,phi0_,thickness_,mean_Eloss_,deltaL1_,deltaL2_,
     + E0InterFromFile,

     + artList,artList_prevSim,
     + TriggerInBeam, n_aufstreu,sigmaAufstreu,
     + n_E_Verlust,calculate_each,sigmaE,lowerE,upperE,graphitData,
     + log_neutralize,neutral_fract,TransTDFoil,generate_FE,
     + GridInFrontOfFoil,

     + UseDecay, UseDecay_prevSim, TestOnWireHit,
     + previousSimulation,previousSettings,
     + fileName_ACCEL,fileName_Mutrack,
     + createFoilFile,upToTDFoilOnly,

     + Fo_triggered,xM2_triggered,M2_triggered,

     + idealMirror,
     + geo_filename,write_geo,xBlende,radius_Blende,

     + DEBUG,DEBUG_Anzahl, DEBUG_FE,
     + GRAPHICS,GRAPHICS_Anzahl, plot_FE, n_postSkript, iMonitor,
     + color,schnitt_x,schnitt_p,log_marker,vertical,

     + n_outWhere,
     + log_out_FE, log_out_pfosten,
     + SUM_S1xM2,SUM_S1M2,SUM_S1Fo,SUM_FoM2,SUM_S1M3,SUM_M3M2,SUM_t_FE,
     + SUM_y_Fo,SUM_z_Fo,SUM_r_Fo,SUM_y_M2,SUM_z_M2,SUM_r_M2,SUM_y_xM2,
     + SUM_z_xM2,SUM_r_xM2,

     + TAB_S1xM2,TAB_S1M2,TAB_S1Fo,TAB_FoM2,TAB_S1M3,TAB_M3M2,TAB_t_FE,
     + TAB_y_Fo,TAB_z_Fo,TAB_r_Fo,TAB_y_M2,TAB_z_M2,TAB_r_M2,TAB_y_xM2,
     + TAB_z_xM2,TAB_r_xM2,

     + createPhysTab,
     + PHY_S1xM2,PHY_S1M2,PHY_S1Fo,PHY_FoM2,PHY_S1M3,PHY_M3M2,PHY_t_FE,
     + PHY_y_Fo,PHY_z_Fo,PHY_r_Fo,PHY_y_M2,PHY_z_M2,PHY_r_M2,PHY_y_xM2,
     + PHY_z_xM2,PHY_r_xM2,
     + PHY_mean,PHY_variance,PHY_minimum,PHY_maximum,PHY_percent,

     + createNTP,
     + NTP_charge,NTP_S1xM2,NTP_times,NTP_FoM2Only,NTP_lifetime,NTP_start,
     + NTP_stop,NTP_40mm,NTP_Folie,NTP_steps, smearS1Fo,sigmaS1Fo,

     + eps_x,eps_v,log_relativ, maxStep, dtsmall,maxBelowDtSmall,

d    + dl_max_L1,dl_max_Sp,dl_max_L2andFo,dl_max_Fo,dl_max_L3,dl_max_M2, log_confine,

     + ow_U_Tgt,ow_U_Gua,ow_U_G1,ow_alfaTgt,
     + ow_masse,ow_ladung,ow_E0,ow_y0,ow_z0,ow_theta0,ow_phi0,
     + ow_U_L1,ow_U_Sp,ow_U_L2,ow_U_Folie, ow_B_Helm,ow_B_TD,
     + ow_alfaSp,ow_alfaTD,ow_deltaL1,ow_artList, writeTraj2File,

     + seed_,

     + useDecay_AH, artList_AH, randomStarts_AH


c fuer Kompatibilitaet mit frueheren Versionen, bei denen statt der Extension
c '_prevSim' noch die Extension '_AH' verwendet wurde:

	logical   useDecay_AH		/.false./
	character artList_AH*50		/  '  ' /
	integer   randomStarts_AH	/  -1E8 /


c - /KAMMER_GEO/:

	namelist /kammer_geo/

     + radius_Rohr,
     + xtarget,dytarget,dztarget,		! Beim Einlesen sind xGrid1 und
     + xgrid1,dygrid1,dzgrid1,			! xGrid2 relativ zur Targetfolie,
     + dWires_G1,dist_Wires_G1,			! im Programm relativ zur Kryo-
     + xgrid2,dygrid2,dzgrid2,		        ! achse gemessen
     + dWires_G2,dist_Wires_G2,
     + rHeShield,dyHeShield,dzHeShield,
     + rLNShield,dyLNShield,dzLNShield,
     + xCenterOfLense_L1,MappenName_L1,
     + xSpiegel,DreharmLaenge,BSpiegel,hSpiegel,DSpiegel,MappenName_Sp,
     + dWires_Sp,dist_Wires_Sp,
     + xCenterOfLense_L2,MappenName_L2andFo,
     + xTD,mappenName_Fo,
     + xCenterOfLense_L3,MappenName_L3,
     + xMCP2,radius_MCP2active,MappenName_M2

c-------------------------------------------------------------------------------

	INCLUDE 'mutrack$SOURCEdirectory:COM_MUTRACK.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_DIRS.INC'
	INCLUDE 'mutrack$sourcedirectory:GEO_TRIGGER.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_KAMMER.INC'

	character*40 inputName /'MUTRACK.INPUT'/
	COMMON /inputName/ inputName

        integer k             ! Zaehlvariable
	logical	flag
	logical flag_message  /.false./
	real	help
	integer ihelp
	character antwort*5

	logical log_marker    / .false./  ! Marker am Ende der Trajektorien
	COMMON	/marker/ log_marker	  !     zeichen?

	integer previousSimulation !/0/

	logical ow_U_Tgt	/.false./
	logical ow_U_Gua	/.false./
	logical ow_U_G1		/.false./
	logical ow_alfaTgt	/.false./
	logical ow_masse	/.false./
	logical ow_ladung	/.false./
	logical ow_E0		/.false./
	logical ow_y0		/.false./
	logical ow_z0		/.false./
	logical ow_theta0	/.false./
	logical ow_phi0		/.false./
	logical ow_U_L1		/.false./
	logical ow_U_Sp		/.false./
	logical ow_U_L2		/.false./
	logical ow_U_Folie	/.false./
	logical ow_B_Helm       /.false./
	logical ow_B_TD         /.false./
	logical ow_alfaSp	/.false./
	logical ow_alfaTD	/.false./
	logical ow_deltaL1	/.false./
	logical ow_artList	/.false./


c lokale Variablen fuer die Gewinnung von VersionIndxAC bzw. VersionIndxMU:

	integer	version1,version2,version3
	integer pos1,pos2


c Variablen im Zusammenhang mit den Eingabefile-Listen 'LISTn.INPUT':

	integer lastOne /0/, fileNr, iostat, length
	logical testRun_
	character datum*9,uhrzeit*8


c die lokalen Variablen zur Festlegung des Startortes und -Gebietes:

	real    x0_		/  0. /	! StartKoordinate
	integer Kammerteil	/  1  /	! Start-Kammerteil


c die lokal definierten Groessen zur Festlegung der Zufallsverteilungen der
c Startparameter:

	integer random_energy	/ 0 /  ! welche Verteilung fuer Startenergie?
	integer random_position / 0 /  ! welche Verteilung fuer Startposition?
	integer random_winkel   / 0 /  ! welche Verteilung fuer Startwinkel?

	integer randomStarts    / 50/
	integer seed_		/ 0 /


c die lokalen Variablen fuer die Festlegung der Zufallsverteilungen fuer
c Energie- und Winkelaufstreuung in der Triggerfolie:

	integer n_E_Verlust     / 0 /  ! Art der Beruecksichtigung des Energie-
				       !     verlustes in der Triggerfolie
	integer n_Aufstreu      / 0 /  ! Art der Beruecksichtigung der Winkel-
				       !     Aufstreuung in der Triggerfolie


c die lokalen Felder der 'Schleifenparameter'. Die Felder werden dann in das
c Feld 'par' uebertragen:

			    !      von     !   bis    !  step    !
	real U_Tgt_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_Gua_(3)	    /    -1.e10    ,  +1.e10  ,  -1.e10  /
	real U_G1_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_L1_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_Sp_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_L2_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_L3_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

c Fuer das Einlesen aelterer foilFile-Versionen:
	real U_KL_(3)	    /    -1.e10    ,  +1.e10  ,  -1.e10  /

	real U_Folie_(3)    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_Vorne_(3)    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_Hinten_(3)   /        0.    ,  +1.e10  ,  -1.e10  /
	real U_MCP3_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real U_MCP2_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real B_Helm_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real B_TD_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real alfaTgt_(3)    /        0.    ,  +1.e10  ,  -1.e10  /
	real alfaSp_(3)	    /       45.    ,  +1.e10  ,  -1.e10  /
	real alfaTD_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real Masse_(3)	    /   105659.    ,  +1.e10  ,  -1.e10  / 
	real Ladung_(3)	    /        1.    ,  +1.e10  ,  -1.e10  /

	real E0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  / 
	real y0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real z0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real theta0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  / 
	real phi0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real thickness_(3)  /        0.    ,  +1.e10  ,  -1.e10  /
	real mean_Eloss_(3) /        0.    ,  +1.e10  ,  -1.e10  /

	real deltaL1_(3)    /        0.    ,  +1.e10  ,  -1.e10  /
	real deltaL2_(3)    /        0.    ,  +1.e10  ,  -1.e10  /


c Defaultwerte fuer Restaurierung:

	real defVal(3)      /        0.    ,  +1.e10  ,  -1.e10  /


c die lokal definierten logicals fuer die Festlegung der im LOG-file auszu-
c gebenden Statistiken. Die Logicals werden dann in das Feld 'statInSummary'
c uebertragen:

	logical SUM_S1xM2	/ .false. /
	logical SUM_S1M2	/ .false. /
	logical SUM_S1Fo	/ .false. /
	logical SUM_FoM2	/ .false. /
	logical SUM_S1M3	/ .false. /
	logical SUM_M3M2	/ .false. /
	logical SUM_t_FE	/ .false. /
	logical SUM_y_Fo	/ .false. /
	logical SUM_z_Fo	/ .false. /
	logical SUM_r_Fo	/ .false. /
	logical SUM_y_M2	/ .false. /
	logical SUM_z_M2	/ .false. /
	logical SUM_r_M2	/ .false. /
	logical SUM_y_xM2	/ .false. /
	logical SUM_z_xM2	/ .false. /
	logical SUM_r_xM2	/ .false. /



c die lokal definierten logicals fuer die Festlegung der fuer PHYSICA abzu-
c speichernden Statistiken. Die Logicals werden dann in das Feld 'statInPHYSICA'
c uebertragen:

	logical PHY_S1xM2	/ .false. /
	logical PHY_S1M2	/ .false. /
	logical PHY_S1Fo	/ .false. /
	logical PHY_FoM2	/ .false. /
	logical PHY_S1M3	/ .false. /
	logical PHY_M3M2	/ .false. /
	logical PHY_t_FE	/ .false. /
	logical PHY_y_Fo	/ .false. /
	logical PHY_z_Fo	/ .false. /
	logical PHY_r_Fo	/ .false. /
	logical PHY_y_M2	/ .false. /
	logical PHY_z_M2	/ .false. /
	logical PHY_r_M2	/ .false. /
	logical PHY_y_xM2	/ .false. /
	logical PHY_z_xM2	/ .false. /
	logical PHY_r_xM2	/ .false. /


c die lokal definierten logicals fuer die Festlegung der fuer PHYSICA abzu-
c speichernden statistischen Groessen. Die Logicals werden dann in das Feld
c 'whatInPHYSICA' uebertragen:

	logical PHY_mean	/ .false. /
	logical PHY_variance	/ .false. /
	logical PHY_minimum	/ .false. /
	logical PHY_maximum	/ .false. /
	logical PHY_percent	/ .false. /


c die lokal definierten logicals fuer die Festlegung der zu erzeugenden
c Tabellenfiles. Die Logicals werden dann in das Feld 'createTabelle' ueber-
c tragen:

	logical TAB_S1xM2	/ .false. /
	logical TAB_S1M2	/ .false. /
	logical TAB_S1Fo	/ .false. /
	logical TAB_FoM2	/ .false. /
	logical TAB_S1M3	/ .false. /
	logical TAB_M3M2	/ .false. /
	logical TAB_t_FE	/ .false. /
	logical TAB_y_Fo	/ .false. /
	logical TAB_z_Fo	/ .false. /
	logical TAB_r_Fo	/ .false. /
	logical TAB_y_M2	/ .false. /
	logical TAB_z_M2	/ .false. /
	logical TAB_r_M2	/ .false. /
	logical TAB_y_xM2	/ .false. /
	logical TAB_z_xM2	/ .false. /
	logical TAB_r_xM2	/ .false. /


c Defaultwerte fuer dl_max_..:

	DATA    dl_max_L1 	/   1.0   /
	DATA    dl_max_Sp 	/   1.0   /
	DATA    dl_max_L2andFo 	/   1.0   /
	DATA    dl_max_Fo 	/   1.0   /
	DATA    dl_max_L3 	/   1.0   /
	DATA    dl_max_M2 	/   1.0   /

c ...
	character*30 zeile

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
	logical	   writeTraj2File
	common /writeTraj2File/ writeTraj2File
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
c Variable fuer den Test, ob 'MUTRACK' als batch job laeuft:
c (setzt voraus, dass im Falle eines batch jobs das logical
c 'running_in_batchmode' definiert ist).

        INCLUDE '($SSDEF)/NOLIST'
        INCLUDE '($LNMDEF)/NOLIST'

        integer status, sys$trnlnm

        STRUCTURE /ITMLST/
            UNION
                MAP
                    integer*2 BUFLEN
                    integer*2 CODE
                    integer*4 BUFADR
                    integer*4 RETLENADR
                END MAP
                MAP
                    integer*4 END_LIST
                END MAP
            END UNION
        END STRUCTURE

        RECORD /ITMLST/ LNMLIST(2)

        character*20    running_in_batchmode


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

c Pruefe, ob MUTRACK als batch job laeuft:

        LNMLIST(1).BufLen    = Len(RUNNING_IN_BATCHMODE)
        LNMLIST(1).Code      = LNM$_STRING
        LNMLIST(1).BufAdr    = %Loc(RUNNING_IN_BATCHMODE)
        LNMLIST(1).RetLenAdr = 0

        Status = SYS$trnlnm(lnm$M_case_blind,
     +                        'lnm$file_dev','RUNNING_IN_BATCHMODE',,Lnmlist)

        if (Status.EQ.SS$_NOLOGNAM) then
            batch_mode = .false.
        else
            write(*,*)
            write(*,*) ' >>>>  *******************************************'
            write(*,*) ' >>>>> logical ''RUNNING_IN_BATCHMODE'' is defined'
            write(*,*) ' >>>>>    => assume MUTRACK is run in batch mode'
            write(*,*) ' >>>>  *******************************************'
            write(*,*)
            batch_mode = .true.


c Pruefe, of 'InputListName' definiert ist. Falls ja, verwende die entsprechende
c Eingabeliste. Ansonsten bearbeite MUTRACK.INPUT:

      	    LNMLIST(1).BufLen    = Len(inputListName)
      	    LNMLIST(1).Code      = LNM$_STRING
      	    LNMLIST(1).BufAdr    = %Loc(inputListName)
      	    LNMLIST(1).RetLenAdr = 0

      	    Status = SYS$trnlnm(lnm$M_case_blind,
     +				  'lnm$file_dev','inputListName',,Lnmlist)

      	    if (Status.NE.SS$_NOLOGNAM) then
		call str$trim(inputListName,inputListName,Length)
		inputListName = inputListName(1:length)
		INPUT_LIST = .true.
	    endif


c Liess gegebenenfalls zu verwendenden Input-filenamen ein:

		if (INPUT_LIST) then
		open(lunRead,file=inputListName//'.INPUT',status='old',iostat=iostat,
     +				      defaultfile=readDir)
	    	if (iostat.NE.0) then
		    write(*,*) ' Kann '''//inputListName//'.INPUT'' nicht oeffnen'
		    write(*,*)
		    call exit
		endif

		ListLength = 0
		testRun_  = .false.
10		read(lunRead,'(A)',end=20) inputName
		read(inputName,*,iostat=iostat) ihelp
		if (iostat.NE.0) then
		    ListLength = ListLength + 1
		    goto 10
		else
		    if (ihelp.GT.0) then
			lastOne = ihelp
			if (lastOne.EQ.1) then
			    write(*,*) 'Es wurden schon alle files aus '''//inputListName//'.INPUT'''
			    write(*,*) 'abgearbeitet!'
			    write(*,*)
			    close(lunRead)
			    call exit
			endif
		    else
			gotFileNr = .true.
			fileNr = -ihelp+1
			if (fileNr.EQ.10000) fileNr=9900
		    endif
		    goto 10
		endif

20		if (listLength.EQ.0) then
		    write(*,*)  ' no file names found in inputList -> STOP'
		    call exit
		endif
		if (lastOne.EQ.0) lastOne=listLength+1


c den Namen des fuer diese Simulation zu verwendenden input-files einlesen:

		rewind(lunRead)
		do k = 1, lastOne-2
		    read(lunRead,*)
		enddo
		read(lunRead,'(A)') inputName


c die Nummer des jetzt verwendeten input-files sowie (falls schon bekannt) die
c (negative) fileNr der Ausgabefile ausgeben:

		! bis Listenende weiterblaettern:
		do k = lastOne, listLength
		    read(lunRead,*)
		enddo
		write(lunRead,*) lastOne-1
		if (gotFileNr) write(lunRead,*) -fileNr
		close(lunRead)


c gegebenenfalls schon den Namen der Ausgabe-files definieren:

		if (gotFileNr) then
		    if (fileNr.GE.9900) then
			TestRun_ = .true.
		    else
			TestRun_ = .false.
		    endif
		    write(filename(4:7),'(I4)')fileNr
		    if (fileNr.LE.999) write (filename(4:4),'(A1)') '0'
		    if (fileNr.LE. 99) write (filename(5:5),'(A1)') '0'
		    if (fileNr.LE.  9) write (filename(6:6),'(A1)') '0'
		endif


		write(*,'(xA,I3,A)')'Verwende',listLength-lastOne+2,
     +				'.letzte INPUT-Datei aus '''//inputListName//'.INPUT'': '
		write(*,*) inputName

		open(lunMessage,file='MU_'//inputListName//'.MESSAGE',defaultfile='SYS$SCRATCH:',
     +		      status='UNKNOWN',iostat=iostat)
		write(lunMessage,'(xx,I2)',iostat=iostat) lastOne-1


	    else

		open(lunMessage,file='MUTRACK.MESSAGE',defaultfile='SYS$SCRATCH:',
     +		      status='UNKNOWN',iostat=iostat)

	    endif

	    call date(datum)
	    call time(uhrzeit)
	    write(lunMessage,*,iostat=iostat) ' started on '//datum//' at '//uhrzeit
	    write(lunMessage,*,iostat=iostat) inputname
	    close(lunMessage,iostat=iostat)

     	endif


c-------------------------------------------------------------------------------

c Defaultwerte fuer Kammergeometrie (da diese Variablen in 'COM_KAMMER' gefuehrt
c werden anstatt in COM_MUTRACK werden sie hier initialisert):

	DreharmLaenge = 0.
	xBlende = -1.


c Einlesen der Eingabe-Datei 'MUTRACK.INPUT':

	open(lunREAD,file=inputName,defaultfile=readDir//':.INPUT',
     +	status='OLD',readonly)
	read(lunREAD,nml=parameter_liste)
	close(lunREAD)


c Einlesen der 'overwrite_default'-Datei:

	open(lunREAD,file='overwrite_defaults',defaultfile=readDir//':.INPUT',
     +  status='OLD',readonly,iostat=iostat)
	if (iostat.EQ.0) then
	    write(*,*) ' ##### READING INPUT FROM FILE  >> ''OVERWRITE_DEFAULTS.INPUT'' <<  #####'
	    read(lunREAD,nml=parameter_liste)
	    close(lunREAD)
	endif

	if (previousSimulation.EQ.0) E0InterFromFile = .false.

	TransTDFoil = TransTDFoil/100.	! Umrechnen von Prozent in absolute Angabe

	write(*,*)
	if (seed_.GT.0) then ! -> es wurde Startwert fuer seed vorgegeben
	    seed = seed_
	    write(*,*) '''seed_'' was specified in MUTRACK.INPUT  =>  not randomly thrown'
	    flag_message  = .true.
	    if (seed.LT.1e6) then
		write(*,*) '''seed'' has to be greater than 1E6'
		call exit
	    endif
	    if ((seed/2)*2.EQ.seed) then
		write(*,*) '''seed'' has to be an odd number          =>  seed -> seed + 1'
		seed = seed+1
	    endif
	endif
	write(*,*) ' seed = ',seed
	write(*,*)

	if (previousSimulation.EQ.1) then
	    use_ACCEL = .true.			! default = .false.
	elseif (previousSimulation.EQ.2) then
	    use_MUTRACK = .true.		! default = .false.
	    NTP_40mm = .false.
	endif

	if (NTP_Times) NTP_FoM2Only = .false.
	if (createFoilFile) then
	    if (.NOT.TriggerInBeam) then
		TriggerInBeam = .true.
		write(*,*) '''createFoilFile'' = .true. -> set ''TriggerInBeam'' to ''.true.'''
		flag_message  = .true.
	    endif
	    if (Use_Mutrack) then
		Use_Mutrack = .false.
		write(*,*) '''createFoilFile'' = .true. -> set ''Use_Mutrack'' to ''.false.'''
		flag_message = .true.
	    endif
	    if (Fo_triggered) then
		Fo_triggered = .false.
		write(*,*) '''createFoilFile'' = .true. -> set ''Fo_triggered'' to ''.false.'''
		flag_message = .true.
	    endif
	    upToTDFoilOnly = .true.
	    generate_FE   = .false.
	    M2_triggered  = .false.
	    xM2_triggered = .false.
	    NTP_s1xM2  = .false.
	    NTP_times  = .false.
	    NTP_FoM2Only = .false.
	    NTP_charge = .false.
	    NTP_Folie  = .false.
	elseif (.NOT.TriggerInBeam) then
	    Fo_triggered = .false.
	    upToTDFoilOnly = .false.
	    NTP_FoM2Only = .false.
	    smearS1Fo = .false.
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Aufbereiten von 'geo_filename':

	call str$upCase(geo_filename,geo_filename)
	if (geo_filename.EQ.'2') then
	    geo_filename = 'GEO_KAMMER_RUN2'
	elseif (geo_filename.EQ.'3'.OR.geo_filename.EQ.'4') then
	    geo_filename = 'GEO_KAMMER_RUN3-4'
	elseif (geo_filename.EQ.'6'.OR.geo_filename.EQ.'7'.OR.
     +	    geo_filename.EQ.'8') then
	    geo_filename = 'GEO_KAMMER_RUN6-8'
	elseif (geo_filename.EQ.'8L' .OR. geo_filename.EQ.'7L') then
	    geo_filename = 'GEO_KAMMER_RUN7_LONG'
	elseif (geo_filename.EQ.'9') then
	    geo_filename = 'GEO_KAMMER_RUN9'
	elseif (geo_filename.EQ.'9N') then
	    geo_filename = 'GEO_KAMMER_RUN9_NEW'
	elseif (geo_filename.EQ.'10') then
	    geo_filename = 'GEO_KAMMER_RUN10'
	elseif (geo_filename.EQ.'11') then
	    geo_filename = 'GEO_KAMMER_RUN11'
	endif


c gegebenfalls Abstand zwischen hinterem Triggergitter und Massegitter anpassen:

	if (index(geo_fileName,'_RUN9' ).NE.0 .OR.
     +	    index(geo_fileName,'_RUN10').NE.0) then
	    dx5 = 15					    ! Default: 8 mm
	endif


c 'GridInFrontOfFoil' gab es bis jetzt nur in Run 9:

	if (gridInFrontOfFoil .AND. index(geo_fileName,'_RUN9').EQ.0) then
	    write(*,*)
	    write(*,*) 'Ein Gitter vor der Triggerfolie gab es bis jetzt nur in Run9'
	    write(*,*) '    => setze ''gridInFrontOfFoil'' auf .false.!'
	    write(*,*)
	    gridInFrontOfFoil = .false.
	    flag_message = .true.
	endif


c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Uebertragen der Schleifenparameter in das Feld 'par':

	do k = 1, 3

	    par(k,UTgt)    = U_Tgt_   (k)
	    par(k,UGua)    = U_Gua_   (k)
	    par(k,UG1)     = U_G1_    (k)
	    par(k,UL1)     = U_L1_    (k)
	    par(k,USp)     = U_Sp_    (k)
	    par(k,UL2)     = U_L2_    (k)
	    par(k,UL3)     = U_L3_    (k)

	    par(k,UFolie)  = U_Folie_ (k)
	    par(k,UVorne)  = U_Vorne_ (k)
	    par(k,UHinten) = U_Hinten_(k)
	    par(k,UMCP3)   = U_MCP3_  (k)

	    par(k,UMCP2)   = U_MCP2_  (k)

	    par(k,BHelm)   = B_Helm_  (k)
	    par(k,BTD)     = B_TD_    (k)

	    par(k,alfTgt)  = alfaTgt_ (k)
	    par(k,alfSp)   = alfaSp_  (k)
	    par(k,alfTD)   = alfaTD_  (k)

	    par(k,mass)    = Masse_   (k)
	    par(k,charge)  = Ladung_  (k)
	    par(k,ener)    = E0_      (k)
	    par(k,yPos)    = y0_      (k)
	    par(k,zPos)    = z0_      (k)
	    par(k,thetAng) = theta0_  (k)
	    par(k,phiAng)  = phi0_    (k)

	    par(k,Thickn)  = Thickness_(k)
	    par(k,Eloss)   = mean_Eloss_(k)

	    par(k,DeltaL1) = DeltaL1_(k)
	    par(k,DeltaL2) = DeltaL2_(k)

	enddo


c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
c Einlesen der zu verwendenden Kammergeometrie (falls Use_MUTRACK oder Use_ACCEL
c gesetzt ist wird weiter unten ein Teil der Kammergeometrie nochmal ueber-
c schrieben):

	open(lunREAD,file=geo_fileName,
     +    defaultfile=geoDIR//':.INPUT',status='OLD',readonly)
	read(lunREAD,nml=kammer_geo)
	rewind (lunREAD)
	call READ_TRIGGER_GEO	    ! Drahtdurchmesser und -abstaende einlesen
	close(lunREAD)
	if (TriggerInBeam .AND. mappenName_Fo.EQ.' ') then
	    write(*,*)
	    write(*,*) ' Im Geo_file '
	    write(*,*)
	    write(*,*) '        '//geo_fileName
	    write(*,*)
	    write(*,*) ' ist kein Name fuer die Potentialmappe der Folie angegeben!'
	    write(*,*) ' => bei dieser Kammergeometrie ist offensichtlich kein Triggerdetektor vorgesehen.'
	    write(*,*) ' => ''TriggerInBeam'' auf ''.false.'' gesetzt'
	    TriggerInBeam = .false.
	    if (createFoilFile) then
		createFoilFile = .false.
		write(*,*) '    -> set ''createFoilFile'' to ''.false.'''
	    endif
	    flag_message = .true.
	endif


c falls .NOT.use_MUTRACK:
c pruefe an dieser Stelle, ob mit die Kammergeometrie die Linse 2 beinhaltet.
c Falls ja, lege den Winkel des Triggerdetektors auf Null fest. Ansonsten
c setze die Spannung an Linse 2 auf konstant Null:
c (im Falle von 'use_MUTRACK' wurden diese Aktionen gegebenenfalls ja schon beim
c Erstellen des 'foilFiles' durchgefuehrt)

	if (.NOT.use_MUTRACK) then
	    if (mappenName_L2andFo.NE.' ') then
		! => Linse 2 montiert
		lense2 = .true.
		! => gemeinsame Mappe fuer Linse 2 und TD-Folie
		! => TD-Winkel kann nicht variiert werden:
		if (alfaTD_(1).NE.0 .OR. (alfaTD_(2).NE.0 .AND. alfaTD_(2).NE.+1.e10)) then
		    write(*,*)
		    write(*,*) ' with lense 2 mounted the angle of the trigger detector is not variable'
		    write(*,*) '    -> set alfaTD_ == 0.'
		    write(*,*)
		    par(1,alfTD) = 0.
		    par(2,alfTD) = 0.
		    flag_message = .true.
		endif
	    else
		par(1,UL2) = 0.
		par(2,UL2) = 0.
	    endif
	endif
	
	    
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Einlesen der INFO-Files der Feldmappen (und Setzen einiger Variabler mit
c mappenspezifischen Positionsangaben):

	call read_INFOs

	if (.NOT.(upToTDFoilOnly .OR. createFoilFile) .AND.
     +			   radius_MCP2.LT.radius_MCP2active) then
	    write(*,*)
	    write(*,*) 'radius of MCP2			  = ',radius_MCP2
	    write(*,*) 'radius of the active area of MCP2 = ',radius_MCP2active
	    write(*,*) 'radius_MCP2active has to be .LE. radiusMCP2!!'
	    write(*,*)
	    call exit
	endif

	if (lense2) then
	    ! pruefen, ob die Angaben des Geometriefiles mit den Vorgaben
	    ! der 'L2andFo'-Mappe kompatibel ist (Mappenende muss mit Folien-
	    ! ebene zusammenfallen):
	    ! (bei 'use_MUTRACK' ist 'lense2' gegebenenfalls an dieser Stelle
	    ! noch nicht gesetzt!)
	    ! ?: Auch noch pruefen, ob Mappenbeginn mit Spiegelmappe ueberlappt
	    if (xLeaveMap_L2andFo .NE. xTD-d_Folie_Achse) then
		write(*,*) 'Angaben des Geometriefiles sind nicht kompatibel mit den Vorgaben aus'
		write(*,*) mappenName_L2andFo
		write(*,*) '  Mappenende bei             ',xLeaveMap_L2andFo
		write(*,*) '  Ebene der Triggerfolie bei ',xTD-d_Folie_Achse
		call exit
	    endif
	endif

	! Umrechenen der Blendenposition von 'relativ zum MCP2' in
	! absoluten x-Wert:
	xBlende = xMCP2-xBlende
	if (xBlende.LT.xEnterMap_M2.OR.xBlende.GT.xMCP2) then
	    if (xBlende.GT.0..AND.xBlende.LE.xMCP2) then
		write(*,*) 'Beginn der MCP2-Mappe: x = ',xEnterMap_M2
		write(*,*) 'Position der Blende:   x = ',xBlende
		write(*,*) '=> Blende liegt vor der Mappe => wird ignoriert!'
		flag_message = .true.
	    endif
	    xBlende=-1.
	endif

c===============================================================================
c fuer 'fromScratch','Use_ACCEL' und 'Use_MUTRACK' separate Abschnitte:
c===============================================================================

	if (Use_ACCEL.OR.Use_MUTRACK) fromScratch = .false.

	if (fromScratch) then		! 1: if ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

c Umrechnen der eingelesenen xGrid1- und xGrid2-Werte von Angaben relativ zur
c Moderatorfolie in Angaben relativ zur Kryoachse:

	    xGrid1 = xGrid1 + xTarget
	    xGrid2 = xGrid2 + xTarget

c Falls die Anzahl zufallsverteilter Starts <= 0 sein sollte, vergiss die
c Zufallsstarts:

	    if (randomStarts.LE.0) then
		random_energy   = 0
		random_position = 0
		random_winkel   = 0
	    endif


	elseif (Use_ACCEL) then		! 1: elseif ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

c Spezielle Anweisungen fuer den Fall, dass ACCEL-Simulationen der Trajektorien
c im Beschleuniger als Ausgangspunkt fuer die MUTRACK-Simulationen verwendet
c werden sollen:

c - Oeffnen des INFO-Files:

	    open(lunREAD,file=fileName_ACCEL,defaultfile=ACCEL_Dir//':.INFO',
     +	    status='OLD',readonly)

c - Festlegen von AccelVersionIndx:

	    read(lunREAD,nml=acVersion,iostat=iostat)
	    rewind(lunREAD)
	    if (iostat.NE.0) then
		accelVersion = '1.0.?'
		AccelVersionIndx = 0
	    else
		length = len(accelVersion)
		pos1 = index(accelVersion,'.')
		pos2 = pos1 + index(accelVersion(pos1+1:length),'.')
		read(accelVersion(     1:pos1-1),*) Version1
		read(accelVersion(pos1+1:pos2-1),*) Version2
		read(accelVersion(pos2+1:length),*) Version3

		k = 10000*Version1 + 100*Version2 + Version3
		if (k.LT.010101) then
		    AccelVersionIndx = 0
		elseif (k.LT.10201) then
		    ! Versionen ohne Magnetfelder
		    AccelVersionIndx = 1
		else
		    AccelVersionIndx = 2
		endif	
	    endif

	    if (AccelVersionIndx.EQ.0) then
		write(*,*)
		write(*,*) fileName_ACCEL
		write(*,*)
		write(*,*) 'Die Simulation wurde mit ACCEL-Version < 1.1.1 erstellt.'
		write(*,*) 'Diese ACCEL-Versionen mit unformatiertem Ausgabefile'
		write(*,*) 'anstelle von NTupeln werden seit MUTRACK-Version 1.5.1'
		write(*,*) 'nicht mehr unterstuetzt!'
		write(*,*)
		call exit
	    endif

c - Einlesen der Parametereinstellungen waehrend ACCEL: 
c   Um die allgemeinen Parametereinstellungen zu haben, mit denen die ACCEL-
c   simulationen durchgefuehrt wurden, wird das Namelist /parameter_liste/
c   eingelesen. Dieses enthaelt aber bei den .INFO files im Gegensatz zu der
c   gleichnamigen Namelist der Eingabefiles fuer MUTRACK und ACCEL nicht die
c   Angaben fuer die 'Schleifenparameter', welche statt dessen in einem eigenen
c   Namelist 'loop_params' abgelegt sind. Dieses wird hier nur eingelesen,
c   falls fuer die Schleifenparameter (zumindest teilweise) die Einstellungen
c   waehrend der ACCEL-Simulation uebernommen werden sollen (-> logical
c   'previousSettings'). Ansonsten wird die Information aus /loop_params/
c   in der Subroutine 'getPreviousSettings' gelesen und ausgewertet. Entsprechendes
c   gilt fuer 'artList'.

	    read(lunREAD,nml=parameter_liste)
	    rewind(lunREAD)
	    !  fuer Kompatibilitaet mit frueheren Versionen, bei denen statt
	    !  der Extension '_prevSim' noch die Extension '_AH' verwendet wurde:
	    if (useDecay_AH) useDecay_prevSim = .true.
	    if (artList_AH.NE.' ') artlist_prevSim = artList_AH
	    if (randomStarts_AH.NE.-1E8) randomStarts_prevSim = randomStarts_AH

	    if (previousSettings) then

c -- Resetten der Parameterliste:

		do k = 1, 3
		    U_Tgt_(k)	   = defVal(k)
		    U_Gua_(k)	   = defVal(k)
		    U_G1_(k)	   = defVal(k)
		    B_Helm_(k)	   = defVal(k)
		    B_TD_(k)	   = defVal(k)
		    Masse_(k)	   = defVal(k)
		    Ladung_(k)	   = defVal(k)
		    E0_(k)	   = defVal(k)
		    y0_(k)	   = defVal(k)
		    z0_(k)	   = defVal(k)
		    theta0_(k)	   = defVal(k)
		    phi0_(k)	   = defVal(k)
		enddo
		U_Gua_(1)  = -1.e10
		Masse_(1)  = 105659.
		Ladung_(1) = 1.

c -- Einlesen der Schleifensettings waehrend ACCEL:

		read(lunREAD,nml=loop_params)
		rewind (lunREAD)

c -- Uebernehmen der geforderten Parameter:

		if (artList_prevSim.NE.' ') then
		    ow_masse  = ow_artList
		    ow_Ladung = ow_artList
		else
		    ow_artList = .false.
		endif
		if (.NOT.ow_artList) artList = artList_prevSim
		do k = 1, 3
		    if (.NOT.ow_U_Tgt)  par(k,UTgt)    = U_Tgt_   (k)
		    if (.NOT.ow_U_Gua)  par(k,UGua)    = U_Gua_   (k)
		    if (.NOT.ow_U_G1)   par(k,UG1)     = U_G1_    (k)
		    if (.NOT.ow_B_Helm) par(k,BHelm)   = B_Helm_  (k)
		    if (.NOT.ow_B_TD)   par(k,BTD)     = B_TD_    (k)
		    if (.NOT.ow_Masse)  par(k,mass)    = Masse_   (k)
		    if (.NOT.ow_Ladung) par(k,charge)  = Ladung_  (k)
		    if (.NOT.ow_E0)     par(k,ener)    = E0_      (k)
		    if (.NOT.ow_y0)     par(k,yPos)    = y0_      (k)
		    if (.NOT.ow_z0)     par(k,zPos)    = z0_      (k)
		    if (.NOT.ow_theta0) par(k,thetAng) = theta0_  (k)
		    if (.NOT.ow_phi0)   par(k,phiAng)  = phi0_    (k)
		enddo
	    endif

c -- Auswerten der Vorgabe:

	    call examine_artList
	    call getPreviousSettings
	    rewind (lunREAD)

c - Einlesen der Targetgeometrie aus dem INFO-file:

	    call read_ACCEL_geometry
	    rLNShield = rLNShield*scaleFactor

c - gegebenenfalls E0-Intervalle einlesen:

	    if (E0InterFromFile) then
		rewind (lunREAD)
		zeile = ' '
		do while (index(zeile,'BOUNDARIES OF E0-INTERVALLS').EQ.0)
		    read (lunREAD,'(A)') zeile
		    call str$upcase(zeile,zeile)
		enddo
		do k = 1, nint(E0_(2))+1
		    read (lunREAD,*) E0Low(k)
		enddo
		do k = 1, nint(E0_(2))
      		    write(*,'(x,A,I4,A,F6.3,A,F6.3,A)') 'E0-intervall',k,':  [',E0Low(k),',',E0Low(k+1),']'
		enddo
	    endif

	    close(lunREAD)

c - Anzahl der Zufallsstarts setzen:

	    if (randomStarts.LT.0 .OR. randomStarts.GT.randomStarts_prevSim) then
		randomStarts = randomStarts_prevSim
	    endif


	else  ! => Use_MUTRACK		! 1: else ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

c Spezielle Anweisungen fuer den Fall, dass fruehere MUTRACK-Simulationen bis
c zur Triggerfolie als Ausgangspunkt fuer weitere Simulationen eingelesen werden
c sollen:
c (wurde die fruehere MUTRACK-Simulation mit 'Use_ACCEL' erstellt, so wird auch
c jetzt beim Einlesen des INFO-files 'Use_ACCEL' wieder auf '.true.' gesetzt.
c Dies geschieht, um beim Erstellen des LOG-files die entsprechenden Informa-
c tionen zur Verfuegung zu haben. Nach dem Erstellen des LOG-Files wird
c 'Use_ACCEL' dann wieder negiert).

c - Oeffnen des INFO-Files:

	    open(lunREAD,file=fileName_MUTRACK,defaultfile=outDir//':.INFO',
     +	    status='OLD',readonly)

c - Festlegen von MutrackVersionIndx:

	    read(lunREAD,nml=muVersion)
	    rewind(lunREAD)
	    length = len(mutrackVersion)
	    pos1 = index(mutrackVersion,'.')
	    pos2 = pos1 + index(mutrackVersion(pos1+1:length),'.')
	    read(MutrackVersion(     1:pos1-1),*) Version1
	    read(MutrackVersion(pos1+1:pos2-1),*) Version2
	    read(MutrackVersion(pos2+1:length),*) Version3
	    k = 10000*Version1 + 100*Version2 + Version3
	    if (k.LT.010501) then
		! Versionen ohne Linse 2 und ohne Magnetfelder
		MutrackVersionIndx = 1
	    else
		MutrackVersionIndx = 2
	    endif

c - Einlesen der zugehoerigen Kammer-Geometrie aus dem INFO-file:

	    mappenName_L2andFo = ' '
	    read(lunRead,nml=kammer_geo)
	    rewind (lunREAD)
	    if (mappenName_L2andFo.NE.' ') then
		! => Linse 2 montiert
		lense2 = .true.
		! => gemeinsame Mappe fuer Linse 2 und TD-Folie
		! => TD-Winkel kann nicht variiert werden:
		if (ow_alfaTD .AND. 
     +   (alfaTD_(1).NE.0 .OR. (alfaTD_(2).NE.0 .AND. alfaTD_(2).NE.+1.e10))) then
		    write(*,*)
		    write(*,*) ' with lense 2 mounted the angle of the trigger detector is not variable'
		    write(*,*) '    -> set alfaTD_ == 0.'
		    write(*,*)
		    par(alfTD,1) = 0.
		    par(alfTD,2) = 0.
		    flag_message = .true.
		endif
		! Geometriedaten aus INFO-file der Mappe einlesen, um sie
		! gegebenenfalls fuer Ausgabe parat zu haben:
		if (write_geo) CALL READ_INFO_L2andFo
	    else
		par(1,UL2) = 0.
		par(2,UL2) = 0.
	    endif

c - Einlesen der Parametereinstellungen waehrend Erstellung des 'foilFiles'
c   (bis auf die Schleifenparameter. Siehe Bemerkung zu entsprechendem Abschnitt
c   bei Use_ACCEL):

	    read(lunREAD,nml=parameter_liste)
	    rewind(lunREAD)
	    !  fuer Kompatibilitaet mit frueheren Versionen, bei denen statt
	    !  der Extension '_prevSim' noch die Extension '_AH' verwendet wurde:
	    if (useDecay_AH) useDecay_prevSim = .true.
	    if (artList_AH.NE.' ') artlist_prevSim = artList_AH
	    if (randomStarts_AH.NE.-1E8) randomStarts_prevSim = randomStarts_AH

	    if (previousSettings) then

c -- Resetten der Parameterliste:

		do k = 1, 3
		    U_Tgt_(k)	   = defVal(k)
		    U_Gua_(k)	   = defVal(k)
		    U_G1_(k)	   = defVal(k)
		    U_L1_(k)	   = defVal(k)
		    U_Sp_(k)	   = defVal(k)
		    U_L2_(k)	   = defVal(k)
		    U_Folie_(k)    = defVal(k)
		    B_Helm_(k)	   = defVal(k)
		    B_TD_(k)	   = defVal(k)
		    alfaTgt_(k)    = defVal(k)
		    alfaSp_(k)	   = defVal(k)
		    alfaTD_(k)	   = defVal(k)
		    Masse_(k)	   = defVal(k)
		    Ladung_(k)	   = defVal(k)
		    E0_(k)	   = defVal(k)
		    y0_(k)	   = defVal(k)
		    z0_(k)	   = defVal(k)
		    theta0_(k)	   = defVal(k)
		    phi0_(k)	   = defVal(k)
		    deltaL1_(k)    = defVal(k)
		enddo
		U_Gua_(1)  = -1.e10
		alfaSp_(1) = 45.
		Masse_(1)  = 105659.
		Ladung_(1) = 1.

c -- Einlesen der Schleifensettings waehrend der Erstellung des 'foilFiles':

		read(lunREAD,nml=loop_params)
		rewind (lunREAD)

		! fuer Kompatibilitaet mit aelteren foilFile-Versionen:
		if (U_KL_(1).NE.-1.e10) then
		    do k = 1, 3
			U_L1_(k) = U_KL_(k)
		    enddo
		endif

c -- Uebernehmen der geforderten Parameter:

		if (artList_prevSim.NE.' ') then
		    ow_masse  = ow_artList
		    ow_Ladung = ow_artList
		else
		    ow_artList = .false.
		endif
		if (.NOT.ow_artList) artList = artList_prevSim
		do k = 1, 3
		    if (.NOT.ow_U_Tgt)   par(k,UTgt)    = U_Tgt_   (k)
		    if (.NOT.ow_U_Gua)   par(k,UGua)    = U_Gua_   (k)
		    if (.NOT.ow_U_G1)    par(k,UG1)     = U_G1_    (k)
		    if (.NOT.ow_U_L1)    par(k,UL1)     = U_L1_    (k)
		    if (.NOT.ow_U_Sp)    par(k,USp)     = U_Sp_    (k)
		    if (.NOT.ow_U_L2)    par(k,UL2)     = U_L2_    (k)
		    if (.NOT.ow_U_Folie) par(k,UFolie)  = U_Folie_ (k)
		    if (.NOT.ow_B_Helm)  par(k,BHelm)   = B_Helm_  (k)
		    if (.NOT.ow_B_TD)    par(k,BTD)     = B_TD_    (k)
		    if (.NOT.ow_alfaTgt) par(k,alfTgt)  = alfaTgt_ (k)
		    if (.NOT.ow_alfaSp ) par(k,alfSp)   = alfaSp_  (k)
		    if (.NOT.ow_alfaTD ) par(k,alfTD)   = alfaTD_  (k)
		    if (.NOT.ow_Masse)   par(k,mass)    = Masse_   (k)
		    if (.NOT.ow_Ladung)  par(k,charge)  = Ladung_  (k)
		    if (.NOT.ow_E0)	 par(k,ener)    = E0_      (k)
		    if (.NOT.ow_y0)	 par(k,yPos)    = y0_      (k)
		    if (.NOT.ow_z0)	 par(k,zPos)    = z0_      (k)
		    if (.NOT.ow_theta0)  par(k,thetAng) = theta0_  (k)
		    if (.NOT.ow_phi0)    par(k,phiAng)  = phi0_    (k)
		    if (.NOT.ow_deltaL1) par(k,deltaL1) = deltaL1_ (k)
		enddo
	    endif

c -- Auswerten der Vorgabe:

	    call examine_artList
	    call getPreviousSettings	! liesst auch noch von 'lunREAD'

c - gegebenenfalls E0-Intervalle einlesen:

	    if (E0InterFromFile) then
		rewind (lunREAD)
		zeile = ' '
		do while (index(zeile,'BOUNDARIES OF E0-INTERVALLS').EQ.0)
		    read (lunREAD,'(A)') zeile
		    call str$upcase(zeile,zeile)
		enddo
		do k = 1, nint(E0_(2))+1
		    read (lunREAD,*) E0Low(k)
		enddo
		do k = 1, nint(E0_(2))
      		    write(*,'(x,A,I4,A,F6.3,A,F6.3,A)') 'E0-intervall',k,':  [',E0Low(k),',',E0Low(k+1),']'
		enddo
	    endif

	    close(lunREAD)

c - damit, falls das 'Foilfile' selbst auf einer ACCEL-Simulation beruht,
c   die zugehoerige Targetgeometrie aus dem ACCEL-INFO-File gelesen wird
c   (use_ACCEL wird im Hauptprogramm dann wieder resettet):

	    if (previousSimulation.EQ.1) Use_ACCEL=.true.

c - Anzahl der Zufallsstarts setzen:

	    if (randomStarts.LT.0 .OR. randomStarts.GT.randomStarts_prevSim) then
		randomStarts = randomStarts_prevSim
	    endif

	endif				! 1: endif ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


c===============================================================================
c Ab hier wieder fuer 'fromScratch', 'Use_ACCEL' und 'Use_MUTRACK' gemeinsam
c===============================================================================

c Startgebiet und -Koordinate festlegen:

	if (StartFlaeche.EQ.-1) then
	    if (Kammerteil.LE.1) then
		if (x0_.LE.0) then
		    x0_ = 0.
		    Startflaeche = 0
		    Gebiet0 = target
		elseif (x0_.LE.xGrid1) then
		    Gebiet0 = upToGrid1
		    if (x0_.EQ.xGrid1) Startflaeche = 1
		elseif (x0_.LE.xGrid2) then
		    Gebiet0 = upToGrid2
		elseif (x0_.LE.rHeShield) then
		    Gebiet0 = upToHeShield
		elseif (x0_.LE.rLNShield) then
		    Gebiet0 = upToLNShield
		elseif (x0_.LE.xEnterMap_L1) then
		    Gebiet0 = upToL1Map
		elseif (x0_.LE.xLeaveMap_L1) then
		    Gebiet0 = upToExL1
		else
		    Gebiet0 = upToEnSp
		endif
	    else
		if (x0_.LE.xEnterMap_L3) then
		    if (lense2) then
			if (x0_.LE.xEnterMap_L2andFo) then
			    Gebiet0 = upToL2andFoMap
			elseif (x0_.LE.xEndLense_L2) then
			    Gebiet0 = upToExL2
			elseif (x0_.LE.xLeaveMap_L2andFo) then
			    Gebiet0 = upToEnTD
			endif
		    elseif (TriggerInBeam) then
			Gebiet0 = upToEnTD
		    else
			Gebiet0 = upToL3Map
		    endif
		elseif (x0_.LE.xEnterMap_L3) then
		    Gebiet0 = upToL3Map
		elseif (x0_.LE.xLeaveMap_L3) then
		    Gebiet0 = upToExL3
		elseif (x0_.LE.xEnterMap_M2) then
		    Gebiet0 = upToM2Map
		else
		    Gebiet0 = upToMCP2
		endif
	    endif
	    x0(1) = x0_
	elseif (StartFlaeche.EQ.1) then
	    Gebiet0 = upToGrid2
	    x0(1)   = xGrid1
	elseif (StartFlaeche.EQ.2) then
	    TriggerInBeam = .true.
	    Gebiet0 = upToExTD
	    log_alpha0_KS = .true.       
	    x0(1)   = 0.
	elseif (StartFlaeche.EQ.3) then
	    TriggerInBeam = .true.
	    Gebiet0 = upToExTD 
	    x0(1)   = 0.
	else
	    Startflaeche = 0
	    Gebiet0 = target
	    x0(1)   = xtarget
	endif

	if (Gebiet0.GT.upToExTD) then
	    if (createFoilFile.OR.generate_FE.OR.upToTDFoilOnly) then
		write(*,*)' ''Gebiet0.GT.upToExTD'''
		if (createFoilFile) then
		    createFoilFile = .false.
		    write(*,*) '    -> set ''createFoilFile'' to ''.false.'''
		endif
		if (generate_FE) then
		    generate_FE = .false.
		    write(*,*) '    -> set ''generate_FE'' to ''.false.'''
		endif
		if (upToTDFoilOnly) then
		    upToTDFoilOnly = .false.
		    write(*,*) '    -> set ''upToTDFoilOnly'' to ''.false.'''
		endif
		flag_message = .true.
	    endif
	endif
	if (Gebiet0.GT.upToLnShield) NTP_40mm = .false.


c Zufallsverteilung fuer Startenergie?

    	if (random_energy.GE.1 .AND. random_energy.LE.2) then
	    random_E0 = .true.

	    if (random_energy.EQ.1 .AND..NOT.(lowerE0.EQ.0..AND.upperE0.EQ.0.)) then
		if (lowerE0.GT.upperE0) then
		    help = lowerE0
		    lowerE0 = upperE0
		    upperE0 = help
		endif
		random_E0_equal = .true.

      	    elseif (random_energy.EQ.2 .AND..NOT.(sigmaE0.EQ.0.)) then
      		random_E0_gauss = .true.

	    else
		random_E0 = .false.
    	    endif

	elseif (random_energy.NE.0) then
	    write(*,*)
	    write(*,*) 'random_energy = ',random_energy,' is not defined'
	    write(*,*)
	    call exit
	endif

	if (.NOT.random_E0 .AND. par(1,ener).EQ.0. .AND. par(2,ener).EQ.0.) then
	    do k = 1, 3
		par(k,phiAng) = 0.
		par(k,ThetAng) = 0.
	    enddo
	endif


c Zufallsverteilung fuer Startpositionen?

	if (random_position.GE.1 .AND. random_position. LE.4) then
	    random_pos = .true.
	    ! setze gegebenenfalls Defaultwerte ein:
	    if (startBreite.LT.0.) startBreite = dyTarget
	    if (startHoehe .LT.0.) startHoehe  = dzTarget
	    if (startRadius.LT.0.) startRadius = 20.
	    sigmaPosition = abs(sigmaPosition)

	    if (random_position.EQ.1 .AND.
     +		       .NOT.(StartBreite.EQ.0 .AND. StartHoehe.EQ.0)) then
		random_y0z0_equal = .true.

	    elseif (random_position.EQ.2 .AND. .NOT.StartRadius.EQ.0) then
		random_r0_equal = .true.

	    elseif (random_position.EQ.3 .AND. .NOT.sigmaPosition.EQ.0.
     +		.AND. .NOT.(StartBreite.EQ.0 .AND. StartHoehe.EQ.0)) then
		random_y0z0_Gauss = .true.

	    elseif (random_position.EQ.4 .AND. .NOT.StartRadius.EQ.0.
     +		 .AND. .NOT.sigmaPosition.EQ.0.) then
		random_r0_Gauss = .true.

	    else
		random_pos = .false.
    	    endif
	elseif (random_position.NE.0) then
	    write(*,*)
	    write(*,*) 'random_position = ',random_position,' is not defined'
	    write(*,*)
	    call exit
    	endif


c Zufallsverteilung fuer Startwinkel?
	
	if (random_winkel.GE.1 .AND. random_winkel.LE.2) then
	    random_angle = .true.
	    if (random_winkel.EQ.1) then
		random_lambert = .true.
	    elseif (random_winkel.EQ.2  .AND. .NOT.sigmaWinkel.EQ.0.) then
      		random_gauss = .true.
	    else
		random_angle = .false.
    	    endif
	elseif (random_winkel.NE.0) then
	    write(*,*)
	    write(*,*) 'random_winkel = ',random_winkel,' is not defined'
	    write(*,*)
	    call exit
	endif


c Durchlaufzahl fuer die 'Zufallsschleife' setzen:

	if (random_E0.OR.random_pos.OR.random_angle) then
	    par(2,0) = randomStarts	    ! (Default = 1)
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Falls der Trigger nicht im Strahlweg haengt sollen die Triggerschleifen
c nicht unnoetig durchlaufen werden. Ausserdem fallen dann auch Energieverlust
c und Aufstreuung in der Folie weg. Auch muessen keine Folienelektronen
c generiert werden:

	if (.NOT.TriggerInBeam) then
	    do k = 1, 3
		par(k,UFolie) = 0.
		par(k,UVorne) = 0.
		par(k,UHinten)= 0.
		par(k,UMCP3)  = 0.
		par(k,alfTD)  = 0.
 		par(k,Eloss)  = 0.
		par(k,Thickn) = 0.
	    enddo
	    n_E_Verlust    = 0
	    n_aufstreu     = 0
	    log_neutralize = .false.
	    ntp_folie      = .false.
	    Fo_triggered   = .false.
	    upToTDFoilOnly = .false.
	    generate_FE    = .false.
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c wurde die Variable 'artList' nicht gesetzt, setze 'UseDecay' und
c 'log_neutralize' auf .false. (steht wegen 'log_neutralize' an dieser Stelle)

	if (fromScratch) call examine_artList
	if (.NOT.artList_defined) then
	    if (UseDecay) then
		UseDecay = .false.
		write(*,1000) 'Myonen-Zerfall nur bei Verwendung von '//
     +	      '''ArtList''','UseDecay = .false. gesetzt'
		flag_message = .true.
	    endif
	    if (log_neutralize) then
		log_neutralize = .false.
		write(*,1000) 'Neutralisierung nur bei Verwendung von '//
     +	      '''ArtList''','log_neutralize = .false. gesetzt'
		flag_message = .true.
	    endif
	endif
	if (.NOT.UseDecay) NTP_lifeTime = .false.

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
                                                                                
c falls nur bis zur Triggerfolie gerechnet werden soll: Streiche Erstellung
c aller Tabellen, Statistiken und NTupel-Eintraege die bis dahin nicht
c gefuellt werden. Setze Spannung an L3 und MCP2 auf 0. Negiere alle Aktionen,
c die erst danach stattfaenden. ('upToTDFoilOnly' ist auch gesetzt bei
c 'createFoilFile'):

	if (upToTDFoilOnly) then
	    n_E_Verlust = 0
	    n_Aufstreu = 0
      	    log_neutralize = .false.
	    xM2_triggered = .false.
	    M2_triggered  = .false.
	    do k = 1, 3
		par(k,UL3)	= 0.
		par(k,UMCP2)	= 0.
		par(k,deltaL2)  = 0.
		par(k,Thickn) = 0.
		par(k,Eloss)  = 0.
	    enddo
	    if (.NOT.generate_FE) then
		do k = 1, 3
		    par(k,UVorne)   = 0.
		    par(k,UHinten)  = 0.
		    par(k,UMCP3)    = 0.
		enddo
	    endif

	    NTP_S1xM2 = .false.
	    NTP_FoM2Only = .false.
	    NTP_Folie = .false.
	    NTP_charge= .false.

	    SUM_S1xM2 = .false.
	    SUM_S1M2  = .false.
	    SUM_FoM2  = .false.
	    SUM_M3M2  = .false.
	    SUM_y_M2  = .false.
	    SUM_z_M2  = .false.
	    SUM_r_M2  = .false.
	    SUM_y_xM2 = .false.
	    SUM_z_xM2 = .false.
	    SUM_r_xM2 = .false.

	    PHY_S1xM2 = .false.
	    PHY_S1M2  = .false.
	    PHY_FoM2  = .false.
	    PHY_M3M2  = .false.
	    PHY_y_M2  = .false.
	    PHY_z_M2  = .false.
	    PHY_r_M2  = .false.
	    PHY_y_xM2 = .false.
	    PHY_z_xM2 = .false.
	    PHY_r_xM2 = .false.

	    TAB_S1xM2 = .false.
	    TAB_S1M2  = .false.
	    TAB_FoM2  = .false.
	    TAB_M3M2  = .false.
	    TAB_y_M2  = .false.
	    TAB_z_M2  = .false.
	    TAB_r_M2  = .false.
	    TAB_y_xM2 = .false.
	    TAB_z_xM2 = .false.
	    TAB_r_xM2 = .false.
	endif	    


c falls der Triggerdetektor im Strahl haengt: nimm entsprechende Einstellungen
c fuer Energieverlust, Aufstreuung und Neutralisierung vor. Andernfalls:
c streiche alle Statistiken und Tabellen, die auf ihm beruhen.

	if (TriggerInBeam) then
	    !c Energie-Verlust in der Triggerfolie beruecksichtigen?
    	    if (abs(n_E_Verlust).GE.1 .AND. abs(n_E_Verlust).LE.5) then
		log_E_Verlust = .true.

    		if (n_E_Verlust.LT.0) then
		    log_E_Verlust_defined = .true.
		    if (par(1,Eloss).LT.0) then
			write(*,*)
			write(*,*)'mittlerer E-Verlust muss positiv sein'
			write(*,*)
			call exit
		    endif
		else
		    log_E_Verlust_ICRU = .true.
		    do k = 1, 3
			par(k,Eloss) = 0.
		    enddo
		endif

		n_E_verlust = ABS(n_E_verlust)

		if (n_E_verlust.EQ.1) then
		    ! scharfer Energieverlust, also keine Aufstreuung
		elseif (n_E_verlust.EQ.2 .AND. sigmaE.NE.0.) then
		    log_E_Straggling_sigma = .true.
		    sigmaE = abs(sigmaE)
    		elseif (n_E_verlust.EQ.3 .AND. .NOT.(lowerE.EQ.0.AND.upperE.EQ.0)) then
		    log_E_Straggling_equal = .true.
		    if (lowerE.GT.upperE) then
			help = lowerE
			lowerE = upperE
			upperE = help
		    endif
		elseif (n_E_verlust.EQ.4) then
		    log_E_Straggling_Lindhard = .true.
		elseif (n_E_verlust.EQ.5) then
		    log_E_Straggling_Yang = .true.
    		endif

	    elseif (n_E_Verlust.NE.0) then
		write(*,*)
		write(*,*) 'n_E_Verlust = ',n_E_Verlust,' is not defined'
		write(*,*)
		call exit
	    else		! -> n_E_Verlust = 0
		do k = 1, 3
		    par(k,Eloss)  = 0.
		enddo
	    endif

	    ! Falls Berechnung des mittleren Energieverlustes aus ICRU-Tabelle:
	    ! Falls die Teilchen nicht vom Moderator oder vom 1. Gitter starten,
	    ! berchne den mittleren Energieverlust fuer jedes Teilchen neu.
	    ! Sonst: Wenn der mittlere Energieverlust nicht aus ICRU Tabelle
	    ! berechnet werden soll oder alle Teilchen (einer Schleife) die
	    ! exakt gleiche Startenergie haben, streiche 'calculate_each':
	    if (log_E_Verlust_ICRU.AND.random_E0 .AND.
     +		(Startflaeche.NE.0 .AND. Startflaeche.NE.1)) then
		calculate_each = .true.
	    elseif (.NOT.(log_E_Verlust_ICRU.AND.random_E0)) then
		calculate_each = .false.
	    endif

	    ! Aufstreuung in der Folie beruecksichtigen?
	    if (n_aufstreu.GE.1 .AND. n_aufstreu.LE.3) then
		log_aufstreu = .true.
    		if (n_aufstreu.EQ.1) then
		    log_aufstreu_fixed = .true.
		    if (sigmaAufstreu.EQ.0.) then
			log_aufstreu  = .false.
		    elseif (sigmaAufstreu.LT.0) then
			write(*,1000) '''sigmaAufstreu.LT.0''','verwende Absolutbetrag'
			flag_message = .true.
			sigmaAufstreu = abs(sigmaAufstreu)
		    endif
		elseif (n_Aufstreu.EQ.2) then
		    log_Meyer_Gauss = .true.
		elseif (n_Aufstreu.EQ.3) then
		    log_Meyer_F_Function = .true.
	        endif
	    elseif (n_Aufstreu.NE.0) then
		write(*,*)
		write(*,*) 'n_Aufstreu = ',n_Aufstreu,' is not defined'
		write(*,*)
		call exit
	    endif

	    ! Neutralisierung in der Folie beruecksichtigen?
	    if (log_neutralize) then
		do k = 1, artenMax
		    if ((neutral_fract(k).LT.0. .OR. neutral_fract(k).GT.100.)
     +				  .AND. neutral_fract(k).NE.-1) then
			write(*,*)
			write(*,*)'die neutralen Anteile '//
     +	'muessen zwischen 0 und 100 Prozent liegen!'
			write(*,*)'(''-1'' wird als Code fuer automatische '//
     +	'Berechnung gemaess M.Gonin akzeptiert)'
			write(*,*)
			call exit
		    endif
		enddo
	    endif
	endif

	if (.NOT.log_neutralize) ntp_charge = .false.


c Soll nun abgesehen von der Neutralisierung eine im Zusammenhang mit der
c Wechselwirkung der Teilchen mit der Triggerfolie auftretenden Groessen
c zufallsverteilt gewuerfelt werden, so uebernehme die Anzahl der je Schleife
c durchzufuehrender Starts, auch wenn die Startparameter selbst nicht gewuerfelt
c werden:

	if (log_E_Straggling_sigma .OR. log_E_Straggling_equal .OR.
     +      log_E_Straggling_Lindhard .OR. log_E_Straggling_Yang .OR.
     +      log_aufstreu) then
	    par(2,0) = randomStarts
	endif


c Pruefe, ob die Foliendicke falls noetig tatsaechlich groesser Null ist.
c Geht die Foliendicke nicht in die Berechnungen ein, setze sie auf Null.

	if (log_E_Verlust_ICRU .OR. log_Meyer_Gauss .OR. log_Meyer_F_Function
     +	  .OR. log_E_Straggling_Lindhard .OR. log_E_Straggling_Yang) then
	    if (par(1,Thickn).LE.0 .OR. par(2,Thickn).LE.0) then
		write(*,*)
		if (log_E_Verlust_ICRU) then
		    write(*,*)'Energieverlust in Triggerfolie soll aus ICRU-Tabelle berechnet werden.'
		endif
		if (log_Meyer_Gauss .OR. log_Meyer_F_Function) then
		    write(*,*)'Winkelaufstreuung in Triggerfolie soll nach Meyer-Formel berechnet werden.'
		endif
		if (log_E_Straggling_Lindhard) then
		    write(*,*)'Energieverluststreuung in C-folie soll nach Lindhard/Scharff berechnet werden.'
		endif
		if (log_E_Straggling_Yang) then
		    write(*,*)'Energieverluststreuung in C-folie soll nach Yang berechnet werden.'
		endif
		write(*,*)'=> Foliendicke muss positiv sein!'
		write(*,*)
		call exit
	    endif
	else
	    do k = 1, 3
		par(k,Thickn)	= 0.
	    enddo
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
                                                                                
c die Parameter fuer die Schleifen setzen und die Gesamtzahl startender
c Projektile berechnen:

	call adjustLoops

	if (n_par(0).EQ.1) OneStartPerLoop = .true.
	SchleifenZahl = GesamtZahl/n_par(0)
	if (SchleifenZahl.EQ.1) OneLoop = .true.

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

c Bereiche der Winkeleinstellungen checken:

        if (abs(par(1,alfTgt)).GT.15 .OR.
     +                           abs(par(2,alfTgt)).GT.15) then
	    write(*,*)
            write(*,*) 'Der Bereich moeglicher Targetwinkel ist auf '//
     + '[-15,15] eingeschraenkt!'
	    write(*,*)
            call exit
        endif

        if (par(1,alfSP).LT.30 .OR. par(1,alfSP).GT.60 .OR.
     +      par(2,alfSP).LT.30 .OR. par(2,alfSP).GT.60) then
	    write(*,*)
            write(*,*) 'Der Bereich moeglicher Spiegelwinkel ist auf '//
     + '[30,60] eingeschraenkt!'
	    write(*,*)
            call exit
        endif

        if (abs(par(1,alfTD)).GT.30 .OR.
     +                           abs(par(2,alfTD)).GT.30) then
	    write(*,*)
            write(*,*) 'Der Bereich moeglicher Triggerwinkel ist auf '//
     + '[-30,30] eingeschraenkt!'
	    write(*,*)
            call exit
        endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
                                                                                
c Falls der Verdrehungswinkel des TDs Null ist und auch nicht geaendert werden
c soll sind alpha gemessen im Kammersystem und alpha gemessen im Triggersystem
c gleich. Deswegen: bleib dann gleich im Triggersystem:

	if (log_alpha0_KS) then
	    if (par(1,alfTD).EQ.0. .AND. n_par(alfTD).LE.1) then
		log_alpha0_KS = .false.
	    else 
		write(par_text(thetAng)(7:10),'(A4)')'(KS)'
		write(par_text(phiAng)(7:10),'(A4)')'(KS)'
	    endif
	endif

c 

	if (startFlaeche.NE.0) then
	    alfaTgtVertically = .false.
	elseif (alfaTgtVertically) then
	    write(par_text(alfTgt)(10:10),'(A1)') 'V'
	endif


c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
                                                                                
c falls kein NTupel erzeugt werden soll brauchen die Daten gar nicht erst fuer
c die Ntupelausgabe gespeichert zu werden. Falls umgekehrt das NTupel eh nicht
c gefuellt wird, erzeuge es erst gar nicht:

	if (.NOT.createNTP) then
	    NTP_S1xM2    = .false.
	    NTP_times    = .false.
	    NTP_FoM2Only = .false.
	    NTP_charge   = .false.
	    NTP_lifeTime = .false.
	    NTP_start    = .false.
	    NTP_stop     = .false.
	    NTP_40mm     = .false.
	    NTP_Folie    = .false.
	    NTP_steps    = .false.
	    xM2_triggered= .false.
	    M2_triggered = .false.
	    Fo_triggered = .false.
	elseif (.NOT. (NTP_S1xM2.OR.NTP_times.OR.NTP_FoM2Only.OR.
     +	         NTP_charge.OR.NTP_lifeTime.OR.NTP_start.OR.
     +		 NTP_stop.OR.NTP_40mm.OR.NTP_Folie.OR.NTP_steps)) then
	    createNTP = .false.
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c setze Triggerbedingungen, die bereits durch andere Triggerbedingungen
c abgedeckt sind, auf .false.:

	if (Fo_triggered) then
	    xM2_triggered = .false.
	    M2_triggered = .false.
	elseif (xM2_triggered) then
	    M2_triggered = .false.
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

c Bei Debug grundsaetzlich die RunNummern von 9900 bis 9999 verwenden (TestRun).
c Bei Debug soll volles Logfile erstellt werden. Falls jedoch keine Projektil-
c DEBUG-Informationen verlangt sind, unterlasse auch die Ausgabe von FE-
c DEBUG-Informationen:

        if (DEBUG) then
            if (debug_Anzahl.EQ.0) then
	        write(*,1000) 'debug_Anzahl = 0','es werden keine'//
     +		  'DEBUG-Informationen ausgegeben'
		flag_message = .true.
		debug = .false.
	    else
      		debug_Anzahl =  min(debug_Anzahl,n_par(0))
	        TestRun = .true. 
      	        if (abs(n_outWhere.LT.1)) then
      		    n_outWhere = 1
      		elseif (abs(n_outWhere).GT.2) then
      		    n_outWhere = 2
      		endif
	    endif
        else
            DEBUG_FE = .false.
        endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
c Marke 1 ======================================================================

	if (.NOT.TriggerInBeam) then

	    GridInFrontOfFoil = .false.
	    generate_FE = .false.       ! dadurch fallen bereits einige SUM_..,
					! PHY_.. und TAB_.. weg
	    SUM_S1Fo = .false.
	    SUM_FoM2 = .false.
	    SUM_y_Fo = .false.
	    SUM_z_Fo = .false.
	    SUM_r_Fo = .false.

	    PHY_S1Fo = .false.
	    PHY_FoM2 = .false.
	    PHY_y_Fo = .false.
	    PHY_z_Fo = .false.
	    PHY_r_Fo = .false.

	    TAB_S1Fo = .false.
	    TAB_FoM2 = .false.
	    TAB_y_Fo = .false.
	    TAB_z_Fo = .false.
	    TAB_r_Fo = .false.

	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Falls keine Folienelektronen generiert werden sollen, setze alle Aktionen, 
c die auf ihnen beruhen auf .false.. Falls umgekehrt weder FE-Trajektorien
c gezeichnet noch FE-Informationen verarbeitet werden sollen, generiere erst
c gar keine FE:

	if (.NOT.generate_FE) then
	    log_out_FE	= .false.
	    plot_FE  = .false.
	    debug_FE = .false.
	    SUM_S1M3 = .false.
	    SUM_M3M2 = .false.
	    SUM_t_FE = .false.
	    PHY_S1M3 = .false.
	    PHY_M3M2 = .false.
	    PHY_t_FE = .false.
	    TAB_S1M3 = .false.
	    TAB_M3M2 = .false.
	    TAB_t_FE = .false.
	elseif (.NOT.(log_out_FE .OR. plot_FE .OR.
     +		      SUM_S1M3 .OR. SUM_M3M2 .OR. SUM_t_FE .OR.
     +		      PHY_S1M3 .OR. PHY_M3M2 .OR. PHY_t_FE .OR.
     +		      TAB_S1M3 .OR. TAB_M3M2 .OR. TAB_t_FE  ) ) then
	    generate_FE = .false.
	endif

c Marke 2 ======================================================================
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
                                                                                
c welche Ausgabekanaele sollen fuer das Summary durchlaufen werden?

	if (n_outWhere.NE.0) then
	    if (abs(n_outWhere).GT.3) then
		write(*,*)
      		write(*,*) 'Der Bereich von n_outWhere ist auf '//
     + '[-3,3] eingeschraenkt!'
		write(*,*)
		call exit
	    elseif (n_outWhere.LT.0) then
		smallLogFile = .true.
		n_outWhere = abs(n_outWhere)
	    elseif (n_outWhere.LE.2) then
		LogFile = .true.			! volles Summary-File
	    endif
	    indx1 = int((n_outWhere+1)/2)		! = 1,1,2 fuer n_outWhere=1,2,3
	    indx2 = int((n_outWhere+2)/2)		! = 1,2,2 fuer n_outWhere=1,2,3
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Uebertragen der logicals fuer die zu erzeugenden Tabellen:
c Falls irgendwelche Tabellenfiles erzeugt werden sollen, setze 'createTabellen'
c auf .true.:

	createTabelle(Nr_S1xM2)= TAB_S1xM2
	createTabelle(Nr_S1M2) = TAB_S1M2
	createTabelle(Nr_S1Fo) = TAB_S1Fo
	createTabelle(Nr_FoM2) = TAB_FoM2
	createTabelle(Nr_S1M3) = TAB_S1M3
	createTabelle(Nr_M3M2) = TAB_M3M2
	createTabelle(Nr_t_FE) = TAB_t_FE
	createTabelle(Nr_y_Fo) = TAB_y_Fo
	createTabelle(Nr_z_Fo) = TAB_z_Fo
	createTabelle(Nr_r_Fo) = TAB_r_Fo
	createTabelle(Nr_y_M2) = TAB_y_M2
	createTabelle(Nr_z_M2) = TAB_z_M2
	createTabelle(Nr_r_M2) = TAB_r_M2
	createTabelle(Nr_y_xM2) = TAB_y_xM2
	createTabelle(Nr_z_xM2) = TAB_z_xM2
	createTabelle(Nr_r_xM2) = TAB_r_xM2
	do k = 1, Stat_Anzahl
	    if (createTabelle(k)) createTabellen = .true.
	enddo


c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Uebertragen der logicals fuer die im Logfile auszugebenden Statistiken.
c Falls im Summary irgendwelche Statistiken ausgegeben werden sollen, setze
c 'statsInSummary' auf .true.:

	statInSummary(Nr_S1xM2)= SUM_S1xM2
	statInSummary(Nr_S1M2) = SUM_S1M2
	statInSummary(Nr_S1Fo) = SUM_S1Fo
	statInSummary(Nr_FoM2) = SUM_FoM2
	statInSummary(Nr_S1M3) = SUM_S1M3
	statInSummary(Nr_M3M2) = SUM_M3M2
	statInSummary(Nr_t_FE) = SUM_t_FE
	statInSummary(Nr_y_Fo) = SUM_y_Fo
	statInSummary(Nr_z_Fo) = SUM_z_Fo
	statInSummary(Nr_r_Fo) = SUM_r_Fo
	statInSummary(Nr_y_M2) = SUM_y_M2
	statInSummary(Nr_z_M2) = SUM_z_M2
	statInSummary(Nr_r_M2) = SUM_r_M2
	statInSummary(Nr_y_xM2)= SUM_y_xM2
	statInSummary(Nr_z_xM2)= SUM_z_xM2
	statInSummary(Nr_r_xM2)= SUM_r_xM2
	do k = 1, stat_Anzahl
	    if (statInSummary(k)) statsInSummary = .true.
	enddo

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Uebertragen der logicals fuer die im .PHYSICA file auszugebenden Statistiken
c und die statistischen Groessen:

	if (createPhysTab) then
	    statInPHYSICA(Nr_S1xM2)= PHY_S1xM2
	    statInPHYSICA(Nr_S1M2) = PHY_S1M2
	    statInPHYSICA(Nr_S1Fo) = PHY_S1Fo
	    statInPHYSICA(Nr_FoM2) = PHY_FoM2
	    statInPHYSICA(Nr_S1M3) = PHY_S1M3
	    statInPHYSICA(Nr_M3M2) = PHY_M3M2
	    statInPHYSICA(Nr_t_FE) = PHY_t_FE
	    statInPHYSICA(Nr_y_Fo) = PHY_y_Fo
	    statInPHYSICA(Nr_z_Fo) = PHY_z_Fo
	    statInPHYSICA(Nr_r_Fo) = PHY_r_Fo
	    statInPHYSICA(Nr_y_M2) = PHY_y_M2
	    statInPHYSICA(Nr_z_M2) = PHY_z_M2
	    statInPHYSICA(Nr_r_M2) = PHY_r_M2
	    statInPHYSICA(Nr_y_xM2)= PHY_y_xM2
	    statInPHYSICA(Nr_z_xM2)= PHY_z_xM2
	    statInPHYSICA(Nr_r_xM2)= PHY_r_xM2

	    whatInPHYSICA(1) = PHY_mean
	    whatInPHYSICA(2) = PHY_variance
	    whatInPHYSICA(3) = PHY_minimum
	    whatInPHYSICA(4) = PHY_maximum
	    whatInPHYSICA(5) = PHY_percent
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 


c Sollte pro Schleife nur ein Teilchenstart erfolgen oder umgekehrt ausser
c der 'Zufalls-Schleife' keine anderen Schleife durchlaufen werden, setze
c 'createPhysTab' auf .false. und unterlasse die Ausgabe von Tabellenfiles:

	if ((OneStartPerLoop.OR.OneLoop) .AND. (createPhysTab.OR.createTabellen)) then
	    write(*,*) ' nur eine Schleife bzw. nur ein Start pro Schleife'
	    if (createPhysTab) then
		createPhysTab = .false.
		write(*,*) '    -> set ''createPhysTab'' to ''.false.'''
		flag_message = .true.
	    endif
	    if (createTabellen) then
		createTabellen = .false.
		do k = 1, Stat_Anzahl
		    createTabelle(k) = .false.
		enddo
		write(*,*) '    -> set ''createTabellen'' to ''.false.'''
	    endif
	    flag_message = .true.
	endif


c falls im .PHYSICA file keine Statistiken oder keine statistischen Groessen
c ausgegeben werden sollen, setze 'createPhysTab' auf .false.

	if (createPhysTab) then
	    flag = .false.
	    do k = 1, stat_Anzahl
		if (statInPHYSICA(k)) flag = .true.
	    enddo
	    if (.NOT.flag) then
		createPhysTab = .false.
		write(*,*) ' no statistics specified for PHYSICA -> set ''createPhysTab'' to ''.false.'''
		flag_message = .true.
	    else
		flag = .false.
		do k = 1, what_Anzahl
		    if (whatInPHYSICA(k)) flag = .true.
		enddo
		if (.NOT.flag) then
		    createPhysTab = .false.
		    write(*,*) ' no statistical entities specified -> set ''createPhysTab'' to ''.false.'''
		    flag_message = .true.
		endif
	    endif
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
                                                                                
c wenn keine Ausgabe des LOG-files vorgesehen ist, aber das PHYSICA-file, das
c NTP-file oder ein 'foilFile' erzeugt werden soll, dann ist zumindest die
c Minimalversion des LOG-files zu erstellen:

	if (.NOT.LogFile .AND. (createPhysTab.OR.createNTP.OR.createFoilFile)) then
		smallLogFile = .true.		! Minimalversion erzeugen
	endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Falls weder grosses noch kleines Summary ausgegeben werden soll, und auch die
c Bildschirmausgabe unterbleibt, setze alle statInSummary auf .false.:

        if (statsInSummary .AND. .NOT.(LogFile .OR. smallLogFile) .AND. n_outWhere.LT.2) then
	    statsInSummary = .false.
            do k = 1, stat_Anzahl
                statInSummary(k) = .false.
            enddo
        endif

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c pruefe, fuer welche Groessen Statistiken gefuehrt werden muessen, und setze
c das jeweilige 'statNeeded' auf .true.:

	do k = 1, Stat_Anzahl
	    if (createTabelle(k).OR.statInSummary(k).OR.statInPHYSICA(k)) then
		statNeeded(k) = .true.
	    endif
	enddo

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Bei batch jobs: entweder alle oder keine Postskripts erzeugen:

	if (batch_mode .AND. graphics) then
	    if (n_postSkript.GE.1) then
		n_postSkript = 2
		graphics_Anzahl = min(graphics_Anzahl,50)
	    else
		write(*,*)
		write(*,*)'Ausgabe von Postskripts bei batch jobs nur, wenn ''GRAPHICS''=.true.'
		write(*,*)'und ''n_Postskript''>0.'
		write(*,*)'-> es werden keine .PS-files erstellt!'
		write(*,*)
		graphics = .false.
	    endif
	endif


c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

1000	format(x,A,T36,'->',T40,A)
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 


c falls keinerlei output erzeugt werden soll, breche Programm ab:

	if (.NOT.(createTabellen.OR.graphics.OR.LogFile.OR.smallLogFile.OR
     +	    .n_outWhere.GT.1)) then
	    write(*,*)
	    write(*,*)' -> according to input file no output would be produced'
	    write(*,*)
	    call exit
	endif


c Hole Zustimmung fuer abgeaenderte Parameter ein:

	if (flag_message .AND. .NOT.BATCH_MODE) then
	    write(*,1010)
1010	    format(' ok?  (<n,a,c> = ABBRUCH)',T36'->  ',$)
	    read(*,'(A)') antwort

	    call str$upCase(antwort,antwort)
	    k = 0
1	    k = k+1
	    if (antwort(k:k).eq.' ' .AND. k.LE.4) goto 1
	    if (antwort(k:k).eq.'N' .OR. antwort(k:k).eq.'A' .OR.
     +		antwort(k:k).eq.'C' ) then
		write(*,*)
		call exit
	    endif
	endif


c bei Verwendung von 'input_list' korrigiere noetigenfalls den Wert von
c 'testRun' (dort kann auch Ausgabefilenummer .ge. 9900 angegeben werden
c ohne dass der Run im INPUT-file als solcher markiert wurde)

	if (input_list.AND.gotFileNr) testRun = testRun_


c falls kein Summary-File erstellt wird, braucht auch die 'T E S T - R U N' -
c Meldung nicht auf dem Bildschirm erscheinen:

	if (.NOT.(logFile.OR.smallLogFile)) testRun = .false.


c Bedingungen fuer die Ausgabe der Prozentzahl schon gerechneter Teilchen
c pruefen:

        if (.NOT.BATCH_MODE .AND. n_par(0).GE.50 .AND. n_outWhere.GE.2) then
            log_percent = .true.
        endif


c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

c n_par der unbenutzten Schleifen auf 0 setzen (dies hat 1. zur Folge, dass
c die Ausgabe dieser unbenutzten Parameter im Logfile unterbleibt, und dass
c sie 2. auch nicht an PHYSICA weitergegeben werden):
c (der Spiegelwinkel wird dann unterdrueckt, wenn er konstant 45 degree hat,
c da hier dies die Normaleinstellung ist).

	if (random_E0) then
	    if (par(1,ener).EQ.0. .AND. par(2,ener).EQ.0.) then
		n_par(ener) = 0
		ener_offset = .false.	   ! default = .true.
	    endif
	else
	    if (par(1,ener).EQ.0. .AND. par(2,ener).EQ.0.) then
		n_par(phiAng)  = 0
	    endif
	endif

	if (random_pos .AND.
     +	    par(1,yPos).EQ.0. .AND .par(2,yPos).EQ.0. .AND.
     +	    par(1,zPos).EQ.0. .AND .par(2,zPos).EQ.0. ) then
	    n_par(yPos) = 0
	    n_par(zPos) = 0
	    pos_offset = .false.	   ! default = .true.
	endif
	if (random_angle .AND.
     +	    par(1,thetAng).EQ.0. .AND .par(2,thetAng).EQ.0. .AND.
     +	    par(1,phiAng).EQ.0.  .AND .par(2,phiAng).EQ.0. ) then
	    n_par(thetAng) = 0
	    n_par(phiAng)  = 0
	    angle_offset = .false.	   ! default = .true.
	endif

	if (.NOT.random_angle .AND.
     +	    par(1,thetAng).EQ.0. .AND .par(2,thetAng).EQ.0. ) then
	    n_par(phiAng)  = 0
	endif

	if (.NOT.TriggerInBeam) then
	    n_par(UFolie)  = 0
	    n_par(UVorne)  = 0
	    n_par(UHinten) = 0
	    n_par(UMCP3)   = 0
	    n_par(alfTD)   = 0
	    n_par(Eloss)   = 0
	endif

	if (upToTDFoilOnly) then
	    n_par(UL3)	   = 0
	    n_par(UMCP2)   = 0
	    if (.NOT.generate_FE) then
		n_par(UVorne)   = 0
		n_par(UHinten)  = 0
		n_par(UMCP3)    = 0
	    endif
	endif

	if (.NOT.guard) n_par(UGua) = 0
	if (artlist_defined) n_par(mass) = 0

	if (par(1,alfTgt) .EQ.0. .AND. par(2,alfTgt) .EQ.0.)  n_par(alfTgt)  = 0
	if (par(1,alfSp) .EQ.45. .AND. par(2,alfSp ).EQ.45.)  n_par(alfSp)   = 0
	if (par(1,ThetAng).EQ.0. .AND. par(2,ThetAng).EQ.0.)  n_par(ThetAng) = 0
	if (par(1,PhiAng) .EQ.0. .AND. par(2,PhiAng) .EQ.0.)  n_par(PhiAng)  = 0
	if (par(1,alfTD)  .EQ.0. .AND. par(2,alfTD)  .EQ.0.)  n_par(alfTD)   = 0
	if (par(1,Eloss)  .EQ.0. .AND. par(2,Eloss)  .EQ.0.)  n_par(Eloss)   = 0
	if (par(1,Thickn) .EQ.0. .AND. par(2,Thickn) .EQ.0.)  n_par(Thickn)  = 0
	if (par(1,BHelm)  .EQ.0. .AND. par(2,BHelm)  .EQ.0.)  n_par(BHelm)   = 0
	if (par(1,BTD)    .EQ.0. .AND. par(2,BTD)    .EQ.0.)  n_par(BTD)     = 0
	if (par(1,deltaL1).EQ.0. .AND. par(2,deltaL1).EQ.0.)  n_par(deltaL1) = 0
	if (par(1,deltaL2).EQ.0. .AND. par(2,deltaL2).EQ.0.)  n_par(deltaL2) = 0

	if (mappenName_L2andFo.EQ.' ') n_par(UL2) = 0.


c noch ein paar Einstellungen fuer die Graphikausgabe ueberpruefen:

	if (.NOT.graphics) then
	    writeTraj2File = .false.
	elseif (schnitt_x.LT.0) then
	    GRAPHICS_Anzahl = min(GRAPHICS_Anzahl,n_par(0))
	    ! fuer 'schnitt_x' kein Wert vorgegeben => setze Defaultwert ein:
	    schnitt_x = xMCP2
	endif


	END


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


	OPTIONS /EXTEND_SOURCE

	SUBROUTINE adjustLoops
c       ======================

        IMPLICIT NONE

        INCLUDE 'mutrack$sourcedirectory:COM_MUTRACK.INC'
        integer  k,nn
        real     help, factor, step

        GesamtZahl=1

        do k = 0 , par_Anzahl                       ! k=0: 'Zufalls-Schleife'
            if (par(2,k).NE.1.E10) then             ! wurde maxWert vorgegeben?
                if (par(2,k).EQ.par(1,k).OR.par(3,k).EQ.0.) then
                    par(2,k) = par(1,k)
                    par(3,k) = 1.                   ! step = 0 vermeiden
                else                                ! wurde step vorgegeben?
                    if (par(3,k).EQ.-1.E10) par(3,k)=par(2,k)-par(1,k)
                endif
            else
		if (k.EQ.UGua .AND. (par(1,UGua).EQ.-1.E10 .OR. 
     +						   fromScratch ) ) then
		    guard = .false.		    ! default = .true.
		    par(1,UGua) = 0
		endif
                par(2,k) = par(1,k)
                par(3,k) = 1.
            endif

	    ! es kam vor, dass wegen der endlichen Genauigkeit numerischer Zahlen
	    ! die letzte Schleife nicht durchlaufen wurde. Deshalb wurden folgende
	    ! Befehlszeilen eingebaut:

            factor  = 1
            step = par(3,k)

1           do help = par(1,k), par(2,k), step
		! just count the loop index
            enddo

	    ! falls jetzt 'help' gerade geringfuegig 'hinter' par(2,k) liegt,
	    ! also aufgrund von Rundungsfehlern die letzte Schleife, die
	    ! eigentlich durchlaufen werden sollte nicht durchlaufen werden
	    ! wuerde, so reduziere schrittweise 'step', bis letzte Schleife
	    ! wieder akzeptiert wird:
	    ! (nachdem die Schleife fuer erledigt erklaert wurde ist
	    ! ((help-par(2,k))/step auf jeden Fall groesser Null!)

            if ((help-par(2,k))/step.LT.1.E-3) then
                factor = factor - 0.00000003 ! (smallest number that should 
					     !				work)
                step = par(3,k) * factor
C		WRITE(*,*) 'HELP, FACTOR, STEP = ',HELP,FACTOR, STEP
                goto 1
            endif
            par(3,k) = step
C	    WRITE(*,*) 'FINAL: HELP, FACTOR, STEP = ',HELP,FACTOR, STEP

            n_par(k) = int((par(2,k)-par(1,k)+par(3,k))/par(3,k) +.5)  ! so werden laut
	    if (n_par(k).LE.0) n_par(k)=1  ! library die Anzahlen der Durchlaeufe berechnet

c da es hier immer noch Schwierigkeiten gab (oder vielleicht noch gibt?) hier
c noch eine zusaetzliche Kontrolle: Bestimme mittels Probedurchlauf die Anzahl
c der wirklich durchlaufenen Schleifen und vergleiche mit erwartetem Wert.
c Falls hier immer noch Abweichungen bestehen, breche mit Fehlermeldung ab:

	    nn = 0
            do help = par(1,k), par(2,k), par(3,k)
		! just count the loops
		nn = nn + 1
            enddo
	    if (n_par(k).NE.nn) then
		write(*,*) 'SUBROUTINE ''adjustLoops'' in ''SUB_INPUT.FOR'':'
		write(*,*) 'A L A R M:    n_par(k).NE.nn'
		write(*,*) '       n_par(k) = ',n_par(k)
		write(*,*) '       nn       = ',nn
		write(*,*) par_Text(k)
		call exit
	    endif

99          GesamtZahl = GesamtZahl * n_par(k)


c setze Parameter, deren Variation sinnlos waere auf Null:

	    if (k.EQ.ener .AND. .NOT.random_E0 .AND.
     +		n_par(ener).LE.1 .AND. par(1,ener).EQ.0. ) then
		par(1,thetang) = 0.
		par(2,thetang) = 0.
		par(1,phiAng)  = 0.
		par(2,phiAng)  = 0.
		random_angle   = .false.
		random_lambert = .false.
      		random_gauss   = .false.

	    elseif (k.EQ.thetAng .AND.
     +		n_par(thetAng).LE.1 .AND. par(1,thetAng).EQ.0. ) then
		par(1,phiAng)  = 0.
		par(2,phiAng)  = 0.

	    endif

	    if (par(1,k).EQ.-1.e10) then
		par(1,k) = 0.
		par(2,k) = 0.
		par(3,k) = 1.
		n_par(k) = 0
	    endif

	enddo


        END


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


	OPTIONS /EXTEND_SOURCE

	SUBROUTINE READ_ACCEL_GEOMETRY
c	==============================

	IMPLICIT NONE

c Diese Subroutine liesst bei Verwendung von ACCEL-Simulationen des realen
c Beschleunigers die den Daten zugrundeliegende Beschleunigergeometrie ein.

c Dieser Quelltext steht in einer einenen Subroutine, um Verwirrungen um
c die Speicherbezeichnungen bei MUTRACK und ACCEL im Vorfeld zu vermeiden.

	INCLUDE 'mutrack$sourcedirectory:COM_KAMMER.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_MUTRACK.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_DIRS.INC'

c-------------------------------------------------------------------------------

	namelist /geometry/
     +  scaleFactor,
     +  xFoil,
     +  xEnd_TgtHolder,Dy_Foil,Dz_Foil,Dy_TgtHolder,Dz_TgtHolder,
     +  outerDy_TgtHolder,outerDz_TgtHolder,
     +  innerDy1_TgtHolder,innerDz1_TgtHolder,innerDy2_TgtHolder,innerDz2_TgtHolder,
     +  xStart_Guardring,xEnd_Guardring,innerDy_Guardring,outerDy_Guardring,
     +  innerDz_Guardring,outerDz_Guardring,
     +  xPosition_Grid1,distance_wires1,dWires1,y_Pos_lastWire1,
     +  xStart_Balken,xEnd_Balken,Dy_Balken,
     +  innerDz_Balken,outerDz_Balken,
     +  xStart_Gridframe1,xEnd_Gridframe1,innerDy_Gridframe1,outerDy_Gridframe1,
     +  innerDz_Gridframe1,outerDz_Gridframe1,
     +  xPosition_Grid2,distance_wires2,dWires2,y_Pos_lastWire2,
     +  xStart_Gridframe2,xEnd_Gridframe2,innerDy_Gridframe2,outerDy_Gridframe2,
     +  innerDz_Gridframe2,outerDz_Gridframe2,
     +  rHeShield    


c Die Groessen, die in der /geometry/-namelist von 'ACCEL' verwendet werden:

c - moderator:
	real xFoil,Dy_Foil,Dz_Foil,xEnd_TgtHolder
	real innerDy1_TgtHolder,innerDz1_TgtHolder
	real innerDy2_TgtHolder,innerDz2_TgtHolder
	real outerDy_TgtHolder,outerDz_TgtHolder

c nur um Infofiles von ACCEL-Versionen vor 1.2.1 einlesen zu koennen
c (wurden ab Version 1.2.1 ersetzt durch outerDy_TgtHolder, outerDz_TgtHolder):

	real Dy_TgtHolder, Dz_TgtHolder


c - guardring:
	real xStart_Guardring,xEnd_Guardring,innerDy_Guardring,outerDy_Guardring,
     +   innerDz_Guardring,outerDz_Guardring

c - first grid:
	real xPosition_Grid1,distance_Wires1,dWires1,y_Pos_lastWire1,
     +   xStart_Gridframe1,xEnd_Gridframe1,innerDy_Gridframe1,
     +   outerDy_Gridframe1,innerDz_Gridframe1,outerDz_Gridframe1,xStart_Balken,
     +   xEnd_Balken,Dy_Balken,innerDz_Balken,outerDz_Balken

c - second grid:
	real xPosition_Grid2,distance_Wires2,dWires2,y_Pos_lastWire2,
     +   xStart_Gridframe2,xEnd_Gridframe2,innerDy_Gridframe2,
     +   outerDy_Gridframe2,innerDz_Gridframe2,outerDz_Gridframe2

c - He-shield:
	! real rHeShield	    ! schon in COM_KAMMER.INC enthalten

c-------------------------------------------------------------------------------


c Einlesen der Target-Geometrie aus dem ACCEL-INFO-file:

	read(lunREAD,nml=geometry)
	rewind(lunREAD)

	if (outerDy_TgtHolder.EQ.-1.E10) outerDy_TgtHolder = Dy_TgtHolder
	if (outerDz_TgtHolder.EQ.-1.E10) outerDz_TgtHolder = Dz_TgtHolder
	if (innerDy1_TgtHolder.EQ.-1.E10) innerDy1_TgtHolder = Dy_Foil
	if (innerDz1_TgtHolder.EQ.-1.E10) innerDz1_TgtHolder = Dz_Foil
	if (innerDy2_TgtHolder.EQ.-1.E10) innerDy2_TgtHolder = Dy_Foil
	if (innerDz2_TgtHolder.EQ.-1.E10) innerDz2_TgtHolder = Dz_Foil


c gegebenenfalls Beschleunigergeometrie skalieren:
c (eigentlich nicht fuer alle noetig, da nicht alle von Mutrack verwendet werden.
c Aber besser fuer zu viele als fuer zu wenige...)

	if (scaleFactor.NE.1) then
	    xFoil		= scaleFactor * xFoil
	    xEnd_TgtHolder	= scaleFactor * xEnd_TgtHolder
	    Dy_Foil		= scaleFactor * Dy_Foil
	    innerDy1_TgtHolder  = scaleFactor * innerDy1_TgtHolder
	    innerDz1_TgtHolder  = scaleFactor * innerDz1_TgtHolder
	    innerDy2_TgtHolder  = scaleFactor * innerDy2_TgtHolder
	    innerDz2_TgtHolder  = scaleFactor * innerDz2_TgtHolder
	    outerDy_TgtHolder	= scaleFactor * outerDy_TgtHolder
	    outerDz_TgtHolder	= scaleFactor * outerDz_TgtHolder
	    Dz_Foil		= scaleFactor * Dz_Foil
	    xStart_Guardring    = scaleFactor * xStart_Guardring
	    xEnd_Guardring	= scaleFactor * xEnd_Guardring
	    innerDy_Guardring   = scaleFactor * innerDy_Guardring
	    outerDy_Guardring   = scaleFactor * outerDy_Guardring
	    innerDz_Guardring   = scaleFactor * innerDz_Guardring
	    outerDz_Guardring   = scaleFactor * outerDz_Guardring
	    xPosition_Grid1	= scaleFactor * xPosition_Grid1
	    distance_wires1	= scaleFactor * distance_wires1
	    dWires1		= scaleFactor * dWires1
	    y_Pos_lastWire1	= scaleFactor * y_Pos_lastWire1
	    xStart_Balken	= scaleFactor * xStart_Balken
	    xEnd_Balken		= scaleFactor * xEnd_Balken
	    Dy_Balken		= scaleFactor * Dy_Balken
	    innerDz_Balken	= scaleFactor * innerDz_Balken
	    outerDz_Balken	= scaleFactor * outerDz_Balken
	    xStart_Gridframe1   = scaleFactor * xStart_Gridframe1
	    xEnd_Gridframe1	= scaleFactor * xEnd_Gridframe1
	    innerDy_Gridframe1  = scaleFactor * innerDy_Gridframe1
	    outerDy_Gridframe1  = scaleFactor * outerDy_Gridframe1
	    innerDz_Gridframe1  = scaleFactor * innerDz_Gridframe1
	    outerDz_Gridframe1  = scaleFactor * outerDz_Gridframe1
	    xPosition_Grid2	= scaleFactor * xPosition_Grid2
	    distance_wires2	= scaleFactor * distance_wires2
	    dWires2		= scaleFactor * dWires2
	    y_Pos_lastWire2	= scaleFactor * y_Pos_lastWire2
	    xStart_Gridframe2   = scaleFactor * xStart_Gridframe2
	    xEnd_Gridframe2	= scaleFactor * xEnd_Gridframe2
	    innerDy_Gridframe2  = scaleFactor * innerDy_Gridframe2
	    outerDy_Gridframe2  = scaleFactor * outerDy_Gridframe2
	    innerDz_Gridframe2  = scaleFactor * innerDz_Gridframe2
	    outerDz_Gridframe2  = scaleFactor * outerDz_Gridframe2
	    rHeShield    	= scaleFactor * rHeShield
	endif


c Uebertragen der Geometriegroessen in die von 'MUTRACK' verwendeten Speicher:
c (x-Positionen sind bei 'ACCEL'-Outputs bereits relativ zur Kryoachse;
c dy- und dz-Ausdehnungen sind bei 'ACCEL' in 50% des totalen Wertes angegeben)

	xTarget  = xFoil
	dyTarget = 2 * Dy_Foil
	dzTarget = 2 * Dz_Foil

	xGrid1   = xPosition_Grid1
	dyGrid1  = 2 * innerDy_Gridframe1
	dzGrid1  = 2 * innerDz_Gridframe1
	dWires_G1 = dWires1
	dist_Wires_G1 = distance_Wires1

	xGrid2   = xPosition_Grid2
	dyGrid2  = 2 * innerDy_Gridframe2
	dzGrid2  = 2 * innerDz_Gridframe2
	dWires_G2 = dWires2
	dist_Wires_G2 = distance_Wires2

	! Der Radius des He-Schildes ist sowohl bei 'ACCEL' als auch bei
	! 'MUTRACK' mit 'rHeShield' bezeichnet, muss also nicht explizit
	! uebertragen werden.

	END


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


	OPTIONS /EXTEND_SOURCE

	SUBROUTINE getPreviousSettings
c       ==============================

c Diese Subroutine liest die 'Schleifenparameter', mit denen gegebenenfalls
c das 'ACCEL-file' bzw. das 'FoilFile' erstellt worden ist, in ein separates
c Feld 'par_prevSim' ein. Dies wird benoetigt, um fuer die jeweiligen Settings
c der 'Schleifenparameter' im aktuellen MUTRACK-Run die Nummer derjenigen
c Schleife des ACCEL-files bzw. des 'FoilFiles' mit den gleichen Settings
c berechnen zu koennen. Es wird geprueft, ob die Werte, die die einzelnen
c Parameter jetzt annehmen sollen, auch bei der frueheren Simulation gerechnet
c worden sind.
c In dieser Routine wird auch ueberprueft, ob jedes der jetzt abzuarbeitenden
c Teilchen in der frueheren Simulation gerechnet worden ist, sowie an welcher
c Stelle in 'artList' das jeweilige Teilchen bei der frueheren Simlation stand.

        IMPLICIT NONE

        INCLUDE 'mutrack$sourcedirectory:COM_MUTRACK.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_DIRS.INC'

	namelist /loop_params/ 
     + U_Tgt_,U_Gua_,U_G1_,U_L1_,U_Sp_,U_L2_,U_Folie_, B_Helm_,B_TD_,
     + alfaTgt_,alfaSp_,alfaTD_,Masse_,Ladung_,
     + E0_,y0_,z0_,theta0_,phi0_,deltaL1_,U_KL_
       ! (U_KL_ nur fuer das Einlesen aelterer foilFile-Versionen)

	nameList /additionals/ par_Anzahl_prevSim,reihenFolge_prevSim,artenZahl_prevSim,
     +			       par_Anzahl_AH     ,reihenFolge_AH     ,artenZahl_AH,
     +			       mappenNameACCEL

c 'artListIndx_prevSim(i)' enthaelt die Nummer, die das Teilchen, das jetzt bei
c Mutrack an Stelle 'i' in 'artList' steht, waehrend ACCEL bzw. waehrend
c 'FoilFile' innehatte.

	integer par_Anzahl_prevSim,reihenFolge_prevSim(par_Anzahl)
	real	par_prevSim(3,par_Anzahl),n_par_prevSim(par_Anzahl)
	integer artListIndx_prevSim(arten_zahl),artenZahl_prevSim

	COMMON /prevSim/ par_Anzahl_prevSim,reihenFolge_prevSim,par_prevSim,n_par_prevSim
	COMMON /prevSim/ artListIndx_prevSim

c Misc.:

        integer i, par_
        real    help, factor
	integer firstIndx_,lastIndx_

	integer pos1,pos2

	character*4 art,art_prevSim
	integer artIndx_prevSim

	real    von,bis,step,von_prevSim,bis_prevSim,step_prevSim
	integer iHelp,errorNr

c	integer j


c fuer Kompatibilitaet mit frueheren Versionen, bei denen statt der Extension
c '_prevSim' noch die Extension '_AH' verwendet wurde:

	integer par_Anzahl_AH /-1.E8/
	integer reihenFolge_AH(par_Anzahl) /par_anzahl*-1.E8/
	integer artenZahl_AH  /-1.E8/



c die lokalen Variablen fuer das Einlesen der Schleifenparameter der freuheren
c Simulation, die dann in das Feld 'par_prevSim' uebertragen werden:

			    !      von     !   bis    !  step    !

	real U_Tgt_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_Gua_(3)	    /    -1.e10    ,  +1.e10  ,  -1.e10  /
	real U_G1_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_L1_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_Sp_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real U_L2_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

c Fuer das Einlesen aelterer foilFile-Versionen:
	real U_KL_(3)	    /    -1.e10    ,  +1.e10  ,  -1.e10  /

	real U_Folie_(3)    /        0.    ,  +1.e10  ,  -1.e10  /

	real B_Helm_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real B_TD_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real alfaTgt_(3)    /        0.    ,  +1.e10  ,  -1.e10  /
	real alfaSp_(3)	    /       45.    ,  +1.e10  ,  -1.e10  /
	real alfaTD_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real Masse_(3)	    /   105659.    ,  +1.e10  ,  -1.e10  / 
	real Ladung_(3)	    /        1.    ,  +1.e10  ,  -1.e10  /

	real E0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  / 
	real y0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real z0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /
	real theta0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  / 
	real phi0_(3)	    /        0.    ,  +1.e10  ,  -1.e10  /

	real deltaL1_(3)    /        0.    ,  +1.e10  ,  -1.e10  /

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c in ParAC2ParMu(i,j) steht, welche CodeZahl die jetztige MUTRACK-Version 
c fuer denjenigen Parameter verwendet, der von ACCEL (waehrend der vom
c VersionIndx 'j' abgedeckten Versionen) unter der CodeNummer 'i'
c gefuehrt wurde:
c ParAC2ParMu = ParAC2ParMu(parAC,VersionIndx)
c (bei der Zuordnung unbelegte Nummern sind auf Null zu setzen)

        integer ParAC2ParMu(12,2)
        DATA    ParAC2ParMu /

c  AccelVersionIndx = 1: noch ohne Magnetfelder
c  Nummer waehrend ACCEL:
c          1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12
c  Nummer bei aktueller MUTRACK-Version:
     +     1, 2, 3,18,19,20,21,22,23,24, 0, 0,	 ! AccelVersionIndx = 1
     +     1, 2, 3,13,14,18,19,20,21,22,23,24/	 ! AccelVersionIndx = 2

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c in ParMU2ParMu(i,j) steht, welche CodeZahl die jetztige MUTRACK-Version 
c fuer denjenigen Parameter verwendet, der waehrend 'foilFile' (waehrend der
c vom VersionIndx 'j' abgedeckten Versionen) unter der CodeNummer 'i' gefuehrt
c wurde:
c ParMu2ParMu = ParMu2ParMu(parMU,VersionIndx)
c (bei der Zuordnung unbelegte Nummern sind auf Null zu setzen)
c (Die vorliegende Mutrack-Version gehoert mit zum hoechsten MutrackVersionIndx.
c Daher gibt es fuer das hoechste 'MutrackVersionIndx' eine eins zu eins Ent-
c sprechung der CodeZahlen, weshalb in der letzten Initialisierungszeile
c fuer 'ParMU2ParMu' einfach die ganzen Zahlen von 1 bis par_Anzahl durchge-
c zaehlt sind.

        integer ParMU2ParMu(par_Anzahl,2)
        DATA    ParMU2ParMu /
c  Nummer waehrend frueherer Version:
c         1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18|19|20|
c                                      21|22|23|24|25|26|27|28
c  Nummer jetzt:
     +    1, 2, 3, 4, 5, 7, 8, 9,10,11,12,15,16,17,18,19,20,21,22,23, ! indx = 1
     +                                 24,25,26,27,28, 0, 0, 0,	      ! indx = 1
     +    1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20, ! indx = 2
     +                                 21,22,23,24,25,26,27,28/	      ! indx = 2
 
c-------------------------------------------------------------------------------

c Lies die Einstellungen der Schleifenparameter waehrend der Simulation mit
c ACCEL bzw. waehrend 'createFoilFile':

	read(lunREAD,nml=loop_params)
	rewind(lunREAD)
	read(lunREAD,nml=additionals)
	rewind(lunREAD)

	    ! fuer Kompatibilitaet mit aelteren foilFile-Versionen:
	    if (U_KL_(1).NE.-1.e10) then
		do i = 1, 3
		    U_L1_(i) = U_KL_(i)
		enddo
	    endif

c fuer Kompatibilitaet mit frueheren Versionen, bei denen statt der Extension
c '_prevSim' noch die Extension '_AH' verwendet wurde:

	if (par_Anzahl_AH.NE.-1.E8) par_Anzahl_prevSim = par_Anzahl_AH
	if (reihenFolge_AH(1).NE.-1.E8) then
	    do i = 1, par_Anzahl_prevSim
		reihenFolge_prevSim(i) = reihenFolge_AH(i)
	    enddo
	endif
	if (artenZahl_AH.NE.-1.E8) artenZahl_prevSim = artenZahl_AH


c Ersetze die von Accel bzw. von FoilFile verwendeten Parameter-Codenummern
c durch die von der aktuellen MUTRACK-Version verwendeten Codenummern:

c	write(*,*) 'mutrackVersionIndx = ',mutrackVersionIndx
	do i = 1 , par_Anzahl_prevSim
	    par_ = reihenFolge_prevSim(i)
	    if (use_accel) then
		reihenFolge_prevSim(i) = parAC2parMU(par_,accelVersionIndx)
	    else	! => use_MUTRACK
		reihenFolge_prevSim(i) = parMU2parMU(par_,mutrackVersionIndx)
c		write(*,*) par_,' wird zu ',reihenFolge_prevSim(i)
	    endif
	enddo

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Vergleich von 'artList' und 'artList_prevSim':

	if ((artList_prevSim.NE.' ' .AND. .NOT.artList_defined) .OR.
     +	    (artList_prevSim.EQ.' ' .AND. artList_defined)    ) then
	    write(*,*) 'missmatch 111'
	    call exit
	endif

c Entfernen der embedded blanks aus 'artList_prevSim':

	pos 2 = 0
	do pos1 = 1, len(artList_prevSim)
	    if(artList_prevSim(pos1:pos1).NE.' ') then
		pos2 = pos2 + 1
		artList_prevSim(pos2:pos2) = artList_prevSim(pos1:pos1)
	    endif
	enddo
	do pos1 = pos2+1, len(artList_prevSim)
		artList_prevSim(pos1:pos1) = ' '
	enddo 	

	if (artList_defined) then
	    ! Pruefe fuer jeden Eintrag in 'artlist', ob er auch in 'artList_prevSim'
	    ! vorhanden ist. Lege die Nummer des entsprechenden Teilchens
	    ! in 'artList_prevSim' in 'artListIndx_prevSim' ab:
	    do i = 1, par(2,charge)	! fuer jede Art aus 'artlist'
		art = art_Name(art_Nr(i))
		pos1 = 0
		pos2 = 0
		artIndx_prevSim = 0
		do while (pos2.LE.50)
		    pos2 = Index(artList_prevSim(pos1+1:50),',')
		    if (pos2.EQ.0) pos2=51
		    art_prevSim = artList_prevSim(pos1+1:pos2-1)
		    artIndx_prevSim = artIndx_prevSim + 1
		    if (art.EQ.art_prevSim) then
			artListIndx_prevSim(i) = artIndx_prevSim
c			write(*,'(x,A,I2)') ' das Teilchen '//art//' hat in ''artList_prevSim'' die Position ',artIndx_prevSim
			goto 1
		    endif
		    pos1 = pos2
		enddo
		write(*,*) ' Teilchen '//art//' ist nicht im ACCEL-file bzw. ''Foilfile'' enthalten!'
		write(*,*) ' ''artList_prevSim'' = ',artList_prevSim
		call exit
1	    enddo
	endif

c	write(*,*) 'artListIndx_prevSim = ',artListIndx_prevSim

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

c Uebertragen der Schleifenparameter in das Feld 'par_prevSim':

	do i = 1, 3

	    par_prevSim(i,UTgt)    = U_Tgt_   (i)
	    par_prevSim(i,UGua)    = U_Gua_   (i)
	    par_prevSim(i,UG1)     = U_G1_    (i)
	    par_prevSim(i,UL1)     = U_L1_    (i)
	    par_prevSim(i,USp)     = U_Sp_    (i)
	    par_prevSim(i,UL2)     = U_L2_    (i)

	    par_prevSim(i,UFolie)  = U_Folie_ (i)

	    par_prevSim(i,BHelm)   = B_Helm_  (i)
	    par_prevSim(i,BTD)     = B_TD_    (i)

	    par_prevSim(i,alfTgt)  = alfaTgt_ (i)
	    par_prevSim(i,alfSp)   = alfaSp_  (i)
	    par_prevSim(i,alfTD)   = alfaTD_  (i)

	    par_prevSim(i,mass)    = Masse_   (i)
	    par_prevSim(i,charge)  = Ladung_  (i)
	    par_prevSim(i,ener)    = E0_      (i)
	    par_prevSim(i,yPos)    = y0_      (i)
	    par_prevSim(i,zPos)    = z0_      (i)
	    par_prevSim(i,thetAng) = theta0_  (i)
	    par_prevSim(i,phiAng)  = phi0_    (i)

	    par_prevSim(i,DeltaL1) = DeltaL1_ (i)
	enddo


c Bestimme 'par_prevSim' und 'n_par_prevSim' sowie 'par' und 'n_par' (Fuer
c Kommentare zur Vorgehensweise siehe Subroutine 'adjustLoops'):

	if (artList_defined) then
	    par_prevSim(1,mass) = 1.
	    par_prevSim(2,mass) = 1.
	    par_prevSim(1,charge) = 1.
	    par_prevSim(2,charge) = artenZahl_prevSim
	endif

        do i = 1 , par_Anzahl_prevSim
	    par_ = reihenFolge_prevSim(i)

c - PREVIOUS SIMULATION:

            if (par_prevSim(2,par_).NE.1.E10) then       ! wurde maxWert vorgegeben?
                if (par_prevSim(2,par_).EQ.par_prevSim(1,par_) .OR. par_prevSim(3,par_).EQ.0.) then
                    par_prevSim(2,par_) = par_prevSim(1,par_)
                    par_prevSim(3,par_) = 1.
                else                                ! wurde step vorgegeben?
                    if (par_prevSim(3,par_).EQ.-1.E10) then
			par_prevSim(3,par_) = par_prevSim(2,par_) - par_prevSim(1,par_)
		    endif
                endif
	    else
		if (par_.EQ.UGua .AND. par_prevSim(1,UGua).EQ.-1.E10) then
		    guard = .false.		    ! default = .true.
		    par(1,UGua) = 0.
		    par(2,UGua) = 0.
		    par_prevSim(1,UGua) = 0.
		endif
		par_prevSim(2,par_) = par_prevSim(1,par_)
		par_prevSim(3,par_) = 1.
	    endif
	    factor = 1
	    step = par_prevSim(3,par_)
2	    do help = par_prevSim(1,par_), par_prevSim(2,par_), step
		! just count the loop index
	    enddo
            if ((help-par_prevSim(2,par_))/step.LT.1.E-4) then
                factor = factor - 0.00000003 ! (smallest number that works)
                step = par_prevSim(3,par_) * factor
	        goto 2
            endif
            par_prevSim(3,par_) = step
            n_par_prevSim(par_) = int((par_prevSim(2,par_)-par_prevSim(1,par_)+par_prevSim(3,par_))/par_prevSim(3,par_) +.5)
	    if (n_par_prevSim(par_).LE.0) n_par_prevSim(par_)=1

c - MUTRACK:

            if (par(2,par_).NE.1.E10) then	    ! wurde maxWert vorgegeben?
                if (par(2,par_).EQ.par(1,par_) .OR. par(3,par_).EQ.0.) then
                    par(2,par_) = par(1,par_)
                    par(3,par_) = 1.
                else                                ! wurde step vorgegeben?
                    if (par(3,par_).EQ.-1.E10) then
			par(3,par_) = par(2,par_) - par(1,par_)
		    endif
                endif
	    else
		par(2,par_) = par(1,par_)
		par(3,par_) = 1.
	    endif
	    factor = 1
	    step = par(3,par_)
3	    do help = par(1,par_), par(2,par_), step
		! just count the loop index
	    enddo
            if ((help-par(2,par_))/step.LT.1.E-4) then
                factor = factor - 0.00000003 ! (smallest number that works)
                step = par(3,par_) * factor
	        goto 3
            endif
            par(3,par_) = step
            n_par(par_) = int((par(2,par_)-par(1,par_)+par(3,par_))/par(3,par_) +.5)
	    if (n_par(par_).LE.0) n_par(par_)=1
	enddo


c Pruefe, ob die von MUTRACK zu verwendenden Werte eine Teilmenge derjenigen
c Werte darstellen, die von ACCEL bzw. waehrend 'createFoilFile' verwendet
c wurden:

	do i = 1, par_Anzahl_prevSim
     	    par_ = reihenFolge_prevSim(i)
	    if (par_.EQ.charge.AND.artList_defined) goto 10
	    if (n_par(par_).GT.n_par_prevSim(par_)) then
		errorNr = 1
		goto 9999
	    endif

	    von    = par(1,par_)
	    bis    = par(2,par_)
	    step   = par(3,par_)
	    von_prevSim  = par_prevSim(1,par_)
	    bis_prevSim  = par_prevSim(2,par_)
	    step_prevSim = par_prevSim(3,par_)

c die folgenden Zeilen nochmals ueberpruefen:

	    if (n_par(par_).EQ.1) then
		if (n_par_prevSim(par_).EQ.1) then
		    if (von_prevSim.EQ.0) then
			if (abs(von.GT.1.E-4)) then
			    errorNr = 2
			    goto 9999
			endif
		    elseif (abs((von_prevSim-von)/von_prevSim).GT.1.E-4) then
			errorNr = 3
			goto 9999
		    endif
		else
		    firstIndx_ = int((von-von_prevSim)/step_prevSim + 0.5) + 1
		    if ( (firstIndx_.LT.1 .OR. firstIndx_.GT.n_par_prevSim(par_)) .OR.
     +		    (abs((von_prevSim+(firstIndx_-1)*step_prevSim-von)/step_prevSim).GT.1.E-4)) then
			errorNr = 4
			goto 9999
		    endif
		endif

	    else

		firstIndx_ = int((von-von_prevSim)/step_prevSim + 0.5) + 1
		if ( (firstIndx_.LT.1 .OR. firstIndx_.GT.n_par_prevSim(par_)) .OR.
     +		(abs((von_prevSim+(firstIndx_-1)*step_prevSim-von)/step_prevSim).GT.1.E-4)) then
		    errorNr = 5
		    goto 9999
		endif
		lastIndx_ = int((bis-von_prevSim)/step_prevSim + 0.5) + 1
		if ( (lastIndx_.LT.1 .OR. lastIndx_.GT.n_par_prevSim(par_)) .OR.
     +		(abs((von_prevSim+(lastIndx_-1)*step_prevSim-bis)/step_prevSim).GT.1.E-4)) then
		    if (lastIndx_.LT.1) then
			write(*,*) 'I: lastIndx_ = ',lastIndx_
		    endif
		    if (lastIndx_.GT.n_par_prevSim(par_)) then
			write(*,*) 'II : lastIndx_      = ',lastIndx_
			write(*,*) 'II : n_par_prevSim(par_) = ',n_par_prevSim(par_)
		    endif
		    if ((abs((von_prevSim+(lastIndx_-1)*step_prevSim-bis)/step_prevSim).GT.1.E-4)) then
			write(*,*) 'III: lastIndx_-1 = ',lastIndx_-1
			write(*,*) 'III: von_prevSim+(lastIndx_-1)*step_prevSim-bis = ',von_prevSim+(lastIndx_-1)*step_prevSim-bis
			write(*,*) 'III: ((von_prevSim+(lastIndx_-1)*step_prevSim-bis)/step_prevSim = ',
     +			(von_prevSim+(lastIndx_-1)*step_prevSim-bis)/step_prevSim
		    endif
		    errorNr = 6
		    goto 9999
		endif
		iHelp = int(step/step_prevSim + 0.5)
		if (abs((iHelp*step_prevSim-step)/step_prevSim).GT.1.E-4) goto 9999
	    endif
10	enddo

c -> falls wir hier ankommen, sind die beiden Parametersaetze kompatibel!


	RETURN

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

9999	continue    ! -> Fehlermeldung
	write(*,*)
	write(*,*) ' ================================================================='
	write(*,*) ' | Mutrack-Vorgabe ist nicht kompatibel mit frueherer Simulation |'
	write(*,*) ' | errorCode = ',errorNr,'                                       |'
	write(*,*) ' ================================================================='
	write(*,*)
	write(*,*)
	write(*,*) 'par_ = ',par_
	write(*,*)
	write(*,*) '  Werte bei frueherer Simulation:'
	if (n_par_prevSim(par_).LE.1) then
	    write (*,*) '  ',par_text(par_)(1:10),' = ',von_prevSim
	elseif (n_par_prevSim(par_).EQ.2) then
	    write (*,*) '  ',par_text(par_)(1:10),' = ',von_prevSim,bis_prevSim
	else
	    write (*,*) '  ',par_text(par_)(1:10),' = ',von_prevSim,bis_prevSim,step_prevSim
	endif
	write(*,*) '  jetztige Wertevorgabe:'
	if (n_par(par_).LE.1) then
	    write (*,*) '  ',par_text(par_)(1:10),' = ',von
	elseif (n_par(par_).EQ.2) then
	    write (*,*) '  ',par_text(par_)(1:10),' = ',von,bis
	else
	    write (*,*) '  ',par_text(par_)(1:10),' = ',von,bis,step
	endif
	write(*,*) ' ======================================================='
	write(*,*)
	call exit


	END


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

	OPTIONS /EXTEND_SOURCE

	integer*4 function firstEventNr()
c       =================================

        IMPLICIT NONE

        INCLUDE 'mutrack$sourcedirectory:COM_MUTRACK.INC'
	INCLUDE 'mutrack$sourcedirectory:COM_DIRS.INC'

	real	par_prevSim(3,par_Anzahl),n_par_prevSim(par_Anzahl)
	integer par_Anzahl_prevSim,reihenFolge_prevSim(par_Anzahl)
	integer artListIndx_prevSim(arten_zahl)

	COMMON /prevSim/ par_Anzahl_prevSim,reihenFolge_prevSim,par_prevSim,n_par_prevSim
	COMMON /prevSim/ artListIndx_prevSim

	integer qIndxMu
	common /qIndxMu/ qIndxMu

	integer loopNr_prevSim,parIndx_prevSim,i,par_

c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

	loopNr_prevSim = 1
	do i = 1, par_Anzahl_prevSim
	    par_ = reihenFolge_prevSim(i)
            if (n_par_prevSim(par_).GT.1) then
		if (par_.EQ.charge .AND. artList_defined) then
		    parIndx_prevSim = artListIndx_prevSim(qIndxMu)
		    write(*,*)
		    write(*,*) 'parIndx_prevSim = ',parIndx_prevSim
		    write(*,*)
		else
		    parIndx_prevSim = int( (parWert(par_)-par_prevSim(1,par_))/par_prevSim(3,par_) + 0.5) + 1
		endif
                loopNr_prevSim = (loopNr_prevSim-1)*n_par_prevSim(par_) + parIndx_prevSim
            endif
	enddo
 	firstEventNr = (loopNr_prevSim-1)*randomStarts_prevSim


	END


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