U
     c4                 .   @   s  d dl 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	 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 dlmZ d dlmZmZ dZdgdgdd	d
dgddddgdgddgdddgdddgddgddgddgdd d!d"d#d$d%d&gd'gd(gd)gd*gd+gd,gd-gd.gd/d0gd1gd2d3d4gd5gd6d7gd8d9d:d;gd<d=d>d?gd@dAdBdCdDdEgdFgdGgdHgdIgdJgdKgdLgdMgdNgdOdPgdQdRgdSdTgdUdVgdWgdXgdYgdZgd[-Zd\d]d^d_d`dadbdcdddedfdgZdhdidjdkdldmdndodpdqdrdsZd\dcd]ddd^d_d`dtdudadbdvZdwdwdxdydzd{d|d}d~ddddZ d\d]d^d_d`dadZ!dddddddZ"dddgZ#ddddZ$dddZ%dddddej&dZ'dddZ(dddZ)dddZ*dddZ+dddZ,dd Z-dd Z.dddZ/dddZ0dddZ1dddZ2dddZ3dd Z4dd Z5dd Z6dd Z7dddZ8dddZ9dd Z:ddÄ Z;dddǄZ<dddɄZ=ddd˄Z>ddd̈́Z?dddτZ@dddфZAdddӄZBdddՄZCdddׄZDdddلZEddۄ ZFdS )    N)datasetUnitDictgeometrygiantIfgramStackgiantTimeseriesifgramStack
timeseriesHDFEOS)sensor)ptimeutils0iJxZazimuth_looksZrange_looksZazimuthPixelSizeZazimuth_pixel_spacingZaz_pixel_spacingZazimuth_spacingZrangePixelSizeZrange_pixel_spacingZrg_pixel_spacingZrange_spacingZcenter_timeZdataType	data_typeZearthRadiusearth_radius_below_sensorearth_radiusZHEADING_DEGheadingZcentre_headingaltitude	SC_heightZnumber_bandsZbandsscheme
interleavelengthZFILE_LENGTHlinesazimuth_linesnlinesaz_sampinterferogram_azimuth_linesZnum_output_linesZfirst_near_latZfirst_near_longZfirst_far_latZfirst_far_longZlast_near_latZlast_near_longZlast_far_latZlast_far_longZpassDirectionpassNoDataValueZspacecraftNamer	   missionpolarizationprfpulse_repetition_frequencyZstartingRangeZnear_range_slcZ
near_rangeZslant_range_to_first_pixel
wavelengthZ
WavelengthZradarWavelengthZradar_wavelengthwidthZWidthZsamples
range_sampinterferogram_widthZnum_samples_per_line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)-ALOOKSRLOOKSAZIMUTH_PIXEL_SIZERANGE_PIXEL_SIZECENTER_LINE_UTC	DATA_TYPEEARTH_RADIUSZHEADINGHEIGHTBANDS
INTERLEAVELENGTHLAT_REF1LON_REF1LAT_REF2LON_REF2LAT_REF3LON_REF3LAT_REF4LON_REF4ORBIT_DIRECTIONNO_DATA_VALUEPLATFORMPOLARIZATIONPRFZSTARTING_RANGE
WAVELENGTHWIDTHREF_DATEREF_LATREF_LONREF_XREF_YZSUBSET_XMINZSUBSET_XMAXZSUBSET_YMINZSUBSET_YMAXX_FIRSTY_FIRSTX_STEPY_STEP
beam_swathfirst_frame
last_framerelative_orbituint8int16int32float32float64	complex64
complex128uint16uint32int64uint64)123456912131415rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   )rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   cint16cint32)                        	   
      rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   )rN   int8rU   rO   rV   rP   rQ   rR   rd   re   rS   rT   )byteshortintfloatdoublecfloatBYTESHORTINTFLOATDOUBLECFLOAT)rN   rO   rP   rQ   rR   rS   z.tiffz.tif.grdBSQBILBIP)ZBANDZLINEPIXELlittle-endian
big-endian)0rY   TF)yestruenofalsenonenanc                 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 )ae  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/4D 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   -datasetNamer1   r@   rf   z.h5z.he5)r   boxxstepystep	print_msg)r   r   r   r   dtype)
isinstancelistsplitstrread_attributert   ospathsplitextbasenamelowerread_hdf5_fileread_binary_filenparray)fnamer   r   r   r   r   r   Z
dsname4atratrr   r!   fextdata r   L/home/exouser/operations/rsmas_insar/sources/MintPy/mintpy/utils/readfile.pyread   s6    


r   c              
      s  t | }g }dd |D D ]}||kr|| qdd |D fdd|D  sb|d g nt trr 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 fD }
 fdd|D }t|
