#!/bin/bash
#--------------------------------------------------------------------#
#                    GSISTAT - GDAD/CPTEC/INPE - 2017                #
#--------------------------------------------------------------------#
#BOP
#
# !DESCRIPTION:
#  Script para pos-processar as estatisticas do GSI
#
#  Toda a configuracao da execucao deve ser feita no arquivo config.sh
#  ---> $stat_util/conf/config.sh
#
# !INTERFACE:
#  ./run_stat.sh <LabelANL>  <LabelFIM> <Incremento>  <GSI_system> <EXPE> 
#
#  em que:
#        <LabelANL>   : Data da analise inicial [%y4%m2%d2%h2]
#        <LabelFIM>   : Data da analise Final [%y4%m2%d2%h2]
#        <Incremento> : Incremento entre analises [hh] - N = numero de horas: Ex. "6"
#        <GSI_system> : Label do sistema de modelagem com o GSI: Ex. "SMG" "RMS" \033[m"
#        <EXPE>       : Label do experimento onde se destina os dados de saida: Ex. EXPE \033[m" 
#
# !REVISION HISTORY:
#  02-07-2013 - Silveira, Bruna / Mattos, Joao - Codigo Inicial
#  23-02-2017 - Vendrasco, Eder - Reformulacao dos scripts/codigos
#  08/06/2017 - Sapucci, Luiz - ajustando a versao para o SMG na estrutura do Eval
#  23/06/2017 - Sapucci, Luiz - Aprimorando o pacote com melhorias no testcase e correcao de BUG.
#  27/09/2017 - Sapucci, Luiz - Adicionando data nos log e um comnado para ordenar cronologicamente a serie do OmF e OmA.
#
# !REMARKS:
#
# !BUGS:
#
#  É preciso fazer um teste inteligente para que equivocos sejam cometidos na escolha no numero 
#  de processadores diferentes do realmente usado. Se for maior dará erros nos convencionais  e 
#  se for menor a contagem ficará comprometida. Tirar o alerta disso no script.(by Sapucci).
#
#  É preciso incrementar uma forma do sistema identidificar automáticamente quantos outerloop
#  foi utilizado na rodada em avaliacao e modificar a lista na linha +/- 215. E apenas contar os 
#  arquivos do tipo pe0000.conv_0* (by Sapucci).
#
#EOP
#--------------------------------------------------------------------#
#BOC

mostraHelice() {
   for i in / - \\ \|
   do
      echo -ne "\033[31;1m"
      echo -ne "\033[1D$i"
      echo -ne "\033[m"
      sleep .1
   done
}

WaitUntil() {

  QPID=${1}

  echo " "
  echo -en "       Executando o PID ${QPID} - Aguarde   "

  while : ; do
    sleep 0.3 | mostraHelice;
    # Esta contagem do qstat eh feita para que nao seja executado o qstat a cada 0.3 segundos, com
    # a contagem de 50, o qstat é executado a cada 15 segundos.
    let fazqstat++
    if [ $fazqstat -gt 50 ]; then
      testpid=$(/opt/pbs/10.4.0.101257/bin/qstat $QPID 2> /dev/null | tail -1 | awk '{print $5}')
      if [ 'x'$testpid = 'x' ]; then
       break
      fi
      fazqstat=0
    fi 
  done

  echo " "
  echo " "
}

# Verificando argumentos de entrada se testcase ou ajuda


