Skip to content

Commit b6767be

Browse files
committed
sic polarstern
1 parent cefb328 commit b6767be

File tree

8 files changed

+252
-56
lines changed

8 files changed

+252
-56
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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 ANTXXXISectionParser extends ReferenceSectionParser {
16+
17+
@Override
18+
List<Variable> getVariables() {
19+
final List<Variable> variables = new ArrayList<>();
20+
21+
createReferenceCommonVariables(variables);
22+
23+
List<Attribute> attributes = new ArrayList<>();
24+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(byte.class)));
25+
attributes.add(new Attribute(CF_STANDARD_NAME, "sea_ice_area_fraction"));
26+
attributes.add(new Attribute(CF_UNITS_NAME, "percent"));
27+
variables.add(new VariableProxy("SIC-primary", DataType.BYTE, attributes));
28+
29+
attributes = new ArrayList<>();
30+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(byte.class)));
31+
attributes.add(new Attribute(CF_LONG_NAME, "Ice-type-primary ASPeCt code"));
32+
variables.add(new VariableProxy("Ice-type-primary", DataType.BYTE, attributes));
33+
34+
attributes = new ArrayList<>();
35+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(short.class)));
36+
attributes.add(new Attribute(CF_STANDARD_NAME, "sea_ice_thickness"));
37+
attributes.add(new Attribute(CF_UNITS_NAME, "m"));
38+
variables.add(new VariableProxy("SIT-primary", DataType.SHORT, attributes));
39+
40+
return variables;
41+
}
42+
43+
@Override
44+
Section parse(String[] tokens) throws ParseException {
45+
throw new RuntimeException("not implemented");
46+
}
47+
}

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

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,9 @@ class DMISIC0SectionParser extends ReferenceSectionParser {
1919
List<Variable> getVariables() {
2020
final List<Variable> variables = new ArrayList<>();
2121

22-
List<Attribute> attributes = new ArrayList<>();
23-
attributes.add(new Attribute(CF_UNITS_NAME, "degree_east"));
24-
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
25-
attributes.add(new Attribute(CF_STANDARD_NAME, "longitude"));
26-
variables.add(new VariableProxy("longitude", DataType.FLOAT, attributes));
27-
28-
attributes = new ArrayList<>();
29-
attributes.add(new Attribute(CF_UNITS_NAME, "degree_north"));
30-
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
31-
attributes.add(new Attribute(CF_STANDARD_NAME, "latitude"));
32-
variables.add(new VariableProxy("latitude", DataType.FLOAT, attributes));
33-
34-
attributes = new ArrayList<>();
35-
attributes.add(new Attribute(CF_UNITS_NAME, "seconds since 1970-01-01"));
36-
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(int.class)));
37-
attributes.add(new Attribute(CF_STANDARD_NAME, "time"));
38-
variables.add(new VariableProxy("time", DataType.INT, attributes));
39-
40-
attributes = new ArrayList<>();
41-
variables.add(new VariableProxy("reference-id", DataType.CHAR, attributes));
22+
createReferenceCommonVariables(variables);
4223

43-
attributes = new ArrayList<>();
24+
final List<Attribute> attributes = new ArrayList<>();
4425
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
4526
attributes.add(new Attribute(CF_STANDARD_NAME, "sea_ice_area_fraction"));
4627
variables.add(new VariableProxy("SIC", DataType.FLOAT, attributes));

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

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,9 @@ public class DTUSIC1SectionParser extends ReferenceSectionParser {
2020
List<Variable> getVariables() {
2121
final List<Variable> variables = new ArrayList<>();
2222

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));
23+
createReferenceCommonVariables(variables);
3424

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<>();
25+
List<Attribute> attributes = new ArrayList<>();
4526
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
4627
attributes.add(new Attribute(CF_STANDARD_NAME, "sea_ice_area_fraction"));
4728
variables.add(new VariableProxy("SIC", DataType.FLOAT, attributes));

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

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

3+
import com.bc.fiduceo.util.NetCDFUtils;
4+
import com.bc.fiduceo.util.VariableProxy;
35
import org.esa.snap.core.datamodel.ProductData;
6+
import ucar.ma2.DataType;
7+
import ucar.nc2.Attribute;
8+
import ucar.nc2.Variable;
49

510
import java.text.ParseException;
11+
import java.util.ArrayList;
612
import java.util.Date;
13+
import java.util.List;
14+
15+
import static com.bc.fiduceo.util.NetCDFUtils.*;
716

