Skip to content

Commit ea7bc96

Browse files
committed
added ASCAT section
1 parent 5715918 commit ea7bc96

File tree

5 files changed

+206
-2
lines changed

5 files changed

+206
-2
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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+
public class ASCATSectionParser extends AbstractSectionParser {
16+
17+
@Override
18+
List<Variable> getVariables() {
19+
final List<Variable> variables = new ArrayList<>();
20+
21+
createCommonVariables(variables, "ASCAT_");
22+
23+
ArrayList<Attribute> attributes = new ArrayList<>();
24+
variables.add(new VariableProxy("ASCAT_upstreamfile", DataType.CHAR, attributes));
25+
26+
attributes = new ArrayList<>();
27+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
28+
attributes.add(new Attribute(CF_LONG_NAME, "ASCAT backscatter (dB)"));
29+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
30+
variables.add(new VariableProxy("ASCAT_sigma_40", DataType.FLOAT, attributes));
31+
32+
attributes = new ArrayList<>();
33+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
34+
attributes.add(new Attribute(CF_LONG_NAME, "ASCAT backscatter (dB) - masked"));
35+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
36+
variables.add(new VariableProxy("ASCAT_sigma_40_mask", DataType.FLOAT, attributes));
37+
38+
attributes = new ArrayList<>();
39+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(short.class)));
40+
attributes.add(new Attribute(CF_LONG_NAME, "Number of ASCAT samples"));
41+
variables.add(new VariableProxy("ASCAT_nb_samples", DataType.SHORT, attributes));
42+
43+
attributes = new ArrayList<>();
44+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(short.class)));
45+
attributes.add(new Attribute(CF_LONG_NAME, "ASCAT flag"));
46+
variables.add(new VariableProxy("ASCAT_warning", DataType.SHORT, attributes));
47+
48+
attributes = new ArrayList<>();
49+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
50+
attributes.add(new Attribute(CF_LONG_NAME, "Standard deviation of ASCAT data"));
51+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
52+
variables.add(new VariableProxy("ASCAT_std", DataType.FLOAT, attributes));
53+
54+
return variables;
55+
}
56+
57+
@Override
58+
int getNumVariables() {
59+
return 10;
60+
}
61+
62+
@Override
63+
String getNamePrefix() {
64+
return "ASCAT";
65+
}
66+
67+
@Override
68+
Section parse(String[] tokens, int offset) throws ParseException {
69+
final Section section = new Section();
70+
71+
section.add("ASCAT_latitude", parseFloat(tokens[offset]));
72+
section.add("ASCAT_longitude", parseFloat(tokens[offset + 1]));
73+
section.add("ASCAT_time", parseUtcTime(tokens[offset + 2]));
74+
section.add("ASCAT_reference-id", parseString(tokens[offset + 3]));
75+
section.add("ASCAT_upstreamfile", parseString(tokens[offset + 4]));
76+
section.add("ASCAT_sigma_40", parseFloat(tokens[offset + 5]));
77+
section.add("ASCAT_sigma_40_mask", parseFloat(tokens[offset + 6]));
78+
section.add("ASCAT_nb_samples", parseShort(tokens[offset + 7]));
79+
section.add("ASCAT_warning", parseShort(tokens[offset + 8]));
80+
section.add("ASCAT_std", parseFloat(tokens[offset + 9]));
81+
82+
return section;
83+
}
84+
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,14 @@ static Array parseFloat(String token) {
6666
}
6767

6868
static Array parseShort(String token) {
69-
final short wd = Short.parseShort(token);
70-
return Array.factory(DataType.SHORT, SCALAR, new short[]{wd});
69+
final short shortVal;
70+
71+
if (token.equals("noval")) {
72+
shortVal = NetCDFUtils.getDefaultFillValue(short.class).shortValue();
73+
} else {
74+
shortVal = Short.parseShort(token);
75+
}
76+
return Array.factory(DataType.SHORT, SCALAR, new short[]{shortVal});
7177
}
7278

7379
static Array parseByte(String token) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ public void open(File file) throws IOException {
5454
if (fileName.contains("AMSR2")) {
5555
parsers.add(new AMSR2SectionParser());
5656
}
57+
if (fileName.contains("ASCAT")) {
58+
parsers.add(new ASCATSectionParser());
59+
}
5760

5861
sectionCache = new SectionCache(linelist, parsers.toArray(new AbstractSectionParser[0]));
5962
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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 ASCATSectionParserTest {
15+
16+
private ASCATSectionParser parser;
17+
18+
@Before
19+
public void setUp() {
20+
parser = new ASCATSectionParser();
21+
}
22+
23+
@Test
24+
public void testGetVariables() {
25+
final List<Variable> variables = parser.getVariables();
26+
27+
assertEquals(10, variables.size());
28+
assertEquals(variables.size(), parser.getNumVariables());
29+
30+
Variable variable = variables.get(0);
31+
assertEquals("ASCAT_longitude", variable.getShortName());
32+
assertEquals(DataType.FLOAT, variable.getDataType());
33+
34+
variable = variables.get(4);
35+
assertEquals("ASCAT_upstreamfile", variable.getShortName());
36+
assertEquals(DataType.CHAR, variable.getDataType());
37+
38+
variable = variables.get(5);
39+
assertEquals("ASCAT_sigma_40", variable.getShortName());
40+
assertEquals(DataType.FLOAT, variable.getDataType());
41+
42+
variable = variables.get(6);
43+
assertEquals("ASCAT_sigma_40_mask", variable.getShortName());
44+
assertEquals(DataType.FLOAT, variable.getDataType());
45+
46+
variable = variables.get(7);
47+
assertEquals("ASCAT_nb_samples", variable.getShortName());
48+
assertEquals(DataType.SHORT, variable.getDataType());
49+
50+
variable = variables.get(8);
51+
assertEquals("ASCAT_warning", variable.getShortName());
52+
assertEquals(DataType.SHORT, variable.getDataType());
53+
54+
variable = variables.get(9);
55+
assertEquals("ASCAT_std", variable.getShortName());
56+
assertEquals(DataType.FLOAT, variable.getDataType());
57+
}
58+
59+
@Test
60+
public void testGetNamePrefix() {
61+
assertEquals("ASCAT", parser.getNamePrefix());
62+
}
63+
64+
@Test
65+
public void testParse() throws ParseException {
66+
// first two tokens don't belong to ASCAT - just as offset for testing tb 2022-11-11
67+
final String[] tokens = {"GW1AM2_201701210013_184D_L1SGRTBR_2220220.h5", "4852",
68+
"-70.990", "-044.510", "2017-01-20T12:00:00Z", "ASCAT_CERSAT_IFREMER", "ASCAT_A_B_20170120.nc", "-16.44920",
69+
"-16.44920", "21", "0", "0.10924"};
70+
71+
final Section section = parser.parse(tokens, 2);
72+
73+
assertEquals(-70.99f, section.get("ASCAT_latitude").getFloat(0), 1e-8);
74+
assertEquals(-44.51f, section.get("ASCAT_longitude").getFloat(0), 1e-8);
75+
assertEquals(1484913600, section.get("ASCAT_time").getInt(0));
76+
77+
final Array refId = section.get("ASCAT_reference-id");
78+
char[] valueAsArray = (char[]) refId.get1DJavaArray(DataType.CHAR);
79+
assertEquals("ASCAT_CERSAT_IFREMER", new String(valueAsArray));
80+
81+
final Array filename = section.get("ASCAT_upstreamfile");
82+
valueAsArray = (char[]) filename.get1DJavaArray(DataType.CHAR);
83+
assertEquals("ASCAT_A_B_20170120.nc", new String(valueAsArray));
84+
85+
assertEquals(-16.4492f, section.get("ASCAT_sigma_40").getFloat(0), 1e-8);
86+
assertEquals(-16.4492f, section.get("ASCAT_sigma_40_mask").getFloat(0), 1e-8);
87+
assertEquals(21, section.get("ASCAT_nb_samples").getShort(0));
88+
assertEquals(0, section.get("ASCAT_warning").getShort(0));
89+
assertEquals(0.10924f, section.get("ASCAT_std").getFloat(0), 1e-8);
90+
}
91+
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,11 @@ public void testReadRaw_1x1_DMISIC0() throws InvalidRangeException, IOException
256256
array = reader.readRaw(5, 28, new Interval(1, 1), "AMSR2_6.9GHzH");
257257
assertEquals(DataType.FLOAT, array.getDataType());
258258
assertEquals(88.62f, array.getFloat(0), 1e-8);
259+
260+
// ASCAT
261+
array = reader.readRaw(5, 29, new Interval(1, 1), "ASCAT_sigma_40");
262+
assertEquals(DataType.FLOAT, array.getDataType());
263+
assertEquals(-15.76655f, array.getFloat(0), 1e-8);
259264
} finally {
260265
reader.close();
261266
}
@@ -281,6 +286,10 @@ public void testReadRaw_1x1_DTUSIC1() throws InvalidRangeException, IOException
281286
array = reader.readRaw(7, 6, new Interval(1, 1), "AMSR2_6.9GHzV");
282287
assertEquals(257.9100036621094f, array.getFloat(0), 1e-8);
283288

289+
// ASCAT
290+
array = reader.readRaw(5, 7, new Interval(1, 1), "ASCAT_sigma_40_mask");
291+
assertEquals(-15.17677f, array.getFloat(0), 1e-8);
292+
284293
} finally {
285294
reader.close();
286295
}
@@ -311,6 +320,12 @@ public void testReadRaw_3x3_ANTXXXI() throws InvalidRangeException, IOException
311320
NCTestUtils.assertValueAt(9.969209968386869E36f, 0, 1, array);
312321
NCTestUtils.assertValueAt(129.34f, 1, 1, array);
313322
NCTestUtils.assertValueAt(9.969209968386869E36f, 2, 1, array);
323+
324+
// ASCAT
325+
array = reader.readRaw(7, 8, new Interval(3, 3), "ASCAT_nb_samples");
326+
NCTestUtils.assertValueAt(-32767, 0, 1, array);
327+
NCTestUtils.assertValueAt(-32767, 1, 1, array);
328+
NCTestUtils.assertValueAt(-32767, 2, 1, array);
314329
} finally {
315330
reader.close();
316331
}
@@ -339,6 +354,11 @@ public void testReadScaled_1x1_DMISIC0() throws InvalidRangeException, IOExcepti
339354
array = reader.readScaled(5, 29, new Interval(1, 1), "AMSR2_7.3GHzV");
340355
assertEquals(DataType.FLOAT, array.getDataType());
341356
assertEquals(162.24f, array.getFloat(0), 1e-8);
357+
358+
// ASCAT
359+
array = reader.readScaled(5, 30, new Interval(1, 1), "ASCAT_warning");
360+
assertEquals(DataType.SHORT, array.getDataType());
361+
assertEquals(0, array.getShort(0), 1e-8);
342362
} finally {
343363
reader.close();
344364
}

0 commit comments

Comments
 (0)