From c7878593a3f8138da3bab36cb6bba6473ce9afd2 Mon Sep 17 00:00:00 2001 From: ThomasKnecht Date: Sat, 11 Nov 2023 17:10:07 +0100 Subject: [PATCH 01/11] add initial tests --- tests/testthat/test-create_dataset.R | 49 ++++++++++++++++++++++++++++ tests/testthat/test-parse_header.R | 32 ++++++++++++++++++ tests/testthat/test-read_opus.R | 10 ++++++ 3 files changed, 91 insertions(+) create mode 100644 tests/testthat/test-create_dataset.R create mode 100644 tests/testthat/test-parse_header.R create mode 100644 tests/testthat/test-read_opus.R diff --git a/tests/testthat/test-create_dataset.R b/tests/testthat/test-create_dataset.R new file mode 100644 index 00000000..1de2b38a --- /dev/null +++ b/tests/testthat/test-create_dataset.R @@ -0,0 +1,49 @@ +test_that("that a dataset is correctly cearted", { + + header_data <- list( + block_type = 0, + text_type = 104, + channel_type = 0, + additional_type = 64 + ) + + ds <- create_dataset(header_data) + + expect_equal(ds$block_type_name, "history") + + expect_true(inherits(ds, "text")) + + + header_data <- list( + block_type = 100, + text_type = 104, + channel_type = 0, + additional_type = 64 + ) + + + expect_warning( + create_dataset(header_data), + regexp = "Unknown header entry" + ) + + ds <- suppressWarnings(create_dataset(header_data)) + + expect_equal(ds$block_type_name, "unknown") + + expect_true(inherits(ds, "list")) + + + header_data <- list( + block_type = 15, + text_type = 0, + channel_type = 48, + additional_type = 64 + ) + + ds <- create_dataset(header_data) + + expect_equal(ds$block_type_name, "refl_no_atm_comp") + + +}) diff --git a/tests/testthat/test-parse_header.R b/tests/testthat/test-parse_header.R new file mode 100644 index 00000000..00e4a47f --- /dev/null +++ b/tests/testthat/test-parse_header.R @@ -0,0 +1,32 @@ +test_that("header is correctly parsed", { + raw <- read_opus_raw("../../inst/extdata/test_data/test_spectra.0") + + con <- rawConnection(raw) + + raw_size <- length(raw) + + header_data <- parse_header(raw_size, con) + + expect_length(header_data, 20) + + header_data_unlist <- unlist(header_data) + + expect_true(is.integer(header_data_unlist)) + + expect_length(header_data_unlist, 140) + + block_type_names <- unique(unlist(lapply(header_data, names))) + + expected_block_type_names <- c( + "block_type", "channel_type", + "text_type", "additional_type", + "offset", "next_offset", + "chunk_size" + ) + + expect_true(all(block_type_names %in% expected_block_type_names)) + +}) + + + diff --git a/tests/testthat/test-read_opus.R b/tests/testthat/test-read_opus.R new file mode 100644 index 00000000..d7fef5e5 --- /dev/null +++ b/tests/testthat/test-read_opus.R @@ -0,0 +1,10 @@ +test_that("all test files are parsed without warning", { + + + test <- read_opus(dsn = "../../inst/extdata/test_data") + + + + + +}) From 0e7d352af1bc940283222d993788d3358d119e02 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:12:03 +0000 Subject: [PATCH 02/11] [pre-commit.ci lite] apply automatic fixes --- tests/testthat/test-parse_header.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/testthat/test-parse_header.R b/tests/testthat/test-parse_header.R index 00e4a47f..5e9d530c 100644 --- a/tests/testthat/test-parse_header.R +++ b/tests/testthat/test-parse_header.R @@ -27,6 +27,3 @@ test_that("header is correctly parsed", { expect_true(all(block_type_names %in% expected_block_type_names)) }) - - - From 602b18544679c3e7f8e6c918c12ee0c23e0cbfcf Mon Sep 17 00:00:00 2001 From: ThomasKnecht Date: Sat, 11 Nov 2023 20:24:05 +0100 Subject: [PATCH 03/11] remove con and seek --- R/calc_parameter_chunk_size.R | 1 + R/parse_chunk.R | 39 ++++++++------- R/parse_header.R | 93 ++++++++++++++++------------------- R/parse_opus.R | 8 +-- R/read_bin_types.R | 53 ++++++++++++++------ R/seek_opus.R | 6 --- 6 files changed, 106 insertions(+), 94 deletions(-) delete mode 100644 R/seek_opus.R diff --git a/R/calc_parameter_chunk_size.R b/R/calc_parameter_chunk_size.R index 42a982a5..cf24ca94 100644 --- a/R/calc_parameter_chunk_size.R +++ b/R/calc_parameter_chunk_size.R @@ -30,6 +30,7 @@ calc_parameter_chunk_size.data <- function(ds) { #' calculate the full chunk size #' @param ds dataset calc_chunk_size <- function(ds) { + chunk_size <- ds$next_offset - ds$offset return(chunk_size) } diff --git a/R/parse_chunk.R b/R/parse_chunk.R index 9dae6db8..f02fb479 100644 --- a/R/parse_chunk.R +++ b/R/parse_chunk.R @@ -2,11 +2,11 @@ #' #' @param ds chunk dataset #' -#' @param con connection to raw vector +#' @param raw raw vector #' #' @keywords internal #' @family parsing -parse_chunk <- function(ds, con) UseMethod("parse_chunk") +parse_chunk <- function(ds,raw) UseMethod("parse_chunk") @@ -15,7 +15,8 @@ parse_chunk <- function(ds, con) UseMethod("parse_chunk") #' @inheritParams parse_chunk #' #' @keywords internal -parse_chunk.default <- function(ds, con) { +parse_chunk.default <- function(ds,raw) { + return(ds) } @@ -25,8 +26,9 @@ parse_chunk.default <- function(ds, con) { #' @inheritParams parse_chunk #' #' @keywords internal -parse_chunk.text <- function(ds, con) { - text <- read_character(con, ds$offset, n = ds$chunk_size) +parse_chunk.text <- function(ds,raw) { + + text <- read_character(raw, ds$offset+1, n = ds$chunk_size, n_char = ds$chunk_size) ds$text <- text return(ds) @@ -37,11 +39,12 @@ parse_chunk.text <- function(ds, con) { #' @inheritParams parse_chunk #' #' @keywords internal -parse_chunk.parameter <- function(ds, con) { - if (ds$text_type %in% c(112, 104, 144)) { - cursor <- ds$offset + 12 +parse_chunk.parameter <- function(ds,raw) { + + if (ds$text_type %in% c(104, 112, 144)) { + cursor <- ds$offset + 13 } else { - cursor <- ds$offset + cursor <- ds$offset + 1 } chunk_size <- ds$chunk_size @@ -51,7 +54,8 @@ parse_chunk.parameter <- function(ds, con) { result_list <- list() repeat { - parameter_name <- read_character(con, cursor, n = 1L) + + parameter_name <- read_character(raw, cursor, n = 1, n_char = 3) if (parameter_name == "END") { break @@ -61,21 +65,21 @@ parse_chunk.parameter <- function(ds, con) { # need to add since index that is returned starts with 0; # R index starts at 1 - type_index <- read_unsigned_int(con, cursor + 4, n = 1L) + 1 + type_index <- read_unsigned_int(raw, cursor + 4, n = 1L) + 1 parameter_type <- parameter_types[type_index] - parameter_size <- read_unsigned_int(con, cursor + 6, n = 1L) + parameter_size <- read_unsigned_int(raw, cursor + 6, n = 1L) cursor_value <- cursor + 8 if (type_index == 1) { - parameter_value <- read_signed_int(con, cursor_value, n = 1L) + parameter_value <- read_signed_int(raw, cursor_value, n = 1L) } else if (type_index == 2) { - parameter_value <- read_double(con, cursor_value, n = 1L) + parameter_value <- read_double(raw, cursor_value, n = 1L) } else if (type_index %in% c(3, 4, 5)) { - parameter_value <- read_character(con, cursor_value, n = 1L) + parameter_value <- read_character(raw, cursor_value, n = 1L, n_char = parameter_size) } repeat_list <- list( @@ -108,8 +112,9 @@ parse_chunk.parameter <- function(ds, con) { #' @inheritParams parse_chunk #' #' @keywords internal -parse_chunk.data <- function(ds, con) { - data <- read_float(con, ds$offset, n = ds$chunk_size) +parse_chunk.data <- function(ds, raw) { + + data <- read_float(raw, ds$offset+1, n = ds$chunk_size) ds$data <- data return(ds) diff --git a/R/parse_header.R b/R/parse_header.R index 80ec3f49..f2e5d6ac 100644 --- a/R/parse_header.R +++ b/R/parse_header.R @@ -5,63 +5,23 @@ #' @param con connection to the raw vector #' @family parsing #' @keywords internal -parse_header <- function(raw_size, con) { +parse_header <- function(raw) { # header length in bytes header_length <- 504L # set first start cursor in bytes; # following github.com/qedsoftware/brukeropusreader - cursor <- 24L - # number of bytes of block metainfo - meta_block_size <- 12L - - # file size in bytes - # file_size <- length(raw) - - result_list <- list() - - repeat { - if (cursor + meta_block_size >= header_length) { - break - } - - block_type <- read_unsigned_int(con, cursor) - channel_type <- read_unsigned_int(con, cursor + 1L) - text_type <- read_unsigned_int(con, cursor + 2L) - # we can discuss the name here - additional_type <- read_unsigned_int(con, cursor + 3L) - chunk_size <- read_signed_int(con, cursor + 4L) - offset <- read_signed_int(con, cursor + 8L) - - if (offset <= 0L) { - break - } - - next_offset <- offset + 4L * chunk_size - - repeat_list <- list( - block_type = block_type, - channel_type = channel_type, - text_type = text_type, - additional_type = additional_type, - offset = offset, - next_offset = next_offset, - chunk_size = chunk_size - ) - - result_list <- c(result_list, list(repeat_list)) - - if (next_offset >= raw_size) { - break - } - - cursor <- cursor + 12L - } + start_cursor <- 25L + + all_cursors <- seq(start_cursor,header_length, 12L) + + out <- lapply(all_cursors, function(x) test_header_parse(raw, x)) + + out[sapply(out, is.null)] <- NULL - # exclude the header chunk, since it is read in this function - result_list <- result_list[-1L] + out <- out[-1] - return(result_list) + return(out) } @@ -71,3 +31,36 @@ parse_header <- function(raw_size, con) { dec_to_ascii <- function(n) { rawToChar(as.raw(n)) } + + + +test_header_parse <- function(raw, cursor){ + + offset <- read_signed_int(raw, cursor + 8L) + + if (offset <= 0L) { + return(NULL) + } + chunk_size <- read_signed_int(raw, cursor + 4L) + next_offset <- offset + 4L * chunk_size + + # if(next_offset > length(raw)){ + # browser() + # chunk_size <- length(raw) - offset + # } + + + repeat_list <- list( + block_type = read_unsigned_int(raw, cursor), + channel_type = read_unsigned_int(raw, cursor + 1L), + text_type = read_unsigned_int(raw, cursor + 2L), + additional_type = read_unsigned_int(raw, cursor + 3L), + offset = offset, + next_offset = next_offset, + chunk_size = chunk_size + ) + + return(repeat_list) +} + + diff --git a/R/parse_opus.R b/R/parse_opus.R index 5e7426af..1044a88b 100644 --- a/R/parse_opus.R +++ b/R/parse_opus.R @@ -120,11 +120,9 @@ #' @family core #' @export parse_opus <- function(raw, data_only) { - con <- rawConnection(raw) - raw_size <- length(raw) - header_data <- parse_header(raw_size, con) + header_data <- parse_header(raw) dataset_list <- lapply(header_data, create_dataset) @@ -152,7 +150,7 @@ parse_opus <- function(raw, data_only) { dataset_list <- lapply(dataset_list, calc_parameter_chunk_size) } - dataset_list <- lapply(dataset_list, function(x) parse_chunk(x, con)) + dataset_list <- lapply(dataset_list, function(x) parse_chunk(x, raw)) data_types <- get_data_types(dataset_list) # nolint @@ -167,8 +165,6 @@ parse_opus <- function(raw, data_only) { dataset_list <- sort_list_by(dataset_list) - on.exit(close(con)) - class(dataset_list) <- c("opusreader2", class(dataset_list)) return(dataset_list) diff --git a/R/read_bin_types.R b/R/read_bin_types.R index 8d78aa3f..24f86dc5 100644 --- a/R/read_bin_types.R +++ b/R/read_bin_types.R @@ -3,31 +3,39 @@ #' @param con connection to raw vector #' @param cursor offset #' @param n number of elements -read_unsigned_int <- function(con, cursor, n = 1L) { - seek_opus(con, cursor) +read_unsigned_int <- function(raw, cursor, n = 1L) { + + n_int <- n*1 + + #seek_opus(con, cursor) out <- readBin( - con, + raw[cursor:(cursor+n_int)], what = "integer", n = n, size = 1L, endian = "little", signed = FALSE ) + return(out) } #' read signed integer from binary #' #' @inheritParams read_unsigned_int -read_signed_int <- function(con, cursor, n = 1L) { - seek_opus(con, cursor) +read_signed_int <- function(raw, cursor, n = 1L) { + + n_signed_int <- n * 4 + + #seek_opus(con, cursor) out <- readBin( - con, + raw[cursor:(cursor+n_signed_int)], what = "integer", n = n, size = 4L, endian = "little" ) + return(out) } @@ -37,44 +45,59 @@ read_signed_int <- function(con, cursor, n = 1L) { #' @param encoding encoding to assign character strings that are read. Default #' is `"latin1"`., which will use Windows Latin 1 (ANSI) encoding. This is #' how Bruker software OPUS is assumed to commonly store strings. -read_character <- function(con, cursor, n = 1L, encoding = "latin1") { - seek_opus(con, cursor) +read_character <- function(raw, cursor, n = 1L, n_char, encoding = "latin1") { + #seek_opus(con, cursor) + + out <- readBin( - con, + raw[cursor:(cursor+n_char)], what = "character", n = n, size = 1, endian = "little" ) + + + Encoding(out) <- encoding + return(out) } #' read float from binary (single-precision, 32 bits) #' #' @inheritParams read_unsigned_int -read_float <- function(con, cursor, n = 1L) { - seek_opus(con, cursor) +read_float <- function(raw, cursor, n = 1L) { + + n_float <- n * 4 + + #seek_opus(con, cursor) out <- readBin( - con, + raw[cursor:(cursor+n_float)], what = "double", n = n, size = 4L, endian = "little" ) + + return(out) } #' read double from binary (double-precision, 64 bits) #' #' @inheritParams read_unsigned_int -read_double <- function(con, cursor, n = 1L) { - seek_opus(con, cursor) +read_double <- function(raw, cursor, n = 1L) { + + n_double <- n * 8 + + #seek_opus(con, cursor) out <- readBin( - con, + raw[cursor:(cursor+n_double)], what = "double", n = n, size = 8L, endian = "little" ) + return(out) } diff --git a/R/seek_opus.R b/R/seek_opus.R deleted file mode 100644 index 48f28917..00000000 --- a/R/seek_opus.R +++ /dev/null @@ -1,6 +0,0 @@ -#' reposition cursor for open read connection -#' @param con connection to raw vector -#' @param cursor cursor position within the connection -seek_opus <- function(con, cursor) { - seek(con, where = cursor, origin = "start", rw = "read") -} From 67bdce6a64ad38abaf5794da751fb798fb1676f1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 19:26:17 +0000 Subject: [PATCH 04/11] [pre-commit.ci lite] apply automatic fixes --- R/parse_header.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/R/parse_header.R b/R/parse_header.R index f2e5d6ac..ee4b7832 100644 --- a/R/parse_header.R +++ b/R/parse_header.R @@ -62,5 +62,3 @@ test_header_parse <- function(raw, cursor){ return(repeat_list) } - - From 36a8c2894af952a7350e7acd10298c0e0fd55913 Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 20:42:16 +0100 Subject: [PATCH 05/11] cleanup of raw --- R/parse_opus.R | 2 ++ R/read_bin_types.R | 36 ++++++++++++++++++++---------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/R/parse_opus.R b/R/parse_opus.R index 1044a88b..64300443 100644 --- a/R/parse_opus.R +++ b/R/parse_opus.R @@ -167,5 +167,7 @@ parse_opus <- function(raw, data_only) { class(dataset_list) <- c("opusreader2", class(dataset_list)) + raw <- NULL + return(dataset_list) } diff --git a/R/read_bin_types.R b/R/read_bin_types.R index 24f86dc5..b286e503 100644 --- a/R/read_bin_types.R +++ b/R/read_bin_types.R @@ -4,12 +4,11 @@ #' @param cursor offset #' @param n number of elements read_unsigned_int <- function(raw, cursor, n = 1L) { + n_int <- n * 1 - n_int <- n*1 - - #seek_opus(con, cursor) + # seek_opus(con, cursor) out <- readBin( - raw[cursor:(cursor+n_int)], + raw[cursor:(cursor + n_int)], what = "integer", n = n, size = 1L, @@ -17,6 +16,8 @@ read_unsigned_int <- function(raw, cursor, n = 1L) { signed = FALSE ) + raw <- NULL + return(out) } @@ -24,18 +25,19 @@ read_unsigned_int <- function(raw, cursor, n = 1L) { #' #' @inheritParams read_unsigned_int read_signed_int <- function(raw, cursor, n = 1L) { - n_signed_int <- n * 4 - #seek_opus(con, cursor) + # seek_opus(con, cursor) out <- readBin( - raw[cursor:(cursor+n_signed_int)], + raw[cursor:(cursor + n_signed_int)], what = "integer", n = n, size = 4L, endian = "little" ) + raw <- NULL + return(out) } @@ -46,18 +48,18 @@ read_signed_int <- function(raw, cursor, n = 1L) { #' is `"latin1"`., which will use Windows Latin 1 (ANSI) encoding. This is #' how Bruker software OPUS is assumed to commonly store strings. read_character <- function(raw, cursor, n = 1L, n_char, encoding = "latin1") { - #seek_opus(con, cursor) + # seek_opus(con, cursor) out <- readBin( - raw[cursor:(cursor+n_char)], + raw[cursor:(cursor + n_char)], what = "character", n = n, size = 1, endian = "little" ) - + raw <- NULL Encoding(out) <- encoding @@ -68,18 +70,19 @@ read_character <- function(raw, cursor, n = 1L, n_char, encoding = "latin1") { #' #' @inheritParams read_unsigned_int read_float <- function(raw, cursor, n = 1L) { - n_float <- n * 4 - #seek_opus(con, cursor) + # seek_opus(con, cursor) out <- readBin( - raw[cursor:(cursor+n_float)], + raw[cursor:(cursor + n_float)], what = "double", n = n, size = 4L, endian = "little" ) + raw <- NULL + return(out) } @@ -87,17 +90,18 @@ read_float <- function(raw, cursor, n = 1L) { #' #' @inheritParams read_unsigned_int read_double <- function(raw, cursor, n = 1L) { - n_double <- n * 8 - #seek_opus(con, cursor) + # seek_opus(con, cursor) out <- readBin( - raw[cursor:(cursor+n_double)], + raw[cursor:(cursor + n_double)], what = "double", n = n, size = 8L, endian = "little" ) + raw <- NULL + return(out) } From d95bc52cd98f3d6d33f38a84851b85d533e16ea9 Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 22:57:08 +0100 Subject: [PATCH 06/11] add new data from issue --- .../issue94_RT_01_1_23-02-21_13-23-54.0 | Bin 0 -> 93720 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 inst/extdata/new_data/issue94_RT_01_1_23-02-21_13-23-54.0 diff --git a/inst/extdata/new_data/issue94_RT_01_1_23-02-21_13-23-54.0 b/inst/extdata/new_data/issue94_RT_01_1_23-02-21_13-23-54.0 new file mode 100644 index 0000000000000000000000000000000000000000..bea7b966b7f478d42f785c3b8f5337a2d2caa56b GIT binary patch literal 93720 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 literal 0 HcmV?d00001 From d836943c1412ed55957fd427ec01877f43bcd581 Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 23:01:50 +0100 Subject: [PATCH 07/11] simplified args; clean --- R/extract_metadata.R | 1 + R/parse_header.R | 9 +++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/R/extract_metadata.R b/R/extract_metadata.R index 25ac1b2d..19c6fcc3 100644 --- a/R/extract_metadata.R +++ b/R/extract_metadata.R @@ -1,6 +1,7 @@ get_basic_metadata <- function(ds_list) { timestamp <- get_meta_timestamp(ds_list) + basic_metadata <- data.frame( # opus_filename, # opus_path, diff --git a/R/parse_header.R b/R/parse_header.R index ee4b7832..ea0a9b6d 100644 --- a/R/parse_header.R +++ b/R/parse_header.R @@ -1,8 +1,6 @@ #' parse the header of the opus file #' -#' @param raw_size raw vector of the opus binary file -#' -#' @param con connection to the raw vector +#' @param raw raw vector of the opus binary file #' @family parsing #' @keywords internal parse_header <- function(raw) { @@ -13,7 +11,7 @@ parse_header <- function(raw) { # following github.com/qedsoftware/brukeropusreader start_cursor <- 25L - all_cursors <- seq(start_cursor,header_length, 12L) + all_cursors <- seq(start_cursor, header_length, 12L) out <- lapply(all_cursors, function(x) test_header_parse(raw, x)) @@ -34,8 +32,7 @@ dec_to_ascii <- function(n) { -test_header_parse <- function(raw, cursor){ - +test_header_parse <- function(raw, cursor) { offset <- read_signed_int(raw, cursor + 8L) if (offset <= 0L) { From b167e253d4f551a3cb9a1418019ee520f68efaf7 Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 23:03:00 +0100 Subject: [PATCH 08/11] add tests --- tests/testthat/test-parse_header.R | 7 +------ tests/testthat/test-read_opus.R | 9 +-------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/tests/testthat/test-parse_header.R b/tests/testthat/test-parse_header.R index 5e9d530c..ae019a6a 100644 --- a/tests/testthat/test-parse_header.R +++ b/tests/testthat/test-parse_header.R @@ -1,11 +1,7 @@ test_that("header is correctly parsed", { raw <- read_opus_raw("../../inst/extdata/test_data/test_spectra.0") - con <- rawConnection(raw) - - raw_size <- length(raw) - - header_data <- parse_header(raw_size, con) + header_data <- parse_header(raw) expect_length(header_data, 20) @@ -25,5 +21,4 @@ test_that("header is correctly parsed", { ) expect_true(all(block_type_names %in% expected_block_type_names)) - }) diff --git a/tests/testthat/test-read_opus.R b/tests/testthat/test-read_opus.R index d7fef5e5..f75d4e31 100644 --- a/tests/testthat/test-read_opus.R +++ b/tests/testthat/test-read_opus.R @@ -1,10 +1,3 @@ test_that("all test files are parsed without warning", { - - - test <- read_opus(dsn = "../../inst/extdata/test_data") - - - - - + expect_no_warning(read_opus(dsn = "../../inst/extdata/test_data")) }) From 9a0336ccd13b522dd45ee65b5935c321cd39964b Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 23:07:43 +0100 Subject: [PATCH 09/11] update docs with updated internal interface --- man/parse_chunk.Rd | 4 ++-- man/parse_chunk.data.Rd | 4 ++-- man/parse_chunk.default.Rd | 4 ++-- man/parse_chunk.parameter.Rd | 4 ++-- man/parse_chunk.text.Rd | 4 ++-- man/parse_header.Rd | 6 ++---- man/read_character.Rd | 4 +--- man/read_double.Rd | 4 +--- man/read_float.Rd | 4 +--- man/read_signed_int.Rd | 4 +--- man/read_unsigned_int.Rd | 6 +++--- man/seek_opus.Rd | 16 ---------------- 12 files changed, 19 insertions(+), 45 deletions(-) delete mode 100644 man/seek_opus.Rd diff --git a/man/parse_chunk.Rd b/man/parse_chunk.Rd index 15d98df3..3aa9bb70 100644 --- a/man/parse_chunk.Rd +++ b/man/parse_chunk.Rd @@ -4,12 +4,12 @@ \alias{parse_chunk} \title{read chunk method} \usage{ -parse_chunk(ds, con) +parse_chunk(ds, raw) } \arguments{ \item{ds}{chunk dataset} -\item{con}{connection to raw vector} +\item{raw}{raw vector} } \description{ read chunk method diff --git a/man/parse_chunk.data.Rd b/man/parse_chunk.data.Rd index 98e4a6b0..d2e29863 100644 --- a/man/parse_chunk.data.Rd +++ b/man/parse_chunk.data.Rd @@ -4,12 +4,12 @@ \alias{parse_chunk.data} \title{read chunk method for data} \usage{ -\method{parse_chunk}{data}(ds, con) +\method{parse_chunk}{data}(ds, raw) } \arguments{ \item{ds}{chunk dataset} -\item{con}{connection to raw vector} +\item{raw}{raw vector} } \description{ read chunk method for data diff --git a/man/parse_chunk.default.Rd b/man/parse_chunk.default.Rd index e38c79bc..e6c86ce1 100644 --- a/man/parse_chunk.default.Rd +++ b/man/parse_chunk.default.Rd @@ -4,12 +4,12 @@ \alias{parse_chunk.default} \title{read chunk method for default} \usage{ -\method{parse_chunk}{default}(ds, con) +\method{parse_chunk}{default}(ds, raw) } \arguments{ \item{ds}{chunk dataset} -\item{con}{connection to raw vector} +\item{raw}{raw vector} } \description{ read chunk method for default diff --git a/man/parse_chunk.parameter.Rd b/man/parse_chunk.parameter.Rd index db6625cc..8cb1135c 100644 --- a/man/parse_chunk.parameter.Rd +++ b/man/parse_chunk.parameter.Rd @@ -4,12 +4,12 @@ \alias{parse_chunk.parameter} \title{read chunk method for parameter} \usage{ -\method{parse_chunk}{parameter}(ds, con) +\method{parse_chunk}{parameter}(ds, raw) } \arguments{ \item{ds}{chunk dataset} -\item{con}{connection to raw vector} +\item{raw}{raw vector} } \description{ read chunk method for parameter diff --git a/man/parse_chunk.text.Rd b/man/parse_chunk.text.Rd index 2e3a40df..016a6ed7 100644 --- a/man/parse_chunk.text.Rd +++ b/man/parse_chunk.text.Rd @@ -4,12 +4,12 @@ \alias{parse_chunk.text} \title{read chunk method for text} \usage{ -\method{parse_chunk}{text}(ds, con) +\method{parse_chunk}{text}(ds, raw) } \arguments{ \item{ds}{chunk dataset} -\item{con}{connection to raw vector} +\item{raw}{raw vector} } \description{ read chunk method for text diff --git a/man/parse_header.Rd b/man/parse_header.Rd index f506b077..d8127b61 100644 --- a/man/parse_header.Rd +++ b/man/parse_header.Rd @@ -4,12 +4,10 @@ \alias{parse_header} \title{parse the header of the opus file} \usage{ -parse_header(raw_size, con) +parse_header(raw) } \arguments{ -\item{raw_size}{raw vector of the opus binary file} - -\item{con}{connection to the raw vector} +\item{raw}{raw vector of the opus binary file} } \description{ parse the header of the opus file diff --git a/man/read_character.Rd b/man/read_character.Rd index b109a51b..fe7ca7f1 100644 --- a/man/read_character.Rd +++ b/man/read_character.Rd @@ -4,11 +4,9 @@ \alias{read_character} \title{read character from binary} \usage{ -read_character(con, cursor, n = 1L, encoding = "latin1") +read_character(raw, cursor, n = 1L, n_char, encoding = "latin1") } \arguments{ -\item{con}{connection to raw vector} - \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_double.Rd b/man/read_double.Rd index 98f06e88..86f0ec6e 100644 --- a/man/read_double.Rd +++ b/man/read_double.Rd @@ -4,11 +4,9 @@ \alias{read_double} \title{read double from binary (double-precision, 64 bits)} \usage{ -read_double(con, cursor, n = 1L) +read_double(raw, cursor, n = 1L) } \arguments{ -\item{con}{connection to raw vector} - \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_float.Rd b/man/read_float.Rd index 41713e92..8875875c 100644 --- a/man/read_float.Rd +++ b/man/read_float.Rd @@ -4,11 +4,9 @@ \alias{read_float} \title{read float from binary (single-precision, 32 bits)} \usage{ -read_float(con, cursor, n = 1L) +read_float(raw, cursor, n = 1L) } \arguments{ -\item{con}{connection to raw vector} - \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_signed_int.Rd b/man/read_signed_int.Rd index 282517e6..679d3023 100644 --- a/man/read_signed_int.Rd +++ b/man/read_signed_int.Rd @@ -4,11 +4,9 @@ \alias{read_signed_int} \title{read signed integer from binary} \usage{ -read_signed_int(con, cursor, n = 1L) +read_signed_int(raw, cursor, n = 1L) } \arguments{ -\item{con}{connection to raw vector} - \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_unsigned_int.Rd b/man/read_unsigned_int.Rd index c2e7fd91..1fc5d747 100644 --- a/man/read_unsigned_int.Rd +++ b/man/read_unsigned_int.Rd @@ -4,14 +4,14 @@ \alias{read_unsigned_int} \title{read unsigned integer from binary} \usage{ -read_unsigned_int(con, cursor, n = 1L) +read_unsigned_int(raw, cursor, n = 1L) } \arguments{ -\item{con}{connection to raw vector} - \item{cursor}{offset} \item{n}{number of elements} + +\item{con}{connection to raw vector} } \description{ read unsigned integer from binary diff --git a/man/seek_opus.Rd b/man/seek_opus.Rd deleted file mode 100644 index 85ab0e2c..00000000 --- a/man/seek_opus.Rd +++ /dev/null @@ -1,16 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/seek_opus.R -\name{seek_opus} -\alias{seek_opus} -\title{reposition cursor for open read connection} -\usage{ -seek_opus(con, cursor) -} -\arguments{ -\item{con}{connection to raw vector} - -\item{cursor}{cursor position within the connection} -} -\description{ -reposition cursor for open read connection -} From 1edf5b64ea8c1f4658ed8f8533a5bf798ad56e7c Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 23:23:50 +0100 Subject: [PATCH 10/11] fix docs --- R/read_bin_types.R | 2 +- man/read_character.Rd | 2 ++ man/read_double.Rd | 2 ++ man/read_float.Rd | 2 ++ man/read_signed_int.Rd | 2 ++ man/read_unsigned_int.Rd | 4 ++-- 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/R/read_bin_types.R b/R/read_bin_types.R index b286e503..ec22125d 100644 --- a/R/read_bin_types.R +++ b/R/read_bin_types.R @@ -1,6 +1,6 @@ #' read unsigned integer from binary #' -#' @param con connection to raw vector +#' @param raw raw vector #' @param cursor offset #' @param n number of elements read_unsigned_int <- function(raw, cursor, n = 1L) { diff --git a/man/read_character.Rd b/man/read_character.Rd index fe7ca7f1..833d377e 100644 --- a/man/read_character.Rd +++ b/man/read_character.Rd @@ -7,6 +7,8 @@ read_character(raw, cursor, n = 1L, n_char, encoding = "latin1") } \arguments{ +\item{raw}{raw vector} + \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_double.Rd b/man/read_double.Rd index 86f0ec6e..3fef0071 100644 --- a/man/read_double.Rd +++ b/man/read_double.Rd @@ -7,6 +7,8 @@ read_double(raw, cursor, n = 1L) } \arguments{ +\item{raw}{raw vector} + \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_float.Rd b/man/read_float.Rd index 8875875c..e697d83d 100644 --- a/man/read_float.Rd +++ b/man/read_float.Rd @@ -7,6 +7,8 @@ read_float(raw, cursor, n = 1L) } \arguments{ +\item{raw}{raw vector} + \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_signed_int.Rd b/man/read_signed_int.Rd index 679d3023..7d8b853f 100644 --- a/man/read_signed_int.Rd +++ b/man/read_signed_int.Rd @@ -7,6 +7,8 @@ read_signed_int(raw, cursor, n = 1L) } \arguments{ +\item{raw}{raw vector} + \item{cursor}{offset} \item{n}{number of elements} diff --git a/man/read_unsigned_int.Rd b/man/read_unsigned_int.Rd index 1fc5d747..abf662d6 100644 --- a/man/read_unsigned_int.Rd +++ b/man/read_unsigned_int.Rd @@ -7,11 +7,11 @@ read_unsigned_int(raw, cursor, n = 1L) } \arguments{ +\item{raw}{raw vector} + \item{cursor}{offset} \item{n}{number of elements} - -\item{con}{connection to raw vector} } \description{ read unsigned integer from binary From e14581a06fa3842c3f8252d82836688c6ba53aa4 Mon Sep 17 00:00:00 2001 From: Philipp Baumann Date: Sat, 11 Nov 2023 23:40:25 +0100 Subject: [PATCH 11/11] document arg --- R/read_bin_types.R | 2 +- man/read_character.Rd | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/R/read_bin_types.R b/R/read_bin_types.R index ec22125d..5793425d 100644 --- a/R/read_bin_types.R +++ b/R/read_bin_types.R @@ -42,8 +42,8 @@ read_signed_int <- function(raw, cursor, n = 1L) { } #' read character from binary -#' #' @inheritParams read_unsigned_int +#' @param n_char integer with number of desired characters to read from raw #' @param encoding encoding to assign character strings that are read. Default #' is `"latin1"`., which will use Windows Latin 1 (ANSI) encoding. This is #' how Bruker software OPUS is assumed to commonly store strings. diff --git a/man/read_character.Rd b/man/read_character.Rd index 833d377e..7cc7f2d6 100644 --- a/man/read_character.Rd +++ b/man/read_character.Rd @@ -13,6 +13,8 @@ read_character(raw, cursor, n = 1L, n_char, encoding = "latin1") \item{n}{number of elements} +\item{n_char}{integer with number of desired characters to read from raw} + \item{encoding}{encoding to assign character strings that are read. Default is \code{"latin1"}., which will use Windows Latin 1 (ANSI) encoding. This is how Bruker software OPUS is assumed to commonly store strings.}