B
    Qa                @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlm	Z
 d dlmZ d dlZejdedd d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZmZm Z!m"Z# d d	l$m%Z% d d
l&m'Z'm(Z( dZ)dZ*dd Z+d5ddZ,dd Z-dd Z.dd Z/dd Z0d6ddZ1dd Z2g g dfddZ3d d! Z4d"d# Z5d$d% Z6d&d' Z7d(d) Z8d*d+ Z9d7d-d.Z:G d/d0 d0Z;d8d1d2Z<e=d3kre<ej>d4d  dS )9    N)make_axes_locatableignore
matplotlib)categorymodule)giantIfgramStackgeometryDatasetNamesifgramDatasetNamesifgramStacktimeseriesKeyNames
timeseries)GPS)	arg_groupptimereadfileutilsplot)multilook_data)subsetversiona  example:
  view.py velocity.h5
  view.py velocity.h5 velocity --wrap --wrap-range -2 2 -c cmy --lalo-label
  view.py velocity.h5 --ref-yx  210 566                              #change reference pixel for display
  view.py velocity.h5 --sub-lat 31.05 31.10 --sub-lon 130.05 130.10  #subset in lalo / yx

  view.py timeseries.h5
  view.py timeseries.h5 -m no                   #do not use auto mask
  view.py timeseries.h5 --ref-date 20101120     #change reference date
  view.py timeseries.h5 --ex drop_date.txt      #exclude dates to plot
  view.py timeseries.h5 '*2017*' '*2018*'       #all acquisitions in 2017 and 2018
  view.py timeseries.h5 20200616_20200908       #reconstruct interferogram on the fly

  view.py ifgramStack.h5 coherence
  view.py ifgramStack.h5 unwrapPhase-           #unwrapPhase only in the presence of unwrapPhase_bridging
  view.py ifgramStack.h5 -n 6                   #the 6th slice
  view.py ifgramStack.h5 20171010_20171115      #all data      related with 20171010_20171115
  view.py ifgramStack.h5 'coherence*20171010*'  #all coherence related with 20171010
  view.py ifgramStack.h5 unwrapPhase-20070927_20100217 --zero-mask --wrap     #wrapped phase
  view.py ifgramStack.h5 unwrapPhase-20070927_20100217 --mask ifgramStack.h5  #mask using connected components

  # GPS (for one subplot in geo-coordinates only)
  view.py geo_velocity_msk.h5 velocity --show-gps --gps-label   #show locations of available GPS
  view.py geo_velocity_msk.h5 velocity --show-gps --gps-comp enu2los --ref-gps GV01
  view.py geo_timeseries_ERA5_ramp_demErr.h5 20180619 --ref-date 20141213 --show-gps --gps-comp enu2los --ref-gps GV01

  # Save and Output
  view.py velocity.h5 --save
  view.py velocity.h5 --nodisplay
  view.py geo_velocity.h5 velocity --nowhitespace
a\  Plot Setting:
  plot.name          = 'Yunjun et al., 2016, AGU, Fig 4f'
  plot.type          = LOS_VELOCITY
  plot.startDate     =
  plot.endDate       =
  plot.displayUnit   = cm/yr
  plot.displayMin    = -2
  plot.displayMax    = 2
  plot.colormap      = jet
  plot.subset.lalo   = 33.05:33.15, 131.15:131.27
  plot.seed.lalo = 33.0651, 131.2076
c           
   C   sL  t jdt jtd} | dd}|jdtdd |jdtd	g d
d |jddddtd	g dd |jddddd |jddddd	g dd | jddddd d | jd!d"d#t d$ | jd%d&dd'd | jd(d)d*d+d,d-hd.d/ t	
| } t	| } t	| } t	| } t	| } t	| } t	| } t	| } t	| } t	| } t	| } | S )0NzPlot InSAR Product in 2D)descriptionformatter_classepilogz
Input FilezFile/Dataset to displayfilezfile for display)typehelpdset*z8optional - dataset(s) to display (default: %(default)s).)r   nargsdefaultr   z-nz
--dset-numdsetNumListNUMzMoptional - order number of date/dataset(s) to display (default: %(default)s).)destmetavarr   r   r   r   z
--nosearchsearch_dsetstore_falsez#Disable glob search for input dset.)r"   actionr   z--exz	--exclude
exDsetListZDsetz3dates will not be displayed (default: %(default)s).)r"   r#   r   r   r   z--show-keptz--show-kept-ifgramplot_drop_ifgramz@display kept interferograms only, without dropped interferogramsz--plot-settingdisp_setting_filez!Template file with plot setting.
)r"   r   z--noverbose	print_msgz<Disable the verbose message printing (default: %(default)s).z--mathmath_operationsquaresqrtreverseinversezApply the math operation before displaying [for single subplot ONLY].
E.g. plot the std. dev. of the variance file.
  square  = x^2
  sqrt    = x^1/2
  reverse = x * -1
  inverse = 1 / x)r"   choicesr   )argparseArgumentParserRawTextHelpFormatterEXAMPLEadd_argument_groupadd_argumentstrintPLOT_TEMPLATEr   add_data_disp_argumentadd_dem_argumentadd_figure_argumentadd_gps_argumentadd_mask_argumentadd_map_argumentadd_memory_argumentadd_point_argumentadd_reference_argumentadd_save_argumentadd_subset_argument)parserinfile rG   A/home/centos/operations/rsmas_insar/sources/MintPy/mintpy/view.pycreate_parser[   sB    












rI   c             C   s  t  }|j| d}x<dD ]4}t|| }|dkrtj|std||qW |jrdt	
|j|_|jsp|jsvd|_|jrd|_|jr|jsd|_|jsd|_d|_d|_|jsd|_|js|jrd|_dd	d
dddg}tt|t| @ }|r*dt|j kr*x|D ]}t d| d qW |j!r6t ndd a"|j!sVt dd#|  |j$rjt%||j$}|js|t&'d |S )zCommand line parser.)args)r   dem_file	mask_filepts_file)Nnozinput {} file {} NOT exist!TrN   Fz--coordz
--show-gpsz--coastlinez--lalo-labelz--lalo-stepz
--scalebarY_FIRSTz	WARNING: zH is NOT supported for files in radar-coordinate, ignore it and continue.c              _   s   d S )NrG   )rJ   kwargsrG   rG   rH   <lambda>       z cmd_line_parse.<locals>.<lambda>zview.py Agg)(rI   
parse_argsvarsospathisfileFileNotFoundErrorformatr'   r   read_date_listoutfiledisp_figsave_fig	lalo_step
lalo_label	zero_maskrL   disp_whitespace	disp_axis
disp_title	disp_cbar	disp_tickflip_lrflip_ud	auto_fliplistsetr   read_attributer   keysprintr*   vprintjoinr)   %update_inps_with_display_setting_filepltswitch_backend)iargsrE   inpskeyfnameZgeo_opt_namesopt_namerG   rG   rH   cmd_line_parse   sH    


