-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Wrong grib2 level metadata when two surfaces are present #317
Comments
Preciso che questi messaggi non sono sempre codificati come si deve, quando il tipo di livello non prevede un valore, i valori dei livelli sono a volte mancanti, a volte presenti (tipicamente =0), ma non è compito di arkimet speculare su questi casi, basta che rispetti i valori scritti nel messaggio, anche se inconsistenti. |
Ciao, sollecito un feedback su questo punto perché è importante per il futuro a breve termine. |
Mi viene da dire che il problema non sia nello scanner ma nella definizione del missing nel caso del valore del livello GRIB2, che è definito come Un
Guando i sorgenti di eccodes (2.27.1, la versione per Fedora 36), vedo che
E pare che il valore sia passato da Possibile che la definizione del |
Con la seguente modifica:
Il pacchetto compila, non ci sono errori nei test e il comportamento sembra quello desiderato:
È solo una prova per verificare la mia ipotesi, lascio a @spanezz (che ringrazio in anticipo) l'implementazione di una patch più appropriata che tenga eventualmente conto della variazione del valore missing. |
Aggiungo qualche ragionamento, che spero aiuti a fare chiarezza.
Poi però, a quanto ho potuto capire, non specifica quale valore di quale code table può avere segno negativo e quale no (cioè quando si materializza quell'"if applicable"). |
Io la ufficializzerei cosí. Mi piace l'idea di usare la costante fornita da eccodes, nella speranza che voglia dire delegare ad eccodes l'interpretazione del valore missing presente nel grib |
Uhm, però, visto che questa roba finisce anche nei metadati arkimet, può non essere cosí semplice. Abbiamo in archivio dei file con dei livelli mancanti? |
Abbiamo ancora pochi dataset grib2 permanenti, erg5 mi pare abbia tutti i livelli in ordine, cosmo 2I ensemble no, da arkiweb vedo questo:
anche se l'errore |
Dimmi che un archivio si può eliminare senza dirmi che un archivio si può eliminare 😄 |
che archivio è, cosí vado a pescare qualche file da aggiungere ai test? |
Il dataset è cosmo_2I_fcens (_arc). @edigiacomo intendevo dire che i campi con i livelli bacati potrebbero essere campi di poco interesse (l'altezza geometrica dei livelli del modello). Spero che gli altri campi a qualcuno servano, altrimenti anch'io qua servo a poco, poi sono d'accordo che gli accessi storici sono pochi, ma sto andando fuori tema github. |
Ok, ci sto ragionando un po' piú approfonditamente. I valori dei livelli nei metadati arkimet hanno un fattore moltiplicativo e un valore, ma non un fattore additivo. In GRIB vedo l'incoerenza tra il pezzo che dice "tutti i bit a 1 vuol dire mancante" e il pezzo che dice "il primo bit a 1 vuol dire negativo". Finora ho lavorato con l'assunto che tutti i valori dei livelli presenti nel GRIB siano positivi, con un bias che viene da BUFR che codifica sempre valori positivi, poi nel caso nella tabella B fornisce un valore di base da sottrarre. Per il caso in questione, posso modificare lo scanner dei GRIB2 per gestire sia Domanda: abbiamo dei GRIB con dei valori negativi nei livelli? Al momento i metadati di arkimet non possono rappresentare valori di livelli negativi. C'è da capire se è un caso che non abbiamo ancora visto, o se è un caso che stiamo trattando senza accorgercene. In tutti i modi, se vogliamo gestirlo posso e devo implementare un nuovo stile di codifica livelli che possa salvare anche valori negativi, e farebbe comodo avere dei GRIB di riferimento per guidare lo sviluppo |
Ho fatto un prototipo di fix nella PR #320: i test passano con le aspettative documentate da @dcesari nel primo post di questa issue. Sono tentato di implementare un arki-check che faccia il rescan dei grib in un dataset e controlli se i metadati risultanti sono uguali a quelli che ci sono nel dataset, in modo da poter validare sia questa modifica nello scanning, che modifiche future |
Ho aggiunto alla PR l'implementazione di Funziona simile ad Con questo dovrebbe essere possibile testare abbastanza ragionevolmente questa e altre possibili future modifiche proposte per la scansione dei dati |
Sulla bontà dell'implementazione proposta in PR passo la palla a @dcesari , per l'archivio da sistemare (i 19Tb di
|
Ci sarebbero da cancellare gli indici, e forse si fa prima a tirar fuori a mano i segmenti grib dagli archivi e reimportarli nel dataset. Non ho idea di quanto ci possa volere a fare questo discorso su 19Tb (non è forse tanto il numero di tera quanto il numero di GRIB all'interno di quei tera): se si vede che è una cosa eterna per riscansionare una piccola percentuale dei file contenuti, posso provare a implementare in arki-check qualcosa di piú furbo |
Grazie per tutte le discussioni, stavo per scrivere poi ho ulteriormente approfondito qua e là. Scusate se scopro solo adesso queste cose. Ho scoperto con delusione che eccodes considera comunque i valori dei livelli come unsigned
quindi non si capisce perché abbiano cambiato il valore missing nel tempo, anche se continuo ad essere convinto che avrebbe meteorologicamente senso, ad es. sul Mar Caspio, definire una superficie atmosferica a -10m sul livello del mare. Ad ogni modo questo ha come conseguenza che con eccodes attuale non riusciremo mai a codificare dei livelli negativi (provato con grib_set -s e si rifiuta), per cui possiamo evitare di gestirli. L'altra cosa che ho scoperto è che (1.non bisogna mai dare nulla per scontato) 2.il WMO non usa il complemento a 2 per gl'interi, in effetti non è scritto da nessuna parte, per cui un eventuale signed con tutti i bit a 1 va intepretato come il minimo intero rappresentabile e non -1. Ho verificato controllando il dump esadecimale di un grib in corrispondenza di una latitudine negativa ed è così (per eccodes). Quindi non c'è problema ad intepretare entrambi i valori 0xffffffff e 0x7fffffff come mancanti, nel senso che int32_t_WMO 0xffffffff non è -1 ma un valore di nessun interesse, non so se questo può aiutare la gestione della transizione. Riguardo la patch, non ho capito molto, ma mi fido. Coinsiderando il volume di dati da sanare e il fatto che ci sarebbero da sanare anche dei dataset su meteohub di Cineca, sarebbe utile avere uno strumento ad hoc per correggere i metadati, se necessario, senza rileggere e decodificare tutti i dati, non so se è possibile. |
Possiamo procedere con la patch e, una volta aggiornato arkimet, provare a riscannerizzare qualche segmento per capire se è fattibile o se serva qualcosa di più furbo. |
Improved dealing with missing values in GRIB2 metadata. refs: #317
Pull request inclusa in arkimet v1.48-1 (attualmente in build in CI) |
arkimet v1.48-1 installato su server interno "rocky8" |
Con la nuova versione funziona; resta da decidere cosa fare con gli archivi indicizzati con le vecchie versioni. |
Nella versione attuale dello scanner, quando il livello verticale in grib2 è costituito da due superfici (layer) in cui la prima ha solo il tipo di livello con valore mancante (es. superficie terrestre), il metadato
Level:
è sbagliato e induce una serie di errori, ad es in arkiweb/meteohub.Un goffo tentativo di modificare a mano
/etc/arkimet/scan/grib2.py
:sistema il caso di cui sopra, ma rovina il caso in cui la prima superficie ha un livello con valori presenti.
Allego un file level_defekt.zip grib con le varie casistiche incontrate.
The text was updated successfully, but these errors were encountered: