Skip to content

Commit eb368af

Browse files
committed
implemented reading functionality
1 parent b14c854 commit eb368af

File tree

8 files changed

+210
-5
lines changed

8 files changed

+210
-5
lines changed

core/src/main/java/com/bc/fiduceo/reader/modis/ModisL1EmissiveExtension.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public String getExtension(int index) {
2020
return "_ch" + CHANNEL_INDEX_FORMAT.format(chIndex + 1);
2121
}
2222

23-
throw new IllegalArgumentException("unsupportes channel index");
23+
throw new IllegalArgumentException("unsupported channel index");
24+
}
25+
26+
@Override
27+
public int getIndex(String extension) {
28+
throw new RuntimeException("not implemented");
2429
}
2530
}

core/src/main/java/com/bc/fiduceo/reader/modis/ModisL1ReflectiveExtension.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,9 @@ public String getExtension(int index) {
3131

3232
throw new IllegalStateException("unsupported index");
3333
}
34+
35+
@Override
36+
public int getIndex(String extension) {
37+
throw new RuntimeException("not implemented");
38+
}
3439
}

core/src/main/java/com/bc/fiduceo/reader/netcdf/LayerExtension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
public interface LayerExtension {
44

55
String getExtension(int index);
6+
7+
int getIndex(String extension);
68
}

core/src/main/java/com/bc/fiduceo/reader/netcdf/StandardLayerExtension.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@ public StandardLayerExtension(int offset) {
2121
public String getExtension(int index) {
2222
return "_ch" + CHANNEL_INDEX_FORMAT.format(index + offset + 1);
2323
}
24+
25+
@Override
26+
public int getIndex(String extension) {
27+
throw new RuntimeException("not implemented");
28+
}
2429
}

core/src/main/java/com/bc/fiduceo/reader/smos/SmosAngleExtension.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,15 @@ public String getExtension(int index) {
1414
throw new RuntimeException("invalid layer index");
1515
}
1616
}
17+
18+
@Override
19+
public int getIndex(String extension) {
20+
for (int i = 0; i < EXTENSIONS.length; i++) {
21+
if (extension.equals(EXTENSIONS[i])) {
22+
return i;
23+
}
24+
}
25+
26+
throw new RuntimeException("invalid extension string: " + extension);
27+
}
1728
}

