#!/usr/local/bin/tcsh
###########################################################################
#
#    J A D E S I M
#    =============
#
# Steering job for the Monte Carlo simulation of the JADE detector.
#
# 06/06/00  P.A. Movilla Fernandez
# 25/06/03  PMF last mod. 
#
#
# FFREAD input card templates needed:
#               GEN.CARD      for the event generation
#                      (additional files for a COJETS job: cj623inp.dat, cj623tab.dat)
#               GEN_JT63.CARD for the event generation using Jetset6.3 (JADE tuning)
#               MC.CARD       for the MC tracking
#               SV.CARD       for the MC smearing plus reconstruction
#               ZE.CARD       for the data compression into ZE4V format
#
###########################################################################

# *****************************************************
# THE IBM LOADLEVLER IS NOT SUPPORTED BY MPI ANYMORE!!!
# *****************************************************
#
# IBM LoadLeveler settings  
# @ job_name     = jadesim_py57
# @ shell        = /usr/local/bin/tcsh
# @ executable   = jadesim.csh
# @ class        = large
# @ input        = /dev/null
# @ output       = $(Executable).$(Cluster).$(Process).out
# @ error        = $(Executable).$(Cluster).$(Process).err
# @ initialdir   = /mnt/home/pedro/jadesoft/job/jadesim/
# @ notify_user  = <set here your user name>
# @ notification = complete
# @ requirements = (Arch == "R6000") && (OpSys == "AIX43") && (Machine == "iwsrz3.mppmu.mpg.de" ) 
# @ environment  = COPY_ALL
# @ queue
# 'fast' machines: iwsh1-4 iwsh1-5 iwsh1-6  iwstheo2 iwsrz3 iwsatlas2
# rsh comps1 "(cd  /mnt/home//pedro/jadesoft/job/jadesim/; /usr/local/bin/llsubmit jadesim)"

# Fetch some environment variables needed
source ../../Init_jade_env.csh
if( $status != 0 ) then
    exit -9
endif
#================== SET HERE SOME MONTE CARLO PARAMETERS ==================

# Center of mass energy/tracking simulation code (14 22 35a 35b 38 44)
set ecm = 35b

# Total number of events to generate
set nev_tot = 10000

# Maximum number of events to generate per sequence
set nev_seq = 5000

# Type of event generator (jt63 py57 hw59 ar48p cj623)
# NB.: $gen is a code for the event generator to be used in the case $file_gen = ()
#      Otherwise $gen is only used for labeling the output files.
set gen = jt63

# JADE detector configuration (depending on $ecm)
if      ( ${ecm:r} == 14 ) then 
    set cms = 14.0; set year=81; set month=07; set day=17; set tr=81
else if ( ${ecm:r} == 22 ) then
    set cms = 22.0; set year=81; set month=06; set day=17; set tr=81
else if ( ${ecm:r} == 44 ) then
    set cms = 43.8; set year=85; set month=05; set day=17; set tr=85
else if ( ${ecm:r} == 35a ) then
    set cms = 34.6; set year=82; set month=05; set day=17; set tr=82
else if ( ${ecm:r} == 35b ) then
    set cms = 35.0; set year=86; set month=05; set day=17; set tr=86
else if ( ${ecm:r} == 38 ) then
    set cms = 38.3; set year=85; set month=10; set day=01; set tr=85
else
    echo "...Detector configuration for ecm=$ecm not yet specified\!"
    goto error
endif

#==================== SET HERE SOME I/O OPTIONS ===========================


# Initial sequence number
#    1: reset random seed; 
# else: use seed given by last entry of status files
set start_seq = 1

# Specify machine responsible for the compression of output data files
# (Since the gzip command will be transferred via rsh, you must intercept
# a password request by editing an appropriate ${HOME}/.rhost file.)

#set gzipmachine  = iwsatlas2
set gzipmachine  = pcl2483 

# Set the location of job I/O 
#set stagein = /home/iwsatlas2/pedro/out/jt63_35.0_86-05-17
#set stageout = /home/iwsatlas2/pedro/out
set stagein  = out/jt63_35.0_86-05-17
set stageout = out

