
    Zf                        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
Z
 ddlmZ i dej                  dej                  dej                  dej                  d	ej                  d
ej                  dej                  dej                   dej                   dej"                  dej"                  dej$                  dej$                  dej&                  dej&                  dej&                  dej&                  ej&                  ej(                  ej(                  ej(                  dZg dZg dZg dZg dZi ddddddd dd!dd"d#d$d#d%d#d&d#d'dd(d)d*d+d,d+d-dd.dd/d+d0d+i d1d)d2dd3dd4dd5d)d6d)d7d)d8d)d9d)d:d)d;d)d<dd=d>d?d@dAddBdCdDdCdCdCdCdCdCddddddd)d)d)ddEZ G dF d6      Z G dG dH      Z G dI dJ      Z G dK dL      Z G dM dN      Zy)Oz(Classes for HDF5/MintPy file operations.    N)ndimage)ptimeboolbyteflagintint16shortint32int64longfloatfloat32float_float64complex	complex64cpx_float32cfloat)cfloat32
complex128complex_cpx_float64)
timeseriesHDFEOSgiantTimeseries)r   rawtroposphericDelaytopographicResidualrampdisplacement)heightlatitude	longitude
rangeCoordazimuthCoordincidenceAngleazimuthAngleslantRangeDistance
shadowMask	waterMask
commonMaskbperp)unwrapPhase!unwrapPhase_bridging_phaseClosureunwrapPhase_bridgingunwrapPhase_phaseClosure	coherenceconnectComponent	wrapPhase	magnitudeazimuthOffsetazimuthOffsetStdrangeOffsetrangeOffsetStd	offsetSNRrefPhaser.   radianr2   1r3   r4   r5   r6   pixelr7   r8   r9   r:   r"   mr#   degreer$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r   r   r   r   r    r!   temporalCoherencevelocityzm/yearaccelerationzm/year^2maskr   mmrecons)rawtssar_aps	igram_apsfigramigramcmaskifgcntunwr   flatcordemhgthgt_sim	intensityc                   ~    e Zd ZdZddZddZddZd Zd Zd Z	dd	Z
dd
ZddZddZddZd Zd ZddZddZy)r   a  
    Time-series object for displacement of a set of SAR images from the same platform and track.
    It contains three datasets in root level: date, bperp and timeseries.

    File structure: https://mintpy.readthedocs.io/en/latest/api/data_structure/#timeseries
    Nc                      || _         d| _        y )Nr   filenameselfrX   s     M/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/objects/stack.py__init__ztimeseries.__init__   s    	 	    c                     	 | j                   j                          |r5t        dt        j                  j                  | j                                y #  Y y xY wNzclose timeseries file: fcloseprintospathbasenamerX   r[   	print_msgs     r\   rc   ztimeseries.close   sM    	FFLLN/0@0@0K/LMN 	s   AA Ac           	         |rBt        d| j                   dt        j                  j	                  | j
                                | j                          | j                          | j                          | j                  | j                  z  | _        t        j                  | j
                  d      5 }	 |d   d d  | _        | xj                  | j                  | j                     z  c_        d d d        t!        j"                  | j$                  d         | _        t)        j*                  | j$                  D cg c],  }t,        j.                  j1                  || j&                        . c}      | _        d| j&                  vst5        d | j2                  D              r}d| j6                  j9                         v rat;        | j6                  d         }t)        j*                  | j2                  D cg c]  }|t-        j<                  |	      z    c}      | _        t)        j*                  | j2                  | j2                  | j                     z
  D cg c]  }|j>                  |j@                  d
z  z     c}t(        jB                        | _"        | j2                  D cg c]/  }|jF                  |jI                         jJ                  dz
  dz  z   1 c}| _&        | j$                  D cg c]  }| j                   d|  c}| _'        y #  d | _        Y +xY w# 1 sw Y   0xY wc c}w c c}w c c}w c c}w c c}w )Nopen  file: rr-   r   Tc              3   \   K   | ]$  }|j                   d k(  xr |j                  d k(   & yw)r   N)hourminute.0is     r\   	<genexpr>z"timeseries.open.<locals>.<genexpr>   s(     ,[1QVVQY-F188Q;-F,[s   *,CENTER_LINE_UTC)secondsQ dtype        v@-)(rd   rY   re   rf   rg   rX   get_metadataget_sizeget_date_listlengthwidthnumPixelh5pyFilepbaserefIndexr   get_date_str_formatdateList
dateFormatnparraydtdatetimestrptimetimesallmetadatakeysr   	timedeltadaysrw   r   tbaseyear	timetupletm_ydayyearList	sliceList)r[   ri   rb   rt   utc_secs        r\   openztimeseries.open   sl   E$))GBGG,<,<TYY,G+HIJdjj0YYtyy#& 	"!"wZ]


djj77
	"  33DMM!4DEXXQUQ^Q^_Ar{{33AtG_`
doo%,[PTPZPZ,[)[ DMM$6$6$88.? @AXXRVR\R\&]Qq2<<+H'H&]^
XX)-djj6O)OR#$ !"l)C C R$&JJ0

 MQJJWq1;;=#8#8#:F"BBW6:mmDTYYKq,D%"!
	" 	" `
 '^R
 XDs<   3L59L:1L)2 L.#L3"4L8,L=	LLL&c                    t        j                  | j                  d      5 }t        |j                        | _        |d   d d  }d d d        | j
                  j                         D ]$  \  }}	 |j                  d      | j
                  |<   & D cg c]  }|j                  d       }}d| j
                  j                         vr|d   | j
                  d<   |j                  | j
                  d         | _
        |d   | j
                  d<   |d   | j
                  d<   | j
                  S # 1 sw Y   xY w#  || j
                  |<   Y xY wc c}w )	Nrm   dateutf8REF_DATEr   
START_DATEEND_DATE)r   r   rX   dictattrsr   itemsdecoder   indexr   r[   rb   dateskeyvaluert   r   s          r\   r~   ztimeseries.get_metadata   s)   YYtyy#& 	!! MDMfIaLE	! ----/ 	+JC+%*\\&%9c"	+ /44AHHV$44T]]//11(0DMM*% t}}Z'@A&.qkl#$,RLj!}}!	! 	!+%*c" 5s   #D,-D8E,D58Ec                    t        j                  | j                  d      5 }|| j                     j                  dd  \  | _        | _        | _        d d d        | j
                  | j                  | j                  fS # 1 sw Y   ,xY w)Nrm   )r   r   rX   rY   shapenumDater   r   )r[   rb   s     r\   r   ztimeseries.get_size   so    YYtyy#& 	L!45diiL4F4Frs4K1DL$+tz	L||T[[$**44	L 	Ls   0A<<Bc                     t        j                  | j                  d      5 }|d   d d  D cg c]  }|j                  d       c}| _        d d d        | j                  S c c}w # 1 sw Y   | j                  S xY w)Nrm   r   r   r   r   rX   r   r   )r[   rb   rt   s      r\   r   ztimeseries.get_date_list   sf    YYtyy#& 	E!78y|D!QXXf-DDM	E}} E	E}}s   A%A A% A%%A9c                    |r&t        d| j                   d| j                   d       | j                  d       |r|dk(  rg }nt	        |t
              r|g}|D cg c]$  }|j                  dd      j                  dd      & }}t        j                  | j                  d	      5 }|| j                     }t	        |t        j                        r|| j                     }t        j                  | j                  t        j                  
      }|sd|dd n%|D ]   }	d|| j                  j                  |	      <   " |dd| j                   | j"                  g}|d   |d   z
  }
|d   |d   z
  }t        j$                  |      }t        j&                  |      d   j)                         }||j*                  z  dk  rSt        j                  |||
f|j,                  
      }t/        |      D ]   \  }}|||d   |d   |d   |d   f   ||<   " n|dd|d   |d   |d   |d   f   |   }|r1t1        d |j2                  D              rt        j4                  |      }ddd       |S c c}w # 1 sw Y   S xY w)a  Read dataset from timeseries file
        Parameters: self : timeseries object
                    datasetName : (list of) string in YYYYMMDD format
                    box : tuple of 4 int, indicating x0,y0,x1,y1 of range
        Returns:    data : 2D or 3D dataset
        Examples:   from mintpy.objects import timeseries
                    tsobj = timeseries('timeseries_ERA5_demErr.h5')
                    data = tsobj.read(datasetName='20161020')
                    data = tsobj.read(datasetName='20161020', box=(100,300,500,800))
                    data = tsobj.read(datasetName=['20161020','20161026','20161101'])
                    data = tsobj.read(box=(100,300,500,800))
        reading  data from file:  ...Fri   r    r}   rm   ry   TNr         r{   g?c              3   &   K   | ]	  }|d k(    ywr{   N rr   s     r\   ru   z"timeseries.read.<locals>.<genexpr>#  s     :!qAv:   )rd   rY   rX   r   
isinstancestrreplacer   r   Groupr   zerosr   bool_r   r   r   r   sumwheretolistsizerz   	enumerateanyr   squeeze)r[   datasetNameboxr   ri   rt   rb   dsdateFlagexsizeysize	num_sliceindsdatainds                   r\   readztimeseries.read   sr    HTYYK'84HI		E	" k\9KS)&-KMXYqyyr2::3CYYYYtyy#& $	(!499B"djj)		] xxbhh?H"$ <A7;HT]]0034< {!TZZ5FSVOEFSVOE x(I88H%a(//1D8==(4/xxE5 9J'o 0FAs !$QA!$QA"/ 0DG0
 !a&Q-a&Q-( ))13 3:tzz::zz$'I$	(J O Z$	(J s   )I('F7I--I7c                 $   |s| j                   }|rt        |      }|j                  d       ||j                  }||j                  }||j
                  }|5t        j                  |d      5 }	|	t        d      j                  }ddd       |j                  d       t        j                  |t        j                        }t        j                  |t        j                        }t        j                  |t        j                        }t        |      }| j                   |d<   t"        j$                  j'                  t"        j$                  j)                  |            }
t"        j$                  j+                  |
      s#t#        j,                  |
       t/        d|
        t/        d	| d
       t        j                  |d      5 }t/        dj1                  t3        |j4                        |j6                  |             |j9                  d|d|       t/        dt3        |j4                        dd|j6                          |j9                  d|       |j6                  dk7  rBt/        dt3        |j4                        dd|j6                          |j9                  d|       |j;                         D ]  \  }}t3        |      |j<                  |<    	 ddd       t/        d|        |S # 1 sw Y   txY w# 1 sw Y   &xY w)a7  
        Parameters: data  : 3D array of float32
                    dates : 1D array/list of string in YYYYMMDD format
                    bperp : 1D array/list of float32 (optional)
                    metadata : dict
                    outFile : string
                    refFile : string
                    compression : string or None
        Returns: outFile : string
        Examples:
            from mintpy.objects import timeseries

            ##Generate a new timeseries file
            tsobj = timeseries('timeseries.h5')
            timeseries.write(data, dates=dateList, bperp=bperp, metadata=atr)

            ##Generate a timeseries with same attributes and same date/bperp info
            tsobj = timeseries('timeseries_demErr.h5')
            timeseries.write(data, refFile='timeseries.h5')
        Fr   Nrm   r   ry   	FILE_TYPEzcreate directory: zcreate timeseries HDF5 file: z with w modewzIcreate dataset /timeseries of {t:<10} in size of {s} with compression={c})tscr   T)r   chunkscompressionzcreate dataset /dates      of z<10z in size of r   )r   r   zcreate dataset /bperp      of r-   zfinished writing to )rX   r   r   r   r   r   r   r   TIMESERIES_DSET_NAMESr   rc   r   r   r   bytes_r   rY   re   rf   dirnameabspathisdirmakedirsrd   formatr   rz   r   create_datasetr   r   )r[   r   outFiler   r-   r   refFiler   refobjrfoutDirrb   r   r   s                 r\   
write2hdf5ztimeseries.write2hdf5(  s   * iiG(FKK%K(!??}}"YYw, K"$%:1%=">"J"JKKLL5L)xxBJJ/bii0bjj1> $		 !9:ww}}V$KK&vh/0 	-gYlCDYYw$ 	* *+16C

O48JJ4? ,2 ,AB \"&$()4  6 23u{{3CC2HUZU`U`TabcV%0{{b 6s5;;7G6LLY^YdYdXefg  u 5 'nn. *
U"5z*'	** 	$WI./OK K"	* 	*s   0K9DL9LLc           
         | j                         }|rAt        |      j                         }t        d|z          t        j                  |dd|dk(  f<   t        j
                  |d      | _        d}|d| j                   dz  }|d	| dz  }|d
z  }|st        j                  j                  t        j                  j                  t        j                  j                  | j                              dt        j                  j                  t        j                  j                  | j                              d    d      }t        j                  |t        j                   t        j"                  | j$                        j'                  dd      | j                  j'                  dd      f      dd|       t        d|        |S )zxCalculate the standard deviation (STD) for acquisition of time-series,
           output result to a text file.
        read mask from file: Nr   r{   r   axisz@Standard Deviation in space for each acquisition of time-series
Timeseries file: 
Mask file: zDate		STD (m)std_.txtr   r{   %s	fmt	delimiterheaderz"save timeseries STD to text file: )r   singleDatasetrd   r   nannanstdstdrX   re   rf   joinr   r   splitextrg   savetxthstackr   r   reshape)r[   maskFiler   r   rD   r   s         r\   timeseries_stdztimeseries.timeseries_stds  sl   
 yy{ *//1D)(23!#DDAI99T/ U%dii[33Kz,,##ggll277??277??4993M#N%)"''*:*:277;K;KDII;V*WXY*Z)[[_#`bG


7BIIrxx'>'F'Fr1'MtxxO_O_`bdeOf&ghtF	<27)<=r^   c           
         | j                         }t        |      }|rFt        j                  j	                  |      r't        d|z          t        |      j                         }t        j                  |      t        j                  z  | _        t        d| j                   d| j                   d       t        j                  |      }t!        |      D ]  }| j                  ||    d      }|r5t        j                  j	                  |      rt        j                  |dk(  <   t        j"                  t        j$                  t        j&                  |      d	
            | j                  |<   |j)                  |dz   |dz    d|         |j+                          d}	|	d| j                   dz  }	|	d| dz  }	|	dz  }	|st        j                  j-                  t        j                  j/                  t        j                  j1                  | j                              dt        j                  j3                  t        j                  j5                  | j                              d    d      }t        j6                  |t        j8                  t        j:                  | j<                        j?                  dd      | j                  j?                  dd      f      dd|	       t        d|        |S )zyCalculate the Root Mean Square for each acquisition of time-series
            and output result to a text file.
        r   r   r   r   maxValueF)r   ri   r   )r   r{   r   r{   /suffixz>Root Mean Square in space for each acquisition of time-series
r   r   r   zDate		RMS (m)rms_r   r   r   r   r   z"save timeseries RMS to text file: ) r   lenre   rf   isfilerd   r   r   r   r   r   rmsrY   rX   r   progressBarrangesqrtnanmeansquareupdaterc   r  r   r   r  rg   r  r  r   r   r  )
r[   r  r   	date_listnum_daterD   prog_barrt   r   r   s
             r\   timeseries_rmsztimeseries.timeseries_rms  sR   
 &&(		N x0)(23 *//1D 88H%.#4TYYKtDE$$h7x 	=A99IaL>e9LDBGGNN84"$&&TQY''"**RYYt_6"JKDHHQKOOAaC1Q3%q
(;O<	= 	 S%dii[33Kz,,##ggll277??277??4993M#N%)"''*:*:277;K;KDII;V*WXY*Z)[[_#`bG


7BIIrxx'>'F'Fr1'MtxxO_O_`bdeOf&ghtF	<27)<=r^   c                    | j                  d       | j                  |      }|rkt        j                  j	                  |      rLt        d|z          t        |      j                  |      }t        j                  |d d |t        |      k(  f<   |d|||kD  <   d|||k  <   t        j                  |d      }|| j                  fS )	NFr   r   r   r{   r   r   r   )r   r   re   rf   r  rd   r   r   r   r   r  r   )r[   r  r   reverseMask	thresholdr   rD   dmeans           r\   spatial_averageztimeseries.spatial_average  s    		E	"yySy!x0)(23 *//C/8D02DDC,,,-  %&D	!"&'D"#

4f-dmm##r^   c                     t        d| j                          | j                  d       | j                  d      }t	        j
                  |d      }|S )Nz5calculating the temporal average of timeseries file: Fr   )r   r   r   )rd   rX   r   r   r   r  )r[   r   r"  s      r\   temporal_averageztimeseries.temporal_average  sI    Edii[QR		E	"yyy'

4a(r^   c                    t        d| j                          t        d       | j                  d       | j                  d      }t        d       t	        j
                  |j                  t        j                        }t	        j                  |dd      |dd d d d d f<   |s1t        j                  j                  | j                        d   }| d	}| j                  ||| j                  
       |S )Nz8calculating the temporal derivative of timeseries file: zreading timeseries dataFr   z/calculate the 1st derivative of timeseries datar{   r   )nr   z_1stDiff.h5r   r   )rd   rX   r   r   r   r   r   r   diffre   rf   r  r   )r[   out_filets_data
ts_data_1dfbases        r\   temporal_derivativeztimeseries.temporal_derivative  s    HTU 	'(		E	"))e), 	?@XXgmmRZZ8
!www!!<
12q!8 GG$$TYY/2E,H
HdiiHr^   c                 @   t        |      j                         rt        |      n|}|sDt        j                  j                  | j                        d   }| d|j                          | d}t        d|        | j                          | j                         j                  | j                  d      }t        d       t        j                  |j                  t        j                         }|dk(  rt        d| d	       | j"                  j                  dd
      dz  dz  }t%        j&                  | j                        }t)        | j                        D ]  }	||	   |z
  }
t        j*                  d|
dz  z  |dz  z        }|t        j,                  |      z  }t        j,                  ||z  d      ||	ddf<   |j/                  |	d
z   | j0                  |	           |j3                          n>|dk(  r*t        d| d       t5        j6                  ||d
fd      }nt9        d| d      ~||| j:                  ddf   z  }t        j                  || j                  | j<                  | j>                  f      }| jA                  ||| j                         y)aY  Filter the time-series in time with a moving window.

        Parameters: time_win    - float, sigma of Gaussian distribution in time in months (30.4 days)
                    filter_type - str, filter type: gaussian, median
                    out_file    - str, output file name
        Returns:    out_file    - str, output file name
        r   _tempz.h5zoutput file: r   z2--------------------------------------------------gaussianz,temporal filtering via a Gaussian window of z monthsr{   r|      r  g      r   r   Nr  medianz6temporal filtering via scipy.ndimage.median_filter of z acquisitionsnearest)r   modezun-supported temporal filter: !r(  )!r   
is_integerr   re   rf   r  rX   
capitalizerd   r   r   r  r   r   r   r   r   r   r   r  r  expr   r  r   rc   r   median_filter
ValueErrorr   r   r   r   )r[   time_winfilter_typer*  r-  r+  ts_data_filtr   r  rt   
tbase_diffweights               r\   temporal_filterztimeseries.temporal_filter  sP    %*(O$>$>$@3x=h GG$$TYY/2Ek&<&<&>%?zMHhZ() 			))+%%dllB7fxxrzz:*$@
'RSJJ&&r1-6;E(($,,?H4<<( 
> #1X-

A 6(A+ FG"&&.( &(VVGf,<1%EQT"!DMM!,<=
> NNH$J8*Tabc"00]L =k]!LMM 	T]]A%566zz,t{{DJJ0WX 	h		Jr^   c                 X   | j                  d       | j                  D cg c]  }|dd 	 }}| j                  j                         }t	        d|        t        |d      5 }t        ||      D ]  \  }}|j                  | d| d        	 d	d	d	       |S c c}w # 1 sw Y   |S xY w)
z2Generate bl_list.txt file from timeseries h5 file.Fr   r      z"write baseline list info to file: r   r   r   N)r   r   r   r   rd   zipwrite)r[   r*  rt   
date6_list
pbase_listrb   dr   s           r\   save2bl_list_fileztimeseries.save2bl_list_file   s    		E	"&*mm4a!f4
4ZZ&&(
28*=>(C  	+A
J7 +51#Rwb)*+	+  5	+ s   B#,BB)NT)NNTT)NNNNNN)NN)NNFN)g      ?guassianN)zbl_list.txt)__name__
__module____qualname____doc__r]   rc   r   r~   r   r   r   r   r	  r  r#  r%  r.  rA  rI  r   r^   r\   r   r      sX    !@&5

=@IV2$L$",<~	r^   c                   H    e Zd ZdZddZddZddZd Zd Ze	d	   ddfd
Z
y)geometryzp Geometry object.

    File structure: https://mintpy.readthedocs.io/en/latest/api/data_structure/#geometry
    Nc                      || _         d| _        y )NrR  rW   rZ   s     r\   r]   zgeometry.__init__7  s    		r^   Tc                     	 | j                   j                          |r6t        dt        j                  j                  | j                                y y #  Y y xY w)Nzclose geometry file: ra   rh   s     r\   rc   zgeometry.close;  sJ    	FFLLN-bgg.>.>tyy.I-JKL 	   AA Ac                    |rBt        d| j                   dt        j                  j	                  | j
                                | j                          | j                          | j                  | j                  z  | _
        d| _        d| j                  j                         v rd| _        t        j                  | j
                  d      5 }|j                         D cg c]"  }t!        ||   t        j"                        s!|$ c}| _        t'        | j$                        | _        d|j                         v r|d   d d  D cg c]  }|j+                  d	       c}| _        t/        | j,                        | _        	 | j(                  j3                  d       | xj(                  | j,                  D cg c]  }d
|z   	 c}z  c_        nd | _        d d d        y c c}w c c}w #  Y OxY wc c}w # 1 sw Y   y xY w)Nrk   rl   FY_FIRSTTrm   r-   r   r   zbperp-)rd   rY   re   rf   rg   rX   r~   r   r   r   r   geocodedr   r   r   r   r   DatasetdatasetNameslistr   r   r   r  r   remove)r[   ri   rb   rt   rH  s        r\   r   zgeometry.openC  s   E$))GBGG,<,<TYY,G+HIJdjj0**,, DMYYtyy#& 	%!,-FFH Wq
1Q48V WD!$"3"34DN!&&(";<V9Q< Ha&!1 H"4==1NN))'2 t}}"E!8A:"EE $	% 	% W !I
"E	% 	%sT   G2 "GG>G2G!"G2 G&G25G-
G2
G2&G*(
G22G;c                 x   t        j                  | j                  d      5 }|j                         D cg c]  }|t        v s| c}d   }||   j
                  }t        |      dk(  r|dd \  | _        | _        n|\  | _        | _        d d d        | j                  | j                  fS c c}w # 1 sw Y   &xY w)Nrm   r   r   r{   )	r   r   rX   r   GEOMETRY_DSET_NAMESr   r  r   r   )r[   rb   rt   dsNamedsShapes        r\   r   zgeometry.get_size\  s    YYtyy#& 	2!!"FAQ2E-EaFqIFiooG7|q *1!A,'TZ*1'TZ	2 {{DJJ&& G	2 	2s#   B0B+B+AB0+B00B9c                 f   t        j                  | j                  d      5 }t        |j                        | _        d d d        | j
                  j                         D ]$  \  }}	 |j                  d      | j
                  |<   & | j
                  S # 1 sw Y   VxY w#  || j
                  |<   Y RxY w)Nrm   r   )r   r   rX   r   r   r   r   r   )r[   rb   r   r   s       r\   r~   zgeometry.get_metadataf  s    YYtyy#& 	*! MDM	*----/ 	+JC+%*\\&%9c"	+
 }}	* 	*
+%*c"s   B%BBB0r   c                    | j                  d       |dd| j                  | j                  f}|
t        d   }nt	        |t
              r|g}t        j                  | j                  d      5 }|d   j                  d      d   }||   }|rt        d|dd	| j                   d
       t        |j                        dk(  r|dd }nt        |j                        dk(  r||d   |d   |d   |d   f   }nt        j                  |j                  d   t        j                        }|D 	cg c]$  }	|	j!                  |d      j!                  dd      & }}	t#        d |D              rd|dd n%|D ]   }
d|| j$                  j'                  |
      <   " |dd|d   |d   |d   |d   f   |   }t#        d |j                  D              rt        j(                  |      }ddd       |S c c}	w # 1 sw Y   S xY w)ax  Read 2D / 3D dataset with bounding box in space
        Parameters: datasetName : (list of) string, to point to specific 2D dataset, e.g.:
                        height
                        incidenceAngle
                        bperp
                        ...
                        bperp-20161020
                        bperp-20161026
                        bperp-...
                    box : tuple of 4 int, for (x0,y0,x1,y1)
                    print_msg : bool
        Returns: data : 2D or 3D array
        Example:
            obj = geometry('./inputs/geometryRadar.h5')
            obj.read(datasetName='height')
            obj.read(datasetName='incidenceAngle')
            obj.read(datasetName='bperp')
            obj.read(datasetName='bperp-20161020')
            obj.read(datasetName=['bperp-20161020',
                                  'bperp-20161026'])
        Fr   Nr   rm   r}   r   z<15r   r   r{   r   r   ry   r   c              3   "   K   | ]  }|  	 y wrJ  r   rr   s     r\   ru   z geometry.read.<locals>.<genexpr>       21u2   Tc              3   &   K   | ]	  }|d k(    ywr   r   rr   s     r\   ru   z geometry.read.<locals>.<genexpr>       2!qAv2r   )r   r   r   r^  r   r   r   r   rX   splitrd   r  r   r   r   r   r   r   r   r   r   )r[   r   r   ri   rb   
familyNamer   r   r   rt   r   s              r\   r   zgeometry.readp  s   , 			E	";aT[[1C-a0KS)&-KYYtyy#& 	,!$Q--c215J:BC 00A$))DQR288}!!uRXX!##a&Q-QA67 88RXXa[BS^_aqyyR8@@bI__2k22"&HQK( @;?!4!4Q!78@ !a&Q-a&Q-( ))13 2tzz22::d+D5	,6  `	,6 s    .CG4/)G/BG4/G44G>rJ  rK  )rM  rN  rO  rP  r]   rc   r   r   r~   r^  r   r   r^   r\   rR  rR  1  s3    
%2'  31544 :r^   rR  c                       e Zd ZdZddZddZddZd ZddZd Z	dd	Z
	 	 dd
ZddZd ZddZddZd dZd!dZd Zd"dZddZddZed        Zedd       ZddZd Zy)#ifgramStackz Interferograms Stack object.

    File structure: https://mintpy.readthedocs.io/en/latest/api/data_structure/#ifgramstack
    Nc                      || _         d| _        y )Nrk  rW   rZ   s     r\   r]   zifgramStack.__init__  s    	!	r^   c                     	 | j                   j                          |rCt        d| j                   dt        j
                  j                  | j                                y y #  Y y xY w)Nzclose rl   )rb   rc   rd   rY   re   rf   rg   rX   rh   s     r\   rc   zifgramStack.close  sS    	FFLLNtyyk1A1A$))1L0MNO 	s   AA" "A&c           	         |rBt        d| j                   dt        j                  j	                  | j
                                | j                          | j                          | j                          | j                  | j                  z  | _        t        | j                  | j                        D cg c]  \  }}| d|  c}}| _        t!        j"                  | j$                  | j&                  z
  D cg c]  }|j(                  |j*                  dz  z     c}t         j,                        | _        t1        j2                  | j
                  d      5 }|d   dd | _        |d	   dd | _        |j9                         D cg c]L  }t;        ||   t0        j<                        r-||   j>                  d
d | j                  | j                  fk(  r|N }}t@        D cg c]	  }||v s| c}| _!        | xjB                  |D cg c]  }|t@        vs| c}z  c_!        ddd       g | _"        | jB                  D ]4  }| xjD                  | j                  D cg c]	  }| d|  c}z  c_"        6 | jG                  d      | _$        tK        | jH                        | _&        	 tO        | jP                  d         | _)        tO        | jP                  d         | _*        	 tW        | jP                  d         | _,        tW        | jP                  d         | _-        yc c}}w c c}w c c}w c c}w c c}w # 1 sw Y   xY wc c}w #  d| _)        d| _*        Y zxY w#  d| _,        d| _-        Y yxY w)z
        Time format/rules:
            All datetime.datetime objects named with time
            All string in YYYYMMDD        named with date (following roipac)
        rk   rl   _rx   ry   rm   
dropIfgramNr-   r}   Frp  REF_YREF_XREF_LATREF_LON).rd   rY   re   rf   rg   rX   r~   r   read_datetimesr   r   r   rD  mDatessDates
date12Listr   r   sTimesmTimesr   rw   r   tbaseIfgramr   r   rp  pbaseIfgramr   r   rY  r   IFGRAM_DSET_NAMESrZ  r   r   r   r  r   r   r   refYrefXr   refLatrefLon)r[   ri   rt   jrb   dsNamesr_  s          r\   r   zifgramStack.open  s    E$))GBGG,<,<TYY,G+HIJdjj0 36dkk4;;2OP$!QaS!:P88/3{{T[[/H%K)* &'VVaii<.H%H %K*,**6 YYtyy#& 		T!oa0DO z!}D #$&&( NQ%adDLL9 tzz"#4;;

2KK  NG N -> Nqg NDW!SAR8R!!SS		T '' 	IFNNH1&1#HHN	I **e*<4==)	DMM'23DIDMM'23DI	i 89DKi 89DKE Q%KN !O!S		T 		T I	DIDI	DKDKsm   6L:#L#-L7AL(
L7!	L-+L-/L7L2
L2

L7M
':M	 ":M (L77M	MM0c                    t        j                  | j                  d      5 }t        |j                        | _        |d   d d  j                         }d d d        | j
                  j                         D ]$  \  }}	 |j                  d      | j
                  |<   & t        d D              }|d   | j
                  d<   |d   | j
                  d<   | j
                  S # 1 sw Y   xY w#  || j
                  |<   Y xY w)	Nrm   r   r   c              3   >   K   | ]  }|j                  d         yw)r   N)r   rr   s     r\   ru   z+ifgramStack.get_metadata.<locals>.<genexpr>  s     :q!((6*:s   r   r   r   r   )
r   r   rX   r   r   r   flattenr   r   sorted)r[   rb   r   r   r   r   s         r\   r~   zifgramStack.get_metadata  s    YYtyy#& 	+! MDMfIaL((*E	+
 ----/ 	+JC+%*\\&%9c"	+ :E::&.qkl#$,RLj!}}	+ 	++%*c"s   1C;C)C&)C<c                    t        j                  | j                  d      5 }|&dD cg c]  }||j                         v s| c}d   }||   j                  \  | _        | _        | _        |r t        j                  |d   d d        | _        d d d        | j
                  | j                  | j                  fS c c}w # 1 sw Y   1xY w)Nrm   )r.   r8   r6   r   rp  )
r   r   rX   r   r   	numIfgramr   r   r   r   )r[   rp  r   rb   rt   s        r\   r   zifgramStack.get_size
  s    YYtyy#& 
	<!"*YkQ]^bcbhbhbj]jqklmn 78n6J6J3DNDK !#,(:!;
	< ~~t{{DJJ66 l
	< 
	<s#   B>B9 B9A
B>9B>>Cc           	      B   t        j                  | j                  d      5 }|d   dd }ddd       t        j                  d         | _        t        j                  |dddf   D cg c]  }|j                  d       c}      | _	        t        j                  |dddf   D cg c]  }|j                  d       c}      | _
        t        j                  | j                  D cg c],  }t        j                  j                  || j
                        . c}      | _        t        j                  | j                  D cg c],  }t        j                  j                  || j
                        . c}      | _        y# 1 sw Y   XxY wc c}w c c}w c c}w c c}w )z4Read date1/2 into array of datetime.datetime objectsrm   r   N)r   r   r   r   r{   )r   r   rX   r   r   r   r   r   r   rx  ry  r   r   r   r|  r{  )r[   rb   r   rt   s       r\   rw  zifgramStack.read_datetimes  s&   YYtyy#& 	!!fIaLE	!  33E$K@ hh%1+FQ 0FGhh%1+FQ 0FGhhRVR]R]^Q 4 4Q H^_hhRVR]R]^Q 4 4Q H^_	! 	!  GF^^s#   	F )F'F(1F1F F
c                 v   | j                  d       | j                  d      }|dg}nt        |t              r|g}t	        j
                  | j                  d      5 }|d   j                  d      d   }||   }|rt        d| d	| j                   d
       t        j                  | j                  t        j                        }	|D 
