Skip to content

Commit 9cf62df

Browse files
committed
refactoring, added tests, corrected time-string calculation
1 parent e3ad0f8 commit 9cf62df

File tree

5 files changed

+179
-23
lines changed

5 files changed

+179
-23
lines changed

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.bc.fiduceo.util.TimeUtils;
44

55
import java.io.File;
6-
import java.io.IOException;
76
import java.text.DecimalFormat;
87
import java.util.Calendar;
98

@@ -38,42 +37,46 @@ static String mapVariable(String variable) {
3837
}
3938
}
4039

41-
static String getTimeString(String collection, Calendar utcCalendar) throws IOException {
42-
final int year = utcCalendar.get(Calendar.YEAR);
40+
static String getTimeString(String collection, Calendar utcCalendar) {
41+
final Calendar clonedCalendar = (Calendar) utcCalendar.clone();
4342

44-
final int month = utcCalendar.get(Calendar.MONTH) + 1;
43+
int hour = clonedCalendar.get(Calendar.HOUR_OF_DAY);
44+
if (hour < 6 && collection.startsWith("fc_")) {
45+
clonedCalendar.add(Calendar.DATE, -1);
46+
}
47+
48+
final int year = clonedCalendar.get(Calendar.YEAR);
49+
50+
final int month = clonedCalendar.get(Calendar.MONTH) + 1;
4551
final String monthString = twoDigitsFormat.format(month);
4652

47-
final int day = utcCalendar.get(Calendar.DAY_OF_MONTH);
53+
final int day = clonedCalendar.get(Calendar.DAY_OF_MONTH);
4854
final String dayString = twoDigitsFormat.format(day);
4955

50-
int hour = utcCalendar.get(Calendar.HOUR_OF_DAY);
51-
5256
if (collection.startsWith("an_")) {
5357
final String hourString = twoDigitsFormat.format(hour);
5458
return year + monthString + dayString + hourString + "00";
5559
} else if (collection.startsWith("fc_")) {
5660
int forecastTimeStep;
5761
if (hour <= 6) {
58-
utcCalendar.add(Calendar.HOUR_OF_DAY, -1);
5962
forecastTimeStep = 6 + hour;
6063
hour = 18;
61-
} else if(hour <= 18) {
64+
} else if (hour <= 18) {
6265
forecastTimeStep = hour - 6;
6366
hour = 6;
6467
} else {
6568
forecastTimeStep = hour - 18;
6669
hour = 18;
6770
}
68-
final String hourString = twoDigitsFormat.format(hour);
6971

72+
final String hourString = twoDigitsFormat.format(hour);
7073
return year + monthString + dayString + hourString + threeDigitsFormat.format(forecastTimeStep);
7174
} else {
72-
throw new IOException("Unknown era5 collection: " + collection);
75+
throw new IllegalArgumentException("Unknown era5 collection: " + collection);
7376
}
7477
}
7578

76-
String get(String variableType, int timeStamp) throws IOException {
79+
String get(String variableType, int timeStamp) {
7780
final Calendar utcCalendar = TimeUtils.getUTCCalendar();
7881
utcCalendar.setTimeInMillis(timeStamp * 1000L);
7982

@@ -95,7 +98,7 @@ String get(String variableType, int timeStamp) throws IOException {
9598
final String dayString = twoDigitsFormat.format(day);
9699

97100
return rootPath + File.separator + collection + File.separator +
98-
year + File.separator+ monthString + File.separator + dayString + File.separator +
101+
year + File.separator + monthString + File.separator + dayString + File.separator +
99102
fileName;
100103
}
101104
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
200200
} else {
201201
throw new IllegalStateException("Unexpected variable rank: " + rank + " " + variableKey);
202202
}
203-
203+
204204
final TemplateVariable templateVariable = variables.get(variableKey);
205205
final Variable targetVariable = writer.findVariable(templateVariable.getName());
206206
writer.write(targetVariable, targetArray);
@@ -307,7 +307,8 @@ private void addAttributes(TemplateVariable template, Variable variable) {
307307
variable.addAttribute(new Attribute("_FillValue", template.getFillValue()));
308308
}
309309

310-
private List<Dimension> getDimensions(TemplateVariable template) {
310+
// package access for testing purpose only tb 2020-12-02
311+
List<Dimension> getDimensions(TemplateVariable template) {
311312
List<Dimension> dimensions;
312313
if (template.is3d()) {
313314
dimensions = dimension3d;
@@ -317,14 +318,14 @@ private List<Dimension> getDimensions(TemplateVariable template) {
317318
return dimensions;
318319
}
319320

320-
// @todo 2 tb/tb write tests for this pair of methods 2020-11-17
321-
private void setDimensions(SatelliteFieldsConfiguration satFieldsConfig, NetcdfFileWriter writer, NetcdfFile reader) {
321+
// package access for testing purpose only tb 2020-12-02
322+
void setDimensions(SatelliteFieldsConfiguration satFieldsConfig, NetcdfFileWriter writer, NetcdfFile reader) {
322323
satFieldsConfig.verify();
323324
final Dimension xDim = writer.addDimension(satFieldsConfig.get_x_dim_name(), satFieldsConfig.get_x_dim());
324325
final Dimension yDim = writer.addDimension(satFieldsConfig.get_y_dim_name(), satFieldsConfig.get_y_dim());
325326

326327
int z_dim = satFieldsConfig.get_z_dim();
327-
if (z_dim < 1) {
328+
if (z_dim < 1 || z_dim > 137) {
328329
z_dim = 137; // the we take all levels tb 2020-11-16
329330
}
330331
final Dimension zDim = writer.addDimension(satFieldsConfig.get_z_dim_name(), z_dim);

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

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.bc.fiduceo.post.plugin.era5;
22

3+
import com.bc.fiduceo.util.TimeUtils;
4+
import org.junit.Ignore;
35
import org.junit.Test;
46

57
import java.io.File;
68
import java.io.IOException;
9+
import java.util.Calendar;
710

811
import static junit.framework.TestCase.assertEquals;
12+
import static org.junit.Assert.fail;
913

1014
public class Era5ArchiveTest {
1115

@@ -33,8 +37,6 @@ public void testConstructAndGet() throws IOException {
3337

3438
expected = assemblePath("archive", "era5", "fc_sfc", "2008", "06", "02", "ecmwf-era5_oper_fc_sfc_2008060206004.mslhf.nc");
3539
assertEquals(expected, era5Archive.get("fc_sfc_mslhf", 1212400800));
36-
37-
3840
}
3941

4042
@Test
@@ -52,12 +54,55 @@ public void testMapVariable() {
5254
assertEquals("msl", Era5Archive.mapVariable("msl"));
5355
}
5456

57+
@Test
58+
public void testGetTimeString_an(){
59+
final Calendar utcCalendar = TimeUtils.getUTCCalendar();
60+
utcCalendar.setTimeInMillis(1212500800000L);
61+
62+
final String o3Time = Era5Archive.getTimeString("an_ml_o3", utcCalendar);
63+
assertEquals("200806031300", o3Time);
64+
65+
final String mslTime = Era5Archive.getTimeString("an_sfc_msl", utcCalendar);
66+
assertEquals("200806031300", mslTime);
67+
}
68+
69+
@Test
70+
public void testGetTimeString_fc(){
71+
final Calendar utcCalendar = TimeUtils.getUTCCalendar();
72+
utcCalendar.setTimeInMillis(1212600800000L);
73+
utcCalendar.set(Calendar.HOUR_OF_DAY, 3);
74+
75+
String metssTime = Era5Archive.getTimeString("fc_sfc_metss", utcCalendar);
76+
assertEquals("2008060318009", metssTime);
77+
78+
utcCalendar.setTimeInMillis(1212600800000L);
79+
utcCalendar.set(Calendar.HOUR_OF_DAY, 11);
80+
metssTime = Era5Archive.getTimeString("fc_sfc_metss", utcCalendar);
81+
assertEquals("2008060406005", metssTime);
82+
83+
utcCalendar.setTimeInMillis(1212600800000L);
84+
utcCalendar.set(Calendar.HOUR_OF_DAY, 21);
85+
metssTime = Era5Archive.getTimeString("fc_sfc_metss", utcCalendar);
86+
assertEquals("2008060418003", metssTime);
87+
}
88+
89+
@Test
90+
public void testGetTimeString_invalidCollection(){
91+
final Calendar utcCalendar = TimeUtils.getUTCCalendar();
92+
93+
try {
94+
Era5Archive.getTimeString("heffalump", utcCalendar);
95+
fail("IllegalArgumentException expected");
96+
} catch (IllegalArgumentException expected) {
97+
}
98+
}
99+
55100
private String assemblePath(String... elements) {
56-
String path = "";
101+
StringBuilder path = new StringBuilder();
57102

58103
for (String element : elements) {
59-
path += element;
60-
path += SEP;
104+
path.append(element);
105+
path.append(SEP);
61106
}
62107

63108
// strip last separator tb 2020-11-23

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.bc.fiduceo.post.plugin.era5;
22

33
import com.bc.fiduceo.TestUtil;
4+
import com.bc.fiduceo.post.PostProcessing;
45
import org.jdom.Element;
56
import org.jdom.JDOMException;
67
import org.junit.Before;
@@ -143,5 +144,19 @@ public void testCreateConfiguration_matchupFields() throws JDOMException, IOExce
143144
assertEquals("shortWave", matchupConfig.get_fc_msnswrf_name());
144145
assertEquals("heat_flux", matchupConfig.get_fc_msshf_name());
145146
}
147+
148+
@Test
149+
public void testCreatePostProcessing() throws JDOMException, IOException {
150+
final String XML = "<era5>" +
151+
" <nwp-aux-dir>/where/the/data/is</nwp-aux-dir>" +
152+
" <matchup-fields>" +
153+
" </matchup-fields>" +
154+
"</era5>";
155+
final Element rootElement = TestUtil.createDomElement(XML);
156+
157+
final PostProcessing postProcessing = plugin.createPostProcessing(rootElement);
158+
assertNotNull(postProcessing);
159+
assertTrue(postProcessing instanceof Era5PostProcessing);
160+
}
146161
}
147162

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

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
package com.bc.fiduceo.post.plugin.era5;
22

3+
import com.bc.fiduceo.FiduceoConstants;
34
import org.junit.Test;
45
import ucar.ma2.Array;
56
import ucar.ma2.DataType;
7+
import ucar.nc2.Dimension;
8+
import ucar.nc2.NetcdfFile;
9+
import ucar.nc2.NetcdfFileWriter;
610

11+
import java.util.List;
712
import java.util.Map;
813

914
import static org.junit.Assert.assertEquals;
1015
import static org.junit.Assert.assertFalse;
1116
import static org.junit.Assert.assertNull;
17+
import static org.mockito.ArgumentMatchers.anyInt;
18+
import static org.mockito.ArgumentMatchers.anyString;
19+
import static org.mockito.Mockito.*;
1220

1321
public class SatelliteFieldsTest {
1422

@@ -97,4 +105,88 @@ public void testGetNwpOffset() {
97105
assertEquals(1, nwpOffset[1]);
98106
assertEquals(1, nwpOffset[2]);
99107
}
108+
109+
@Test
110+
public void testSetGetDimensions_2D() {
111+
final NetcdfFile ncFile = mock(NetcdfFile.class);
112+
when(ncFile.findDimension(FiduceoConstants.MATCHUP_COUNT)).thenReturn(new Dimension(FiduceoConstants.MATCHUP_COUNT, 10));
113+
114+
final SatelliteFields satelliteFields = new SatelliteFields();
115+
final SatelliteFieldsConfiguration config = createConfig();
116+
117+
final NetcdfFileWriter writer = mock(NetcdfFileWriter.class);
118+
when(writer.addDimension(config.get_x_dim_name(), config.get_x_dim())).thenReturn(new Dimension(config.get_x_dim_name(), config.get_x_dim()));
119+
when(writer.addDimension(config.get_y_dim_name(), config.get_y_dim())).thenReturn(new Dimension(config.get_y_dim_name(), config.get_y_dim()));
120+
121+
satelliteFields.setDimensions(config, writer, ncFile);
122+
123+
final List<Dimension> dimensions = satelliteFields.getDimensions(new TemplateVariable("what", "ever", "we", "write", false));
124+
assertEquals(3, dimensions.size());
125+
126+
Dimension dimension = dimensions.get(0);
127+
assertEquals(FiduceoConstants.MATCHUP_COUNT, dimension.getShortName());
128+
assertEquals(10, dimension.getLength());
129+
130+
dimension = dimensions.get(1);
131+
assertEquals("y_dim", dimension.getShortName());
132+
assertEquals(14, dimension.getLength());
133+
134+
dimension = dimensions.get(2);
135+
assertEquals("x_dim", dimension.getShortName());
136+
assertEquals(12, dimension.getLength());
137+
138+
verify(writer, times(3)).addDimension(anyString(), anyInt());
139+
}
140+
141+
@Test
142+
public void testSetGetDimensions_3D() {
143+
final NetcdfFile ncFile = mock(NetcdfFile.class);
144+
when(ncFile.findDimension(FiduceoConstants.MATCHUP_COUNT)).thenReturn(new Dimension(FiduceoConstants.MATCHUP_COUNT, 11));
145+
146+
final SatelliteFields satelliteFields = new SatelliteFields();
147+
final SatelliteFieldsConfiguration config = createConfig();
148+
config.set_z_dim(17);
149+
150+
final NetcdfFileWriter writer = mock(NetcdfFileWriter.class);
151+
when(writer.addDimension(config.get_x_dim_name(), config.get_x_dim())).thenReturn(new Dimension(config.get_x_dim_name(), config.get_x_dim()));
152+
when(writer.addDimension(config.get_y_dim_name(), config.get_y_dim())).thenReturn(new Dimension(config.get_y_dim_name(), config.get_y_dim()));
153+
when(writer.addDimension(config.get_z_dim_name(), config.get_z_dim())).thenReturn(new Dimension(config.get_z_dim_name(), config.get_z_dim()));
154+
155+
satelliteFields.setDimensions(config, writer, ncFile);
156+
157+
final List<Dimension> dimensions = satelliteFields.getDimensions(new TemplateVariable("what", "ever", "we", "write", true));
158+
assertEquals(4, dimensions.size());
159+
160+
Dimension dimension = dimensions.get(0);
161+
assertEquals(FiduceoConstants.MATCHUP_COUNT, dimension.getShortName());
162+
assertEquals(11, dimension.getLength());
163+
164+
dimension = dimensions.get(1);
165+
assertEquals("z_dim", dimension.getShortName());
166+
assertEquals(17, dimension.getLength());
167+
168+
dimension = dimensions.get(2);
169+
assertEquals("y_dim", dimension.getShortName());
170+
assertEquals(14, dimension.getLength());
171+
172+
dimension = dimensions.get(3);
173+
assertEquals("x_dim", dimension.getShortName());
174+
assertEquals(12, dimension.getLength());
175+
176+
verify(writer, times(3)).addDimension(anyString(), anyInt());
177+
}
178+
179+
private SatelliteFieldsConfiguration createConfig() {
180+
final SatelliteFieldsConfiguration config = new SatelliteFieldsConfiguration();
181+
config.set_x_dim(12);
182+
config.set_x_dim_name("x_dim");
183+
config.set_y_dim(14);
184+
config.set_y_dim_name("y_dim");
185+
config.set_z_dim_name("z_dim");
186+
config.set_nwp_time_variable_name("nwp_time");
187+
config.set_time_variable_name("sat_time");
188+
config.set_longitude_variable_name("sat_lon");
189+
config.set_latitude_variable_name("sat_lat");
190+
return config;
191+
}
100192
}

0 commit comments

Comments
 (0)