rz   c          	   C   s   t d d}g }x`| jD ]V}|tjtj|dtj|g}dd |D }t|dkrj||d  qd}qW |dkrtj	| j
}tdd |D }||krd}nt d	|| j
 |S )
Nzupdate mode: ONskippicc             S   s   g | ]}t j|r|qS rG   )rW   rX   rY   ).0irG   rG   rH   
<listcomp>   s    zrun_or_skip.<locals>.<listcomp>r   runc             S   s   g | ]}t j|qS rG   )rW   rX   getmtime)r}   r~   rG   rG   rH   r      s    z4{} exist and are newer than input file: {} --> skip.)rp   r]   rW   rX   rq   dirnamebasenamelenappendr   r   minr[   )rv   flagZoutfilesrx   fnamestitorG   rG   rH   run_or_skip   s     $r   c             C   s0  t |}| js&d| kr&|d | _| jsFd| krFt|d | _| jsfd| krft|d | _| jsd| kr|d | _| jsd| krdd |d 	dd	
 d
d D | _| jsd| krdd |d 	dd	
 dd D | _| js,d| kr,dd |d 	dd	
 D | _| S )z2Update inps using values from display setting filezplot.displayUnitzplot.displayMinzplot.displayMaxzplot.colormapzplot.subset.laloc             S   s   g | ]}t |qS rG   )float)r}   nrG   rG   rH   r      s    z9update_inps_with_display_setting_file.<locals>.<listcomp>,rS   r      c             S   s   g | ]}t |qS rG   )r   )r}   r   rG   rG   rH   r      s       zplot.seed.laloc             S   s   g | ]}t |qS rG   )r   )r}   r   rG   rG   rH   r      s    zplot.referenceLalo)r   read_template	disp_unitrn   disp_minr   disp_maxcolormap
subset_latreplacesplit
subset_lonref_lalo)rv   Zdisp_set_fileZdisp_set_dictrG   rG   rH   rr      s     


(( rr   c                s   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rd _ jrtd  jdkrd _tj| j jd  jd _ jrtd j  jsV|jsVtd td g  _n*| jd  jd  _td j  jr jr|j jd dd|j jd ddg _n0d| krt |d t |d g _nd  _t! | tj"| j# j$ j% jd\ _# _$d  _&|'dd(  _) jr j)*dr j+dkr j,sf j-rd} j)*drt./  _&t|d  nr j)*d rd!| kr|d! }t.0| _&t|d"|    j,rt1d#ntd$ j) td% d& _+ j2st3 fd'd(d)D sX j4d*krH jd 5d+d d,ksX jd d-krdd.d/g _2n j4d0ksx j$r j% _2 j6s jr j7rd1 _6nd/ _6 j8rtj9| jd2\ _: _; j<stj=|d3  jt d4 _<td5 j<   j>sd6 j< j?g _>t@   S )7Nr   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------------------------------------------------------------------------      r   g     @@Fz=area exceed 2000 pixels, turn off default DEM contour displayT)datasetNamer*   z$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  : {}y)
coord_typexREF_LATREF_LON)r   wrap
wrap_ranger*   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radarc             3   s   | ]}| j  kV  qd S )N)rw   lower)r}   r~   )rv   rG   rH   	<genexpr>^  s    z1update_inps_with_file_metadata.<locals>.<genexpr>)	coherencez.corr
   -)r   cmaskg        g      ?)z.intg?)r*   	FILE_PATH)datasetNames	inps_dictzfigure title: z{}{})Aut
coordinater   subset_input_dict2boxrV   pix_boxgeo_boxcheck_box_within_data_coveragebox_pixel2geowidthlengthdata_boxrp   r7   maxdisp_dem_contourrK   multilook_num	multilookppauto_colormap_namer   r   r*   r   r[   lookup_filero   	geo2radarref_yxyx2lalorn   r   read_pts2inpscheck_disp_unit_and_wrapr   r   r   map_proj_objgetr   
coord_unit
startswith	fig_coordra   	coastlineccrsr   UTM
ValueErrorvlimanyrw   r   transparencydisp_dem_shaderj   auto_flip_directionrh   ri   	fig_titleauto_figure_titler]   fig_extupdate_figure_setting)rv   metadatacoordmsgutm_zonerG   )rv   rH   update_inps_with_file_metadata   s    






&
r   c             C   sd  |j rJy,|j d |jd  }|j d |jd  }W n   Y nX |jdkrt|t|jd  |j }t|t|jd  |j }t| jdkr| ||f }tj|st	|s| |8 } t
d|j  n"d||}|d7 }t| d |_ qPt| jdkrPd|  kr"| jd k rbn n<d|  krD| jd	 k rbn nt| d d ||f }nd|jd
kr|j d |j d |j d d |j d d g}tj|j|j|ddd }ntd|j tj|s&tt	| r&| t|d	ddd| jd | jd f8 } t
d|j  n"d||}|d7 }t| d |_ nd |_ tj| ||j|j|j|jd\} |_|_|_|jr|j|_|jrt
d|j |jdkrt | } nB|jdkrt!| } n*|jdkr| d	9 } n|jdkrd|  } t"| t#| g|_$|js4tj%| |jd\|_&|_t
d|j$|j t
d|j|j | |fS )Nr   r   r   zset reference pixel to: {}zGWARNING: input reference pixel ({}, {}) has either masked or NaN value!z -> skip re-referencing.r   r   F)r   boxr*   z1input reference point {} is out of data coverage!)r   r   r   r   r*   zApply math operation: {}r,   r-   r.   r/   g      ?)r*   zdata    range: {} {}zdisplay range: {} {})'r   r   r   r8   r   shapenpma	is_maskedisnanrp   r[   ro   squeezerw   r   readr   r   r   alltilereshaper   scale_data4disp_unit_and_rewrapr   r   r   r*   
disp_scaler   r+   r,   r-   nanminnanmaxdlim'auto_adjust_colormap_lut_and_disp_limitcmap_lut)datar   rv   ref_yref_xref_valr   ref_boxrG   rG   rH   update_data_with_plot_inps  st    

D",
r   c                s\  j r
tndd as*tdgt|tjtrPtj	jj
jdj_jrvtjjjjj d\}tdtj  j\jrjdrjdkrtd	 jrtd
j | jjd jrtd tj| jj d t| td jrjrjrtjdjdd}  |d |d dd \}}|jd 8 }|jd 8 }||f 8 tdj| d_!jd jd jd jd f}| j"jj#d j#d |ddjj$dd
}	jdr,jd jd  dkr,d_%j%rdtdj& tj'| jjj&j(j)d j*rtj+j| j,j-j.j)j/j d n| j0dd j)d!d!d!d!d" j!rj1r| j2j1d j1d j3j4d# td$ j5d%k	r4| j2j5d%d%df j5d%d%df j6j7d&d'd( td) jrvjd jd jd jd f}
tj8| |
|j d} jrt|j\ f
d*d+}|| _9nd,_td- jrtd tj| d%j d td. jd d/ jd d/ jd d/ jd d/ f}| j"jj#d j#d |djdd0}	| j0j)d1 j!rd2\}}j:rj:d j:d  }}n(d3|; krt<|d3 t<|d4  }}|r|r| j2||j3j4d# td$ j=d%k	r.| j2j=d%d%df j=d%d%df j6j4d5d'd( td) d}|rt>?d6d7gd8d9gd8d:gd;d<gd6d7gg}| j2|d%d%df |d%d%df d=j4d5d'd( | @|dd  | A|dd>  tBjCDtBjCE|d? d@tBjCFrFy4tGjHdAjddBd 	tGjHdCjddBd 
W n2   dDtBjCI}|dE7 }t| d%Y nX nd%	
fdFd+}|| _9d%}jJrtK| }|jLjMjNjNtOjPdG}tQ|	|\}jRr| jSjTj)jUdH jVrtdI | W  jXrtdJ | Y  jZs| [dK tdL j\r4| j]^d! | j_^d! n| ` ag  | b ag  | |	|fS )Ma?  Plot one slice of matrix
    Parameters: ax   : matplot.pyplot axes object
                data : 2D np.array,
                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:    import matplotlib.pyplot as plt
                import mintpy.utils.readfile as readfile
                import mintpy.view as pv
                data, atr = readfile.read('velocity.h5')
                fig = plt.figure()
                ax = fig.add_axes([0.1,0.1,0.8,0.8])
                ax = pv.plot_slice(ax, data, atr)[0]
                plt.show()
    c              _   s   d S )NrG   )rJ   rP   rG   rG   rH   rQ     rR   zplot_slice.<locals>.<lambda> )r   vlist)r   r   r*   zdisplay data in transparency: )r   r   r   zplot in geo-coordinatez#draw coast line with resolution: {})
resolutionzplotting DEM background ...)axr   demrv   r*   zplotting image ...)siteF)r*   r   r   r   zDreferencing InSAR data to the pixel nearest to GPS station: {} at {}r   uppernearest)	cmapvminvmaxextentorigininterpolationalphaanimatedzorderr      zplot scale bar: {})r   unitloclabelpad	font_size)r`   lalo_loclalo_max_numr  
projectionr*   bothinT)which	direction	labelsizeleftrighttopbottom)mszplot reference pointNkg      ?)r  mecmewzplot points of interestc       	         sd  d | |} j| ddjd  } j|ddjd  }d|  krRk r`n nd|  krn	k r`n n||f }t|stj|r|d7 }n|d |7 }jr<j| ddd  }j|ddd  }d|  krk r<n nBd|  krk r<n n&||f }t|s<|d	 |7 }|d
 |jd  |jd  7 }|S )NzE={:.4f}, N={:.4f}lon)r   r   latr   z, v=[]z
, v={:.3f}z
, h={:.0f}z, x={:.0f}, y={:.0f})r[   lalo2yxr   r   r   r   r   rK   )	r   r   r   colrowvZdem_colZdem_rowh)
r   	coord_demr   r   dem_lendem_pix_boxdem_widrv   num_colnum_rowrG   rH   format_coordY  s$    6
6z plot_slice.<locals>.format_coordr   zplotting in Y/X coordinate ...zplotting Data ...g      ?)r  r  r  r  r	  r
  r  )r  )NNREF_YREF_Xblacki  i  i  i  i  i  i  r   r   r   zinputs/geometryRadar.h5latitude)r   r   r*   	longitudez4WARNING: no latitude / longitude found in file: {}, z'skip showing lat/lon in the status bar.c                s   d | |}tt| jd  }tt|jd  }d|  krPk rn nd|  krhk rn n ||f }t|stj|r|d7 }n|d |7 }jrЈ||f }t|s|d |7 }r|d ||f ||f 7 }|S )Nzx={:.1f}, y={:.1f}r   r   z, v=[]z
, v={:.3f}z, h={:.0f} mz, lat={:.4f}, lon={:.4f})	r[   r8   r   rintr   r   r   r   rK   )r   r   r   r%  r&  r'  r(  )r   r   	geom_filerv   latslonsr-  r.  rG   rH   r/    s    0

 )pad
axes_class)fontsizecolorzflip figure left and rightzflip figure up and downoffzturn off axis display)cr*   ro   rp   rz   r   
isinstancer   r7   r   ColormapExtr   
cmap_vlistrK   read_demr   r   r   r   r   r   r   r   r[   
coastlinesplot_dem_backgroundr   r   disp_gpsgps_componentref_gps_siter   Zget_stat_lat_lonr   disp_ref_pixelimshowr   	animationdisp_scalebarZscalebardraw_scalebarscalebar_padr  ra   draw_lalo_labelr`   r  r  r   tick_paramsr   r   
ref_markerref_marker_sizepts_lalo
pts_markerpts_marker_sizeplot_gpsr/  r   rn   r8   pts_yxr   arrayset_xlimset_ylimrW   rX   rq   r   rY   r   r   r   rf   r   append_axescbar_loc	cbar_sizers   Axesplot_colorbarre   	set_titler   
font_colorrh   invert_xaxisri   invert_yaxisrd   axisrg   xaxisset_visibleyaxis	get_xaxis	set_ticks	get_yaxis)r   r   r   rv   dem_metadataZref_site_lalor   r   r  imSNWEr/  r   r   Z	temp_testrU  r   cbardividercaxrG   )r   r)  r   r   r*  r+  r,  r6  rv   r7  r8  r-  r.  rH   
plot_slice  s4   





 (

$




$
0

ro  c             C   s  t | j}d}| jds.|d|d 7 }|d|d tj| j7 }d| krj|d|d 7 }t	d	tj
t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 {} in {}LENGTHWIDTHr   r   zfile size in y/x: {}T)
no_complex)r   rm   r   endswithr[   rW   rX   abspathrn   rp   r   __file__r   release_descriptionr8   r   r   rw   splitextZfileBaseZfileExtget_slice_list	sliceListread_dataset_input)rv   atrr   rG   rG   rH   read_input_file_info  s$    
r  Tc                s   dd |D }|rt |tr"|g}g }|rnxX|D ]8dkrFddd|fdd D 7 }q0W 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 rG   rG   )r}   r   rG   rG   rH   r     s    z(search_dataset_input.<locals>.<listcomp>r   z*{}*z.*c                s    g | ]}t  |d k	r|qS )N)rematch)r}   e)dsrG   rH   r   )  s    c                s   g | ]}| kr|qS rG   rG   )r}   r~   )allListrG   rH   r   -  s    c                s   g | ]}  |qS rG   )index)r}   r  )r  rG   rH   r   /  s    c                s   g | ]} | qS rG   rG   )r}   r~   )r  rG   rH   r   5  s    )r>  r7   r[   r   sortedrk   rl   )r  ZinListZ	inNumListr$   tempListZ
outNumListZoutListrG   )r  r  rH   search_dataset_input  s"    