# Input files for the lowermost active level
# NB: THE FILE NAMES INCL. PATH MUST NOT EXCEED 78 CHARACTERS!!!!
#     (DUE TO FFREAD)
#### level 1 ####
set file_gen = ( ) 
#set file_gen = ( $stagein/gen/jt63_35.0.cprod.* )

#### level 2 ####
set file_mc  = ( )
#set file_mc = ( $stagein/mc/mc_jt63_35.0_86-05-17.bos* )

#### level 3 ###
set file_sv  = ( )
#set file_sv = ( $stagein/sv/sv_jt63_35.0_86-05-17.bos* )

# Specify the highest level to process: 1=generator 2=mcjade 3=superv 4=ze4v
set end = 4

# Set scratch directory
set sdir = $stageout/${gen}_${cms}_${year}-${month}-${day}_$$

# Job directory (where this job-script is located)
set jdir = ${JADE_JOB}/jadesim

# Save option for generated *.bos/*.bnk files ('on' or 'off')
set save_gen = on
set save_mc  = on       # <- memory consuming!!!
set save_sv  = on       # <- memory consuming!!!
set save_ze  = on

#========== EXECUTABLES AND PATH OF THE CALIBRATIONS FILES ================

# Executables in $mcgen, $mcjade, $superv, $ze4v
switch ($gen)
 case jt63:
 case py57:
 case hw58d:
 case hw59:
 case ar48p:
 case cj623:
 set mcgen = ${JADE_MCBIN}/mc${gen}_105j.run
 breaksw
 default:
  echo "Generator corresponding to $gen is not available\!" 
  goto error
endsw
set mcjade = ${JADE_BIN}/mcjade
set superv = ${JADE_BIN}/superv
set ze4v   = ${JADE_BIN}/ze4v

# Calibration files
set aupdat0 = ${JADE_CAL}/aupdat1.b
set bupdat0 = " "#${JADE_CAL}/bupdat0.b
set bupdat1 = " "#${JADE_CAL}/bupdat1.b

#=========================== END OF SETTINGS ==============================

### Check current platform
if ( `uname` != "AIX" && $end != 1 ) then
  echo "Current platform `uname` is not supported\!"
  exit
endif
unset time

### Find out the start level
set start = 1
if ( "x$file_gen" != x ) set start = 2
if ( "x$file_mc"  != x ) set start = 3
if ( "x$file_sv" != x )  set start = 4

### Check level specificiation
if ( $end > 4 ) set end = 4
if ( $start > $end ) then
 echo "start level=$start > end level=$end"
 goto error
endif
if ( $start == 2 ) then
    set main = "mcjade"; set save_gen = off
endif
if ( $start == 3 ) then
    set main = "superv"; set save_mc  = off; set save_gen = off
endif
if ( $start == 4 ) then
    set main = "ze4v"; set save_sv  = off; set save_mc  = off; set save_gen = off
endif

### Basenames of generated I/O files
if ( $year > 1900 ) @ year = $year - 1900
set tr    = ${year}-${month}-${day}
set name  = ${gen}_${cms}_${tr}
set gname = ${gen}_${cms}
set out_gen = $gname
set out_mc  = mc_$name
set out_sv  = sv_$name
set out_ze  = ze_$name

set bra1 = ""; set ket1 = ""; set bra2 = ""; set ket2 = ""
if ( $start > 1 ) then
    set bra1 = "("; set ket1=")"
endif
if ( $start > 2 || ( $start == 1 && $end < 2  ) ) then
    set bra2 = "("; set ket2 = ")"
endif

### FFREAD card templates
#set ffgen = $jdir/${gen:au}.CARD
if ( $gen == "jt63" ) then
 set ffgen = $jdir/GEN_JT63.CARD
else
 set ffgen = $jdir/GEN.CARD
endif
set ffmc = $jdir/MC.CARD
set ffsv = $jdir/SV.CARD
set ffze = $jdir/ZE.CARD
foreach i ( $ffgen $ffmc $ffsv $ffze )
  if ( ! -e $i ) then
     echo "... FFREAD card $i not found\!\!\!"
     goto error
  endif
end

