def query_flag(ifo, segment_name, start_time, end_time, source='any', server="segments.ligo.org", veto_definer=None, cache=False): """Return the times where the flag is active Parameters ---------- ifo: string The interferometer to query (H1, L1). segment_name: string The status flag to query from LOSC. start_time: int The starting gps time to begin querying from LOSC end_time: int The end gps time of the query source: str, Optional Choice between "GWOSC" or "dqsegdb". If dqsegdb, the server option may also be given. The default is to try GWOSC first then try dqsegdb. server: str, Optional The server path. Only used with dqsegdb atm. veto_definer: str, Optional The path to a veto definer to define groups of flags which themselves define a set of segments. cache: bool If true cache the query. Default is not to cache Returns --------- segments: glue.segments.segmentlist List of segments """ flag_segments = segmentlist([]) if source in ['GWOSC', 'any']: # Special cases as the LOSC convention is backwards from normal # LIGO / Virgo operation!!!! if (('_HW_INJ' in segment_name and 'NO' not in segment_name) or 'VETO' in segment_name): data = query_flag(ifo, 'DATA', start_time, end_time) if '_HW_INJ' in segment_name: name = 'NO_' + segment_name else: name = segment_name.replace('_VETO', '') negate = query_flag(ifo, name, start_time, end_time, cache=cache) return (data - negate).coalesce() duration = end_time - start_time try: url = GWOSC_URL.format(get_run(start_time + duration / 2), ifo, segment_name, int(start_time), int(duration)) fname = download_file(url, cache=cache) data = json.load(open(fname, 'r')) if 'segments' in data: flag_segments = data['segments'] except Exception as e: msg = "Unable to find segments in GWOSC, check flag name or times" print(e) if source != 'any': raise ValueError(msg) else: print("Tried and failed GWOSC {}, trying dqsegdb", segment_name) return query_flag(ifo, segment_name, start_time, end_time, source='dqsegdb', server=server, veto_definer=veto_definer) elif source == 'dqsegdb': # Let's not hard require dqsegdb to be installed if we never get here. try: from dqsegdb2.query import query_segments as query except ImportError: raise ValueError("Could not query flag. Install dqsegdb2" ":'pip install dqsegdb2'") # The veto definer will allow the use of MACRO names # These directly correspond the name defined in the veto definer file. if veto_definer is not None: veto_def = parse_veto_definer(veto_definer, [ifo]) # We treat the veto definer name as if it were its own flag and # a process the flags in the veto definer if veto_definer is not None and segment_name in veto_def[ifo]: for flag in veto_def[ifo][segment_name]: partial = segmentlist([]) segs = query(ifo + ':' + flag['full_name'], int(start_time), int(end_time), host=server)['active'] # Apply padding to each segment for rseg in segs: seg_start = rseg[0] + flag['start_pad'] seg_end = rseg[1] + flag['end_pad'] partial.append(segment(seg_start, seg_end)) # Limit to the veto definer stated valid region of this flag send = segmentlist([segment([flag['start'], flag['end']])]) flag_segments += (partial.coalesce() & send) else: # Standard case just query directly. try: segs = query(':'.join([ifo, segment_name]), int(start_time), int(end_time), host=server)['active'] for rseg in segs: flag_segments.append(segment(rseg[0], rseg[1])) except Exception as e: print("Could not query flag, check name " " (%s) or times" % segment_name) raise e else: raise ValueError("Source must be dqsegdb or GWOSC." " Got {}".format(source)) return segmentlist(flag_segments).coalesce()
def query_flag(ifo, segment_name, start_time, end_time, source='any', server="https://segments.ligo.org", veto_definer=None, cache=False): """Return the times where the flag is active Parameters ---------- ifo: string The interferometer to query (H1, L1). segment_name: string The status flag to query from LOSC. start_time: int The starting gps time to begin querying from LOSC end_time: int The end gps time of the query source: str, Optional Choice between "GWOSC" or "dqsegdb". If dqsegdb, the server option may also be given. The default is to try GWOSC first then try dqsegdb. server: str, Optional The server path. Only used with dqsegdb atm. veto_definer: str, Optional The path to a veto definer to define groups of flags which themselves define a set of segments. cache: bool If true cache the query. Default is not to cache Returns --------- segments: glue.segments.segmentlist List of segments """ flag_segments = segmentlist([]) if source in ['GWOSC', 'any']: # Special cases as the LOSC convention is backwards from normal # LIGO / Virgo operation!!!! if (('_HW_INJ' in segment_name and 'NO' not in segment_name) or 'VETO' in segment_name): data = query_flag(ifo, 'DATA', start_time, end_time) if '_HW_INJ' in segment_name: name = 'NO_' + segment_name else: name = segment_name.replace('_VETO', '') negate = query_flag(ifo, name, start_time, end_time, cache=cache) return (data - negate).coalesce() duration = end_time - start_time try: url = GWOSC_URL.format(get_run(start_time + duration/2, ifo), ifo, segment_name, int(start_time), int(duration)) fname = get_file(url, cache=cache, timeout=10) data = json.load(open(fname, 'r')) if 'segments' in data: flag_segments = data['segments'] except Exception as e: if source != 'any': raise ValueError("Unable to find {} segments in GWOSC, check " "flag name or times".format(segment_name)) return query_flag(ifo, segment_name, start_time, end_time, source='dqsegdb', server=server, veto_definer=veto_definer) elif source == 'dqsegdb': # The veto definer will allow the use of MACRO names # These directly correspond to the name in the veto definer file if veto_definer is not None: veto_def = parse_veto_definer(veto_definer, [ifo]) # We treat the veto definer name as if it were its own flag and # process the flags in the veto definer if veto_definer is not None and segment_name in veto_def[ifo]: for flag in veto_def[ifo][segment_name]: partial = segmentlist([]) segs = query_dqsegdb2(ifo, flag['full_name'], start_time, end_time, server) # Apply padding to each segment for rseg in segs: seg_start = rseg[0] + flag['start_pad'] seg_end = rseg[1] + flag['end_pad'] partial.append(segment(seg_start, seg_end)) # Limit to the veto definer stated valid region of this flag flag_start = flag['start'] flag_end = flag['end'] # Corner case: if the flag end time is 0 it means 'no limit' # so use the query end time if flag_end == 0: flag_end = int(end_time) send = segmentlist([segment(flag_start, flag_end)]) flag_segments += (partial.coalesce() & send) else: # Standard case just query directly segs = query_dqsegdb2(ifo, segment_name, start_time, end_time, server) for rseg in segs: flag_segments.append(segment(rseg[0], rseg[1])) # dqsegdb output is not guaranteed to lie entirely within start # and end times, hence restrict to this range flag_segments = flag_segments.coalesce() & \ segmentlist([segment(int(start_time), int(end_time))]) else: raise ValueError("Source must be `dqsegdb`, `GWOSC` or `any`." " Got {}".format(source)) return segmentlist(flag_segments).coalesce()
def query_flag(ifo, name, start_time, end_time, source='any', server="segments.ligo.org", veto_definer=None, cache=False): """Return the times where the flag is active Parameters ---------- ifo: string The interferometer to query (H1, L1). name: string The status flag to query from LOSC. start_time: int The starting gps time to begin querying from LOSC end_time: int The end gps time of the query source: str, Optional Choice between "GWOSC" or "dqsegdb". If dqsegdb, the server option may also be given. The default is to try GWOSC first then try dqsegdb. server: str, Optional The server path. Only used with dqsegdb atm. veto_definer: str, Optional The path to a veto definer to define groups of flags which themselves define a set of segments. cache: bool If true cache the query. Default is not to cache Returns --------- segments: glue.segments.segmentlist List of segments """ info = name.split(':') if len(info) == 2: segment_name, version = info elif len(info) == 1: segment_name = info[0] version = 1 flag_segments = segmentlist([]) if source in ['GWOSC', 'any']: # Special cases as the LOSC convention is backwards from normal # LIGO / Virgo operation!!!! if (('_HW_INJ' in segment_name and 'NO' not in segment_name) or 'VETO' in segment_name): data = query_flag(ifo, 'DATA', start_time, end_time) if '_HW_INJ' in segment_name: name = 'NO_' + segment_name else: name = segment_name.replace('_VETO', '') negate = query_flag(ifo, name, start_time, end_time, cache=cache) return (data - negate).coalesce() duration = end_time - start_time url = GWOSC_URL.format(get_run(start_time + duration/2), ifo, segment_name, int(start_time), int(duration)) try: fname = download_file(url, cache=cache) data = json.load(open(fname, 'r')) if 'segments' in data: flag_segments = data['segments'] except Exception as e: msg = "Unable to find segments in GWOSC, check flag name or times" print(e) if source != 'any': raise ValueError(msg) else: print("Tried and failed GWOSC {}, trying dqsegdb", name) return query_flag(ifo, segment_name, start_time, end_time, source='dqsegdb', server=server, veto_definer=veto_definer) elif source == 'dqsegdb': # Let's not hard require dqsegdb to be installed if we never get here. try: from dqsegdb.apicalls import dqsegdbQueryTimes as query except ImportError: raise ValueError("Could not query flag. Install dqsegdb" ":'pip install dqsegdb'") # The veto definer will allow the use of MACRO names # These directly correspond the name defined in the veto definer file. if veto_definer is not None: veto_def = parse_veto_definer(veto_definer) # We treat the veto definer name as if it were its own flag and # a process the flags in the veto definer if veto_definer is not None and segment_name in veto_def[ifo]: for flag in veto_def[ifo][segment_name]: segs = query("https", server, ifo, flag['name'], flag['version'], 'active', int(start_time), int(end_time))[0]['active'] # Apply padding to each segment for rseg in segs: seg_start = rseg[0] + flag['start_pad'] seg_end = rseg[1] + flag['end_pad'] flag_segments.append(segment(seg_start, seg_end)) # Apply start / end of the veto definer segment send = segmentlist([segment([veto_def['start'], veto_def['end']])]) flag_segments = (flag_segments.coalesce() & send) else: # Standard case just query directly. try: segs = query("https", server, ifo, name, version, 'active', int(start_time), int(end_time))[0]['active'] for rseg in segs: flag_segments.append(segment(rseg[0], rseg[1])) except Exception as e: print("Could not query flag, check name " " (%s) or times" % segment_name) raise e else: raise ValueError("Source must be dqsegdb or GWOSC." " Got {}".format(source)) return segmentlist(flag_segments).coalesce()