dkr |
d  }n,t|dkr<|d  }nt	d
 | t|d |d  | }t|d |d  | }|jdkr||d |d |d |d f }|| dkr|t|d d|t|d d|f }|d|d|f }n|jdkr2tj|jd tjd}|	r.|	dgkr<d|dd< n6dd fdd|D D }|	D ]}d|||< q\t|}t|d  }|| dkr2||j dk rtj|||f|jd}t|D ]4\}}|||d |d |d |d f ||< qn.|dd|d |d |d |d f | }nt|||f|j}t|D ]\}}|rt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< qN|rtd tdd |jD rt|}n|jdkr|jd |jd  }}||||f}|r|| | | |jj d  }td!| d"|j d#|d$d% t||jtj  }t!|D ]}|rtjdd&|d  d| d  tj  ||dd|d |d |d |d f }|| dkr\|ddt|d d|t|d d|f }|ddd|d|f ||ddddddf< q|rtd td'd |jD rt|}W 5 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        : 2/3/4D array
                atr         : dict, metadata
    c                 S   s   g | ]}| d d qS )r   r   r   .0ir   r   r   
<listcomp>M  s     z"read_hdf5_file.<locals>.<listcomp>c                 S   s   g | ]}d |kr|qS )r   r   r   r   r   r   r   P  s      c                    s   g | ]}| kr|qS r   r   r   )
ds_2d_listr   r   r   Q  s      r   c                 s   s&   | ]}|  p|d d   V  qd S )Nri   )isdigitr   xr   r   r   	<genexpr>\  s     z!read_hdf5_file.<locals>.<genexpr>c                    s   g | ]}d   d |qS ){}-{}r   formatr   )
ds_3d_listr   r   r   ]  s     r   c                    s   g | ]}|  d qS ) )replacer   dsFamilyr   r   r   a  s     c                 S   s"   g | ]}| d r|dd qS )r   rf   N
startswithr   r   r   r   r   b  s     
 rc                    s   g | ]}|   kr|qS r   keysr   fr   r   r   g  s      c                    s"   g | ]}d   d |kr|qS )z/{}r   r   r   r   r   r   r   i  s      z%input dataset {} not found in file {}rg   rh   rf   Nr   r   Tc                 S   s   g | ]}| d dd qS )r   rf   r   r   r   r   r   r     s     c                    s   g | ]}|  r|qS r   r   )r   jr   r   r   r     s     
 g?zreading 2D slices /z...c                 s   s   | ]}|d kV  qdS rf   Nr   r   r   r   r   r     s     ri   i   @z initiate a 4D matrix in size of z in z in the memory (z.1fz GB) ...zreading 3D cubes c                 s   s   | ]}|d kV  qdS r   r   r   r   r   r   r     s     )"get_slice_listappendr   r   allr   h5pyFilelen
ValueErrorr   rt   ndimr   zerosshapebool_indexsumwheretolistsizer   	enumeratesysstdoutwriteflushprintanysqueezeitemsizer   range)r   r   r   r   r   r   
slice_listds_listr   ZinputDateListdsNamesZ
dsNamesOlddsxsizeysizer   Z
slice_flag	date_listdZ	num_sliceindsindZd2Znum1Znum2r   Zram_sizeZd3r   )r   r   r   r   r   r   r   5  s    
 

    "
  
* "

  

