package ucar.nc2.util;
import ucar.ma2.Array;
import ucar.ma2.InvalidRangeException;
import ucar.ma2.Range;
import ucar.ma2.Section;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;
import java.io.IOException;
import java.util.Random;
/**
* Utilities to read and subset data
*
* @author caron
* @since 3/25/12
*/
public class TestSubsettingUtils {
public static void subsetVariables(String filename, String varName, int ntrials) throws InvalidRangeException, IOException {
//varName = NetcdfFile.makeValidCdmObjectName(varName);
System.out.println("testVariableSubset="+filename+","+varName);
try (NetcdfFile ncfile = NetcdfFile.open(filename)) {
Variable v = ncfile.findVariable(varName);
if (v == null) {
System.out.printf("Cant Find %s%n", varName);
for (Variable v2 : ncfile.getVariables())
System.out.printf(" %s%n", v2.getFullName());
}
assert (null != v);
int[] shape = v.getShape();
// read entire array
Array A;
try {
A = v.read();
} catch (IOException e) {
System.err.println("ERROR reading file");
assert (false);
return;
}
int[] dataShape = A.getShape();
assert dataShape.length == shape.length;
for (int i = 0; i < shape.length; i++)
assert dataShape[i] == shape[i];
Section all = v.getShapeAsSection();
System.out.println(" Entire dataset=" + all);
for (int k = 0; k < ntrials; k++) {
// create a random subset, read and compare
subsetVariable(v, randomSubset(all, 1), A);
subsetVariable(v, randomSubset(all, 2), A);
subsetVariable(v, randomSubset(all, 3), A);
}
}
}
public static void subsetVariables(String filename, String varName, Section s) throws InvalidRangeException, IOException {
System.out.println("testVariableSubset="+filename+","+varName);
try (NetcdfFile ncfile = NetcdfFile.open(filename)) {
Variable v = ncfile.findVariable(varName);
assert (null != v);
subsetVariable(v, s, v.read());
}
}
public static void subsetVariable(Variable v, Section s, Array fullData) throws IOException, InvalidRangeException {
System.out.println(" section="+s);
// read just that
Array sdata = v.read(s);
assert sdata.getRank() == s.getRank();
int[] sshape = sdata.getShape();
for (int i = 0; i < sshape.length; i++)
assert sshape[i] == s.getShape(i);
// compare with logical section
Array Asection = fullData.sectionNoReduce(s.getRanges());
int[] ashape = Asection.getShape();
assert (ashape.length == sdata.getRank());
for (int i = 0; i < ashape.length; i++)
assert sshape[i] == ashape[i];
ucar.unidata.util.test.CompareNetcdf.compareData(sdata, Asection);
}
private static Section randomSubset(Section all, int stride) throws InvalidRangeException {
Section s = new Section();
for (Range r : all.getRanges()) {
int first = random(r.first(), r.last() / 2);
int last = random(r.last() / 2, r.last());
s.appendRange(first, last, stride);
}
return s;
}
private static Random r = new Random(System.currentTimeMillis());
private static int random(int first, int last) {
return first + r.nextInt(last - first + 1);
}
}