B
     /]c                 @   s  d dl mZmZmZ dgZd dlZd dlZd dlm	Z	 d dl
Z
d dlZd dlZddddd	d
ddddddddddZddddddddddddddd Zi Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: ZG d;d< d<eZG d=d> d>eZd?d@ Z dAdB Z!dCdD Z"dEdF Z#dGdH Z$dIdJ Z%dKdL Z&dMdN Z'dOdP Z(dQdR Z)dSdT Z*G dUdV dVe+Z,dYdXdZ-dS )Z    )divisionprint_functionabsolute_importreadsavN)asstrz>u1z>i2z>i4z>f4z>f8z>c8z|Oz>c16z>u2z>u4z>i8z>u8)                        	   
                  ZSTART_MARKERZCOMMON_VARIABLEVARIABLESYSTEM_VARIABLE
END_MARKER	TIMESTAMPZCOMPILEDZIDENTIFICATIONVERSIONHEAP_HEADER	HEAP_DATAZ	PROMOTE64NOTICEDESCRIPTION)r   r   r   r	   r   r   r   r   r   r               c             C   s.   |   }|d dkr*| |d |d   dS )z+Align to the next 32-bit position in a filer
   r   N)tellseek)fpos r'   X/home/fristb/BIRCH/lib-linux-x86_64/python/lib64/python3.7/site-packages/scipy/io/idl.py	_align_32N   s    r)   c             C   s   |  | dS )zSkip `n` bytesN)read)r%   nr'   r'   r(   _skip_bytesW   s    
r,   c             C   s
   |  |S )zRead the next `n` bytes)r*   )r%   r+   r'   r'   r(   _read_bytes]   s    r-   c             C   s$   t td| ddd d S )zRead a single bytez>Br
   Nr   r   )npuint8structunpackr*   )r%   r'   r'   r(   
_read_byteb   s    r2   c             C   s   t td| dd S )zRead a signed 32-bit integerz>lr
   r   )r.   int32r0   r1   r*   )r%   r'   r'   r(   
_read_longg   s    r4   c             C   s$   t td| ddd d S )zRead a signed 16-bit integerz>hr
   r   r   )r.   int16r0   r1   r*   )r%   r'   r'   r(   _read_int16l   s    r6   c             C   s   t td| dd S )zRead a signed 32-bit integerz>ir
   r   )r.   r3   r0   r1   r*   )r%   r'   r'   r(   _read_int32q   s    r7   c             C   s   t td| dd S )zRead a signed 64-bit integerz>qr   r   )r.   int64r0   r1   r*   )r%   r'   r'   r(   _read_int64v   s    r9   c             C   s$   t td| ddd d S )zRead an unsigned 16-bit integerz>Hr
   r   r   )r.   uint16r0   r1   r*   )r%   r'   r'   r(   _read_uint16{   s    r;   c             C   s   t td| dd S )zRead an unsigned 32-bit integerz>Ir
   r   )r.   uint32r0   r1   r*   )r%   r'   r'   r(   _read_uint32   s    r=   c             C   s   t td| dd S )zRead an unsigned 64-bit integerz>Qr   r   )r.   uint64r0   r1   r*   )r%   r'   r'   r(   _read_uint64   s    r?   c             C   s   t td| dd S )zRead a 32-bit floatz>fr
   r   )r.   float32r0   r1   r*   )r%   r'   r'   r(   _read_float32   s    rA   c             C   s   t td| dd S )zRead a 64-bit floatz>dr   r   )r.   float64r0   r1   r*   )r%   r'   r'   r(   _read_float64   s    rC   c               @   s   e Zd ZdZdd ZdS )PointerzClass used to define pointersc             C   s
   || _ d S )N)index)selfrE   r'   r'   r(   __init__   s    zPointer.__init__N)__name__
__module____qualname____doc__rG   r'   r'   r'   r(   rD      s   rD   c               @   s   e Zd ZdZdS )ObjectPointerz$Class used to define object pointersN)rH   rI   rJ   rK   r'   r'   r'   r(   rL      s   rL   c             C   s4   t | }|dkr,t| |}t|  t|}nd}|S )zRead a stringr    )r4   r-   r)   r   )r%   lengthcharsr'   r'   r(   _read_string   s    

rP   c             C   s4   t | }|dkr,t | }t| |}t|  nd}|S )z.Read a data string (length is specified twice)r   rM   )r4   r-   r)   )r%   rN   Zstring_datar'   r'   r(   _read_string_data   s    

rQ   c             C   s^  |dkr$t | dkrtdt| S |dkr4t| S |dkrDt | S |dkrTt| S |dkrdt| S |dkrt| }t| }t||d  S |d	krt| S |d
krtdn|dkrt| }t| }t	||d  S |dk rt
t | S |dkrtt | S |dkrt| S |dkr*t| S |dkr<t| S |dkrNt| S td| dS )z*Read a variable with a specified data typer   z*Error occurred while reading byte variabler   r	   r
   r   r   y              ?r   r   z'Should not be here - please report thisr   r   r   r   r   r   r   z)Unknown IDL type: %i - please report thisN)r7   	Exceptionr2   r6   rA   rC   r.   	complex64rQ   
complex128rD   rL   r;   r=   r9   r?   )r%   dtyperealimagr'   r'   r(   
_read_data   sJ    






rX   c       
      C   s  |d }|d }g }x|D ]z}|d s.|d rP| |d  |d ftjf q|d tkr| |d  |d ft|d  f qtd|d  qW tj|f|d}xt|D ]}x|D ]}|d }|d rt| |d	 |d  |d
 |d  ||d  |< q|d r4t	| ||d	 |d  ||d  |< qt
| |||d  |< qW qW |d dkr|d dt|d  }	|	  ||	}|S )z
    Read a structure, with the array and structure descriptors given as
    `array_desc` and `structure_desc` respectively.
    	nelementstagtable	structurearraynametypecodez Variable type %i not implemented)rU   arrtablestructtablendimsr   dimsN)appendlowerr.   object_
DTYPE_DICTrR   recarrayrange_read_structure_read_arrayrX   intreversereshape)
r%   
array_descstruct_descZnrowscolumnsrU   colr[   irb   r'   r'   r(   ri      s8    
"

 
 
ri   c       	      C   s  |dkrL|dkr.t | }||d kr.td tj| |d t| d}nv|dkrtj| |d d t| dddd }nBg }x,t|d	 D ]}|}t| |}|	| qW tj
|tjd}|d
 dkr|d dt|d
  }|  ||}t|  |S )z`
    Read an array of type `typecode`, with the array descriptor given as
    `array_desc`.
    )	r   r	   r
   r   r   r   r   r   r   r   nbytesz.Not able to verify number of bytes from header)rU   )r   r   r   NrY   ra   rb   )r7   warningswarnr.   
frombufferr*   rf   rh   rX   rc   r\   re   rk   rl   rm   r)   )	r%   r^   rn   rs   r\   rr   rU   datarb   r'   r'   r(   rj     s,    


rj   c                s   dt  i}t }|t d 7 }t d |d tkrJtd|d  t|d  |d< |d dkrF|d dkrt |d< nt  |d< t d t }|d	 d
kr|  krd|d< ntdnvt  }|dkrtd|d rt	 |d |d |d< n:|d r,t
 |d	 |d |d< n|d	 }t ||d< n|d dkrt d t |d< t |d< t |d< n|d dkrt  |d< t |d< t |d< t |d< nJ|d dkrt |d< t |d < t |d!< n|d d"krt |d#< n|d d$kr6t |d%< n|d d&krpt  |d'<  fd(d)t|d' D |d*< n|d d+krt  |d,< t |d-<  fd.d)t|d, D |d/< n\|d d0krd1|d2< nD|d d3krtd4 n*|d d5krtd6 ntd7|d   | |S )8z!Function to read in a full recordrectypel        r
   zUnknown RECTYPE: %i)r   r   r   varname
heap_indexr^   r   Nrw   zUnexpected type code: 0r   zVARSTART is not 7r[   rn   ro   r\   r   i   dateuserhostr   formatarchosreleaseIDENTIFICATONauthortitleidcoder   Znoticer   descriptionr   Znvaluesc                s   g | ]}t  qS r'   )r4   ).0_)r%   r'   r(   
<listcomp>  s    z _read_record.<locals>.<listcomp>indicesZCOMMONBLOCKnvarsr]   c                s   g | ]}t  qS r'   )rP   )r   r   )r%   r'   r(   r     s    varnamesr   TendUNKNOWNzSkipping UNKNOWN recordr   zSkipping SYSTEM_VARIABLE recordz$record['rectype']=%s not implemented)r4   r=   r,   RECTYPE_DICTrR   rP   _read_typedescr#   
ValueErrorri   rj   rX   rQ   rh   rt   ru   r$   )r%   recordnextrecZrectypedescZvarstartrU   r'   )r%   r(   _read_record?  s~    








  

r   c             C   s   t | t | d}|d d@ dkr*td|d d@ dk|d< |d d@ dk|d< |d rtt| |d	< t| |d
< n|d rt| |d	< |S )z%Function to read in a type descriptor)r^   varflagsr   r   z System variables not implementedr
   r\       r[   rn   ro   )r4   rR   _read_arraydesc_read_structdesc)r%   Ztypedescr'   r'   r(   r     s    r   c                s4  dt  i}|d dkr|t d t  |d< t  |d< t  |d< t d t  |d<  fdd	t|d D |d
< n|d dkr td t d t |d< t |d< t  |d< t d d|d< g |d
< xRt|d D ]0}t  }|dkrtd|d
 t   qW ntd|d  |S )z'Function to read in an array descriptorZarrstartr   r
   rs   rY   ra   Znmaxc                s   g | ]}t  qS r'   )r4   )r   r   )r%   r'   r(   r     s    z#_read_arraydesc.<locals>.<listcomp>rb      z$Using experimental 64-bit array readr   zExpected a zero in ARRAY_DESCzUnknown ARRSTART: %i)r4   r,   rh   rt   ru   r?   rR   rc   )r%   Z	arraydescdvr'   )r%   r(   r     s2    

 



r   c                s  i }t  }|dkrtdt |d< t  }t  |d< t  |d< |d@ |d< |d@ |d	< |d
@ |d< |d sZ fddt|d D |d< x|d D ]}t |d< qW  fdd|d D |d<  fdd|d D |d< |d	 s|d rLt |d< t  |d<  fddt|d D |d<  fddt|d D |d< |t|d < n"|d tkrptdt|d  }|S )z*Function to read in a structure descriptorr   zSTRUCTSTART should be 9r]   Zntagsrs   r   predefr   Zinheritsr
   Zis_superc                s   g | ]}t  qS r'   )_read_tagdesc)r   r   )r%   r'   r(   r     s   z$_read_structdesc.<locals>.<listcomp>rZ   c                s"   i | ]}|d  rt  |d qS )r\   r]   )r   )r   tag)r%   r'   r(   
<dictcomp>	  s   z$_read_structdesc.<locals>.<dictcomp>r_   c                s"   i | ]}|d  rt  |d qS )r[   r]   )r   )r   r   )r%   r'   r(   r     s   r`   	classnameZnsupclassesc                s   g | ]}t  qS r'   )rP   )r   r   )r%   r'   r(   r     s    Zsupclassnamesc                s   g | ]}t  qS r'   )r   )r   r   )r%   r'   r(   r     s    Zsupclasstablez"PREDEF=1 but can't find definition)r4   rR   rP   rh   STRUCT_DICT)r%   Z
structdescZstructstartr   r   r'   )r%   r(   r     s<    



r   c             C   sl   dt | i}|d dkr$t| |d< t | |d< t | }|d@ dk|d< |d@ dk|d< |d tk|d< |S )	z$Function to read in a tag descriptoroffsetr^   r
   r\   r   r[   scalar)r4   r?   rf   )r%   ZtagdescZtagflagsr'   r'   r(   r   %  s    r   c             C   sl  t | trlxBt | trL| jdkr&d } q| j|kr<|| j } qtd d } qW t| |\}}|rd|} d| fS t | tjjj	rx.t