6r   c                 C   sf  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r
d}|r
|d5r
d}n|d6krd}|d	d7}d}
|d8kr n`|d.kr0d}
nP|d9kr^d}
d:}d}|r|d5rd}n"|d;krrd<}
d}n|d=kr
d
}n|d>kr|dd? }|d	d7}d@|	 kr
|d@ dAkr
d
}n@|dBkr|r
t| }||kr
||d }ntdC| |dDkr*t| |||||dE}n"t| ||	f||
|||||||dF}d|kr^|
|d< ||fS )Ga  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
    rf   r   	PROCESSORr1   r@   r   r,   rQ   
BYTE_ORDERr   r/   rY   r0   r   phase)iscerq   rR   rS   rr   ru   rv   rw   	FILE_TYPE.r   )unwcorZionrg   )Zband1	intensity	magnitude)slc)	amplituder   r   r   )band2r   complexlos)r   azhead)ZincLocallocalr   Zband3rh   )magZamp)r   anglerealimagcpxr   )roipac).unw.corz.hgtz.msk).int).amp).dem.wgs84rO   )z.flgz.bytr   ).trans)r   Zazimuthgammar   )r  r  z.hgt_simr
  r	  z.ramp).utm_to_rdcr   .slc	complex32)z.mlisnapr   
byte orderr   )gdalgmtsarhyp3cosicorruavsarzUnknown InSAR processor: {})r  r  r  r  )r   bandcpx_bandr   r   )
r   r   r   
byte_ordernum_bandr   r  r  r   r   )r   r   r   r   r   r   rt   getupperr   r   minr   r   r   r   r   	read_gdalread_binary)r   r   r   r   r   r   r   	processorr   r!   r   r  r  r   r  r  dataTypeDictkr   r   r   r   r   r   r     s   


























	
r   c              	      s2  t jt j| \}}| }|dkr:t j|\}}q |sB|}t| }|d }|dkrt| d  fdd  D }W 5 Q R X |dkr||krt	| }|j
dd	 |jaq.|d
kr||krt| }|j
dd	 |jaq.|dkrt| }|j
dd	 |jaq.|dkr4t| }|j
dd	 |jan|dkrZt| }|j
dd	 |jan|dkrt| }|j
dd	 |jan|dkrd|krt| d  d dd }W 5 Q R X dd |D anNt|d t|d  fdd}	g at| d  |	 W 5 Q R X nt|dd}
|dkrBddgan|drb|
dkrbddgan|d krvd!d"gan|d#kr|rd!d"gand$gan|d%r|d&kr|
dkrd'd(ganl|d%r| d)r|
d*krd+d,d-gan>|d.krd/d0d1gan(|d2krd3d4d5gand6d t|
D atS )7z2Get list of 2D slice existed in file (for display)z.geoz.rdrz.fullr  r~   r   r   r   c                    s    g | ]}t  | tjr|qS r   )r   r   Datasetr   r   r   r   r     s      z"get_slice_list.<locals>.<listcomp>r   F)r   )r   )r   )r   )r   )r   r   dateNc                 S   s   g | ]}d  |dqS )zslc-{}zUTF-8)r   decoder   r   r   r   r     s     r1   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 )Nrg   rh   c                    s   g | ]}d   |d qS )r   rf   r   r   namer   r   r     s     z?get_slice_list.<locals>.get_hdf5_2d_dataset.<locals>.<listcomp>r   z#file has un-defined {}D dataset: {})r   r   r%  r   r   r   r   r   warningswarnr   r*  objr   r!   r)  r   get_hdf5_2d_dataset  s    "

"z+get_slice_list.<locals>.get_hdf5_2d_datasetr/   rY   )r  r  
rangeCoordazimuthCoordr   rg   incidenceAngleazimuthAngle)r  z.ionr   r   )r  r  r   off)z.bipazimuthOffsetrangeOffsetzcov.biprh   ZazimuthOffsetVarZrangeOffsetVarZoffsetCovar).lkveastnorthup).llhlatitude	longitudeheightc                 S   s   g | ]}d  |d qS )zband{}rf   r   r   r   r   r   r     s     )r   r   r   r   r   r   r   r   r   r   open	sliceListr   r   r   r   r   r   rt   
visititemsr  r   endswithr   )r   Z
no_complexfbaser   r   r#  d1_listr.  datesr0  r  r   )r   r   r!   r   r     s    
 






	






 
"

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 5 Q R X nt
| atS )zCGet list of 2D and 3D dataset to facilitate systematic file readingrf   r   r1   r@   c                    s0   t |tjr,|jdd   fkr,t|  d S )Nr(  )r   r   r%  r   r   r   r-  r/  r   r   get_hdf5_dataset%  s    "z*get_dataset_list.<locals>.get_hdf5_datasetr   )r   r   r   r   r   rt   r   r   r   rB  r   )r   r   r   r   rG  r   r   r/  r   get_dataset_list  s    rH  c              	   C   sV   t j| d  }|dkr dS d}t| d }t| d}|| j}W 5 Q R X |S )z+Get the compression type of input HDF5 filerf   r   Nr   r   )r   r   r   r   rH  r   r   compression)r   extrI  Zds_namer   r   r   r   get_hdf5_compression3  s    rK  c                 C   sX   t | dd}t| }t|r0t|}n$|t krFt| }nt	d| |S )z)Grab the NO_DATA_VALUE of the input file.r;   Nz"Un-recognized no-data-value type: )
r   r  r   r   utZ	is_numberru   SPECIAL_STR2NUMr   r   )r   valr   r   r   get_no_data_value@  s    


rO  c           %         s4  t j| }t jt j| \}}| }t j| sZd| }|dt   7 }t	||dkr|rv|
dd }t| d<tj}fdd D fd	d D  W 5 Q R X d
ddg}t fdddD rd}	nt fdddD r
d}	nt fdddD r*d}	nt fdddD rHd}	ndkrXd}	nd krhd}	nt fdddD rd}	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r8t|  }nt|dkrd#| kr|r| krt| d|t| j W 5 Q R X n\d$d% }
g at| d|
 W 5 Q R X trd&d tD }tt| }n
td'| | D ]2\}}z|d(||< W n   |||< Y nX qt|	|d!< d)}t| d`|rf| krf| }n$d*d+ }g a | t rt d }|d)k	rt|j!|d,< W 5 Q R X d-| kr|d- |d.< d.| k
rd/|d.< n"|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|n&|dLkr|
dMd)dI \}}}}t$$t j%|| dM| dN| dM| dO}t|dkrt&|d }i }|
dMdPd) \}}|'dQr|dR|dSd)  dM| dT |d2< |dR|dSd)  dM| dU |d#< nzt(|dV }dW\}}t)dS|dS D ]>}|t(|dR| dM| dT 7 }t(|dR| dM| dU }qt||d2< t||d#< |dX  dYkrBdZnd[|d\< d]|d.< d]|d^< ||d!< dB|d,< |
d_d |d`< |
d_dS |da< db|dc< dd|de< nt*dfnV| dg | dh | di t j| d dj | dk | dl g}dmd |D }rfdnd|D }|t+kr*t j| dg s*| g}nt|dkrFt*do| i }| ,dprttdqd |D rtdr|d.< ntdsd |D rdt|d.< dud |D }t|dkr|t-|d  n\tdvd |D rdw|d.< n>tdxd |D r
d.| krdy|d.< n|t+krdz|d.< d.| kr2d/|d.< |d } t j| dS }!|d{krht j|\}}qJ|sr|}|!dgkr|t.|  d!| k	r||d!< n|!dhkr|t-|  d!| k	r||d!< n|!dikr|t/|  ||d!< n|!djk	r|t0|  |d. drk	rt j|  }|'d|	rBd}|d!< nL|'d~	rXd|d!< n6|'d	rnd|d!< n d|k	rd|d!< n|d |d!< n||d!< n&|!dkgt+ k	r|t1|  ||d!< ddBddd}"|2d,d }#|#dk
r|#|" k
r|"|# |d,< |
r|3dd}|d! 3dd}	|	dk
rZ|
rP|t4 k
rPt4| |dH< nd|dH< nz|
r|t4 k
rt4| |dH< |dk
r|2d,dB'd
rdZ|dH< n2dH| k
r|	t4 k
rt4|	 |dH< ndZ|dH< |2dd)}$t|$ |d< d| krd| kr|d |d< t j5| |d< t6|}|S )a  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: r   r   r   r   c                    s    g | ]}t  | tjr|qS r   )r   r   Groupr   r   r   r   r   j  s      z"read_attribute.<locals>.<listcomp>c                    s.   g | ]&}t  | tjr | jd kr|qS )rg   )r   r   r%  r   r   r   r   r   r   k  s       Zinterferograms	coherencewrappedc                 3   s   | ]}| kV  qd S Nr   r   rE  r   r   r   p  s     z!read_attribute.<locals>.<genexpr>)unwrapPhaser7  r6  r   c                 3   s   | ]}| kV  qd S rS  r   r   rT  r   r   r   r  s     )r?  r=  r2  r   c                 3   s   | ]}|  kV  qd S rS  r   r   )rE  g1_listr   r   r   t  s     )r   r   c                 3   s   | ]}| kV  qd S rS  r   r   rT  r   r   r   v  s     )velocityrW  r   reconsr   c                 3   s   | ]}| kV  qd S rS  r   r   rT  r   r   r   |  s     )igramfigramr   c                 3   s   | ]}| kV  qd S rS  r   r   )rV  r   r   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   dictr-  r   r   r   get_hdf5_attrs  s    z&read_attribute.<locals>.get_hdf5_attrsc                 S   s   g | ]}t |qS r   )r   r   r   r   r   r     s     z!No attribute WIDTH found in file:utf8Nc                 S   s$   t |tjr |jdkr t| d S )Nrg   )r   r   r%  r   r   r   r-  r   r   r   rG    s    z(read_attribute.<locals>.get_hdf5_datasetr,   ZINSAR_PROCESSORr   mintpyz.dehmip  r1   i(#  g2.Z rI   g2.Z ?rH   degreesY_UNITX_UNITrg         ?g      ?rG   g      Y@rF   ZGSIrQ   ZLATLONZ
PROJECTIONZWGS84ZGEODETIC_DATUMmZUNITri   zAinput DEHM file size do NOT match with the pre-defined 10m DEHM: z{} * {} in {}!)r8  r<  _z_*_z.annr(  sZslc_rf   z Rowsz ColumnszNumber of Segments)r   r   zLook DirectionleftrY   -1ANTENNA_SIDEr  r<   r   r(   r'   r[   r/   r   r0   zNo UAVSAR *.ann file found!.rsc.xml.par.hdr.vrtz.aux.xmlc                 S   s   g | ]}t j|r|qS r   )r   r   isfiler   r   r   r   r      s      c                    s   g | ]}|  r|qS r   rC  r   )metafile_extr   r   r   $  s     
 z(No metadata file found for data file: {}z.imgc                 s   s   | ]}| d V  qdS )rn  Nrq  r   r   r   r   r   /  s     r  c                 s   s   | ]}| d V  qdS ))rl  rn  ro  Nrq  r   r   r   r   r   2  s     r   c                 S   s   g | ]}| d r|qS )rl  rq  r   r   r   r   r   4  s     
 c                 s   s   | ]}| d V  qdS )rm  Nrq  r   r   r   r   r   8  s     r  c                 s   s   | ]}| d V  qdS )rk  Nrq  r   r   r   r   r   ;  s     r  r  r$  r   r  )Zcohr   r  Z	phase_ifgr  demz	file typerq   rR   rS   r   r   ZStdr   r   radianr   r;   Z	FILE_PATHZOG_FILE_PATH)7r   r   dirnamer   r   r   rp  r   getcwd	Exceptionr   r   r   r]  r[  r   r   r   setr   r   r   get_metadatar   updater\  rB  r   argmaxitemsr'  r   r   r   ru   getsizeglobjoinread_uavsar_annr   rt   r   FileNotFoundErrorGDAL_FILE_EXTSrC  read_isce_xmlread_roipac_rscread_gamma_parread_envi_hdrread_gdal_vrtr  r   r   abspathstandardize_metadata)%r   r   rr  ZfdirrD  r   msgr   Zpy2_mintpy_stack_filesr#  r^  Znum_listkeyvaluer   rG  yyxxZsitelineversionZbcorrZ	ann_filesannsegZmliZnum_segr   r!   r   Z	metafilesZ	xml_filesZmetafileZmeta_extr"  r   Zno_data_valuer   )rE  r   rV  rr  r   r   O  s   


 








 




""
,"$
 



















r   c                    s   dkrt t t|  D ]\}}||< qfdd D  fdd D }|D ]:}| } fdd|D }t|dkr`|d  |< q`S )zQConvert metadata input ROI_PAC/MintPy format (for metadata with the same values).Nc                    s   g | ]}|   kr|qS r   r   r   )standardKeysr   r   r     s      z(standardize_metadata.<locals>.<listcomp>c                    s   g | ]}|   kr|qS r   r   r   )metaDictr   r   r     s      c                    s   g | ]}| kr|qS r   r   r   )in_keysr   r   r     s      r   )standardMetadataKeysr]  iterr|  r   r   )Z
metaDictInr  r  r  Zstd_keysZstd_keyZ	cand_keysr   )r  r  r  r   r    s    
r  =c              	   C   s
  |rt |tr|g}tj| r@t| d}| }W 5 Q R X nt | trT| d}dd |D }i }|D ]}dd ||dD }t|dkrj|	dsj|d	 }t
|d dd
dd	  }	tj|	}	tj|	}	|r|D ]}
|	
|
d
 q|	d
krj|	||< qj|S )a  Read the template file into a dictionary structure.

    Parameters: fname      - str, full path to the template file
                delimiter  - str, string to separate the key and value
                skip_chars - list of str, skip certain charaters in values
    Returns:    template   - dict, file content
    Examples:   template = read_template('KyushuAlosAT424.txt')
                template = read_template('smallbaselineApp.cfg')
    r   
c                 S   s   g | ]}|  qS r   stripr   r   r   r   r     s     z!read_template.<locals>.<listcomp>c                 S   s   g | ]}|  qS r   r  r   r   r   r   r     s     rf   rg   )%#!r   r   r  )r   r   r   r   rp  r@  	readlinesr   r   r   r   r  
expanduser
expandvars)r   	delimiterZ
skip_charsr   r   templater  cr  r  Z	skip_charr   r   r   read_template  s,    

 
r   c           	   	   C   s~   t | d}| }W 5 Q R X i }|D ]J}dd | dd|dD }|d }|d dd	 }|||< q&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   c                 S   s   g | ]}|  qS r   r  r   r   r   r   r     s     z#read_roipac_rsc.<locals>.<listcomp>	r  rf   r   r  r   )r@  r  r  r   r   r  )	r   r  r   r   ZrscDictr  r  r  r  r   r   r   r    s    "
r  :c           
   	   C   s   t | d}| |d }W 5 Q R X i }|D ]r}dd | |dD }t|dk sb|drht q.|d }t|d d	d
dd  d  }	|	||< q.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 r   r  r   r   r   r   r     s     z"read_gamma_par.<locals>.<listcomp>rf   rg   )r  r  r   r  r   r  )r@  r  r  r   r   r   nextr   r   attribute_gamma2roipacr  )
r   r  skiprowsr   r   ZparDictr  r  r  r  r   r   r   r  	  s    (
r  c                    s  t  }t|  D ]\ }|| < q|  D ]& t fdddD r,|  |d< q,|  D ]& t fdddD r\|  |d< q\d  |  krt|  }tt| |d	< d
  |  krt|  }t||d< d}||  krt|| }t|| |d< d  |  kr&|  |d< d  |  krt|  }d|  k r\dk szn d|  k rvd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 rS  r   r   r  r   r   r   1  s     z)attribute_gamma2roipac.<locals>.<genexpr>)r   r   r   r   r1   c                 3   s   | ]}  |V  qd S rS  r   r   r  r   r   r   9  s     )r!   r"   r#   r@   radar_frequencyr?   r   r-   Zsar_to_earth_centerr.   r	   r<   r   i  ih  iZ   Z	ascendingr:   Z
descendingZazimuth_angler      ri  rj  rY   )r]  r  r|  r   r   ru   r   SPEED_OF_LIGHT)Zpar_dict_inZpar_dictr  Rekey2r   r  r   r  )  sJ    
6

r  c                 C   s  t |  }i }|jdr2|dD ]&}|d }|dj	}|||< q*t
ddgddgD ]\}}|d	| d
}|d	| d}	|dk	rt|dj	nd}
|	dk	rt|	dj	nd}|
rd|rdt|
dk rdt|
dkrd|
|d|< ||
d  |d|< d|d|< qdt|d   |d< nn|jdkr|d}|dD ]}|d}|j	}|||< qRt|d  |d< |d}|dk	r|j	|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']Nrd  Hz>z{}_STEP       @z{}_FIRSTra  z{}_UNITr   Z
PAMDatasetz./Metadata[@domain='ENVI']ZMDIr  z./PAMRasterBand/NoDataValuer   )ETparsegetroottagr   findallr  r   findtextzipru   absr   DATA_TYPE_ISCE2NUMPYDATA_TYPE_ENVI2NUMPYr  )r   rootZxmlDictchildr  r  Z
coord_nameprefixZe_stepZe_firstZv_stepZv_firstmetar   r   r   r  i  s:    
 




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  )r  z	data typer\   r,   r  rY   r   zmap infoc                 S   s$   g | ]}| d d dd qS ){r   })r   r  r   r   r   r   r     s     z!read_envi_hdr.<locals>.<listcomp>,rj   rk         rd  r  ra  rc  rb  rH   rI   rh   r  rF   ri   rG   )
r  r  r  ENVI_BYTE_ORDERr   r   r  ru   r   r  )r   r   Zmap_infox_stepy_stepr   r   r   r    s     r  c                 C   s  zddl m}m} W n tk
r0   tdY nX |t| |j}i }|j|d< |j	|d< |j
|d< t|dj |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  < |d |d#< 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@   r1   r/   rf   r,   ZIMAGE_STRUCTUREr0   r   rh   rj   r  rH   rI   r  rF   rG   )ZwktZ	AUTHORITYZEPSGZUTMzUTM zoneZUTM_ZONEmetersrc  rb  rd  r  ra  g     f@g     v@r   )osgeor  r  ImportErrorOpenr   fspathGA_ReadOnlyRasterXSizeRasterYSizeZRasterCountDATA_TYPE_GDAL2NUMPYGetRasterBandDataTypeZGetMetadatar  ENVI_BAND_INTERLEAVEZGetGeoTransformr  ZSpatialReferenceZGetProjectionZGetAttrValueZGetNamer   r  ZGetNoDataValuer  )r   r  r  r   r   r   	transformx0y0r  r  ZsrsZsrs_namer   r   r   r    sH    



r  ;c           
   	   C   s   d}t | d}| }W 5 Q R X i }|D ]v}| }dd ||dD }t|dkr*||s*|d dd  }t|d d	d
|d  }	|	||< q*|S )z5Read the UAVSAR annotation file into dictionary.
    Nr   c                 S   s   g | ]}|  qS r   r  r   r   r   r   r     s     z#read_uavsar_ann.<locals>.<listcomp>rf   rg   r   (r  r   )r@  r  r  r   r   r   r   r   )
r   commentr  r   r   r  r  r  r  r  r   r   r   r    s     
r  c           	   	   C   s   t | d}| }W 5 Q R X i }|D ]J}dd | dd|dD }|d }|d dd	 }|||< q&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   c                 S   s   g | ]}|  qS r   r  r   r   r   r   r     s     z#read_gmtsar_prm.<locals>.<listcomp>r  r  rf   r   r  r   )r@  r  r  r   r   attribute_gmtsar2roipacr  )	r   r  r   r   ZprmDictr  r  r  r  r   r   r   read_gmtsar_prm  s    "
r  c                 C   s&  t  }t|  D ]\}}|||< qd}||  krZ|| }| dkrRd|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Rri  rj  rY   ZSC_velr   r>   r   r)   Zrng_samp_rater  r*   ZSC_clock_startZSC_clock_stopg      8@      N@r+   )	r]  r  r|  r   r  ru   r  rt   r   )Zprm_dict_inZprm_dictr  r  Zvelr  r>   r?  Zaz_pixel_sizeZ	dt_centerZt_centerr   r   r   r  !  s2    

r  c                 C   s   t |  }|d}i }d|d< tj| dd  |d< |	dD ] }|
d }|j}|||< qLt|}|d	 d
krdnd|d< tj|d d}tj|d d}||| d  }	|	jd |	jd  |	j }
|
|d< |d}|dj|d< |dj|d< |dj|d< |d}t|dj}t|dj}t|dj}t|||f\}}||d< ||d < t|d! |d!< tt|d" d#  |d$< |d%jd&}d'd( |D }|d) |d*< |d+ |d,< |d- |d.< |d/ |d0< d1|d2< d1|d3< t|d4 t|d4  d5 |d6< t||d6 |d7< |d8	d9d) 	d9}d:d( |D }td;d( |D \}}|dd<  d=|dd<  |d>< d?d( |D }d@d( |D d) }||dA< ||dB< | D ]\}}t|||< qdCD ],}|| krttt|| ||< q|S )Da(  Read SNAP *.dim file into a python dict structure.
    Parameters: fname - str, path of the *.dim file
    Returns:    dim_dict - dict, ditionary of keys and values
    Examples:   from mintpy.utils import readfile
                atr = readfile.read_snap_dim('20190303_20190408_unw_tc.dim')
    zLDataset_Sources/MDElem[@name='metadata']/MDElem[@name='Abstracted_Metadata']r  r   rf  r(  r   ZMDATTRr*  Zantenna_pointingrightri  rY   rj  Zfirst_line_timez%d-%b-%Y %H:%M:%S.%fZlast_line_timerg   g      @r  r+   z'Image_Interpretation/Spectral_Band_Infor,   ZBAND_RASTER_HEIGHTr1   ZBAND_RASTER_WIDTHr@   zAMDElem[@name='Orbit_State_Vectors']/MDElem[@name='orbit_vector1']zMDATTR[@name='x_pos']zMDATTR[@name='y_pos']zMDATTR[@name='z_pos']r.   r-   r<   r  g    .Ar?   z$Geoposition/IMAGE_TO_MODEL_TRANSFORMr  c                 S   s   g | ]}t t|qS r   )r   ru   r   r   r   r   r     s     z!read_snap_dim.<locals>.<listcomp>r   rH   rh   rI   ri   rF   rj   rG   ra  rc  rb  Zincidence_nearr  ZINCIDENCE_ANGLEZSLANT_RANGE_DISTANCEzMDElem[@name='Baselines']ZMDElemc                 S   s$   g | ]}| d dd  qS )r*  r  rf   )r  r   r  r   r   r   r   r     s     c                 S   s    g | ]}t j|d dqS )z%d%b%Yz%Y%m%d)dtdatetimestrptimestrftimer   r   r   r   r     s     Nr   ZDATE12c                 S   s   g | ]}| d jqS )zMDATTR[@name='Perp Baseline'])r  r  r   r   r   r   r     s     c                 S   s   g | ]}t |d kr|qS )r   ru   r   r   r   r   r     s      ZP_BASELINE_TOP_HDRZP_BASELINE_BOTTOM_HDR)r'   r(   r1   r@   )r  r  r  r  r   r   r   r   r   r  r  r  r  r  r  r  hourminutesecondru   rL  Zxyz_to_local_radiusr	   standardize_sensor_namer  Z$incidence_angle2slant_range_distancesortedr|  r   r   rt   )r   r  r   Zdim_dictr  r  r  Z	start_utcZend_utcZ
center_utcZcenter_secsr  ZorbitZx_posZy_posZz_posr?  Zradiusr  basesrF  date1date2Zpbasespbaser   r   r   read_snap_dimH  sr    



 "r  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bigr   zieee-bez	(\d+|\D+)rf   rm   z>{}{}r   rh   r   countr  rg   r   r   zunrecognized band interleaving:>r   r  r  r  phar   unrecognized complex band:N)rer  r   rt   r   r  r   fromfilereshapearanger   r   r   r  r  r   absolute)r   r   r   r   r  r  r   r  r  r   r   r   r!   letterZdigitr   r   r   r   r   r   r     s    "  

 
 ( 

     

r   c                 C   s  zddl m} W n tk
r,   tdY nX |t| |j}||}|s`dd|j|j	f}|
 |d |d |d |d f }	t|j }