cg c]$  }
|
j                  |d      j                  dd      & }}
t        d |D              r|r	|d   dd }	n!d|	dd n|D ]  }d|	|j                  |      <    |dd| j                   | j"                  f}|dd|d   |d   |d   |d   f   |	   }t        d |j$                  D              rt        j&                  |      }ddd       |S c c}
w # 1 sw Y   S xY w)aH  Read 3D dataset with bounding box in space
        Parameters: datasetName : string, to point to specific 2D dataset, e.g.:
                        unwrapPhase
                        coherence
                        connectComponent
                        ...
                        unwrapPhase-20161020_20161026
                        unwrapPhase-...
                        coherence-20161020_20161026
                        ...
                        ['unwrapPhase-20161020_20161026',
                         'unwrapPhase-20161020_20161101',
                         ...]
                    box : tuple of 4 int, for (x0,y0,x1,y1)
                    print_msg : bool
        Returns: data : 2D or 3D array
        Example:
            obj = ifgramStack('./inputs/ifgramStack.h5')
            obj.read(datasetName='unwrapPhase')
            obj.read(datasetName='coherence')
            obj.read(datasetName='unwrapPhase-20161020_20161026')
            obj.read(datasetName=['unwrapPhase-20161020_20161026',
                                  'unwrapPhase-20161020_20161101'])
        Frr  Nr.   rm   r   r}   r   r   r   ry   r   c              3   "   K   | ]  }|  	 y wrJ  r   rr   s     r\   ru   z#ifgramStack.read.<locals>.<genexpr>Q  s     .Qq5.re  rp  Tr{   r   r   c              3   &   K   | ]	  }|d k(    ywr   r   rr   s     r\   ru   z#ifgramStack.read.<locals>.<genexpr>c  s     .a16.r   )r   get_date12_listr   r   r   r   rX   rh  rd   r   r   r  r   r   r   r   r   r   r   r   )r[   r   r   ri   rp  rz  rb   ri  r   r   rt   r   r   s                r\   r   zifgramStack.read&  s   2 	'))U);
 (/KS)&-KYYtyy#& 	(!$Q--c215J:B,=dii[MN xxAHOZ[!199Z4<<S"E[K[.+.. q1H"&HQK$ 9A48HZ--a019 {!TZZ5 a!fSVm!fSVm$ %%-/D .4::..zz$'9	(: + \	(: s    A.F.)F)5B*F.)F..F8c                    |d}|rt        d| d| j                   d       nt        d| d| j                   d       |rIt        j                  j	                  |      r*t        d|z          t        |      j                  |      }nd}t        j                  | j                  d	      5 }||   }	|	j                  d
   }
t        j                  |
t        j                        }t        j                  |
      }t        |
      D ]  }|j!                  |dz   |dz    d|
        |	||d   |d   |d
   |d   f   }|rt        j"                  |t%        |      k(  <   |dk(  rt        j"                  ||d
k(  <   |d|||kD  <   d
|||k  <   |rt        j&                  |      ||<   t        j(                  |      ||<    |j+                          ddd       | j,                  fS # 1 sw Y   xY w)z Calculate the spatial average.Nr2   zcalculating spatial median of 	 in file r   zcalculating spatial mean of r   r  rm   r   ry   r  r{   r  r  r   r   )rd   rX   re   rf   r  r   r   r   r   r   r   r   r   r   r  r  r  r   r   	nanmedianr  rc   rz  )r[   r   r  r   	useMedianr   r!  rD   rb   dsetr  r"  r  rt   r   s                  r\   r#  zifgramStack.spatial_averageg  s    %K2;-ySWXY0YtyykQUVW x0)(23 *//C/8DH YYtyy#& 	![>D

1IHHi

;E(()<H9% 0!qse1YK,@A As1vc!f}c!fSVm;<57VVD[!112 +-&(ffDO (-.D	)*./D*+!||D1E!H!zz$/E!H+0, NN9	: doo%%;	 	s   -D'G**G3c                    t        j                  | j                  d      5 }|d   d d  }|r||d   d d  d d f   }d d d        t        j                  d d df   D cg c]  }|j                  d       c}      }t        j                  |d d df   D cg c]  }|j                  d       c}      }t        ||      D cg c]  \  }}| d|  }}}|S # 1 sw Y   xY wc c}w c c}w c c}}w Nrm   r   rp  r   r   r{   ro  r   r   rX   r   r   r   rD  )	r[   rp  rb   r   rt   rx  ry  r  rz  s	            r\   r  zifgramStack.get_date12_list  s    YYtyy#& 	5!fIaLEaoa0!34	5 U1a4[A188F+ABU1a4[A188F+AB-0-@ATQ1QCjA
A	5 	5 BAAs   CC&C+C0C#c                    t        j                  | j                  d      5 }|d   d d  }||d   d d   d d f   }d d d        t        j                  d d df   D cg c]  }|j                  d       c}      }t        j                  |d d df   D cg c]  }|j                  d       c}      }t        ||      D cg c]  \  }}| d|  }}}|S # 1 sw Y   xY wc c}w c c}w c c}}w r  r  )r[   rb   r   rt   rx  ry  r  rz  s           r\   get_drop_date12_listz ifgramStack.get_drop_date12_list  s    YYtyy#& 	2!fIaLE1\?1--q01E	2 U1a4[A188F+ABU1a4[A188F+AB-0-@ATQ1QCjA
A	2 	2 BAAs   CC%C*C/C"c                    t        j                  | j                  d      5 }|d   d d  }|r||d   d d  d d f   }d d d        d d df   D cg c]  }|j                  d       }}|d d df   D cg c]  }|j                  d       }}t	        t        t        ||z                     }|S # 1 sw Y   uxY wc c}w c c}w )Nrm   r   rp  r   r   r{   )r   r   rX   r   r  r[  set)r[   rp  rb   r   rt   rx  ry  r   s           r\   r   zifgramStack.get_date_list  s    YYtyy#& 	5!fIaLEaoa0!34	5 -2!Q$K8q!((6"88,1!Q$K8q!((6"88$s6F?345	5 	5 98s   B/B;3C /B8c                    | j                  d       |rDt        j                  | j                  |      d   t        j                        }t        d       |S d| j                  j                         vrt        d      t        d| j                   d	| j                   d
|        | j                  || j                  | j                  | j                  dz   | j                  dz   f|d      }|S )a_  Get reference value
        Parameters: unwDatasetName : string, unwrapPhase, or unwrapPhase_unwCor
                    skip_reference : bool, skip reference value (for simulation only)
                    dropIfgram : bool, skip ifgrams marked as dropped or not
        Returns:    ref_phase : 1D np.array in size of (num_ifgram,) in float32
        Fr   rr  r   zIskip checking reference pixel info - This is for offset and testing ONLY.rs  zCNo REF_X/Y found!
run reference_point.py to select reference pixel.zreference pixel in y/x: (z, z) from dataset: r{   )r   r   rp  ri   )r   r   r   r   r   rd   r   r   r;  r  r  r   )r[   unwDatasetNameskip_referencerp  	ref_phases        r\   get_reference_phasezifgramStack.get_reference_phase  s     			E	"*!Ea!H"**UI]^  DMM..00cdd-dii[499+EUVdUefg		n'+yy$))TYYq[$))TU+&V-7,1 " 3I r^   c                 Z   | j                  d       t        j                  | j                  d      5 }|%dD cg c]  }||j	                         v r| c}d   }t        d| d       ||   }t        j                  |j                  d	d
 t        j                        }t        j                  |j                  d   t        j                        }|r| j                  }t        j                  |      }	t        j                  |      d   }