| D ]"\}}t||\}}|r|| |< qW d| fS t | tjjj rx.t
| D ]"\}}t||\}}|r|| |< qW d| fS t | tjr`| jjtjkrXx:t| jD ],}t| ||\}}|r(| || q(W d| fS d| fS d S )Nr   zNVariable referenced by pointer not found in heap: variable will be set to NoneTF)
isinstancerD   rE   rt   ru   _replace_heapr.   corerecordsrg   	enumerater   ndarrayrU   typere   rh   sizeitemitemset)variableheapreplacenewZirr   Zivvaluer'   r'   r(   r   8  s@    



r   c                   sD   e Zd ZdZi fddZ fddZ fddZeZeZeZ	  Z
S )AttrDicta.  
    A case-insensitive dictionary with access via item, attribute, and call
    notations:

        >>> d = AttrDict()
        >>> d['Variable'] = 123
        >>> d['Variable']
        123
        >>> d.Variable
        123
        >>> d.variable
        123
        >>> d('VARIABLE')
        123
    c             C   s   t | | d S )N)dictrG   )rF   initr'   r'   r(   rG     s    zAttrDict.__init__c                s   t t| | S )N)superr   __getitem__rd   )rF   r]   )	__class__r'   r(   r     s    zAttrDict.__getitem__c                s   t t| | |S )N)r   r   __setitem__rd   )rF   keyr   )r   r'   r(   r     s    zAttrDict.__setitem__)rH   rI   rJ   rK   rG   r   r   __getattr____setattr____call____classcell__r'   r'   )r   r(   r   z  s   r   Fc          	   C   s  g }|s|ri }nt  }t| d}t|d}|dkr@td| t|d}	|	dkrVn|	dkr|rltd |r|t|d}
