diff --git a/NEWS.md b/NEWS.md index 557424476..b74935a45 100644 --- a/NEWS.md +++ b/NEWS.md @@ -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 # CHANGES IN GGIR VERSION 3.1-1 diff --git a/R/checkMilestoneFolders.R b/R/checkMilestoneFolders.R new file mode 100644 index 000000000..efcc41955 --- /dev/null +++ b/R/checkMilestoneFolders.R @@ -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) + } +} \ No newline at end of file diff --git a/R/g.part2.R b/R/g.part2.R index 68b0fdcdd..c60b693fb 100644 --- a/R/g.part2.R +++ b/R/g.part2.R @@ -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 diff --git a/R/g.part3.R b/R/g.part3.R index c1152eaa6..c49f99960 100644 --- a/R/g.part3.R +++ b/R/g.part3.R @@ -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) diff --git a/R/g.part4.R b/R/g.part4.R index 5d4576f96..d431deea5 100644 --- a/R/g.part4.R +++ b/R/g.part4.R @@ -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) { @@ -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) diff --git a/R/g.part5.R b/R/g.part5.R index 18006e38b..7d59be15e 100644 --- a/R/g.part5.R +++ b/R/g.part5.R @@ -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 = ""))) { diff --git a/man/checkMilestoneFolders.Rd b/man/checkMilestoneFolders.Rd new file mode 100644 index 000000000..1a99354c4 --- /dev/null +++ b/man/checkMilestoneFolders.Rd @@ -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 +} diff --git a/tests/testthat/test_checkMilestoneFolders.R b/tests/testthat/test_checkMilestoneFolders.R new file mode 100644 index 000000000..fed7c7282 --- /dev/null +++ b/tests/testthat/test_checkMilestoneFolders.R @@ -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) +}) \ No newline at end of file