B
    Qa              %   @   s  d dl Z d dl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lmZmZmZmZmZmZmZ dZdgdgdddgd	d
dgdgddgdddgddgddgddgddgddddddd gd!gd"d#gd$gd%gd&d'd(gd)d*d+d,gd-d.d/d0d1gd2gd3gd4gd5gd6gd7gd8gd9gd:gd;d<gd=d>gd?d@gdAdBgdCgdDgdEgdFgdG$ZdHdIdJdKdLdMdNdOdPdQ	ZdRdIdSdKdTdUdVdWdPdQ	ZdXdXdYdZd[d\d]d^d_d`da
ZdbdcgZdRdSdTdUdVdWdPdIdKdddedfZdgdhdidjZdkdldmZddodpZddqdrZddsdtZddvdwZddxdyZ dzd{ Z!dd|d}Z"dd~dZ#dddZ$dddZ%dddZ&dd Z'dd Z(dd Z)dd Z*dddZ+dd Z,dddZ-dddZ.dddZ/dddZ0dddZ1dddZ2dddZ3dddZ4dddZ5dd Z6dS )    N)datasetUnitDictgeometrygiantIfgramStackgiantTimeseriesifgramStack
timeseriesHDFEOSg   JxޱAZazimuth_looksZrange_looksZazimuthPixelSizeZazimuth_pixel_spacingZaz_pixel_spacingZrangePixelSizeZrange_pixel_spacingZrg_pixel_spacingZcenter_timeZdataType	data_typeZearthRadiusearth_radius_below_sensorearth_radiusZHEADING_DEGheadingaltitude	SC_heightZnumber_bandsZbandsscheme
interleavelengthZFILE_LENGTHlinesazimuth_linesnlinesaz_sampinterferogram_azimuth_linesZpassDirectionZspacecraftNamesensorZpolarizationZprfZstartingRangeZnear_range_slcZ
near_rangeZ
wavelengthZ
WavelengthZradarWavelengthZradar_wavelengthwidthZWidthZsamples
range_sampinterferogram_widthref_dateZref_latZref_lonref_xref_yZ	subset_x0Z	subset_x1Z	subset_y0Z	subset_y1Z
corner_lonZcorner_eastZ
corner_latZcorner_northZpost_lonZ	post_eastZpost_latZ
post_northZswathNumberZfirstFrameNumberZlastFrameNumberZtrackNumber)$ZALOOKSZRLOOKSAZIMUTH_PIXEL_SIZERANGE_PIXEL_SIZECENTER_LINE_UTC	DATA_TYPEEARTH_RADIUSZHEADINGHEIGHTBANDS
INTERLEAVELENGTHORBIT_DIRECTIONPLATFORMZPOLARIZATIONPRFZSTARTING_RANGE
WAVELENGTHWIDTHREF_DATEREF_LATREF_LONREF_XREF_YSUBSET_XMINZSUBSET_XMAXSUBSET_YMINZSUBSET_YMAXX_FIRSTY_FIRSTX_STEPY_STEPZ
beam_swathZfirst_frameZ
last_frameZrelative_orbitBYTEuint16SHORTuint32INTFLOATDOUBLECFLOAT
complex128)	                     
      uint8int16int32float32float64	complex64r@   rA   rB   rC   rD   rE   rF   rG   rH   )
rI   int8r8   rJ   r:   rK   rL   rM   rN   r?   z.tifz.grdint64uint64)1234569Z12Z13Z14Z15BSQBILBIP)ZBANDZLINEPIXELzlittle-endianz
big-endian)0rR   Tc             C   s   d}t |tr"|d dd }nt |tr:|dd }t| |d}t|d t|d  }	}
|spdd|
|	f}tjtj	| d 
 }|dkrt| |||||d	}nt| ||||d
\}}|rtj||d}||fS )ad  Read one dataset and its attributes from input file.
    Parameters: fname       : str, path of file to read
                datasetName : str or list of str, slice names
                box         : 4-tuple of int area to read, defined in (x0, y0, x1, y1) in pixel coordinate
                x/ystep     : int, number of pixels to pick/multilook for each output pixel
                data_type   : numpy data type, e.g. np.float32, np.bool_, etc.
    Returns:    data        : 2/3-D matrix in numpy.array format, return None if failed
                atr         : dictionary, attributes of data, return None if failed
    Examples:
        from mintpy.utils import readfile
        data, atr = readfile.read('velocity.h5')
        data, atr = readfile.read('timeseries.h5')
        data, atr = readfile.read('timeseries.h5', datasetName='timeseries-20161020')
        data, atr = readfile.read('ifgramStack.h5', datasetName='unwrapPhase')
        data, atr = readfile.read('ifgramStack.h5', datasetName='unwrapPhase-20161020_20161026')
        data, atr = readfile.read('ifgramStack.h5', datasetName='coherence', box=(100,1100, 500, 2500))
        data, atr = readfile.read('geometryRadar.h5', datasetName='height')
        data, atr = readfile.read('geometryRadar.h5', datasetName='bperp')
        data, atr = readfile.read('100120-110214.unw', box=(100,1100, 500, 2500))
    Nr   -)datasetNamer&   r+   r@   )z.h5z.he5)r_   boxxstepystep	print_msg)r_   r`   ra   rb   )dtype)
isinstancelistsplitstrread_attributeintospathsplitextbasenamelowerread_hdf5_fileread_binary_filenparray)fnamer`   r_   rc   ra   rb   r	   Z
dsname4atratrr   r   fextdata rx   K/home/centos/operations/rsmas_insar/sources/MintPy/mintpy/utils/readfile.pyread   s2    


rz   c          
      s  t | }g }x(dd |D D ]}||kr|| qW dd |D fdd|D  sf|d g nt trv g tdd  D rfdd D   d d	d fd
