Skip to content

Commit

Permalink
Merge branch 'master' into issues_1082Date_1089NotWorn
Browse files Browse the repository at this point in the history
  • Loading branch information
vincentvanhees committed Jun 10, 2024
2 parents 8e4d702 + a3d0cec commit 750bae3
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 22 deletions.
2 changes: 2 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# CHANGES IN GGIR VERSION 3.1-2

- Parts 2-5: Give more informative error when folders with expected milestone files are empty. #1144

- Report part 5: fix bug that was introduced on 2024-Feb-19 in the calculation of wear percentage #1148

- Part 3 and 4: Revise NotWorn algorithm to work with both count and raw data with varying degrees of nonwear.
Expand Down
49 changes: 49 additions & 0 deletions R/checkMilestoneFolders.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
checkMilestoneFolders = function(metadatadir, partNumber) {
if (partNumber == 1) return()
# This function checks whether expected output folder(s) exists
# If not, it creates them
# Further it check whether folders with expected content are empty.
# If yesm it gives error.
paths = c(paste0(metadatadir, "/meta/basic"),
paste0(metadatadir, "/meta/ms2.out"),
paste0(metadatadir, "/meta/ms3.out"),
paste0(metadatadir, "/meta/ms4.out"),
paste0(metadatadir, "/meta/ms5.out"))
sleepqc = paste0(metadatadir, "/meta/sleep.qc")

# Make sure folders exists
for (i in 1:partNumber) {
if (!dir.exists(paths[i])) {
dir.create(file.path(paths[i]), recursive = TRUE)
}
}
if (partNumber >= 3) {
if (!dir.exists(sleepqc)) {
dir.create(file.path(sleepqc), recursive = TRUE)
}
}

# Make sure preceding parts have files
if (partNumber == 2) {
expectedParts = 1
} else if (partNumber == 3) {
expectedParts = 2
} else if (partNumber == 4) {
expectedParts = 3
} else if (partNumber == 5) {
expectedParts = c(2, 3, 4)
}

# Give error when no data was found in the expected parts
warnAbout = NULL
for (i in expectedParts) {
N = length(dir(paths[i]))
if (N == 0) {
warnAbout = c(warnAbout, i)
}
}
if (length(warnAbout) > 0) {
stop(paste0("\nNo milestone data found for part(s) ", paste0(warnAbout, collapse = " and "),
". Run this/these first before running part ", partNumber, "."), call. = FALSE)
}
}
1 change: 1 addition & 0 deletions R/g.part2.R
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ g.part2 = function(datadir = c(), metadatadir = c(), f0 = c(), f1 = c(),
#---------------------------------
# Specifying directories with meta-data and extracting filenames
path = paste0(metadatadir,"/meta/basic/") #values stored per long epoch, e.g. 15 minutes
checkMilestoneFolders(metadatadir, partNumber = 2)
fnames = dir(path)
if (f1 > length(fnames)) f1 = length(fnames)
# create output folders
Expand Down
10 changes: 1 addition & 9 deletions R/g.part3.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,7 @@ g.part3 = function(metadatadir = c(), f0, f1, myfun = c(),
params_general = params$params_general
params_output = params$params_output

#----------------------------------------------------------
# create output directory if it does not exist
if (!file.exists(paste(metadatadir, sep = ""))) {
dir.create(file.path(metadatadir))
}
if (!file.exists(paste(metadatadir, "/meta/ms3.out", sep = ""))) {
dir.create(file.path(paste(metadatadir, "/meta", sep = ""), "ms3.out"))
dir.create(file.path(paste(metadatadir, "/meta", sep = ""), "sleep.qc"))
}
checkMilestoneFolders(metadatadir, partNumber = 3)
#------------------------------------------------------
fnames = dir(paste(metadatadir,"/meta/ms2.out", sep = ""))
if (f1 > length(fnames) | f1 == 0) f1 = length(fnames)
Expand Down
13 changes: 3 additions & 10 deletions R/g.part4.R
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,10 @@ g.part4 = function(datadir = c(), metadatadir = c(), f0 = f0, f1 = f1,
# possibly aided by sleep log/diary information (if available and provided by end-user)
nnpp = 40 # number of nights to be displayed in the report (hard-coded not a critical parameter for most scenarios)
#------------------------------------------------
# check whether milestone 3 data exists, if not give warning
ms3.out = "/meta/ms3.out"
if (!file.exists(paste0(metadatadir,ms3.out))) {
if (verbose == TRUE) cat("Warning: First run g.part3 (mode = 3) before running g.part4 (mode = 4)")
}
# check whether milestone 4 data exists, if no create folder
meta.sleep.folder = paste0(metadatadir, ms3.out)
ms4.out = "/meta/ms4.out"
if (file.exists(paste0(metadatadir,ms4.out))) {
} else {
dir.create(file.path(metadatadir,ms4.out))
}
meta.sleep.folder = paste0(metadatadir,"/meta/ms3.out")
checkMilestoneFolders(metadatadir, partNumber = 4)
#------------------------------------------------
# Get sleeplog data
if (length(params_sleep[["loglocation"]]) > 0) {
Expand All @@ -49,6 +41,7 @@ g.part4 = function(datadir = c(), metadatadir = c(), f0 = f0, f1 = f1,
#------------------------------------------------
# get list of accelerometer milestone data files from sleep (produced by g.part3)
fnames = dir(meta.sleep.folder)

if (f1 > length(fnames)) f1 = length(fnames)
if (f0 > length(fnames)) f0 = 1
if (f1 == 0 | length(f1) == 0 | f1 > length(fnames)) f1 = length(fnames)
Expand Down
4 changes: 1 addition & 3 deletions R/g.part5.R
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,8 @@ g.part5 = function(datadir = c(), metadatadir = c(), f0=c(), f1=c(),
params_general = params$params_general
#======================================================================
# create new folder (if not existent) for storing milestone data
checkMilestoneFolders(metadatadir, partNumber = 5)
ms5.out = "/meta/ms5.out"
if (!file.exists(paste(metadatadir, ms5.out, sep = ""))) {
dir.create(file.path(metadatadir, ms5.out))
}
if (params_output[["save_ms5rawlevels"]] == TRUE | params_output[["do.sibreport"]] == TRUE) {
ms5.outraw = "/meta/ms5.outraw"
if (file.exists(paste(metadatadir, ms5.outraw, sep = ""))) {
Expand Down
28 changes: 28 additions & 0 deletions man/checkMilestoneFolders.Rd
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
\name{checkMilestoneFolders}
\alias{checkMilestoneFolders}
\title{
Checks for existence of folders to process
}
\description{
Checks whether milestone folders exist, create them if needed,
and check whether folders are not empty. Only done for part 1 to 5
and not part 6, which is different and handled inside \link{g.part6}.
}
\usage{
checkMilestoneFolders(metadatadir, partNumber)
}
\arguments{
\item{metadatadir}{
Character, path to root of outputfolder.
}
\item{partNumber}{
Numeric, number from the set 2, 3, 4 or 5.
}
}
\value{
No value is produced
}
\keyword{internal}
\author{
Vincent T van Hees <v.vanhees@accelting.com>
}
9 changes: 9 additions & 0 deletions tests/testthat/test_checkMilestoneFolders.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
library(GGIR)
context("checkMilestoneFolders")
test_that("checkMilestoneFolders creates expected folders and gives expected warnings", {
test_folder = "test_milestone_folders"
dir.create(test_folder)
expect_error(checkMilestoneFolders(test_folder, partNumber = 5))
expect_true(dir.exists(paste0(test_folder, "/meta/ms5.out")))
if (dir.exists(test_folder)) unlink(test_folder, recursive = TRUE)
})

0 comments on commit 750bae3

Please sign in to comment.