Skip to content

Commit 2ec2496

Browse files
committed
intermediate sirds reader
1 parent d76d133 commit 2ec2496

File tree

6 files changed

+250
-48
lines changed

6 files changed

+250
-48
lines changed

core/src/main/java/com/bc/fiduceo/reader/insitu/sst_cci/UniqueIdVariable.java renamed to core/src/main/java/com/bc/fiduceo/reader/insitu/UniqueIdVariable.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*
1919
*/
2020

21-
package com.bc.fiduceo.reader.insitu.sst_cci;
21+
package com.bc.fiduceo.reader.insitu;
2222

2323
import com.bc.fiduceo.util.VariablePrototype;
2424
import ucar.ma2.DataType;
@@ -30,18 +30,24 @@
3030
import static com.bc.fiduceo.util.NetCDFUtils.CF_FILL_VALUE_NAME;
3131
import static com.bc.fiduceo.util.NetCDFUtils.CF_LONG_NAME;
3232

33-
class UniqueIdVariable extends VariablePrototype {
33+
public class UniqueIdVariable extends VariablePrototype {
3434

35-
private static final String VARIABLE_NAME = "insitu.id";
35+
public static final long FILL_VALUE = -32768L;
36+
37+
private final String variableName;
38+
39+
public UniqueIdVariable(String variableName) {
40+
this.variableName = variableName;
41+
}
3642

3743
@Override
3844
public String getFullName() {
39-
return VARIABLE_NAME;
45+
return variableName;
4046
}
4147

4248
@Override
4349
public String getShortName() {
44-
return VARIABLE_NAME;
50+
return variableName;
4551
}
4652

4753
@Override
@@ -52,7 +58,7 @@ public DataType getDataType() {
5258
@Override
5359
public List<Attribute> getAttributes() {
5460
final ArrayList<Attribute> attributes = new ArrayList<>();
55-
attributes.add(new Attribute(CF_FILL_VALUE_NAME, -32768L));
61+
attributes.add(new Attribute(CF_FILL_VALUE_NAME, FILL_VALUE));
5662
attributes.add(new Attribute(CF_LONG_NAME, "unique matchup ID"));
5763
attributes.add(new Attribute("comment", "this unique id is generated by combining YEAR, MONTH and mohc_id"));
5864
return attributes;

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

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,28 @@
66
import com.bc.fiduceo.geometry.Polygon;
77
import com.bc.fiduceo.location.PixelLocator;
88
import com.bc.fiduceo.reader.AcquisitionInfo;
9+
import com.bc.fiduceo.reader.insitu.UniqueIdVariable;
910
import com.bc.fiduceo.reader.netcdf.NetCDFReader;
1011
import com.bc.fiduceo.reader.time.TimeLocator;
1112
import com.bc.fiduceo.util.TimeUtils;
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

1719
import java.io.IOException;
20+
import java.util.ArrayList;
1821
import java.util.Calendar;
1922
import java.util.List;
2023

2124
public class SirdsInsituReader extends NetCDFReader {
2225

2326
private static final String REGEX = "SSTCCI2_refdata_[a-z]+(_[a-z]+)?_\\d{6}.nc";
27+
private static final String UNIQUE_ID = "unique_id";
28+
2429
private int[] timeMinMax;
30+
private Array uniqueIdData;
2531

2632
@Override
2733
public AcquisitionInfo read() throws IOException {
@@ -91,12 +97,36 @@ public int[] extractYearMonthDayFromFilename(String fileName) {
9197

9298
@Override
9399
public Array readRaw(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
94-
throw new RuntimeException("not implemented");
100+
final Array sourceArray;
101+
final Number fillValue;
102+
if (variableName.equals(UNIQUE_ID)) {
103+
ensureUniqueIdData();
104+
sourceArray = uniqueIdData;
105+
fillValue = UniqueIdVariable.FILL_VALUE;
106+
} else {
107+
sourceArray = arrayCache.get(variableName);
108+
fillValue = getFillValue(variableName);
109+
}
110+
111+
final int windowWidth = interval.getX();
112+
final int windowHeight = interval.getY();
113+
final int windowCenterX = windowWidth / 2;
114+
final int windowCenterY = windowHeight / 2;
115+
116+
final int[] shape = {windowWidth, windowHeight};
117+
final Array windowArray = Array.factory(sourceArray.getDataType(), shape);
118+
for (int y = 0; y < windowHeight; y++) {
119+
for (int x = 0; x < windowWidth; x++) {
120+
windowArray.setObject(windowWidth * y + x, fillValue);
121+
}
122+
}
123+
windowArray.setObject(windowWidth * windowCenterY + windowCenterX, sourceArray.getObject(centerY));
124+
return windowArray;
95125
}
96126

97127
@Override
98128
public Array readScaled(int centerX, int centerY, Interval interval, String variableName) throws IOException, InvalidRangeException {
99-
throw new RuntimeException("not implemented");
129+
return readRaw(centerX, centerY, interval, variableName);
100130
}
101131

102132
@Override
@@ -106,7 +136,27 @@ public ArrayInt.D2 readAcquisitionTime(int x, int y, Interval interval) throws I
106136

107137
@Override
108138
public List<Variable> getVariables() throws InvalidRangeException, IOException {
109-
throw new RuntimeException("not implemented");
139+
final List<Variable> fileVariables = netcdfFile.getVariables();
140+
final List<Variable> listVariables = new ArrayList<>();
141+
for (final Variable variable : fileVariables) {
142+
final String variableName = variable.getShortName();
143+
if ("DAY".equals(variableName) ||
144+
"HOUR".equals(variableName) ||
145+
"MINUTE".equals(variableName) ||
146+
"MONTH".equals(variableName) ||
147+
"OB_ID".equals(variableName) ||
148+
"PLAT_ID".equals(variableName) ||
149+
"SECOND".equals(variableName) ||
150+
"YEAR".equals(variableName)) {
151+
continue;
152+
} else {
153+
listVariables.add(variable);
154+
}
155+
}
156+
157+
listVariables.add(new UniqueIdVariable(UNIQUE_ID));
158+
159+
return listVariables;
110160
}
111161

112162
@Override
@@ -143,6 +193,34 @@ static int[] extractMinMax(int[] timeStamps) {
143193
@Override
144194
public void close() throws IOException {
145195
timeMinMax = null;
196+
uniqueIdData = null;
146197
super.close();
147198
}
199+
200+
private void ensureUniqueIdData() throws IOException {
201+
if (uniqueIdData != null) {
202+
return;
203+
}
204+
205+
final Array year = arrayCache.get("YEAR");
206+
final Array month = arrayCache.get("MONTH");
207+
final Array ob_id = arrayCache.get("OB_ID");
208+
209+
final int[] shape = year.getShape();
210+
uniqueIdData = Array.factory(DataType.LONG, shape);
211+
final int fillValue = getFillValue("OB_ID").intValue();
212+
for (int i = 0; i < shape[0]; i++) {
213+
final int id = ob_id.getInt(i);
214+
if (id == fillValue) {
215+
uniqueIdData.setLong(i, UniqueIdVariable.FILL_VALUE);
216+
continue;
217+
}
218+
219+
final int yearVal = year.getInt(i);
220+
final int monthVal = month.getInt(i);
221+
final int year_month = monthVal + yearVal * 100;
222+
final long uniqueId = (long) id + (long) year_month * 10000000000L;
223+
uniqueIdData.setLong(i, uniqueId);
224+
}
225+
}
148226
}

core/src/main/java/com/bc/fiduceo/reader/insitu/sst_cci/SSTInsituReader.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
import com.bc.fiduceo.geometry.Polygon;
2626
import com.bc.fiduceo.location.PixelLocator;
2727
import com.bc.fiduceo.reader.AcquisitionInfo;
28-
import com.bc.fiduceo.reader.time.TimeLocator;
28+
import com.bc.fiduceo.reader.insitu.UniqueIdVariable;
2929
import com.bc.fiduceo.reader.netcdf.NetCDFReader;
30+
import com.bc.fiduceo.reader.time.TimeLocator;
3031
import com.bc.fiduceo.util.NetCDFUtils;
3132
import com.bc.fiduceo.util.TimeUtils;
3233
import ucar.ma2.Array;
@@ -51,7 +52,6 @@ public class SSTInsituReader extends NetCDFReader {
5152
private final Map<String, Number> fillValueMap = new HashMap<>();
5253
private final Map<String, Array> arrayMap = new HashMap<>();
5354

54-
private String insituType;
5555
private List<Variable> variables;
5656

5757
@Override
@@ -67,9 +67,6 @@ public void open(File file) throws IOException {
6767
}
6868

6969
addIdVariableAndData();
70-
71-
// @todo extract method, parse from filename if not present tb 2017-05-29
72-
insituType = netcdfFile.findGlobalAttribute("dataset").getStringValue();
7370
}
7471

7572
@Override
@@ -79,7 +76,6 @@ public void close() throws IOException {
7976
netcdfFile = null;
8077
}
8178
variables = null;
82-
insituType = null;
8379

8480
arrayMap.clear();
8581
fillValueMap.clear();
@@ -187,13 +183,6 @@ public Dimension getProductSize() {
187183
return new Dimension("product_size", 1, getNumObservations());
188184
}
189185

190-
/**
191-
* @return the insitu type as a String
192-
*/
193-
String getInsituType() {
194-
return insituType;
195-
}
196-
197186
/**
198187
* Returns the time in seconds since 1978-01-01
199188
*
@@ -228,7 +217,7 @@ private void extractSensingTimes(AcquisitionInfo info) {
228217
}
229218

230219
private void addIdVariableAndData() {
231-
final UniqueIdVariable uniqueIdVariable = new UniqueIdVariable();
220+
final UniqueIdVariable uniqueIdVariable = new UniqueIdVariable("insitu.id");
232221
variables.add(uniqueIdVariable);
233222

234223
final Number fillValue = fillValueMap.get("insitu.mohc_id");

core/src/test/java/com/bc/fiduceo/reader/insitu/sst_cci/UniqueIdVariableTest.java renamed to core/src/test/java/com/bc/fiduceo/reader/insitu/UniqueIdVariableTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*
1919
*/
2020

21-
package com.bc.fiduceo.reader.insitu.sst_cci;
21+
package com.bc.fiduceo.reader.insitu;
2222

2323
import org.junit.Before;
2424
import org.junit.Test;
@@ -37,7 +37,7 @@ public class UniqueIdVariableTest {
3737

3838
@Before
3939
public void setUp() {
40-
variable = new UniqueIdVariable();
40+
variable = new UniqueIdVariable("insitu.id");
4141
}
4242

4343
@Test

0 commit comments

Comments
 (0)