Skip to content

Commit 0b60d29

Browse files
committed
added era-collection global meta-field
1 parent 9f60c95 commit 0b60d29

File tree

8 files changed

+120
-1
lines changed

8 files changed

+120
-1
lines changed

core/src/test/java/com/bc/fiduceo/NCTestUtils.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package com.bc.fiduceo;
2222

23+
import com.bc.fiduceo.reader.netcdf.NetCDFReader;
2324
import com.bc.fiduceo.util.NetCDFUtils;
2425
import ucar.ma2.Array;
2526
import ucar.ma2.DataType;
@@ -67,7 +68,7 @@ public static void assert2DVariable(String variableName, int x, int y, double ex
6768
assertEquals(expected, data.getDouble(0), 1e-8);
6869
}
6970

70-
public static void assertVariablePresentAnd1DValueLong(String variableName, final DataType dataType, String dimensions, int x, long expected, NetcdfFile netcdfFile) throws IOException, InvalidRangeException {
71+
public static void assertVariablePresentAnd1DValueLong(String variableName, final DataType dataType, String dimensions, int x, long expected, NetcdfFile netcdfFile) throws IOException {
7172
final Variable variable = assertVariablePresent(variableName, dataType, dimensions, netcdfFile);
7273
assert1DValueLong(x, expected, variable);
7374
}
@@ -156,6 +157,18 @@ public static void assertAttribute(Variable variable, String attributeName, Stri
156157
}
157158
}
158159

