From f47362c7ccea31078566764ee4591139658ddd23 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Mon, 11 Mar 2024 11:21:49 -0600 Subject: [PATCH 1/3] Refactor test to helper function --- .../dataset/cdm/CdmGridDataSourceTest.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java b/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java index fbe833dca..3ba5b4636 100644 --- a/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java +++ b/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.net.URL; -import java.util.Iterator; import org.junit.Before; import org.junit.Test; @@ -74,25 +73,25 @@ public void testReadVariableWithOffset() throws IOException, DataReadingExceptio NetcdfDataset nc = NetcdfDatasetAggregator.getDataset(url.getPath()); try (CdmGridDataSource datasource = new CdmGridDataSource(nc)) { - int xmin = 0; - int xmax = 2; - int ymin = 0; - int ymax = 2; - - Array4D variableWithOffset = - datasource.read("variableWithOffset", 0, 0, 0, 0, ymin, ymax, xmin, xmax); - Array4D variableWithoutOffset = - datasource.read("variableWithoutOffset", 0, 0, 0, 0, ymin, ymax, xmin, xmax); - - int i = 0; - Iterator variableWithOffsetIterator = variableWithOffset.iterator(); - Iterator variableWithoutOffsetIterator = variableWithoutOffset.iterator(); - - while (variableWithOffsetIterator.hasNext()) { - float expectedValue = i++ * 1.25f; - assertEquals(expectedValue, variableWithOffsetIterator.next().floatValue(), delta); - assertEquals(expectedValue, variableWithoutOffsetIterator.next().floatValue(), delta); - } + float[] expectedValues = new float[] {0f, 1.25f, 2.5f, 3.75f, 5f, 6.25f, 7.5f, 8.75f, 10f}; + + checkVariable(datasource, "variableWithOffset", expectedValues); + checkVariable(datasource, "variableWithoutOffset", expectedValues); + } + } + + private void checkVariable(CdmGridDataSource datasource, String variableName, float[] expectedValues) + throws IOException { + int xmin = 0; + int xmax = 2; + int ymin = 0; + int ymax = 2; + + Array4D variable = datasource.read(variableName, 0, 0, 0, 0, ymin, ymax, xmin, xmax); + int i = 0; + + for (Number number : variable) { + assertEquals(expectedValues[i++], number.floatValue(), delta); } } } From c9a0eee74484b87f8dfd5e980a2636d372fa8e47 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Mon, 11 Mar 2024 11:22:47 -0600 Subject: [PATCH 2/3] Add test for reading unsigned types --- .../edal/dataset/cdm/CdmGridDataSourceTest.java | 16 ++++++++++++++++ cdm/src/test/resources/testUnsignedTypes.nc | Bin 0 -> 25448 bytes 2 files changed, 16 insertions(+) create mode 100644 cdm/src/test/resources/testUnsignedTypes.nc diff --git a/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java b/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java index 3ba5b4636..a80aeb7d3 100644 --- a/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java +++ b/cdm/src/test/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSourceTest.java @@ -1,6 +1,7 @@ package uk.ac.rdg.resc.edal.dataset.cdm; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.net.URL; @@ -80,6 +81,20 @@ public void testReadVariableWithOffset() throws IOException, DataReadingExceptio } } + @Test + public void testReadUnisgnedVariables() throws IOException, DataReadingException { + URL url = this.getClass().getResource("/testUnsignedTypes.nc"); + NetcdfDataset nc = NetcdfDatasetAggregator.getDataset(url.getPath()); + + try (CdmGridDataSource datasource = new CdmGridDataSource(nc)) { + float[] expectedValues = new float[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; + + checkVariable(datasource, "variableUbyte", expectedValues); + checkVariable(datasource, "variableUshort", expectedValues); + checkVariable(datasource, "variableUint", expectedValues); + } + } + private void checkVariable(CdmGridDataSource datasource, String variableName, float[] expectedValues) throws IOException { int xmin = 0; @@ -91,6 +106,7 @@ private void checkVariable(CdmGridDataSource datasource, String variableName, fl int i = 0; for (Number number : variable) { + assertNotNull(number); assertEquals(expectedValues[i++], number.floatValue(), delta); } } diff --git a/cdm/src/test/resources/testUnsignedTypes.nc b/cdm/src/test/resources/testUnsignedTypes.nc new file mode 100644 index 0000000000000000000000000000000000000000..66a1d945be6d66417186a93247f3a6b18349126d GIT binary patch literal 25448 zcmeI2O>7%Q6vteJw1O)q1VZ9~gb*MuoFXAq4&1~0&&+dds}YH0O4`0jc4z0! z?AtfLc{{uN#_vu}9P5hr$K6;=aay-&Y0*fMw&J}j7jMo^PRzOf4R=7xyojyhQ`+;m zs~j|m^kMIWuty37<>xqNmuw~$Y#rZdVv0J*2a=7d~oCZpSf587iW6tsHu z*G3?dI`m}$a8Iq}{A>jdQl2;Fy84h-u5K$PtqL>~T&kbE0##zS0p$Hqi-CsuTsonG}r6=^pgLFEZpI4av@QlT)3~o<6 zpxf^oXj$DwJ4&pT%NUF1df0sFw_Sf6PtQ(6u9Z{9I_(so_%(@Lhvn~BAl!GBGaGA$ zwiW7GPaFkG+@AH^XT%LT>*3p<+p`|9Kw>%T*<-{FIqR`v^&l%`f#gC!2nYcoAOwVf z5D)@FKnMr{As__q0RlQSaX&ihIX4cO4s$TXe;;cNh)5(6k(kRI%gkkR>CA$TNIXXo z0DOfP3qhe?3N}I$MGEOx>SYRZ#!$~upj$;Oc$tKwD;$a9G6zw({Lx$aGsebyeBTmL zS{pMo5XV9M1{;WVHll=xPICkak(}l-A~=!$C;o1Zn(4?A$vs+2;0O&bh&Y>vkTY}& z^`e`iIOIJGx%A7m>YJrnP^MKXEH(|$h7O)B)!=92hleV9Ict1$_{i|#p{3%fXU9i| zM@H%Y>i0iU!?x5y@5$q)wwWG$wzKpQc50@DJEOUbxK+HTw@aIbJ}S?3&(R8vPGpZZ ziEhZ~ZMh-sbrs)`T;>~+%d6S7L)v6Jgjj$m!o~ z{>ny0xE;qL_{Ub9vz*&WE(C;t5D)@FKnMr{As_^Vz@0~6v+oDJXu5^&e7nW(2Lu}> z2>~G>1cZPP5CTF#2nYcoaAyAU+^IAU+^IAU+^IAU+^IAU+^IAU+^IaQFJaKb3=MF8}}l literal 0 HcmV?d00001 From aa5d51a24f5a6a9b8b45da6d6f33069c21d08319 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Mon, 11 Mar 2024 11:25:50 -0600 Subject: [PATCH 3/3] Allow reading of unsigned data types --- .../edal/dataset/cdm/CdmGridDataSource.java | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/cdm/src/main/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSource.java b/cdm/src/main/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSource.java index 40eddc1bb..47ff7ace7 100644 --- a/cdm/src/main/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSource.java +++ b/cdm/src/main/java/uk/ac/rdg/resc/edal/dataset/cdm/CdmGridDataSource.java @@ -38,6 +38,7 @@ import org.slf4j.LoggerFactory; import ucar.ma2.Array; +import ucar.ma2.DataType; import ucar.ma2.Index; import ucar.ma2.InvalidRangeException; import ucar.nc2.Variable; @@ -440,30 +441,13 @@ public Number get(int... coords) { * Do the actual data read. */ Number val = null; - switch (arrLocal.getDataType()) { - case BYTE: + if (arrLocal.getDataType() == DataType.BYTE) { val = arrLocal.getByte(index); while (val.doubleValue() < var.getValidMin()) { val = val.intValue() + 256; } - break; - case DOUBLE: - val = arrLocal.getDouble(index); - break; - case FLOAT: - val = arrLocal.getFloat(index); - break; - case INT: - val = arrLocal.getInt(index); - break; - case LONG: - val = arrLocal.getLong(index); - break; - case SHORT: - val = arrLocal.getShort(index); - break; - default: - break; + } else if (arrLocal.getDataType().isNumeric()) { + val = (Number) arrLocal.getObject(index); } if (isMissing(val)) {