# Extração operacional e atualização do site

A nova entrada `operational.py` usa `gsi_parser.Run` para ler somente `fort.*` e `gsi*.log` nos diretórios de ciclo `YYYYMMDDHH` imediatamente abaixo da raiz. Os diagnósticos binários, arquivos de análise e subdiretórios `diag` não são lidos. O parser 1.1.1 aceita expoentes Fortran sem a letra E (por exemplo, `0.21890-302`) e distingue a decoração `***WARNING***` de um campo numérico com overflow. O parser reconhece também a família `q` de `fort.204` e `spd` de `fort.205`.

## Atualização

Execute com Python 3.10 ou superior. O parser usa apenas a biblioteca padrão; a geração de gráficos precisa de matplotlib e numpy, conforme `requirements.txt`. Use o mesmo ambiente Python nos dois comandos.

```bash
python operational.py \
  --input /home/carlos/Remote/Egeon/mnt/beegfs/ioper/SMNA_v3.0.0.t12717/SMG/datainout/gsi/dataout \
  --output ../smna-static/dist/gsi \
  --audit ../../work/operational/audit \
  --workers 4

python plot_operational.py --data ../smna-static/dist/gsi
```

Os caminhos relativos acima partem de `outputs/gsi-diagnostics`. Para verificar apenas os ciclos mais recentes, use `--limit 2` e **outro diretório de saída**, pois essa opção cria um índice restrito ao teste.

O processamento usa até quatro processos, cada qual mantém um ciclo por vez em memória. `--workers 1` reduz a simultaneidade; o máximo é oito. JSONs compactos de cada ciclo são gravados individualmente, sem acumular todos os vetores e coeficientes do arquivo operacional na memória. O navegador baixa somente o índice, um JSON por seleção e o gráfico escolhido. Python e matplotlib não rodam no site.

A auditoria local contém tamanho, SHA-256, contagem de linhas e identificação dos arquivos processados. O cache compara nomes, tamanhos, datas de modificação e versões do parser/exportador; `--refresh` força nova leitura. Não execute duas atualizações simultaneamente no mesmo diretório de saída. Os dados devem ser gerados em uma cópia de trabalho e publicados juntos após a geração dos gráficos. Não aponte diretamente para um diretório servido em produção enquanto a atualização estiver em andamento.

## Saídas

- `index.json`: ciclos, horário UTC da extração e indicadores resumidos.
- `cycles/YYYYMMDDHH.json`: minimização, termos de custo, ajustes agregados, perfis por pressão, contagens, radiâncias, canais, umidade, massa, estatísticas de campos e avisos.
- `cycles.csv`: resumo de todas as datas encontradas.
- `fits.csv`: contagens, RMS, bias e penalidades por variável, uso e avaliação.
- `plots/history.png`: evolução no tempo, com interrupção nas lacunas maiores que seis horas.
- `plots/YYYYMMDDHH.png`: custo/gradiente com ciclos externos em sequência no eixo de iterações acumuladas (transição tracejada), RMS normalizado pelo inicial e contagens finais.
- Diretório de auditoria: inventários e avisos por ciclo, mantidos fora do site.

Para obter todas as tabelas detalhadas de uma data, incluindo vetores e coeficientes de bias, continue usando `gsi_parser.py --input DIRETORIO_DO_CICLO --output DESTINO`. O exportador operacional oferece uma seleção menor para o site, não substitui a exportação científica completa.

## Critérios e limites

Um ciclo interpretado não significa que a execução terminou normalmente: esse indicador depende do marcador explícito do stdout. Um erro de leitura ou data conflitante é registrado como erro daquele ciclo. Quando há reexecuções, o exportador operacional só escolhe um stdout se houver um único candidato com a sequência completa de minimização idêntica à de fort.220 e modificação até 600 segundos após esse arquivo. A seleção e os logs excluídos ficam registrados. Sem correspondência única, o ciclo continua marcado como erro. A entrada científica gsi_parser.py mantém a rejeição de múltiplos stdout por padrão. O comando retorna 2 se algum ciclo não foi interpretado; os demais permanecem disponíveis. Avisos de conteúdo não impedem a extração.

O custo final usa a soma do último `costterms` quando disponível. O último gradiente pode pertencer à iteração anterior. Totais `all` de 0–2000 hPa são usados apenas como agregados e não somados com as faixas de pressão. As avaliações inicial e final podem usar amostras diferentes; sua comparação não mede desempenho contra dados independentes. Valores ausentes são nulos, não zeros.

Linhas não reconhecidas são contabilizadas por arquivo. Nos ciclos recentes, há conteúdo auxiliar em `fort.208`, `fort.217`, `fort.237` e mensagens de QC em `fort.204` que permanecem fora das tabelas estruturadas. Os avisos de média fora do intervalo min/max preservam os valores originais e não significam automaticamente uma falha do modelo.

Esta atualização não instala agendamento nem publica automaticamente novos ciclos. Depois dos dois comandos, publique novamente os arquivos estáticos pelo procedimento habitual do site.
