#################################################################################################
#
# runsDirectoriesContruction()
#
#   Costruisce la struttura a cartelle per le run parallele
#   all'interno della working directory
#
# Parametri
#
#   workingDirectoryAbsolutePath: path assoluto della working directory per la elaborazione
#   numberOfParallelRuns:         numero di run parallele previste per la stessa elaborazione 
#                                 Nel caso in cui il file delle science window non contenga
#                                 delimitatori di run, puo' essere un qualunque valore maggiore
#                                 di 0, altrimenti deve coincidere con il numero di tali
#                                 delimitatori.
#    exeLogAbsolutePath:          path assoluto del file di log per l'elaborazione
#
#################################################################################################

function runsDirectoriesContruction()
   {
   # Inizializza le variabili mnemoniche per i parametri
   workingDirectoryAbsolutePath=$1
   numberOfParallelRuns=$2
   exeLogAbsolutePath=$3
  
   # Traccia l'ingresso nella funzione
   appendToLog "$(dateTime) ${FUNCNAME[0]}() - $MSG_INTO" \
               "$exeLogAbsolutePath"
			   
   # Testare
   #
   # Visualizzare il contenuto del file di log
   #
   # cat $exeLogAbsolutePath
   # exit
   
   # Crea una cartella per ogni run parallela all'interno della working directory
   # assegnandogli come nome quello della stessa working directory seguito da un progressivo
   # da 1 al numero delle run paralllele rappresentato con 3 cifre
   for run in $(seq $numberOfParallelRuns)
   do 
      # Forma il path assoluto della directory
	  dirAbsolutePath="$workingDirectoryAbsolutePath/$workingDrectory-$(printf "%03d" $run)"

      # Crea la Directory	  
      mkdir $dirAbsolutePath

      # Traccia la creazione della directory
      appendToLog "$(dateTime) ${FUNCNAME[0]}() - $RUN_DIR_SUCCESSFULLY_CREATED $dirAbsolutePath" \
                  "$exeLogAbsolutePath"

	  # Testare
      #
      # Visualizzare il contenuto del file di log
      #
      # cat $exeLogAbsolutePath
      # exit
   done
   
   # Traccia l'uscita dalla funzione	  
   appendToLog "$(dateTime) ${FUNCNAME[0]}() - $MSG_OUT" \
               "$exeLogAbsolutePath"
			   
   # Testare
   #
   # Visualizzare il contenuto del file di log
   #
   # cat $exeLogAbsolutePath
   # exit		   
   }
   
#################################################################################################
#
# runsSetUp()
#
#   Copia all'interno di ognuna delle cartelle assegnate alle run tutto quanto necessario per
#   la loro esecuzione
#
# Parametri
#
#   listOfScwsAbsolutePath: path assoluto del file di testo delle science window da elaborare
#   workingDirectoryAbsolutePath: path assoluto della working directory per la elaborazione
#   numberOfParallelRuns:         numero di run parallele previste per la stessa elaborazione 
#                                 Nel caso in cui il file delle science window non contenga
#                                 delimitatori di run, puo' essere un qualunque valore maggiore
#                                 di 0, altrimenti deve coincidere con il numero di tali
#                                 delimitatori.
#   numberOfRunDelimiters:        numero di delimitatori di run all'interno del file delle scw
#   exeLogAbsolutePath:           path assoluto del file di log per l'elaborazione
#
#################################################################################################

function runsSetUp()
   {
   # Inizializza le variabili mnemoniche per i parametri
   listOfScwsAbsolutePath=$1
   workingDirectoryAbsolutePath=$2
   numberOfParallelRuns=$3
   numberOfRunDelimiters=$4
   exeLogAbsolutePath=$5
  
   # Traccia l'ingresso nella funzione
   appendToLog "$(dateTime) ${FUNCNAME[0]}() - $MSG_INTO" \
               "$exeLogAbsolutePath"
			   
   # Testare
   #
   # Visualizzare il contenuto del file di log
   #
   # cat $exeLogAbsolutePath
   # exit
   
   # Per ognuna delle run parallele
   for run in $(seq $numberOfParallelRuns)
   do 
      # Forma il path assoluto della directory assegnata alla run
      runDirAbsolutePath="$workingDirectoryAbsolutePath/$workingDrectory-$(printf "%03d" $run)"
	  
      # Forma il path assoluto della directory delle osservazioni
      obsDirAbsolutePath="runDirAbsolutePath/$OBSERVATIONS_DIRECTORY"

      # Crea all'interno della directory assegnata alla run quella destinata a contenere
	  # le osservazioni 	  
      mkdir $obsDirAbsolutePath

      # Traccia la creazione della directory
      appendToLog "$(dateTime) ${FUNCNAME[0]}() - $OBS_DIR_SUCCESSFULLY_CREATED $obsDirAbsolutePath" \
                  "$exeLogAbsolutePath"
				  
      # Testare
      #
      # Visualizzare il contenuto del file di log
      #
      # cat $exeLogAbsolutePath
      # exit
				  
      # Crea all'interno della directory assegnata alla run il link alla directory ic
	  # all'interno dell'archivio dei dati Integral
      ln -s $PATH_OF_IC $runDirAbsolutePath
	  
      # Testare
      #
      # Visualizzare il contenuto della directory assegnata alla run
      #
      # ls -a $runDirAbsolutePath
      # exit
	  
      # Traccia la creazione del link
      appendToLog "$(dateTime) ${FUNCNAME[0]}() - $IC_LINK_SUCCESSFULLY_CREATED $PATH_OF_IC" \
                  "$exeLogAbsolutePath"
				  
      # Testare
      #
      # Visualizzare il contenuto del file di log
      #
      # cat $exeLogAbsolutePath
      # exit
	  
	  # Crea all'interno della directory assegnata alla run il link alla directory idx
      # all'interno dell'archivio Integral
      ln -s  $PATH_OF_IDX $runDirAbsolutePath
	  
	  # Testare
      #
      # Visualizzare il contenuto della directory assegnata alla run
      #
      # ls -a $runDirAbsolutePath
      # exit
	  
      # Traccia la creazione del link
      appendToLog "$(dateTime) ${FUNCNAME[0]}() - $IDX_LINK_SUCCESSFULLY_CREATED $PATH_OF_IC" \
                  "$exeLogAbsolutePath"
				  
	  # Testare
      #
      # Visualizzare il contenuto del file di log
      #
      # cat $exeLogAbsolutePath
      # exit
	  
      # Crea all'interno della directory assegnata alla run il link alla directory scw
      # all'interno dell'archivio dei dati Integral
      ln -s  $PATH_OF_SCW $runDirAbsolutePath
	  
      # Testare
      #
      # Visualizzare il contenuto della directory assegnata alla run
      #
      # ls -a $runDirAbsolutePath
      # exit

	  # Traccia la creazione del link
      appendToLog "$(dateTime) ${FUNCNAME[0]}() - $SCW_LINK_SUCCESSFULLY_CREATED $PATH_OF_IC" \
                  "$exeLogAbsolutePath"
				  
      # Testare
      #
      # Visualizzare il contenuto del file di log
      #
      # cat $exeLogAbsolutePath
      # exit
   done
   
   # Distribuisce le scw tra le diverse run
   
   # Inizializza a 1 il contatore delle run
   runCounter=1
   
   # Forma il nome del file delle scw assegnate alla prima run
   runScwFileName="$RUN_SCW_FILE_PREFIX-$(printf "%03d" $runCounter)"
		 
   # Forma il path assoluto della directory assegnata alla prima run
   runDirectoryAbsolutePath="$workingDirectoryAbsolutePath/$workingDrectory-$(printf "%03d" $runCounter)"
		 
   # Forma il path assoluto del file delle scw assegnate alla prima run
   runScwFileAbsolutePath="$runDirectoryAbsolutePath/runScwFileName"
   
   # Distribuisce il contenuto del file delle scw tra le diverse run
   if test $numberOfRunDelimiters -eq 0
   then
      # Se il file delle scw non contiene delimitatori di run, le distribuisce in maniera
      # uniforme tra le run stesse
	  
	  # Scandisce il file delle scw riga per riga
      while read line; do
		 # Appende la linea corrente al file delle scw assegnate alla run
		 appendToLog "$line" \
                     "$runScwFileAbsolutePath"
				  
		 # Aggiunge 1 al contatore di run
		 runCounter=$(expr $runCounter + 1)
		 
		 # Se il contatore delle run e' maggiore del numero delle run parallele
		 # lo reinizzializza a 1
		 if test $runCounter -gt $numberOfRunDelimiters
		 then
		    $runCounter=1
		 fi
		 
         # Forma il nome del file delle scw assegnate alla prossima run
         runScwFileName="$RUN_SCW_FILE_PREFIX-$(printf "%03d" $runCounter)"
		 
         # Forma il path assoluto della directory assegnata alla prossima run
         runDirectoryAbsolutePath="$workingDirectoryAbsolutePath/$workingDrectory-$(printf "%03d" $runCounter)"
		 
         # Forma il path assoluto del file delle scw assegnate alla prossima run
         runScwFileAbsolutePath="$runDirectoryAbsolutePath/runScwFileName"
		 
      done < $listOfScwsAbsolutePath
   else
      # Altrimenti distribuisce le scw in accordo alla collocazione dei delimitatori di run
	  # all'interno del file che le contiene
	  
	  # Scandisce il file delle scw riga per riga
      while read line; do
	     # Se la linea corrisponde ad un delimitatore di run aggiunge 1 al contatore di run
         if test $line == $END_OF_RUN
	     then
	        # Aggiorna il contatore delle run
	        runCounter=$(expr $runCounter + 1)
			
			# Forma il nome del file delle scw assegnate alla prossima run
            runScwFileName="$RUN_SCW_FILE_PREFIX-$(printf "%03d" $runCounter)"
		 
            # Forma il path assoluto della directory assegnata alla prossima run
            runDirectoryAbsolutePath="$workingDirectoryAbsolutePath/$workingDrectory-$(printf "%03d" $runCounter)"
		 
            # Forma il path assoluto del file delle scw assegnate alla prossima run
            runScwFileAbsolutePath="$runDirectoryAbsolutePath/runScwFileName"
         else
		    # Appende la linea corrente al file delle scw assegnate alla run
		    appendToLog "$line" \
                        "$runScwFileAbsolutePath"		  

      done < $listOfScwsAbsolutePath
     
   fi   
   
   # Traccia l'uscita dalla funzione	  
   appendToLog "$(dateTime) ${FUNCNAME[0]}() - $MSG_OUT" \
               "$exeLogAbsolutePath"
			   
   # Testare
   #
   # Visualizzare il contenuto del file di log
   #
   # cat $exeLogAbsolutePath
   # exit		   
   }