
    Zf                     :   d dl Zd dlZd dlZd dlZ ej
                  ded       d dlmZ	 d dl
mZ d dlZd dlmZ d dlmZmZ d dlmZ d dlmZmZmZmZ d d	lmZmZmZm Z! d
 Z"d Z#ddZ$d Z%ddZ&d Z'd Z(g g dfdZ)d Z*d Z+d Z,d Z-d Z.d Z/ G d d      Z0y)    Nignore
matplotlib)categorymodule)make_axes_locatable)subsetversion)multilook_data)TIMESERIES_KEY_NAMESgiantIfgramStackgnssifgramStack)plotptimereadfileutilsc           	         t        d       d}| j                  rd}|S g }| j                  D ]  }|t        j                  j                  t        j                  j                  |      dt        j                  j                  |            g}|D cg c]$  }t        j                  j                  |      s#|& }}t        |      dkD  r|j                  |d          d} |dk(  r_t        j                  j                  | j                        }t        d |D              }||kD  rd}|S t        | d| j                   d       |S c c}w )	Nzupdate mode: ONskiprunpicr   c              3   Z   K   | ]#  }t         j                  j                  |       % y wN)ospathgetmtime).0is     D/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/view.py	<genexpr>zrun_or_skip.<locals>.<genexpr>7   s     7!!!$7s   )+z& exist and are newer than input file: z
 --> skip.)vprintdisp_figoutfiler   r   joindirnamebasenameisfilelenappendr   filemin)inpsflagoutfilesfnamefnamesr   titos           r   run_or_skipr2   "   s"   
D }} H bggooe&<eRWWEUEUV[E\]^#9rww~~a'8!99v;?OOF1I&D v~WWdii(7h777D K hZEdii[PZ[\K :s   $E5Ec                 
    t        j                  |      }t        j                  t	               |      \   _         _        |j                   j
                         _        |j                   j
                         _        dd j                   j                  f _        t        dt         j                        z          t        dt         j
                        z          t        dt        |j                   j                              z          t        dt         j                        z          t        d       t         j
                  d    j
                  d   z
   j
                  d	    j
                  d   z
        d
kD  rd _         j                   rt        d        j"                  dkD  rd _        t'        j(                  | j*                   j,                  d    j.                         _         j0                  rt        d j0                           j                  s*|j2                  st5        d       t5        d       g  _        nL|j7                   j0                  d    j0                  d         d d	  _        t        d j8                           j8                  rA j                  r5|j;                   j8                  d    j8                  d         d d	  _        n;d|j=                         v r"t?        |d         t?        |d         g _        nd  _        t'        j@                   |       t'        jB                  | jD                   jF                   jH                   j.                        \   _"         _#        tK         | j.                          jL                  stO         fddD              sD jP                  dk(  r# j,                  d   jS                  d      d   dv s j,                  d   dk(  r
ddg _&        n+ jP                  dv s jF                  r jH                   _&         jT                  s' j                   r jV                  rd  _*        nd _*         jX                  r.t'        jZ                  | j.                        \   _.         _/         j`                  s3t'        jb                  |d!    j,                  t	               "       _0        t        d# j`                  z           jd                  sC j`                  jg                  d$d%      } jh                  s|d&z  }|  jj                   g _2        tm                 S )'Nr   zdata   coverage in y/x: zsubset coverage in y/x: zdata   coverage in lat/lon: zsubset coverage in lat/lon: zH------------------------------------------------------------------------         g     @@Fz=area exceed 2000 pixels, turn off default DEM contour displayT)datasetName	print_msgz"input reference point in lat/lon: zbWARNING: --ref-lalo is NOT supported when 1) file is radar-coded AND 2) no lookup table file foundz1    --> ignore the --ref-lalo input and continue.z"input reference point in y  /x  : REF_LATREF_LON)	disp_unitwrap
wrap_ranger8   r8   c              3   V   K   | ]   }|j                   j                         v  " y wr   )keylowerr   r   r+   s     r   r   z1update_inps_with_file_metadata.<locals>.<genexpr>   s!     E!TXX^^%%Es   &))	coherencez.corr   -)rC   cmask              ?)z.intg?	FILE_PATH)datasetNames	inps_dictzfigure title:   _nws)7ut
coordinater   subset_input_dict2boxvarspix_boxgeo_boxcheck_box_within_data_coveragebox_pixel2geowidthlengthdata_boxr    strmaxdisp_dem_contourdem_filemultilook_num	multilookppauto_colormap_namecolormapdsetr8   ref_lalolookup_fileprint	geo2radarref_yx	radar2geokeysfloatread_pts2inpscheck_disp_unit_and_wrapr;   r<   r=   check_map_projectionvlimanyr@   splittransparencydisp_dem_shade	auto_flipauto_flip_directionflip_lrflip_ud	fig_titleauto_figure_titler"   replacedisp_whitespacefig_extupdate_figure_setting)r+   metadatacoordfbases   `   r   update_inps_with_file_metadatar   A   sH    MM(#E!'!=!=d4j(!SDL$,77EDL&&t||4DL4::t{{3DM
%c$--&889
%c$,,&778
)#e.A.A$--.P*QQR
)#dll*;;<
UV 4<<?T\\!_,<<?T\\!_,.034 %==RS A ))IIaL..	DM }}3DMM?CD||E$5$5vwEFDM  //$--*:DMM!<LMbqQDK7}EF {{t||AAGK	hmmo	%x	23U8I;N5OP D%(D !# ; ;..YY??..!DNDI  h$..ID 99E/DEEHH-$))A,2D2DS2I!2LP]2]99Q<7*c
DIXX!TYYDI ==T00 #D #D ~~%'%;%;HPTP^P^%_"dl >>--[!4j

 DNN*+ <<&&sB/##VOE '$,,01 &DK    Tc                    d| _         |j                  dd      j                         | _        | j                  r)| j                  j                  d      r| j                  dk(  r| j                  s| j                  rd}| j                  j                  d      r)t        j                         | _         t        |dz          | S | j                  j                  d	      rd
|j                         v rI|d
   }t        j                  |      | _         t        |d| z          | j                  rt        d      | S t        d| j                          t        d       d| _        | S )a\  Check/initiate the map projection object via cartopy based on inps and metadata.

    Cartopy requires that:
      1. file is geocoded AND
      2. file coordinates are in the unit of degrees / meters AND
      3. set to display in geo-coordinates

    Use cartopy (by initiating inps.map_proj_obj) ONLY IF:
      1. show fancy lat/lon label via --lalo-label OR
      2. show coastline via --coastline

    This function will update the following variables:
        inps.map_proj_obj  # cartopy.crs.* object or None
        inps.coord_unit    # degree or meter
        inps.fig_coord     # geo or yx
    NY_UNITdegreesdegmetergeoz!initiate cartopy map projection: r   PlateCarreer   UTM_ZONEz	UTM zone z1--lalo-label is NOT supported for projection: UTMz(WARNING: Un-recognized coordinate unit: z1    Switch to the native Y/X and continue to plotyx)map_proj_objgetrA   