core/src/main/java/com/bc/fiduceo/reader/smos/SmosL1CDailyGriddedReader.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import com.bc.fiduceo.geometry.*;
77
import com.bc.fiduceo.location.PixelLocator;
88
import com.bc.fiduceo.reader.AcquisitionInfo;
9+
import com.bc.fiduceo.reader.RawDataReader;
910
import com.bc.fiduceo.reader.ReaderContext;
1011
import com.bc.fiduceo.reader.ReaderUtils;
1112
import com.bc.fiduceo.reader.netcdf.NetCDFReader;
1213
import com.bc.fiduceo.reader.time.TimeLocator;
14+
import com.bc.fiduceo.util.NetCDFUtils;
1315
import com.bc.fiduceo.util.TimeUtils;
1416
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
1517
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
@@ -34,6 +36,7 @@ class SmosL1CDailyGriddedReader extends NetCDFReader {
3436
private final Rectangle2D.Float boundary;
3537
private final List<String> variablesToSkip;
3638
private final List<String> variables2D;
39+
private final SmosAngleExtension layerExtension;
3740

3841
private File productDir;
3942
private PixelLocator pixelLocator;
@@ -53,6 +56,7 @@ class SmosL1CDailyGriddedReader extends NetCDFReader {
5356
variables2D = new ArrayList<>();
5457
variables2D.add("X_Swath");
5558
variables2D.add("Grid_Point_Mask");
59+
layerExtension = new SmosAngleExtension();
5660
}
5761

5862
@Override
@@ -169,12 +173,46 @@ public int[] extractYearMonthDayFromFilename(String fileName) {
169173

170174
@Override
171175
public Array readRaw(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
172-
throw new IllegalStateException("not implemented");
176+
if (variables2D.contains(variableName)) {
177+
final Array array = arrayCache.get(variableName);
178+
final Number fillValue = arrayCache.getNumberAttributeValue(NetCDFUtils.CF_FILL_VALUE_NAME, variableName);
179+
return RawDataReader.read(centerX, centerY, interval, fillValue, array, getProductSize());
180+
} else {
181+
final int extensionIdx = variableName.lastIndexOf("_");
182+
final int layerIndex = layerExtension.getIndex(variableName.substring(extensionIdx));
183+
final String ncVariableName = variableName.substring(0, extensionIdx);
184+
185+
final Array array = arrayCache.get(ncVariableName);
186+
final Number fillValue = arrayCache.getNumberAttributeValue(NetCDFUtils.CF_FILL_VALUE_NAME, ncVariableName);
187+
188+
final int[] shape = array.getShape();
189+
shape[0] = 1; // we only want one z-layer
190+
final int[] offsets = {layerIndex, 0, 0};
191+
192+
final Array angleLayer = NetCDFUtils.section(array, offsets, shape);
193+
return RawDataReader.read(centerX, centerY, interval, fillValue, angleLayer, getProductSize());
194+
}
173195
}
174196

175197
@Override
176198
public Array readScaled(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
177-
throw new IllegalStateException("not implemented");
199+
final Array rawArray = readRaw(centerX, centerY, interval, variableName);
200+
201+
final String ncVariableName;
202+
if (variables2D.contains(variableName)) {
203+
ncVariableName = variableName;
204+
} else {
205+
final int extensionIdx = variableName.lastIndexOf("_");
206+
ncVariableName = variableName.substring(0, extensionIdx);
207+
}
208+
double scaleFactor = arrayCache.getNumberAttributeValue("scale_factor", ncVariableName).doubleValue();
209+
double offset = arrayCache.getNumberAttributeValue("add_offset", ncVariableName).doubleValue();
210+
if (ReaderUtils.mustScale(scaleFactor, offset)) {
211+
final MAMath.ScaleOffset scaleOffset = new MAMath.ScaleOffset(scaleFactor, offset);
212+
return MAMath.convert2Unpacked(rawArray, scaleOffset);
213+
}
214+
215+
return rawArray;
178216
}
179217

180218
@Override
@@ -225,8 +263,6 @@ public List<Variable> getVariables() throws InvalidRangeException, IOException {
225263
final List<Variable> variablesInFile = netcdfFile.getVariables();
226264
final ArrayList<Variable> exportVariables = new ArrayList<>();
227265

228-
final SmosAngleExtension layerExtension = new SmosAngleExtension();
229-
230266
for (Variable variable : variablesInFile) {
231267
final String variableName = variable.getShortName();
232268
if (variablesToSkip.contains(variableName)) {

core/src/test/java/com/bc/fiduceo/reader/smos/SmosAngleExtensionTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,26 @@ public void testGetExtension_outsideRange() {
3737
} catch (RuntimeException expected) {
3838
}
3939
}
40+
41+
@Test
42+
public void testGetIndex() {
43+
assertEquals(0, extension.getIndex("_025"));
44+
assertEquals(5, extension.getIndex("_275"));
45+
assertEquals(11, extension.getIndex("_525"));
46+
}
47+
48+
@Test
49+
public void testGetIndex_invalid() {
50+
try {
51+
extension.getIndex("heffalump");
52+
fail("RuntimeException expected");
53+
} catch (RuntimeException expected) {
54+
}
55+
56+
try {
57+
extension.getIndex("");
58+
fail("RuntimeException expected");
59+
} catch (RuntimeException expected) {
60+
}
61+
}
4062
}

core/src/test/java/com/bc/fiduceo/reader/smos/SmosL1CDailyGriddedReader_IO_Test.java

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.junit.Before;
1717
import org.junit.Test;
1818
import org.junit.runner.RunWith;
19+
import ucar.ma2.Array;
1920
import ucar.ma2.ArrayInt;
2021
import ucar.ma2.DataType;
2122
import ucar.ma2.InvalidRangeException;
@@ -308,6 +309,124 @@ public void testReadAcquisitionTime_CDF3TD() throws IOException, InvalidRangeExc
308309
}
309310
}
310311

312+
@Test
313+
public void testReadAcquisitionTime_CDF3TA_outsideTop() throws IOException, InvalidRangeException {
314+
final File file = getCDF3TAFile();
315+
316+
try {
317+
reader.open(file);
318+
final ArrayInt.D2 acquisitionTime = reader.readAcquisitionTime(416, 0, new Interval(3, 5));
319+
assertEquals(15, acquisitionTime.getSize());
320+
321+
NCTestUtils.assertValueAt(-2147483647, 1, 0, acquisitionTime);
322+
NCTestUtils.assertValueAt(-2147483647, 1, 1, acquisitionTime);
323+
NCTestUtils.assertValueAt(1465575514, 1, 2, acquisitionTime);
324+
NCTestUtils.assertValueAt(1465575510, 1, 3, acquisitionTime);
325+
NCTestUtils.assertValueAt(1465569571, 1, 4, acquisitionTime);
326+
} finally {
327+
reader.close();
328+
}
329+
}
330+
331+
@Test
332+
public void testReadRaw_2D_CDF3TD() throws IOException, InvalidRangeException {
333+
final File file = getCDF3TDFile();
334+
335+
try {
336+
reader.open(file);
337+
338+
final Array array = reader.readRaw(962, 175, new Interval(3, 3), "X_Swath");
339+
NCTestUtils.assertValueAt(495649.46875, 0, 0, array);
340+
NCTestUtils.assertValueAt(521634.0625, 1, 0, array);
341+
NCTestUtils.assertValueAt(517200.75, 1, 1, array);
342+
NCTestUtils.assertValueAt(543231.25, 2, 1, array);
343+
} finally {
344+
reader.close();
345+
}
346+
}
347+
348+
@Test
349+
public void testReadRaw_3D_CDF3TD() throws IOException, InvalidRangeException {
350+
final File file = getCDF3TDFile();
351+
352+
try {
353+
reader.open(file);
354+
355+
final Array array = reader.readRaw(963, 284, new Interval(3, 3), "BT_H_025");
356+
NCTestUtils.assertValueAt(-16530, 0, 1, array);
357+
NCTestUtils.assertValueAt(-16831, 1, 1, array);
358+
NCTestUtils.assertValueAt(-32768, 2, 1, array);
359+
NCTestUtils.assertValueAt(-17140, 0, 2, array);
360+
} finally {
361+
reader.close();
362+
}
363+
}
364+
365+
@Test
366+
public void testReadRaw_2D_CDF3TA_outsideRight() throws IOException, InvalidRangeException {
367+
final File file = getCDF3TAFile();
368+
369+
try {
370+
reader.open(file);
371+
372+
final Array array = reader.readRaw(1387, 112, new Interval(3, 3), "Grid_Point_Mask");
373+
NCTestUtils.assertValueAt(25, 0, 1, array);
374+
NCTestUtils.assertValueAt(9, 1, 1, array);
375+
NCTestUtils.assertValueAt(0, 2, 1, array);
376+
} finally {
377+
reader.close();
378+
}
379+
}
380+
381+
@Test
382+
public void testReadRaw_3D_CDF3TA_outsideBottom() throws IOException, InvalidRangeException {
383+
final File file = getCDF3TAFile();
384+
385+
try {
386+
reader.open(file);
387+
388+
final Array array = reader.readRaw(849, 583, new Interval(3, 3), "Pixel_Radiometric_Accuracy_V_175");
389+
NCTestUtils.assertValueAt(-28288, 1, 0, array);
390+
NCTestUtils.assertValueAt(-26149, 1, 1, array);
391+
NCTestUtils.assertValueAt(-32768, 1, 2, array);
392+
NCTestUtils.assertValueAt(-28250, 2, 0, array);
393+
} finally {
394+
reader.close();
395+
}
396+
}
397+
398+
@Test
399+
public void testReadScaled_3D_CDF3TD() throws IOException, InvalidRangeException {
400+
final File file = getCDF3TDFile();
401+
402+
try {
403+
reader.open(file);
404+
405+
final Array array = reader.readScaled(673, 310, new Interval(3, 3), "Pixel_BT_Standard_Deviation_3_225");
406+
NCTestUtils.assertValueAt(4.222235786004212, 0, 1, array);
407+
NCTestUtils.assertValueAt(2.3056733909115863, 1, 1, array);
408+
NCTestUtils.assertValueAt(2.92062135685293, 2, 1, array);
409+
} finally {
410+
reader.close();
411+
}
412+
}
413+
414+
@Test
415+
public void testReadScaled_3D_CDF3TA_outsideLeft() throws IOException, InvalidRangeException {
416+
final File file = getCDF3TAFile();
417+
418+
try {
419+
reader.open(file);
420+
421+
final Array array = reader.readScaled(0, 225, new Interval(3, 3), "Incidence_Angle_275");
422+
NCTestUtils.assertValueAt(-0.0013733329264198346, 0, 1, array);
423+
NCTestUtils.assertValueAt(28.25907162694174, 1, 1, array);
424+
NCTestUtils.assertValueAt(29.65300454725791, 2, 1, array);
425+
} finally {
426+
reader.close();
427+
}
428+
}
429+
311430
private File getCDF3TAFile() throws IOException {
312431
final String testFilePath = TestUtil.assembleFileSystemPath(new String[]{"miras-smos-CDF3TA", "re07", "2016", "162", "SM_RE07_MIR_CDF3TA_20160610T000000_20160610T235959_330_001_7.tgz"}, false);
313432
return TestUtil.getTestDataFileAsserted(testFilePath);

0 commit comments

Comments
 (0)