Skip to content

Instantly share code, notes, and snippets.

@jywarren
Last active December 20, 2015 11:09
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save jywarren/6121454 to your computer and use it in GitHub Desktop.
Valley detection, based on peak detection macro by Peter Davidowicz, adapted by jywarren (https://gist.github.com/jywarren/6020668)
/* Sample data:
$W.spectrum_data = {"lines":[
{"wavelength":842.3466875,"b":21,"g":13,"r":30,"average":21},
{"wavelength":841.455655089628,"b":13,"g":5,"r":22,"average":13},
{"wavelength":840.564622679257,"b":0,"g":0,"r":27,"average":9},
]
}
Now, setup a Spectral Workbench macro (although we'll keep it commented out until we're ready to deploy it):
*/
setup: function() {
// code to run on startup
compare = function(dist,i,pixels) {
if (dist <= 1) return true
else return (compare(dist-1,i,pixels)) && pixels[i+dist]['average'] >= pixels[i]['average'] && pixels[i-dist]['average'] > pixels[i]['average']
}
detect_peaks = function(search_dist) {
var peaks = []
var peak_wavelengths = []
var pixels = $W.spectrum.lines
for (var i = search_dist; i < pixels.length-search_dist+1; i++) { //start a few pixels because we need to compare to neighboring pixels
if (pixels[i]['average'] < pixels[i-1]['average']) {
if (compare(search_dist,i,pixels)) { //This skips tiny valleys, more checks (increasing search_dist) skips larger valleys
// Pixel is Peak Pixel, add it to peak pixel list
peaks.push(pixels[i]) // here, adding the entire pixel object, including separate rgb and wavelength values
peaks[peaks.length-1]['index'] = i // save the pixel index too
peak_wavelengths.push(parseFloat(pixels[i]['wavelength'].toFixed(2))) // here, adding just the rounded wavelength
$W.plot.highlight(0,i) // highlight the peak on the graph
}
}
}
alert(peak_wavelengths.join(','))
return peaks
}
detect_peaks(5)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment