Files
gen_data/docs/FUNZIONALITA.md

47 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Funzionalità
Elenco di ciò che il programma sa fare. Per l'uso passo per passo vedi il [README](../README.md); per il modello e i controlli di accettazione vedi [SPEC.md](SPEC.md).
## Generazione dei dati — `genera.py`
- **Profilo di temperatura**: `T` parte dalla temperatura ambiente, sale con uno o più gradini di riscaldamento e ridiscende con raffreddamento esponenziale fino a `T_amb`.
- **Gradini sorteggiati**: numero, istante del primo, distanza tra gradini e ampiezze sono estratti a caso a ogni seed da intervalli (`n_gradini`, `t_primo_gradino_s`, `distanza_gradini_s`, `dT_gradino_c`). Costante di raffreddamento in `k_raffreddamento_hz`.
- **Parametri casuali per corsa**: le chiavi scritte `[min, max]` (ambiente, livelli di rumore, `k`, `tau_sensore_s`, frequenza e σ dei salti) vengono sorteggiate uniformi a ogni seed, così ogni file ha parametri davvero diversi; `[x, x]` = valore fisso.
- **Salti stocastici**: scarti casuali con rientro esponenziale, sia durante il riscaldamento (`salti_risc_*`, nei due versi) sia durante il raffreddamento (`salti_*`, solo con `T` molto sopra l'ambiente), come i gradini irregolari di un sensore reale.
- **Ambiente realistico**: `T_amb` assestata con andamento esponenziale, con rumore e quantizzazione propri (`amb_*`). Non compare nel CSV, serve per `ΔT` e come baseline di `T`.
- **Tempi con jitter**: intervallo medio `dt_ms` con variazione uniforme ±`jitter_ms`, fino a `durata_s`.
- **Risposta del sensore**: filtro del primo ordine (`tau_sensore_s`) calcolato su griglia fine da 5 ms e interpolato ai tempi di campionamento.
- **Rumore di `T`**: componente bianca gaussiana, più forte quando `T` è molto sopra l'ambiente (`sigma_c` → `sigma_caldo_c`), più una deriva lenta di tipo Ornstein-Uhlenbeck (`wander_*`).
- **Quantizzazione**: `T` e `ΔT` a `passo_T_c`, ambiente a `amb_passo_c`. `ΔT` è calcolato dopo rumore e quantizzazione di entrambi i canali.
- **Riproducibilità**: `--seed` fissa il risultato (stesso seed e stessa configurazione ⇒ file identico); senza seed ne viene scelto uno casuale e stampato su stderr.
- **Uscita flessibile**: per default `output/gen_<seed>.csv` (cartella creata se manca); `-o percorso` per un file a scelta; `-o -` per stdout.
- **Configurazione senza valori nascosti**: tutti i valori stanno in un TOML; una chiave mancante, un TOML non valido o un intervallo `[min, max]` non valido terminano con exit 1 e un messaggio in italiano. Lo stesso avviene se il file di uscita non è scrivibile.
Formato dell'uscita: `t_ms,T_C,dT_C` (`t_ms` intero, gli altri a due decimali).
## Visualizzazione — `grafico.py`
- Disegna `T` e `ΔT` in funzione del tempo in due pannelli con asse comune.
- Senza argomenti usa l'ultimo CSV modificato in `output/`; oppure si indica il file.
- Apre una finestra, oppure con `-o` salva l'immagine (png, pdf, svg) e funziona anche senza schermo.
- Errore chiaro (exit 1) se non ci sono CSV, se il file non si legge o se il formato non è `t_ms,T_C,dT_C`.
## Pulizia — `pulisci.sh`
- Svuota la cartella `output/` (la cartella resta). Non tocca altro.
- Se `output/` non esiste lo segnala senza errore.
## Aiuto da riga di comando
- `-h` / `--help` su `genera.py`, `grafico.py` e `pulisci.sh`: opzioni, esempi, formato dell'output, gruppi di chiavi di `config.toml` e codici di uscita, in italiano.
- Argomenti non validi: messaggio in italiano e exit 2.
## Ambiente
- Gli script girano in un ambiente `.venv` nel progetto (creato con [uv](https://docs.astral.sh/uv/): `numpy`, più `matplotlib` per il grafico). Le dipendenze sono dichiarate anche nello script (PEP 723), quindi `uv run` funziona comunque.
- La cartella `output/` è ignorata da git.
## Limiti noti
Elencati in [SPEC.md §6](SPEC.md): un solo tempo di raffreddamento, gradini istantanei, ambiente che non sale col riscaldamento, nessun glitch di campionamento, rumore tarato su un solo sensore.