d D }	dd |	D }	t| d$fdd d gD }
 fdd|D }t|
dkr$|
d  }n,t|dkr@|d  }nt	d
 | |jdkr||d |d |d |d f }|| dkrt|d |d  | }t|d |d  | }|t|d d|t|d d|f }|d|d|f }n|jdkrtj|jd tjd}|	r2|	dgkr@d|dd< n:dd fdd|D D }x|	D ]}d|||< qbW || dkr|||d |d |d |d f }n(t|d |d  | }t|d |d  | }t|}t|||f|j}t|d }xt|D ]}|rNtjdd|d  d| d  tj  ||| |d |d |d |d f }|t|d d|t|d d|f }|d|d|f ||ddddf< qW |rtd tdd |jD rt|}W dQ R X |S )a  
    Parameters: fname       : str, name of HDF5 file to read
                datasetName : str or list of str, dataset name in root level with/without date info
                    'timeseries'
                    'timeseries-20150215'
                    'unwrapPhase'
                    'unwrapPhase-20150215_20150227'
                    'HDFEOS/GRIDS/timeseries/observation/displacement'
                    'recons'
                    'recons-20150215'
                    ['recons-20150215', 'recons-20150227', ...]
                    '20150215'
                    'cmask'
                    'igram-20150215_20150227'
                    ...
                box         : 4-tuple of int area to read, defined in (x0, y0, x1, y1) in pixel coordinate
                x/ystep     : int, number of pixels to pick/multilook for each output pixel
    Returns:    data        : 2D/3D array
                atr         : dict, metadata
    c             S   s   g | ]}| d d qS )r^   r   )rg   ).0irx   rx   ry   
<listcomp>  s    z"read_hdf5_file.<locals>.<listcomp>c             S   s   g | ]}d |kr|qS )r^   rx   )r{   r|   rx   rx   ry   r}     s    c                s   g | ]}| kr|qS rx   rx   )r{   r|   )
ds_2d_listrx   ry   r}     s    r   c             s   s&   | ]}|  p|d d   V  qd S )NrC   )isdigit)r{   xrx   rx   ry   	<genexpr>(  s    z!read_hdf5_file.<locals>.<genexpr>c                s   g | ]}d   d |qS )z{}-{}r   )format)r{   r   )
ds_3d_listrx   ry   r}   )  s    r^   c                s   g | ]}|  d qS ) )replace)r{   r   )dsFamilyrx   ry   r}   -  s    c             S   s"   g | ]}| d r|dd qS )r^   r@   N)
startswith)r{   r   rx   rx   ry   r}   .  s    rc                s   g | ]}|   kr|qS rx   )keys)r{   r|   )frx   ry   r}   3  s    c                s"   g | ]}d   d |kr|qS )z/{}r   )r   )r{   r|   )r_   rx   ry   r}   4  s    z%input dataset {} not found in file {}rA   r@   rB   N)rd   r   Tc             S   s   g | ]}| d dd qS )r^   r@   )rg   )r{   r|   rx   rx   ry   r}   T  s    c                s   g | ]}|  r|qS rx   )r   )r{   j)r   rx   ry   r}   U  s    zreading slice /z...c             s   s   | ]}|d kV  qdS )r@   Nrx   )r{   r|   rx   rx   ry   r   {  s    )get_slice_listappendre   rh   allrg   h5pyFilelen
ValueErrorr   ndimrj   rr   zerosshapebool_indexsumrd   whererangesysstdoutwriteflushprintanysqueeze)rt   r_   r`   ra   rb   rc   
slice_listds_listr|   ZinputDateListdsNamesZ
dsNamesOlddsrw   xsizeysizeZ
slice_flag	date_listdZ	num_sliceindsZd2rx   )r_   r   r~   r   r   ry   rp     s    


"
,rp   c             C   s>  t jt j| d  }t| |d}|d }t|d }t|d }	|sXdd|	|f}|dd }
|d	d
 }t|dd}|dd }d}d}|dkr\ddddd}|
|	 kr||
 }
|d  
dd}|dkrtd|}|rN|dkrNd}nB|dkrJ|rB|dkr,d}n|dkr<d}nd}nd}n|d rt|rt|d!rttd|}n|d"krtd|}|rNd#| krNd}n|rN| d$krd}n| d%krd&}n~|d'rd}nl|d(krd}n\| d)krd)}nH| d*rd*}n2|d+r.d}n t| }||krN||d }t||}n|d,krd}d
}d}
d}|d-krd}d}nh|d.krd}
nX|d/krd}
d}nD|d0krd1}
n4|d2krd3}
n$|d4krd}|r|d5rd}n|d6krd}|d	d7}d}
|d8krn`|d.kr.d}
nP|d9kr\d}
d:}d}|r~|d5r~d}n"|d;krpd<}
d}n|d=krd
}nb|d>kr|dd? }|d	d7}d@|	 kr|d@ dAkrd
}n|dBkrntdC| |dBkrt| |||||dD}n"t| ||	f||
|||||||dE}d|kr6|
|d< ||fS )Fa  Read data from binary file, such as .unw, .cor, etc.
    Parameters: fname       : str, path/name of binary file
                datasetName : str, dataset name for file with multiple bands of data
                    e.g.: incidenceAngle, azimuthAngle, rangeCoord, azimuthCoord, ...
                box         : 4-tuple of int area to read, defined in (x0, y0, x1, y1) in pixel coordinate
                x/ystep     : int, number of pixels to pick/multilook for each output pixel
    Returns:    data        : 2D array in size of (length, width) in BYTE / int16 / float32 / complex64 / float64 etc.
                atr         : dict, metadata of binary file
    r@   )r_   	PROCESSORr&   r+   r   r!   rL   
