R/mts_genepairsChunkGeneration.R

Defines functions mts_genepairsChunkGeneration

Documented in mts_genepairsChunkGeneration

mts_genepairsChunkGeneration = function(genepairs = NULL, mixModelClusters1, mixModelClusters2 = NULL, num_tasks, output_dir = tempdir(), cores) {
    
  if (missing(cores)) {
    cores <- 1
    message("1 core selected")
  } else if (!is.numeric(cores) || cores < 1) {
    stop("cores should be >= 1")
  } else {
    message(cores, " cores selected")
  }
  
  # input check - ensure mixModelClusters1 is a list
  if (missing(mixModelClusters1) || !is.list(mixModelClusters1)) {
    stop("mixModelClusters1 must be a list of data frames generated from the mts_mixModelCluster() function")
  }
  
  if (!is.null(mixModelClusters2) && !is.list(mixModelClusters2)) {
    stop("mixModelClusters2 must be a list of data frames generated from the mts_mixModelCluster() function")
  }
  
  mixModelClusters1 <- prefilterMixModelClusters(mixModelClusters1)
  
  # check for bidirectional analysis
  if (!is.null(mixModelClusters2)) {
    bidirectionalAnalysis <- TRUE
    message("Performing Bidirectional Analysis")
    mixModelClusters2 <- prefilterMixModelClusters(mixModelClusters2)
    filtered_lists <- GMM_CCL(mixModelClusters1, mixModelClusters2)
    mixModelClusters1 <- filtered_lists[[1]]
    mixModelClusters2 <- filtered_lists[[2]]
  } else {
    bidirectionalAnalysis <- FALSE
    message("Performing One Directional Analysis")
  }
  
  if (missing(num_tasks) || !is.numeric(num_tasks) || num_tasks <= 0) {
    stop("Error: num_tasks value must be numeric and greater than 0.")
  }
  
  if (!is.numeric(cores) || cores <= 0) {
    stop("Error: num_cores must be numeric and greater than 0.")
  }
  
  # input check - generation of genepairs
  if (is.null(genepairs)) {
    message("Generating genepairs for analysis")
    genepairs <- generateGenePairs(mixModelClusters1, mixModelClusters2,
                                   bidirectionalAnalysis = bidirectionalAnalysis,
                                   include_reverse_pairs = F,
                                   verbose = F, cores=cores)
  } else {
    if (!(is.data.frame(genepairs) || is.matrix(genepairs))) {
      stop("genepairs must be either a dataframe or a matrix, genepairs can be generated by omitting the argument or setting genepairs to NULL ")
    }
    genepairs <- as.data.frame(genepairs)
  }
  
  # ensure output directory exists, if not create
  if (!dir.exists(output_dir)) {
    dir.create(output_dir, recursive = TRUE)
  }
  
  # total number of genepairs
  total <- nrow(genepairs)
  # calculate number of genepairs per task / chunk
  genepairs_in_task <- ceiling(total / num_tasks)
  
  # parallelize chunk saving with pbmclapply
  pbmclapply(1:num_tasks, function(i) {
    start <- ((i - 1) * genepairs_in_task) + 1
    end <- min(i * genepairs_in_task, total)  # ensure end doesn't exceed total
    if (start > end) return(NULL)  # stop if start exceeds end
    
    subset_genepairs <- genepairs[start:end, ]
    output_file <- file.path(output_dir, paste0("genepairs_chunk_", i, ".RData"))
    save(subset_genepairs, file = output_file)
  }, mc.cores = cores)
}

Try the MultiSEp package in your browser

Any scripts or data that you put into this service are public.

MultiSEp documentation built on Aug. 27, 2026, 5:07 p.m.