sma

From DavinciWiki
Jump to: navigation, search

Citation

Spectral Mixture Analysis:

  • Ramsey, M. S., and P. R. Christensen (1998), Mineral abundance determination: Quantitative deconvolution of thermal emission spectra, J. Geophys. Res., 103, 577-596.

Surface Atmosphere Separation (surface=1):

  • Smith, M. D., et al. (2000), Separation of atmospheric and surface spectral features in Mars Global Surveyor Thermal Emission Spectrometer (TES) spectra: Models and atmospheric properties, J. Geophys. Res., 105, 9589-9608.

Error Calculation (noerr=0):

  • Rogers, A. D., and O. Aharonson (2008), Mineralogical composition of sands in Meridiani Planum determined from Mars Exploration Rover data and comparison to orbital measurements, J. Geophys. Res, 113.

Nonnegative Least Squares (nn=1):

  • Lawson, C. L., and R. J. Hanson. Solving Least Squares Problems, pp. 160-161 (Problem NNLS). Prentice-Hall, 1974.

Description

Spectral mixture analysis.

Accepts individual spectra or spectral cubes.

See sma_tutorial() for several example cases.

As of version 1.14, this function now includes an option to use a Non-Negative Least Squares fitting routine, which is faster and more accurate than the original routine.

Arguments and Return Values

arg1 = Mixed spectrum or spectra (may also take a standard structure with .data and .xaxis elements)

arg2 = Spectral library. May be an array, or a structure with at least the following elements: .data, .label, and .xaxis. Library must be arranged [specs-x, specs-y, bands]. Xaxis (if input is a structure) must be arranged [1, 1, bands].

[arg3 =] (optional) library of spectra to be forced despite negative concentrations (must be same format as arg2)


Options:

surface = 1 for atm-removed and modeled surface spectra in addition to normal output

wave1 = wavenumber/micron/channel value for modeling (low); default is 400 cm-1

wave2 = wavenumber/micron/channel value for modeling (high); default is 1600 cm-1

band = 1 if wave1 and wave2 are given in channel numbers, instead of frequency (cm-1) or wavelength

bb = 0 do not add blackbody to endmember matrix; bb added by default

group = 1 additional output of model-derived modes summed by mineral group (eg. feldspar abundance, pyroxene abundance). $2 must contain .group. (not recommended for large cubes). Default is 1.

forceall = 1 to keep negative endmember percentages

exclude = vector list of endmembers to exclude (ex:2//39//40).

noerr = 1 do not calculate statistical errors (recommended for large cubes)

resample = 1 resample the mixed cube structure to the endmember library (default=0)

resample = 2 resample the endmember library to the mixed cube structure (default=0)

sort = 1 if you want abundances sorted for each pixel; default is sorting

notchco2 = 1 automatically remove CO2 band in data/library/forced centered at 669 +/- 74 wn

notchco2 = N remove CO2 band in data/library/forced centered at 669 +/- N wn (Default is 0)

nn = 1 Use the non-negative least squares fitting routine (NNLS, faster and more accurate than original routine) to unmix the spectra.


Usage

Syntax: sma(mixed, lib, [forcedlib],[surface],[wave1],[wave2],[band],[bb],[group],[forceall],[exclude],[noerr],[resample],[nn])

Errors/Messages:

“$1 and $2 must have the same z-dimension.”

“$2 and $3 must have the same z-dimension.”

--Your librar(ies) must have the same number of channels as your mixed spectrum.

“$2 and $3 must both have labels or both not have labels.”

“$2 and $3 must both have group labels or both not have group labels.”

--Your mineral library and atmospheric library must be of the same format. If one is a structure with labels, group labels, etc., then the other must be.

“You have more endmembers than bands”.

--Your library is too big. You must have no more endmembers than the number of channels minus one.

"The library does not have .group. Concentrations will not be grouped”

--This means you tried to use the group=1 option but your library does not have .group.

“No wavenumber x-axis found. Using full spectral range.”

--Your library has no .xaxis field, but you tried to specify a wavenumber range. Defaults to full range of channels.

“Structure does not contain member: group”

--You may safely ignore.

Examples

dv> library
struct, 4 elements
   data: 44x1x73 array of float, bsq format [12,848 bytes]
   label: Text Buffer with 44 lines of text
       1: Quartz BUR-4120
       2: Microcline BUR-3460
       3: Albite WAR-0235
       4: Oligoclase BUR-060D
       5: Andesine WAR-0024
       6: Labradorite BUR-3080A
       7: Bytownite WAR-1384
       8: Anorthite BUR-340
       9: Bronzite NMNH-93527
       10: Enstatite HS-9.4B
   xaxis: 1x1x73 array of double, bsq format [584 bytes]
   group: Text Buffer with 44 lines of text
       1: Quartz
       2: K-Feldspar
       3: Plagioclase
       4: Plagioclase
       5: Plagioclase
       6: Plagioclase
       7: Plagioclase
       8: Plagioclase
       9: Orthopyroxene
       10: Orthopyroxene
dv> atmlib
struct, 4 elements
   data: 6x1x73 array of float, bsq format [1,752 bytes]
   label: Text Buffer with 6 lines of text
       1: Dust Low CO2
       2: Dust High CO2
       3: Water Ice Cloud (High Latitude)
       4: Water Ice Cloud (Low Latitude)
       5: co2 dust
       6: h2o dust
   xaxis: 1x1x73 array of float, bsq format [292 bytes]
   group: Text Buffer with 6 lines of text
       1: Atmosphere
       2: Atmosphere
       3: Atmosphere
       4: Atmosphere
       5: Atmosphere
       6: Atmosphere
dv> mixspec
180x70x73 array of float, bsq format [3,679,200 bytes]
Example 1: Exclude endmembers 2, 9, and 44, from library.  Unmix entire cube between 250-1305 cm-1.  Return atmospherically corrected  
emissivity spectra.  Group endmember concentrations using .group in library.
dv> final=sma(mixspec,library,atmlib,wave1=250,wave2=1305,surface=1,exclude=2//9//44, group=1)
Division by zero, 130049 times
struct, 18 elements                                                  Explanation of output
   forcedlib: struct, 4 elements                                     #forcedlib: the 3rd argument (input)
       data: 6x1x73 array of float, bsq format [1,752 bytes]
       group: Text Buffer with 6 lines of text
           1: Atmosphere
           2: Atmosphere
           3: Atmosphere
           4: Atmosphere
           5: Atmosphere
           6: Atmosphere
       label: Text Buffer with 6 lines of text
           1: Dust Low CO2
           2: Dust High CO2
           3: Water Ice Cloud (High Latitude)
           4: Water Ice Cloud (Low Latitude)
           5: co2 dust
           6: h2o dust
       xaxis: 1x1x73 array of float, bsq format [292 bytes]
   excluded: 3x1x1 array of int, bsq format [12 bytes]               #excluded:  the list of excluded vectors (input)
   bb: 180x70x1 array of float, bsq format [50,400 bytes]            #bb: blackbody concentration (derived)
   bberror: 180x70x1 array of float, bsq format [50,400 bytes]       #bberror: statistical error associated with bb concentration (derived)
   normconc: 180x70x47 array of float, bsq format [2,368,800 bytes]  #normconc: concentrations normalized for bb (derived)
   modsur: 180x70x73 array of float, bsq format [3,679,200 bytes]    #modsur:  modeled surface emissivity (derived)
   rematm: 180x70x73 array of float, bsq format [3,679,200 bytes]    #rematm:  surface emissivity (derived)
   measured: 180x70x73 array of float, bsq format [3,679,200 bytes]  #measured: emissivity (input)
   modeled: 180x70x73 array of float, bsq format [3,679,200 bytes]   #modeled: modeled emissivity (derived)
   conc: 180x70x50 array of float, bsq format [2,520,000 bytes]      #conc: library spectrum concentrations (derived)
   rms: 180x70x1 array of float, bsq format [50,400 bytes]           #rms:  root-mean-square error (derived)
   nsamples: 71                                                      #nsamples: number of samples used for modeling (input)
   endlib: struct, 11 elements                                       #endlib: the 2nd argument (input)
       data: 44x1x73 array of float, bsq format [12,848 bytes]
       group: Text Buffer with 44 lines of text
           1: Quartz
           2: K-Feldspar
           3: Plagioclase
           4: Plagioclase
           5: Plagioclase
           6: Plagioclase
           7: Plagioclase
           8: Plagioclase
           9: Orthopyroxene
           10: Orthopyroxene
       label: Text Buffer with 44 lines of text
           1: Quartz BUR-4120
           2: Microcline BUR-3460
           3: Albite WAR-0235
           4: Oligoclase BUR-060D
           5: Andesine WAR-0024
           6: Labradorite �BUR-3080A
           7: Bytownite WAR-1384
           8: Anorthite BUR-340
           9: Bronzite NMNH-93527
           10: Enstatite HS-9.4B
       xaxis: 1x1x73 array of double, bsq format [584 bytes]
   error: 180x70x50 array of float, bsq format [2,520,000 bytes]     #error: statistical error associated with conc (derived from
   grouped: struct, 3 elements                                           square root of diagonal of estimated covariance matrix)
       grouped_conc: 180x70x20 array of float, bsq format [1,008,000 bytes] #grouped: grouped concentrations & associated errors (derived)  
       grouped_error: 180x70x20 array of float, bsq format [1,008,000 bytes]
       grouped_labels: Text Buffer with 20 lines of text
           1: Quartz
           2: K-Feldspar
           3: Plagioclase
           4: Orthopyroxene
           5: Pigeonite
           6: Clinopyroxene
           7: Olivine
           8: Mica
           9: Serpentine
           10: Sheet-silicate
   spectral_range: "Channels 3-73"                                   #spectral_range: channels used for modeling (input)
   wave1: 250                                                        #wave1: low channel used for modeling (input)
   wave2: 1305                                                       #wave2: high channel used for modeling (input)
Example 2:Unmix one spectrum without atmospheric library, between channels 3 and 70.  Group endmember concentrations using .group in 
library.  Do not return statistical errors for modeled concentrations.
dv> final=sma(mixspec[1,1],library,wave1=3,wave2=70,band=1,group=1,noerr=1)
Division by zero, 44 times
struct, 13 elements
   forcedlib: struct, 1 elements
       label: "none"
   bb: 0.00000
   normconc: 1x1x44 array of float, bsq format [176 bytes]
   measured: 1x1x73 array of float, bsq format [292 bytes]
   modeled: 1x1x73 array of float, bsq format [292 bytes]
   conc: 1x1x44 array of float, bsq format [176 bytes]
   rms: 0.00000
   nsamples: 68
   endlib: struct, 11 elements
       data: 44x1x73 array of float, bsq format [12,848 bytes]
       group: Text Buffer with 44 lines of text
           1: Quartz
           2: K-Feldspar
           3: Plagioclase
           4: Plagioclase
           5: Plagioclase
           6: Plagioclase
           7: Plagioclase
           8: Plagioclase
           9: Orthopyroxene
           10: Orthopyroxene
       label: Text Buffer with 44 lines of text
           1: Quartz BUR-4120
           2: Microcline BUR-3460
           3: Albite WAR-0235
           4: Oligoclase BUR-060D
           5: Andesine WAR-0024
           6: Labradorite �BUR-3080A
           7: Bytownite WAR-1384
           8: Anorthite BUR-340
           9: Bronzite NMNH-93527
           10: Enstatite HS-9.4B
       xaxis: 1x1x73 array of double, bsq format [584 bytes]
   grouped: struct, 3 elements
       grouped_conc: 1x1x19 array of float, bsq format [76 bytes]
       grouped_error: 1x1x19 array of float, bsq format [76 bytes]
       grouped_labels: Text Buffer with 19 lines of text
           1: Quartz
           2: K-Feldspar
           3: Plagioclase
           4: Orthopyroxene
           5: Pigeonite
           6: Clinopyroxene
           7: Olivine
           8: Mica
           9: Serpentine
           10: Sheet-silicate
   spectral_range: "Channels 3-70"
   wave1: 3
   wave2: 70

DavinciWiki Mini-Nav Bar

Contents


Contact Developers

  • davinci-dev [AT] mars.asu.edu

All other topics

  • See navigation on the left

Recent Library Changes

Created On: 01-29-2008
Modified On: 03-14-2011

Personal tools