o
    Ce                     @   s>  d dl Zd dlZd dlZd dlZejded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 d d	lmZ d d
lmZmZm Z m!Z" dd Z#dd Z$d+ddZ%dd Z&d,ddZ'dd Z(dd Z)g g dfddZ*dd Z+dd  Z,d!d" Z-d#d$ Z.d%d& Z/d'd( Z0G d)d* d*Z1dS )-    NignoreZ
matplotlib)categorymodule)make_axes_locatable)subsetversion)multilook_data)TIMESERIES_KEY_NAMESgiantIfgramStackifgramStack)GPS)plotptimereadfileutilsc              	   C   s   t d d}| jrd}|S g }| jD ]+}|tjtj|dtj|g}dd |D }t|dkr;|	|d  qd}q|dkretj
| j}tdd	 |D }||krZd}|S t | d
| j d |S )Nzupdate mode: ONskiprunZpicc                 S   s   g | ]
}t j|r|qS  )ospathisfile.0ir   r   D/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/view.py
<listcomp>+       zrun_or_skip.<locals>.<listcomp>r   c                 s   s    | ]	}t j|V  qd S N)r   r   getmtimer   r   r   r   	<genexpr>3   s    zrun_or_skip.<locals>.<genexpr>z& exist and are newer than input file: z
 --> skip.)vprintdisp_figoutfiler   r   joindirnamebasenamelenappendr   filemin)inpsflagZoutfilesfnamefnamesZtitor   r   r   run_or_skip   s(   
$r/   c                    sZ  t |}tt |\ _ _| j _| j _dd j	 j
f _tdt j  tdt j  tdt| j  tdt j  td t jd  jd   jd	  jd  d
krtd _ jrttd  jdkr|d _tj| j jd  jd _ jrtd j   js|jstd td g  _n| jd  jd d d	  _td j   jrو jr| jd  jd d d	  _nd| v rt|d t|d g _nd  _t  | tj!| j" j# j$ jd\ _" _#t% | jd  j&sOt' fdddD s; j(dkr3 jd )dd dv s; jd dkrAddg _&n j(d v sK j#rO j$ _& j*sb jr_ j+r_d! _*nd _* j,rrtj-| jd\ _. _/ j0stj1|d"  jt d# _0td$ j0   j2s j03d%d&} j4s|d'7 }|  j5 g _2t6   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_ranger4   r4   c                 3   s    | ]
}| j  v V  qd S r   )keylowerr   r*   r   r   r      s    z1update_inps_with_file_metadata.<locals>.<genexpr>)	coherencez.corr   -)r>   cmask              ?)z.intg?	FILE_PATH)datasetNamesZ	inps_dictzfigure title:   Z_nws)7ut
coordinater   Zsubset_input_dict2boxvarspix_boxgeo_boxZcheck_box_within_data_coverageZbox_pixel2geowidthlengthZdata_boxr    strmaxdisp_dem_contourdem_filemultilook_num	multilookppZauto_colormap_namecolormapdsetr4   ref_laloZlookup_fileprint	geo2radarref_yxZ	radar2geokeysfloatZread_pts2inpsZcheck_disp_unit_and_wrapr7   r8   r9   check_map_projectionvlimanyr;   splittransparencydisp_dem_shade	auto_flipZauto_flip_directionflip_lrflip_ud	fig_titleZauto_figure_titler"   replacedisp_whitespacefig_extupdate_figure_setting)r*   metadatacoordfbaser   r=   r   update_inps_with_file_metadata=   s   


"$	&rn   Tc                 C   s   d| _ |dd | _| jrl| jdrl| jdkrl| js | jrld}| jdr5t	
 | _ t|d  | S | jd	rld
| v r]|d
 }t	|| _ t|d|   | 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: rr   PlateCarreers   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getr<   
coord_unitrK   
startswith	fig_coord
lalo_label	coastlineccrsru   r    r[   UTM
ValueErrorrX   )r*   rk   r4   msgutm_zoner   r   r   r]      s6   


