You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.5 KiB
R
86 lines
3.5 KiB
R
source("/home/taha/chepec/chetex/common/R/common/ProvideSampleId.R")
|
|
|
|
xrfspectro2df <- function(smpfile) {
|
|
## Description:
|
|
## Reads XRF textfile from XLAB SPECTRO XRF.
|
|
## Stores data in data frame and parameters in an attributed dataframe.
|
|
## Usage:
|
|
## xrfspectro2df(smpfile)
|
|
## Arguments:
|
|
## smpfile: character string, the full filename
|
|
## (with path) to one SMP file (ASCII).
|
|
## Value:
|
|
## A dataframe with attributed dataframe
|
|
#
|
|
filecon <- file(smpfile, "r")
|
|
smpcontents <- readLines(filecon, n = -1) #read all lines of input file
|
|
close(filecon)
|
|
#
|
|
sampleid <- ProvideSampleId(smpfile)
|
|
#
|
|
rgxp.data <- "^Kanal\\s[\\d]+:"
|
|
#
|
|
numrow.idx <- regexpr(rgxp.data, smpcontents, perl = TRUE)
|
|
# scrap the match.length attribute
|
|
attr(numrow.idx, "match.length") <- NULL
|
|
#
|
|
# Determine how many columns the data contains
|
|
smpdata.cols <- length(strsplit(smpcontents[which(numrow.idx == 1)][1], "\t")[[1]]) - 1
|
|
# While we are at it, save row count to a variable as well
|
|
smpdata.rows <- length(smpcontents[which(numrow.idx == 1)])
|
|
# strip prefix off each data row
|
|
#smpdata <- matrix(NA, ncol = smpdata.cols, nrow = smpdata.rows)
|
|
smpdata.txt <- vector(length = smpdata.rows)
|
|
for (i in 1:smpdata.rows) {
|
|
smpdata.txt[i] <- strsplit(smpcontents[which(numrow.idx == 1)][i], ":")[[1]][2]
|
|
}
|
|
smpdata.txt.clean <- gsub("^\\s", "",
|
|
gsub("\\t", " ", smpdata.txt))
|
|
|
|
zz <- textConnection(smpdata.txt.clean, "r")
|
|
ff <- data.frame(stringsAsFactors = FALSE,
|
|
sampleid = sampleid,
|
|
channel = seq(1, smpdata.rows),
|
|
matrix(scan(zz, what = numeric(), sep = " "),
|
|
ncol = smpdata.cols, byrow = TRUE))
|
|
close(zz)
|
|
names(ff) <- c("sampleid", "channel", paste("Y", seq(1, smpdata.cols), sep = ""))
|
|
|
|
|
|
#
|
|
### Collect attributes of this experiment
|
|
SMPattrEdit <- matrix(c("Voltage", "^Voltage:",
|
|
"Current", "^Current:",
|
|
"Target", "^Target:",
|
|
"Duration", "^Meas\\.\\sDuration:",
|
|
"Impulse", "^Imp\\.\\sRate:",
|
|
"DeadTime", "^Rel\\.\\sDead\\sTime:",
|
|
"FirstChannel", "^First\\sChannel:",
|
|
"LastChannel", "^Last\\sChannel:",
|
|
"PeakTime", "^Peak\\sTime:",
|
|
"Gain", "^Gain:",
|
|
"ZeroPeak", "^Zero\\sPeak:"),
|
|
ncol = 2, byrow = T)
|
|
|
|
SMPattr <- matrix(NA, nrow = smpdata.cols + 1, ncol = dim(SMPattrEdit)[1])
|
|
|
|
for (c in 1:dim(SMPattrEdit)[1]) {
|
|
SMPattr[1, c] <- SMPattrEdit[c, 1]
|
|
SMPattr[2:dim(SMPattr)[1], c] <-
|
|
matrix(strsplit(gsub("^\\t", "",
|
|
strsplit(smpcontents[which(regexpr(SMPattrEdit[c, 2], smpcontents) == 1)],
|
|
":")[[1]][2]), "\\t")[[1]], ncol = smpdata.cols)
|
|
}
|
|
SMPdf <- data.frame(stringsAsFactors = FALSE,
|
|
SMPattr[2:dim(SMPattr)[1], ])
|
|
colnames(SMPdf) <- SMPattr[1, ]
|
|
|
|
|
|
### Now calculate the energy (keV) scale (convert from channels to energy)
|
|
ff$X <- ff$channel * (as.numeric(SMPdf$Gain[1]) / as.numeric(SMPdf$LastChannel[1]))
|
|
|
|
# Attach parameters to returned dataframe
|
|
attr(ff, "parameters") <- SMPdf
|
|
#
|
|
return(ff)
|
|
} |