
    Zfd\                    t   d Z 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	c m
Z ddlmZ ddlZddlZddlmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZ dZ i dd	gd
dgdg ddg dddgdg ddg ddg ddddgdddgddd gd!g d"d#d$gd%d&gd'd(gd)d*gd+d,gi d-d.gd/d0gd1d2gd3d4d5gd6d7gd8g d9d:d;gd<d=d>gd?g d@dAg dBdCg dDdEdFgdGdHgdIdJgdKdLgdMdNgdOdPgdQgdRgdSgdTdUgdVdWgdXdYgdZd[gd\gd]gd^gd_gd`Z!dadbdcdddedfdgdhdidjdkdlZ"dmdndodpdqdrdsdtdudvdwdxZ#dadhdbdidcdddedydzdfdgdkdjd{d|Z$d}d~dddddddddddddZ%dadbdcdddedfdZ&dddddddZ'dfddZ(g dZ)ddddZ*dddZ+dddddejX                  dZ-dddddddddddddZ.dede/fdZ0dee1e/f   dejd                  fdZ3	 	 ddZ4ddZ5ddZ6ddZ7ddZ8d Z9ddZ:d Z;d Z<d Z=ddZ>d Z?e!fdZ@ddZAddZBddZCd ZDd ZEdÄ ZFdĄ ZGddńZHddƄZIdǄ ZJdȄ ZK	 	 	 ddɄZLddʄZMdd˄ZNdd̄ZOdd̈́ZPdd΄ZQddτZRddЄZSddфZTdd҄ZUdӄ ZVy)zUtilities to read files.    N)Union)	DTypeLike)DSET_UNIT_DICTHDFEOSgeometrygiantIfgramStackgiantTimeseriesifgramStacksensor
timeseries)ptimeutils0iJxALOOKSazimuth_looksRLOOKSrange_looksAZIMUTH_PIXEL_SIZE)azimuthPixelSizeazimuth_pixel_spacingaz_pixel_spacingazimuth_spacingRANGE_PIXEL_SIZE)rangePixelSizerange_pixel_spacingrg_pixel_spacingrange_spacingCENTER_LINE_UTCcenter_time	DATA_TYPE)dataType	data_typeimage_formatEARTH_RADIUS)earthRadiusearth_radius_below_sensorearth_radiusHEADING)HEADING_DEGheadingcentre_headingHEIGHTaltitude	SC_heightBANDSnumber_bandsbands
INTERLEAVEscheme
interleaveLENGTH)lengthFILE_LENGTHlinesazimuth_linesnlinesaz_sampinterferogram_azimuth_linesnum_output_linesLAT_REF1first_near_latLON_REF1first_near_longLAT_REF2first_far_latLON_REF2first_far_longLAT_REF3last_near_latLON_REF3last_near_longLAT_REF4last_far_latLON_REF4last_far_longORBIT_DIRECTIONpassDirectionpassNO_DATA_VALUENoDataValuePLATFORM)spacecraftNamer   missionPOLARIZATIONpolarizationPRFprfpulse_repetition_frequencySTARTING_RANGE)startingRangenear_range_slc
near_rangeslant_range_to_first_pixel
WAVELENGTH)
wavelength
WavelengthradarWavelengthradar_wavelengthWIDTH)widthWidthsamples
range_sampinterferogram_widthnum_samples_per_lineREF_DATEref_dateREF_LATref_latREF_LONref_lonREF_Xref_xREF_Yref_ySUBSET_XMIN	subset_x0	subset_x1	subset_y0	subset_y1
corner_loncorner_east
corner_latcorner_northpost_lon	post_eastpost_lat
post_northswathNumberfirstFrameNumberlastFrameNumbertrackNumber)SUBSET_XMAXSUBSET_YMIN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15r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   cint16cint32int8)                        	   
               r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )byteshortintfloatdoublecfloatBYTESHORTINTFLOATDOUBLECFLOAT)r   r   r   r   r   r   	complex32)fcomplexscomplex)z.tiffz.tif.grdz.cosBSQBILBIP)BANDLINEPIXELlittle-endian
big-endian)0r   TF)yestruenofalsenonenanersrs1envalostsxcskrs2sengf3lt1)r   r   r   r   r   r   r   r   r   r   r   r   np_dtypereturnc                     ddl m}m} t        j                  |       } t        j
                  t        |       r|j                  }n|j                  |       }|t        d|  d      |S )zConvert NumPy dtype to GDAL dtype.

    Modified from dolphin.utils.numpy_to_gdal_type().

    Parameters: np_dtype  - DTypeLike, NumPy dtype to convert.
    Returns:    gdal_code - int, GDAL type code corresponding to `np_dtype`.
    r   )
gdal_array	gdalconstzdtype z not supported by GDAL.)
osgeor   r   npdtype
issubdtypeboolGDT_ByteNumericTypeCodeToGDALTypeCode	TypeError)r   r   r   	gdal_codes       N/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/utils/readfile.pynumpy_to_gdal_dtyper      sc     ,xx!H 
}}T8$&&	<<XF	 &
*ABCC    
gdal_dtypec                     ddl m}m} t        | t              r|j                  |       } t        j                  |j                  |             }|S )zConvert GDAL dtype to NumPy dtype.

    Modified from dolphin.utils.gdal_to_numpy_type().

    Parameters: gdal_dtype - str/int, GDAL dtype to convert.
    Returns:    np_dtype   - np.dtype, NumPy dtype
    r   )gdalr   )	r   r   r   
isinstancestrGetDataTypeByNamer   r   GDALTypeCodeToNumericTypeCode)r   r   r   r   s       r   gdal_to_numpy_dtyper      s?     '*c"++J7
xx
@@LMHOr   c                 &   t        j                  |       } d}t        |t              r|d   j	                  d      d   }n$t        |t
              r|j	                  d      d   }t        | |      }	t        |	d         t        |	d         }}
|sdd||
f}t        ||||      }t         j                  j                  t         j                  j                  |             d   j                         }|d	v rt        | fd
|i|}nt        | fi |\  }}	|C||j                  k7  r4|rt!        d|j                   d|        t#        j$                  ||      }t        |t              r'|rt!        d|d    d|d           |d   |||d   k(  <   ||	fS )a  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. Change the output data type
                no_data_values - list of 2 numbers, change the no-data-value in the output
    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   -datasetNamer4   rd   )r   boxxstepystepr   z.h5z.he5	print_msgzconvert numpy array from z to r   zconvert no-data-value from )osfspathr   listsplitr   read_attributer   dictpathsplitextbasenamelowerread_hdf5_fileread_binary_filer   printr   array)fnamer   r   r  r   r   r!   no_data_values
dsname4atratrr5   re   kwargsfextdatas                  r   readr  ?  s   0 IIeEJ+t$ ^))#.q1
	K	% &&s+A.

J
7C H&CL(9EF!UF# 	F 77BGG,,U34Q7==?DeCyCFC %U5f5	c djj!8-djj\i[IJxxI. .$'/q0A/B$~VWGXFYZ[*8*;T^A&&'9r   c           
      j   t        |       }g }|D cg c]  }|j                  d      d    c}D ]  }||vs|j                  |        |D cg c]	  }d|vs| }	}|D cg c]	  }||	vs| }
}|s|d   g}nt        |t              r|g}t        d |D              r|D cg c]  }|
d    d|  }}|d   j                  d      d   }|D cg c]  }|j                  |d       }}|D cg c]  }|j                  d      s|dd  }}t        j                  | d      5 }|d   |fD cg c]  }||j                         v s| }}|D cg c]  }d|d    |v s| }}t        |      dkD  r	||d      }n(t        |      dkD  r	||d      }nt        d	| d
|        t        |d   |d   z
  |z        }t        |d   |d   z
  |z        }|j                  dk(  rR||d   |d   |d   |d   f   }||z  dkD  rf|t        |dz        d|t        |dz        d|f   }|d|d|f   }n4|j                  dk(  rxt        j                   |j"                  d   t        j$                        }|r|dgk(  rd|dd n]|D cg c]  }|j                  |      s| c}D cg c]  }|j                  dd      d    }}|D ]  }d||j'                  |      <    t        j(                  |      }t        j*                  |      d   j-                         }||z  dk(  r||j.                  z  dk  rSt        j                   |||f|j0                        }t3        |      D ]   \  }}|||d   |d   |d   |d   f   ||<   " n|dd|d   |d   |d   |d   f   |   }nt        j                   |||f|j0                        }t3        |      D ]  \  }}|rJt4        j6                  j9                  dd|dz    d| dz          t4        j6                  j;                          |||d   |d   |d   |d   f   }|t        |dz        d|t        |dz        d|f   }|d|d|f   ||ddddf<    |rt=        d       t?        d |j"                  D              rt        j@                  |      }n|j                  dk(  r|j"                  d   |j"                  d   }}||||f}|rE||z  |z  |z  |j0                  jB                  z  dz  } t=        d| d|j0                   d| dd       t        j                   ||j0                        t        jD                  z  }tG        |      D ]  }|rJt4        j6                  j9                  dd|dz    d| dz          t4        j6                  j;                          ||dd|d   |d   |d   |d   f   }!||z  dkD  r(|!ddt        |dz        d|t        |dz        d|f   }!|!ddd|d|f   ||ddddddf<    |rt=        d       t?        d |j"                  D              rt        j@                  |      }ddd       S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   S xY w)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
    r   r   c              3   f   K   | ])  }|j                         xs |d d j                          + y w)Nr   )isdigit.0xs     r   	<genexpr>z!read_hdf5_file.<locals>.<genexpr>  s*     
