U
     c0                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlmZmZ d dlmZ dZdddZddd	Zd
d ZdddZdddZedkreejdd  dS )    N)cluster
timeseriesgiantTimeseriesifgramStackifgramDatasetNames)readfile	writefile)create_argument_parsera  example:
  diff.py  velocity.h5    velocity_demErr.h5
  diff.py  timeseries.h5  inputs/ERA5.h5  -o timeseries_ERA5.h5
  diff.py  timeseries.h5  inputs/ERA5.h5  -o timeseries_ERA5.h5  --force
  diff.py  timeseries_ERA5_ramp_demErr.h5  ../GIANT/Stack/LS-PARAMS.h5 -o mintpy_giant.h5
  diff.py  reconUnwrapIfgram.h5  ./inputs/ifgramStack.h5  -o diffUnwrapIfgram.h5

  # multiple files
  diff.py  waterMask.h5  maskSantiago.h5  maskFernandina.h5  -o maskIsabela.h5
c                 C   sp   d}t }tdd }t||||| d}|jddd |jdd	d
d |jddddd |jdddddd |S )Nz+Generate the difference of two input files..)synopsisdescriptionepilog
subparsersfile1zfile to be subtracted.)helpfile2+zfile used to subtract)nargsr   z-oz--outputout_filez0output file name, default is file1_diff_file2.h5)destr   z--forcez--force-diff
force_diff
store_truezHEnforce the differencing for the shared dates only for time-series files)r   actionr   )EXAMPLE__name__splitr	   add_argument)r   r   r   nameparser r    B/home/exouser/operations/rsmas_insar/sources/MintPy/mintpy/diff.pycreate_parser&   s&        
r"   c                 C   s   t  }|j| d}t|jd }|dkrHt|jdkrHtd| d|jst|jdkrdt	dt
j|j\}}t
jt
j|jd d }| d	| | |_|S )
N)args	FILE_TYPE)r   r      z%ERROR: ONLY ONE file2 is inputed for z type!z#--output is required for >=2 files!r   Z_diff_)r"   
parse_argsr   read_attributer   lenr   
SystemExitr   
ValueErrorospathsplitextbasename)iargsr   inpsftypeZfbase1fextZfbase2r    r    r!   cmd_line_parse6   s    r3   c           	      C   s   |  dd}| dd}||kr&d}n|}|  dd|  ddg}| dd| ddg}||krld\}}n|\}}|dk	rt|nd}|dk	rt|nd}|||fS )zCheck reference date and point
    Parameters: atr1/2   - dict, metadata of file1/2
    Returns:    ref_date - str, None for re-referencing in time  is NOT needed
                ref_y/x  - int, None for re-referencing in space is NOT needed
    REF_DATENREF_YREF_X)NN)getint)	atr1atr2Z	ref_date1Z	ref_date2ref_dateZref_yx1Zref_yx2ref_yref_xr    r    r!   check_referenceL   s    	
r>   F    קAc           (   	      s   t d| || t| }t|d }|d }|d }t d| |dkr|dkrbtdt| }t|d }t|   |dkrt|d  d}	n|d	krt|d  d
}	t||\}
}}fdd D }t	j
t t	jd}| krft d||  |r^tt t| }t d t d| d|t	 fdd|D < ntdtj|| d t|d t|d  }}tt	t | | | }tjdd||f|ddd}|r|r|||d |d f}tj|d ||dd |	 }t|D ]\}}|dkr@t d|d | t d| t d|d  tj|d ||dd |	 }|r|rt dtj|d || |t	|dddd|jd |jd  f8 }|
rt d!tj|d |
 ||
}|t	||d"d"d"d"f |jd ddf8 }t d|  tj| |d#d }|d$k}||  |8  < d$||< ~d|jd |d |d% |d |d  g}tj||||d& q
n|t d'd( ||fD rt!| }|"  t!|d }|"  tt|j#t|j#@ tdkr
t$d)fd*dt%D d }t d+||  tj| |d,d } t d+||d  tj|d |d,d }d-|& kr0t d.|j'|j( | d"d"|j'|j(f }!|d"d"|j'|j(f }"t)| jd D ]f}| |d"d"f | |d"d"f d$k  |!| 8  < ||d"d"f ||d"d"f d$k  |"| 8  < qt	j*| | dk< t	j*||dk< | | }~ ~d$|t	+|< i }#||#|< tj,|#|| d/ nd0d | g| D }$ttj-t.t|$ t d1d( |$D r|$d t d2 tdk rt$d3| g| i }#D ]}t d4| tj| |d,d }|j/}%t|D ]\}}&t|$|d  dkrRd"n|}'tj|&|'d,d }|d5krt||dd" \}}|r|rt dtj|d || ||||f 8 }t	j|t	j0dt	j|t	j0d }q0t	j||%d|#|< qt d6|  tj,|#||| d7 |S )8a_  calculate/write file1 - file2

    Parameters: file1         - str, path of file1
                file2         - list(str), path of file2(s)
                out_file      - str, path of output file
                force_diff    - bool, overwrite existing output file
                max_num_pixel - float, maximum number of pixels for each block
    z{} - {} --> {}r   r$   zthe 1st input file is: {}r   )r   r   z8Input multiple dataset files are not the same file type!g      ?r   gMbP?c                    s   g | ]}| kr|qS r    r    .0i)	dateList2r    r!   
<listcomp>   s      zdiff_file.<locals>.<listcomp>)dtypez,WARNING: {} does not contain all dates in {}zBContinue and enforce the differencing for their shared dates only.z6	with following dates are ignored for differencing:
{}c                    s   g | ]}  |qS r    )indexr@   )	dateList1r    r!   rD      s     z7To enforce the differencing anyway, use --force option.)ref_fileLENGTHWIDTHyT)box	num_split	dimension	print_msgr%   )datasetNamerL   z5
------- processing patch {} out of {} --------------zbox: {}zread from file: {}z(* referencing data from {} to y/x: {}/{}r      z&* referencing data from {} to date: {}N)rL   g           )datarP   blockc                 s   s   | ]}|d kV  qdS )r   Nr    r@   r    r    r!   	<genexpr>   s     zdiff_file.<locals>.<genexpr>z$no common dataset between two files!c                    s   g | ]}| kr|qS r    r    r@   )ds_namesr    r!   rD      s      zreading {} from file {} ...)rP   Zunwrapphasez referencing to pixel ({},{}) ...)r   rH   c                 S   s   g | ]}t |qS r    )r   get_dataset_listrA   xr    r    r!   rD      s     c                 s   s   | ]}t |d kV  qdS )r%   N)r(   rX   r    r    r!   rU      s     z&List of common datasets across files: z(No common datasets found among files:
{}zdifferencing {} ...velocityz"use metadata from the 1st file: {})r   metadatarH   )1printformatr   r'   	Exceptionr   get_date_listr   r>   nponesr(   bool_listsetarrayr   layout_hdf5r8   ceilr   split_box2sub_boxesread	enumerater+   r,   r.   tilereshapeshaperF   write_hdf5_blockallr   opendatasetNamesr*   r   lowerrefYrefXrangenanisnanwriteintersectionmaprE   float32)(r   r   r   r   Zmax_num_pixelr9   r:   k1k2Zunit_facr;   r<   r=   ZdateListSharedZ
dateSharedZ
dateListExlengthwidthnum_boxbox_listref_boxref_valrB   rL   data2Zref_indrS   maskrT   obj1obj2ds_namedata1Zref1Zref2ZdsDictZds_names_listrE   fnameZds_name2readr    )rG   rC   rV   r!   	diff_filem   s   	






,
.&04

$r   c                 C   sR   t | }t }t|j|j|j|jd tt | d\}}td	|| d S )N)r   r   r   r   <   z&time used: {:02.0f} mins {:02.1f} secs)
r3   timer   r   r   r   r   divmodr\   r]   )r/   r0   
start_timemsr    r    r!   main#  s    r   __main__r%   )N)N)Fr?   )N)r+   sysr   numpyr`   mintpy.objectsr   r   r   r   r   mintpy.utilsr   r   mintpy.utils.arg_utilsr	   r   r"   r3   r>   r   r   r   argvr    r    r    r!   <module>	   s   

!
 7