### Sort the file names according to the running file number
if ( ${#file_gen} != 0 ) then
 set col = ( `\ls -1 ${file_gen[1]}  | sed "s/\./\ /g"` )
 @ n = ${#col} - 2
 set file_gen = ( `\ls -1 ${file_gen} | sort -t. -n +$n` )
endif
if ( ${#file_mc} != 0 ) then
 set col = ( `\ls -1 ${file_mc[1]}  | sed "s/\./\ /g"` )
 @ n = ${#col} - 2
 set file_mc = ( `\ls -1 ${file_mc} | sort -t. -n -k ${#col}` )
endif
if ( ${#file_sv} != 0 ) then
 set col = ( `\ls -1 ${file_sv[1]}  | sed "s/\./\ /g"` )
 @ n = ${#col} - 2
 set file_sv = ( `\ls -1 ${file_sv} | sort -t. -n -k ${#col}` )
endif

### Print out some info
echo '+========================================================================+'
echo '|                                                                        |'
echo '|                          J  A  D  E  S  I  M                           |'
echo '|                                                                        |'
echo '|                          Version:   06/06/00                           |' 
echo '|                                                                        |'
echo '+========================================================================+'
echo ""
echo "Job date:" `date`
echo "Machine :" `hostname`
echo ""
echo "--------------------------------------------------------------------------"
echo "Monte Carlo parameters:"
echo " Total number of events        :" $nev_tot
echo " Max. number of events/sequence:" $nev_seq
echo " Center-of-mass energy [GeV]   :" ${bra1}${cms}${ket1}
echo " MC generator                  :" ${bra1}${gen}${ket1}
echo " Detector configuration        :" ${bra2}${tr}${ket2}
echo "--------------------------------------------------------------------------"
echo "Programs used:"
if ( $start == 1 ) echo " Generator:" $mcgen
if ( $start <= 2 && $end >= 2 ) echo " MCJADE   :" $mcjade
if ( $start <= 3 && $end >= 3 ) echo " SUPERV   :" $superv
if ( $end  == 4 ) echo " ZE4V     :" $ze4v
echo "--------------------------------------------------------------------------"
echo "I/O file names used:"
if ( $start == 1 ) echo " Generator:" $out_gen.cprod .log .hist  mcrncnt.dat mcrnset.dat
if ( $start == 2 && $end >= 2 ) then
    echo " Generator:"
    foreach i ($file_gen)
	echo "           " $i
	if ( ! -e $i ) then
	    echo "... file does not exist\!\!\!"
 	    goto error
        endif
    end
endif
if ( $start <= 2 && $end >= 2 ) echo " MCJADE   :" $out_mc.bos .log .hist .bnk mcjade.stat
if ( $start == 3 && $end >= 3 ) then
    echo " MCJADE   :"
    foreach i ($file_mc)
	echo "           " $i
	if ( ! -e $i ) then
	    echo "... file does not exist\!\!\!"
 	    goto error
        endif
    end
endif
if ( $start <= 3 && $end >= 3 ) echo " SUPERV   :" $out_sv.bos .log .hist .bnk superv.stat
if ( $start == 4 && $end == 4 ) then
    echo " SUPERV   :"
    foreach i ($file_sv)
	echo "           " $i
	if ( ! -e $i ) then
	    echo "... file does not exist\!\!\!"
 	    goto error
        endif
    end
endif
if ( $end == 4 ) echo " ZE4V     :" $out_ze.ze4v .log .bos .bnk  ze4v.stat
echo "--------------------------------------------------------------------------"
echo "Calibration files used:"
if ( x$aupdat0 != "x" ) echo "     " $aupdat0
if ( x$bupdat0 != "x" ) echo "     " $bupdat0
if ( x$bupdat1 != "x" ) echo "     " $bupdat1
echo "--------------------------------------------------------------------------"
echo ""
echo "Will try to process $nev_tot events at the levels"
echo ""
if ( $start ==  1 )              echo "                -> 1: Event generation (${mcgen:t})"
if ( $start <=  2 && $end >= 2 ) echo "                -> 2: Detector tracking (mcjade)"
if ( $start <=  3 && $end >= 3 ) echo "                -> 3: Smearing and event reconstruction (superv)"
if ( $end == 4 )                 echo "                -> 4: Data compression into ZE4V format (ze4v)"
echo ""
echo "Initial job directory is :" $jdir
echo "Scratch directory is     :" $sdir
echo ""

### Initialize event counters
set firstseq  = yes
@ iev         = $nev_tot
@ events      = 0
@ events_save = 0
@ events_seq  = 0
@ ifile       = 0
@ iseq        = $start_seq - 1
@ firstevt    = 1
@ lastevt     = 0
if( $iseq < 0 ) set iseq = 0
if( $nev_seq > $nev_tot ) set nev_seq = $nev_tot
@ startevt = 1
set random = default

### Fetch initial event number from status file
if ( $iseq > 0 && $start > 1 ) then
 echo "Start sequence    :" $start_seq
 if ( -e $main.stat ) then 
    set lines = `cat $main.stat | wc -l` 
    if ( $lines != "0" ) then 
	@ events_save = `cat $main.stat | grep "#" | tail -1 | awk ' {print $NF } '`
	@ startevt = $events_save + 1
	echo "Fetching initial event number from file $main.stat."
    else
        echo "File $main.stat is empty."
    endif
 else
    echo "File $main.stat does not exist."
 endif
 echo "Start event number:" $startevt
 echo ""
endif
######### Begin of job sequence #########

### Create scratch directory
mkdir -p $sdir
cd $sdir

### Special for Cojets job
if ( $gen == "cj623" ) then 
    cp -f ${JADE_JOB}/jadesim/{cj623inp.dat,cj623tab.dat} $sdir/.
    set COJETS = ""
else
    set COJETS = "C "
endif


while ( $iev > 0 )
### Set max. number of events for the current sequence
   @ nev_seq0 = $nev_seq
   if ( $iev < $nev_seq ) set nev_seq = $iev
   @ iseq = $iseq + 1
### First and last event
   set message = "Sequence $iseq for max. $nev_seq events, $iev remaining events"
   if ( $start > 1 ) then
	@ firstevt = $firstevt + $events_seq
	if ( $events_seq < $nev_seq0 ) then
          @ ifile = $ifile + 1
	  if ( $firstseq == "yes" ) then
	    @ firstevt = $startevt
	  else
	    @ firstevt  = 1
	  endif
          if( $firstseq != "yes"  && $events_seq == 0 ) then
	    @ iseq = $iseq - 1
	    set message = "Repeat sequence $iseq for max. $nev_seq events, $iev remaining events"
	    if ( -e $main.stat ) then
		echo "Will remove last seed (11 lines) in $main.stat."
		set line = `cat $main.stat| wc -l`
		awk " NR < $line - 10" $main.stat > $main.stat.tmp
		mv -f $main.stat.tmp $main.stat
	    endif
	  endif
        endif
   else
	@ firstevt = 1
   endif
   @ lastevt = $firstevt + $nev_seq - 1
   set firstseq = no
   echo "=========== $message ==========="
### Flag for initializing the random number generators
   if( $iseq == 1 ) then
    set MCSTART = ON
   else
    set MCSTART = OFF
   endif
### Jump to first active level
   goto level$start

		    #######################
		    #  G E N E R A T O R  #
		    #######################
level1:
# - Initialize random number generator
  if( $MCSTART == "ON" ) then 
      echo Will remove mcrnset.dat and mcrncnt.dat.
      rm -f mcrnset.dat mcrncnt.dat
  endif
# - Remove probably existing cprod file
  rm -f $out_gen.cprod
# - Prepare FFREAD card
  sed "s|<MCSTART>|$MCSTART|;s|<NEVT>|$nev_seq|;s|<ECMS>|$cms|;s|<NAME>|$out_gen|;s|<COJETS>|$COJETS|" $ffgen > ${ffgen:t}.tmp

  if ( $status != "0" ) goto error
# - Get current random number sequence
  if ( -e mcrnset.dat ) set random = `grep 1234567 mcrnset.dat | tail -1`
# - Start generator job
  echo "... starting ${mcgen:t}: events=$firstevt-$lastevt status=($random) date=(`date`)"
  $mcgen <  ${ffgen:t}.tmp > $out_gen.log
  if ( $status != "0" ) goto error
# - Get number of processed events 
  @ events = $events + $nev_seq
# - Skip the following levels if demanded 
  if ( $end <= 1 ) goto next

		    #################
		    #  M C J A D E  #
		    #################
level2:
# - Get current random number sequence
  if( $MCSTART == "ON"  ) then
        echo Will remove mcjade.stat.
        rm -f mcjade.stat
  else
    if ( -e mcjade.stat ) set lines = `cat mcjade.stat | wc -l` 
    if ( -e mcjade.stat && $lines != "0" ) then 
	set random = `cat mcjade.stat | grep "#" | tail -1 | cut -c2- `
    else
	echo "mcjade.stat does not exist, will use default seed."
	set random = "default"
    endif
  endif
# - First and last event
  if ( $start == 2 ) then
      if ( $ifile > $#file_gen ) goto fin 
      set input = $file_gen[$ifile]
      set firstevt0 = $firstevt; set lastevt0 = $lastevt
      if( ${input:e} == "gz" ) then
	/usr/bin/rsh $gzipmachine "( cd $sdir; gunzip -f $input )" >& /dev/null ; sleep 2
	set input = ${input:r}
      endif
  else
      set input = $out_gen.cprod
      set firstevt0 = 1; set lastevt0 = $nev_seq
  endif
# - Prepare FFREAD card
  sed "s|<MCSTART>|$MCSTART|;s|<FIRST>|$firstevt0|;s|<LAST>|$lastevt0|;s|<VECT>|$input|;s|<NAME>|$out_mc|;s|<YEAR>|$year|;s|<MONTH>|$month|;s|<DAY>|$day|" $ffmc > ${ffmc:t}.tmp
  if ( $status != "0" ) goto error
# - Start MCJADE job
  echo "... mcjade input file: $input"
  echo "... starting ${mcjade:t}: events=$firstevt0-$lastevt0 status=($random) date=(`date`)"
  $mcjade < ${ffmc:t}.tmp > $out_mc.log
  if ( $status != "0" ) goto error
# - Get number of processed events 
  if ( $start == 2 ) @ events = `cat mcjade.stat | grep "#" | tail -1 | awk ' {print $NF } '`
# - Skip the following levels if demanded 
  if ( $end <= 2 || $events == $events_save ) goto next

		    #################
		    #  S U P E R V  #
		    #################
level3:
# - Get current random number sequence
  if( $MCSTART == "ON"  ) then
        echo Will remove superv.stat.
        rm -f superv.stat
  else
    if ( -e superv.stat ) set lines = `cat superv.stat | wc -l` 
    if ( -e superv.stat && $lines != "0" ) then 
	set random = `cat superv.stat | grep "#" | tail -1 | cut -c2- `
    else
	echo "superv.stat does not exist, will use default seed."
	set random = "default"
    endif
  endif
# - First and last event
  if ( $start == 3 ) then
      if ( $ifile > $#file_mc ) goto fin 
      set input = $file_mc[$ifile]
      set firstevt0 = $firstevt; set lastevt0 = $lastevt
      if( ${input:e} == "gz" ) then
	/usr/bin/rsh $gzipmachine "( cd $sdir; gunzip -f $input )" >& /dev/null ; sleep 2
	set input = ${input:r}
      endif
  else
      set input = $out_mc.bos
      set firstevt0 = 1; set lastevt0 = $nev_seq
  endif
# - Prepare FFREAD card
  sed "s|<MCSTART>|$MCSTART|;s|<FIRST>|$firstevt0|;s|<LAST>|$lastevt0|;s|<MCBOS>|$input|;s|<NAME>|$out_sv|;s|<AUPDAT0>|$aupdat0|;s|<BUPDAT0>|$bupdat0|;s|<BUPDAT1>|$bupdat1|" $ffsv > ${ffsv:t}.tmp
  if ( $status != "0" ) goto error
# - Start SUPERV job
  echo "... superv input file: $input"
  echo "... starting ${superv:t}: events=$firstevt0-$lastevt0 status=($random) date=(`date`)"
  $superv < ${ffsv:t}.tmp > $out_sv.log
  if ( $status != "0" ) goto error
# - Get number of processed events 
  if ( $start == 3 ) @ events = `cat superv.stat | grep "#" | tail -1 | awk ' {print $NF } '`
# - Skip the following levels if demanded
  if ( $end <= 3 || $events == $events_save ) goto next

		    #############
		    #  Z E 4 V  #
		    #############
level4:
# - Get current random number sequence
  if( $MCSTART == "ON"  ) then
        echo Will remove ze4v.stat.
        rm -f ze4v.stat
  else
    if ( -e ze4v.stat ) set lines = `cat ze4v.stat | wc -l` 
    if ( -e ze4v.stat && $lines != "0" ) then 
	set random = `cat ze4v.stat | grep "#" | tail -1 | cut -c2- `
    else
	echo "ze4v.stat does not exist, will use default seed."
	set random = "default"
    endif
  endif
# - First and last event
  if ( $start == 4 ) then
      if ( $ifile > $#file_sv ) goto fin 
      set input = $file_sv[$ifile]
      set firstevt0 = $firstevt; set lastevt0 = $lastevt
      if( ${input:e} == "gz" ) then
	/usr/bin/rsh $gzipmachine  "( cd $sdir; gunzip -f $input )" >& /dev/null ; sleep 2
	set input = ${input:r}
      endif
  else
      set input = $out_sv.bos
      set firstevt0 = 1; set lastevt0 = $nev_seq
  endif
# - Prepare FFREAD card
  @ scip = $firstevt0 - 1; @ lastevt0 = $firstevt0 + $nev_seq - 1
  sed "s|<MCSTART>|$MCSTART|;s|<NEVT>|$lastevt0|;s|<SKIP>|$scip|;s|<SVBOS>|$input|;s|<NAME>|$out_ze|;s|<AUPDAT0>|$aupdat0|;s|<BUPDAT0>|$bupdat0|;s|<BUPDAT1>|$bupdat1|" $ffze > ${ffze:t}.tmp
# - Start ZE4V job
  echo "... ze4v input file: $input"
  echo "... starting ${ze4v:t}: events=$firstevt0-$lastevt0 status=($random) date=(`date`)"
  $ze4v < ${ffze:t}.tmp > $out_ze.log
  if ( $status != "0" ) goto error
# - Get number of processed events 
  if ( $start == 4 ) @ events = `cat ze4v.stat | grep "#" | tail -1 | awk ' {print $NF } '`


next:
### Compress input file
#if ( $start > 1 ) ( /usr/bin/rsh $gzipmachine "( cd $sdir; nohup gzip -f $input &; exit )" & )  >& /dev/null

### Save generated output files
 if ( $events != $events_save ) then
    foreach typ ( gen mc sv ze )
	set cmd = 'set saveopt = $'save_$typ; eval $cmd
	if ( $saveopt == "on" ) then
	    set cmd = 'set out = $'out_$typ.xxx; eval $cmd
	    echo "... saving $out files to $typ/$out.$iseq.gz"
	endif
	foreach suf ( log cprod hist bos ze4v bnk )
	    set cmd = 'set out = $'out_$typ.$suf; eval $cmd
	    if      ( -e $out && ( $saveopt == on || $suf == "log" || $suf == "hist" || $suf == "ze4v" ) ) then
		if ( ! -e $typ ) mkdir $typ
		mv -f $out $typ/$out.$iseq
		# Perform data compression on the machine where the data is located (much more faster !!!)
	    	( /usr/bin/rsh $gzipmachine  "( nohup gzip -f $sdir/$typ/$out.$iseq & ; exit )" & ) >& /dev/null
	    #else if ( -e $out && $saveopt != on && $suf != "log" && $suf != "hist"  && $suf != "ze4v" ) then
	    #	( /usr/bin/rsh $gzipmachine  "( nohup rm -f $sdir/$out & ; exit )" & ) >& /dev/null
	    else
	        rm -f $out
	    endif
	end
    end
 endif

############# End of job sequence #############

# - update remaining number of events to generate
  @ events_seq = $events - $events_save
  @ events_save = $events  
  @ iev = $iev - $events_seq
  echo "Done with $events_seq/$events events."
end

### The End
fin:
echo ""
if( $iev > 0 ) then
 @ done = $nev_tot - $iev
 echo "$done out of $nev_tot events were processed successfully\!"
 if( $start > 1 ) echo "Presumably the number input events is smaller than the requested number of events\!"
else
 echo "$nev_tot events processed successfully\!"
endif

echo ""
echo "Scratch directory was  :" $sdir
echo "End of job             :" `date`
exit 0


### Error handling
error:
echo ""
echo "\!\!\! An error has occured. Program will stop now."
exit 0
#