|
ddd	r|d
r|	j}	nV|dr|	j}	nD|drt|	}	n.|drt|	}	n|drn
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!rf   rh   rg   r  r   r  r  r  r  r   r  r  N)r  r  r  r  r   r  r  r  r  r  ZReadAsArrayr  r  r   r   r  r  r   r   r  r   rt   )r   r   r  r  r   r   r  r   Zbndr   r   r   r   r   r   r   r    s@    

(






r  c              	   C   s.  d}t | d}| }W 5 Q R X dd |D }d}|rD|dd }t|}g }g }tj|d}	t|D ]\}
}| dd	d
d}|drg }n |	dd |
 dd D  |
|d ks||
d  drtj|tjd}t|dddf }t|dddf }t|dddf }t|dddf }|dk	r|r|\}}}}||k s||ks||ks||k rd}|dk	r|dkrt|| d t||  d t|| d tj d  }||k rd}|dk	r|	| |	j|
d dd|
d  d| d qh|	  |S )aC  Read GMT lonlat file into list of 2D np.ndarray.

    Parameters: ll_file  - str, path to the GMT lonlat file
                SNWE     - tuple of 4 float, area of interest in lat/lon
                min_dist - float, minimum distance in km of fault segments
    Returns:    faults   - list of 2D np.ndarray in size of [num_point, 2] in float32
                           with each row for one point in [lon, lat] in degrees
    Examples:
        # prepare GMT lonlat file
        cd ~/data/aux/faults
        gmt kml2gmt UCERF3_Fault.kml > UCERF3_Fault.lonlat

        # read faults data
        ll_file = os.path.expanduser('~/data/aux/faults/UCERF3_Fault.lonlat')
        faults = read_gmt_lonlat_file(ll_file, SNWE=(31, 36, -118, -113), min_dist=0.1)

        # add faults to the existing plot
        fig, ax = plt.subplots(figsize=[7, 7], subplot_kw=dict(projection=ccrs.PlateCarree()))
        data, atr, inps = view.prep_slice(cmd)
        ax, inps, im, cbar = view.plot_slice(ax, data, atr, inps)

        prog_bar = ptime.progressBar(maxValue=len(faults))
        for i, fault in enumerate(faults):
            ax.plot(fault[:,0], fault[:,1], 'k-', lw=0.2)
            prog_bar.update(i+1, every=10)
        prog_bar.close()
        ax.set_xlim(inps.geo_box[0], inps.geo_box[2])
        ax.set_ylim(inps.geo_box[3], inps.geo_box[1])

    Nr   c                 S   s   g | ]}| d s|qS )r  r   r   r   r   r   r   s  s     
 z(read_gmt_lonlat_file.<locals>.<listcomp>Fi  )maxValuer  r   r  r  r  c                 S   s   g | ]}t |qS r   r  r   r   r   r   r     s     rg   rf   r   r   l   r  zline z / )everysuffix)r@  r  r   r
   progressBarr   r  r   r   r   r   r   r   rQ   nanminnanmaxr  cospirz  close)Zll_fileZSNWEZmin_distr   r   Z