t        j                  |	      }t        |	      D ]O  }|j!                  |d	z   |d	z    d|	        ||
|   ddddf   }d||dk(  <   d|t        j"                  |      <   Q |j%                          ddd       |S c c}w # 1 sw Y   S xY w)z|Return the common mask of pixels with non-zero value in dataset of all ifgrams.
           Ignoring dropped ifgrams
        Fr   rm   N)r3   r.   r   z2calculate the common mask of pixels with non-zero z valuer{   r   ry   r  r  r          )r   r   r   rX   r   rd   r   onesr   r   rp  r   r   r   r  r  r  isnanrc   )r[   r   ri   rp  rb   rt   r  rD   dropIfgramFlagnum2readidx2readr  r   s                r\   nonzero_maskzifgramStack.nonzero_mask  s    			E	"YYtyy#& 	!"*M 1Q"#qvvx-  ! 1124F{mSYZ[[>D774::a?"((;DWWTZZ]"((CN!%vvn-Hxx/2H (((;H8_ )!qse1XJ,?@HQKA-.#$TRZ '(RXXd^$	)
 NN+	, )1	, s   F FD<F F  F*c           
         | j                  d       |d}t        d| d| j                   d       t        j                  | j
                  t        j                        }|r/| j                  }t        j                  |dk(        rt        d	      d
|v rfdt        | j                  d         z  dt        j                  z  z  }t        j                  | j                  t        j                        dz  }||   }t!        j"                  | j                  d      5 }||   }d }	d
|v r}| j$                  qd| j$                  cxk  r| j&                  k  rRn nO| j(                  Cd| j(                  cxk  r| j*                  k  r$n n!|d d | j$                  | j(                  f   |   }	t        j,                  |t        j.                        | j*                  z  | j&                  z  dz  }
t1        t        j2                  |
dz  |dz  z              }t1        t        j4                  | j*                  |z  dz        dz        }t1        t        j2                  | j*                  |z              }t        j6                  |j8                  dd t        j:                        }t=        j>                  |      }tA        |      D ]  }||z  }tC        ||z   | j*                        }|jE                  |dz   d| d| j*                          |d d ||d d f   |   }d
|v r|	G|t        jF                  |	jI                  ddd      d|j8                  d   |j8                  d   f      z  }tA        |j8                  d         D ]  }||d d d d fxx   |   z  z  cc<    t        jJ                  |d      |||d d f<    |jM                          d d d        |S # 1 sw Y   S xY w)NFr   r2   z"calculate the temporal average of r  r   ry   r  zMALL interferograms are marked as dropped, can not calculate temporal average.r.   r   
WAVELENGTHg      @r|   rm   r      r      @
   r{   r  zlines r  r  r   r   )'r   rd   rX   r   r  r  r   rp  r   	Exceptionr   r   pir   r}  r   r   r   r  r   r  r   r   r   r   ceilrintr   r   r   r   r  r  minr  tiler  r  rc   )r[   r   rp  
max_memoryifgram_flagphase2ranger   rb   r  ref_valds_sizenum_steprow_stepr"  r  rt   r0r1r   r  s                       r\   r%  zifgramStack.temporal_average  si   		E	"%K2;-ySWXY ggdnnBHH=//KvvkR'( !F G G
 K'uT]]<%@AAS255[QKHHT--RZZ@6IE+&EYYtyy#& &	![>D G,yy,dii1M4::1Myy,dii1N4;;1Nq$))TYY67D ff[9DKKG$**TWXXG2777Q;*w2F#GHIH2774;;#9B#>?"DEH2774;;#9:;H HHTZZ!_BJJ?E(((;H8_ ;\h4!fRD$++,GH Ar"uaK(5 !K/*Aq(AAtzzRS}VZV`V`abVcCd ee"4::a=1 @QqUeAh(>?@ #%**T":beQh%;& NNM&	N O&	N s   J/OO c                    | j                         }| j                  |d      d   }t        j                  |j                  d   t        j
                        }t        |j                  d         D ]E  }||d d f   }t        j                  |dk(        d   t        j                  |dk(        d   z
  ||<   G t        j                  |      S )Nr   )refDatery   r{   r   )	r  get_design_matrix4timeseriesr   r   r   r	   r  r   max)r[   date12_listAnum_connrt   Ais         r\   get_max_connection_numberz%ifgramStack.get_max_connection_number'  s    **,--k1-EaH88AGGAJbhh7qwwqz" 	GA1a4B((27+A."(1CA1FFHQK	G vvhr^   c                 p   | j                  d       | j                  }| j                  }|s| j                  dz  | j                  z   }||z  |z  dz  }t        t        j                  |dz  |dz  z              }t        t        j                  ||z  dz        dz        }t        t        j                  ||z              }|r1|dkD  r,t        d	|z         t        d
||fz         t        d|z         g }	t        |      D ].  }
|
|z  }t        |||z   g      }d|||f}|	j                  |       0 |	|fS )a  Split into chunks in rows to reduce memory usage.

        Parameters: max_memory - float, max memory to use in GB
                    dim0_size  - the 1st dimension size of all used datasets
                                 e.g., dim0_size = num_pair * 2 + num_date
                    print_msg  - bool
        Returns:    box_list   - list of tuple of 4 int
                    num_box    - int, number of boxes
        Fr   r   r  g      ?r  r  r{   zmaximum memory size: %.1E GBz-split %d lines into %d patches for processingz"    with each patch up to %d linesr   )r   r   r   r  r   r   r   r  rd   r  r  append)r[   r  	dim0_sizeri   r   r   r  num_boxy_stepbox_listrt   y0y1r   s                 r\   split2boxeszifgramStack.split2boxes1  sC    			E	"

 *T\\9If$u,q0bgggmzG/CDEFRWWfw."45:;bggfvo./10:=>AVWDUUV6?@ w 	!AVBfb6k*+Bb%$COOC 		!   r^   c           	      D  
 | j                  d      
| j                  |      }t        |      }g }t        ||z
        D ]  }g }t        |      D ]'  }|j	                  |||z       d|||z   dz              ) |j	                  ||    d|||z              t        
fd|D              sn|j	                  |D 	cg c]  }	
j                  |	       c}	        t        j                  |t        j                        }t        j                  |d      }|S c c}	w )	a  Get the indices of interferograms that forms the given connection level closure loop.

        Parameters: conn       - int, connection level
                    dropIfgram - bool, exclude the dropped interferograms.
        Returns:    cp_idx     - 2D np.ndarray in int16 in size of (num_cp, conn + 1)
                                 Each row for the indices of interferograms for one closure loop.
                                 num_cp <= num_date - conn
        Frr  ro  r{   c              3   &   K   | ]  }|v  
 y wrJ  r   )rs   xr  s     r\   ru   z6ifgramStack.get_closure_phase_index.<locals>.<genexpr>p  s     <1#<s   ry   r   r   )r  r   r  r  r  r   r   r   r   r	   unique)r[   connrp  r  r  cp_idxrt   cp_date12_listr  r  r  s             @r\   get_closure_phase_indexz#ifgramStack.get_closure_phase_indexY  s)    **e*<&&*&=	y> x$' 		NAN4[ N%%1Q3(8)AaCE:J9K&LMN!!Yq\N!Iaf4E3F"GH <^<<^L{003LM		N &16* Ms   >D
c                    t        | j                  d            }|d   |d   z
  }|d   |d   z
  }| j                  |d      }|j                  d   }t	        d||z
          t	        d	|        |s$|||z
  k  r0d
| d||z
   d}	|	dz  }	t        |	      |dk  rt        d| d      d| j                  v rdnd}
t	        d|
 d       | j                  |
|d      }| j                  j                  dd      }|
dk(  r]|dv rYt	        d| d       | j                  d      }t        |j                  d         D ]  }||   dk7  }||   |xx   ||   z  cc<    t        j                  |||ft        j                        }t        |      D ]M  }||ddf   ||df   }}t        j                  ||   d      ||   z
  }t        j                   d |z        ||<   O |sd}nI|d!k(  rt        j                  |d      }n,|d"k(  rt        j"                  |d      }nt%        d#| d$      t        j&                  |      ||fS )%a  Computes wrapped sequential closure phases for a given connection level.

        Reference: Equation (21) in Zheng et al. (2022, TGRS)
        For conn = 5, seq_closure_phase = p12 + p23 + p34 + p45 + p56 - p16.

        Parameters: box       - tuple of 4 int, bounding box in (x0, y0, x1, y1)
                    conn      - int, connection level of the closure phase
                    post_proc - str, post processing of the closure phase:
                                None - 3D array in float32, seq closure phase
                                sum  - 2D array in complex64, sum  in time of the complex seq closure phase
                                mean - 2D array in complex64, mean in time of the complex seq closure phase
        Returns:    cp_w      - 3D np.ndarray in float32 in size of (num_cp, box_len, box_wid)
                                wrapped sequential  closure phase for the given connection level.
                    sum_cp    - None or 2D np.ndarray in complex64 in size of (box_len, box_width)
                                wrapped average seq closure phase for the given connection level,
                                controlled by post_proc.
                    num_cp    - int, number of  seq closure phase for the given connection level.
        Trr  r   r   r   r{   )r  rp  z)number of closure measurements expected: z)number of closure measurements found   : znum_cp (z) < num_date - conn ()z% --> some interferograms are missing!z'No triplets found at connection level: r6  r4   r.   r   z to compute closure phasesF)r   r   ri   zmintpy.load.processorisce)ariazapply spatial referencing to z	 productsr  ry   Nr   r   y              ?r   meanzun-recognized post_proc=z! Available choices: sum, mean.)r  r   r  r   rd   r  rZ  r   r   getr  r  r   r   r   r   r9  r  r;  angle)r[   r   r  	post_procr  box_widbox_lenr  num_cpmsgds_namephase	processorr  rt   rD   cp_widx_plus	idx_minorcp0_wsum_cps                        r\   get_sequential_closure_phasez(ifgramStack.get_sequential_closure_phasez  s   ( t))T):;a&3q6/a&3q6/ --4D-Ia9(T/9JKL9&BC4' (=ho=NaP>>n$z"I$q QRR "-0A0A!A+}	!;<=		g3%	H MM%%&=vF	m#	X(=1)IFG00E0BI5;;q>* /Qx2~a)A,./
 xx'2",,Gv 	)A #)CRC.&B-iHFF5?3eI6FFE ffR%Z(DG	) F%VVDq)F& WWT*F 7	{Babccxx~vv--r^   c                    t        |       } | D cg c]  }t        |j                  d             }}t        |      D ci c]  \  }}||
 }}}t	        t        t        j                  j                  |                  }t        j                  |d      }t        |      }g }	|D ]g  \  }
}}|
|f}||f}|
|f}	 ||   }||   }||   }t        j                  |t        j                        }d||<   d||<   d||<   |	j                  |       i t        |	      dk(  rt!        d|  d       y	t        j"                  |	      j%                  t        j&                        S c c}w c c}}w # t        $ r Y w xY w)
a  Generate the design matrix of ifgram triangle for unwrap error correction using phase closure

        Parameters: date12_list : list of string in YYYYMMDD_YYYYMMDD format
        Returns:    C : 2D np.array in size of (num_tri, num_ifgram) consisting 0, 1, -1
                        for 3 SAR acquisition in t1, t2 and t3 in time order,
                        ifg1 for (t1, t2) with 1
                        ifg2 for (t1, t3) with -1
                        ifg3 for (t2, t3) with 1
        Examples:   obj = ifgramStack('./inputs/ifgramStack.h5')
                    date12_list = obj.get_date12_list(dropIfgram=True)
                    C = ifgramStack.get_design_matrix4triplet(date12_list)
        ro  r   ry   r{   r   r   z5
WARNING: No triangles found from input date12_list:
z!
N)r[  tuplerh  r   r  r  	itertoolschainfrom_iterablecombinationsr  KeyErrorr   r   int8r  rd   stackastyper   )r  rH  date12_tuplesidxifg
ifg_to_idxr  closure_listMC_listdate1date2date3ifg12ifg23ifg13idx12idx23idx13rows                       r\   get_design_matrix4tripletz%ifgramStack.get_design_matrix4triplet  s    ;'6ABqwws|,BB 09/GH83c3hH
H 3y<<]KLM	 !--i;#/ 	E5%ENEENEENE"5)"5)"5)
 ((1BGG,CCJCJCJMM##	& v;!KK=X[\]xx&&rzz22I C I&  s   !E!E&;E,,	E87E8c           	          t        |       } | D cg c]  }|j                  d      d    }}| D cg c]  }|j                  d      d    }}t        t        t        ||z                     t	        |       }t	              }t        j                  d         }t        j                  D cg c]"  }t        j                  j                  ||      $ c}      }||d   z
  D cg c]  }|j                  |j                  dz  z     }	}t        j                  |	t        j                        dz  }	t        j                  ||ft        j                        }
t        j                  ||ft        j                        }t!        |      D ]f  }fd| |   j                  d      D        \  }}d|
||f<   d|
||f<   ||k  r|	|dz   |dz    |	|| z
  ||||f<   O|	|| |	|dz   |dz    z
  ||||f<   h |d	k7  rn|"t	        t        |            dk(  r|d   }nd   }|rHj#                  |      }t        j$                  |
d
d
d|f   |
d
d
|dz   d
f   f      }
|d
d
d
df   }|
|fS c c}w c c}w c c}w c c}w )a  Return design matrix of the input ifgramStack for timeseries estimation

        Parameters: date12_list - list of string in YYYYMMDD_YYYYMMDD format
                    refDate     - str, date in YYYYMMDD format
                                  set to None for the 1st date
                                  set to 'no' to disable reference date
        Returns:    A - 2D array of float32 in size of (num_ifgram, num_date-1)
                    B - 2D array of float32 in size of (num_ifgram, num_date-1)
        Examples:   obj = ifgramStack('./inputs/ifgramStack.h5')
                    A, B = obj.get_design_matrix4timeseries(obj.get_date12_list(dropIfgram=True))
                    A = ifgramStack.get_design_matrix4timeseries(date12_list, refDate='20101022')[0]
                    A = ifgramStack.get_design_matrix4timeseries(date12_list, refDate=0)[0] #do not omit the 1st column
        ro  r   r{   rx   ry   r|   c              3   @   K   | ]  }j                  |        y wrJ  )r   )rs   rH  r  s     r\   ru   z;ifgramStack.get_design_matrix4timeseries.<locals>.<genexpr>.  s     P)//!,Ps   r   noN)r[  rh  r  r  r  r   r   r   r   r   r   r   r   rw   r   r   r  r   r  )r  r  rt   date1sdate2s
num_ifgramr  date_formatr   r   r  Bind1ind2ind_rr  s                  @r\   r  z(ifgramStack.get_design_matrix4timeseries  s     ;'+67a!''#,q/77+67a!''#,q/774FVO 456	%
y> //	!=	R1"++..q+>RS?DuQx?OQ!))|44QQbjj1F:
 HHj(+RZZ8HHj(+RZZ8z" 	NAPk!n6J6J36OPJD$AagJAagJd{"'q":U4=M"M!T$Y,"'T"2U4!8D1H5M"M!T$Y,	N d? s6{#q($QiG'lG !0IIqAeG}aE!G:.>?@a"fI!tY 87 SQs   I,I10'I6(#I;c                    t        j                  | j                  d      5 }|d   dd }|r||d   dd    }ddd       | j                  |      }| j	                  |      d   }t        j                  |j                  d   dz   t
        j                        }t
        j                  j                  |d	      d   |dd |S # 1 sw Y   xY w)
z[Get spatial perpendicular baseline in timeseries from ifgramStack, ignoring dropped ifgramsrm   r-   Nrp  rr  r   r{   ry   )rcond)r   r   rX   r  r  r   r   r   r   linalglstsq)r[   rp  rb   r~  rz  r  pbaseTimeseriess          r\   get_perp_baseline_timeseriesz(ifgramStack.get_perp_baseline_timeseriesK  s     YYtyy#& 	>!G*Q-K)!L/!*<=	> ))Z)@
--j9!<((1771:a<rzzB iiooaDoI!L	> 	>s   CCc                    |y| j                  d      }| j                  d      }t        t        t        |      t        |      z
              }||k(  rt	        d       yt        j                  | j                  d      5 }t	        d| j                   d       t	        d	       t        j                  |D cg c]  }||v c}t        j                  
      |d   dd t        D ]f  }||j                         v st	        d| d       t        t        j                               ||   j                  d<   t        j                   d       h 	 ddd       yc c}w # 1 sw Y   yxY w)z8Update dropIfgram dataset based on input date12List2DropNFrr  Tz^The same date12List2Drop / dropIfgram is already marked in the file, skip updating dropIfgram.zr+z
open file z with r+ modez"update HDF5 dataset "/dropIfgram".ry   rp  z+update MODIFICATION_TIME in HDF5 dataset "/"MODIFICATION_TIMEr{   )r  r  r[  r  rd   r   r   rX   r   r   r   r  r   r   timer   sleep)r[   date12List2Dropdate12ListAlldate12ListKeptOlddate12List2DropOldrb   rt   r_  s           r\   update_drop_ifgramzifgramStack.update_drop_ifgramZ  sD   ",,,> !00D0A#D]);cBS>T)T$UV0rsYYtyy$' 
	"1Jtyyk7867!#]*[1O+C*[ceckck!lAlOA , "QVVX%GxqQR;>tyy{;KAfIOO$78JJqM	"
	" 
	" +\
	" 
	"s%   8E :E
8E >AE E  E)rJ  rK  )FN)r.   NTF)r2   NNFFN)F)r.   FF)NTT)r2   Tr  )r  NT)rM  rN  rO  rP  r]   rc   r   r~   r   rw  r   r#  r  r  r   r  r  r%  r  r  r  r  staticmethodr  r  r  r#  r   r^   r\   rk  rk    s    
"3j&7`?B [`590&f*:<| $!PBT.p 43 43p < <~"r^   rk  c                       e Zd ZddZddZy)r   Nc                     || _         y rJ  )rX   rZ   s     r\   r]   zsingleDataset.__init__y  s	    	r^   c                     t        j                  | j                  d      5 }t        |j	                               d   }||   d d  }d d d        ||d   |d   |d   |d   f   }S # 1 sw Y   $xY w)Nrm   r   r{   r   r   )r   r   rX   r[  r   )r[   r   rb   r_  r   s        r\   r   zsingleDataset.read|  s    YYtyy#& 	 !!&&(^A&FV9Q<D	  ?As1vAs1v& 'D	  	 s   %A))A2rJ  )rM  rN  rO  r]   r   r   r^   r\   r   r   x  s    r^   r   c                   <    e Zd ZdZd	dZd
dZd
dZd Zd ZddZ	y)r   a3  
    Time-series object in HDF-EOS5 format for Univ of Miami's InSAR Time-series Web Viewer
        Link: http://insarmaps.miami.edu
    It contains a "timeseries" group and three datasets: date, bperp and timeseries.

    File structure: https://mintpy.readthedocs.io/en/latest/hdfeos5/#file_structure
    Nc                     || _         d| _        i ddddddddddddd	d
