;+ ; PURPOSE: ; Calculates the weighted mean of a set of measurements. ; ; CATEGORY: ; Statistics ; ; CALLING SEQUENCE: ; result = wmean(val, dval, [/nan, error = error]) ; ; INPUTS: ; val : A vector of data values ; dval: The error on each data value ; ; KEYWORD PARAMETERS: ; nan: If set, treat NANs as missing data ; error: Set to a named variable to hold the error on the weighted ; mean ; ; OUTPUTS: ; The weighted mean ; ; MODIFICATION HISTORY ; April 2009 Written by Chris Beaumont ; April 23 2009 fixed integer truncation bug ;- function wmean, val, dval, nan = nan, error = error compile_opt idl2 on_error, 2 ;- check inputs if n_params() ne 2 then begin print, 'wmean calling sequence:' print,' result = wmean(val, dval, [/nan, error = error])' return, !values.f_nan endif sz = n_elements(val) if n_elements(dval) ne sz then $ message, 'val and dval must contain the same number of elements' ;- the calculation ;- require at least one finite value if keyword_set(nan) then begin hit = where(finite(val) and finite(dval), ct) if ct eq 0 then begin error = !values.f_nan return, !values.f_nan endif endif dw = total(1D / dval^2, nan = keyword_set(nan)) sum = total(1D * val / dval^2, nan = keyword_set(nan)) / dw error = sqrt(1D / dw) return, sum end