Source code for xpipeline.setuputils.utils

# -*- coding: utf-8 -*-
# Copyright (C) Scott Coughlin (2017)
#
# This file is part of XPypeline.
#
# GWpy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GWpy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GWpy.  If not, see <http://www.gnu.org/licenses/>.

"""This module contains utility functions for setUpJobs 
"""
from gwpy.segments import Segment, DataQualityDict, SegmentList, DataQualityFlag
import operator
from functools import reduce

[docs]def query_veto_definer_file(ifo, start, end, cp): # Obtain segments that are analysis ready analysis_ready = DataQualityFlag.query('{0}:DMT-ANALYSIS_READY:1'.format(ifo), start, end) # Define the start and stop time of analysis ready analysis_ready_start = analysis_ready.active.extent()[0] analysis_ready_end = analysis_ready.active.extent()[1] # Query for vetos found during this time. vdf = DataQualityDict.from_veto_definer_file(cp.get('segfind', 'veto-file'), analysis_ready_start, analysis_ready_end) # Populate only for analysis ready segments. vdf.populate(segments=analysis_ready.active) return vdf
[docs]def filter_for_cat_type(vdf, ifo, cat): return reduce(operator.or_, [f.active for f in list(vdf.values()) if f.ifo == ifo and f.category in cat], SegmentList())
[docs]def validate_segments(ifos, start, end, cp, trigger_time=None): """determine analysis ready segments during requested analysis time Parameters ---------- ifos : `str` list of ifos used in X-Pipeline analysis start : `float`, :class:`~gwpy.time.LIGOTimeGPS` end : `float`, `~gwpy.time.LIGOTimeGPS` cp : `object` ConfigParser object trigger_time Returns ------- DataQualityDict : ~gwpy.segments.DataQualityDict` """ analysis_seg_files = [] # If simulating noise skip all segment, veto # and network validation checks. The on source and off source is # simulated and therefore has no DQ issues. if cp.has_option('parameters','makeSimulatedNoise'): for ifo in ifos: print('Making simulated noise, creating temp segment file') f = open('segments_{0}.txt'.format(ifo),'w') f.write('0 {0} {1} {2}'.format(start, end ,end - start)) f.close() analysis_seg_files.append('segments_{0}.txt'.format(ifo)) else: for ifo in ifos: if cp.has_option(ifo,'segment-list'): if not os.path.isfile(cp.get(ifo,'segment-list')): raise ValueError('Please uncomment the ' 'the segment file in ini file ' 'as it does not exist. ' 'If you want to use a ' 'supplied file please provide one.') else: analysis_seg_files.append(cp.get(ifo,'segment-list')) else: # Query for veto definer file vdf = query_veto_definer_file(ifo, start, end, cp) # Filter for cat1 vetos segs = filter_for_cat_type(vdf, ifo, [1]) # ---- Write out cat1 veto to text file. filename_cat1 = "input/" + ifo + "-veto-cat1.txt" segs.write(filename_cat1) # Compute analysis ready segments in order to # subtract out cat1 vetos analysis_ready = DataQualityFlag.query('{0}:DMT-ANALYSIS_READY:1'.format(ifo), start, end) # Subtract cat 1 veto from analysis_ready analysis_ready_minus_cat1 = analysis_ready.active - segs # Save new segment list to file filename_analysis_ready_minus_cat1 = "input/" + ifo + "_science_cat1.txt" analysis_ready_minus_cat1.write(filename_analysis_ready_minus_cat1) analysis_seg_files.append(filename_analysis_ready_minus_cat1) return analysis_seg_files
[docs]def validate_network(): return
[docs]def validate_vetos(ifos, start, end, cp): """determine vetos during requested analysis time Parameters ---------- ifos : `str` list of ifos used in X-Pipeline analysis start : `float`, :class:`~gwpy.time.LIGOTimeGPS` end : `float`, `~gwpy.time.LIGOTimeGPS` cp : `object` ConfigParser object Returns ------- DataQualityDict : ~gwpy.segments.DataQualityDict` """ veto_seg_files = [] # If simulating noise skip all segment, veto # and network validation checks. The on source and off source is # simulated and therefore has no DQ issues. if cp.has_option('parameters','makeSimulatedNoise'): for ifo in ifos: veto_seg_files.append("None") else: for ifo in ifos: if cp.has_option(ifo,'veto-list'): if not os.path.isfile(cp.get(ifo,'veto-list')): raise ValueError('Please uncomment the ' 'the veto file in ini file ' 'as it does not exist. ' 'If you want to use a ' 'supplied file please provide one.') else: veto_seg_files.append(cp.get(ifo,'veto-list')) else: # Query for veto definer file vdf = query_veto_definer_file(ifo, start, end, cp) # Filter for cat24 vetos cat = [2, 4] for iCat in cat: segs = filter_for_cat_type(vdf, ifo, [iCat]) filename = "input/" + ifo + "-veto-cat{0}.txt".format(iCat) segs.write(filename) segs = filter_for_cat_type(vdf, ifo, cat) filename = "input/" + ifo + "_cat24veto.txt" segs.write(filename) veto_seg_files.append(filename) return veto_seg_files
[docs]def make_chunks(segment, length, overlap=0): """ Divides the science segment into chunks of length seconds overlapped by overlap seconds. when generating chunks """ chunks = [] for iseg in segment: segtemp = SegmentList([iseg]) time_left = abs(segtemp) start = segtemp.extent()[0] increment = length - overlap while time_left >= length: end = start + length chunks.append(Segment(start, end)) start += increment time_left -= increment return SegmentList(chunks)