U
     xbX                     @   s   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	m
Z
mZ d dlmZmZmZmZ d dlmZ G dd dZG dd	 d	ZG d
d dZdddZG dd dZdS )    N)resize)dataTypeDictgeometryDatasetNamesifgramDatasetNames)ptimereadfileutils0	attribute)multilook_datac                	   @   sX   e Zd ZdZdded fddZddd	Zd
d Zdd Zdd Z	dd Z
dddZdS )ifgramStackDicta=  
    IfgramStack object for a set of InSAR pairs from the same platform and track.

    Example:
        from mintpy.objects.insarobj import ifgramStackDict
        pairsDict = {('20160524','20160530'):ifgramObj1,
                     ('20160524','20160605'):ifgramObj2,
                     ('20160524','20160611'):ifgramObj3,
                     ('20160530','20160605'):ifgramObj4,
                     ...
                     }
        stackObj = ifgramStackDict(pairsDict=pairsDict)
        stackObj.write2hdf5(outputFile='ifgramStack.h5', box=(200,500,300,600))
    ifgramStackNr   c                 C   s   || _ || _|| _d S N)name	pairsDictdsName0)selfr   r   r    r   O/home/exouser/operations/rsmas_insar/sources/MintPy/mintpy/objects/stackDict.py__init__2   s    zifgramStackDict.__init__   c           	      C   s   t | j}dd | j D d }|j| jd\}}|rD| \}}|rj|d |d  |d |d   }}|| }|| }|||fS )zGet size in 3Dc                 S   s   g | ]}|qS r   r   .0vr   r   r   
<listcomp>:   s     z,ifgramStackDict.get_size.<locals>.<listcomp>r   family   r      )lenr   valuesget_sizer   )	r   boxxstepystepgeom_obj
num_ifgram	ifgramObjlengthwidthr   r   r   r    7   s    
"zifgramStackDict.get_sizec                 C   s*   dd | j  D }dd |D | _| jS )Nc                 S   s   g | ]}|qS r   r   r   pairr   r   r   r   M   s     z3ifgramStackDict.get_date12_list.<locals>.<listcomp>c                 S   s    g | ]}d  |d |d qS )z{}_{}r   r   )formatr   ir   r   r   r   N   s     )r   keys
date12List)r   pairsr   r   r   get_date12_listL   s    zifgramStackDict.get_date12_listc                 C   s0   dd | j  D d }dd |j D }|S )Nc                 S   s   g | ]}|qS r   r   r   xr   r   r   r   R   s     z4ifgramStackDict.get_dataset_list.<locals>.<listcomp>r   c                 S   s   g | ]}|qS r   r   r2   r   r   r   r   S   s     )r   r   datasetDictr.   )r   r&   ZdsetListr   r   r   get_dataset_listQ   s    z ifgramStackDict.get_dataset_listc                 C   sH   dd | j  D d }|j| jd| _d| j krB| jd | jS )Nc                 S   s   g | ]}|qS r   r   r   r   r   r   r   W   s     z0ifgramStackDict.get_metadata.<locals>.<listcomp>r   r   UNIT)r   r   get_metadatar   metadatar.   pop)r   r&   r   r   r   r7   V   s
    zifgramStackDict.get_metadatac                 C   sD   dd | j  D d }|j| }t|}t|dd  }|S )Nc                 S   s   g | ]}|qS r   r   r   r   r   r   r   ^   s     z9ifgramStackDict.get_dataset_data_type.<locals>.<listcomp>r   	DATA_TYPEfloat32)r   r   r4   r   read_attributer   getlower)r   dsNamer&   dsFiler8   dataTyper   r   r   get_dataset_data_type]   s
    

z%ifgramStackDict.get_dataset_data_typeifgramStack.h5wnearestc
           "         s  t d tj|}
tj|
s8t|
 t d|
  tdd  j D  _	t
 j j	d  j  _ fddtD  _tdd  jD } j|||d\}}}d	}|	r0tj|d