r  c       	         s  t jdkst jdkrt jdkr:tdj jdkr\d_tdj nHjdkrt jdkrdjd krjd d\}}|g_|_t	j
jjjd _njd	krd
g_njdkrdg_ntjdkrd_nbjdkr8tj}|jdd |j
d dd g_n&j
_jdkr^dd jD _t	j
jjjd _t	j
jg j\__g }tj}js|d 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rjtkrtd_t	j
jgg jd d }|stdj d_n|_jdkrtdtjjt j
 td t j td!t j nPtdtjjt j
 td"t jj td#t jj jrjtkrtd$j jdkrd%}|d&j
7 }t|tjjjd dd d'}|fS )(zFCheck input / exclude / reference dataset input with file dataset listr   zinput dataset: "{}"velocityFz#turning glob search OFF for {} filer   r   _r
   unwrapPhaseHDFEOSdisplacementgiantTimeseriesreconsr   )r*   r   geometryc             S   s   g | ]}| d s|qS )bperp)r   )r}   r   rG   rG   rH   r   a  s    z&read_dataset_input.<locals>.<listcomp>rq  z&do not show the dropped interferogramsc                s"   g | ]}| d d  kr|qS )r   r   )r   )r}   r   )date12_drop_listrG   rH   r   u  s    c                s   g | ]} j |qS rG   )r|  r  )r}   r   )rv   rG   rH   r   v  s    zH--show-kept option does not apply to file type: {}, ignore and continue.Tc                s   g | ]} j | qS rG   )r|  )r}   r~   )rv   rG   rH   r   }  s    NzVWARNING: input reference date {} is not included in input file! Ignore it and continue)r
   znum of datasets in file {}: {}znum of datasets to exclude: {}znum of datasets to display: {}zdatasets to exclude ({}):
{}zdatasets to display ({}):
{}zinput reference date: {}zNo input dataset found!z
available datasets:
{})r   )r   r   r    rp   r[   rw   r$   r   ref_dater  r|  r   r   openr'   ZexDsetNumListr   rm   r(   r
   get_drop_date12_listr  rk   rl   dsetNumr   ro   rW   rX   r   	Exception)	rv   date1date2objZdrop_num_listr~  Zdrop_slice_listr  r   rG   )r  rv   rH   r}  :  s    
&





&   r}  c                s  t  jd  jd  }t  jd  jd  } jdkr jsFd _ js jr jdkrt jd  jd  }t jd  jd  }tj	||f j
 jd _n jstj _td jd  jd   jsd _x( jt  j d	kr
  jd7  _qW  jdkr| jdkr|t fd
ddD r||d |g} jd d  jd g}t j|| j\ _ _tt  jt  j j  t _tdt j  tdt j  tdt j  tdt j   jsd _ j j dkrd _ jr^tj jd  _tjtj jd \ _  _! j!"  _!nt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(rT  j d7  _  jdkrvd 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
    r   r   r   r      r   )ds_shaperf   r*   zfigure size : [{:.2f}, {:.2f}]g      d@c             3   s   | ]}| j kV  qd S )N)argv)r}   r~   )rv   rG   rH   r     s    z(update_figure_setting.<locals>.<genexpr>)z--nrowsz--ncolsg?gffffff?zdataset number: zrow     number: zcolumn  number: zfigure  number:    2      _sub_wrapZ_refZ_exz{}{}c                s"   g | ]}d   jt| jqS )z{}_{}{})r[   outfile_baser7   r   )r}   j)rv   rG   rH   r     s   z)update_figure_setting.<locals>.<listcomp>c                s   g | ]}t j j|qS rG   )rW   rX   rq   outdir)r}   r]   )rv   rG   rH   r     s    )*r   r   r  r  fig_sizer   r   absr   auto_figure_sizerf   r*   default_figsize_multirp   r[   fig_numfig_row_numfig_col_numr   auto_row_col_numr   ceilastyper8   r7   r]   rW   rX   r   r  rz  r   r  r   r   r   r   r   pir  r'   range)rv   r   r   
data_shapeZfig_size4plotrG   )rv   rH   r     sv    

"2 "
r   c          	      s  t j||  t jd  jd   j t jd  jd   j ft jd}t jdkr` jdkr`t	d  fdd	t
| |D }tj j| j j j jd
d |dd<  jdkr jd dr jr j\}}|||d |d f}tj j||ddd }	xt
|jd D ]8}
||
ddddf dk}||
|f  |	|
 8  < q"W nt	d tj||   jd}x|t
| |D ]n}
tj j j|
  j j jdd
d }|||
|  ddddf< |j|
|  d  j|
 dd d qW |   jrDt	d j  tj j j j j jdd
