B
    Afxa*                 @   s^   d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 e
 ZG dd de	ZeZd	d
 ZdS )z
    pint.measurement
    ~~~~~~~~~~~~~~~~

    :copyright: 2016 by Pint Authors, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
    N   )ufloat)_FORMATSextract_custom_flagssiunitx_format_unit)Quantityc                   sh   e Zd ZdZef fdd	Zedd Zedd Zedd	 Z	d
d Z
dd Zdd Zdd Z  ZS )Measurementa7  Implements a class to describe a quantity with uncertainty.

    Parameters
    ----------
    value : pint.Quantity or any numeric type
        The expected value of the measurement
    error : pint.Quantity or any numeric type
        The error or uncertainty of the measurement

    Returns
    -------

    c                s   |t krHy|j|j }}W n, tk
rF   t|dr>|}t }nd}Y nX y||j}W n tk
rl   Y nX |t kr||}n|dk rtdn
t||}t 	| ||}|S )Nnominal_value r   z-The magnitude of the error cannot be negative)
MISSING	magnitudeunitsAttributeErrorhasattrto
ValueErrorr   super__new__)clsvalueerrorr   maginst)	__class__ /lib/python3.7/site-packages/pint/measurement.pyr       s&    



zMeasurement.__new__c             C   s   | j | jj| jS )N)	_REGISTRYr   r   r	   r   )selfr   r   r   r   ;   s    zMeasurement.valuec             C   s   | j | jj| jS )N)r   r   r   std_devr   )r   r   r   r   r   ?   s    zMeasurement.errorc             C   s   t | jj| jj S )N)absr   r   r	   )r   r   r   r   relC   s    zMeasurement.relc             C   s   ddl m} |t| j| jffS )Nr   )_unpickle_measurement)r
   r!   r   r   _units)r   r!   r   r   r   
__reduce__G   s    zMeasurement.__reduce__c             C   s   d | jj| jj| jS )Nz<Measurement({}, {}, {})>)formatr   r	   r   r   )r   r   r   r   __repr__M   s    zMeasurement.__repr__c             C   s
   d | S )Nz{})r$   )r   r   r   r   __str__R   s    zMeasurement.__str__c             C   s  d|kr| dd}| dd dd}td d }|dkrHd| d }td d }t| j| d	|}| d
d dd}t| jj| j}d|||f S d|krd }}td d }n2d|krd }}td d }nd	 }}td d }d|krd}	| dd}
td d }nd}	|}
d|kr@d}| dd}
td d }t| j|
 ||	| |	 }d
|krjd}d|
krd|
kr| d
d dd}d|
krd}nd}t|}t| j|}d|
ksd|
ksd|
ks||}d|krt	
dd|}t	
dd|}|| | S ) NZLxr
   SPZsiopts[]pm_fmtz+/-() z\SI%s{%s}{%s}Lz  \pm  Zparentheses_fmt   ±CHz&plusmn;z{}z\left(z\right)z\ ZuSZuezu%z\)e\+0?(\d+)u   )×10<sup>\1</sup>z\)e-0?(\d+)u   )×10<sup>-\1</sup>)replacer   r$   r   r   r   r"   r   r   resub)r   specZoptsr+   ZmstrZustrZnewpmZpmZparsspZnewspecr   ZspaceZuspecr   r   r   
__format__U   sZ    	





zMeasurement.__format__)__name__
__module____qualname____doc__r   r   propertyr   r   r    r#   r%   r&   r8   __classcell__r   r   )r   r   r      s   r   c                s4   t d krG  fddd}nG  fdddt}|S )Nc                   s   e Zd Z Zdd ZdS )z,build_measurement_class.<locals>.Measurementc             W   s   t dd S )NzIPint requires the 'uncertainties' package to create a Measurement object.)RuntimeError)r   argsr   r   r   __init__   s    z5build_measurement_class.<locals>.Measurement.__init__N)r9   r:   r;   r   rA   r   )registryr   r   r      s   r   c                   s   e Zd Z ZdS )z,build_measurement_class.<locals>.MeasurementN)r9   r:   r;   r   r   )rB   r   r   r      s   )r   _Measurement)rB   r   r   )rB   r   build_measurement_class   s    
rD   )r<   r4   compatr   Z
formattingr   r   r   Zquantityr   objectr   r   rC   rD   r   r   r   r   <module>   s    