Skip to content

Commit a295e69

Browse files
committed
implemented sirds reader
1 parent 2ec2496 commit a295e69

File tree

3 files changed

+165
-5
lines changed

3 files changed

+165
-5
lines changed

core/src/main/java/com/bc/fiduceo/reader/insitu/sirds_sst/SirdsInsituReader.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.bc.fiduceo.reader.insitu.UniqueIdVariable;
1010
import com.bc.fiduceo.reader.netcdf.NetCDFReader;
1111
import com.bc.fiduceo.reader.time.TimeLocator;
12+
import com.bc.fiduceo.util.NetCDFUtils;
1213
import com.bc.fiduceo.util.TimeUtils;
1314
import ucar.ma2.Array;
1415
import ucar.ma2.ArrayInt;
@@ -21,13 +22,16 @@
2122
import java.util.Calendar;
2223
import java.util.List;
2324

25+
import static com.bc.fiduceo.util.TimeUtils.millisSince1978;
26+
2427
public class SirdsInsituReader extends NetCDFReader {
2528

2629
private static final String REGEX = "SSTCCI2_refdata_[a-z]+(_[a-z]+)?_\\d{6}.nc";
2730
private static final String UNIQUE_ID = "unique_id";
2831

2932
private int[] timeMinMax;
3033
private Array uniqueIdData;
34+
private Array sensingTimes;
3135

3236
@Override
3337
public AcquisitionInfo read() throws IOException {
@@ -66,6 +70,7 @@ private void ensureSensingTimesAvailable() throws IOException {
6670
timeStamps[i] = (int) (calendar.getTime().getTime() / 1000);
6771
}
6872

73+
sensingTimes = Array.factory(DataType.INT, new int[]{1}, timeStamps);
6974
timeMinMax = extractMinMax(timeStamps);
7075
}
7176
}
@@ -87,12 +92,22 @@ public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) throws IOExce
8792

8893
@Override
8994
public TimeLocator getTimeLocator() throws IOException {
90-
throw new RuntimeException("not implemented");
95+
ensureSensingTimesAvailable();
96+
return (x, y) -> sensingTimes.getLong(y) * 1000L;
9197
}
9298

9399
@Override
94100
public int[] extractYearMonthDayFromFilename(String fileName) {
95-
throw new RuntimeException("not implemented");
101+
final int lastIndex = fileName.lastIndexOf("_") + 1;
102+
final String yearString = fileName.substring(lastIndex, lastIndex + 4);
103+
final String monthString = fileName.substring(lastIndex + 5, lastIndex + 6);
104+
105+
final int[] ymd = new int[3];
106+
ymd[0] = Integer.parseInt(yearString);
107+
ymd[1] = Integer.parseInt(monthString);
108+
ymd[2] = 1;
109+
110+
return ymd;
96111
}
97112

98113
@Override
@@ -130,8 +145,25 @@ public Array readScaled(int centerX, int centerY, Interval interval, String vari
130145
}
131146