ntjd	d
}
|rtd|
j  |
d xt	|}|
t
dt| t|}|t|d 7 }|d}t| dkr>|
t
dt|d  |
t
dt||d  d  |
| P | }t||| }|
 t| d }|
t
dt|d  |
t
dt||d  d  |
| |
| qW |  |
}|d ntd|	 x.t|}|| d|kr|d rP qW |  i }x,|D ]$}|d dkr(|d ||d < q(W xP|D ]H}|d dkrVt|d |\}}|r||d< |d ||d  < qVW |rxV|D ]N}|d dkrtd td|d   td|d    td!|d"   P qW xf|D ]^}|d d#krtd td$|d%   td&|d'   td(|d)   td*|d+   P qW xV|D ]N}|d d,krntd td-|d.   td/|d0   td1|d2   P qnW x6|D ].}|d d3krtd td4|d5   P qW td td6t|  d7d8 |D }x2t|D ]&}|dkr(td9|||f  q(W td d|krtd: x&|D ]}td;|t|| f  qrW td |rx|D ]}|| ||< qW |S |S d<S )=a  
    Read an IDL .sav file.

    Parameters
    ----------
    file_name : str
        Name of the IDL save file.
    idict : dict, optional
        Dictionary in which to insert .sav file variables.
    python_dict : bool, optional
        By default, the object return is not a Python dictionary, but a
        case-insensitive dictionary with item, attribute, and call access
        to variables. To get a standard Python dictionary, set this option
        to True.
    uncompressed_file_name : str, optional
        This option only has an effect for .sav files written with the
        /compress option. If a file name is specified, compressed .sav
        files are uncompressed to this file. Otherwise, readsav will use
        the `tempfile` module to determine a temporary filename
        automatically, and will remove the temporary file upon successfully
        reading it in.
    verbose : bool, optional
        Whether to print out information about the save file, including
        the records read, and available variables.

    Returns
    -------
    idl_dict : AttrDict or dict
        If `python_dict` is set to False (default), this function returns a
        case-insensitive dictionary with item, attribute, and call access
        to variables. If `python_dict` is set to True, this function
        returns a Python dictionary with all variable names in lowercase.
        If `idict` was specified, then variables are written to the
        dictionary specified, and the updated dictionary is returned.

    rbr   s   SRzInvalid SIGNATURE: %ss    s    zIDL Save file is compressedzw+bz.sav)suffixz -> expanding to %ss   SR z>ll        r
   r   z>Ir   zInvalid RECFMT: %sr   rx   r   rw   rz   r   ry   r   z2--------------------------------------------------zDate: %sr{   zUser: %sr|   zHost: %sr}   r   z
Format: %sr~   zArchitecture: %sr   zOperating System: %sr   zIDL Version: %sr   r   z
Author: %sr   z	Title: %sr   zID Code: %sr   r   zDescription: %sr   z&Successfully read %i records of which:c             S   s   g | ]}|d  qS )rx   r'   )r   rr'   r'   r(   r   W  s    zreadsav.<locals>.<listcomp>z - %i are of type %szAvailable variables:z
 - %s [%s]N)r   openr-   rR   printtempfileNamedTemporaryFiler]   writer4   r0   packrk   r=   r*   r   r#   zlib
decompresslencloser$   r   rc   r   rd   setcountr   )	file_nameZidictZpython_dictZuncompressed_file_nameverboser   	variablesr%   	signatureZrecfmtZfoutrx   r   unknownr&   Z
rec_stringr   r   r   r   r   Zrectypesrtvarr'   r'   r(   r     s    (





"
"













)NFNF).
__future__r   r   r   __all__r0   numpyr.   numpy.compatr   r   r   rt   rf   r   r   r)   r,   r-   r2   r4   r6   r7   r9   r;   r=   r?   rA   rC   objectrD   rL   rP   rQ   rX   ri   rj   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   s   	*-/m/6B 