r0  dd	 }|	 }||kr0d}|d| d| d7 }t | |} j||||	ddd	 \}}t||}t d||  jD ]}|||f}tj}|}|dkrtj}d}d}t dj||t|||d |j||d	|d |d f|d|d}|drt d|  j j	d  j| }|drt d || dkr6t d| d| d | d! tj|d"}t j	D ]\}}|j|d |d  d#|d  d$  j| }|j||||||d%d }|d&rtj ||d'k< |j| }|drt!|}|||d	d	d	d	f< qLtt"" |j#d(< |$  qVd)}tj%}|df}t d*j||t||d+ tj& j	|d,}|j||d- d.}tj}|f}t d*j||t||d+ tj'||d,}t(|D ](} j j	|  }|j) j*d/||< q|j||d- d0}tj+}|f}t d*j||t||d+ tj,||d,}|j||d-  - }|r<|| t d1| |rVt d2 t./||}|rpt d3 t.0||}|| dkrt d4 t.1|||} j2|d5< |3 D ]\} }!|!|j#| < qW 5 Q R X t d6| |S )7a  Save/write an ifgramStackDict object into an HDF5 file with the structure defined in:

        https://mintpy.readthedocs.io/en/latest/api/data_structure/#ifgramstack

        Parameters: outputFile     - str, Name of the HDF5 file for the InSAR stack
                    access_mode    - str, access mode of output File, e.g. w, r+
                    box            - tuple, subset range in (x0, y0, x1, y1)
                    x/ystep        - int, multilook number in x/y direction
                    mli_method     - str, multilook method, nearest, mean or median
                    compression    - str, HDF5 dataset compression method, None, lzf or gzip
                    extra_metadata - dict, extra metadata to be added into output file
                    geom_obj       - geometryDict object, size reference to determine the resizing operation.
        Returns:    outputFile     - str, Name of the HDF5 file for the InSAR stack
        2--------------------------------------------------create directory: c                 S   s   g | ]}|qS r   r   r)   r   r   r   r   |   s     z.ifgramStackDict.write2hdf5.<locals>.<listcomp>r   c                    s   g | ]}| j kr|qS r   dsNamesr,   r   r   r   r   ~   s     
 c                 S   s   g | ]}t |qS r   r   r,   r   r   r   r      s     r!   r"   r#   Nionr   z)lower resolution ionosphere file detectedz --> resize from z to z! via skimage.transform.resize ...)r!   r"   r#   r$    create HDF5 file {} with {} mode)connectComponentlzfrE   Icreate dataset /{d:<{w}} of {t:<25} in size of {s} with compression = {c}drD   tscr   TshapemaxshapedtypechunkscompressionZ	OffsetVarz(set no-data value for {} from 99 to NaN.zcov.bipz'convert variance to standard deviation.zapply z x z multilooking/downsampling via z ...maxValue_suffix)r!   r"   r#   
mli_methodresize2shape	OffsetStdg     X@MODIFICATION_TIMEdate2create dataset /{d:<{w}} of {t:<25} in size of {s}rS   rD   rT   rU   rZ   databperpr   
dropIfgramadd extra metadata: {}zupdate metadata due to resizezupdate metadata due to subsetz update metadata due to multilook	FILE_TYPEFinished writing to {})4printospathdirnameisdirmakedirssortedr   r.   r0   listr4   rI   r   maxr    basename
startswithh5pyFiler+   npr;   int16strcreate_datasetendswithr   progressBar	enumerateupdatereadnansqrttimeattrsclosestring_arrayzerosrangeget_perp_baseliner   bool_onesr7   attrupdate_attribute4resizeupdate_attribute4subsetupdate_attribute4multilookr   items)"r   
outputFileaccess_moder!   r"   r#   rb   r\   extra_metadatar$   
output_dirmaxDigit	numIfgramr'   r(   rc   Zion_size	geom_sizemsgfr?   dsShape
dsDataTypeZdsCompressiondsr@   prog_barr-   r*   r&   rk   metakeyvaluer   rJ   r   
write2hdf5d   s   



$




zifgramStackDict.write2hdf5)Nr   r   N)	rC   rD   Nr   r   rE   NNN)__name__
__module____qualname____doc__r   r   r    r1   r5   r7   rB   r   r   r   r   r   r   "   s   
      r   c                   @   sZ   e Zd ZdZdi dfddZddd	Zed
 fddZed
 fddZed
 fddZ	dS )
ifgramDicta  
    Ifgram object for a single InSAR pair of interferogram. It includes dataset name (family) of:
        'unwrapPhase','coherence','connectComponent','wrapPhase','rangeOffset','azimuthOffset', etc.

    Example:
        from mintpy.objects.insarobj import ifgramDict
        datasetDict = {'unwrapPhase'     :'$PROJECT_DIR/merged/interferograms/20151220_20160206/filt_fine.unw',
                       'coherence'       :'$PROJECT_DIR/merged/interferograms/20151220_20160206/filt_fine.cor',
                       'connectComponent':'$PROJECT_DIR/merged/interferograms/20151220_20160206/filt_fine.unw.conncomp',
                       'wrapPhase'       :'$PROJECT_DIR/merged/interferograms/20151220_20160206/filt_fine.int',
                       'magnitude'       :'$PROJECT_DIR/merged/interferograms/20151220_20160206/filt_fine.unw',
                       ...
                      }
        ifgramObj = ifgramDict(datasetDict=datasetDict)
        data, atr = ifgramObj.read('unwrapPhase')
    ZifgramNc                 C   sH   || _ || _d | _d | _d | _|d k	rD| D ]\}}t| || q.d S r   )r   r4   platformtrack	processorr   setattr)r   r   r4   r8   r   r   r   r   r   r   :  s    zifgramDict.__init__r   rE   c                 C   s   | j | | _|rdn|}tj| j||ddd\}}	|rrt||ddddd}|rr||d |d |d |d	 f }|| dkr|d
krt|jd | }
t|jd | }|t|d	 d|t|d	 d|f }|d|d|
f }nt||||d}||	fS )a  Read data for the given dataset name.

        Parameters: self         - ifgramDict object
                    family       - str, dataset name
                    box          -  tuple of 4 int, in (x0, y0, x1, y1) with respect to the full resolution
                    x/ystep      - int, number of pixels to skip, with respect to the full resolution
                    mli_method   - str, interpolation method, nearest, mean, median
                    resize2shape - tuple of 2 int, resize the native matrix to the given shape
                                   Set to None for not resizing
        Returns:    data         - 2D np.ndarray
                    meta         - dict, metadata
        Nr   datasetNamer!   r"   r#   constantT)output_shapeordermodeZanti_aliasingpreserve_ranger   r   r   rE   )lks_ylks_xmethod)r4   filer   r   r   intrX   r
   )r   r   r!   r"   r#   rb   rc   Zbox2readrk   r   xsizeysizer   r   r   r   F  sJ    
 
zifgramDict.readr   c                 C   s8   | j | | _t| j}t|d }t|d }||fS )NLENGTHWIDTH)r4   r   r   r<   r   )r   r   r8   r'   r(   r   r   r   r      s
    zifgramDict.get_sizec                 C   sL   | j | | _t| j}t|d | _t|d | _| j| j d | _| jS )NP_BASELINE_TOP_HDRP_BASELINE_BOTTOM_HDRg       @)r4   r   r   r<   floatZ	bperp_topZbperp_bottomrl   )r   r   r8   r   r   r   r     s    zifgramDict.get_perp_baselinec                 C   sd   | j | | _t| j| _t| jd | _t| jd | _| jrL| j| jd< | j	r^| j	| jd< | jS )Nr   r   ZTRACKPLATFORM)
r4   r   r   r<   r8   r   r'   r(   r   r   r   r   r   r   r   r7     s    zifgramDict.get_metadata)Nr   r   rE   N)
r   r   r   r   r   r   r   r    r   r7   r   r   r   r   r   (  s   
;r   c                   @   sf   e Zd ZdZddi dfddZdddZdd	d
ZdddZdddZdd Z	dddZ
dddZdS )geometryDicta  
    Geometry object for Lat, Lon, Heigt, Incidence, Heading, Bperp, ... from the same platform and track.

    Example:
        from mintpy.utils import readfile
        from mintpy.utils.insarobj import geometryDict
        datasetDict = {'height'        :'$PROJECT_DIR/merged/geom_reference/hgt.rdr',
                       'latitude'      :'$PROJECT_DIR/merged/geom_reference/lat.rdr',
                       'longitude'     :'$PROJECT_DIR/merged/geom_reference/lon.rdr',
                       'incidenceAngle':'$PROJECT_DIR/merged/geom_reference/los.rdr',
                       'heandingAngle' :'$PROJECT_DIR/merged/geom_reference/los.rdr',
                       'shadowMask'    :'$PROJECT_DIR/merged/geom_reference/shadowMask.rdr',
                       'waterMask'     :'$PROJECT_DIR/merged/geom_reference/waterMask.rdr',
                       'bperp'         :bperpDict
                       ...
                      }
        bperpDict = {'20160406':'$PROJECT_DIR/merged/baselines/20160406/bperp',
                     '20160418':'$PROJECT_DIR/merged/baselines/20160418/bperp',
                     ...
                    }
        metadata = readfile.read_attribute('$PROJECT_DIR/merged/interferograms/20160629_20160723/filt_fine.unw')
        geomObj = geometryDict(processor='isce', datasetDict=datasetDict, extraMetadata=metadata)
        geomObj.write2hdf5(outputFile='geometryRadar.h5', access_mode='w', box=(200,500,300,600))
    geometryNc                    sh   || _ || _|| _|| _t| j | _| jsd| j| jd  }t| t	 fdddD rd | _d S )Nr   c                 3   s   | ]}|   kV  qd S r   )r.   r,   r8   r   r   	<genexpr>  s     z(geometryDict.__init__.<locals>.<genexpr>)STARTING_RANGERANGE_PIXEL_SIZE)
r   r   r4   extraMetadatarx   r.   rI   r   r<   all)r   r   r   r4   r   r@   r   r   r   r     s    
zgeometryDict.__init__r   c                 C   sD   | j | | _| jdrd }n|}tj| j||||d\}}||fS )Nz.h5r   )r4   r   r   r   r   )r   r   r!   r"   r#   r?   rk   r8   r   r   r   r     s    
zgeometryDict.readc                 C   s  | j s
dS td d| j  kr(d}d}|| jkrtdtj| j|  | j	|dd 
tj}t| j}|d	d
dkr|dddrtd d|d tj  }t| j |}nf|| j  kr"td| t| j d }	t| j d }
t| j | }tj|	|
ftjd| }ndS ntj| j ddd}|dk	rh||d |d |d |d f }|| dkrt|jd | }t|jd | }|t|d d|t|d d|f }|d|d|f }|S )DGenerate 2D slant range distance if missing from input template fileNzprepare slantRangeDistance ...Y_FIRSTincidenceAngleSLANT_RANGE_DISTANCEz4    geocoded input, use incidenceAngle from file: {}r   r   	PROCESSORiscehyp3r6   degreesradz<    convert incidence angle from Gamma to MintPy convention.     V@     f@2geocoded input, use contant value from metadata {}r   r   ri   r   F)	dimension	print_msgr   r   )r   rq   r.   rI   r+   rr   rs   rz   r4   r   astyper~   r;   r   r<   r   r=   r{   piut$incidence_angle2slant_range_distancer   r   r   range_distancerX   )r   r!   r"   r#   ds_namer   	inc_angleatrrk   r'   r(   
range_distr   r   r   r   r   get_slant_range_distance  sP    
"
 
z%geometryDict.get_slant_range_distancec                 C   s\  | j s
dS d| j  krd}td| || j  kr|t| j d }t| j d }t| j | }tj||ftjd| }qdS n<d| j	krt
j| jd dd	d
 }	nd}	tj| j |	ddd}|dk	r||d |d |d
 |d f }|| dkrXt|jd | }
t|jd
 | }|t|d d|t|d d|f }|d|d|
f }|S )r   Nr   INCIDENCE_ANGLEr   r   r   ri   height)r   r   r   F)demr   r   r   r   )r   r.   rq   r+   r   r   r~   r   r;   rI   r   r   r4   r   incidence_anglerX   )r   r!   r"   r#   r   r'   r(   r   rk   r   r   r   r   r   r   get_incidence_angle  sD    
 