160+
public static void assertGlobalAttribute(NetcdfFile reader, String attributeName, String expected) {
161+
final Attribute attribute = reader.findGlobalAttribute(attributeName);
162+
assertNotNull(attribute);
163+
164+
final DataType dataType = attribute.getDataType();
165+
if (dataType == DataType.STRING) {
166+
assertEquals(expected, attribute.getStringValue());
167+
} else if (dataType == DataType.FLOAT) {
168+
assertEquals(Float.parseFloat(expected), attribute.getNumericValue().floatValue(), 1e-8);
169+
}
170+
}
171+
159172
public static Variable getVariable(String variableName, NetcdfFile netcdfFile, boolean escapeName) {
160173
final String escapedName;
161174
if (escapeName) {

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/Configuration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
class Configuration {
44

55
private String nwpAuxDir;
6+
private String era5Collection;
67

78
private SatelliteFieldsConfiguration satelliteFields;
89
private MatchupFieldsConfiguration matchupFields;
@@ -15,6 +16,14 @@ void setNWPAuxDir(String nwpAuxDir) {
1516
this.nwpAuxDir = nwpAuxDir;
1617
}
1718

19+
String getEra5Collection() {
20+
return era5Collection;
21+
}
22+
23+
void setEra5Collection(String era5Collection) {
24+
this.era5Collection = era5Collection;
25+
}
26+
1827
SatelliteFieldsConfiguration getSatelliteFields() {
1928
return satelliteFields;
2029
}

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/Era5PostProcessing.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.FiduceoConstants;
44
import com.bc.fiduceo.post.PostProcessing;
5+
import org.esa.snap.core.util.StringUtils;
56
import ucar.ma2.Array;
67
import ucar.ma2.Index;
78
import ucar.ma2.InvalidRangeException;
@@ -141,6 +142,11 @@ protected void prepare(NetcdfFile reader, NetcdfFileWriter writer) {
141142
throw new RuntimeException("Expected dimension not present in file: " + FiduceoConstants.MATCHUP_COUNT);
142143
}
143144

145+
// @todo 1 tb/tb add generic prepare for global meta
146+
// - ERA5 collection string
147+
148+
prepare(writer);
149+
144150
final SatelliteFieldsConfiguration satFieldsConfig = configuration.getSatelliteFields();
145151
if (satFieldsConfig != null) {
146152
satelliteFields = new SatelliteFields();
@@ -154,6 +160,32 @@ protected void prepare(NetcdfFile reader, NetcdfFileWriter writer) {
154160
}
155161
}
156162

163+
private void prepare(NetcdfFileWriter writer) {
164+
String collection = getEra5Collection(configuration);
165+
writer.addGlobalAttribute("era5-collection", collection);
166+
}
167+
168+
// package access for testing only tb 2021-01-12
169+
static String getEra5Collection(Configuration configuration) {
170+
String collection = configuration.getEra5Collection();
171+
if (StringUtils.isNotNullAndNotEmpty(collection)) {
172+
return collection;
173+
}
174+
175+
// we need to find the collection in the path-name
176+
final String nwpAuxDir = configuration.getNWPAuxDir();
177+
final String upperCaseAuxDir = nwpAuxDir.toUpperCase();
178+
collection = "UNKNOWN";
179+
if (upperCaseAuxDir.contains("ERA5T") || upperCaseAuxDir.contains("ERA-5T")) {
180+
collection = "ERA-5T";
181+
} else if (upperCaseAuxDir.contains("ERA51") || upperCaseAuxDir.contains("ERA-51")) {
182+
collection = "ERA-51";
183+
} else if (upperCaseAuxDir.contains("ERA5") || upperCaseAuxDir.contains("ERA-5")) {
184+
collection = "ERA-5";
185+
}
186+
return collection;
187+
}
188+
157189
@Override
158190
protected void compute(NetcdfFile reader, NetcdfFileWriter writer) throws IOException, InvalidRangeException {
159191
if (satelliteFields != null) {

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/Era5PostProcessingPlugin.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.bc.fiduceo.post.PostProcessing;
44
import com.bc.fiduceo.post.PostProcessingPlugin;
55
import com.bc.fiduceo.util.JDomUtils;
6+
import org.esa.snap.core.util.StringUtils;
67
import org.jdom.Attribute;
78
import org.jdom.Element;
89

@@ -14,6 +15,14 @@ static Configuration createConfiguration(Element rootElement) {
1415
final String nwpAuxDirValue = JDomUtils.getMandatoryChildTextTrim(rootElement, "nwp-aux-dir");
1516
configuration.setNWPAuxDir(nwpAuxDirValue);
1617

18+
final Element era5CollectionElement = rootElement.getChild("era5-collection");
19+
if (era5CollectionElement != null) {
20+
final String value = era5CollectionElement.getValue();
21+
if (StringUtils.isNotNullAndNotEmpty(value)) {
22+
configuration.setEra5Collection(value);
23+
}
24+
}
25+
1726
parseSatelliteFields(rootElement, configuration);
1827
parseMatchupFields(rootElement, configuration);
1928

post-processing-tool/src/test/java/com/bc/fiduceo/post/PostProcessingToolIntegrationTest_Era5.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public void testAddEra5Variables() throws IOException, InvalidRangeException {
7575
assertTrue(targetFile.isFile());
7676

7777
try (NetcdfFile mmd = NetcdfFiles.open(targetFile.getAbsolutePath())) {
78+
NCTestUtils.assertGlobalAttribute(mmd, "era5-collection", "ERA-5");
79+
7880
Variable variable = NCTestUtils.getVariable("amsre\\.Geostationary_Reflection_Latitude", mmd, false);
7981
NCTestUtils.assert3DValueDouble(0, 0, 0, 4105, variable);
8082
NCTestUtils.assert3DValueDouble(1, 0, 0, 4087, variable);

post-processing-tool/src/test/java/com/bc/fiduceo/post/plugin/era5/ConfigurationTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ public void testSetGetNWPAuxDir() {
1616
assertEquals(nwpAuxDir, config.getNWPAuxDir());
1717
}
1818

19+
@Test
20+
public void testSetGetEra5Collection() {
21+
final String collection = "the-most-recent";
22+
23+
final Configuration config = new Configuration();
24+
config.setEra5Collection(collection);
25+
assertEquals(collection, config.getEra5Collection());
26+
}
27+
1928
@Test
2029
public void testSetGetSatelliteFields() {
2130
final Configuration config = new Configuration();

post-processing-tool/src/test/java/com/bc/fiduceo/post/plugin/era5/Era5PostProcessingPluginTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public void testCreateConfiguration_nwpAuxDir() throws JDOMException, IOExceptio
5353
public void testCreateConfiguration_satelliteFields() throws JDOMException, IOException {
5454
final String XML = "<era5>" +
5555
" <nwp-aux-dir>/where/the/data/is</nwp-aux-dir>" +
56+
" <era5-collection>The-One</era5-collection>" +
5657
" <satellite-fields>" +
5758
" <x_dim name='left' length='5' />" +
5859
" <y_dim name='right' length='7' />" +
@@ -80,6 +81,8 @@ public void testCreateConfiguration_satelliteFields() throws JDOMException, IOEx
8081
final Element rootElement = TestUtil.createDomElement(XML);
8182

8283
final Configuration configuration = Era5PostProcessingPlugin.createConfiguration(rootElement);
84+
assertEquals("The-One", configuration.getEra5Collection());
85+
8386
final SatelliteFieldsConfiguration satConfig = configuration.getSatelliteFields();
8487
assertNotNull(satConfig);
8588

post-processing-tool/src/test/java/com/bc/fiduceo/post/plugin/era5/Era5PostProcessingTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,46 @@ public void testGetInterpolationContext_singlePixel() {
6666
assertEquals(2, era5Region.width);
6767
assertEquals(2, era5Region.height);
6868
}
69+
70+
@Test
71+
public void testgetEra5Collection_fromConfig() {
72+
final Configuration configuration = new Configuration();
73+
configuration.setNWPAuxDir("/yamas/strange/path");
74+
configuration.setEra5Collection("Hamasuki");
75+
76+
final String era5Collection = Era5PostProcessing.getEra5Collection(configuration);
77+
assertEquals("Hamasuki", era5Collection);
78+
}
79+
80+
@Test
81+
public void testgetEra5Collection_fromPath_unknown() {
82+
final Configuration configuration = new Configuration();
83+
configuration.setNWPAuxDir("/yamas/strange/path");
84+
85+
final String era5Collection = Era5PostProcessing.getEra5Collection(configuration);
86+
assertEquals("UNKNOWN", era5Collection);
87+
}
88+
89+
@Test
90+
public void testgetEra5Collection_fromPath() {
91+
final Configuration configuration = new Configuration();
92+
93+
configuration.setNWPAuxDir("/data/era5");
94+
assertEquals("ERA-5", Era5PostProcessing.getEra5Collection(configuration));
95+
96+
configuration.setNWPAuxDir("/data/era-5");
97+
assertEquals("ERA-5", Era5PostProcessing.getEra5Collection(configuration));
98+
99+
configuration.setNWPAuxDir("/data/ERA51");
100+
assertEquals("ERA-51", Era5PostProcessing.getEra5Collection(configuration));
101+
102+
configuration.setNWPAuxDir("/data/era-51");
103+
assertEquals("ERA-51", Era5PostProcessing.getEra5Collection(configuration));
104+
105+
configuration.setNWPAuxDir("/data/era5t");
106+
assertEquals("ERA-5T", Era5PostProcessing.getEra5Collection(configuration));
107+
108+
configuration.setNWPAuxDir("/data/ERA-5T");
109+
assertEquals("ERA-5T", Era5PostProcessing.getEra5Collection(configuration));
110+
}
69111
}

0 commit comments

Comments
 (0)