817
abstract class ReferenceSectionParser extends AbstractSectionParser {
918

@@ -19,4 +28,27 @@ Date parseTime(String line) throws ParseException {
1928
final ProductData.UTC utcTime = ProductData.UTC.parse(timeString, DATE_PATTERN);
2029
return utcTime.getAsDate();
2130
}
31+
32+
static void createReferenceCommonVariables(List<Variable> variables) {
33+
List<Attribute> attributes = new ArrayList<>();
34+
attributes.add(new Attribute(CF_UNITS_NAME, "degree_east"));
35+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
36+
attributes.add(new Attribute(CF_STANDARD_NAME, "longitude"));
37+
variables.add(new VariableProxy("longitude", DataType.FLOAT, attributes));
38+
39+
attributes = new ArrayList<>();
40+
attributes.add(new Attribute(CF_UNITS_NAME, "degree_north"));
41+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(float.class)));
42+
attributes.add(new Attribute(CF_STANDARD_NAME, "latitude"));
43+
variables.add(new VariableProxy("latitude", DataType.FLOAT, attributes));
44+
45+
attributes = new ArrayList<>();
46+
attributes.add(new Attribute(CF_UNITS_NAME, "seconds since 1970-01-01"));
47+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, NetCDFUtils.getDefaultFillValue(int.class)));
48+
attributes.add(new Attribute(CF_STANDARD_NAME, "time"));
49+
variables.add(new VariableProxy("time", DataType.INT, attributes));
50+
51+
attributes = new ArrayList<>();
52+
variables.add(new VariableProxy("reference-id", DataType.CHAR, attributes));
53+
}
2254
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.bc.fiduceo.reader.insitu.sic_cci;
2+
3+
import ucar.ma2.Array;
4+
5+
import java.text.ParseException;
6+
import java.util.ArrayList;
7+
8+
// @todo 1 tb/tb write tests! 2022-11-08
9+
class SectionCache {
10+
11+
private final ArrayList<String> lineList;
12+
private Section[] referenceSections;
13+
private AbstractSectionParser[] parser;
14+
15+
SectionCache(ArrayList<String> linelist, AbstractSectionParser[] parser) {
16+
this.lineList = linelist;
17+
this.parser = parser;
18+
19+
referenceSections = new Section[linelist.size()];
20+
}
21+
22+
void close() {
23+
referenceSections = null;
24+
}
25+
26+
Array get(String variableName, int y) throws ParseException {
27+
if (referenceSections[y] == null) {
28+
final String line = lineList.get(y);
29+
final String[] tokens = line.split(",");
30+
referenceSections[y] = parser[0].parse(tokens);
31+
// @todo 1 tb/tb run over all parsers and store the sections
32+
33+
}
34+
return referenceSections[y].get(variableName);
35+
}
36+
}

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

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
import com.bc.fiduceo.reader.Reader;
1010
import com.bc.fiduceo.reader.time.TimeLocator;
1111
import com.bc.fiduceo.reader.time.TimeLocator_MillisSince1970;
12+
import com.bc.fiduceo.util.NetCDFUtils;
1213
import ucar.ma2.Array;
1314
import ucar.ma2.ArrayInt;
15+
import ucar.ma2.DataType;
1416
import ucar.ma2.InvalidRangeException;
1517
import ucar.nc2.Variable;
1618

@@ -30,6 +32,7 @@ public class SicCciInsituReader implements Reader {
3032
private FileReader fileReader;
3133
private TimeLocator timeLocator;
3234
private ArrayList<String> linelist;
35+
private SectionCache sectionCache;
3336
private ReferenceSectionParser referenceSectionParser;
3437

3538
@Override
@@ -44,6 +47,8 @@ public void open(File file) throws IOException {
4447
} else if (fileName.contains("DTUSIC1")) {
4548
referenceSectionParser = new DTUSIC1SectionParser();
4649
}
50+
51+
sectionCache = new SectionCache(linelist, new AbstractSectionParser[] {referenceSectionParser});
4752
}
4853

