Source code for gwdetchar.cds

# coding=utf-8
# Copyright (C) Duncan Macleod (2015)
#
# This file is part of the GW DetChar python package.
#
# GW DetChar 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.
#
# GW DetChar 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 GW DetChar.  If not, see <http://www.gnu.org/licenses/>.

"""Utilities for accessing information from CDS
"""

from urllib import request

RTDCUID_URL = (
    'https://daqsvn.ligo-la.caltech.edu/websvn/filedetails.php?'
    'repname=daq_maps&path=%2F{ifo}%2Frtdcuid'
)

ADCLIST_URL = (
    'https://daqsvn.ligo-la.caltech.edu/websvn/filedetails.php?'
    'repname=daq_maps&path=%2F{ifo}%2Fadclists%2F{model}_adclist.txt'
)

DCUID_MAP = {}
ADC_MAP = {}

__author__ = 'Duncan Macleod <duncan.macleod@ligo.org>'


[docs] def get_dcuid_map(ifo): import bs4 html = request.urlopen(RTDCUID_URL.format(ifo=ifo.lower())).read() soup = bs4.BeautifulSoup(html, 'lxml') listing = soup.find('div', attrs={'class': 'listing'}) mapping = {} for code in listing.find_all('code'): try: fec, model = str(code.get_text()).rstrip(' \n').split() fec = int(fec) except (ValueError, TypeError): continue else: mapping[fec] = model return mapping
[docs] def get_adclist(ifo, model): import bs4 html = request.urlopen(ADCLIST_URL.format(ifo=ifo.lower(), model=model.lower())).read() soup = bs4.BeautifulSoup(html, 'lxml') listing = soup.find('div', attrs={'class': 'listing'}) mapping = {} for code in listing.find_all('code'): try: card, slot, channel, part = str( code.get_text()).rstrip(' \n').split() card = int(card) slot = int(slot) except (ValueError, TypeError): continue else: mapping[(card, slot)] = channel return mapping
[docs] def model_name_from_dcuid(ifo, dcuid): global DCUID_MAP if ifo not in DCUID_MAP: DCUID_MAP[ifo] = get_dcuid_map(ifo) try: return DCUID_MAP[ifo][dcuid] except KeyError as e: e.args = ('No model name associated with DCUID=%d' % dcuid,) raise
[docs] def dcuid_from_model_name(ifo, model): global DCUID_MAP if ifo not in DCUID_MAP: DCUID_MAP[ifo] = get_dcuid_map(ifo) for dcuid, name in DCUID_MAP[ifo].items(): if model.lower() == name: return dcuid raise KeyError("No DCUID associated with model=%r" % model)
[docs] def get_adc_channel(ifo, model, card, slot): global ADC_MAP ADC_MAP.setdefault(ifo, {}) if model not in ADC_MAP[ifo]: ADC_MAP[ifo][model] = get_adclist(ifo, model) try: return ADC_MAP[ifo][model][(card, slot)] except KeyError as e: e.args = ('No channel associated with card %d, slot %d for %s' % (card, slot, model),) raise
[docs] def get_real_channel(adcchannel): main = str(adcchannel).split('-', 1)[1] ifo = str(adcchannel).split(':')[0] dcuid, type_, _, _, card, slot = main.split('_') if type_ != 'ADC': raise ValueError("No 'real' channel map for non-ADC channels") modelname = model_name_from_dcuid(ifo, int(dcuid)) return get_adc_channel(ifo, modelname, int(card), int(slot))