coord_unitrS   
startswith	fig_coord
lalo_label	coastlineccrsr   r    ri   UTM
ValueErrorre   )r+   r}   r8   msgutm_zones        r   rm   rm      s1   $ Dll8Y7==?DO**+;<%'DNN 2??%%e, $ 0 0 2D3&'" K __''0X]]_,#J/$(HHX$6!sy
334 ??$%XYY K	 @@QRSIJ!%Kr   c                    |j                   r|j                   d   |j                   d   |j                   d   dz   |j                   d   dz   g|_        |j                   d   |j                  d   z
  }|j                   d   |j                  d   z
  }|j                  dkD  rbt	        |t	        |j                  dz        z
  |j                  z        }t	        |t	        |j                  dz        z
  |j                  z        }t        | j                        dk(  rd|cxk  r| j                  d   k  r&n n#d|cxk  r| j                  d   k  rn n| ||f   }n=t        j                  |j                  |j                  d   |j                  d      d   }t        j                  j                  |      s4t        j                  |      s| |z  } t        d|j                           nd	| d
| d}|dz  }t!        |       d |_         nt        | j                        dk(  rd|cxk  r| j                  d   k  r<n n9d|cxk  r| j                  d   k  r!n nt        j"                  | d d ||f         }nc|j$                  dk(  r;t        j                  |j                  |j                  |j                  d      d   }nt'        d|j                    d      t        j                  j                  |      st        j(                  t        j                  |             r`| t        j*                  |j-                  ddd      d| j                  d   | j                  d   f      z  } t        d|j                           n(d	| d
| d}|dz  }t!        |       d |_         nd |_         t/        j0                  | ||j2                  |j4                  |j6                  |j8                        \  } |_        |_        |_        |j4                  r|j6                  |_        |j>                  rt        d|j>                          |j>                  dk(  rt        j@                  |       } n|j>                  dk(  rt        jB                  |       } n|j>                  dk(  r| dz  } ny|j>                  dk(  rd| z  } nd|j>                  dk(  r| dt        jD                  z  z  } n>|j>                  dk(  r| t        jD                  dz  z  } nt'        d|j>                         t        jF                  |       t        jH                  |       g|_%        |j<                  s4t/        jL                  | |j8                        \  |_'        |_        |_(        t        d|jJ                   d|j2                          t        d |j<                   d|j2                          | |fS )!Nr5   r   r6   Fr7   boxr8   zset reference pixel to: z WARNING: input reference pixel (, z!) has either masked or NaN value!z -> skip re-referencing.r4   
timeserieszinput reference point z is out of data coverage!)r}   r;   r<   r=   r8   zApply math operation: squaresqrtreverseg      inverserG   rad2degg     f@deg2radzun-recognized math operation: r>   data    range: rK   display range: ))rg   ref_boxrR   r]   intr'   shaper   readr)   rb   npma	is_maskedisnanr    re   squeezer@   r   alltilereshaper_   scale_data4disp_unit_and_rewrapr;   r<   r=   r8   
disp_scalern   math_operationr   r   pinanminnanmaxdlim'auto_adjust_colormap_lut_and_disp_limitcmap_lutunique_values)datar}   r+   ref_yref_xref_valr   s          r   update_data_with_plot_inpsr      s   {{ADKKNA*DKKNQ,>@ Aa0Aa0 !T%7%7!%;!<<@R@RRSET%7%7!%;!<<@R@RRSEtzz?aE*DJJrN*qE/JDJJrN/Jue|,"--II $		!#	
  55??7+BHHW4E1$++?@8r%Hij11c
"_!E*DJJrN*qE/JDJJrN/J**T!UE/%:;\)"--II $		#	
  !#9$++F_!`aa 55??7+8I7I0JAq 9Atzz!}djjYZm;\]]1$++?@8r%Hij11c
" 44..YY??..T	^	_	Y yyOO	 '(;(;'<=>  H,ryy  F*rwwt}  I-  I-rDy  I-ruu0D  I-0D!?@S@S?TUVV 4"))D/2DI99  "II$Z^ZhZhi				
_TYYKq(89:
_TYYKq(89::r   c           	      	   ddl m} | j                         dd }t        d |D              rt	        |      }g }t        j                  |D cg c]  }|j                  d       c}      d   }t        j                  |D cg c]  }|j                  d       c}      d   }t        |      D ]  \  }t        fdt        ||      D              rZt        ||      D ]J  \  }	}
|	k(  r|dd }|	cxk  r|
k  rn n	d|z   z  }(|
k(  s.d|dd	 z   z  }|j                  |        | ~|j                  |         ||      }|j                  rt        nd
 at        |      \  }}t!        ||      }t#        j$                  |j&                  |j(                  |j*                  d   |j,                  |j.                  |j0                  |j                        \  |_        |_        t5        j6                  |j&                  |j*                  d   |j,                  |j                        \  }}|j8                  r=|t5        j6                  |j&                  |j8                  |j,                  d      d   z  }|j:                  dv r|j*                  d   j                  d      d   j                  d      r{d|j=                         v rit?        |d         t?        |d         }}t5        j6                  |j&                  |j*                  d   |||dz   |dz   fd      d   }||dk7  xx   |z  cc<   |j@                  r#t
        jB                  jE                  |dk(  |      }|j2                  .t
        jB                  jE                  |j2                  dk(  |      }n4t        jF                  |jH                  t
        jJ                        |_        t
        jB                  jM                  |      rT|xj2                  |jN                   z  c_        |xj2                  t        jP                  |jR                         z  c_        n)|xj2                  t        jP                  |       z  c_        tU        |||      \  }}|r`|jV                  D cg c]  }|dz  	 }}|jX                  t[        |jX                        ni }t]        j^                  ||      d   }||||fS |||fS c c}w c c}w c c}w )a  Prepare data from command line as input, for easy call plot_slice() externally.

    Parameters: cmd  - string, command to be run in terminal
    Returns:    data - 2D np.ndarray, data to be plotted
                atr  - dict, metadata
                inps - namespace, input argument for plot setup
    Example:
        from cartopy import crs as ccrs
        from mintpy.view import prep_slice, plot_slice

        # initiate matplotlib figure/axes
        subplot_kw = dict(projection=ccrs.PlateCarree())
        fig, ax = plt.subplots(figsize=[4, 3], subplot_kw=subplot_kw)

        # compose view.py command
        cmd = 'view.py geo_velocity.h5 velocity --mask geo_maskTempCoh.h5 --dem srtm1.dem --dem-nocontour '
        cmd += f'--sub-lon -91.7 -91.4 --sub-lat -0.5 -0.3 -c jet -v -3 10 '
        cmd += '--cbar-loc bottom --cbar-nbins 3 --cbar-ext both --cbar-label "LOS velocity [cm/year]" '
        cmd += '--lalo-step 0.2 --lalo-loc 1 0 1 0 --scalebar 0.3 0.80 0.05 --notitle'

        # call prep/plot_slice()
        data, atr, inps = prep_slice(cmd)
        ax, inps, im, cbar = plot_slice(ax, data, atr, inps)
        plt.show()
    r   )cmd_line_parser5   Nc              3   >   K   | ]  }|j                  d         yw)"'N)r   )r   xs     r   r   zprep_slice.<locals>.<genexpr>m  s     
41<<$
4   r   c              3   D   K   | ]  \  }}|cxk  xr |k  nc   y wr    )r   ind0ind1r   s      r   r   zprep_slice.<locals>.<genexpr>v  s"     It41$$$Is    rK   r   c                       y r   r   argskwargss     r   <lambda>zprep_slice.<locals>.<lambda>      r   	mask_filer7   r   vminvmaxr8   r   Fr   rD   unwrapPhaseREF_YREF_XrF   dtypeg       @
projectionfigsize
subplot_kw)0mintpy.cli.viewr   rp   ro   listr   wherer   endswith	enumeratezipr(   r8   re   r    read_input_file_infor   r_   	read_maskr)   r   rb   rR   	mask_vmin	mask_vmaxmskr   r   ref_dater@   ri   r   	zero_maskr   masked_whereonesr   bool_r   maskr   r   r   fig_sizer   dictpltsubplots)cmdauto_figr   iargs
temp_iargsr   ind0sind1s	temp_iargr   r   tempr+   atrr   r   r   ref_datar   r   r   axs                     `   r   
prep_slicer  L  s/   6 /IIKOE
 
