
    ZfL                         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 Zd Zd Zd Zd Zej"                  fdZdd	Zd
 Zy)    N)	attributeptimereadfileutils	writefilec                     t         d         }t         d         }t         fddD              rOt         d         }t         d         }t         d         }t         d         }|||z  z   }|||z  z   }||||f}	nd	}	t         fd
dD              r:t         d         t         d         t         d         t         d         f}
|
|	fS d	}
|
|	fS )zGet Coverage Box of data in geo and pixel coordinates.

    Parameters: atr     - dict, meta data dictionary
    Returns:    pix_box - 4-tuple of int, defining in (UL_X, UL_Y, LR_X, LR_Y)
                geo_box - 4-tuple of float in lat/lon
    LENGTHWIDTHc              3   B   K   | ]  }|j                         v   y wNkeys.0xatrs     F/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/subset.py	<genexpr>z#get_coverage_box.<locals>.<genexpr>#   s     
Oq1
?
Os   )Y_STEPX_STEPY_FIRSTX_FIRSTr   r   r   r   Nc              3   H   K   | ]  }d | j                         v   yw)SUBSET_Nr   r   s     r   r   z#get_coverage_box.<locals>.<genexpr>/   s"     
Q1WQC=CHHJ&
Qs   ")YMINXMINYMAXXMAXSUBSET_XMINSUBSET_YMINSUBSET_XMAXSUBSET_YMAX)intallfloat)r   lengthwidthlat_steplon_stepul_latul_lonlr_latlr_longeo_boxpix_boxs   `          r   get_coverage_boxr0      s    XFGE 
O$N
OOX'X's9~&s9~&(6/)(5.(6662 
Q0P
QQM"#M"#M"#M"#	
 G G    c                    d\  }}t        j                  |       }d}||j                         v r||   j                  dd      j                  dd      }|j                  dd      }|j	                  d      D cg c]  }|j                          }}t        |      dk(  rd	 |D        \  }}	}
}|
|||	f}d
}||j                         v r||   j                  dd      j                  dd      }|j                  dd      }|j	                  d      D cg c]  }|j                          }}t        |      dk(  rd |D        \  }}}}||||f}||fS c c}w c c}w )zRead mintpy.subset.lalo/yx option from template file into box type.

    Parameters: template_file - str, path to the template file
    Returns     pix/geo_box   - tuple of 4 int or None
    )NNzmintpy.subset.yx[ ]:,   c              3   2   K   | ]  }t        |        y wr   )r#   r   is     r   r   z+read_subset_template2box.<locals>.<genexpr>R   s     ;c!f;   zmintpy.subset.laloc              3   2   K   | ]  }t        |        y wr   )r%   r:   s     r   r   z+read_subset_template2box.<locals>.<genexpr>_   s     %E1eAh%Er<   )r   read_templater   replacesplitstriplen)template_filer/   r.   tmplkeyopt_strr;   opt_str_listy0y1x0x1lat0lat1lon0lon1s                   r   read_subset_template2boxrP   <   sd    "GW !!-0D C
diiks)##C+33C;//#c*+2==+=>a	>>|!;l;NBB2r2&G C
diiks)##C+33C;//#c*+2==+=>a	>>|!%E%E"D$dT4.GG% ? ?s   9EEc                     |r|d   |d   g| _         |d   |d   g| _        nd| _         d| _        |r |d   |d   g| _        |d   |d   g| _        | S d| _        d| _        | S )z9Update inps.subset_y/x/lat/lon from pixel_box and geo_boxr            N)
subset_lon
subset_latsubset_xsubset_y)inpsr/   r.   s      r   subset_box2inpsrZ   e   s    "1:wqz2"1:wqz2 WQZ0 WQZ0 K Kr1   c                    t        | d   |d         }t        | d   |d         }t        | d   |d         }t        | d   |d         }||k\  s||k\  rd}|d|  dz  }|d| dz  }t        |      ||||f}|d   | d   z
  |d   | d   z
  |d   | d   z
  |d   | d   z
  f}|d   |d   z
  |d   |d   z
  |d   |d   z
  |d   |d   z
  f}	||	fS )	a{  Get index box overlap area of two input boxes.

    Parameters: box1/2             - 4-tuple of int, indicating coverage of box1/2
                                     defining in (x0, y0, x1, y1)
    Returns:    overlap_idx_box1/2 - 4-tuple of int, indicating index of overlap area in box1/2
                                     defining in (idx_x0, idx_y0, idx_x1, idx_y1)
    r   rS   rR   rT   z(No overlap between two input box range!
zbox 1: 
zbox 2: )maxmin
ValueError)
box1box2rJ   rH   rK   rI   msgoverlap_boxoverlap_idx_box1overlap_idx_box2s
             r   get_box_overlap_indexrf   v   sF    
