From 601644f90d24b8f27a918f7a6601afaddc54d7a8 Mon Sep 17 00:00:00 2001 From: huangyaqing-123 Date: Tue, 11 Feb 2025 09:52:28 +0800 Subject: [PATCH 1/4] Merged PathwayEmbed into PathwayEmbedding root --- DESCRIPTION | 21 ++++++++ NAMESPACE | 11 ++++ PathwayEmbed.Rproj | 23 ++++++++ R/PathwayDataSet.R | 24 +++++++++ R/Pathwayembed.R | 81 ++++++++++++++++++++++++++++ inst/extdata/Pathway Embedding.xlsx | Bin 0 -> 29681 bytes man/load_pathway_data.Rd | 17 ++++++ man/pathwayembed.Rd | 21 ++++++++ 8 files changed, 198 insertions(+) create mode 100644 DESCRIPTION create mode 100644 NAMESPACE create mode 100644 PathwayEmbed.Rproj create mode 100644 R/PathwayDataSet.R create mode 100644 R/Pathwayembed.R create mode 100644 inst/extdata/Pathway Embedding.xlsx create mode 100644 man/load_pathway_data.Rd create mode 100644 man/pathwayembed.Rd diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..aa2168f --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,21 @@ +Package: PathwayEmbed +Title: What the Package Does (One Line, Title Case) +Version: 0.0.0.9000 +Authors@R: + person("First", "Last", , "first.last@example.com", role = c("aut", "cre")) +Description: What the package does (one paragraph). +License: `use_mit_license()`, `use_gpl3_license()` or friends to pick a + license +Encoding: UTF-8 +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.2 +Imports: + readxl, + Seurat, + dplyr, + RColorBrewer, + ggplot2, + cowplot, + tidyverse, + matrixStats, + viridis diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..4989072 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,11 @@ +# Generated by roxygen2: do not edit by hand + +export(load_pathway_data) +export(pathwayembed) +import(RColorBrewer) +import(Seurat) +import(cowplot) +import(ggplot2) +import(readxl) +import(tidyverse) +import(viridis) diff --git a/PathwayEmbed.Rproj b/PathwayEmbed.Rproj new file mode 100644 index 0000000..ac761db --- /dev/null +++ b/PathwayEmbed.Rproj @@ -0,0 +1,23 @@ +Version: 1.0 +ProjectId: 0c111876-39b0-460f-a888-db107bec1084 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes +LineEndingConversion: Posix + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/R/PathwayDataSet.R b/R/PathwayDataSet.R new file mode 100644 index 0000000..1469d6d --- /dev/null +++ b/R/PathwayDataSet.R @@ -0,0 +1,24 @@ +## Pathway Data Extraction from Exceldataset +#' +#' This function reads pathway data from the package's built-in Excel file. +#' @name load_pathway_data +#' @param pathway The name of the pathway interested. +#' @return A data frame with pathway data. +#' @import readxl +#' @export +load_pathway_data <- function(pathway) { + file_path <- system.file("extdata", "Pathway Embedding.xlsx", package = "PathwayEmbed") + + if (file_path == "") { + stop("Pathway data file not found. Ensure the package is installed correctly.") + } + + # Read the specified sheet + data <- readxl::read_excel(file_path, sheet = pathway) + # extract the molecules in the pathway + pathway.molecules <- c(data[["Molecules"]]) + # extract the coefficients of the molecules in the pathway + pathway.coefficients <- as.numeric(c(data[["Coefficients"]])) + + return(data) +} diff --git a/R/Pathwayembed.R b/R/Pathwayembed.R new file mode 100644 index 0000000..e85a9e2 --- /dev/null +++ b/R/Pathwayembed.R @@ -0,0 +1,81 @@ +# Set Seed +set.seed(123) +options(future.globals.maxSize = 2000 * 1024^2) + +#' A function for scRNA sequencing pathway analysis +#' @name pathwayembed +#' @import Seurat +#' @import RColorBrewer +#' @import ggplot2 +#' @import cowplot +#' @import tidyverse +#' @import viridis +#' +#' @param x A Seurat Object. +#' @param pathway A character. +#' @param idents Idents of the X +#' @return The sum of x and y. +#' @examples +#' pathwayembed(x, pathway, idents) +#' @export + +# Load Packages +require(Seurat) +require(RColorBrewer) +require(ggplot2) +require(cowplot) +require(tidyverse) +require(viridis) + +#Pathway Transduction Function +pathwayembed <- function(x, pathway, idents){ + Idents(x) <- idents + # downsample if Seurat Object is very large + all_cells <- Cells(x) + if(length(all_cells) > 2000){ + sample_cells <- sample(all_cells, 2000) + x <- subset(x, cells = sample_cells) + } + # define pathway parameters using load_pathway_data + pathwaydata <- load_pathway_data(pathway) + names <- c(pathwaydata[[1]]) + pathway.on <- as.numeric(c(pathwaydata[[2]])) + names(pathway.on) <- names + pathway.off <- -pathway.on + + temp.data <- x[names, ] + meta.data <- temp.data@meta.data + data.temp <- as.data.frame(temp.data@assays[["RNA"]]$data) + ranges <- matrixStats::rowRanges(as.matrix(data.temp),na.rm = F) + for (i in 1:length(pathway.on)){ + if(pathway.on[i]<0){pathway.on[i]<-ranges[names(pathway.on[i]),1]} + else{pathway.on[i]<-ranges[names(pathway.on[i]),2]} + } + for (i in 1:length(pathway.off)){ + if(pathway.off[i]<0){pathway.off[i]<-ranges[names(pathway.off[i]),1]} + else{pathway.off[i]<-ranges[names(pathway.off[i]),2]} + } + pathway.stat <- data.frame(pathway.on,pathway.off) + pathwaydata <- cbind(pathway.stat,data.temp) + +} + + +pathwayplot <- function (pathwaydata, SampleType){ + d <- dist(t(pathwaydata),method = 'manhattan') + fit <- cmdscale(d,eig=T, k=1) + to.plot <- as.data.frame(fit$points) + to.plot$SampleType <- NA + to.plot[rownames(meta.data),]$SampleType <- as.character(meta.data$SampleType) + to.plot['pathway.on',]$SampleType <- 'ON' + to.plot['pathway.off',]$SampleType <- 'OFF' + # Organize metadata for plotting + to.plot$SampleType <- factor(to.plot$SampleType,levels = c(unique(x$SampleType))) + # Scale + to.plot$scale <- scale(to.plot$V1,center = T)[,1] + # Normalize + to.plot$normalized <- (to.plot$V1 - min(to.plot$V1)) / (max(to.plot$V1) - min(to.plot$V1)) + # Isolate columns of interest + plot.temp <- to.plot[-c(1:2),] + plot.total <- ggplot(data=plot.temp) +} diff --git a/inst/extdata/Pathway Embedding.xlsx b/inst/extdata/Pathway Embedding.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3a585aab31a50cef758b369ae1ada80212b46310 GIT binary patch literal 29681 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 Date: Tue, 11 Feb 2025 10:28:19 +0800 Subject: [PATCH 2/4] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f94ac27..b3137bc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PathwayEmbedding +# PathwayEmbed This is a repository for work with Yaqing Huang. ## We are focusing on 1-D embeddings of pathway state. From d8cdd694ff9daf27a6f8c2b3d9f418e426d08a9d Mon Sep 17 00:00:00 2001 From: huangyaqing-123 Date: Wed, 21 May 2025 09:53:16 -0400 Subject: [PATCH 3/4] updates updates --- .Rbuildignore | 2 + DESCRIPTION | 25 +++- LICENSE | 2 +- NAMESPACE | 15 +- R/CalculatePercentage.R | 46 ++++++ R/ComputeCellData.R | 145 +++++++++++++++++++ R/{PathwayDataSet.R => LoadPathway.R} | 18 ++- R/PathwayMaxMin.R | 69 +++++++++ R/Pathwayembed.R | 81 ----------- R/PlotPathway.R | 43 ++++++ R/PreparePlotData.R | 43 ++++++ R/data_documentation.R | 55 +++++++ data/fake_final_mds.rda | Bin 0 -> 2078 bytes data/fake_test_object.rda | Bin 0 -> 10939 bytes data/fake_to_plot.rda | Bin 0 -> 2936 bytes inst/extdata/Pathway Embedding.xlsx | Bin 29681 -> 0 bytes inst/extdata/Pathway_Embedding.xlsx | Bin 0 -> 30084 bytes man/CalculatePercentage.Rd | 23 +++ man/ComputeCellData.Rd | 30 ++++ man/{load_pathway_data.Rd => LoadPathway.Rd} | 11 +- man/PathwayMaxMin.Rd | 23 +++ man/PlotPathway.Rd | 27 ++++ man/PreparePlotData.Rd | 26 ++++ man/fake_final_mds.Rd | 25 ++++ man/fake_test_object.Rd | 27 ++++ man/fake_to_plot.Rd | 27 ++++ man/pathwayembed.Rd | 21 --- 27 files changed, 660 insertions(+), 124 deletions(-) create mode 100644 .Rbuildignore create mode 100644 R/CalculatePercentage.R create mode 100644 R/ComputeCellData.R rename R/{PathwayDataSet.R => LoadPathway.R} (75%) create mode 100644 R/PathwayMaxMin.R delete mode 100644 R/Pathwayembed.R create mode 100644 R/PlotPathway.R create mode 100644 R/PreparePlotData.R create mode 100644 R/data_documentation.R create mode 100644 data/fake_final_mds.rda create mode 100644 data/fake_test_object.rda create mode 100644 data/fake_to_plot.rda delete mode 100644 inst/extdata/Pathway Embedding.xlsx create mode 100644 inst/extdata/Pathway_Embedding.xlsx create mode 100644 man/CalculatePercentage.Rd create mode 100644 man/ComputeCellData.Rd rename man/{load_pathway_data.Rd => LoadPathway.Rd} (70%) create mode 100644 man/PathwayMaxMin.Rd create mode 100644 man/PlotPathway.Rd create mode 100644 man/PreparePlotData.Rd create mode 100644 man/fake_final_mds.Rd create mode 100644 man/fake_test_object.Rd create mode 100644 man/fake_to_plot.Rd delete mode 100644 man/pathwayembed.Rd diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..91114bf --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,2 @@ +^.*\.Rproj$ +^\.Rproj\.user$ diff --git a/DESCRIPTION b/DESCRIPTION index aa2168f..c562f04 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,21 +1,32 @@ Package: PathwayEmbed -Title: What the Package Does (One Line, Title Case) +Title: Tools for Pathway-Level Embedding and Visualization in Single-Cell Data Version: 0.0.0.9000 Authors@R: - person("First", "Last", , "first.last@example.com", role = c("aut", "cre")) -Description: What the package does (one paragraph). -License: `use_mit_license()`, `use_gpl3_license()` or friends to pick a - license + person("Yaqing", "Huang", email = "yaqing.huang@yale.edu", role = c("aut", "cre")) +Description: Provides utilities for analyzing and visualizing pathway-level embeddings + in single-cell RNA-seq data. Includes functions for calculating pathway activity + percentages, plotting pathway enrichment, and integrating with Seurat objects. +License: MIT + file LICENSE Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 +Depends: + R (>= 3.5) Imports: readxl, Seurat, - dplyr, RColorBrewer, ggplot2, cowplot, tidyverse, matrixStats, - viridis + viridis, + stats, + dplyr, + effsize, + rlang +Suggests: + testthat (>= 3.0.0) +Config/testthat/edition: 3 +LazyData: true + diff --git a/LICENSE b/LICENSE index 62584c7..ef97142 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Raredon Lab +Copyright (c) 2025 Raredon Lab Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/NAMESPACE b/NAMESPACE index 4989072..7d09a63 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,11 +1,22 @@ # Generated by roxygen2: do not edit by hand -export(load_pathway_data) -export(pathwayembed) +export(CalculatePercentage) +export(ComputeCellData) +export(LoadPathway) +export(PathwayMaxMin) +export(PlotPathway) +export(PreparePlotData) import(RColorBrewer) import(Seurat) import(cowplot) import(ggplot2) +import(matrixStats) import(readxl) +import(stats) import(tidyverse) import(viridis) +importFrom(dplyr,bind_rows) +importFrom(dplyr,filter) +importFrom(dplyr,pull) +importFrom(effsize,cohen.d) +importFrom(rlang,sym) diff --git a/R/CalculatePercentage.R b/R/CalculatePercentage.R new file mode 100644 index 0000000..374e6c8 --- /dev/null +++ b/R/CalculatePercentage.R @@ -0,0 +1,46 @@ +#' Calculate the percentage of cells in activation status +#' @name CalculatePercentage +#' @importFrom dplyr filter pull bind_rows +#' @importFrom rlang sym +#' @importFrom effsize cohen.d +#' @param to.plot A data frame containing at least a `scale` column and a grouping column. +#' @param group_var A string specifying the grouping variable (e.g., "genotype", "treatment"). +#' @return A data frame with the percentage of ON/OFF cells and Cohen's d (if applicable). +#' @examples +#' data(fake_to_plot) +#' CalculatePercentage(fake_to_plot, "genotype") +#' @export +CalculatePercentage <- function(to.plot, group_var){ + stopifnot("scale" %in% names(to.plot)) + + group_sym <- sym(group_var) + groups <- unique(na.omit(to.plot[[group_var]])) + results <- list() + + for (g in groups) { + subset_data <- dplyr::filter(to.plot, !!group_sym == g) + total <- nrow(subset_data) + + on <- sum(subset_data[["scale"]] > 0, na.rm = TRUE) + off <- sum(subset_data[["scale"]] < 0, na.rm = TRUE) + + results[[as.character(g)]] <- list( + percentage_on = round(100 * on / total, 2), + percentage_off = round(100 * off / total, 2) + ) + } + + if (length(groups) == 2) { + g1 <- groups[1] + g2 <- groups[2] + vec1 <- pull(dplyr::filter(to.plot, !!group_sym == g1), scale) + vec2 <- pull(dplyr::filter(to.plot, !!group_sym == g2), scale) + cohens_d_val <- cohen.d(vec1, vec2)$estimate + + results[[as.character(g1)]]$cohens_d <- cohens_d_val + results[[as.character(g2)]]$cohens_d <- cohens_d_val + } + + df <- bind_rows(results, .id = "group") + return(df) +} diff --git a/R/ComputeCellData.R b/R/ComputeCellData.R new file mode 100644 index 0000000..a742664 --- /dev/null +++ b/R/ComputeCellData.R @@ -0,0 +1,145 @@ +#' A function for scRNA sequencing pathway analysis +#' +#' This function computes cell status for a given pathway in single-cell RNA-seq data, +#' based on the distance between genes in a specified pathway. The distance is computed +#' for each batch of cells, and classical multidimensional scaling (MDS) is used to +#' visualize the pathway expression across cells. +#' +#' @name ComputeCellData +#' @import Seurat +#' @import tidyverse +#' @import viridis +#' @import matrixStats +#' @import stats +#' @param x A `Seurat` object containing single-cell RNA sequencing data. +#' @param pathway A `character` string specifying the pathway name. +#' @param distance.method A `character` string specifying the distance method. +#' Options include: "manhattan", "euclidean", "canberra", "binary", "minkowski". +#' @return A data frame representing the multidimensional scaling (MDS) results +#' for the cells based on the pathway expression. +#' @examples +#' data(fake_test_object) # load the fake test data +#' ComputeCellData(fake_test_object, "Wnt", "manhattan") +#' @export +ComputeCellData <- function(x, pathway, distance.method){ + + # Get pathway data + pathwaydata <- LoadPathway(pathway) + names <- c(pathwaydata[[1]]) + + # Ensure only valid genes are used + valid_names <- intersect(names, rownames(x)) + if (length(valid_names) == 0) { + stop("No matching genes found in the Seurat object for the given pathway.") + } + + # Pathway max and min + pathway.stat <- PathwayMaxMin(x, pathway) + + # Gel all cells + all_cells <- Cells(x) + + # Define batch size + batch_size <-1000 + # test batch_size = 1 store the output, -> identical or not? + + # Determine the number of iterations + num_batches <- ceiling(length(all_cells) / batch_size) + # Initialize list to store results + batch_results <- list() + + # Loop through batches of 500 cells + for (i in seq_len(num_batches)) { + + # Ensure there are remaining cells to sample + if (length(all_cells) == 0) break + + # Sample cells + sample_cells <- sample(all_cells, min(batch_size, length(all_cells))) + if (length(sample_cells) == 0) next # Avoid errors if no cells left + + # Subset Seurat object + x_batch <- subset(x, cells = sample_cells) + DefaultAssay(x_batch) <- "RNA" # Ensure correct assay + + # Extract expression data + temp.data.batch <- x_batch[valid_names, ] # when n= 1, it is a vecor + # if temp.data.batch > 2 more rows + # if temp.data.batch = 1 row + # if temp.data.batch = 0, stop + # Convert to data frame to avoid vector issues when n = 1 + if (is.vector(temp.data.batch)) { + temp.data.batch <- as.data.frame(t(temp.data.batch)) + } else { + temp.data.batch <- as.data.frame(temp.data.batch@assays[["RNA"]]$data) + } + + # Check if temp.data.batch is empty + if (nrow(temp.data.batch) == 0) { + warning("Batch", i, "has no valid data. Skipping...") + next + } + + # Merge pathway stats with expression data + # Ensure they have the same columes + common_rows <- intersect(rownames(pathway.stat), rownames(temp.data.batch)) + pathway.stat <- pathway.stat[common_rows, , drop = FALSE] + temp.data.batch <- temp.data.batch[common_rows, , drop = FALSE] + + pathwaytempdata <- cbind(pathway.stat, temp.data.batch) + + # Ensure there are at least two columns for distance computation + if (ncol(pathwaytempdata) < 2) { + warning("Batch", i, "does not have enough features for distance calculation. Skipping...") + next + } + + # Compute Manhattan distance + # distance.method <- 'manhattan' + message("Computing distance...") + d <- dist(t(pathwaytempdata), method = distance.method) # should we use scaled data? + # "manhattan" is sum of absolute differences (city block distance), good for sparse data (gene expression) + # "euclidean" is stratight-line distance, is useful for PCA clustering + # "canberra" is weighted distance, is also good for sparse data and when values have very different scales + # "binary" is distance based on presence/absence (0/1) + # "minkowski" is generalization of euclidean & manhattan, tunable using p parameter + # choose "manhattan" as it works well for high-dimensional data and less sensitive to large outliers than euclidean distance + + # Perform classical multidimensional scaling (MDS) + message("running mds ...") + fit <- cmdscale(d, eig = TRUE, k = 1) + message("mds finished") + + + # Transform to data frame + temp.data.mds <- as.data.frame(fit$points) + colnames(temp.data.mds) <- "V1" + + # Normalize the MDS data safely + V1_min <- min(temp.data.mds$V1, na.rm = TRUE) + V1_max <- max(temp.data.mds$V1, na.rm = TRUE) + + if (V1_max == V1_min) { + temp.data.mds$normalized <- 0 # Avoid division by zero + } else { + temp.data.mds$normalized <- (temp.data.mds$V1 - V1_min) / (V1_max - V1_min) + } + + # Store MDS results for each batch + batch_results[[i]] <- temp.data.mds + + # Print progress + cat("Batch", i, "processed with", length(sample_cells), "cells\n") + + # Remove used cells to avoid duplication in the next iteration + all_cells <- setdiff(all_cells, sample_cells) + } + final_mds <- do.call(rbind, batch_results) # Merge all batch MDS results + + return(final_mds) +} + +# we need to re-scale +# help function -> documentation +# clear all R environment -> test_script see if works +# document() diff --git a/R/PathwayDataSet.R b/R/LoadPathway.R similarity index 75% rename from R/PathwayDataSet.R rename to R/LoadPathway.R index 1469d6d..1375938 100644 --- a/R/PathwayDataSet.R +++ b/R/LoadPathway.R @@ -1,24 +1,26 @@ ## Pathway Data Extraction from Exceldataset #' #' This function reads pathway data from the package's built-in Excel file. -#' @name load_pathway_data +#' @name LoadPathway #' @param pathway The name of the pathway interested. #' @return A data frame with pathway data. +#' @examples +#' LoadPathway("Wnt") #' @import readxl -#' @export -load_pathway_data <- function(pathway) { - file_path <- system.file("extdata", "Pathway Embedding.xlsx", package = "PathwayEmbed") - +#' @export +LoadPathway <- function(pathway) { + file_path <- system.file("extdata", "Pathway_Embedding.xlsx", package = "PathwayEmbed") + if (file_path == "") { stop("Pathway data file not found. Ensure the package is installed correctly.") } - + # Read the specified sheet data <- readxl::read_excel(file_path, sheet = pathway) # extract the molecules in the pathway - pathway.molecules <- c(data[["Molecules"]]) + pathway.molecules <- c(data[["Molecules"]]) # extract the coefficients of the molecules in the pathway pathway.coefficients <- as.numeric(c(data[["Coefficients"]])) - + return(data) } diff --git a/R/PathwayMaxMin.R b/R/PathwayMaxMin.R new file mode 100644 index 0000000..7043cac --- /dev/null +++ b/R/PathwayMaxMin.R @@ -0,0 +1,69 @@ +#' A function for scRNA sequencing pathway analysis +#' @name PathwayMaxMin +#' @import Seurat +#' @import tidyverse +#' @import viridis +#' @import matrixStats +#' +#' @param x A Seurat Object. +#' @param pathway The name of the pathway. +#' @return The value for Pathway on and off (max and min value for features) +#' @examples +#' data(fake_test_object) # load the fake test data +#' PathwayMaxMin(fake_test_object, "Wnt") +#' @export +PathwayMaxMin <- function(x, pathway){ + + # Define pathway parameters using LoadPathway + pathwaydata <- LoadPathway(pathway) # load pathway data + names <- c(pathwaydata[[1]]) # molecule names + pathway.on <- as.numeric(c(pathwaydata[[2]])) # coefficients + names(pathway.on) <- names + pathway.off <- -pathway.on # define off status + + # Extract normalized RNA expression data for the pathway genes + temp.data <- x[names, ] + data.temp <- as.data.frame(temp.data@assays[["RNA"]]$data) # Seurat version + # "sometimes is counts not data + + # Max and min value for genes in the pathway + # Compute row-wise min and max values + ranges <- cbind( + rowMins(as.matrix(data.temp), na.rm = FALSE), + rowMaxs(as.matrix(data.temp), na.rm = FALSE) + ) + + # Scale the ON/OFF states to the extrema of these ranges for each features + for (i in seq_along(pathway.on)) { # safer than 1:length(pathway.on) + feature_name <- names(pathway.on[i]) + + if (!feature_name %in% rownames(ranges)) { + warning(paste("Feature", feature_name, "not found in ranges!")) + next # Skip iteration if feature is missing + } + if (pathway.on[i] < 0) { + pathway.on[i] <- ranges[feature_name, 1] # min for ON + } else { + pathway.on[i] <- ranges[feature_name, 2] # max for ON + } + } + for (i in seq_along(pathway.off)) { # Safer indexing + feature_name <- names(pathway.off[i]) # Get feature name + + if (!feature_name %in% rownames(ranges)) { # Check if feature exists in ranges + warning(paste("Feature", feature_name, "not found in ranges! Skipping...")) + next # Skip to the next iteration if missing + } + + # Assign min or max based on value + pathway.off[i] <- ifelse(pathway.off[i] < 0, + ranges[feature_name, 1], # Min for OFF + ranges[feature_name, 2]) # Max for OFF + } + + + # Bind on and off states + pathway.stat <- data.frame(pathway.on,pathway.off) + + return(pathway.stat) +} diff --git a/R/Pathwayembed.R b/R/Pathwayembed.R deleted file mode 100644 index e85a9e2..0000000 --- a/R/Pathwayembed.R +++ /dev/null @@ -1,81 +0,0 @@ -# Set Seed -set.seed(123) -options(future.globals.maxSize = 2000 * 1024^2) - -#' A function for scRNA sequencing pathway analysis -#' @name pathwayembed -#' @import Seurat -#' @import RColorBrewer -#' @import ggplot2 -#' @import cowplot -#' @import tidyverse -#' @import viridis -#' -#' @param x A Seurat Object. -#' @param pathway A character. -#' @param idents Idents of the X -#' @return The sum of x and y. -#' @examples -#' pathwayembed(x, pathway, idents) -#' @export - -# Load Packages -require(Seurat) -require(RColorBrewer) -require(ggplot2) -require(cowplot) -require(tidyverse) -require(viridis) - -#Pathway Transduction Function -pathwayembed <- function(x, pathway, idents){ - Idents(x) <- idents - # downsample if Seurat Object is very large - all_cells <- Cells(x) - if(length(all_cells) > 2000){ - sample_cells <- sample(all_cells, 2000) - x <- subset(x, cells = sample_cells) - } - # define pathway parameters using load_pathway_data - pathwaydata <- load_pathway_data(pathway) - names <- c(pathwaydata[[1]]) - pathway.on <- as.numeric(c(pathwaydata[[2]])) - names(pathway.on) <- names - pathway.off <- -pathway.on - - temp.data <- x[names, ] - meta.data <- temp.data@meta.data - data.temp <- as.data.frame(temp.data@assays[["RNA"]]$data) - ranges <- matrixStats::rowRanges(as.matrix(data.temp),na.rm = F) - for (i in 1:length(pathway.on)){ - if(pathway.on[i]<0){pathway.on[i]<-ranges[names(pathway.on[i]),1]} - else{pathway.on[i]<-ranges[names(pathway.on[i]),2]} - } - for (i in 1:length(pathway.off)){ - if(pathway.off[i]<0){pathway.off[i]<-ranges[names(pathway.off[i]),1]} - else{pathway.off[i]<-ranges[names(pathway.off[i]),2]} - } - pathway.stat <- data.frame(pathway.on,pathway.off) - pathwaydata <- cbind(pathway.stat,data.temp) - -} - - -pathwayplot <- function (pathwaydata, SampleType){ - d <- dist(t(pathwaydata),method = 'manhattan') - fit <- cmdscale(d,eig=T, k=1) - to.plot <- as.data.frame(fit$points) - to.plot$SampleType <- NA - to.plot[rownames(meta.data),]$SampleType <- as.character(meta.data$SampleType) - to.plot['pathway.on',]$SampleType <- 'ON' - to.plot['pathway.off',]$SampleType <- 'OFF' - # Organize metadata for plotting - to.plot$SampleType <- factor(to.plot$SampleType,levels = c(unique(x$SampleType))) - # Scale - to.plot$scale <- scale(to.plot$V1,center = T)[,1] - # Normalize - to.plot$normalized <- (to.plot$V1 - min(to.plot$V1)) / (max(to.plot$V1) - min(to.plot$V1)) - # Isolate columns of interest - plot.temp <- to.plot[-c(1:2),] - plot.total <- ggplot(data=plot.temp) -} diff --git a/R/PlotPathway.R b/R/PlotPathway.R new file mode 100644 index 0000000..2bcc2c1 --- /dev/null +++ b/R/PlotPathway.R @@ -0,0 +1,43 @@ +#' A function to plot the Pathway activation status +#' @name PlotPathway +#' @import Seurat +#' @import RColorBrewer +#' @import ggplot2 +#' @import cowplot +#' @import tidyverse +#' @import viridis +#' +#' @param to.plot A dataframe. +#' @param pathway A name of the pathway. +#' @param group Ident of the plot. +#' @param color Colors for the group. +#' @return A plot. +#' @examples +#' data(fake_to_plot) +#' PlotPathway(fake_to_plot, "Wnt", "genotype", c("#ae282c","#2066a8")) +#' @export +PlotPathway <- function (to.plot, pathway, group, color){ + # get rid of NA columns (those pathway on and off values) + to.plot_clean <- to.plot[complete.cases(to.plot), ] + + #color has to be assigned + plot.total <- ggplot(data=to.plot_clean, + aes(x=scale, + group = .data[[group]], + fill= .data[[group]], + color= .data[[group]]))+ + + geom_density(alpha = 0.5) + # Example: Density plot + labs(title = paste(pathway, "Pathway"), + x = "Transduction State", + y = "Population Density") + + scale_fill_manual(values = color) + # Set fixed colors + scale_color_manual(values = color) + + theme_classic() + + geom_vline(xintercept=0, linetype="dotted", + color = "black", size=0.5) + + return(plot.total) +} + +# x=scale or normalized can use True or False diff --git a/R/PreparePlotData.R b/R/PreparePlotData.R new file mode 100644 index 0000000..2eca276 --- /dev/null +++ b/R/PreparePlotData.R @@ -0,0 +1,43 @@ +#' A function to prepare the signal transduction dataframe for plotting +#' @name PreparePlotData +#' @import Seurat +#' @import RColorBrewer +#' @import ggplot2 +#' @import cowplot +#' @import tidyverse +#' @import viridis +#' @import matrixStats +#' +#' @param x A `Seurat` object containing single-cell RNA sequencing data. +#' @param final_mds A 'dataframe' output from ComputeCellData. +#' @param group group for the comparision +#' @return data for plotting +#' @examples +#' data(fake_test_object) +#' data(fake_final_mds) +#' PreparePlotData(fake_test_object, fake_final_mds, "genotype") +#' @export +PreparePlotData <- function(x, final_mds, group){ + + # make a data frame from final_mds + to.plot <- as.data.frame(final_mds) + + # the rownames changed in last step, to make them consistent with meta.data + rownames(to.plot) <- gsub("\\.", "-", rownames(to.plot)) + + # add group into the dataframe and assign group + to.plot[[group]] <- NA + meta.data <- x@meta.data + to.plot[rownames(meta.data),][[group]] <- as.character(meta.data[[group]]) + + # Scale + to.plot$scale <- scale(to.plot$normalized,center = T)[,1] + + # Get ride of non-cell rows + # to.plot <- to.plot[!is.na(to.plot[[group]]), ] + + return(to.plot) +} + + + diff --git a/R/data_documentation.R b/R/data_documentation.R new file mode 100644 index 0000000..e5f14f9 --- /dev/null +++ b/R/data_documentation.R @@ -0,0 +1,55 @@ +#' Example Seurat Object for Testing +#' +#' A simulated Seurat object with fake gene expression data for the Wnt signaling pathway. +#' This Seurat object contains gene expression data from simulated cells with Wnt positive +#' and negative gene expression values. +#' +#' @format A Seurat object. The object contains: +#' \describe{ +#' \item{assays}{List of assays used for data storage. Includes RNA expression data.} +#' \item{meta.data}{Metadata associated with the cells. Contains information about the groups (e.g., WT vs. Mutant).} +#' \item{features}{Gene features (including Wnt pathway genes) used in the analysis.} +#' \item{cells}{Cell names, labeled as Cell1, Cell2, ..., CellN.} +#' } +#' @source Simulated for demonstration purposes. +#' @usage data(fake_test_object) +"fake_test_object" + + +#' Example Cell Status and Normalized Data +#' +#' A dataset generated by `ComputeCellData` applied to `fake_test_object`. +#' Contains cell status and normalized values. +#' +#' @format A data frame with the following columns: +#' \describe{ +#' \item{V1}{A numerical value presenting the status of the cell} +#' \item{normalized}{Numerical value representing normalized data} +#' } +#' @usage data(fake_final_mds) +#' @examples +#' data(fake_final_mds) +#' head(fake_final_mds) +#' @keywords datasets +"fake_final_mds" + +#' Example Processed Data for Plotting +#' +#' A dataset generated by running `PreparePlotData` on `fake_test_object` and `fake_final_mds`. +#' Contains processed data ready for visualization, with the following features: +#' +#' @format A data frame with the following columns: +#' \describe{ +#' \item{V1}{A numerical or categorical value depending on the specific analysis} +#' \item{normalized}{Normalized numerical value representing the cell's data} +#' \item{genotype}{Group classification of the cell (e.g., "WT", "Mutant")} +#' \item{scale}{Scaled data for visualization purposes} +#' } +#' @usage data(fake_to_plot) +#' @examples +#' data(fake_to_plot) +#' head(fake_to_plot) +#' @keywords datasets +"fake_to_plot" + + diff --git a/data/fake_final_mds.rda b/data/fake_final_mds.rda new file mode 100644 index 0000000000000000000000000000000000000000..a942381703dca125689ef362dc8277c87b5ca17f GIT binary patch literal 2078 zcmV+(2;ui1iwFP!0000016|b%R89FF2k>2;({#>JdNR49yqa#L&igFYZ%5-*#v@8) zdPpgH&_ha-E^#QC(2!fkBU6c7hN8mR7%`%0GSpG$u}_@38p%X2(LFPxyZYH{?X~y! zxBidM{;#$F{}rCAdF<6}f*=eC21B1PVCr58=BkzRXNd_yS0D&IfNxGO*dsP)?WJdpk1S^@1{lV zz+y{^QSz)li6N481?tbOZsAgYhi`dEc4>Uo0`Pvf4o>Xdr zoZ4QIwU=T}OqgZ7agZ`@8G3BD*M#DPgbIm)`6>aX4l5X!oI6DktocTm=wj%e*l9A(3SEmy-gJfO_e znVk;9eUwRt=iT51y_ETba%bb6CX`WH&aO-AY$*0_v-vNo3}o+v;w#EF1XJeS<;G{F z2D0N>lRbnhO(?w{s@Xx!p$uIdE=~C10mYKpT_k%epzq4G7>l+c%6wOcY2=+dl+ASe z>X{es$+}*wKW1BKM%jFw@3N^^O__e_GVAa^dSzWZvkU*bXDZ2YGRzqJu!GWD#Ji#2 z)FgXXQa8sowu54Ck{eZBkON)xs<>L)Ng7sONgV6OBlW^wy7v7xpERBrJErCGY0|>< z%ADGWJQ&RG8hA75G|7NOe}H7{HR!vi7CKm6Ve0|z?e8j|mVN>+Dj z=++___+o(%-%|@8>@(UYMeCDhjx*2BYtoYX?6NZ}ssc%7t#Kaz>Tjg6^EYWkUvI|5ehg)^}m|0c=ClRlb3IAUkGH#L#?`l{HhN6UTNmK8!3GZA6NWy9`y+lfr?AM8v(#l@a(qpA;m9~V`v#uU|U7ROt znv@VZtj&eK*NkP)66cY#oTYV(vkFM#po-Lc-!e%3Mf)dS;y9DUv~L!*#afU2H_%O> z3sjlv>bgEQD7U60DHipBa*C_MJ7Ov*+A7nSX${acxSbD|rh(!(yFoB!IVjE?d3<|^ z6{zH(O<%naRIcuAWJDDxMQ+<~dK*>ohfXP*YT#cQb(Zmaa+1eixyPXx#=70^MKaWysYuC1!Y0(xc~s`|BKCvQlN)77o{ENgJ#$6n|V)Ype+ey z z><-)l`m*;aGCv1szoSPxP5ueA>*~#}h3|nLb0eE|R|x98=l?U5#sQjD?lUgf3TUTa z%j}8Spjk5IX|9JG&;f1IHM!$~J{a_Q=F|P4AqwQze%85dN{6GrvIb4?7nad(`9QzT z+>p%K0`!Z`!i{NfbmN>j_{X+?0qtFWmTK4vv|H&ivU>!$Ra=%A+iXOMTjgyWDz2Z5LtxCB19G;vIvnyge)Rt z5h05RSwzSpLKYFSh>%5uEFxqPBa0YW#K7BRAjkwuIwVq_5`ix^oX$Ra@&39?9# zMS?66WRW0?1X(1=A{nuK_V-@r{ONWd79E-}vSW`F+3P|RL!Bbxb(^^^efabKALV_M I?$`_f0JxD77XSbN literal 0 HcmV?d00001 diff --git a/data/fake_test_object.rda b/data/fake_test_object.rda new file mode 100644 index 0000000000000000000000000000000000000000..874c0d0b3421827fb70862e951663d65837f2e98 GIT binary patch literal 10939 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 literal 0 HcmV?d00001 diff --git a/man/CalculatePercentage.Rd b/man/CalculatePercentage.Rd new file mode 100644 index 0000000..4fd9955 --- /dev/null +++ b/man/CalculatePercentage.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/CalculatePercentage.R +\name{CalculatePercentage} +\alias{CalculatePercentage} +\title{Calculate the percentage of cells in activation status} +\usage{ +CalculatePercentage(to.plot, group_var) +} +\arguments{ +\item{to.plot}{A data frame containing at least a \code{scale} column and a grouping column.} + +\item{group_var}{A string specifying the grouping variable (e.g., "genotype", "treatment").} +} +\value{ +A data frame with the percentage of ON/OFF cells and Cohen's d (if applicable). +} +\description{ +Calculate the percentage of cells in activation status +} +\examples{ +data(fake_to_plot) +CalculatePercentage(fake_to_plot, "genotype") +} diff --git a/man/ComputeCellData.Rd b/man/ComputeCellData.Rd new file mode 100644 index 0000000..11bcb40 --- /dev/null +++ b/man/ComputeCellData.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ComputeCellData.R +\name{ComputeCellData} +\alias{ComputeCellData} +\title{A function for scRNA sequencing pathway analysis} +\usage{ +ComputeCellData(x, pathway, distance.method) +} +\arguments{ +\item{x}{A \code{Seurat} object containing single-cell RNA sequencing data.} + +\item{pathway}{A \code{character} string specifying the pathway name.} + +\item{distance.method}{A \code{character} string specifying the distance method. +Options include: "manhattan", "euclidean", "canberra", "binary", "minkowski".} +} +\value{ +A data frame representing the multidimensional scaling (MDS) results +for the cells based on the pathway expression. +} +\description{ +This function computes cell status for a given pathway in single-cell RNA-seq data, +based on the distance between genes in a specified pathway. The distance is computed +for each batch of cells, and classical multidimensional scaling (MDS) is used to +visualize the pathway expression across cells. +} +\examples{ +data(fake_test_object) # load the fake test data +ComputeCellData(fake_test_object, "Wnt", "manhattan") +} diff --git a/man/load_pathway_data.Rd b/man/LoadPathway.Rd similarity index 70% rename from man/load_pathway_data.Rd rename to man/LoadPathway.Rd index 8afce41..dcb4e8d 100644 --- a/man/load_pathway_data.Rd +++ b/man/LoadPathway.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/PathwayDataSet.R -\name{load_pathway_data} -\alias{load_pathway_data} +% Please edit documentation in R/LoadPathway.R +\name{LoadPathway} +\alias{LoadPathway} \title{This function reads pathway data from the package's built-in Excel file.} \usage{ -load_pathway_data(pathway) +LoadPathway(pathway) } \arguments{ \item{pathway}{The name of the pathway interested.} @@ -15,3 +15,6 @@ A data frame with pathway data. \description{ This function reads pathway data from the package's built-in Excel file. } +\examples{ +LoadPathway("Wnt") +} diff --git a/man/PathwayMaxMin.Rd b/man/PathwayMaxMin.Rd new file mode 100644 index 0000000..6e56736 --- /dev/null +++ b/man/PathwayMaxMin.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/PathwayMaxMin.R +\name{PathwayMaxMin} +\alias{PathwayMaxMin} +\title{A function for scRNA sequencing pathway analysis} +\usage{ +PathwayMaxMin(x, pathway) +} +\arguments{ +\item{x}{A Seurat Object.} + +\item{pathway}{The name of the pathway.} +} +\value{ +The value for Pathway on and off (max and min value for features) +} +\description{ +A function for scRNA sequencing pathway analysis +} +\examples{ +data(fake_test_object) # load the fake test data +PathwayMaxMin(fake_test_object, "Wnt") +} diff --git a/man/PlotPathway.Rd b/man/PlotPathway.Rd new file mode 100644 index 0000000..c616bdf --- /dev/null +++ b/man/PlotPathway.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/PlotPathway.R +\name{PlotPathway} +\alias{PlotPathway} +\title{A function to plot the Pathway activation status} +\usage{ +PlotPathway(to.plot, pathway, group, color) +} +\arguments{ +\item{to.plot}{A dataframe.} + +\item{pathway}{A name of the pathway.} + +\item{group}{Ident of the plot.} + +\item{color}{Colors for the group.} +} +\value{ +A plot. +} +\description{ +A function to plot the Pathway activation status +} +\examples{ +data(fake_to_plot) +PlotPathway(fake_to_plot, "Wnt", "genotype", c("#ae282c","#2066a8")) +} diff --git a/man/PreparePlotData.Rd b/man/PreparePlotData.Rd new file mode 100644 index 0000000..b480950 --- /dev/null +++ b/man/PreparePlotData.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/PreparePlotData.R +\name{PreparePlotData} +\alias{PreparePlotData} +\title{A function to prepare the signal transduction dataframe for plotting} +\usage{ +PreparePlotData(x, final_mds, group) +} +\arguments{ +\item{x}{A \code{Seurat} object containing single-cell RNA sequencing data.} + +\item{final_mds}{A 'dataframe' output from ComputeCellData.} + +\item{group}{group for the comparision} +} +\value{ +data for plotting +} +\description{ +A function to prepare the signal transduction dataframe for plotting +} +\examples{ +data(fake_test_object) +data(fake_final_mds) +PreparePlotData(fake_test_object, fake_final_mds, "genotype") +} diff --git a/man/fake_final_mds.Rd b/man/fake_final_mds.Rd new file mode 100644 index 0000000..4dff275 --- /dev/null +++ b/man/fake_final_mds.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_documentation.R +\docType{data} +\name{fake_final_mds} +\alias{fake_final_mds} +\title{Example Cell Status and Normalized Data} +\format{ +A data frame with the following columns: +\describe{ +\item{V1}{A numerical value presenting the status of the cell} +\item{normalized}{Numerical value representing normalized data} +} +} +\usage{ +data(fake_final_mds) +} +\description{ +A dataset generated by \code{ComputeCellData} applied to \code{fake_test_object}. +Contains cell status and normalized values. +} +\examples{ +data(fake_final_mds) +head(fake_final_mds) +} +\keyword{datasets} diff --git a/man/fake_test_object.Rd b/man/fake_test_object.Rd new file mode 100644 index 0000000..5879575 --- /dev/null +++ b/man/fake_test_object.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_documentation.R +\docType{data} +\name{fake_test_object} +\alias{fake_test_object} +\title{Example Seurat Object for Testing} +\format{ +A Seurat object. The object contains: +\describe{ +\item{assays}{List of assays used for data storage. Includes RNA expression data.} +\item{meta.data}{Metadata associated with the cells. Contains information about the groups (e.g., WT vs. Mutant).} +\item{features}{Gene features (including Wnt pathway genes) used in the analysis.} +\item{cells}{Cell names, labeled as Cell1, Cell2, ..., CellN.} +} +} +\source{ +Simulated for demonstration purposes. +} +\usage{ +data(fake_test_object) +} +\description{ +A simulated Seurat object with fake gene expression data for the Wnt signaling pathway. +This Seurat object contains gene expression data from simulated cells with Wnt positive +and negative gene expression values. +} +\keyword{datasets} diff --git a/man/fake_to_plot.Rd b/man/fake_to_plot.Rd new file mode 100644 index 0000000..59a4c55 --- /dev/null +++ b/man/fake_to_plot.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data_documentation.R +\docType{data} +\name{fake_to_plot} +\alias{fake_to_plot} +\title{Example Processed Data for Plotting} +\format{ +A data frame with the following columns: +\describe{ +\item{V1}{A numerical or categorical value depending on the specific analysis} +\item{normalized}{Normalized numerical value representing the cell's data} +\item{genotype}{Group classification of the cell (e.g., "WT", "Mutant")} +\item{scale}{Scaled data for visualization purposes} +} +} +\usage{ +data(fake_to_plot) +} +\description{ +A dataset generated by running \code{PreparePlotData} on \code{fake_test_object} and \code{fake_final_mds}. +Contains processed data ready for visualization, with the following features: +} +\examples{ +data(fake_to_plot) +head(fake_to_plot) +} +\keyword{datasets} diff --git a/man/pathwayembed.Rd b/man/pathwayembed.Rd deleted file mode 100644 index 9a87706..0000000 --- a/man/pathwayembed.Rd +++ /dev/null @@ -1,21 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/Pathwayembed.R -\name{pathwayembed} -\alias{pathwayembed} -\title{A function for scRNA sequencing pathway analysis} -\arguments{ -\item{x}{A Seurat Object.} - -\item{pathway}{A character.} - -\item{idents}{Idents of the X} -} -\value{ -The sum of x and y. -} -\description{ -A function for scRNA sequencing pathway analysis -} -\examples{ -pathwayembed(x, pathway, idents) -} From 46716f6cfd56a2ea725082beaa87e96c49b427f1 Mon Sep 17 00:00:00 2001 From: huangyaqing-123 Date: Wed, 28 May 2025 17:19:20 -0400 Subject: [PATCH 4/4] updates --- DESCRIPTION | 10 +++++----- inst/extdata/Pathway_Embedding.xlsx | Bin 30084 -> 30088 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c562f04..1886c0b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -3,9 +3,10 @@ Title: Tools for Pathway-Level Embedding and Visualization in Single-Cell Data Version: 0.0.0.9000 Authors@R: person("Yaqing", "Huang", email = "yaqing.huang@yale.edu", role = c("aut", "cre")) -Description: Provides utilities for analyzing and visualizing pathway-level embeddings - in single-cell RNA-seq data. Includes functions for calculating pathway activity - percentages, plotting pathway enrichment, and integrating with Seurat objects. +Description: Provides tools for analyzing and visualizing pathway-level activity + in single-cell RNA-seq data. Includes functions for computing cell-wise pathway scores, + visualizing transduction states, calculating activation percentages, + and integrating pathway data with Seurat objects. License: MIT + file LICENSE Encoding: UTF-8 Roxygen: list(markdown = TRUE) @@ -18,11 +19,10 @@ Imports: RColorBrewer, ggplot2, cowplot, - tidyverse, + dplyr, matrixStats, viridis, stats, - dplyr, effsize, rlang Suggests: diff --git a/inst/extdata/Pathway_Embedding.xlsx b/inst/extdata/Pathway_Embedding.xlsx index a8d7e484d368bb12c0a1eb732656d6d268c408db..b2c88521962823b88e81b4c12885b9586ab38337 100644 GIT binary patch delta 3027 zcmYM0c{J4T7st&E6-HsQkA2B944N|bEwYS#-)ZbijC~(bMvX`xTO<^+?^}fLgoH?C zOZN4P?0dvd&hMP>^T%^u?|bj_+;h*l&ppq>RZ!e2sFH<>qV&~^_sIYU6&!El{RVwK z!p`jsGMg2Bq;bVvhKCO$>(yk?Q`@YU0?}2P@rZXbG})Ot$l&XsEHSCCF`=%DK#zxg z*}64iS8pNQLTAaZrjYzKML?VH8d0#@O!X*iTBIIf0$rlhCBB3%1Q~YQ-H$w53pE