BYTE_ORDERzlittle-endianr$   rR   r%   rZ   phase)iscerO   rM   rN   )bytefloatdoublecfloat	FILE_TYPE.r   )unwcorrA   )Zband1	intensity	magnitude)Zslc)	amplituder   r   r   )band2r   complexlos)r   azhead)ZincLocallocalr   Zband3rB   )magZamp)r   anglerealimag)cpxr   )roipac)z.unwz.corz.hgtz.msk)z.int)z.amp)z.demz.wgs84rJ   )z.flgz.bytr   )z.trans)r   Zazimuthgammaz
big-endian)z.unwz.corz.hgt_simz.demz.ampz.ramp)z.utm_to_rdcr[   z.slc	complex32)z.mlisnaprY   z
byte orderr]   )gdalZgmtsarZhyp3ZcosicorrzUnknown InSAR processor: {})r`   bandcpx_bandra   rb   )
r   r`   r	   
byte_ordernum_bandr   r   r   ra   rb   )rk   rl   rm   rn   ro   ri   rj   getupperr   r   minr   r   r   r   r   	read_gdalread_binary)rt   r_   r`   ra   rb   rv   ru   	processorr   r   r	   r   r   r   r   r   dataTypeDictkr   rw   rx   rx   ry   rq     s   



























rq   Fc       
   	      s  t jt j| \}}| }x|dkr<t j|\}}q"W |sF|}t| }|d }|dkrt| d  fdd  D }W dQ R X |dkr||krt	| }|j
d	d
 |jaq|dkr||krt| }|j
d	d
 |jan|dkrt| }|j
d	d
 |jan|dkr4t| }|j
d	d
 |jan|dkrZt| }|j
d	d
 |jant|dkrt| }|j
d	d
 |janNt|d t|d  fdd}g at| d  | W dQ R X nt|dd}	|dkrddgan|dr|	dkrddgan|dkr(ddgan|d krJ|rBddgand!ganj|d"rt|d#krt|	dkrtd$d%gan@|d"r| d&r|	d'krd(d)d*gand+d t|	D atS ),z2Get list of 2D slice existed in file (for display))z.geoz.rdrz.fullz.wgs84z.grdr   )z.h5z.he5r   c                s    g | ]}t  | tjr|qS rx   )re   r   Dataset)r{   r|   )r   rx   ry   r}   \  s    z"get_slice_list.<locals>.<listcomp>Nr   F)rc   )r   )r   )r   )r   )r   r&   r+   c                s|   t |tjrx|jdd  fkrx|jdkr8t  n@|jdkrdt fddt|jd D 7 ant	d
|j  d S )NrA   rB   c                s   g | ]}d   |d qS )z{}-{}r@   )r   )r{   r|   )namerx   ry   r}     s    z?get_slice_list.<locals>.get_hdf5_2d_dataset.<locals>.<listcomp>r   z#file has un-defined {}D dataset: {})re   r   r   r   r   r   r   r   warningswarnr   )r   obj)r   r   )r   ry   get_hdf5_2d_dataset~  s    "

"z+get_slice_list.<locals>.get_hdf5_2d_datasetr$   rR   )z.transz.utm_to_rdc
rangeCoordazimuthCoordr   rA   incidenceAngleazimuthAngle)z.unwr   r   )z.intz.slcr   off)z.bipazimuthOffsetrangeOffsetzcov.biprB   ZazimuthOffsetVarZrangeOffsetVarZoffsetCovarc             S   s   g | ]}d  |d qS )zband{}r@   )r   )r{   r|   rx   rx   ry   r}     s    )rk   rl   rm   rn   ro   ri   r   r   r   r   open	sliceListr   r   r   r   r   r   rj   
visititemsr   r   endswithr   )
rt   Z
no_complexfbaserv   ru   r   d1_listr   r   r   rx   )r   r   r   ry   r   K  sr    

 




	






 
"r   c          	      s   |r
|gS t j| d  }|dkr~t| }t|d t|d    fdd}g at| d}|	| W dQ R X nt
| atS )	zCGet list of 2D and 3D dataset to facilitate systematic file readingr@   )z.h5z.he5r&   r+   c                s0   t |tjr,|jdd   fkr,t|  d S )Nr   )re   r   r   r   r   r   )r   r   )r   r   rx   ry   get_hdf5_dataset  s    "z*get_dataset_list.<locals>.get_hdf5_datasetr   N)rk   rl   rm   ro   ri   rj   r   r   r   r   r   )rt   r_   rv   ru   r   r   rx   )r   r   ry   get_dataset_list  s    r   c          	   C   sV   t j| d  }|dkr dS d}t| d }t| d}|| j}W dQ R X |S )z+Get the compression type of input HDF5 filer@   )z.h5z.he5Nr   r   )rk   rl   rm   ro   r   r   r   compression)rt   extr   ds_namer   rx   rx   ry   get_hdf5_compression  s    r   c          	      s
	  t jt j| \}}| }t j| sNd| }|dt   7 }t||dkr|rj|	dd }t
| d<tj}fdd D fd	d D  W d
Q R X dddg}t fdddD rd}nt fdddD rd}nt fdddD rd}nt fdddD r:d}ndkrJd}nd krZd}nt fdddD rxd }ntfd!d|D rttt|@ d }nPd"|kr|d" }n<t dkrֈ d }n$tdkrd }ntd#|  |dkrt|  }n|d kr*t|  }nt|dkrd$| kr|r| krt
| d|t| j W d
Q R X n\d%d& }	g at
| d|	 W d
Q R X trd'd tD }
tt|
 }n
td(| x>| D ]2\}}y|d)||< W n   |||< Y nX qW t||d"< d
}t
| d`|r\| kr\| }n$d*d+ }g a| trtd }|d
k	rt|j |d,< W d
Q R X d-| kr|d- |d.< d.| krd/|d.< nD|d0kri }d1|d2< d3|d$< d4|d5< d6|d7< d8|d9< d8|d:< t!|d
d; t!|d;d
  }}|d< d= |d>< |d? |d@< dA|d.< ||d"< dB|d,< dC|dD< dE|dF< dG|dH< t j"| |d2 |d$  dI krdJ}|dK|d2 |d$ |d, 7 }t|nH| dL | dM | dN t j| d dO | dP | dQ g}dRd |D }r,fdSd|D }t|dkrZ|t#krL| g}nt$dT| i }| %dUrtdVd |D rdW|d.< ntdXd |D rdY|d.< dZd |D }t|dkr0|t&|d  n\td[d |D rd\|d.< n>td]d |D rd.| kr0d^|d.< n|t#kr0d_|d.< d.| krFd/|d.< |d }t j|d` }x |dakr~t j|\}}q`W |s|}|dLkr|t'| d"| kr||d"< n|dMkr|t&| d"| kr||d"< n|dNkr|t(| ||d"< n|dOkr|t)| |d. dWkrt j|  }|*dbrZdc|d"< nL|*ddrpde|d"< n6|*dfrdg|d"< n dh|krdh|d"< n|di |d"< n||d"< n&|dPgt# kr|t+| ||d"< djdBdkdldm}|,d,dn }|dnkr|| kr|| |d,< |r,|-dodp}|d" -dqdp}|dkrr|rh|t. krht.| |dH< ndr|dH< nT|r|t. krt.| |dH< n2dH| kr|t. krt.| |dH< nds|dH< dt| krdu| kr|dt |du< t j/| |dt< t0|}|S )va  Read attributes of input file into a dictionary
    Parameters: fname : str, path/name of data file
                datasetName : str, name of dataset of interest, for file with multiple datasets
                    e.g. unwrapPhase in ifgramStack.h5
                         coherence   in ifgramStack.h5
                         height      in geometryRadar.h5
                         latitude    in geometryRadar.h5
                         ...
    Returns:    atr : dict, attributes dictionary
    zinput file not existed: {}
