Skip to content

Commit 5715918

Browse files
committed
added AMSR2 section
1 parent d6ff950 commit 5715918

File tree

4 files changed

+342
-1
lines changed

4 files changed

+342
-1
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import com.bc.fiduceo.util.NetCDFUtils;
4+
import com.bc.fiduceo.util.VariableProxy;
5+
import ucar.ma2.DataType;
6+
import ucar.nc2.Attribute;
7+
import ucar.nc2.Variable;
8+
9+
import java.text.ParseException;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
import static com.bc.fiduceo.util.NetCDFUtils.*;
14+
15+
class AMSR2SectionParser extends AbstractSectionParser {
16+
17+
@Override
18+
List<Variable> getVariables() {
19+
final List<Variable> variables = new ArrayList<>();
20+
21+
createCommonVariables(variables, "AMSR2_");
22+
23+
variables.add(createBTVariableProxy("AMSR2_6.9GHzH"));
24+
variables.add(createBTVariableProxy("AMSR2_6.9GHzV"));
25+
variables.add(createBTVariableProxy("AMSR2_7.3GHzH"));
26+
variables.add(createBTVariableProxy("AMSR2_7.3GHzV"));
27+
variables.add(createBTVariableProxy("AMSR2_10.7GHzH"));
28+
variables.add(createBTVariableProxy("AMSR2_10.7GHzV"));
29+
variables.add(createBTVariableProxy("AMSR2_18.7GHzH"));
30+
variables.add(createBTVariableProxy("AMSR2_18.7GHzV"));
31+
variables.add(createBTVariableProxy("AMSR2_23.8GHzH"));
32+
variables.add(createBTVariableProxy("AMSR2_23.8GHzV"));
33+
variables.add(createBTVariableProxy("AMSR2_36.5GHzH"));
34+
variables.add(createBTVariableProxy("AMSR2_36.5GHzV"));
35+
variables.add(createBTVariableProxy("AMSR2_89.0GHzH"));
36+
variables.add(createBTVariableProxy("AMSR2_89.0GHzV"));
37+
38+
ArrayList<Attribute> attributes = new ArrayList<>();
39+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
40+
attributes.add(new Attribute(CF_STANDARD_NAME, "angle_of_incidence"));
41+
attributes.add(new Attribute(CF_UNITS_NAME, "deg"));
42+
variables.add(new VariableProxy("AMSR2_Earth-Incidence", DataType.FLOAT, attributes));
43+
44+
attributes = new ArrayList<>();
45+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
46+
attributes.add(new Attribute(CF_UNITS_NAME, "deg"));
47+
variables.add(new VariableProxy("AMSR2_Earth-Azimuth", DataType.FLOAT, attributes));
48+
49+
attributes = new ArrayList<>();
50+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(short.class)));
51+
attributes.add(new Attribute(CF_LONG_NAME, "Scanpos (0-243)"));
52+
variables.add(new VariableProxy("AMSR2_scanpos", DataType.SHORT, attributes));
53+
54+
attributes = new ArrayList<>();
55+
variables.add(new VariableProxy("AMSR2_upstreamfile", DataType.CHAR, attributes));
56+
57+
attributes = new ArrayList<>();
58+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(short.class)));
59+
attributes.add(new Attribute(CF_LONG_NAME, "Time difference between reference time and AMSR time (seconds)"));
60+
attributes.add(new Attribute(CF_UNITS_NAME, "s"));
61+
variables.add(new VariableProxy("AMSR2_timediff", DataType.SHORT, attributes));
62+
63+
return variables;
64+
}
65+
66+
private static VariableProxy createBTVariableProxy(String name) {
67+
ArrayList<Attribute> attributes = new ArrayList<>();
68+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
69+
attributes.add(new Attribute(CF_STANDARD_NAME, "toa_brightness_temperature"));
70+
attributes.add(new Attribute(CF_UNITS_NAME, "K"));
71+
return new VariableProxy(name, DataType.FLOAT, attributes);
72+
}
73+
74+
@Override
75+
int getNumVariables() {
76+
return 23;
77+
}
78+
79+
@Override
80+
String getNamePrefix() {
81+
return "AMSR2";
82+
}
83+
84+
@Override
85+
Section parse(String[] tokens, int offset) throws ParseException {
86+
final Section section = new Section();
87+
88+
section.add("AMSR2_latitude", parseFloat(tokens[offset]));
89+
section.add("AMSR2_longitude", parseFloat(tokens[offset + 1]));
90+
section.add("AMSR2_time", parseUtcTime(tokens[offset + 2]));
91+
section.add("AMSR2_reference-id", parseString(tokens[offset + 3]));
92+
section.add("AMSR2_6.9GHzH", parseFloat(tokens[offset + 4]));
93+
section.add("AMSR2_6.9GHzV", parseFloat(tokens[offset + 5]));
94+
section.add("AMSR2_7.3GHzH", parseFloat(tokens[offset + 6]));
95+
section.add("AMSR2_7.3GHzV", parseFloat(tokens[offset + 7]));
96+
section.add("AMSR2_10.7GHzH", parseFloat(tokens[offset + 8]));
97+
section.add("AMSR2_10.7GHzV", parseFloat(tokens[offset + 9]));
98+
section.add("AMSR2_18.7GHzH", parseFloat(tokens[offset + 10]));
99+
section.add("AMSR2_18.7GHzV", parseFloat(tokens[offset + 11]));
100+
section.add("AMSR2_23.8GHzH", parseFloat(tokens[offset + 12]));
101+
section.add("AMSR2_23.8GHzV", parseFloat(tokens[offset + 13]));
102+
section.add("AMSR2_36.5GHzH", parseFloat(tokens[offset + 14]));
103+
section.add("AMSR2_36.5GHzV", parseFloat(tokens[offset + 15]));
104+
section.add("AMSR2_89.0GHzH", parseFloat(tokens[offset + 16]));
105+
section.add("AMSR2_89.0GHzV", parseFloat(tokens[offset + 17]));
106+
section.add("AMSR2_Earth-Incidence", parseFloat(tokens[offset + 18]));
107+
section.add("AMSR2_Earth-Azimuth", parseFloat(tokens[offset + 19]));
108+
section.add("AMSR2_scanpos", parseShort(tokens[offset + 20]));
109+
section.add("AMSR2_upstreamfile", parseString(tokens[offset + 21]));
110+
section.add("AMSR2_timediff", parseShort(tokens[offset + 22]));
111+
112+
return section;
113+
}
114+
}

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/SicCciInsituReader.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public void open(File file) throws IOException {
5151
} else if (fileName.contains("ERA")) {
5252
parsers.add(new ERASectionParser("ERA"));
5353
}
54+
if (fileName.contains("AMSR2")) {
55+
parsers.add(new AMSR2SectionParser());
56+
}
5457

