#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
"""
Created on Fri Jul 17 2015

@author: kervella
"""

# ATTENTION: necessary to install pdfrw library (sudo port install py27-pdfrw)

import matplotlib as mpl
mpl.use('Agg') # necessary to be able to generate the reports even without X server

import pyfits as fits
import numpy as np

from astropy.time import Time
def mjd_date(datestring):
    #datestring2 = datestring[:10]+' '+datestring[12:]
    t = Time([datestring],format='isot',scale='utc')
    return t.mjd[0]

class Rawdata:
    def __init__(self, filename):
        # open fits file
        self.filename = filename
        gravi_raw = fits.open(filename, mode='readonly')

        # Main FITS header
        self.header = gravi_raw[0].header

        # Single mode of the instrument (no metrology data)
#        if 'SINGLE' in str(self.header['HIERARCH ESO DO CATG']):
#            self.single = True
#        else:
#            self.single = False

        # Raw data types
        if 'HIERARCH ESO DPR TYPE' in self.header:
            dtype = str(self.header['HIERARCH ESO DPR TYPE'])
            self.catg = dtype # default case
#            if 'DARK' in dtype: self.catg = 'DARK'
#            if 'FLAT' in dtype: self.catg = 'FLAT'
#            if 'WAVE' in dtype: self.catg = 'WAVE'
#            if 'P2VM' in dtype: self.catg = 'P2VM'
        else:
            self.catg = 'UNKNOWN'
            
        # Polarization setup            
        if "COMBINED" in str(self.header['HIERARCH ESO FT POLA MODE']):
            self.polarsplit = False
        else:
            self.polarsplit = True

        fddl = None # in case the FDDL data are not in the file   
        metrology = None
        detector_sc = None
        detector_ft = None
        
        # Number of SC frames
        self.nframe_sc = self.header['HIERARCH ESO DET2 NDIT']
        
        self.exptime_sc = self.header['HIERARCH ESO DET2 SEQ1 DIT']
        
        # get the ACQ, ARRAY_GEOMETRY, FDDL, OPDC, imaging_detector, imaging_data and METROLOGY extentions
        for hdu in gravi_raw :
            if hdu.name == 'ARRAY_GEOMETRY' : # array geometry
                oi_array=hdu.data
            if hdu.name == 'IMAGING_DATA_ACQ' : # acquisition camera frames
                self.acq = hdu.data # direct assignation
            #if hdu.name == 'OPDC':
            #    opdc = hdu.data
            if hdu.name == 'FDDL':
                fddl = hdu.data
            if hdu.name == 'IMAGING_DETECTOR_SC' :
                detector_sc=hdu.data
            if hdu.name == 'IMAGING_DETECTOR_FT' :
                detector_ft=hdu.data
            # IMAGING_DATA SC frames direct assignation
            if hdu.name == 'IMAGING_DATA_SC' :
                self.data_sc = hdu.data
                self.time_sc = np.array(list(range(0,self.nframe_sc))) * self.header['HIERARCH ESO INS TIM1 PERIOD'] + \
                    mjd_date(self.header['HIERARCH ESO INS TIM1 START'])*86400. # reference in the middle of the inter-frame
            if hdu.name == 'IMAGING_DATA_FT' :
                imaging_ft=hdu.data
            if hdu.name == 'METROLOGY' :
                metrology=hdu.data
       
        # OI_ARRAY parameters
        self.array_tel_name = oi_array.field('TEL_NAME')
        self.array_sta_name = oi_array.field('STA_NAME')
        self.array_staxyz = oi_array.field('STAXYZ')

        # FDDL positions
        if fddl is not None:
            self.fddl_time = fddl.field('TIME')/1e6 + mjd_date(self.header['HIERARCH ESO PCR ACQ START'])*86400. # in seconds
            self.fddl_ft_pos = fddl.field('FT_POS')
            self.fddl_sc_pos = fddl.field('SC_POS')
            self.fddl_opl_air = fddl.field('OPL_AIR')

        # OPDC table
        # TBD

        # IMAGING_DETECTOR parameters
        if detector_sc is not None:
            self.regname_sc = detector_sc.field('REGNAME')
        else: self.regname_sc = ''
        if detector_ft is not None:
            self.regname_ft = detector_ft.field('REGNAME')
        else: self.regname_ft = ''        

        # IMAGING_DATA_FT
        self.time_ft = imaging_ft.field('TIME')/1e6 + mjd_date(self.header['HIERARCH ESO PCR ACQ START'])*86400. # in seconds
        self.exptime_ft = self.header['HIERARCH ESO DET3 SEQ1 DIT']
        if self.polarsplit == True:
            #self.data_ft = imaging_ft.field('PIX').reshape(self.time_ft.shape[0],5,48)
            data = imaging_ft.field('PIX')#.reshape(self.time_ft.shape[0],24,10)
            # print data.shape
            self.data_ft = np.zeros((self.time_ft.shape[0],48,5))
            for i in range(0,24):
                for j in range(0,5):
                    self.data_ft[:,2*i,j] = data[:,j,i]
                for j in range(5,10):
                    self.data_ft[:,2*i+1,j-5] = data[:,j,i]
            # raw.data_ft[time,output,wave_channel]
            # print self.data_ft
        else:
            self.data_ft = imaging_ft.field('PIX').reshape(self.time_ft.shape[0],24,5)

        self.nframe_ft = self.time_ft.shape[0] # number of FT frames

        # print self.data_ft

        # METROLOGY parameters
        if metrology is not None:
            self.metrology_time = metrology.field('TIME')/1e6 + mjd_date(self.header['HIERARCH ESO PCR ACQ START'])*86400. # in seconds
            self.metrology_volt = metrology.field('VOLT')
            self.metrology_powerlaser = metrology.field('POWER_LASER')
            self.metrology_lambdalaser = metrology.field('LAMBDA_LASER')


    


