Goal: Assess the effect of different illuminators on radiance and reflectance readings of the White Reference (WR).

require(ggplot2)
require(plotly)
library(RColorBrewer)
require(prospectr)
library(soilspec)
#NOTE: there is also asdreader::get_spectra() (see EspCrater_FS3_nb.Rmd)

# > getwd()
# [1] "/media/alobo/DecepNTFS2/HSI_Lab/Testllum_20230706/Rtestllum_20230706"

dirdat <- ".."

1. Reading data

#Done in datadoc_log.R:
# f <- list.files(dirdat, patt=glob2rx("*.asd"))
# f2 <- substring(f,9)
# f2 <- unlist(strsplit(f2,".asd"))
# f3 <- data.frame(file=f, type=f2, time=file.mtime(file.path(dirdat,f)))
# f3 <- f3[order(f3$time),]
# #write.csv(f3, file="testllum_20230706_samples.csv", row.names = FALSE)
# #edited to become "testllum_20230706_samples_v2.csv"

f <- read.csv("testllum_20230706_samples_v2.csv", stringsAsFactors = FALSE)
f$ID <- paste0(f$type,"_",f$replicate)
f <- na.omit(f)
f <- f[f$type!="X",]

2. Build data frame (long format)

d.lf <-  NULL
for (i in 1:nrow(f)) {
  r <- readASD(file.path(dirdat,f$file[i]), out_format = 'list')[[1]]$radiance
  rf <- readASD(file.path(dirdat,f$file[i]), out_format = 'list')[[1]]$reference
  s <- readASD(file.path(dirdat,f$file[i]), out_format = 'list')[[1]]$reflectance
  w <- readASD(file.path(dirdat,f$file[i]), out_format = 'list')[[1]]$wavelength
  #sc <- spliceCorrection(s,wav=w, splice = c(1000, 1800))
  d.lf <- rbind(d.lf,data.frame(f[i,],w,r,rf,s))
  #d <- cbind(d,)
}
head(d.lf,3)

3. White reference spectra with each illumination type

3.1 Radiance

g1 <- ggplot(data=d.lf) +
  geom_line(aes(x=w, y=r, color=type, group=file), linewidth=0.3) +
  xlab("Wavelength") + ylab("Radiance (DN)") + 
  scale_color_brewer(palette = "Set1")
ggplotly(g1+ggtitle("All readings"))

g2 <- ggplot(data=d.lf[d.lf$self_opt=="Y",]) +
  geom_line(aes(x=w, y=r, color=type, group=file), linewidth=0.3) +
  xlab("Wavelength") + ylab("Radiance (DN)") + 
  scale_color_brewer(palette = "Set1")
#ggplotly(g2 + ggtitle("Readings with self-optimization only"))
ggplotly(g2 + facet_wrap(~grade, nrow=2) + ggtitle("Readings with self-optimization only"))

3.2 Reflectance

g4 <- ggplot(data=d.lf[d.lf$self_opt=="Y",]) +
[WARNING] Deprecated: --self-contained. use --embed-resources --standalone
  geom_line(aes(x=w, y=s, color=type, group=file), linewidth=0.3) +
  #geom_point(aes(x=Wavelength, y=Reflectance,color=site, group=file)) +
  xlab("Wavelength") + ylab("Reflectance") + 
  scale_color_brewer(palette = "Set1")
ggplotly(g4 + facet_wrap(~grade, nrow=2) + ggtitle("Readings with self-optimization only"))

The behavior of the first 2 spectra with the ASD illuminator might be consequence of not having waited for warm-up.

4. Comparison of consumer grade bulbs

4.1 Radiance

dK <- d.lf[d.lf$self_opt=="Y" & d.lf$type=="KAISER", c(9,10,12)]
[WARNING] Deprecated: --self-contained. use --embed-resources --standalone
dV <- d.lf[d.lf$self_opt=="Y" & d.lf$type=="VILALTA_2",c(9,10,12)]
#head(dK)
#head(dV)

dKV <- cbind(dK,rV=dV$r, sV=dV$s)
#head(dKV)
names(dKV)[2:3] <- c("rK", "sK")
dKV$detector <- "1"
dKV$detector[dKV$w>1000 & dKV$w<=1800] <- "2"
dKV$detector[dKV$w>1800] <- "3"

g3 <- ggplot(data=dKV) +
  geom_point(aes(x=rK,y=rV, color=detector),size=0.5,alpha=0.5)+
  xlab("Kaiser") + ylab("Vilalta") +
  theme(aspect.ratio = 1) +
  ggtitle("Radiance (DN) Vilalta vs Kaiser bulbs")
