#! /bin/bash 
#--------------------------------------------------------------------#
#                    minFcos - GDAD/CPTEC/INPE - 2017                #
#--------------------------------------------------------------------#
#BOP
#
# !DESCRIPTION:
#      minFcos: Ferramenta de diagnostico e impacto na minimizacao da funcao custo na 
#               assimilacao de dados usando o GSI
#
# !INTERFACE:
#    ./run_minFcos.ksh LABELINI LABELFIM NHOURS GSI_system EXPE GSIOUTpath
#
#    Onde:
#         => LABELINI  : Data da analise [%y4%m2%d2%h2]
#         => LABELFIM  : Data da analise Final [%y4%m2%d2%h2]
#         => NHOURS    : Incremento entre analises [+Nh] - N = numero de horas: Ex. "6"
#         => GSI_system: Label do sistema de modelagem com o GSI: Ex. "SMG" "SMR"
#         => EXPE      : Label do experimento onde se destina os dados de saida: Ex. "testcase"
#         => GSIOUTpath: Path of the diag file of GSI dataout organized by date yyyymmddhh
#
#  !EXAMPLES:  
#    ./run_minFcos.ksh 2013010100 2013010818 12 SMG testcase $WORK_HOME/SMG/datainout/gsi/dataout
#
#  !TESTCASE:
#  Digite sem argumentos de entrada para o testcase do sistema hospedeiro, da forma:
#    ./run_minFcos.ksh              
#
# !REVISION HISTORY:
#  02-05-2017 - Luiz Sapucci   - Codigo Inicial
#  23-02-2017 - Luiz Sapucci   - Implementacao das rotinas e scripts para o ciclo
#  02-05-2017 - Eduardo Khamis - Criacao das figuras, tabelas e integracao com o codigo fortran
#  10-09-2018 - Ivette bannos  - Incluindo a avaliacao da minimizacao do Jo para todos os tipos de dados
#  26-09-2018 - Luiz Sapucci   - Ajustes na versao para funcionar para o regional mantendo o global.
#
# !REMARKS:
#
# !BUGS:
#
#EOP
#--------------------------------------------------------------------#
#BOC

# Verificando argumentos de entrada se testcase
if [ "${1}" = "testcase" ]
then
  export LABELI=2013010100
  export LABELF=2013010818
  export FCT=06
  if [ -z "${2}" ]
  then
    export nome_sys="SMG"
  else
    export nome_sys=${2} 
  fi
  export EXPE="testcase"
  export gsidataout=/scratchin/grupos/das/projetos/gdad/public/eval/stat/testcase/${nome_sys:0:3}/gsi/dataout
  echo -e ""
  echo -e "\033[31;1m          !!! ATENCAO !!!\033[m"
  echo -e "\033[31;1m RODANDO COM PARAMETROS DO TESTCASE PADRÃO \033[m"
  echo -e ""
  echo -e "\033[33;1m ./run_minFcos.ksh ${LABELI} ${LABELF} ${FCT} ${nome_sys} ${EXPE} gsidataout \033[m"
  echo -e ""
else

# Verificando se ajuda
  if [ "${1}" = "ajuda" ]
    then
    echo -e ""  
    echo -e "\033[33;1m Ferramenta de diagnostico e impacto na minimizacao da funcao custo na \033[m"
    echo -e "\033[33;1m assimilacao de dados usando o GSI \033[m"
    echo -e ""
    echo -e "\033[33;1m !INTERFACE:\033[m"
    echo -e "\033[33;1m ./run_minFcos.ksh LABELINI LABELFI NHOURS GSI_system EXPE  gsidataout \033[m"
    echo -e ""
    echo -e "\033[32;1m Digite com a palabra testcase no primeiro argumento para aplicar \033[m" 
    echo -e "\033[32;1m o testcase padrão usando dados em gdad/PUBLIC no SMG: \033[m"
    echo -e "\033[32;1m ./run_minFcos.ksh testcase \033[m"
    echo -e "\033[32;1m ou em outro sistema ou versao que usa o GSI: \033[m"
    echo -e "\033[32;1m ./run_minFcos.ksh testcase GSI_system \033[m"
    echo -e ""    
    exit 
  fi