r]   c                 C   s  |j rO|j d |j d |j d d |j d d g|_|j d |jd  }|j d |jd  }|jdkrPt|t|jd  |j }t|t|jd  |j }t| jdkrd|  krd| jd k r|n nd|  krs| jd k r|n n| ||f }ntj|j	|j
d |jddd }tj|st|s| |8 } td|j   nd	| d
| d}|d7 }t| d |_ nt| jdkrNd|  kr| jd k rn nd|  kr| jd k rn nt| d d ||f }n|jdkrtj|j	|j
|jddd }n	td|j  dtj|s:tt| r:| t|dddd| jd | jd f8 } td|j   nd	| d
| d}|d7 }t| d |_ nd |_ tj| ||j|j|j|jd\} |_|_|_|jrp|j|_|jrtd|j  |jdkrt | } nF|jdkrt!| } n:|jdkr| d9 } n/|jdkrd|  } n$|jdkr| dtj" 9 } n|jdkr| tj"d 9 } ntd|j t#| t$| g|_%|jstj&| |jd\|_'|_|_(td|j% d|j  td |j d|j  | |fS )!Nr1   r   r2   Fr3   boxr4   zset reference pixel to: z WARNING: input reference pixel (, z!) has either masked or NaN value!z -> skip re-referencing.r0   
timeserieszinput reference point z is out of data coverage!)rk   r7   r8   r9   r4   zApply math operation: squaresqrtreverseg      inverserB   rad2degg     f@deg2radzun-recognized math operation: r:   data    range: rE   display range: ))rZ   Zref_boxrJ   rR   intr&   shaper   readr(   rV   npma	is_maskedisnanr    rX   squeezer;   r   alltilereshaperT   Zscale_data4disp_unit_and_rewrapr7   r8   r9   r4   Z
disp_scaler^   math_operationr   r   pinanminnanmaxdlim'auto_adjust_colormap_lut_and_disp_limitcmap_lutunique_values)datark   r*   ref_yref_xref_valr   r   r   r   update_data_with_plot_inps   s   
<<",r   Fc              	      sd  ddl m} |  dd }tdd |D rt|}g }tdd |D d }td	d |D d }t|D ]U\ }t fd
dt||D rt||D ]7\}}	 |kr_|dd }
qP|   k ri|	k rrn n|
d| 7 }
qP |	kr|
d|dd  7 }
|	|
  nqPq9|	| q9||}|j
rtndd at|\}}t||}tj|j|j|jd |j|j|j|j
d\|_|_tj|j|jd |j|j
d\}}|jr|tj|j|j|jddd 8 }|jdv r-|jd dd dr-d| v r-t|d t|d }}tj|j|jd |||d |d fddd }||dk  |8  < |jr:tj !|dk|}|jdurKtj !|jdk|}n
tj"|j#tj$d|_tj %|rr| j|j& 9  _| jt'|j( 9  _n| jt'| 9  _t)|||\}}|rdd |j*D }|j+durt,|j+dni }t-j.||dd }||||fS |||fS )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_parser1   Nc                 s       | ]}| d V  qdS )"'Nr{   r   xr   r   r   r   i      zprep_slice.<locals>.<genexpr>c                 S      g | ]}| d qS r   r   r   r   r   r   r   o      zprep_slice.<locals>.<listcomp>c                 S   r   r   endswithr   r   r   r   r   p  r   c                 3   s,    | ]\}}|   ko|kn  V  qd S r   r   )r   ind0ind1r   r   r   r   r  s   * rE   r   c                  _      d S r   r   argskwargsr   r   r   <lambda>      zprep_slice.<locals>.<lambda>	mask_filer3   r   vminvmaxr4   r   Fr   r?   unwrapPhaseREF_YREF_XrA   dtypec                 S   s   g | ]}|d  qS )g       @r   r   r   r   r   r         
projectionfigsize
subplot_kw)/Zmintpy.cli.viewr   r`   r_   listr   where	enumeratezipr'   r4   rX   r    read_input_file_inforn   rT   	read_maskr(   r   rV   rJ   	mask_vmin	mask_vmaxmskr   r   ref_dater;   r{   r[   r   	zero_maskr   masked_whereonesr   bool_r   maskr   r   r   fig_sizerx   dictpltsubplots)cmdZauto_figr   iargsZ
temp_iargsZind0sZind1sZ	temp_iargr   r   tempr*   atrr   r   r   ref_datar   r   axr   r   r   
prep_sliceH  s   



r   c                    s  	j rtndd at	jtrtj	j	j	j	dj	_	j
r/tj	j
	j	j	j d\}tdt	j  j\tj|	jd
	jr	jdr	jdkrtd	 	jd
 	jd 	jd 	jd f	_	jd 	jd 	jd
 	jd f}	jrtd	j  | j	j	jd 	j
rtd tj| 	j		j d t| 	jr	jr	jrt	jdjdd}  |d
 |d d
d \}}|	jd  |	jd
  f }	|	8 td	j d|d
 dd|d dd|	dd	j! 
 d	_"	j#rtj$| 		j d}
ntd | j%	j	j&d
 	j&d 	jd	j'	j	j(dd
}
	j)rEtj*| 	j)|	j+	j,	j d 	jd r\	jd 	jd
  d!kr\d	_-	j-rztd"	j.  tj/| 	j	j	j.	j0	j1	j2d# 	j3rtj4| 	j	j5	j6	j7	j8	j9r	j9n	j1	j:	j d$	 n| j;d%d&	j1d'd'd'd'd( 	j"rƈ	j<r| j=	j<d 	j<d
 	j>	j?d) td* 	j@d+ur| j=	j@d+d+df 	j@d+d+d
f 	jA	jBd,d-d. td/ 	jrtjC| |	|	j d} 	j
rt|j\ 	
fd0d1}|| _Dnxd2	_td3 	j
r7td tj| d+		j d 	jd
 d4 	jd d4 	jd d4 	jd d4 f	_	j#rbtj$| 		j d}
ntd | j%	j	j&d
 	j&d 	j	j'	jdd5}
| j;	j1d6 	j"rd7\}}	jEr	jEd
 	jEd }}nd8|F v rtG|d8 tG|d9 }}|r|r| j=||	j>	j?d) td* 	jHd+ur| j=	jHd+d+df 	jHd+d+d
f 	jA	j?d:d-d. td/ d}|rtIJd;d<gd=d>gd=d?gd@dAgd;d<gg}| j=|d+d+df |d+d+d
f dB	j?d:d-d. | K	jd
d  | L	jddC  tMjNOtMjNP|dD dEtMjNQrtRStTfdFdGdHD rmtRjUdI	jddJd
 tRjUdK	jddJd
 ndLtMjNV d}|dM7 }t| d+nd+	
f	dNd1}|| _Dd+}	jWrtX| }|jY	jZ	j[	j[t\j]dO}t^	|
|\	}	j_r| j`	ja	j1	jbdP 	jcrtdQ | d  	jertdR | f  	jgs| hdS tdT 	jir		jZdUkr| j;dd'dd'dV | jjkd' | jlkd' n| m ng  | o ng  	jprAtq	jpdW}	jpdX d
kr-dY|dZ< t\jr| s fi | td[	jp d\ | 	|
|fS )]a!  Plot one slice of matrix
    Parameters: ax       : matplot.pyplot axes object
                data     : 2D np.ndarray,
                metadata : dictionary, attributes of data
                inps     : Namespace, optional, 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                  _   r   r   r   r   r   r   r   r     r   zplot_slice.<locals>.<lambda>r   Zvlist)rJ   rK   r4   zdisplay data in transparency: )rz   rq   rt   zplot in geo-coordinater   r2   r0   r1   z!draw coast line with resolution: )
resolution	linewidthzplotting DEM background ...)r   rK   demr*   r4   )siteFr:   z=referencing InSAR data to the pixel nearest to GNSS station: z at [z.6fr   z] by substrating .3frE   zplotting data ...upper)	cmapr   r   extentorigininterpolationalphaZanimatedzorder)r   faultline_fileSNWEr   min_distr4   rr      zplot scale bar: )r   rK   unitlocZlabelpad	font_sizer   )	r   rK   	lalo_steplalo_loclalo_max_numlalo_offsetr   r   r4   bothinT)whichZ	direction	labelsizeleftrighttopbottommszplot reference pointNkrB   )r  ZmecZmewzplot points of interestc           	         s  d| d dd|d d} j | ddjd  } j |ddjd	  }d|  kr4	k rn |S d|  krA
k rn |S ||f }|t|sVtj|rXd
nd|d7 }jrj | ddd  }j |ddd	  }d|  krk rn n!d|  krk rn n||f }|t|rdnd|d7 }|d|jd  d7 }|d|jd	  d7 }|S )NzE=.f, N=lon)Z
coord_typer   latr1   , v=[], v=r   , h=[], h=.1fz, x=z.0f, y=)Zlalo2yxrJ   r   r   r   r   rQ   )	r   yr   colrowvZdem_colZdem_rowh)rl   	coord_demr   r   dem_lendem_pix_boxdem_widr*   
lalo_digitnum_colnum_rowr   r   format_coordf  s$   $*0z plot_slice.<locals>.format_coordrw   zplotting in Y/X coordinate ...      ?)r   r   r   r   r   r   r   )r  NNr   r   Zblacki  i  i  i  i  i  i  r?      rC   zinputs/geometryRadar.h5c                 3   s    | ]}| v V  qd S r   r   r   )geom_ds_listr   r   r     s    zplot_slice.<locals>.<genexpr>)latitude	longituder*  r   r+  z0WARNING: no latitude / longitude found in file: z'skip showing lat/lon in the status bar.c                    s(  d| dd|d}t t| jd  }t t|jd  }d|  kr,k rn |S d|  kr9k rn |S  ||f }|t|sNtj|rPdnd|d7 }jrp||f }|t|rhd	nd
|dd7 }r|d||f d d7 }|d||f d d7 }|S )Nx=r  r  r   r1   r  r  r   r  r  z mz, E=r  r  r  )r   r   rintrJ   r   r   r   rQ   )r   r  r   r  r  r  r  )	r   r   	geom_filer*   r"  latslonsr#  r$  r   r   r%    s    *   )padZ
axes_class)fontsizecolorzflip figure left and rightzflip figure up and downoffzturn off axis displayr
  )r
  r	  ZlabelbottomZlabeltop)ZrotationZ   centervazrotate Y-axis tick labels by z deg)tr4   rX   r    
isinstancerU   rN   rT   ColormapExtr   
cmap_vlistrQ   Zread_demrJ   rK   ra   r   rG   get_lalo_digit4displayrz   r{   r|   r   r~   Z
coastlinescoastline_linewidthplot_dem_backgroundrH   disp_gpsgps_componentref_gps_siter   Zget_stat_lat_lonrY   r7   disp_ref_pixeldisp_dem_blendZplot_blend_imageimshowr^   r   	animationr   Zplot_faultlinefaultline_linewidthfaultline_min_distdisp_scalebarscalebarZdraw_scalebarscalebar_padr   scalebar_linewidthr}   Zdraw_lalo_labelr   r   r  r  lalo_font_sizerx   Ztick_paramsrW   r   
ref_markerref_marker_sizepts_lalo
pts_markerpts_marker_sizeZplot_gpsr%  rZ   r[   r   pts_yxr   arrayset_xlimset_ylimr   r   r#   r$   r   r   get_dataset_listr   r   r%   	disp_cbarr   Zappend_axescbar_loc	cbar_sizer   ZAxesplot_colorbar
disp_title	set_titlerf   
font_colorrd   invert_xaxisre   invert_yaxis	disp_axisaxis	disp_tickZxaxisZset_visibleZyaxis	get_xaxis	set_ticks	get_yaxis
ylabel_rotr   ZsetpZget_yticklabels)r   r   rk   r*   dem_metadatar   Zref_site_lalor  r   r   imr%  r   r   Z	temp_testrQ  r   cbarZdividercaxr   r   )rl   r  r   r   r  r   r!  r)  r.  r*   r"  r/  r0  r#  r$  r   
plot_slice  s  

&$
	  

(
$

 
	$0

rj  c                 C   s"  t | j}d}| jds|d|d 7 }|d|d tj| j7 }d| v r5|d|d 7 }t	d	tj
t d
tj  t	| t|d | _t|d | _|d | _tjtj
| jd | _tj| jd | _t	d| j| jf  t j| jdd| _t| \} }| |fS )Nzinput file is )z.h5z.he5z{} 	PROCESSORz{} file: {}	FILE_TYPE	DATA_TYPEz in {} formatzrun z in LENGTHWIDTHr   r1   zfile size in y/x: T)
no_complex)r   read_attributer(   r   formatr   r   abspathr[   r    r%   __file__r   version_descriptionr   rM   rL   r;   splitextZfileBaseZfileExtget_slice_list	sliceListread_dataset_input)r*   r   r   r   r   r   r     s$   
r   c                    s   dd |D }|rTt |tr|g}g }|r6|D ]dvr#d ddd|fdd D 7 }qn| fdd|D 7 }ttt|}| fdd|D 7 }ttt|} fdd|D }||fS )	z0Get dataset(es) from input dataset / dataset_numc                 S   s   g | ]}|qS r   r   r   r   r   r   r   >  s    z(search_dataset_input.<locals>.<listcomp>*z.*c                    s    g | ]}t  |d ur|qS r   )rematchr   e)dsr   r   r   N  s     c                    s   g | ]}| v r|qS r   r   r   all_listr   r   r   Q      c                    s   g | ]}  |qS r   )indexr}  r  r   r   r   S  r   c                    s   g | ]} | qS r   r   r   r  r   r   r   Y  r   )r8  rN   rg   sortedr   set)r  in_listin_num_listsearch_dsetZtempListZ
outNumListZoutListr   )r  r  r   search_dataset_input;  s$   

r  c           
         s  t jdkst jdkrdt jdkrtdj d jdkr0d_tdj d n$jdkrTt jd	krTd
jd v rTjd d
\}}|g_|_tj	jjjdd	 _n[jdkrndg_nBjdkrxdg_n8jdkrd_n/jdkrt
j}|jdd |j	d dd g_nj	_jdkrdd jD _tj	jjjdd	 _tj	jg jd\__g }tjd }js
|dkrtd tj   fddj	D }fdd|D }ntd| d d_tttjtj t| _fddjD _t j_jrdjtvr;d _tj	jgg jdd d }|sad!j d"}|d#7 }t| d _n|_jd$v rtd%tjj d&t j	  td't j  td(t j  n.td%tjj d&t j	  td)t j d*j  td+t j d*j  jrшjtv rtd,j  jdkrd-}|d.j	 7 }t|tjjjd dd d/}	|	fS )0zFCheck input / exclude / reference dataset input with file dataset listr   zinput dataset: "r   velocityFzturning glob search OFF for z filer   r1   _)r  r  r  r  r   r   HDFEOSdisplacementgiantTimeseriesreconsr
   r:   r?   geometryc                 S   s   g | ]	}| d s|qS bperpr   r   r   r   r   r         z&read_dataset_input.<locals>.<listcomp>rl  z&do not show the dropped interferogramsc                    s"   g | ]}| d d  v r|qS r?   r1   r`   r   )date12_drop_listr   r   r     s   " c                    s   g | ]} j |qS r   )rx  r  r   r=   r   r   r     r  z9WARNING: --show-kept option does not apply to file type: z, ignore and continue.Tc                       g | ]} j | qS r   )rx  r   r=   r   r   r     r   Nz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:
r3   )r&   rV   dsetNumListr    r;   r  r`   r   r  rx  r
   r(   open
exDsetListZexDsetNumListr   rq  plot_drop_ifgramr   get_drop_date12_listrX   r  r   r  dsetNumr	   r   r   r%   	Exception)
r*   date1date2objZdrop_num_listftypeZdrop_slice_listr   r   r   r   )r  r*   r   ry  ^  s   
&







&$$ ry  c                    s  t  jd  jd  }t  jd  jd  } jdkrU js#d _ jsS jrF jdkrFt jd  jd  }t jd  jd  }tj	||f j
 jd _ S  js\tj _td jd d	d
 jd d	d  jsd _ jt  j dkr  jd7  _ jt  j dks jdkrň jdkrt fdddD r|d |g} jd d  jd g}t j|| j\ _ _t  jt  j j   _t jt _tdt j  tdt j  tdt j  tdt j   jdkr$d jvr$tj	|| j f j
dd _td j   js7d _ j j dkr7d _ jr]tj jd  _tjtj jd \ _  _! j!"  _!n{tj j# _tjtj j#d  _  jd  jd   jd  jd   || k r  j d7  _  j$r  j d7  _  j%d  j%d  dtj& kr  j t j%d  j%d  7  _  j'r͈  j d j' 7  _  j(r؈  j d7  _  jdkr j   j! g _n fd d!t)d jd D  _ fd"d! jD  _ S )#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
    r0   r1   r2   r      rt   )Zds_shaperV  r4   zfigure size : [z.2fr   ]g      d@c                 3       | ]}| j vV  qd S r   argvr   r=   r   r   r     r   z(update_figure_setting.<locals>.<genexpr>)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_wrapZ_refZ_exc                    s&   g | ]} j  d t|  j qS )r  )outfile_baserN   ri   r   jr=   r   r   r   -  s    z)update_figure_setting.<locals>.<listcomp>c                    s   g | ]
}t j j|qS r   )r   r   r#   outdir)r   r"   r=   r   r   r   /  r   )*r\   rJ   r  r   r   rK   r|   absrT   Zauto_figure_sizerV  r4   Zdefault_figsize_multir    fig_numfig_row_numfig_col_numr   Zauto_row_col_numr   ceilastyper   rN   r  r"   r   r   r$   r  rv  r%   r  ri   r<   r(   r8   r9   r   r   r  range)r*   rM   rL   Z
data_shapeZfig_size4plotr   r=   r   rj     s   
N&"2 "
rj   c                    s  t j||  t jd  jd   j t jd  jd   j ft jd}t j j j jd} jrI j\}}t|||d |d fdd}t	 j
dkr׈ jd	v rtd
  fddt| |D }	|dddstj jfd|	i|d |dd< ntd t tj jfd|	i|d |dd<  j
d drֈ jrtj jfd|	i|d }
t|jd D ]}||ddddf dk}|||f  |
| 8  < qnwtd d|d< tj||   jd}t| |D ][}|j||  d  j| dd d tj jfd j| i|d } j| dr< jr<tj jfd j| i|d }||dk  |8  < ||||  ddddf< q|   jrltd j  tj jfd ji|d }
||
8 }t	 j
dks jdv st fdddD s j
g d ks j
d!d tt	 j
D kstd"d  j
D std#d  j
D rd$}nd}|rt|| \} nt fd%dd&D rd'}|d(7 }t| d _  j!rtd) t j"#|dk|} j$durtd* t % j$|jd ddf}t j"#|dk|}t &|t '|g _(|rLt fd+dd,D rL j
d d-r6 jrL j
d d.vrLt)j*|d/dd0\ _+ _, _-|S )1zIRead multiple datasets for one figure into 3D matrix based on i_start/endr0   r1   r2   r   r   )r   xstepystepr4   F)r   r4   )r   r   r  r  r  zreading data as a 3D matrix ...c                    r  r   )rV   r   r=   r   r   r   P  r   z$read_data4figure.<locals>.<listcomp>rm  float32complexr3   Nz;input data is complex, calculate its amplitude and continuer   rA   z)reading data as a list of 2D matrices ...r4   maxValuer4   /r   suffixzconsider input reference date: )r   Z	inversionc                 3       | ]}| j v V  qd S r   )dsetFamilyListr   dr=   r   r   r     r   z#read_data4figure.<locals>.<genexpr>)
horizontalvertical)r   modelresidualc                 S   s   g | ]	}d |d  qS )bandr1   r   r   r   r   r   r     r  c                 s   r   )Z	AmplitudeNr   r  r   r   r   r     r   c                 s   r   )ZPhaseNr   r  r   r   r   r     r   Tc                 3   r  r   r  r   r=   r   r   r     r   )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   r  r   r  )r   argr=   r   r   r     r   )z-vz--vlimz--wrapunwrapr  
   )Znum_multilookr4   ).r   zerosr   rJ   rR   r  r   r4   file_ref_yxr&   r  r;   r    r  ry   r{   r   r   r(   r  r   r   progressBarupdaterV   r`   closer   r   r   r_   rX   r7   r   r   r   r   r   r   r   r   rT   r   r   r^   r   )i_starti_endr*   rk   r   r   r   r   Z
ref_kwargsZ	dset_listr   r   r   prog_barr  Zref_dZsame_unit4all_subplotsr   r   r   r=   r   read_data4figure4  s   

&*&"" r  c              
   C   s  |j rtj|d|j|j|j||jd |jdur|jn	t	|t
|g}|jd d |jd d |jd d |jd d f|_|j||j|d |d |j|j|jdd}|jrd	\}}|jrk|jd |jd }}nd
| v r~t|d
 t|d }}|r|r|j|||j|jd ||jdd  ||jdd  |jr|j|j dkr| g  | g  dd }	|	|_ |j!rd}
|j"t#v s|j$d %dr|j$|  &dd'dd }zt(j)*|d+ dd }
W nt   |}
Y nm|j$|  }|j,-|}t.|j/dkr&d|v r&|'dd }|j0d dkr&|j1-|}|j|j }|dkr4|}
n2d|  k r@dkrJn n| d| }
nd|  k rVdkrcn n|&dd&dd}
n| }
|
r|j2r}t3|j4d}tj5||
d|d nPt3|j4d}|j$|  |j6v rd |d!< d"|d#< n/|7d$dd%kr|j8r|d& ' |  }|d'krd(nd)|d!< |d* ' |  }|
d+| 7 }
|j9|
fi | |j:r|;  |j<r|=  |j>s|?d, |S )-zPlot one subplot for one 3D array
    1) Plot DEM, data and reference pixel
    2) axes setting: tick, ticklabel, title, axis etc.
    N)r   rK   	dem_shadedem_contourdem_contour_seqr*   r4   r   r&  r2   r0   r1   )r   r   r   r   r   r   r   r'  r   r   r  r(  r  c                 S   s   d| dd|ddS )Nr,  r  r  z, v =r   )r   r  r   r   r   r%    s   z)plot_subplot4figure.<locals>.format_coordr  r  r?   r   z%Y%m%drl  r         
r  r  )size)r   prop)r2  Zcrimsonr3  ZboldZ
fontweightPLATFORMZSenZSENTINEL1_SENSORAC0C1ZSENTINEL1_IPFz : r4  )@rQ   rT   r=  r  r  r  r4   r^   r   r   r   rJ   r   rC  rU   r   ra   rA  rZ   r[   r   r   rL  rM  rS  rT  ra  r  r  rb  rc  rd  r%  rZ  r;   r	   rV   r{   rg   r`   dtdatetimestrptime	isoformatrx  r  r&   r  r   
date12Listfig_title_inr   r   Zadd_inner_titledropDatasetListry   disp_title4sentinel1r[  rd   r]  re   r^  r_  r`  )r   r*   r   r   rk   r^   rg  r   r   r%  Zsubplot_titledate_strZ	title_strZ	title_indZnum_subplotr  kwargZ	s1_sensorZs1_IPFr   r   r   plot_subplot4figure  s   $




r  c              
   C   sX  dt |  d|j| d   }td t| tj| |j|j|jddd\}}|jj	
| | }| d |j |j }t|j||j|j  g}t||||}t|jt rctj|j|j|jdj|_td tj|| |jd	}	t||D ]T}
|
| }|	j|d |j|
 d
d d t|
||| ||ddddf |d}|jr|js|j||| ddddd}t j!|j"|j|
 d#dd}|r|$| qv|	%  ~t|| t&|D ]	}
|'||
  qt()|j*d |j+d gt(,|j*d |j+d gg|_*td|j+ d|j-  |jrtd|j d|j-  dd }|jrv|jsBtd td |.|jd d |jd  ||| n9||| d}|jd d krU|d! }td" |j/d#d$ |0d%d&| d! d'|g}t1|||\}}n||| |j2rtd(t3j45|j| d   d)|j6  |j7|j| d  d*d|j6d+ |j8s|9  dS ),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 - r1   (----------------------------------------T)numr   nrowsncolsZsharexZshareyr   zplotting ...r  r  r   r  N)r   r   rk   gQ?r&  r   r  )r   r1  shrinkZaspectZorientationr  UNITr   r   rE   r   c                 S   sJ   | j ddddddd |js|jr| j |j|jd d S |jr#|   d S )Ng{Gz?g\(\?g?)r  r  r
  r	  wspacehspace)r  r  )subplots_adjustfig_wid_spacefig_hei_spacefig_tight_layoutZtight_layout)figr*   r   r   r   adjust_subplots_layouti  s   z+plot_figure.<locals>.adjust_subplots_layoutz-Note: different color scale for EACH subplot!z0Adjust figsize for the colorbar of each subplot.r  g?g       @r2   zshow colorbarg(\?)r  gGz?rB   g{Gzt?save figure to 
 with dpi=tight)bbox_inchestransparentdpi):rN   r"   r    r   r   r   r  r  ZcanvasmanagerZset_window_titleflattenr)   r  r  r8  rU   rT   r9  r   r:  r   r  r4   r  r  rV   r`   r  rV  r^   Zcolorbarr   rq  r(   ry   	set_labelr  r&   Zdelaxesr   r   dlim_allr   r   r7   Zset_size_inchesr  Zadd_axesrY  save_figr   r   rs  fig_dpisavefigr!   clf)r  r*   rk   rf   r  Zaxsr  r  r   r  r   idxrg  rh  Z	data_unitr  Zcbar_lengthri  r   r   r   plot_figure#  s   
"


(r  c           
         s  t tdd | jD | _t tdd | jD | _t| jdkr5| jd dkr5t tdd | jD | _| jdkrF| j	rFt
d| j n| jr_| jdkr_tj| j| j| j | j| j	d	| _| jd
uru| jdkrut| j| j| jdd| _d
| _| jdv rd v rtd td }}td td }}d|  kr|k rn nd|  kr|k rn n||g| _td| j  | jdkr|  jd  _n| jdkr|  jd  _g | _| jdkr| jrt| j}|j dd |! }| jD ]|  jfdd|D 7  _qtd | j"rit#$| j" t% fdddD rUtd t&j'(| j" d! t#j)| j"d"| j| j| jdd#d }tj*|| | j	d$\| _+| _,| _-| S d
| _"d%| _.d&}	|	d'7 }	|	d(7 }	t
|	 | S ))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
    c                 S      h | ]	}| d d qS )r?   r   r  r   r   r   r   	<setcomp>  r  z)prepare4multi_subplots.<locals>.<setcomp>c                 S   s   h | ]}| d dqS )StdrF   )rg   r   r   r   r   r    r  r1   rl  r   c                 S   r  r  r  r   r   r   r   r    r  z/multilook {0} by {0} with nearest interpolation)
