Source code for hiresprv.idldriver

"""
Drive the underlying IDL code
"""

import logging
import json

import requests
import http.cookiejar

from hiresprv.database import Database


[docs]class Idldriver: """ The principle processing of the HIRES PRV pipeline is done by a set of IDL scripts developed over several decades. This processing is quite intensive, takes a long time, and is run in the background. The ``hiresprv.idldriver.Idldriver`` class provides functionality that allows the user to submit reduction scripts that are parsed and sent to the appropriate IDL functions on the server. The idldriver class intialization checks for cookie indicating a previous login that connects to the user to a PRV pipeline workspace. This workspace is populated with data from the KOA Archive using the :class:`hiresprv.archive.Archive` class methods. Args: cookiepath: a full path to cookie file saved from :func:`hiresprv.auth.login()` """ cookiepath = '' script = '' scriptfile = '' workspace = '' status = '' msg = '' debug = 0 debugfname = '' def __init__(self, cookiepath, **kwargs): self.cookiepath = cookiepath if 'debugfile' in kwargs: self.debugfname = kwargs.get('debugfile') if len(self.debugfname) > 0: self.debug = 1 logging.basicConfig(filename=self.debugfname, level=logging.DEBUG) # TODO: fdebug unused with open(self.debugfname, 'w') as fdebug: pass if self.debug: logging.debug('') logging.debug('DEBUG> Enter idldriver.init:') logging.debug('cookiepath= [%s]' % cookiepath) logging.debug('debug= [%d] debugfname= [%s]' % (self.debug, self.debugfname)) if len(cookiepath) == 0: print('Required input cookie not found.') return # # load cookie # self.cookiejar = http.cookiejar.MozillaCookieJar(self.cookiepath) self.cookie = '' try: self.cookiejar.load(ignore_discard=True, ignore_expires=True) for cookie in self.cookiejar: if cookie.name == 'HIPRV': self.cookie = cookie # TODO: bare except clause except: pass if self.debug: logging.debug('') logging.debug('load cookie exception') if self.cookie is not None: if self.debug: logging.debug('') logging.debug('cookie= %s' % self.cookie) logging.debug('cookiename= %s' % self.cookie.name) logging.debug('cookievalue= %s' % self.cookie.value) logging.debug('cookiedomain= %s' % self.cookie.domain) return
[docs] def run_script(self, script): """ This method is given a script of steps to run on the data in the user's workspace. These steps include creating a template spectrum for a sky target, reducing specific radial velocity measurement(s) using such a template, and creating an RV curve from a set of reduced RV measurements. Args: script (string): script containing processing steps separated by newlines Example: >>> from hiresprv.idldriver import Idldriver >>> idl = Idldriver('prv.cookies') >>> rtn = idl.run_script(\"\"\" template 185144 20091231 rv 185144 r20091231.72 rv 185144 r20091231.73 rv 185144 r20091231.74 rv 185144 r20150606.145 rv 185144 r20150606.146 rv 185144 r20150606.147 rvcurve 185144\"\"\") Note: List of available commands for `run_script`: \n 'template <object> <date>' (create template) \n 'rv <obsid> (calculate RV for single observation)' \n 'rvcurve <object> (construct RV timeseries for an object)' \n 'activate <filename> (activate or include file in analysis)' \n 'deactivate <filename> (deactivate or exclude file from analysis)' \n """ self.script = script if self.debug: logging.debug('') logging.debug('Enter idldriver.run_script:') logging.debug('script= %s' % self.script) self.__submitScript() if self.debug: logging.debug('') logging.debug('returned submitScript: status= [%s]' % self.status) logging.debug('returned submitScript: msg= [%s]' % self.msg) print('status= %s' % self.status) print('msg= %s' % self.msg) return
[docs] def run_scriptfile(self, scriptfile): """ Same as :meth:`hiresprv.idldriver.Idldriver.run_script()` except takes a path to a file containing the script lines. Args: scriptfile (string): path to plain text file that will be read as a continuous string and used as input to the :meth:`hiresprv.idldriver.Idldriver.run_script()` method. """ self.scriptfile = scriptfile if self.debug: logging.debug('') logging.debug('Enter idldriver.run_scriptfile:') logging.debug('scriptfile= %s' % self.scriptfile) # # read file into a script # with open(scriptfile, 'r') as fp: self.script = fp.read() if self.debug: logging.debug('') logging.debug('script read from file') logging.debug('script= %s' % self.script) self.__submitScript() if self.debug: logging.debug('') logging.debug('returned submitScript: status= [%s]' % self.status) logging.debug('returned submitScript: msg= [%s]' % self.msg) print('status= %s' % self.status) print('msg= %s' % self.msg) return
[docs] @staticmethod def create_rvscript(target, db): """ Create script to prcess all RV files associated with a given target Args: target (string): target string db (hiresprv.database.Database): Database object from your workspace Returns: string """ df = Database.to_pandas(db.rv_observations(target)) run_lines = list(df.FILENAME.apply(lambda x: "rv {} {}".format(target.replace("HD", ""), x))) return '\n'.join(run_lines)
# TODO: Technically shouldn't use camel case in a function or method name def __submitScript(self): debug = 0 if debug: logging.debug('') logging.debug('Enter idldriver.__submitScript') logging.debug('script= %s' % self.script) scriptdict = {'script': self.script} if debug: logging.debug('') logging.debug('format script to dictionary, scriptdict=') logging.debug(scriptdict) # # construct URL # url = "http://hiresprv.ipac.caltech.edu/cgi-bin/idlDriver/nph-idlDriver" if debug: logging.debug('') logging.debug('url= %s' % url) self.response = requests.post(url, files=scriptdict, cookies=self.cookiejar) if debug: logging.debug('') logging.debug('response: %s' % self.response.text) jsonstr = json.loads(self.response.text) if debug: logging.debug('') logging.debug('jsonstr: %s' % jsonstr) self.status = jsonstr["status"] self.msg = jsonstr["msg"] if debug: logging.debug('') logging.debug('status: %s' % self.status) logging.debug('msg: %s' % self.msg) retval = dict() retval["status"] = self.status retval["msg"] = self.msg return retval