o
    8Pef\                     @   s  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 zd dlm	Z	 W n e
y/   e
dw 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 d d	lmZ ed Zed Zed
Zed
Z ejZ!dgZ"ded< e#d G dd dZ$dZ%G dd dZ&G dd dZ'dS )    N)datetime)gdal)resizezCould not import skimage!)DATA_TYPE_DICTGEOMETRY_DSET_NAMESDSET_UNIT_DICT)readfileptimeutils	attribute)read_attribute)read_binary_fileg        slcii   @c                   @   sJ   e Zd ZdZdddZdddZd	d
 Zdd Zdd Z		dddZ	dS )slcStackDicta,  
    slcStack object for a set of coregistered SLCs from the same platform and track.

    Example:
        from miaplpy.objects.insarobj import slcStackDict
        pairsDict = {('20160524','20160530'):slcObj1,
                     ('20160524','20160605'):slcObj2,
                     ('20160524','20160611'):slcObj3,
                     ('20160530','20160605'):slcObj4,
                     ...
                     }
        stackObj = slcStackDict(pairsDict=pairsDict)
        stackObj.write2hdf5(outputFile='slcStack.h5', box=(200,500,300,600))
    r   Nc                 C   s   || _ || _d S N)name	pairsDict)selfr   r    r   R/home/exouser/operations/rsmas_insar/tools/MiaplPy/src/miaplpy/objects/slcStack.py__init__:   s   
zslcStackDict.__init__   c                 C   s   t | j| _dd | j D d }| \| _|_|r/|d |d  | _|d |d  | _n|j| _|j| _t| j| | _t| j| | _| j| j| jfS )Nc                 S      g | ]}|qS r   r   .0vr   r   r   
<listcomp>A       z)slcStackDict.get_size.<locals>.<listcomp>r      r      )lenr   numSlcvaluesget_sizelengthwidthint)r   boxxstepystepslcObjr   r   r   r$   ?   s   zslcStackDict.get_sizec                 C   s    t dd | j D | _| jS )Nc                 S   r   r   r   r   dater   r   r   r   Q   r   z.slcStackDict.get_date_list.<locals>.<listcomp>)sortedr   keysdateListr   r   r   r   get_date_listP   s   zslcStackDict.get_date_listc                 C   sB   dd | j  D d }| | _d| j v r| jd | jS )Nc                 S   r   r   r   r   r   r   r   r   U   r   z-slcStackDict.get_metadata.<locals>.<listcomp>r   UNIT)r   r#   get_metadatametadatar/   pop)r   r+   r   r   r   r4   T   s
   
zslcStackDict.get_metadatac                 C   s\   dd | j  D d }|j| }t|dd dd}t}d| v r,t|d   }|S )Nc                 S   r   r   r   r   r   r   r   r   \   r   z6slcStackDict.get_dataset_data_type.<locals>.<listcomp>r   .xml.rscmetafile_ext	DATA_TYPE)	r   r#   datasetDictr   splitdataTyper/   ZdataTypeDictlower)r   dsNamer+   ZdsFiler5   
dsDataTyper   r   r   get_dataset_data_type[   s   
z"slcStackDict.get_dataset_data_typeslcStack.h5ac              	      sZ  | _ t j |}td j | tdd  j D  _t	 j jd  j
  _ fddtD  _tdd  jD }	 j|||d t j _ jD ]}
 j j jf}t}|}|
dv rktj}d	}td
j|
|	t|||d |
| v r||
 }n}|j|
|d|d |d f|d|d}tj jd}t jD ]Z} j j|  }||
\}}|sdd j jf}t|d tj}| d!t"|d t"|d  j j||ddddf< |#  j|< |j$|d d j| d d q|%  tt&& |j'd< qTd}
tj(} jdf}tdj|
|	t||d tj) j|d}|
| vr8|j|
|d d}
tj*} jf}tdj|
|	t||d tj) j|d}|
| vrd|j|
|d  +  |rq j,$| t-. j,| _,|| dkrt-/ j,|| _,d j,d<  j,0 D ]
\}}||j'|< q|%  td j   j S )a  Save/write an slcStackDict object into an HDF5 file with the structure below:

        /                  Root level
        Attributes         Dictionary for metadata
        /date              2D array of string  in size of (m, 2   ) in YYYYMMDD format for reference and secondary date
        /bperp             1D array of float32 in size of (m,     ) in meter.

        Parameters: outputFile : str, Name of the HDF5 file for the SLC 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
        z create HDF5 file {} with {} modec                 S   r   r   r   r,   r   r   r   r   y   r   z+slcStackDict.write2hdf5.<locals>.<listcomp>r   c                    s   g | ]	}| j v r|qS r   )dsNamesr   r   r1   r   r   r   {       c                 S   s   g | ]}t |qS r   )r!   rF   r   r   r   r   |   s    )r(   r)   r*   )connectComponentlzfzIcreate dataset /{d:<{w}} of {t:<25} in size of {s} with compression = {c})dwtscNr   r    T)shapemaxshapedtypechunkscompression)maxValuez.vrtz{})suffixMODIFICATION_TIMEr-   z2create dataset /{d:<{w}} of {t:<25} in size of {s})rJ   rK   rL   rM   rQ   databperp