zcurrent directory: )z.h5z.he5r^   r   r   c                s    g | ]}t  | tjr|qS rx   )re   r   Group)r{   r|   )r   rx   ry   r}     s    z"read_attribute.<locals>.<listcomp>c                s.   g | ]&}t  | tjr | jd kr|qS )rA   )re   r   r   r   )r{   r|   )r   rx   ry   r}     s    NZinterferograms	coherencewrappedc             3   s   | ]}| kV  qd S )Nrx   )r{   r|   )r   rx   ry   r     s    z!read_attribute.<locals>.<genexpr>)unwrapPhaser   r   r   c             3   s   | ]}| kV  qd S )Nrx   )r{   r|   )r   rx   ry   r     s    )heightlatituder   r   c             3   s   | ]}|  kV  qd S )Nrx   )r{   r|   )r   g1_listrx   ry   r     s    )r   r   c             3   s   | ]}| kV  qd S )Nrx   )r{   r|   )r   rx   ry   r     s    )velocityr   r   reconsr   c             3   s   | ]}| kV  qd S )Nrx   )r{   r|   )r   rx   ry   r     s    )igramfigramr   c             3   s   | ]}| kV  qd S )Nrx   )r{   r|   )r   rx   ry   r     s    r   zunrecognized file type: r+   c             S   s0   t |jdkr,d|j kr,tt|j d S )Nr   r+   )r   attrsr   atr_listr   dict)r   r   rx   rx   ry   get_hdf5_attrs  s    z&read_attribute.<locals>.get_hdf5_attrsc             S   s   g | ]}t |qS rx   )r   )r{   r|   rx   rx   ry   r}   )  s    z!No attribute WIDTH found in file:utf8c             S   s$   t |tjr |jdkr t| d S )NrA   )re   r   r   r   r   r   )r   r   rx   rx   ry   r   B  s    z(read_attribute.<locals>.get_hdf5_datasetr!   ZINSAR_PROCESSORr   mintpyz.dehmip  r&   i(#  g2.Z r6   g2.Z ?r5   degreesY_UNITX_UNITrA   g      ?g      ?r4   g      Y@r3   ZGSIrL   ZLATLONZ
PROJECTIONZWGS84ZGEODETIC_DATUMmZUNITrC   zAinput DEHM file size do NOT match with the pre-defined 10m DEHM: z{} * {} in {}!z.rscz.xmlz.parz.hdrz.vrtz.aux.xmlc             S   s   g | ]}t j|r|qS rx   )rk   rl   isfile)r{   r|   rx   rx   ry   r}   |  s    c                s   g | ]}|  r|qS rx   )r   )r{   r|   )metafile_extrx   ry   r}     s    z(No metadata file found for data file: {}z.imgc             s   s   | ]}| d V  qdS )z.hdrN)r   )r{   r|   rx   rx   ry   r     s    r   c             s   s   | ]}| d V  qdS ))z.xmlz.hdrz.vrtN)r   )r{   r|   rx   rx   ry   r     s    r   c             S   s   g | ]}| d r|qS )z.xml)r   )r{   r|   rx   rx   ry   r}     s    c             s   s   | ]}| d V  qdS )z.parN)r   )r{   r|   rx   rx   ry   r     s    r   c             s   s   | ]}| d V  qdS )z.rscN)r   )r{   r|   rx   rx   ry   r     s    r   r   r@   )z.geoz.rdrz.fullz.wgs84z.grdr   z.unw)Zcohr   z.corZ	phase_ifgz.intdemz	file typerO   rM   rN   )r   r   r   r   noneZStdr   r   radianrR   Z	FILE_PATHZOG_FILE_PATH)1rk   rl   rm   rn   ro   r  r   getcwd	Exceptionrg   r   r   r   r   r   r   rf   setr   r   r   get_metadatar   updater   r   rr   argmaxitemsdecoderh   r   rd   r   getsizeGDAL_FILE_EXTSFileNotFoundErrorr   read_isce_xmlread_roipac_rscread_gamma_parread_envi_hdrr   read_gdal_vrtr   r   r   abspathstandardize_metadata)rt   r_   r  r   rv   msgru   Zpy2_mintpy_stack_filesr   r   Znum_listkeyvaluer   r   yyxxZ	metafilesZ	xml_filesZmetafileZmeta_extr   r	   rx   )r   r   r   r  ry   ri     sp   


 








 




