FUNCTION cafe_minimize_chisq, parameter, env ;+ ; NAME: ; cafe_minimize_chisq ; ; PURPOSE: ; chi^2 metric function ; ; CATEGORY: ; cafe ; ; SYNTAX: ; minimize,chisq ; ; INPUTS: ; - x, y, error, model(x) ; - parameter of the model ; ; OUTPUT: ; Returns the chi^2-value for given set of parameters: ; chi^2 = sum((y-model(x))^2/error^2) ; ; ; SIDE EFFECTS: ; None. ; ; ; HISTORY: ; $Id: cafe_minimize_chisq.pro,v 1.2 2005/01/04 10:56:05 goehler Exp $ ;- ; ; $Log: cafe_minimize_chisq.pro,v $ ; Revision 1.2 2005/01/04 10:56:05 goehler ; fix: make shure all (internal) routines are properly documented ; ; Revision 1.1 2004/08/02 07:08:37 goehler ; meta-fit command which allows different metrics which are minimized (instead of ; chi^2 minimization alone) ; ; ; ;; ------------------------------------------------------------ ;; CALL MODEL FUNCTION, BUILD MODEL Y VALUES ;; ------------------------------------------------------------ ;; startup value for chi^2-value: chi2 = 0.D0 FOR group=0, n_elements((*env).groups)-1 DO BEGIN ;; skip groups without model: IF (*env).groups[group].model EQ "" THEN CONTINUE ;; ------------------------------------------------------------ ;; COMPUTE Y/ERROR VALUE FOR EACH SUBGROUP: ;; ------------------------------------------------------------ ;; check all subgroups, build y/error array FOR subgroup = 0, n_elements((*env).groups[group].data)-1 DO BEGIN ;; skip not defined data sets (subgroups) IF NOT PTR_VALID((*env).groups[group].data[subgroup].y) THEN CONTINUE ;; index for defined values: IF (*env).fitresult.selected THEN BEGIN def_index = where(*(*env).groups[group].data[subgroup].def AND $ *(*env).groups[group].data[subgroup].selected) ENDIF ELSE BEGIN def_index = where(*(*env).groups[group].data[subgroup].def) ENDELSE ;; no index found -> next data set IF def_index[0] EQ -1 THEN CONTINUE ;; create error column: IF ptr_valid((*env).groups[group].data[subgroup].err) THEN $ err = (*(*env).groups[group].data[subgroup].err)[def_index] $ ELSE err = make_array(n_elements(def_index),value=1.d0,/double) ;; add up chi^2: chi2 = chi2 +total(( $ (*(*env).groups[group].data[subgroup].y)[def_index] $ - (cafemodel(env, (*(*env).groups[group].data[subgroup].x), $ group) $ )[def_index])^2/err^2) ENDFOR ENDFOR return,chi2 END