Source code for spectractor.logbook

from spectractor import parameters
from spectractor.config import set_logger

import matplotlib.pyplot as plt
import pandas as pd
import os
import numpy as np


[docs] class LogBook: """Class to load_image and analyse observation logbook csv files.""" def __init__(self, logbook="./tests/data/ctiofulllogbook_jun2017_v5.csv"): """Load and initialise the logbook Parameters ---------- logbook: str Path to the logbook. Must be a CSV file. Examples ---------- >>> logbook = LogBook('./tests/data/ctiofulllogbook_jun2017_v5.csv') >>> assert logbook.df is not None >>> print(logbook.logbook) ./tests/data/ctiofulllogbook_jun2017_v5.csv >>> print(logbook.df['disperser'][:2]) 0 Ron400 1 Ron400 Name: disperser, dtype: object >>> logbook = LogBook('./log.csv') """ self.my_logger = set_logger(self.__class__.__name__) self.logbook = logbook if not os.path.isfile(logbook): self.my_logger.error('CSV logbook file {} not found.'.format(logbook)) return # self.csvfile = open(self.logbook, 'rU', encoding='latin-1') # self.reader = csv.DictReader(self.csvfile, delimiter=';', dialect=csv.excel_tab) self.df = pd.read_csv(self.logbook, sep=";", decimal=",", encoding='latin-1', header='infer') self.df['date'] = pd.to_datetime(self.df.date)
[docs] def search_for_image(self, filename): """ Look for an image file name in the logbook and load_image properties: - Obj-posXpix and Obj-posYpix: the [x0,y0] guessed pixel position in the image - Dx and Dy: the x and y windows in pixel to search for the target; set XWINDOW and YWINDOW variables in parameters.py - object: the name of the target Parameters ---------- filename: str the fits image file name (not the path, only the file name.) Returns ------- disperser_label: str the name of the disperser target: str the name of the target xpos: int the x position of the target (in pixel) ypos: int the y position of the target (in pixel) Examples -------- >>> logbook = LogBook('./tests/data/ctiofulllogbook_jun2017_v5.csv') >>> disperser_label, target, xpos, ypos = logbook.search_for_image("unknown_file.fits") >>> print(disperser_label, target, xpos, ypos) None None None None >>> disperser_label, target, xpos, ypos = logbook.search_for_image("reduc_20170605_028.fits") >>> print(disperser_label, target, xpos, ypos) HoloPhAg PNG321.0+3.9 814 585 >>> disperser_label, target, xpos, ypos = logbook.search_for_image("reduc_20170608_119.fits") >>> print(disperser_label, target, xpos, ypos) None HD205905 None None >>> disperser_label, target, xpos, ypos = logbook.search_for_image("reduc_20170630_001.fits") >>> print(disperser_label, target, xpos, ypos) None bias None None """ disperser_label = None target = None xpos = None ypos = None skip = False try: row = self.df.loc[(self.df['file'] == filename)].iloc[0] target = row['object'] if row['object'] == 'bias' or row['object'] == 'flat' or row['object'] == 'zero': self.my_logger.error( 'Fits file %s in logbook %s has flag %s. Skip file.' % (filename, self.logbook, target)) skip = True if row['skip'] == 'skip': self.my_logger.error('Fits file %s in logbook has flag "skip". Skip file.' % filename) skip = True if np.isnan(row['Obj-posXpix']): self.my_logger.error( 'Fits file %s in logbook %s has no target x position. Skip file.' % (filename, self.logbook)) skip = True if np.isnan(row['Obj-posYpix']): self.my_logger.error( 'Fits file %s in logbook %s has no target y position. Skip file.' % (filename, self.logbook)) skip = True if not np.isnan(row['Dx']): parameters.XWINDOW = int(row['Dx']) parameters.XWINDOW_ROT = int(row['Dx']) if not np.isnan(row['Dy']): parameters.YWINDOW = int(row['Dy']) parameters.YWINDOW_ROT = int(row['Dy']) if not skip: xpos = int(row['Obj-posXpix']) ypos = int(row['Obj-posYpix']) disperser_label = row['disperser'] except IndexError: if target is None and skip is False: self.my_logger.error('Fits file %s not found in logbook %s.' % (filename, self.logbook)) return disperser_label, target, xpos, ypos
[docs] def plot_columns_vs_date(self, column_names): """Plot of the column property with respect to the dates. Parameters ---------- column_names: list, str List of column names to plot versus time from the log book. Examples -------- >>> logbook = LogBook('./tests/data/ctiofulllogbook_jun2017_v5.csv') >>> logbook.plot_columns_vs_date(['seeing']) >>> logbook.plot_columns_vs_date(['P', 'T']) """ if isinstance(column_names, str): column_names = [column_names] self.df.plot(x='date', y=column_names) if parameters.DISPLAY: plt.show() if parameters.PdfPages: parameters.PdfPages.savefig()
if __name__ == "__main__": import doctest doctest.testmod()