;+
; NAME:
;   	EIS_DATA__GETWINDATA
;
; PURPOSE:
;   	Returns EIS data from a detector window.
;
; CALLING SEQUENCE:
;   	windata = data->getwindata(iwin [,keywords])
;
; INPUTS:
;   	IWIN: scalar with the index of the desired window.
;
; OUTPUTS:
;   	Structure with data and header information.
;
; KEYWORDS:
;   	DATA_ER: data object for the errors. Populates the ERR tag.
;
; EXAMPLE:
;   	Create an object:
;   	    IDL> eisfile = 'eis_l1_20070202_104212.fits'
;   	    IDL> eisfile = 'eis_er_20070202_104212.fits'
;   	    IDL> obj = obj_new('eis_data',eisfile)
;   	    IDL> obj_er = obj_new('eis_data',errfile)
;   	And extract data from window 0.
;   	    IDL> data = obj -> getwindata(0, data_er=obj_er)
;
; WRITTEN: H.P.Warren. NRL. March 2007.
;
; MODIFICATION HISTORY:
;       2007/04/09  I. Ugarte-Urra. NRL. Documentation, new tag definitions and 
;                                        resolving cases with multiple exposures prp.
;       2007/04/11  IUU. NRL. Redefining NX for multiple exposures prp.
;       2007/04/27  IUU. NRL. Release to SSW.
;       2007/05/01  IUU. NRL. Fixed bug for NX=1 
;       2007/09/17  Peter Young. Changed method for computing wavelength
;             vector; now uses eis_pixel_to_wavelength.
;       2008/12/04  Peter Young. Added TIME= input for call to
;             eis_pixel_to_wavelength.
;       2008/12/17  HPW. NRL. Added data quality tag. This is derived from check_ti() and
;             is not foolproof.
;       2010/07/21 HPW. NRL. Added xcen & ycen tags. Modified scale to return
;             [cdelt1,cdelt2] for scale.
;       2012/10/11, Peter Young. Now uses wvl input in call to
;             getypos() method in order to correct for grating tilt.
;
;-
;; **********************************************************************

function eis_data::getwindata,iwin,data_er=data_er


  if self.filename eq '' then begin
    message,"NO DATA READ YET",/info
    return,0
  endif
  break_file,self.filename,disk,dir,name,ext

  ;; ----------------------------------------------------------------------
  ;; --- get data and header
  ;; ----------------------------------------------------------------------

  data = float(*self.w[iwin])
  hdr  = self -> gethdr()

  nl = (size(data))[1] & ny = (size(data))[2] 
  if (size(data))[0] eq 2 then nx = 1l else nx = (size(data))[3]

  if keyword_set(data_er) then data_e = data_er->getvar(iwin) else $
      data_e = fltarr(nl,ny,nx)
      
  header = self -> getwinheader(self.filename,iwin)
  
  nexp_prp = header.nexp_prp    ;exposures per raster position

  ;; --- times for these observations
  aux_data=self->getaux_data()
  time=self->sec_from_obs_start(*(aux_data.ti_1))
  tai = self->ti2tai(hdr -> gett1())
  time_ccsds = TAI2UTC(tai,/CCSDS)

  ;; --- check for good data, this is not foolproof
  data_quality = byte(self->check_ti())

  ;; ----------------------------------------------------------------------
  ;; --- get wavelength array
  ;; ----------------------------------------------------------------------

  ccd_info = [self.xs[iwin],self.xw[iwin],self.ys[iwin],self.yw[iwin]]

  lambda = self.lambda
  xstart = ccd_info[0] 
  xwidth = ccd_info[1] 
  xend   = xstart + xwidth - 1

  if xstart ge 2148 then begin
    xstart = xstart - 2148 -50              ; PRY  17-Sep-2007
    ccd=0
;    xend   = xend - 2148                   ; PRY
;    wave   = lambda.scale_a[xstart:xend]   ; PRY
  endif else begin
    xstart=xstart-50                        ; PRY
    ccd=1
;    wave   = lambda.scale_b[xstart:xend]   ; PRY
  ENDELSE
  wave=eis_pixel_to_wavelength(xstart+indgen(xwidth),ccd,header.slit_ind,time=time_ccsds[0])
  wvl  = average(wave) ;; wavelength of center of window

  ;; ----------------------------------------------------------------------
  ;; --- rearrange the data
  ;; ----------------------------------------------------------------------
  if nx eq 1 then begin
    data_new   = fltarr(nl,nx,ny)
    data_e_new = fltarr(nl,nx,ny)
    data_new(*,0,*)   = data
    data_e_new(*,0,*) = data_e
    data   = temporary(data_new)
    data_e = temporary(data_e_new)
  endif else begin
    data   = rearrange(data,[1,3,2])
    data_e = rearrange(data_e,[1,3,2])
  endelse

  ;; ----------------------------------------------------------------------
  ;; --- get additional info
  ;; ----------------------------------------------------------------------

  ;; --- exposure time in seconds - is this the place to get this info?
  expt = self -> getexp() 

  ;; --- id for this window
  line_id = strtrim((hdr -> getline_id())[iwin],2)

  ;; --- the slit
  slit_id = strtrim(self.slit_id,2)

  ;; --- solar X and solar Y (relative)
;  fmir_dx   = 0.1248
;  fmir_ss   = (self->getinfo('fmir_ss'))
  solar_x   = self->getxpos() ;; 2*fmir_dx*fmir_ss*findgen(nt) 
  solar_y   = self->getypos(wvl) ;; use wvl input to correct for grating tilt

  ;; --- Units
  units = (self -> getunit())[0]

  ;; --- Other
  missing=-100    ; value for missing data

  cdelt1 = abs((self->getinfo('cdelt1')))
  cdelt2 = abs((self->getinfo('cdelt2')))
  CASE header.slit_ind OF
    0: scale=[cdelt1,cdelt2]
    2: scale=[cdelt1,cdelt2]
    ELSE: scale=[1.0,1.0]
  ENDCASE

  ;; --- compute xcen and ycen
  xcen = self->getxcen(/raster)
  ycen = self->getycen(wvl,/raster)
  
  ;; ----------------------------------------------------------------------
  ;; --- Multiples exposures per raster position
  ;; ----------------------------------------------------------------------
  IF nexp_prp GT 1 THEN BEGIN
    ;; --- Redifining x dimension
    nx=nx/nexp_prp
    
    ;; --- Introducing 4th dimension 
    data_new	     = fltarr(nl,nx,ny,nexp_prp)
    data_e_new	     = fltarr(nl,nx,ny,nexp_prp)
    time_new	     = dblarr(nx,nexp_prp)
    time_ccsds_new   = strarr(nx,nexp_prp)
    expt_new	     = fltarr(nx,nexp_prp)
    solar_x_new      = fltarr(nx,nexp_prp)
    data_quality_new = bytarr(nx,nexp_prp)
    
    ;; --- Rearranging 
    ii=indgen(nx)*nexp_prp
    FOR i=0,nexp_prp-1 DO BEGIN
    	data_new[*,*,*,i]     = data[*,ii+i,*]
   	data_e_new[*,*,*,i]   = data_e[*,ii+i,*]
	time_new[*,i]	      = time[ii+i]
	time_ccsds_new[*,i]   = time_ccsds[ii+i]
	expt_new[*,i]	      = expt[ii+i]
	solar_x_new[*,i]      = solar_x[ii+i]
        data_quality_new[*,i] = data_quality[ii+i]
    ENDFOR

    data=0 
    data_e=0
    time=0
    time_ccsds=0
    expt=0
    solar_x=0
    data    	 = temporary(data_new)
    data_e  	 = temporary(data_e_new)
    time    	 = temporary(time_new)
    time_ccsds   = temporary(time_ccsds_new)
    expt    	 = temporary(expt_new)
    solar_x 	 = temporary(solar_x_new)
    data_quality = temporary(data_quality_new)
    
  ENDIF

  ;; ----------------------------------------------------------------------
  ;; --- output structure
  ;; ----------------------------------------------------------------------

  ;; --- a little more rearrangment
  if header.nraster gt 1 then begin
    data     = reverse(data,2)
    data_e   = reverse(data_e,2)
    ;; --- what about these?
    solar_x  	 = reverse(solar_x,1)
    time    	 = reverse(time,1)
    time_ccsds   = reverse(time_ccsds,1)
    expt     	 = reverse(expt,1)
    data_quality = reverse(data_quality,1)
  endif
 
  windata = {filename:	    	name+ext,$
    	     line_id:           line_id,$
             int:           	data,$
             err:            	data_e,$
             wvl:            	wave,$
	     time:  	    	time,$
             time_ccsds:    	time_ccsds,$
             data_quality:      data_quality,$
             exposure_time:   	expt,$
             solar_x:         	solar_x,$
             solar_y:         	solar_y,$
             xcen:              xcen,$
             ycen:              ycen,$
    	     nl:    	    	nl,$
	     nx:    	    	nx,$
	     ny:    	    	ny,$
	     scale: 	    	scale,$
             units:             units,$
	     missing:	    	missing,$
             iwin:            	iwin,$
    	     hdr:   	    	header,$
             time_stamp:      	systime(0)}

return,windata
end