T!Wd1g	B	T!Wd1g	B	T!Wd1g	B	T!Wd1g	B	Rx289b!!b!!or2r"K $Aa0#Aa0#Aa0#Aa02
 $Aa0#Aa0#Aa0#Aa02
 ---r1   c                 V   t        t        |d               }t        t        |d               }t        j                  |      }d|j	                         v rd}nd}|r| j                  dd      r|j                  | d   d      d   }nd|g}| j                  d	d      r|j                  d| d	         d
   }nd|g}t        |      }t        |      }|d   |d   |d
   |d
   f}|j                  |      }	||	fS | j                  dd      rF| d	   d   | d   d
   | d	   d
   | d   d   f}	|j                  |	d      }|j                  |	      }||	fS | d   r| d   }nd|g}| d   r| d   }nd|g}t        |      }t        |      }|d   |d   |d
   |d
   f}|j                  |      }	||	fS )a  Convert subset inputs dict into box in radar and/or geo coord.
    Parameters: subset_dict - dict, including the following 4 objects:
                              subset_x   : list of 2 int,   subset in x direction,   default=None
                              subset_y   : list of 2 int,   subset in y direction,   default=None
                              subset_lat : list of 2 float, subset in lat direction, default=None
                              subset_lon : list of 2 float, subset in lon direction, default=None
                meta_dict   - dict, including the following items:
                              'WIDTH'      : int
                              'LENGTH': int
                              'X_FIRST'    : float, optional
                              'Y_FIRST'    : float, optional
                              'X_STEP'     : float, optional
                              'Y_STEP'     : float, optional
    Returns:    pix_box     - 4-tuple of int, in pixel unit of 1, in (x0, y0, x1, y1)
                geo_box     - 4-tuple of float, in lat/lon unit (degree)
                              None if file is in radar coordinate.
    Examples:
        subset_dict = {'subset_x': None, 'subset_y': None, 'subset_lat': [30.5, 31.0], 'subset_lon': [130.0, 131.0]}
        subset_dict = {'subset_x': [100, 1100], 'subset_y': [2050, 2550], 'subset_lat': None, 'subset_lon': None}
        pix_box          = subset_input_dict2box(subset_dict, meta_dict)[0]
        pix_box, geo_box = subset_input_dict2box(subset_dict, meta_dict)
    r
   r	   r   TFrV   Nr   rU   rS   )bufrX   rW   )
r#   r%   ut
coordinater   getlalo2yxsortedbox_pixel2geobbox_geo2radar)
subset_dict	meta_dictr'   r&   coordgeocoded_flagsub_ysub_xr/   r.   s
             r   subset_input_dict2boxrv      s!   2 i()*Ey*+,F MM)$EINN$$??<.MM+l";TB1EEKE??<.MM$L(AB1EEJE uu8U1XuQxq: %%g.6 G/ ??<."<03[5Nq5QS^_kSlmnSoq|  ~J  rK  LM  rN  OG**7*:G**73G( G# :&#J/F:&#J/E
5ME5MEQxq58U1X>G ))'2GGr1   c           
      .   t        d| d| dt        j                  j                  |        d       t	        j
                  | ||d      d   }|j                  }t        |      }|dk(  rPt        j                  |d	   |d
   z
  |d   |d   z
  f|j                        |z  }	||	|d
   |d	   |d   |d   f<   |	S |d	k(  rUt        j                  |d   |d	   |d
   z
  |d   |d   z
  f|j                        |z  }	||	d d |d
   |d	   |d   |d   f<   	S )Nzreading z in z from  ...F)datasetNamebox	print_msgr   rR   rT   rS   )printospathbasenamer   readshaperB   nponesdtype)
fnamedsNamer/   pix_box4datapix_box4subset
fill_valuedatads_shapeds_ndimdata_outs
             r   subset_datasetr      s|    
