B
    zdt                 @   s^   d Z ddlZddlmZmZ ddlmZ edZedZ	ddd	Z
dd
dZdddZdS )zUtilities for URL handling
    N)basenamesplitext   )segments_overlapz\A((.*/)*(?P<obs>[^/]+)-(?P<ifo>[A-Z][0-9])_(L|GW)OSC_((?P<tag>[^/]+)_)?(?P<samp>\d+(KHZ)?)_[RV](?P<version>\d+)-(?P<strt>[^/]+)-(?P<dur>[^/\.]+)\.(?P<ext>[^/]+))\Zz[RV]\d+c             +   s   dd    D  x| D ]yt fdd D r8wW n4 tk
rn } ztdt|W dd}~X Y nX |rd }||d  f}t||sqV  qW dS )	a^  Sieve a list of GWOSC URL metadata dicts based on key, value pairs

    Parameters
    ----------
    urllist : `list` of `dict`
        the ``'strain'`` metadata list, as retrieved from the GWOSC
        server

    segment : `tuple` of `int`
        a ``[start, stop)`` GPS segment against which to check overlap
        for each URL

    **match
        other keywords match **exactly** against the corresponding key
        in the `dict` for each URL

    Yields
    ------
    dict :
        each URL dict that matches the parameters is yielded, in the same
        order as the input ``urllist``
    c             S   s   i | ]\}}|d k	r||qS )N ).0keyvaluer   r   W/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/gwosc/urls.py
<dictcomp>4   s    zsieve.<locals>.<dictcomp>c             3   s   | ]} | | kV  qd S )Nr   )r   r   )matchurlmetar   r
   	<genexpr>9   s    zsieve.<locals>.<genexpr>z unrecognised match parameter: {}NZGPSstartduration)itemsanyKeyError	TypeErrorformatstrr   )Zurllistsegmentr   exc_startZthissegr   )r   r   r
   sieve   s    
"
r   c	             C   s   t t|  }	xz||	d f||	d f|t|	d f|t|	d dd f|t|	d |kf||	d |kffD ]\}
}|
rr||
krrd	S qrW |d	k	rt|	d
 }||krd	S |d	k	rt|	d
 }t|	d }|| |krd	S |	d t|	d fS )aA  Match a URL against requested parameters

    Returns
    -------
    None
        if the URL doesn't match the request

    tag, version : `str`, `int`
        if the URL matches the request

    Raises
    ------
    StopIteration
        if the start time of the URL is _after_ the end time of the
        request
    ZifotagversionZsampZKHZi   durextNZstrt)	URL_REGEXr   r   	groupdictintfloatrstrip)urldetectorstartendr   sample_rater   r   r   regparamZregvarZgpsr   r   r   r
   
_match_urlG   s(    

r*   c	             C   s   i }	t  }
t| dd d} tt|r4|dd }|dk	rDt|}x\| D ]T}t|||||||||d	}|dkrrqJ|\}}|
| |	|g  |	| 	| qJW t
|
dkrdtt|
}td|y|	t|	 S  tk
r   g S X dS )	a`  Match GWOSC URLs for a given [start, end) interval

    Parameters
    ----------
    urls : `list` of `str`
        List of URL paths

    start : `int`
        GPS start time of match interval

    end : `int`
        GPS end time of match interval

    tag : `str`, optional
        URL tag to match, e.g. ``'CLN'``

    version : `int`, optional
        Data release version to match, defaults to highest available
        version

    Returns
    -------
    urls : `list` of `str`
        A sub-list of the input, based on matching, if no URLs are matched,
        the return will be empty ``[]``.
    c             S   s    t t| d dd d d S )Nr   -)r   r   split)ur   r   r
   <lambda>       zmatch.<locals>.<lambda>)r   r   N)r$   r%   r&   r   r'   r   r   r   z, zGmultiple GWOSC URL tags discovered in dataset, please select one of: {})setsortedVERSION_REGEXr   r   r    r*   add
setdefaultappendlenjoinmaprepr
ValueErrorr   max)urlsr$   r%   r&   r   r'   r   r   r   ZmatchedZmatched_tagsr#   mZmtagZmverstagsr   r   r
   r   ~   sB    %

r   )N)NNNNNNNN)NNNNNNNN)__doc__reos.pathr   r   utilsr   compiler   r3   r   r*   r   r   r   r   r
   <module>   s.   


-       
0       