U
    e»{jŠ!  ã                   @   sV   d 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	 G dd„ dej
ƒZdS )z#
Handles the "VOUnit" unit format.
é    Né   )ÚcoreÚgenericÚutilsc                       s    e Zd ZdZe d¡Ze d¡Zi Ze	dd„ ƒZ
eddd„ƒZe‡ fd	d
„ƒZeddd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZ‡  ZS )ÚVOUnitzœ
    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/>`_.
    z%^[YZEPTGMkhdcmunpfazy]?'((?!\d)\w)+'$z^((?!\d)\w)+$c               ;      sd  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/d0d1d2d3d4d5d5d6d7d8d9d:d;d<d=g;} d>d?d@g}dAdBdCdDdEdFdGg}dHdIddJdKdLd;d,dMd#dNdOd(dPdQdddRdSdTdUg}dVdWdXdYdZd[g}ddBdAdDdEdd"d&dd1d3h‰g f‡ ‡‡‡‡fd\d]„	}|| |d^d_d`gƒ |||| dFdagƒ ||dNgƒ ˆˆ g fS )bNr   )Úunits)Úrequired_by_vounitÚAÚCÚDÚFÚGÚHZHzÚJZJyÚKÚNZOhmZPaÚRZRyÚSÚTÚVÚWZWbÚaZaduZarcminZarcsecZbarnZbeamÚbinÚcdZchanÚcountÚctÚdÚdegZeVZergÚgÚhZlmÚlxZlyrÚmÚmagÚminZmolZpcÚphZphotonZpixZpixelZradÚsZsolLumZsolMassZsolRadÚsrÚuZvoxelÚyrÚbitÚbyteÚBZAngstromZangstromZAUÚauZBaZdBZmasÚyÚzÚfÚpÚnÚcÚ ÚdaÚkÚMÚPÚEÚZÚYZKiZMiZGiZTiÚPiZEic                    sd   | D ]Z}|D ]P}|| }||kr"qt  |¡r.qttˆ|ƒr>ˆnˆ|ƒˆ|< |ˆkrˆ  |¡ qqd S )N)ÚkeywordÚ	iskeywordÚgetattrÚhasattrÚadd)ÚbasesÚprefixesÚskipsÚbaseÚprefixÚkey©Zdeprecated_namesZdeprecated_unitsÚnamesr'   Zuvo© úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/units/format/vounit.pyÚ
do_defines8   s    
z/VOUnit._generate_unit_names.<locals>.do_definesZpctZpcountZydZdbyte)Zastropyr   Úastropy.unitsr   Úset)rA   Zbinary_basesZsimple_unitsÚsi_prefixesZbinary_prefixesrK   rI   rG   rJ   Ú_generate_unit_names   sÔ                                                        ù	
                   þ         þzVOUnit._generate_unit_namesFc                 C   s|   |dkrd S |dkrt jS | d¡dkrX| d¡tt d|¡ƒ dkrXt  d|› d�¡‚| j||d�}t|d	ƒrxt	d
ƒ‚|S )N)ÚunknownÚUNKNOWNr3   ú/r   z\(\d+/\d+\)ú'zH' contains multiple slashes, which is disallowed by the VOUnit standard.)ÚdebugZfunction_unitz/Function units are not yet supported in VOUnit.)
r   Zdimensionless_unscaledr   ÚlenÚreÚfindallZ
UnitsErrorZ	_do_parser?   Ú
ValueError)Úclsr%   rT   ÚresultrI   rI   rJ   ÚparseK   s    ,
ÿ
zVOUnit.parsec                    s–   zt ƒ  |¡W S  tk
r�   | j |j¡r<|  |j¡ Y S | j |j¡rŠt 	d|j›d�t
 |j| j| j| j¡ tj¡ |  |j¡ Y S ‚ Y nX d S )NúUnit z' not supported by the VOUnit standard. )ÚsuperÚ	_get_unitrX   Ú_explicit_custom_unit_regexÚmatchÚvalueÚ_def_custom_unitÚ_custom_unit_regexÚwarningsÚwarnr   Zdid_you_mean_unitsÚ_unitsÚ_deprecated_unitsÚ_to_decomposed_alternativer   ZUnitsWarning)rY   Út©Ú	__class__rI   rJ   r^   \   s&    üÿøzVOUnit._get_unitTc                 C   s<   || j krtƒ ‚|| jkr2t || j | d| j¡ | j | S )Nr   )rf   rX   rg   r   Úunit_deprecation_warningrh   )rY   ÚunitZdetailed_exceptionrI   rI   rJ   Ú_parse_unitt   s    

   ÿzVOUnit._parse_unitc                 C   sœ   t |tjƒrF|jjdkr*td|› d�ƒ‚n|jjdkrFtd|› d�ƒ‚| d¡}|| j ¡ krb|S || j	kr|td|›d�ƒ‚|| j