# Verificando argumentos de entrada
  if [ -z "${1}" ]
  then
    export LABELI=2013010100
  else
    export LABELI=${1}
  fi
  if [ -z "${2}" ]
  then
     export LABELF=2013010818
  else
    export LABELF=${2} 
  fi
  if [ -z "${3}" ]
  then
    export FCT=06 # 06
  else
    export FCT=${3}
  fi
  if [ -z "${4}" ]
  then
     export nome_sys="SMG"
  else
    export nome_sys=${4} 
  fi
  if [ -z "${5}" ]
  then
    export EXPE="EXPE"
  else
    export EXPE=${5}
  fi
  if [ -z "${6}" ]
  then
    export gsidataout=$WORK_HOME/${nome_sys:0:3}/datainout/gsi/dataout
  else
    export gsidataout=${6}
  fi

  if [ $# -eq 0 ]
   then
     echo -e ""
     echo -e "\033[31;1m          !!! ATENCAO !!!\033[m"
     echo -e "\033[31;1m RODANDO COM PARAMETROS DO TESTCASE DO ${nome_sys:0:3} \033[m"
     echo -e "\033[33;1m Rode novamente com a palavra ajuda no primeiro argumento para mais opcoes \033[m"

    echo -ne "\033[31;1m > Deseja continuar? (S/N) \033[m"
     read resposta

    if [[ ${resposta} != "S" && ${resposta} != "s" ]]
    then
      echo ""
      echo -e "\033[34;1m  Saindo do protocolo!!! \033[m"
      echo ""
      exit
    fi

  fi

fi


echo -e ""
echo -e " > minFcos: Ferramenta de diagnostico e impacto na minimizacao da funcao "
echo -e " >          custo na assimilacao de dados usando o GSI"
echo -e ""
echo -e "\033[34;1m CONFIGURACAO DA RODADA \033[m"
echo -e ""
echo -e "\033[34;1m > Data Inicial      : \033[m \033[31;1m${LABELI}\033[m"
echo -e "\033[34;1m > Data Final        : \033[m \033[31;1m${LABELF}\033[m"
echo -e "\033[34;1m > Intervalo do ciclo: \033[m \033[31;1m${FCT}\033[m"
echo -e "\033[34;1m > Sistema hospedeiro: \033[m \033[31;1m${nome_sys}\033[m"
echo -e "\033[34;1m > Experimento label : \033[m \033[31;1m${EXPE}\033[m"
echo -e ""
echo -e "\033[33;1m Com os dados de saida do GSI lidos em \033[m"
echo -e "\033[33;1m ${gsidataout} \033[m" 

#criando diretorio das figuras do periodo e temporarios para gerar gif animado
PERIOD=${LABELI}${LABELF}

# Exportando variaveis do eval
source  ../../../config_eval.sh vars_export ${nome_sys} ${EXPE}

if test ! -s ${minFcos_tabe}; then
    echo "Criando a arvore de diretorio para esse experimento e protocolo: " ${nome_sys} ${EXPE}
    echo "../../../config_eval.sh configurar ${nome_sys} ${EXPE}"
    ../../../config_eval.sh configurar ${nome_sys} ${EXPE}
    if test ! -s ${minFcos_tabe}; then echo ""; echo "Rodada cancelada!!!" ;exit; fi
else 
   echo "Arvore de diretorio do experimento" ${EXPE} "ja existentente para o protocolo"; 
   echo ""
fi

# Copia os arquivos da rodada de controle
rm *cost_*.txt >& /dev/null
cp ${minFcos_CNT}/CNT_cost_gradient_${PERIOD}.txt CNT_cost_gradient.txt
cp ${minFcos_CNT}/CNT_cost_terms_${PERIOD}.txt CNT_cost_terms.txt

################### Chamando o GNOPLOT para gerar os graficos ##################

data=${LABELI}
minFTabe=${minFcos_tabe}

# Foi feito um ajuste para considerar melhorias que o joao implementou no GSIparm
# Para o RMS é preciso trocar isso pois não contempla essa melhoria  
#minter=`head -n 2 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 10-10`
#ninter1=`head -n 2 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 21-22`
#ninter100=`head -n 2 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 23-23`

minter=`head -n 7 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 17-17`
ninter1=`head -n 8 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 15-17`

if [ $ninter100 != "," ]
then
#  ninter2=`head -n 9 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 15-17`
  ninter1=`head -n 2 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 21-23`
else
  ninter1=" "$ninter1
fi

if [ $minter = "2" ]
then
  ninter2=`head -n 2 ${gsidataout}/${data}/gsiparm.anl | tail -n 1 | cut -c 33-35`
  ninter=`echo $(($ninter1+$ninter2+2))`
else
  ninter=${ninter1}
fi

while [ ${data} -le ${LABELF} ]
do

  echo ${data}

  grep 'cost,grad,step,b' ${gsidataout}/${data}/fort.220 | sed -e 's/cost,grad,step,b,step? = //g' | sed -e 's/good//g' > cost_gradient${data}.txt

  grep 'costterms Jb,Jo,Jc,Jl  =' ${gsidataout}/${data}/fort.220 | sed -e 's/costterms Jb,Jo,Jc,Jl  =//g' > cost_terms${data}.txt

  cat cost_gradient${data}.txt >> cost_gradient.txt
  cat cost_terms${data}.txt >> cost_terms.txt

  hh=`echo ${data} | cut -c 9-10`

  if [[ "$hh" = "00" || "$hh" = "12" ]]  
  then 
    grep " 1   0 " cost_gradient${data}.txt >> cost_gradient_1_000_0012h.txt
    grep " 1 ${ninter1} " cost_gradient${data}.txt >> cost_gradient_1_nint1_0012h.txt
    grep " 2   0 " cost_gradient${data}.txt >> cost_gradient_2_000_0012h.txt
    grep " 2 ${ninter1} " cost_gradient${data}.txt >> cost_gradient_2_nint2_0012h.txt 
  else
    grep " 1   0 " cost_gradient${data}.txt >> cost_gradient_1_000_0618h.txt
    grep " 1 ${ninter1} " cost_gradient${data}.txt >> cost_gradient_1_nint1_0618h.txt
    grep " 2   0 " cost_gradient${data}.txt >> cost_gradient_2_000_0618h.txt
    grep " 2 ${ninter2} " cost_gradient${data}.txt >> cost_gradient_2_nint2_0618h.txt 
  fi

  # Gerando a figura para a data
  cat scripts/cost_gradient_rodada_template.gpl | sed "s/#YYYYMMDDHH#/${data}/g" > cost_gradient_rodada.gpl
  ${gnuplot} cost_gradient_rodada.gpl

  mv cost_gradient${data}.txt cost_terms${data}.txt ${minFcos_tabe}

  data=$(${inctime} ${data} +6hr %y4%m2%d2%h2)

done

xlength=`more cost_gradient.txt | wc -l `
echo $xlength $ninter
ndias=`echo $(($xlength / $ninter / 2))`
echo "Numero de dias calculados: "$ndias

# Usando os templates adicionando as informacóes da rodada para chamar o gnuplot

cat scripts/cost_terms_template.gpl | sed "s/#DATAINI#/${LABELI}/g" | sed "s/#DATAFIM#/${LABELF}/g" | sed "s/#NINTER#/${ninter}/g" |sed "s/#XLENGHT#/${xlength}/g" > cost_terms.gpl
cat scripts/cost_gradient_template.gpl | sed "s/#DATAINI#/${LABELI}/g" | sed "s/#DATAFIM#/${LABELF}/g" | sed "s/#NINTER#/${ninter}/g" | sed "s/#XLENGHT#/${xlength}/g" > cost_gradient.gpl

if [ $minter = "1" ]
then
  cat scripts/cost_time_series_gradient_template_1outer.gpl | sed "s/#DATAINI#/${LABELI}/g" | sed "s/#DATAFIM#/${LABELF}/g" | sed "s/#NDIAS/${ndias}/g" > cost_time_series_gradient.gpl
else
  cat scripts/cost_time_series_gradient_template_2outer.gpl | sed "s/#DATAINI#/${LABELI}/g" | sed "s/#DATAFIM#/${LABELF}/g" | sed "s/#NDIAS/${ndias}/g" > cost_time_series_gradient.gpl
fi

${gnuplot} cost_terms.gpl
${gnuplot} cost_gradient.gpl
${gnuplot} cost_time_series_gradient.gpl

echo -e ""

#gerando um gif da minimizacao
convert -dispose Background -delay 20 -loop 1 -density 288 cost_gradient_curva_*.png cost_gradient_curva_${PERIOD}.gif

mv cost_gradient.png cost_gradient_${PERIOD}.png 
mv cost_terms.png cost_terms_${PERIOD}.png 
mv cost_time_series_gradient.png cost_time_series_gradient${PERIOD}.png

mv cost_gradient.txt EXP_cost_gradient_${PERIOD}.txt 
mv cost_terms.txt EXP_cost_terms_${PERIOD}.txt

mv EXP_cost_*.txt ${minFcos_tabe}/
mv *.png ${minFcos_figu}/
mv *.gif ${minFcos_figu}/
cp ${minFcos_figu}/cost_*${PERIOD}.* ${minFcos_page}/

echo -e "\033[36;1m >>> Arquivos Figs do periodo: \033[m" 
echo -e "\033[33;1m http://ftp1.cptec.inpe.br/pesquisa/das/${USER}/${nome_sys}/evalu/${EXPE}/diag/minFcos/ \033[m "
ls ${minFcos_page}/*${PERIOD}.*
echo ""

echo ""
echo -e "\033[36;1m >>>> Arquivos de tabelas em:\033[m "
echo -e "\033[33;1m ${minFcos_tabe}/ \033[m "
echo -e "\033[36;1m >>>> Figuras em:\033[m "
echo -e "\033[33;1m ${minFcos_figu}/ \033[m "
echo ""

exit 0