#print(g3 + facet_wrap(~detector, ncol=2, scales="free"))
ggplotly(g3)

g3b <- ggplot(data=dKV) +
  geom_point(aes(x=sK,y=sV, color=detector),shape=21, size=0.5)+
  xlab("Kaiser") + ylab("Vilalta") +
  theme(aspect.ratio = 1) +
  ggtitle("Reflectance: Vilalta vs Kaiser bulbs")
#print(g3 + facet_wrap(~detector, ncol=2, scales="free"))
ggplotly(g3b)

This makes sense, as we have a uniform white target, thus the observed variability of the reflectance readings is not related to that of the target and the 2 spectra are independent.

#d.lfsel <- d.lf[d.lf$self_opt=="Y" & d.lf$grade == "consumer",]
d.lfsel <- d.lf[d.lf$self_opt=="Y" & d.lf$ID!="ASD_1_1" & d.lf$ID!="ASD_1_2",]
g3c <- ggplot(data=d.lfsel) +
  geom_boxplot(aes(x=type,y=s, color=type),notch = TRUE) +
  xlab("Illuminator") + ylab("Reflectance") +
  facet_wrap(~grade, scales="free_x") +
  ggtitle("WR Reflectance by illuminators")
ggplotly(g3c)
NA

Note: The 2 weird initial ASD_1 spectra have not been taken into consideration for this boxplot.

6. Conclusions

  1. Pattern of performance is different for each detector.
  2. Consumer-grade bulbs are less powerful, in particular < 1000 nm (detector 1).
  3. The sinusoidal variability observed in the lab with the consumer-grade bulbs is clearly visible in the reflectance spectra > 1000 nm
  4. Consumer-grade bulbs seem ok < 1000 nm (thus for the IQ), but cannot be used > 1000 nm
  5. Consumer-grade bulbs VILALTA and KAISER are not dignificantly different.
  6. The best illuminator appears to be PROLAMP.
  7. We should assess the actual effect of the different illuminators on the reflectance of the standard reference, as this is what is the most interesting from a user’s perspective.
