
    Zf                     $    d Z ddlZg dZ	 	 ddZy)zUtilities for ramps.    N)linearlinear_rangelinear_azimuth	quadraticquadratic_rangequadratic_azimuthc           
      
   | j                   }|dd \  }}	||	z  }
t        |      dk(  rOt        j                  | dd      } | j	                  |
d      } t        j
                  | d      j                         }n5| j	                  dd      } t        j                  |       j                         }|'t        j                  ||	ft        j                        }|dk7  j                         }~|t        j                  |       z  }|r||d	k7  z  }~|rt        j                  |      |kD  rt        t        j                  t        j                  t        j                  |      |z                    }|dkD  r`t        j                  ||	ft        j                         }d|t        |d
z        d|t        |d
z        d|f<   ||j                         z  }~t        j"                  t        j$                  d|	      t        j$                  d|            \  }}t        j                  |t        j                        j	                  dd      }t        j                  |t        j                        j	                  dd      }t        j                  |j                   t        j                        }|dk(  rt        j&                  |||f      }n|dk(  r%t        j&                  |d
z  |d
z  ||z  |||f      }n|dk(  rt        j&                  ||f      }nm|dk(  rt        j&                  ||f      }nP|dk(  rt        j&                  |d
z  ||f      }n/|dk(  rt        j&                  |d
z  ||f      }nt)        d|       t        j*                  t        j,                  j/                  ||ddf   d      | |ddf         }t        j*                  ||      }t        j                  || j0                        }|t3        |d      5 }t5        |j6                  j                   d         D ]Q  }dj9                  |j6                  |ddf   D cg c]  }t;        |      d c}      }|j=                  | d       S 	 ddd       rDt?        fddD              r0t        d         t        d         }}||	z  |z   }|||ddf   z  }|rd|| dk(  <   | |z
  }t        |      dk(  r.t        j                  |dd      }t        j                  |dd      }|j	                  |      }|j	                  |      }||fS c c}w # 1 sw Y   xY w)a  Remove ramp from input data matrix based on pixel marked by mask
    Ignore data with nan or zero value.
    Parameters: data       : 2D / 3D np.ndarray, data to be derampped
                             If 3D, it's in size of (num_date, length, width)
                mask_in    : 2D np.ndarray, mask of pixels used for ramp estimation
                ramp_type  : str, name of ramp to be estimated.
                metadata   : dict, containing reference pixel info, REF_Y/X
                max_num_sample : float, max number of pixel sample,
                             above which the uniform sampling is applied to reduce sample size
                coeff_file : str, path to the text file to save the estimated ramp coefficients
                ignore_zero_value : bool, ignore pixels with zero values, default is True
                             Recommend: True for phase data and False for offset data
    Returns:    data_out   : 2D / 3D np.ndarray, data after deramping
                ramp       : 2D / 3D np.ndarray, estimated ramp
    N   r   )axis   )dtypeg           r   r   r   r   r   r   zun-recognized ramp type: gV瞯<)rcondaz    z16.6e
c              3   B   K   | ]  }|j                         v   y w)N)keys).0keymetadatas     L/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/objects/ramp.py	<genexpr>zderamp.<locals>.<genexpr>p   s     L3x}}.Ls   )REF_XREF_Yr   r   ) shapelennpmoveaxisreshapemeanflattenarrayonesfloat32isnansumintceilsqrtzerosbool_meshgridarangehstack
ValueErrordotlinalgpinvr   openrangeTjoinfloatwriteall)datamask_in	ramp_typer   max_num_sample
coeff_fileignore_zero_valuedshapelengthwidth	num_pixeldmeanmaskstepsample_flagxxyyr%   GXrampfic	coeff_strref_yref_xref_idxdata_outs      `                         r   deramprW      s   " ZZF23KMFEI 6{a{{4B'||Ir*2&..0||B"&&(
 ''65/<qL!!#D 	RXXe_D "&&,7277277266$<.#@ABC!8((FE?"((CK-. DF)T)DF)T)* +K''))D [[1e,1f-/FB	"BJJ	'	/	/A	6B	"BJJ	'	/	/A	6B772882::.DHIIr2tn%	k	!IIr1ub!eRUBD9:	n	$IIr4j!	&	&IIr4j!	'	'IIr1ub$'(	)	)IIr1ub$'(4YK@AA 	ryy~~aaj~6T1WFA66!Q<D88D

+D *c" 	*a13399Q<( *"KKacc!A#h(OE!HU+;)<(OP	9+R()*	* CL:KLL8G,-s8G3D/Eu%-%'WaZ   TQYd{H
6{a{{4Q';;xQ/<<D'HT>' )P	* 	*s   AUT?"U?UU)Nr   Ng    .ANT)__doc__numpyr   	RAMP_LISTrW        r   <module>r]      s$     	 bf!gr\   