z geometryDict.get_incidence_anglec                 C   s   |sdd | j  D d }| j | | _t| j}|rZ|d |d  }|d |d  }nt|d }t|d }|| }|| }||fS )	Nc                 S   s   g | ]}|d kr|qS rl   r   r,   r   r   r   r   A  s      z)geometryDict.get_size.<locals>.<listcomp>r   r   r   r   r   r   )r4   r.   r   r   r<   r   )r   r   r!   r"   r#   r8   r'   r(   r   r   r   r    ?  s    zgeometryDict.get_sizec                 C   s   t | j | _| jS r   )rx   r4   r.   ZdatasetListrJ   r   r   r   r5   S  s    zgeometryDict.get_dataset_listc                 C   sv   |sdd | j  D d }| j | | _t| j| _t| jd | _t| jd | _d| j krp| j	d | jS )Nc                 S   s   g | ]}|d kr|qS r   r   r,   r   r   r   r   Y  s      z-geometryDict.get_metadata.<locals>.<listcomp>r   r   r   r6   )
r4   r.   r   r   r<   r8   r   r'   r(   r9   r   r   r   r   r7   W  s    zgeometryDict.get_metadatageometryRadar.h5rD   rP   c              
      s  t d t jdkr"t d dS tj|}tj|sRt| t d|  tdd t	D }	 j
|||d\}
}| _t j|>}t d	 j|  jD ]}|d
krt j|   _tj}t j _ j|
|f}|j||d|d |d f|d|d}t dj||	t||t|d t d tj jd}t jD ]V\}}|j|d |d  j| | }t| 
 |||d}|||ddddf< qN|  d} jf}tj}t dj||	t||d tj j|d}|j||d}qtj}|  !drtj"}|
