B
    Qa                 @   s   d dl Z d dlZd dlZd dlZd dlZyd dlmZ W n ek
rT   edY nX d dl	m
Z
mZmZ d dlmZmZmZ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)resizezCould not import skimage!)dataTypeDictgeometryDatasetNamesifgramDatasetNames)ptimereadfileutils0	attributec               @   sP   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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   N/home/centos/operations/rsmas_insar/sources/MintPy/mintpy/objects/stackDict.py__init__5   s    zifgramStackDict.__init__   c             C   s   t | j| _dd | j D d }|j| jd\| _|_|rd|d |d  | _|d |d  | _n|j| _|j| _| j| | _| j| | _| j| j| jfS )Nc             S   s   g | ]}|qS r   r   ).0vr   r   r   
<listcomp><   s    z,ifgramStackDict.get_size.<locals>.<listcomp>r   )family   r      )lenr   	numIfgramvaluesget_sizer   lengthwidth)r   boxxstepystep	ifgramObjr   r   r   r   :   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   N   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   O   s    )r   keys
date12List)r   pairsr   r   r   get_date12_listM   s    zifgramStackDict.get_date12_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   r   S   s    z0ifgramStackDict.get_metadata.<locals>.<listcomp>r   )r   UNIT)r   r   get_metadatar   metadatar'   pop)r   r#   r   r   r   r,   R   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   r   Z   s    z9ifgramStackDict.get_dataset_data_type.<locals>.<listcomp>r   	DATA_TYPEfloat32)r   r   datasetDictr   read_attributer   getlower)r   dsNamer#   dsFiler-   dataTyper   r   r   get_dataset_data_typeY   s
    

z%ifgramStackDict.get_dataset_data_typeifgramStack.h5wc          
      s  t dd  j D  _t j jd  j  _ fddtD  _tdd  jD } j	|||d | _
t j
|\}	td j
| x jD ]}
 j j jf}tj}|}|
dkrtj}d	}td
j|
|t|||d |	j|
|d|d |d f|d|d}|
drXtd|
  j jd  j|
 }|drXtd tj jd}xt jD ]} j j|  }|j|
|||dd }|
drtj||dk< |j|
 }|drt|}|||ddddf< |j|d d j| d  j| d d qrW |  tt   |j!d< qW d}
tj"} jdf}tdj|
|t||d tj# j|d}|	j|
|d d }
tj} jf}tdj|
|t||d tj$ j|d}x6t jD ](} j j|  }|j% j&d!||< qW |	j|
|d d"}
tj'} jf}tdj|
|t||d tj(||d}|	j|
|d  )  |r| j*| td#| t+, j*| _*|| dkrt+- j*|| _* j. j*d$< x" j*/ D ]\}}||	j!|< qW W dQ R X td% j
  j
S )&a  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)
                    extra_metadata : dict, extra metadata to be added into output file
        Returns:    outputFile
        c             S   s   g | ]}|qS r   r   )r   r$   r   r   r   r   m   s    z.ifgramStackDict.write2hdf5.<locals>.<listcomp>r   c                s   g | ]}| j kr|qS r   )dsNames)r   r&   )r   r   r   r   o   s    c             S   s   g | ]}t |qS r   )r   )r   r&   r   r   r   r   p   s    )r    r!   r"   z create HDF5 file {} with {} mode)connectComponentlzfzIcreate dataset /{d:<{w}} of {t:<25} in size of {s} with compression = {c})dr:   tscNr   r   T)shapemaxshapedtypechunkscompressionZ	OffsetVarz(set no-data value for {} from 99 to NaN.zcov.bipz'convert variance to standard deviation.)maxValue	OffsetStdg     X@z{}_{})suffixMODIFICATION_TIMEdatez2create dataset /{d:<{w}} of {t:<25} in size of {s})r>   r:   r?   r@   )rD   )databperp)r   
dropIfgramzadd extra metadata: {}	FILE_TYPEzFinished writing to {})0sortedr   r'   r)   listr1   r;   r   maxr   
outputFileh5pyFileprintr%   r   r   r   npr0   int16strcreate_datasetendswithr   progressBarrangereadnansqrtupdateclosetimeattrsstring_arrayzerosget_perp_baseliner   bool_onesr,   r-   attrupdate_attribute4subsetupdate_attribute4multilookr   items)r   rS   access_moder    r!   r"   rF   extra_metadatamaxDigitfr5   dsShape
dsDataTypeZdsCompressiondsr6   prog_barr&   r#   rL   keyvaluer   )r   r   
write2hdf5`   s    






zifgramStackDict.write2hdf5)Nr   r   )r9   r:   Nr   r   NN)__name__
__module____qualname____doc__r   r   r   r*   r,   r8   ry   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 )
ifgramDictaf  
    Ifgram object for a single InSAR pair of interferogram. It includes dataset name (family) of:
        'unwrapPhase','coherence','connectComponent','wrapPhase','ionoPhase','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',
                       'ionoPhase'       :'$PROJECT_DIR/merged/ionosphere/20151220_20160206/iono.bil.unwCor.filt',
                       'magnitude'       :'$PROJECT_DIR/merged/interferograms/20151220_20160206/filt_fine.unw',
                       ...
                      }
        ifgramObj = ifgramDict(datasetDict=datasetDict)
        data, atr = ifgramObj.read('unwrapPhase')
    ZifgramNc             C   sL   || _ || _d | _d | _d | _|d k	rHx | D ]\}}t| || q0W d S )N)r   r1   platformtrack	processorrn   setattr)r   r   r1   r-   rw   rx   r   r   r   r     s    zifgramDict.__init__r   c             C   s.   | j | | _tj| j||||d\}}||fS )N)datasetNamer    r!   r"   )r1   filer   r^   )r   r   r    r!   r"   rL   r-   r   r   r   r^     s    zifgramDict.readr   c             C   s@   | j | | _t| j}t|d | _t|d | _| j| jfS )NLENGTHWIDTH)r1   r   r   r2   intr   r   )r   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 )NZP_BASELINE_TOP_HDRZP_BASELINE_BOTTOM_HDRg       @)r1   r   r   r2   floatZ	bperp_topZbperp_bottomrM   )r   r   r-   r   r   r   rh     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)
r1   r   r   r2   r-   r   r   r   r   r   )r   r   r   r   r   r,   '  s    zifgramDict.get_metadata)Nr   r   )
rz   r{   r|   r}   r   r^   r   r   rh   r,   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 )N)r'   )r   r&   )r-   r   r   	<genexpr>m  s    z(geometryDict.__init__.<locals>.<genexpr>)STARTING_RANGERANGE_PIXEL_SIZE)
r   r   r1   extraMetadatarQ   r'   r;   r   r2   all)r   r   r   r1   r   r6   r   )r-   r   r   b  s    
zgeometryDict.__init__r   c             C   sD   | j | | _| jdrd }n|}tj| j||||d\}}||fS )Nz.h5)r   r    r!   r"   )r1   r   r[   r   r^   )r   r   r    r!   r"   r5   rL   r-   r   r   r   r^   p  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 )zDGenerate 2D slant range distance if missing from input template fileNzprepare slantRangeDistance ...Y_FIRSTincidenceAngleZSLANT_RANGE_DISTANCEz4    geocoded input, use incidenceAngle from file: {})r   r   	PROCESSORiscehyp3r+   degreesradz<    convert incidence angle from Gamma to MintPy convention.g     V@g     f@z2geocoded input, use contant value from metadata {}r   r   )rD   r   F)	dimension	print_msgr   r   )r   rV   r'   r;   r%   ospathbasenamer1   r^   astyperW   r0   r   r2   r   r3   
startswithpiut$incidence_angle2slant_range_distancer   r   rj   range_distancerB   )r   r    r!   r"   ds_namerw   	inc_angleatrrL   r   r   
range_distxsizeysizer   r   r   get_slant_range_distance  sD    
"
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 )zDGenerate 2D slant range distance if missing from input template fileNr   ZINCIDENCE_ANGLEz2geocoded input, use contant value from metadata {}r   r   )rD   height)r   r   r   F)demr   r   r   r   )r   r'   rV   r%   r   r   rW   rj   r0   r;   r   r^   r1   r   incidence_anglerB   )r   r    r!   r"   rw   r   r   r   rL   r   r   r   r   r   r   get_incidence_angle  s8    
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 )rM   r   )r   r&   r   r   r   r     s    z)geometryDict.get_size.<locals>.<listcomp>r   r   r   r   r   r   )r1   r'   r   r   r2   r   )r   r   r    r!   r"   r-   r   r   r   r   r   r     s    zgeometryDict.get_sizec             C   s   t | j | _| jS )N)rQ   r1   r'   ZdatasetList)r   r   r   r   get_dataset_list  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 )rM   r   )r   r&   r   r   r   r     s    z-geometryDict.get_metadata.<locals>.<listcomp>r   r   r   r+   )
r1   r'   r   r   r2   r-   r   r   r   r.   )r   r   r   r   r   r,     s    zgeometryDict.get_metadatageometryRadar.h5r:   r=   c          
      s  t  jdkrtd dS tdd tD } j|||d\}	}
| _t j|X}td	 j| x 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}xlt jD ]^} j|  j|  }t|  |||d}|||ddddf< |j|d	  j| d qW |  d} jf}tj}tdj	||t||d tj j|d}|j||d}qttj}| drtj}|	|
f}tdj	||t||t|d tj j||||dd |d}tj ! j| }|"ds`|drv| }td	| n|dkrd}t#||krjtj$|||k< td	| n|d kr|d	krtd!	|| || }n|d"kr|d	krtd!	|| || }n\|d#krjt%& j'}|(d$d%d&krj|(d'd("d)rjtd*	| d+|d, tj)  }|j||d|d-}qtW x fd.dd/D D ]}d}|d#kr j*|||d}n|d0kr҈ j+|||d}|dk	r|j,}tj}tdj	||t||t|d |j|||d|d1}qW  -  |rJ j.| td2	| t/0 j.| _.|| d	krzt/1 j.|| _. j2 j.d3< x" j.3 D ]\}}||j4|< qW W dQ R X td4	 j  jS )5zSave/write to HDF5 file with structure defined in:
            https://mintpy.readthedocs.io/en/latest/api/data_structure/#geometry
        r   z;No dataset file path in the object, skip HDF5 file writing.Nc             S   s   g | ]}t |qS r   )r   )r   r&   r   r   r   r   $  s    z+geometryDict.write2hdf5.<locals>.<listcomp>)r    r!   r"   z create HDF5 file {} with {} moderM   r   r   T)rB   rC   rD   rE   rF   zIcreate dataset /{d:<{w}} of {t:<25} in size of {s} with compression = {c})r>   r:   r?   r@   rA   zOread coarse grid baseline files and linear interpolate into full resolution ...)rG   )fname