kr˜t ||d	| j¡ |S )
Ng      $@zIn 'z=': VOUnit can not represent units with the 'da' (deka) prefixgš™™™™™¹?z<': VOUnit can not represent units with the 'd' (deci) prefixÚvounitr\   z# is not part of the VOUnit standardr   )Ú
isinstancer   Ú
PrefixUnitZ_representsÚscalerX   Zget_format_nameÚ_custom_unitsÚvaluesrf   rg   r   rl   rh   )rY   rm   ÚnamerI   rI   rJ   Ú_get_unit_name€   s,    
ÿ
ÿ


   ÿzVOUnit._get_unit_namec              
      s²   ‡ fdd„}|ˆ j kr ˆ j | S tjD ]‚\}}}|D ]r‰| ˆ¡r4|tˆƒd … }||ƒ}tj‡fdd„|jD ƒtj||gdgdd�dˆ|jd	  iˆ j d
�    S q4q&||ƒS )Nc                    sT   | ˆ j krˆ j |  S |  d¡r@tj| dd… | gd| iˆ j d�S tj| ˆ j d�S d S )NrS   r   éÿÿÿÿro   ©ÚformatÚ	namespace)rz   )rs   Ú
startswithr   Zdef_unit)ru   ©rY   rI   rJ   Údef_base¡   s    


ýz)VOUnit._def_custom_unit.<locals>.def_basec                    s   g | ]}ˆ | ‘qS rI   rI   )Ú.0Úx)rE   rI   rJ   Ú
<listcomp>·   s     z+VOUnit._def_custom_unit.<locals>.<listcomp>r   F)Z_error_checkro   rw   rx   )rs   r   rN   r{   rU   rq   rH   ÚCompositeUnit)rY   rm   r}   ÚshortÚfullÚfactorÚ	base_nameZ	base_unitrI   )rY   rE   rJ   rb   Ÿ   s(    


   ÿú	zVOUnit._def_custom_unitc                    sœ   g }|j ‡ fdd„d� |D ]t\}}|dkr>| ˆ  |¡¡ qt |¡}d|ksXd|krv| ˆ  |¡› d|› d�¡ q| ˆ  |¡› d	|› �¡ qd |¡S )
Nc                    s   ˆ   | d ¡ ¡ S )Nr   )rv   Úlower)r   r|   rI   rJ   Ú<lambda>Ä   ó    z*VOUnit._format_unit_list.<locals>.<lambda>)rF   r   rR   Ú.ú(ú)z**)ÚsortÚappendrv   r   Zformat_powerÚjoin)rY   r   ÚoutrD   ÚpowerrI   r|   rJ   Ú_format_unit_listÁ   s    
zVOUnit._format_unit_listc                 C   s¼   ddl m} t || j¡}t||jƒr¢|jdkrP|jdkrP| 	d|jd›d�¡‚d}|jdkrl||jd	›7 }t
t|j|jƒƒ}|jt d¡d
d� ||  |¡7 }nt||jƒr¸|  |¡}|S )Nr   ©r   Zdimensionlessr   z`The VOUnit format is not able to represent scale for dimensionless units. Multiply your data by Úer‰   r3   z.8gT)rF   Úreverse)rL   r   r   Zdecompose_to_known_unitsrv   rp   r�   Zphysical_typerr   ÚUnitScaleErrorÚlistÚziprA   ZpowersrŒ   ÚoperatorÚ
itemgetterr‘   Z	NamedUnit)rY   rm   r   r%   ÚpairsrI   rI   rJ   Ú	to_stringÑ   s     ÿ

zVOUnit.to_stringc                 C   sb   ddl m} z|  |¡}W nB |jk
r\   |j}t |¡}d|_|  |¡› d|› d� Y S X |S )Nr   r’   g      ð?z (with data multiplied by r‹   )rL   r   r›   r•   rr   ÚcopyZ_scale)rY   rm   r   r%   rr   rI   rI   rJ   rh   ì   s    
z!VOUnit._to_decomposed_alternative)F)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rV   Úcompiler_   rc   rs   ÚstaticmethodrO   Úclassmethodr[   r^   rn   rv   rb   r‘   r›   rh   Ú__classcell__rI   rI   rj   rJ   r      s,   


.

!

r   )r    rœ   r<   r˜   rV   rd   r3   r   r   r   ÚGenericr   rI   rI   rI   rJ   Ú<module>   s   