Skip to content

Commit

Permalink
code deduplication units/add_offset/scale_factor
Browse files Browse the repository at this point in the history
 * prefer using CDM::getAddOffset, CDM::getScaleFactor, CDM::getUnits
 * else, use getStringValue to get "units" text
  • Loading branch information
alexander-buerger-met-no committed Nov 25, 2016
1 parent 979456c commit 440cfc4
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 95 deletions.
14 changes: 7 additions & 7 deletions src/CDM.cc
Expand Up @@ -57,9 +57,9 @@ class CDMCompatibleLatLongUnit : public std::unary_function<std::string, bool>
virtual ~CDMCompatibleLatLongUnit() {}
bool operator() (const std::string& varName) const {
try {
const CDMAttribute& unitAttr = cdm.getAttribute(varName, "units");
std::string testUnit(unitAttr.getData()->asString());
if (testUnit == "") return false;
std::string testUnit = cdm.getUnits(varName);
if (testUnit.empty())
return false;
return compatibleDegrees.find(testUnit) != compatibleDegrees.end();
} catch (CDMException& e) {
// varName doesn't have units
Expand Down Expand Up @@ -667,8 +667,8 @@ bool CDM::getProjectionAndAxesUnits(std::string& projectionName, std::string& xA
}
}
// units and values
xAxisUnits = getAttribute(xAxis, "units").getStringValue();
yAxisUnits = getAttribute(yAxis, "units").getStringValue();
xAxisUnits = getUnits(xAxis);
yAxisUnits = getUnits(yAxis);

return retVal;
}
Expand All @@ -689,14 +689,14 @@ void CDM::generateProjectionCoordinates(boost::shared_ptr<const Projection> proj
size_t yDimLength = getDimension(yDim).getLength();
assert(xDimLength == xVar.getData()->size());
assert(yDimLength == yVar.getData()->size());
std::string xUnits = getAttribute(xDim, "units").getData()->asString();
std::string xUnits = getUnits(xDim);
if (boost::regex_match(xUnits, boost::regex(".*degree.*"))) {
// convert degrees to radians, create a new array so data in cdm does not get overwritten
boost::shared_array<double> newXData(new double[xDimLength]);
std::transform(&xData[0], &xData[0]+xDimLength, &newXData[0], std::bind1st(std::multiplies<double>(), DEG_TO_RAD));
xData = newXData;
}
std::string yUnits = getAttribute(yDim, "units").getData()->asString();;
std::string yUnits = getUnits(yDim);
if (boost::regex_match(yUnits, boost::regex(".*degree.*"))) {
// convert degrees to radians, create a new array so data in cdm does not get overwritten
boost::shared_array<double> newYData(new double[yDimLength]);
Expand Down
13 changes: 2 additions & 11 deletions src/CDMReader.cc
Expand Up @@ -157,17 +157,8 @@ DataPtr CDMReader::getData(const std::string& varName)

void CDMReader::getScaleAndOffsetOf(const std::string& varName, double& scale, double& offset) const
{
// init
scale = 1.;
offset = 0.;

CDMAttribute attr;
if (cdm_->getAttribute(varName, "scale_factor", attr)) {
scale = attr.getData()->asDouble()[0];
}
if (cdm_->getAttribute(varName, "add_offset", attr)) {
offset = attr.getData()->asDouble()[0];
}
scale = cdm_->getScaleFactor(varName);
offset = cdm_->getAddOffset(varName);
}

// handle data scaling using add_offset, scale_factor and _FillValue from the varName variable
Expand Down
15 changes: 4 additions & 11 deletions src/GribApiCDMWriter_Impl1.cc
Expand Up @@ -393,18 +393,11 @@ DataPtr GribApiCDMWriter_Impl1::handleTypeScaleAndMissingData(const std::string&
// need bitmap to represent missing values in grib1
GRIB_CHECK(grib_set_long(gribHandle.get(), "bitmapPresent", 1), "setting bitmap");

CDMAttribute attr;
double scale = 1.;
double offset = 0.;
if (cdm.getAttribute(varName, "scale_factor", attr)) {
scale = attr.getData()->asDouble()[0];
}
if (cdm.getAttribute(varName, "add_offset", attr)) {
offset = attr.getData()->asDouble()[0];
}
double scale = cdm.getScaleFactor(varName);
double offset = cdm.getAddOffset(varName);
// scale and offset by units
if (cdm.getAttribute(varName, "units", attr)) {
std::string unit = attr.getData()->asString();
const std::string unit = cdm.getUnits(varName);
if (!unit.empty()) {
xmlNodePtr node = getNodePtr(varName, levelValue);
std::string gUnit = getXmlProp(node, "units");
if (gUnit != "") {
Expand Down
17 changes: 5 additions & 12 deletions src/GribApiCDMWriter_Impl2.cc
Expand Up @@ -354,7 +354,7 @@ void GribApiCDMWriter_Impl2::setLevel(const std::string& varName, double levelVa
verticalAxisXPath += "[@standard_name=\""+ attr.getData()->asString() + "\"]";
} else if (cdm.getAttribute(verticalAxis, "units", attr)) {
// units compatible to Pa or m
std::string unit = attr.getData()->asString();
std::string unit = attr.getStringValue();
Units units;
if (units.areConvertible(unit, "m")) {
verticalAxisXPath += "[@unitCompatibleTo=\"m\"]";
Expand Down Expand Up @@ -396,18 +396,11 @@ DataPtr GribApiCDMWriter_Impl2::handleTypeScaleAndMissingData(const std::string&
GRIB_CHECK(grib_set_double(gribHandle.get(), "missingValue", outFillValue), "setting missing value");
GRIB_CHECK(grib_set_long(gribHandle.get(), "bitMapIndicator", 1), "setting bitmap");

CDMAttribute attr;
double scale = 1.;
double offset = 0.;
if (cdm.getAttribute(varName, "scale_factor", attr)) {
scale = attr.getData()->asDouble()[0];
}
if (cdm.getAttribute(varName, "add_offset", attr)) {
offset = attr.getData()->asDouble()[0];
}
double scale = cdm.getScaleFactor(varName);
double offset = cdm.getAddOffset(varName);
// scale and offset by units
if (cdm.getAttribute(varName, "units", attr)) {
std::string unit = attr.getData()->asString();
const std::string unit = cdm.getUnits(varName);
if (!unit.empty()) {
xmlNodePtr node = getNodePtr(varName, levelValue);
std::string gUnit = getXmlProp(node, "units");
if (gUnit != "") {
Expand Down
16 changes: 5 additions & 11 deletions src/GribApiCDMWriter_ImplAbstract.cc
Expand Up @@ -419,7 +419,7 @@ std::vector<double> GribApiCDMWriter_ImplAbstract::getLevels(const std::string&
verticalAxisXPath += "[@standard_name=\""+ attr.getData()->asString() + "\"]";
} else if (cdmReader->getCDM().getAttribute(verticalAxis, "units", attr)) {
// units compatible to Pa or m
std::string unit = attr.getData()->asString();
std::string unit = attr.getStringValue();
if (units.areConvertible(unit, "m")) {
verticalAxisXPath += "[@unitCompatibleTo=\"m\"]";
} else if (units.areConvertible(unit, "Pa")) {
Expand All @@ -435,15 +435,8 @@ std::vector<double> GribApiCDMWriter_ImplAbstract::getLevels(const std::string&
verticalAxisXPath += "[@standard_name=\"\"]";
}
// scale the original levels according to the cdm
double scale_factor = 1.;
double add_offset = 0.;
CDMAttribute attr;
if (cdm.getAttribute(verticalAxis, "scale_factor", attr)) {
scale_factor = attr.getData()->asDouble()[0];
}
if (cdm.getAttribute(verticalAxis, "add_offset", attr)) {
add_offset = attr.getData()->asDouble()[0];
}
double scale_factor = cdm.getScaleFactor(verticalAxis);
double add_offset = cdm.getAddOffset(verticalAxis);
std::transform(levelData.begin(), levelData.end(), levelData.begin(), Scale(scale_factor, add_offset));


Expand All @@ -467,10 +460,11 @@ std::vector<double> GribApiCDMWriter_ImplAbstract::getLevels(const std::string&
// scale the levels from cf-units to grib-untis
std::string gribUnits = getXmlProp(node, "units");
if (gribUnits != "") {
CDMAttribute attr;
if (cdm.getAttribute(verticalAxis, "units", attr)) {
double slope;
double offset;
units.convert(attr.getData()->asString(), gribUnits, slope, offset);
units.convert(attr.getStringValue(), gribUnits, slope, offset);
std::transform(levelData.begin(), levelData.end(), levelData.begin(), Scale(slope, offset));
}
}
Expand Down
44 changes: 10 additions & 34 deletions src/NcmlCDMReader.cc
Expand Up @@ -540,24 +540,12 @@ DataPtr NcmlCDMReader::getDataSlice(const std::string& varName, size_t unLimDimP
map<string, CDMDataType>::iterator dtIt = variableTypeChanges.find(varName);
if (dtIt != variableTypeChanges.end()) {
double orgFill = orgCDM.getFillValue(orgVarName);
CDMAttribute attr;
double orgScale = 1.;
double orgOffset = 0.;
if (orgCDM.getAttribute(orgVarName, "scale_factor", attr)) {
orgScale = attr.getData()->asDouble()[0];
}
if (orgCDM.getAttribute(orgVarName, "add_offset", attr)) {
orgOffset = attr.getData()->asDouble()[0];
}
double orgScale = orgCDM.getScaleFactor(orgVarName);
double orgOffset = orgCDM.getAddOffset(orgVarName);

double newFill = cdm_->getFillValue(varName);
double newScale = 1.;
double newOffset = 0.;
if (cdm_->getAttribute(varName, "scale_factor", attr)) {
newScale = attr.getData()->asDouble()[0];
}
if (cdm_->getAttribute(varName, "add_offset", attr)) {
newOffset = attr.getData()->asDouble()[0];
}
double newScale = cdm_->getScaleFactor(varName);
double newOffset = cdm_->getAddOffset(varName);

data = data->convertDataType(orgFill, orgScale, orgOffset, dtIt->second, newFill, newScale, newOffset);
}
Expand Down Expand Up @@ -618,24 +606,12 @@ DataPtr NcmlCDMReader::getDataSlice(const std::string& varName, const SliceBuild
if (dtIt != variableTypeChanges.end()) {
const CDM& orgCDM = dataReader->getCDM();
double orgFill = orgCDM.getFillValue(orgVarName);
CDMAttribute attr;
double orgScale = 1.;
double orgOffset = 0.;
if (orgCDM.getAttribute(orgVarName, "scale_factor", attr)) {
orgScale = attr.getData()->asDouble()[0];
}
if (orgCDM.getAttribute(orgVarName, "add_offset", attr)) {
orgOffset = attr.getData()->asDouble()[0];
}
double orgScale = orgCDM.getScaleFactor(orgVarName);
double orgOffset = orgCDM.getAddOffset(orgVarName);

double newFill = cdm_->getFillValue(varName);
double newScale = 1.;
double newOffset = 0.;
if (cdm_->getAttribute(varName, "scale_factor", attr)) {
newScale = attr.getData()->asDouble()[0];
}
if (cdm_->getAttribute(varName, "add_offset", attr)) {
newOffset = attr.getData()->asDouble()[0];
}
double newScale = cdm_->getScaleFactor(varName);
double newOffset = cdm_->getAddOffset(varName);

data = data->convertDataType(orgFill, orgScale, orgOffset, dtIt->second, newFill, newScale, newOffset);
}
Expand Down
12 changes: 6 additions & 6 deletions src/NetCDF_CDMWriter.cc
Expand Up @@ -650,20 +650,20 @@ void NetCDF_CDMWriter::writeData(const NcVarIdMap& ncVarMap) {
if ((variableTypeChanges.find(varName) != variableTypeChanges.end()) &&
(variableTypeChanges[varName] != CDM_NAT)) {
double oldFill = cdmReader->getCDM().getFillValue(varName);
double oldScale = getOldAttribute(varName, "scale_factor", 1.);
double oldOffset = getOldAttribute(varName, "add_offset", 0.);
double oldScale = cdmReader->getCDM().getScaleFactor(varName);
double oldOffset = cdmReader->getCDM().getAddOffset(varName);
double newFill = cdm.getFillValue(varName);
double newScale = getNewAttribute(varName, "scale_factor", 1.);
double newOffset = getNewAttribute(varName, "add_offset", 0.);
double newScale = cdm.getScaleFactor(varName);
double newOffset = cdm.getAddOffset(varName);

// changes of the units
double unitSlope = 1.;
double unitOffset = 0.;
std::string oldUnit;
std::string newUnit;
try {
oldUnit = cdmReader->getCDM().getAttribute(varName, "units").getData()->asString();
newUnit = getAttribute(varName, "units").getData()->asString();
oldUnit = cdmReader->getCDM().getUnits(varName);
newUnit = cdm.getUnits(varName);
if (oldUnit != newUnit) {
units.convert(oldUnit, newUnit, unitSlope, unitOffset);
}
Expand Down
4 changes: 1 addition & 3 deletions src/binSrc/fiXYcontents.cc
Expand Up @@ -320,9 +320,7 @@ static void runStats(po::variables_map& vm, boost::shared_ptr<CDMReader>& reader
if (cdm.getAttribute(*varIt, "standard_name", attr)) {
stdName = attr.getStringValue();
}
if (cdm.getAttribute(*varIt, "units", attr)) {
unit = attr.getStringValue();
}
unit = cdm.getUnits(*varIt);
printf("Var: %17s %17s %10s %15s %ldx%ld: %ld\n", varIt->c_str(), stdName.c_str(), unit.c_str(), boost::posix_time::to_iso_string(refTime).c_str(), xSize, ySize, csbs.size());
boost::shared_array<float> tArray, zArray;
if (tData.get() != 0) tArray = tData->asFloat();
Expand Down

0 comments on commit 440cfc4

Please sign in to comment.