max_memoryr4   Nnearest)methodr   r   r   rn  ro  r   z!consider reference pixel in y/x: r  g      $@d   g      4@Fr:   c                    s   g | ]	}  d | qS )r?   r   r  r   r   r   r     r  z*prepare4multi_subplots.<locals>.<listcomp>z@mark interferograms with 'dropIfgram=False' in red colored titlec                 3   s     | ]} | | kV  qd S r   r   r   )rf  rk   r   r   r     s    z)prepare4multi_subplots.<locals>.<genexpr>)rn  ro  zreading DEM: z ... height)r3   r   r  r  r4   )r   r*   r4   rB   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.)/r  r   rV   r  r&   r   rx  r  rR   r4   rX   rr  rS   rT   Zauto_multilook_numrJ   r  r  	maxMemoryr   r   r  r;   r[   r   r    r  rM  r  rZ  r   r(   r  r  rQ   r   rq  r   r   r   r%   r   Zprep_dem_backgroundr  r  r  ra   )
r*   rk   r   r   rM   rL   r  ZdropDate12Listr   r   r   )rf  r   rk   r   prepare4multi_subplots  s   0




	r  c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
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                 C   s$   |r
|  dd  }|| _|| _d S )Nr1   )r`   r   r   )selfr   r   r   r   r   __init__  s   
zviewer.__init__c              	   C   s   |j rtndd a|jstd t|\}| _t|| j}d| _	|j
r-t|dkr-d| _	|j D ]
\}}t| || q2tj| j| j| jd | j| j| j| j d\| _| _| j	S )Nc                  _   r   r   r   r   r   r   r   r     r   z"viewer.configure.<locals>.<lambda>ZAggr   r   r   r   )r4   rX   r    r!   r   Zswitch_backendr   r   rn   r+   update_moder/   __dict__itemssetattrrT   r   r(   r   rV   rJ   r   r   r   )r  r*   r;   valuer   r   r   	configure  s(   
	zviewer.configurec                 C   s  | j dkrytd tj| j| jd | jdd\}| _| jr.|tj| j| j| jddd 8 }| j	dv rw| jd 
dd drwd	| j v rwt| jd	 t| jd
 }}tj| j| jd |||d |d fddd }||dk  |8  < | jrtd tj|dk|}| jd urtd tj| jdk|}n
tj|jtjd| _t| j}| jd urtd| j  tj|| jk|}n|d urt|std|  tj||k|}tj|r|  j|j 9  _|  jt|j 9  _n|  jt| 9  _t|| j| \}} | jd urt| jdni }tj | j!|d\}}| j"s1|j#ddddd t$||| j| d } | j%rxtdt&j'(| j)d  d| j*  | j"sc|j+| j)d d| j*dd n|j+| j)d d| j*dd | j,sx|-  ncg d}	t.t/|	t/| j0@ }	|	D ]}
t1d|
 d qt2| | jd} ddg| _3t4d| j5d D ]}t6|| | jd q| j5dkrtd td| j3 d| j7  | j8rtd | j8 d| j7  | j,rtd! t9  d S )"Nr1   zreading data ...r   Fr   r   r?   r   r   r   rA   r  r  r   z%masking pixels with NO_DATA_VALUE of r   r   )r  r  r
  r	  r  r   T)r  r  Z
pad_inchesr  )r  r  r  )z
--show-gpsz--coastlinez--lalo-labelz--lalo-stepz
--scalebarz--pts-yxz
--pts-laloz
--pts-filez	WARNING: z= is NOT supported for multi-subplots, ignore it and continue.)rk   r  zall data range: rE   zdisplay  range: zshowing ...):r  r    r   r   r(   rV   rJ   r   r   r;   r`   r{   r[   r   r   r   r   r   r   r   r   r   get_no_data_valueno_data_valuer   r   r   r   r   rx   r   r   r   r   rh   r  rj  r	  r   r   rs  r"   r
  r  r!   r  r   r  r  rX   r  r  r  r  r  r7   r^   show)r  r   r   r   r   Zno_data_valr   r  r   Z	opt_namesopt_namer  r   r   r   r   #  s   


$
zviewer.plotr'  )__name__
__module____qualname____doc__r  r!  r   r   r   r   r   r    s
    
!r  )T)F)2r  r  r   r{  warningsfilterwarningsUserWarningZcartopy.crscrsr   matplotlib.pyplotpyplotr   numpyr   Zmpl_toolkits.axes_grid1r   mintpyr   r   Zmintpy.multilookr   Zmintpy.objectsr	   r
   r   Zmintpy.objects.gpsr   mintpy.utilsr   rT   r   r   r   rG   r/   rn   r]   r   r   rj  r   r  ry  rj   r  r  r  r  r  r   r   r   r   <module>   s@   	
r3
f 	  O#rdyvr[