File: bufr_extract_headers.sh

package info (click to toggle)
eccodes 2.44.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 150,248 kB
  • sloc: cpp: 163,056; ansic: 26,308; sh: 21,602; f90: 6,854; perl: 6,363; python: 5,087; java: 2,226; javascript: 1,427; yacc: 854; fortran: 543; lex: 359; makefile: 285; xml: 183; awk: 66
file content (247 lines) | stat: -rwxr-xr-x 7,181 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#!/bin/sh
# (C) Copyright 2005- ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# 
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#

. ./include.ctest.sh

# Define a common label for all the tmp files
label="bufr_extract_headers_test"
temp1="temp.${label}.1"
temp2="temp.${label}.2"
tempBufr=temp.$label.bufr
tempFilt=temp.$label.filt

# Multi-message BUFR
# --------------------
input=${data_dir}/bufr/aeolus_wmo_26.bufr
KEYS='offset,edition,totalLength'
$EXEC ${test_dir}/bufr_extract_headers  $KEYS  $input > $temp1
${tools_dir}/bufr_get                -p $KEYS  $input > $temp2
diff $temp1 $temp2

# Test local ECMWF keys; should be "not_found" for this input
# -----------------------------------------------------------
input=${data_dir}/bufr/PraticaTemp.bufr
KEYS='localSectionPresent,rdbType,ident,isSatellite,satelliteID'
$EXEC ${test_dir}/bufr_extract_headers $KEYS $input > $temp1
${tools_dir}/bufr_get            -f -p $KEYS $input > $temp2
diff $temp1 $temp2


# Local Section keys
# --------------------
# DWD BUFR with a local section
input=${data_dir}/bufr/uegabe.bufr
r=`${test_dir}/bufr_extract_headers localSectionPresent,ecmwfLocalSectionPresent $input`
[ "$r" = "1 0" ]
# ECMWF BUFR but has no local section
input=${data_dir}/bufr/207003.bufr
r=`${test_dir}/bufr_extract_headers localSectionPresent,ecmwfLocalSectionPresent $input`
[ "$r" = "0 0" ]
# ECMWF BUFR with a local section
input=${data_dir}/bufr/aaen_55.bufr
r=`${test_dir}/bufr_extract_headers localSectionPresent,ecmwfLocalSectionPresent $input`
[ "$r" = "1 1" ]

# Key 'centre' as string
# -----------------------
r=`${test_dir}/bufr_extract_headers centre ${data_dir}/bufr/aaen_55.bufr`
[ "$r" = "ecmf" ]
r=`${test_dir}/bufr_extract_headers centre ${data_dir}/bufr/uegabe.bufr`
[ "$r" = "edzw" ]
r=`${test_dir}/bufr_extract_headers centre ${data_dir}/bufr/synop_multi_subset.bufr`
[ "$r" = "enmi" ]
r=`${test_dir}/bufr_extract_headers centre ${data_dir}/bufr/PraticaTemp.bufr`
[ "$r" = "cnmc" ]
r=`${test_dir}/bufr_extract_headers centre ${data_dir}/bufr/israel_observations_2017041010.bufr`
[ "$r" = "234" ]

# Check all centres with an abbreviation
centre_table=${ECCODES_DEFINITION_PATH}/common/c-11.table
centres=`awk 'NR > 1 && $1 !~ /#/ {print $2}' < $centre_table`
for c in $centres; do
    ${tools_dir}/bufr_set -s centre=$c $ECCODES_SAMPLES_PATH/BUFR4.tmpl $temp1
    r=`${test_dir}/bufr_extract_headers centre $temp1`
    [ "$r" = "$c" ]
done

# Test rdbSubtype
# ---------------
fBufr3Input=$ECCODES_SAMPLES_PATH/BUFR3_local.tmpl
fBufr4Input=$ECCODES_SAMPLES_PATH/BUFR4_local.tmpl
inputs="$fBufr3Input $fBufr4Input"
for fin in $inputs; do
  ${tools_dir}/bufr_set -s oldSubtype=2,newSubtype=300 $fin $temp1
  r=`${test_dir}/bufr_extract_headers rdbSubtype,oldSubtype,newSubtype $temp1`
  [ "$r" = "2 2 300" ]

  ${tools_dir}/bufr_set -s oldSubtype=255,newSubtype=300 $fin $temp1
  res=`${test_dir}/bufr_extract_headers rdbSubtype,oldSubtype,newSubtype $temp1`
  [ "$res" = "300 255 300" ]
done


# Test all BUFR files
# ---------------------
bufr_files=`cat ${data_dir}/bufr/bufr_data_files.txt`

KEYS='edition,totalLength,bufrHeaderCentre,dataCategory,masterTablesVersionNumber,typicalMonth,typicalDay,rdbType,localYear,qualityControl,numberOfSubsets,compressedData,ident'

for bf in ${bufr_files}; do
    input=${data_dir}/bufr/$bf
    $EXEC ${test_dir}/bufr_extract_headers $KEYS $input > $temp1
    ${tools_dir}/bufr_get            -f -p $KEYS $input > $temp2
    diff $temp1 $temp2
done


# BUFRs with specific keys to compare
# ------------------------------------
bufr_files="
aaen_55.bufr
aben_55.bufr
aeolus_wmo_26.bufr
ahws_139.bufr
airs_57.bufr
alws_139.bufr
amsa_55.bufr
amsb_55.bufr
amse_55.bufr
amsu_55.bufr
amv2_87.bufr
asbh_139.bufr
asbl_139.bufr
asel_139.bufr
ashs_139.bufr
atap_55.bufr
ateu_155.bufr
atms_201.bufr
atov_55.bufr
b003_56.bufr
b005_89.bufr
cmwn_87.bufr
cori_156.bufr
emsg_189.bufr
euwv_87.bufr
fy3a_154.bufr
g2nd_208.bufr
g2to_206.bufr
go15_87.bufr
grst_26.bufr
gsd1_208.bufr
gsd2_208.bufr
gsd3_208.bufr
gst4_26.bufr
hirb_55.bufr
hirs_55.bufr
ias1_240.bufr
iasi_241.bufr
ikco_217.bufr
imssnow.bufr
itrg_208.bufr
itwt_233.bufr
j2nb_216.bufr
jaso_214.bufr
kond_209.bufr
maer_207.bufr
nomi_206.bufr
nos1_208.bufr
pgps_110.bufr
rado_250.bufr
s4kn_165.bufr
sb19_206.bufr
sbu8_206.bufr
smin_49.bufr
sn4k_165.bufr
ssbt_127.bufr
tmr7_129.bufr
tropical_cyclone.bufr
tros_31.bufr
"

# ECC-1744: Do not compare floating-point keys like localLatitude1, localLongitude2
KEYS='typicalDate,localNumberOfObservations,satelliteID,restricted'
for bf in ${bufr_files}; do
    input=${data_dir}/bufr/$bf
    $EXEC ${test_dir}/bufr_extract_headers $KEYS $input > $temp1
    ${tools_dir}/bufr_get            -f -p $KEYS $input > $temp2
    diff $temp1 $temp2
done

# Floating-point keys
input=${data_dir}/bufr/aaen_55.bufr
$EXEC ${test_dir}/bufr_extract_headers 'localLongitude1,localLatitude1,localLongitude2,localLatitude2' $input
$EXEC ${test_dir}/bufr_extract_headers 'localLatitude,localLongitude' $input

# Some local keys
input=${data_dir}/bufr/aaen_55.bufr
$EXEC ${test_dir}/bufr_extract_headers 'localMonth,localDay,localHour,localMinute,localSecond' $input
$EXEC ${test_dir}/bufr_extract_headers 'rdbtimeDay,rdbtimeHour,rdbtimeMinute,rdbtimeSecond' $input
$EXEC ${test_dir}/bufr_extract_headers 'rectimeDay,rectimeHour,rectimeMinute,rectimeSecond' $input


# Test restricted
input=${data_dir}/bufr/aaen_55.bufr
${tools_dir}/bufr_set -s restricted=1 $input $temp1
r=`$EXEC ${test_dir}/bufr_extract_headers restricted $temp1`
[ "$r" = "1" ]

# ECC-1785 Allow encoding satelliteID when rdbType=30
# ----------------------------------------------------
sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR3_local_satellite.tmpl
echo 'set numberOfSubsets=1; set rdbType=30; set satelliteID=78; write;' > $tempFilt
${tools_dir}/codes_bufr_filter -o $tempBufr $tempFilt $sample_bufr4
r=$(${test_dir}/bufr_extract_headers isSatellite,satelliteID $tempBufr)
[ "$r" = "1 78" ]


echo "Test with invalid inputs..."
# ---------------------------------
set +e
$EXEC ${test_dir}/bufr_extract_headers centre ${data_dir}
status=$?
set -e
[ $status -ne 0 ]


echo "Test with nonexistent file..."
# ---------------------------------
set +e
$EXEC ${test_dir}/bufr_extract_headers centre nosuchfile > $temp1 2>&1
status=$?
set -e
[ $status -ne 0 ]
grep -q "Unable to read file" $temp1


echo "Test with bad BUFR file..."
# ---------------------------------
echo BUFR > $temp1
set +e
$EXEC ${test_dir}/bufr_extract_headers centre $temp1 > $temp2 2>&1
status=$?
set -e
[ $status -ne 0 ]
grep -q "Unable to count BUFR messages" $temp2


echo "Test with GRIB file..."
# ---------------------------------
input=${data_dir}/sample.grib2
set +e
$EXEC ${test_dir}/bufr_extract_headers centre $input > $temp2 2>&1
status=$?
set -e
[ $status -ne 0 ]
grep -q "No BUFR messages in file" $temp2


# Clean up
rm -f $temp1 $temp2
rm -f $tempBufr $tempFilt