5558
sectionCache = new SectionCache(linelist, parsers.toArray(new AbstractSectionParser[0]));
5659
}
@@ -163,7 +166,8 @@ public Array readRaw(int centerX, int centerY, Interval interval, String variabl
163166

164167
@Override
165168
public Array readScaled(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
166-
throw new RuntimeException("not implemented");
169+
// raw data is already in geophysical representation tb 2022-11-11
170+
return readRaw(centerX, centerY, interval, variableName);
167171
}
168172

169173
@Override
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
import ucar.ma2.Array;
6+
import ucar.ma2.DataType;
7+
import ucar.nc2.Variable;
8+
9+
import java.text.ParseException;
10+
import java.util.List;
11+
12+
import static org.junit.Assert.assertEquals;
13+
14+
public class AMSR2SectionParserTest {
15+
16+
private AMSR2SectionParser parser;
17+
18+
@Before
19+
public void setUp() {
20+
parser = new AMSR2SectionParser();
21+
}
22+
23+
@Test
24+
public void testGetVariables() {
25+
final List<Variable> variables = parser.getVariables();
26+
assertEquals(23, variables.size());
27+
assertEquals(variables.size(), parser.getNumVariables());
28+
29+
Variable variable = variables.get(0);
30+
assertEquals("AMSR2_longitude", variable.getShortName());
31+
assertEquals(DataType.FLOAT, variable.getDataType());
32+
33+
variable = variables.get(2);
34+
assertEquals("AMSR2_time", variable.getShortName());
35+
assertEquals(DataType.INT, variable.getDataType());
36+
37+
variable = variables.get(4);
38+
assertEquals("AMSR2_6.9GHzH", variable.getShortName());
39+
assertEquals(DataType.FLOAT, variable.getDataType());
40+
41+
variable = variables.get(7);
42+
assertEquals("AMSR2_7.3GHzV", variable.getShortName());
43+
assertEquals(DataType.FLOAT, variable.getDataType());
44+
45+
variable = variables.get(8);
46+
assertEquals("AMSR2_10.7GHzH", variable.getShortName());
47+
assertEquals(DataType.FLOAT, variable.getDataType());
48+
49+
variable = variables.get(11);
50+
assertEquals("AMSR2_18.7GHzV", variable.getShortName());
51+
assertEquals(DataType.FLOAT, variable.getDataType());
52+
53+
variable = variables.get(12);
54+
assertEquals("AMSR2_23.8GHzH", variable.getShortName());
55+
assertEquals(DataType.FLOAT, variable.getDataType());
56+
57+
variable = variables.get(15);
58+
assertEquals("AMSR2_36.5GHzV", variable.getShortName());
59+
assertEquals(DataType.FLOAT, variable.getDataType());
60+
61+
variable = variables.get(17);
62+
assertEquals("AMSR2_89.0GHzV", variable.getShortName());
63+
assertEquals(DataType.FLOAT, variable.getDataType());
64+
65+
variable = variables.get(18);
66+
assertEquals("AMSR2_Earth-Incidence", variable.getShortName());
67+
assertEquals(DataType.FLOAT, variable.getDataType());
68+
69+
variable = variables.get(19);
70+
assertEquals("AMSR2_Earth-Azimuth", variable.getShortName());
71+
assertEquals(DataType.FLOAT, variable.getDataType());
72+
73+
variable = variables.get(20);
74+
assertEquals("AMSR2_scanpos", variable.getShortName());
75+
assertEquals(DataType.SHORT, variable.getDataType());
76+
77+
variable = variables.get(21);
78+
assertEquals("AMSR2_upstreamfile", variable.getShortName());
79+
assertEquals(DataType.CHAR, variable.getDataType());
80+
81+
variable = variables.get(22);
82+
assertEquals("AMSR2_timediff", variable.getShortName());
83+
assertEquals(DataType.SHORT, variable.getDataType());
84+
}
85+
86+
@Test
87+
public void testGetNamePrefix() {
88+
assertEquals("AMSR2", parser.getNamePrefix());
89+
}
90+
91+
@Test
92+
public void testParse() throws ParseException {
93+
// the first and the last token do not belong to the AMSR data - just for offset testing here tb 2022-11-11
94+
final String[] tokens = {"0.0000",
95+
"+54.974", "+179.959", "2016-01-02T01:00:00Z", "AMSR2_L1R_JAXA", "79.79", "160.12", "80.68", "160.68", "86.50",
96+
"168.86", "106.16", "186.98", "130.80", "200.80", "144.96", "212.90", "197.88", "244.46", "55.26", "-173.87",
97+
"093", "GW1AM2_201601020019_177A_L1SGRTBR_2210210.h5", "0",
98+
"+55.000,"};
99+
100+
final Section section = parser.parse(tokens, 1);
101+
102+
assertEquals(54.974f, section.get("AMSR2_latitude").getFloat(0), 1e-8);
103+
assertEquals(179.959f, section.get("AMSR2_longitude").getFloat(0), 1e-8);
104+
assertEquals(1451696400, section.get("AMSR2_time").getInt(0));
105+
106+
final Array refId = section.get("AMSR2_reference-id");
107+
char[] valueAsArray = (char[]) refId.get1DJavaArray(DataType.CHAR);
108+
assertEquals("AMSR2_L1R_JAXA", new String(valueAsArray));
109+
110+
assertEquals(79.79f, section.get("AMSR2_6.9GHzH").getFloat(0), 1e-8);
111+
assertEquals(160.12f, section.get("AMSR2_6.9GHzV").getFloat(0), 1e-8);
112+
assertEquals(80.68f, section.get("AMSR2_7.3GHzH").getFloat(0), 1e-8);
113+
assertEquals(160.68f, section.get("AMSR2_7.3GHzV").getFloat(0), 1e-8);
114+
assertEquals(86.50f, section.get("AMSR2_10.7GHzH").getFloat(0), 1e-8);
115+
assertEquals(168.86f, section.get("AMSR2_10.7GHzV").getFloat(0), 1e-8);
116+
assertEquals(106.16f, section.get("AMSR2_18.7GHzH").getFloat(0), 1e-8);
117+
assertEquals(186.98f, section.get("AMSR2_18.7GHzV").getFloat(0), 1e-8);
118+
assertEquals(130.8f, section.get("AMSR2_23.8GHzH").getFloat(0), 1e-8);
119+
assertEquals(200.8f, section.get("AMSR2_23.8GHzV").getFloat(0), 1e-8);
120+
assertEquals(144.96f, section.get("AMSR2_36.5GHzH").getFloat(0), 1e-8);
121+
assertEquals(212.9f, section.get("AMSR2_36.5GHzV").getFloat(0), 1e-8);
122+
assertEquals(197.88f, section.get("AMSR2_89.0GHzH").getFloat(0), 1e-8);
123+
assertEquals(244.46f, section.get("AMSR2_89.0GHzV").getFloat(0), 1e-8);
124+
assertEquals(55.26f, section.get("AMSR2_Earth-Incidence").getFloat(0), 1e-8);
125+
assertEquals(93, section.get("AMSR2_scanpos").getInt(0));
126+
127+
final Array fileName = section.get("AMSR2_upstreamfile");
128+
valueAsArray = (char[]) fileName.get1DJavaArray(DataType.CHAR);
129+
assertEquals("GW1AM2_201601020019_177A_L1SGRTBR_2210210.h5", new String(valueAsArray));
130+
131+
assertEquals(0, section.get("AMSR2_timediff").getShort(0));
132+
}
133+
}

core/src/test/java/com/bc/fiduceo/reader/insitu/sic_cci/SciCciInsituReader_IO_Test.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,16 +239,106 @@ public void testReadRaw_1x1_DMISIC0() throws InvalidRangeException, IOException
239239

240240
try {
241241
reader.open(testFile);
242+
// reference data
242243
Array array = reader.readRaw(6, 3, new Interval(1, 1), "latitude");
243244

244245
assertNotNull(array);
245246
assertArrayEquals(new int[]{1, 1}, array.getShape());
246247
assertEquals(DataType.FLOAT, array.getDataType());
247248
assertEquals(63.5f, array.getFloat(0), 1e-8);
248249

250+
// ERA5
249251
array = reader.readRaw(5, 27, new Interval(1, 1), "ERA5_msl");
250252
assertEquals(DataType.FLOAT, array.getDataType());
251253
assertEquals(1032.9f, array.getFloat(0), 1e-8);
254+
255+
// AMSR2
256+
array = reader.readRaw(5, 28, new Interval(1, 1), "AMSR2_6.9GHzH");
257+
assertEquals(DataType.FLOAT, array.getDataType());
258+
assertEquals(88.62f, array.getFloat(0), 1e-8);
259+
} finally {
260+
reader.close();
261+
}
262+
}
263+
264+
@Test
265+
public void testReadRaw_1x1_DTUSIC1() throws InvalidRangeException, IOException {
266+
final File testFile = getDTUSIC1();
267+
268+
try {
269+
reader.open(testFile);
270+
271+
// reference data
272+
Array array = reader.readRaw(7, 4, new Interval(1, 1), "reference-id");
273+
final char[] valueAsArray = (char[]) array.get1DJavaArray(char.class);
274+
assertEquals("COMPRESSIONCELLS_DTU", new String(valueAsArray).trim());
275+
276+
// ERA5
277+
array = reader.readRaw(7, 5, new Interval(1, 1), "ERA5_u10");
278+
assertEquals(-3.8f, array.getFloat(0), 1e-8);
279+
280+
// AMSR2
281+
array = reader.readRaw(7, 6, new Interval(1, 1), "AMSR2_6.9GHzV");
282+
assertEquals(257.9100036621094f, array.getFloat(0), 1e-8);
283+
284+
} finally {
285+
reader.close();
286+
}
287+
}
288+
289+
@Test
290+
public void testReadRaw_3x3_ANTXXXI() throws InvalidRangeException, IOException {
291+
final File testFile = getANTXXXI();
292+
293+
try {
294+
reader.open(testFile);
295+
296+
// reference data
297+
Array array = reader.readRaw(7, 5, new Interval(3, 3), "SIC-total");
298+
assertEquals(DataType.BYTE, array.getDataType());
299+
NCTestUtils.assertValueAt(-127, 0, 0, array);
300+
NCTestUtils.assertValueAt(10, 1, 1, array);
301+
NCTestUtils.assertValueAt(-127, 2, 2, array);
302+
303+
// ERA5
304+
array = reader.readRaw(7, 6, new Interval(3, 3), "ERA_v10");
305+
NCTestUtils.assertValueAt(9.969209968386869E36f, 0, 1, array);
306+
NCTestUtils.assertValueAt(4.17f, 1, 1, array);
307+
NCTestUtils.assertValueAt(9.969209968386869E36f, 2, 1, array);
308+
309+
// AMSR2
310+
array = reader.readRaw(7, 7, new Interval(3, 3), "AMSR2_7.3GHzH");
311+
NCTestUtils.assertValueAt(9.969209968386869E36f, 0, 1, array);
312+
NCTestUtils.assertValueAt(129.34f, 1, 1, array);
313+
NCTestUtils.assertValueAt(9.969209968386869E36f, 2, 1, array);
314+
} finally {
315+
reader.close();
316+
}
317+
}
318+
319+
@Test
320+
public void testReadScaled_1x1_DMISIC0() throws InvalidRangeException, IOException {
321+
final File testFile = getDMISIC0();
322+
323+
try {
324+
reader.open(testFile);
325+
// reference data
326+
Array array = reader.readScaled(6, 5, new Interval(1, 1), "SIC");
327+
328+
assertNotNull(array);
329+
assertArrayEquals(new int[]{1, 1}, array.getShape());
330+
assertEquals(DataType.FLOAT, array.getDataType());
331+
assertEquals(0.f, array.getFloat(0), 1e-8);
332+
333+
// ERA5
334+
array = reader.readScaled(5, 28, new Interval(1, 1), "ERA5_ws");
335+
assertEquals(DataType.FLOAT, array.getDataType());
336+
assertEquals(16.88f, array.getFloat(0), 1e-8);
337+
338+
// AMSR2
339+
array = reader.readScaled(5, 29, new Interval(1, 1), "AMSR2_7.3GHzV");
340+
assertEquals(DataType.FLOAT, array.getDataType());
341+
assertEquals(162.24f, array.getFloat(0), 1e-8);
252342
} finally {
253343
reader.close();
254344
}

0 commit comments

Comments
 (0)