#' Parse Avantes converted file
#'
#' Parse Avantes converted file.
#' <https://www.avantes.com/products/spectrometers/>
#'
#' @inheritParams lr_parse_generic
#'
#' @inherit lr_parse_generic return details
#'
#' @examples
#' res_ttt <- lr_parse_ttt(
#' system.file("testdata", "avantes_export.ttt", package = "lightr")
#' )
#' head(res_ttt$data)
#' res_ttt$metadata
#'
#' res_trt <- lr_parse_trt(
#' system.file("testdata", "avantes_export2.trt", package = "lightr")
#' )
#' head(res_trt$data)
#' res_trt$metadata
#'
#' @export
#'
lr_parse_ttt <- function(filename) {
# FIXME: grep to find appropriate lines instead of relying on fixed indices
content <- readLines(filename, skipNul = TRUE)
author <- NA_character_
# nolint start
# FIXME: from what I understand, this "timestamp" is arbitrary since it
# represents the 10*microsecond units since last reset and we don't know
# when last reset occurred
#
# savetime <- grep("^Timestamp", content, value = TRUE)
# savetime <- gsub("^Timestamp \\[.+\\]([[:digit:]]+)$", "\\1", savetime)
# if (length(savetime)==0) {
# savetime <- NA_character_
# }
# nolint end
savetime <- NA_character_
specmodel <- NA_character_
inttime <- gsub("^Integration time: ([[:graph:]]+) ms$", "\\1", content[2])
average <- gsub("^Average: ([[:digit:]]+) scans$", "\\1", content[3])
boxcar <- gsub("^Nr of pixels used for smoothing: ", "", content[4])
# The ID is also sometimes included in the first line (comment line) but not
# always so it's better not to rely on this.
specID <- gsub("^.*: ([[:alnum:]]{9}).*$", "\\1", content[5])
# Avantes does not allow different values between measurements
dark_inttime <- white_inttime <- scope_inttime <- inttime
dark_average <- white_average <- scope_average <- average
dark_boxcar <- white_boxcar <- scope_boxcar <- boxcar
metadata <- c(author, savetime, specmodel, specID,
dark_inttime, white_inttime, scope_inttime,
dark_average, white_average, scope_average,
dark_boxcar, white_boxcar, scope_boxcar)
data_ind <- grep("^([[:digit:];.,-])+$", content)
data <- strsplit(content[data_ind], ";", fixed = TRUE)
data <- do.call(rbind, data)
# Fix decimal for non-English files
data <- gsub(",", ".", data, fixed = TRUE)
colnames(data) <- strsplit(content[data_ind[1] - 2], ";", fixed = TRUE)[[1]]
# Remove trailing whitespaces in names
colnames(data) <- gsub("[[:space:]]*$", "", colnames(data))
storage.mode(data) <- "numeric"
cornames <- c(wl = "Wave",
dark = "Dark",
white = "Ref",
scope = "Sample",
processed = "Transmittance")
data_final <- setNames(
as.data.frame(matrix(NA_real_, nrow = nrow(data), ncol = 5)),
names(cornames)
)
data_final[match(colnames(data), cornames)] <- data
return(list("data" = data_final, "metadata" = metadata))
}
#' @rdname lr_parse_ttt
#'
#' @export
#'
lr_parse_trt <- lr_parse_ttt
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.