""

 

















ri   c                s   dkrt t x t|  D ]\}}||< q W fdd D  fdd D }xB|D ]:}| } fdd|D }t|dkrf|d  |< qfW S )zQConvert metadata input ROI_PAC/MintPy format (for metadata with the same values).Nc                s   g | ]}|   kr|qS rx   )r   )r{   r|   )standardKeysrx   ry   r}     s    z(standardize_metadata.<locals>.<listcomp>c                s   g | ]}|   kr|qS rx   )r   )r{   r|   )metaDictrx   ry   r}   	  s    c                s   g | ]}| kr|qS rx   rx   )r{   r|   )in_keysrx   ry   r}     s    r   )standardMetadataKeysr   iterr  r   r   )Z
metaDictInr#  r  r   Zstd_keysZstd_keyZ	cand_keysrx   )r%  r$  r#  ry   r    s    
r  =c          	   C   s  i }i }d}g }dd }d}t j| rHt| d}	|	 }W dQ R X nt| tr\| d}x|D ]}
|
 }
dd |
|d	D }t	|d
k s|

dr|

dri }d}n&|r|

ds|

dsd}|| qb|d }t|d	 dddd  }t j|}t j|}|dkr(|||< |rb||r@|||< qbd}|| |||< qbW |rj|| t	|dkrt||d< |S )a  Reads the template file into a python dictionary structure.
    Parameters: fname : str
                    full path to the template file
                delimiter : str
                    string to separate the key and value
                print_msg : bool
                    print message or not
    Returns:    template_dict : dict
                    file content
    Examples:
        tmpl = read_template(KyushuT424F610_640AlosA.template)
        tmpl = read_template(R1_54014_ST5_L0_F898.000.pi, ':')
    Fc             S   s.   |  d}|d krdS |d dko,t|dkS )Nr   Fr   plotr@   )rg   r   )Z	attributetokensrx   rx   ry   is_plot_attribute.  s    
z(read_template.<locals>.is_plot_attributeNr   
c             S   s   g | ]}|  qS rx   )strip)r{   r|   rx   rx   ry   r}   @  s    z!read_template.<locals>.<listcomp>r@   rA   )%#!>Tr.  r/  r   r   plotAttributes)rk   rl   r  r   	readlinesre   rh   rg   r-  r   r   r   r   
expanduser
expandvarsjsondumps)rt   	delimiterrc   Ztemplate_dictZplotAttributeDictZinsidePlotObjectr2  r+  r   r   linecr  r   rx   rx   ry   read_template  sL    



 




r;   c       	   	   C   s   t | d}| }W dQ R X i }xR|D ]J}dd | dd|dD }|d }|d d	d
 }|||< q(W t|}|S )aa  Read ROI_PAC .rsc file into a python dict structure.
    Parameters: fname : str.
                    File path of .rsc file.
    Returns:    rscDict : dict
                    Dictionary of keys and values in RSC file.
    Examples:
        from mintpy.utils import readfile
        atr = readfile.read_roipac_rsc('filt_101120_110220_c10.unw.rsc')
    r   Nc             S   s   g | ]}|  qS rx   )r-  )r{   r|   rx   rx   ry   r}   ~  s    z#read_roipac_rsc.<locals>.<listcomp>	r<  r@   r   r,  r   )r   r3  r-  r   rg   r  )	rt   r8  r   r   ZrscDictr9  r:  r  r   rx   rx   ry   r  m  s    
"r  :c       
   	   C   s   t | d}| |d }W dQ R X i }xz|D ]r}dd | |dD }t|dk sd|drjt q0|d }t|d d	d
dd  d  }	|	||< q0W t	|}t
|}|S )a  Read GAMMA .par/.off file into a python dict structure.
    Parameters: fname : str.
                    File path of .par, .off file.
                delimiter : str, optional
                    String used to separate values.
                skiprows : int, optional
                    Skip the first skiprows lines.
    Returns:    parDict : dict
                    Attributes dictionary
    r   Nc             S   s   g | ]}|  qS rx   )r-  )r{   r|   rx   rx   ry   r}     s    z"read_gamma_par.<locals>.<listcomp>r@   rA   )r.  r/  r   r,  r   r/  )r   r3  r-  rg   r   r   nextrh   r   attribute_gamma2roipacr  )
rt   r8  skiprowsr   r   ZparDictr9  r:  r  r   rx   rx   ry   r    s    
(r  c                s  t  }x t|  D ]\ }|| < qW x2|  D ]& t fdddD r2|  |d< q2W x2|  D ]& t fdddD rf|  |d< qfW d  |  krt|  }tt| |d	< d
  |  krt|  }t||d< d}||  krt|| }t|| |d< d  |  kr2|  |d< d  |  krt|  }d|  k rhdk sn d|  k rdk rn n
d|d< nd|d< d  |  krt|  }d|  k rdk rn n
d|d< nd|d< |S )z2Convert Gamma metadata into ROI_PAC/MintPy format.c             3   s   | ]}  |V  qd S )N)r   )r{   r|   )r  rx   ry   r     s    z)attribute_gamma2roipac.<locals>.<genexpr>)r   r   r   r   r&   c             3   s   | ]}  |V  qd S )N)r   )r{   r|   )r  rx   ry   r     s    )r   r   r   r+   Zradar_frequencyr*   r
   r"   Zsar_to_earth_centerr#   r   r(   r   i  ih  iZ   Z	ascendingr'   Z