|f}t dj||	t||t|d tj j#||||dd |d}tj$ j| }|%ds|!dr| }t d| n|dkrd }t&||krtj'|||k< t d!| n|d"kr|dkrt d#|| || }n|d$kr6|dkr6t d#|| || }n\|d%krt() j*}|+d&d'd(kr|+d)d*%d+rt d,| d-|d. tj,  }|j||d|d/}q fd0dd1D D ]}d}|d%kr܈ j-|||d}n|d2kr j.|||d}|dk	r|j/}tj}t dj||	t||t|d |j|||d|d3}q 0  |rl j1| t d4| t23 j1| _1|| dkrt24 j1|| _1 j5 j1d5<  j16 D ]\}}||j7|< qW 5 Q R X t d6 j  jS )7zSave/write to HDF5 file with structure defined in:
            https://mintpy.readthedocs.io/en/latest/api/data_structure/#geometry
        rF   r   z;No dataset file path in the object, skip HDF5 file writing.NrG   c                 S   s   g | ]}t |qS r   rK   r,   r   r   r   r   s  s     z+geometryDict.write2hdf5.<locals>.<listcomp>rL   rN   rl   r   r   TrW   rQ   rR   zOread coarse grid baseline files and linear interpolate into full resolution ...r]   r`   )fname
full_shaper!   r"   r#   rf   rg   rh   ri   rj   mask)r   r!   r"   r#   Z	waterBodyz.wbdzq    input file "{}" is water body (True/False for water/land), convert to water mask (False/True for water/land).r   i z,    convert no-data value for DEM {} to NaN.
rangeCoordz5    scale value of {:<15} by 1/{} due to multilookingazimuthCoordr   r   r   r   r6   r   r   zi    convert {:<15} from Gamma (from horizontal in radian) to MintPy (from vertical in degree) convention.r   r   )rk   r[   r\   c                    s   g | ]}| j kr|qS r   rH   r,   rJ   r   r   r     s     
 )r   slantRangeDistancer   )rk   rZ   r[   r\   rn   ro   rp   )8rq   r   r4   rr   rs   rt   ru   rv   ry   r   r    r   r|   r}   r+   rI   rx   r.   dateListr~   r;   numDater   r   r   r   r   r   read_isce_bperp_filer   r   r   r>   r   r   r   rz   r{   anyr   r   r<   r   r=   r   r   r   rX   r7   r8   r   r   r   r   r   r   )r   r   r   r!   r"   r#   r\   r   r   r   r'   r(   r   r?   r   r   r   r   r-   date_strr   rk   ZnoDataValueDEMr   r   r   r   rJ   r   r   c  s   










zgeometryDict.write2hdf5)Nr   r   )Nr   r   )Nr   r   )NNr   r   )N)r   rD   Nr   r   rP   N)r   r   r   r   r   r   r   r   r    r5   r7   r   r   r   r   r   r     s   

7
1

    r   r   c              	   C   s  t | d }t|t| }}||kr<|| ||  }t & tjdtd t	||dddd}W 5 Q R X ||kr|||  | }d}	|	rdd	l
m}
 |
jdd
dd\}\}}|t | d }|j||d ||}|j||d |
  |d	k	r$||d |d |d |d
 f }|| dkrt|jd | }t|jd | }|t|d
 d	|t|d
 d	|f }|d	|d	|f }|S )at  Read ISCE-2 coarse grid perpendicular baseline file, and project it to full size
    Parameters: fname      - str, bperp file name
                full_shape - tuple of 2 int, shape of file in full resolution
                box        - tuple of 4 int, subset range in (x0, y0, x1, y1) with respect to full resolution
                x/ystep    - int, number of pixels to pick/multilook for each output pixel
    Returns:    data       - 2D array of float32
    Example:    fname = '$PROJECT_DIR/merged/baselines/20160418/bperp'
                data = self.read_sice_bperp_file(fname, (3600,2200), box=(200,400,1000,1000))
    r   ignore)categoryr   edgeT)r   r   r   FNr   )      )nrowsncolsfigsize)axr   )r   r   r~   nanminnanmaxwarningscatch_warningssimplefilterUserWarningr   matplotlib.pyplotpyplotsubplotsimshowcolorbarshowr   rX   )r   r   r!   r"   r#   Zdata_cdata_mindata_maxrk   
debug_modepltfigax1ax2imr   r   r   r   r   r     sB    
 
 
 
r   c                   @   s6   e Zd ZdddZdd Zdd Zdd Zd	d
 ZdS )platformTrackc                 C   s
   d | _ d S r   )r0   )r   r   r   r   r   r   J  s    zplatformTrack.__init__c                 C   s8   |  }i | _|D ] }|| j|kr|| | j|< qd S r   )r.   r0   Zplatform_track)r   ZpairDictZ	platTrackr0   r*   r   r   r   getPairsM  s
    zplatformTrack.getPairsc                 C   s   | j  }g }g }g }g }|D ]t}| j | | | j | jdkr| j | j|kr|| j | j || || j | j || j | j qt|}t|}|||fS )Nr   )	r0   r.   r7   r'   r   appendr(   r~   median)r   r?   r0   Zpairs2r(   r'   filesr*   r   r   r   getSize_geometryT  s    
 


zplatformTrack.getSize_geometryc                 C   sf   | j  }t|| _g }g }|D ](}|| j | j || j | j q t|| _t|| _d S r   )	r0   r.   r   ZnumPairsr  r'   r(   r~   r  )r   r0   r(   r'   r*   r   r   r   getSizef  s    

zplatformTrack.getSizec                 C   s   dd | j  D }| j |d  jd k	rJdd | j |d  j D | _ng | _| j |d  jd k	rdd | j |d  j D | _ng | _g | _|D ]F}| j | jd k	rdd | j | j D }tt	| jt	|B | _qd S )Nc                 S   s   g | ]}|qS r   r   r)   r   r   r   r   u  s     z1platformTrack.getDatasetNames.<locals>.<listcomp>r   c                 S   s   g | ]}|qS r   r   r   kr   r   r   r   z  s     c                 S   s   g | ]}|qS r   r   r  r   r   r   r     s     c                 S   s   g | ]}|qS r   r   r  r   r   r   r     s     )
r0   r.   ZobservationsDictZdsetObservationNamesZqualityDictZdsetQualityNamesZdsetGeometryNamesr   rx   set)r   r0   r*   r.   r   r   r   getDatasetNamesq  s    ""zplatformTrack.getDatasetNamesN)r  )r   r   r   r   r  r  r  r   r   r   r   r   r  H  s
   
r  )Nr   r   )rr   r   r  r|   numpyr~   Zskimage.transformr   mintpy.objectsr   r   r   mintpy.utilsr   r   r   r   r	   r   Zmintpy.multilookr
   r   r   r   r   r  r   r   r   r   <module>   s"     x  v
4