jsD zO5W!LC#j5CIci!_waFidTnDF#=>{?$FzFrvfD2$AZoVtUgt zDbE`odW@>8g=NPVkNEB-IBFa_-6kJ)e?P0VrO@qMSGBy|wPQM6ng`h6@!JwFbC%c>@e56|K3X)0jL_?To5 zm2!Hxm`+#miRI8Id!zy%T0XNs3xuktq0aZ*(#Q&~ zkXz-r*3d3R`>tZFVVQ+Nu^lYX3Td1$F@2y}&qX)&)&02{hTn?OA=ZTSPh+#yY0M+s zr`6Xg4uPbNQ$-~Gyi!(-j!V4O=Gnv{C@=JbHy3=AcWh%-wmcrcl|dL(uHbw{kkh`Y z(^)NQQx)#_8Y)*-!3;d`SdH~&D>#Nd&y~M{@adavxq;r(zfB^`$`_jCFnzW-sOb-# zQ~h}+coG>XUHWI9a%cVE9g7$Yw(zZ$=R+Y?>E3W^h@-5uh`wD-JDtt31bzmDpHLet{f}&h0JZiKiih;Da z4-?W!Z}3RNOrA#G0y|H=@Cd`Sgk+1&F6(*5h-jI6P2YdC#4*~OQ>@+Fn@)jeCcBM= zt&@Vq9Dy!z-)Z}KBRy`fA-v&wAQpw`Tl0VzeHDn!Pv2KE^ZY)* z@CCjKD^X<8Q)k>rIGq z5d~2}Ma+u`u)6lR4#u1+?9-Gaew^&sP9$ybre&YlRt_z?MO)Cg2q~&(R<&20M%HIp zuM6z2ZO)(gEn-_o_Vv!#HYuz1x*yq}9jW9TplJ%2?r{o`R*86_(X51z>kGj_3PEQK zR04Po+uT#Ea!~Y+2i9oM9>{D1)pT4SF51mbt+^R(u=*t|nqvWTgAnm_q z3LPsiV;`++(I@iID|H2kHtA?ao|+S2^yXbn8JZKyn!5Jg?I$~Le<){`d4a5>9`>i^ z1(YKN>)umz{?a%Yz|W+qvvtCC`(no?$w~-Z{BHDW(k2-Hd5qv^dFTWxx?O80E4n|6 z`x2jDdYhM;HxkvkK@xJVZ&sMM+>0xGczqqEq?r@ERl8j4kkZkVi2E4qgF56pEMV%Z zjKms7vv~!~scRH0z4Y$Q{wCyfqSaJ(CWd)w012D9wn>wM4@cw&hdc3mSMJ7Co>1-l zbb69isJ-n{t@W+Tss2jME{?u@#DY~95WH5i%)_?S>nV9Ed8)lwV>wNETnvWjXfooe zv|uVrHMtLL$>G16ant5|Q2ItlatGgGSzYMj=WHAJ-1vb<{@(Cqg&8EB@GshFhIrX3 z0>8$xPI@{1&)!rW;r-(Q=ID{yWG0kZbq9qJma1a zHj`OYs3%ehZ)OHqj(Sc(WMpS&WPi8h^ojdF#i8nU{F{Fk^?ld!d?1KkBDqDBO@J!< z?$Vm}k2-!JyLhueFg|g)r~@v!OlTWfUGs0nXI=Z#+t$$6Yos>he29WwQ>CZy`6$yAuofq1$+>FobiHD z+=Yz#$1Ub}ra65tqC|83BbG)M-U@wCOgn3d_-A^OjHB9P)71A1T}N3j!@+gUcg^yP zi};^y%`la~zKKo`c;*87F0GVc;!?{>^ksV93})k$ z#nRv+|A@5Q6{s<{$dm-VM}H36ojuucGg*k~C#}-aawBXX%fm-2H_gM&4O9r^aYR2C zLVrWjy!MvQQwK_c&jHpdanKeO#y*q?zV=_)TcWOT9``#@LbF)ch0E3Pk0lV3#4Xl> z^;xLg4e@)`m{dxov6=ZHI7-2dDw!-b)gB@43GdQP| zfw6ZQkb0lG4y04y|dWM;p3lj`?(u839}0k zuM|0mN$jIUwyHpOY4SQiSUM4lt5(%DoruYTyU#7p-=_9X+Gb`nG=&gVH(|lTPCc{c zrN17e46S_Tjsq;u!@pK%*IDl{$`aIrxzoB zy>m+E2D!)&6lt=jF6?^jvmBK@0YdW#yXV@jl}yZPw$&HR*#9zxx^eLDky| z%9+)sEL4zaIsNyH`NERBwU&owpKhiKk%}#qWB2U`Hw znNY7%FTszo-b#`%G{JYaY52K}MbIF{eP+B1#dO>=Z3Ib@glK0U@K)!M;iBM7>N7Qy zSMq@}Xy^}5i(lDl7>Q0@{PMu|1=`8&;3)ug;h-zNZwA+YMWy@hlCwwFl-CPkK-L8* zsufQE+o6$%GOJJU@l?|R{&SE4fjUHE3n{Vn=7%s3>RldAlA8k*@vbchR7L{I?c-ojuPsDn3eT^PK5kYG6a0_)EaBXfa&&M`#p9N7R(oG`dh;Ue!7oH%G0XvQgl z+JFK>87(Dl415$iZ-~+?IBy2M( delta 3074 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