ARPA-SIMC / wreport

C++ library and applications to work with weather reports. The library provides featureful BUFR and CREX encoding and decoding.
Other
9 stars 9 forks source link

Wrong year in bufr section 1 #36

Closed dcesari closed 4 years ago

dcesari commented 4 years ago

Il problema è comparso in bufr2netcdf ma risale a wreport. In allegato un file con 2 messaggi bufr, wind profiler, presumibilmente corretti. Se li vado a decodificare, la sezione 1 in un caso ha l'anno corretto, nell'altro caso un anno assurdo 7120:

wrep B002_2020012300.100.bufr
BUFR 2:255:96 98:0 2020-01-22 22:15:00 0 1 subsets
...
wrep B002_2020012300.100.bufr
BUFR 2:255:96 98:0 7120-01-22 23:30:00 0 1 subsets
...

L'anno codificato successivamente nella sezione dati con B04001 è giusto. Analizzando con bufr_dump -O vedo che nella sezione 1 c'è solo l'anno del secolo ma non il secolo, possibile? come viene calcolato il secolo in questo caso? Da cosa dipende? Le due sezioni 1 differiscono solo per il byte di padding e poco altro.

wprof.zip

dcesari commented 4 years ago

Non ho resistito dal guardare il codice, il punto sembra essere qua:

https://github.com/ARPA-SIMC/wreport/blob/master/wreport/bufr/decoder.cc#L61

bisogna capire qual'è il ruolo di quel 18-esimo byte della sezione 1 che eccodes chiama "padding".

dcesari commented 4 years ago

Secondo questa documentazione WMO https://www.wmo.int/pages/prog/www/WDM/Guides/Guide-binary-1A.html il 18-esimo byte è riservato per uso locale, non è standardizzato che si riferisca al secolo.

spanezz commented 4 years ago

Purtroppo il codice che interpreta cosíil 18esimo byte è stata scritto prima del 2010, ed è fuori dalla storia dei commit per capire da dove arrivi.

Ho stampato il valore di quel byte per i vari BUFR che abbiamo nella test suite, e di solito è '20' o '21', che me lo fa sembrare di fatto standardizzato sul secolo 20esimo o 21esimo.

Possiamo dire che, se quel byte ha un valore diverso da '20' o '21', lo ignoro e tiro a indovinare per il secolo come faccio nel caso sia zero?

spanezz commented 4 years ago

Come non detto, ci sono BUFR che hanno secolo 20 e anno 7, e immagino non siano del 1907, ma che sia piú probabile che a seconda di chi li scrive, qualcuno pignolizza che il 20xx è il 21esimo secolo, e qualcuno va a buon senso e ci mette le prime due cifre dell'anno.

A questo punto, direi di ignorare del tutto il byte, e continuare a aggiungere 1900 se l'anno è maggiore di 50

spanezz commented 4 years ago

Ho aggiunto test per i valori degli anni nei var BUFR nella test suite. Ignorando il secolo mi sembra che i risultati siano sensati, a parte per bufr/gts-synop-rad2.bufr che è un bufr ed. 4 in cui l'anno è segnato a 15 invece di 2015, ma lí direi ci sia poco da fare: l'edition 4 specifica l'anno per intero su 16 bit.