descendingZazimuth_angler      z-1ANTENNA_SIDErR   )r   r'  r  r   r   r   rh   SPEED_OF_LIGHT)Zpar_dict_inZpar_dictr   ReZkey2rx   )r  ry   r@    sJ    6

r@  c             C   sX  t |  }i }|jdrx0|dD ]"}|d}|dj}|||< q*W xt	ddgddgD ]\}}|d	
|}t|d
dj}t|ddj}	t|dk rdt|dkrd||d
|< |	|d  |d
|< d|d
|< qdW nT|jdkrL|d}
x,|
dD ]}|d}|j}|||< qW t|d  |d< t|}|S )z1Read ISCE .xml file into a python dict structure.imagepropertyr   r   Zcoordinate1Zcoordinate2XYz./component[@name='{}']z./property[@name='delta']z!./property[@name='startingvalue']g      ?gHz>z{}_STEPg       @z{}_FIRSTr  z{}_UNITZ
PAMDatasetz./Metadata[@domain='ENVI']ZMDIr  r	   )ETparseZgetroottagr   findallr   findtextzipr   r   absENVI2NUMPY_DATATYPEr  )rt   rootZxmlDictchildr  r   Z
coord_nameprefixZv_stepZv_firstmetarx   rx   ry   r    s0    


r  c             C   s   t | dd}t|dd |d< t|dd |d< d	| krd
d |d	 dD }tt|d }tt|d d }t|dk rt|dkrd|d< d|d< t||d< t||d< tt|d |d  |d< tt|d |d  |d< t	|}|S )z0Read ENVI .hdr file into a python dict structurer(  )r8  z	data typerU   r!   z
byte orderrR   r   zmap infoc             S   s$   g | ]}| d d dd qS ){r   })r   r-  )r{   r|   rx   rx   ry   r}     s    z!read_envi_hdr.<locals>.<listcomp>,rD   rE   g      g      ?gHz>r  r  r  r5   r6   rB   g       @r3   rC   r4   )
r;  rS  r   ENVI_BYTE_ORDERr   rg   rR  r   rh   r  )rt   ru   Zmap_infox_stepy_steprx   rx   ry   r    s     r  c             C   s  yddl m}m} W n tk
r0   tdY nX || |j}i }|j|d< |j|d< |j|d< |	dj
}t| |d< |d	d
d}t| |d
< | }|d }|d }	t|d }
t|d d }|
|d< ||d< ||
d  |d< |	|d  |d< |j| d}|dd|d< | }|r\d|kr\|dd  |d< d|d< d|d< nJt|
dk rt|
dkrd |d< d |d< |d d!kr|d  d"8  < t|}|S )#zRead GDAL .vrt file into a python dict structure using gdal

    Modified from $ISCE_HOME/applications/gdal2isce_xml.gdal2isce_xml() written by David Bekaert.
    r   )r   osrzCannot import gdal and osr!r+   r&   r$   r@   r!   ZIMAGE_STRUCTUREr%   r\   rB   rD   g      r5   r6   g       @r3   r4   )ZwktZ	AUTHORITYZEPSGZUTMzUTM zoneZUTM_ZONEZmetersr  r  g      ?gHz>r  g     f@g     v@)osgeor   r^  ImportErrorOpenGA_ReadOnlyRasterXSizeRasterYSizeZRasterCountGetRasterBandDataTypeGDAL2ISCE_DATATYPEZGetMetadatar   ENVI_BAND_INTERLEAVEZGetGeoTransformrR  ZSpatialReferenceZGetProjectionZGetAttrValueZGetNamerg   r-  r  )rt   r   r^  r   ru   r	   r   	transformx0Zy0r\  r]  ZsrsZsrs_namerx   rx   ry   r  &  sH    



r  c       	   	   C   s   t | d}| }W dQ R X i }xR|D ]J}dd | dd|dD }|d }|d d	d
 }|||< q(W t|}t|}|S )zRead GMTSAR .prm file into a python dict structure.
    Parameters: fname : str.
                    File path of .rsc file.
    Returns:    prmDict : dict
                    Dictionary of keys and values in the PRM file.
    r   Nc             S   s   g | ]}|  qS rx   )r-  )r{   r|   rx   rx   ry   r}   p  s    z#read_gmtsar_prm.<locals>.<listcomp>r=  r<  r@   r   r,  r   )r   r3  r-  r   rg   attribute_gmtsar2roipacr  )	rt   r8  r   r   ZprmDictr9  r:  r  r   rx   rx   ry   read_gmtsar_prmb  s    
