CoverageCollection decodeHeader(CdmrFeatureProto.CoverageDataset proto, CdmrCoverageReader reader) {
String name = endpoint;
FeatureType csysType = convertCoverageType(proto.getCoverageType());
LatLonRect latLonBoundingBox = decodeLatLonRectangle(proto.getLatlonRect());
ProjectionRect projBoundingBox = decodeProjRectangle(proto.getProjRect());
CalendarDateRange calendarDateRange = proto.hasDateRange() ? decodeDateRange(proto.getDateRange()) : null;
AttributeContainerHelper gatts = new AttributeContainerHelper(name);
for (ucar.nc2.stream.NcStreamProto.Attribute patt : proto.getAttsList())
gatts.addAttribute(NcStream.decodeAtt(patt));
List<CoverageCoordSys> coordSys = new ArrayList<>();
for (CdmrFeatureProto.CoordSys pgrid : proto.getCoordSysList())
coordSys.add(decodeCoordSys(pgrid));
List<CoverageTransform> transforms = new ArrayList<>();
for (CdmrFeatureProto.CoordTransform ptransform : proto.getCoordTransformsList())
transforms.add(decodeCoordTransform(ptransform));
List<CoverageCoordAxis> axes = new ArrayList<>();
for (CdmrFeatureProto.CoordAxis paxes : proto.getCoordAxesList())
axes.add(decodeCoordAxis(paxes, reader));
List<Coverage> coverages = new ArrayList<>();
for (CdmrFeatureProto.Coverage pgrid : proto.getGridsList())
coverages.add(decodeGrid(pgrid, reader));
return new CoverageCollection(name, csysType, gatts, latLonBoundingBox, projBoundingBox, calendarDateRange, coordSys, transforms, axes, coverages, reader);
}