d }	||	8 }t jdks jdkst fdddD s jdddgks jdd	 t
t jD krd}nd}|rt|| \} n&t fd dd!D rtd" d _ jrt	d# t j |dk|} j!dk	rTt	d$ t " j!|jd ddf}t j |dk|}t #|t $|g _%|rt fd%dd&D rʈ jd d'r jrʈ jd d(krt&j'|d)dd*\ _( _)|S )+zIRead multiple datasets for one figure into 3D matrix based on i_start/endr   r   r   r   )dtype)r   r  r
   r  r  zreading data as a 3D matrix ...c                s   g | ]} j | qS rG   )r   )r}   r~   )rv   rG   rH   r     s    z$read_data4figure.<locals>.<listcomp>)r   r   xstepystepr*   Nr
   r  F)r   r   r*   g        z)reading data as a list of 2D matrices ...)maxValuer*   /r   )suffixzconsider input reference date: )r   Z	inversionc             3   s   | ]}| j kV  qd S )N)dsetFamilyList)r}   d)rv   rG   rH   r   =  s    z#read_data4figure.<locals>.<genexpr>)
horizontalverticalr   modelresidualc             S   s   g | ]}d  |d qS )zband{}r   )r[   )r}   r~   rG   rG   rH   r   ?  s    Tc             3   s   | ]}| j kV  qd S )N)ru   )r}   r   )rv   rG   rH   r   H  s    )z-uz--unitzeWARNING: -u/--unit option is disabled for multi-subplots with different units! Ignore it and continuezmasking pixels with zero valuezmasking datac             3   s   | ]}| j kV  qd S )N)r  )r}   arg)rv   rG   rH   r   X  s    )z-vz--vlimz--wrapunwrap)r  
   )num_multilookr*   )*r   zerosr8   r   r   float32r   r  rw   rp   r  r   r   r   r*   r   file_ref_yxr   r   progressBarr   updater   closer  r   r   r   ro   r   rb   r   masked_wheremskr   r   r   r   r   r   r   r   )i_starti_endrv   r   r   	dset_listr   r   r   ref_datar~   maskprog_barr  Zsame_unit4all_subplotsr  rG   )rv   rH   read_data4figure  s    


 , r  c          
   C   s  |j r&tj|d|j|j|j||jd |j}|dkrHt	|t
|g}|jd d |jd d |jd d |jd d f}|j||j|d |d d|j|dd	}|jrd
\}}	|jr|jd |jd  }}	n&d| krt|d t|d  }}	|r|	r|j|	||j|jd ||dd  ||dd  |jrV|j|j dkrr| g  | g  dd }
|
|_|jrd}|j t!ks|j"d #dr|j"|  $dd%dd }yt&j'(|d) dd }W n   |}Y nX n|j"|  }|j*+|}t,|j-dkrRd|krR|%dd }|j.d dkrR|j/+|}|j|j }|dkrn|}nfd|  k rdkrn nd0||}n<d|  k rdkrn n|$dd$dd}n
d0|}|r|j1rt2|j3d}tj4||d|d  nt2|j3d!}|j"|  |j5kr2d"|d#< d$|d%< np|6d&dd'kr|j7r|d( % |  }|d)krvtj8d |d#< ntj8d |d#< |d* % |  }|d+0|7 }|j9|f| |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   r   	dem_shadedem_contourdem_contour_seqrv   r*   r   g      ?r   r   r   r  )r  r  r  r	  r
  r  r  )NNr0  r1  )r  r   r  c             S   s   d | |S )Nzx={:.1f}, y={:.1f}, v =)r[   )r   r   rG   rG   rH   r/    s    z)plot_subplot4figure.<locals>.format_coordr  r  r   z%Y%m%drq  r
         z{}
{}r  r  
z{})size)r  prop)r;  crimsonr<  bold
fontweightPLATFORMZSenZSENTINEL1_SENSORAZSENTINEL1_IPFz : {}r=  )@rK   r   rC  r  r  r  r*   r   r   r   r   r   rH  r   r   rG  r   rn   r8   r   rO  rP  rW  rX  rg   r  r  rf  rg  rh  r/  re   rw   r   r   r   r   r   dtdatetimestrptime	isoformatr|  r  r   r  r~  
date12Listr[   fig_title_indictr  add_inner_titledropDatasetListr   disp_title4sentinel1	mplColorsr^  rh   r`  ri   ra  rd   rb  )r~   rv   r   r   r   r   r  rj  r   r   r/  Zsubplot_titledate_strZ	title_strZ	title_indZnum_subplotr  kwargZ	s1_sensorZs1_IPFrG   rG   rH   plot_subplot4figureb  s    







r  c          
   C   sX  d t| |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rtj|j|j|jdj|_td tj|| |jd}	xt||D ]}
|
| }t|
||| ||d	d	d	d	f |d
}|jrv|jsv|j||| ddddd}tj|j |j!|
 d"dd	}|rv|#| |	j$|d |j!|
 %dd d qW |	&  ~x*t|| t'|D ]}
|(||
  qW t)*|j+d |j,d gt)-|j+d |j,d gg|_+td |j,|j. |jr8td |j|j. dd }|jr|jstd td |/|jd d |jd  ||| nf||| d}|jd dkr|d }td  |j0d!d" |1d#d$| d d%|g}t2|||\}}n
||| |j3rTtd& t4j56|j| d  |j7 |j8|j| d  d'd|j7d( |j9sT|:  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 {} - {}r   z(----------------------------------------T)numfigsizenrowsncolssharexsharey)r   r   zplotting ...)r  r*   N)r   r   r   gQ?g      ?r  r  )r   r9  shrinkaspectorientation)r   UNITr  r   )r  r   zdata    range: {} {}zdisplay range: {} {}c             S   sH   | j ddddddd |js"|jr6| j |j|jd n|jrD|   d S )Ng{Gz?g\(\?g?)r  r  r  r  wspacehspace)r  r  )subplots_adjustfig_wid_spacefig_hei_spacefig_tight_layouttight_layout)figrv   rG   rG   rH   adjust_subplots_layout  s    
z+plot_figure.<locals>.adjust_subplots_layoutz-Note: different color scale for EACH subplot!z0Adjust figsize for the colorbar of each subplot.g?g?g       @r   zshow colorbarg(\?)r  gGz?g      ?g{Gzt?zsave figure to {} with dpi={}tight)bbox_inchestransparentdpi);r[   r7   r]   rp   rs   subplotsr  r  r  canvasmanagerset_window_titleflattenr   r  r  r>  r   r   r?  r   r@  r   r  r*   r  r  rf   r   colorbarr   rm   r   r   r   	set_labelr  r   r  r   delaxesr   r   dlim_allr   r   r   set_size_inchesr  add_axesr]  r_   rW   rX   rw  fig_dpisavefigr^   clf)r  rv   r   r   r  axsr  r  r   r  r~   idxrj  rl  	data_unitr  Zcbar_lengthrn  rG   rG   rH   plot_figure  s~    
&

$r  c       
         s  t ttdd | jD | _t ttdd | jD | _t| jdkrv| jd dkrvt ttdd | jD | _| j	dkr| j
rtd| j	 n2| jr| j	dkrtj| j| j| j | j| j
d	| _	| jd
k	r| j	dkrt| j| j	| j	dd| _d
| _| jdkrd krtd td  }}td td  }}d|  krb|k rn n6d|  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 |" }x,| jD ]"|  jfdd|D 7  _qW td | j#rt$%| j# t& fdddD rtdt'j()| j# t$j*| j#d | j| j	| j	dd!d }tj+|| | j
d"\| _,| _-| _.n(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   s   | ]}| d d V  qdS )r   r   N)r   )r}   r   rG   rG   rH   r   O  s    z)prepare4multi_subplots.<locals>.<genexpr>c             s   s   | ]}| d dV  qdS )Stdr   N)r   )r}   r   rG   rG   rH   r   P  s    r   rq  r
   c             s   s   | ]}| d d V  qdS )r   r   N)r   )r}   r   rG   rG   rH   r   R  s    z/multilook {0} by {0} with nearest interpolation)
max_memoryr*   Nr  )method)r
   r0  r1  rs  rt  r   z#consider reference pixel in y/x: {}r  g      $@d   g      4@F)r*   c                s   g | ]}d   |qS )z{}-{})r[   )r}   r  )r~   rG   rH   r   }  s    z*prepare4multi_subplots.<locals>.<listcomp>z@mark interferograms with 'dropIfgram=False' in red colored titlec             3   s   | ]} | | kV  qd S )NrG   )r}   r~   )ri  r   rG   rH   r     s    )rs  rt  zreading DEM: {} ... height)r   r   r  r  r*   )r   rv   r*   g      ?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.)0r  rk   rl   r   r  r   r~  r|  r  r   r*   ro   r[   r   r   auto_multilook_numr   r  r  	maxMemoryr  r   r  rw   rn   r8   rp   r  rP  r  re   r
   r   r  r  rK   r   rm   r   rW   rX   r   r   prepare_dem_backgroundr  r  r  r   )
rv   r   r   r   r   r   r  ZdropDate12Listr   r   rG   )ri  r~   r   rH   prepare4multi_subplotsH  sl    
8

"r  Fc          	   C   sd  t |  dd }|  dd |_t|  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krP|j
d dd d	rPd
| krPt|d
 t|d  }}tj|j|j
d |||d |d fddd }||dk  |8  < |jrjtj|dk|}|jdk	rtj|jdk|}ntj|jtjd|_tj|r| j|j 9  _| jt |j! 9  _n| jt | 9  _t"|||\}}|dkrVdd |j#D }|j$dk	r2t%|j$dni }	t&j'|d|	d\}
}||||fS |||fS d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:
        subplot_kw = dict(projection=ccrs.PlateCarree())
        fig, ax = plt.subplots(figsize=[4, 3], subplot_kw=subplot_kw)
        W, N, E, S = (-91.670, -0.255, -91.370, -0.515)    # geo_box
        cmd = 'view.py geo_velocity.h5 velocity --mask geo_maskTempCoh.h5 --dem srtm1.dem --dem-nocontour '
        cmd += f'--sub-lon {W} {E} --sub-lat {S} {N} -c jet -v -3 10 '
        cmd += '--cbar-loc bottom --cbar-nbins 3 --cbar-ext both --cbar-size 5% '
        cmd += '--lalo-step 0.2 --lalo-loc 1 0 1 0 --scalebar 0.3 0.80 0.05 --notitle'
        data, atr ,inps = view.prep_slice(cmd)
        ax, inps, im, cbar = view.plot_slice(ax, data, atr, inps)
        plt.show()
    r   Nr   )rL   r   r   r  r  r*   )r   r   r*   F)r
   r   r  r0  r1  g        )r  Tc             S   s   g | ]}|d  qS )g       @rG   )r}   r~   rG   rG   rH   r     s    zprep_slice.<locals>.<listcomp>)r  Figure)r  r  
subplot_kw)(rz   r   r  rp   r  r   r   	read_maskr   rL   r   r   	mask_vmin	mask_vmaxr*   r  r   r   r  rw   r   rn   r8   rb   r   r   r  onesr   bool_r   r  r   r   r   r  r   r  rs   r  )cmdZauto_figrv   r~  r   r   r   r  r  r   r  r   rG   rG   rH   
prep_slice  s\    


r'  c               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
viewerzClass for view.py

    Example:
        import matplotlib.pyplot as plt
        from mintpy.view import viewer
        cmd = 'view.py timeseries.h5'
        obj = viewer(cmd)
        obj.configure()
        obj.plot()
    Nc             C   s$   |r|  dd  }|| _|| _d S )Nr   )r   r&  ru   )selfr&  ru   rG   rG   rH   __init__  s
    zviewer.__init__c          	   C   s   t | j}t| j|_t|\}| _t|| j}d| _|jrT|j	sTt
|dkrTd| _x"|j D ]\}}t| || q`W tj| j| j| jd | j| j| j| jd\| _| _| jS )Nr   r{   r   )rL   r   r   r  r  r*   )rz   ru   rk   r  r  r~  r   r   update_moder^   r   __dict__itemssetattrr   r!  r   rL   r   r   r"  r#  r*   r  )r)  rv   rw   valuerG   rG   rH   	configure  s"    
zviewer.configurec             C   st  | j dkrtd tj| j| jd | jdd\}| _| jr\|tj| j| j| jddd 8 }| j	dkr| jd 
dd drd	| j krt| jd	 t| jd
  }}tj| j| jd |||d |d fddd }||dk  |8  < | jrtd tj|dk|}| jd k	r:td tj| jdk|}ntj|jtjd| _tj|r|  j|j 9  _|  jt|j 9  _n|  jt| 9  _t|| j| \}} | jd k	rt| jdni }tj| jd|d\}}| j s|j!ddddd t"||| j| d } | j#rXtd$t%j&'| j(d | j) | j s\|j*| j(d d| j)dd n|j*| j(d d| j)dd | j+sX|,  nddddddddg}t-t.|t.| j/@ }x|D ]}	t0d $|	 qW t1| | jd!} ddg| _2x*t3d| j4d D ]}