4e
44%[
 ZH!,,{3HI!L:Fa!**[1FGJ%j1 	(LAyIs5%7HII"%eU"3 JD$Dy(}Di/din 44T* Y'	(" % D nnU*FF %T*ID#)$4D!||		..IIaLLL^^^^.. DHdn 		IIaLLL..	ID# }}II	

  	 	O#		!""3'*55mD388:%3w<(#c'l*;u==II		!uQwa0	

  	TRZH$ ~~uu!!$"*d3xxuu!!$((b.$7774::RXX6 
uutTYYJRXXdii(((RXXd^O#+D#t<JD$ "&--0Q1S500;?;L;L;XTT%6%67^`
\\'jA!DS$""S${ IFn 1s   S#S(S-c                 |   !"#$%& j                   rt        nd adt        dt        fd}t        j                  t              rEt        j                  j                  j                  j                        j                  _        j                  rEt        j                  j                  j                  j                  j                         \  }t        dt        j                         z          j"                  \  &%t%        j&                  |j(                        "t+        j                  j,                  d	   j,                  d
   j                   d
      }j                  r{j(                  j/                  d      r_j0                  dk(  rOt        d       j                  d	   j                  d   j                  d   j                  d
   f_        j                  d   j                  d
   j                  d	   j                  d   f}j4                  r?t        dj4                          | j7                  j4                  j8                         j                  r9t        d       t        j:                  | j                  j                          t%        j<                  |      j>                  rj@                  rԉjB                  r tE        jF                  jH                        jB                        }|jK                         }	jM                  |	d	   |	d
         d	d \  }
}|
j                  d
   z
  |j                  d	   z
  f   }|z  t        djB                   d|	d	   dd|	d
   dd|ddjN                   
       d_(        jR                  r&t        jT                  | j                         }njV                  dk(  rPt        d jV                   d!        | jX                  fj2                  d"jZ                  j\                  d#|}njV                  d$k(  r{t        d jV                   d%        |j2                  j"                        \  }} | j^                  ||fja                         d&jb                  d'|}| je                  d(       ntg        d)jV                   d*      jh                  rCt        jj                  | jh                  |jl                  jn                  j                   +       j(                  j/                  d,      r)j                  d   j                  d	   z
  d-kD  rd_8        jp                  rpt        d.jr                          t        jt                  | j                  j(                  jr                  jv                  jx                  jz                  /       j|                  rt        j~                  | j                  j                  j                  j                  j                  j                  rj                  njx                  j                  j                   0	       n"| j                  d1d2jx                  d3d3d3d34       jP                  rZj                  rN| j                  j                  d
   j                  d	   j                  j                  5       t        d6       j                  X| j                  j                  d7d7d
f   j                  d7d7d	f   j                  j                  d8d9:       t        d;       j>                  r$t        j                  | ||j                         } j                  r$t%        j<                        j"                  \  "%&fd<}|| _O        nyd=_        t        d>       j                  r/t        d       t        j:                  | d7j                          j                  d	   d?z
  j                  d   d?z
  j                  d   d?z
  j                  d
   d?z
  f_        jR                  r%t        jT                  | j                         }nډjV                  dk(  r6t        d@        | jX                  fj2                  jZ                  dA|}njV                  d$k(  rmt        dB        |j2                  j"                        \  }} | j^                  ||fja                         d&jb                  d'|}| je                  d(       ntg        d)jV                   d*      | j                  jx                  C       jP                  rdD\  }}j                  rj                  d	   j                  d
   }}n.dE|j                         v rt        |dE         t        |dF         }}|r6|r4| j                  ||j                  j                  5       t        d6       j                  X| j                  j                  d7d7d
f   j                  d7d7d	f   j                  j                  dGd9:       t        d;       d}|rSt        j                  dHdIgdJdKgdJdLgdMdNgdHdIgg      }| j                  |d7d7d
f   |d7d7d	f   dOj                  dGd9:       | j                  j2                  d	d        | j                  j2                  ddP        t        j                  j                  t        j                  j                  |dQ         dR      !t        j                  j                  !      rt        j                  !       t         fdSdTD              rMt        j                  !dUj                  dV      d	   #t        j                  !dWj                  dV      d	   $n8dXt        j                  j                  !       d}|dYz  }t        |       d7!nd7!!"#$%&f	dZ}|| _O        d7}j                  rft        |       }|j                  j                  j                  j                  t        j                  [      }t        j                  ||      \  }j                  r2| j                  j                  jx                  j                  \       j                  rt        d]       | j                          j                  rt        d^       | j                          j                  s| je                  d_       t        d`       j                  r[j                  dak(  r| j                  dd3dd3b       | j                  j                  d3       | j                  j                  d3       n>| j                         j                  g        | j                         j                  g        j                  rjt+        j                  c      }j                  ddz  d	k(  rde|df<   t        j                  | j                         fi | t        dgj                   dh       | ||fS )ia  Plot one slice of matrix
    Parameters: ax       : matplot.pyplot axes object
                data     : 2D np.ndarray,
                metadata : dictionary, attributes of data
                inps     : Namespace, input options for display
    Returns:    ax       : matplot.pyplot axes object
                inps     : Namespace for input options
                im       : matplotlib.image.AxesImage object
                cbar     : matplotlib.colorbar.Colorbar object
    Example: See prep_slice() above for example usage.
    c                       y r   r   r   s     r   r   zplot_slice.<locals>.<lambda>  r   r   extentds_shapec                     |\  }}t        j                  | d   | d   |      }t        j                  | d   | d   |      ddd   }t        j                  ||      \  }}|j                         |j                         fS )a+  Get mesh grid coordinates for a given extent and shape.
        Parameters: extent - tuple of float for (left, right, bottom, top) in data coordinates
                    shape  - list of int for [length, width] of the data
        Returns:    xx/yy  - 1D np.ndarray of the data coordinates
        r   r5   r6   r4   Nr   )r   linspacemeshgridflatten)r  r  heightrV   r   yxxyys           r   extent2meshgridz#plot_slice.<locals>.extent2meshgrid  su     !KKq	6!9e4KKq	6!9f5dd;Q"Bzz|RZZ\))r   r   vlist)rR   rS   r8   zdisplay data in transparency: )r   r   r5   )cmapr   r   alphazorderr   r   zplot in geo-coordinater6   r4   z!draw coast line with resolution: )
resolution	linewidthzplotting DEM background ...)r  rS   demr+   r8   )sitez=referencing InSAR data to the pixel nearest to GNSS station: z at [z.6fr   z] by substrating .3frK   Fr>   imagezplotting data as z! via matplotlib.pyplot.imshow ...upper)r  origininterpolationanimatedscatterz7 via matplotlib.pyplot.scatter (can take some time) ...o)cmarkersequalzUn-recognized plotting style: !)r  faultline_fileSNWEr  min_distr8   r      zplot scale bar: )r  rS   unitloclabelpad	font_sizer  )	r  rS   	lalo_steplalo_loclalo_max_numlalo_offsetr.  r   r8   bothinT)which	direction	labelsizeleftrighttopbottommszplot reference pointNkrG   )r=  mecmewzplot points of interestc                    d| d dd|d d}	j                  ||       \  }}|j                  d   z  }|j                  d   z  }d|cxk  rk  rn |S d|cxk  rk  rn |S ||f   }|t        j                  |      st        j                  j                  |      rdnd|d	z  }j                  rh
j                  ||       \  }}|d   z  }|d   z  }d|cxk  rk  r8n n5d|cxk  rk  r*n n'||f   }|t        j                  |      rd
nd|dz  }|d|j                  d   z   dz  }|d|j                  d   z   dz  }|S )NzE=.f, N=r5   r   , v=[], v=r  , h=[], h=.1fz, x=z.0f, y=)lalo2yxrR   r   r   r   r   r\   )r   r  r   rowcolvdem_rowdem_colhr~   	coord_demr   r  dem_lendem_pix_boxdem_widr+   
lalo_digitnum_colnum_rows            r   format_coordz plot_slice.<locals>.format_coord  s   q:,a(QqAo,>?C}}Q*HC4<<?"C4<<?"CC!'! J '(3&8&8 J cN288A;"%%//!2DxDQRSVPW.X=='0'8'8A'>$GW{1~-G{1~-GG-g-!w2H2H 01288A;xd1S'NJc$,,q/1#677c$,,q/1#677Jr   r   zplotting in Y/X coordinate ...      ?z.plotting data via matplotlib.pyplot.imshow ...)r  r  zDplotting data via matplotlib.pyplot.scatter (can take some time) ...)r7  NNr   r   blacki  i  i  i  i  i  i  rD      rH   zinputs/geometryRadar.h5c              3   &   K   | ]  }|v  
 y wr   r   )r   r   geom_ds_lists     r   r   zplot_slice.<locals>.<genexpr>  s     H1$Hs   )latitude	longituder`  r   ra  z0WARNING: no latitude / longitude found in file: z'skip showing lat/lon in the status bar.c                 P  	 d| dd|d}t        t        j                  | 
j                  d   z
              }t        t        j                  |
j                  d   z
              }d|cxk  rk  rn |S d|cxk  rk  rn |S ||f   }|t        j                  |      st        j
                  j                  |      rdnd|dz  }
j                  r(||f   }|t        j                  |      rd	nd
|ddz  }	r$|d||f   d dz  }|d||f   d dz  }|S )Nx=rI  rJ  r   r5   rE  rF  r  rG  rH  z mz, E=rB  rC  rD  )r   r   rintrR   r   r   r   r\   )r   r  r   rM  rL  rN  rQ  r   r  	geom_filer+   rV  latslonsrW  rX  s          r   rY  z plot_slice.<locals>.format_coord  sG   qgT!C)Cbgga$,,q/123Cbgga$,,q/123CC!'! J '(3&8&8 J cN288A;"%%//!2DxDQRSVPW.X==CHArxx{8$qgR8HHCT$sCx.:,a!@AACT$sCx.:,a!@AACJr   )pad
axes_class)fontsizecolorzflip figure left and rightzflip figure up and downoffzturn off axis displayr;  )r;  r:  labelbottomlabeltop)rotationZ   centervazrotate Y-axis tick labels by z deg)}r8   re   r    tupler   
isinstancera   rY   r_   ColormapExtr   
cmap_vlistr\   read_demrR   rS   rq   r   rN   get_lalo_digit4displayr   r   rn   r   r   r  r   
coastlinescoastline_linewidthplot_dem_backgroundrO   	disp_gnssgnss_componentref_gnss_siter   get_gnss_classgnss_sourceget_site_lat_lonrf   r;   disp_ref_pixeldisp_dem_blendplot_blend_imagestyleimshowr  	animationr   r  scatter_marker_sizeaxisr   r'  plot_faultlinefaultline_linewidthfaultline_min_distdisp_scalebarscalebardraw_scalebarscalebar_padr.  scalebar_linewidthr   draw_lalo_labelr/  r0  r1  r2  lalo_font_sizer   tick_paramsrc   r   
ref_markerref_marker_sizepts_lalo
pts_markerpts_marker_size	plot_gnssrY  rg   ri   r   pts_yxr   arrayset_xlimset_ylimr   r   r#   r$   r&   r   get_dataset_listr   r   r%   	disp_cbarr   append_axescbar_loc	cbar_sizer   Axesplot_colorbar
disp_title	set_titlerw   
font_colorru   invert_xaxisrv   invert_yaxis	disp_axis	disp_tickxaxisset_visibleyaxis	get_xaxis	set_ticks	get_yaxis
ylabel_rotsetpget_yticklabels)'r  r   r}   r+   r  dem_metadatar   r(  gnss_objref_site_lalor  r   r  imr  r  rY  r   r   	temp_testr  r   cbardividercaxtick_kwargsr~   rR  r  rS  rT  rU  r_  re  rV  rf  rg  rW  rX  s'    ` `                      @@@@@@@@@@@@@r   
plot_slicer    sL    nnU*FF
* 
* 
* $--%MM]]//
 (	 	 }})+MMLLLLnn	*
&\; +C0A0A,BBCzzGW**8PJ t}}499Q<diilRVRcRclmnF 	**+;<%''( ||AQa$,,WX/ZQa$,,q/4<<PQ?S >>6t~~6FGHMMT^^t?W?WMX ==01"".. h'>>d11d6H6H<t**4+;+;<$BTBTUH$557M??=#3]15EFqKDAqAQ/T\\!_1DDEHHDR(()}Q/?.DB}UVGWX[F\ ]%%-cN!DNN3CE F #(D $$RsDDNNSBZZ7"&tzzl2STU4 >GSWSeSe$(NN>6<>B ZZ9$&tzzl2ijk$T[[$**=FBBgdllnSDD\D\g`fgBGGG =djj\KLL #222200.. ??%%e,$,,q/DLLQRO2SWY1Y!&D%dmm_56__MM**..11 ??..!.. ,,151D1D$--$..,,..	* NN44>> $Dd4  I 4==GGDMM!$dmmA&6OO(<(<  >)* ==$GGDMM!Q$'q!t)<OO(<(<  % ,- >>b$h$..QB ==l3I"yyGW	 	. ' /0 ==01"".. ||As*DLLOC,?||As*DLLOC,?A $$RsDDNNSBZZ7"CD4`4CUCU`Y_`BZZ9$YZ$T[[$**=FBBgdllnSDD\D\g`fgBGGG =djj\KLL
0 %LE5{{#{{1~t{{1~uHMMO+"8G#45s8G;L7Muudoo$:N:NO-. ;;"GGDKK1%t{{1a4'8OO(<(<R  ) ,- 	XXT
T
T
T
T
 F GGF1a4L&A,8L8LRY_aGb
DKK!$%
DKK!$%
 GGLL+1F!GIbc	77>>)$#44Y?LH.GHH}}YJT\\ejklmn}}YKT\\ejklmnHIYIYZcIdHeegh@@s 	I	 	& ' D~~%b)!!$--T^^`c`h`h!i%%dB4
d 
T^^dnnDOOT ||+,
||()
 >>
&' ~~==H$NN%TutNT 	T"
T" 	  $
  $ DOO4??R1$ (K##%55.t.?tDEtRr   c                 $   t        j                  | j                        }d}| j                  j                  d      s|dj	                  |d         z  }|dj	                  |d   t
        j                  j                  | j                              z  }d|j                         v r|dj	                  |d         z  }t        d	t
        j                  j                  t               d
t        j                          t        |       t        |d         | _        t        |d         | _        |d   | _        t
        j                  j%                  t
        j                  j                  | j                              d   | _        t
        j                  j%                  | j                        d   | _        t        d| j                  | j                   f        t        j*                  | j                  d      | _        t/        |       \  } }| |fS )Nzinput file is )z.h5z.he5z{} 	PROCESSORz{} file: {}	FILE_TYPE	DATA_TYPEz in {} formatzrun z in LENGTHWIDTHr   r5   zfile size in y/x: T)
no_complex)r   read_attributer)   r   formatr   r   abspathri   r    r%   __file__r	   version_descriptionr   rW   rV   r@   splitextfileBasefileExtget_slice_list	sliceListread_dataset_input)r+   r   r   s      r   r   r   D  s   