dd
dd
dd
dd
ddddddddddddddi| _        y )Nr   r!   observationr   r   r   r    r   rA   qualityrD   r2   varianceuncertaintyr"   rR  r'   r)   r(   r*   r+   r-   )rX   rY   datasetGroupNameDictrZ   s     r\   r]   zHDFEOS.__init__  s    		%&^M %&%*M%&%8M%& &;M%& &,M	%&
 &,M%& &9I%& &,I%& &1I%& &0I%& &3I%& &.J%& &6J%& &:J%& &4J%& &2J%&  &1J!%&" &-J#%&!r^   c                     	 | j                   j                          |r6t        dt        j                  j                  | j                                y y #  Y y xY wr`   ra   rh   s     r\   rc   zHDFEOS.close  sJ    	FFLLN/0@0@0K/LMN 	rU  c           	         |rBt        d| j                   dt        j                  j	                  | j
                                | j                          t        | j                  d         | _	        t        | j                  d         | _
        g | _        t        j                  | j
                  d      5 }d}||   }|d   d d  D cg c]  }|j                  d       c}| _        |d	   d d  | _        t#        | j                        | _        | xj                  | j                  D cg c]	  }| d
|  c}z  c_        dD ]v  }||   }|j'                         D ]\  }t)        ||   t        j*                        s!t#        ||   j,                        dk(  s=| j                  j/                  | d|        ^ x 	 d d d        y c c}w c c}w # 1 sw Y   y xY w)Nrk   rl   LENGTHWIDTHrm   #HDFEOS/GRIDS/timeseries/observationr   r   r-   z/displacement-)zHDFEOS/GRIDS/timeseries/qualityz HDFEOS/GRIDS/timeseries/geometryr   r  )rd   rY   re   rf   rg   rX   r~   r   r   r   r   r   r   r   r   r   r   r  r   r   r   rY  r   r  )r[   ri   rb   gnamegrt   r   s          r\   r   zHDFEOS.open  s   E$))GBGG,<,<TYY,G+HIJ$--12w/0
YYtyy#& 	@!9E%A78y|D!QXXf-DDM7ADJt}}-DL NNDMMRq%qc:RRN> @eH668 @C!!C&$,,7C#<MQR<R--q.>?@@	@ 	@ E
 S	@ 	@s8   6GG A	G)G
7AG<G$G
GGc                    t        j                  | j                  d      5 }t        |j                        | _        |d   d d  }d d d        | j
                  j                         D ]$  \  }}	 |j                  d      | j
                  |<   & | j                  | j
                  d<   D cg c]  }|j                  d       }}d| j
                  j                         vr|d   | j
                  d<   |j                  | j
                  d         | _        | j
                  S # 1 sw Y   xY w#  || j
                  |<   Y xY wc c}w )Nrm   z(HDFEOS/GRIDS/timeseries/observation/dater   r   r   r   )r   r   rX   r   r   r   r   r   rY   r   r   r   r   s          r\   r~   zHDFEOS.get_metadata  s    YYtyy#& 	E! MDM@A!DE	E ----/ 	+JC+%*\\&%9c"	+
 &*YYk" /44AHHV$44T]]//11(0DMM*% t}}Z'@A}}	E 	E+%*c" 5s   #D!-D-*E!D*-E c                    t        j                  | j                  d      5 }|d   }|d   d d  D cg c]  }|j                  d       c}| _        d d d        | j                  S c c}w # 1 sw Y   | j                  S xY w)Nrm   r3  r   r   r   )r[   rb   r5  rt   s       r\   r   zHDFEOS.get_date_list  su    YYtyy#& 	E!78A78y|D!QXXf-DDM	E }} E	E }}s   A*A%	A*%A**A>c                 ,   | j                  d       |dd| j                  | j                  g}|t        d   g}nt	        |t
              r|g}t        j                  | j                  d      5 }|d   j                  d      d   }| j                  |   }|d| d	|    }|rt        d
| d| j                   d       t        |j                        dk(  r|dd }nt        |j                        dk(  r||d   |d   |d   |d   f   }nt        j                  |j                  d   t        j                         }	|D 
cg c]$  }
|
j#                  |d      j#                  dd      & }}
t%        d |D              rd|	dd n%|D ]   }d|	| j&                  j)                  |      <   " |dd|d   |d   |d   |d   f   |	   }t%        d |j                  D              rt        j*                  |      }ddd       |S c c}
w # 1 sw Y   S xY w)a  Read dataset from HDF-EOS5 file
        Parameters: self : HDFEOS object
                    datasetName : (list of) str
                    box : tuple of 4 int, for (x0, y0, x1, y1)
                    print_msg : bool
        Returns:    data: 2D or 3D array
        Example:    obj = HDFEOS('S1_IW1_128_0593_0597_20141213_20171221.he5')
                    obj.read(datasetName='displacement')
                    obj.read(datasetName='displacement-20150915')
                    obj.read(datasetName=['displacement-20150915',
                                          'displacement-20150921'])
                    obj.read(datasetName='incidenceAngle')
        Fr   Nr   r   rm   r}   zHDFEOS/GRIDS/timeseries/r  r   r   r   r{   r   r   ry   r   c              3   "   K   | ]  }|  	 y wrJ  r   rr   s     r\   ru   zHDFEOS.read.<locals>.<genexpr>  rd  re  Tc              3   &   K   | ]	  }|d k(    ywr   r   rr   s     r\   ru   zHDFEOS.read.<locals>.<genexpr>  rg  r   )r   r   r   r   r   r   r   r   rX   rh  r.  rd   r  r   r   r   r   r   r   r   r   r   )r[   r   r   ri   rb   ri  	groupNamer   r   r   rt   r   s               r\   r   zHDFEOS.read  s    			E	";aT[[1C045KS)&-KYYtyy#& 	,!$Q--c215J11*=I-i[*FGB,=dii[MN288}!!uRXX!##a&Q-QA67 88RXXa[BS^_aqyyR8@@bI__2k22"&HQK( @;?!4!4Q!78@ !a&Q-a&Q-( ))13
 2tzz22::d+D9	,:  `	,: s    /CH	)H-BH	H		HrJ  rK  )NNT)
rM  rN  rO  rP  r]   rc   r   r~   r   r   r   r^   r\   r   r     s&    &.@0$4r^   r   ) rP  r   r   r  re   r  r   numpyr   scipyr   mintpy.utilsr   r   r	   r   r   r   r   r   r   DATA_TYPE_DICTTIMESERIES_KEY_NAMESr   r^  r  DSET_UNIT_DICTr   rR  rk  r   r   r   r^   r\   <module>rB     s   .   	     	
BHH	bhh	(.		288	bhh	(/	;BBHH	 RXX	 rxx	 RZZ		 #BJJ		
 bjj	
 $RZZ	 r||	 )",,	 9Fr||	 bll	 )+--R]]2==	 C   " &?? ? 	?
 ? ? ? ? ? ? ?  3!?" 8#?$ 8%?& 3'?( 3)?* 8+?, 8-?. 3/?0 31?2 33?4 35?6 37?< C=?> 
C??@ CA?B CC?D CE?F CG?L #M?N (O?P *Q?R #S?X Y?Z [?\  }?HS Svy y~A" A"P  L Lr^   