Skip to content

Commit a0fb820

Browse files
committed
AMSUA/MHS intermediate
1 parent 1a337fa commit a0fb820

File tree

8 files changed

+109
-36
lines changed

8 files changed

+109
-36
lines changed

core/src/main/java/com/bc/fiduceo/reader/amsu_mhs/AMSUA_L1B_Reader.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
import com.bc.fiduceo.geometry.Polygon;
66
import com.bc.fiduceo.location.PixelGeoCodingPixelLocator;
77
import com.bc.fiduceo.location.PixelLocator;
8-
import com.bc.fiduceo.reader.AcquisitionInfo;
9-
import com.bc.fiduceo.reader.Geometries;
10-
import com.bc.fiduceo.reader.ReaderContext;
11-
import com.bc.fiduceo.reader.ReaderUtils;
12-
import com.bc.fiduceo.reader.amsu_mhs.nat.Abstract_L1B_NatReader;
13-
import com.bc.fiduceo.reader.amsu_mhs.nat.EPS_Constants;
14-
import com.bc.fiduceo.reader.amsu_mhs.nat.GENERIC_RECORD_HEADER;
8+
import com.bc.fiduceo.reader.*;
9+
import com.bc.fiduceo.reader.amsr.AmsrUtils;
10+
import com.bc.fiduceo.reader.amsu_mhs.nat.*;
1511
import com.bc.fiduceo.reader.amsu_mhs.nat.record_types.MDR;
1612
import com.bc.fiduceo.reader.amsu_mhs.nat.record_types.MPHR;
1713
import com.bc.fiduceo.reader.time.TimeLocator;
@@ -101,14 +97,13 @@ public TimeLocator getTimeLocator() throws IOException {
10197
return new TimeLocator_StartStopDate(sensingStart, sensingStop, numScanLines);
10298
}
10399

104-
@Override
105-
public int[] extractYearMonthDayFromFilename(String fileName) {
106-
throw new RuntimeException("not implemented");
107-
}
108-
109100
@Override
110101
public Array readRaw(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
111-
throw new RuntimeException("not implemented");
102+
final Array rawData = cache.getRaw(variableName);
103+
final VariableDefinition variableDef = registry.getVariableDef(variableName);
104+
final Number fillValue = EpsReaderUtils.getFillValue(variableDef.getData_type());
105+
final int numScanLines = cache.getMdrs().size();
106+
return RawDataReader.read(centerX, centerY, interval, fillValue, rawData, new Dimension("size", AMSUA_FOV_COUNT, numScanLines));
112107
}
113108

114109
@Override

core/src/main/java/com/bc/fiduceo/reader/amsu_mhs/MHS_L1B_Reader.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,6 @@ public TimeLocator getTimeLocator() throws IOException {
8383
return new TimeLocator_StartStopDate(sensingStart, sensingStop, numScanLines);
8484
}
8585

86-
@Override
87-
public int[] extractYearMonthDayFromFilename(String fileName) {
88-
throw new RuntimeException("not implemented");
89-
}
90-
9186
@Override
9287
public Array readRaw(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
9388
// todo 28-08-2025 BL: evaluate functionality and test edge cases

core/src/main/java/com/bc/fiduceo/reader/amsu_mhs/nat/Abstract_L1B_NatReader.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) throws IOExce
4949
return getPixelLocator();
5050
}
5151

52+
@Override
53+
public int[] extractYearMonthDayFromFilename(String fileName) {
54+
final String[] strings = fileName.split("_");
55+
final String dateTimePart = strings[4];
56+
57+
final int[] ymd = new int[3];
58+
ymd[0] = Integer.parseInt(dateTimePart.substring(0, 4));
59+
ymd[1] = Integer.parseInt(dateTimePart.substring(4, 6));
60+
ymd[2] = Integer.parseInt(dateTimePart.substring(6, 8));
61+
return ymd;
62+
}
63+
5264
protected static void setSensingDates(AcquisitionInfo acquisitionInfo, MPHR recordMPHR) throws IOException {
5365
final Date sensingStart = recordMPHR.getDate(SENSING_START_KEY);
5466
acquisitionInfo.setSensingStart(sensingStart);

core/src/main/java/com/bc/fiduceo/reader/amsu_mhs/nat/EpsReaderUtils.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,56 +10,56 @@
1010
public class EpsReaderUtils {
1111

1212
/**
13-
reads eps data types "byte", "boolean", "enumerated" from buffer
13+
* reads eps data types "byte", "boolean", "enumerated" from buffer
1414
*/
1515
public static byte readInt8(ByteBuffer buffer, int offset) {
1616
return buffer.get(offset);
1717
}
1818

1919
/**
20-
reads eps data types "u-byte" from buffer
20+
* reads eps data types "u-byte" from buffer
2121
*/
2222
public static short readUInt8(ByteBuffer buffer, int offset) {
2323
return (short) Byte.toUnsignedInt(buffer.get(offset));
2424
}
2525

2626
/**
27-
reads eps data types "integer2" from buffer
27+
* reads eps data types "integer2" from buffer
2828
*/
2929
public static short readInt16(ByteBuffer buffer, int offset) {
3030
return buffer.getShort(offset);
3131
}
3232

3333
/**
34-
reads eps data types "u-integer2" from buffer
34+
* reads eps data types "u-integer2" from buffer
3535
*/
3636
public static int readUInt16(ByteBuffer buffer, int offset) {
3737
return Short.toUnsignedInt(buffer.getShort(offset));
3838
}
3939

4040
/**
41-
reads eps data types "integer-4" from buffer
41+
* reads eps data types "integer-4" from buffer
4242
*/
4343
public static int readInt32(ByteBuffer buffer, int offset) {
4444
return buffer.getInt(offset);
4545
}
4646

4747
/**
48-
reads eps data types "u-integer4" from buffer
48+
* reads eps data types "u-integer4" from buffer
4949
*/
5050
public static long readUInt32(ByteBuffer buffer, int offset) {
5151
return Integer.toUnsignedLong(buffer.getInt(offset));
5252
}
5353

5454
/**
55-
reads eps data types "integer8" from buffer
55+
* reads eps data types "integer8" from buffer
5656
*/
5757
public static long readInt64(ByteBuffer buffer, int offset) {
5858
return buffer.getLong(offset);
5959
}
6060

6161
/**
62-
reads eps data types "u-integer8" from buffer
62+
* reads eps data types "u-integer8" from buffer
6363
*/
6464
public static BigInteger readUInt64(ByteBuffer buffer, int offset) {
6565
byte[] bytes = new byte[8];
@@ -139,4 +139,27 @@ public static Array initializeArray(int dataType, int numScanLines, int numFOVs)
139139
}
140140
return array;
141141
}
142+
143+
public static Number getFillValue(String dataType) {
144+
switch (dataType) {
145+
case "byte":
146+
return Byte.MIN_VALUE;
147+
case "u-byte":
148+
return 255;
149+
case "integer2":
150+
return Short.MIN_VALUE;
151+
case "u-integer2":
152+
return 65535;
153+
case "integer4":
154+
return Integer.MIN_VALUE;
155+
case "u-integer4":
156+
return 4294967295L;
157+
case "integer8":
158+
return Long.MIN_VALUE;
159+
case "u-integer8":
160+
return Long.MAX_VALUE; // @todo 2 tb/* check how we can handle uint64 in Java anyways 2025-09-16
161+
default:
162+
throw new IllegalArgumentException("Unsupported data type: " + dataType);
163+
}
164+
}
142165
}

core/src/test/java/com/bc/fiduceo/reader/amsu_mhs/AMSUA_L1B_ReaderTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static org.junit.Assert.*;
1111
import static org.junit.Assert.assertFalse;
1212

13+
@SuppressWarnings("resource")
1314
public class AMSUA_L1B_ReaderTest {
1415

1516
@Test
@@ -84,4 +85,11 @@ public void testGetLatitudeVariableName() {
8485

8586
assertEquals("latitude", reader.getLatitudeVariableName());
8687
}
88+
89+
@Test
90+
public void testExtractYearMonthDayFromFilename() {
91+
final AMSUA_L1B_Reader reader = new AMSUA_L1B_Reader(new ReaderContext());
92+
93+
assertArrayEquals(new int[]{2016, 1, 1}, reader.extractYearMonthDayFromFilename("AMSA_xxx_1B_M01_20160101234924Z_20160102013124Z_N_O_20160102003323Z.nat"));
94+
}
8795
}

core/src/test/java/com/bc/fiduceo/reader/amsu_mhs/AMSUA_L1B_Reader_IO_Test.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.bc.fiduceo.IOTestRunner;
44
import com.bc.fiduceo.TestUtil;
5+
import com.bc.fiduceo.core.Interval;
56
import com.bc.fiduceo.core.NodeType;
67
import com.bc.fiduceo.geometry.*;
78
import com.bc.fiduceo.location.PixelLocator;
@@ -11,6 +12,9 @@
1112
import org.junit.Before;
1213
import org.junit.Test;
1314
import org.junit.runner.RunWith;
15+
import ucar.ma2.Array;
16+
import ucar.ma2.Index;
17+
import ucar.ma2.InvalidRangeException;
1418

1519
import java.awt.geom.Point2D;
1620
import java.io.File;
@@ -162,6 +166,34 @@ public void testGetSubScenePixelLocator() throws IOException {
162166
}
163167
}
164168

169+
@Test
170+
public void testReadRaw() throws IOException, InvalidRangeException {
171+
final File file = createAmsuaMetopAPath("AMSA_xxx_1B_M01_20160101234924Z_20160102013124Z_N_O_20160102003323Z.nat");
172+
try {
173+
reader.open(file);
174+
175+
Array rawData = reader.readRaw(1, 1, new Interval(3, 3), "SCENE_RADIANCE_01");
176+
Index idx = rawData.getIndex();
177+
idx.set(0, 0);
178+
assertEquals(11880, rawData.getInt(idx));
179+
idx.set(0, 1);
180+
assertEquals(12634, rawData.getInt(idx));
181+
idx.set(0, 2);
182+
assertEquals(12883, rawData.getInt(idx));
183+
184+
rawData = reader.readRaw(2, 2, new Interval(3, 3), "solar_zenith_angle");
185+
idx = rawData.getIndex();
186+
idx.set(1, 0);
187+
assertEquals(8883, rawData.getInt(idx));
188+
idx.set(1, 1);
189+
assertEquals(8947, rawData.getInt(idx));
190+
idx.set(1, 2);
191+
assertEquals(9002, rawData.getInt(idx));
192+
} finally {
193+
reader.close();
194+
}
195+
}
196+
165197
private File createAmsuaMetopAPath(String fileName) throws IOException {
166198
final String testFilePath = TestUtil.assembleFileSystemPath(new String[]{"amsua-ma", "v8A", "2016", "01", "01", fileName}, false);
167199
return TestUtil.getTestDataFileAsserted(testFilePath);

core/src/test/java/com/bc/fiduceo/reader/amsu_mhs/MHS_L1B_ReaderTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ public void testGetRegEx() {
3636
matcher = pattern.matcher("MHSx_xxx_1B_M04_20250820060350Z_20250820074550Z_N_O_20250820074043Z.nat");
3737
assertFalse(matcher.matches());
3838
}
39+
40+
@Test
41+
public void testExtractYearMonthDayFromFilename() {
42+
assertArrayEquals(new int[]{2025, 8, 20}, reader.extractYearMonthDayFromFilename("MHSx_xxx_1B_M03_20250820060350Z_20250820074550Z_N_O_20250820074043Z.nat"));
43+
}
3944
}

core/src/test/java/com/bc/fiduceo/reader/amsu_mhs/nat/EpsReaderUtilsTest.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.bc.fiduceo.reader.amsu_mhs.nat;
22

3+
import com.sun.jna.platform.win32.WinDef;
34
import org.esa.snap.core.datamodel.ProductData;
45
import org.junit.Test;
56
import ucar.ma2.*;
@@ -128,16 +129,6 @@ public void test_scale_factorIsOne_returnsSameArray() {
128129
assertSame(input, result);
129130
}
130131

131-
132-
133-
134-
135-
136-
137-
138-
139-
140-
141132
@Test
142133
public void testInitializeArray_int8() {
143134
int numScanLines = 4;
@@ -218,4 +209,16 @@ public void testInitializeArray_default() {
218209
assertTrue(array instanceof ArrayDouble.D2);
219210
assertArrayEquals(new int[]{numScanLines, numFOVs}, array.getShape());
220211
}
212+
213+
@Test
214+
public void testGetFillValue() {
215+
assertEquals(Byte.MIN_VALUE, EpsReaderUtils.getFillValue("byte"));
216+
assertEquals(255, EpsReaderUtils.getFillValue("u-byte"));
217+
assertEquals(Short.MIN_VALUE, EpsReaderUtils.getFillValue("integer2"));
218+
assertEquals(65535, EpsReaderUtils.getFillValue("u-integer2"));
219+
assertEquals(Integer.MIN_VALUE, EpsReaderUtils.getFillValue("integer4"));
220+
assertEquals(4294967295L, EpsReaderUtils.getFillValue("u-integer4"));
221+
assertEquals(Long.MIN_VALUE, EpsReaderUtils.getFillValue("integer8"));
222+
assertEquals(Long.MAX_VALUE, EpsReaderUtils.getFillValue("u-integer8"));
223+
}
221224
}

0 commit comments

Comments
 (0)