
; CNA_PUTCALDATA -- Write calibrated data to ouput file. The file is created
; and the primary header is written when writing the first data group.

; Revision history:
; I. Barg 10-Jan-2000 Modified structure names (and tag names) to match 
;             "/iraf/stsdas/lib/hstio.h".


function cna_putCalData, nic, out, fname, first, extver

@calnica_common
@VERSION.calnica

  ; Arguments:
  ;  nic    i: NICMOS info structure
  ;  out    i: image data to be written to file
  ;  fname  i: output file name

  ; If the user has indicated that he or she doesn't want .ima files,
  ; don't write them.
  if (NOIMA eq 1) then return, 0

  ; Open the output file.
  ua_fits_open, fname, outfcb, /WRITE, /NO_ABORT
  if (!ERR lt 0) then begin
    print, 'ERROR: Problem opening output file:  ',fname
    return, 30
  endif

  if (nic.ngroups eq 1) then begin

    ; Update output image header keywords.
    ; In global header, update CALSTAGE: set to "CALNICA"
    ghdr = out.globalhdr
    if (first eq 1) then begin
      sxaddpar,ghdr,'CALSTAGE','CALNICA',/PDU
      sxaddpar,ghdr,'NEXTEND',5,/PDU
      sxaddpar,ghdr,'FILENAME',fname,/PDU
      sxaddpar,ghdr,'CAL_VER','Version '+UAVersion,/PDU
    endif


    ; DATAMIN, DATAMAX: updated in the header of all extensions
    scihdr = out.sci.hdr
    sxaddpar,scihdr,'DATAMIN',min(out.sci.data.data)
    sxaddpar,scihdr,'DATAMAX',max(out.sci.data.data)

    errhdr = out.err.hdr
    sxaddpar,errhdr,'DATAMIN',min(out.err.data.data)
    sxaddpar,errhdr,'DATAMAX',max(out.err.data.data)

    dqhdr = out.dq.hdr
    sxaddpar,dqhdr,'DATAMIN',min(out.dq.data.data)
    sxaddpar,dqhdr,'DATAMAX',max(out.dq.data.data)

    smplhdr = out.smpl.hdr
    sxaddpar,smplhdr,'DATAMIN',min(out.smpl.data.data)
    sxaddpar,smplhdr,'DATAMAX',max(out.smpl.data.data)

    intghdr = out.intg.hdr
    sxaddpar,intghdr,'DATAMIN',min(out.intg.data.data)
    sxaddpar,intghdr,'DATAMAX',max(out.intg.data.data)

    if (first eq 1) then begin
      ua_fits_write,outfcb,0,ghdr,/NO_ABORT
      if (!ERR lt 0) then begin
	ua_fits_close,outfcb
	print, 'ERROR: Problem writing FITS global header'
	return, 30
      endif
    endif

    ua_fits_write,outfcb,out.sci.data.data,scihdr, $
	       extname='SCI',extver=extver,/NO_ABORT
    if (!ERR lt 0) then begin
      ua_fits_close,outfcb
      print, 'ERROR: Problem writing FITS SCI data, extver = ',extver
      return, 30
    endif
    ua_fits_write,outfcb,out.err.data.data,errhdr, $
	       extname='ERR',extver=extver,/NO_ABORT
    if (!ERR lt 0) then begin
      ua_fits_close,outfcb
      print, 'ERROR: Problem writing FITS ERR data, extver = ',extver
      return, 30
    endif
    ua_fits_write,outfcb,out.dq.data.data,dqhdr, $
	       extname='DQ',extver=extver,/NO_ABORT
    if (!ERR lt 0) then begin
      ua_fits_close,outfcb
      print, 'ERROR: Problem writing FITS DQ data, extver = ',extver
      return, 30
    endif
    ua_fits_write,outfcb,out.smpl.data.data,smplhdr, $
	       extname='SAMP',extver=extver,/NO_ABORT
    if (!ERR lt 0) then begin
      ua_fits_close,outfcb
      print, 'ERROR: Problem writing FITS SMPL data, extver = ',extver
      return, 30
    endif
    ua_fits_write,outfcb,out.intg.data.data,intghdr, $
	       extname='TIME',extver=extver,/NO_ABORT
    if (!ERR lt 0) then begin
      ua_fits_close,outfcb
      print, 'ERROR: Problem writing FITS INTG data, extver = ',extver
      return, 30
    endif

  endif else begin

    ; Update output image header keywords.
    ; In global header, update CALSTAGE: set to "CALNICA"
    ghdr = out.group[0].globalhdr
    ; if (first eq 1) then begin
      sxaddpar,ghdr,'CALSTAGE','CALNICA',/PDU
      sxaddpar,ghdr,'EXTEND','T',after='NAXIS',/PDU
      sxaddpar,ghdr,'NEXTEND',5*nic.ngroups,/PDU
      sxaddpar,ghdr,'FILENAME',fname,/PDU
      sxaddpar,ghdr,'CAL_VER','Version '+UAVersion,/PDU
    ; endif

    ua_fits_write,outfcb,0,ghdr,/NO_ABORT
    if (!ERR lt 0) then begin
      ua_fits_close,outfcb
      print, 'ERROR: Problem writing FITS global header'
      return, 30
    endif

    for i = 0, nic.ngroups-1 do begin

      ; DATAMIN, DATAMAX: updated in the header of all extensions
      scihdr = out.group[i].sci.hdr
      sxaddpar,scihdr,'DATAMIN',min(out.group[i].sci.data.data)
      sxaddpar,scihdr,'DATAMAX',max(out.group[i].sci.data.data)

      errhdr = out.group[i].err.hdr
      sxaddpar,errhdr,'DATAMIN',min(out.group[i].err.data.data)
      sxaddpar,errhdr,'DATAMAX',max(out.group[i].err.data.data)

      dqhdr = out.group[i].dq.hdr
      sxaddpar,dqhdr,'DATAMIN',min(out.group[i].dq.data.data)
      sxaddpar,dqhdr,'DATAMAX',max(out.group[i].dq.data.data)

      smplhdr = out.group[i].smpl.hdr
      sxaddpar,smplhdr,'DATAMIN',min(out.group[i].smpl.data.data)
      sxaddpar,smplhdr,'DATAMAX',max(out.group[i].smpl.data.data)

      intghdr = out.group[i].intg.hdr
      sxaddpar,intghdr,'DATAMIN',min(out.group[i].intg.data.data)
      sxaddpar,intghdr,'DATAMAX',max(out.group[i].intg.data.data)


      ua_fits_write,outfcb,out.group[i].sci.data.data,scihdr, $
		 extname='SCI',extver=i+1,/NO_ABORT
      if (!ERR lt 0) then begin
	ua_fits_close,outfcb
	print, 'ERROR: Problem writing FITS SCI data, extver = ',i+1
	return, 30
      endif
      ua_fits_write,outfcb,out.group[i].err.data.data,errhdr, $
		 extname='ERR',extver=i+1,/NO_ABORT
      if (!ERR lt 0) then begin
	ua_fits_close,outfcb
	print, 'ERROR: Problem writing FITS ERR data, extver = ',i+1
	return, 30
      endif
      ua_fits_write,outfcb,out.group[i].dq.data.data,dqhdr, $
		 extname='DQ',extver=i+1,/NO_ABORT
      if (!ERR lt 0) then begin
	ua_fits_close,outfcb
	print, 'ERROR: Problem writing FITS DQ data, extver = ',i+1
	return, 30
      endif
      ua_fits_write,outfcb,out.group[i].smpl.data.data,smplhdr, $
		 extname='SAMP',extver=i+1,/NO_ABORT
      if (!ERR lt 0) then begin
	ua_fits_close,outfcb
	print, 'ERROR: Problem writing FITS SMPL data, extver = ',i+1
	return, 30
      endif
      ua_fits_write,outfcb,out.group[i].intg.data.data,intghdr, $
		 extname='TIME',extver=i+1,/NO_ABORT
      if (!ERR lt 0) then begin
	ua_fits_close,outfcb
	print, 'ERROR: Problem writing FITS INTG data, extver = ',i+1
	return, 30
      endif
    endfor
  endelse

  ua_fits_close,outfcb,/NO_ABORT

  ; Successful return.
  return, 0

end

