# Sistema de Monitoramento da Assimilação de Dados 📊 — versão estática

Campos meteorológicos, status operacional, Full Logs, Obs Storage e About dos ambientes Egeon e XC50. HTML, CSS e JavaScript sem frameworks, servidor de aplicação ou etapa de compilação. O conteúdo de `dist/` pode ser publicado em um servidor HTTP estático, inclusive no Apache do CPTEC, GitHub Pages ou outro serviço de hospedagem estática. A publicação no Sites é uma prévia privada.

## Executar

```sh
python -m http.server 8000 --directory dist
```

Abra http://localhost:8000. Para publicar em outro servidor, copie os quatro arquivos de `dist/`, mantendo-os juntos. Não é necessário publicar `.openai/`.

## Dados e comportamento

A origem está definida em `BASE`, no início de `dist/app.js`:

https://dataserver.cptec.inpe.br/dataserver_dimnt/das/carlos.bastarz/sandbox/SMNAMonitoringApp/cron_scripts/

- Imagens: `anls_imgs/{ambiente}/{SMNA|BAM}/{AAAAMMDDHH}/{variavel}/{nivel}/{prazo}.jpg`.
- Status: `logs/{ambiente}/logs.csv`.
- Os seletores consultam as listagens de diretório, usando a união dos arquivos SMNA/BAM. Se um produto não tiver aquela combinação, seu painel informa a ausência sem substituir por outro ciclo.
- Egeon é o ambiente inicial. O seletor abre a data publicada mais recente. A atualização e a troca de ambiente retornam à data mais recente.
- As imagens são carregadas diretamente pelo navegador, com cache HTTP normal, e ampliadas em diálogo (Escape fecha). Nenhuma imagem é reenviada pelo Python.
- CSVs e índices são revalidados via HTTP; há cache de consulta em memória por 60 segundos. O botão Atualizar limpa esse cache. Não há atualização automática em segundo plano.
- Status exibe todas as colunas do CSV, sem inserir seu conteúdo como HTML. Registros com mais de 36 horas são identificados como antigos. Esse limite é um aviso de idade, não um diagnóstico de falha operacional.
- Nenhum dado de exemplo ou resultado científico sintético é utilizado.

O servidor foi verificado em 11/09/2026 e retornou `Access-Control-Allow-Origin: *`. Essa configuração e a listagem Apache precisam continuar disponíveis para o funcionamento fora do domínio CPTEC. A velocidade e a disponibilidade das imagens continuam dependendo da origem. O site não funciona offline.

## O que foi observado

O código original usa BootstrapTemplate, cabeçalho, barra lateral e comparação SMNA/BAM. A interface preserva essa organização com rótulos em português. O aplicativo ao vivo não completou a abertura no navegador de inspeção; a reprodução foi baseada no código público, não em uma comparação visual pixel a pixel.

A função `fetch_image_or_fallback` do aplicativo Panel busca imagens em Python, e `image_pane` as incorpora como bytes. A versão estática remove essa passagem pelo servidor Panel. Não foi feito benchmark de velocidade.

O arquivo geral `todaym1H.txt` indicava 2026091112, mas as pastas consultadas continham datas diferentes por ambiente: XC50/SMNA até 2026082800 e Egeon/SMNA até 2026091000. A seleção de data da versão original usa a janela geral, que pode oferecer dias sem imagem. As listagens também mostraram prazos 0, 24, 48 e 72 para uma combinação SMNA consultada, em vez de todos os passos de 6 horas oferecidos pelo código original. A nova seleção utiliza os arquivos presentes.

## Próxima etapa, fora desta entrega

Outras abas precisam de exportação prévia para conservar o frontend estritamente estático:

| Aba | Fonte atual identificada | Adaptação sugerida |
| --- | --- | --- |
| Mass constraints | SQLite `costFile_Oper.db` | Exportar gráficos PNG/SVG e tabelas CSV/JSON no cron |
| Minimization | `jo_table_series_*.csv` | Pré-gerar gráficos e simplificar cabeçalhos para tabelas |
| Analysis diag | Catálogos YAML e leitura de diagnósticos | Gerar produtos finais e um índice JSON |
| B error covariance | `catalog_berror.yml` | Exportar gráficos finais no processamento |
| Objective evaluation | `catalog-scantec-s0.yml` | Exportar figuras e tabelas finais |
| Obs storage — gráficos | `mon_rec_obs_final.csv` | Tabelas já implementadas; pré-gerar figuras se forem desejadas |

Para evitar várias consultas a diretórios, uma evolução possível é gerar um `manifest.json` no cron com as combinações disponíveis. Isso não é exigido pela primeira versão e nenhum script do servidor foi alterado.

## Verificação

Sintaxe JavaScript, parser CSV (aspas, vírgulas, quebras de linha e BOM), referências locais e resposta HTTP local verificados. Fontes de status de ambos os ambientes e uma imagem real SMNA responderam HTTP 200. A ausência da imagem BAM correspondente foi confirmada como HTTP 404 e é tratada pela interface. Não foi realizado teste visual/interativo automatizado no navegador.

Código de referência: https://huggingface.co/spaces/cfbastarz/SMNAMonitoringApp/tree/main

## Novas abas

- **Full Logs:** consulta arquivos publicados nos diretórios GSI, MODEL, POS e PRE, oferecendo apenas ciclos encontrados. Usa os nomes reais dos logs, inclusive sufixos de previsão. Carrega só o arquivo selecionado, exibe o texto integral com rolagem e permite baixar uma cópia. Listagens e textos compartilham um cache limitado (60 entradas / aproximadamente 16 MiB, exceto um arquivo individual maior).
- **About:** descrição institucional do SMNA e links do repositório, documentação e dashboard original.
- **Obs Storage:** tabela paginada de 100 registros, filtros de data inclusivos (dia final completo), combinações exatas de horários sinóticos, múltiplos tipos de observação/arquivo e exportação de todos os registros filtrados. A tabela e o CSV incluem a data original e indicam reconstruções. Não inclui gráficos dinâmicos, mantendo a apresentação em tabelas solicitada.

### Qualidade do inventário

Os scripts públicos `obsm/get_inventory-egeon.sh` e `obsm/get_inventory-xc50.sh` extraem a quinta coluna de `ls -l --full-time`, ou seja, bytes, mas atribuem o cabeçalho “Tamanho do Download (KB)”. A nova interface utiliza Bytes/KiB/MiB/GiB/TiB e conversões em potências de 1024. O valor original permanece intacto na leitura.

A data de observação inválida é reconstruída com o dia de download e a hora sinótica, seguindo a estratégia do Panel. Isso é uma inferência, não a recuperação garantida da data real. O fuso do download e a string original são preservados na tabela/exportação. Não calculamos latência de assimilação.

Registros repetidos são preservados; a soma pode contar o mesmo arquivo várias vezes e não deve ser interpretada como uso único atual do disco. Linhas sem nome de arquivo, tamanho válido ou data válida/reconstruível são ignoradas e contadas. A amostra verificada continha 5.540 registros utilizáveis em Egeon (datas reconstruídas) e 728 em XC50 (datas originais).

Verificações adicionais: referências de elementos/arquivos locais, sintaxe, datas inválidas, preservação de tamanhos, normalização dos dois CSVs e HTTP 200 de logs GSI, MODEL e POS. Os arquivos POS podem ter vários megabytes; o download continua dependendo da origem. Sem teste visual automatizado nesta etapa.


## Diagnósticos GSI operacionais

A aba Diagnósticos GSI lê os arquivos gerados em `dist/gsi/`. Acesso direto: `/#gsi`. Não há backend de gráficos.

Com Python 3.10+, matplotlib e numpy instalados, execute a partir deste diretório:

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

O primeiro comando retorna 2 quando há ciclos com erro; consulte `dist/gsi/index.json`. Só publique a cópia de trabalho após concluir ambos os comandos. O cache de auditoria deve ficar fora de `dist/`; escolha um diretório persistente para reaproveitá-lo entre atualizações. Nenhum agendamento é instalado.


## Comparação entre ambientes e diagnósticos

Campos Meteorológicos compara SMNA - Jaci (diretório xc50) e SMNA - Egeon no mesmo ciclo. Na abertura, procura a data comum mais recente com arquivos para a variável/nível inicial; diretórios vazios são ignorados. Demais datas continuam selecionáveis, com ausência indicada por painel. As ações CHECK LOGS do CSV são convertidas em links para o ambiente e etapa correspondentes no diretório atual de logs. O HTML do CSV não é inserido na página.

Custo J e norma do gradiente usam as iterações dos ciclos externos em sequência. O gradiente usa escala logarítmica quando existem valores positivos; em ciclos inteiramente zero, usa escala linear.
