Skip to content

Commit 2a09bfb

Browse files
committed
added QSCAT section
1 parent ea7bc96 commit 2a09bfb

File tree

4 files changed

+246
-0
lines changed

4 files changed

+246
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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 QSCATSectionParser extends AbstractSectionParser {
16+
17+
@Override
18+
List<Variable> getVariables() {
19+
final List<Variable> variables = new ArrayList<>();
20+
21+
createCommonVariables(variables, "QSCAT_");
22+
23+
ArrayList<Attribute> attributes = new ArrayList<>();
24+
variables.add(new VariableProxy("QSCAT_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, "QUIKSCAT backscatter (dB) (HH)"));
29+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
30+
variables.add(new VariableProxy("QSCAT_sigma0_inner", 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, "QUIKSCAT backscatter (dB) - masked (HH)"));
35+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
36+
variables.add(new VariableProxy("QSCAT_sigma0_mask_inner", 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 QUIKSCAT samples (HH)"));
41+
variables.add(new VariableProxy("QSCAT_nb_inner", DataType.SHORT, attributes));
42+
43+
attributes = new ArrayList<>();
44+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
45+
attributes.add(new Attribute(CF_LONG_NAME, "Standard deviation of nb_inner datapoints in daily map (HH) - (not dB)"));
46+
variables.add(new VariableProxy("QSCAT_std_inner", DataType.FLOAT, 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, "QUIKSCAT backscatter (dB) (VV)"));
51+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
52+
variables.add(new VariableProxy("QSCAT_sigma0_outer", DataType.FLOAT, attributes));
53+
54+
attributes = new ArrayList<>();
55+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
56+
attributes.add(new Attribute(CF_LONG_NAME, "QUIKSCAT backscatter (dB) - masked (VV)"));
57+
attributes.add(new Attribute(CF_UNITS_NAME, "db"));
58+
variables.add(new VariableProxy("QSCAT_sigma0_mask_outer", DataType.FLOAT, attributes));
59+
60+
attributes = new ArrayList<>();
61+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(short.class)));
62+
attributes.add(new Attribute(CF_LONG_NAME, "Number of QUIKSCAT samples (VV)"));
63+
variables.add(new VariableProxy("QSCAT_nb_outer", DataType.SHORT, attributes));
64+
65+
attributes = new ArrayList<>();
66+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
67+
attributes.add(new Attribute(CF_LONG_NAME, "Standard deviation of nb_outer datapoints in daily map (VV) - (not dB)"));
68+
variables.add(new VariableProxy("QSCAT_std_outer", DataType.FLOAT, attributes));
69+
70+
return variables;
71+
}
72+
73+
@Override
74+
int getNumVariables() {
75+
return 13;
76+
}
77+
78+
@Override
79+
String getNamePrefix() {
80+
return "QSCAT";
81+
}
82+
83+
@Override
84+
Section parse(String[] tokens, int offset) throws ParseException {
85+
final Section section = new Section();
86+
87+
section.add("QSCAT_latitude", parseFloat(tokens[offset]));
88+
section.add("QSCAT_longitude", parseFloat(tokens[offset + 1]));
89+
section.add("QSCAT_time", parseUtcTime(tokens[offset + 2]));
90+
section.add("QSCAT_reference-id", parseString(tokens[offset + 3]));
91+
section.add("QSCAT_upstreamfile", parseString(tokens[offset + 4]));
92+
section.add("QSCAT_sigma0_inner", parseFloat(tokens[offset + 5]));
93+
section.add("QSCAT_sigma0_mask_inner", parseFloat(tokens[offset + 6]));
94+
section.add("QSCAT_nb_inner", parseShort(tokens[offset + 7]));
95+
section.add("QSCAT_std_inner", parseFloat(tokens[offset + 8]));
96+
section.add("QSCAT_sigma0_outer", parseFloat(tokens[offset + 9]));
97+
section.add("QSCAT_sigma0_mask_outer", parseFloat(tokens[offset + 10]));
98+
section.add("QSCAT_nb_outer", parseShort(tokens[offset + 11]));
99+
section.add("QSCAT_std_outer", parseFloat(tokens[offset + 12]));
100+
101+
return section;
102+
}
103+
}

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
@@ -57,6 +57,9 @@ public void open(File file) throws IOException {
5757
if (fileName.contains("ASCAT")) {
5858
parsers.add(new ASCATSectionParser());
5959
}
60+
if (fileName.contains("QSCAT")){
61+
parsers.add(new QSCATSectionParser());
62+
}
6063

6164
sectionCache = new SectionCache(linelist, parsers.toArray(new AbstractSectionParser[0]));
6265
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
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 QSCATSectionParserTest {
15+
16+
private QSCATSectionParser parser;
17+
18+
@Before
19+
public void setUp() {
20+
parser = new QSCATSectionParser();
21+
}
22+
23+
@Test
24+
public void testGetVariables() {
25+
final List<Variable> variables = parser.getVariables();
26+
27+
assertEquals(13, variables.size());
28+
assertEquals(variables.size(), parser.getNumVariables());
29+
30+
Variable variable = variables.get(0);
31+
assertEquals("QSCAT_longitude", variable.getShortName());
32+
assertEquals(DataType.FLOAT, variable.getDataType());
33+
34+
variable = variables.get(4);
35+
assertEquals("QSCAT_upstreamfile", variable.getShortName());
36+
assertEquals(DataType.CHAR, variable.getDataType());
37+
38+
variable = variables.get(5);
39+
assertEquals("QSCAT_sigma0_inner", variable.getShortName());
40+
assertEquals(DataType.FLOAT, variable.getDataType());
41+
42+
variable = variables.get(6);
43+
assertEquals("QSCAT_sigma0_mask_inner", variable.getShortName());
44+
assertEquals(DataType.FLOAT, variable.getDataType());
45+
46+
variable = variables.get(7);
47+
assertEquals("QSCAT_nb_inner", variable.getShortName());
48+
assertEquals(DataType.SHORT, variable.getDataType());
49+
50+
variable = variables.get(8);
51+
assertEquals("QSCAT_std_inner", variable.getShortName());
52+
assertEquals(DataType.FLOAT, variable.getDataType());
53+
54+
variable = variables.get(9);
55+
assertEquals("QSCAT_sigma0_outer", variable.getShortName());
56+
assertEquals(DataType.FLOAT, variable.getDataType());
57+
58+
variable = variables.get(10);
59+
assertEquals("QSCAT_sigma0_mask_outer", variable.getShortName());
60+
assertEquals(DataType.FLOAT, variable.getDataType());
61+
62+
variable = variables.get(11);
63+
assertEquals("QSCAT_nb_outer", variable.getShortName());
64+
assertEquals(DataType.SHORT, variable.getDataType());
65+
66+
variable = variables.get(12);
67+
assertEquals("QSCAT_std_outer", variable.getShortName());
68+
assertEquals(DataType.FLOAT, variable.getDataType());
69+
}
70+
71+
@Test
72+
public void testGetNamePrefix() {
73+
assertEquals("QSCAT", parser.getNamePrefix());
74+
}
75+
76+
@Test
77+
public void testParse() throws ParseException {
78+
final String[] tokens = new String[]{"-67.000", "+017.295", "2016-11-21T18:54:33Z", "QSCAT_CERSAT_IFREMER", "QSCATnovalfile.nc",
79+
"noval", "noval", "noval", "noval", "noval", "noval", "noval", "noval"};
80+
81+
final Section section = parser.parse(tokens, 0);
82+
83+
assertEquals(-67.f, section.get("QSCAT_latitude").getFloat(0), 1e-8);
84+
assertEquals(17.295f, section.get("QSCAT_longitude").getFloat(0), 1e-8);
85+
assertEquals(1479754473, section.get("QSCAT_time").getInt(0));
86+
87+
final Array refId = section.get("QSCAT_reference-id");
88+
char[] valueAsArray = (char[]) refId.get1DJavaArray(DataType.CHAR);
89+
assertEquals("QSCAT_CERSAT_IFREMER", new String(valueAsArray));
90+
91+
final Array filename = section.get("QSCAT_upstreamfile");
92+
valueAsArray = (char[]) filename.get1DJavaArray(DataType.CHAR);
93+
assertEquals("QSCATnovalfile.nc", new String(valueAsArray));
94+
95+
assertEquals(9.969209968386869E36f, section.get("QSCAT_sigma0_inner").getFloat(0), 1e-8);
96+
assertEquals(9.969209968386869E36f, section.get("QSCAT_sigma0_mask_inner").getFloat(0), 1e-8);
97+
assertEquals(-32767, section.get("QSCAT_nb_inner").getShort(0));
98+
assertEquals(9.969209968386869E36f, section.get("QSCAT_std_inner").getFloat(0), 1e-8);
99+
assertEquals(9.969209968386869E36f, section.get("QSCAT_sigma0_outer").getFloat(0), 1e-8);
100+
assertEquals(9.969209968386869E36f, section.get("QSCAT_sigma0_mask_outer").getFloat(0), 1e-8);
101+
assertEquals(-32767, section.get("QSCAT_nb_outer").getShort(0));
102+
assertEquals(9.969209968386869E36f, section.get("QSCAT_std_outer").getFloat(0), 1e-8);
103+
}
104+
}

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,37 @@ public void testReadScaled_1x1_DMISIC0() throws InvalidRangeException, IOExcepti
364364
}
365365
}
366366

367+
@Test
368+
public void testReadScaled_1x1_DTUSIC1_QSCAT() throws InvalidRangeException, IOException {
369+
final File testFile = getDTUSIC1_QSCAT();
370+
371+
try {
372+
reader.open(testFile);
373+
374+
// reference data
375+
Array array = reader.readScaled(6, 6, new Interval(1, 1), "areachange");
376+
assertEquals(0.993f, array.getFloat(0), 1e-8);
377+
378+
// ERA5
379+
array = reader.readScaled(5, 7, new Interval(1, 1), "ERA_t2m");
380+
assertEquals(253.53f, array.getFloat(0), 1e-8);
381+
382+
// AMSR2
383+
array = reader.readScaled(5, 8, new Interval(1, 1), "AMSR2_23.8GHzH");
384+
assertEquals(229.82f, array.getFloat(0), 1e-8);
385+
386+
// ASCAT
387+
array = reader.readScaled(5, 9, new Interval(1, 1), "ASCAT_std");
388+
assertEquals(0.0755f, array.getFloat(0), 1e-8);
389+
390+
// QSCAT
391+
array = reader.readScaled(5, 10, new Interval(1, 1), "QSCAT_sigma0_inner");
392+
assertEquals(9.969209968386869E36f, array.getFloat(0), 1e-8);
393+
} finally {
394+
reader.close();
395+
}
396+
}
397+
367398
@Test
368399
public void testReadAcquisitionTime_1x1_DTUSIC1() throws IOException, InvalidRangeException {
369400
final File testFile = getDTUSIC1();
@@ -404,6 +435,11 @@ private static File getDTUSIC1() throws IOException {
404435
return TestUtil.getTestDataFileAsserted(relativePath);
405436
}
406437

438+
private static File getDTUSIC1_QSCAT() throws IOException {
439+
final String relativePath = TestUtil.assembleFileSystemPath(new String[]{"insitu", "sic-cci", "DTUSIC1-sic-cci", "v3", "QSCAT-vs-ASCAT-vs-AMSR2-vs-ERA-vs-DTUSIC1-2016-S.text"}, false);
440+
return TestUtil.getTestDataFileAsserted(relativePath);
441+
}
442+
407443
private static File getANTXXXI() throws IOException {
408444
final String relativePath = TestUtil.assembleFileSystemPath(new String[]{"insitu", "sic-cci", "ANTXXXI-sic-cci", "v3", "ASCAT-vs-AMSR2-vs-ERA-vs-ANTXXXI_2_FROSN_SeaIceObservations_reformatted.txt"}, false);
409445
return TestUtil.getTestDataFileAsserted(relativePath);

0 commit comments

Comments
 (0)