o
    <c                      @   sd   d dl Z d dlZd dlmZ d dlZd dlmZ d dlm	Z	 dZ
dde
dfddZG d	d
 d
ZdS )    N)datetime)
coordinate)readfilez0/data/lxr/insarlab/GPS/CGPS/IndexForStations.txtTc                 C   s>  t j|tdddddt}|dddf }|ddddf t jj\}}|t |d	 d	 8 }t d
d |dddf tD }	t dd |dddf tD }
|| d k|| d k || d k || d k }|rt	|gd d }||
|k9 }|rt	|gd d }||	|k9 }|| || || fS )aH  Used for search available GPS sites within the geo bounding box from CGPS database
     Parameters: SNWE       : tuple of 4 float, indicating (South, North, West, East) in degrees
                start_date : string in YYYYMMDD format
                end_date   : string in YYYYMMDD format
                site_list_file : string.
                min_num_solution : int, minimum number of solutions available
    Returns:    site_names : 1D np.array of string for GPS station names
                site_lats  : 1D np.array for lat
                site_lons  : 1D np.array for lon
    ,   )r   r                  GBKdtype	delimiterskiprowsusecolsencodingNr   r   g     v@c                 S      g | ]}t |d qS z%Y%m%ddtstrptime.0i r   H/home/exouser/operations/rsmas_insar/tools/MimtPy/mimtpy/objects/cgps.py
<listcomp>&       zsearch_gps.<locals>.<listcomp>r	   c                 S   r   r   r   r   r   r   r   r   '   r   r
   r   )
nploadtxtstrastypefloat32Troundarrayptimedate_list2vector)SNWE
start_dateend_datesite_list_fileZ	pring_msgtxt_data
site_names	site_lons	site_latst_startt_endidxt0t1r   r   r   
search_gps   s$   "&&

r6   c                   @   s\   e Zd ZdZdddZdddZddd	ZdddZddedefddZ	dde
fddZdS )CGPSax  GPS class for CGPS velocity
    Example:
      import matplotlib.pyplot as plt
      from mimtpy.objects.cgps import CGPS
      from mintpy.utils import utils as ut
      gps_obj = GPS(site='GV05', data_dir='~/insarlab/GPS')
      gps_obj.open()
      vel_los = ut.enu2los(gps_obj.vel_e,
                           gps_obj.vel_n,
                           gps_obj.vel_u)
    /data/lxr/insarlab/GPS/CGPS/c                 C   s   || _ || _d| _d| _d S )Nz6GNSS data products of China earthquake adiministrationz'/data/lxr/insarlab/GPS/CGPS/GPS_vel.txt)sitedata_dirsourcefile)selfr9   r:   r   r   r   __init__E   s   
zCGPS.__init__Tc                 C   s&   t j| jstd| j|d d S )N3GPS velocity dataset cannot be found. Please check!	print_msg)ospathisfiler<   	Exceptionread_velocity)r=   rA   r   r   r   openL   s   z	CGPS.openc                 C   sv  |rt d tj| jstdtj| jtddddd	t}|ddd	f }|| j
k}t|ddd
f | | _t|dddf | | _t|dddf | d | _t|dddf | d | _t|dddf | d | _t|dddf | d | _|dddf | 	tjd	 d | _|dddf | 	tjd	 d | _| j| j| j| j| j| j| j| jfS )zread velocity datasetzRead velocity datasetr?   r   r   )
r   r   r   r   r	   r
   r         	   r   r   Nr   r   r   r   d   rH   r	   r
   rI   rJ   )printrB   rC   rD   r<   rE   r   r    r!   r"   r9   floatsite_latsite_lonvel_estd_evel_nstd_nfloat64vel_ustd_u)r=   rA   datar.   Zid_positionr   r   r   rF   Q   s&   
&&zCGPS.read_velocityFc                 C   s   | j }| j}t|trQt|}t||d}|j|||ddd \}}|||d |d f}	tj|d|	|dd d }
tj|d	|	|dd d }t	
|}|
|fS t|trst	j|d|d
}
t|d }|d dkrot	
|}|
|fS td|)N)lookup_filer@   r   r   r   incidenceAngle)datasetNameboxrA   )r   r   azimuthAngle)	dimensionrA   HEADING     f@g     F@z)input geom_obj is neight str nor dict: {})rN   rO   
isinstancer!   r   read_attributer   	geo2radarreadutazimuth2heading_angledictincidence_anglerM   
ValueErrorformat)r=   geom_objrA   latlonatrcoordyxr[   	inc_angleaz_angle
head_angler   r   r   get_los_geometryj   s$   





zCGPS.get_los_geometryenu2losrq   rs   c                 C   s  |t jd 9 }|t jd 9 }t |t | d t |t | t |g}| }|dv r1n|dv r:d|d< n|dv rGd|d< d|d	< ntd
t| | j|d  | j|d	   | j	|d   | _
| j|d  d | j|d	  d  | j|d  d  d | _| j
| jfS )a)  Convert displacement in ENU to LOS direction
        Parameters: inc_angle  : float, local incidence angle in degree
                    head_angle : float, satellite orbit heading direction in degree
                        from the north, defined as positive in clock-wise direction
                    gps_comp   : string, GPS components used to convert to LOS direction
        Returns:    dis_los : 1D np.array for displacement in LOS direction
                    std_los : 1D np.array for displacement standard deviation in LOS direction
        r_   ru   )en2loshz2losg        r   )u2losup2losr   r   zUn-known input gps components:g      ?)r   pisincoslowerrh   r!   rP   rR   rU   vel_losrQ   rS   rV   std_los)r=   rq   rs   gps_compunit_vecr   r   r   displacement_enu2los   s8   


zCGPS.displacement_enu2losr   c                 C   s"   |  |\}}| j|||d dS )a  Read GPS velocity in LOS direction
            Parameters: geom_obj : dict / str, metadata of InSAR file, or geometry file path
                        gps_comp   : string, GPS components used to convert to LOS direction
            Retruns:    vel   : 1D np.array of displacement in meters
                        std   : 1D np.array of displacement uncertainty in meters
            )r   N)rt   r   )r=   rj   r   rA   rq   rs   r   r   r   read_gps_los_velocity   s   zCGPS.read_gps_los_velocityN)r8   )T)Frw   )ru   F)__name__
__module____qualname____doc__r>   rG   rF   rt   rM   r   r!   r   r   r   r   r   r7   8   s    



&r7   )rB   codecsr   r   numpyr   mintpy.objects.coordr   mintpy.utilsr   ZCGPS_datasetr6   r7   r   r   r   r   <module>   s   
#