t5|
| | jd! qW | j4dkrXtd" td#$| j2| j6 | j7rXtd$$| j7| j6 | j+rptd% t8  d S )&Nr   zreading data ...r   F)r   r   r*   )r
   r   r  r0  r1  g        zmasking pixels with zero valuezmasking data)r  )r  r  )r  r  r   )r  r  r  r  zsave figure to {} with dpi={}T)r  r  
pad_inchesr   )r  r  r  z
--show-gpsz--coastlinez--lalo-labelz--lalo-stepz
--scalebarz--pts-yxz
--pts-laloz
--pts-filezHWARNING: {} is NOT supported for multi-subplots, ignore it and continue.)r   z(----------------------------------------zall data range: {} {}zdisplay  range: {} {}zshowing ...)9r  rp   r   r   r   r   r   r~  r  rw   r   r   rn   r8   rb   r   r   r  r  r$  r   r%  r   r  r   r   r   r   r  rs   r  r  rc   r  ro  r_   r[   rW   rX   rw  r]   r  r  r^   r  rk   rl   ru   ro   r  r  r  r  r  r   r   show)r)  r   r   r   r  r   r  r   Z	opt_namesry   r  rG   rG   rH   r     s|    

 




zviewer.plot)NN)__name__
__module____qualname____doc__r*  r0  r   rG   rG   rG   rH   r(    s   

r(  c             C   s(   t | d}|  |jdkr$|  d S )N)ru   r   )r(  r0  r   r   )ru   r  rG   rG   rH   main}  s
    

r7  __main__r   )N)N)F)N)?rW   sysr  r1   r  r  numpyr   matplotlib.pyplotpyplotrs   mpl_toolkits.axes_grid1r   warningsfilterwarningsUserWarningcartopy.crscrsr   mintpy.objectsr   r   r	   r
   r   r   Zmintpy.objects.gpsr   mintpy.utilsr   r   r   r   r   r   r   mintpy.multilookr   mintpyr   r   r4   r9   rI   rz   r   rr   r   r   ro  r  r  r}  r   r  r  r  r  r'  r(  r7  r3  r  rG   rG   rG   rH   <module>   sR    "/
; V
  #$iWhxnT
R 
	