LS0tCnRpdGxlOiAnUmFkaWFuY2UgYW5kIFJlZmxlY3RhbmNlIHNwZWN0cmEgdW5kZXIgZGlmZmVyZW50IGxhYiBpbGx1bWluYXRvcnMnCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IG5vCiAgICB0b2NfZmxvYXQ6IG5vCi0tLQoKKiBBZ3VzdGluLkxvYm9AZ2VvM2Jjbi5jc2ljLmVzCiogMjAyMzA3MDYKCioqR29hbCoqOiBBc3Nlc3MgdGhlIGVmZmVjdCBvZiBkaWZmZXJlbnQgaWxsdW1pbmF0b3JzIG9uIHJhZGlhbmNlIGFuZCByZWZsZWN0YW5jZSByZWFkaW5ncyBvZiB0aGUgV2hpdGUgUmVmZXJlbmNlIChXUikuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUocGxvdGx5KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcmVxdWlyZShwcm9zcGVjdHIpCmxpYnJhcnkoc29pbHNwZWMpCiNOT1RFOiB0aGVyZSBpcyBhbHNvIGFzZHJlYWRlcjo6Z2V0X3NwZWN0cmEoKSAoc2VlIEVzcENyYXRlcl9GUzNfbmIuUm1kKQoKIyA+IGdldHdkKCkKIyBbMV0gIi9tZWRpYS9hbG9iby9EZWNlcE5URlMyL0hTSV9MYWIvVGVzdGxsdW1fMjAyMzA3MDYvUnRlc3RsbHVtXzIwMjMwNzA2IgoKZGlyZGF0IDwtICIuLiIKYGBgCgojIyAxLiBSZWFkaW5nIGRhdGEKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI0RvbmUgaW4gZGF0YWRvY19sb2cuUjoKIyBmIDwtIGxpc3QuZmlsZXMoZGlyZGF0LCBwYXR0PWdsb2IycngoIiouYXNkIikpCiMgZjIgPC0gc3Vic3RyaW5nKGYsOSkKIyBmMiA8LSB1bmxpc3Qoc3Ryc3BsaXQoZjIsIi5hc2QiKSkKIyBmMyA8LSBkYXRhLmZyYW1lKGZpbGU9ZiwgdHlwZT1mMiwgdGltZT1maWxlLm10aW1lKGZpbGUucGF0aChkaXJkYXQsZikpKQojIGYzIDwtIGYzW29yZGVyKGYzJHRpbWUpLF0KIyAjd3JpdGUuY3N2KGYzLCBmaWxlPSJ0ZXN0bGx1bV8yMDIzMDcwNl9zYW1wbGVzLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQojICNlZGl0ZWQgdG8gYmVjb21lICJ0ZXN0bGx1bV8yMDIzMDcwNl9zYW1wbGVzX3YyLmNzdiIKCmYgPC0gcmVhZC5jc3YoInRlc3RsbHVtXzIwMjMwNzA2X3NhbXBsZXNfdjIuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpmJElEIDwtIHBhc3RlMChmJHR5cGUsIl8iLGYkcmVwbGljYXRlKQpmIDwtIG5hLm9taXQoZikKZiA8LSBmW2YkdHlwZSE9IlgiLF0KYGBgCgojIyAyLiBCdWlsZCBkYXRhIGZyYW1lIChsb25nIGZvcm1hdCkKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZC5sZiA8LSAgTlVMTApmb3IgKGkgaW4gMTpucm93KGYpKSB7CiAgciA8LSByZWFkQVNEKGZpbGUucGF0aChkaXJkYXQsZiRmaWxlW2ldKSwgb3V0X2Zvcm1hdCA9ICdsaXN0JylbWzFdXSRyYWRpYW5jZQogIHJmIDwtIHJlYWRBU0QoZmlsZS5wYXRoKGRpcmRhdCxmJGZpbGVbaV0pLCBvdXRfZm9ybWF0ID0gJ2xpc3QnKVtbMV1dJHJlZmVyZW5jZQogIHMgPC0gcmVhZEFTRChmaWxlLnBhdGgoZGlyZGF0LGYkZmlsZVtpXSksIG91dF9mb3JtYXQgPSAnbGlzdCcpW1sxXV0kcmVmbGVjdGFuY2UKICB3IDwtIHJlYWRBU0QoZmlsZS5wYXRoKGRpcmRhdCxmJGZpbGVbaV0pLCBvdXRfZm9ybWF0ID0gJ2xpc3QnKVtbMV1dJHdhdmVsZW5ndGgKICAjc2MgPC0gc3BsaWNlQ29ycmVjdGlvbihzLHdhdj13LCBzcGxpY2UgPSBjKDEwMDAsIDE4MDApKQogIGQubGYgPC0gcmJpbmQoZC5sZixkYXRhLmZyYW1lKGZbaSxdLHcscixyZixzKSkKICAjZCA8LSBjYmluZChkLCkKfQpoZWFkKGQubGYsMykKYGBgCiMjIDMuIFdoaXRlIHJlZmVyZW5jZSBzcGVjdHJhIHdpdGggZWFjaCAgIGlsbHVtaW5hdGlvbiB0eXBlCiMjIyAzLjEgUmFkaWFuY2UKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CmcxIDwtIGdncGxvdChkYXRhPWQubGYpICsKICBnZW9tX2xpbmUoYWVzKHg9dywgeT1yLCBjb2xvcj10eXBlLCBncm91cD1maWxlKSwgbGluZXdpZHRoPTAuMykgKwogIHhsYWIoIldhdmVsZW5ndGgiKSArIHlsYWIoIlJhZGlhbmNlIChETikiKSArIAogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQpnZ3Bsb3RseShnMStnZ3RpdGxlKCJBbGwgcmVhZGluZ3MiKSkKCmcyIDwtIGdncGxvdChkYXRhPWQubGZbZC5sZiRzZWxmX29wdD09IlkiLF0pICsKICBnZW9tX2xpbmUoYWVzKHg9dywgeT1yLCBjb2xvcj10eXBlLCBncm91cD1maWxlKSwgbGluZXdpZHRoPTAuMykgKwogIHhsYWIoIldhdmVsZW5ndGgiKSArIHlsYWIoIlJhZGlhbmNlIChETikiKSArIAogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQojZ2dwbG90bHkoZzIgKyBnZ3RpdGxlKCJSZWFkaW5ncyB3aXRoIHNlbGYtb3B0aW1pemF0aW9uIG9ubHkiKSkKZ2dwbG90bHkoZzIgKyBmYWNldF93cmFwKH5ncmFkZSwgbnJvdz0yKSArIGdndGl0bGUoIlJlYWRpbmdzIHdpdGggc2VsZi1vcHRpbWl6YXRpb24gb25seSIpKQpgYGAKCiMjIDMuMiBSZWZsZWN0YW5jZQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KZzQgPC0gZ2dwbG90KGRhdGE9ZC5sZltkLmxmJHNlbGZfb3B0PT0iWSIsXSkgKwogIGdlb21fbGluZShhZXMoeD13LCB5PXMsIGNvbG9yPXR5cGUsIGdyb3VwPWZpbGUpLCBsaW5ld2lkdGg9MC4zKSArCiAgI2dlb21fcG9pbnQoYWVzKHg9V2F2ZWxlbmd0aCwgeT1SZWZsZWN0YW5jZSxjb2xvcj1zaXRlLCBncm91cD1maWxlKSkgKwogIHhsYWIoIldhdmVsZW5ndGgiKSArIHlsYWIoIlJlZmxlY3RhbmNlIikgKyAKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikKZ2dwbG90bHkoZzQgKyBmYWNldF93cmFwKH5ncmFkZSwgbnJvdz0yKSArIGdndGl0bGUoIlJlYWRpbmdzIHdpdGggc2VsZi1vcHRpbWl6YXRpb24gb25seSIpKQpgYGAKVGhlIGJlaGF2aW9yIG9mIHRoZSBmaXJzdCAyIHNwZWN0cmEgd2l0aCB0aGUgQVNEIGlsbHVtaW5hdG9yIG1pZ2h0IGJlIGNvbnNlcXVlbmNlIG9mIG5vdCBoYXZpbmcgd2FpdGVkIGZvciB3YXJtLXVwLgoKIyMgNC4gQ29tcGFyaXNvbiBvZiBjb25zdW1lciBncmFkZSBidWxicwojIyMgNC4xIFJhZGlhbmNlCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CmRLIDwtIGQubGZbZC5sZiRzZWxmX29wdD09IlkiICYgZC5sZiR0eXBlPT0iS0FJU0VSIiwgYyg5LDEwLDEyKV0KZFYgPC0gZC5sZltkLmxmJHNlbGZfb3B0PT0iWSIgJiBkLmxmJHR5cGU9PSJWSUxBTFRBXzIiLGMoOSwxMCwxMildCiNoZWFkKGRLKQojaGVhZChkVikKCmRLViA8LSBjYmluZChkSyxyVj1kViRyLCBzVj1kViRzKQojaGVhZChkS1YpCm5hbWVzKGRLVilbMjozXSA8LSBjKCJySyIsICJzSyIpCmRLViRkZXRlY3RvciA8LSAiMSIKZEtWJGRldGVjdG9yW2RLViR3PjEwMDAgJiBkS1Ykdzw9MTgwMF0gPC0gIjIiCmRLViRkZXRlY3RvcltkS1Ykdz4xODAwXSA8LSAiMyIKCmczIDwtIGdncGxvdChkYXRhPWRLVikgKwogIGdlb21fcG9pbnQoYWVzKHg9cksseT1yViwgY29sb3I9ZGV0ZWN0b3IpLHNpemU9MC41LGFscGhhPTAuNSkrCiAgeGxhYigiS2Fpc2VyIikgKyB5bGFiKCJWaWxhbHRhIikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpICsKICBnZ3RpdGxlKCJSYWRpYW5jZSAoRE4pIFZpbGFsdGEgdnMgS2Fpc2VyIGJ1bGJzIikKI3ByaW50KGczICsgZmFjZXRfd3JhcCh+ZGV0ZWN0b3IsIG5jb2w9Miwgc2NhbGVzPSJmcmVlIikpCmdncGxvdGx5KGczKQoKZzNiIDwtIGdncGxvdChkYXRhPWRLVikgKwogIGdlb21fcG9pbnQoYWVzKHg9c0sseT1zViwgY29sb3I9ZGV0ZWN0b3IpLHNoYXBlPTIxLCBzaXplPTAuNSkrCiAgeGxhYigiS2Fpc2VyIikgKyB5bGFiKCJWaWxhbHRhIikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpICsKICBnZ3RpdGxlKCJSZWZsZWN0YW5jZTogVmlsYWx0YSB2cyBLYWlzZXIgYnVsYnMiKQojcHJpbnQoZzMgKyBmYWNldF93cmFwKH5kZXRlY3RvciwgbmNvbD0yLCBzY2FsZXM9ImZyZWUiKSkKZ2dwbG90bHkoZzNiKQpgYGAKVGhpcyBtYWtlcyBzZW5zZSwgYXMgd2UgaGF2ZSBhIHVuaWZvcm0gd2hpdGUgdGFyZ2V0LCB0aHVzIHRoZSBvYnNlcnZlZCB2YXJpYWJpbGl0eSBvZiB0aGUgcmVmbGVjdGFuY2UgcmVhZGluZ3MgaXMgbm90IHJlbGF0ZWQgdG8gdGhhdCBvZiB0aGUgdGFyZ2V0CmFuZCB0aGUgMiBzcGVjdHJhIGFyZSBpbmRlcGVuZGVudC4gCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQojZC5sZnNlbCA8LSBkLmxmW2QubGYkc2VsZl9vcHQ9PSJZIiAmIGQubGYkZ3JhZGUgPT0gImNvbnN1bWVyIixdCmQubGZzZWwgPC0gZC5sZltkLmxmJHNlbGZfb3B0PT0iWSIgJiBkLmxmJElEIT0iQVNEXzFfMSIgJiBkLmxmJElEIT0iQVNEXzFfMiIsXQpnM2MgPC0gZ2dwbG90KGRhdGE9ZC5sZnNlbCkgKwogIGdlb21fYm94cGxvdChhZXMoeD10eXBlLHk9cywgY29sb3I9dHlwZSksbm90Y2ggPSBUUlVFKSArCiAgeGxhYigiSWxsdW1pbmF0b3IiKSArIHlsYWIoIlJlZmxlY3RhbmNlIikgKwogIGZhY2V0X3dyYXAofmdyYWRlLCBzY2FsZXM9ImZyZWVfeCIpICsKICBnZ3RpdGxlKCJXUiBSZWZsZWN0YW5jZSBieSBpbGx1bWluYXRvcnMiKQpnZ3Bsb3RseShnM2MpCgpgYGAKCioqTm90ZSoqOiBUaGUgMiB3ZWlyZCBpbml0aWFsIEFTRF8xIHNwZWN0cmEgaGF2ZSBub3QgYmVlbiB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gZm9yIHRoaXMgYm94cGxvdC4KCgoKIyMgNi4gQ29uY2x1c2lvbnMKCjEuIFBhdHRlcm4gb2YgcGVyZm9ybWFuY2UgaXMgZGlmZmVyZW50IGZvciBlYWNoIGRldGVjdG9yLgoyLiBDb25zdW1lci1ncmFkZSBidWxicyBhcmUgbGVzcyBwb3dlcmZ1bCwgaW4gcGFydGljdWxhciA8IDEwMDAgbm0gKGRldGVjdG9yIDEpLgozLiBUaGUgc2ludXNvaWRhbCB2YXJpYWJpbGl0eSBvYnNlcnZlZCBpbiB0aGUgbGFiIHdpdGggdGhlIGNvbnN1bWVyLWdyYWRlIGJ1bGJzIGlzIGNsZWFybHkgdmlzaWJsZSBpbiB0aGUgcmVmbGVjdGFuY2Ugc3BlY3RyYSA+IDEwMDAgbm0KNC4gQ29uc3VtZXItZ3JhZGUgYnVsYnMgc2VlbSBvayA8IDEwMDAgbm0gKHRodXMgZm9yIHRoZSBJUSksIGJ1dCBjYW5ub3QgYmUgdXNlZCA+IDEwMDAgbm0KNS4gQ29uc3VtZXItZ3JhZGUgYnVsYnMgVklMQUxUQSBhbmQgS0FJU0VSIGFyZSBub3QgZGlnbmlmaWNhbnRseSBkaWZmZXJlbnQuCjYuIFRoZSBiZXN0IGlsbHVtaW5hdG9yIGFwcGVhcnMgdG8gYmUgUFJPTEFNUC4KNy4gKipXZSBzaG91bGQgYXNzZXNzIHRoZSBhY3R1YWwgZWZmZWN0IG9mIHRoZSBkaWZmZXJlbnQgaWxsdW1pbmF0b3JzIG9uIHRoZSByZWZsZWN0YW5jZSBvZiB0aGUgc3RhbmRhcmQgcmVmZXJlbmNlLCBhcyB0aGlzIGlzIHdoYXQgaXMgdGhlIG1vc3QgaW50ZXJlc3RpbmcgZnJvbSBhIHVzZXIncyBwZXJzcGVjdGl2ZS4qKgogCg==