
; CNA_MATH -- Contains general utilities for performing arithmetic
; on NICMOS two-dimensional data groups. Errors and DQ are updated.
; SAMP and TIME arrays are unchanged.

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

function cna_aadd, a, b

@calnica_common

  ; Add two SingleNicmosGroups, leaving the result in the first.
  ;
  ; (a) = (a) + (b)
  ;
  ; The science data arrays are added together the error arrays are
  ; combined the data quality arrays are 'or'ed'.


  ; int i, j  ; array indexes.
  ; float aerr  ; a error.
  ; float berr  ; b error.

  ; Error data.
  a.err.data.data = $
	sqrt(a.err.data.data * a.err.data.data + $
	     b.err.data.data * b.err.data.data)

  ; Science data.
  a.sci.data.data = a.sci.data.data + b.sci.data.data

  ; Data quality data.
  a.dq.data.data = a.dq.data.data or b.dq.data.data

  return, 0

end


function cna_asub, a, b

  ; Subtract two SingleNicmosGroups, leaving the result in the first.
  ;
  ; (a) = (a) - (b)
  ;
  ; The science data arrays are subtracted the error arrays are
  ; combined the data quality arrays are 'or'ed'.

  ; Error data.
  a.err.data.data = $
	sqrt(a.err.data.data * a.err.data.data + $
	     b.err.data.data * b.err.data.data)

  ; Science data.
  a.sci.data.data = a.sci.data.data - b.sci.data.data

  ; Data quality data.
  a.dq.data.data = a.dq.data.data or b.dq.data.data

  return, 0

end

function cna_amul, a, b

  ; Multiply two SingleNicmosGroups, leaving the result in the first.
  ;
  ;  (a) *= (b)
  ;
  ;  The science data arrays are multiplied together the error arrays are
  ;  combined the data quality arrays are 'or'ed'.


  ;int i, j  ; array indexes.
  ;float a_db  ; a value * b error.
  ;float b_da  ; b value * a error.

  ; Error data.
  a.err.data.data = $
	     sqrt(a.sci.data.data * b.err.data.data * $
	          a.sci.data.data * b.err.data.data + $
	          b.sci.data.data * a.err.data.data * $
	          b.sci.data.data * a.err.data.data)

  ; Science data.
  a.sci.data.data = a.sci.data.data * b.sci.data.data
  
  ; Data quality data.
  a.dq.data.data = a.dq.data.data or b.dq.data.data

  return, 0

end


function cna_adiv, a, b

  ; Divide two SingleNicmosGroups, leaving the result in the first.
  ;
  ; (a) /= (b)
  ;
  ; The science data arrays are divided the error arrays are
  ; combined the data quality arrays are 'or'ed'.

  asci  = a.sci.data.data
  bsci  = b.sci.data.data
  bsci2 = bsci*bsci
  aerr  = a.err.data.data
  berr  = b.err.data.data

  iszero = where (bsci eq 0.0)
  notzero = where (bsci ne 0.0)
  temp = sqrt(aerr*aerr/bsci2 + asci*asci*berr*berr/(bsci2*bsci2))
  a.err.data.data[notzero] = temp[notzero]
  a.err.data.data[iszero] = 9999.0

  temp = asci / bsci
  a.sci.data.data[notzero] = temp[notzero]
  a.sci.data.data[iszero] = 999999.0

  ; Data quality data.
  a.dq.data.data = a.dq.data.data or b.dq.data.data

  return, 0

end


function cna_asubk, a, b

  ; Subtract in-place a constant from a SingleNicmosGroup.
  ;
  ; (a) = (a) - b
  ;
  ; The constant is subtracted from the science data array only
  ; the error and data quality arrays are unchanged.

  a.sci.data.data = a.sci.data.data - b

  return, 0

end

function cna_amulk, a, b

  ; Multiply in-place a SingleNicmosGroup by a constant.
  ;
  ; (a) *= b
  ;
  ; The science and error data arrays are multiplied by the constant
  ; the data quality array is unchanged.

  a.sci.data.data = a.sci.data.data * b
  a.err.data.data = a.err.data.data * b

  return, 0

end


function cna_aor, a, b

  ; Take the logical OR of two SingleNicmosGroup DQ arrays, leaving the result 
  ; in the first.
  ;
  ; (a.dq) = (a.dq) | (b.dq)
  ;
  ; The science and error data arrays are unchanged.

  ; Data quality.
  a.dq.data.data = a.dq.data.data or b.dq.data.data

  return, 0

end