full_shaper    r!   r"   )rI   rK   z2create dataset /{d:<{w}} of {t:<25} in size of {s})r>   r:   r?   r@   )rD   )rL   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   r+   r   r   zi    convert {:<15} from Gamma (from horizontal in radian) to MintPy (from vertical in degree) convention.g     V@g     f@)rL   rE   rF   c                s   g | ]}| j kr|qS r   )r;   )r   r&   )r   r   r   r     s    )r   slantRangeDistancer   )rL   rD   rE   rF   zadd extra metadata: {}rO   zFinished writing to {})5r   r1   rV   rR   r   r   rS   rT   rU   r%   r;   rQ   r'   dateListrW   r0   numDaterZ   rY   r   r\   r]   read_isce_bperp_filera   rb   re   rf   r4   r[   ri   r^   r   r   r   r   anyr_   r   r2   r   r3   r   r   r   rB   r,   r-   rk   rl   rm   r   rn   rd   )r   rS   ro   r    r!   r"   rF   rp   rq   r   r   rr   r5   rt   rs   ru   rv   r&   r   rL   ZnoDataValueDEMr   rw   rx   r   )r   r   ry     s    










zgeometryDict.write2hdf5)Nr   r   )Nr   r   )Nr   r   )NNr   r   )N)r   r:   Nr   r   r=   N)rz   r{   r|   r}   r   r^   r   r   r   r   r,   ry   r   r   r   r   r   H  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 d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 )a*  Read ISCE coarse grid perpendicular baseline file, and project it to full size
    Parameters: self : geometry object,
                fname : str, bperp file name
                outShape : tuple of 2int, shape of file in full resolution
                box : tuple of 4 int, subset range in (x0, y0, x1, y1) with respect to full resolution
    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)ordermodeZpreserve_rangeNFr   )      )nrowsncolsfigsize)axr   )r   r^   rW   nanminnanmaxwarningscatch_warningssimplefilterUserWarningr   matplotlib.pyplotpyplotsubplotsimshowcolorbarshowr   rB   )r   r   r    r!   r"   Zdata_cdata_mindata_maxrL   
debug_modepltfigax1ax2imr   r   r   r   r   r     s8    
 
 
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 )N)r)   )r   r   r   r   r   r     s    zplatformTrack.__init__c             C   s<   |  }i | _x(|D ] }|| j|kr|| | j|< qW d S )N)r'   r)   Zplatform_track)r   ZpairDictZ	platTrackr)   r$   r   r   r   getPairs  s
    
zplatformTrack.getPairsc             C   s   | j  }g }g }g }g }x||D ]t}| j | | | j | jdkr | j | j|kr || j | j || || j | j || j | j q W t|}t|}|||fS )Nr   )	r)   r'   r,   r   r   appendr   rW   median)r   r5   r)   Zpairs2r   r   filesr$   r   r   r   getSize_geometry  s    

 


zplatformTrack.getSize_geometryc             C   sf   | j  }t|| _g }g }x0|D ](}|| j | j || j | j q"W t|| _t|| _d S )N)r)   r'   r   ZnumPairsr   r   r   r   )r   r)   r   r   r$   r   r   r   getSize  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 | _xN|D ]F}| j | jd k	rdd | j | j D }tt	| jt	|B | _qW d S )Nc             S   s   g | ]}|qS r   r   )r   r$   r   r   r   r   "  s    z1platformTrack.getDatasetNames.<locals>.<listcomp>r   c             S   s   g | ]}|qS r   r   )r   kr   r   r   r   '  s    c             S   s   g | ]}|qS r   r   )r   r   r   r   r   r   .  s    c             S   s   g | ]}|qS r   r   )r   r   r   r   r   r   9  s    )
r)   r'   ZobservationsDictZdsetObservationNamesZqualityDictZdsetQualityNamesZdsetGeometryNamesr   rQ   set)r   r)   r$   r'   r   r   r   getDatasetNames  s    ""
zplatformTrack.getDatasetNamesN)r   )rz   r{   r|   r   r   r   r   r   r   r   r   r   r     s
   
r   )Nr   r   )r   rc   r   rT   numpyrW   Zskimage.transformr   ImportErrormintpy.objectsr   r   r   mintpy.utilsr   r   r   r   r	   rk   r
   r~   r   r   r   r   r   r   r   <module>   s$   	 LX  {
4