From bf6398a9239dc957f9dc2750e1122afff5738c61 Mon Sep 17 00:00:00 2001 From: l-k- Date: Mon, 29 Jan 2024 22:41:08 -0500 Subject: [PATCH] don't resample more temperature than will be used GGIRread::resample is very expensive, and we were resampling *all* of the temperature every time we needed to read a block of it. This edit makes g.readaccfile for movisens got 2x faster. --- R/g.readaccfile.R | 1 + R/g.readtemp_movisens.R | 27 +++++++++++++++++++-------- man/g.readtemp_movisens.Rd | 11 +++++++++-- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/R/g.readaccfile.R b/R/g.readaccfile.R index 4e89d7cdb..868afa812 100644 --- a/R/g.readaccfile.R +++ b/R/g.readaccfile.R @@ -247,6 +247,7 @@ g.readaccfile = function(filename, blocksize, blocknumber, filequality, # there may or may not be a temp.bin file containing temperature try(expr = {P$data$temperature = g.readtemp_movisens(filename, from = startpage, to = endpage, + acc_sf = sf, acc_length = nrow(P$data), interpolationType = params_rawdata[["interpolationType"]]) }, silent = TRUE) } else if (mon == MONITOR$ACTIGRAPH && dformat == FORMAT$GT3X) { diff --git a/R/g.readtemp_movisens.R b/R/g.readtemp_movisens.R index c94108163..8dbb3165f 100644 --- a/R/g.readtemp_movisens.R +++ b/R/g.readtemp_movisens.R @@ -1,22 +1,33 @@ -g.readtemp_movisens = function(datafile, from = c(), to = c(), interpolationType=1) { +g.readtemp_movisens = function(datafile, from = c(), to = c(), acc_sf, acc_length, interpolationType=1) { # Acceleration data and temperature were sampled at different rates, # so we need to resample temperature to get the same sampling rate # as what we have for acceleration. - temperature = unisensR::readUnisensSignalEntry(dirname(datafile), "temp.bin") + temp_sf = 1 # temperature is most likely sampled at 1Hz, but we'll double-check later + + temp_from = ceiling(from / acc_sf * temp_sf) + temp_to = ceiling(to / acc_sf * temp_sf) + + temperature = unisensR::readUnisensSignalEntry(dirname(datafile), "temp.bin", + startIndex = temp_from, endIndex = temp_to) + new_temp_sf = attr(temperature, "sampleRate") + + # We had guessed that temperature was sampled at 1Hz. Let's check, and if we were wrong, then re-do. + if (temp_sf != new_temp_sf) { + temp_from = ceiling(from / acc_sf * new_temp_sf) + temp_to = ceiling(to / acc_sf * new_temp_sf) + + temperature = unisensR::readUnisensSignalEntry(dirname(datafile), "temp.bin", + startIndex = temp_from, endIndex = temp_to) + } + temperature = temperature$temp # we don't care about the exact timestamp values because we'll throw the timestamps away anyway. rawTime = seq_len(length(temperature)) - - acc_length = unisensR::getUnisensSignalSampleCount(dirname(datafile), "acc.bin") timeRes = seq(from = 1, to = rawTime[length(rawTime)], length.out = acc_length) temperature = GGIRread::resample(as.matrix(temperature), rawTime, timeRes, length(temperature), type=interpolationType) - if(length(from) > 0 && length(to) > 0) { - temperature = temperature[from:to] - } - invisible(temperature) } diff --git a/man/g.readtemp_movisens.Rd b/man/g.readtemp_movisens.Rd index 76b776ba3..27f0bec76 100644 --- a/man/g.readtemp_movisens.Rd +++ b/man/g.readtemp_movisens.Rd @@ -8,7 +8,8 @@ Reads the temperature from movisens files. it to the matrix where accelerations are stored } \usage{ -g.readtemp_movisens(datafile, from = c(), to = c(), interpolationType=1) +g.readtemp_movisens(datafile, from = c(), to = c(), acc_sf, acc_length, + interpolationType=1) } \arguments{ \item{datafile}{ @@ -24,6 +25,12 @@ g.readtemp_movisens(datafile, from = c(), to = c(), interpolationType=1) End point to derive the temperature from movisens files (automatically calculated by GGIR) } + \item{acc_sf}{ + Sample frequency of acceleration data + } + \item{acc_length}{ + number of acceleration data samples + } \item{interpolationType}{ Integer to indicate type of interpolation to be used when resampling time series (mainly relevant for Axivity sensors), 1=linear, 2=nearest neighbour. } @@ -34,6 +41,6 @@ g.readtemp_movisens(datafile, from = c(), to = c(), interpolationType=1) \keyword{internal} \examples{ \dontrun{ - P = g.readtemp_movisens(datafile, from = c(), to = c()) + P = g.readtemp_movisens(datafile, from = c(), to = c(), acc_sf = 64, acc_length = 3000) } }