Skip to content

Commit 05315c6

Browse files
committed
contd sic insitu
1 parent 402db25 commit 05315c6

File tree

10 files changed

+357
-23
lines changed

10 files changed

+357
-23
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import ucar.nc2.Variable;
4+
5+
import java.text.ParseException;
6+
import java.util.List;
7+
8+
abstract class AbstractSectionParser {
9+
10+
static final int[] SCALAR = new int[1];
11+
12+
abstract List<Variable> getVariables();
13+
14+
abstract Section parse(String[] tokens) throws ParseException;
15+
}

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/ReferenceDataSection.java renamed to core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/DMISIC0SectionParser.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,20 @@
33
import com.bc.fiduceo.util.NetCDFUtils;
44
import com.bc.fiduceo.util.VariableProxy;
55
import org.esa.snap.core.datamodel.ProductData;
6+
import ucar.ma2.Array;
67
import ucar.ma2.DataType;
78
import ucar.nc2.Attribute;
89
import ucar.nc2.Variable;
910

1011
import java.text.ParseException;
1112
import java.util.ArrayList;
12-
import java.util.Date;
1313
import java.util.List;
1414

1515
import static com.bc.fiduceo.util.NetCDFUtils.*;
1616

17-
class ReferenceDataSection {
17+
class DMISIC0SectionParser extends ReferenceSectionParser {
1818

19-
private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
20-
21-
static Date parseTime(String line) throws ParseException {
22-
// todo 2 add some tests for negative indices tb 2022-11-03
23-
int first = line.indexOf(",");
24-
int startIndex = line.indexOf(",", first + 1) + 1;
25-
int stopIndex = line.indexOf(",", startIndex);
26-
27-
final String timeString = line.substring(startIndex, stopIndex);
28-
ProductData.UTC utcTime = ProductData.UTC.parse(timeString, DATE_PATTERN);
29-
return utcTime.getAsDate();
30-
}
31-
32-
static List<Variable> getVariables() {
19+
List<Variable> getVariables() {
3320
final List<Variable> variables = new ArrayList<>();
3421

3522
List<Attribute> attributes = new ArrayList<>();
@@ -60,4 +47,25 @@ static List<Variable> getVariables() {
6047

6148
return variables;
6249
}
50+
51+
Section parse(String[] tokens) throws ParseException {
52+
final Section section = new Section();
53+
54+
final float lat = Float.parseFloat(tokens[0]);
55+
section.add("latitude", Array.factory(DataType.FLOAT, SCALAR, new float[]{lat}));
56+
57+
final float lon = Float.parseFloat(tokens[1]);
58+
section.add("longitude", Array.factory(DataType.FLOAT, SCALAR, new float[]{lon}));
59+
60+
final ProductData.UTC utcTime = ProductData.UTC.parse(tokens[2], DATE_PATTERN);
61+
final int utcSeconds = (int) (utcTime.getAsDate().getTime() / 1000);
62+
section.add("time", Array.factory(DataType.INT, SCALAR, new int[]{utcSeconds}));
63+
64+
section.add("reference-id", Array.factory(DataType.CHAR, new int[]{tokens[3].length()}, tokens[3].toCharArray()));
65+
66+
final float sic = Float.parseFloat(tokens[4]);
67+
section.add("SIC", Array.factory(DataType.FLOAT, SCALAR, new float[]{sic}));
68+
69+
return section;
70+
}
6371
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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 org.esa.snap.core.datamodel.ProductData;
6+
import ucar.ma2.Array;
7+
import ucar.ma2.DataType;
8+
import ucar.nc2.Attribute;
9+
import ucar.nc2.Variable;
10+
11+
import java.text.ParseException;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
import static com.bc.fiduceo.util.NetCDFUtils.*;
16+
17+
public class DTUSIC1SectionParser extends ReferenceSectionParser {
18+
19+
@Override
20+
List<Variable> getVariables() {
21+
final List<Variable> variables = new ArrayList<>();
22+
23+
List<Attribute> attributes = new ArrayList<>();
24+
attributes.add(new Attribute(CF_UNITS_NAME, "degree_east"));
25+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
26+
attributes.add(new Attribute(CF_STANDARD_NAME, "longitude"));
27+
variables.add(new VariableProxy("longitude", DataType.FLOAT, attributes));
28+
29+
attributes = new ArrayList<>();
30+
attributes.add(new Attribute(CF_UNITS_NAME, "degree_north"));
31+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
32+
attributes.add(new Attribute(CF_STANDARD_NAME, "latitude"));
33+
variables.add(new VariableProxy("latitude", DataType.FLOAT, attributes));
34+
35+
attributes = new ArrayList<>();
36+
attributes.add(new Attribute(CF_UNITS_NAME, "seconds since 1970-01-01"));
37+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(int.class)));
38+
attributes.add(new Attribute(CF_STANDARD_NAME, "time"));
39+
variables.add(new VariableProxy("time", DataType.INT, attributes));
40+
41+
attributes = new ArrayList<>();
42+
variables.add(new VariableProxy("reference-id", DataType.CHAR, 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_STANDARD_NAME, "sea_ice_area_fraction"));
47+
variables.add(new VariableProxy("SIC", DataType.FLOAT, attributes));
48+
49+
attributes = new ArrayList<>();
50+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
51+
variables.add(new VariableProxy("areachange", DataType.FLOAT, attributes));
52+
53+
return variables;
54+
}
55+
56+
@Override
57+
Section parse(String[] tokens) throws ParseException {
58+
final Section section = new Section();
59+
60+
final float lat = Float.parseFloat(tokens[0]);
61+
section.add("latitude", Array.factory(DataType.FLOAT, SCALAR, new float[]{lat}));
62+
63+
final float lon = Float.parseFloat(tokens[1]);
64+
section.add("longitude", Array.factory(DataType.FLOAT, SCALAR, new float[]{lon}));
65+
66+
final ProductData.UTC utcTime = ProductData.UTC.parse(tokens[2], DATE_PATTERN);
67+
final int utcSeconds = (int) (utcTime.getAsDate().getTime() / 1000);
68+
section.add("time", Array.factory(DataType.INT, SCALAR, new int[]{utcSeconds}));
69+
70+
section.add("reference-id", Array.factory(DataType.CHAR, new int[] {tokens[3].length()}, tokens[3].toCharArray()));
71+
72+
final float sic = Float.parseFloat(tokens[4]);
73+
section.add("SIC", Array.factory(DataType.FLOAT, SCALAR, new float[]{sic}));
74+
75+
final float areaChange = Float.parseFloat(tokens[5]);
76+
section.add("areachange", Array.factory(DataType.FLOAT, SCALAR, new float[]{areaChange}));
77+
78+
return section;
79+
}
80+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import org.esa.snap.core.datamodel.ProductData;
4+
5+
import java.text.ParseException;
6+
import java.util.Date;
7+
8+
abstract class ReferenceSectionParser extends AbstractSectionParser {
9+
10+
static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
11+
12+
Date parseTime(String line) throws ParseException {
13+
// @todo 2 add some tests for negative indices tb 2022-11-03
14+
int first = line.indexOf(",");
15+
int startIndex = line.indexOf(",", first + 1) + 1;
16+
int stopIndex = line.indexOf(",", startIndex);
17+
18+
final String timeString = line.substring(startIndex, stopIndex);
19+
final ProductData.UTC utcTime = ProductData.UTC.parse(timeString, DATE_PATTERN);
20+
return utcTime.getAsDate();
21+
}
22+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import ucar.ma2.Array;
4+
5+
import java.util.HashMap;
6+
7+
class Section {
8+
9+
private final HashMap<String, Array> dataMap;
10+
11+
Section() {
12+
dataMap = new HashMap<>();
13+
}
14+
15+
void add(String name, Array data) {
16+
dataMap.put(name, data);
17+
}
18+
19+
Array get(String name) {
20+
final Array data = dataMap.get(name);
21+
22+
if(data == null) {
23+
throw new RuntimeException("invalid variable name: " + name);
24+
}
25+
26+
return data;
27+
}
28+
}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,20 @@ public class SicCciInsituReader implements Reader {
3030
private FileReader fileReader;
3131
private TimeLocator timeLocator;
3232
private ArrayList<String> linelist;
33+
private ReferenceSectionParser referenceSectionParser;
3334

3435
@Override
3536
public void open(File file) throws IOException {
3637
fileReader = new FileReader(file);
3738

3839
readLines();
40+
41+
final String fileName = file.getName();
42+
if (fileName.contains("DMISIC0")) {
43+
referenceSectionParser = new DMISIC0SectionParser();
44+
} else if (fileName.contains("DTUSIC1")) {
45+
referenceSectionParser = new DTUSIC1SectionParser();
46+
}
3947
}
4048

4149
private void readLines() throws IOException {
@@ -96,7 +104,7 @@ public TimeLocator getTimeLocator() throws IOException {
96104
try {
97105
int i = 0;
98106
for (String line : linelist) {
99-
final Date refTime = ReferenceDataSection.parseTime(line);
107+
final Date refTime = referenceSectionParser.parseTime(line);
100108
timeArray[i] = refTime.getTime();
101109
++i;
102110
}
@@ -133,7 +141,7 @@ public ArrayInt.D2 readAcquisitionTime(int x, int y, Interval interval) throws I
133141

134142
@Override
135143
public List<Variable> getVariables() throws InvalidRangeException, IOException {
136-
return ReferenceDataSection.getVariables();
144+
return referenceSectionParser.getVariables();
137145
}
138146

139147
@Override
@@ -162,7 +170,7 @@ private void parseSensingTimes(AcquisitionInfo acquisitionInfo) throws IOExcepti
162170
Date maxDate = new Date(0);
163171
try {
164172
for (String line : linelist) {
165-
final Date refTime = ReferenceDataSection.parseTime(line);
173+
final Date refTime = referenceSectionParser.parseTime(line);
166174
if (minDate.after(refTime)) {
167175
minDate = refTime;
168176
}

core/src/test/java/com/bc/fiduceo/reader/insitu/sic_cci/ReferenceDataSectionTest.java renamed to core/src/test/java/com/bc/fiduceo/reader/insitu/sic_cci/DMISIC0SectionParserTest.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.bc.fiduceo.reader.insitu.sic_cci;
22

33
import com.bc.fiduceo.TestUtil;
4+
import org.junit.Before;
45
import org.junit.Test;
6+
import ucar.ma2.Array;
57
import ucar.ma2.DataType;
68
import ucar.nc2.Variable;
79

@@ -11,20 +13,43 @@
1113

1214
import static org.junit.Assert.assertEquals;
1315

14-
public class ReferenceDataSectionTest {
16+
public class DMISIC0SectionParserTest {
17+
18+
private DMISIC0SectionParser parser;
19+
20+
@Before
21+
public void setUp() {
22+
parser = new DMISIC0SectionParser();
23+
}
1524

1625
@Test
17-
public void testParse() throws ParseException {
26+
public void testParseTime() throws ParseException {
1827
final String lineStart = "-59.000,+090.000,2016-01-01T08:00:00Z,ICECHART_DMI,0.0,-59.000,+090.000, ...";
1928

20-
final Date date = ReferenceDataSection.parseTime(lineStart);
29+
final Date date = parser.parseTime(lineStart);
2130

2231
TestUtil.assertCorrectUTCDate(2016, 1, 1, 8, 0, 0, date);
2332
}
2433

34+
@Test
35+
public void testParse() throws ParseException {
36+
final String[] tokens = new String[]{"+55.000", "+180.000", "2016-01-02T01:00:00Z", "ICECHART_DMI", "0.0"};
37+
38+
final Section section = parser.parse(tokens);
39+
assertEquals(180.f, section.get("longitude").getFloat(0), 1e-8);
40+
assertEquals(55.f, section.get("latitude").getFloat(0), 1e-8);
41+
assertEquals(1451696400, section.get("time").getInt(0));
42+
43+
final Array refId = section.get("reference-id");
44+
final char[] valueAsArray = (char[]) refId.get1DJavaArray(DataType.CHAR);
45+
assertEquals("ICECHART_DMI", new String(valueAsArray));
46+
47+
assertEquals(0.f, section.get("SIC").getFloat(0), 1e-8);
48+
}
49+
2550
@Test
2651
public void testGetVariables() {
27-
final List<Variable> variables = ReferenceDataSection.getVariables();
52+
final List<Variable> variables = parser.getVariables();
2853

2954
assertEquals(5, variables.size());
3055

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import com.bc.fiduceo.TestUtil;
4+
import org.junit.Before;
5+
import org.junit.Test;
6+
import ucar.ma2.Array;
7+
import ucar.ma2.DataType;
8+
import ucar.nc2.Variable;
9+
10+
import java.text.ParseException;
11+
import java.util.Date;
12+
import java.util.List;
13+
14+
import static org.junit.Assert.assertEquals;
15+
16+
public class DTUSIC1SectionParserTest {
17+
18+
private DTUSIC1SectionParser parser;
19+
20+
@Before
21+
public void setUp() {
22+
parser = new DTUSIC1SectionParser();
23+
}
24+
25+
@Test
26+
public void testParseTime() throws ParseException {
27+
final String lineStart = "-69.000,-051.628,2017-03-03T07:04:40Z,COMPRESSIONCELLS_DTU,1.0,0.995,-69.000, ...";
28+
29+
final Date date = parser.parseTime(lineStart);
30+
31+
TestUtil.assertCorrectUTCDate(2017, 3, 3, 7, 4, 40, date);
32+
}
33+
34+
@Test
35+
public void testParse() throws ParseException {
36+
final String[] tokens = new String[]{"-73.000", "-053.143", "2017-03-16T06:57:05Z", "COMPRESSIONCELLS_DTU", "1.0", "0.994"};
37+
38+
final Section section = parser.parse(tokens);
39+
assertEquals(-53.143f, section.get("longitude").getFloat(0), 1e-8);
40+
assertEquals(-73.f, section.get("latitude").getFloat(0), 1e-8);
41+
assertEquals(1489647425, section.get("time").getInt(0));
42+
43+
final Array refId = section.get("reference-id");
44+
final char[] valueAsArray = (char[]) refId.get1DJavaArray(DataType.CHAR);
45+
assertEquals("COMPRESSIONCELLS_DTU", new String(valueAsArray));
46+
47+
assertEquals(1.f, section.get("SIC").getFloat(0), 1e-8);
48+
assertEquals(0.994f, section.get("areachange").getFloat(0), 1e-8);
49+
}
50+
51+
@Test
52+
public void testGetVariables() {
53+
final List<Variable> variables = parser.getVariables();
54+
55+
assertEquals(6, variables.size());
56+
57+
Variable variable = variables.get(0);
58+
assertEquals("longitude", variable.getShortName());
59+
assertEquals(DataType.FLOAT, variable.getDataType());
60+
61+
variable = variables.get(1);
62+
assertEquals("latitude", variable.getShortName());
63+
assertEquals(DataType.FLOAT, variable.getDataType());
64+
65+
variable = variables.get(2);
66+
assertEquals("time", variable.getShortName());
67+
assertEquals(DataType.INT, variable.getDataType());
68+
69+
variable = variables.get(3);
70+
assertEquals("reference-id", variable.getShortName());
71+
assertEquals(DataType.CHAR, variable.getDataType());
72+
73+
variable = variables.get(4);
74+
assertEquals("SIC", variable.getShortName());
75+
assertEquals(DataType.FLOAT, variable.getDataType());
76+
}
77+
}

0 commit comments

Comments
 (0)