R/ReadBreathID.R

Defines functions ReadBreathId RemoveNAColumns findSinglePattern

Documented in ReadBreathId

#' @title Read BreathID file
#'
#' @description Reads 13C data from a BreathId file, and returns a stucture for
#' use by \code{\link{BreathTestRecordToDatabase}}.
#'
#' @param filename Name of TXT-file to be read
#' @return structure of class \code{\link{BreathTestData}}
#' @author Dieter Menne, \email{dieter.menne@@menne-biomed.de}
#' @import stringr
#' @examples
#' filename = system.file("extdata", "350_20043_0_GER.txt", package = "D13CBreath")
#' bid = ReadBreathId(filename)
#' str(bid)
#' @export
ReadBreathId = function(filename) {
  filename = as.character(filename)
  if (!file.exists(filename))
    stop(paste0("File ",filename," does not exist."))
  bid = readLines(filename)
  header = str_trim(bid[1])
  if (header != "Test and Patient parameters")
    stop(paste0("File ",filename," is not a valid BreathID file."))
  recordDate = findSinglePattern(bid,"Date")
  RecordDate = strptime(recordDate,"%m/%d/%y")
  ## Note : End Time and Start Time are reversed in the data file, we correct
  ## this here, no typo!!
  EndTime = strptime(paste0(recordDate, " ",findSinglePattern(bid,"Start time")),
                     "%m/%d/%y %H:%M")
  StartTime = strptime(paste0(recordDate, " ",findSinglePattern(bid,"End time")),
                       "%m/%d/%y %H:%M")
  PatientID = findSinglePattern(bid,"Patient #")
  TestNo = as.integer(findSinglePattern(bid,"Test No."))
  Substrate = findSinglePattern(bid,"Type")
  Gender = findSinglePattern(bid,"Gender")
  if (nchar(Gender) > 0)
    Gender = str_sub(tolower(Gender),1,1)
  Dose = as.numeric(findSinglePattern(bid,"Dose"))
  Height = as.numeric(findSinglePattern(bid,"Height"))
  Weight = as.numeric(findSinglePattern(bid,"Weight"))
  T50 = as.numeric(findSinglePattern(bid,"T 1/2"))
  TLag = as.numeric(findSinglePattern(bid,"T lag"))
  GEC = as.numeric(findSinglePattern(bid,"GEC"))
  bid = try(str_trim(bid[which(str_detect(bid,"Time\\s*DOB")):length(bid)]),silent =
              TRUE)
  if (class(bid) == "try-error")
    stop(paste0("File ",filename," does not contain PDR data"))
  bid = bid[bid != ""]
  if (length(bid) < 2)
    stop(paste0("File ",filename," does not contain PDR data"))
  tc = textConnection(bid)
  data = read.table(tc, header = TRUE)
  close(tc)
  data = RemoveNAColumns(data)
  BreathTestData(
    FileName = basename(filename),
    PatientID = PatientID,
    TestNo = TestNo,
    Gender = Gender,
    RecordDate = RecordDate,
    StartTime = StartTime,
    EndTime = EndTime,
    Substrate = Substrate,
    Device = "BreathID",
    Dose = Dose,
    Height = Height,
    Weight = Weight,
    T50 = T50,
    TLag = TLag,
    GEC = GEC,
    Data = data
  )
  
}

RemoveNAColumns = function(x) {
  x[,!unlist(lapply(x,function(y)
    all(is.na(y) | is.nan(y) | str_trim(y) == "")))]
}


findSinglePattern = function(bid,pattern,required = TRUE) {
  p = str_match(bid,paste0(pattern,"[^-]+-\\s*(\\S.*)"))[,2]
  p = p[!is.na(p)]
  if (length(p) > 1)
    stop(paste0("No unique <<", pattern,">> in BreathID file"))
  if (length(p) == 0) {
    if (required)
      stop(paste0("No <<" ,pattern, ">> found in BreathID file "))
    else
      p = ""
  }
  return(str_trim(p))
}
dmenne/d13cbreath documentation built on March 1, 2020, 3:41 a.m.