"rm  c             C   s*  t  }x t|  D ]\}}|||< qW d}||  kr^|| }| dkrVd|d< nd|d< d}||  krt|| }t|d }t|d }t|d	 }|| | ||  }||d
< d}||  krt|| }t| d |d< t|d t|d  d }	|	t|	 }
t|
d d d |d< |S )zXConvert GMTSAR metadata into ROI_PAC/MintPy format (for metadata with different values).ZlookdirRz-1rD  rR   ZSC_velr   r)   r   r   Zrng_samp_rateg       @r   ZSC_clock_startZSC_clock_stopg      8@g      N@r    )	r   r'  r  r   r   r   rE  rj   rh   )Zprm_dict_inZprm_dictr  r   ZvelrF  r)   r   Zaz_pixel_sizeZ	dt_centerZt_centerrx   rx   ry   rl  {  s2    
rl  lr   c             C   s  |\}}|sdd||f}|dkr`t d|\}}t|dkrT|d }tt|d }d||}| }|dkrtj| ||d | | d	d
|| }||d |d ||d  |d  ||d  |d  f }n|dkr>tj| ||d | | d	d
|| }||d |d t	|d |d | | d f }n~|dkrtj| ||d ||d   | d	d
|}|||d  |d  ||d  |d  |d |d f }n
t
d||dddr@|dr|j}n\|dr|j}nH|drt|}n0|dr(t|}n|dr6n
t
d||	|
 dkrt|d |d  |	 }t|d |d  |
 }|t|
d d|
t|	d d|	f }|d|d|f }|S )a  Read binary file using np.fromfile.

    Parameters: fname : str, path/name of data file to read
                shape : tuple of 2 int in (length, width)
                box   : tuple of 4 int in (x0, y0, x1, y1)
                data_type : str, data type of stored array, e.g.:
                    bool_
                    int8, int16, int32
                    float16, float32, float64
                    complex64, complex128
                byte_order      : str, little/big-endian
                num_band        : int, number of bands
                interleave : str, band interleav type, e.g.: BIP, BIL, BSQ
                band     : int, band of interest, between 1 and num_band.
                cpx_band : str, e.g.:
                    real,
                    imag, imaginary
                    phase,
                    mag, magnitude
                    cpx
                x/ystep  : int, number of pixels to pick/multilook for each output pixel
    Returns:    data     : 2D np.array
    Examples:   # ISCE files
                atr = read_attribute(fname)
                shape = (int(atr['LENGTH']), int(atr['WIDTH']))
                data = read_binary('filt_fine.unw', shape, num_band=2, band=2)
                data = read_binary('filt_fine.cor', shape)
                data = read_binary('filt_fine.int', shape, data_type='complex64', cpx_band='phase')
                data = read_binary('burst_01.slc', shape, data_type='complex64', cpx_band='mag')
                data = read_binary('los.rdr', shape, num_band=2, band=1)
    r   )bbigz
big-endianzieee-bez	(\d+|\D+)r@      z>{}{}rZ   rB   )rd   countr_  rA   r[   rY   zunrecognized band interleaving:r1  r   r:  r   r   phar   zunrecognized complex band:N)rerN  r   rj   r   r   rr   fromfilereshapearanger   r   r   r   r   r   absolute)rt   r   r`   r	   r   r   r   r   r   ra   rb   r   r   letterZdigitrw   r   r   rx   rx   ry   r     s`    " .
 &
$(
     
r   c             C   s  yddl m} W n tk
r,   tdY nX || |j}||}|sZdd|j|jf}| |d |d |d |d f }	t	|j
 }
|
ddd	r|d
r|	j}	nT|dr|	j}	nB|drt|	}	n,|drt|	}	n|drn
td||| dkrt|d |d  | }t|d |d  | }|	t|d d|t|d d|f }	|	d|d|f }	|	S )a  Read binary data file using gdal.

    Parameters: fname    : str, path/name of data file to read
                box      : tuple of 4 int in (x0, y0, x1, y1)
                band     : int, band of interest, between 1 and num_band.
                cpx_band : str, e.g.: real, imag, phase, mag, cpx
                x/ystep  : int, number of pixels to pick/multilook for each output pixel
    Returns:    data     : 2D np.array
    r   )r   zCannot import gdal!r@   rB   rA   r1  r   r:  r   r   rt  r   )r   r   zunrecognized complex band:N)r`  r   ra  rb  rc  rf  rd  re  ZReadAsArrayrh  rg  r   r   r   r   rr   r   ry  r   rj   )rt   r`   r   r   ra   rb   r   r   Zbndrw   r	   r   r   rx   rx   ry   r     s:    

(






r   c       
      C   s   t | }d| krd|d< tt|d }tt|d }|sLdd||g}d}|dkr\d}tj| ||d	 d
 | d|d	 d
| }||d |d	 |d |d
 f }||d |d	 ||d  ||d
  f }	||	|fS )a  Reads roi_pac data (RMG format, interleaved line by line).

    ROI_PAC file: .unw, .cor, .hgt, .trans, .msk

    RMG format (named after JPL radar pionner Richard M. Goldstein): made
    up of real*4 numbers in two arrays side-by-side. The two arrays often
    show the magnitude of the radar image and the phase, although not always
    (sometimes the phase is the correlation). The length and width of each
    array are given as lines in the metadata (.rsc) file. Thus the total
    width width of the binary file is (2*width) and length is (length), data
    are stored as:
    magnitude, magnitude, magnitude, ...,phase, phase, phase, ...
    magnitude, magnitude, magnitude, ...,phase, phase, phase, ...
    ......

       box  : 4-tuple defining the left, upper, right, and lower pixel coordinate.
    Example:
       a,p,r = read_float32('100102-100403.unw')
       a,p,r = read_float32('100102-100403.unw',(100,1200,500,1500))
    r!   Zrmgr+   r&   r   f4)rp  rq  z
big-endianzieee-bez>f4rB   rA   )rd   rs  r@   )ri   r   rj   r   rr   rv  rw  )
rt   r`   r   ru   r   r   r	   rw   r   r   rx   rx   ry   read_float32@  s$    $r|  c             C   s   t | }d| krd|d< tt|d }tt|d }|sLdd||g}d}|dkr\d}tj| ||d	 | d
|d	 |}||d |d	 |d |d f }||fS )z@Read real float64/double data matrix, i.e. isce lat/lon.rdr
    r!   rM   r+   r&   r   f8)rp  rq  z