4954
private void readLines() throws IOException {
@@ -61,6 +66,10 @@ private void readLines() throws IOException {
6166

6267
@Override
6368
public void close() throws IOException {
69+
if (sectionCache != null) {
70+
sectionCache.close();
71+
sectionCache = null;
72+
}
6473
if (linelist != null) {
6574
linelist.clear();
6675
linelist = null;
@@ -100,19 +109,7 @@ public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) throws IOExce
100109
@Override
101110
public TimeLocator getTimeLocator() throws IOException {
102111
if (timeLocator == null) {
103-
long[] timeArray = new long[linelist.size()];
104-
try {
105-
int i = 0;
106-
for (String line : linelist) {
107-
final Date refTime = referenceSectionParser.parseTime(line);
108-
timeArray[i] = refTime.getTime();
109-
++i;
110-
}
111-
112-
timeLocator = new TimeLocator_MillisSince1970(timeArray);
113-
} catch (ParseException e) {
114-
throw new IOException(e.getMessage());
115-
}
112+
createTimeLocator();
116113
}
117114
return timeLocator;
118115
}
@@ -136,7 +133,23 @@ public Array readScaled(int centerX, int centerY, Interval interval, String vari
136133

137134
@Override
138135
public ArrayInt.D2 readAcquisitionTime(int x, int y, Interval interval) throws IOException, InvalidRangeException {
139-
throw new RuntimeException("not implemented");
136+
final int windowHeight = interval.getY();
137+
final int windowWidth = interval.getX();
138+
final Array windowArray = NetCDFUtils.create(DataType.INT,
139+
new int[]{windowHeight, windowWidth},
140+
NetCDFUtils.getDefaultFillValue(DataType.INT, false));
141+
142+
try {
143+
final int windowCenterX = windowWidth / 2;
144+
final int windowCenterY = windowHeight / 2;
145+
146+
final Array timeArray = sectionCache.get("time", y);
147+
windowArray.setObject(windowWidth * windowCenterY + windowCenterX, timeArray.getInt(0));
148+
} catch (ParseException e) {
149+
throw new IOException(e);
150+
}
151+
152+
return (ArrayInt.D2) windowArray;
140153
}
141154

142155
@Override
@@ -186,4 +199,20 @@ private void parseSensingTimes(AcquisitionInfo acquisitionInfo) throws IOExcepti
186199
throw new IOException(e.getMessage());
187200
}
188201
}
202+
203+
private void createTimeLocator() throws IOException {
204+
long[] timeArray = new long[linelist.size()];
205+
try {
206+
int i = 0;
207+
for (String line : linelist) {
208+
final Date refTime = referenceSectionParser.parseTime(line);
209+
timeArray[i] = refTime.getTime();
210+
++i;
211+
}
212+
213+
timeLocator = new TimeLocator_MillisSince1970(timeArray);
214+
} catch (ParseException e) {
215+
throw new IOException(e.getMessage());
216+
}
217+
}
189218
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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.DataType;
7+
import ucar.nc2.Variable;
8+
9+
import java.text.ParseException;
10+
import java.util.Date;
11+
import java.util.List;
12+
13+
import static org.junit.Assert.assertEquals;
14+
15+
public class ANTXXXISectionParserTest {
16+
17+
private ANTXXXISectionParser parser;
18+
19+
@Before
20+
public void setUp() {
21+
parser = new ANTXXXISectionParser();
22+
}
23+
24+
@Test
25+
public void testParseTime() throws ParseException {
26+
final String lineStart = "-68.72273,-7.59800,2015-12-16T17:00:00Z,ASPeCt_ANT-XXXI_2_Polarstern,10,10,60,0.6,0.45,1.0,4,0.10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1.66,-4.7,2.8,157,97,8,2,-69.000,, ...";
27+
28+
final Date date = parser.parseTime(lineStart);
29+
30+
TestUtil.assertCorrectUTCDate(2015, 12, 16, 17, 0, 0, date);
31+
}
32+
33+
@Test
34+
public void testGetVariables() {
35+
final List<Variable> variables = parser.getVariables();
36+
37+
assertEquals(7, variables.size());
38+
39+
Variable variable = variables.get(0);
40+
assertEquals("longitude", variable.getShortName());
41+
assertEquals(DataType.FLOAT, variable.getDataType());
42+
43+
variable = variables.get(3);
44+
assertEquals("reference-id", variable.getShortName());
45+
assertEquals(DataType.CHAR, variable.getDataType());
46+
47+
variable = variables.get(4);
48+
assertEquals("SIC-primary", variable.getShortName());
49+
assertEquals(DataType.BYTE, variable.getDataType());
50+
51+
variable = variables.get(5);
52+
assertEquals("Ice-type-primary", variable.getShortName());
53+
assertEquals(DataType.BYTE, variable.getDataType());
54+
55+
variable = variables.get(6);
56+
assertEquals("SIT-primary", variable.getShortName());
57+
assertEquals(DataType.SHORT, variable.getDataType());
58+
}
59+
}

0 commit comments

Comments
 (0)