timeseries	FILE_TYPEzFinished writing to {})1
outputFileh5pyFileprintformatr.   r   r/   dateslistr<   rE   slcDatasetNamesmaxr$   npzerosr"   rZ   r%   r&   r>   int16strcreate_datasetr	   progressBarrangereadr   OpenGA_ReadOnlyGetRasterBandReadAsArrayr'   get_perp_baselineupdateclosetimeattrsstring_arrayfloat32r4   r5   attrupdate_attribute4subsetupdate_attribute4multilookitems)r   r]   Zaccess_moder(   r)   r*   rS   Zextra_metadatafmaxDigitr@   dsShaperA   ZdsCompressiondsprog_barr   r+   fnamer5   ZdsSlcrY   keyvaluer   r1   r   
write2hdf5d   s   

<$

zslcStackDict.write2hdf5)r   N)Nr   r   )rC   rD   Nr   r   NN)
__name__
__module____qualname____doc__r   r$   r2   r4   rB   r   r   r   r   r   r   *   s    

	r   a&  
/                Root level
Attributes       Dictionary for metadata
/slc             3D array of float32 in size of (n, l, w) in meter.
/date            1D array of string  in size of (n,     ) in YYYYMMDD format
/bperp           1D array of float32 in size of (n,     ) in meter. (optional)
c                   @   sz   e Zd Z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 Z
d ddZdddZd!ddZd"ddZdS )#slcStackz
    Time-series object for displacement of a set of SAR images from the same platform and track.
    It contains three datasets in root level: date, bperp and SLCs.
    Nc                 C   s   || _ d| _t| _d S )Nr   )filer   FILE_STRUCTURE_SLCsZfile_structure)r   r   r   r   r   r      s   
zslcStack.__init__Tc                 C   s@   z| j   |rtdtj| j W d S W d S    Y d S )Nzclose slcStack file: {})r~   rt   r`   ra   ospathbasenamer   )r   	print_msgr   r   r   rt      s   
zslcStack.closerD   c                 C   s(   t d| j| t| j|| _| jS )Nopen {} in {} mode)r`   ra   r   r^   r_   r~   )r   moder   r   r   	open_hdf5   s   zslcStack.open_hdf5c                    s  |rt d jtj j        	   j
 j  _t jd&}z|d d d   _  j j j 8  _W n   d  _Y W d    n1 sSw   Y  tdd  jD  _tjdd  j j j  D tjd _dd  jD  _ fd	d jD  _d S )
