GribCollection.GroupHcs readGroup(GribCollectionProto.Group p, GribCollection.GroupHcs group) throws IOException { byte[] rawGds = p.getGds().toByteArray(); Grib2SectionGridDefinition gdss = new Grib2SectionGridDefinition(rawGds); Grib2Gds gds = gdss.getGDS(); int gdsHash = (p.getGdsHash() != 0) ? p.getGdsHash() : gds.hashCode(); group.setHorizCoordSystem(gds.makeHorizCoordSys(), rawGds, gdsHash); group.varIndex = new ArrayList<GribCollection.VariableIndex>(); for (int i = 0; i < p.getVariablesCount(); i++) group.varIndex.add(readVariable(p.getVariables(i), group)); Collections.sort(group.varIndex); group.timeCoords = new ArrayList<TimeCoord>(p.getTimeCoordsCount()); for (int i = 0; i < p.getTimeCoordsCount(); i++) group.timeCoords.add(readTimeCoord(p.getTimeCoords(i))); group.vertCoords = new ArrayList<VertCoord>(p.getVertCoordsCount()); for (int i = 0; i < p.getVertCoordsCount(); i++) group.vertCoords.add(readVertCoord(p.getVertCoords(i))); group.ensCoords = new ArrayList<EnsCoord>(p.getEnsCoordsCount()); for (int i = 0; i < p.getEnsCoordsCount(); i++) group.ensCoords.add(readEnsCoord(p.getEnsCoords(i))); group.filenose = new int[p.getFilenoCount()]; for (int i = 0; i < p.getFilenoCount(); i++) group.filenose[i] = p.getFileno(i); readTimePartitions(group, p); // finish for (GribCollection.VariableIndex vi : group.varIndex) { TimeCoord tc = group.timeCoords.get(vi.timeIdx); vi.ntimes = tc.getSize(); VertCoord vc = (vi.vertIdx < 0) ? null : group.vertCoords.get(vi.vertIdx); vi.nverts = (vc == null) ? 0 : vc.getSize(); EnsCoord ec = (vi.ensIdx < 0) ? null : group.ensCoords.get(vi.ensIdx); vi.nens = (ec == null) ? 0 : ec.getSize(); } // group.assignVertNames(); return group; }
// consistency check on variables : compare each variable to corresponding one in proto // also set the groupno and partno for each partition private boolean checkPartitions(TimePartition.Partition canon, Formatter f) throws IOException { List<TimePartition.Partition> partitions = tp.getPartitions(); int npart = partitions.size(); boolean ok = true; // for each group in canonical Partition GribCollection canonGc = canon.makeGribCollection(f); for (GribCollection.GroupHcs firstGroup : canonGc.getGroups()) { String gname = firstGroup.getId(); if (trace) f.format(" Check Group %s%n", gname); // hash proto variables for quick lookup Map<Integer, GribCollection.VariableIndex> check = new HashMap<Integer, GribCollection.VariableIndex>(firstGroup.varIndex.size()); List<GribCollection.VariableIndex> varIndexP = new ArrayList<GribCollection.VariableIndex>(firstGroup.varIndex.size()); for (GribCollection.VariableIndex vi : firstGroup.varIndex) { TimePartition.VariableIndexPartitioned vip = tp.makeVariableIndexPartitioned(vi, npart); varIndexP.add(vip); check.put(vi.cdmHash, vip); // replace with its evil twin } firstGroup.varIndex = varIndexP; // replace with its evil twin // for each partition for (int partno = 0; partno < npart; partno++) { TimePartition.Partition tpp = partitions.get(partno); if (trace) f.format(" Check Partition %s%n", tpp.getName()); // get corresponding group GribCollection gc = tpp.makeGribCollection(f); int groupIdx = gc.findGroupIdxById(firstGroup.getId()); if (groupIdx < 0) { f.format(" Cant find group %s in partition %s%n", gname, tpp.getName()); ok = false; continue; } GribCollection.GroupHcs group = gc.getGroup(groupIdx); // for each variable in partition group for (int varIdx = 0; varIdx < group.varIndex.size(); varIdx++) { GribCollection.VariableIndex vi2 = group.varIndex.get(varIdx); if (trace) f.format(" Check variable %s%n", vi2); int flag = 0; GribCollection.VariableIndex vi1 = check.get(vi2.cdmHash); // compare with proto variable if (vi1 == null) { f.format( " WARN Cant find variable %s from %s in proto - ignoring that variable%n", vi2, tpp.getName()); continue; // we can tolerate this } // compare vert coordinates VertCoord vc1 = vi1.getVertCoord(); VertCoord vc2 = vi2.getVertCoord(); if ((vc1 == null) != (vc2 == null)) { f.format( " ERR Vert coordinates existence on variable %s in %s doesnt match%n", vi2, tpp.getName()); ok = false; } else if ((vc1 != null) && !vc1.equalsData(vc2)) { f.format( " WARN Vert coordinates values on variable %s in %s dont match%n", vi2, tpp.getName()); f.format(" canon vc = %s%n", vc1); f.format(" this vc = %s%n", vc2); flag |= TimePartition.VERT_COORDS_DIFFER; } // compare ens coordinates EnsCoord ec1 = vi1.getEnsCoord(); EnsCoord ec2 = vi2.getEnsCoord(); if ((ec1 == null) != (ec2 == null)) { f.format( " ERR Ensemble coordinates existence on variable %s in %s doesnt match%n", vi2, tpp.getName()); ok = false; } else if ((ec1 != null) && !ec1.equalsData(ec2)) { f.format( " WARN Ensemble coordinates values on variable %s in %s dont match%n", vi2, tpp.getName()); f.format(" canon ec = %s%n", ec1); f.format(" this ec = %s%n", ec2); flag |= TimePartition.ENS_COORDS_DIFFER; } ((TimePartition.VariableIndexPartitioned) vi1) .setPartitionIndex(partno, groupIdx, varIdx, flag); } // loop over variable } // loop over partition } // loop over group if (ok) f.format(" Partition check: vert, ens coords OK%n"); return ok; }