;+
; NAME:
;	SMEI_MASK
;
;
; PURPOSE:
;	Set the contaminant  mask for a SMEI sequence
;
;
; CATEGORY:
;	CLI
;
;
; CALLING SEQUENCE:
;	smei_mask, seqref, mask
;
;
; INPUTS:
;	seqref	objref	Object reference of the SMEI sequence to be
;			modified.
;	mask	uint	The mask
;
; KEYWORDS:
;	sun	int	Whether to mask sun contaminated data
;	moon	int	ditto moon
;	venus	int	ditto venus
;	jupiter	int	ditto jupiter
;	mercury	int	ditto mercury
;	saturn	int	ditto saturn
;	mars	int	ditto mars
;	bias	int	ditto high bias variance
;	dark	int	ditto aberrant dark charge correction
;	squares	int	ditto bad "squares" values
;	aurora	int	ditto high aurora levels
;	particles int	ditto high particle fluxes.
;
; NOTES:
;	If the mask argument is given, then the keyword flags are
;	ignored. If a keyword is explicitly set to zero then the
;	relevant bit in the mask is cleared, if it is set to a
;	non-zero value then the bit is set, if it is not given at all
;	then the bit is unchanged.
;
;
; MODIFICATION HISTORY:
;	Original (after smei_delay): 25/10/07; SJT
;	Remove obsolete !bo_flags system variable (now only used in
;	pipe): 8/7/09; SJT 
;-

pro smei_mask, seqref, mask, sun = sun, moon = moon, venus = venus, $
               jupiter = jupiter, mercury = mercury, saturn = saturn, $
               mars = mars, bias = bias, dark = dark, squares = $
               squares, aurora = aurora, particles = particles, help = help

if keyword_set(help) || n_params() eq 0 then begin
    self_help
    return
end

if not obj_valid(seqref) then begin
    smei_msg, /alert,  'SMEI_MASK requires an object reference'
    return
endif

if not obj_isa(seqref, 'SMEI_SEQUENCE') then begin
    smei_msg, /alert, $
              'The object you are trying to modify is not a ' + $
              'SMEI_SEQUENCE'
    return
endif

mask_bits = seqref -> get_mask_bits()
if size(mask_bits, /tname) ne 'STRUCT' then begin
    smei_msg, /warn, 'Sequence does not contain any Pipe 2.0 or later ' + $
      'images'
    return
endif

if n_params() eq 1 then begin
    mask = seqref -> get_flags()
    if n_elements(sun) ne 0 then begin
        if keyword_set(sun) then mask or= mask_bits.sun_bit $
        else mask and= (not mask_bits.sun_bit)
    endif
    if n_elements(moon) ne 0 then begin
        if keyword_set(moon) then mask or= mask_bits.moon_bit $
        else mask and= (not mask_bits.moon_bit)
    endif
    if n_elements(venus) ne 0 then begin
        if keyword_set(venus) then mask or= mask_bits.venus_bit $
        else mask and= (not mask_bits.venus_bit)
    endif
    if n_elements(jupiter) ne 0 then begin
        if keyword_set(jupiter) then mask or= mask_bits.jupiter_bit $
        else mask and= (not mask_bits.jupiter_bit)
    endif
    if n_elements(mercury) ne 0 then begin
        if keyword_set(mercury) then mask or= mask_bits.mercury_bit $
        else mask and= (not mask_bits.mercury_bit)
    endif
    if n_elements(saturn) ne 0 then begin
        if keyword_set(saturn) then mask or= mask_bits.saturn_bit $
        else mask and= (not mask_bits.saturn_bit)
    endif
    if n_elements(mars) ne 0 then begin
        if keyword_set(mars) then mask or= mask_bits.mars_bit $
        else mask and= (not mask_bits.mars_bit)
    endif
    if n_elements(bias) ne 0 then begin
        if keyword_set(bias) then mask or= mask_bits.bias_bit $
        else mask and= (not mask_bits.bias_bit)
    endif
    if n_elements(dark) ne 0 then begin
        if keyword_set(dark) then mask or= mask_bits.dark_bit $
        else mask and= (not mask_bits.dark_bit)
    endif
    if n_elements(squares) ne 0 then begin
        if keyword_set(squares) then mask or= mask_bits.squares_bit $
        else mask and= (not mask_bits.squares_bit)
    endif
    if n_elements(aurora) ne 0 then begin
        if keyword_set(aurora) then mask or= mask_bits.aurora_bit $
        else mask and= (not mask_bits.aurora_bit)
    endif
    if n_elements(particles) ne 0 then begin
        if keyword_set(particles) then mask or= mask_bits.particles_bit $
        else mask and= (not mask_bits.particles_bit)
    endif
endif

seqref -> set_flags, mask

end