Nzopen {} file: {}rrZ   c                 S   s$   g | ]}t t|d dd  qS )z%Y%m%dr      )r   ru   strptimerF   r   r   r   r        $ z!slcStack.open.<locals>.<listcomp>c                 S   s   g | ]}|j qS r   )daysrF   r   r   r   r     s    rW   c                 S   s$   g | ]}|j | jd  d  qS )r   g     v@)year	timetupletm_ydayrF   r   r   r   r     r   c                    s   g | ]	}d   j|qS )z{}-{})ra   r   rF   r1   r   r   r     rG   )r`   ra   r   r   r   r   r   r4   r$   r2   r%   r&   numPixelr^   r_   pbaserefIndexrf   rx   r0   timesry   tbaseyearList	sliceList)r   r   r~   r   r1   r   open  s*   zslcStack.openc                 C   s   t | jd}t|j| _|d d d  }W d    n1 s w   Y  | j D ]\}}z
|d| j|< W q*   || j|< Y q*dd |D }d| j vrX|d | jd< |	| jd | _
|d | jd< |d	 | jd
< | jS )Nr   r-   utf8c                 S      g | ]}| d qS r   decoderF   r   r   r   r   $      z)slcStack.get_metadata.<locals>.<listcomp>REF_DATEr   
START_DATEEND_DATE)r^   r_   r   dictrv   r5   r}   r   r/   indexr   )r   r~   rb   r   r   r0   r   r   r   r4     s    zslcStack.get_metadatar   c                 C   sn   t | jd}|| j j\| _| _| _W d    n1 sw   Y  | j| | _| j| | _| j| j| jfS )Nr   )r^   r_   r   r   rO   numDater%   r&   )r   r)   r*   r~   r   r   r   r$   ,  s   zslcStack.get_sizec                 C   sT   t | jd}dd |d d d  D | _W d    | jS 1 s"w   Y  | jS )Nr   c                 S   r   r   r   rF   r   r   r   r   7  r   z*slcStack.get_date_list.<locals>.<listcomp>r-   )r^   r_   r   r0   )r   r~   r   r   r   r2   5  s   
zslcStack.get_date_listc           	      C   s:  |rt d|| j | jdd |r|dkrg }nt|tr"|g}dd |D }t| jdc}|| j }t|tj	rA|| j }t
j| jt
jd}|sSd	|d
d
< n|D ]
}d	|| j|< qU|d
u rldd| j| jg}|t
|d	kd |d |d |d |d f }t
|}W d
   |S 1 sw   Y  |S )a  Read dataset from slc file
        Parameters: self : slcStack object
                    datasetName : (list of) string in YYYYMMDD format
                    box : tuple of 4 int, indicating x0,y0,x1,y1 of range
        Returns:    data : 2D or 3D dataset
        Examples:   from miaplpy.objects import slcStack
                    tsobj = slcStack('slcStack.h5')
                    data = tsobj.read(datasetName='20161020')
                    data = tsobj.read(datasetName='20161020', box=(100,300,500,800))
                    data = tsobj.read(datasetName=['20161020','20161026','20161101'])
                    data = tsobj.read(box=(100,300,500,800))
        z reading box {} from file: {} ...Fr   r   c                 S   s    g | ]}| d d ddqS )r    -)replacerF   r   r   r   r   P  s     z!slcStack.read.<locals>.<listcomp>r   rW   TNr   r   r   r    )r`   ra   r   r   
