U
    }-_                      @   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   sB  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 }|rt	|gd d }||
|k9 }|r,t	|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   s   g | ]}t |d qS z%Y%m%ddtstrptime.0i r   I/home/centos/operations/rsmas_insar/sources/MimtPy/mimtpy/objects/cgps.py
<listcomp>&   s     zsearch_gps.<locals>.<listcomp>r	   c                 S   s   g | ]}t |d qS r   r   r   r   r   r   r   '   s     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$    "&&

r4   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eedddZ	de
d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)selfr7   r8   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;   r?   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   rF   r	   r
   rG   rH   )printr@   rA   rB   r:   rC   r   r   r   r    r7   floatsite_latsite_lonvel_estd_evel_nstd_nfloat64vel_ustd_u)r;   r?   datar,   Zid_positionr   r   r   rD   Q   s,    
&&   zCGPS.read_velocityFc                 C   s   | j }| j}t|trt|}t||d}|j|||ddd \}}|||d |d f}	tj|d|	|dd d }
tj|d	|	|dd d }t	
|}nLt|trt	j|d|d
}
t|d }|d dkrt	
|}ntd||
|fS )N)lookup_filer>   r   r   r   incidenceAngle)datasetNameboxr?   )r   r   azimuthAngle)	dimensionr?   HEADING     f@g     F@z)input geom_obj is neight str nor dict: {})rL   rM   
isinstancer   r   read_attributer   	geo2radarreadutazimuth2heading_angledictincidence_anglerK   
ValueErrorformat)r;   geom_objr?   latlonatrcoordyxrY   	inc_angleaz_angle
head_angler   r   r   get_los_geometryj   s"    


zCGPS.get_los_geometryenu2los)ro   rq   c                 C   s  |t jd 9 }|t jd 9 }t |t | d t |t | t |g}| }|dkrbn<|dkrtd|d< n*|dkrd|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]   )rs   )en2loshz2losg        r   )u2losup2losr   r   zUn-known input gps components:g      ?)r   pisincoslowerrf   r   rN   rP   rS   vel_losrO   rQ   rT   std_los)r;   ro   rq   gps_compunit_vecr   r   r   displacement_enu2los   s8    


zCGPS.displacement_enu2losr   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)rr   r   )r;   rh   r   r?   ro   rq   r   r   r   read_gps_los_velocity   s    zCGPS.read_gps_los_velocityN)r6   )T)T)F)rs   )rs   F)__name__
__module____qualname____doc__r<   rE   rD   rr   rK   r   r   r   r   r   r   r   r5   8   s   



&r5   )r@   codecsr   r   numpyr   mintpy.objects.coordr   mintpy.utilsr   ZCGPS_datasetr4   r5   r   r   r   r   <module>   s   #