big-endianzieee-bez>f8rB   )rd   rs  r@   rA   )ri   r   rj   r   rr   rv  rw  )rt   r`   r   ru   r   r   r	   rw   rx   rx   ry   read_real_float64m  s     r~  c       
      C   s   t | }d| krd|d< tt|d }tt|d }|sLdd||g}d}|dkr\d}tj| ||d	 | d
|d	 |}||d |d	 |d |d f }|dkrt|}	n8|dkrt|}	n$|dkr|j	}	n|dkr|j
}	n|}	|	|fS )ac  Read complex float 32 data matrix, i.e. roi_pac int or slc data.
    old name: read_complex64()

    ROI_PAC file: .slc, .int, .amp

    Data is sotred as:
    real, imaginary, real, imaginary, ...
    real, imaginary, real, imaginary, ...
    ...

    Parameters: fname : str,
                    input file name
                box : 4-tuple
                    defining (left, upper, right, lower) pixel coordinate.
                byte_order : str, optional
                    order of reading byte in the file
                band : str
                    output format, default = phase
                    phase, amplitude, real, imag, complex
    Returns: data : 2D np.array in complex float32
    Example:
        amp, phase, atr = read_complex_float32('geo_070603-070721_0048_00018.int')
        data, atr       = read_complex_float32('150707.slc', 1)
    r!   rN   r+   r&   r   Zc8)rp  rq  z
big-endianzieee-bez>c8rB   )rd   rs  r@   rA   r   r   r   r   )ri   r   rj   r   rr   rv  rw  r   ry  r   r   )
rt   r`   r   r   ru   r   r   r	   rw   ZdataOutrx   rx   ry   read_complex_float32  s2    r  c             C   s   t | }d| krd|d< tt|d }tt|d }|sLdd||g}d}|dkr\d}tj| ||d	 | d
|d	 |}||d |d	 |d |d f }||fS )a  Read real float 32 data matrix, i.e. GAMMA .mli file
    Parameters: fname     : str, path, filename to be read
                byte_order : str, optional, order of reading byte in the file
    Returns: data : 2D np.array, data matrix
             atr  : dict, attribute dictionary
    Usage: data, atr = read_real_float32('20070603.mli')
           data, atr = read_real_float32('diff_filt_130118-130129_4rlks.unw')
    r!   rL   r+   r&   r   r{  )rp  rq  z
big-endianzieee-bez>f4rB   )rd   rs  r@   rA   )ri   r   rj   r   rr   rv  rw  )rt   r`   r   ru   r   r   r	   rw   rx   rx   ry   read_real_float32  s     	r  c             C   sT  t | }d| krd|d< tt|d }tt|d }|sLdd||g}d}|dkr\d}tj| ||d	 d
 | d|d	 d
| }||d |d	 d
|d  d
|d
  f  }tdt	|d
}	||	d  |d	 |d  |d
 |d  }
||	 |d	 |d  |d
 |d  }|r.|
||fS t
||
}t||
}|||fS dS )am  Read complex int 16 data matrix, i.e. GAMMA SCOMPLEX file (.slc)

    Gamma file: .slc

    Inputs:
       file: complex data matrix (cpx_int16)
       box: 4-tuple defining the left, upper, right, and lower pixel coordinate.
    Example:
       data,rsc = read_complex_int16('100102.slc')
       data,rsc = read_complex_int16('100102.slc',(100,1200,500,1500))
    r!   r   r+   r&   r   i2)rp  rq  z
big-endianzieee-bez>i2rB   rA   )rd   rs  r@   N)ri   r   rj   r   rr   rv  rw  flattenrx  r   hypotarctan2)rt   r`   r   r   ru   r   r   r	   rw   Zodd_idxr   r   r   r   rx   rx   ry   read_complex_int16  s2    $ 
r  c             C   s   t | }d| krd|d< tt|d }tt|d }|sLdd||g}d}|dkr\d}tj| ||d	 | d
|d	 |}||d |d	 |d |d f }||fS )Nr!   rJ   r+   r&   r   r  )rp  rq  z
big-endianzieee-bez>i2rB   )rd   rs  r@   rA   )ri   r   rj   r   rr   rv  rw  )rt   r`   r   ru   r   r   r	   rw   rx   rx   ry   read_real_int16  s     r  c             C   s   |  dr| dd d }n| d }t|dd }d| krLd|d< tt|d }tt|d }|s|dd||g}tj| tj|d	 | d
	|d	 |}||d |d	 |d |d f }||fS )zuRead binary file with flags, 1-byte values with flags set in bits
    For ROI_PAC .flg, *_snap_connect.byt file.
    z_snap_connect.bytr   z.unw.rscz.rscr!   boolr+   r&   rB   )rd   rs  r@   rA   )
r   rg   ri   r   rj   r   rr   rv  r   rw  )rt   r`   ZrscFileru   r   r   rw   rx   rx   ry   	read_bool  s     
r  c       	      C   s   t j| tddtd d df }g }x|D ]}|| q,W t j| dd}|d d df }t |d d df }t |d d df }t |d d df }|||||fS )	N)r   r@   )rd   usecolsr   )r@   rA   rB   rC   )r  r@   rA   rB   )rr   loadtxtbytesastyperh   r   rs   )	rt   yyyymmddZYYYYMMDDyrw   datesZnorthZeastuprx   rx   ry   read_GPS_USGS6  s    
r  )NNTr@   r@   N)NNr@   r@   T)NNr@   r@   )F)N)NN)N)r(  T)r<  )r>  rB   )r(  )	NrL   ro  r@   rZ   r@   r   r@   r@   )Nr@   r   r@   r@   )Nro  )Nro  )Nro  r   )Nro  )Nro  F)Nro  )N)7rk   r   ru  r   Zdefusedxml.ElementTreeZElementTreerK  r   r6  numpyrr   mintpy.objectsr   r   r   r   r   r   r   rE  r&  rh  ZGDAL2NUMPY_DATATYPEZNUMPY2GDAL_DATATYPEr  rS  ri  r[  rz   rp   rq   r   r   r   ri   r  r;  r  r  r@  r  r  r  rm  rl  r   r   r|  r~  r  r  r  r  r  r  rx   rx   rx   ry   <module>
   s   $

9
;
 
 K
`

  ,

W

 @%<
)  
\
>
-

:

-

