Source code for conversions

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright (C) 2015 University of Dundee & Open Microscopy Environment.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

"""
Conversion utilities for changing between units.
"""

[docs] class Conversion(object): """ Base-functor like object which can be used for preparing complex equations for converting from one unit to another. Primarily these classes and static methods are used via code-generation. Sympy-generated strings are placed directly into code. If the proper imports are in place, then a top-level Conversion (usually of type Add or Mul is returned from the evaluation). """ def __init__(self, *conversions): self.conversions = conversions def __call__(self, original): raise NotImplemented()
[docs] def join(self, sym): sb = sym.join([str(x) for x in self.conversions]) return "(%s)" % sb
[docs] class Add(Conversion): """ Sums all the Conversion instances which are passed in to the constructor. """ def __call__(self, original): rv = 0.0 for c in self.conversions: rv += c(original) return rv def __str__(self): return self.join(" + ")
[docs] class Int(Conversion): """ Simple representation of a possibly very large integer. """ def __init__(self, i): if isinstance(i, int): self.i = i else: self.i = float(i) # Handles big strings def __call__(self, original): return self.i def __str__(self): return str(self.i)
[docs] class Mul(Conversion): """ Multiplies all the Conversion instances which are passed in to the constructor. """ def __call__(self, original): rv = 1.0 for c in self.conversions: rv *= c(original) return rv def __str__(self): return self.join(" * ")
[docs] class Pow(Conversion): """ Raises the first argument (base) to the power of the second (exponent). """ def __init__(self, base, exp): self.base = base self.exp = exp def __call__(self, original): return self.base ** self.exp def __str__(self): return "(%s ** %s)" % (self.base, self.exp)
[docs] class Rat(Conversion): """ Divides the first argument (numerator) by the second (denominator). """ def __init__(self, n, d): self.n = n self.d = d
[docs] def unwrap(self, x, original): if isinstance(x, (int, float, str)): return float(x) else: return x(original)
def __call__(self, original): n = self.unwrap(self.n, original) d = self.unwrap(self.d, original) return n / d def __str__(self): return "(%s / %s)" % (self.n, self.d)
[docs] class Sym(Conversion): """ Represents the variable of the source unit and simply returns the original value passed to it. """ def __init__(self, s): self.s = s def __call__(self, original): return float(original) def __str__(self): return "x"