;+
; NAME:
;       HW_SYNSPEC__DEFINE defines the class HW_SYNSPEC. Objects of this
;       class form the interface between the "Chianti" package and the HW QL 
;       software.
;
; PURPOSE:
;
; CATEGORY:
;       Hansteen/Wikstol Data analysis SW
;
; CALLING SEQUENCE:  HW_SYNSPEC is created by
;                   hw_synspec = obj_new('hw_synspec',lambda,name=name,title=title)
;                   generates and loads a spectrum for the wavelengths given by lambda       
;
; INPUTS:
;      
;
; KEYWORD PARAMETERS:
;
;
; OUTPUTS:
;
;
; CALLS:
;       
;
; METHODS:
;       
;
; PROCEDURE:
;
;
; RESTRICTIONS:
;
;
; MODIFICATION HISTORY:
;       06-Jan-2006: Viggo H. Hansteen
;        4-Jul-2008: A. Gardini        - Added HELP and INIT_HW_SYNSPEC_METHODS.
; 
; $Id: hw_synspec__define.pro 405 2010-07-04 11:21:38Z viggoh $
;-
function hw_synspec::init,lambda,name=name,title=title
  self->init_hw_synspec_methods ; initialization of the help method
  self->setdefaults,title=title
  if n_elements(lambda) ne 0 then begin
    self.wrange=[lambda[0],lambda[n_elements(lambda)-1]]
    self->generate,lambda,name=name,title=self.title
  endif
  if n_elements(name) ne 0 then self->load,name=name
  return,1
end

pro hw_synspec::load,name=name,title=title,init=init
  if n_elements(init) eq 1 then return
  restgen,struct=spec,file=name,text=title
  self.title=title
  self.spec=ptr_new(spec)
  return
end

pro hw_synspec::generate,lambda,name=name,title=title,init=init
  if n_elements(init) eq 1 then return
  dbpath=self.dbase_path
  ioneq_name=dbpath+self.ioneq_name
  dem_name=dbpath+self.dem_name
  abund_name=dbpath+self.abund_name
  ch_synthetic,lambda[0],lambda[n_elements(lambda)-1],output=osyn, $
     pressure=self.pressure, $
     ioneq_name=ioneq_name,dem_name=dem_name
  make_chianti_spec,osyn,lambda,ospec, $
     abund_name=abund_name,/continuum, $
     instr_fwhm=self.instr_fwhm
  self.spec=ptr_new(ospec)
  savegen,struct=*self.spec,text=title,file=name
  return
end

function hw_synspec::getspec,init=init
  if n_elements(init) eq 1 then return, -1
  return,self.spec
end

pro hw_synspec::settitle,title,init=init
  if n_elements(init) eq 1 then return
  self.title=title
  return
end

pro hw_synspec::setioneq_name,name,init=init
  if n_elements(init) eq 1 then return
  self.ioneq_name='ioneq'+get_delim()+name+'.ioneq'
  return
end

function hw_synspec::getioneq_name,init=init
  if n_elements(init) eq 1 then return, -1
  txt=self.ioneq_name 
  return,strmid(txt,strpos(txt,get_delim())+1,strpos(txt,'.')-strpos(txt,get_delim())-1)
end

function hw_synspec::gettitle,init=init
  if n_elements(init) eq 1 then return, -1
  return,self.title
end

pro hw_synspec::getinfo,lambda,spectrum,id=id,init=init
  if n_elements(init) eq 1 then return
  lambda=(*self.spec).lambda
  spectrum=(*self.spec).spectrum
  id=create_struct('snote',(*self.spec).lines.snote,'wvl',(*self.spec).lines.wvl,'peak',(*self.spec).lines.peak)
  return
end

pro hw_synspec::setdefaults,title=title,init=init
  if n_elements(init) eq 1 then return
  if n_elements(title) eq 0 then self.title=' ' else self.title=title
  self.pressure=1.e15
  self.instr_fwhm=0.
  self.dbase_path='~/ssw/packages/chianti/dbase/'
  self.ioneq_name='ioneq/arnaud_raymond.ioneq'
  self.abund_name='abundance/sun_photospheric.abund'
  self.dem_name='dem/quiet_sun.dem'
  return
end

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

pro hw_synspec::init_hw_synspec_methods

  self->load,/init
  self->generate,/init
  a=self->getspec(/init)
  self->settitle,/init
  self->setioneq_name,/init
  a=self->getioneq_name(/init)
  a=self->gettitle(/init)
  self->getinfo,/init
  self->setdefaults,/init

  return
end

pro hw_synspec__define
  struct={hw_synspec, title:' ', $
                      wrange:fltarr(2),$
                      bin_size:0.,$
                      pressure:1.e15,$
                      instr_fwhm:0.,$
                      dbase_path:'~/ssw/packages/chianti/dbase/',$
                      ioneq_name:'ioneq/arnaud_raymond.ioneq',$
                      abund_name:'abundance/sun_photospheric.abund',$
                      dem_name:'dem/quiet_sun.dem',$
                      spec:ptr_new()}
end
