ó
šßÈ[c           @` s½   d  Z  d d l m Z m Z m Z m Z d d l m Z d d l m	 Z	 d d l
 Z
 d d l Z d d l Z d d l Z d d l Z d d l m Z m Z m Z d	 e j f d
 „  ƒ  YZ d S(   u#   
Handles the "VOUnit" unit format.
i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsi   (   t   six(   t   zipNi   (   t   coret   generict   utilst   VOUnitc           B` s¡   e  Z d  Z e j d ƒ Z e j d ƒ Z i  Z e d „  ƒ Z	 e
 e d „ ƒ Z e
 e d „ ƒ Z e
 d „  ƒ Z e
 d „  ƒ Z e
 d „  ƒ Z e
 d	 „  ƒ Z RS(
   uœ   
    The IVOA standard for units used by the VO.

    This is an implementation of `Units in the VO 1.0
    <http://www.ivoa.net/Documents/VOUnits/>`_.
    u%   ^[YZEPTGMkhdcmunpfazy]?'((?!\d)\w)+'$u   ^((?!\d)\w)+$c       ;   ` s  d d l  m ‰ d d l m ‰ i  ‰ t ƒ  ‰  d d d d d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d5 d6 d7 d8 d9 d: d; d< d= g; }  d> d? d@ g } dA dB dC dD dE dF dG g } dH dI d dJ dK dL d; d, dM d# dN dO d( dP dQ d d dR dS dT dU g } dV dW dX dY dZ d[ g } t d dB dA dD dE d d" d& d d1 d3 g ƒ ‰ g  ‡  ‡ ‡ ‡ ‡ f d\ † } | |  | d] d^ d_ g ƒ | | | | dF d` g ƒ | | dN g ƒ ˆ ˆ  g  f S(a   Ni   (   t   units(   t   required_by_vounitu   Au   Cu   Du   Fu   Gu   Hu   Hzu   Ju   Jyu   Ku   Nu   Ohmu   Pau   Ru   Ryu   Su   Tu   Vu   Wu   Wbu   au   aduu   arcminu   arcsecu   barnu   beamu   binu   cdu   chanu   countu   ctu   du   degu   eVu   ergu   gu   hu   lmu   lxu   lyru   mu   magu   minu   molu   pcu   phu   photonu   pixu   pixelu   radu   su   solLumu   solMassu   solRadu   sru   uu   voxelu   yru   bitu   byteu   Bu   Angstromu   angstromu   AUu   auu   Bau   dBu   masu   yu   zu   fu   pu   nu   cu    u   dau   ku   Mu   Pu   Eu   Zu   Yu   Kiu   Miu   Giu   Tiu   Piu   Eic         ` s›   x” |  D]Œ } xƒ | D]{ } | | } | | k r6 q n  t  j | ƒ rK q n  t t ˆ | ƒ rc ˆ n ˆ | ƒ ˆ | <| ˆ k r ˆ  j | ƒ q q Wq Wd  S(   N(   t   keywordt	   iskeywordt   getattrt   hasattrt   add(   t   basest   prefixest   skipst   baset   prefixt   key(   t   deprecated_namest   deprecated_unitst   namest   ut   uvo(    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt
   do_definesC   s    
(u   pctu   pcountu   ydu   dbyte(   t    R
   R   t   set(   R   t   binary_basest   simple_unitst   si_prefixest   binary_prefixesR   (    (   R   R   R   R   R   s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt   _generate_unit_names    s0    	!'c         C` sŠ   | d
 k r d  S| d k r# t j S| j d ƒ d k rS t j d j | ƒ ƒ ‚ n  |  j | d | ƒ} t | d ƒ r† t d	 ƒ ‚ n  | S(   Nu   unknownu   UNKNOWNu    u   /i   uK   '{0}' contains multiple slashes, which is disallowed by the VOUnit standardt   debugu   function_unitu/   Function units are not yet supported in VOUnit.(   u   unknownu   UNKNOWN(	   t   NoneR   t   dimensionless_unscaledt   countt
   UnitsErrort   formatt	   _do_parseR   t
   ValueError(   t   clst   sR$   t   result(    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt   parseV   s    c         C` sÐ   | |  j  k r“ |  j j | ƒ r. |  j | ƒ S|  j j | ƒ sL t ƒ  ‚ n  t j d j | t	 j
 | |  j  |  j |  j ƒ ƒ t j ƒ |  j | ƒ S| |  j k rÅ t	 j | |  j  | d |  j ƒ n  |  j  | S(   Nu4   Unit {0!r} not supported by the VOUnit standard. {1}u   VOUnit(   t   _unitst   _explicit_custom_unit_regext   matcht   _def_custom_unitt   _custom_unit_regexR+   t   warningst   warnR)   R   t   did_you_mean_unitst   _deprecated_unitst   _to_decomposed_alternativeR   t   UnitsWarningt   unit_deprecation_warning(   R,   t   unitt   detailed_exception(    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt   _parse_unitf   s"    	
c         C` sê   t  | t j ƒ ri | j j d k r< t d j | ƒ ƒ ‚ qi | j j d k ri t d j | ƒ ƒ ‚ qi n  | j d ƒ } | t j	 |  j
 ƒ k r” | S| |  j k r» t d j | ƒ ƒ ‚ n  | |  j k ræ t j | | d |  j ƒ n  | S(   Ng      $@uD   In '{0}': VOUnit can not represent units with the 'da' (deka) prefixgš™™™™™¹?uC   In '{0}': VOUnit can not represent units with the 'd' (deci) prefixu   vounitu-   Unit {0!r} is not part of the VOUnit standardu   VOUnit(   t
   isinstanceR   t
   PrefixUnitt   _representst   scaleR+   R)   t   get_format_nameR   t
   itervaluest   _custom_unitsR0   R8   R   R;   R9   (   R,   R<   t   name(    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt   _get_unit_name€   s(    	c   
   
   ` sò   ‡  f d †  } | ˆ  j  k r) ˆ  j  | Sx¼ t j D]± \ } } } xŸ | D]— } | j | ƒ rI | t | ƒ } | | ƒ } t j g  | j D] }	 | |	 ^ qŠ t j | | g d g d t ƒd i | | j d d 6d ˆ  j  ƒSqI Wq3 W| | ƒ S(   Nc         ` ss   |  ˆ  j  k r ˆ  j  |  S|  j d ƒ rY t j |  d d !|  g d i |  d 6d ˆ  j  ƒSt j |  d ˆ  j  ƒSd  S(   Nu   'i   iÿÿÿÿR)   u   vounitt	   namespace(   RE   t
   startswithR   t   def_unit(   RF   (   R,   (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt   def_base    s    
i   t   _error_checkR)   iÿÿÿÿu   vounitRH   (	   RE   R   R!   RI   t   lenR@   R   t   CompositeUnitt   False(
   R,   R<   RK   t   shortt   fullt   factorR   t	   base_namet	   base_unitt   x(    (   R,   s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyR3   ž   s    	c   	      C` sŒ  d d l  m } t j | |  j ƒ } t | | j ƒ rd| j d k rs | j d k rs | j	 d j
 | j ƒ ƒ ‚ n  d } | j d k rt j | j ƒ \ } } g  } | r¼ | j | ƒ n  | rþ d } | j d ƒ sä | d	 7} n  | | 7} | j | ƒ n  | d
 j | ƒ 7} n  t t | j | j ƒ ƒ } | j d t j d ƒ d t ƒ | |  j | ƒ 7} n$ t | | j ƒ rˆ|  j | ƒ } n  | S(   Ni   (   R   u   dimensionlessi   uf   The VOUnit format is not able to represent scale for dimensionless units. Multiply your data by {0:e}.u    u   10u   -u   +u    R   t   reverse(   R   R   R   t   decompose_to_known_unitsRG   R?   RN   t   physical_typeRB   t   UnitScaleErrorR)   t   split_mantissa_exponentt   appendRI   t   joint   listR   R   t   powerst   sortt   operatort
   itemgettert   Truet   _format_unit_listt	   NamedUnit(	   R,   R<   R   R-   t   mt   ext   partst   fext   pairs(    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt	   to_string¾   s4    
c         C` su   d d l  m } y |  j | ƒ } WnK | j k
 rp | j } t j | ƒ } d | _ d j |  j | ƒ | ƒ SX| S(   Ni   (   R   g      ð?u!   {0} (with data multiplied by {1})(   R   R   Rj   RY   RB   t   copyt   _scaleR)   (   R,   R<   R   R-   RB   (    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyR9   ã   s    		(   t   __name__t
   __module__t   __doc__t   ret   compileR1   R4   RE   t   staticmethodR#   t   classmethodRO   R/   Rb   R>   RG   R3   Rj   R9   (    (    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyR	      s   	6 %(   Ro   t
   __future__R    R   R   R   t   externR   t   extern.six.movesR   Rk   R   R`   Rp   R5   R   R   R   R   t   GenericR	   (    (    (    s:   lib/python2.7/site-packages/astropy/units/format/vounit.pyt   <module>   s   "