!
!$))
,C
C99o.u||C,--=K 0"''//$))2LMMCchhj %%c+&677
T"''""8,-T'2M2M1NOP
3K c(m$DKS\"DJ;DHGG$$RWW%5%5dii%@A!DDM77##DII.q1DL
djj 9:;< ,,TYY4HDN #4(ID#9r   c           	      4   |D cg c]  }| }}|rt        |t              r|g}g }|rN|D ]H  }d|vrd| d}|j                  dd      }|| D cg c]  }t        j                  ||      | c}z  }J n||D cg c]	  }|| v s| c}z  }t        t        t        |                  }||D cg c]  }| j                  |       c}z  }t        t        t        |                  }	|	D cg c]  }| |   	 }
}|
|	fS c c}w c c}w c c}w c c}w c c}w )z0Get dataset(es) from input dataset / dataset_num*z.*)	rt  rY   ry   rematchsortedr   setindex)all_listin_listin_num_listsearch_dsetr   tempListdser   
outNumListoutLists              r   search_dataset_inputr  b  s0    **1*K* gs#iG Qb=RDBZZD) P1BHHRO4OQPPQ G=qqH}==H$s8}-.8<aq)<< S-./J %//qx{/G/J; +  Q >< 0s)   	DD+D<	DD1D/Dc                 4   t        | j                        dkD  st        | j                        dkD  r
t        | j                        dkD  rt        d| j                   d       | j                  dk(  r!d| _        t        d| j                   d       nh| j                  dk(  rYt        | j                        d	k(  rAd
| j                  d   v r0| j                  d   j                  d
      \  }}|g| _        || _        t        | j                  | j                  | j                  | j
                        d	   | _        n5| j                  dk(  r	dg| _        n| j                  dk(  r	dg| _        n| j                  dk(  rd| _        n| j                  dk(  rOt        | j                        }|j                  d       |j                  d   j                  d      d   g| _        nQ| j                  | _        | j                  dk(  r1| j                  D cg c]  }|j                  d      r| c}| _        t        | j                  | j                  | j                  | j
                        d	   | _        t        | j                  | j                  g | j
                        \  | _        | _        g }t!        j"                  | j                        d   }| j$                  s|dk(  rt        d       t'        | j                        j)                         }| j                  D cg c]  }|j                  d      d	   |v s| }}|D cg c]  }| j                  j+                  |       }}nt-        d| d       d| _        t/        t1        t3        | j                        t3        | j                        z
  t3        |      z
              | _        | j                  D 	cg c]  }	| j                  |	    c}	| _        t        | j                        | _        | j                  r~| j                  t6        vrd| _        t        | j                  | j                  gg | j
                        d   d   }
|
s(d| j                   d}|dz  }t-        |       d| _        n|
| _        | j                  d v rt        d!t8        j:                  j=                  | j                         d"t        | j                                t        d#t        | j                                t        d$t        | j                                nt        d!t8        j:                  j=                  | j                         d"t        | j                                t        d%t        | j                         d&| j                          t        d't        | j                         d&| j                          | j                  r*| j                  t6        v rt        d(| j                          | j4                  dk(  rd)}|d*| j                   z  }t?        |      t!        j"                  | j                  | j                  d   j                  d      d   +      }| |fS c c}w c c}w c c}w c c}	w ),zFCheck input / exclude / reference dataset input with file dataset listr   zinput dataset: "r   velocityFzturning glob search OFF for z filer   r5   _)r  r  r  r  r   r   HDFEOSdisplacementgiantTimeseriesreconsr   r>   rD   geometrybperpr  z&do not show the dropped interferogramsz9WARNING: --show-kept option does not apply to file type: z, ignore and continue.TNzWARNING: input reference date z is not included in input file!zIgnore it and continuer   znum of datasets in file z: znum of datasets to exclude: znum of datasets to display: zdatasets to exclude (z):
zdatasets to display (zinput reference date: zNo input dataset found!z
available datasets:
r7   ) r'   rb   dsetNumListr    r@   r  rp   r   r  r  r   r)   openr   
exDsetListexDsetNumListr   r  plot_drop_ifgramr   get_drop_date12_listr  re   r  r   r  dsetNumr   r   r   r%   	Exception)r+   date1date2objr   drop_num_listftypedate12_drop_listdrop_slice_listr   r   r   r   s                r   r  r    s|    499~S!1!12Q6tyy>A%dii[23 88z!$D1$((5ABXX%#dii.A*=#STBU99Q<--c2LE5DI!DM 0^^II((((	* +,	- 88}$&DIXX!'(DIXX** DIXX++"499-CHHuH%q)//4Q78DIDIxx:%(,		O1g9NQO	/^^II((((	* +,	- +?$$	+&'DOT' M##DII.{;E  M!;<*4995JJL*...`QAGGCLOO_<_q`O`>MNT^^11!4NMNMeWTjkl$(D! d3t'7'7#83t?Q?Q;R#RUXYfUg#ghiD,0,<,<=q"=DItyy>DL}}88// DM'^^]]O((	* +,	- ./	0 24==/A`aC++C#J DM$DMxx?")"''*:*:499*E)FbT^^I\H]^_-c$//.B-CDE-c$))n-=>?)"''*:*:499*E)FbT^^I\H]^_&s4??';&<D@QRS&s499~&6d499+FG}}%99'78||q'((899n

!
!$))19K9KC9PQR9S
TC9M P. aN >s$   Z&ZZ8Z"ZZc                     t         j                  d    j                  d   z
        }t         j                  d    j                  d   z
        } j                  dk(  r j                  sd _         j                  s j
                  r_ j                  dk(  rPt         j
                  d    j
                  d   z
        }t         j
                  d    j
                  d   z
        }t        j                  ||f j                   j                         _         S  j                  st        j                   _        t        d j                  d   d	d
 j                  d   d	d        j                  sgd _         j                  t         j                        z  dkD  r; xj                  dz  c_         j                  t         j                        z  dkD  r; j                  dk(  r j                   dk(  rut#         fddD              ra|dz  |g} j                  d   dz   j                  d   g}t        j$                   j                  || j                        \   _         _        t         j                        t         j                   j                   z        z   _        t'        j(                   j                        j+                  t,               _        t        dt/         j                        z          t        dt/         j                        z          t        dt/         j                         z          t        dt/         j                        z           j                  dk(  r\d j0                  vrNt        j                  || j                   z  f j                  d       _        t        d j                           j                  s*d _         j                   j                   z  dkD  rd _         j2                  rt4        j6                  j9                   j2                  d          _        t4        j6                  j=                  t4        j6                  j?                   j2                  d               \   _          _!         jB                  jE                          _!        nt4        j6                  j9                   jF                         _        t4        j6                  j=                  t4        j6                  j?                   jF                              d    _          j                  d    j                  d   z
   j                  d    j                  d   z
  z  ||z  k  r xj@                  dz  c_          jH                  r xj@                  dz  c_          jJ                  d    jJ                  d   z
  dt&        jL                  z  k7  r; xj@                  t/         jJ                  d    jJ                  d   z
        z  c_          jN                  r" xj@                  d jN                  z   z  c_          jP                  r xj@                  dz  c_          j                  dk(  r! j@                    jB                   g _        nPtS        d j                  dz         D cg c](  } j@                   dt/        |        jB                   * c} _         j2                  D cg c],  }t4        j6                  jU                   j:                  |      . c} _         S c c}w c c}w ) zUpdate figure setting based on number of subplots/datasets
    1) fig_size and font_size
    2) for multi: figure/row/column number
    3) for multi: output file name
    r4   r5   r6   r      r   )r  r  r8   zfigure size : [z.2fr   ]g      d@c              3   :   K   | ]  }|j                   v  y wr   argvrB   s     r   r   z(update_figure_setting.<locals>.<genexpr>  s     Kq*K   )z--nrowsz--ncols皙?gffffff?zdataset number: zrow     number: zcolumn  number: zfigure  number: z	--figsizeFz'row number is 1, adjust figure size to    2      _sub_wrap_ref_exr  )+rj   rR   r  r.  r   rS   r   absr_   auto_figure_sizer  r8   default_figsize_multir    fig_numfig_row_numfig_col_numr   auto_row_col_numr   ceilastyper   rY   r  r"   r   r   r$   outdirr  r%   outfile_baser{   rA   r)   r<   r=   r   r   r  ranger#   )r+   rW   rV   
data_shapefig_size4plotjr"   s   `      r   r|   r|     s    4<<?4<<?23F$,,q/$,,q/12E ||q~~DN}}||% 7T\\!_t||A>?T\\!_t||A>?// %....*DM\ KO }}44DMq!1# 6bq9I#8NaPQ ||DL,,uT\\22U:! ,,uT\\22U: !d&6&6!&;K4JKK !*e,J!]]1-d2DMM!4DEM131D1D	2.Dd.
 T\\*U43C3CdFVFV3V-WWwwt||,33C8!#dll"334!#d&6&6"778!#d&6&6"778!#dll"334 q [		%A// %(8(8"89..!DM <T]]OLM~~DN$"2"22R7!" <<''//$,,q/:DK.0gg.>.>rww?O?OPTP\P\]^P_?`.a+Dt|<<--/DL ''//$))4DK " 0 01A1A$))1L Ma PDQQ/$,,q/$,,q/2QRUZ[aUaa!!V+!yy!!W,!OOA&);;"%%G%%T__Q-?$//RSBT-T)UU%}}!!VDMM%99!!!U*! <<1#001$,,@ADL &+1dll1n%=? !  $0013q6(4<<.I ?DLJN,,WwT[[':WK	?Ws   -\?1]c           	         t        j                  || z
  t        j                  d   j                  d   z
  j                  z        t        j                  d   j                  d   z
  j                  z        ft         j
                        }t        j                  j                  j                  j                        }j                  r&j                  \  }}t        |||dz   |dz   fd      }t        j                        dk(  raj                  d	v rRt        d
       t        | |      D 	cg c]  }	j                  |	    }
}	|j                  dd      j!                  d      s)t#        j$                  j&                  fd|
i|d   |dd nFt        d       t        j(                  t#        j$                  j&                  fd|
i|d         |dd j                  d   j!                  d      rj                  rt#        j$                  j&                  fd|
id   }t        |j*                  d         D ]#  }	||	ddddf   dk7  }||	|fxx   ||	   z  cc<   % n:t        d       d|d<   t-        j.                  || z
  j                        }t        | |      D ]  }	|j1                  |	| z
  dz   j                  |	   j3                  d      d          t#        j$                  j&                  fdj                  |	   i|d   }j                  |	   j!                  d      rNj                  rBt#        j$                  j&                  fdj                  |	   id   }||dk7  xx   |z  cc<   |||	| z
  ddddf<    |j5                          j6                  rLt        dj6                  z          t#        j$                  j&                  fdj6                  i|d   }||z  }t        j                        dk(  sj                  dv st9        fddD              sj                  g dk(  swj                  t        t        j                              D 	cg c]
  }	d|	dz     c}	k(  s8t9        d j                  D              st9        d  j                  D              rd!}nd}|rt;        ||      \  }n-t=        fd"d#D              rd$}|d%z  }t?        |       d_         jB                  r.t        d&       t         jD                  jG                  |dk(  |      }jH                  ^t        d'       t        jJ                  jH                  |j*                  d   ddf      }t         jD                  jG                  |dk(  |      }t        jL                  |      t        jN                  |      g_(        |rzt9        fd(d)D              rfj                  d   j!                  d*      rj                  r<j                  d   d+vr+tS        jT                  |d,d-      \  _+        _,        _-        |S c c}	w c c}	w ).zIRead multiple datasets for one figure into 3D matrix based on i_start/endr4   r5   r6   r   r   )r   xstepystepr8   F)r   r8   )r   r   r  r  r  zreading data as a 3D matrix ...r  float32complexr7   Nz;input data is complex, calculate its amplitude and continuer   rF   z)reading data as a list of 2D matrices ...r8   maxValuer8   /r   suffixzconsider input reference date: )r   	inversionc              3   :   K   | ]  }|j                   v   y wr   )dsetFamilyList)r   dr+   s     r   r   z#read_data4figure.<locals>.<genexpr>  s     P1+++Pr  )
horizontalvertical)r   modelresidualbandc              3   >   K   | ]  }|j                  d         yw)	AmplitudeNr   r   r'  s     r   r   z#read_data4figure.<locals>.<genexpr>  s     Hq1::k*Hr   c              3   >   K   | ]  }|j                  d         yw)PhaseNr/  r0  s     r   r   z#read_data4figure.<locals>.<genexpr>  s     D11::g&Dr   Tc              3   :   K   | ]  }|j                   v   y wr   r   )r   r   r+   s     r   r   z#read_data4figure.<locals>.<genexpr>  s     8!qDII~8r  )z-uz--unitzNWARNING: -u/--unit option is disabled for multi-subplots with different units!zIgnore it and continue.masking pixels with zero valuemasking datac              3   :   K   | ]  }|j                   v  y wr   r   )r   argr+   s     r   r   z#read_data4figure.<locals>.<genexpr>  s     OSCtyy(Or  )z-vz--vlimz--wrapunwrap)r  
   )num_multilookr8   ).r   zerosr   rR   r]   r  r   r8   file_ref_yxr'   r&  r@   r    r  rb   r   r   r   r   r)   r  r   r   progressBarupdaterp   closer   r   r   ro   re   r;   r   r   r   r   r   r   r   r   r_   r   r   rn   r   )i_starti_endr+   r}   r   r   r   r   
ref_kwargsr   	dset_listr  r   prog_barr'  ref_dsame_unit4all_subplotsr   r   s     `                r   read_data4figurerG  [  s    88T\\!_t||A.$2D2DDET\\!_t||A.$2D2DDE ZZ	D LL    ..	F ''uueU1WeAg>%P
 	D A%bb01+0%+@AaTYYq\A	A||K3>>yImmDIIO9OOPQRDG PQffX]]499V)VvVWXYZDG q!,,];@P@P}}TYYTITTUVWH4::a=) -Aq!G}*QW!,- 	:;#{$$eGmt~~Vw& 	(AOOAK!ODIIaL4F4Fs4KB4OOP diiLTYYq\LVLQOA yy|&&}5$:J:J diiXTYYq\XZXYZ[!Q$5  '(DWa"#	( 	 }}0>?==PPPQRS 	D A%xx66P5OPP""&AA""U3tGZGZC[=\&]acU|&]]HD4G4GHHD0C0CDD!%!& /hE
d8'788bC,,C#J ~~/0uu!!$"*d3xx~ggdhhA1 56uu!!#)T2 4"))D/2DIO4NOO((+66x@IYIY##A&i7797a7a8
4ty$"4 Ku Bf '^s   =Y >Y%c           
      
   |j                   rDt        j                  |d|j                  |j                  |j
                  ||j                         |j                  |j                  n)t        j                  |      t        j                  |      g}|j                  d   dz
  |j                  d   dz
  |j                  d   dz
  |j                  d   dz
  f|_        |j                  ||j                  |d   |d   |j                  |j                   |j                  d      }|j"                  rd	\  }}|j$                  r|j$                  d   |j$                  d   }}n.d
|j'                         v rt)        |d
         t)        |d         }}|r+|r)|j+                  |||j,                  |j.                         |j1                  |j                  dd        |j3                  |j                  dd        |j4                  r|j6                  |j8                  z  dkD  r>|j;                         j=                  g        |j?                         j=                  g        d }	|	|_         |jB                  rvd}