132147
@Override
133-
public ArrayInt.D2 readAcquisitionTime(int x, int y, Interval interval) throws IOException, InvalidRangeException {
134-
throw new RuntimeException("not implemented");
148+
public ArrayInt.D2 readAcquisitionTime(int centerX, int centerY, Interval interval) throws IOException, InvalidRangeException {
149+
ensureSensingTimesAvailable();
150+
151+
final int windowWidth = interval.getX();
152+
final int windowHeight = interval.getY();
153+
final int windowCenterX = windowWidth / 2;
154+
final int windowCenterY = windowHeight / 2;
155+
156+
final int fillValue = NetCDFUtils.getDefaultFillValue(int.class).intValue();
157+
158+
final int[] shape = {windowWidth, windowHeight};
159+
final ArrayInt.D2 windowArray = (ArrayInt.D2) Array.factory(DataType.INT, shape);
160+
for (int y = 0; y < windowHeight; y++) {
161+
for (int x = 0; x < windowWidth; x++) {
162+
windowArray.setObject(windowWidth * y + x, fillValue);
163+
}
164+
}
165+
windowArray.setObject(windowWidth * windowCenterY + windowCenterX, sensingTimes.getInt(centerY));
166+
return windowArray;
135167
}
136168

137169
@Override
@@ -161,7 +193,9 @@ public List<Variable> getVariables() throws InvalidRangeException, IOException {
161193

162194
@Override
163195
public Dimension getProductSize() throws IOException {
164-
throw new RuntimeException("not implemented");
196+
final Array day = arrayCache.get("DAY"); // take a small dataset here tb 2021-07-32
197+
int[] shape = day.getShape();
198+
return new Dimension("product_size", 1, shape[0]);
165199
}
166200

167201
@Override
@@ -193,6 +227,7 @@ static int[] extractMinMax(int[] timeStamps) {
193227
@Override
194228
public void close() throws IOException {
195229
timeMinMax = null;
230+
sensingTimes = null;
196231
uniqueIdData = null;
197232
super.close();
198233
}

core/src/test/java/com/bc/fiduceo/reader/insitu/sirds_sst/SirdsInsituReaderTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,19 @@ public void testGetLongitudeVariableName() {
6464
public void testGetLatitudeVariableName() {
6565
assertEquals("LATITUDE", insituReader.getLatitudeVariableName());
6666
}
67+
68+
@Test
69+
public void testExtractYearMonthDayFromFilename() {
70+
int[] ymd = insituReader.extractYearMonthDayFromFilename("SSTCCI2_refdata_drifter_201304.nc");
71+
assertEquals(3, ymd.length);
72+
assertEquals(2013, ymd[0]);
73+
assertEquals(4, ymd[1]);
74+
assertEquals(1, ymd[2]);
75+
76+
ymd = insituReader.extractYearMonthDayFromFilename("SSTCCI2_refdata_mooring_201602.nc");
77+
assertEquals(3, ymd.length);
78+
assertEquals(2016, ymd[0]);
79+
assertEquals(2, ymd[1]);
80+
assertEquals(1, ymd[2]);
81+
}
6782
}

core/src/test/java/com/bc/fiduceo/reader/insitu/sirds_sst/SirdsInsituReader_IO_Test.java

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,25 @@
33
import com.bc.fiduceo.IOTestRunner;
44
import com.bc.fiduceo.NCTestUtils;
55
import com.bc.fiduceo.TestUtil;
6+
import com.bc.fiduceo.core.Dimension;
67
import com.bc.fiduceo.core.Interval;
78
import com.bc.fiduceo.core.NodeType;
9+
import com.bc.fiduceo.geometry.GeometryFactory;
10+
import com.bc.fiduceo.geometry.Polygon;
811
import com.bc.fiduceo.reader.AcquisitionInfo;
12+
import com.bc.fiduceo.reader.time.TimeLocator;
913
import org.junit.After;
1014
import org.junit.Before;
1115
import org.junit.Test;
1216
import org.junit.runner.RunWith;
1317
import ucar.ma2.Array;
18+
import ucar.ma2.ArrayInt;
1419
import ucar.ma2.DataType;
1520
import ucar.nc2.Variable;
1621

1722
import java.io.File;
1823
import java.io.IOException;
24+
import java.util.Arrays;
1925
import java.util.List;
2026

2127
import static org.junit.Assert.*;
@@ -221,6 +227,110 @@ public void testReadRaw_xbt_uniqueId() throws Exception {
221227
NCTestUtils.assertValueAt(2002040001657855L, 0, 0, idArray);
222228
}
223229

230+
@Test
231+
public void testReadAcquisitionTime_drifter() throws Exception {
232+
openFile("SSTCCI2_refdata_drifter_201304.nc");
233+
final ArrayInt.D2 array = insituReader.readAcquisitionTime(0, 9, new Interval(3, 3));
234+
235+
assertNotNull(array);
236+
assertArrayEquals(new int[]{3, 3}, array.getShape());
237+
assertEquals(DataType.INT, array.getDataType());
238+
239+
NCTestUtils.assertValueAt(-2147483647, 0, 0, array);
240+
NCTestUtils.assertValueAt(-2147483647, 1, 0, array);
241+
NCTestUtils.assertValueAt(-2147483647, 2, 0, array);
242+
NCTestUtils.assertValueAt(-2147483647, 0, 1, array);
243+
NCTestUtils.assertValueAt(1364774400, 1, 1, array);
244+
NCTestUtils.assertValueAt(-2147483647, 2, 1, array);
245+
NCTestUtils.assertValueAt(-2147483647, 0, 2, array);
246+
NCTestUtils.assertValueAt(-2147483647, 1, 2, array);
247+
NCTestUtils.assertValueAt(-2147483647, 2, 2, array);
248+
}
249+
250+
@Test
251+
public void testReadAcquisitionTime_mooring() throws Exception {
252+
openFile("SSTCCI2_refdata_mooring_201602.nc");
253+
final ArrayInt.D2 array = insituReader.readAcquisitionTime(0, 10, new Interval(1, 1));
254+
255+
assertNotNull(array);
256+
assertArrayEquals(new int[]{1, 1}, array.getShape());
257+
assertEquals(DataType.INT, array.getDataType());
258+
259+
NCTestUtils.assertValueAt(1454284800, 0, 0, array);
260+
}
261+
262+
@Test
263+
public void testGetProductSize_xbt() throws Exception {
264+
openFile("SSTCCI2_refdata_xbt_200204.nc");
265+
final Dimension productSize = insituReader.getProductSize();
266+
267+
assertNotNull(productSize);
268+
assertEquals("product_size", productSize.getName());
269+
assertEquals(1, productSize.getNx());
270+
assertEquals(1339, productSize.getNy());
271+
}
272+
273+
@Test
274+
public void testGetProductSize_drifter() throws Exception {
275+
openFile("SSTCCI2_refdata_drifter_201304.nc");
276+
final Dimension productSize = insituReader.getProductSize();
277+
278+
assertNotNull(productSize);
279+
assertEquals("product_size", productSize.getName());
280+
assertEquals(1, productSize.getNx());
281+
assertEquals(671404, productSize.getNy());
282+
}
283+
284+
@Test
285+
public void testGetTimeLocator_mooring() throws Exception {
286+
openFile("SSTCCI2_refdata_mooring_201602.nc");
287+
final TimeLocator timeLocator = insituReader.getTimeLocator();
288+
289+
assertNotNull(timeLocator);
290+
assertEquals(1454284800000L, timeLocator.getTimeFor(0, 11));
291+
assertEquals(1454284800000L, timeLocator.getTimeFor(1, 12));
292+
assertEquals(1454284800000L, timeLocator.getTimeFor(2, 13));
293+
}
294+
295+
@Test
296+
public void testGetTimeLocator_xbt() throws Exception {
297+
openFile("SSTCCI2_refdata_xbt_200204.nc");
298+
final TimeLocator timeLocator = insituReader.getTimeLocator();
299+
300+
assertNotNull(timeLocator);
301+
assertEquals(1017639360000L, timeLocator.getTimeFor(3, 14));
302+
assertEquals(1017641772000L, timeLocator.getTimeFor(4, 15));
303+
assertEquals(1017644292000L, timeLocator.getTimeFor(5, 16));
304+
}
305+
306+
@Test
307+
public void testGetPixelLocator() throws Exception {
308+
openFile("SSTCCI2_refdata_drifter_201304.nc");
309+
310+
try {
311+
insituReader.getPixelLocator();
312+
fail("RuntimeException expected");
313+
} catch (RuntimeException expected) {
314+
}
315+
}
316+
317+
@Test
318+
public void testGetSubScenePixelLocator() throws Exception {
319+
openFile("SSTCCI2_refdata_mooring_201602.nc");
320+
final GeometryFactory geometryFactory = new GeometryFactory(GeometryFactory.Type.S2);
321+
final Polygon polygon = geometryFactory.createPolygon(Arrays.asList(
322+
geometryFactory.createPoint(4, 5),
323+
geometryFactory.createPoint(5, 6),
324+
geometryFactory.createPoint(6, 5)
325+
));
326+
327+
try {
328+
insituReader.getSubScenePixelLocator(polygon);
329+
fail("RuntimeException expected");
330+
} catch (RuntimeException expected) {
331+
}
332+
}
333+
224334
private void openFile(String fileName) throws IOException {
225335
final String testFilePath = TestUtil.assembleFileSystemPath(new String[]{"insitu", "sirds", "v1.0", fileName}, false);
226336
final File insituDataFile = TestUtil.getTestDataFileAsserted(testFilePath);

0 commit comments

Comments
 (0)