Viewing contents of file '../idllib/contrib/buie/edgefit.pro'
;+
; NAME:
; edgefit
; PURPOSE:
; Fit an edge between two signal levels
; DESCRIPTION:
; CATEGORY:
; Function fitting
; CALLING SEQUENCE:
; edgefit,x,y
; INPUTS:
; x - independent variable (vector)
; y - dependent variable (vector)
; OPTIONAL INPUT PARAMETERS:
; KEYWORD INPUT PARAMETERS:
; OUTPUTS:
; Two plots are generated and the fitted values are printed to the screen.
; KEYWORD OUTPUT PARAMETERS:
; COMMON BLOCKS:
; SIDE EFFECTS:
; RESTRICTIONS:
; PROCEDURE:
; MODIFICATION HISTORY:
; 96/12/23, Written by Marc W. Buie, Lowell Observatory
;-
function edgefit_func, vec
common edgefit_common,x,y,dx,len,model
left = vec[0]
right = vec[1]
midpt = vec[2]
model = fltarr(len)
model[where(x lt midpt-dx/2.0)]=left
model[where(x gt midpt+dx/2.0)]=right
z=where(midpt-dx/2.0 le x and midpt+dx/2.0 ge x,count)
if count ne 0 then begin
if left lt right then $
model[z] = (right*(midpt-(x[z]-dx/2.0)) + left*((x[z]-dx/2.0)-midpt))/dx $
else $
model[z] = (left*(midpt-(x[z]-dx/2.0)) + right*((x[z]-dx/2.0)-midpt))/dx
endif
; print,'aaaa ',model(z)
return,total((y-model)^2)
end
pro edgefit,x,y
common edgefit_common,xdat,ydat,dx,len,model
len=n_elements(x)
xdat=x
ydat=y
; Get the mean level at the ends (first and last 10%)
left = mean(y[0:0.1*len])
right = mean(y[0.9*len:len-1])
print,left,right
midpt = x[len/2]
dx=x[1]-x[0]
vals=[left,right,midpt]
dirs=[[0.1,0,0],[0,0.1,0],[0,0,0.1]]
powell,vals,dirs,0.0001,chibest,'edgefit_func'
print,dirs
; chibest=edgefit_func([left,right,midpt])
setwin,0
plot,x,y
oplot,x,model,psym=-5
setwin,1
plot,x,y-model
print,left,right,midpt
print,chibest
end