?a199;)!BQ%--/)
?s   /1 r   Nr/zinput dataset z not found in file r   r   r  Tg?zreading 2D slices z...c              3   &   K   | ]	  }|d k(    ywr   N r  is     r   r   z!read_hdf5_file.<locals>.<genexpr>       .a16.   r   i   @z initiate a 4D matrix in size of z in z in the memory (z.1fz GB) ...zreading 3D cubes c              3   &   K   | ]	  }|d k(    ywr&  r'  r(  s     r   r   z!read_hdf5_file.<locals>.<genexpr>'  r*  r+  )$get_slice_listr  appendr   r   allreplace
startswithh5pyFilekeyslen
ValueErrorr   ndimr   zerosshapebool_indexsumwheretolistsizer   	enumeratesysstdoutwriteflushr  anysqueezeitemsizer   range)"r  r   r   r   r   r  
slice_listds_listr)  
ds_2d_list
ds_3d_listr  dsFamilyinputDateListfdsNames
dsNamesOlddsxsizeysizer  
slice_flagj	date_listd	num_sliceindsindd2num1num2r9  ram_sized3s"                                     r   r  r    sr   ,  &JG'12!aggcl1o2 GNN1 (83a<!8J8$<(;!<J< qzl	K	%"m
 
?;
??7BC!*Q-!-CC 1~##C(+H5@AQYYx+AMA$1GqQ\\#5FQqrUGMG 
5#	 t(!*1~x8JAM1JJ!+IA;q>2B/Cq/HaI
Iw<!71:B_q :a=!B~k]:MeWUVV SVc!f_-.SVc!f_-. 77a<c!fSVm!fSVm$ %D u}q CaL/%/aL/%/0 1FUFFUFN+ WW\288A;rxx@J MbT$9 $
1 *4NAq||H7MaNPAQWWS!_Q/ P	 P& :A59Jyq12: z*I88J'*113Du}!z.588Yu$=RXXND"+D/ 43"$S%(VCF]%(VCF]&3 #4Q4
 a!!fSVm!!fSVm, --79D xxE5 9288D'o 7FAs 

((2DQqSE9+UX0Y)YZ

((* CF3q6MF3q6M* +B CaL/%/aL/%/0 1B$&vvvv~$6DAqM7 "I.4::..zz$' WW\ !bhhqk$D4.E$;.69J9JJWT8tBHH:M]^fgj]kkstu88E288,rvv5D 4[ 9JJ$$T.?!uAdV3,O%OPJJ$$&1As1vAs1v& '
 5=1$AaL/%/aL/%/0 1B $&a%%&7#8Q1aZ 9" b	.4::..zz$'it(l K] 3 9< D BG
 KI@ OPGt(l Ks   Y6	Y;Y;#	Z -Z %ZZ
2Z	Z(
Z(2Z
ZZ(Z$Z(D$Z(Z#Z'Z(,Z#N$Z(Z((Z2c           	      	   t         j                  j                  t         j                  j                  |             d   j	                         }t        | |      }|d   }t        |d         }t        |d         }	|r|ndd|	|f}|j                  dd      j	                         }
|j                  d	d
      j	                         }t        |j                  dd            }|j                  dd      j                         }d}|rV|j                  d      rd}nD|dv rd}n=|j	                         dk(  rd}n'|j	                         j                  d      rd}nd}nd}|dv r|
t        j                         v r	t        |
   }
|d   j	                         j                  dd      }|dv rt        d|      }|r|dv rd}n|dv r|r|dv rd}n|dv rd}nd}nd}n|j                  d       r |r|j                  d!      rt        d|      }nx|d"v r#t        d|      }|rfd#|j	                         vrTd}nQ|rO|j	                         d$k(  rd}n9|j	                         d%k(  rd&}n#t        |       }||v r|j                  |      dz   }t        ||      }t         j                  j!                  |       }t#        j$                  |
      j&                  |z  |	z  |z  }||k7  rt)        j*                  d'| d(| d)       n|d*v rL|d+v rd}d}n|d,v rd-}
n|d.v rd-}
d}nx|d/v rd0}
np|d1v rd2}
nh|d3v rcd}|r^|j                  d4      rLd}nH|d5k(  r|j                  d	d6      }|
t,        j                         v r	t,        |
   }