if [ "${1}" = "ajuda" ]; then 
 echo
 echo -e "\033[31;1m > Ajuda: $0 \033[m"
 echo -e "\033[31;1m  ${0} <YYYYiMMiDDiHHi> <YYYYfMMfDDfHHf> <nh> <GSI_system> <EXPE> \033[m"
 echo -e "\033[31;1m <YYYYiMMiDDiHHi> : Data da analise inicial \033[m"
 echo -e "\033[31;1m <YYYYfMMfDDfHHf> : Data da analise Final \033[m"
 echo -e "\033[31;1m <nh>             : Incremento entre analises [nh] \033[m"
 echo -e "\033[31;1m <GSI_system>     : Label do sistema de modelagem com o GSI: Ex. "SMG" "RMS" \033[m"
 echo -e "\033[31;1m <EXPE>           : Label do experimento onde se destina os dados de saida: Ex. EXPE \033[m" 
 echo
 echo -e "\033[32;1m USE: ${0} testcase <GSI_system>  \033[m"
 echo -e "\033[32;1m para rodar um caso de exemplo SMG do periodo 2013010100 2013010818 \033[m"
 echo 
 echo -e "\033[32;1m USE: ${0} \033[m"
 echo -e "\033[32;1m sem argumentos de entrada para o testcase do sistema hospedeiro. \033[m"
 echo
 exit
fi

echo -e ""
echo -e "\033[33;1m >>>> Rodando o stat dos dados assimilados no GSI: \033[m"
echo -e ""

if [ "${1}" = "testcase" ]
then
  export DataInicial=2013010100
  export DataFinal=2013010818
  export Incremento="6"
 
  if [ -z "${2}" ]
  then
    export nome_sys="SMG"
  else
    export nome_sys=${2} 
  fi
  
  export EXPE="testcase"
  echo -e ""
  echo -e "\033[31;1m ATENCAO !!! usando dados do gdad/public \033[m"
  echo -e "\033[31;1m RODANDO COM PARAMETROS DO TESTCASE PADRÃO \033[m"
  echo -e ""
  echo -e "\033[33;1m $0 ${DataInicial} ${DataFinal} ${Incremento} ${nome_sys} ${EXPE}\033[m"
  echo -e ""
else

