
    IR-e!                     d    d 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ej	                  Z
dS )z#
Handles the "VOUnit" unit format.
    N   )coregenericutilsc                   t    e Zd ZdZ ej        d          Z ej        d          Zi ZdZ	dZ
ed             Zedd            Ze fd	            Zedd            Ze fd            Zed             Zed             Zed fd	            Zeddd            Zed fd	            Zed             Z x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                     	
 ddl m	 ddlm
 i t	                      g d} g d}g d}g d}g d}h d	g f	
fd
	} || |g d            ||||z   ddg            ||dg           g fS )Nr   )units)required_by_vounit):AaaduarcminarcsecbarnbeambinCcdchancountctdDdegergeVFgGHhHzJJyKlmlxlyrmmagminmolNOhmPapcphphotonpixpixelRradRysSsolLumsolMasssolRadsrTuVvoxelWWbyr)bitbyteB)AngstromangstromAUauBadBmas)yzr   fpnrB   r,   cr   r
   dar$   kMr"   rA   PEZY)KiMiGiTiPiEi>   r"   rO   tar   r   rK   rL   c                     | D ]d}|D ]_}||z   }||v rt          j        |          r!t          t          	|          r	n
|          |<   |v r                    |           `ed S N)keyword	iskeywordgetattrhasattradd)basesprefixesskipsbaseprefixkeydeprecated_namesdeprecated_unitsnamesrB   uvos         ;lib/python3.11/site-packages/astropy/units/format/vounit.py
do_definesz/VOUnit._generate_unit_names.<locals>.do_defines:   s     
2 
2& 	2 	2F 4-Ce|| (-- ! !(gaoo)F3!L!LE#J///(,,S111	2
2 
2    )pctpcountydrP   dbyter
   )astropyr   astropy.unitsr   set)rm   binary_basessimple_unitssi_prefixesbinary_prefixesrx   rs   rt   ru   rB   rv   s         @@@@@rw   _generate_unit_nameszVOUnit._generate_unit_names   s&   &&&&&&;;;;;;55
 
 
 ,++NNN
 
 
 ?>>
 
 
 /1 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	
5+'>'>'>???
<!>wPPP
<"&&&&**ry   Fc                 |   |dv rd S |dk    rt           j        S |                    d          dk    rT|                    d          t          t	          j        d|                    z
  dk    rt          j        d| d          |                     ||          }t          |d	          rt          d
          |S )N)unknownUNKNOWNr
   /r   z\(\d+/\d+\)'zH' contains multiple slashes, which is disallowed by the VOUnit standard.)debugfunction_unitz/Function units are not yet supported in VOUnit.)
r   dimensionless_unscaledr   lenrefindall
UnitsError	_do_parserk   
ValueError)clsr;   r   results       rw   parsezVOUnit.parseM   s    &&&477..773<<!s2:na3P3P/Q/Q QTU U U/5A 5 5 5   q..6?++ 	PNOOOry   c           
         	 t                                          |          S # t          $ r | j                            |j                  r|                     |j                  cY S | j                            |j                  rpt          j	        d|j        dt          j        |j        | j        | j        | j                  z   t          j                   |                     |j                  cY S  w xY w)NUnit z' not supported by the VOUnit standard. )super	_get_unitr   _explicit_custom_unit_regexmatchvalue_def_custom_unit_custom_unit_regexwarningswarnr   did_you_mean_units_units_deprecated_units_to_decomposed_alternativer   UnitsWarning)r   t	__class__s     rw   r   zVOUnit._get_unit^   s   	77$$Q''' 	 	 	.44QW== 5++AG44444%++AG44 5NAGNNN.
-6	  %	 	 	 ++AG44444%	s    $ AC:)BC:8C:Tc                     || j         vrt                      || j        v r't          j        || j         |         d| j                   | j         |         S )Nr   )r   r   r   r   unit_deprecation_warningr   )r   unitdetailed_exceptions      rw   _parse_unitzVOUnit._parse_unitv   s^    sz!!,,3(((*cj&#2P   z$ry   c                    t          |t          j                  rF|j        j        dk    rt          d| d          |j        j        dk    rt          d| d          t                                          |          }|| j        	                                v r|S || j
        vrt          d|d          || j        v rt          j        ||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) prefixr   z# is not part of the VOUnit standardr   )
isinstancer   
PrefixUnit_representsscaler   r   _get_unit_name_custom_unitsvaluesr   r   r   r   r   )r   r   namer   s      rw   r   zVOUnit._get_unit_name   s"    dDO,, 
	%-- $4 $ $ $   !'3.. $4 $ $ $  
 ww%%d++3$++----Ksz!!PTPPPQQQ3(((*dHc&D   ry   c                      fd}| j         v r j         |         S t          j        D ]\  }}}|D ]|                              r||t	                    d          } ||          }t          j        fd|j        D             t          j        ||gdgd          d|j        d         z   i j                   c c S  ||          S )	Nc                     | j         v rj         |          S |                     d          r(t          j        | dd         | gd| ij                   S t          j        | j                   S )Nr   r   vounitformat	namespace)r   )r   
startswithr   def_unit)r   r   s    rw   def_basez)VOUnit._def_custom_unit.<locals>.def_base   s    s((((..s## H}!B$Z&$d+!/    }TS5FGGGGry   c                     g | ]}|z   S  r   ).0xrq   s     rw   
<listcomp>z+VOUnit._def_custom_unit.<locals>.<listcomp>   s    ===!===ry   r   F)_error_checkr   r   r   )r   r   r   r   r   r   ru   CompositeUnit)	r   r   r   shortfullfactor	base_name	base_unitrq   s	   `       @rw   r   zVOUnit._def_custom_unit   s=   	H 	H 	H 	H 	H 3$$$$T**#'#3 	 	E4  ??6** 
 $S[[]] 3I ( 3 3I?====Y_===*"YK!5   !)&9?23F*FG"%"3       
 x~~ry   c                 (    d|v sd|v rd| dnd| S )Nr   r	   z**()z**r   )r   numbers     rw   _format_superscriptzVOUnit._format_superscript   s*    "%--3&==Vm6mmSry   .8gc                 H    t                                          ||          S rg   )r   format_exponential_notation)r   valformat_specr   s      rw   r   z"VOUnit.format_exponential_notation   s    ww223DDDry   inlinefractionc                    |du s|dk    st          d|d          | j        |v rd| d}|r|dk    r| d| S | | d| S )	NTr   z@format {cls.name!r} only supports inline fractions,not fraction=r	   (r   1r   )r   _space)r   r   	numeratordenominatorr   s        rw   _format_fractionzVOUnit._format_fraction   s    D  H$8$8. (. . .  
 :$$,k,,,K 	,Y#%%++k+++222[222ry   c                     ddl m} t          j        || j                  }|j        dk    r%|j        dk    r |j        d|j        dd          t                      	                    ||          S )	Nr   r   dimensionlessr   z`The VOUnit format is not able to represent scale for dimensionless units. Multiply your data by er	   r   )
r   r   r   decompose_to_known_unitsr   physical_typer   UnitScaleErrorr   	to_string)r   r   r   r   r   s       rw   r   zVOUnit.to_string   s    &&&&&& -dC4FGG00TZ1__%$%9)-89 9 9   ww   999ry   c                     ddl m} 	 |                     |          }nM# |j        $ r@ |j        }t          j        |          }d|_        |                     |           d| dcY S w xY w|S )Nr   r   g      ?z (with data multiplied by r   )r   r   r   r   r   copy_scale)r   r   r   r;   r   s        rw   r   z!VOUnit._to_decomposed_alternative   s    &&&&&&	Nd##AA" 	N 	N 	NJE9T??DDKmmD))MMUMMMMMM		N
 s    AA('A()F)T)r   )__name__
__module____qualname____doc__r   compiler   r   r   r   _scale_unit_separatorstaticmethodr   classmethodr   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @rw   r   r      s         #-"*-U"V"V#$455MF-+ -+ \-+^    [      [. 	  	  	  [	      [<   [B T T [T E E E E E [E IQ 3 3 3 3 [3 : : : : : [: 
 
 [
 
 
 
 
ry   r   )r   r   rh   r   r   r
   r   r   r   Genericr   r   ry   rw   <module>r      s    
   				  " " " " " " " " " "e e e e eW_ e e e e ery   