; docformat = 'rst'
;+
;
; This is an example of clustering (kmeans) PAH absorption spectra,
; built around the functionality provided by the AmesPAHdbIDLSuite and
; should help confirm that it has been properly installed. The
; source code is annotated to guide users and developers in the inner
; workings of the suite.
;
; Updated versions of the NASA Ames PAH IR Spectroscopic Database and
; more information can be found at: `www.astrochemistry.org/pahdb <https://www.astrochemistry.org/pahdb>`.
;
; :Examples:
; Call the procedure directly::
;
; IDL> cluster_db_spectra
;
; :Author:
; Dr. Christiaan Boersma
;
; :Copyright:
; BSD licensed
;
; :History:
; Changes::
;
; 08-19-2019
; Documentation added. Christiaan Boersma.
;-
;+
; Procedure performing the clustering analyzes.
;
; :Categories:
; Example
;-
PRO CLUSTER_DB_SPECTRA
COMPILE_OPT IDL2
; define FWHM, frequency range, number of points and number of clusters to use
fwhm = 20D
xrange = 1D4 / [15, 2.5D]
npoints = 301L
nclusters = 2
; read in the default database defined by the environement variable
; !AMESPAHDEFAULTDB or the system variable AMESPAHDEFAULTDB. use the
; keyword FILENAME if these have not been set
pahdb = OBJ_NEW('AmesPAHdbIDLSuite')
; retrieve all transitions for all species from the database
transitions = pahdb->getTransitionsByUID(-1)
uids = pahdb->Search("c>20", nuids)
; convolve spectra
spectrum = transitions->Convolve(FWHM=fwhm, Xrange=xrange, Npoints=npoints)
; obtain the spectrum for use outside object
spectra = spectrum->Get()
; set all integrated intensities to unity
FOR i = 0, nuids - 1 DO BEGIN
sel = WHERE(spectra.data.uid EQ uids[i])
spectra.data[sel].intensity /= INT_TABULATED(spectra.grid, spectra.data[sel].intensity)
ENDFOR
; clean up objects
OBJ_DESTROY,[transitions, spectrum, pahdb]
; define matrix
matrix = DBLARR(npoints, nuids, /NOZERO)
; fill matrix
FOR i = 0, nuids - 1 DO BEGIN
sel = WHERE(spectra.data.uid EQ uids[i])
matrix[*,i] = spectra.data[sel].intensity
ENDFOR
; perform k-means cluster analysis
means = CLUST_WTS(matrix, $
N_CLUSTERS=nclusters, $
/DOUBLE, $
N_ITERATIONS=128)
; obtain cluster members
clusters = CLUSTER(matrix, means, N_CLUSTERS=nclusters, /DOUBLE)
; plot means
PLOT,spectra.grid,[0,1],YRANGE=MINMAX(means),XTITLE='frequency [cm!U-1!N]',YTITLE='normalized intensity [km/mol]',/NODATA
FOR i = 0, nclusters - 1 DO OPLOT,spectra.grid,means[*,i],COLOR=i+2
END