# Verificando argumentos de entrada
  if [ -z "${1}" ]
  then
    export DataInicial=2013010100
  else
    export DataInicial=${1}
  fi
  if [ -z "${2}" ]
  then
    export DataFinal=2013010818
  else
    export DataFinal=${2} 
  fi
  if [ -z "${3}" ]
  then
    export Incremento="6"
  else
    export Incremento=${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 [ $# -eq 0 ]
   then
     echo -e ""
     echo -e "\033[31;1m          !!! ATENCAO !!!\033[m"
     echo -e "\033[31;1m RODANDO COM PARAMETROS DO TESTCASE DO SISTEMA HOSPEDEIRO \033[m"
     echo -e ""
     echo -e "\033[33;1m $0 ${DataInicial} ${DataFinal} ${Incremento} ${nome_sys} ${EXPE} \033[m"
     echo -e ""
     echo -e "\033[31;1m ATENCAO!! CASO NÁO TENHA RODADO O TESTCASE DO SISTEMA DARÁ ERRO \033[m"
     echo -e "\033[31;1m NESSE CASO UTILIZE O TESTCASE PADRÄO DIGITANDO: "
     echo -e ""
     echo -e "\033[33;1m ./run_stat.sh testcase <GSI_system> \033[m"
     echo ""
     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 testcase!!! \033[m"
      echo ""
      exit
    fi

  fi

fi

echo -e ""
echo -e "\033[34;1m > Stat:  Ferramenta de diagnostico e levantamento dos dados \033[m"
echo -e "\033[34;1m >        assimilados usando o GSI \033[m"
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${DataInicial}\033[m"
echo -e "\033[34;1m > Data Final        : \033[m \033[31;1m${DataFinal}\033[m"
echo -e "\033[34;1m > Intervalo do ciclo: \033[m \033[31;1m${Incremento}\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 ""

# Carregando os modules do Tupa
. /opt/modules/default/etc/modules.sh
module load grads

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

if test ! -s ${stat_logs}; 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 ${stat_logs}; then echo ""; echo "Rodada cancelada!!!" ;exit; fi
else 
   echo "Arvore de diretorio do experimento" ${EXPE} "ja existentente para o protocolo"; 
   echo ""
fi

# Setando o diretorio de saida do GSI para os casos (SMG ou RMS(WRF), implementar aqui para outros sistemas)
if [ ${nome_sys:0:3} == 'RMS' ]; then
  export GSIout=${WORK_HOME}/$nome_sys/ana/gsi/run  
  export NprocSys=120
else
  if [ ${nome_sys:0:3} == 'SMG' ]; then
    export GSIout=${WORK_HOME}/$nome_sys/datainout/gsi/dataout
    export NprocSys=72     
  else
    echo
    echo " Sistema" $nome_sys " ainda não configurado para usar o stat!!!"
    echo "  Abortando o processo..."
    exit
  fi
fi

# Modifique o endereco aqui caso queira um diretorios fora do sistema
# export GSIout=${WORK_HOME}/$nome_sys/datainout${EXPE}/gsi/dataout/
## Endereco dos arquivos da avaliacao da SMG_V1.0.0 backup 
## precisam ser movidos para scratchout
 #export GSIout=/stornext/online6/assim_dados/gdad/SMG_eval/EX1ALL/gsi/dataout/
 #export GSIout=/stornext/online6/assim_dados/gdad/SMG_eval/EX0CNT/gsi/dataout/
 #export GSIout=/stornext/online6/assim_dados/gdad/SMG_eval/EX2ORA/gsi/dataout/ 

if [ "${1}" = "testcase" ]; then
  export GSIout=/scratchin/grupos/assim_dados/home/gdad/public/eval/stat/testcase/${nome_sys:0:3}/gsi/dataout
fi

echo -e "\033[33;1m Com os dados de saida do GSI lidos em \033[m"
echo -e "\033[33;1m ${GSIout} \033[m" 

# Carregando Configuracoes
source ${stat_util}/conf/config.sh 

writedconf ${GStatCfg} $NProc

# Alerta para a defincao correta do numero de processadores usado
   echo -e ""
   echo -e "\033[33;1m > Observe se o numero de processadores usados esta correto. \033[m \033[m"
   echo -e "\033[33;1m > Numero setado atualmente: \033[31;1m ${NProc} \033[m \033[m"
   echo -e ""

# Ajusta o arquivo de configuracao das radiancias para os dados de entrada
sed -e "s,#inputpath#,${GSIout}/,g"  \
    -e "s,#outputpath#,${stat_bina}/,g" ${stat_util}/conf/id_sat.nml_modelo > ${stat_util}/conf/id_sat.nml

if $fazstat ; then # Faz estatisticas

 LabelANL=$DataInicial
 while [ ${LabelANL} -le ${DataFinal} ]; do # Loop nas datas das analises
 
 echo
 echo " Processando a data: "${LabelANL}

 ym=${LabelANL:0:6}
 dh=${LabelANL:6:4}

 # Diretorios
 TmpDirOut=${GStatOut}/temporal
 DatDirOut=${GStatOut}/${ym}/${dh}

 # Testando a existencia dos dados do GSI na pasta input do GSI_STAT, caso nao existe, testa-se 
 # na pasta de execucao do GSI no SMG ou SMR, se nao encontrar, é informado o problema e interrompe  execucao.
  if [ ! -e ${GSIout}/${LabelANL} ];then
    echo "GSI data not found - "${GSIout}/${LabelANL}
    exit
  fi


 # Loop em dados convencionais e de radiancias
 # Apenas verificando a existencia dos diretorios e 
 # criando se necessario.
 for ObsType in $(echo $obspross); do
  echo
  if [ ! -e ${DatDirOut}/${ObsType} ];then
     mkdir -p ${DatDirOut}/${ObsType}
  fi
  if [ ! -e ${TmpDirOut}/${ObsType} ];then
     mkdir -p ${TmpDirOut}/${ObsType}
  fi
 done

 # Loop em dados convencionais e de radiancias
 # Para montar o arquivo onde sao escritas as contagens provenites dos arquivos fort.207 
 # (estatisticas globais das radiancias)
 # Se ObsType = conv, nada e' feito, uma vez que o codigo fortran nesta versao le um
 # arquivo por processador.
 echo " Processing..." 
 for ObsType in $(echo $obspross); do

  echo " Observation Type: " $ObsType
  if [ $ObsType = "rad" ]; then

    namerad=${GSIout}/${ym}${dh}/fort.207

    for i in `ls ${GSIout}/${ym}${dh}/diag/*ges*.bin`; do
       nomesat=`basename $i`
       prefixosat=`echo ${nomesat}| awk -F "_" '{print $2}'`
       satsat=`echo ${nomesat}| awk -F "_" '{print $3}'`

       file=${DatDirOut}/rad/cptec.diag_${prefixosat}_${satsat}_ges.${LabelANL:0:8}_${LabelANL:8:2}z.dat

       grep "o-g 01 rad " ${namerad} | grep ${prefixosat}| grep ${satsat}| awk '{print $6}' > ${file}
       grep "o-g 01 rad " ${namerad} | grep ${prefixosat}| grep ${satsat}| awk '{print $7}' >> ${file}
       grep "o-g 01 rad " ${namerad} | grep ${prefixosat}| grep ${satsat}| awk '{print $8}' >> ${file}

    done

    for i in `ls ${GSIout}/${ym}${dh}/diag/*anl*.bin`; do

       nomesat=`basename $i`
       prefixosat=`echo ${nomesat}| awk -F "_" '{print $2}'`
       satsat=`echo ${nomesat}| awk -F "_" '{print $3}'`

       file=${DatDirOut}/rad/cptec.diag_${prefixosat}_${satsat}_anl.${LabelANL:0:8}_${LabelANL:8:2}z.dat

       grep "o-g 03 rad " ${namerad} | grep ${prefixosat}| grep ${satsat}| awk '{print $6}' > ${file}
       grep "o-g 03 rad " ${namerad} | grep ${prefixosat}| grep ${satsat}| awk '{print $7}' >> ${file}
       grep "o-g 03 rad " ${namerad} | grep ${prefixosat}| grep ${satsat}| awk '{print $8}' >> ${file}

    done

  fi

 done 

 # Executando no no' auxiliar 
 export PBS_SERVER=aux20-eth4
 export PBS_SERVER=eslogin13
 host=`hostname`

 cat << EOF > ${GStatRun}/.rungsistat.qsub
 #!/bin/bash
 #PBS -o ${host}:${GStatLog}/EvalStat${LabelANL}.Out
 #PBS -j oe
 #PBS -l walltime=00:06:00
 #PBS -l mppwidth=24
 #PBS -A CPTEC
 #PBS -l mppnppn=24
 #PBS -V
 #PBS -S /bin/bash
 #PBS -N GSI_Eval_${LabelANL:4:6}
 ####PBS -q debug
 #PBS -q pesq
 
 date

 . /opt/modules/default/etc/modules.sh
 module load grads
 cd ${GStatBin}

 nome[01]='ges'
 nome[03]='anl'

# Mudar aqui o item 3 na lista quando não tiversmos o segundo outerloop
 for DataType in \$(seq -f "%02g" 1 2 3); do 
# for DataType in \$(seq -f "%02g" 1 2); do

  for ObsType in $(echo $obspross); do

   echo " Observation Type [3]: " \$ObsType
   if [ \$ObsType = "conv" ]; then 
    # Dados convencional
    date
    time aprun -n 1 ${GStatBin}/stat_conv.x ${LabelANL} \${DataType}

    cd  ${GStatOut}/${ym}/${dh:0:4}/conv
    for i in \$(ls *.ctl); do
     stnmap -i \$i
    done
    cd - 
   fi
   
   if [ \$ObsType = "rad" ]; then 
    # Dado de radiancia
    date
    time aprun -n 1 ${GStatBin}/stat_radi.x  ${ym} ${dh:0:2} ${dh:2:2} \${nome[\${DataType}]}

    cd  ${GStatOut}/${ym}/${dh:0:4}/rad
    for i in \$(ls *.ctl); do
     stnmap -i \$i
    done
    cd - 
   fi

  done
  
 done

 date

EOF


# chmod +x     ${GStatRun}/.rungsistat.qsub
# QPID=$(qsub  ${GStatRun}/.rungsistat.qsub)
# echo
# echo " Job $QPID submetido"
# echo


 . /opt/modules/default/etc/modules.sh
 module load grads
 cd ${GStatBin}

 nome[01]='ges'
 nome[03]='anl'

# Mudar aqui o item 3 na lista quando não tiversmos o segundo outerloop
 for DataType in $(seq -f "%02g" 1 2 3); do 
# for DataType in \$(seq -f "%02g" 1 2); do

  for ObsType in $(echo $obspross); do

   echo " Observation Type [3]: " $ObsType
   if [ $ObsType = "conv" ]; then 
    # Dados convencional
    date
 #   time aprun -n 1 ${GStatBin}/stat_conv.x ${LabelANL} ${DataType}
    ${GStatBin}/stat_conv.x ${LabelANL} ${DataType}
    cd  ${GStatOut}/${ym}/${dh:0:4}/conv
    for i in $(ls *.ctl); do
     stnmap -i $i
    done
    cd - 
   fi
   
   if [ $ObsType = "rad" ]; then 
    # Dado de radiancia
    date
#    time aprun -n 1 ${GStatBin}/stat_radi.x  ${ym} ${dh:0:2} ${dh:2:2} ${nome[${DataType}]}
     ${GStatBin}/stat_radi.x  ${ym} ${dh:0:2} ${dh:2:2} ${nome[${DataType}]}

    cd  ${GStatOut}/${ym}/${dh:0:4}/rad
    for i in $(ls *.ctl); do
     stnmap -i $i
    done
    cd - 
   fi

  done
  
 done

 date


 LabelANL=`${inctime} ${LabelANL} +${Incremento}h %y4%m2%d2%h2`

 done # Loop nas datas das analises

# WaitUntil $QPID
else
  echo 
  echo -e "\033[34;1m > Etapa de calcular estatistica setado como false no config.sh \033[m"   
  echo -e "\033[34;1m > Mude a variavel fazstat de 'false' para 'true' \033[m"
  echo -e "\033[34;1m > na linhas 7 do ../util/conf/cofig.sh \033[m"
  echo
fi # Faz estatisticas

if [ -e ${GStatOut} ]; then
 echo "Lista de arquivos gerados na ultima data da fase de estatistica: " ${DataFinal:0:6}/${DataFinal:6:10}*
 ls ${GStatOut}/${DataFinal:0:6}/${DataFinal:6:10}/*
fi

# Organizando cronologicamente as informaćoes das series temporais do Stat
echo ""
echo " > Organizando cronologicamente as informaćoes das series temporais do Stat"
cd ${GStatOut}/temporal/conv
mkdir -p original
mv *.dat original
cd original
for i in $(ls *.dat); do cat $i | sort > ../${i}; done
cd ..
rm -rf original

cd ${stat_run}

#------------------------------------------------------------------------------#

if $fazfig ; then # Faz figuras

  ${GStatScp}/plot_all.sh 1 ${DataInicial} ${DataFinal} ${Incremento}

  ${GStatScp}/plot_all.sh 2 ${DataInicial} ${DataFinal} ${Incremento} 

  if [ ${DataInicial} -ne ${DataFinal} ]; then
     ${GStatScp}/plot_all_temporal.sh 1 ${DataInicial} ${DataFinal} ${Incremento} 
  fi
else
  echo 
  echo -e "\033[34;1m > Etapa de gerar figuras setado como false no config.sh \033[m"   
  echo -e "\033[34;1m > Mude a variavel fazfig de 'false' para 'true' \033[m"
  echo -e "\033[34;1m > na linhas 9 do ../util/conf/cofig.sh \033[m"
  echo
fi # Faz figuras

#EOC
#------------------------------------------------------------------------------#