HVHDfRWW5E5Ee5L4MT
RS==FPUVWXYDzzH(mG !|77GAJ3#AJ35::')34 9= 	">!#44">!#445 	6 O 
A77HQK#AJ3#AJ35  ::' *44 9= 	">!#44">!#445 	6 Or1   c                 J   t        j                  |       }t        |d         }t        |d         }t        d|d    d|  d       |j	                         }t        ||      \  }}t        j                  |      }	d}
d|j                         v r|d   rd	}
nd}
|
s$|	j                  |      }t        j                  |d<   |	j                  |      }d
d
||f}t        d|        t        d|        t        d|	j                  |              t        d|        ||k(  rt        d       | S t        ||      \  }}|st        j                         t        j                   j#                  t        j                   j%                  |             k(  rdd|j                         v r/|d   r*t        j                   j'                  |       \  }}| d| }nBdt        j                   j)                  |       z   }nt        j                   j)                  |       }t        d|z          t+        j,                  ||      }t        j.                  |       }t        j                   j'                  |       d   }t        j                   j'                  |      d   }|dv r|dv rt1        j2                  |||        n
t5               }|D ]z  }t7        j8                  | d      5 }||   }|j:                  }|j<                  }t        dj?                  ||t        j                   j)                  |                    |dk(  r||d   |d   |d
   |d   f   }t        j@                  |d   |d   z
  |d   |d
   z
  f|jB                        |d   z  }|||d   |d   |d
   |d   f<   t        jD                  ||jB                        }|dv r:d
t        |d         d
t        |d         g}t1        jF                  ||||d	       n5||<   n.|dk(  r(|dvrtI        d| d      tK        jL                  |d
          }tO        |d
         D ]  }|||d   |d   |d
   |d   f   }t        j@                  d|d   |d   z
  |d   |d
   z
  f|jB                        |d   z  }||d!d!|d   |d   |d
   |d   f<   ||dz   d