|jD                  tF        v s|jH                  d   jK                  d      rd|jH                  |    jM                  dd      jO                  d      d   }	 tP        jR                  jU                  |d      jW                         dd }
n|jH                  |    }|jX                  j[                  |      }t]        |j^                        dk(  rEd|v rA|jO                  d      d   }|j`                  d   dk(  r|jb                  j[                  |      }|j6                  |j8                  z  }|dk  r|}
nJd|cxk  rdk  rn n| d| }
n4d|cxk  rdk  r&n n#|jM                  dd      jM                  dd      }
n| }
|
r|jd                  r0tg        |jh                        }t        jj                  ||
d|       ntg        |jh                        }|jH                  |    |jl                  v rd|d <   d!|d"<   na|jo                  d#d      d$k(  rL|jp                  r@|d%   jO                         |    }|d&k(  rd'nd(|d <   |d)   jO                         |    }|
d*| z  }
 |jr                  |
fi | |jt                  r|jw                          |jx                  r|j{                          |j|                  s|j                  d+       |S #  |}
Y LxY w),zPlot one subplot for one 3D array
    1) Plot DEM, data and reference pixel
    2) axes setting: tick, ticklabel, title, axis etc.
    N)r  rS   	dem_shadedem_contourdem_contour_seqr+   r8   r   rZ  r6   r4   r5   )r  r   r   r  r  r  r  r[  r   r   r<  r]  r9  c                     d| dd|ddS )Nrc  rI  rJ  z, v =r   )r   r  s     r   rY  z)plot_subplot4figure.<locals>.format_coord  s    Ac7$qgU++r   r  r!  rD   r   z%Y%m%dr  r         
r  r  )size)r,  prop)rj  crimsonrk  bold
fontweightPLATFORMSenSENTINEL1_SENSORAC0C1SENTINEL1_IPFz : rl  )@r\   r_   r{  rI  rJ  rK  r8   rn   r   r   r   rR   r  r  ra   r  rq   r  rg   ri   r   r   r  r  r  r  r  r  r  r  r  r  rY  r  r@   r   rb   r   ry   rp   dtdatetimestrptime	isoformatr  r  r'   r&  r   
date12Listfig_title_inr   r.  add_inner_titledropDatasetListr   disp_title4sentinel1r  ru   r  rv   r  r  r  )r   r+   r  r   r}   rn   r  r   r   rY  subplot_titledate_str	title_str	title_indnum_subplotrQ  kwarg	s1_sensors1_IPFs                      r   plot_subplot4figurerm    s    }}
nn(( 00nn	& 		-499BIIdORYYt_3UD<<?3&Q(;<<?3&Q(;=DK	4dmm$q'Q!%!3!34;L;L++a 
 
1B
 !u;;;;q>4;;q>5E'x013x7H3I5EUGGE5$//d6J6JGKKKAa !KKAa ! >>T--0@0@@2E
  $
  $,"BO 88++tyy|/F/Fw/Oyy|++C4::3?CH) " 4 4Xx H R R TUVWY Z 		!I,,Y7I 4&&'1,	1A%OOC03	88K(M9 $ 5 5i @I **T-=-==Ka )[&B&#,+R	{ ;k'R' ) 1 1#d ; C CC M#,+   0""2}!$Gdnn599Q<4#7#77%.E'N*0E,'  ||J5>4C\C\$,-?$@$F$F$H$K	1:c1Atg!)/!:!@!@!B1!E%3vh7]4e4 ||
||
 >>
Is) (s   1U U	c                 
   dt        |        d|j                  | dz
      }t        d       t        |       t        j                  | |j
                  |j                  |j                  dd      \  }}|j                  j                  j                  |       |j                         }| dz
  |j                  z  |j                  z  }t        |j                  ||j                  |j                  z  z   g      }t        ||||      }t        |j                   t               rEt#        j$                  |j                   |j&                  |j(                        j                   |_        t        d       t+        j,                  ||z
  |j.                  	      }	t1        ||      D ]  }
|
|z
  }|	j3                  |dz   |j4                  |
   j7                  d
      d          t9        |
|||   ||ddddf   |      }|j:                  sg|j<                  rt|j?                  |||   dddd      }tA        jB                  |jD                  |j4                  |
         jG                  dd      }|s|jI                  |        |	jK                          ~t1        ||z
  tM        |            D ]  }
|jO                  ||
           tQ        jR                  |jT                  d   |jV                  d   g      tQ        jX                  |jT                  d   |jV                  d   g      g|_*        t        d|jV                   d|jZ                          |j<                  r%t        d|j<                   d|jZ                          d }|j:                  r|j<                  sOt        d       t        d       |j]                  |j
                  d   dz  |j
                  d           |||       n~ |||       d}|j
                  d   dkD  r|d z  }t        d!       |j_                  d"#       |ja                  d$d%|z
  d z  d&|g      }t#        jb                  ||      \  }}n	 |||       |jd                  rt        d'tf        jh                  jk                  |j                  | dz
            d(|jl                          |jo                  |j                  | dz
     d)d|jl                  *       |jp                  s|js                          y)+zPlot one figure with multiple subplots
    1) create figure
    2) read all data into 3D array
    3) loop to plot each subplot using plot_subplot4figure()
    4) common colorbar and save
    zFigure z - r5   (----------------------------------------T)numr   nrowsncolssharexshareyr  zplotting ...r  r!  r   r"  N)r  r   r}   gQ?rZ  r*  r)  )r  rh  shrinkaspectorientationr  UNITr   r   rK   r   c                     | j                  dddddd       |j                  s|j                  r(| j                  |j                  |j                         y |j                  r| j	                          y )Ng{Gz?g\(\?g?)r8  r9  r;  r:  wspacehspace)r{  rz  )subplots_adjustfig_wid_spacefig_hei_spacefig_tight_layouttight_layout)figr+   s     r   adjust_subplots_layoutz+plot_figure.<locals>.adjust_subplots_layout  sz    TT 	 	

 !3!3t'9'9'+'9'9   ; 	 ""r   z-Note: different color scale for EACH subplot!z0Adjust figsize for the colorbar of each subplot.r  g?g       @r6   zshow colorbarg(\?)r9  gGz?rG   g{Gzt?save figure to 
 with dpi=tight)bbox_inchestransparentdpi):rY   r"   r    r   r   r   r  r  canvasmanagerset_window_titler  r*   r  rG  rt  ra   r_   ru  r   rv  r   r=  r8   r  r>  rb   rp   rm  r  rn   colorbarr   r  r)   r   	set_labelr?  r'   delaxesr   r   dlim_allr   r   r;   set_size_inchesr|  add_axesr  save_figr   r   r  fig_dpisavefigr!   clf)r  r+   r}   rw   r  axsr@  rA  r   rD  r   idxr  r  	data_unitr  cbar_lengthr  s                     r   plot_figurer  J  sT    #a&T\\!A#%6$78I
56
9 ||t}}D	HC JJ''	2
++-C 1u(((4+;+;;Gw)9)9D<L<L)LLMNEGUD(;D$--%MMDMM

( 	
 >  %-4>>RH7E" *'kAdiil&8&8&=b&AB !t3xc1ai	 >>$))<<s3xT#b^h<iD !//		tyyQR|TXXY_aefIy)%*& NN 5=#c(+ CF YYa 0$))A,?@YYa 0$))A,?@BDM
_TYYKq(89:yy1T^^,<=>
 ~~yyBCEFa 03 6a8HI"3- #3-K}}Q#%q ?#d+,,s;&95+NOC))$C8JD$ 	sD) }}ac1B!C DJt||n]^DLL1%7RVR^R^_}}GGI
r   c                 @	   t        t        | j                  D ch c]  }|j                  d      d    c}            | _        t        t        | j                  D ch c]  }|j                  dd       c}            | _        t        | j                        dk(  rU| j                  d   dk(  rCt        t        | j                  D ch c]  }|j                  d      d    c}            | _	        | j                  dkD  r1| j                  r%t        dj                  | j                               nn| j                  rb| j                  dk(  rSt        j                   | j"                  | j$                  | j&                  z  | j(                  | j                  	      | _
        | j*                  A| j                  dkD  r2t-        | j*                  | j                  | j                  d      | _        d
| _        | j0                  dv rdj3                         v rut5        d         t5        d         }}t5        d         t5        d         }}d|cxk  r|k  r2n n/d|cxk  r|k  r$n n!||g| _        t7        d| j.                          | j8                  dkD  r| xj:                  dz  c_        n$| j8                  dkD  r| xj:                  dz  c_        g | _        | j0                  dk(  r| j>                  r{tA        | jB                        }|jE                  d       |jG                         }| j                  D ]*  }	| xj<                  |D 
cg c]	  }
|	 d|
  c}
z  c_        , t7        d       | jH                  rtK        jL                  | jH                        tO        fddD              rt7        dtP        jR                  jU                  | jH                         d       tK        jV                  | jH                  d| j"                  | j                  | j                  d      d   }t        jX                  || | j                         \  | _-        | _.        | _/        | S d
| _$        d!| _0        d"}|d#z  }|d$z  }t        |       | S c c}w c c}w c c}w c c}
w )%zPrepare for multiple subplots:
    1) check multilook to save memory
    2) read existed reference pixel info for unwrapPhase
    3) read dropIfgram info
    4) read and prepare DEM for background
    rD   r   StdrL   r5   r  r   z/multilook {0} by {0} with nearest interpolation)
max_memoryr8   Nnearest)methodr   r   r   r  r  z!consider reference pixel in y/x: r9  g      $@d   g      4@Fr>   z@mark interferograms with 'dropIfgram=False' in red colored titlec              3   4   K   | ]  }|   |   k(    y wr   r   )r   r   r  r}   s     r   r   z)prepare4multi_subplots.<locals>.<genexpr>  s     K!|A(1+-Ks   )r  r  zreading DEM: z ... r  )r7   r   r  r  r8   )r  r+   r8   rG   z;WARNING: DEM file has a different size from the data file. zNThis feature is only supported for single subplot, and not for multi-subplots.z 
    --> Ignore it and continue.)1r  r   rb   rp   r&  ry   r'   r   r  r`  r]   r8   re   r  r^   r_   auto_multilook_numrR   r  r  	maxMemoryr   r
   r<  r@   ri   r   r    r  r  rc  r  r   r)   r  r  r\   r   r  r   r   r   r%   r   prep_dem_backgroundrI  rJ  rK  rq   )r+   r}   r   r   r   rW   rV   r  dropDate12Listr   r  r  r   r  s    `           @r   prepare4multi_subplotsr    s    !		&J1qwws|A&J!KLD DDWDW&Xqqyyr':&X!YZD
41$+)>-)O &O1qwws|A&O!PQA$..?FFtGYGYZ[	D..!3  22LL$**T-=-==~~nn
 xx 2 2Q 6!HH	
 Dxx?"w(--/'A8G,-s8G3D/EuHX./Xg5F1G1#5#5 %u~D6t7G7G6HIJ||b#		# Dxx= T__$))$5!113$$ 	IA  $HAs!A3Z$HH 	IQR }}..t}}=K7JKK]277#3#3DMM#B"C5IJ--$LL(((( C FHE[E[..FBDND,d.B K !DM #DOCccC66C#JKa 'K&X&O^ %Is   RR	RR
c                   $    e Zd ZdZddZd Zd Zy)viewerzviewer class definition.

    Example:
        cmd = 'view.py timeseries.h5'
        inps = cmd_line_parse(cmd.split()[1:])
        from mintpy.view import viewer
        obj = viewer()
        obj.configure(inps)
        obj.plot()
    Nc                 J    |r|j                         dd  }|| _        || _        y )Nr5   )rp   r   r   )selfr   r   s      r   __init__zviewer.__init__#  s$    IIKOE
r   c           	      j   |j                   rt        nd a|j                  st	        j
                  d       t        |      \  }| _        t        || j                        }d| _	        |j                  rt        |      dk(  rd| _	        |j                  j                         D ]  \  }}t        | ||        t        j                   | j"                  | j$                  | j&                  d   | j(                  | j*                  | j,                  | j                         \  | _        | _        | j                  S )Nc                       y r   r   r   s     r   r   z"viewer.configure.<locals>.<lambda>+  r   r   Aggr   r   r   r   )r8   re   r    r!   r   switch_backendr   r   r   r,   update_moder2   __dict__itemssetattrr_   r   r)   r   rb   rR   r   r   r   )r  r+   r@   values       r   	configurezviewer.configure)  s    ...J }}u%-d3dh-dDHH= 	D 1V ;DI ----/ 	&JCD#u%	& $&<<IInn		!nn$& $. yyr   c           	      ,   | j                   dk(  rt        d       t        j                  | j                  | j
                  d   | j                  d      \  }| _        | j                  r=|t        j                  | j                  | j                  | j                  d      d   z  }| j                  dv r| j
                  d   j                  d      d   j                  d      rd	| j                  j                         v r}t        | j                  d	         t        | j                  d
         }}t        j                  | j                  | j
                  d   |||dz   |dz   fd      d   }||dk7  xx   |z  cc<   | j                  r.t        d       t        j                   j#                  |dk(  |      }| j$                  9t        d       t        j                   j#                  | j$                  dk(  |      }n4t        j&                  |j(                  t        j*                        | _        t        j,                  | j                        }| j.                  9t        d| j.                          t        j0                  ||| j.                  k(  <   n;|9t        j2                  |      s$t        d|        t        j0                  |||k(  <   t        j                   j5                  |      rT| xj$                  |j6                   z  c_        | xj$                  t        j2                  |j8                         z  c_        n)| xj$                  t        j2                  |       z  c_        t;        || j                  |       \  }} | j<                  t?        | j<                        ni }tA        jB                  | jD                  |      \  }}| jF                  s|jI                  dddd       tK        ||| j                  |       d   } | jL                  rt        dtN        jP                  jS                  | jT                  d          d| jV                          | jF                  s-|jY                  | jT                  d   d| jV                  d       n,|jY                  | jT                  d   d| jV                  d       | jZ                  s|j]                          n
g d}	t_        ta        |	      ta        | jb                        z        }	|	D ]  }
te        d|
 d        tg        | | j                        } ddg| _4        tk        d| jl                  dz         D ]  }to        || | j                          | jl                  dkD  rat        d       t        d| jh                   d| jp                          | jr                  r%t        d | jr                   d| jp                          | jZ                  rt        d!       tA        jt                          y )"Nr5   zreading data ...r   Fr   r   rD   r   r   r   rF   r4  r5  r   z%masking pixels with NO_DATA_VALUE of r   r   )r8  r9  r;  r:  r  r  T)r  r  
pad_inchesr  )r  r  r  )z--show-gnssz--coastlinez--lalo-labelz--lalo-stepz
--scalebarz--pts-yxz
--pts-laloz
--pts-filez	WARNING: z= is NOT supported for multi-subplots, ignore it and continue.)r}   ro  zall data range: rK   zdisplay  range: zshowing ...);r  r    r   r   r)   rb   rR   r   r   r@   rp   r   ri   r   r   r   r   r   r   r   r   r   get_no_data_valueno_data_valuenanr   r   r   r   r   r   r   r   r   r   rz   r|  r  r  r   r   r  r"   r  r  r!   r  r   r  r  re   r  r  r  r  r  r;   rn   show)r  r   r   r   r  no_data_valr   r  r  	opt_namesopt_namer  s               r   r   zviewer.plotJ  s   <<1%&%]]		 IIaLLL	!ND$( }}II $#	% &'	( ( O+		!**3/2==mL488==?2"488G#45s488G;L7Mu#==II $		!uQwa8#	% &'	(
 TRZ H,  ~~78uu))$"*d;xx#~&uu))$((b.$?774::RXX> #44TYY?K!!->t?Q?Q>RST3566TT///0(+1F>{mLM,.FFT[() uut$TYYJ&RXXdii000RXXd^O+ 4D$((DIJD$ @D?P?P?\):):;bdJll4==ZPGC''##!#B b$$7:D }}a)I(J*UYUaUaTbcd++KKQTt||`cKdKKQTt||ahKi}}GGI
AIS^c$))n<=I% k	(+hijk *$BD  HDM1dllQ./ 8Atdhh78 ||aAB)$--$..9IJK99-dii[$..9IJK ===!HHJr   r[  )__name__
__module____qualname____doc__r  r  r   r   r   r   r  r    s    	Bkr   r  )T)F)1r]  r\  r   r  warningsfilterwarningsUserWarningcartopy.crscrsr   matplotlib.pyplotpyplotr   numpyr   mpl_toolkits.axes_grid1r   mintpyr   r	   mintpy.multilookr
   mintpy.objectsr   r   r   r   mintpy.utilsr   r_   r   r   r   rN   r2   r   rm   r   r  r  r   r  r  r|   rG  rm  r  r  r  r   r   r   <module>r     s     	 	    ;| L    7 " +  B A>od/fbLDPl`< ,.24  FodaHvrslodWv^ ^r   