Skip to content

UnitConversionError with magnetic units #5879

Closed

Description

@MilesCranmer

Hi,

I was wondering if there would be support added for conversions of electromagnetic units between SI and CGS systems? Astropy is quite good for most other calculations with units.

Python: 2.7.13
IPython: 5.3.0 (Using a Jupyter Notebook in this example)
astropy: 1.3
numpy: 1.12.0
Python package manager: Conda 4.3.14 (miniconda2)
OS: Ubuntu 14.04

This problem might be related to these issues (please let me know of any others):
SWAT-Sheffield/pysac#14
#5736

Here is a minimal example:

(1.0*u.T).cgs

Error:

---------------------------------------------------------------------------
UnitConversionError                       Traceback (most recent call last)
<ipython-input-13-c6a2c48e6b23> in <module>()
----> 1 (1.0*u.T).cgs

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/utils/decorators.pyc in __get__(self, obj, owner)
    720             return obj.__dict__[self._key]
    721         except KeyError:
--> 722             val = self.fget(obj)
    723             obj.__dict__[self._key] = val
    724             return val

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in cgs(self)
   1342         """
   1343         from . import cgs
-> 1344         return self.to_system(cgs)[0]
   1345 
   1346     @property

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in to_system(self, system)
   1322                 return sum / float(len(compose_bases))
   1323 
-> 1324         x = self.decompose(bases=bases)
   1325         composed = x.compose(units=system)
   1326         composed = sorted(composed, key=score, reverse=True)

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   1952 
   1953     def decompose(self, bases=set()):
-> 1954         return self._represents.decompose(bases=bases)
   1955 
   1956     def is_unity(self):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   2128 
   2129         x = CompositeUnit(self.scale, self.bases, self.powers, decompose=True,
-> 2130                           decompose_bases=bases)
   2131         if len(bases) == 0:
   2132             self._decomposed_cache = x

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in __init__(self, scale, bases, powers, decompose, decompose_bases, _error_check)
   2012         self._powers = powers
   2013         self._decomposed_cache = None
-> 2014         self._expand_and_gather(decompose=decompose, bases=decompose_bases)
   2015         self._hash = None
   2016 

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in _expand_and_gather(self, decompose, bases)
   2085         for b, p in zip(self.bases, self.powers):
   2086             if decompose and b not in bases:
-> 2087                 b = b.decompose(bases=bases)
   2088 
   2089             if isinstance(b, CompositeUnit):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   1952 
   1953     def decompose(self, bases=set()):
-> 1954         return self._represents.decompose(bases=bases)
   1955 
   1956     def is_unity(self):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   2128 
   2129         x = CompositeUnit(self.scale, self.bases, self.powers, decompose=True,
-> 2130                           decompose_bases=bases)
   2131         if len(bases) == 0:
   2132             self._decomposed_cache = x

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in __init__(self, scale, bases, powers, decompose, decompose_bases, _error_check)
   2012         self._powers = powers
   2013         self._decomposed_cache = None
-> 2014         self._expand_and_gather(decompose=decompose, bases=decompose_bases)
   2015         self._hash = None
   2016 

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in _expand_and_gather(self, decompose, bases)
   2085         for b, p in zip(self.bases, self.powers):
   2086             if decompose and b not in bases:
-> 2087                 b = b.decompose(bases=bases)
   2088 
   2089             if isinstance(b, CompositeUnit):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   1952 
   1953     def decompose(self, bases=set()):
-> 1954         return self._represents.decompose(bases=bases)
   1955 
   1956     def is_unity(self):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   2128 
   2129         x = CompositeUnit(self.scale, self.bases, self.powers, decompose=True,
-> 2130                           decompose_bases=bases)
   2131         if len(bases) == 0:
   2132             self._decomposed_cache = x

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in __init__(self, scale, bases, powers, decompose, decompose_bases, _error_check)
   2012         self._powers = powers
   2013         self._decomposed_cache = None
-> 2014         self._expand_and_gather(decompose=decompose, bases=decompose_bases)
   2015         self._hash = None
   2016 

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in _expand_and_gather(self, decompose, bases)
   2085         for b, p in zip(self.bases, self.powers):
   2086             if decompose and b not in bases:
-> 2087                 b = b.decompose(bases=bases)
   2088 
   2089             if isinstance(b, CompositeUnit):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   1952 
   1953     def decompose(self, bases=set()):
-> 1954         return self._represents.decompose(bases=bases)
   1955 
   1956     def is_unity(self):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   2128 
   2129         x = CompositeUnit(self.scale, self.bases, self.powers, decompose=True,
-> 2130                           decompose_bases=bases)
   2131         if len(bases) == 0:
   2132             self._decomposed_cache = x

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in __init__(self, scale, bases, powers, decompose, decompose_bases, _error_check)
   2012         self._powers = powers
   2013         self._decomposed_cache = None
-> 2014         self._expand_and_gather(decompose=decompose, bases=decompose_bases)
   2015         self._hash = None
   2016 

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in _expand_and_gather(self, decompose, bases)
   2085         for b, p in zip(self.bases, self.powers):
   2086             if decompose and b not in bases:
-> 2087                 b = b.decompose(bases=bases)
   2088 
   2089             if isinstance(b, CompositeUnit):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in decompose(self, bases)
   1690             raise UnitConversionError(
   1691                 "Unit {0} can not be decomposed into the requested "
-> 1692                 "bases".format(self))
   1693 
   1694         return self

UnitConversionError: Unit A can not be decomposed into the requested bases

A more explicit conversion attempt for Gauss also fails:

(1.0*u.G**2).to("g/(cm*s^2)")

---------------------------------------------------------------------------
UnitConversionError                       Traceback (most recent call last)
<ipython-input-38-8841affb2bac> in <module>()
----> 1 (1.0*u.G**2).to("g/(cm*s^2)")

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/quantity.pyc in to(self, unit, equivalencies)
    764         unit = Unit(unit)
    765         new_val = self.unit.to(unit, self.view(np.ndarray),
--> 766                                equivalencies=equivalencies)
    767         return self._new_view(new_val, unit)
    768 

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in to(self, other, value, equivalencies)
   1006             If units are inconsistent
   1007         """
-> 1008         return self._get_converter(other, equivalencies=equivalencies)(value)
   1009 
   1010     def in_units(self, other, value=1.0, equivalencies=[]):

/home/miles/miniconda2/lib/python2.7/site-packages/astropy/units/core.pyc in _get_converter(self, other, equivalencies)
    908                             pass
    909 
--> 910             raise exc
    911 
    912     @deprecated('1.0')

UnitConversionError: 'G2' and 'g / (cm s2)' (pressure) are not convertible

Activity

  1. MilesCranmer commented on Mar 18, 2017

    @MilesCranmer
    Author

    If it helps, on the issue here, @Cadair pointed out this might be caused by #4355.

    Cheers,
    Miles

  2. Cadair commented on Mar 18, 2017

    @Cadair
    Member

    👍 This should be doable somehow, maybe an equivalency?

  3. astrofrog commented on Mar 18, 2017

    @astrofrog
    Member

    These may be related: #1687, #4359, #4086

  4. mhvk commented on Apr 12, 2021

    @mhvk
    Contributor

    Closing this in favour of #4359

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions