use of ucar.units_vcell.UnitException in project vcell by virtualcell.
the class VCUnitTranslator method processCellMLUnit.
// derives the ucar unit equivalent to a single cellml 'unit'
// part of the recursive retrieval of CellML units.
private static Unit processCellMLUnit(Element cellUnit, Namespace sNamespace, Namespace sAttNamespace, VCUnitSystem vcUnitSystem) {
Unit unit = null;
UnitName uName;
String kind = cellUnit.getAttributeValue(CELLMLTags.units, sAttNamespace);
if (kind == null || kind.length() == 0) {
throw new RuntimeException("No kind specified for the CellML unit >>> 2");
}
String exp = cellUnit.getAttributeValue(CELLMLTags.exponent, sAttNamespace);
String scaleStr = cellUnit.getAttributeValue(CELLMLTags.prefix, sAttNamespace);
int scale;
try {
if (scaleStr == null || scaleStr.length() == 0) {
scale = 0;
} else {
scale = Integer.parseInt(scaleStr);
}
} catch (NumberFormatException e) {
// bad practice but no better way.
scale = CELLMLTags.prefixToScale(scaleStr);
}
String multiplier = cellUnit.getAttributeValue(CELLMLTags.mult, sAttNamespace);
String offset = cellUnit.getAttributeValue(CELLMLTags.offset, sAttNamespace);
try {
StandardUnitDB unitDB = StandardUnitDB.instance();
if (kind.equals(CELLMLTags.noDimUnit)) {
// special treatment. ignore all the other attributes. Not used in computing total unit.
unit = DerivedUnitImpl.DIMENSIONLESS;
uName = unit.getUnitName();
} else if (CELLMLTags.isCellBaseUnit(kind)) {
unit = unitDB.get(kind);
uName = UnitName.newUnitName(kind);
} else {
Element owner = (Element) cellUnit.getParent().getParent();
String ownerName = owner.getAttributeValue(CELLMLTags.name, sAttNamespace);
// check if already added.
VCUnitDefinition unitDef = getMatchingCellMLUnitDef(owner, sAttNamespace, kind, vcUnitSystem);
if (unitDef != null) {
unit = unitDef.getUcarUnit();
} else {
// recursive block. assumes model level units are added before component level ones,
// so no need to recurse through those as well.
@SuppressWarnings("unchecked") ArrayList<Element> siblings = new ArrayList<Element>(owner.getChildren(CELLMLTags.UNITS, sNamespace));
Element cellUnitDef = null;
for (Element cuElement : siblings) {
cellUnitDef = cuElement;
if (cellUnitDef.getAttributeValue(CELLMLTags.name, sAttNamespace).equals(kind)) {
break;
} else {
cellUnitDef = null;
}
}
if (cellUnitDef != null) {
unitDef = CellMLToVCUnit(cellUnitDef, sNamespace, sAttNamespace, vcUnitSystem);
} else {
System.err.println("Unit definition: " + kind + " is missing. >>> 3");
return null;
}
}
uName = UnitName.newUnitName(kind);
}
if (exp != null && Integer.parseInt(exp) != 1) {
unit = unit.raiseTo(new RationalNumber(Integer.parseInt(exp)));
}
if (scale != 0) {
unit = new ScaledUnit(Double.parseDouble("1.0e" + scale), unit, uName);
}
if (multiplier != null && Double.parseDouble(multiplier) != 1) {
unit = new ScaledUnit(Double.parseDouble(multiplier), unit, uName);
}
if (offset != null && Double.parseDouble(offset) != 0) {
unit = new OffsetUnit(unit, Double.parseDouble(offset), uName);
}
} catch (UnitException e) {
e.printStackTrace();
throw new cbit.vcell.units.VCUnitException("Unable to set unit value: " + e.getMessage());
}
return unit;
}
use of ucar.units_vcell.UnitException in project vcell by virtualcell.
the class InternalUnitDefinition method getInstance.
/**
* Creation date: (4/15/2004 1:39:26 PM)
* @return cbit.vcell.units.InternalUnitDefinition
* @param InternalUnitDefinition cbit.vcell.units.InternalUnitDefinition
* @deprecated please don't use, we should hide the underlying implementation (CellML translator needs it now)
*/
static InternalUnitDefinition getInstance(Unit ucarUnit) {
//
for (int i = 0; i < defs.size(); i++) {
InternalUnitDefinition temp = (InternalUnitDefinition) defs.get(i);
if (equivalent(ucarUnit, temp.getUcarUnit())) {
return temp;
}
}
//
try {
if (ucarUnit instanceof ScaledUnit) {
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(ucarUnit.toString(), " ");
double scale = 1;
int cnt = 0;
String nonNum = null;
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
try {
scale *= Double.parseDouble(token);
cnt++;
} catch (NumberFormatException e) {
nonNum = token;
break;
}
}
double roundedScale = round(scale);
if (roundedScale != scale || cnt > 1) {
String newSymbol = String.valueOf(roundedScale);
if (nonNum != null) {
newSymbol += " " + nonNum;
}
StandardUnitFormat standardUnitFormat = new StandardUnitFormat(new java.io.ByteArrayInputStream(newSymbol.trim().getBytes()));
ucar.units_vcell.UnitDB unitDB = ucar.units_vcell.UnitSystemManager.instance().getUnitDB();
ucarUnit = standardUnitFormat.unitSpec(unitDB);
}
}
} catch (ParseException e) {
e.printStackTrace();
throw new VCUnitException("Unable to get unit: " + ucarUnit.toString() + ": " + e.getMessage());
} catch (UnitException e) {
e.printStackTrace();
throw new VCUnitException("Unable to get unit: " + ucarUnit.toString() + ": " + e.getMessage());
}
//
return new InternalUnitDefinition(ucarUnit);
}
use of ucar.units_vcell.UnitException in project vcell by virtualcell.
the class InternalUnitDefinition method getInstance.
static InternalUnitDefinition getInstance(String symbol) {
if (symbol == null) {
throw new IllegalArgumentException("symbol was null");
}
if (TBD_SYMBOL.equals(symbol)) {
return UNIT_TBD;
}
if (symbol.equalsIgnoreCase("dimensionless")) {
return UNIT_DIMENSIONLESS;
}
Unit dUnit;
try {
StandardUnitFormat standardUnitFormat = new StandardUnitFormat(new java.io.ByteArrayInputStream(symbol.trim().getBytes()));
ucar.units_vcell.UnitDB unitDB = ucar.units_vcell.UnitSystemManager.instance().getUnitDB();
dUnit = standardUnitFormat.unitSpec(unitDB);
ucar.units_vcell.Factor[] factors = dUnit.getDerivedUnit().getDimension().getFactors();
for (int i = 0; i < factors.length; i++) {
if (factors[i].getBase() instanceof ucar.units_vcell.UnknownUnit) {
throw new VCUnitException("invalid symbol '" + factors[i].getBase() + "'");
}
}
} catch (ucar.units_vcell.ParseException e) {
e.printStackTrace();
throw new VCUnitException("Unable to get unit: " + symbol + ": " + e.getMessage());
} catch (UnitException e) {
e.printStackTrace();
throw new VCUnitException("Unable to get unit: " + symbol + ": " + e.getMessage());
}
return getInstance(dUnit);
}
use of ucar.units_vcell.UnitException in project vcell by virtualcell.
the class InternalUnitDefinition method equivalent.
/**
* Insert the method's description here.
* Creation date: (4/15/2004 1:54:00 PM)
* @return boolean
* @param ucarUnit1 ucar.units_vcell.Unit
* @param ucarUnit2 ucar.units_vcell.Unit
*/
private static boolean equivalent(Unit ucarUnit1, Unit ucarUnit2) {
if (ucarUnit2.isDimensionless() && ucarUnit1.isDimensionless()) {
double scale1 = 1.0;
Unit temp1 = ucarUnit1;
while (temp1 instanceof ScaledUnit) {
scale1 *= ((ScaledUnit) temp1).getScale();
temp1 = ((ScaledUnit) temp1).getUnit();
}
double scale2 = 1.0;
Unit temp2 = ucarUnit2;
while (temp2 instanceof ScaledUnit) {
scale2 *= ((ScaledUnit) temp2).getScale();
temp2 = ((ScaledUnit) temp2).getUnit();
}
if (scale1 == scale2) {
return true;
} else {
double maxAbs = Math.max(Math.abs(scale1), Math.abs(scale2));
if (Math.abs(scale1 - scale2) / maxAbs > 1e-10) {
return false;
} else {
return true;
}
}
}
if (ucarUnit2.isCompatible(ucarUnit1)) {
//
try {
float mult = ucarUnit2.convertTo(2.0f, ucarUnit1);
if (mult != 2.0) {
return false;
}
} catch (UnitException e) {
e.printStackTrace();
throw new VCUnitException("Unable to convert units: " + ucarUnit2 + " to " + ucarUnit1.getSymbol() + ": " + e.getMessage());
}
//
if (ucarUnit1.getDerivedUnit().getQuantityDimension().isReciprocalOf(ucarUnit2.getDerivedUnit().getQuantityDimension())) {
return false;
}
return true;
} else {
return false;
}
}
Aggregations