|d7v rn|d,v rd|j                         v r|
nd-}
n|j/                  d8      r0d|j                         v r|
nd}
d9}d}|r|j                  d4      rd}n|d:v rd|j                         v r|
nd;}
d}n|d<v rd
}n|d=k(  rO|j                  dd>      j                         }|j                  d	d6      }d?|j                         v rC|d?   d@k(  r;d
}n8|dAv r&|r2t        |       }||v r#|j                  |      dz   }nt1        dB|        t3        |||||C      }|dDv rt5        | fi |}nt7        | f||	f|
|||dE|}d|vr|
|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   	PROCESSORr4   rd   r   r   r   
BYTE_ORDERr   r.   r   r1   r   magamp	magnitude)phaseanglerh  realimagcomplex)isce	FILE_TYPE.r!  )unwcorionr   )band1	intensityrg  )slc)	amplituderg  rt  )band2rh  los)rw  azhead)incLocallocalrw  band3r   zfile size (z ) does NOT match with metadata (z)!)roipac).unw.corz.hgtz.msk).intr   ).amp).dem.wgs84r   )z.flgz.bytr:  z.trans)ry  azimuthgammar   )r  r  z.hgt_simr  r  z.rampto_rdc2_rdc2rdcr   ).slcz.rslcr   ).mliz.rmlisnapr   
byte orderr   )r   gmtsarhyp3cosicorruavsarzUnknown InSAR processor: )r   bandcpx_bandr   r   )r   r  r  r  )r9  r!   
byte_ordernum_bandr3   )r  r
  r  r  r  r  r   getupperr1  DATA_TYPE_ISCE2NUMPYr4  r0  minr-  r;  getsizer   r   rG  warningswarnDATA_TYPE_GAMMA2NUMPYendswithr  r	  	read_gdalread_binary)r  r   r   r   r   r  r  	processorr5   re   r!   r  r  r3   r  r  ftyperJ  fsizedsizerI  r  r  s                          r   r  r  -  s`    77BGG,,U34Q7==?D K
8CK IXFGE#1a/C Y/557I7==?J3777C()Hu-335J D!!.1"H..H F*H ++F3H H  H,1133,Y7IK &&(00b9))q(#D{.OOg"GG*H $55&H(H$e$9O9OPe9fq(#Dl"q(#Dwk.?.?.AA  "g-""$/ )/')"==59D4" &#,,v5=HE>MMKw.NugUWXY 
j	 33HDX#IX#I"H''I%%IZH{556GH 
g	WW\<8
 -2244-i8IHHX%0CHHJ%>	KI]]67%0CHHJ%>	IIJH{556GH&&%0CHHJ%>	KI"H&&(J
 
f	WW\51779
 WW\<8
388:%#l*;s*B(J 
F	F'.Jj(!''4q8 	))56 F ::)&) 
5/!!
 
 #$K9r   c                    t        |       \  }}t        |       }|d   }|dv rht        j                  | d      5 }|j	                         D cg c]"  }t        ||   t        j                        s!|$ }}ddd       |dk(  r3|v r/t        |       }	|	j                  d       |	j                  a
t        S |dv r3|vr/t        |       }	|	j                  d       |	j                  a
t        S |d	v r/t        |       }	|	j                  d       |	j                  a
t        S |d
v r/t        |       }	|	j                  d       |	j                  a
t        S |dv r/t        |       }	|	j                  d       |	j                  a
t        S |dv r/t        |       }	|	j                  d       |	j                  a
t        S |dk(  r_dv r[t        j                  | d      5 }|d   dd }
ddd       
D cg c]"  }dj!                  |j#                  d            $ c}a
t        S t%        |d         t%        |d         cfd}g a
t        j                  | d      5 }|j'                  |       ddd       |dk(  rt)        t              a
t        S t%        |j+                  dd            }|j+                  dd      }|dv s|j-                  d      r
ddga
t        S |j/                  d      r|dk(  r
dd ga
t        S |d!v r
d"d#ga
t        S |d$v s|j/                  d%      r|d&k(  r|r
d"d#ga
t        S d'ga
t        S d(|v r$|dk(  rd)d*ga
| j-                  d+      rd*d)ga
t        S d(|v r(d,| v r$|d-k(  rg d.a
| j-                  d/      rg d0a
t        S |d1v r
g d2a
t        S |d3v r
g d4a
t        S t1        |      D cg c]
  }d5|d&z     c}a
t        S c c}w # 1 sw Y   [xY w# 1 sw Y   xY wc c}w # 1 sw Y   xY wc c}w )6zGet list of 2D slice existed in file (for display).

    Parameters: fname      - str, path to the data file
                no_complex - bool, convert complex into real/imag parts
    Returns:    slice_list - list(str), list of names for 2D matrices
    rn  r  r"  Nr   F)r  )r   )r
   )r   )r	   )r   ru  datezslc-{}zUTF-8r4   rd   c                    t        |t        j                        r|j                  dd  fk(  r|j                  dk(  rt
        j                  |        y |j                  dk(  r6t
        t        |j                  d         D cg c]  }|  d|dz     c}z  ay t        j                  d|j                   d|         y y y c c}w )	Nr   r   r   r   r   zfile has un-defined zD dataset: )
r   r2  Datasetr9  r7  rI  r.  rH  r  r  )nameobjr)  r5   re   s      r   get_hdf5_2d_datasetz+get_slice_list.<locals>.get_hdf5_2d_dataset-  s    c4<<0SYYrs^PU5Vxx1}"))$/Q"ciiPQl@S&T1$q1&TT
 (<SXXJkRVQW&XY 6W0 'Us   Cvelocityr.   r   r   r   r  r  
rangeCoordazimuthCoordrx  r   incidenceAngleazimuthAngle)r  z.ionrg  rh  )r  r  cr   rl  offsetazimuthOffsetrangeOffset_denseoffset.offcovr   )azimuthOffsetVarrangeOffsetVaroffsetCovarz_denseoffset.cov)r  r  r  ).lkv)eastnorthup).llh)latitude	longitudeheightr  )_get_file_base_and_extr  r2  r3  r4  r   r  r   open	sliceListrI  r   r
   r   r	   r   formatdecoder   
visititems_sort_dataset_list4velocityr  r  r1  rH  )r  
no_complexfbaser  r  r  rO  r)  d1_listr  datesr  r  r   r5   re   s                 @@r   r-  r-    sk    )/KE4

CE YYuc" 	Na"#&&(MQj1t||.LqMGM	N L Ug%5U#CHHuH%JJ G l"uG';5/CHHuH%J@ } o%e$CHHuH%Jv s j -CHHuH%Jl i ))!%(CHHuH%Jb _ **"5)CHHuH%JX U l"u'75#& %!&	!%FKL(//!((7*;<LJN G  H.CL0AMFEZ J5#& 2!012 
"8D
` Y swww,-Y/:/J!K&7JN K e$Q*N;JF C %%%w/J@ = %%%*:*:3*?HPQM)73
8 5 ([
4 1 8q=)=9J~~01 ,_=
$ ! 5E>h!mNJ~~01R
  X0J  X<J
  16h@1D1,@JU N	N 	ND% %L$2 2f AsG   O"O2O6O	O/'O+O04O=OOO(0O:c                    |r|gS t         j                  j                  |       d   j                         }|dv r}t	        |       }t        |d         t        |d         cfd}g at        j                  | d      5 }|j                  |       ddd       |d   d	k(  rt        t              at        S t        |       at        S # 1 sw Y   7xY w)
a  Get list of 2D and 3D dataset to facilitate systematic file reading.

    Parameters: fname       - str, path to the data file
                datasetName - str, dataset of interest
    Returns:    ds_list     - list(str), list of names for 2D/3D datasets
    r   r  r4   rd   c                     t        |t        j                        r+|j                  dd  fk(  rt        j                  |        y y y )Nr  )r   r2  r  r9  rJ  r.  )r  r  r5   re   s     r   get_hdf5_datasetz*get_dataset_list.<locals>.get_hdf5_dataset  s;    #t||,23FE?1Rt$ 2S,r   r"  Nrn  r  )r  r
  r  r  r  r   rJ  r2  r3  r  r  r-  )r  r   r  r  r  rO  r5   re   s         @@r   get_dataset_listr  q  s     } 77E"1%++-DU#CM*CG,=	% YYuc" 	+aLL)*	+ {z)1':G
 N !'N	+ 	+s   C

Cc                    dD cg c]	  }|| v s| }}dD cg c]	  }|| v s| }}dD cg c]	  }|| v s| }}t        | D cg c]!  }|j                  d      s|||z   |z   vs |# c}      }t        | D cg c]  }|||z   |z   |z   vs| c}      }||z   |z   |z   |z   }|S c c}w c c}w c c}w c c}w c c}w )a  Sort the dataset list for velocity file type.

    1. time func datasets [required]: velocity
    2. time func datasets [optional]: alphabetic order
    3. time func STD datasets [optional]: velocityStd
    4. time func STD datasets [optional]: alphabetic order
    5. residue

    Parameters: ds_list - list(str), list of names for 2D/3D datasets
    Returns:    ds_list - list(str), list of names for 2D/3D datasets
    r  )velocityStd)	interceptinterceptStdresidueStd)sortedr  )
ds_list_inr  ds_list1ds_list3ds_list5ds_list4ds_list2rJ  s           r   r  r    s     (;a1
?;H;*>aa:o>H>CWaqJWHW*nQ

50AaxZbObemOmFmqnoH*cQH9Lx9WZb9b0bqcdH!H,x7(BGN <>Wncs<   	B*B*	B/B/	B4B4B9
B9(B9<B>B>c                    t         j                  j                  |       d   }|dvryi }t        j                  |       5 }|j                         D cg c]"  }t        ||   t        j                        s!|$ }}|D ]7  }|||   j                  j                         v s#||   j                  |   ||<   9 	 ddd       |S c c}w # 1 sw Y   |S xY w)zGet the top-level dataset attribute for the given HDF5 file.

    Parameters: fname - str, path to the HDF5 file
    Returns:    attrs - dict, key/value of all top-level datasets
    r   r  N)	r  r
  r  r2  r3  r4  r   r  attrs)r  keyr  r  rO  r  ds_namesds_names           r   get_hdf5_dataset_attrsr    s     77E"1%D?" E 
5	 7Q vvxJ!:adDLL+IAJJ   	7Gaj&&++--!"7!1!1#!6g	77 L K7 Ls)   C"C5C9&C CCCc                    t         j                  j                  |       d   j                         }|dvryd}t	        |       d   }t        j                  | d      5 }||   j                  }ddd       |S # 1 sw Y   |S xY w)z+Get the compression type of input HDF5 filer   r  Nr   r"  )r  r
  r  r  r  r2  r3  compression)r  extr  r  rO  s        r   get_hdf5_compressionr    s~    
''

5
!!
$
*
*
,C
. Ku%a(G	5#	 -!j,,--s   A66B c                    t        |       j                  dd      }t        |      j                         }t	        j
                  |      rt        |      }|S |t        j                         v rt        |   }|S t        d|       )zGrab the NO_DATA_VALUE of the input file.

    Parameters: fname - str, path to the data file
    Returns:    val   - number, no data value
    rP   Nz"Un-recognized no-data-value type: )
r  r  r   r  ut	is_numberr   SPECIAL_STR2NUMr4  r6  )r  vals     r   get_no_data_valuer    s     

#
#OT
:C
c(..
C	||CCj
 J	 
$$&	&c" J =cUCDDr   c                 
   t         j                  j                  t         j                  j                  |             \  }}|j	                         }|dv r't         j                  j                  |      \  }}|dv r'|r|n|}||fS )zGrab the meaningful file basename and extension.

    Parameters: fname - str, path to the (meta)data file
    Returns:    fbase - str, file basename
                fext  - str, file extension in lower case
    )z.geoz.rdrz.fullr  r  r   z.bilz.bip)r  r
  r  r  r  )r  r  r  s      r   r  r    sy     ''""277#3#3E#:;KE4::<D U
Ugg&&u-t U
U 4UD$;r   c                   %& t        j                  |       } t         j                  j                  |       }t         j                  j	                  t         j                  j                  |             \  }}|j                         }t         j                  j                  |       s+d|  d}|dt        j                         z   z  }t        |      |dv r|r|j                  d      d   }t        j                  | d      5 }t        |j                        }|j                         D 	cg c]"  }	t!        ||	   t        j"                        s!|	$ c}	&|j                         D 	cg c]5  }	t!        ||	   t        j$                        s!||	   j&                  dk\  s4|	7 c}	%d	d	d	       g d
}
t)        %fddD              rd}nt)        %fddD              rd}nt)        %&fddD              rd}nt)        %fddD              rd}nd&v rd}nd%v rd}nt)        %fddD              rd}nxt)        &fd|
D              r$t+        t-        &      t-        |
      z        d   }n@dv r|d   }n6t/        %      dkD  r%d   }n"t/        &      dkD  r&d   }nt1        d| z         |dk(  rt3        |       j5                         }n|dk(  rt7        |       j5                         }nt/              dkD  r_d |j                         v rM|r|%v rt        j                  | d      5 }|j9                  t        ||   j                               d	d	d	       nd! }g at        j                  | d      5 }|j=                  |       d	d	d	       t:        r9t:        D 	cg c]  }	t/        |	       }}	t:        t?        j@                  |         }nt1        d"|       |jC                         D ]  \  }}	 |jE                  d#      ||<    tG        |      |d<   d	}t        j                  | d      5 }|r||j                         v r||   }n%d$ }g a$|j=                  |       tH        r	tH        d   }|tG        |jJ                        |d%<   d	d	d	       d&|j                         v r|d&   |d'<   d'|j                         vrPd(|d'<   nI|d)k(  ri }d*|d+<   d,|d <   d-|d.<   d/|d0<   d1|d2<   d1|d3<   tM        |d	d       tM        |dd	       }}|d4z   d5z  |d6<   |d7z   |d8<   d9|d'<   ||d<   d:|d%<   d;|d<<   d=|d><   d?|d@<   t         j                  jO                  |       |d+   |d    z  dAz  k7  rdB}|dCjQ                  |d+   |d    |d%         z  }t1        |      |dDv r|j                  dE      d	dA \  }}}}tS        jR                  t         j                  jU                  || dE| dF| dE| dG            }t/        |      dkD  r8tW        |d         }i }|j                  dE      dHd	 \  }}|jY                  dI      r%|dJ|dKd	  dE| dL   |d+<   |dJ|dKd	  dE| dM   |d <   npt[        |dN         }dO\  }}t]        dK|dKz         D ]/  }	|t[        |dJ|	 dE| dL         z  }t[        |dJ|	 dE| dM         }1 tG        |      |d+<   tG        |      |d <   |dP   j                         dQk(  rdRndS|dT<   dU|d'<   dU|dV<   ||d<   d:|d%<   |j                  dW      d   |dX<   |j                  dW      dK   |dY<   dZ|d[<   d\|d]<   nt        d^      | d_z   | d`z   | daz   | dbz   t         j                  j	                  |       d   dbz   | dcz   | ddz   g}|D 	cg c]$  }	t         j                  j                  |	      s#|	& }}	|r!|D 	cg c]  }	|	j_                  |      s|	 }}	|t`        v r&t         j                  j                  | d_z         s| g}nt/        |      dk(  rt        de|        i }| j_                  df      rt)        dg |D              rdh|d'<   nt)        di |D              rRdj|d'<   |D 	cg c]  }	|	j_                  d`      s|	 } }	t/        |       dkD  rm|j9                  tc        | d                nOt)        dk |D              rdl|d'<   n7t)        dm |D              rd'|j                         vrdn|d'<   n|t`        v rdo|d'<   d'|j                         vrd(|d'<   |d   }!t         j                  j	                  |!      dK   j                         }"te        |       \  }}|"d_k(  r4|j9                  tg        |!             d|j                         vrB||d<   n;|"d`k(  r4|j9                  tc        |!             d|j                         vr	||d<   n|"dak(  r |j9                  ti        |!             ||d<   n|"dbk(  r|j9                  tk        |!             |d'   dhk(  rt         j                  j                  |       j                         }|jY                  dp      rdq|d<   nr|jY                  dr      rds|d<   n[|jY                  dt      rdu|d<   nDdv|v rdv|d<   n:|dw   |d<   n1||d<   n+|"dcgt`        z   v r|j9                  tm        |!             ||d<   dxd:dydzd:d{}#|jo                  d%d|      j                         }$|$d|k7  r|$|#j                         v r|#|$   |d%<   |r&|jq                  d}d~      }|j                  d      d   }|d   jq                  dd~      }|dk(  r+|r#|ts        j                         v rtr        |   |d@<   nd|d@<   n|rN|ts        j                         v r8tr        |   |d@<   |dk(  ra|jo                  d%d:      jY                  d      r@dR|d@<   n:d@|j                         vr(|ts        j                         v rtr        |   |d@<   ndR|d@<   d|j                         v rd|j                         vr|d   |d<   t         j                  ju                  |       |d<   tw        |      |d<   ty        |      }|S c c}	w c c}	w # 1 sw Y   
xY w# 1 sw Y   xY w# 1 sw Y   	xY wc c}	w #  |||<   Y xY w# 1 sw Y   *xY wc c}	w c c}	w c c}	w )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 does not exist: 
zcurrent directory: r  r   r   r"  r   N)interferograms	coherencewrappedc              3   &   K   | ]  }|v  
 y wNr'  r  r)  r  s     r   r   z!read_attribute.<locals>.<genexpr>   s     UqG|U   )unwrapPhaser  r  r
   c              3   &   K   | ]  }|v  
 y wr  r'  r  s     r   r   z!read_attribute.<locals>.<genexpr>"  s     N!gNr  )r  r  r  r   c              3   ,   K   | ]  }|z   v   y wr  r'  )r  r)  r  g1_lists     r   r   z!read_attribute.<locals>.<genexpr>$  s     >!ggo%>s   )r   r   c              3   &   K   | ]  }|v  
 y wr  r'  r  s     r   r   z!read_attribute.<locals>.<genexpr>&  s     4!g4r  r  r  r   reconsr	   c              3   &   K   | ]  }|v  
 y wr  r'  r  s     r   r   z!read_attribute.<locals>.<genexpr>,  s     ;!g;r  )igramfigramr   c              3   &   K   | ]  }|v  
 y wr  r'  )r  r)  r  s     r   r   z!read_attribute.<locals>.<genexpr>.  s     >!g>r  rn  zunrecognized file type: rd   c                     t        |j                        dkD  rFd|j                  j                         v r)t        j	                  t        |j                               y y y )Nr   rd   )r5  r  r4  atr_listr.  r	  r  r  s     r   get_hdf5_attrsz&read_attribute.<locals>.get_hdf5_attrsL  sA    syy>A%'SYY^^5E*EOODO4 +F%r   z!No attribute WIDTH found in file:utf8c                     t        |t        j                        r&|j                  dk\  rt        j                  |       y y y )Nr   )r   r2  r  r7  rJ  r.  r  s     r   r  z(read_attribute.<locals>.get_hdf5_datasetq  s/    !#t||4Qs+ :G4r   r   INSAR_PROCESSORrb  mintpyz.dehmip  r4   i(#  g2.Z r   g2.Z ?r   degreesY_UNITX_UNIT      ?g      ?r   g      Y@r   GSIr   LATLON
PROJECTIONWGS84GEODETIC_DATUMmUNITr   zAinput DEHM file size do NOT match with the pre-defined 10m DEHM: z{} * {} in {}!)r  r  _z_*_z.annr  sslc_r   z Rowsz ColumnszNumber of Segments)r   r   zLook Directionleftr   -1ANTENNA_SIDEr  rR   r  r   r   r   r.   r   r1   zNo UAVSAR *.ann file found!.rsc.xml.par.hdr.vrtz.aux.xmlz&No metadata file found for data file: z.imgc              3   >   K   | ]  }|j                  d         yw)r"  Nr  r(  s     r   r   z!read_attribute.<locals>.<genexpr>  s     )P!**V*<)P   r  c              3   >   K   | ]  }|j                  d         yw))r   r"  r#  Nr%  r(  s     r   r   z!read_attribute.<locals>.<genexpr>  s     I!45Ir&  rm  c              3   >   K   | ]  }|j                  d         yw)r!  Nr%  r(  s     r   r   z!read_attribute.<locals>.<genexpr>       7F#7r&  r  c              3   >   K   | ]  }|j                  d         yw)r  Nr%  r(  s     r   r   z!read_attribute.<locals>.<genexpr>  r)  r&  r~  r   rp  r  )cohrq  r  	phase_ifgr  demz	file typer   r   r   )r   r   r   r   ci2r   r  r!  r#  ro  radianrl  	FILE_PATHOG_FILE_PATHrP   )=r  r  r
  dirnamer  r  r  isfilegetcwdFileNotFoundErrorr  r2  r3  r	  r  r4  r   Groupr  r7  rE  r  setr5  r6  r	   get_metadatar   updater  r  r   argmaxitemsr  r   rJ  r   r   r  r  globjoinread_uavsar_annr1  r   rH  r  GDAL_FILE_EXTSread_isce_xmlr  read_roipac_rscread_gamma_parread_envi_hdrread_gdal_vrtr  r0  r   abspathauto_no_data_valuestandardize_metadata)'r  r   metafile_extfdirr  r  msgrO  r  r)  py2_mintpy_stack_filesr  r	  num_listr  valuerR  r  yyxxsitelineversionbcorr	ann_filesannsegmlinum_segr5   re   	metafiles	xml_filesmetafilemeta_extdata_type_dictr!   r  r  s'                                        @@r   r  r    s    IIeE77??5!D''""277#3#3E#:;KE4::<D77>>% +E7"5$RYY[00$$ %++C03KYYuc" 	aaqww-C"#&&(KQj1tzz.JqKG"#&&(`Qj1t||.LQRSTQUQZQZ^_Q_q`G	a "LU%TUU!EN'MNNE>~>> E4|44E E %E;':;;&E>'=>>W,B(CCDQGEC$E\AAJE\AAJE7=>> %%!%(557C(("5)668CX\g3 {g5YYuc* ;aJJtAkN$8$89:; ;5
 H5#& -!^,- ,45qCF55ryy23 !DeLL ))+ 	!JC! <</C	! u:K YYuc" 	1a{affh6{^
,
 -. B~#&rxx=K '	1, 
*"#45Cchhj('C	HG%H%H!H!H uRay!5qr#3Br'SIdI KK$K$L 'F 77??5!S]S\%AA%EEUC#**3x=#g,KHXYYCS/!	!	! &+[[%5bq%9"dGUIIbggll4D64&G9AeWTX1YZ[	y>A!)A,/CC {{3',HC~~c" #d3qr7)1SE$? @H #d3qr7)1SE$B CG c"678 $q'!), ?Ac#QCqU&;"<==Fd1#Qse8$< =>E? !$FH"5zG),-=)>)D)D)F&)P#VZC'C&C
O#C(CIIcN1-CMIIcN1-CMCL %C $$ABB FNFNFNFNGGU#A&/FNJ
	 !*?1RWW^^A->Q?	? $-JqL1IJIJ >!"''..*HI^q #&LUG$TUU>>&!c)Pi)P&P%CIyII%C$-DqF1CDID9~!

=1677Y77&C7Y77#((*,#+K ^#%Cchhj('C Q<77##H-a0668 -U3tvJJx01#((*,#'K JJ}X./#((*,#'K JJ~h/0#CJJ}X./ ;6)((/557##E*'-C$%%m4'-C$%%k2'-C$e^',C$'*;'7C$#'K &N22JJ}X./#C
 !
 GGK0668	90C0C0E#E-i8C  "))%3!'',R0$$S"-E;.*=*=*??(5CK"CK	(;(;(==$[1F,&377;	+J+U+UV_+`CK	sxxz	!N''))(/CKCK chhj ^388:%E!+.Nwwu-C .c2C
s
#CJ	 L`	a 	aX; ;- -
 6! C	1 	1V @ K  Es   (q0)"q&q&q0%"q+q+q+q0#(q=/r
r+r'Ar);$r6 r6,r;r;s 0s &
q00q:=r
rr&)r3c                 t   d| j                         v r| d   }n| d   }| d   }t        |      \  }}t        | j                  dd            }|dk(  rN|dk(  r|j	                  d      rd	}n7|dk(  r|j	                  d
      rd}n|dk(  r|j	                  d      rd}nd}nd}t        |      j                         S )zGet default no-data-value for the given file's metadata.

    Parameters: meta          - dict, metadata
    Returns:    no_data_value - str, no data value in lower case string
    rP   rb  r1  r.   r   rm  r   zdense_offsets.bilg     r  g        r   )zalks_rg.offzalks_az.offg    ~.N)r4  r  r   r  r  r   r  )metano_data_valuer  r  r  r  r  s          r   rG  rG  \  s     $))+%_- %	[!,U3ttxx+, 1}0C!D 'Q5>>2D#E "Q5>>2P#Q ) $ !M}##%%r   c                    t               }t        | j                               D ]
  \  }}|||<    |j                         D cg c]  }||j                         vs| }}|j                         D cg c]  }||j                         vs| }}|D ]5  }||   }	|	D cg c]	  }||v s| }	}t	        |	      dkD  s+||	d      ||<   7 |S c c}w c c}w c c}w )zPConvert metadata into ROI_PAC/MintPy format (for metadata with the same values).r   )r	  iterr<  r4  r5  )
in_metastandard_keysout_metar  rN  r)  in_keysstd_keysstd_key	cand_keyss
             r   rH  rH    s     vH7==?+ 
U #--/KQQm6H6H6J-JqKGK(--/La1HMMO3KLHL  7!'*	 ):1Q'\Q:	:y>A (1 6HW	7 O LL
 ;s$   CC3CC	C)Cc                 V   |rt        |t              r|g}t        j                  j	                  |       r%t        |       5 }|j                         }ddd       n!t        | t              r| j                  d      }D cg c]  }|j                          }}i }|D ]  }|j                  |d      D cg c]  }|j                          }	}t        |	      dk\  s?|j                  d      rQ|	d   }
t        j                  |	d   dd      j                  d      d   j                         }t        j                  j                  |      }t        j                  j                  |      }|r|D ]  }|j                  |d      } |dk7  s|||
<    |S # 1 sw Y   #xY wc c}w c c}w )	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 characters in values
    Returns:    template   - dict, file content
    Examples:   template = read_template('KyushuAlosAT424.txt')
                template = read_template('smallbaselineApp.cfg')
    Nr  r   r   )%#!r   r!  rm  )r   r   r  r
  r4  r  	readlinesr  stripr5  r1  r0  
expanduser
expandvars)r  	delimiter
skip_charsrO  r7   r  templaterR  r)  r  r  rN  	skip_chars                r   read_templaterw    s    jS1 \
 
ww~~e%[ 	"AKKME	" 	"	E3	D! %&1QWWY&E& H & $

9a 891QWWY99 q6Q;t?A$CKK!dB/55c:1=CCEEGG&&u-EGG&&u-E !+ 9I!MM)R8E9 { %#&& O7	" 	" ' :s    F?F!3F&Fc                    t        |       5 }|j                         }ddd       i }D ]z  }|j                         j                  dd      j	                  |d      D cg c]  }|j                          }}|d   }|d   j                  dd      j                         }	|	||<   | t        |      }|S # 1 sw Y   xY wc c}w )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')
    N	 r   r   r  r!  )r  ro  rp  r0  r  rH  )
r  rs  rO  r7   rscDictrR  r)  r  r  rN  s
             r   rB  rB    s     
e  G  $

 4 4T# > D DYPQ RS1QWWYSSd!T2&,,.	 #7+GN  Ts   B3B?3B<c                     t        |       5 }|j                         |d }ddd       i }D ]  }|j                         j                  |d      D cg c]  }|j                          }}t	        |      dk  s|j                  d      rt         d|d   }	t        j                  |d   dd      j                  d      d   j                         d   j                         }
|
||	<    t        |      }t        |      }|S # 1 sw Y   xY wc c}w )	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
    Nr   r   )rl  rm  r   r  r!  rm  )r  ro  rp  r  r5  r1  nextr   r0  _attribute_gamma2roipacrH  )r  rs  skiprowsrO  r7   parDictrR  r)  r  r  rN  s              r   rC  rC    s     
e )hi() G ! $

 2 29a @A1QWWYAAq6A:4A$CKK!dB/55c:1=CCEaHNNPE GCL! &g.G"7+GN#) ) Bs   C?D?Dc                    t               }t        | j                               D ]
  \  }||<    | j                         D ]  t	        fddD              s|   |d<   ! | j                         D ]  t	        fddD              s|   |d<   ! d| j                         v r#t        |         }t        t        |z        |d<   d	| j                         v rOt        |         }t        |      |d
<   d}|| j                         v rt        ||         }t        ||z
        |d<   d| j                         v r|   |d<   d| j                         v r4t        |         }d|cxk  rdk  sn d|cxk  rdk  r	n nd|d<   nd|d<   d| j                         v r(t        |         }d|cxk  rdk  r
n nd|d<   |S d|d<   |S )z2Convert Gamma metadata into ROI_PAC/MintPy format.c              3   @   K   | ]  }j                  |        y wr  r1  r  r)  r  s     r   r   z*_attribute_gamma2roipac.<locals>.<genexpr>	  s       KQs~~a  K   )r8   r9   r:   r;   r4   c              3   @   K   | ]  }j                  |        y wr  r  r  s     r   r   z*_attribute_gamma2roipac.<locals>.<genexpr>  s       CQs~~a  Cr  )re   rh   ri   rd   radar_frequencyr_   r%   r#   sar_to_earth_centerr+   r   rR   r)   i  ih  iZ   	ascendingrM   
descendingazimuth_angler      r  r  r   )r	  rc  r<  r4  rE  r   r   SPEED_OF_LIGHT)par_dict_inpar_dictrN  Rekey2r  s        @r   r~  r~    s0   vH;,,./ 
U ! / K +J K K "*#HX/ ! . C +B C C !)HW	. C
k  hsm$!$^e%;!< &C
k  8C=!#&r7 $;##%%(4.)E!$URZHX C
k  '} C
k  hsm$%#3#3#3*5H&'*6H&' C
k  hsm$u?s?'+H^$ O (+H^$Or   c                 8   t        j                  |       j                         }i }|j                  j	                  d      rB|j                  d      D ]A  }|j                  d      j                         }|j                  d      j                  }|||<   C t        ddgddg      D ]  \  }}|j                  d	| d
      }|j                  d	| d      }	|$t        |j                  d      j                        nd}
|	$t        |	j                  d      j                        nd}||
dt        |
      cxk  rdk  sn |
|| d<   ||
dz  z
  || d<   d|| d<    t        |d   j                            |d<   n|j                  dk(  r{|j                  d      }|j                  d      D ]$  }|j                  d      }|j                  }|||<   & t        |d      |d<   |j                  d      }||j                  |d<   n|j                  j                  d      rf|d   j                  d      D ]O  }|j                  d      j                         }|j                  d      }||j                  n|j                  ||<   Q t!        |      }|S )z1Read ISCE .xml file into a python dict structure.imagepropertyr  rN  coordinate1coordinate2XYz./component[@name='z']/property[@name='delta']z"']/property[@name='startingvalue']NHz>r  _STEP       @_FIRSTr  _UNITr!   
PAMDatasetz./Metadata[@domain='ENVI']MDIr  z./PAMRasterBand/NoDataValuerQ   Appr   )ETparsegetroottagr1  findallr  r  findtextzipr   absr  DATA_TYPE_ENVI2NUMPYr  rH  )r  rootxmlDictchildr  rN  
coord_nameprefixe_stepe_firstv_stepv_firstr`  s                r   rA  rA  A  s   88E?""$DG xx7#\\*- 	!E))F#))+CJJw',,E GCL	! #&}m&DsCj"Q 		6Jii"5j\A[ \]Fii"5j\Ac deG;A;NeFKK0556TXF;B;NeGLL1667TXG"v'9dS[>USU>U,26(%()-4v{-B6(&)*,56(%()		6  4GK4H4N4N4PQ 
\	!yy56\\%( 	!E))E"CJJE GCL	!  4GK4HI yy67%)YYGM" 
		5	!!W__Z0 	KE))F#))+CJJw'E).):5::

GCL	K #7+GNr   c                    t        | d      }t        |j                  dd         |d<   t        |j                  dd         |d<   d	|j	                         v r|d	   j                  d
      D cg c]2  }|j                  dd      j                  dd      j                         4 }}t        t        |d               }t        t        |d               dz  }t        |      dk  rtt        |      dkD  rfd|d<   d|d<   t        |      |d<   t        |      |d<   t        t        |d         |dz  z
        |d<   t        t        |d         |dz  z
        |d<   t        |      }|S c c}w )z0Read ENVI .hdr file into a python dict structure=)rs  z	data typer   r   r  r   rc  zmap info,{r!  }r   r         r  r  r  r  r  r   r   r   r  r   r   r   )rw  r  r  ENVI_BYTE_ORDERr4  r  r0  rp  r  r   r   rH  )r  r  r)  map_infox_stepy_steps         r   rD  rD  z  s[   

-C+CGGK,EFC'c(BCC SXXZGJ:G\G\]`Gab!AIIc"%--c"5;;=bbU8A;'(U8A;'(3. v;Fd 2%CM%CMKCMKCM x{!3frk!ABC	N x{!3frk!ABC	N
s
#CJ cs   /7E(c                    	 ddl m}m} |j	                  t        j                  |       |j                        }i }|j                  |d<   |j                  |d<   |j                  |d<   t        |j                  d      j                     |d<   |j                  d	      j                  d
d      }t         |   |d
<   |j#                         }|d   }|d   }t%        |d         }	t%        |d         dz  }
|	|d<   |
|d<   ||d<   ||d<   |j'                  |j)                               }|j+                  dd      |d<   |j-                         }|r4d|v r0|j/                  d      d   j1                         |d<   d|d<   d|d<   n;t%        |	      dk  r-t%        |	      dkD  rd|d<   d|d<   |d   d kD  r|dxx   d!z  cc<   |j                  d      j3                         |d"<   t5        |      }|S # t        $ r t        d      w xY w)#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!rd   r4   r.   r   r   IMAGE_STRUCTUREr1   r   r   r   r  r   r   r   r   )wkt	AUTHORITYEPSGUTMzUTM zoner/  UTM_ZONEmetersr  r  r  r  r  g     f@g     v@rQ   )r   r   r  ImportErrorOpenr  r  GA_ReadOnlyRasterXSizeRasterYSizeRasterCountDATA_TYPE_GDAL2NUMPYGetRasterBandDataTypeGetMetadatar  ENVI_BAND_INTERLEAVEGetGeoTransformr  SpatialReferenceGetProjectionGetAttrValueGetNamer  rp  GetNoDataValuerH  )r  r   r  rR  r  r3   	transformx0y0r  r  srssrs_names                r   rE  rE    s   
9# 
299U#T%5%5	6B
CNNCLNNCM>>CL ,B,<,<Q,?,H,HIC  1266|WMJ,Z8C ""$I	1B	1B1F1$FCMCMC	NC	N 

2#3#3#5

6C"";2CK{{}HEX%"..4R8>>@J H H	Vr	c&kD0!H!Hy>D 	Nd"N ))!,;;=C
s
#CJs  97889s   G, ,Hc                 
   d}t        |       5 }|j                         }ddd       i }|D ]  }|j                         }|j                  |d      D cg c]  }|j                          }}t	        |      dk\  sO|j                  |      ra|d   j                  d      d   j                         }	t        j                  |d   dd      j                  |      d   j                         }
|
||	<    |S # 1 sw Y   xY wc c}w )z5Read the UAVSAR annotation file into dictionary.
    Nr   r   r   (r  r!  )r  ro  rp  r  r5  r1  r   r0  )r  commentrs  r7   rO  r`  rR  r  r  r  rN  s              r   r?  r?    s     E	e  D zz| $

9a 891QWWY99q6Q;tw7A$**S/!$**,CKK!dB/55g>qAGGIEDI K  :s   C4D 4C=c                    t        |       5 }|j                         }ddd       i }D ]z  }|j                         j                  dd      j	                  |d      D cg c]  }|j                          }}|d   }|d   j                  dd      j                         }	|	||<   | t        |      }t        |      }|S # 1 sw Y   xY wc c}w )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.
    Nry  rz  r   r   r  r!  )r  ro  rp  r0  r  _attribute_gmtsar2roipacrH  )
r  rs  rO  r7   prmDictrR  r)  r  r  rN  s
             r   read_gmtsar_prmr    s     
e  G  $

 4 4T# > D DYPQ RS1QWWYSSd!T2&,,.	 'w/G"7+GN  Ts   B>C
>Cc                    t               }t        | j                               D ]
  \  }}|||<    d}|| j                         v r#||   }|j	                         dk(  rd|d<   nd|d<   d}|| j                         v rddd	||      |d
<   d}|| j                         v rKt        ||         }t        |d         }t        |d         }t        |d         }||z  |z  ||z   z  }||d<   d}|| j                         v rt        ||         }t        |z  dz  |d<   t        |d         t        |d         z   dz  }	|	t        |	      z
  }
t        |
dz  dz  dz        |d<   t        t        |d            |d<   |S )zXConvert GMTSAR metadata into ROI_PAC/MintPy format (for metadata with different values).lookdirRr  r  r   orbdir	ASCENDING
DESCENDING)ADrM   SC_velr&   rW   r-   r   rng_samp_rater  r   SC_clock_startSC_clock_stopg      8@      N@r   SC_identityrR   )
r	  rc  r<  r4  r  r   r  r   r   GMTSAR_SENSOR_ID2NAME)prm_dict_inprm_dictr  rN  velr  rW   r  az_pixel_size	dt_centert_centers              r   r  r    s   vH;,,./ 
U C
k  ;;=C'+H^$'*H^$ C
k  '
 3-'"# C
k  HSM"8N+,HUO$x,-c	B"v+6)6%& C
k  hsm$'5'='C#$ x 012U8O;T5UUY\\I3y>)H"%hns&:S&@"AH 1Xm5L1MNHZOr   c           	      r	   t        j                  |       j                         }|j                  d      }i }d|d<   t        j
                  j                  |       j                  d      d   j                         |d<   |j                  d      D ]2  }|j                  d      j                         }|j                  }|||<   4 t        |      }|d	   d
k(  rdnd|d<   t        j                  j                  |d   d      }t        j                  j                  |d   d      }|||z
  dz  z   }	|	j                   dz  |	j"                  dz  z   |	j$                  z   }
|
|d<   |j                  d      }|j                  d      j                  |d<   |j                  d      j                  |d<   |j                  d      j                  |d<   |j                  d      }t'        |j                  d      j                        }t'        |j                  d      j                        }t'        |j                  d      j                        }t)        j*                  |||f      \  }}||d<   ||d <   t-        j.                  |d!         |d!<   t0        t'        |d"         d#z  z  |d$<   |j                  d%      j                  j                  d&      }|D cg c]  }t3        t'        |             }}|d'   |d(<   |d)   |d*<   |d+   |d,<   |d-   |d.<   d/|d0<   d/|d1<   t'        |d2         t'        |d2         z   d3z  |d4<   t)        j4                  ||d4         |d5<   |j                  d6      j                  d7      d'   j                  d7      }|D cg c]3  }|j                  d      j                  d8      d9   j7                         5 }}t9        d: |D              \  }}|dd;  d<|dd;  |d=<   |D cg c]  }|j                  d>      j                   }}|D cg c]  }t'        |      d'k7  s| c}d'   }||d?<   ||d@<   |j;                         D ]  \  }}t3        |      ||<    dAD ]8  }||j=                         v st3        t?        t'        ||                     ||<   : |S c c}w c c}w c c}w c c}w )Ba(  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  rb  r  r  rn  MDATTRr  antenna_pointingrightr  r   r  first_line_timez%d-%b-%Y %H:%M:%S.%flast_line_timer   g      @r  r   z'Image_Interpretation/Spectral_Band_Infor   BAND_RASTER_HEIGHTr4   BAND_RASTER_WIDTHrd   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#   rR   r  g    .Ar_   z$Geoposition/IMAGE_TO_MODEL_TRANSFORMr  r   r   r   r   r   r   r   r   r  r  r  incidence_nearr  INCIDENCE_ANGLESLANT_RANGE_DISTANCEzMDElem[@name='Baselines']MDElem:r   c              3   z   K   | ]3  }t         j                  j                  |d       j                  d       5 yw)z%d%b%Yz%Y%m%dN)dtdatetimestrptimestrftimer  s     r   r   z read_snap_dim.<locals>.<genexpr>  s-     `UVBKK00H=FFxP`s   9;Nr   DATE12zMDATTR[@name='Perp Baseline']P_BASELINE_TOP_HDRP_BASELINE_BOTTOM_HDR)r   r   r4   rd   ) r  r  r  r  r  r
  r  r  r  r  r  r  rH  r  r	  r
  hourminutesecondr   r  xyz_to_local_radiusr   standardize_sensor_namer  r   $incidence_angle2slant_range_distancerp  r  r<  r4  r   )r  r  rR  dim_dictr  r  rN  	start_utcend_utc
center_utccenter_secsr  orbitx_posy_posz_posr  radiusr  r)  basesr  r  date1date2pbasespbases                              r   read_snap_dimr$  8  s    88E?""$D	a	bB H"H[GG,,U399#>rBHHJH[ H% ii%%'

 $H-H (00B'Cw'NtTWH^ $$X.?%@BXYI$$X.>%?BXYGw2a78J??V+$$s*+$$%K #.H 99>?D IIk277H[ II&:;@@HX II&9:??HW GGWXE%**45::;E%**45::;E%**45::;E++UE5,ABNFFHX%H^ "99(::NOHZ ,uX>O5P/QTW/WXH\ 		@AFFLLSQI(121U1X2I2#A,HX#A,HX#A,HY#A,HY#HX#HX $)2B)C#DuXVfMgGh#hlo"oH (*'N'NxYabsYt'uH#$ GG/088B1EMMhWE ;@@QQUU6]  %a(..0@E@`Z_``NUE!!"I;aab	{3HX EJJqaff45::JFJ01%(a-Q03E%*H!"(-H$% nn& #
UE
# 7 ;(--/!E(3-$8 9:HSM; OM 3& A
 K0s   R%8R*0"R/R4,R4c                    |\  }}|sdd||f}|dk(  rt        | ||d      d   }n|dv rJt        j                  d|      \  }}t        |      dkD  r|d   }t	        t	        |      dz        }d	| | }|j                         }|d
k(  rd|d   |z  |z  }t        j                  | ||      j                  d||z        }||dz
  z  |d   z   }||dz
  z  |d   z   }||d   |d   ||f   }n|dk(  rk|d   |z  |z  }t        j                  | ||      j                  d||z        }t        j                  |d   |d         |z  |z   dz
  }||d   |d   |f   }nx|dk(  rg|d   ||dz
  z  z   |z  }t        j                  | ||      j                  d|      }||dz
  z  |d   z   }||dz
  z  |d   z   }||||d   |d   f   }nt        d|      |j                  d	d      j                  d      r|j                  d      r|j                  }n|j                  d      r|j                  }n|j                  d      rTt        j                  |      }ddg}|D ]5  }t        j                   ||k(        dkD  st#        d| d       d|||k(  <   7 nE|j                  d      rt        j$                  |      }n|j                  d      rnt        d|      |	|
z  dkD  r^t	        |d   |d   z
  |	z        }t	        |d   |d   z
  |
z        }|t	        |
dz        d|
t	        |	dz        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   r   rl  )r   r  r  bbigr   zieee-bez	(\d+|\D+)r   r   >r   r   r   countr/  r   r   r   zunrecognized band interleaving:r!  r  rj  rk  phag~Z!	g~Z!	@d   z~pi boundary value (z) detected, convert to zerord  cpxrl  unrecognized complex band:N)read_complex_int16rer  r5  r   r  r   fromfilereshapearanger6  r0  r1  rj  rk  ri  r<  r  absolute)r  r9  r   r!   r  r  r3   r  r  r   r   r5   re   r  letterdigitr+  c0c1rZ  r0r1boundary_valuesboundary_valuerS  rT  s                             r   r  r    s   D MFE!UF# K!%SZR[\]^_ >>JJ|Y?MFE6{QCJN+F8E7+I%%'
FUNX-E;;uIUCKKBPUV^P^_D$(#c!f,B$(#c!f,BAs1vr"u,-D5 FUNX-E;;uIUCKKBPUV^P^_D99SVSV,x7$>BDAs1vt+,D5 Vfq11U:E;;uIUCKKBPUVD4!8$s1v-B4!8$s1v-B2s1vc!f},-D >
KK b!,,S1v&99D  (99D  '88D>D  *95O"1 566$.01C700@@[\]34D/05
   0;;t$D  !3498DD u}qSVc!f_-.SVc!f_-. CaL'%'aL'%'( )FUFFUFN#Kr   c           
      :   	 ddl m} |j                  t	        j
                  |       |j                        }|j                  |      }|sdd|j                  |j                  f}t        t        |d         t        |d   |d   z
        t        |d         t        |d   |d   z
              }	 |j                  di |	}
t        |j                     }|j                  dd	      j!                  d
      r|j!                  d      r|
j"                  }
n|j!                  d      r|
j$                  }
nl|j!                  d      rt'        j(                  |
      }
nE|j!                  d      rt'        j*                  |
      }
n|j!                  d      rnt-        d|      ||z  dkD  r^t        |d   |d   z
  |z        }t        |d   |d   z
  |z        }|
t        |dz        d|t        |dz        d|f   }
|
d|d|f   }
|
S # t        $ r t        d      w xY w)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   r   r   )xoff	win_xsizeyoff	win_ysizer)  r!  r  rj  rk  r,  rd  r.  r0  Nr'  )r   r   r  r  r  r  r  r  r  r  r	  r   ReadAsArrayr  r  r0  r1  rj  rk  r   ri  r  r6  )r  r   r  r  r   r   r   rR  bndr  r  r!   rS  rT  s                 r   r  r    s   1 
299U#T%5%5	6B


4
 C !R^^R^^4 s3q6{c#a&Q-.@3q6{c#a&Q-.@BF3??$V$D %S\\2Ib!,,S1v&99D  (99D  '88D>D  066$<D  !3498DD u}qSVc!f_-.SVc!f_-. CaL'%'aL'%'( )FUFFUFN#K]  1/001s   H Hc           	      N   d}t        |       5 }|j                         }ddd       |D cg c]  }|j                  d      r| }}d}|r|dd }g g }	}t        |      }
|
dk  rdn|}t	        j
                  |
|      }t        |      D ]  \  }}|j                  |dz   dd|dz    d	|
 
       |j                         j                  dd      j                  dd      }|j                  d      rg }	n9|	j                  |j                         dd D cg c]  }t        |       c}       ||
dz
  k(  s||dz      j                  d      st        j                  |	t        j                        }	t        j                   |	dddf         }t        j"                  |	dddf         }t        j                   |	dddf         }t        j"                  |	dddf         }|	|r|\  }}}}||k  s||kD  s
||kD  s||k  rd}	|	_|dkD  rZt%        ||z
        dz  t%        ||z
        z  dz  t        j&                  ||z   dz  t        j(                  z  dz        z  }||k  rd}	|	|j                  |	        |j+                          |S # 1 sw Y   sxY wc c}w c c}w )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])

    Nrm  Fi  i  )maxValuer  r   zline z / )everysuffixr  r!  ry  rz  r)  r   r  r   l   r  )r  ro  r1  r5  r   progressBarr@  r:  rp  r0  r.  r  r   r   r  r   nanminnanmaxr  cospiclose)ll_fileSNWEmin_distr  r7   rO  r  
debug_modefaultsfaultnum_lineprog_barr)  rR  r  nweSNWEdists                          r   read_gmt_lonlat_filera  S  s   @ E	g !71Q\\#%6Q7E7Jet EF5zH!DiI  (iHHU# %4!4%!uCz0JKzz|##D,44T3???3ELLDJJL!,<=q%(=> 1ac
 5 5c :HHU"**5E		%!*%A299U1Q3Z+@q		%!*%A299U1Q3Z+@q T!
1aq5AEQUa!e !E X\1q5zC'#a!e*4s:RVVQqS!GbeeOTWDW=XX(? E e$9%: NNMY 7$ >s   JJJJ"
Jc                    t        |       }d|j                         vrd|d<   t        t        |d               }t        t        |d               }|sdd||g}d}|dv rd}t	        j
                  | ||d	   d
z  |z        j                  |d	   d
|z        }||d   |d	   |d   |d
   f   }||d   |d	   ||d   z   ||d
   z   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   rmgrd   r4   r   f4r&  >f4r   r   r*  r   r  r4  r   r   r   r3  r4  )
r  r   r  r  re   r5   r!   r  rv  rh  s
             r   read_float32rg    s   , 
C#((*$ Kc'l#$Es8}%&F!UF#I::	;;u& VAXe^--4WSVQuW-E 	 SVCF]VCF]# $IQAs1veCFl*+ ,E eS  r   c                 Z   t        |       }d|j                         vrd|d<   t        t        |d               }t        t        |d               }|sdd||g}d}|dv rd}t	        j
                  | ||d	   |z  
      j                  |d	   |      }||d   |d	   |d   |d   f   }||fS )z@Read real float64/double data matrix, i.e. isce lat/lon.rdr
    r   r   rd   r4   r   f8r&  z>f8r   r*  r   r   rf  r  r   r  r  re   r5   r!   r  s           r   read_real_float64rk    s     
C#((*$$Kc'l#$Es8}%&F!UF#I::	;;u& VE\++273q65+A 	 As1vAs1v D9r   c                 *   t        |       }d|j                         vrd|d<   t        t        |d               }t        t        |d               }|sdd||g}d}|dv rd}t	        j
                  | ||d	   |z  
      j                  |d	   |      }||d   |d	   |d   |d   f   }|dk(  rt	        j                  |      }	|	|fS |dk(  rt	        j                  |      }	|	|fS |dk(  r|j                  }	|	|fS |dk(  r|j                  }	|	|fS |}	|	|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 stored 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   r   rd   r4   r   c8r&  z>c8r   r*  r   r   rh  rv  rj  rk  )r  r4  r   r   r   r3  r4  ri  r6  rj  rk  )
r  r   r  r  r  re   r5   r!   r  dataOuts
             r   read_complex_float32ro    sb   4 
C#((*$&Kc'l#$Es8}%&F!UF#I::	;;u& VE\++273q65+A 	 As1vAs1v D w((4. C< 
	++d# C< 
)) C< 
)) C< C<r   c                 Z   t        |       }d|j                         vrd|d<   t        t        |d               }t        t        |d               }|sdd||g}d}|dv rd}t	        j
                  | ||d	   |z  
      j                  |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   r   rd   r4   r   rd  r&  re  r   r*  r   r   rf  rj  s           r   read_real_float32rq  #	  s     
C#((*$$Kc'l#$Es8}%&F!UF#I::	;;u& VE\++273q65+A 	 As1vAs1v D9r   c                    t        |       }d|j                         vrd|d<   t        t        |d               }t        t        |d               }|sdd||g}d}|dv rd}t	        j
                  | ||d	   d
z  |z        j                  |d	   d
|z        }||d   |d	   d
|d   z  d
|d
   z  f   j                         }t	        j                  dt        |      d
      }	||	dz
     j                  |d	   |d   z
  |d
   |d   z
        }
||	   j                  |d	   |d   z
  |d
   |d   z
        }|j                  d      r|
}||fS |j                  d      r|}||fS |j                  d      rt	        j                  ||
      }||fS |j                  d      rt	        j                  ||
      }||fS |j                  d      r|
d|z  z   }||fS t        d|      )aN  Read complex int 16 data matrix, i.e. GAMMA SCOMPLEX file (.slc)

    Gamma file: .slc

    Parameters: fname      - str, path to the binary file
                box        - tuple(int), bounding box in (x0, y0, x1, y1)
                byte_order - str, byte order in big/little-endian
                cpx_band   - str, cpx / real / imag / mag / pha
    Returns:    data       - np.ndarray, 2D matrix
                atr        - dict, metadata
    Example: data, atr = read_complex_int16('100102.slc')
             data, atr = read_complex_int16('100102.slc', box=(100,1200,500,1500))
    r   r   rd   r4   r   i2r&  >i2r   r   r*  r   rj  rk  rd  r,  r.  y              ?r0  )r  r4  r   r   r   r3  r4  flattenr5  r5  r1  hypotarctan2r6  )r  r   r  r  r  re   r5   r!   r  odd_idxrj  rk  s               r   r1  r1  @	  s1     
C#((*$&Kc'l#$Es8}%&F !UF# I::	 ;;uISVAXe^DLLSQRVUVW\U\]DAs1vqQx#a&00199;Dii3t9a(G	?""3q6#a&=#a&Q-@D=  QAAs1v>D 6" 9 
		V	$ 9 
		^	,xxd# 9 
		U	#zz$% 9 
		/	0b4i 9 5x@@r   c                 Z   t        |       }d|j                         vrd|d<   t        t        |d               }t        t        |d               }|sdd||g}d}|dv rd}t	        j
                  | ||d	   |z  
      j                  |d	   |      }||d   |d	   |d   |d   f   }||fS )Nr   r   rd   r4   r   rs  r&  rt  r   r*  r   r   rf  rj  s           r   read_real_int16rz  x	  s    

C#((*$"Kc'l#$Es8}%&F!UF#I::	;;u& VE\++273q65+A 	 As1vAs1v D9r   c                    | j                  d      r| j                  d      d   dz   }n| dz   }t        |j                  d      d         }d|j                         vrd|d<   t	        t        |d               }t	        t        |d               }|sdd||g}t        j                  | t        j                  |d	   |z  
      j                  |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.rscr  r   r   rd   r4   r   r*  r   r   )
r  r  r  r4  r   r   r   r3  r:  r4  )r  r   rscFiler  re   r5   r  s          r   	read_boolr}  	  s   
 ~~)*++1215j@,
v.q1
2C#((*$!Kc'l#$Es8}%&F!UF#;;uXX VE\++273q65+A 	 As1vAs1v D9r   c                    t        j                  | t        d      j                  t              d d df   }g }|D ]  }|j                  |        t        j                  | d      }|d d df   }t        j                  |d d df         }t        j                  |d d df         }t        j                  |d d df         }|||||fS )	N)r   r   )r   usecolsr   )r   r   r   r   )r  r   r   r   )r   loadtxtbytesastyper   r.  r  )	r  yyyymmddYYYYMMDDyr  r  r  r  r  s	            r   read_GPS_USGSr  	  s    zz% %"(**0&+ad<H H ::e\2DAJEHHT!Q$Z E88DAJD	$q!t*	BE8++r   )NNTr   r   NN)NNr   r   T)NNr   r   )Fr  )r  )NN)r  N)rz  )r  r   );r  )r  )	Nr   lr   r   r   rh  r   r   )Nr   rh  r   r   )Nr   T)Nr  )Nr  rh  )Nr  rl  )W__doc__r	  r  r=  r  r2  rA  r  xml.etree.ElementTreeetreeElementTreer  typingr   r2  numpyr   numpy.typingr   mintpy.objectsr   r   r   r   r	   r
   r   r   mintpy.utilsr   r   r  r  STD_METADATA_KEYSr  DATA_TYPE_NUMPY2ENVIr  DATA_TYPE_NUMPY2GDALr  DATA_TYPE_NUMPY2ISCEr  r@  r  r  r   r  r  r   r   r   r   r   r  r  r  r-  r  r  r  r  r  r  r  rG  rH  rw  rB  rC  r~  rA  rD  rE  r?  r  r  r$  r  r  ra  rg  rk  ro  rq  r1  rz  r}  r  r'  r   r   <module>r     s5      	 	 
  " "    "	 	 	 -4O,4 M?4 o	4
 i4 M?4 D4 W4 G4 J44 NG44 Hl34  O4 ,-4  -.!4" O,#4$ ,-%4& O,'4( ,-)4* N++4, O,-4. OV4/40 M?142 B344 N+546 
E#?@748 j94: ^;4< u=4@ J<A4B I;C4D I;E4F G9G4H G9I4J K=K4L (='='=(-8(.9&4&5 &*+)*%g4 t 









   " 	 $  &       3   
	 ff 	 ")  0E#s(O  H Y]AJfRCNzz"J26
$*[|
"&J 1B .+\6@=@6r6@F*2/dcP IL?F pf:@Md*!Z.7t:5p*2,r   