; Save moments on a level 2 FITS file.
; MODIFICATION HISTORY:
;       18-Mar-2008 A. Gardini - Version 1.0
;        4-Jul-2008 A. Gardini - Added init keyword.
;       19-Sep-2008 A. Gardini - Introduced self.nfit
;       23-Oct-2008 A. Gardini - Correted TDIM to account for error columns. 
pro eis_moment::mkfits, file, savefile, iwin, init=init
  if n_elements(init) eq 1 then return

  dummy=readfits(file,mainhdr) 
  dummy=readfits(file,hdr,exten_no=1) 
  data=obj_new('eis_data',file)

  nwin=data->getnwin()        ; number of line windows
  numwin=n_elements(iwin)     ; number of selected lines
  sum=0
  for iw = 0, nwin-1 do begin
    data ->getwin, iw, wd, pos
    sz=size(wd)
    if n_elements(where(iwin eq iw)) eq 1 then begin
      str1='TFORM'+strtrim(string(iw+1),2)
      tform=strtrim(string(self.nfit*sz[2]),2)+'E'
      fxaddpar,hdr,str1,tform,'Real*4 (floating point)'
      str2='TDIM'+strtrim(string(iw+1),2)
      tdim='(5,'+strtrim(string(sz[2]),2)+')'
      comment='Array dimension for column '+strtrim(string(iw+1),2)
      fxaddpar,hdr,str2,tdim,comment
      str3='TDETXW'+strtrim(string(iw+1),2)
      tdet=3
      fxaddpar,hdr,str3,tdet,'Line width (x) in pixels'
    endif 
    sum=sum+sz[1]
  endfor
  naxis1=fxpar(hdr,'NAXIS1')
  if (data->getfitslev() eq 0) then $
    aux_naxis1=naxis1-sum*sz[2]*2 $
  else aux_naxis1=naxis1-sum*sz[2]*4
  naxis1=aux_naxis1+self.nfit*numwin*4*sz[2]
  fxaddpar,mainhdr,'NAXIS1',naxis1,'Number of bytes per row'
  fxaddpar,hdr,'NAXIS1',naxis1,'Number of bytes per row'
  tfields=fxpar(hdr,'TFIELDS')
  fxaddpar,hdr,'TFIELDS',tfields-nwin+numwin,'Number of columns'
  fxaddpar,mainhdr,'DATA_LEV',2,'FITS Level (0, 1, 2)'
  fxaddpar,hdr,'DATA_LEV',2,'FITS Level (0, 1, 2)'
  fxaddpar,mainhdr,'NWIN',numwin,'Number of line windows'
  fxaddpar,hdr,'NWIN',numwin,'Number of line windows'

  if numwin lt nwin then begin

   for i = 0, nwin-1 do begin
    j=where(iwin eq i,ct)
    if ct gt 0 and i ne j then begin
      astr = strarr(18)
      bstr = strarr(18)
      astr[0] = 'TFORM'+strtrim(string(i+1), 2)
      astr[1] = 'TTYPE'+strtrim(string(i+1), 2)
      astr[2] = 'TDIM'+strtrim(string(i+1), 2)
      astr[3] = 'TUNIT'+strtrim(string(i+1), 2)
      astr[4] = 'TDMIN'+strtrim(string(i+1), 2)
      astr[5] = 'TDMAX'+strtrim(string(i+1), 2)
      astr[6] = 'TDESC'+strtrim(string(i+1), 2)
      astr[7] = 'TCUNI'+strtrim(string(i+1), 2)
      astr[8] = 'TDETX'+strtrim(string(i+1), 2)
      astr[9] = 'TDETXW'+strtrim(string(i+1), 2)
      astr[10]= 'TDETY'+strtrim(string(i+1), 2)
      astr[11]= 'TDELT'+strtrim(string(i+1), 2)
      astr[12]= 'TWAVE'+strtrim(string(i+1), 2)
      astr[13]= 'TWMIN'+strtrim(string(i+1), 2)
      astr[14]= 'TWMAX'+strtrim(string(i+1), 2)
      astr[15]= 'TWBND'+strtrim(string(i+1), 2)
      astr[16]= 'WINHDR'+strtrim(string(i+1), 2)
      astr[17]= 'CCDRON'+strtrim(string(i+1), 2)
      bstr[0] = 'TFORM'+strtrim(string(j+1), 2)
      bstr[1] = 'TTYPE'+strtrim(string(j+1), 2)
      bstr[2] = 'TDIM'+strtrim(string(j+1), 2)
      bstr[3] = 'TUNIT'+strtrim(string(j+1), 2)
      bstr[4] = 'TDMIN'+strtrim(string(j+1), 2)
      bstr[5] = 'TDMAX'+strtrim(string(j+1), 2)
      bstr[6] = 'TDESC'+strtrim(string(j+1), 2)
      bstr[7] = 'TCUNI'+strtrim(string(j+1), 2)
      bstr[8] = 'TDETX'+strtrim(string(j+1), 2)
      bstr[9] = 'TDETXW'+strtrim(string(j+1), 2)
      bstr[10]= 'TDETY'+strtrim(string(j+1), 2)
      bstr[11]= 'TDELT'+strtrim(string(j+1), 2)
      bstr[12]= 'TWAVE'+strtrim(string(j+1), 2)
      bstr[13]= 'TWMIN'+strtrim(string(j+1), 2)
      bstr[14]= 'TWMAX'+strtrim(string(j+1), 2)
      bstr[15]= 'TWBND'+strtrim(string(j+1), 2)
      bstr[16]= 'WINHDR'+strtrim(string(j+1), 2)
      bstr[17]= 'CCDRON'+strtrim(string(j+1), 2)
      for k=0,17 do begin
        fxaddpar, hdr, bstr[k], fxpar(hdr,astr[k])
      endfor
    endif
   endfor

   for i = numwin, nwin-1 do begin
    astr = strarr(18)
    astr[0] = 'TFORM'+strtrim(string(i+1), 2)
    astr[1] = 'TTYPE'+strtrim(string(i+1), 2)
    astr[2] = 'TDIM'+strtrim(string(i+1), 2)
    astr[3] = 'TUNIT'+strtrim(string(i+1), 2)
    astr[4] = 'TDMIN'+strtrim(string(i+1), 2)
    astr[5] = 'TDMAX'+strtrim(string(i+1), 2)
    astr[6] = 'TDESC'+strtrim(string(i+1), 2)
    astr[7] = 'TCUNI'+strtrim(string(i+1), 2)
    astr[8] = 'TDETX'+strtrim(string(i+1), 2)
    astr[9] = 'TDETXW'+strtrim(string(i+1), 2)
    astr[10]= 'TDETY'+strtrim(string(i+1), 2)
    astr[11]= 'TDELT'+strtrim(string(i+1), 2)
    astr[12]= 'TWAVE'+strtrim(string(i+1), 2)
    astr[13]= 'TWMIN'+strtrim(string(i+1), 2)
    astr[14]= 'TWMAX'+strtrim(string(i+1), 2)
    astr[15]= 'TWBND'+strtrim(string(i+1), 2)
    astr[16]= 'WINHDR'+strtrim(string(i+1), 2)
    astr[17]= 'CCDRON'+strtrim(string(i+1), 2)
    sxdelpar, hdr, astr
   endfor

   j=numwin+1
   for i=nwin+1,tfields do begin
    astr = strarr(5)
    bstr = strarr(5)
    comm = strarr(5)
    astr[0] = 'TFORM'+strtrim(string(i), 2)
    astr[1] = 'TTYPE'+strtrim(string(i), 2)
    astr[2] = 'TUNIT'+strtrim(string(i), 2)
    astr[3] = 'TDMIN'+strtrim(string(i), 2)
    astr[4] = 'TDMAX'+strtrim(string(i), 2)
    bstr[0] = 'TFORM'+strtrim(string(j), 2)
    bstr[1] = 'TTYPE'+strtrim(string(j), 2)
    bstr[2] = 'TUNIT'+strtrim(string(j), 2)
    bstr[3] = 'TDMIN'+strtrim(string(j), 2)
    bstr[4] = 'TDMAX'+strtrim(string(j), 2)
    comm[2] = 'Units of column '+strtrim(string(j), 2)
    comm[3] = 'Maximum value in column '+strtrim(string(j), 2)
    comm[4] = 'Minimum value in column '+strtrim(string(j), 2)
    fxaddpar, hdr, bstr[0], fxpar(hdr,astr[0],comment=com0), com0
    fxaddpar, hdr, bstr[1], fxpar(hdr,astr[1],comment=com1), com1
    for k=2,4 do begin
      fxaddpar, hdr, bstr[k], fxpar(hdr,astr[k]), comm[k]
    endfor
    j=j+1
    sxdelpar, hdr, astr
   endfor

  endif

  fxwrite, savefile, mainhdr
  fxbcreate, lu, savefile, hdr

  for l = 0, numwin-1 do begin
    icol=iwin[l]
    wd=*self.w[icol]
    sz=size(wd)
    for irow = 1, sz[3] do begin
      fxbwrite, lu, wd[*,*,irow-1], l+1, irow
    endfor
  endfor
  
  fxbopen,ru,file,1
  j=numwin+1
  for i=nwin+1,tfields do begin
    fxbread,ru,auxdata,i
    for k=1,sz[3] do begin
      fxbwrite, lu, auxdata[k-1], j, k
    end   
    j=j+1
  end

  fxbclose,  ru
  fxbfinish, lu
  return
end
