;+ invert bin(energy) relation to find energy(bin) ; ; INPUT: start is an initial estimate of bin value(s) ; f is a temperature/detector dependent constant ; ; KEYWORD: none ; ; OUTPUT: returns an object of the same type and dimension ; as start; object contains energy value(s) ; ; METHOD: two iterations of Newton-Raphson to solve a ; transcendental equation. A tricky part is the ; argument for alog() can be negative, due to ; electronics offsets (say bin 5 is 0 keV). Since only ; brl_makeedges() calls, we assume some properties ; of argument start. If start is a scalar, then ; we're working on the 511keV line, so we won't have ; start <= 0. For slo, we can have several early ; start values negative. Force these to be NaN, and ; proceed with calculations, then force these to ; ascending negative values on return. ; ; An accurate approach is to use complex numbers and ; discard the imaginary part of the result. This gives ; correct negative energy results for bin edges, but ; doubles computational effort. It's not worth it. ; ; NOTES: brl_binvert() should be used only by brl_makeedges() ; ; REVISION HISTORY: ; 14Sep2013: first version ; 17Sep2013: added workaround for negative energy ;- function brl_binvert,start,f badvals=where(start le 0.,cnt) if (cnt gt 0) then $ start[badvals]=!values.f_nan iter1 = (start + f*start) / (1. + f*(1. + alog(start))) badvals=where(iter1 le 0,cnt) if (cnt gt 0) then $ iter1[badvals]=!values.f_nan iter2 = (start + f*iter1) / (1. + f*(1. + alog(iter1))) badvals=where(iter2 le 0 or finite(iter2) eq 0,cnt) if (cnt gt 0) then $ iter2[0:cnt-1]=findgen(cnt)+1-cnt return,iter2 end