;+
; NAME:
;       FITS_HDR__DEFINE
;
; PURPOSE:
;       fits_hdr__define defines the class structure 'fits_hdr'. 
;       An object of class 'fits_hdr' contains the fits header of
;       SOLAR B EIS fits files.
;
; CATEGORY:
;       Hansteen/Wikstol Data analysis SW
;
; CALLING SEQUENCE:
;       The FITS_HDR__DEFINE procedure is not called directly. An
;       object of class FITS_HDR is created with the following
;       statement: 
;                   fits_hdr = obj_new('fits_hdr')
;       To fill the object with information use the following statement:
;                     fits_hdr-> read, fitsfile
;
; INPUTS:
;
; KEYWORD PARAMETERS:
;
; OUTPUTS:
;       Objects of class FITS_HDR
;
; CALLS:
;
; COMMON BLOCKS:
;       
;
; PROCEDURE:
;       The procedure opens an object of class FITS_HDR. The FITS_HDR
;       class inherits the superclass HW_HDR, that defines the general
;       structure of header classes used by the HW data analysis SW. 
;       This procedure also includes various functions (methods of
;       class  'fits_hdr' whose purpose is make data available to the
;       "world" outside of the object.For example printing the FITS
;       keyword "telescop", is done by the following statement:
;               print, fits_hdr-> gettelescop()
;
; RESTRICTIONS:
;
;
; MODIFICATION HISTORY:
;       13-Jan-2003: Oivind Wikstol.
;       16-Feb-2004: Oivind Wikstol - Added hdr (full hdr) as instance
;                                     of the fits_hdr object
;       17-Feb-2004: Oivind Wikstol - Added BTE column auxiliary data (timing,
;                                     positions etc.) to fits_hdr object.
;       11-May-2004: Oivind Wikstol - Added setbte_hdr and setmain_hdr
;                                     methods.
;       14-Oct-2004: Oivind Wikstol - Moved nccd parameter to' hw_hdr' object.
;       10-Feb-2007: Viggo Hasnteen - Added help methods.
;       15-Mar-2007: Viggo Hansteen - cleanup method that actually does some 
;                                     cleanup!
;       29-Sep-2007: A. Gardini     - Updated the cleanup method. Other changes 
;                                     already made in Jun-2007.
;        4-Jul-2008: A. Gardini     - Added HELP and INIT_FITS_HDR_METHODS.
;       30-Apr-2009: A. Gardini     . Added keyword to eis_cal.
;
; $Id: fits_hdr__define.pro 405 2010-07-04 11:21:38Z viggoh $
;
;-
function fits_hdr::init, file, foreign = foreign
  self->init_fits_hdr_methods
  self.help=obj_new('hw_help')
  self.nccd = 2
  if n_elements(foreign) eq 0 then foreign = 0
  if n_params() ge 1 then begin
    if not foreign then self-> read, file else self->readforeign, file
  endif
  return, 1
end

pro fits_hdr::cleanup
  obj_destroy,self.help
  ptr_free,self.main_hdr
  ptr_free,self.bte_hdr
  ptr_free,self.t1
  ptr_free,self.t2
  ptr_free,self.mhc_dur
  ptr_free,self.exp_dur
  ptr_free,self.fmirr
  ptr_free,self.hsl
  ptr_free,self.xrt_flfl
  ptr_free,self.xrt_fl_x
  ptr_free,self.xrt_fl_y
  ptr_free,self.aec_hepc
  ptr_free,self.aec_lepc
  ptr_free,self.mhcsg
  return
end


pro fits_hdr::display_all,init=init
  if n_elements(init) eq 1 then return
  self.help->display_all
  return
end

pro fits_hdr::display_methods,init=init
  if n_elements(init) eq 1 then return
  self.help->display_methods
  return
end

function fits_hdr::getmain_hdr,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.main_hdr
end

function fits_hdr::getmain_keyword,keyword,init=init
  if n_elements(init) eq 1 then return, -1
  return, fxpar(*self.main_hdr,keyword)
end

pro fits_hdr::setmain_hdr, hdr,init=init
  if n_elements(init) eq 1 then return
  *self.main_hdr = hdr
end

function fits_hdr::getbte_hdr,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.bte_hdr
end

pro fits_hdr::setbte_hdr, hdr,init=init
  if n_elements(init) eq 1 then return
  *self.bte_hdr = hdr
end

function fits_hdr::getdate,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.date
end

function fits_hdr::getorigin,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.origin
end
function fits_hdr::gettelescop,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.telescop
end

function fits_hdr::getinstrume,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.instrume
end

function fits_hdr::getobs_prog,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.obs_prog
end

function fits_hdr::getobs_title,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.obs_title
end

function fits_hdr::getrast_acr,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.rast_acr
end

function fits_hdr::getstud_acr,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.stud_acr
end

function fits_hdr::getdatatype,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.datatype
end

pro fits_hdr::setdatatype,  datatype,init=init
  if n_elements(init) eq 1 then return
  self.datatype = datatype
end

function fits_hdr::getdate_obs,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.date_obs
end

function fits_hdr::getdate_end,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.date_end
end

function fits_hdr::getobt_time,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.obt_time
end

function fits_hdr::getobt_end,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.obt_end
end

function fits_hdr::getccd_nr,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.ccd_nr
end

function fits_hdr::getline_wvl,init=init
  if n_elements(init) eq 1 then return, -1
  return, self.line_wvl
end

function fits_hdr::gett1,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.t1
end

function fits_hdr::gett2,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.t2
end

function fits_hdr::getmhc_dur,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.mhc_dur
end

function fits_hdr::getexp_dur,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.exp_dur
end

function fits_hdr::getfmirr,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.fmirr
end

function fits_hdr::gethsl,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.hsl
end

function fits_hdr::getxrt_flfl,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.xrt_flfl
end

function fits_hdr::getxrt_fl_x,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.xrt_fl_x
end

function fits_hdr::getxrt_fl_y,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.xrt_fl_y
end

function fits_hdr::getaec_hepc,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.aec_hepc
end

function fits_hdr::getaec_lepc,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.aec_lepc
end

function fits_hdr::getmhcsg,init=init
  if n_elements(init) eq 1 then return, -1
  return, *self.mhcsg
end

function fits_hdr::getinfo,tag,init=init
  if n_elements(init) eq 1 then return, -1
  return,fxpar(*self.bte_hdr,tag)
end

function fits_hdr::getparam,tag,init=init
  if n_elements(init) eq 1 then return, -1
  tag=strupcase(tag)
  maxtag=100  ; someone may want to increase this number at some point...
  for i=1,maxtag do begin
    nr=strtrim(string(i),2)
    param=strtrim(string(self->getinfo('TTYPE'+nr)),2)
    case param of 
    tag : begin
       var=[fxpar(*self.bte_hdr,'TDMIN'+nr),fxpar(*self.bte_hdr,'TDMAX'+nr)]
               end
    else:
    endcase
  endfor
  return,var
end

function fits_hdr::getxcen_ti1,offset=offset,init=init
  if n_elements(init) eq 1 then return, -1
  xcen_ti1=self->getparam('XCEN_TI1')
  if n_elements(offset) ne 0 then begin 
    cal=obj_new('eis_cal',/quiet)
    fmirr=total(self->getparam('FMIRR'))/2.
    xcen_ti1=xcen_ti1+(fxpar(*self.bte_hdr,'CMIRR') $
                     -cal->getxmidcmirrpos())*(cal->getcmirr_ss()) $
                    +(cal->getxmidmirrpos()-fmirr)*(cal->getfmirr_ss())*2.
    obj_destroy,cal
  endif
  return,total(xcen_ti1)/2.
end

function fits_hdr::getycen_ti1,offset=offset,init=init
  if n_elements(init) eq 1 then return, -1
  ycen_ti1=self->getparam('YCEN_TI1')
  if n_elements(offset) ne 0 then begin 
    cal=obj_new('eis_cal',/quiet)
    ycen_ti1=ycen_ti1-cal->getymidslitpos() $
    +self->getinfo('YWS')+self->getinfo('YW')/2.
    obj_destroy,cal
  endif
  return,total(ycen_ti1)/2.
end

pro fits_hdr::help
  help,self,/obj
  return
end

pro  fits_hdr::init_fits_hdr_methods

  self->init_hw_methods
  self->display_all,/init
  self->display_methods,/init
  a=self->getmain_hdr(/init)
  a=self->getmain_keyword(/init)
  self->setmain_hdr,/init
  a=self->getbte_hdr(/init)
  self->setbte_hdr,/init
  a=self->getdate(/init)
  a=self->getorigin(/init)
  a=self->gettelescop(/init)
  a=self->getinstrume(/init)
  a=self->getobs_prog(/init)
  a=self->getobs_title(/init)
  a=self->getrast_acr(/init)
  a=self->getstud_acr(/init)
  a=self->getdatatype(/init)
  self->setdatatype,/init
  a=self->getdate_obs(/init)
  a=self->getdate_end(/init)
  a=self->getobt_time(/init)
  a=self->getobt_end(/init)
  a=self->getccd_nr(/init)
  a=self->getline_wvl(/init)
  a=self->gett1(/init)
  a=self->gett2(/init)
  a=self->getmhc_dur(/init)
  a=self->getexp_dur(/init)
  a=self->getfmirr(/init)
  a=self->gethsl(/init)
  a=self->getxrt_flfl(/init)
  a=self->getxrt_fl_x(/init)
  a=self->getxrt_fl_y(/init)
  a=self->getaec_hepc(/init)
  a=self->getaec_lepc(/init)
  a=self->getmhcsg(/init)
  a=self->getinfo(/init)
  a=self->getparam(/init)
  a=self->getxcen_ti1(/init)
  a=self->getycen_ti1(/init)
  self->display,/init
  self->read,/init
  self->readforeign,/init
 
  return
end

pro fits_hdr__define
  nwin = 25  ; max number of line windows for EIS
  nrccd = 2   ; number of CCDs
  struct={fits_hdr, $
          main_hdr:ptr_new(), $
          bte_hdr:ptr_new(), $
          date:'', $
          origin:'', $
          telescop:'', $
          instrume:'', $
          obs_prog:'', $
          obs_title:'', $
          rast_acr:'', $
          stud_acr:'', $
          datatype:'',  $
          date_obs:'', $
          date_end:'', $
          obt_time:0UL, $
          obt_end:0UL, $
          ccd_nr:intarr(nwin), $
          line_wvl:fltarr(nwin), $
          t1:ptr_new(), $
          t2:ptr_new(), $
          mhc_dur:ptr_new(), $
          exp_dur:ptr_new(), $
          fmirr:ptr_new(), $
          hsl:ptr_new(), $
          xrt_flfl:ptr_new(), $
          xrt_fl_x:ptr_new(), $
          xrt_fl_y:ptr_new(), $
          aec_hepc:ptr_new(), $
          aec_lepc:ptr_new(), $
          mhcsg:ptr_new(), $
          inherits hw_hdr}
end