isinstanceri   r^   r_   r   Grouprf   rg   r   bool_r0   r   r&   r%   wheresqueeze)	r   datasetNamer(   r   r~   r   dateFlagerY   r   r   r   rm   :  s2   


4
zslcStack.readc                 C   s   t d t d| j t| jd}| D ](}t dj|t|| d || d d |j||| d || d d|d	 qt|}d
|d< | D ]	}|| |j	|< qLt d| j |
  | jS )Nz2--------------------------------------------------zcreate HDF5 file {} with w moderK   z1create dataset: {d:<25} of {t:<25} in size of {s}r   r   )rJ   rL   rM   T)rO   rQ   rR   rS   r[   r\   close HDF5 file {})r`   ra   r   r^   r_   r/   ri   rj   r   rv   rt   )r   Z
dsNameDictr5   rS   r~   r   r   r   r   layout_hdf5g  s,   


zslcStack.layout_hdf5c                 C   st  |du rDt |trt|f}n|j}t|dkrd|d g}n%t|dkr0d|d d|d g}nt|dkrDd|d d|d d|d g}td| j| t| j|}td|| t|dkr~||| |d |d |d |d |d	 |d
 f< n-t|d	kr||| |d |d |d |d f< nt|dkr||| |d |d < |	  td| j | jS )a  Write data to existing HDF5 dataset in disk block by block.
        Parameters: data : np.ndarray 1/2/3D matrix
                    datasetName : str, dataset name
                    block : list of 2/4/6 int, for
                        [zStart, zEnd,
                         yStart, yEnd,
                         xStart, xEnd]
                    mode : str, open mode
        Returns: self.file
        Nr   r   r    r   r   z!writing dataset /{:<25} block: {}      r   r   )
r   rc   r!   rO   r`   ra   r   r^   r_   rt   )r   rY   r   blockr   rO   r~   r   r   r   write2hdf5_block  sD   
zslcStack.write2hdf5_blockc                 C   s  |s| j }|rKt|}|jdd |du r|j}|du r|j}|du r&|j}|du rEt|d}	|	d j}W d   n1 s@w   Y  |j	dd t
j|dd}t
j|t
jd}t
j|t
jd}t|}d|d	< td
| t|d}
tdjt|j|j|d |
jd|d|d tdt|j|j |
jd|d |jdkrtdt|j|j |
jd|d | D ]\}}t||
j|< q|
	  td| |S )a  
        Parameters: data  : 3D array of float32
                    dates : 1D array/list of string in YYYYMMDD format
                    bperp : 1D array/list of float32 (optional)
                    metadata : dict
                    outFile : string
                    refFile : string
                    compression : string or None
        Returns: outFile : string
        Examples:
            from mintpy.objects import slcStack

            ##Generate a new slcStack file
            tsobj = slcStack('slcStack.h5')
            tsobj.write(data, dates=dateList, bperp=bperp, metadata=atr)

            ##Generate a slcStack with same attributes and same date/bperp info
            tsobj = slcStack('slcStack_modified.h5')
            tsobj.write(data, refFile='slcStack.h5')
        Fr   Nr   r   c16rW   r[   r\   z)create slcStack HDF5 file: {} with w moderK   zGcreate dataset /slcStack of {t:<10} in size of {s} with compression={c})rL   rM   rN   T)rY   rR   rS   z1create dataset /date      of {:<10} in size of {}r-   rX   r   z2create dataset /bperp      of {:<10} in size of {}rZ   zfinished writing to {})r   r   r   r5   r0   r   r^   r_   rS   rt   rf   rx   rw   ry   r   r`   ra   ri   rQ   rO   rj   r}   rv   )r   rY   outFilerb   rZ   r5   refFilerS   refobjrfr~   r   r   r   r   r   r     sN   

zslcStack.write2hdf5r   )T)rD   )r   r   )NNT)NrD   )NNNNNN)r   r   r   r   r   rt   r   r   r4   r$   r2   rm   r   r   r   r   r   r   r   r      s    


	

	

-
0r   c                   @   sJ   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S )slcDictal  
    SLC object. It includes dataset name (family) of {'slc'}

    Example:
        from mintpy.objects.insarobj import slcDict
        datasetDict = {'slc'     :'$PROJECT_DIR/merged/SLC/20151220/20151220.slc.full',
                      }
        slcObj = slcDict(dates=('20160524','20160530'), datasetDict=datasetDict)
        data, atr = slcObj.read('slc')
    r   Nc                 C   sR   || _ || _|| _d | _d | _d | _|d ur%| D ]\}}t| || qd S d S r   )r   r-   r<   platformtrack	processorr}   setattr)r   r   rb   r<   r5   r   r   r   r   r   r     s   zslcDict.__init__c                 C   s   | j | dd }d }t|tr|d dd }nt|tr'|dd }t||dd}tjtj	|d 
 }|dv r_t|d t|d	 }}	|sUdd|	|f}tj|||d
}
|
S t||dd}||fS )Nr7   r   r   r8   )r   r:   r   )z.h5z.he5LENGTHWIDTH)r   r(   T)r   Zattributes_only)r<   r=   r   rc   ri   r   r   r   splitextr   r?   r'   r   read_hdf5_filer   )r   familyr(   r   r   
dsname4atratrfextr%   r&   rY   r5   r   r   r   rm     s    

zslcDict.readc                 C   sL   | j | dd | _t| jdd}t|d | _t|d | _| j| jfS )Nr7   r   r8   r9   r   r   )r<   r=   r   r   r'   r%   r&   r   r   r5   r   r   r   r$   -  s
   zslcDict.get_sizec                 C   sX   | j | dd | _t| jdd}t|d | _t|d | _| j| j d | _| jS )Nr7   r   r8   r9   P_BASELINE_TOP_HDRP_BASELINE_BOTTOM_HDRg       @)r<   r=   r   r   floatZ	bperp_topZbperp_bottomrZ   r   r   r   r   rr   4  s   zslcDict.get_perp_baselinec                 C   sp   | j | dd | _t| jdd| _t| jd | _t| jd | _| jr,| j| jd< | j	r5| j	| jd< | jS )	Nr7   r   r8   r9   r   r   ZTRACKPLATFORM)
r<   r=   r   r   r5   r'   r%   r&   r   r   )r   r   r   r   r   r4   <  s   zslcDict.get_metadata)NN)r   )	r   r   r   r   r   rm   r$   rr   r4   r   r   r   r   r     s    


r   )(r   ru   r^   numpyrf   r   osgeor   skimage.transformr   ImportErrormintpy.objectsr   r   r   mintpy.utilsr   r	   r
   utr   rz   Zmiaplpy.objects.utilsr   r   r   Z	BOOL_ZEROrh   ZINT_ZEROry   Z
FLOAT_ZERO	complex64ZCPX_ZEROr>   rd   SetCacheMaxr   r   r   r   r   r   r   r   <module>   s<   	




 8  