t        |d         d
t        |d         g}t1        jF                  ||||d       |jQ                  |dz   |dz    d"|d
    #        |jS                          t        d$|        d!d!d!       } |dvrt1        jT                  ||%       |S t5               }|D ]  }tW        | |||||d   &      ||<    tY        |j                               |d'<   t1        jT                  |||| (       |dvrZt        j                   j[                  | d)z         s"t        j                   j[                  | d*z         rt1        j\                  ||       |S # 1 sw Y   cxY w)+ai  Subset file with
    Parameters: fname       - str, path/name of file
                subset_dict - dict, subsut parameter, including the following items:
                    subset_x   : list of 2 int,   subset in x direction,   default=None
                    subset_y   : list of 2 int,   subset in y direction,   default=None
                    subset_lat : list of 2 float, subset in lat direction, default=None
                    subset_lon : list of 2 float, subset in lon direction, default=None
                    tight      : bool, tight subset or not, for lookup table file, i.e. geomap*.trans
                    fill_value : float, optional. filled value for area outside of data coverage. default=None
                                 None/not-existed to subset within data coverage only.
                out_file    - str, path/name of output file
    Returns:    out_file    - str, path/name of output file
                              default: add prefix 'sub_',   if fname     in the current directory;
                                       keep the same fname, if fname not in the current directory.
    r
   r	   zsubset 	FILE_TYPEz file: rx   Fr   Tr   zdata   range in (x0,y0,x1,y1): zsubset range in (x0,y0,x1,y1): zdata   range in (W, N, E, S): zsubset range in (W, N, E, S): z7Subset range == data coverage, no need to subset. Skip.tight_tightsub_zwriting >>> rS   )z.h5z.he5)metadataref_filerz cropping {d} in {b} from {f} ...)dbfrR   rT   )r   )r   ry   blockr{   zWriting 3D dataset z# into binary file is NOT supported!)maxValueN/)suffixzfinished writing to file: )out_filer   )r   BANDS)r   r   r   z.xmlz.aux.xml)/r   read_attributer#   r|   copyrv   ri   rj   r   check_box_within_data_coverager   nanrn   rf   r}   getcwdr~   dirnameabspathsplitextr   attrupdate_attribute4subsetget_dataset_listr   layout_hdf5dicth5pyFiler   ndimformatr   r   arraywrite_hdf5_blockr_   r   progressBarrangeupdateclosewriter   rB   isfilewrite_isce_xml)r   subset_dict_inputr   r   r'   r&   rp   r/   r.   rr   outfilldata_boxr   r   fbasefextdsNamesin_extout_extdsDictr   fidsr   r   r   r   r   prog_barr;   s                                 r   subset_filer     s   $ 
!
!%
(CGEXF	GC$%WUG4
89#((*K,[#>GWMM#E G{''))k,.G66w?$&FFL!!!'*G1eV$H	+H:
67	+G9
56	*5+>+>x+H*I
JK	*7)
45(GH $97#K L. 99;"''//"''//%*@AA+**,,W1E gg..u5t#WF4&1!"''"2"25"99ww''.H	.
!" 
&
&sG
4C ''.GWWe$Q'Fggx(+G  o%!!(S5IVF  D	CF5#& CC"Z88''8??"gg&&u- @ / 0
 a<l1ol1o=*1ol1o=> ?D  "ww
WQZ(?(/
WQZ(?(A'+zz 35@5N OH EI ^A.~a/@@+A.~a/@@A B!xx

CH /1!"CH$63s7|;L M!22$!)(."'&*, *2v\o5(+>vhFi)jkk$00(1+FH"8A;/ L!!".q/,q/"A".q/,q/"A#B  C
 $&77A,3AJ,C,3AJ,C,E ,0::$7 :E\9R$S IM !!/!2>!3D!D!/!2>!3D!D"E F
 "#AaCCH,>3s7|CT U!22$!)(."'&+- !!qse1Xa[M4JK1L2 NN$6xjABGCC CCD	CN /)OOFXD, O%  	F+&|4F6N	 6;;=)GC%P /)rww~~eFl/Krww~~^cdn^nOo$$S(3O{CC CCs   IXX"	c                    t        d | j                  | j                  | j                  | j                  fD              r| j
                  rGt        j                  | j
                        }t        |      \  }}t        d| j
                  z          nd| j                  r2t        | j                        \  }}t        d| j                  z          n&| j                  rt        j                  | j                        | _        | j                  st!        d      t        j                  | j                        }t        j"                  |      }d|j%                         v rt        j&                  | j                  d      d   }t)        j*                  |d	      \  }}t)        j,                  ||t)        j.                  |      j1                            k7        \  }	}
t)        j2                  |
      d
z
  t)        j2                  |	      d
z
  t)        j4                  |
      d
z   t)        j4                  |	      d
z   f}|j7                  |      }~nt        j&                  | j                  d      d   }t        j&                  | j                  d      d   }t)        j8                  |      t)        j:                  |      t)        j:                  |      t)        j8                  |      f}d }~~nt!        d      t=        | ||      } | S )Nc              3   "   K   | ]  }|  	 y wr    r:   s     r   r   z'read_aux_subset2inps.<locals>.<genexpr>  s      -Qq5 -s   zusing subset info from z<No lookup file found! Can not use --tight option without it.r   r   )ry   r   T)return_inverse
   latitude	longitudezNo subset inputs found!)r$   rW   rX   rV   rU   	referencer   r   r0   r|   rC   rP   r   ri   get_lookup_filelookup_file	Exceptionrj   r   r   r   uniquewherebincountargmaxr^   r]   rn   nanminnanmaxrZ   )rY   ref_atrr/   r.   atr_lutrr   rg_lut	rg_uniquerg_posidx_rowidx_collatlons                r   read_aux_subset2inpsr     s]     -4====????, - -
 >>--dnn=G/8GW+DNN:; 78J8JKGW+D,>,>>? ZZ!11$2B2BCD## ^__--d.>.>?GMM'*EGLLN*!t'7'7WMaP$&IIfT$J!	6#%88FiF@S@Z@Z@\6],]#^ 66'?R/21E66'?R/21EG--g6 mmD$4$4*MaPmmD$4$4+NqQ99S>299S>99S>299S>;566 tWg6Kr1   r   )r}   r   numpyr   mintpy.utilsr   r   r   r   r   ri   r   r0   rP   rZ   rf   rv   r   r   r   r   r   r1   r   <module>r      sV    
   "J&R"".LPh UWTZTZ :qh0r1   