;+
; NAME:
;       EIS_SYNSPEC__DEFINE defines the class EIS_SYNSPEC. Objects of this
;       class form the interface between the "Chianti" package and the EIS QL 
;       software. The EIS_SYTSNPEC class inherits the superclass HW_DATA
;
; PURPOSE:
;
; CATEGORY:
;       Hansteen/Wikstol Data analysis SW
;
; CALLING SEQUENCE: EIS_SYNSPEC is created by
;                   eis_synspec = obj_new('eis_synspec',det,region)
;
; INPUTS:
;       det: detector that synthetic spectra is to be computed for
;       region: the type of region synthetic spectra is to be computed for
;               i.e. 'qs','ar','fl',...
;
; KEYWORD PARAMETERS:
;
; OUTPUTS:
;
; CALLS:
;
; METHODS:
;       seteisdefaults,title=title: set defaultvalues for directories, fwhm and so on...
;       eisgenerate,det,region,title=title: generate spectrum for det and region
;       eisload,det,region: loads precomputed spectrum for det and region
;       getphotons,lambda,photons,dn,id=id,phot_peak=phot_peak,dn_peak=dn_peak: computes photon
;                         count and data number for spectrum loaded
;
;
; PROCEDURE:
;
; RESTRICTIONS:
;
; MODIFICATION HISTORY:
;       06-Jan-2006: Viggo H. Hansteen First version
;       10-Feb-2007: Viggo Hansteen  - Added help methods.
;        4-Jul-2008: A. Gardini      - Added HELP and INIT_EIS_SYNSPEC_METHODS.
;       
;       $Id: eis_synspec__define.pro 405 2010-07-04 11:21:38Z viggoh $
;-
function eis_synspec::init,det,region,name=name,eisdb_path=eisdb_path,title=title
  self->init_eis_synspec_methods ; initialization of the help method
  self.help=obj_new('hw_help')
  self->seteisdefaults,title=title
  if n_elements(eisdb_path) ne 0 then self.eisdb_path = eisdb_path
  if n_elements(name) eq 0 then name=self.synthspec_name
  if n_params() eq 2 then begin
    self->eisload,det,region
    message,'loading '+region+' region on detector '+det,/info
  endif
  return,1
end

pro eis_synspec::cleanup
  obj_destroy,self.help
end

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

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

pro eis_synspec::eisgenerate,det,region,title=title,init=init
  if n_elements(init) eq 1 then return
  if n_elements(title) eq 0 then title=self.title
  data=obj_new('eis_data')
  lambda=data->getlambda()
  obj_destroy,data
  case det of
  'a': scale=lambda.scale_a
  'b': scale=lambda.scale_b
  else: message,'no such detector '+det
  endcase
  case region of
  'ch': begin
        self.pressure=1.e14
        self.dem_name='dem/coronal_hole.dem'
        end
  'qs': begin
        self.pressure=1.e15
        self.dem_name='dem/quiet_sun.dem'
        end
  'ar': begin
        self.pressure=1.e16
        self.dem_name='dem/active_region.dem'
        end
  'fl': begin
        self.pressure=1.e17
        self.dem_name='dem/flare.dem'
        end
  'fle': begin
        self.pressure=1.e17
        self.dem_name='dem/flare_ext.dem'
        end
  'pr': begin
        self.pressure=1.e14
        self.dem_name='dem/prominence.dem'
        end
  else: message,'no such region '+region
  endcase
  self.synthspec_name='spec_'+region+'_'+det+'.genx'
  message,'generating '+self.eisdb_path+self.synthspec_name+'  '+title,/info
  self->generate,scale,name=self.eisdb_path+self.synthspec_name,title=title
  return
end

pro eis_synspec::getphotons,lambda,photons,dn,id=id, phot_peak=phot_peak,dn_peak=dn_peak,init=init
  if n_elements(init) eq 1 then return
  lambda=(*self.spec).lambda
  spectrum=(*self.spec).spectrum
  cal = obj_new('eis_cal',/gen_aeff)
  aeff = cal->getaeff(self.detector)
  effarea=interpol(aeff.eff,aeff.lambda,lambda,/spline)
  effarea[where(lambda lt aeff.lambda[0] or lambda gt aeff.lambda[n_elements(aeff.lambda)-1])]=0.
  photons = cal->ergs_to_photon(lambda,spectrum)*effarea
  dn = cal->photon_to_dn(lambda,photons)
  phot_peak=fltarr(n_elements((*self.spec).lines))
  dn_peak=phot_peak
  id=create_struct('snote',(*self.spec).lines.snote,'wvl',(*self.spec).lines.wvl,'peak',(*self.spec).lines.peak,'tmax',(*self.spec).lines.tmax)
  for i=0,n_elements(id.snote)-1 do begin
    phot_peak[i]=interpol(aeff.eff,aeff.lambda,id.wvl[i],/spline)*cal->ergs_to_photon(id.wvl[i],id.peak[i])
    dn_peak[i]=cal->photon_to_dn(id.wvl[i],phot_peak[i])
  endfor
  obj_destroy,cal
  return
end

pro eis_synspec::gettmax,tmax,init=init
  if n_elements(init) eq 1 then return
  tmax=(*self.spec).lines.tmax
  return
end

pro eis_synspec::eisload,det,region,init=init
  if n_elements(init) eq 1 then return
  self.synthspec_name='spec_'+region+'_'+det+'.genx'
  self.detector=det
  self->load,name=self.eisdb_path+self.synthspec_name
  return
end

pro eis_synspec::seteisdefaults,title=title,init=init
  if n_elements(init) eq 1 then return
  self->setdefaults,title=title
  self.instr_fwhm=0.05
  dirsep = get_delim()
  self.eisdb_path=getenv('EIS_DATA')+dirsep+'dbase'+dirsep
  self.synthspec_name='spec_qs_a.genx'
  return
end

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

pro eis_synspec::init_eis_synspec_methods

  self->init_hw_synspec_methods 
  self->display_all,/init
  self->display_methods,/init
  self->eisgenerate,/init
  self->getphotons,/init
  self->gettmax,/init
  self->eisload,/init
  self->seteisdefaults,/init

  return
end

pro eis_synspec__define
  struct={eis_synspec, $
          help:obj_new(), $
          eisdb_path:'',$
          synthspec_name:'spec_qs_a.genx',$
          detector: ' ', $
          inherits hw_synspec}
end