debug_modeZnum_lineZfaultsZfaultprog_barr   r  rg  nweSNWEdistr   r   r   read_gmt_lonlat_fileP  sF     
    (<


&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@   r1   r   f4r  >f4rh   rg   r  rf   r   r   rt   ru   r   r  r  )
r   r   r  r   r!   r   r   r   r   r   r   r   r   read_float32  s4      
 
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,   rR   r@   r1   r   f8r  z>f8rh   r  rf   rg   r  r   r   r  r   r!   r   r   r   r   r   r   read_real_float64  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,   rS   r@   r1   r   Zc8r  z>c8rh   r  rf   rg   r   r   r  r  )r   r   rt   ru   r   r  r  r   r  r  r  )
r   r   r  r  r   r!   r   r   r   ZdataOutr   r   r   read_complex_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 )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,   rQ   r@   r1   r   r  r  r  rh   r  rf   rg   r  r  r   r   r   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@   r1   r   i2r  >i2rh   rg   r  rf   N)r   r   rt   ru   r   r  r  flattenr  r   hypotarctan2)r   r   r  r  r   r!   r   r   r   Zodd_idxr  r  r   r   r   r   r   read_complex_int16<  sB     
 

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,   rO   r@   r1   r   r#  r  r$  rh   r  rf   rg   r  r  r   r   r   read_real_int16i  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.rscrk  r,   boolr@   r1   rh   r  rf   rg   )
rC  r   r   r   rt   ru   r   r  r   r  )r   r   ZrscFiler   r!   r   r   r   r   r   	read_bool~  s,    

  r+  c           	      C   s   t j| tddtd d df }g }|D ]}|| q*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   rf   )r   usecolsr   )rf   rg   rh   ri   )r,  rf   rg   rh   )r   loadtxtbytesastyper   r   r   )	r   yyyymmddZYYYYMMDDyr   rF  r:  r9  r;  r   r   r   read_GPS_USGS  s"    r2  )NNTrf   rf   N)NNrf   rf   T)NNrf   rf   )F)N)NN)N)r  N)r  )r  rh   )r  r  )r  )	NrQ   r  rf   r   rf   r   rf   rf   )Nrf   r   rf   rf   )Nro   )Nr  )Nr  )Nr  r   )Nr  )Nr  F)Nr  )N)Gr   r   r   r~  r  r  r+  Zdefusedxml.ElementTreeZElementTreer  r   jsonnumpyr   mintpy.objectsr   r   r   r   r   r   r   r	   mintpy.utilsr
   r   rL  r  r  r  ZDATA_TYPE_NUMPY2ENVIr  ZDATA_TYPE_NUMPY2GDALr  ZDATA_TYPE_NUMPY2ISCEr  r  r  r   rM  r   r   r   r   rH  rK  rO  r   r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r   r!  r"  r(  r)  r+  r2  r   r   r   r   <module>
   sl  $	

 

:

?
;
 *
 O
m

  Z

.

 @1@

'h           
^
B
Q
-

:

-

