FUNCTION DO_NNLS
COMPILE_OPT IDL2
!EXCEPT = 0
nspectra = 20
fwhm = 20D
sn = 100D
xrange = [20D, 2.5D]
pahdb = OBJ_NEW('AmesPAHdbIDLSuite')
species = pahdb->getSpeciesByUID( -1 )
uids = (species->Get()).data.uid
nuids = N_ELEMENTS(uids)
n = nspectra
indices = LONARR(nspectra)
WHILE n GT 0 DO BEGIN
indices[nspectra - n] = LONG(RANDOMU(seed, n) * nuids)
indices = indices[SORT(indices)]
u = UNIQ(indices)
n = nspectra - N_ELEMENTS(u)
indices[0] = indices[u]
ENDWHILE
selected_uids = uids[indices]
transitions = pahdb->getTransitionsByUID(selected_uids)
spectrum = transitions->Convolve(FWHM=fwhm, /Gaussian, XRange=1D4/xrange)
selected_weights = REPLICATE({uid:0L, weight:0D}, nspectra)
selected_weights.uid = selected_uids
selected_weights.weight = RANDOMU(LONG(SYSTIME(1)), nspectra, /DOUBLE)
coadd = spectrum->Coadd(Weights=selected_weights)
coadd_s = coadd->Get()
noise = MAX(coadd_s.data.intensity) * RANDOMN(seed, N_ELEMENTS(coadd_s.data)) / sn
coadd_s.data.intensity += noise
OBJ_DESTROY,[spectrum, transitions, species]
transitions = pahdb->getTransitionsByUID( -1 )
spectrum = transitions->Convolve(FWHM=fwhm, /Gaussian, XRange=1D4/xrange)
fit = spectrum->Fit(coadd_s.data.intensity)
found_uids = fit->getUIDS()
found_weights = fit->getWeights()
OBJ_DESTROY,[fit, coadd, spectrum, transitions, pahdb]
all_uids = [selected_uids, found_uids]
srt = SORT(all_uids)
all_uids = all_uids[srt]
all_uids = all_uids[UNIQ(all_uids)]
nall_uids = N_ELEMENTS(all_uids)
PRINT,FORMAT='(A10,4X,A10)',"UID","weight"
PRINT,FORMAT='(A0,X,A0,X,A0,X,A0)',"selected","found","selected","found"
FOR i = 0, nall_uids - 1 DO BEGIN
select = WHERE(selected_uids EQ all_uids[i], count)
IF count EQ 0 THEN BEGIN
selected_uid = ''
selected_weight = ''
ENDIF ELSE BEGIN
selected_uid = STRING(FORMAT='(I4)', selected_uids[select])
select = WHERE(selected_weights.uid EQ all_uids[i])
selected_weight = STRING(FORMAT='(G7.2)', selected_weights[select].weight)
ENDELSE
select = WHERE(found_uids EQ all_uids[i], count)
IF count EQ 0 THEN BEGIN
found_uid = ''
found_weight = ''
ENDIF ELSE BEGIN
found_uid = STRING(FORMAT='(I4)', found_uids[select])
select = WHERE(found_weights.uid EQ all_uids[i])
found_weight = STRING(FORMAT='(G7.2)', found_weights[select].weight)
ENDELSE
PRINT,FORMAT='(A3,4X,A3,4X,A7,4X,A7)',selected_uid,found_uid,selected_weight,found_weight
ENDFOR
points = {x:0D, y:0D}
FOR i = 0, nspectra - 1 DO BEGIN
select = WHERE(selected_uids[i] EQ found_uids , nselect)
IF nselect EQ 0 THEN found_weight = 0D $
ELSE BEGIN
select = WHERE(selected_uids[i] EQ found_weights.uid)
found_weight = found_weights[select].weight
ENDELSE
points = [points, {x:selected_weights[i].weight, y:found_weight}]
ENDFOR
RETURN,points[1:*]
END
PRO TEST_NNLS
COMPILE_OPT IDL2
points = {x:0D, y:0D}
FOR i = 0, 5 DO points = [points, DO_NNLS()]
points = points[1:*]
PLOT,[0,MAX(points.x)],[0,MAX(points.y)],XTITLE='input weights',YTITLE='output weights',/NODATA
OPLOT,[0,1],[0,1],LINESTYLE=5,COLOR=2
OPLOT,points.x,points.y,PSYM=1
END