From 53863369d2a86ad68b3d43fe24bd300d120d6847 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Mon, 11 May 2020 20:22:34 -0700 Subject: [PATCH 01/41] change to paste in peakAnnoEnrichment --- R/AnnotationPeaks.R | 6 +++--- R/CreateArrow.R | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/R/AnnotationPeaks.R b/R/AnnotationPeaks.R index 90807cc1..5413120a 100644 --- a/R/AnnotationPeaks.R +++ b/R/AnnotationPeaks.R @@ -840,15 +840,15 @@ peakAnnoEnrichment <- function( } r1 <- SummarizedExperiment::rowRanges(matches) - pr1 <- paste0(seqnames(r1),start(r1),end(r1),sep="_") + pr1 <- paste(seqnames(r1),start(r1),end(r1),sep="_") mcols(r1) <- NULL r2 <- getPeakSet(ArchRProj) - pr2 <- paste0(seqnames(r2),start(r2),end(r2),sep="_") + pr2 <- paste(seqnames(r2),start(r2),end(r2),sep="_") mcols(r2) <- NULL r3 <- GRanges(rowData(seMarker)$seqnames, IRanges(rowData(seMarker)$start, rowData(seMarker)$end)) - pr3 <- paste0(seqnames(r3),start(r3),end(r3),sep="_") + pr3 <- paste(seqnames(r3),start(r3),end(r3),sep="_") mcols(r3) <- NULL .logThis(r1, "Peaks-Matches", logFile = logFile) diff --git a/R/CreateArrow.R b/R/CreateArrow.R index 99bbd317..3d1bfeb9 100644 --- a/R/CreateArrow.R +++ b/R/CreateArrow.R @@ -1749,7 +1749,6 @@ createArrowFiles <- function( } - ######################################################################################################### # Methods to temp file to arrow! ######################################################################################################### From 8c9e0bc1881845ca14d22ff4e8d9566db8d6ddbb Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Tue, 12 May 2020 13:16:57 -0700 Subject: [PATCH 02/41] bugfix --- R/RNAIntegration.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/RNAIntegration.R b/R/RNAIntegration.R index 22a4144f..7c4b1be4 100644 --- a/R/RNAIntegration.R +++ b/R/RNAIntegration.R @@ -328,7 +328,7 @@ addGeneIntegrationMatrix <- function( #Create Output Directory outDir1 <- getOutputDirectory(ArchRProj) - outDir2 <- file.path(outDir, "RNAIntegration") + outDir2 <- file.path(outDir1, "RNAIntegration") outDir3 <- file.path(outDir2, matrixName) dir.create(outDir1, showWarnings = FALSE) dir.create(outDir2, showWarnings = FALSE) From dfbd590f0498ec3cebc833dc8c2f4b7008f6f68d Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Tue, 12 May 2020 13:30:16 -0700 Subject: [PATCH 03/41] include dot removal in correlate matrices --- R/IntegrativeAnalysis.R | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/R/IntegrativeAnalysis.R b/R/IntegrativeAnalysis.R index dffedc4f..2c13b57d 100644 --- a/R/IntegrativeAnalysis.R +++ b/R/IntegrativeAnalysis.R @@ -12,9 +12,9 @@ #' @param useSeqnames1 A character vector describing which seqnames to use in matrix 1. #' @param useSeqnames2 A character vector describing which seqnames to use in matrix 2. #' @param removeFromName1 A character vector describing how to filter names in matrix 1. -#' Options include "underscore", "dash", "numeric". The string portion prior to these will be kept. +#' Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept. #' @param removeFromName2 A character vector describing how to filter names in matrix 2. -#' Options include "underscore", "dash", "numeric". The string portion prior to these will be kept. +#' Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept. #' @param log2Norm1 A boolean describing whether to log2 normalize matrix 1. #' @param log2Norm2 A boolean describing whether to log2 normalize matrix 2. #' @param reducedDims The name of the `reducedDims` object (i.e. "IterativeLSI") to use from the designated `ArchRProject`. @@ -123,6 +123,9 @@ correlateMatrices <- function( if("numeric" %in% tolower(removeFromName1)){ featureDF1$matchName <- gsub("[0-9]+","",featureDF1$matchName) } + if("dot" %in% tolower(removeFromName1)){ + featureDF1$matchName <- gsub("\\..*","",featureDF1$matchName) + } featureDF2$matchName <- featureDF2$name if("underscore" %in% tolower(removeFromName2)){ @@ -134,6 +137,10 @@ correlateMatrices <- function( if("numeric" %in% tolower(removeFromName2)){ featureDF2$matchName <- gsub("[0-9]+","",featureDF2$matchName) } + if("dot" %in% tolower(removeFromName2)){ + featureDF2$matchName <- gsub("\\..*","",featureDF2$matchName) + } + .logThis(featureDF1, name = "featureDF1", logFile = logFile) .logThis(featureDF2, name = "featureDF2", logFile = logFile) @@ -361,9 +368,9 @@ correlateMatrices <- function( #' @param varCutOff2 The "Variance Quantile Cutoff" to be used for identifying the top variable features across `seTrajectory2`. #' Only features with a variance above the provided quantile will be retained. #' @param removeFromName1 A character vector describing how to filter names in matrix 1. -#' Options include "underscore", "dash", "numeric". The string portion prior to these will be kept. +#' Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept. #' @param removeFromName2 A character vector describing how to filter names in matrix 2. -#' Options include "underscore", "dash", "numeric". The string portion prior to these will be kept. +#' Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept. #' @param useRanges A boolean describing whether to use range overlap matching for correlation analysis. #' @param fix1 A character describing where to resize the coordinates of `seTrajectory1`. Options include "start", "center", "end". #' @param fix2 A character describing where to resize the coordinates of `seTrajectory2`. Options include "start", "center", "end". @@ -554,6 +561,9 @@ correlateTrajectories <- function( if("numeric" %in% tolower(removeFromName1)){ featureDF1$matchName <- gsub("[0-9]+","",featureDF1$matchName) } + if("dot" %in% tolower(removeFromName1)){ + featureDF1$matchName <- gsub("\\..*","",featureDF1$matchName) + } featureDF2$matchName <- featureDF2$name if("underscore" %in% tolower(removeFromName2)){ @@ -565,7 +575,10 @@ correlateTrajectories <- function( if("numeric" %in% tolower(removeFromName2)){ featureDF2$matchName <- gsub("[0-9]+","",featureDF2$matchName) } - + if("dot" %in% tolower(removeFromName2)){ + featureDF2$matchName <- gsub("\\..*","",featureDF2$matchName) + } + #Now Lets see how many matched pairings matchP1 <- sum(featureDF1$matchName %in% featureDF2$matchName) / nrow(featureDF1) matchP2 <- sum(featureDF2$matchName %in% featureDF1$matchName) / nrow(featureDF2) From a0a2d103525d5bdbc07b130971eecfb3bbb1eb20 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Tue, 12 May 2020 13:40:03 -0700 Subject: [PATCH 04/41] update documentation --- man/correlateMatrices.Rd | 4 ++-- man/correlateTrajectories.Rd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/man/correlateMatrices.Rd b/man/correlateMatrices.Rd index acdd2aad..6adb8515 100644 --- a/man/correlateMatrices.Rd +++ b/man/correlateMatrices.Rd @@ -39,10 +39,10 @@ correlateMatrices( \item{useSeqnames2}{A character vector describing which seqnames to use in matrix 2.} \item{removeFromName1}{A character vector describing how to filter names in matrix 1. -Options include "underscore", "dash", "numeric". The string portion prior to these will be kept.} +Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept.} \item{removeFromName2}{A character vector describing how to filter names in matrix 2. -Options include "underscore", "dash", "numeric". The string portion prior to these will be kept.} +Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept.} \item{log2Norm1}{A boolean describing whether to log2 normalize matrix 1.} diff --git a/man/correlateTrajectories.Rd b/man/correlateTrajectories.Rd index a526a825..f824e7d3 100644 --- a/man/correlateTrajectories.Rd +++ b/man/correlateTrajectories.Rd @@ -36,10 +36,10 @@ Only features with a variance above the provided quantile will be retained.} Only features with a variance above the provided quantile will be retained.} \item{removeFromName1}{A character vector describing how to filter names in matrix 1. -Options include "underscore", "dash", "numeric". The string portion prior to these will be kept.} +Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept.} \item{removeFromName2}{A character vector describing how to filter names in matrix 2. -Options include "underscore", "dash", "numeric". The string portion prior to these will be kept.} +Options include "underscore", "dash", "numeric" and "dot". The string portion prior to these will be kept.} \item{useRanges}{A boolean describing whether to use range overlap matching for correlation analysis.} From 2a1618624f5fce14197b1600bf2eb021d0e15ed7 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Tue, 12 May 2020 13:48:22 -0700 Subject: [PATCH 05/41] Update DESCRIPTION --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 45f028ee..6ea9329b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: ArchR Type: Package -Date: 2019-03-10 +Date: 2019-05-11 Title: Analyzing single-cell regulatory chromatin in R. -Version: 0.9.4 +Version: 0.9.5 Authors@R: c( person("Jeffrey", "Granja", email = "jgranja.stanford@gmail.com", role = c("aut","cre")), person("Ryan", "Corces", role = "aut")) From 9ad0c51c5984e45a6fa0232407104a890dc71ae0 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Wed, 13 May 2020 10:20:08 -0700 Subject: [PATCH 06/41] bugfix returning 1 peak from peakset --- .DS_Store | Bin 12292 -> 12292 bytes R/AllClasses.R | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.DS_Store b/.DS_Store index 2e9c7d55b17f82e0a8f9087568172fc8447d3472..f8079d9746cdc3c5c304968d8d6be171140baca8 100644 GIT binary patch delta 1228 zcmd6lTSyd99LCRQUS`;nj+fST+-%p?_0op7RWrj@SG?qwl`C3??CMM~sJrE=X;$_i z-GyN2N(B`~VUeI2mDEE7Cee%ALqR=A&`VKJFVRb9c8z?jr<#WY|L>b~&j0+r|EOow zGclf^T1U~W}9 z{k|q;pDchMk4-k3GjsFoWfjg~oDiQtlc-)jm0=j!p-8f?PuZo&y?lJcG2ZR-_Q=5m zAwJHKB8sj39m<}5rEf^Ea9ns}nrPyMd)!XR+b3`GOWIB;r@yC%^&E(Yjmg?;M2A?#3A0?gcDc(N=xf|9`+m1o!*Sa+r&5w+iL;Q!&*I1? zYN|muVsYdzN*q~93Q09_5fAAl!(@z{BjaR>Oq2WMDS1JHM)MR~KjIp+^ww^Zpig?x1h+oHQBodQW=#x#EIco|_ z*H@}yatjODI+B_q8qDcNqo6_Jf?BDw8YzpB4;8sq=0z}vWu8j&j0HRkOIQ{vjdohX zu~dYpuvH?oRkVgnm9K?}Dz+*UrvpAoQ3%H2u zxPhCvg>g(_8V~Rgk1&I0c!_xgCm$PJF_SveLUfigAXl@23H--^*~CVLr#4$RDP+I> L>!t($U@CqB4zv-V delta 1328 zcmds#O-NKx6vyx1Oz)FhUdPlo>hvbf{9sZCt(?NIG_y1;($tc2^gZ*D&QvpMeizvX z)gpQo6h%d~sffs0W)u|_QA9%YL7Qsf#!cZSsP4Qcvm5oR97+dT- z#*7!?S;It<#%(+%TDHqcl&8{$t`>b)mmcgje{;;2S(EAwYU})}-ll6Rze^>vk}_YG zw}dKXyESpDl$vc=x|}I-FRcxTMXZdAWlKCD)$Y)Jsx`{Z@+eoOx(;v4Hm$?TEoB9i zS4s8V+U|hv_gTpmtdPdQB{j7AJ3BRBFkp@@E|KM}q0!aeK(J<~<`Zi@74t*)Di>=t zhH9m%8d}O|in9-M5K0_m5h)-gq?WW1KiNl)kqhJwxktvxbMl6KB45ZPnIb>PPx1={ z5~9E`2k}tgLN;=c3lCPI0;{ne8?X_zXhaKIp`i^s5JVSxum?jpgu^(3qcCs|=W!92 z;JAiSJj5eB#uL24JG{pSe8g8w;v2pja(pFMOof?$DRlf%_-?M{EiOL6nU?KlPn4AuWg!*B zxD~Q=MJT&VIjm~BvY1jHHXdr6ldCX3OZb$`FnE{WySwLcnpHz)76KX%M{sNn Date: Wed, 13 May 2020 13:15:27 -0700 Subject: [PATCH 07/41] add log messages to peak coaccessibility --- .DS_Store | Bin 12292 -> 12292 bytes R/IntegrativeAnalysis.R | 3 +++ 2 files changed, 3 insertions(+) diff --git a/.DS_Store b/.DS_Store index f8079d9746cdc3c5c304968d8d6be171140baca8..062466c3150c438d33acf745a52b06a79a97b07e 100644 GIT binary patch delta 1242 zcmd6mTSyd97{|Z=y6TK4?WnE0j++{5YIfT)yV%W3iCxq(E4#bvOfaWn!H$_GaCr7PjwT%Gic;U|)wj3mp?2<)q=6Kk zJep-H*)s2!HmaVGRuxe7t-7X0D@vx4BS{+~`SKP`Jk@BM+&qQV1;xhPBbkjSPGYQX zo9-j{WdQCw~P1}2fpUt N9C)8K|J{Ek=_kwP2)zIR delta 1252 zcmd6lSx8h-9LCQ#j(Tr%)T`q%UMCmEJ;Tw=GRw3vm$b!=EF)&ddxML!m{%<`(g(pd zp%`o@uqXOrCiih>r1UOKZp_z*%5LFeI|bHD#RhwuD<-;j04 zIx(zIp0Ia16t&xIo`)tx8yXhQ@ym2HLaeE+*+T0*65|zj`LD^$5^1yQ zvti?Szp^5a(&i4uB?&6OIUtz}sMzAL*=2_y@tps!)x}iY*(-OcirXdB1;urxRBUZ` zJDtq48jU87EU@n%pB#$P3~n^W-i0Oumq>2fa9eK^(<#oWMzp;xfi?1y^wkw{Zs(c#LOwjv06{hc|eS zkND)7Go+Y*FqRMX2I07k)Bk(HH*C2gtTzo=mM$XE@ zHR~%p$q6kQn!<9B>A9GoAJAnQDMQP9lM+QkZl=*FXc%>tgCv@7EZ`YHA;kY_ETY96 zBPE0eswK3PXD|hApjt-DIfhIK^Ix>dLa9J}+2WVRG2kb%6ptA)OBNW5Umyr$9Q2Gq z8tZ>PO0bc&--1e1VLJoRgl4p0FN0uX7&;gP7u-0AKJ?=-j$k;5VgzS!7UyvRm$2a) zuHy!7VjNSL#(g}%Lp;J$yu>WLfw*W8j7@!T4K8>+`P~p7etIx|QkS|AmZkK{l`Mqn R-x09>YXXzn><|B~x!)6b6S4pR diff --git a/R/IntegrativeAnalysis.R b/R/IntegrativeAnalysis.R index 2c13b57d..38f24b32 100644 --- a/R/IntegrativeAnalysis.R +++ b/R/IntegrativeAnalysis.R @@ -797,6 +797,9 @@ addCoAccessibility <- function( idx <- BiocGenerics::which(o$seqnames==chri[x]) o[idx,]$correlation <- rowCorCpp(idxX = o[idx,]$idx1, idxY = o[idx,]$idx2, X = groupMat, Y = groupMat) + .logThis(groupMat, paste0("SubsetGroupMat-", x), logFile = logFile) + .logThis(o[idx,], paste0("SubsetCoA-", x), logFile = logFile) + } o$idx1 <- NULL From ee7f52100624cd36618f1c9ac812d620e2facea5 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Wed, 13 May 2020 13:27:47 -0700 Subject: [PATCH 08/41] check for space in output directory --- R/AllClasses.R | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/R/AllClasses.R b/R/AllClasses.R index 9aafdcde..466aadaa 100644 --- a/R/AllClasses.R +++ b/R/AllClasses.R @@ -105,6 +105,15 @@ ArchRProject <- function( .validInput(input = showLogo, name = "showLogo", valid = "boolean") .validInput(input = threads, name = "threads", valid = c("integer")) + if(grepl(" ", outputDirectory)){ + stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) + } + dir.create(outputDirectory,showWarnings=FALSE) + if(grepl(" ", normalizePath(outputDirectory))){ + stop("outputDirectory cannot have a space in the full path! Full path : ", normalizePath(outputDirectory)) + } + sampleDirectory <- file.path(normalizePath(outputDirectory), "ArrowFiles") + dir.create(sampleDirectory,showWarnings=FALSE) if(is.null(ArrowFiles)){ stop("Need to Provide Arrow Files!") @@ -132,10 +141,6 @@ ArchRProject <- function( if(length(sampleNames) != length(ArrowFiles)) stop("Samples is not equal to input ArrowFiles!") - dir.create(outputDirectory,showWarnings=FALSE) - sampleDirectory <- file.path(normalizePath(outputDirectory), "ArrowFiles") - dir.create(sampleDirectory,showWarnings=FALSE) - if(copyArrows){ message("Copying ArrowFiles to Ouptut Directory! If you want to save disk space set copyArrows = FALSE") for(i in seq_along(ArrowFiles)){ @@ -486,7 +491,12 @@ saveArchRProject <- function( .validInput(input = outputDirectory, name = "outputDirectory", valid = "character") .validInput(input = overwrite, name = "overwrite", valid = "boolean") .validInput(input = load, name = "load", valid = "boolean") - + + if(grepl(" ", outputDirectory)){ + stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) + } + + dir.create(outputDirectory, showWarnings=FALSE) outputDirectory <- normalizePath(outputDirectory) outDirOld <- normalizePath(getOutputDirectory(ArchRProj)) @@ -494,7 +504,6 @@ saveArchRProject <- function( ArrowFiles <- getArrowFiles(ArchRProj) ArrowFiles <- ArrowFiles[names(ArrowFiles) %in% unique(newProj$Sample)] - dir.create(outputDirectory, showWarnings=FALSE) oldFiles <- list.files(outDirOld) oldFiles <- oldFiles[oldFiles %ni% c("ArrowFiles", "ImputeWeights", "Save-ArchR-Project.rds")] From f0b1c8df0faf2d0567af968bfc5c40c4c3b9e511 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Wed, 13 May 2020 13:49:10 -0700 Subject: [PATCH 09/41] getTrajectory force class structure --- R/Trajectory.R | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/R/Trajectory.R b/R/Trajectory.R index 2ac53c98..e720a24b 100644 --- a/R/Trajectory.R +++ b/R/Trajectory.R @@ -328,12 +328,14 @@ getTrajectory <- function( message("Smoothing...") smoothGroupMat <- as.matrix(t(apply(groupMat, 1, function(x) .centerRollMean(x, k = smoothWindow)))) - + colnames(smoothGroupMat) <- paste0(colnames(groupMat)) + colnames(groupMat) <- paste0(colnames(groupMat)) + #Create SE seTrajectory <- SummarizedExperiment( assays = SimpleList( - smoothMat = smoothGroupMat, - mat = groupMat + smoothMat = as.matrix(smoothGroupMat), + mat = as.matrix(groupMat) ), rowData = featureDF ) @@ -345,10 +347,12 @@ getTrajectory <- function( }else{ + colnames(groupMat) <- paste0(colnames(groupMat)) + #Create SE seTrajectory <- SummarizedExperiment( assays = SimpleList( - mat = groupMat + mat = as.matrix(groupMat) ), rowData = featureDF ) From 7011965c09dadea685d1721969780ab3dfd2ea4f Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Wed, 13 May 2020 13:51:34 -0700 Subject: [PATCH 10/41] force trajectory between 0 and 100 and numeric --- R/Trajectory.R | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/R/Trajectory.R b/R/Trajectory.R index e720a24b..57e85454 100644 --- a/R/Trajectory.R +++ b/R/Trajectory.R @@ -284,6 +284,12 @@ getTrajectory <- function( trajectory <- getCellColData(ArchRProj, name) trajectory <- trajectory[!is.na(trajectory[,1]),,drop=FALSE] breaks <- seq(0, 100, groupEvery) + if(!all(is.numeric(trajectory[,1]))){ + stop("Trajectory must be a numeric. Did you add the trajectory with addTrajectory?") + } + if(!all(trajectory[,1] >= 0 & trajectory[,1] <= 100)){ + stop("Trajectory values must be between 0 and 100. Did you add the trajectory with addTrajectory?") + } groupList <- lapply(seq_along(breaks), function(x){ if(x == 1){ From 988ab932f6a16a0b66c96a1fdd8805e67735fb46 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Thu, 14 May 2020 00:52:30 -0700 Subject: [PATCH 11/41] update incase normQ is length 1 --- .DS_Store | Bin 12292 -> 12292 bytes R/IntegrativeAnalysis.R | 2 +- R/MarkerFeatures.R | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.DS_Store b/.DS_Store index 062466c3150c438d33acf745a52b06a79a97b07e..17c587d502a83b1c1b193288cbce5352afd38a71 100644 GIT binary patch delta 1953 zcmc(fX>1gA7{=dcTguFIN~hg!yE81iEz6byg&wperC3_Fv>Zh$wBZc)*u^YtccEK~ zfVwCofI!4dI8;0ekw~ghxjZ02Vl;@z2VLY66NzZ>izI3cUh$pTt+XU0elhNc&CL7G z{OA9Fp6B;&Zr$9vYc4Y0ZaSHc)T6SpD@l~ov>7vJ&2E(S+GMZ(oz<(qtYq2xhUGZ& zJY$Q>DyzM*bR{EG&XTkBU8C&L#Q~o`)E!tJ@OOzBmTh8lsIAi<%TzMb?W(3NT+<#{ zy(ZATPH_uD{6(jhD=No@rM|Xq|D3STc++QgG^aL75SAEqZ*BzNH`OHvL3D(;ZlliZl#EI_yv}91e^@DJG%}HJFJ9(S(OE z4@=OBc67jpPDHQgDl1>Il;e+MCj)w8m4d8}FyDlwH+^P&#*n9I7&M>ATmjJ0cH^;WWW zA%yWL)?ou4!xPw&P;e*qU@xA-^VpA9amaz!a2S0!h7))X@8cv+;UiqYC47aO`bB%g z&?JhmxgGi|nODja*TG1Sw>=ncC$j8qUlj~Qx{Hf1!;+LdBxR@|N~!A1SyJP|Ku0(< zpHr&8Yn`BPRI>EmWGf?N%XZfkllc?-WZQ_5`QwVqCr_=@d-EpBEKMvs$DXEYs>6gy zU`+l&CYHw5IbEtW2o=*PqvLj|>Off7GNU}YK$Y&|VpIypOHw~BqWMfosiY2|#dxS< zlB6z(4#dT%R!x!AdvGzzHMOd`%wVLkEz&)Al|SV7DQEfn=2={7!#xBQ#LsU|22lZn zq|!(#qbbxxi^xZ7X$S45J#-*SeN59S`j{?o627EMbeX=PTbzhH^c(#_e{w3)nIk7$ z$mLv=qXLsS7t_&z8O+o?EWjcxW~O{tfuNa+wTR+LJcUgrP5aC&9K;chz;O=2X?%b) z_!Q?ErmMg;&VVcRI`6kX2iu3{rPVh`b@%mm#9e={$c8v3Y)*GUKWcW}n=>YDkcaw~ zQPZNDM;k4$n~KHIO_j!Kg$dM*TdhbcNuXwS%cP0~YG$`ms!E_{cB`ctbNDJ0U(2J_ ziGl*=Zjkl^m5&aR{xBV(GxQmK&Wc~BoAd+y$_xrTz3isiBjJVz6PUyjo?&Hp0M)E} zEfd*@IZR}eImwnXkq2Qq)Ut1<@1mh@=BA(&b|IA+ zA-qx12W1yU8HFr`J}8(XP|kY zdAJraV|BOV5ao|%!x18lkt)|zRj;j4M$}p*SISY|YVC?$t<{U-Xsq6}FfDV@;$_A5 zKpfM=YZE9{o~SeX2SqVdFeFJ*Q+JDNPq)k0%Tfd(5YIGmG+DBUY+TqTJABR>kL=pz za>}8Olq{tR!q#Bj-sR-092#RymuQ36)#qdmAv`!Mo6?3hms@7uxuAW~IhdhL zmYuSYQrcFkICN?K3`8Ich>et!Dzbxgl3p@Ij+1lb1{o(49NyWjNKUoY8A{ThmRHfx8g{#w5v*m2NUI71zc^8mY~cCvpQUB6Ktr(4_*C zMHU(E7SR|@+ Date: Thu, 14 May 2020 00:57:11 -0700 Subject: [PATCH 12/41] Update LoggerUtils.R --- R/LoggerUtils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/LoggerUtils.R b/R/LoggerUtils.R index 69649bd1..d593ddc9 100644 --- a/R/LoggerUtils.R +++ b/R/LoggerUtils.R @@ -319,7 +319,7 @@ createLogFile <- function( if(!is.null(errorList)){ tryCatch({ - saveRDS(errorList, "Save-Error.rds") + #saveRDS(errorList, "Save-Error.rds") .logThis(errorList, name = "errorList", logFile) }, error = function(e){ cat("Error recording errorList", file = logFile, append = TRUE) From 0660b4e730a8edc7b1bce19aeee561950bc925dc Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Thu, 14 May 2020 11:16:49 -0700 Subject: [PATCH 13/41] disable chrPrefix --- .DS_Store | Bin 12292 -> 12292 bytes R/ArrowUtils.R | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.DS_Store b/.DS_Store index 17c587d502a83b1c1b193288cbce5352afd38a71..17d65fe982a039997bba18ca0a6dbdcd3e7969c8 100644 GIT binary patch delta 973 zcmd6jO-~b16o!5Iyn~bU76fi-WGYBXlM0p+i!neEGy%aHr4~|xoid}2v{PWpXDMJL zF+^QWG=e5Bj4^&JOd3}Pb%`4n+JC^xf8m{J-1rA{b92vmZti){vz^#Ze0W!jZ)T@! z%g1uLu0Xfn6FQyudvbw5D8TQ*o_t;)jctM6;Y50MEw`TE*fqab?sp0i@L*2 z2X)pm7jqNZN+uSQ+WexHT`ks9r{j1t6Q>k8tBz$9?WU$G^dk{$($dUW+#-VuDnAuM ziqD z6YOFSFYz9qu#eC9f&=`(PqV(^I;29Xp$3~#zNNYnUDlNB?Mc~~QFTSrZ^f20LrbPq zT5YXEif&gElUk&cga@akQuInk1+KTmypo>~T2^GPCU-}tB+_y&Rj|uowkj5C7jgdM$eiv%uq?ypON?W z^;14JXU^JIvA|9^sucGRQa(Oa%;(KQ$@Za3%1$UA=R<_8kxA$Cle%3>UN#H=Vhs~A z;W&p4!!$@V-m8dA%S76P&Da7jf(RiD4V~DFUi2Z3;~2qdoWWV7kwF$yFp!6hGUjj< zw{REt@c<98j1|1ZE4;=>e8Oj};v3fR9X~{K;5@WSF0cvWaeHhr9OA)k+ck|jDM{5C zJu!{S9#wbP6_Z|_bY$sa+O74dvMsj39ko8%Ph>Bwq2>TB*n8Yi+J*62Po zl%SL;zPfv=>VhiHii+u$17a)~NOqzd12`lR6F7olBqiiIq%ev}393ufoCGbPhPvlplXlrg0o~@VGl~$rPxPVHBN1jI& Tg;7PRuY@~({uk)tde#32f{L@O diff --git a/R/ArrowUtils.R b/R/ArrowUtils.R index 865213ab..33eaafe7 100644 --- a/R/ArrowUtils.R +++ b/R/ArrowUtils.R @@ -56,9 +56,9 @@ .availableChr <- function(ArrowFiles = NULL, subGroup = "Fragments"){ seqnames <- .availableSeqnames(ArrowFiles, subGroup) - if(getArchRChrPrefix()){ - seqnames <- seqnames[grep("chr", seqnames, ignore.case = TRUE)] - } + # if(getArchRChrPrefix()){ + # seqnames <- seqnames[grep("chr", seqnames, ignore.case = TRUE)] + # } if(length(seqnames) == 0){ stop("No Chr Found in ArrowFiles!") } From 6335e2839af0758ae36588e502e993c05e448bf8 Mon Sep 17 00:00:00 2001 From: scfurl Date: Sat, 16 May 2020 22:43:55 -0700 Subject: [PATCH 14/41] fix to declare assay as an array --- .Rbuildignore | 2 ++ .gitignore | 1 + R/BulkProjection.R | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 .Rbuildignore diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 00000000..91114bf2 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,2 @@ +^.*\.Rproj$ +^\.Rproj\.user$ diff --git a/.gitignore b/.gitignore index 65d29924..0420c714 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store .DS_Store +.Rproj.user diff --git a/R/BulkProjection.R b/R/BulkProjection.R index d0d99f5a..c2353c26 100644 --- a/R/BulkProjection.R +++ b/R/BulkProjection.R @@ -51,7 +51,7 @@ projectBulkATAC <- function( } .logThis(rDGR, "reducedDimsGRanges", logFile = logFile) subATAC <- subsetByOverlaps(seATAC, rDGR, ignore.strand = TRUE) - subATAC <- subATAC[order(rowSums(.getAssay(subATAC, "counts")), decreasing = TRUE), ] + subATAC <- subATAC[order(rowSums(as.array(.getAssay(subATAC, "counts"))), decreasing = TRUE), ] o <- DataFrame(findOverlaps(subATAC, rDGR, ignore.strand = TRUE)) sumOverlap <- length(unique(o[,2])) .logThis(o, "overlapATAC", logFile = logFile) From bcbf41fb5d12d4b86451bb71c7be86b9c5d6f9b6 Mon Sep 17 00:00:00 2001 From: scfurl Date: Sat, 16 May 2020 23:43:44 -0700 Subject: [PATCH 15/41] add single quotes to allow unix mv to copy filenames with spaces --- R/CreateArrow.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/CreateArrow.R b/R/CreateArrow.R index 99bbd317..7a7d8edd 100644 --- a/R/CreateArrow.R +++ b/R/CreateArrow.R @@ -2185,7 +2185,7 @@ createArrowFiles <- function( tryCatch({ - system(paste0("mv ", from, " ", to)) + system(paste0("mv '", from, "' '", to, "'")) return(to) From 5f453175be32e67a89bb4a75a2375d60c0ba13ee Mon Sep 17 00:00:00 2001 From: scfurl Date: Mon, 18 May 2020 10:59:45 -0700 Subject: [PATCH 16/41] fix for file paths containing spaces when calling macs2 --- .Rhistory | 2 ++ R/ReproduciblePeakSet.R | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.Rhistory b/.Rhistory index 8bd69bd8..c8c45564 100644 --- a/.Rhistory +++ b/.Rhistory @@ -333,3 +333,5 @@ setwd("~/Documents/GitHub/ArchR") pkgdown::build_site() warnings() pkgdown::build_site() +library(ArchR) +library(ArchR) diff --git a/R/ReproduciblePeakSet.R b/R/ReproduciblePeakSet.R index fd6393df..1a17370d 100644 --- a/R/ReproduciblePeakSet.R +++ b/R/ReproduciblePeakSet.R @@ -178,7 +178,7 @@ addReproduciblePeakSet <- function( args$X <- seq_len(nrow(coverageMetadata)) args$FUN <- .callSummitsOnCoverages args$coverageFiles <- coverageFiles - args$outFiles <- file.path(outSubDir, paste0(make.names(coverageMetadata$Name),"-summits.rds")) + args$outFiles <- sQuote(file.path(outSubDir, paste0(make.names(coverageMetadata$Name),"-summits.rds")), q="'") args$bedDir <- outBedDir args$excludeChr <- excludeChr args$peakParams <- list( From 2be85a2bdd984b85e74ab075ccc7efbd9ed2180d Mon Sep 17 00:00:00 2001 From: scfurl Date: Mon, 18 May 2020 14:44:50 -0700 Subject: [PATCH 17/41] fixed system calls to macs2 where filenames have spaces --- .Rhistory | 2 -- R/ReproduciblePeakSet.R | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.Rhistory b/.Rhistory index c8c45564..8bd69bd8 100644 --- a/.Rhistory +++ b/.Rhistory @@ -333,5 +333,3 @@ setwd("~/Documents/GitHub/ArchR") pkgdown::build_site() warnings() pkgdown::build_site() -library(ArchR) -library(ArchR) diff --git a/R/ReproduciblePeakSet.R b/R/ReproduciblePeakSet.R index 1a17370d..8a48530e 100644 --- a/R/ReproduciblePeakSet.R +++ b/R/ReproduciblePeakSet.R @@ -178,7 +178,7 @@ addReproduciblePeakSet <- function( args$X <- seq_len(nrow(coverageMetadata)) args$FUN <- .callSummitsOnCoverages args$coverageFiles <- coverageFiles - args$outFiles <- sQuote(file.path(outSubDir, paste0(make.names(coverageMetadata$Name),"-summits.rds")), q="'") + args$outFiles <- file.path(outSubDir, paste0(make.names(coverageMetadata$Name),"-summits.rds")) args$bedDir <- outBedDir args$excludeChr <- excludeChr args$peakParams <- list( @@ -764,7 +764,7 @@ addReproduciblePeakSet <- function( #Create MACS2 Command cmd <- sprintf("callpeak -g %s --name %s --treatment %s --outdir %s --format BED --call-summits --keep-dup all %s", - genomeSize, basename(bedName), bedFile, dirname(bedName), additionalParams) + genomeSize, basename(bedName), .cl_safe(bedFile), .cl_safe(dirname(bedName)), additionalParams) if(!is.null(shift) & !is.null(extsize)){ cmd <- sprintf("%s --shift %s --extsize %s", cmd , shift, extsize) @@ -852,3 +852,13 @@ findMacs2 <- function(){ stop("Could Not Find Macs2! Please install w/ pip, add to your $PATH, or just supply the macs2 path directly and avoid this function!") } + +.cl_safe<-function(string){ + #this is a simple function for system calls from R to a command line tool that will check for any spaces and enclose the string with single + #quote if the string contains a space + if(grepl("\\s+", string, perl = TRUE)){ + return(sQuote(string, q="'")) + }else{ + return(string) + } +} From 3471c93c3378da0b4335044529819ff9a6115cae Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 27 May 2020 13:44:57 -0700 Subject: [PATCH 18/41] added projectData which projects single cells onto single cells --- .Rhistory | 24 ++++++ DESCRIPTION | 2 +- NAMESPACE | 1 + R/BulkProjection.R | 194 +++++++++++++++++++++++++++++++++++++++++++ man/ArchRPalettes.Rd | 4 +- man/projectData.Rd | 34 ++++++++ 6 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 man/projectData.Rd diff --git a/.Rhistory b/.Rhistory index 8bd69bd8..c258815b 100644 --- a/.Rhistory +++ b/.Rhistory @@ -333,3 +333,27 @@ setwd("~/Documents/GitHub/ArchR") pkgdown::build_site() warnings() pkgdown::build_site() +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +.callSummitsMACS2 +ArchR:::.callSummitsMACS2 +ArchR:::.writeCoverageToBed +.callSummitsMACS2 +ArchR:::.callSummitsMACS2() +ArchR:::.callSummitsMACS2 +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) +.validInput +ArchR::.validInput +ArchR::addArchRAnnotations:::.validInput +ArchR:::.validInput +plot(p[[1]]) diff --git a/DESCRIPTION b/DESCRIPTION index 45f028ee..fcf683c9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -11,7 +11,7 @@ Roxygen: list(markdown = TRUE) License: GPL (>= 2) LinkingTo: Rcpp LazyData: TRUE -RoxygenNote: 7.0.2 +RoxygenNote: 7.1.0 Encoding: UTF-8 Imports: Rcpp (>= 0.12.16), diff --git a/NAMESPACE b/NAMESPACE index 739e1cc8..9c04ebf0 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -136,6 +136,7 @@ export(plotTSSEnrichment) export(plotTrajectory) export(plotTrajectoryHeatmap) export(projectBulkATAC) +export(projectData) export(recoverArchRProject) export(reformatFragmentFiles) export(saveArchRProject) diff --git a/R/BulkProjection.R b/R/BulkProjection.R index c2353c26..1d4150c5 100644 --- a/R/BulkProjection.R +++ b/R/BulkProjection.R @@ -217,4 +217,198 @@ projectBulkATAC <- function( } +#' Project single cell data into single cell subspace +#' +#' This function will Project Bulk ATAC-seq data into single cell subspace. +#' +#' @param projector An `ArchRProject` object containing the dimensionality reduction matrix passed by `reducedDims`. +#' @param projectee a single cell Summarized Experiment containing the cells to be . +#' @param reducedDims A string specifying the reducedDims. +#' @param embedding A string specifying embedding. +#' @param verbose A boolean value indicating whether to use verbose output during execution of this function. Can be set to FALSE for a cleaner output. +#' @param threads The number of threads used for parallel execution +#' @param logFile The path to a file to be used for logging ArchR output. +#' @export +#' +projectData <- function( + projector = NULL, + projectee = NULL, + reducedDims = "IterativeLSI", + embedding = "UMAP", + verbose = TRUE, + threads = getArchRThreads(), + logFile = createLogFile("projectBulkATAC") +){ + + .validInput(input = projector, name = "projector", valid = c("ArchRProj")) + .validInput(input = projectee, name = "projectee", valid = c("SummarizedExperiment")) + .validInput(input = reducedDims, name = "reducedDims", valid = c("character")) + .validInput(input = embedding, name = "embedding", valid = c("character", "null")) + .validInput(input = verbose, name = "verbose", valid = c("boolean")) + .validInput(input = threads, name = "threads", valid = c("integer")) + .validInput(input = logFile, name = "logFile", valid = c("character")) + + tstart <- Sys.time() + + .startLogging(logFile = logFile) + .logThis(mget(names(formals()),sys.frame(sys.nframe())), "projectBulkATAC Input-Parameters", logFile = logFile) + + ################################################## + # Reduced Dimensions + ################################################## + rD <- getReducedDims(projector, reducedDims = reducedDims, returnMatrix = FALSE) + .logThis(names(rD), "reducedDimsNames", logFile = logFile) + .logThis(rD[[1]], "reducedDimsMat", logFile = logFile) + rDFeatures <- rD[[grep("Features", names(rD))]] + if("end" %in% colnames(rDFeatures)){ + rDGR <- GRanges(seqnames=rDFeatures$seqnames,IRanges(start=rDFeatures$start, end=rDFeatures$end)) + }else{ + rDGR <- GRanges(seqnames=rDFeatures$seqnames,IRanges(start=rDFeatures$start, width = (rDFeatures$start) / (rDFeatures$idx - 1))) + } + .logThis(rDGR, "reducedDimsGRanges", logFile = logFile) + subATAC <- subsetByOverlaps(projectee, rDGR, ignore.strand = TRUE) + subATAC <- subATAC[order(rowSums(as.array(.getAssay(subATAC, "counts"))), decreasing = TRUE), ] + o <- DataFrame(findOverlaps(subATAC, rDGR, ignore.strand = TRUE)) + sumOverlap <- length(unique(o[,2])) + .logThis(o, "overlapATAC", logFile = logFile) + + if(sumOverlap == 0){ + .logStop(paste0("No overlaps between bulk ATAC data and reduce dimensions feature found.", + "\nEither recreate counts matrix or most likely these data sets are incompatible!"), logFile = logFile) + } + if( (sumOverlap / length(rDGR)) < 0.25 ){ + if(force){ + .logMessage("Less than 25% of the features are present in this bulk ATAC data set! Continuing since force = TRUE!", verbose = TRUE, logFile = logFile) + }else{ + .logStop("Less than 25% of the features are present in this bulk ATAC data set! Set force = TRUE to continue!", logFile = logFile) + } + } + .logMessage("Overlap Ratio of Reduced Dims Features = ", (sumOverlap / length(rDGR)), verbose = TRUE, logFile = logFile) + + o <- o[!duplicated(o$subjectHits),] + subATAC <- subATAC[o$queryHits, ] + rownames(subATAC) <- paste0("f", o$subjectHits) + .logThis(subATAC, "subsettedATAC", logFile = logFile) + + ################################################## + # Create Bulk Matrix + ################################################## + bulkMat <- .safeSubset( + mat = .getAssay(subATAC, "counts"), + subsetRows = paste0("f", seq_along(rDGR)) + ) + .logThis(bulkMat, "bulkATACMat", logFile = logFile) + + simRD <- as.matrix(.projectLSI(bulkMat, LSI = rD, verbose = FALSE)) + if(is.null(embedding)){ + if(rD$scaleDims){ + simRD <- .scaleDims(simRD) + } + out <- SimpleList( + simulatedReducedDims = simRD + ) + return(out) + } + .logThis(simRD, "simulatedReducedDims", logFile = logFile) + + ################################################## + # Prep Reduced Dims + ################################################## + embedding <- getEmbedding(ArchRProj = projector, embedding = embedding, returnDF = FALSE) + corCutOff <- embedding$params$corCutOff + dimsToUse <- embedding$params$dimsToUse + scaleDims <- embedding$params$scaleDims + + if(is.null(scaleDims)){ + scaleDims <- rD$scaleDims + } + + simRD <- .scaleDims(simRD) + + if(embedding$params$nc != ncol(simRD)){ + + if(is.null(dimsToUse)){ + dimsToUse <- seq_len(ncol(rD[[1]])) + } + + if(!is.null(corCutOff)){ + if(scaleDims){ + corToDepth <- rD$corToDepth$scaled + dimsToUse <- dimsToUse[corToDepth < corCutOff] + }else{ + corToDepth <- rD$corToDepth$none + dimsToUse <- dimsToUse[corToDepth < corCutOff] + } + } + + if(embedding$params$nc != ncol(simRD)){ + .logMessage("Error incosistency found with matching LSI dimensions to those used in addEmbedding", + "\nReturning with simulated reduced dimension coordinates...", verbose = TRUE, logFile = logFile) + out <- SimpleList( + simulatedReducedDims = simRD + ) + return(out) + } + + simRD <- simRD[, dimsToUse, drop = FALSE] + + } + + ################################################## + # Get Previous UMAP Model + ################################################## + umapModel <- .loadUWOT(embedding$params$uwotModel, embedding$params$nc) + + idx <- sort(sample(seq_len(nrow(rD[[1]])), min(nrow(rD[[1]]), 5000))) #Try to use 5000 or total cells to check validity + rD2 <- getReducedDims( + ArchRProj = projector, + reducedDims = reducedDims, + dimsToUse = embedding$params$dimsToUse, + scaleDims = embedding$params$scaleDims, + corCutOff = embedding$params$corCutOff + )[idx,,drop=FALSE] + + ################################################## + # Project UMAP + ################################################## + set.seed(1) + threads2 <- max(floor(threads/2), 1) + simUMAP <- uwot::umap_transform( + X = rbind(rD2, simRD), + model = umapModel, + verbose = TRUE, + n_threads = threads2 + ) + rownames(simUMAP) <- c(rownames(rD2), rownames(simRD)) + .logThis(simUMAP, "simulatedUMAP", logFile = logFile) + + #Check if the projection matches using previous data + c1 <- cor(simUMAP[rownames(rD2), 1], embedding[[1]][rownames(rD2),1]) + c2 <- cor(simUMAP[rownames(rD2), 2], embedding[[1]][rownames(rD2),2]) + if(min(c1, c2) < 0.8){ + .logMessage("Warning projection correlation is less than 0.8 (R = ", round(min(c1,c2), 4),").\nThese results may not be accurate because of the lack of heterogeneity in the single cell data.", verbose = TRUE, logFile = logFile) + } + + dfUMAP <- embedding[[1]] + colnames(dfUMAP) <- c("UMAP1", "UMAP2") + colnames(simUMAP) <- c("UMAP1", "UMAP2") + dfUMAP <- DataFrame(dfUMAP) + dfUMAP$Type <- Rle("projector", lengths = nrow(dfUMAP)) + + simUMAP <- DataFrame(simUMAP[rownames(simRD),,drop=FALSE]) + simUMAP$Type <- Rle(stringr::str_split(rownames(simUMAP), pattern = "#", simplify = TRUE)[,1]) + + out <- SimpleList( + simulatedBulkUMAP = simUMAP, + singleCellUMAP = dfUMAP, + simulatedReducedDims = simRD + ) + .endLogging(logFile = logFile) + + return(out) + +} + + + diff --git a/man/ArchRPalettes.Rd b/man/ArchRPalettes.Rd index 61cc1e60..c74ad672 100644 --- a/man/ArchRPalettes.Rd +++ b/man/ArchRPalettes.Rd @@ -4,7 +4,9 @@ \name{ArchRPalettes} \alias{ArchRPalettes} \title{List of color palettes that can be used in plots} -\format{An object of class \code{list} of length 30.} +\format{ +An object of class \code{list} of length 30. +} \usage{ ArchRPalettes } diff --git a/man/projectData.Rd b/man/projectData.Rd new file mode 100644 index 00000000..d44008e7 --- /dev/null +++ b/man/projectData.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/BulkProjection.R +\name{projectData} +\alias{projectData} +\title{Project single cell data into single cell subspace} +\usage{ +projectData( + projector = NULL, + projectee = NULL, + reducedDims = "IterativeLSI", + embedding = "UMAP", + verbose = TRUE, + threads = getArchRThreads(), + logFile = createLogFile("projectBulkATAC") +) +} +\arguments{ +\item{projector}{An \code{ArchRProject} object containing the dimensionality reduction matrix passed by \code{reducedDims}.} + +\item{projectee}{a single cell Summarized Experiment containing the cells to be .} + +\item{reducedDims}{A string specifying the reducedDims.} + +\item{embedding}{A string specifying embedding.} + +\item{verbose}{A boolean value indicating whether to use verbose output during execution of this function. Can be set to FALSE for a cleaner output.} + +\item{threads}{The number of threads used for parallel execution} + +\item{logFile}{The path to a file to be used for logging ArchR output.} +} +\description{ +This function will Project Bulk ATAC-seq data into single cell subspace. +} From 799d296bae0f2bf7f78af447ccd04d4363a0d092 Mon Sep 17 00:00:00 2001 From: scfurl Date: Sun, 28 Jun 2020 15:50:00 -0700 Subject: [PATCH 19/41] nm --- .Rhistory | 8 ++++++++ .gitignore | 1 + 2 files changed, 9 insertions(+) diff --git a/.Rhistory b/.Rhistory index c258815b..8f1f697e 100644 --- a/.Rhistory +++ b/.Rhistory @@ -357,3 +357,11 @@ ArchR::.validInput ArchR::addArchRAnnotations:::.validInput ArchR:::.validInput plot(p[[1]]) +ArchR:::.getAssay +m3addon::get_assay +library(ArchR) +library(ArchR) +library(ArchR) +roxygen2::roxygenize(".") +library(ArchR) +library(ArchR) diff --git a/.gitignore b/.gitignore index 0420c714..54618640 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store .DS_Store .Rproj.user +.Rhistory From a417fc93ee607a2f772dc0186e703c276bcefd50 Mon Sep 17 00:00:00 2001 From: scfurl Date: Mon, 29 Jun 2020 13:34:58 -0700 Subject: [PATCH 20/41] allow spaces --- R/AllClasses.R | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/R/AllClasses.R b/R/AllClasses.R index 466aadaa..5edb2cd7 100644 --- a/R/AllClasses.R +++ b/R/AllClasses.R @@ -109,10 +109,10 @@ ArchRProject <- function( stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) } dir.create(outputDirectory,showWarnings=FALSE) - if(grepl(" ", normalizePath(outputDirectory))){ - stop("outputDirectory cannot have a space in the full path! Full path : ", normalizePath(outputDirectory)) + if(grepl(" ", outputDirectory)){ + stop("outputDirectory cannot have a space in the full path! Full path : ", outputDirectory) } - sampleDirectory <- file.path(normalizePath(outputDirectory), "ArrowFiles") + sampleDirectory <- file.path(outputDirectory, "ArrowFiles") dir.create(sampleDirectory,showWarnings=FALSE) if(is.null(ArrowFiles)){ @@ -178,7 +178,7 @@ ArchRProject <- function( message("Initializing ArchRProject...") AProj <- new("ArchRProject", - projectMetadata = SimpleList(outputDirectory = normalizePath(outputDirectory)), + projectMetadata = SimpleList(outputDirectory = outputDirectory), projectSummary = SimpleList(), sampleColData = sampleColData, sampleMetadata = sampleMetadata, @@ -372,8 +372,7 @@ loadArchRProject <- function( ArchRProj <- recoverArchRProject(readRDS(path2Proj)) outputDir <- getOutputDirectory(ArchRProj) - outputDirNew <- normalizePath(path) - + outputDirNew <- path #1. Arrows Paths ArrowFilesNew <- file.path(outputDirNew, "ArrowFiles", basename(ArchRProj@sampleColData$ArrowFiles)) if(!all(file.exists(ArrowFilesNew))){ @@ -497,8 +496,7 @@ saveArchRProject <- function( } dir.create(outputDirectory, showWarnings=FALSE) - outputDirectory <- normalizePath(outputDirectory) - outDirOld <- normalizePath(getOutputDirectory(ArchRProj)) + outDirOld <- getOutputDirectory(ArchRProj) newProj <- ArchRProj ArrowFiles <- getArrowFiles(ArchRProj) @@ -512,7 +510,7 @@ saveArchRProject <- function( names(ArrowFilesNew) <- names(ArrowFiles) if(outputDirectory != outDirOld){ - message("Copying ArchRProject to new outputDirectory : ", normalizePath(outputDirectory)) + message("Copying ArchRProject to new outputDirectory : ", outputDirectory) } if(!identical(paste0(ArrowFiles), paste0(ArrowFilesNew))){ From 3be5d39d338798051b04a7ac4c64193f6204b752 Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 1 Jul 2020 11:45:42 -0700 Subject: [PATCH 21/41] bug in FilterCells saving date --- .Rhistory | 3 +++ DESCRIPTION | 2 +- R/FilterCells.R | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.Rhistory b/.Rhistory index 8f1f697e..b81f63a9 100644 --- a/.Rhistory +++ b/.Rhistory @@ -365,3 +365,6 @@ library(ArchR) roxygen2::roxygenize(".") library(ArchR) library(ArchR) +library(ArchR) +library(ArchR) +library(ArchR) diff --git a/DESCRIPTION b/DESCRIPTION index b70dbed5..9f02ff9c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: ArchR Type: Package Date: 2019-05-11 Title: Analyzing single-cell regulatory chromatin in R. -Version: 0.9.5 +Version: 0.9.6 Authors@R: c( person("Jeffrey", "Granja", email = "jgranja.stanford@gmail.com", role = c("aut","cre")), person("Ryan", "Corces", role = "aut")) diff --git a/R/FilterCells.R b/R/FilterCells.R index 6ef51514..6a293269 100644 --- a/R/FilterCells.R +++ b/R/FilterCells.R @@ -99,7 +99,7 @@ filterDoublets <- function(ArchRProj = NULL, cutEnrich = 1, cutScore = -Inf, fil } ArchRProj <- addProjectSummary(ArchRProj = ArchRProj, name = "filterDoublets", - summary = c("Date" = Sys.time(), cutEnrich = cutEnrich, cutScore = cutScore, filterRatio = filterRatio)) + summary = c("Date" = as.character(Sys.time()), cutEnrich = cutEnrich, cutScore = cutScore, filterRatio = filterRatio)) ArchRProj From 91910c1e87990113af6e7ce3b3fe97e6025e6ee9 Mon Sep 17 00:00:00 2001 From: scfurl Date: Thu, 9 Jul 2020 14:29:41 -0700 Subject: [PATCH 22/41] Add exportMonocle3 function --- .Rhistory | 105 ++++++++++++++++++++++++++++++++++++++++++ DESCRIPTION | 2 +- NAMESPACE | 4 ++ R/CreateArrow.R | 1 + R/GroupExport.R | 101 ++++++++++++++++++++++++++++++++++++++++ man/exportMonocle3.Rd | 29 ++++++++++++ 6 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 man/exportMonocle3.Rd diff --git a/.Rhistory b/.Rhistory index b81f63a9..11026310 100644 --- a/.Rhistory +++ b/.Rhistory @@ -368,3 +368,108 @@ library(ArchR) library(ArchR) library(ArchR) library(ArchR) +library(ArchR) +#devtools::install_github('scfurl/m3addon') +graphics.off() +rm(list=ls()) +knitr::opts_chunk$set(fig.width=8, fig.height=6, +echo=FALSE, warning=FALSE, message=FALSE) +knitr::opts_chunk$set(dev.args=list(bg="transparent")) +ROOT_DIR<-.ROOT_DIR +stem<-"BMME/KSTd145" +DATA_DIR <- file.path(ROOT_DIR, "Analysis", stem, "data") # SPECIFY HERE +RES_DIR <- file.path(ROOT_DIR, "Analysis", stem, "res") # SPECIFY HERE +RMD_DIR <- file.path(ROOT_DIR, "Analysis", stem, "rmd") # SPECIFY HERE +CDS_DIR <- file.path(ROOT_DIR, "Analysis", stem, "cds") +FIG_DIR <- file.path(ROOT_DIR, "Analysis", stem, "figs") +ENR_DIR<-file.path(ROOT_DIR, "Bioinformatics Resources", "MSigDB") +SCRIPT_DIR<-file.path(ROOT_DIR, "develop", "SfScripts", "m3") +suppressPackageStartupMessages({ +library(monocle3) +library(m3addon) +library(reticulate) +library(openxlsx) +library(dplyr) +library(Matrix) +library(ggplot2) +library(rhdf5) +library(xfun) +library(pals) +library(RColorBrewer) +#library(knitr) +}) +py_config() +xfun::pkg_load2(c('base64enc', 'htmltools', 'mime')) +py_available("Scrublet") +#load_all(file.path(ROOT_DIR, "fstree")) +# Set global ggplot2 properties for making print-scaled PDF panels +SFtheme<-theme_bw(base_size=14) + +theme(panel.background = element_rect(fill = "transparent",colour = NA), # or theme_blank() +panel.grid.minor = element_blank(), +panel.grid.major = element_blank(), +legend.background = element_rect(fill = "transparent"), +legend.box.background = element_rect(fill = "transparent"), +legend.key = element_rect(fill = "transparent", colour = NA), +plot.background = element_rect(fill = "transparent",colour = NA)) +theme_set(SFtheme) +exp_colors<-c("grey85", "orange", "red", "violetred4", "black") +qthresh<-0.05 +ethresh<-1.2 +cell_min<-5 +cdsT <- readRDS(file.path(RES_DIR, "200428_cds_filtered_Starsolo.RDS")) +plot_cells(cdsT, color_cells_by = "cluster", label_cell_groups = F, cell_size = 0.6)+SFtheme +genes=c("HA1_TCR_HA1_gene","CD14", "CD33", "CD34", "KIT", "IL3RA") +plot_genes_violin(cdsT[fData(cds)$gene_short_name %in% genes,]) +plot_genes_violin(cdsT[fData(cdsT)$gene_short_name %in% genes,]) +cdsT$DE<-clusters(cdsT) +plot_cells(cdsT, color_cells_by = "cluster", label_cell_groups = F, cell_size = 0.6)+SFtheme +plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme +plot_cells(cdsT, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme +plot_cells(cdsT, color_cells_by = "cluster", label_cell_groups = F, cell_size = 0.6)+SFtheme +cdsT$DE[cdsT$DE=="3"]<-"Monos" +cdsT$DE<-as.character(clusters(cdsT)) +cdsT$DE[cdsT$DE=="3"]<-"Monos" +cdsT$DE[cdsT$DE=="1"]<-"Leukemia" +cds<-cdsT[,cdsT$DE %in% c("Monos", "Leukemia")] +plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme +genes=c("HA1_TCR_HA1_gene","CD14", "CD33", "CD34", "KIT", "IL3RA") +plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE") +plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE") +plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE", ncol = 2) +fit_models(cds, model_formula_str = "~DE") +fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") +mods<-fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") +fit_coefs <- coefficient_table(mods) +fit_coefs <- coefficient_table(mods) +fit_coefs +terms<- fit_coefs %>% filter(term != "(Intercept)") +terms +terms<- fit_coefs %>% filter(term != "(Intercept)") %>% +select(gene_short_name, term, q_value, estimate) +terms +terms<- fit_coefs %>% filter(term != "(Intercept)") %>% +select(gene_short_name, term, q_value, normalized_effect) +terms +cds$DE +cdsT$DE<-factor(cdsT$DE) +plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme +plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE", ncol = 2) +cds$DE +cds<-cdsT[,cdsT$DE %in% c("Monos", "Leukemia")] +cds$DE<-factor(cds$DE) +plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme +mods<-fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") +fit_coefs <- coefficient_table(mods) +terms<- fit_coefs %>% filter(term != "(Intercept)") %>% +select(gene_short_name, term, q_value, normalized_effect) +knitr::kable(terms) +cds$DE +levels(cds$DE) +cds$DE<-as.character(cds$DE) +cds$DE<-factor(cds$DE, levels=c("Monos", "Leukemia")) +plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE", ncol = 2) +mods<-fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") +fit_coefs <- coefficient_table(mods) +terms<- fit_coefs %>% filter(term != "(Intercept)") %>% +select(gene_short_name, term, q_value, normalized_effect) +knitr::kable(terms) diff --git a/DESCRIPTION b/DESCRIPTION index 9f02ff9c..4938f119 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -11,7 +11,7 @@ Roxygen: list(markdown = TRUE) License: GPL (>= 2) LinkingTo: Rcpp LazyData: TRUE -RoxygenNote: 7.1.0 +RoxygenNote: 7.1.1 Encoding: UTF-8 Imports: Rcpp (>= 0.12.16), diff --git a/NAMESPACE b/NAMESPACE index 9c04ebf0..4f64678a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -53,6 +53,7 @@ export(createGenomeAnnotation) export(createLogFile) export(enrichHeatmap) export(exportGroupSE) +export(exportMonocle3) export(extendGR) export(filterChrGR) export(filterDoublets) @@ -104,6 +105,7 @@ export(getTrajectory) export(getTutorialData) export(getValidBarcodes) export(getVarDeviations) +export(getmode) export(ggAlignPlots) export(ggGroup) export(ggHex) @@ -145,5 +147,7 @@ export(subsetCells) export(theme_ArchR) export(trajectoryHeatmap) export(validBSgenome) +import(SingleCellExperiment) +import(monocle3) importFrom(Rcpp,sourceCpp) useDynLib(ArchR) diff --git a/R/CreateArrow.R b/R/CreateArrow.R index f74fd826..0b1c1337 100644 --- a/R/CreateArrow.R +++ b/R/CreateArrow.R @@ -419,6 +419,7 @@ createArrowFiles <- function( ############################################################# #Compute Fragment Information! ############################################################# + .logDiffTime(sprintf("%s Adding Fragment Summary", prefix), t1 = tstart, verbose = FALSE, logFile = logFile) fragSummary <- .fastFragmentInfo( ArrowFile = ArrowFile, diff --git a/R/GroupExport.R b/R/GroupExport.R index b7113baf..13641fd5 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -235,5 +235,106 @@ getGroupSE <- function( # } +#' Export to Monocle3 +#' +#' This function will return a monocle3 cell_data_set for a assay in a ArchRProject. +#' +#' @param ArchRProj An `ArchRProject` object. +#' @param useMatrix The name of the matrix in the ArrowFiles. See getAvailableMatrices to see options +#' @param threads An integer specifying the number of threads for parallel. +#' @param verbose A boolean specifying to print messages during computation. +#' @param logFile The path to a file to be used for logging ArchR output. +#' @import monocle3 +#' @import SingleCellExperiment +#' @export +exportMonocle3 <- function( + ArchRProj = NULL, + useMatrix = NULL, + threads = getArchRThreads(), + verbose = TRUE, + binarize = T, + logFile = createLogFile("exportMonocle3") +){ + require(SingleCellExperiment) + require(monocle3) + ArchR:::.validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) + ArchR:::.validInput(input = useMatrix, name = "useMatrix", valid = c("character")) + ArchR:::.validInput(input = threads, name = "threads", valid = c("integer")) + ArchR:::.validInput(input = verbose, name = "verbose", valid = c("boolean")) + ArchR:::.validInput(input = logFile, name = "logFile", valid = c("character")) + ArchR:::.startLogging(logFile = logFile) + ArchR:::.logThis(mget(names(formals()),sys.frame(sys.nframe())), "exportMonocle3 Input-Parameters", logFile = logFile) + + ArrowFiles <- getArrowFiles(ArchRProj) + ArrowFiles <- ArchR:::.validArrow(ArrowFiles) + featureDF <- ArchR:::.getFeatureDF(ArrowFiles, subGroup = useMatrix) + Groups <- getCellColData(ArchRProj = ArchRProj) + Cells <- ArchRProj$cellNames + if(is.null(featureDF$end)){ + starts<-featureDF[as.character(featureDF$seqnames) %in% as.character(featureDF$seqnames)[1],]$start + width<-getmode(starts[-1]-starts[-length(starts)]) + ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) + }else{ + ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx) + } + ArchR:::.logMessage("Getting Group Matrix", logFile=logFile) + mat <- tryCatch({ + getMatrixFromArrow(ArrowFiles, useMatrix = useMatrix, binarize = binarize, cellNames = Cells, useSeqnames = as.character(seqnames(ranges))) + }, error = function(e){ + errorList <- list( + ArrowFiles = ArrowFiles, + featureDF = featureDF, + useMatrix = useMatrix, + threads = threads, + verbose = verbose + ) + ArchR:::.logError(e, fn = ".getMatrixFromArrow", info = "", errorList = errorList, logFile = logFile) + }) + o <- h5read(file = ArrowFiles, name = paste0("/", useMatrix,"/Info/Params")) + h5closeAll() + window_size<-getmode(o$tileSize) + mat@assays@data$counts<-mat@assays@data[[useMatrix]] + mat@assays@data[[useMatrix]]<-NULL + rs<-ArchR:::.getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix) + rowRanges(mat)<-ranges + mat<-mat[, match(rownames(ArchRProj@reducedDims$IterativeLSI$matSVD), colnames(mat))] + cds<-new_cell_data_set(expression_data = mat@assays@data$counts, cell_metadata = colData(mat)) + rowRanges(cds)<-rowRanges(mat) + cds<-cds[,rownames(ArchRProj@reducedDims$IterativeLSI$matSVD)] + reducedDims(cds)<-SimpleList(LSI=ArchRProj@reducedDims$IterativeLSI$matSVD, + UMAP=ArchRProj@embeddings$UMAP$df) + irlba_rotation = ArchRProj@reducedDims$IterativeLSI$svd$u + row.names(irlba_rotation) = paste0(ArchRProj@reducedDims$IterativeLSI$LSIFeatures$seqnames, "_", ArchRProj@reducedDims$IterativeLSI$LSIFeatures$idx) + iLSI<-SimpleList(svd=ArchRProj@reducedDims$IterativeLSI$svd, + features=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, + row_sums = ArchRProj@reducedDims$IterativeLSI$rowSm, + seed=ArchRProj@reducedDims$IterativeLSI$seed, + binarize=ArchRProj@reducedDims$IterativeLSI$binarize, + scale_to=ArchRProj@reducedDims$IterativeLSI$scaleTo, + num_dim=ArchRProj@reducedDims$IterativeLSI$nDimensions, + resolution=NULL, + granges=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, + LSI_method=ArchRProj@reducedDims$IterativeLSI$LSIMethod, outliers=NULL) + pp_aux <- SimpleList(iLSI=iLSI, gene_loadings=irlba_rotation) + cds@preprocess_aux <- pp_aux + if(is.null(cds@preprocess_aux$iLSI$granges$end)){ + starts<-cds@preprocess_aux$iLSI$granges[as.character(cds@preprocess_aux$iLSI$granges$seqnames) %in% as.character(cds@preprocess_aux$iLSI$granges$seqnames)[1],]$start + width<-getmode(starts[-1]-starts[-length(starts)]) + ranges<-GRanges(seqnames = cds@preprocess_aux$iLSI$granges$seqnames, ranges = IRanges(start = cds@preprocess_aux$iLSI$granges$start, width = width), names=cds@preprocess_aux$iLSI$granges$idx) + }else{ + ranges<-GRanges(seqnames = cds@preprocess_aux$iLSI$granges$seqnames, ranges = IRanges(start = cds@preprocess_aux$iLSI$granges$start, end = cds@preprocess_aux$iLSI$granges$end), names=cds@preprocess_aux$iLSI$granges$idx) + } + cds@preprocess_aux$iLSI$granges<-ranges + cds@clusters[["UMAP"]]$clusters[colnames(exprs(cds))]<-as.character(ArchRProj@cellColData[colnames(exprs(cds)),]$Clusters) + cds@reduce_dim_aux<-SimpleList(UMAP=SimpleList(scale_info=NULL, model_file=ArchRProj@embeddings$UMAP$params$uwotModel, num_dim=cds@preprocess_aux$iLSI$num_dim)) + cds + +} + +#' @export +getmode<-function(v) { + uniqv <- unique(v) + uniqv[which.max(tabulate(match(v, uniqv)))] +} diff --git a/man/exportMonocle3.Rd b/man/exportMonocle3.Rd new file mode 100644 index 00000000..e55fe5bb --- /dev/null +++ b/man/exportMonocle3.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/GroupExport.R +\name{exportMonocle3} +\alias{exportMonocle3} +\title{Export to Monocle3} +\usage{ +exportMonocle3( + ArchRProj = NULL, + useMatrix = NULL, + threads = getArchRThreads(), + verbose = TRUE, + binarize = T, + logFile = createLogFile("exportMonocle3") +) +} +\arguments{ +\item{ArchRProj}{An \code{ArchRProject} object.} + +\item{useMatrix}{The name of the matrix in the ArrowFiles. See getAvailableMatrices to see options} + +\item{threads}{An integer specifying the number of threads for parallel.} + +\item{verbose}{A boolean specifying to print messages during computation.} + +\item{logFile}{The path to a file to be used for logging ArchR output.} +} +\description{ +This function will return a monocle3 cell_data_set for a assay in a ArchRProject. +} From 271492d20f69561a27c631d04c55bf95725fd43d Mon Sep 17 00:00:00 2001 From: scfurl Date: Tue, 1 Sep 2020 11:02:18 -0700 Subject: [PATCH 23/41] allow spaces --- .Rhistory | 183 +++++++++++++++++++++++++++++-------------------- R/AllClasses.R | 18 ++--- 2 files changed, 119 insertions(+), 82 deletions(-) diff --git a/.Rhistory b/.Rhistory index 11026310..32887366 100644 --- a/.Rhistory +++ b/.Rhistory @@ -1,76 +1,3 @@ ---- -title: "ArchR Hematopoiesis Tutorial" -author: "Jeffrey Granja" -date: "11/22/2019" -output: html_document ---- -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` -## R Markdown -knitr::opts_chunk$set(echo = TRUE) -knitr::opts_chunk$set(echo = TRUE) -summary(cars) -plot(pressure) -knitr::opts_chunk$set(echo = TRUE) -setwd("~/Documents/Heme_Tutorial/") -data("geneAnnoHg19") -data("genomeAnnoHg19") -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -knitr::opts_chunk$set(echo = TRUE) -#Input Libraries -library(ArchR) -#Set/Create Working Directory to Folder -setwd("~/Documents/Heme_Tutorial/") -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -#Input Libraries -library(ArchR) -#Set/Create Working Directory to Folder -setwd("~/Documents/Heme_Tutorial/") -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -library(knitr) -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -library(knitr) knitr::opts_chunk$set(echo = TRUE) opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") #Input Libraries @@ -473,3 +400,113 @@ fit_coefs <- coefficient_table(mods) terms<- fit_coefs %>% filter(term != "(Intercept)") %>% select(gene_short_name, term, q_value, normalized_effect) knitr::kable(terms) +.initializeMat +library(ArchR) +roxygen2::roxygenize(".") +library(ArchR) +library(ArchR) +library(ArchR) +ArchR:::.getMatrixFromArrow +library(ArchR) +roxygen2::roxygenize(".") +library(ArchR) +roxygen2::roxygenize(".") +roxygen2::roxygenize(".") +library(ArchR) +roxygen2::roxygenize(".") +library(ArchR) +exportMonocle3 <- function( +ArchRProj = NULL, +useMatrix = NULL, +threads = getArchRThreads(), +verbose = TRUE, +binarize = T, +logFile = createLogFile("exportMonocle3") +){ +require(SingleCellExperiment) +.validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) +.validInput(input = useMatrix, name = "useMatrix", valid = c("character")) +.validInput(input = threads, name = "threads", valid = c("integer")) +.validInput(input = verbose, name = "verbose", valid = c("boolean")) +.validInput(input = logFile, name = "logFile", valid = c("character")) +.startLogging(logFile = logFile) +.logThis(mget(names(formals()),sys.frame(sys.nframe())), "exportMonocle3 Input-Parameters", logFile = logFile) +ArrowFiles <- getArrowFiles(ArchRProj) +ArrowFiles <- ArchR:::.validArrow(ArrowFiles) +featureDF <- .getFeatureDF(ArrowFiles, subGroup = useMatrix) +Groups <- getCellColData(ArchRProj = ArchRProj) +Cells <- ArchRProj$cellNames +if(is.null(featureDF$end)){ +starts<-featureDF[as.character(featureDF$seqnames) %in% as.character(featureDF$seqnames)[1],]$start +width<-getmode(starts[-1]-starts[-length(starts)]) +ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) +}else{ +ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx) +} +.logMessage("Getting Group Matrix", logFile=logFile) +mat <- tryCatch({ +getMatrixFromArrow(ArrowFiles, useMatrix = useMatrix, binarize = binarize, cellNames = Cells, useSeqnames = as.character(seqnames(ranges))) +}, error = function(e){ +errorList <- list( +ArrowFiles = ArrowFiles, +featureDF = featureDF, +useMatrix = useMatrix, +threads = threads, +verbose = verbose +) +.logError(e, fn = ".getMatrixFromArrow", info = "", errorList = errorList, logFile = logFile) +}) +o <- h5read(file = ArrowFiles, name = paste0("/", useMatrix,"/Info/Params")) +h5closeAll() +window_size<-getmode(o$tileSize) +mat@assays@data$counts<-mat@assays@data[[useMatrix]] +mat@assays@data[[useMatrix]]<-NULL +rs<-ArchR:::.getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix) +rowRanges(mat)<-ranges +mat<-mat[, match(rownames(ArchRProj@reducedDims$IterativeLSI$matSVD), colnames(mat))] +cds<-new_cell_data_set(expression_data = mat@assays@data$counts, cell_metadata = colData(mat)) +rowRanges(cds)<-rowRanges(mat) +cds<-cds[,rownames(ArchRProj@reducedDims$IterativeLSI$matSVD)] +reducedDims(cds)<-SimpleList(LSI=ArchRProj@reducedDims$IterativeLSI$matSVD, +UMAP=ArchRProj@embeddings$UMAP$df) +irlba_rotation = ArchRProj@reducedDims$IterativeLSI$svd$u +row.names(irlba_rotation) = paste0(ArchRProj@reducedDims$IterativeLSI$LSIFeatures$seqnames, "_", ArchRProj@reducedDims$IterativeLSI$LSIFeatures$idx) +iLSI<-SimpleList(svd=ArchRProj@reducedDims$IterativeLSI$svd, +features=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, +row_sums = ArchRProj@reducedDims$IterativeLSI$rowSm, +seed=ArchRProj@reducedDims$IterativeLSI$seed, +binarize=ArchRProj@reducedDims$IterativeLSI$binarize, +scale_to=ArchRProj@reducedDims$IterativeLSI$scaleTo, +num_dim=ArchRProj@reducedDims$IterativeLSI$nDimensions, +resolution=NULL, +granges=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, +LSI_method=ArchRProj@reducedDims$IterativeLSI$LSIMethod, outliers=NULL) +pp_aux <- SimpleList(iLSI=iLSI, gene_loadings=irlba_rotation) +cds@preprocess_aux <- pp_aux +if(is.null(cds@preprocess_aux$iLSI$granges$end)){ +starts<-cds@preprocess_aux$iLSI$granges[cds@preprocess_aux$iLSI$granges$seqnames %in% cds@preprocess_aux$iLSI$granges$seqnames[1],]$start +width<-getmode(starts[-1]-starts[-length(starts)]) +ranges<-GRanges(seqnames = cds@preprocess_aux$iLSI$granges$seqnames, ranges = IRanges(start = cds@preprocess_aux$iLSI$granges$start, width = width), names=cds@preprocess_aux$iLSI$granges$idx) +}else{ +ranges<-GRanges(seqnames = cds@preprocess_aux$iLSI$granges$seqnames, ranges = IRanges(start = cds@preprocess_aux$iLSI$granges$start, end = cds@preprocess_aux$iLSI$granges$end), names=cds@preprocess_aux$iLSI$granges$idx) +} +cds@preprocess_aux$iLSI$granges<-ranges +cds@clusters[["UMAP"]]$clusters[colnames(exprs(cds))]<-as.character(ArchRProj@cellColData[colnames(exprs(cds)),]$Clusters) +cds@reduce_dim_aux<-SimpleList(UMAP=SimpleList(scale_info=NULL, model_file=ArchRProj@embeddings$UMAP$params$uwotModel, num_dim=cds@preprocess_aux$iLSI$num_dim)) +cds +} +ArchR:::.validInput +install.packages(c("Cairo", "tibble")) +ArchR:::.tabixToTmp +library(ArchR) +library(ArchR) +library(ArchR) +ArchR:::.projectLSI +library(ArchR) +roxygen2::roxygenise() +rm(list = c("exportMonocle3")) +roxygen2::roxygenise() +library(ArchR) +m3addon::cut2 +m3addon:::cut2 +library(ArchR) diff --git a/R/AllClasses.R b/R/AllClasses.R index 5edb2cd7..0eb2117d 100644 --- a/R/AllClasses.R +++ b/R/AllClasses.R @@ -105,13 +105,13 @@ ArchRProject <- function( .validInput(input = showLogo, name = "showLogo", valid = "boolean") .validInput(input = threads, name = "threads", valid = c("integer")) - if(grepl(" ", outputDirectory)){ - stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) - } + # if(grepl(" ", outputDirectory)){ + # stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) + # } dir.create(outputDirectory,showWarnings=FALSE) - if(grepl(" ", outputDirectory)){ - stop("outputDirectory cannot have a space in the full path! Full path : ", outputDirectory) - } + # if(grepl(" ", outputDirectory)){ + # stop("outputDirectory cannot have a space in the full path! Full path : ", outputDirectory) + # } sampleDirectory <- file.path(outputDirectory, "ArrowFiles") dir.create(sampleDirectory,showWarnings=FALSE) @@ -491,9 +491,9 @@ saveArchRProject <- function( .validInput(input = overwrite, name = "overwrite", valid = "boolean") .validInput(input = load, name = "load", valid = "boolean") - if(grepl(" ", outputDirectory)){ - stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) - } + # if(grepl(" ", outputDirectory)){ + # stop("outputDirectory cannot have a space in the path! Path : ", outputDirectory) + # } dir.create(outputDirectory, showWarnings=FALSE) outDirOld <- getOutputDirectory(ArchRProj) From 57cf0b595f0a7ec92e5930b7751d4e047d99d608 Mon Sep 17 00:00:00 2001 From: scfurl Date: Thu, 3 Sep 2020 14:20:20 -0700 Subject: [PATCH 24/41] add featureDF to GRanges function --- .Rhistory | 285 ++++++++++++----------------------------------- R/GRangesUtils.R | 18 ++- R/GroupExport.R | 6 +- 3 files changed, 95 insertions(+), 214 deletions(-) diff --git a/.Rhistory b/.Rhistory index 32887366..21bb7651 100644 --- a/.Rhistory +++ b/.Rhistory @@ -1,3 +1,76 @@ +--- +title: "ArchR Hematopoiesis Tutorial" +author: "Jeffrey Granja" +date: "11/22/2019" +output: html_document +--- +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` +## R Markdown +knitr::opts_chunk$set(echo = TRUE) +knitr::opts_chunk$set(echo = TRUE) +summary(cars) +plot(pressure) +knitr::opts_chunk$set(echo = TRUE) +setwd("~/Documents/Heme_Tutorial/") +data("geneAnnoHg19") +data("genomeAnnoHg19") +threads <- 8 +pathFragments <- "Heme_Fragments" +inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) +names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) +inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] +inputFiles +knitr::opts_chunk$set(echo = TRUE) +#Input Libraries +library(ArchR) +#Set/Create Working Directory to Folder +setwd("~/Documents/Heme_Tutorial/") +#Load Genome Annotations +data("geneAnnoHg19") +data("genomeAnnoHg19") +#Set Threads to be used +threads <- 8 +pathFragments <- "Heme_Fragments" +inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) +names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) +inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] +inputFiles +#Input Libraries +library(ArchR) +#Set/Create Working Directory to Folder +setwd("~/Documents/Heme_Tutorial/") +#Load Genome Annotations +data("geneAnnoHg19") +data("genomeAnnoHg19") +#Set Threads to be used +threads <- 8 +knitr::opts_chunk$set(echo = TRUE) +opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") +library(knitr) +knitr::opts_chunk$set(echo = TRUE) +opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") +#Input Libraries +library(ArchR) +#Load Genome Annotations +data("geneAnnoHg19") +data("genomeAnnoHg19") +#Set Threads to be used +threads <- 8 +pathFragments <- "Heme_Fragments" +inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) +names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) +inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] +inputFiles +#Input Libraries +library(ArchR) +#Load Genome Annotations +data("geneAnnoHg19") +data("genomeAnnoHg19") +#Set Threads to be used +threads <- 8 +library(knitr) knitr::opts_chunk$set(echo = TRUE) opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") #Input Libraries @@ -296,217 +369,5 @@ library(ArchR) library(ArchR) library(ArchR) library(ArchR) -#devtools::install_github('scfurl/m3addon') -graphics.off() -rm(list=ls()) -knitr::opts_chunk$set(fig.width=8, fig.height=6, -echo=FALSE, warning=FALSE, message=FALSE) -knitr::opts_chunk$set(dev.args=list(bg="transparent")) -ROOT_DIR<-.ROOT_DIR -stem<-"BMME/KSTd145" -DATA_DIR <- file.path(ROOT_DIR, "Analysis", stem, "data") # SPECIFY HERE -RES_DIR <- file.path(ROOT_DIR, "Analysis", stem, "res") # SPECIFY HERE -RMD_DIR <- file.path(ROOT_DIR, "Analysis", stem, "rmd") # SPECIFY HERE -CDS_DIR <- file.path(ROOT_DIR, "Analysis", stem, "cds") -FIG_DIR <- file.path(ROOT_DIR, "Analysis", stem, "figs") -ENR_DIR<-file.path(ROOT_DIR, "Bioinformatics Resources", "MSigDB") -SCRIPT_DIR<-file.path(ROOT_DIR, "develop", "SfScripts", "m3") -suppressPackageStartupMessages({ -library(monocle3) -library(m3addon) -library(reticulate) -library(openxlsx) -library(dplyr) -library(Matrix) -library(ggplot2) -library(rhdf5) -library(xfun) -library(pals) -library(RColorBrewer) -#library(knitr) -}) -py_config() -xfun::pkg_load2(c('base64enc', 'htmltools', 'mime')) -py_available("Scrublet") -#load_all(file.path(ROOT_DIR, "fstree")) -# Set global ggplot2 properties for making print-scaled PDF panels -SFtheme<-theme_bw(base_size=14) + -theme(panel.background = element_rect(fill = "transparent",colour = NA), # or theme_blank() -panel.grid.minor = element_blank(), -panel.grid.major = element_blank(), -legend.background = element_rect(fill = "transparent"), -legend.box.background = element_rect(fill = "transparent"), -legend.key = element_rect(fill = "transparent", colour = NA), -plot.background = element_rect(fill = "transparent",colour = NA)) -theme_set(SFtheme) -exp_colors<-c("grey85", "orange", "red", "violetred4", "black") -qthresh<-0.05 -ethresh<-1.2 -cell_min<-5 -cdsT <- readRDS(file.path(RES_DIR, "200428_cds_filtered_Starsolo.RDS")) -plot_cells(cdsT, color_cells_by = "cluster", label_cell_groups = F, cell_size = 0.6)+SFtheme -genes=c("HA1_TCR_HA1_gene","CD14", "CD33", "CD34", "KIT", "IL3RA") -plot_genes_violin(cdsT[fData(cds)$gene_short_name %in% genes,]) -plot_genes_violin(cdsT[fData(cdsT)$gene_short_name %in% genes,]) -cdsT$DE<-clusters(cdsT) -plot_cells(cdsT, color_cells_by = "cluster", label_cell_groups = F, cell_size = 0.6)+SFtheme -plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme -plot_cells(cdsT, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme -plot_cells(cdsT, color_cells_by = "cluster", label_cell_groups = F, cell_size = 0.6)+SFtheme -cdsT$DE[cdsT$DE=="3"]<-"Monos" -cdsT$DE<-as.character(clusters(cdsT)) -cdsT$DE[cdsT$DE=="3"]<-"Monos" -cdsT$DE[cdsT$DE=="1"]<-"Leukemia" -cds<-cdsT[,cdsT$DE %in% c("Monos", "Leukemia")] -plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme -genes=c("HA1_TCR_HA1_gene","CD14", "CD33", "CD34", "KIT", "IL3RA") -plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE") -plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE") -plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE", ncol = 2) -fit_models(cds, model_formula_str = "~DE") -fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") -mods<-fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") -fit_coefs <- coefficient_table(mods) -fit_coefs <- coefficient_table(mods) -fit_coefs -terms<- fit_coefs %>% filter(term != "(Intercept)") -terms -terms<- fit_coefs %>% filter(term != "(Intercept)") %>% -select(gene_short_name, term, q_value, estimate) -terms -terms<- fit_coefs %>% filter(term != "(Intercept)") %>% -select(gene_short_name, term, q_value, normalized_effect) -terms -cds$DE -cdsT$DE<-factor(cdsT$DE) -plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme -plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE", ncol = 2) -cds$DE -cds<-cdsT[,cdsT$DE %in% c("Monos", "Leukemia")] -cds$DE<-factor(cds$DE) -plot_cells(cds, gene="CD14", label_cell_groups = F, cell_size = 0.6)+SFtheme -mods<-fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") -fit_coefs <- coefficient_table(mods) -terms<- fit_coefs %>% filter(term != "(Intercept)") %>% -select(gene_short_name, term, q_value, normalized_effect) -knitr::kable(terms) -cds$DE -levels(cds$DE) -cds$DE<-as.character(cds$DE) -cds$DE<-factor(cds$DE, levels=c("Monos", "Leukemia")) -plot_genes_violin(cds[fData(cds)$gene_short_name %in% genes,], color_by = "DE", grouping = "DE", ncol = 2) -mods<-fit_models(cds[fData(cds)$gene_short_name %in% genes,], model_formula_str = "~DE") -fit_coefs <- coefficient_table(mods) -terms<- fit_coefs %>% filter(term != "(Intercept)") %>% -select(gene_short_name, term, q_value, normalized_effect) -knitr::kable(terms) -.initializeMat -library(ArchR) -roxygen2::roxygenize(".") -library(ArchR) -library(ArchR) -library(ArchR) -ArchR:::.getMatrixFromArrow -library(ArchR) -roxygen2::roxygenize(".") -library(ArchR) -roxygen2::roxygenize(".") -roxygen2::roxygenize(".") -library(ArchR) -roxygen2::roxygenize(".") -library(ArchR) -exportMonocle3 <- function( -ArchRProj = NULL, -useMatrix = NULL, -threads = getArchRThreads(), -verbose = TRUE, -binarize = T, -logFile = createLogFile("exportMonocle3") -){ -require(SingleCellExperiment) -.validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) -.validInput(input = useMatrix, name = "useMatrix", valid = c("character")) -.validInput(input = threads, name = "threads", valid = c("integer")) -.validInput(input = verbose, name = "verbose", valid = c("boolean")) -.validInput(input = logFile, name = "logFile", valid = c("character")) -.startLogging(logFile = logFile) -.logThis(mget(names(formals()),sys.frame(sys.nframe())), "exportMonocle3 Input-Parameters", logFile = logFile) -ArrowFiles <- getArrowFiles(ArchRProj) -ArrowFiles <- ArchR:::.validArrow(ArrowFiles) -featureDF <- .getFeatureDF(ArrowFiles, subGroup = useMatrix) -Groups <- getCellColData(ArchRProj = ArchRProj) -Cells <- ArchRProj$cellNames -if(is.null(featureDF$end)){ -starts<-featureDF[as.character(featureDF$seqnames) %in% as.character(featureDF$seqnames)[1],]$start -width<-getmode(starts[-1]-starts[-length(starts)]) -ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) -}else{ -ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx) -} -.logMessage("Getting Group Matrix", logFile=logFile) -mat <- tryCatch({ -getMatrixFromArrow(ArrowFiles, useMatrix = useMatrix, binarize = binarize, cellNames = Cells, useSeqnames = as.character(seqnames(ranges))) -}, error = function(e){ -errorList <- list( -ArrowFiles = ArrowFiles, -featureDF = featureDF, -useMatrix = useMatrix, -threads = threads, -verbose = verbose -) -.logError(e, fn = ".getMatrixFromArrow", info = "", errorList = errorList, logFile = logFile) -}) -o <- h5read(file = ArrowFiles, name = paste0("/", useMatrix,"/Info/Params")) -h5closeAll() -window_size<-getmode(o$tileSize) -mat@assays@data$counts<-mat@assays@data[[useMatrix]] -mat@assays@data[[useMatrix]]<-NULL -rs<-ArchR:::.getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix) -rowRanges(mat)<-ranges -mat<-mat[, match(rownames(ArchRProj@reducedDims$IterativeLSI$matSVD), colnames(mat))] -cds<-new_cell_data_set(expression_data = mat@assays@data$counts, cell_metadata = colData(mat)) -rowRanges(cds)<-rowRanges(mat) -cds<-cds[,rownames(ArchRProj@reducedDims$IterativeLSI$matSVD)] -reducedDims(cds)<-SimpleList(LSI=ArchRProj@reducedDims$IterativeLSI$matSVD, -UMAP=ArchRProj@embeddings$UMAP$df) -irlba_rotation = ArchRProj@reducedDims$IterativeLSI$svd$u -row.names(irlba_rotation) = paste0(ArchRProj@reducedDims$IterativeLSI$LSIFeatures$seqnames, "_", ArchRProj@reducedDims$IterativeLSI$LSIFeatures$idx) -iLSI<-SimpleList(svd=ArchRProj@reducedDims$IterativeLSI$svd, -features=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, -row_sums = ArchRProj@reducedDims$IterativeLSI$rowSm, -seed=ArchRProj@reducedDims$IterativeLSI$seed, -binarize=ArchRProj@reducedDims$IterativeLSI$binarize, -scale_to=ArchRProj@reducedDims$IterativeLSI$scaleTo, -num_dim=ArchRProj@reducedDims$IterativeLSI$nDimensions, -resolution=NULL, -granges=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, -LSI_method=ArchRProj@reducedDims$IterativeLSI$LSIMethod, outliers=NULL) -pp_aux <- SimpleList(iLSI=iLSI, gene_loadings=irlba_rotation) -cds@preprocess_aux <- pp_aux -if(is.null(cds@preprocess_aux$iLSI$granges$end)){ -starts<-cds@preprocess_aux$iLSI$granges[cds@preprocess_aux$iLSI$granges$seqnames %in% cds@preprocess_aux$iLSI$granges$seqnames[1],]$start -width<-getmode(starts[-1]-starts[-length(starts)]) -ranges<-GRanges(seqnames = cds@preprocess_aux$iLSI$granges$seqnames, ranges = IRanges(start = cds@preprocess_aux$iLSI$granges$start, width = width), names=cds@preprocess_aux$iLSI$granges$idx) -}else{ -ranges<-GRanges(seqnames = cds@preprocess_aux$iLSI$granges$seqnames, ranges = IRanges(start = cds@preprocess_aux$iLSI$granges$start, end = cds@preprocess_aux$iLSI$granges$end), names=cds@preprocess_aux$iLSI$granges$idx) -} -cds@preprocess_aux$iLSI$granges<-ranges -cds@clusters[["UMAP"]]$clusters[colnames(exprs(cds))]<-as.character(ArchRProj@cellColData[colnames(exprs(cds)),]$Clusters) -cds@reduce_dim_aux<-SimpleList(UMAP=SimpleList(scale_info=NULL, model_file=ArchRProj@embeddings$UMAP$params$uwotModel, num_dim=cds@preprocess_aux$iLSI$num_dim)) -cds -} -ArchR:::.validInput -install.packages(c("Cairo", "tibble")) -ArchR:::.tabixToTmp -library(ArchR) -library(ArchR) -library(ArchR) -ArchR:::.projectLSI -library(ArchR) -roxygen2::roxygenise() -rm(list = c("exportMonocle3")) -roxygen2::roxygenise() library(ArchR) -m3addon::cut2 -m3addon:::cut2 library(ArchR) diff --git a/R/GRangesUtils.R b/R/GRangesUtils.R index 23cd8990..a34a8604 100644 --- a/R/GRangesUtils.R +++ b/R/GRangesUtils.R @@ -164,5 +164,21 @@ extendGR <- function(gr = NULL, upstream = NULL, downstream = NULL){ return(gr) } - +.featureDFtoGR <- function(featureDF){ + .validInput(input = featureDF, name = "featureDF", valid = c("DataFrame")) + #find what strand is F + if(length(levels(factor(featureDF$strand)))>2){stop("Error with featureDF; more than two strands provided")} + for(qstrand in levels(factor(featureDF$strand))){ + if(all(featureDF[featureDF$strand %in% qstrand,]$start>featureDF[featureDF$strand %in% qstrand,]$end)) + isMinus<-qstrand + else{ + isOther<-qstrand + } + } + minusDF<-featureDF[featureDF$strand %in% isMinus,] + otherDF<-featureDF[featureDF$strand %in% isOther,] + minusGR<-GRanges(seqnames = minusDF$seqnames, ranges = IRanges(start = minusDF$end, end = minusDF$start), names=minusDF$idx, strand = "-") + otherGR<-GRanges(seqnames = otherDF$seqnames, ranges = IRanges(start = otherDF$start, end = otherDF$end), names=otherDF$idx, strand = "+") + return(combine(otherGR, minusGR)) +} diff --git a/R/GroupExport.R b/R/GroupExport.R index 13641fd5..0a81f438 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -276,7 +276,11 @@ exportMonocle3 <- function( width<-getmode(starts[-1]-starts[-length(starts)]) ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) }else{ - ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx) + if(length(levels(factor(featureDF$strand)))>1) + ranges<-.featureDFtoGR(featureDF) + else{ + ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx, strand = featureDF$strand) + } } ArchR:::.logMessage("Getting Group Matrix", logFile=logFile) mat <- tryCatch({ From 56a5dd136b9c029b718272a2c2cb3f3a75d14de6 Mon Sep 17 00:00:00 2001 From: scfurl Date: Thu, 3 Sep 2020 14:21:38 -0700 Subject: [PATCH 25/41] Untrack files in .gitignore --- .DS_Store | Bin 12292 -> 0 bytes .Rhistory | 373 ------------------------------- R/.DS_Store | Bin 10244 -> 0 bytes data/.DS_Store | Bin 6148 -> 0 bytes docs/.DS_Store | Bin 10244 -> 0 bytes docs/articles/.DS_Store | Bin 8196 -> 0 bytes docs/articles/Articles/.DS_Store | Bin 6148 -> 0 bytes man/.DS_Store | Bin 6148 -> 0 bytes src/.DS_Store | Bin 6148 -> 0 bytes 9 files changed, 373 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .Rhistory delete mode 100644 R/.DS_Store delete mode 100644 data/.DS_Store delete mode 100644 docs/.DS_Store delete mode 100644 docs/articles/.DS_Store delete mode 100644 docs/articles/Articles/.DS_Store delete mode 100644 man/.DS_Store delete mode 100644 src/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 17d65fe982a039997bba18ca0a6dbdcd3e7969c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12292 zcmeHNdvH|M8UMZ{gu9o8+#r&>OJLW;n1_L6vr9ISBy1iK0s+z_B;irQK5k{pW;gEL zB!q~jtuxh8Ydb9nVrQ&~GhdOQls55P+V_R##bI!fX zW)o193dOxM_nv#tWA8cVe&6~1e&1ODz?PAa3!n@DBsy8DSOIcm0OveWGt7T;_!)xObpOp74-7}bdZN1e zMa;_1nUgzLvdHt)we9QVL1p1+SR30soCwFFdY=~8DIHYu^xd(sj$ka>71vmKe=rsq z8H(zIN`BBE364bk39UI2=?U-C^nrx7H^J_<>9KgCl~)`HQ(Klds3;@4)~!*4@Tk^C z&2$AVN3GY|9mQqKYrGB3Q}Y+(DftU!d0RN7MHAtVg|+yWv2ZA{d#hg$YSB8O0gvI+$Dvoydy+!+87J5UkfS6B~jm5 zsH)ppNo!oAYshGDeTgdf>eN}qZ&WO=kmcSz;b=(FjaRLxlGQB{e?W^UA&YpA+as&} zqhiLC4Mt{Ny{rxdV?#qU6g?j+jqJuIRo%(n-09a7n}@Y1_3E_o`WEWdR#w&=3b8&( z#Xh!()4_*Z?5h?}7FxS)umXIr4t9VB!!Qo_z-Qn-I09dRZ^3am1wVpk;b-u3_ywGW z-@~i$8oUl~z+3P(0wT(|7z+l9F!*Z-ZH`d`zxC$F^4Q{}VxCuAo0Pey71~G&~ zIEv%A4=3;r{5&4OgLpqagx|oU_$Yo8PvA-Xf#_NmGd^~#7m0brrw4rsg? z4TXaI?bOc6s{{H(nz?3XATt9qXMkZpBO@mFzdU4wM8Z38|Cg+S@L#j&+GWM1H&(B_ zX?2n?r%~i-EIyUEbG9z%IH&0*4d;Y;ie!P!zC>PXs)lqmv4x1ewpU{8T$w9sJMBdh z5pqT1k8%kq3{nlEti)a+NlKO|S#GbgkW5grMOlsPkw_3Ib400EuD6h6P;x|RgWM#M zGEj0wX|vpFVd6!Bi>LSx!%=vg==}@uBD_M>{?A0~-y}*u7xOu#UxJ0W3`>dDSKy7f z9Ba{w^+fGkv5lyGJ9gnmum^jw4+jl;uVEBpcniicf&1|`oWxJyr|=%U7e9-iBf9?u z{31S#M}?s!34X_P!^1~Yt!}g@9*xAJH&Y&4+!4A1W4d97@MDt{pD{J4Bunyq`J+7~ zHG2~N#E9PFk8fvBUH-)GfN|d&i$#+6{y-mz(LrTVYb=`Zhof4YHzwgoRd)2#ca4p; z#73eao&QdcD3BzJWEoV{iHRDQr_$-I-e2jQaJjrLx_8&@-*1r$N?eT{yN1U1P29Tw zw!>nGXy6m%iRa|?0Wq|5;jyff=FrZXLnC=@ov*IzSihmudI=;p6Xd~oEE4I8>0zeS zwykl_mo3a=}vsPfb|wN5b+Ze3(ud_J#9k>_N^cUgq5u~w>0T_TbEPD=5q zg-U+j(q*c3ngeqg&Ps}w&5+^z<)vyl^DXY&qC1t=70jQwkMkVWWpy)$6TUC9YOQt5 z%gi-EWUjI{atBW?Exb>weY4AO)~hz^RhkU%f0BRnq#iFeZD6J_UkWwQ2A!}A;xGaC z!Xfw)9D@_^ZTLP(@+p$ze}KP`&;AwuMt+-x**FJtF^|M}3HRD^tidK+jXvza_1H;L zyc@UU4%|up%7l0nhsjsR3@^Qd{FKS@!}tJxnZ)=>{4RbEPvL2N9$&yI{3X7Euj3o| zcl?j&a?*b{nL`jMzD+4YcZzs@Xm(?Ev@>hIf{pnl9!4TmSzO>ODd(Z3xWZ7S zaH-WH@FN{nOutd)im=ZTn_YDjIj%Qwg*{qJ9rHM@@Ul`zCC3%^vn#3`RwbLqpV*_@ zV|6HVc%+Fv*410BN)C@jvB$LM%c!7bcM{S-9XgAuaT81AK@(XAX+K8<(b-5ga8;vuru zBlsYG6~B&;@G#Ob3LvjcFG9ny}cJSTm|8B8l-~Z4((Y z)yW2(d@-1UK+l+#eYp_GHZkG$)>Jy(9v6oocXeH*v)1FC0YMC6=r}I~9ic*Fd?_$= zzd63tD6g$!z1*2X$=+{dcb0(etN?c|Y)Qf1rA0SzqSy8wg1uzcj6Th`*=>cUkEQ$G zbo62Ta+$++o*;0s!)8n6l13D^w9J+k1g>139t3vP$hNc~aIIIinaGn20x3)d0cbYnkm#cc#PA^bRZ z;3xsj?L-GZ$qC^Ba$Es4kKr*qPA+>2pTwu|C-^J@%~||4w^c|&OuECqJk3}yEK4Xv z+ICrub(%U68x+YenfC2cjp%}cWEu++%HaK|6MKohR3b8EN|FjY>6mkpq)K+BN)nG; zn<`1_VvU?Y(n9|1@!r#J#YOq$~->)T^c9k%Ph0OWSOlK_N?lKTuR ze2`?x*WQ&ZF&4-)pb*A-6<+7in39_jR~+iq66)2sIqKD{^j11O?%MZ+ddU%{;NDfX zyV;l7-TZ&q-Ar}46bbdg?*C;%ZtoOw>$@sLZhY4{4c(Ff;1mEjZOVenC3^}cCOowM zuN0!kRnM0HdiRXw|BwLX^NOCs7yeJlhgSd7v@z_bqm1nVtU3Sx|9GX$B{Kt=8Mr!U z0CU=U+FEFA=H5m6Fxg(alg?dqvV+x|6e({)7h^k~m+`H5$}|3f#`Ansowb`3DQ`y4 nqS*)bCxDCEa?9X9|MO=C|Bb(1P7BDq>oCp~3$|Z@@&Eq<`3TKG diff --git a/.Rhistory b/.Rhistory deleted file mode 100644 index 21bb7651..00000000 --- a/.Rhistory +++ /dev/null @@ -1,373 +0,0 @@ ---- -title: "ArchR Hematopoiesis Tutorial" -author: "Jeffrey Granja" -date: "11/22/2019" -output: html_document ---- -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` -## R Markdown -knitr::opts_chunk$set(echo = TRUE) -knitr::opts_chunk$set(echo = TRUE) -summary(cars) -plot(pressure) -knitr::opts_chunk$set(echo = TRUE) -setwd("~/Documents/Heme_Tutorial/") -data("geneAnnoHg19") -data("genomeAnnoHg19") -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -knitr::opts_chunk$set(echo = TRUE) -#Input Libraries -library(ArchR) -#Set/Create Working Directory to Folder -setwd("~/Documents/Heme_Tutorial/") -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -#Input Libraries -library(ArchR) -#Set/Create Working Directory to Folder -setwd("~/Documents/Heme_Tutorial/") -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -library(knitr) -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -library(knitr) -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -library(knitr) -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -library(ArchR) -#Input Libraries -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -library(knitr) -knitr::opts_chunk$set(echo = TRUE) -opts_knit$set(root.dir = "~/Documents/Heme_Tutorial/") -library(ArchR) -#Load Genome Annotations -data("geneAnnoHg19") -data("genomeAnnoHg19") -#Set Threads to be used -threads <- 8 -pathFragments <- "Heme_Fragments" -inputFiles <- list.files(pathFragments, pattern = ".gz", full.names = TRUE) -names(inputFiles) <- gsub(".fragments.tsv.gz", "", list.files(pathFragments, pattern = ".gz")) -inputFiles <- inputFiles[!grepl(".tbi", inputFiles)] -inputFiles -ArrowFiles <- createArrowFiles( -inputFiles = inputFiles[3], -sampleNames = names(inputFiles), -geneAnno = geneAnnoHg19, -genomeAnno = genomeAnnoHg19, -threads = threads, -force = TRUE -) -ArrowFiles <- createArrowFiles( -inputFiles = inputFiles[3], -sampleNames = names(inputFiles)[3], -geneAnno = geneAnnoHg19, -genomeAnno = genomeAnnoHg19, -threads = threads, -force = TRUE -) -ls -```{r eval=TRUE, cache=TRUE} -ArrowFiles <- createArrowFiles( -inputFiles = inputFiles[3], -sampleNames = names(inputFiles)[3], -geneAnno = geneAnnoHg19, -genomeAnno = genomeAnnoHg19, -threads = threads, -addGeneScoreMat = FALSE, -addTileMat = FALSE, -force = TRUE -) -knitr::opts_chunk$set(echo = TRUE) -knitr::opts_chunk$set(eval = FALSE) -# Small fig.width -knitr::include_graphics("~/Documents/Heme_Tutorial/Heme_Tutorial/Plots/Plot-UMAP-TileLSI_Date-2019-11-22_Time-01-35-25.pdf") -# Small fig.width -knitr::include_graphics("~/Documents/Heme_Tutorial/Heme_Tutorial/Plots/Plot-UMAP-TileLSI_Date-2019-11-22_Time-01-35-25.pdf") -# Small fig.width -knitr::include_graphics("~/Documents/Heme_Tutorial/Heme_Tutorial/Plots/Plot-UMAP-TileLSI_Date-2019-11-22_Time-01-35-25.pdf") -getwd() -"/Users/jeffreygranja/Documents/Heme_Tutorial/Heme_Tutorial/Plots/Plot-UMAP-TileLSI_Date-2019-11-22_Time-01-35-25.pdf -# Small fig.width -knitr::include_graphics("/Users/jeffreygranja/Documents/Heme_Tutorial/Heme_Tutorial/Plots/Plot-UMAP-TileLSI_Date-2019-11-22_Time-01-35-25.pdf") -# Small fig.width -knitr::include_graphics("/Users/jeffreygranja/Documents/Heme_Tutorial/Heme_Tutorial/Plots/Plot-UMAP-TileLSI_Date-2019-11-22_Time-01-35-25.pdf") -"~/Documents/HemeAll/heme/Plots/Plot-Tracks_Date-2019-11-17_Time-17-52-02.pdf" -knitr::include_graphics(path.expand("~/Documents/HemeAll/heme/Plots/Plot-Tracks_Date-2019-11-17_Time-17-52-02.pdf")) -file.copy -list.files() -list.files() -system("cp ~/Documents/HemeAll/heme/Plots/Plot-Tracks_Date-2019-11-17_Time-17-52-02.pdf mychart.pdf") -knitr::include_graphics(path = "mychart.pdf") -"mychart.pdf" -knitr::include_graphics(path = "mychart.pdf")#path.expand("~/Documents/HemeAll/heme/Plots/Plot-Tracks_Date-2019-11-17_Time-17-52-02.pdf")) -knitr::include_graphics(path = "mychart.pdf") -knitr::opts_chunk$set(echo = TRUE) -```{r pressure, echo=FALSE, eval = FALSE} -sessionInfo() -head(sessionInfo()) -suppressPackageStartupMessages() -Sys.info() -.Platform -parallel::detectCores() -try(system("grep MemTotal /proc/meminfo", intern = TRUE), silent = TRUE) -ram = substring(system("sysctl hw.memsize", intern = TRUE), 13) #nocov -ram -ram / 10^9 -as.numeric(ram) / 10^9 -get_windows_ram = function() { -ram = try(system("grep MemTotal /proc/meminfo", intern = TRUE), silent = TRUE) -if (class(ram) != "try-error" && length(ram) != 0) { -ram = strsplit(ram, " ")[[1]] -ram = as.numeric(ram[length(ram) - 1]) -ram_size = ram -} else { -# Fallback: This was the old method I used -# It worked for Windows 7 and below. -ram_size = system("wmic MemoryChip get Capacity", intern = TRUE)[-1] -} -return(ram_size) -} -system_ram = function(os) { -if (length(grep("^linux", os))) { -cmd = "awk '/MemTotal/ {print $2}' /proc/meminfo" -ram = system(cmd, intern = TRUE) -} else if (length(grep("^darwin", os))) { -ram = substring(system("sysctl hw.memsize", intern = TRUE), 13) #nocov -} else if (length(grep("^solaris", os))) { -cmd = "prtconf | grep Memory" # nocov -ram = system(cmd, intern = TRUE) ## Memory size: XXX Megabytes # nocov -} else { -ram = get_windows_ram() # nocov -} -ram -} -#' Get the amount of RAM -#' -#' Attempt to extract the amount of RAM on the current machine. This is OS -#' specific: -#' \itemize{ -#' \item Linux: \code{proc/meminfo} -#' \item Apple: \code{system_profiler -detailLevel mini} -#' \item Windows: \code{memory.size()} -#' \item Solaris: \code{prtconf} -#' } -#' A value of \code{NA} is return if it isn't possible to determine the amount of RAM. -#' @export -#' @references The \code{print.bytes} function was taken from the \pkg{pryr} package. -#' @examples -#' ## Return (and pretty print) the amount of RAM -#' get_ram() -get_ram = function() { -os = R.version$os -ram = suppressWarnings(try(system_ram(os), silent = TRUE)) -if (class(ram) == "try-error" || length(ram) == 0) { -message("\t Unable to detect your RAM. # nocov -Please raise an issue at https://github.com/csgillespie/benchmarkme") # nocov -ram = structure(NA, class = "ram") # nocov -} else { -cleaned_ram = suppressWarnings(try(clean_ram(ram, os), silent = TRUE)) -if (class(cleaned_ram) == "try-error" || length(ram) == 0) { -message("\t Unable to detect your RAM. # nocov -Please raise an issue at https://github.com/csgillespie/benchmarkme") # nocov -ram = structure(NA, class = "ram") #nocov -} else { -ram = structure(cleaned_ram, class = "ram") -} -} -return(ram) -} -#' @rawNamespace S3method(print,ram) -print.ram = function(x, digits = 3, unit_system = c("metric", "iec"), ...) { -#unit_system = match.arg(unit_system) -unit_system = "metric" -base = switch(unit_system, metric = 1000, iec = 1024) -power = min(floor(log(abs(x), base)), 8) -if (is.na(x) || power < 1) { -unit = "B" -} else { -unit_labels = switch( -unit_system, -metric = c("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), -iec = c("KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB") -) -unit = unit_labels[[power]] -x = x / (base^power) -} -formatted = format(signif(x, digits = digits), big.mark = ",", -scientific = FALSE, ...) -cat(unclass(formatted), " ", unit, "\n", sep = "") -invisible(paste(unclass(formatted), unit)) -} -get_ram() -plot(cars) -```{r eval = TRUE} -```{r} -suppressPackageStartupMessages(library(SnapATAC)) -suppressPackageStartupMessages(library(SnapATAC)) -suppressPackageStartupMessages(library(magrittr)) -setwd("/Volumes/JG_SSD_2/Data/Analysis/Tutorial/test-snap") -parallel::detectCores() -Sys.Date() -sessionInfo() -#5k -if(!file.exists("atac_pbmc_5k_nextgem_fragments.tsv.gz")){ -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_5k_nextgem/atac_pbmc_5k_nextgem_fragments.tsv.gz") -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_5k_nextgem/atac_pbmc_5k_nextgem_fragments.tsv.gz.tbi") -} -#10k -if(!file.exists("atac_pbmc_10k_nextgem_fragments.tsv.gz")){ -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_10k_nextgem/atac_pbmc_10k_nextgem_fragments.tsv.gz") -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_10k_nextgem/atac_pbmc_10k_nextgem_fragments.tsv.gz.tbi") -} -#Analysis of 10x Fragment Files -#Install pip install -user snaptools -snapTools <- "/Users/jeffreygranja/Library/Python/2.7/bin/snaptools" -#Fragment Files -fragFiles <- c( -"atac_pbmc_5k_nextgem_fragments.tsv.gz", -"atac_pbmc_10k_nextgem_fragments.tsv.gz" -) -#Input Genome -genome <- "hg19" -if(!file.exists(paste0(genome,".chrom.sizes"))){ -system(paste0("wget http://hgdownload.cse.ucsc.edu/goldenpath/",genome,"/bigZips/",genome,".chrom.sizes")) -} -#Download/Set Up 10x Fragment Files -#5k -if(!file.exists("atac_pbmc_5k_nextgem_fragments.tsv.gz")){ -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_5k_nextgem/atac_pbmc_5k_nextgem_fragments.tsv.gz") -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_5k_nextgem/atac_pbmc_5k_nextgem_fragments.tsv.gz.tbi") -} -#10k -if(!file.exists("atac_pbmc_10k_nextgem_fragments.tsv.gz")){ -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_10k_nextgem/atac_pbmc_10k_nextgem_fragments.tsv.gz") -system("wget http://cf.10xgenomics.com/samples/cell-atac/1.2.0/atac_pbmc_10k_nextgem/atac_pbmc_10k_nextgem_fragments.tsv.gz.tbi") -} -#Analysis of 10x Fragment Files -#Install pip install -user snaptools -snapTools <- "/Users/jeffreygranja/Library/Python/2.7/bin/snaptools" -#Fragment Files -fragFiles <- c( -"atac_pbmc_5k_nextgem_fragments.tsv.gz", -"atac_pbmc_10k_nextgem_fragments.tsv.gz" -) -#Input Genome -genome <- "hg19" -if(!file.exists(paste0(genome,".chrom.sizes"))){ -system(paste0("wget http://hgdownload.cse.ucsc.edu/goldenpath/",genome,"/bigZips/",genome,".chrom.sizes")) -} -setwd("~/Documents/GitHub/ArchR") -pkgdown::build_site() -warnings() -pkgdown::build_site() -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -.callSummitsMACS2 -ArchR:::.callSummitsMACS2 -ArchR:::.writeCoverageToBed -.callSummitsMACS2 -ArchR:::.callSummitsMACS2() -ArchR:::.callSummitsMACS2 -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -.validInput -ArchR::.validInput -ArchR::addArchRAnnotations:::.validInput -ArchR:::.validInput -plot(p[[1]]) -ArchR:::.getAssay -m3addon::get_assay -library(ArchR) -library(ArchR) -library(ArchR) -roxygen2::roxygenize(".") -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) -library(ArchR) diff --git a/R/.DS_Store b/R/.DS_Store deleted file mode 100644 index f00a9343cb1c206a5a68f34118645b3058421346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHM%Tg0T6ulE!VC6xeigKGJD@)gIB7|3!SQzlJG%qnSW~eYhaFvb!;4kD{l_8=5n0AXS+C$082p`AVU+AQ8;}X` zBB^xb9G?NMI3fd)fyh8)ATkgc_!k+#JDX#a&3fH5>tYVu>ItrmUpnw4vIg7; zpG

`*RuMX(YSY{qwtzkOdvd7qsTGqhmFw;}F=6oZ=KAsG;=6(NKeivGnAnlDs^t4$k*6fdZ}@zK~H}!z`X{32yB2O<@u`Rt0)U`V5M@fFSN1U}Lp?T+N67-#YT{<^po;4;|FfH_1yQlN9yF()q` zx(f6d2v)|xVXWY9LY`c^b!oxoM7q}Exf~&0dckw00$%gu;>)s)>g!^5AD=nVl4Y+F ztFnW+spV)3X!b|v|umlNQ~axS-2lZUJWNmN%e(}KV6 z@WeXFLtc|54_^bm4FvrpuM2D|SC?Kz?jlm==uB(m0vg89Wi%Bsq>Q%Et+@ArMyvcXE=y0jol)}e>2$Uf|xAxd|BD@3Qvx)#g8 zjV!JOZ;39Tl+zy$r|XJhube2CtReEsHI}`1g&Yk-nN@aOO*LpToo-fTYI%kp+An%R zeiIj4#mo#IFq7kjY;h%bk##xH%$zE62X|VZKufS|m2DTlruZE5ho}hF^97zv1k81y z6P0;ahw)*i<5nM-1Mgkp`(WN=gT<>4+4po*y*Q2$1J})f_vGF~)^Duu2f*ccuVtv+ z5FQzj4X1+Y@&bIbR`_PQ(#{;=iJg`Pa*ulV>{qcK^ia2FSU>;tWWX|c_mJyA4uGSj zK78oG1G9S1-sDFbORx({-@O>x@*FkK4)S|}HBiKpeHUMmV|dY#**lW!%A8fg!>!6I z%Us{7xkal5*!MK7Km+@8mVwWRcy9Nz`aLvK8AoIwG7uSv3`7R*gn@g;N`vSB+w=eb ze{&x lQF7q9Y30;Ne1mc4{|pG8>%{#(QW5w6JaI5*5dZc5|2H0RNn!v1 diff --git a/data/.DS_Store b/data/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0w3L>fUT7(ldU}CU5UI4K zP)e$(@d5EJQ8ZEXttd|zMH64dd%Ogqc)Oec-Lo43Hv(=1k`bWugAaey25dXZEt@*<#FhYP z(=nMHc#Z1-R>o)BfNe*)WkvCseDwf!QLvX7z>A~bN3)|1*mjg#UYr0gPQZRM*eeuZ zZ^v>zmYqO=Tlefnz>UDf2=K*yki>{ZwAA%`C~AZ-`}?83sAgJz{}+%pEq(fonSvk+ zVurZ8ZND+lW(BRd*$|BFq<5`BYk$bTZa0i*@;VsWrl|wn(!54Pw}P6k##mu3qGFa^ zothpo1{#dG9x>T-+PFgyJc6fNS};6ZQBzs$TUj+y>>Dogm-&l*l~w+c5s#3aU$(Yo zZ|~5-;X@;bpXO}?dww99j#OJ3hBwscE#`?3C8 z`Yg@R&24JTMB6Q8n%L%+u%WlcRO;^x8_{^LZgxvq;b1fzj|MHZJ{oP)4ytCCr4Cy3 zYKLjWtVWixTax0Yx>dz|TEE(axy>#OA4juE;2E1e-U`y0WD(f-ySr>svgnwp3Z*F)Iw3UT@UuES!rI6=YljRGegdn6+y}qy5b@2 zKwPti*s~Vq$l|UDzH+k>p-+oQX9N%P_;O@B7MQSOKaLuyotczCgjN>T3Y=Mj@O*@>%aM7b+$^!8#?%q%Fjlh@YC z@*eu;JA$UQrBBtdR`22KSu1knCPCOvz4eg@)+#Sh$orQy*OM3U+ubb?g{(kkY#_UE zC#sJeAxFtE@-R6;ULvQ-8S)l+mwZG%A)k`Z$XDcRa*2FPejq=SKgnM}06+v8vS9(- z3QM67mO&9zz$#b`YoHd^!6w)YcfuCvg1r!eFhrmi`e6tT!Z6$ikHeGj6dZ@=;RQGe zr{HCH72be1dCk%i!rW-r)HZMqFD4UapDoNilL^ziZoRnS#t8Gv*<6jc%$vVBuVA@< zEKY1~udE%l&=rD@z(E>;StR%tr-R*N+r)U%Y%y|rSUfU=cl zaBscX=%FJ^BG<0JlVpsXMeUs@7g2HFlb=v?f1uuGLKf58Ldb!|P=J~%g5^*GRZtBz zsJljJLfth(E8GQb&<@+6+t!{6Iv8*OVqn1t9EMT22ado|cnBVWM^TGUz;md=7ai(r zaj5UqWa{g0i|J8A??E3`?F=MCFHW63iM?H$4Id<1a~pNeIEguxQCrHtw3(ynF3nzyX$_ zc$J)~2G~SkEY4M?07hP}qNEOO8yE$JiUSzMB~DcoJ}3C;~lBf)`;t56_E#yjLg{8agz zLF4L>K|fU1!v<(U4YorEbmHgA4)(D^HK-vlOo-!W%OC>dUR2@(@Sv?lj*Kyf@+L#Z zxXIFii-bg7>qfwhz)c*1X}oSey8pj!>i_?5;ug47b0gqJ;Cdqf=}m1-4fvGA7KQVH zbg$iqzrFaQ2hBIiEh~a2nuVsb?RdPQ`-*If2GbIIGt?ij^Nn(gDR}(ne+Ibge-?L) Oyu1FVk@z33|NjP;-}WB> diff --git a/docs/articles/.DS_Store b/docs/articles/.DS_Store deleted file mode 100644 index 4a2be0f2ac460ccc71965cdf25c8f72459d1059e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeI1T}&NC6oBXO)6TL|7Q{lgg?lYU+6LQ8prmMk3zr%wRIot#Yk|FY*RpZhz24n> zDMc#L7h|hWR;@oV@xd7DgAbyKe-A!ri4P{0#MGn@#>5vBP1G3Ui=LU;OUj=<)sS>2 z**QCN=FIFl`^`?yy@U{GPwRDrloLWIUQ8-7RvQ$iXVgnmF%RH2VP8glxgaDr#W_Xx0KO^sDFz60)Q8z{lu=(U2r0}72y+7d%HU@x zz*k4RFdt4JDr8Ux5eOo%J_2m}P|`+H#3Sad`Fq@Q;;37SCoR+UB9U()CpRyD+jdF| zXhC7Ynf@tfrr*=NwA-$w##pOQ^QPkd{ea_GEB9LblxfUND5WvS_B7KrQry_o4IFZM z$h385rrk-~y36P37Ya%xDorTmb941g4YlDTjq|nPxw=SQq&D2p7@41!Xjye#bJyhb z?D@GT<}X|kzJdRJAVq6@ePts@EjJSrj^@0Vb@aQeqf&t^7pk3IoyWU-CKM&@8Yc}) z^URFVp?QWop%l63byvc%`%*>*Jse6nR(je-O>siA5@{T4v{_cad0vc8q#VoYb6nFi z9eZThGtPNT$0k~(8Xk3>lo#WZ4VyT>7*)d7=uI+X_mq)xQA*O)9c6p&tv-0Tp{XUd zT%;72$ffemp^WL8amyH-F?DZhL~|2{t(*4QQH-qZnU9)AN-Bm4X~5Q|jpY)hxTt)W zst%{)=HqG8n^meP<-HY^s(e~UFHSf*v(lACDsj!;N>v?Wnpn!fT1NxEc#V2MQZzc? zqFYCAfJ=3$aQjq{6KytzmQ+aZ{$w^D1f`55OzQr?1THD z2KGZ8G(!utLML=VH}t?GFbZRE2F4))7EFT!NyxyHumDfN({K@9fXnbQT!A;?DtrW= zz^CvTdBvaKxk`1_fx9mEVGFZM?$iai#tH#&4wd#NXbXo zDQ`ACAj?V~?gpW4X+`ZezFZIzd$9cPKLiBle{lYD^6u>FA6UN_o&W#< diff --git a/docs/articles/Articles/.DS_Store b/docs/articles/Articles/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Thu, 3 Sep 2020 14:44:32 -0700 Subject: [PATCH 26/41] fixed Monocle3 export of GeneActivityMatrix --- R/GRangesUtils.R | 10 ++++++---- R/GroupExport.R | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/R/GRangesUtils.R b/R/GRangesUtils.R index a34a8604..5ce1479b 100644 --- a/R/GRangesUtils.R +++ b/R/GRangesUtils.R @@ -165,7 +165,7 @@ extendGR <- function(gr = NULL, upstream = NULL, downstream = NULL){ } .featureDFtoGR <- function(featureDF){ - .validInput(input = featureDF, name = "featureDF", valid = c("DataFrame")) + ArchR:::.validInput(input = featureDF, name = "featureDF", valid = c("DataFrame")) #find what strand is F if(length(levels(factor(featureDF$strand)))>2){stop("Error with featureDF; more than two strands provided")} for(qstrand in levels(factor(featureDF$strand))){ @@ -177,8 +177,10 @@ extendGR <- function(gr = NULL, upstream = NULL, downstream = NULL){ } minusDF<-featureDF[featureDF$strand %in% isMinus,] otherDF<-featureDF[featureDF$strand %in% isOther,] - minusGR<-GRanges(seqnames = minusDF$seqnames, ranges = IRanges(start = minusDF$end, end = minusDF$start), names=minusDF$idx, strand = "-") - otherGR<-GRanges(seqnames = otherDF$seqnames, ranges = IRanges(start = otherDF$start, end = otherDF$end), names=otherDF$idx, strand = "+") - return(combine(otherGR, minusGR)) + minusGR<-GRanges(seqnames = minusDF$seqnames, ranges = IRanges(start = minusDF$end, end = minusDF$start), names=minusDF$name, strand = "-") + otherGR<-GRanges(seqnames = otherDF$seqnames, ranges = IRanges(start = otherDF$start, end = otherDF$end), names=otherDF$name, strand = "+") + seqlevels(minusGR) <- seqlevels(ArchRProj@geneAnnotation$genes) + seqlevels(otherGR) <- seqlevels(ArchRProj@geneAnnotation$genes) + return(sort(sortSeqlevels(c(otherGR, minusGR)), ignore.strand=TRUE)) } diff --git a/R/GroupExport.R b/R/GroupExport.R index 0a81f438..449a6644 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -277,7 +277,7 @@ exportMonocle3 <- function( ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) }else{ if(length(levels(factor(featureDF$strand)))>1) - ranges<-.featureDFtoGR(featureDF) + ranges<-ArchR:::.featureDFtoGR(featureDF) else{ ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx, strand = featureDF$strand) } From 627b7ba3c78e3f6241fe4c84b4c090e28cac8d9e Mon Sep 17 00:00:00 2001 From: scfurl Date: Thu, 3 Sep 2020 14:55:08 -0700 Subject: [PATCH 27/41] reorder seqlevels pulling from geneAnnotation slot --- R/GRangesUtils.R | 7 ++++--- R/GroupExport.R | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/R/GRangesUtils.R b/R/GRangesUtils.R index 5ce1479b..670f2332 100644 --- a/R/GRangesUtils.R +++ b/R/GRangesUtils.R @@ -164,8 +164,9 @@ extendGR <- function(gr = NULL, upstream = NULL, downstream = NULL){ return(gr) } -.featureDFtoGR <- function(featureDF){ +.featureDFtoGR <- function(featureDF, seqlevels){ ArchR:::.validInput(input = featureDF, name = "featureDF", valid = c("DataFrame")) + ArchR:::.validInput(input = seqlevels, name = "seqlevels", valid = c("character")) #find what strand is F if(length(levels(factor(featureDF$strand)))>2){stop("Error with featureDF; more than two strands provided")} for(qstrand in levels(factor(featureDF$strand))){ @@ -179,8 +180,8 @@ extendGR <- function(gr = NULL, upstream = NULL, downstream = NULL){ otherDF<-featureDF[featureDF$strand %in% isOther,] minusGR<-GRanges(seqnames = minusDF$seqnames, ranges = IRanges(start = minusDF$end, end = minusDF$start), names=minusDF$name, strand = "-") otherGR<-GRanges(seqnames = otherDF$seqnames, ranges = IRanges(start = otherDF$start, end = otherDF$end), names=otherDF$name, strand = "+") - seqlevels(minusGR) <- seqlevels(ArchRProj@geneAnnotation$genes) - seqlevels(otherGR) <- seqlevels(ArchRProj@geneAnnotation$genes) + seqlevels(minusGR) <- seqlevels + seqlevels(otherGR) <- seqlevels return(sort(sortSeqlevels(c(otherGR, minusGR)), ignore.strand=TRUE)) } diff --git a/R/GroupExport.R b/R/GroupExport.R index 449a6644..578a42d5 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -271,13 +271,14 @@ exportMonocle3 <- function( featureDF <- ArchR:::.getFeatureDF(ArrowFiles, subGroup = useMatrix) Groups <- getCellColData(ArchRProj = ArchRProj) Cells <- ArchRProj$cellNames + seqlevels <- seqlevels(ArchRProj@geneAnnotation$genes) if(is.null(featureDF$end)){ starts<-featureDF[as.character(featureDF$seqnames) %in% as.character(featureDF$seqnames)[1],]$start width<-getmode(starts[-1]-starts[-length(starts)]) ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) }else{ if(length(levels(factor(featureDF$strand)))>1) - ranges<-ArchR:::.featureDFtoGR(featureDF) + ranges<-ArchR:::.featureDFtoGR(featureDF, seqlevels) else{ ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx, strand = featureDF$strand) } From 2534071b923130d2c1be69f5494948a32db31fcc Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 11 Nov 2020 12:01:59 -0800 Subject: [PATCH 28/41] multiple arrows --- R/GroupExport.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/GroupExport.R b/R/GroupExport.R index 13641fd5..d4d6590c 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -267,7 +267,7 @@ exportMonocle3 <- function( ArchR:::.logThis(mget(names(formals()),sys.frame(sys.nframe())), "exportMonocle3 Input-Parameters", logFile = logFile) ArrowFiles <- getArrowFiles(ArchRProj) - ArrowFiles <- ArchR:::.validArrow(ArrowFiles) + ArrowFiles <- sapply(ArrowFiles, ArchR:::.validArrow()) featureDF <- ArchR:::.getFeatureDF(ArrowFiles, subGroup = useMatrix) Groups <- getCellColData(ArchRProj = ArchRProj) Cells <- ArchRProj$cellNames From c48378a5a86f00605bddd9305ae11f5b7addb381 Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 11 Nov 2020 12:03:57 -0800 Subject: [PATCH 29/41] multiplearrows --- R/GroupExport.R | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/R/GroupExport.R b/R/GroupExport.R index 7aa066c5..d4d6590c 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -271,17 +271,12 @@ exportMonocle3 <- function( featureDF <- ArchR:::.getFeatureDF(ArrowFiles, subGroup = useMatrix) Groups <- getCellColData(ArchRProj = ArchRProj) Cells <- ArchRProj$cellNames - seqlevels <- seqlevels(ArchRProj@geneAnnotation$genes) if(is.null(featureDF$end)){ starts<-featureDF[as.character(featureDF$seqnames) %in% as.character(featureDF$seqnames)[1],]$start width<-getmode(starts[-1]-starts[-length(starts)]) ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, width = width), names=featureDF$idx) }else{ - if(length(levels(factor(featureDF$strand)))>1) - ranges<-ArchR:::.featureDFtoGR(featureDF, seqlevels) - else{ - ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx, strand = featureDF$strand) - } + ranges<-GRanges(seqnames = featureDF$seqnames, ranges = IRanges(start = featureDF$start, end = featureDF$end), names=featureDF$idx) } ArchR:::.logMessage("Getting Group Matrix", logFile=logFile) mat <- tryCatch({ From dbe56e7a64eaacc0a274b8507e7c259685682940 Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 11 Nov 2020 12:17:50 -0800 Subject: [PATCH 30/41] multiple arrows --- R/GroupExport.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/GroupExport.R b/R/GroupExport.R index d4d6590c..b33be973 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -267,7 +267,7 @@ exportMonocle3 <- function( ArchR:::.logThis(mget(names(formals()),sys.frame(sys.nframe())), "exportMonocle3 Input-Parameters", logFile = logFile) ArrowFiles <- getArrowFiles(ArchRProj) - ArrowFiles <- sapply(ArrowFiles, ArchR:::.validArrow()) + ArrowFiles <- sapply(ArrowFiles, function(file) ArchR:::.validArrow(file)) featureDF <- ArchR:::.getFeatureDF(ArrowFiles, subGroup = useMatrix) Groups <- getCellColData(ArchRProj = ArchRProj) Cells <- ArchRProj$cellNames From b1ee10581e07646b8048b941212a8c96ce0594a3 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Wed, 28 Oct 2020 21:39:27 -0700 Subject: [PATCH 31/41] merging greanleaf version 1.0 --- .DS_Store | Bin 0 -> 14340 bytes .github/auto-comment.yml | 6 + DESCRIPTION | 9 +- NAMESPACE | 14 + R/AllClasses.R | 49 +++- R/AnnotationPeaks.R | 17 +- R/ArchRBrowser.R | 428 +++++++++++++++++++++++++++++-- R/ArrowRead.R | 138 ++++++++-- R/ArrowUtils.R | 4 + R/Clustering.R | 26 +- R/CreateArrow.R | 53 ++-- R/DoubletsScores.R | 4 +- R/Embedding.R | 4 +- R/GlobalDefaults.R | 13 +- R/GroupExport.R | 104 ++++++++ R/HiddenUtils.R | 32 +++ R/InputData.R | 34 +++ R/IntegrativeAnalysis.R | 163 ++++++++---- R/IterativeLSI.R | 144 ++++++++--- R/LoggerUtils.R | 4 +- R/MarkerFeatures.R | 69 ++++- R/MatrixDeviations.R | 129 +++++++++- R/MatrixGeneExpression.R | 300 ++++++++++++++++++++++ R/MatrixGeneScores.R | 22 +- R/MatrixTiles.R | 14 +- R/ModuleScore.R | 122 +++++++++ R/MultiModal.R | 180 +++++++++++++ R/ProjectMethods.R | 3 + R/QualityControl.R | 149 +++++++---- R/RNAIntegration.R | 35 ++- R/Trajectory.R | 376 ++++++++++++++++++++++++++- R/ValidationUtils.R | 2 +- R/VisualizeData.R | 27 +- README.md | 17 ++ data/geneAnnoHg19test.rda | Bin 0 -> 502826 bytes data/genomeAnnoHg19test.rda | Bin 0 -> 2321 bytes man/.Rhistory | 0 man/addBgdPeaks.Rd | 3 + man/addClusters.Rd | 4 + man/addCoAccessibility.Rd | 3 + man/addCombinedDims.Rd | 38 +++ man/addDeviationsMatrix.Rd | 2 +- man/addGeneExpressionMatrix.Rd | 46 ++++ man/addGeneIntegrationMatrix.Rd | 13 + man/addGeneScoreMatrix.Rd | 19 +- man/addIterativeLSI.Rd | 13 +- man/addModuleScore.Rd | 34 +++ man/addMonocleTrajectory.Rd | 33 +++ man/addMotifAnnotations.Rd | 3 + man/addPeak2GeneLinks.Rd | 6 + man/addSlingShotTrajectories.Rd | 43 ++++ man/createArrowFiles.Rd | 29 +-- man/createGeneAnnotation.Rd | 5 +- man/exportPeakMatrixForSTREAM.Rd | 29 +++ man/getBgdPeaks.Rd | 3 + man/getFragmentsFromProject.Rd | 30 +++ man/getMonocleTrajectories.Rd | 43 ++++ man/getPeak2GeneLinks.Rd | 6 + man/getTestFragments.Rd | 11 + man/getTestProject.Rd | 11 + man/import10xFeatureMatrix.Rd | 23 ++ man/plotBrowserTrack.Rd | 19 +- man/plotFragmentSizes.Rd | 9 + man/plotMarkerHeatmap.Rd | 8 +- man/plotPeak2GeneHeatmap.Rd | 13 + man/plotTSSEnrichment.Rd | 9 + man/plotTrajectoryHeatmap.Rd | 4 +- man/subsetArchRProject.Rd | 5 +- 68 files changed, 2934 insertions(+), 274 deletions(-) create mode 100644 .DS_Store create mode 100644 .github/auto-comment.yml create mode 100644 R/MatrixGeneExpression.R create mode 100644 R/ModuleScore.R create mode 100644 R/MultiModal.R create mode 100644 data/geneAnnoHg19test.rda create mode 100644 data/genomeAnnoHg19test.rda create mode 100644 man/.Rhistory create mode 100644 man/addCombinedDims.Rd create mode 100644 man/addGeneExpressionMatrix.Rd create mode 100644 man/addModuleScore.Rd create mode 100644 man/addMonocleTrajectory.Rd create mode 100644 man/addSlingShotTrajectories.Rd create mode 100644 man/exportPeakMatrixForSTREAM.Rd create mode 100644 man/getFragmentsFromProject.Rd create mode 100644 man/getMonocleTrajectories.Rd create mode 100644 man/getTestFragments.Rd create mode 100644 man/getTestProject.Rd create mode 100644 man/import10xFeatureMatrix.Rd diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..545357e4bee15fa94d4df5875835e1a7e94ff155 GIT binary patch literal 14340 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 + Thank your for raising a issue. We will try and get back to you as soon as possible. + + Please make sure you have given us as much context as possible. + diff --git a/DESCRIPTION b/DESCRIPTION index 4938f119..11143943 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,12 @@ Package: ArchR Type: Package -Date: 2019-05-11 +Date: 2020-10-01 Title: Analyzing single-cell regulatory chromatin in R. +<<<<<<< HEAD Version: 0.9.6 +======= +Version: 1.0.0 +>>>>>>> 2f022a4... Release 1.0.0 (#376) Authors@R: c( person("Jeffrey", "Granja", email = "jgranja.stanford@gmail.com", role = c("aut","cre")), person("Ryan", "Corces", role = "aut")) @@ -73,8 +77,11 @@ Collate: 'MarkerFeatures.R' 'MatrixDeviations.R' 'MatrixFeatures.R' + 'MatrixGeneExpression.R' 'MatrixGeneScores.R' 'MatrixTiles.R' + 'ModuleScore.R' + 'MultiModal.R' 'ProjectMethods.R' 'QualityControl.R' 'RNAIntegration.R' diff --git a/NAMESPACE b/NAMESPACE index 4f64678a..f75dd3fb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -21,17 +21,21 @@ export(addBgdPeaks) export(addCellColData) export(addClusters) export(addCoAccessibility) +export(addCombinedDims) export(addDemuxletResults) export(addDeviationsMatrix) export(addDoubletScores) export(addFeatureCounts) export(addFeatureMatrix) +export(addGeneExpressionMatrix) export(addGeneIntegrationMatrix) export(addGeneScoreMatrix) export(addGroupCoverages) export(addHarmony) export(addImputeWeights) export(addIterativeLSI) +export(addModuleScore) +export(addMonocleTrajectory) export(addMotifAnnotations) export(addPeak2GeneLinks) export(addPeakAnnotations) @@ -40,6 +44,7 @@ export(addPeakSet) export(addProjectSummary) export(addReproduciblePeakSet) export(addSampleColData) +export(addSlingShotTrajectories) export(addTSNE) export(addTileMatrix) export(addTrajectory) @@ -53,7 +58,11 @@ export(createGenomeAnnotation) export(createLogFile) export(enrichHeatmap) export(exportGroupSE) +<<<<<<< HEAD export(exportMonocle3) +======= +export(exportPeakMatrixForSTREAM) +>>>>>>> 2f022a4... Release 1.0.0 (#376) export(extendGR) export(filterChrGR) export(filterDoublets) @@ -77,6 +86,7 @@ export(getExons) export(getFeatures) export(getFootprints) export(getFragmentsFromArrow) +export(getFragmentsFromProject) export(getGeneAnnotation) export(getGenes) export(getGenome) @@ -90,6 +100,7 @@ export(getMarkers) export(getMatches) export(getMatrixFromArrow) export(getMatrixFromProject) +export(getMonocleTrajectories) export(getOutputDirectory) export(getPeak2GeneLinks) export(getPeakAnnotation) @@ -101,6 +112,8 @@ export(getSampleColData) export(getSampleNames) export(getSeqnames) export(getTSS) +export(getTestFragments) +export(getTestProject) export(getTrajectory) export(getTutorialData) export(getValidBarcodes) @@ -111,6 +124,7 @@ export(ggGroup) export(ggHex) export(ggOneToOne) export(ggPoint) +export(import10xFeatureMatrix) export(imputeMatrix) export(installExtraPackages) export(loadArchRProject) diff --git a/R/AllClasses.R b/R/AllClasses.R index 0eb2117d..1d28180a 100644 --- a/R/AllClasses.R +++ b/R/AllClasses.R @@ -611,7 +611,7 @@ saveArchRProject <- function( } message("Saving ArchRProject...") - saveRDS(newProj, file.path(outputDirectory, "Save-ArchR-Project.rds")) + .safeSaveRDS(newProj, file.path(outputDirectory, "Save-ArchR-Project.rds")) if(load){ message("Loading ArchRProject...") @@ -630,6 +630,7 @@ saveArchRProject <- function( #' @param dropCells A boolean indicating whether to drop cells that are not in `ArchRProject` from corresponding Arrow Files. #' @param logFile The path to a file to be used for logging ArchR output. #' @param threads The number of threads to use for parallel execution. +#' @param force If output directory exists overwrite. #' @export subsetArchRProject <- function( ArchRProj = NULL, @@ -637,7 +638,8 @@ subsetArchRProject <- function( outputDirectory = "ArchRSubset", dropCells = TRUE, logFile = NULL, - threads = getArchRThreads() + threads = getArchRThreads(), + force = FALSE ){ .validInput(input = ArchRProj, name = "ArchRProj", valid = "ArchRProj") @@ -646,6 +648,12 @@ subsetArchRProject <- function( outDirOld <- getOutputDirectory(ArchRProj) + if(dir.exists(outputDirectory)){ + if(!force){ + stop("outputDirectory exists! Please set force = TRUE to overwrite existing directory!") + } + } + if(outputDirectory == outDirOld){ stop("outputDirectory must be different than ArchRProj outputDirectory to properly subset!") } @@ -748,12 +756,49 @@ subsetArchRProject <- function( i <- rownames(cD)[i] } + if(length(i) == 1){ + stop("Length of subsetting cells must be greater than 1!") + } + + i <- unique(i) + + #First Subset CellColData x@cellColData <- cD[i, , drop=FALSE] + cellsKeep <- rownames(x@cellColData) + + #Second Remove Impute Weights + if(length(i) != nrow(cD)){ + if(length(x@imputeWeights) != 0){ + message("Dropping ImputeWeights Since You Are Subsetting Cells! ImputeWeights is a cell-x-cell Matrix!") + } + x@imputeWeights <- SimpleList() + } + + #Third Subset ReducedDims + rD <- x@reducedDims + rD2 <- lapply(seq_along(rD), function(x){ + rD[[x]][[1]] <- rD[[x]][[1]][cellsKeep, , drop = FALSE] + rD[[x]] + }) %>% SimpleList() + names(rD2) <- names(rD) + rD <- x@reducedDims + rm(rD, rD2) + + #Fourth Subset Embeddings + eD <- x@embeddings + eD2 <- lapply(seq_along(eD), function(x){ + eD[[x]][[1]] <- eD[[x]][[1]][cellsKeep, , drop = FALSE] + eD[[x]] + }) %>% SimpleList() + names(eD2) <- names(eD) + x@embeddings <- eD2 + rm(eD, eD2) return(x) } + setMethod( f = "colnames", signature = c("x" = "ArchRProject"), diff --git a/R/AnnotationPeaks.R b/R/AnnotationPeaks.R index 5413120a..59319a77 100644 --- a/R/AnnotationPeaks.R +++ b/R/AnnotationPeaks.R @@ -217,9 +217,9 @@ addPeakAnnotations <- function( ArchRProj@peakAnnotation[[name]]$Positions <- savePositions ArchRProj@peakAnnotation[[name]]$Matches <- saveMatches - saveRDS(out, file.path(getOutputDirectory(ArchRProj), "Annotations", paste0(name,"-In-Peaks-Summary.rds")), compress = FALSE) - saveRDS(out$regionPositions, savePositions, compress = FALSE) - saveRDS(out$regionMatches, saveMatches, compress = FALSE) + .safeSaveRDS(out, file.path(getOutputDirectory(ArchRProj), "Annotations", paste0(name,"-In-Peaks-Summary.rds")), compress = FALSE) + .safeSaveRDS(out$regionPositions, savePositions, compress = FALSE) + .safeSaveRDS(out$regionMatches, saveMatches, compress = FALSE) return(ArchRProj) @@ -239,6 +239,7 @@ addPeakAnnotations <- function( #' used from CisBP/JASPAR. By default, this function will attempt to guess the species based on the value from `getGenome()`. #' @param collection If one of the JASPAR motif sets is used via `motifSet`, this parameter allows you to indicate the JASPAR #' collection to be used. See `getMatrixSet()` from `TFBSTools` for all options to supply for collection. +#' @param motifPWMs A custom set of motif PWMs as a PWMList for adding motif annotations. #' @param cutOff The p-value cutoff to be used for motif search. The p-value is determined vs a background set of sequences #' (see `MOODS` for more details on this determination). #' @param width The width in basepairs to consider for motif matches. See the `motimatchr` package for more information. @@ -455,9 +456,9 @@ addMotifAnnotations <- function( ArchRProj@peakAnnotation[[name]]$Positions <- savePositions ArchRProj@peakAnnotation[[name]]$Matches <- saveMatches - saveRDS(out, file.path(getOutputDirectory(ArchRProj), "Annotations", paste0(name,"-In-Peaks-Summary.rds")), compress = FALSE) - saveRDS(out$motifPositions, savePositions, compress = FALSE) - saveRDS(out$motifMatches, saveMatches, compress = FALSE) + .safeSaveRDS(out, file.path(getOutputDirectory(ArchRProj), "Annotations", paste0(name,"-In-Peaks-Summary.rds")), compress = FALSE) + .safeSaveRDS(out$motifPositions, savePositions, compress = FALSE) + .safeSaveRDS(out$motifMatches, saveMatches, compress = FALSE) .endLogging(logFile = logFile) @@ -707,8 +708,8 @@ addArchRAnnotations <- function( ArchRProj@peakAnnotation[[name]]$Positions <- "None" ArchRProj@peakAnnotation[[name]]$Matches <- saveMatches - saveRDS(out, file.path(getOutputDirectory(ArchRProj), "Annotations", paste0(name,"-In-Peaks-Summary.rds")), compress = FALSE) - saveRDS(out$regionMatches, saveMatches, compress = FALSE) + .safeSaveRDS(out, file.path(getOutputDirectory(ArchRProj), "Annotations", paste0(name,"-In-Peaks-Summary.rds")), compress = FALSE) + .safeSaveRDS(out$regionMatches, saveMatches, compress = FALSE) .endLogging(logFile = logFile) diff --git a/R/ArchRBrowser.R b/R/ArchRBrowser.R index 9d18341c..54651b69 100644 --- a/R/ArchRBrowser.R +++ b/R/ArchRBrowser.R @@ -194,7 +194,7 @@ ArchRBrowser <- function( br(), selectizeInput("normATAC", label = "normMethod", - choices = c("ReadsInTSS", "ReadsInPromoter", "nFrags"), + choices = c("ReadsInTSS", "ReadsInPromoter", "nFrags", "None"), multiple = FALSE, options = list(placeholder = 'Select NormMethod'), selected = "ReadsInTSS" @@ -640,8 +640,8 @@ ArchRBrowserTrack <- function(...){ #' @param useGroups A character vector that is used to select a subset of groups by name from the designated `groupBy` column in #' `cellColData`. This limits the groups to be plotted. #' @param plotSummary A character vector containing the features to be potted. Possible values include "bulkTrack" (the ATAC-seq signal), -#' "featureTrack" (i.e. the peak regions), "geneTrack" (line diagrams of genes with introns and exons shown. Blue-colored genes -#' are on the minus strand and red-colored genes are on the plus strand), and "loopTrack" (links between a peak and a gene). +#' "scTrack" (scATAC-seq signal), "featureTrack" (i.e. the peak regions), "geneTrack" (line diagrams of genes with introns and exons shown. +#' Blue-colored genes are on the minus strand and red-colored genes are on the plus strand), and "loopTrack" (links between a peak and a gene). #' @param sizes A numeric vector containing up to 3 values that indicate the sizes of the individual components passed to `plotSummary`. #' The order must be the same as `plotSummary`. #' @param features A `GRanges` object containing the "features" to be plotted via the "featureTrack". This should be thought of as a @@ -651,6 +651,8 @@ ArchRBrowserTrack <- function(...){ #' A "loopTrack" draws an arc between two genomic regions that show some type of interaction. This type of track can be used #' to display chromosome conformation capture data or co-accessibility links obtained using `getCoAccessibility()`. #' @param geneSymbol If `region` is not supplied, plotting can be centered at the transcription start site corresponding to the gene symbol(s) passed here. +#' @param useMatrix If supplied geneSymbol, one can plot the corresponding GeneScores/GeneExpression within this matrix. I.E. "GeneScoreMatrix" +#' @param log2Norm If supplied geneSymbol, Log2 normalize the corresponding GeneScores/GeneExpression matrix before plotting. #' @param upstream The number of basepairs upstream of the transcription start site of `geneSymbol` to extend the plotting window. #' If `region` is supplied, this argument is ignored. #' @param downstream The number of basepairs downstream of the transcription start site of `geneSymbol` to extend the plotting window. @@ -663,6 +665,8 @@ ArchRBrowserTrack <- function(...){ #' @param threads The number of threads to use for parallel execution. #' @param ylim The numeric quantile y-axis limit to be used for for "bulkTrack" plotting. If not provided, the y-axis limit will be c(0, 0.999). #' @param baseSize The numeric font size to be used in the plot. This applies to all plot labels. +#' @param scTileSize The width of the tiles in scTracks. Larger numbers may make cells overlap more. Default is 0.5 for about 100 cells. +#' @param scCellsMax The maximum number of cells for scTracks. #' @param borderWidth The numeric line width to be used for plot borders. #' @param tickWidth The numeric line width to be used for axis tick marks. #' @param facetbaseSize The numeric font size to be used in the facets (gray boxes used to provide track labels) of the plot. @@ -681,6 +685,8 @@ plotBrowserTrack <- function( features = getPeakSet(ArchRProj), loops = getCoAccessibility(ArchRProj), geneSymbol = NULL, + useMatrix = NULL, + log2Norm = TRUE, upstream = 50000, downstream = 50000, tileSize = 250, @@ -689,6 +695,8 @@ plotBrowserTrack <- function( threads = getArchRThreads(), ylim = NULL, baseSize = 7, + scTileSize = 0.5, + scCellsMax = 100, borderWidth = 0.4, tickWidth = 0.4, facetbaseSize = 7, @@ -707,6 +715,8 @@ plotBrowserTrack <- function( .validInput(input = features, name = "features", valid = c("granges", "grangeslist", "null")) .validInput(input = loops, name = "loops", valid = c("granges", "grangeslist", "null")) .validInput(input = geneSymbol, name = "geneSymbol", valid = c("character", "null")) + .validInput(input = useMatrix, name = "useMatrix", valid = c("character", "null")) + .validInput(input = log2Norm, name = "log2Norm", valid = c("boolean")) .validInput(input = upstream, name = "upstream", valid = c("integer")) .validInput(input = downstream, name = "downstream", valid = c("integer")) .validInput(input = tileSize, name = "tileSize", valid = c("integer")) @@ -715,6 +725,8 @@ plotBrowserTrack <- function( .validInput(input = threads, name = "threads", valid = c("integer")) .validInput(input = ylim, name = "ylim", valid = c("numeric", "null")) .validInput(input = baseSize, name = "baseSize", valid = "numeric") + .validInput(input = scTileSize, name = "scTileSize", valid = "numeric") + .validInput(input = scCellsMax, name = "scCellsMax", valid = "integer") .validInput(input = borderWidth, name = "borderWidth", valid = "numeric") .validInput(input = tickWidth, name = "tickWidth", valid = "numeric") .validInput(input = facetbaseSize, name = "facetbaseSize", valid = "numeric") @@ -743,6 +755,23 @@ plotBrowserTrack <- function( region <- .validGRanges(region) .logThis(region, "region", logFile = logFile) + if(is.null(geneSymbol)){ + useMatrix <- NULL + } + + if(!is.null(useMatrix)){ + featureMat <- .getMatrixValues( + ArchRProj = ArchRProj, + matrixName = useMatrix, + name = mcols(region)$symbol + ) + if(log2Norm){ + featureMat <- log2(featureMat + 1) + } + featureMat <- data.frame(t(featureMat)) + featureMat$Group <- getCellColData(ArchRProj, groupBy, drop = FALSE)[rownames(featureMat), 1] + } + ggList <- lapply(seq_along(region), function(x){ plotList <- list() @@ -772,6 +801,32 @@ plotBrowserTrack <- function( logFile = logFile) + theme(plot.margin = unit(c(0.35, 0.75, 0.35, 0.75), "cm")) } + ########################################################## + # Bulk Tracks + ########################################################## + if("sctrack" %in% tolower(plotSummary)){ + .logDiffTime(sprintf("Adding SC Tracks (%s of %s)",x,length(region)), t1=tstart, verbose=verbose, logFile=logFile) + plotList$sctrack <- .scTracks( + ArchRProj = ArchRProj, + region = region[x], + tileSize = tileSize, + groupBy = groupBy, + threads = threads, + minCells = 5, + maxCells = scCellsMax, + pal = pal, + baseSize = baseSize, + borderWidth = borderWidth, + tickWidth = tickWidth, + scTileSize = scTileSize, + facetbaseSize = facetbaseSize, + geneAnnotation = geneAnnotation, + title = title, + useGroups = useGroups, + tstart = tstart, + logFile = logFile) + theme(plot.margin = unit(c(0.35, 0.75, 0.35, 0.75), "cm")) + } + ########################################################## # Feature Tracks ########################################################## @@ -832,24 +887,44 @@ plotBrowserTrack <- function( # } sizes <- sizes[tolower(names(plotList))] - .logThis(names(plotList), sprintf("(%s of %s) names(plotList)",x,length(region)), logFile=logFile) - .logThis(sizes, sprintf("(%s of %s) sizes",x,length(region)), logFile=logFile) - #.logThis(nullSummary, sprintf("(%s of %s) nullSummary",x,length(region)), logFile=logFile) - .logDiffTime("Plotting", t1=tstart, verbose=verbose, logFile=logFile) - - tryCatch({ - suppressWarnings(ggAlignPlots(plotList = plotList, sizes=sizes, draw = FALSE)) - }, error = function(e){ - .logMessage("Error with plotting, diagnosing each element", verbose = TRUE, logFile = logFile) - for(i in seq_along(plotList)){ - tryCatch({ - print(plotList[[i]]) - }, error = function(f){ - .logError(f, fn = names(plotList)[i], info = "", errorList = NULL, logFile = logFile) - }) - } - .logError(e, fn = "ggAlignPlots", info = "", errorList = NULL, logFile = logFile) - }) + if(!is.null(useMatrix)){ + + suppressWarnings(.combinedFeaturePlot( + plotList = plotList, + log2Norm = log2Norm, + featureMat = featureMat, + feature = region[x]$symbol[[1]], + useMatrix = useMatrix, + pal = pal, + sizes = sizes, + baseSize = baseSize, + facetbaseSize = facetbaseSize, + borderWidth = borderWidth, + tickWidth = tickWidth + )) + + }else{ + + .logThis(names(plotList), sprintf("(%s of %s) names(plotList)",x,length(region)), logFile=logFile) + .logThis(sizes, sprintf("(%s of %s) sizes",x,length(region)), logFile=logFile) + #.logThis(nullSummary, sprintf("(%s of %s) nullSummary",x,length(region)), logFile=logFile) + .logDiffTime("Plotting", t1=tstart, verbose=verbose, logFile=logFile) + + tryCatch({ + suppressWarnings(ggAlignPlots(plotList = plotList, sizes=sizes, draw = FALSE)) + }, error = function(e){ + .logMessage("Error with plotting, diagnosing each element", verbose = TRUE, logFile = logFile) + for(i in seq_along(plotList)){ + tryCatch({ + print(plotList[[i]]) + }, error = function(f){ + .logError(f, fn = names(plotList)[i], info = "", errorList = NULL, logFile = logFile) + }) + } + .logError(e, fn = "ggAlignPlots", info = "", errorList = NULL, logFile = logFile) + }) + + } }) @@ -996,8 +1071,9 @@ plotBrowserTrack <- function( } tabGroups <- table(cellGroups) - if(any(tabGroups) > maxCells){ - splitGroups <- split(rownames(cellGroups), cellGroups[,1]) + if(any(tabGroups > maxCells)){ + cellGroups2 <- getCellColData(ArchRProj, groupBy, drop = FALSE) + splitGroups <- split(rownames(cellGroups2), cellGroups2[,1]) useCells <- lapply(seq_along(splitGroups), function(x){ if(length(splitGroups[[x]]) > maxCells){ sample(splitGroups[[x]], maxCells) @@ -1020,7 +1096,7 @@ plotBrowserTrack <- function( ArrowFiles <- ArrowFiles[names(cellsBySample)] groupMat <- .safelapply(seq_along(ArrowFiles), function(i){ - .logMessage(sprintf("Getting Region From Arrow Files %s of %s", i, length(ArrowFiles))) + .logMessage(sprintf("Getting Region From Arrow Files %s of %s", i, length(ArrowFiles)), logFile = logFile) tryCatch({ .regionSumArrows( ArrowFile = ArrowFiles[i], @@ -1101,6 +1177,9 @@ plotBrowserTrack <- function( groupNormFactors <- unlist(lapply(split(v, g), sum)) }else if(tolower(normMethod) == "ncells"){ groupNormFactors <- table(g) + }else if(tolower(normMethod) == "none"){ + groupNormFactors <- rep(10^4, length(g)) + names(groupNormFactors) <- g }else{ stop("Norm Method Not Recognized : ", normMethod) } @@ -1365,6 +1444,8 @@ plotBrowserTrack <- function( pal <- paletteDiscrete(set = "stallion", values = rev(unique(paste0(featureO$name)))) } + featureO$name <- factor(paste0(featureO$name), levels=names(featureList)) + p <- ggplot(data = featureO, aes(color = name)) + facet_grid(facet~.) + geom_segment(data = featureO, aes(x = start, xend = end, y = name, yend = name, color = name), size=featureWidth) + @@ -1546,3 +1627,302 @@ plotBrowserTrack <- function( return(gr) } +####################################################### +# scATAC Track Methods +####################################################### + +.scTracks <- function( + ArchRProj = NULL, + region = NULL, + tileSize = 100, + minCells = 5, + maxCells = 100, + groupBy = "Clusters", + useGroups = NULL, + threads = 1, + baseSize = 7, + scTileSize = 0.5, + borderWidth = 0.4, + tickWidth = 0.4, + facetbaseSize = 7, + geneAnnotation = getGeneAnnotation(ArchRProj), + title = "", + pal = NULL, + tstart = NULL, + verbose = FALSE, + logFile = NULL + ){ + + .requirePackage("ggplot2", source = "cran") + + if(is.null(tstart)){ + tstart <- Sys.time() + } + + #Group Info + cellGroups <- getCellColData(ArchRProj, groupBy, drop = TRUE) + if(!is.null(minCells)){ + ArchRProj@cellColData <- ArchRProj@cellColData[cellGroups %bcin% names(table(cellGroups)[table(cellGroups) >= minCells]),,drop=FALSE] + cellGroups <- getCellColData(ArchRProj, groupBy, drop = TRUE) + } + if(!is.null(useGroups)){ + ArchRProj@cellColData <- ArchRProj@cellColData[cellGroups %bcin% useGroups,,drop=FALSE] + cellGroups <- getCellColData(ArchRProj, groupBy, drop = TRUE) + } + tabGroups <- table(cellGroups) + + if(any(tabGroups > maxCells)){ + cellGroups2 <- getCellColData(ArchRProj, groupBy, drop = FALSE) + splitGroups <- split(rownames(cellGroups2), cellGroups2[,1]) + useCells <- lapply(seq_along(splitGroups), function(x){ + if(length(splitGroups[[x]]) > maxCells){ + sample(splitGroups[[x]], maxCells) + }else{ + splitGroups[[x]] + } + }) %>% unlist + ArchRProj@cellColData <- ArchRProj@cellColData[useCells,,drop=FALSE] + cellGroups <- getCellColData(ArchRProj, groupBy, drop = TRUE) + tabGroups <- table(cellGroups) + } + + cellsBySample <- split(rownames(getCellColData(ArchRProj)), getCellColData(ArchRProj, "Sample", drop = TRUE)) + groupsBySample <- split(cellGroups, getCellColData(ArchRProj, "Sample", drop = TRUE)) + uniqueGroups <- gtools::mixedsort(unique(cellGroups)) + + #Tile Region + regionTiles <- seq(trunc(start(region) / tileSize), trunc(end(region) / tileSize) + 1) * tileSize + ArrowFiles <- getArrowFiles(ArchRProj) + ArrowFiles <- ArrowFiles[names(cellsBySample)] + + groupMat <- .safelapply(seq_along(ArrowFiles), function(i){ + .logMessage(sprintf("Getting Region From Arrow Files %s of %s", i, length(ArrowFiles)), logFile = logFile) + tryCatch({ + .regionSCArrows( + ArrowFile = ArrowFiles[i], + region = region, + regionTiles = regionTiles, + tileSize = tileSize, + cellNames = cellsBySample[[names(ArrowFiles)[i]]], + cellGroups = groupsBySample[[names(ArrowFiles)[i]]], + uniqueGroups = uniqueGroups + ) + }, error = function(e){ + errorList <- list( + ArrowFile = ArrowFiles[i], + region = region, + regionTiles = regionTiles, + tileSize = tileSize, + cellNames = cellsBySample[[names(ArrowFiles)[i]]], + cellGroups = groupsBySample[[names(ArrowFiles)[i]]], + uniqueGroups = uniqueGroups + ) + .logError(e, fn = ".groupRegionSCArrows", info = .sampleName(ArrowFiles[i]), errorList = errorList, logFile = logFile) + }) + }, threads = threads) %>% Reduce("cbind" , .) + + groupDF <- data.frame(Matrix::summary(groupMat)) + groupDF$group <- getCellColData(ArchRProj, groupBy, drop = FALSE)[colnames(groupMat)[groupDF$j], 1] + groupDF <- lapply(split(groupDF, groupDF$group), function(z){ + nz <- tabGroups[z$group[1]] + nc <- length(unique(z$j)) + idx <- sort(sample(seq_len(nz), nc)) + idx[1] <- 1 + idx[length(idx)] <- nz + z$y <- idx[match(z$j, unique(z$j))] + z + }) %>% Reduce("rbind", .) + groupDF$bp <- regionTiles[groupDF$i] + + if(is.null(pal)){ + pal <- suppressWarnings(paletteDiscrete(values = names(tabGroups))) + } + + nn <- paste0(names(tabGroups), ":", tabGroups) + names(nn) <- names(tabGroups) + groupDF$group2 <- nn[groupDF$group] + names(pal) <- nn[names(pal)] + + title <- paste0(as.character(seqnames(region)),":", start(region)-1, "-", end(region), " ", title) + + p <- ggplot(groupDF, aes(x=bp, y=y, width = tileSize, fill = group2, color = group2)) + + geom_tile(size = scTileSize) + + facet_grid(group2 ~ ., scales="free_y") + + theme_ArchR() + + scale_color_manual(values = pal) + + scale_fill_manual(values = pal) + + ylab("Binarized SC Coverage") + + scale_x_continuous(limits = c(start(region), end(region)), expand = c(0,0)) + + theme_ArchR(baseSize = baseSize, + baseRectSize = borderWidth, + baseLineSize = tickWidth, + legendPosition = "right", + axisTickCm = 0.1) + + theme(panel.spacing= unit(0, "lines"), + axis.title.x=element_blank(), + axis.text.y=element_blank(), + axis.ticks.y=element_blank(), + strip.text = element_text( + size = facetbaseSize, + color = "black", + margin = margin(0,0.35,0,0.35, "cm")), + strip.text.y = element_text(angle = 0), + strip.background = element_rect(color="black")) + + guides(fill = FALSE, colour = FALSE) + ggtitle(title) + + p + +} + +.regionSCArrows <- function( + ArrowFile = NULL, + region = NULL, + regionTiles = NULL, + tileSize = NULL, + cellNames = NULL, + cellGroups = NULL, + uniqueGroups = NULL, + logFile = NULL + ){ + + cellFragsRegion <- .getFragsFromArrow( + ArrowFile = ArrowFile, + chr = paste0(seqnames(region)), + cellNames = cellNames, + out = "GRanges" + ) %>% subsetByOverlaps(., region, ignore.strand = TRUE) + + #Starts + ts <- match(trunc(start(cellFragsRegion)/tileSize) * tileSize, regionTiles, nomatch = 0) + ids <- which(ts > 0) + + #Ends + te <- match(trunc(start(cellFragsRegion)/tileSize) * tileSize, regionTiles, nomatch = 0) + ide <- which(te > 0) + + #Match + matchID <- S4Vectors::match(mcols(cellFragsRegion)$RG, cellNames) + + #Sparse Matrix + mat <- Matrix::sparseMatrix( + i = c(ts[ids], te[ide]), + j = as.vector(c(matchID[ids], matchID[ide])), + x = rep(1, length(ids) + length(ide)), + dims = c(length(regionTiles), length(cellNames)) + ) + colnames(mat) <- cellNames + + mat@x[mat@x > 1] <- 1 + + return(mat) + +} + + + +#################################### +# Combined Feature Plot +#################################### + +.combinedFeaturePlot <- function( + plotList = NULL, + useMatrix = NULL, + featureMat = NULL, + log2Norm = FALSE, + feature = NULL, + pal = NULL, + sizes = NULL, + baseSize = NULL, + facetbaseSize = NULL, + borderWidth = NULL, + tickWidth = NULL + ){ + + .requirePackage("patchwork", installInfo = "devtools::install_github('thomasp85/patchwork')") + + if(is.null(pal)){ + pal <- paletteDiscrete(values=featureMat$Group, set = "stallion") + } + + if(log2Norm){ + title <- paste0("Log2 ", useMatrix, " : ", feature) + }else{ + title <- paste0("Raw ", useMatrix, " : ", feature) + } + + featurePlot <- ggGroup( + x = featureMat$Group, + y = featureMat[,feature], + groupOrder = gtools::mixedsort(paste0(unique(featureMat$Group))), + pal = pal + ) + + facet_wrap(x~., ncol=1,scales="free_y",strip.position="right") + + guides(fill = FALSE, colour = FALSE) + + theme_ArchR(baseSize = baseSize, + baseRectSize = borderWidth, + baseLineSize = tickWidth, + legendPosition = "right", + axisTickCm = 0.1) + + theme(panel.spacing= unit(0, "lines"), + axis.title.x=element_blank(), + axis.title.y=element_blank(), + axis.text.y=element_blank(), + axis.ticks.y=element_blank(), + strip.text = element_text( + size = facetbaseSize, + color = "black", + margin = margin(0,0.35,0,0.35, "cm")), + strip.text.y = element_text(angle = 0), + strip.background = element_rect(color="black")) + + theme(plot.margin = unit(c(0.35, 0.15, 0.35, 0.15), "cm")) + + ggtitle(title) + + if(any(tolower(names(plotList)) %in% "bulktrack")){ + + idx <- which(tolower(names(plotList)) == "bulktrack") + + p <- plotList[[idx]] + featurePlot + plot_spacer() + + plotList[idx] <- NULL + + for(i in seq_along(plotList)){ + p <- p + plotList[[i]] + plot_spacer() + plot_spacer() + } + + p <- p + plot_layout( + ncol = 3, + widths = c(3, 1, 0.2), + heights = sizes + ) + + }else{ + + + idx <- which(tolower(names(plotList)) == "sctrack") + + p <- plotList[[idx]] + featurePlot + plot_spacer() + + plotList[idx] <- NULL + + for(i in seq_along(plotList)){ + p <- p + plotList[[i]] + plot_spacer() + plot_spacer() + } + + p <- p + plot_layout( + ncol = 3, + widths = c(3, 1, 0.2), + heights = sizes + ) + + } + + p + +} + + + + + + + diff --git a/R/ArrowRead.R b/R/ArrowRead.R index 4fe5bdc1..0fa26ae1 100644 --- a/R/ArrowRead.R +++ b/R/ArrowRead.R @@ -2,6 +2,62 @@ # Reading fragments from Arrow Files #################################################################### +#' Get the fragments from an ArchRProject +#' +#' This function retrieves the fragments from a given ArchRProject as a GRangesList object. +#' +#' @param ArchRProject An `ArchRProject` object to get fragments from. +#' @param subsetBy A Genomic Ranges object to subset fragments by. +#' @param cellNames A character vector indicating the cell names of a subset of cells from which fragments whould be extracted. +#' This allows for extraction of fragments from only a subset of selected cells. By default, this function will extract all cells +#' from the provided ArrowFile using `getCellNames()`. +#' @param verbose A boolean value indicating whether to use verbose output during execution of this function. Can be set to `FALSE` for a cleaner output. +#' @param logFile The path to a file to be used for logging ArchR output. +#' @export +getFragmentsFromProject <- function( + ArchRProj = NULL, + subsetBy = NULL, + cellNames = NULL, + verbose = FALSE, + logFile = createLogFile("getFragmentsFromProject") + ){ + + .validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) + .validInput(input = subsetBy, name = "subsetBy", valid = c("GRanges", "null")) + .validInput(input = cellNames, name = "cellNames", valid = c("character","null")) + .validInput(input = verbose, name = "verbose", valid = c("boolean")) + + ArrowFiles <- getArrowFiles(ArchRProj) + + if(!is.null(subsetBy)){ + chr <- paste0(unique(seqnames(subsetBy))) + }else{ + chr <- NULL + } + + ArchR:::.startLogging(logFile = logFile) + + FragmentsList <- lapply(seq_along(ArrowFiles), function(x){ + message(sprintf("Reading ArrowFile %s of %s", x, length(ArrowFiles))) + fragx <- getFragmentsFromArrow( + ArrowFile = ArrowFiles[x], + chr = chr, + cellNames = cellNames, + verbose = verbose, + logFile = logFile + ) + if(!is.null(subsetBy)){ + fragx <- subsetByOverlaps(fragx, subsetBy, ignore.strand = TRUE) + } + fragx + }) %>% SimpleList + + names(FragmentsList) <- names(ArrowFiles) + + FragmentsList + +} + #' Get the fragments from an ArrowFile #' #' This function retrieves the fragments from a given ArrowFile as a GRanges object. @@ -217,6 +273,10 @@ getMatrixFromProject <- function( cellNames <- ArchRProj$cellNames + avMat <- getAvailableMatrices(ArchRProj) + if(useMatrix %ni% avMat){ + stop("useMatrix is not in Available Matrices see getAvailableMatrices") + } seL <- .safelapply(seq_along(ArrowFiles), function(x){ @@ -268,6 +328,16 @@ getMatrixFromProject <- function( stop("Error with rowData being equal for every sample!") } + #RowRanges + .logDiffTime("Organizing rowRanges", t1 = tstart, verbose = verbose, logFile = logFile) + rR1 <- rowRanges(seL[[1]]) + rR <- lapply(seq_along(seL), function(x){ + identical(rowRanges(seL[[x]]), rR1) + }) %>% unlist %>% all + if(!rR){ + stop("Error with rowRanges being equal for every sample!") + } + #Assays nAssays <- names(assays(seL[[1]])) asy <- lapply(seq_along(nAssays), function(i){ @@ -280,14 +350,18 @@ getMatrixFromProject <- function( names(asy) <- nAssays .logDiffTime("Constructing SummarizedExperiment", t1 = tstart, verbose = verbose, logFile = logFile) - se <- SummarizedExperiment(assays = asy, colData = cD, rowData = rD1) + if(!is.null(rR1)){ + se <- SummarizedExperiment(assays = asy, colData = cD, rowRanges = rR1) + }else{ + se <- SummarizedExperiment(assays = asy, colData = cD, rowData = rD1) + } rm(seL) gc() .logDiffTime("Finished Matrix Creation", t1 = tstart, verbose = verbose, logFile = logFile) se - + } #' Get a data matrix stored in an ArrowFile @@ -687,7 +761,7 @@ getMatrixFromArrow <- function( #Save Temporary Matrix outx <- paste0(tmpPath, "-", .sampleName(ArrowFiles[x]), ".rds") - saveRDS(matx, outx, compress = FALSE) + .safeSaveRDS(matx, outx, compress = FALSE) #Sample Matrix matx <- matx[, which(colnames(matx) %in% sampledCellNames),drop = FALSE] @@ -709,7 +783,8 @@ getMatrixFromArrow <- function( matFiles <- lapply(mat, function(x) x[[2]]) %>% Reduce("c", .) mat <- lapply(mat, function(x) x[[1]]) %>% Reduce("cbind", .) - mat <- mat[,sampledCellNames] + mat <- mat[,sampledCellNames, drop = FALSE] + mat <- .checkSparseMatrix(mat, length(sampledCellNames)) .logDiffTime("Successfully Created Partial Matrix", tstart, verbose = verbose) @@ -718,7 +793,8 @@ getMatrixFromArrow <- function( }else{ mat <- Reduce("cbind", mat) - mat <- mat[,cellNames] + mat <- mat[,cellNames, drop = FALSE] + mat <- .checkSparseMatrix(mat, length(cellNames)) .logDiffTime("Successfully Created Partial Matrix", tstart, verbose = verbose) @@ -729,6 +805,26 @@ getMatrixFromArrow <- function( } +.checkSparseMatrix <- function(x, ncol = NULL){ + isSM <- is(x, 'sparseMatrix') + if(!isSM){ + if(is.null(ncol)){ + stop("ncol must not be NULL if x is not a matrix!") + } + cnames <- tryCatch({ + names(x) + }, error = function(e){ + colnames(x) + }) + if(length(cnames) != ncol){ + stop("cnames != ncol!") + } + x <- Matrix::Matrix(matrix(x, ncol = ncol), sparse=TRUE) + colnames(x) <- cnames + } + x +} + ######################################################################## # Compute Summary Statistics! ######################################################################## @@ -794,22 +890,23 @@ getMatrixFromArrow <- function( ArrowFiles = NULL, seqnames = NULL, useMatrix = NULL, + useLog2 = FALSE, threads = 1 ){ .combineVariances <- function(dfMeans = NULL, dfVars = NULL, ns = NULL){ - #https://rdrr.io/cran/fishmethods/src/R/combinevar.R + #https://rdrr.io/cran/fishmethods/src/R/combinevar.R - if(ncol(dfMeans) != ncol(dfVars) | ncol(dfMeans) != length(ns)){ - stop("Means Variances and Ns lengths not identical") - } + if(ncol(dfMeans) != ncol(dfVars) | ncol(dfMeans) != length(ns)){ + stop("Means Variances and Ns lengths not identical") + } - combinedMeans <- rowSums(t(t(dfMeans) * ns)) / sum(ns) - summedVars <- rowSums(t(t(dfVars) * (ns - 1)) + t(t(dfMeans^2) * ns)) - combinedVars <- (summedVars - sum(ns)*combinedMeans^2)/(sum(ns)-1) + combinedMeans <- rowSums(t(t(dfMeans) * ns)) / sum(ns) + summedVars <- rowSums(t(t(dfVars) * (ns - 1)) + t(t(dfMeans^2) * ns)) + combinedVars <- (summedVars - sum(ns)*combinedMeans^2)/(sum(ns)-1) - data.frame(combinedVars = combinedVars, combinedMeans = combinedMeans) + data.frame(combinedVars = combinedVars, combinedMeans = combinedMeans) } @@ -828,6 +925,8 @@ getMatrixFromArrow <- function( length(.availableCells(ArrowFiles[y], useMatrix)) }) %>% unlist + + #Compute RowVars summaryDF <- .safelapply(seq_along(featureDF), function(x){ @@ -837,11 +936,18 @@ getMatrixFromArrow <- function( varx <- matrix(NA, ncol = length(ArrowFiles), nrow = nrow(featureDF[[x]])) for(y in seq_along(ArrowFiles)){ - meanx[, y] <- h5read(ArrowFiles[y], paste0(useMatrix, "/", seqx, "/rowMeans")) - varx[, y] <- h5read(ArrowFiles[y], paste0(useMatrix, "/", seqx, "/rowVars")) + + if(useLog2){ + meanx[, y] <- h5read(ArrowFiles[y], paste0(useMatrix, "/", seqx, "/rowMeansLog2")) + varx[, y] <- h5read(ArrowFiles[y], paste0(useMatrix, "/", seqx, "/rowVarsLog2")) + }else{ + meanx[, y] <- h5read(ArrowFiles[y], paste0(useMatrix, "/", seqx, "/rowMeans")) + varx[, y] <- h5read(ArrowFiles[y], paste0(useMatrix, "/", seqx, "/rowVars")) + } + } - cbind(featureDF[[x]], DataFrame(.combineVariances(meanx, varx, ns))) + cbind(featureDF[[x]], DataFrame(.combineVariances(meanx, varx, ns))) }, threads = threads) %>% Reduce("rbind", .) diff --git a/R/ArrowUtils.R b/R/ArrowUtils.R index 33eaafe7..7fa584b5 100644 --- a/R/ArrowUtils.R +++ b/R/ArrowUtils.R @@ -473,6 +473,7 @@ cellNames <- paste0(sampleName, "#", .h5read(inArrow, paste0(groupName, "/Info/CellNames"))) featureDF <- .getFeatureDF(ArrowFile = inArrow, subGroup = groupName) + seqOrder <- c("Info", seqOrder[!grepl("Info", seqOrder)]) for(j in seq_along(seqOrder)){ @@ -546,3 +547,6 @@ outArrow } + + + diff --git a/R/Clustering.R b/R/Clustering.R index 6a9f0f40..d0bb4160 100644 --- a/R/Clustering.R +++ b/R/Clustering.R @@ -27,6 +27,8 @@ #' @param knnAssign The number of nearest neighbors to be used during clustering for assignment of outliers (clusters with less than nOutlier cells). #' @param nOutlier The minimum number of cells required for a group of cells to be called as a cluster. If a group of cells does not reach #' this threshold, then the cells will be considered outliers and assigned to nearby clusters. +#' @param maxClusters The maximum number of clusters to be called. If the number exceeds this the clusters are merged unbiasedly using hclust and cutree. +#' This is useful for contraining the cluster calls to be reasonable if they are converging on large numbers. Useful in iterativeLSI as well for initial iteration. Default is set to 25. #' @param testBias A boolean value that indicates whether or not to test clusters for bias. #' @param filterBias A boolean value indicates whether or not to filter clusters that are identified as biased. #' @param biasClusters A numeric value between 0 and 1 indicating that clusters that are smaller than the specified proportion of total cells are @@ -63,6 +65,7 @@ addClusters <- function( corCutOff = 0.75, knnAssign = 10, nOutlier = 5, + maxClusters = 25, testBias = TRUE, filterBias = FALSE, biasClusters = 0.01, @@ -345,6 +348,23 @@ addClusters <- function( } } + ################################################################################# + # Merging if more than maxClusters + ################################################################################# + if(!is.null(maxClusters)){ + if(length(unique(clust)) > maxClusters){ + .logDiffTime(sprintf("Identified more clusters than maxClusters allowed (n = %s). Merging clusters to maxClusters (n = %s).\nIf this is not desired set maxClusters = NULL!", length(clustAssign), maxClusters), tstart, verbose = verbose, logFile = logFile) + meanDR <- t(ArchR:::.groupMeans(t(matDR), clust)) + hc <- hclust(dist(as.matrix(meanDR))) + ct <- cutree(hc, maxClusters) + clust <- mapLabels( + labels = clust, + oldLabels = names(ct), + newLabels = paste0(prefix, ct) + ) + } + } + ################################################################################# # Renaming Clusters based on Proximity in Reduced Dimensions ################################################################################# @@ -352,8 +372,8 @@ addClusters <- function( if(length(unique(clust)) > 1){ - meanSVD <- t(.groupMeans(t(matDR), clust)) - hc <- hclust(dist(as.matrix(meanSVD))) + meanDR <- t(.groupMeans(t(matDR), clust)) + hc <- hclust(dist(as.matrix(meanDR))) out <- mapLabels( labels = clust, oldLabels = hc$labels[hc$order], @@ -489,3 +509,5 @@ addClusters <- function( + + diff --git a/R/CreateArrow.R b/R/CreateArrow.R index 0b1c1337..00c06d0a 100644 --- a/R/CreateArrow.R +++ b/R/CreateArrow.R @@ -14,18 +14,13 @@ #' to calculate TSS Enrichment Scores etc. #' @param genomeAnnotation The genomeAnnotation (see `createGenomeAnnotation()`) to associate with the ArrowFiles. This is used #' downstream to collect chromosome sizes and nucleotide information etc. -#' @param filterFrags The minimum number of mapped ATAC-seq fragments required per cell to pass filtering for use in downstream analyses. -#' Cells containing greater than or equal to `filterFrags` total fragments wll be retained. -#' @param filterTSS The minimum numeric transcription start site (TSS) enrichment score required for a cell to pass filtering for use -#' in downstream analyses. Cells with a TSS enrichment score greater than or equal to `filterTSS` will be retained. TSS enrichment score +#' @param minTSS The minimum numeric transcription start site (TSS) enrichment score required for a cell to pass filtering for use +#' in downstream analyses. Cells with a TSS enrichment score greater than or equal to `minTSS` will be retained. TSS enrichment score #' is a measurement of signal-to-background in ATAC-seq. -#' @param removeFilteredCells A boolean value that determines whether cells that do not pass `filterFrags` and `filterTSS` should be -#' excluded entirely from the ArrowFiles. If `FALSE` cells that do not pass QC filters will be included in the ArrowFile but will be -#' marked as not passing QC and excluded from downstream analyses. -#' @param minFrags The minimum fragments per cell to be filtered immediately before any QC calculations (such as TSS Enrichment Score). -#' This is useful for limiting the number of barcodes analyzed. -#' @param maxFrags The maximum fragments per cell to be filtered immediately before any QC calculations (such as TSS Enrichment Score). -#' This is useful for limiting the number of barcodes analyzed. +#' @param minFrags The minimum number of mapped ATAC-seq fragments required per cell to pass filtering for use in downstream analyses. +#' Cells containing greater than or equal to `minFrags` total fragments wll be retained. +#' @param maxFrags The maximum number of mapped ATAC-seq fragments required per cell to pass filtering for use in downstream analyses. +#' Cells containing greater than or equal to `maxFrags` total fragments wll be retained. #' @param QCDir The relative path to the output directory for QC-level information and plots for each sample/ArrowFile. #' @param nucLength The length in basepairs that wraps around a nucleosome. This number is used for identifying fragments as #' sub-nucleosome-spanning, mono-nucleosome-spanning, or multi-nucleosome-spanning. @@ -73,10 +68,8 @@ createArrowFiles <- function( validBarcodes = NULL, geneAnnotation = getGeneAnnotation(), genomeAnnotation = getGenomeAnnotation(), - filterFrags = 1000, - filterTSS = 4, - removeFilteredCells = TRUE, - minFrags = 500, + minTSS = 4, + minFrags = 1000, maxFrags = 100000, QCDir = "QualityControl", nucLength = 147, @@ -99,9 +92,35 @@ createArrowFiles <- function( subThreading = TRUE, verbose = TRUE, cleanTmp = TRUE, - logFile = createLogFile("createArrows") + logFile = createLogFile("createArrows"), + filterFrags = NULL, + filterTSS = NULL ){ + ################ + # NEW + ################ + + #We have decided to force removal of filtered cells and thus we have now added messages describing this change + #It is a simple change we just want to create a more consistent experience! + removeFilteredCells <- TRUE + if(!is.null(filterFrags)){ + message("filterFrags is no longer a valid input. Please use minFrags! Setting filterFrags value to minFrags!") + minFrags <- filterFrags + } + + if(!is.null(filterTSS)){ + message("filterTSS is no longer a valid input. Please use minTSS! Setting filterTSS value to minTSS!") + minTSS <- filterTSS + } + + filterTSS <- minTSS + filterFrags <- minFrags + + ################ + # NEW ^ + ################ + .validInput(input = inputFiles, name = "inputFiles", valid = c("character")) if(any(!file.exists(inputFiles))){ stop("inputFiles do not exist :\n\t", paste0(inputFiles[!file.exists(inputFiles)], collapse = "\n\t")) @@ -180,6 +199,8 @@ createArrowFiles <- function( args$threads <- length(inputFiles) } + args$minTSS <- NULL + #Run With Parallel or lapply outArrows <- tryCatch({ unlist(.batchlapply(args)) diff --git a/R/DoubletsScores.R b/R/DoubletsScores.R index c66383ed..c5338195 100644 --- a/R/DoubletsScores.R +++ b/R/DoubletsScores.R @@ -357,7 +357,7 @@ addDoubletScores <- function( doubletResults = simDoubletsSave ) - saveRDS(summaryList, file.path(outDir, paste0(.sampleName(ArrowFile), "-Doublet-Summary.rds"))) + .safeSaveRDS(summaryList, file.path(outDir, paste0(.sampleName(ArrowFile), "-Doublet-Summary.rds"))) rm(simDoubletsSave) ################################## @@ -611,7 +611,7 @@ addDoubletScores <- function( if(mean(corProjection[[2]]) < 0.9){ if(!force){ - msg <- paste0(prefix, "Correlation of UMAP Projection is below 0.9 (normally this is ~0.99)\nThis means there is little heterogeneity in your sample and thus doubletCalling is inaccurate.\nforce = FALSE, thus returning -1 doubletScores and doubletEnrichments!\nSet force = TRUE if you want to contniue (not recommended).") + msg <- paste0(prefix, "Correlation of UMAP Projection is below 0.9 (normally this is ~0.99)\nThis means there is little heterogeneity in your sample and thus doubletCalling is inaccurate.\nforce = FALSE, thus returning -1 doubletScores and doubletEnrichments!\nSet force = TRUE if you want to continue (not recommended).") .logMessage(msg, logFile = logFile) message(msg) out$doubletEnrichLSI <- rep(-1, nrow(LSI$matSVD)) diff --git a/R/Embedding.R b/R/Embedding.R index e031632c..ba59be35 100644 --- a/R/Embedding.R +++ b/R/Embedding.R @@ -126,7 +126,7 @@ addUMAP <- function( uwot_umap <- do.call(uwot::umap, embeddingParams) if(estimateUMAP){ - uwot_umap2 <- uwot::umap_transform(X = saveX, model = uwot_umap, n_threads = threads, verbose = verbose) + uwot_umap2 <- uwot::umap_transform(X = saveX, model = uwot_umap, n_threads = as.integer(threads), verbose = verbose) #We should check the distances knnRef <- as.vector(nabor::knn(data = uwot_umap[[1]], query = uwot_umap[[1]], k = 2)$nn.dists[,-1]) knnProj <- as.vector(nabor::knn(data = uwot_umap[[1]], query = uwot_umap2, k = 1)$nn.dists) @@ -217,7 +217,7 @@ addUMAP <- function( uwot_dir <- file.path(mod_dir, "uwot") dir.create(uwot_dir) model_tmpfname <- file.path(uwot_dir, "model") - saveRDS(model, file = model_tmpfname) + .safeSaveRDS(model, file = model_tmpfname) metrics <- names(model$metric) n_metrics <- length(metrics) for (i in seq_len(n_metrics)) { diff --git a/R/GlobalDefaults.R b/R/GlobalDefaults.R index 28517621..26854c57 100644 --- a/R/GlobalDefaults.R +++ b/R/GlobalDefaults.R @@ -310,7 +310,7 @@ addArchRGenome <- function(genome = NULL, install = TRUE){ .validInput(input = genome, name = "genome", valid = "character") .validInput(input = install, name = "install", valid = c("boolean")) - supportedGenomes <- c("hg19","hg38","mm9","mm10") + supportedGenomes <- c("hg19","hg38","mm9","mm10","hg19test") if(tolower(genome) %ni% supportedGenomes){ @@ -330,6 +330,15 @@ addArchRGenome <- function(genome = NULL, install = TRUE){ stop("BSgenome for hg19 not installed! Please install by setting install = TRUE or by the following:\n\tBiocManager::install(\"BSgenome.Hsapiens.UCSC.hg19\")") } } + }else if(tolower(genome)=="hg19test"){ + if(!requireNamespace("BSgenome.Hsapiens.UCSC.hg19", quietly = TRUE)){ + if(install){ + message("BSgenome for hg19 not installed! Now installing by the following:\n\tBiocManager::install(\"BSgenome.Hsapiens.UCSC.hg19\")") + BiocManager::install("BSgenome.Hsapiens.UCSC.hg19") + }else{ + stop("BSgenome for hg19 not installed! Please install by setting install = TRUE or by the following:\n\tBiocManager::install(\"BSgenome.Hsapiens.UCSC.hg19\")") + } + } }else if(tolower(genome)=="hg38"){ if(!requireNamespace("BSgenome.Hsapiens.UCSC.hg38", quietly = TRUE)){ if(install){ @@ -391,7 +400,7 @@ getArchRGenome <- function( .validInput(input = geneAnnotation, name = "geneAnnotation", valid = "boolean") .validInput(input = genomeAnnotation, name = "genomeAnnotation", valid = "boolean") - supportedGenomes <- c("hg19","hg38","mm9","mm10") + supportedGenomes <- c("hg19","hg38","mm9","mm10","hg19test") .ArchRGenome <- options()[["ArchR.genome"]] if(!is.null(.ArchRGenome)){ diff --git a/R/GroupExport.R b/R/GroupExport.R index b33be973..af2f2bca 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -338,3 +338,107 @@ getmode<-function(v) { uniqv[which.max(tabulate(match(v, uniqv)))] } +.createGroupBW <- function( + i = NULL, + cellGroups = NULL, + ArrowFiles = NULL, + cellsInArrow = NULL, + availableChr = NULL, + chromLengths = NULL, + tiles = NULL, + ceiling = NULL, + tileSize = 100, + normMethod = NULL, + normBy = NULL, + bwDir = "bigwigs", + tstart = NULL, + verbose = TRUE, + logFile = NULL, + threads = 1 + ){ + + .logDiffTime(sprintf("%s (%s of %s) : Creating BigWig for Group", names(cellGroups)[i], i, length(cellGroups)), tstart, logFile = logFile, verbose = verbose) + + #Cells + cellGroupi <- cellGroups[[i]] + #print(sum(normBy[cellGroupi, 1])) + + #Bigwig File! + covFile <- file.path(bwDir, paste0(make.names(names(cellGroups)[i]), "-TileSize-",tileSize,"-normMethod-",normMethod,"-ArchR.bw")) + rmf <- .suppressAll(file.remove(covFile)) + + covList <- .safelapply(seq_along(availableChr), function(k){ + + it <- 0 + + for(j in seq_along(ArrowFiles)){ + cellsInI <- sum(cellsInArrow[[names(ArrowFiles)[j]]] %in% cellGroupi) + if(cellsInI > 0){ + it <- it + 1 + if(it == 1){ + fragik <- .getFragsFromArrow(ArrowFiles[j], chr = availableChr[k], out = "GRanges", cellNames = cellGroupi) + }else{ + fragik <- c(fragik, .getFragsFromArrow(ArrowFiles[j], chr = availableChr[k], out = "GRanges", cellNames = cellGroupi)) + } + } + } + + tilesk <- tiles[BiocGenerics::which(seqnames(tiles) %bcin% availableChr[k])] + + if(length(fragik) == 0){ + + tilesk$reads <- 0 + + }else{ + + #N Tiles + nTiles <- trunc(chromLengths[availableChr[k]] / tileSize) + 1 + + #Create Sparse Matrix + matchID <- S4Vectors::match(mcols(fragik)$RG, cellGroupi) + + mat <- Matrix::sparseMatrix( + i = c(trunc(start(fragik) / tileSize), trunc(end(fragik) / tileSize)) + 1, + j = as.vector(c(matchID, matchID)), + x = rep(1, 2*length(fragik)), + dims = c(nTiles, length(cellGroupi)) + ) + + if(!is.null(ceiling)){ + mat@x[mat@x > ceiling] <- ceiling + } + + mat <- Matrix::rowSums(mat) + + rm(fragik, matchID) + + tilesk$reads <- mat + + if(tolower(normMethod) %in% c("readsintss", "readsinpromoter", "nfrags")){ + tilesk$reads <- tilesk$reads * 10^4 / sum(normBy[cellGroupi, 1]) + }else if(tolower(normMethod) %in% c("ncells")){ + tilesk$reads <- tilesk$reads / length(cellGroupi) + }else if(tolower(normMethod) %in% c("none")){ + }else{ + stop("NormMethod not recognized!") + } + + } + + tilesk <- coverage(tilesk, weight = tilesk$reads)[[availableChr[k]]] + + tilesk + + }, threads = threads) + + names(covList) <- availableChr + + covList <- as(covList, "RleList") + + rtracklayer::export.bw(object = covList, con = covFile) + + return(covFile) + +} + + diff --git a/R/HiddenUtils.R b/R/HiddenUtils.R index 17d25477..4ef6980e 100644 --- a/R/HiddenUtils.R +++ b/R/HiddenUtils.R @@ -36,6 +36,38 @@ } } +########################################################################################## +# Safe saveRDS check +########################################################################################## + +.safeSaveRDS <- function( + object = NULL, + file = "", + ascii = FALSE, + version = NULL, + compress = TRUE, + refhook = NULL + ){ + #Try to save a test data.frame in location + testDF <- data.frame(a=1,b=2) + canSave <- suppressWarnings(tryCatch({ + saveRDS(object = testDF, file = file, ascii = ascii, version = version, compress = compress, refhook = refhook) + TRUE + }, error = function(x){ + FALSE + })) + if(!canSave){ + dirExists <- dir.exists(dirname(file)) + if(dirExists){ + stop("Cannot saveRDS. File Path : ", file) + }else{ + stop("Cannot saveRDS because directory does not exist (",dirname(file),"). File Path : ", file) + } + }else{ + saveRDS(object = object, file = file, ascii = ascii, version = version, compress = compress, refhook = refhook) + } +} + ########################################################################################## # Stat/Summary Methods ########################################################################################## diff --git a/R/InputData.R b/R/InputData.R index c932ea32..178572e8 100644 --- a/R/InputData.R +++ b/R/InputData.R @@ -52,6 +52,40 @@ getTutorialData <- function( } +#' Get PBMC Small Test Fragments +#' +#' This function will download fragments for a small PBMC test dataset (2k Cells) spanning chr1 and 2 (~20MB). +#' +#' @export +getTestFragments <- function(x){ + if(!file.exists("PBMCSmall.tsv.gz")){ + download.file( + url = "https://jeffgranja.s3.amazonaws.com/ArchR/TestData/PBMCSmall.tsv.gz", + destfile = "PBMCSmall.tsv.gz" + ) + } + addArchRGenome("hg19test") + c("PBMC" = "PBMCSmall.tsv.gz") +} + +#' Get PBMC Small Test Project +#' +#' This function will download an ArchRProject for a small PBMC test dataset (2k Cells) spanning chr1 and 2 (~2-300MB). +#' +#' @export +getTestProject <- function(){ + if(!dir.exists("PBMCSmall")){ + download.file( + url = "https://jeffgranja.s3.amazonaws.com/ArchR/TestData/PBMCSmall.zip", + destfile = "PBMCSmall.zip" + ) + unzip("PBMCSmall.zip", exdir = getwd()) + file.remove("PBMCSmall.zip") + } + addArchRGenome("hg19test") + loadArchRProject("PBMCSmall") +} + #' Get Input Files from paths to create arrows #' #' This function will look for fragment files and bam files in the input paths and return the full path and sample names. diff --git a/R/IntegrativeAnalysis.R b/R/IntegrativeAnalysis.R index ddd179d0..0c6f636b 100644 --- a/R/IntegrativeAnalysis.R +++ b/R/IntegrativeAnalysis.R @@ -113,7 +113,7 @@ correlateMatrices <- function( featureDF2 <- .checkSeqnames(featureDF2, useMatrix2, useSeqnames2, matrixClass2, logFile) #Create Match Names - featureDF1$matchName <- featureDF1$name + featureDF1$matchName <- toupper(featureDF1$name) if("underscore" %in% tolower(removeFromName1)){ featureDF1$matchName <- gsub("\\_.*","",featureDF1$matchName) } @@ -127,7 +127,7 @@ correlateMatrices <- function( featureDF1$matchName <- gsub("\\..*","",featureDF1$matchName) } - featureDF2$matchName <- featureDF2$name + featureDF2$matchName <- toupper(featureDF2$name) if("underscore" %in% tolower(removeFromName2)){ featureDF2$matchName <- gsub("\\_.*","",featureDF2$matchName) } @@ -762,7 +762,13 @@ addCoAccessibility <- function( o$seqnames <- seqnames(peakSet)[o[,1]] o$idx1 <- peakSet$idx[o[,1]] o$idx2 <- peakSet$idx[o[,2]] +<<<<<<< HEAD o$correlation <- NA +======= + o$correlation <- -999.999 + o$Variability1 <- 0.000 + o$Variability2 <- 0.000 +>>>>>>> 2f022a4... Release 1.0.0 (#376) #Peak Matrix ColSums cS <- .getColSums(getArrowFiles(ArchRProj), chri, verbose = FALSE, useMatrix = "PeakMatrix") @@ -795,7 +801,18 @@ addCoAccessibility <- function( #Correlations idx <- BiocGenerics::which(o$seqnames==chri[x]) +<<<<<<< HEAD o[idx,]$correlation <- rowCorCpp(idxX = o[idx,]$idx1, idxY = o[idx,]$idx2, X = as.matrix(groupMat), Y = as.matrix(groupMat)) +======= + corVals <- rowCorCpp(idxX = o[idx,]$idx1, idxY = o[idx,]$idx2, X = as.matrix(groupMat), Y = as.matrix(groupMat)) + .logThis(head(corVals), paste0("SubsetCorVals-", x), logFile = logFile) + + rowVars <- as.numeric(matrixStats::rowVars(groupMat)) + + o[idx,]$correlation <- as.numeric(corVals) + o[idx,]$Variability1 <- rowVars[o[idx,]$idx1] + o[idx,]$Variability2 <- rowVars[o[idx,]$idx2] +>>>>>>> 2f022a4... Release 1.0.0 (#376) .logThis(groupMat, paste0("SubsetGroupMat-", x), logFile = logFile) .logThis(o[idx,], paste0("SubsetCoA-", x), logFile = logFile) @@ -805,6 +822,13 @@ addCoAccessibility <- function( o$idx1 <- NULL o$idx2 <- NULL o <- o[!is.na(o$correlation),] + + o$TStat <- (o$correlation / sqrt((max(1-o$correlation^2, 0.00000000000000001))/(length(knnObj)-2))) #T-statistic P-value + o$Pval <- 2*pt(-abs(o$TStat), length(knnObj) - 2) + o$FDR <- p.adjust(o$Pval, method = "fdr") + o$VarQuantile1 <- .getQuantiles(o$Variability1) + o$VarQuantile2 <- .getQuantiles(o$Variability2) + mcols(peakSet) <- NULL o@metadata$peakSet <- peakSet @@ -868,6 +892,8 @@ getCoAccessibility <- function( start = summitTiles[coA[,1]], end = summitTiles[coA[,2]] ) + metadata(coA) <- list() + mcols(loops) <- coA[,-c(1:3)] mcols(loops)$value <- coA$correlation loops <- loops[order(mcols(loops)$value, decreasing=TRUE)] @@ -929,6 +955,7 @@ getCoAccessibility <- function( #' `reducedDims` were originally created during dimensionality reduction. This idea was introduced by Timothy Stuart. #' @param corCutOff A numeric cutoff for the correlation of each dimension to the sequencing depth. If the dimension has a #' correlation to sequencing depth that is greater than the `corCutOff`, it will be excluded from analysis. +#' @param cellsToUse A character vector of cellNames to compute coAccessibility on if desired to run on a subset of the total cells. #' @param k The number of k-nearest neighbors to use for creating single-cell groups for correlation analyses. #' @param knnIteration The number of k-nearest neighbor groupings to test for passing the supplied `overlapCutoff`. #' @param overlapCutoff The maximum allowable overlap between the current group and all previous groups to permit the current @@ -938,6 +965,7 @@ getCoAccessibility <- function( #' from the `peakSet` of the `ArchRProject` and normalized to the total depth provided by `scaleTo`. #' @param log2Norm A boolean value indicating whether to log2 transform the single-cell groups prior to computing co-accessibility correlations. #' @param predictionCutoff A numeric describing the cutoff for RNA integration to use when picking cells for groupings. +#' @param addEmpiricalPval Add empirical p-values based on randomly correlating peaks and genes not on the same seqname. #' @param seed A number to be used as the seed for random number generation required in knn determination. It is recommended #' to keep track of the seed used so that you can reproduce results downstream. #' @param threads The number of threads to be used for parallel computing. @@ -951,6 +979,7 @@ addPeak2GeneLinks <- function( dimsToUse = 1:30, scaleDims = NULL, corCutOff = 0.75, + cellsToUse = NULL, k = 100, knnIteration = 500, overlapCutoff = 0.8, @@ -958,6 +987,7 @@ addPeak2GeneLinks <- function( scaleTo = 10^4, log2Norm = TRUE, predictionCutoff = 0.4, + addEmpiricalPval = FALSE, seed = 1, threads = max(floor(getArchRThreads() / 2), 1), verbose = TRUE, @@ -969,6 +999,7 @@ addPeak2GeneLinks <- function( .validInput(input = dimsToUse, name = "dimsToUse", valid = c("numeric", "null")) .validInput(input = scaleDims, name = "scaleDims", valid = c("boolean", "null")) .validInput(input = corCutOff, name = "corCutOff", valid = c("numeric", "null")) + .validInput(input = cellsToUse, name = "cellsToUse", valid = c("character", "null")) .validInput(input = k, name = "k", valid = c("integer")) .validInput(input = knnIteration, name = "knnIteration", valid = c("integer")) .validInput(input = overlapCutoff, name = "overlapCutoff", valid = c("numeric")) @@ -1028,6 +1059,9 @@ addPeak2GeneLinks <- function( #Get Reduced Dims rD <- getReducedDims(ArchRProj, reducedDims = reducedDims, corCutOff = corCutOff, dimsToUse = dimsToUse) + if(!is.null(cellsToUse)){ + rD <- rD[cellsToUse, ,drop=FALSE] + } #Subsample idx <- sample(seq_len(nrow(rD)), knnIteration, replace = !nrow(rD) >= knnIteration) @@ -1070,6 +1104,7 @@ addPeak2GeneLinks <- function( threads = threads, verbose = FALSE ) + rawMatRNA <- groupMatRNA .logThis(groupMatRNA, "groupMatRNA", logFile = logFile) #Group Matrix ATAC @@ -1082,6 +1117,7 @@ addPeak2GeneLinks <- function( threads = threads, verbose = FALSE ) + rawMatATAC <- groupMatATAC .logThis(groupMatATAC, "groupMatATAC", logFile = logFile) .logDiffTime(main="Normalizing Group Matrices", t1=tstart, verbose=verbose, logFile=logFile) @@ -1097,7 +1133,7 @@ addPeak2GeneLinks <- function( names(geneStart) <- NULL seRNA <- SummarizedExperiment( - assays = SimpleList(RNA = groupMatRNA), + assays = SimpleList(RNA = groupMatRNA, RawRNA = rawMatRNA), rowRanges = geneStart ) metadata(seRNA)$KNNList <- knnObj @@ -1106,7 +1142,7 @@ addPeak2GeneLinks <- function( names(peakSet) <- NULL seATAC <- SummarizedExperiment( - assays = SimpleList(ATAC = groupMatATAC), + assays = SimpleList(ATAC = groupMatATAC, RawATAC = rawMatATAC), rowRanges = peakSet ) metadata(seATAC)$KNNList <- knnObj @@ -1130,32 +1166,36 @@ addPeak2GeneLinks <- function( colnames(o) <- c("B", "A", "distance") #Null Correlations - #.logDiffTime(main="Computing Background Correlations", t1=tstart, verbose=verbose, logFile=logFile) - #nullCor <- .getNullCorrelations(seATAC, seRNA, o, 1000) + if(addEmpiricalPval){ + .logDiffTime(main="Computing Background Correlations", t1=tstart, verbose=verbose, logFile=logFile) + nullCor <- .getNullCorrelations(seATAC, seRNA, o, 1000) + } .logDiffTime(main="Computing Correlations", t1=tstart, verbose=verbose, logFile=logFile) o$Correlation <- rowCorCpp(as.integer(o$A), as.integer(o$B), assay(seATAC), assay(seRNA)) o$VarAssayA <- .getQuantiles(matrixStats::rowVars(assay(seATAC)))[o$A] o$VarAssayB <- .getQuantiles(matrixStats::rowVars(assay(seRNA)))[o$B] - o$TStat <- (o$Correlation / sqrt((1-o$Correlation^2)/(ncol(seATAC)-2))) #T-statistic P-value + o$TStat <- (o$correlation / sqrt((max(1-o$Correlation^2, 0.00000000000000001))/(ncol(seATAC)-2))) #T-statistic P-value o$Pval <- 2*pt(-abs(o$TStat), ncol(seATAC) - 2) o$FDR <- p.adjust(o$Pval, method = "fdr") - #o$EmpPval <- 2*pnorm(-abs(((o$Correlation - mean(nullCor[[2]])) / sd(nullCor[[2]])))) - #o$EmpFDR <- p.adjust(o$EmpPval, method = "fdr") - out <- o[, c("A", "B", "Correlation", "FDR", "VarAssayA", "VarAssayB")] - colnames(out) <- c("idxATAC", "idxRNA", "Correlation", "FDR", "VarQATAC", "VarQRNA") + colnames(out) <- c("idxATAC", "idxRNA", "Correlation", "FDR", "VarQATAC", "VarQRNA") mcols(peakSet) <- NULL names(peakSet) <- NULL metadata(out)$peakSet <- peakSet metadata(out)$geneSet <- geneStart + if(addEmpiricalPval){ + out$EmpPval <- 2*pnorm(-abs(((out$Correlation - mean(nullCor[[2]])) / sd(nullCor[[2]])))) + out$EmpFDR <- p.adjust(out$EmpPval, method = "fdr") + } + #Save Group Matrices dir.create(file.path(getOutputDirectory(ArchRProj), "Peak2GeneLinks"), showWarnings = FALSE) outATAC <- file.path(getOutputDirectory(ArchRProj), "Peak2GeneLinks", "seATAC-Group-KNN.rds") - saveRDS(seATAC, outATAC, compress = FALSE) + .safeSaveRDS(seATAC, outATAC, compress = FALSE) outRNA <- file.path(getOutputDirectory(ArchRProj), "Peak2GeneLinks", "seRNA-Group-KNN.rds") - saveRDS(seRNA, outRNA, compress = FALSE) + .safeSaveRDS(seRNA, outRNA, compress = FALSE) metadata(out)$seATAC <- outATAC metadata(out)$seRNA <- outRNA @@ -1168,52 +1208,52 @@ addPeak2GeneLinks <- function( } -# .getNullCorrelations <- function(seA, seB, o, n){ +.getNullCorrelations <- function(seA, seB, o, n){ -# o$seq <- seqnames(seA)[o$A] + o$seq <- seqnames(seA)[o$A] -# nullCor <- lapply(seq_along(unique(o$seq)), function(i){ + nullCor <- lapply(seq_along(unique(o$seq)), function(i){ -# #Get chr from olist -# chri <- unique(o$seq)[i] -# #message(chri, " ", appendLF = FALSE) + #Get chr from olist + chri <- unique(o$seq)[i] + #message(chri, " ", appendLF = FALSE) -# #Randomly get n seA -# id <- which(as.character(seqnames(seA)) != chri) -# if(length(id) > n){ -# transAidx <- sample(id, n) -# }else{ -# transAidx <- id -# } + #Randomly get n seA + id <- which(as.character(seqnames(seA)) != chri) + if(length(id) > n){ + transAidx <- sample(id, n) + }else{ + transAidx <- id + } -# #Calculate Correlations -# grid <- expand.grid(transAidx, unique(o[o$seq==chri,]$B)) + #Calculate Correlations + grid <- expand.grid(transAidx, unique(o[o$seq==chri,]$B)) -# idxA <- unique(grid[,1]) -# idxB <- unique(grid[,2]) + idxA <- unique(grid[,1]) + idxB <- unique(grid[,2]) -# seSubA <- seA[idxA] -# seSubB <- seB[idxB] + seSubA <- seA[idxA] + seSubB <- seB[idxB] -# grid[,3] <- match(grid[,1], idxA) -# grid[,4] <- match(grid[,2], idxB) + grid[,3] <- match(grid[,1], idxA) + grid[,4] <- match(grid[,2], idxB) -# colnames(grid) <- c("A", "B") -# out <- rowCorCpp(grid[,3], grid[,4], assay(seSubA), assay(seSubB)) -# out <- na.omit(out) + colnames(grid) <- c("A", "B") + out <- rowCorCpp(grid[,3], grid[,4], assay(seSubA), assay(seSubB)) + out <- na.omit(out) -# return(out) + return(out) -# }) %>% SimpleList -# #message("") + }) %>% SimpleList + #message("") -# summaryDF <- lapply(nullCor, function(x){ -# data.frame(mean = mean(x), sd = sd(x), median = median(x), n = length(x)) -# }) %>% Reduce("rbind",.) + summaryDF <- lapply(nullCor, function(x){ + data.frame(mean = mean(x), sd = sd(x), median = median(x), n = length(x)) + }) %>% Reduce("rbind",.) -# return(list(summaryDF, unlist(nullCor))) + return(list(summaryDF, unlist(nullCor))) -# } +} #' Get the peak-to-gene links from an ArchRProject #' @@ -1419,6 +1459,39 @@ plotPeak2GeneHeatmap <- function( colOrder <- colnames(bS[[1]]) kDF[,3] <- as.integer(mapLabels(paste0(kDF[,1]), newLabels = paste0(seq_along(rowOrder)), oldLabels = rowOrder)) +<<<<<<< HEAD +======= + if(returnMatrices){ + + out <- SimpleList( + ATAC = SimpleList( + matrix = mATAC[kDF[,2],colOrder], + kmeansId = kDF[,3], + colData = cD[colOrder,,drop=FALSE] + ), + RNA = SimpleList( + matrix = mRNA[kDF[,2],colOrder], + kmeansId = kDF[,3], + colData = cD[colOrder,,drop=FALSE] + ), + Peak2GeneLinks = p2g[kDF[,2],] + ) + + return(out) + + } + + #Log Info + .logThis(colorMap, "colorMap", logFile = logFile) + .logThis(colOrder, "colOrder", logFile = logFile) + .logThis(kDF, "kDF", logFile = logFile) + .logThis(mATAC, "mATAC", logFile = logFile) + .logThis(mRNA, "mRNA", logFile = logFile) + .logThis(cD[colOrder,,drop=FALSE], "cD", logFile = logFile) + .logThis(mATAC[kDF[,2],colOrder], "mATAC2", logFile = logFile) + .logThis(mRNA[kDF[,2],colOrder], "mRNA2", logFile = logFile) + +>>>>>>> 2f022a4... Release 1.0.0 (#376) ######################################### # Plot Heatmaps ######################################### diff --git a/R/IterativeLSI.R b/R/IterativeLSI.R index a641254a..97f1dcac 100644 --- a/R/IterativeLSI.R +++ b/R/IterativeLSI.R @@ -13,7 +13,11 @@ #' @param iterations The number of LSI iterations to perform. #' @param clusterParams A list of Additional parameters to be passed to `addClusters()` for clustering within each iteration. #' These params can be constant across each iteration, or specified for each iteration individually. Thus each param must be of -#' length == 1 or the total number of `iterations` - 1. +#' length == 1 or the total number of `iterations` - 1. PLEASE NOTE - We have updated these params to `resolution=2` and `maxClusters=6`! To use previous settings use `resolution=0.2` and `maxClusters=NULL`. +#' @param firstSelection First iteration selection method for features to use for LSI. Either "Top" for the top accessible/average or "Var" for the top variable features. +#' "Top" should be used for all scATAC-seq data (binary) while "Var" should be used for all scRNA/other-seq data types (non-binary). +#' @param depthCol A column in the `ArchRProject` that represents the coverage (scATAC = unique fragments, scRNA = unique molecular identifiers) per cell. +#' These values are used to minimize the related biases in the reduction related. For scATAC we recommend "nFrags" and for scRNA we recommend "Gex_nUMI". #' @param varFeatures The number of N variable features to use for LSI. The top N features will be used based on the `selectionMethod`. #' @param dimsToUse A vector containing the dimensions from the `reducedDims` object to use in clustering. #' @param LSIMethod A number or string indicating the order of operations in the TF-IDF normalization. @@ -64,10 +68,13 @@ addIterativeLSI <- function( name = "IterativeLSI", iterations = 2, clusterParams = list( - resolution = c(0.2), + resolution = c(2), sampleCells = 10000, + maxClusters = 6, n.start = 10 ), + firstSelection = "top", + depthCol = "nFrags", varFeatures = 25000, dimsToUse = 1:30, LSIMethod = 2, @@ -171,7 +178,6 @@ addIterativeLSI <- function( ArrowFiles <- getSampleColData(ArchRProj)[,"ArrowFiles"] #Check if Matrix is supported and check type - stopifnot(any(tolower(useMatrix) %in% c("tilematrix","peakmatrix"))) if(tolower(useMatrix) == "tilematrix"){ useMatrix <- "TileMatrix" tileSizes <- lapply(ArrowFiles, function(x){ @@ -181,10 +187,19 @@ addIterativeLSI <- function( stop("Error not all TileMatrices are the same tileSize!") } tileSize <- unique(tileSizes) - } - if(tolower(useMatrix) == "peakmatrix"){ + }else if(tolower(useMatrix) == "peakmatrix"){ useMatrix <- "PeakMatrix" tileSize <- NA + }else{ + tileSize <- NA + } + + units <- unique(unlist(lapply(ArrowFiles, function(x) h5read(x, paste0(useMatrix, "/Info/Units"))))) + if(length(units) != 1){ + stop("Units of matrices are not identical!") + } + if(grepl("log",units,ignore.case=TRUE)){ + stop("Cannot use log transformed values for iterativeLSI!") } tstart <- Sys.time() @@ -192,18 +207,79 @@ addIterativeLSI <- function( # Organize Information for LSI ############################################################################################################################ chrToRun <- .availableSeqnames(ArrowFiles, subGroup = useMatrix) - #Compute Row Sums Across All Samples - .logDiffTime("Computing Total Accessibility Across All Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) - if(useMatrix == "TileMatrix"){ - totalAcc <- .getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun, addInfo = FALSE) - totalAcc$start <- (totalAcc$idx - 1) * tileSize + + if(tolower(firstSelection) == "top"){ + + if(!binarize){ + stop("Please binarize data if using top selection for first iteration! Set binarize = TRUE!") + } + + #Compute Row Sums Across All Samples + .logDiffTime("Computing Total Across All Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) + if(useMatrix == "TileMatrix"){ + totalAcc <- .getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun, addInfo = FALSE) + totalAcc$start <- (totalAcc$idx - 1) * tileSize + }else{ + totalAcc <- .getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun, addInfo = TRUE) + } + + #Filter Chromosomes + if(length(excludeChr) > 0){ + totalAcc <- totalAcc[BiocGenerics::which(totalAcc$seqnames %bcni% excludeChr), , drop = FALSE] + } + + #Identify the top features to be used here + .logDiffTime("Computing Top Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) + nFeature <- varFeatures[1] + rmTop <- floor((1-filterQuantile) * totalFeatures) + topIdx <- head(order(totalAcc$rowSums, decreasing=TRUE), nFeature + rmTop)[-seq_len(rmTop)] + topFeatures <- totalAcc[sort(topIdx),] + + gc() + + }else if(tolower(firstSelection) %in% c("var", "variable")){ + + if(binarize){ + stop("Please do not binarize data if using variable selection for first iteration! Set binarize = FALSE!") + } + + if(units %in% "BinarizedCounts"){ + stop("Cannot do variable selection with BinarizedCounts. Set firstSelection = Top!") + } + + #Compute Row Sums Across All Samples + .logDiffTime("Computing Variability Across All Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) + if(useMatrix == "TileMatrix"){ + totalAcc <- .getRowVars(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun, useLog2 = TRUE) + totalAcc$start <- (totalAcc$idx - 1) * tileSize + }else{ + totalAcc <- .getRowVars(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun, useLog2 = TRUE) + } + + #Filter Chromosomes + if(length(excludeChr) > 0){ + totalAcc <- totalAcc[BiocGenerics::which(totalAcc$seqnames %bcni% excludeChr), , drop = FALSE] + } + + #Identify the top features to be used here + .logDiffTime("Computing Variable Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) + nFeature <- varFeatures[1] + if(nFeature > 0.5 * nrow(totalAcc)){ + stop("nFeature for variable selection must be at leat 1/2 the total features!") + } + topIdx <- head(order(totalAcc$combinedVars, decreasing=TRUE), nFeature) + topFeatures <- totalAcc[sort(topIdx),] + + gc() + }else{ - totalAcc <- .getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun, addInfo = TRUE) + + stop("firstSelect method must be Top or Var/Variable!") + } - gc() cellDepth <- tryCatch({ - df <- getCellColData(ArchRProj = ArchRProj, select = "nFrags") + df <- getCellColData(ArchRProj = ArchRProj, select = depthCol) v <- df[,1] names(v) <- rownames(df) v @@ -211,24 +287,12 @@ addIterativeLSI <- function( tryCatch({ .getColSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun) }, error = function(y){ - stop("Could not determine depth from nFrags or colSums!") + stop("Could not determine depth from depthCol or colSums!") }) } ) cellDepth <- log10(cellDepth + 1) - #Filter Chromosomes - if(length(excludeChr) > 0){ - totalAcc <- totalAcc[BiocGenerics::which(totalAcc$seqnames %bcni% excludeChr), , drop = FALSE] - } - - #Identify the top features to be used here - .logDiffTime("Computing Top Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) - nFeature <- varFeatures[1] - rmTop <- floor((1-filterQuantile) * totalFeatures) - topIdx <- head(order(totalAcc$rowSums, decreasing=TRUE), nFeature + rmTop)[-seq_len(rmTop)] - topFeatures <- totalAcc[sort(topIdx),] - ############################################################################################################################ # LSI Iteration 1 ############################################################################################################################ @@ -263,6 +327,7 @@ addIterativeLSI <- function( projectAll = j == iterations | projectCellsPre | sampleJ > sampleCellsPre, threads = threads, useIndex = FALSE, + seed = seed, tstart = tstart, verbose = verbose, logFile = logFile @@ -334,6 +399,7 @@ addIterativeLSI <- function( scaleTo = scaleTo, totalAcc = totalAcc, totalFeatures = totalFeatures, + firstSelection = firstSelection, selectionMethod = selectionMethod, varFeatures = varFeatures, tstart = tstart, @@ -375,6 +441,7 @@ addIterativeLSI <- function( projectAll = j == iterations | projectCellsPre | sampleJ > sampleCellsPre, threads = threads, useIndex = FALSE, + seed = seed, tstart = tstart, verbose = verbose, logFile = logFile @@ -450,6 +517,7 @@ addIterativeLSI <- function( sampleCells = 5000, projectAll = TRUE, threads = 1, + seed = 1, useIndex = FALSE, tstart = NULL, verbose = TRUE, @@ -489,6 +557,7 @@ addIterativeLSI <- function( binarize = binarize, outlierQuantiles = outlierQuantiles, verbose = FALSE, + seed = seed, tstart = tstart, logFile = logFile ) @@ -534,6 +603,7 @@ addIterativeLSI <- function( nDimensions = max(dimsToUse), binarize = binarize, outlierQuantiles = outlierQuantiles, + seed = seed, tstart = tstart, logFile = logFile ) @@ -571,6 +641,7 @@ addIterativeLSI <- function( nDimensions = max(dimsToUse), binarize = binarize, outlierQuantiles = outlierQuantiles, + seed = seed, tstart = tstart, logFile = logFile ) @@ -767,7 +838,7 @@ addIterativeLSI <- function( #Save results outj <- SimpleList(LSI = outLSI, clusters = clusters, uwotUmap = uwotUmap) - saveRDS(outj, file.path(outDir, paste0("Save-LSI-Iteration-",j,".rds"))) + .safeSaveRDS(outj, file.path(outDir, paste0("Save-LSI-Iteration-",j,".rds"))) rm(UMAPParams, uwotUmap) gc() @@ -871,6 +942,7 @@ addIterativeLSI <- function( useMatrix = NULL, totalAcc = NULL, scaleTo = NULL, + firstSelection = NULL, totalFeatures = NULL, selectionMethod = NULL, varFeatures = NULL, @@ -911,7 +983,13 @@ addIterativeLSI <- function( .logDiffTime("Creating Cluster Matrix on the total Group Features", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) groupList <- SimpleList(split(clusterDF$cellNames, clusterDF$clusters)) - groupFeatures <- totalAcc[sort(head(order(totalAcc$rowSums, decreasing = TRUE), totalFeatures)),] + + if(tolower(firstSelection) == "top"){ + groupFeatures <- totalAcc[sort(head(order(totalAcc$rowSums, decreasing = TRUE), totalFeatures)),] + }else if(tolower(firstSelection) %in% c("var", "variable")){ + groupFeatures <- totalAcc + } + groupMat <- .getGroupMatrix( ArrowFiles = ArrowFiles, featureDF = groupFeatures, @@ -1016,7 +1094,7 @@ addIterativeLSI <- function( idxOutlier <- which(colSm <= qCS[1] | colSm >= qCS[2]) if(length(idxOutlier) > 0){ .logDiffTime("Filtering Outliers Based On Counts", tstart, addHeader = FALSE, verbose = verbose, logFile = logFile) - #saveRDS(mat, "temp.rds", compress = FALSE) + #.safeSaveRDS(mat, "temp.rds", compress = FALSE) matO <- mat[, idxOutlier, drop = FALSE] mat <- mat[, -idxOutlier, drop = FALSE] mat2 <- mat[, head(seq_len(ncol(mat)), 10), drop = FALSE] # A 2nd Matrix to Check Projection is Working @@ -1295,11 +1373,3 @@ addIterativeLSI <- function( } - - - - - - - - diff --git a/R/LoggerUtils.R b/R/LoggerUtils.R index d593ddc9..856083da 100644 --- a/R/LoggerUtils.R +++ b/R/LoggerUtils.R @@ -319,7 +319,7 @@ createLogFile <- function( if(!is.null(errorList)){ tryCatch({ - #saveRDS(errorList, "Save-Error.rds") + #.safeSaveRDS(errorList, "Save-Error.rds") .logThis(errorList, name = "errorList", logFile) }, error = function(e){ cat("Error recording errorList", file = logFile, append = TRUE) @@ -336,7 +336,7 @@ createLogFile <- function( if(!is.null(errorList)){ debugFile <- paste0(gsub("\\.log", "", logFile), "-debug.rds") cat(sprintf("\n%s : ArchRDebugging is set to TRUE, DebugFile = %s\n", Sys.time(), debugFile)) - saveRDS(errorList, debugFile) + .safeSaveRDS(errorList, debugFile) } } diff --git a/R/MarkerFeatures.R b/R/MarkerFeatures.R index e963fbb8..a52e4f10 100644 --- a/R/MarkerFeatures.R +++ b/R/MarkerFeatures.R @@ -126,6 +126,8 @@ getMarkerFeatures <- function( featureDF <- .getFeatureDF(head(ArrowFiles, 2), useMatrix) matrixClass <- as.character(h5read(getArrowFiles(ArchRProj)[1], paste0(useMatrix, "/Info/Class"))) + .logThis(range(as.vector(table(paste0(featureDF$seqnames)))), "FeaturesPerSeqnames", logFile = logFile) + isDeviations <- FALSE if(all(unique(paste0(featureDF$seqnames)) %in% c("z", "dev"))){ isDeviations <- TRUE @@ -182,6 +184,7 @@ getMarkerFeatures <- function( bias = bias, k = k, n = maxCells, + bufferRatio = bufferRatio, logFile = logFile ) @@ -325,10 +328,18 @@ getMarkerFeatures <- function( rownames(featureDF) <- paste0("f", seq_len(nrow(featureDF))) seqnames <- unique(featureDF$seqnames) + .logThis(cellsx, paste0(group, "_cellsx"), logFile = logFile) + .logThis(bgdx, paste0(group, "_bgdx"), logFile = logFile) + pairwiseDF <- lapply(seq_along(seqnames), function(y){ + .logMessage(sprintf("Pairwise Test %s : Seqnames %s", group, seqnames[y]), logFile = logFile) featureDFy <- featureDF[BiocGenerics::which(featureDF$seqnames %bcin% seqnames[y]), ] + if(length(c(cellsx, bgdx)) == 0){ + stop(paste0("Cells in foreground and background are 0 for group = ", group)) + } + scMaty <- suppressMessages(.getPartialMatrix( ArrowFiles, featureDF = featureDFy, @@ -337,6 +348,8 @@ getMarkerFeatures <- function( cellNames = c(cellsx, bgdx), progress = FALSE )) + scMaty <- .checkSparseMatrix(scMaty, length(c(cellsx, bgdx))) + .logThis(scMaty, paste0(group, "_", seqnames[y], "_scMaty"), logFile = logFile) rownames(scMaty) <- rownames(featureDFy) if(binarize){ @@ -617,6 +630,14 @@ getMarkerFeatures <- function( } idF <- which(groups == groupx) + + if(all(length(idF) * bgdProbx < 1)){ + if(length(idF) < length(bgdProbx)){ + bgdProbx <- bgdProbx[sample(names(bgdProbx), floor(length(idF) * bufferRatio))] + bgdProbx[1:length(bgdProbx)] <- rep(1/length(bgdProbx), length(bgdProbx)) + } + } + idB <- which(groups %in% names(bgdProbx)) if(k > length(idB)){ @@ -712,8 +733,8 @@ getMarkerFeatures <- function( ##################### # Matching Stats Bias Norm Values ##################### - forBias <- .summarizeColStats(inputNorm[idX,], name = "foreground") - bgdBias <- .summarizeColStats(inputNorm[idY,], name = "background") + forBias <- .summarizeColStats(inputNorm[idX,,drop=FALSE], name = "foreground") + bgdBias <- .summarizeColStats(inputNorm[idY,,drop=FALSE], name = "background") out <- list( cells = idX, @@ -722,7 +743,7 @@ getMarkerFeatures <- function( summaryBgd = bgdBias, bgdGroups = rbind(estbgd, obsbgd), bgdGroupsProbs = rbind(estbgdP, obsbgdP), - corbgdGroups = cor(estbgdP, obsbgdP), + corbgdGroups = suppressWarnings(cor(estbgdP, obsbgdP)), n = length(sx), p = it / length(sx), group = groupx, @@ -803,8 +824,8 @@ plotMarkerHeatmap <- function( binaryClusterRows = TRUE, clusterCols = TRUE, labelMarkers = NULL, - nLabel = NULL, - nPrint = 20, + nLabel = 15, + nPrint = 15, labelRows = FALSE, returnMat = FALSE, transpose = FALSE, @@ -847,6 +868,13 @@ plotMarkerHeatmap <- function( .logThis(passMat, "passMat", logFile = logFile) #Now Get Values + if(ncol(seMarker) <= 2){ + if(!plotLog2FC){ + stop("Must use plotLog2FC = TRUE when ncol(seMarker) <= 2!") + } + } + + #Get Matrix if(plotLog2FC){ mat <- as.matrix(SummarizedExperiment::assays(seMarker)[["Log2FC"]]) }else{ @@ -862,9 +890,19 @@ plotMarkerHeatmap <- function( mat[mat < min(limits)] <- min(limits) .logThis(mat, "mat", logFile = logFile) +<<<<<<< HEAD idx <- which(rowSums(passMat, na.rm = TRUE) > 0 & matrixStats::rowVars(mat) != 0 & !is.na(matrixStats::rowVars(mat))) mat <- mat[idx,] passMat <- passMat[idx,] +======= + if(ncol(mat) == 1){ + idx <- which(rowSums(passMat, na.rm = TRUE) > 0) + }else{ + idx <- which(rowSums(passMat, na.rm = TRUE) > 0 & matrixStats::rowVars(mat) != 0 & !is.na(matrixStats::rowVars(mat))) + } + mat <- mat[idx,,drop=FALSE] + passMat <- passMat[idx,,drop=FALSE] +>>>>>>> 2f022a4... Release 1.0.0 (#376) if(nrow(mat) == 0){ stop("No Makers Found!") @@ -894,9 +932,9 @@ plotMarkerHeatmap <- function( stop("No Makers Found!") } + spmat <- passMat / rowSums(passMat) if(metadata(seMarker)$Params$useMatrix == "GeneScoreMatrix"){ message("Printing Top Marker Genes:") - spmat <- passMat / rowSums(passMat) for(x in seq_len(ncol(spmat))){ genes <- head(order(spmat[,x], decreasing = TRUE), nPrint) message(colnames(spmat)[x], ":") @@ -904,6 +942,16 @@ plotMarkerHeatmap <- function( } } + if(is.null(labelMarkers)){ + labelMarkers <- lapply(seq_len(ncol(spmat)), function(x){ + as.vector(rownames(mat)[head(order(spmat[,x], decreasing = TRUE), nLabel)]) + }) %>% unlist %>% unique + } + + if(ncol(mat) == 1){ + binaryClusterRows <- FALSE + } + if(binaryClusterRows){ if(invert){ bS <- .binarySort(-mat, lmat = passMat[rownames(mat), colnames(mat)], clusterCols = clusterCols) @@ -939,15 +987,22 @@ plotMarkerHeatmap <- function( pal <- rev(pal) } + print(labelMarkers) + .logThis(mat, "mat-plot", logFile = logFile) if(transpose){ - #mat <- t(mat[rev(seq_len(nrow(mat))), rev(clusterCols$order)]) if(!is.null(clusterCols)){ +<<<<<<< HEAD mat <- t(mat[seq_len(nrow(mat)), clusterCols$order]) }else{ mat <- t(mat[seq_len(nrow(mat)), ]) +======= + mat <- t(mat[seq_len(nrow(mat)), , drop = FALSE]) + }else{ + mat <- t(mat[seq_len(nrow(mat)), clusterCols$order, drop = FALSE]) +>>>>>>> 2f022a4... Release 1.0.0 (#376) } if(!is.null(labelMarkers)){ diff --git a/R/MatrixDeviations.R b/R/MatrixDeviations.R index 9eba7fed..6fd0d467 100644 --- a/R/MatrixDeviations.R +++ b/R/MatrixDeviations.R @@ -28,7 +28,7 @@ addDeviationsMatrix <- function( ArchRProj = NULL, peakAnnotation = NULL, matches = NULL, - bgdPeaks = getBgdPeaks(ArchRProj), + bgdPeaks = getBgdPeaks(ArchRProj, method = "chromVAR"), matrixName = NULL, out = c("z", "deviations"), binarize = FALSE, @@ -598,6 +598,7 @@ getVarDeviations <- function(ArchRProj = NULL, name = "MotifMatrix", plot = TRUE #' you can reproduce results downstream. #' @param outFile The path to save the `backgroundPeaks` object as a `.RDS` file for the given `ArchRProject`. The default action #' is to save this file in the `outputDirectory` of the `ArchRProject`. +#' @param method A string indicating whether to use chromVAR or ArchR for background peak identification. #' @param force A boolean value indicating whether to force the file indicated by `outFile` to be overwritten if it already exists. #' @export addBgdPeaks <- function( @@ -606,6 +607,7 @@ addBgdPeaks <- function( w = 0.1, binSize = 50, seed = 1, + method = "chromVAR", outFile = file.path(getOutputDirectory(ArchRProj), "Background-Peaks.rds"), force = FALSE ){ @@ -629,7 +631,7 @@ addBgdPeaks <- function( if(force){ message("Previous Background Peaks file does not exist! Identifying Background Peaks!") - bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = outFile) + bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = outFile, method = method) }else{ @@ -642,7 +644,7 @@ addBgdPeaks <- function( }else{ message("Identifying Background Peaks!") - bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = outFile) + bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = outFile, method = method) } @@ -666,6 +668,7 @@ addBgdPeaks <- function( #' @param binSize The precision with which the similarity is computed. See `chromVAR::getBackgroundPeaks()`. #' @param seed A number to be used as the seed for random number generation. It is recommended to keep track of the seed used #' so that you can reproduce results downstream. +#' @param method A string indicating whether to use chromVAR or ArchR for background peak identification. #' @param force A boolean value indicating whether to force the file indicated by `outFile` to be overwritten if it already exists. #' @export getBgdPeaks <- function( @@ -674,6 +677,7 @@ getBgdPeaks <- function( w = 0.1, binSize = 50, seed = 1, + method = "chromVAR", force = FALSE ){ @@ -696,7 +700,7 @@ getBgdPeaks <- function( if(force){ message("Previous Background Peaks file does not exist! Identifying Background Peaks!") - bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = NULL) + bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = NULL, method = method) }else{ @@ -709,7 +713,7 @@ getBgdPeaks <- function( }else{ message("Identifying Background Peaks!") - bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = NULL) + bgdPeaks <- .computeBgdPeaks(ArchRProj=ArchRProj, nIterations=nIterations, w=w, binSize=binSize, seed = seed, outFile = NULL, method = method) } @@ -727,6 +731,7 @@ getBgdPeaks <- function( w = 0.1, binSize = 50, seed = 1, + method = "chromVAR", outFile = file.path(getOutputDirectory(ArchRProj), "Background-Peaks.rds") ){ @@ -748,26 +753,74 @@ getBgdPeaks <- function( rS$end <- end(ArchRProj@peakSet) rS$GC <- ArchRProj@peakSet$GC + uniqueDist <- unique(rS$end - rS$start) + if(length(uniqueDist) > 1){ + if(tolower(method) != "archr"){ + stop("When using non-fixed width peaks, you need to use method = ArchR!") + } + } + #minimal chromVAR change #chromVAR reuiqres a matrix/se of ncol > 1 and with a log10(values) transform removing peaks with 0 reads #to disable this we create a column of 1's forcing chromVAR to perform log10(values + 1) se <- SummarizedExperiment::SummarizedExperiment( assays = SimpleList(counts = as.matrix(data.frame(rS$rowSums, 1))), - rowData = DataFrame(bias = rS$GC) + rowData = DataFrame(bias = rS$GC, start = rS$start, end = rS$end) ) - bgdPeaks <- chromVAR::getBackgroundPeaks( - object = se, - bias = rowData(se)$bias, - niterations = nIterations, - w = w, - bs = binSize - ) + if(tolower(method) == "chromvar"){ + + bgdPeaks <- tryCatch({ + + chromVAR::getBackgroundPeaks( + object = se, + bias = rowData(se)$bias, + niterations = nIterations, + w = w, + bs = binSize + ) + + }, error = function(e){ + + message("Error with chromVAR::getBackgroundPeaks! Handling this with a safer method for getting background peaks with ArchR!") + + .ArchRBdgPeaks( + object = se, + bias = rowData(se)$bias, + nIterations = nIterations + ) + + }) + + }else{ + + bgdPeaks <- .ArchRBdgPeaks( + object = se, + bias = rowData(se)$bias, + nIterations = nIterations + ) + + } bgdPeaks <- SummarizedExperiment(assays = SimpleList(bgdPeaks = bgdPeaks), rowRanges = GRanges(rS$seqnames,IRanges(rS$start,rS$end),value=rS$rowSums,GC=rS$GC)) + biasDF <- data.frame( + rowSums = Matrix::rowSums(assay(se)), + bias = rowData(se)$bias, + length = rowData(se)$end - rowData(se)$start + ) + + rowData(bgdPeaks)$bgdSumMean <- round(rowMeans(matrix(biasDF[assay(bgdPeaks),1], nrow = nrow(bgdPeaks))),3) + rowData(bgdPeaks)$bgdSumSd <- round(matrixStats::rowSds(matrix(biasDF[assay(bgdPeaks),1], nrow = nrow(bgdPeaks))),3) + + rowData(bgdPeaks)$bgdGCMean <- round(rowMeans(matrix(biasDF[assay(bgdPeaks),2], nrow = nrow(bgdPeaks))),3) + rowData(bgdPeaks)$bgdGCSd <- round(matrixStats::rowSds(matrix(biasDF[assay(bgdPeaks),2], nrow = nrow(bgdPeaks))),3) + + rowData(bgdPeaks)$bgdLengthMean <- round(rowMeans(matrix(biasDF[assay(bgdPeaks),3], nrow = nrow(bgdPeaks))),3) + rowData(bgdPeaks)$bgdLengthSd <- round(matrixStats::rowSds(matrix(biasDF[assay(bgdPeaks),3], nrow = nrow(bgdPeaks))),3) + #Save Background Peaks if(!is.null(outFile)){ saveRDS(bgdPeaks, outFile, compress = FALSE) @@ -777,3 +830,53 @@ getBgdPeaks <- function( } +.ArchRBdgPeaks <- function(object = NULL, bias = NULL, nIterations = 50){ + + .cleanSelf <- function(x){ + xn <- matrix(0, nrow = nrow(x), ncol = ncol(x)) + for(i in seq_len(nrow(x))){ + xi <- x[i, ] + idx <- which(xi != i) + xn[i, seq_along(idx)] <- xi[idx] + } + idx <- which(colSums(xn == 0) > 0) + if(length(idx) > 0){ + xn <- xn[,-idx] + } + xn + } + + #Bias Dataframe + biasDF <- data.frame( + rowSums = Matrix::rowSums(assay(object)), + bias = bias, + length = rowData(object)$end - rowData(object)$start + ) + + #Quantile Normalize + biasDFN <- apply(biasDF, 2, .getQuantiles) + + #Get KNN + knnObj <- nabor::knn( + data = biasDFN, + k = nIterations + 1 + )[[1]] + + #Filter Self + knnObj <- .cleanSelf(knnObj) + + #Shuffle + idx <- seq_len(ncol(knnObj)) + knnObj2 <- matrix(0, nrow = nrow(knnObj), ncol = ncol(knnObj)) + for(x in seq_len(nrow(knnObj2))){ + knnObj2[x,] <- knnObj[x, sample(idx, length(idx))] + } + + knnObj2 + +} + + + + + diff --git a/R/MatrixGeneExpression.R b/R/MatrixGeneExpression.R new file mode 100644 index 00000000..513c04fe --- /dev/null +++ b/R/MatrixGeneExpression.R @@ -0,0 +1,300 @@ +#################################################################### +# Gene Activity Score Methods +#################################################################### + +#' Add Gene Expression Matrix to ArrowFiles or an ArchRProject +#' +#' This function, for each sample, will add gene expression values from a paired scATAC-seq + scRNA-seq +#' multi modal assay to the ArrowFiles or ArchRProject. +#' +#' @param input An `ArchRProject` object or character vector of ArrowFiles. +#' @param seRNA A a scRNA-seq `SummarizedExperiment` (cell x gene) to be integrated with the scATAC-seq data. +#' Cell names from this object much match those of the cell names in the ArrowFiles/ArchRProject. We will add support shortly +#' for Seurat Objects (see `Seurat::as.SingleCellExperiment`). The provided values `MUST` be in counts (integer), not log transformed. +#' @param chromSizes A GRanges object of the chromosome lengths. See `getChromSizes` for more info. +#' @param excludeChr A character vector containing the `seqnames` of the chromosomes that should be excluded from this analysis. +#' @param scaleTo Each column in the calculated gene score matrix will be normalized to a column sum designated by `scaleTo`. +#' @param verbose A boolean describing whether to print to console messages of progress. +#' @param threads The number of threads to be used for parallel computing. +#' @param parallelParam A list of parameters to be passed for biocparallel/batchtools parallel computing. +#' @param force A boolean value indicating whether to force the matrix indicated by `matrixName` to be overwritten if it already exist in the given `input`. +#' @param logFile The path to a file to be used for logging ArchR output. +#' @export +addGeneExpressionMatrix <- function( + input = NULL, + seRNA = NULL, + chromSizes = getChromSizes(input), + excludeChr = c("chrM", "chrY"), + scaleTo = 10000, + verbose = TRUE, + threads = getArchRThreads(), + parallelParam = NULL, + force = TRUE, + logFile = createLogFile("addGeneExpressionMatrix") + ){ + + if(inherits(input, "ArchRProject")){ + ArrowFiles <- getArrowFiles(input) + allCells <- rownames(getCellColData(input)) + outDir <- getOutputDirectory(input) + if(is.null(chromSizes)){ + chromSizes <- getChromSizes(input) + } + }else if(inherits(input, "character")){ + outDir <- "" + ArrowFiles <- input + allCells <- NULL + if(is.null(chromSizes)){ + chromSizes <- getChromSizes() + } + }else{ + stop("Error Unrecognized Input!") + } + if(!all(file.exists(ArrowFiles))){ + stop("Error Input Arrow Files do not all exist!") + } + + .startLogging(logFile = logFile) + .logThis(mget(names(formals()),sys.frame(sys.nframe())), "addGeneExpressionMatrix Input-Parameters", logFile = logFile) + + cellsInArrows <- unlist(lapply(ArrowFiles, .availableCells), use.names=FALSE) + if(!is.null(allCells)){ + cellsInArrows <- allCells + } + overlap <- sum(cellsInArrows %in% colnames(seRNA)) / length(cellsInArrows) + .logMessage("Overlap w/ scATAC = ", round(overlap,3), logFile = logFile, verbose = TRUE) + + if(overlap == 0){ + stop("No overlap found with scATAC!") + } + + splitCells <- split(cellsInArrows, stringr::str_split(cellsInArrows, pattern = "#", simplify=TRUE)[,1]) + overlapPerSample <- unlist(lapply(splitCells, function(x) sum(x %in% colnames(seRNA)))) + .logMessage("Overlap Per Sample w/ scATAC : ", paste(paste(names(overlapPerSample), round(overlapPerSample,3), sep = "="), collapse=","), logFile = logFile, verbose = TRUE) + + #Get QC Info + assay(se) <- Matrix::Matrix(assay(se), sparse=TRUE) + nUMI <- Matrix::colSums(assay(seRNA)) + mb <- assay(seRNA) + mb@x[mb@x > 0] <- 1 + nGenes <- Matrix::colSums(mb) + rm(mb) + MitoRatio <- Matrix::colSums(assay(seRNA)[grep("^MT", rownames(assay(seRNA))),]) / nUMI + RiboRatio <- Matrix::colSums(assay(seRNA)[grep("^RP", rownames(assay(seRNA))),]) / nUMI + qcInfo <- DataFrame(nUMI = nUMI, nGenes = nGenes, MitoRatio = MitoRatio, RiboRatio = RiboRatio) + colnames(qcInfo) <- paste0("Gex_", colnames(qcInfo)) + + #Filter seRNA + seRNA <- seRNA[BiocGenerics::which(seqnames(seRNA) %bcin% seqnames(chromSizes))] + seRNA <- seRNA[BiocGenerics::which(seqnames(seRNA) %bcni% excludeChr)] + + #Dedup + idxDup <- which(rownames(seRNA) %in% rownames(seRNA[duplicated(rownames(seRNA))])) + names(idxDup) <- rownames(seRNA)[idxDup] + if(length(idxDup) > 0){ + dupOrder <- idxDup[order(Matrix::rowSums(assay(seRNA[idxDup])),decreasing=TRUE)] + dupOrder <- dupOrder[!duplicated(names(dupOrder))] + seRNA <- seRNA[-as.vector(idxDup[idxDup %ni% dupOrder])] + } + + #Add Index To RNA Ranges + features <- rowRanges(seRNA) + features <- sort(sortSeqlevels(features), ignore.strand = TRUE) + features <- split(features, seqnames(features)) + features <- lapply(features, function(x){ + mcols(x)$idx <- seq_along(x) + return(x) + }) + features <- Reduce("c",features) + rowData(seRNA)$idx <- features[rownames(seRNA)]$idx + + .logThis(qcInfo, "qcInfo", logFile = logFile) + + #Add args to list + args <- mget(names(formals()), sys.frame(sys.nframe()))#as.list(match.call()) + args$ArrowFiles <- ArrowFiles + args$allCells <- allCells + args$X <- seq_along(ArrowFiles) + args$FUN <- .addGeneExpressionMat + args$registryDir <- file.path(outDir, "addGeneExpressionMatRegistry") + args$qcInfo <- qcInfo + args$seRNA <- seRNA + + #Remove Input from args + args$input <- NULL + args$chromSizes <- NULL + + #Run With Parallel or lapply + outList <- .batchlapply(args) + + .endLogging(logFile = logFile) + + #Return Output + if(inherits(input, "ArchRProject")){ + + qcInfo <- qcInfo[rownames(qcInfo) %in% input$cellNames, ] + + for(i in seq_len(ncol(qcInfo))){ + input <- addCellColData( + ArchRProj = input, + data = as.vector(qcInfo[,i]), + name = paste0(colnames(qcInfo)[i]), + cells = paste0(rownames(qcInfo)), + force = force + ) + } + + return(input) + + }else{ + + return(unlist(outList)) + + } + + +} + +.addGeneExpressionMat <- function( + i = NULL, + ArrowFiles = NULL, + seRNA = NULL, + qcInfo = NULL, + excludeChr = NULL, + scaleTo = NULL, + cellNames = NULL, + allCells = NULL, + tstart = NULL, + subThreads = 1, + force = FALSE, + verbose = TRUE, + logFile = NULL + ){ + + ArrowFile <- ArrowFiles[i] + sampleName <- .sampleName(ArrowFile) + + #Check + matrixName <- "GeneExpressionMatrix" + o <- h5closeAll() + o <- .createArrowGroup(ArrowFile = ArrowFile, group = matrixName, force = force, logFile = logFile) + + if(is.null(tstart)){ + tstart <- Sys.time() + } + + #Get all cell ids before constructing matrix + if(is.null(cellNames)){ + cellNames <- .availableCells(ArrowFile) + } + + if(!is.null(allCells)){ + cellNames <- cellNames[cellNames %in% allCells] + } + + #Identify Overlapping Cells + cellNames <- cellNames[cellNames %in% colnames(seRNA)] + seRNA <- seRNA[, cellNames] + + dfParams <- data.frame( + scaleTo = scaleTo, + exclude = excludeChr, + stringsAsFactors = FALSE + ) + + featureDF <- data.frame( + seqnames = paste0(seqnames(seRNA)), + idx = mcols(seRNA)$idx, + start = start(seRNA), + end = end(seRNA), + name = rownames(seRNA), + strand = as.integer(strand(seRNA)), + stringsAsFactors = FALSE + ) + + .logThis(featureDF, "featureDF", logFile = logFile) + + ###################################### + # Initialize SP Mat Group + ###################################### + o <- .initializeMat( + ArrowFile = ArrowFile, + Group = matrixName, + Class = "double", + Units = "NormCounts", + cellNames = cellNames, + params = dfParams, + featureDF = featureDF, + force = TRUE + ) + + ###################################### + # Normalize and Insert Log2 Normalized Counts + ###################################### + + assay(seRNA) <- .normalizeCols(assay(seRNA), scaleTo = scaleTo) + + uniqueChr <- unique(featureDF$seqnames) + + for(z in seq_along(uniqueChr)){ + + o <- tryCatch({ + + o <- h5closeAll() + chr <- uniqueChr[z] + matz <- assay(seRNA[BiocGenerics::which(seqnames(seRNA)==chr), ]) + .logDiffTime(sprintf("Adding %s to %s for Chr (%s of %s)!", sampleName, matrixName, z, length(uniqueChr)), tstart, verbose = verbose, logFile = logFile) + + #Write sparseMatrix to Arrow File! + o <- .addMatToArrow( + mat = matz, + ArrowFile = ArrowFile, + Group = paste0(matrixName, "/", chr), + binarize = FALSE, + addColSums = TRUE, + addRowSums = TRUE, + addRowVarsLog2 = TRUE #add for integration analyses + ) + gc() + + if(z %% 3 == 0 | z == length(uniqueChr)){ + gc() + } + + }, error = function(e){ + + errorList <- list( + ArrowFile = ArrowFile, + chr = chr, + mat = if(exists("matz", inherits = FALSE)) matz else "matz" + ) + + .logError(e, fn = ".addGeneExpressionMat AddToArrow", info = sampleName, errorList = errorList, logFile = logFile) + + }) + + + } + + #Add Info To Arrow Files + allCells <- .availableCells(ArrowFile, passQC = FALSE) + + qcInfoi <- qcInfo[rownames(qcInfo) %in% colnames(seRNA), ] + + for(i in seq_len(ncol(qcInfo))){ + + infoi <- rep(-1, length(allCells)) + names(infoi) <- allCells + infoi[rownames(qcInfoi)] <- qcInfoi[,i] + + o <- h5closeAll() + h5write(infoi, file = ArrowFile, paste0("Metadata/", colnames(qcInfoi)[i])) + o <- h5closeAll() + + } + + ArrowFile + +} + + diff --git a/R/MatrixGeneScores.R b/R/MatrixGeneScores.R index 780875e1..2fba6ffb 100644 --- a/R/MatrixGeneScores.R +++ b/R/MatrixGeneScores.R @@ -20,6 +20,21 @@ #' @param useGeneBoundaries A boolean value indicating whether gene boundaries should be employed during gene activity score #' calculation. Gene boundaries refers to the process of preventing tiles from contributing to the gene score of a given gene #' if there is a second gene's transcription start site between the tile and the gene of interest. +<<<<<<< HEAD +======= +#' @param geneUpstream An integer describing the number of bp upstream the gene to extend the gene body. This effectively makes the gene body larger as there +#' are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'. +#' @param geneDownstream An integer describing the number of bp downstream the gene to extend the gene body.This effectively makes the gene body larger as there +#' are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'. +#' @param useTSS A boolean describing whether to build gene model based on gene TSS or the gene body. +#' @param extendTSS A boolean describing whether to extend the gene TSS. By default useTSS uses the 1bp TSS while this parameter enables the extension of this +#' region with 'geneUpstream' and 'geneDownstream' respectively. +#' @param tileSize The size of the tiles used for binning counts prior to gene activity score calculation. +#' @param ceiling The maximum counts per tile allowed. This is used to prevent large biases in tile counts. +#' @param geneScaleFactor A numeric scaling factor to weight genes based on the inverse of there length i.e. [(Scale Factor)/(Gene Length)]. This +#' is scaled from 1 to the scale factor. Small genes will be the scale factor while extremely large genes will be closer to 1. This scaling helps with +#' the relative gene score value. +>>>>>>> 2f022a4... Release 1.0.0 (#376) #' @param scaleTo Each column in the calculated gene score matrix will be normalized to a column sum designated by `scaleTo`. #' @param excludeChr A character vector containing the `seqnames` of the chromosomes that should be excluded from this analysis. #' @param blacklist A `GRanges` object containing genomic regions to blacklist that may be extremeley over-represented and thus @@ -41,6 +56,7 @@ addGeneScoreMatrix <- function( geneDownstream = 0, #New Param useGeneBoundaries = TRUE, useTSS = FALSE, #New Param + extendTSS = FALSE, tileSize = 500, ceiling = 4, geneScaleFactor = 5, #New Param @@ -145,6 +161,7 @@ addGeneScoreMatrix <- function( geneDownstream = 0, #New Param useGeneBoundaries = TRUE, useTSS = FALSE, #New Param + extendTSS = FALSE, tileSize = 500, ceiling = 4, geneScaleFactor = 5, #New Param @@ -200,6 +217,9 @@ addGeneScoreMatrix <- function( geneRegions$geneStart <- start(resize(geneRegions, 1, "start")) geneRegions$geneEnd <- start(resize(geneRegions, 1, "end")) geneRegions <- resize(geneRegions, 1, "start") + if(extendTSS){ + geneRegions <- extendGR(gr = geneRegions, upstream = geneUpstream, downstream = geneDownstream) + } geneRegions$geneWeight <- geneScaleFactor }else{ .logMessage(paste0(sampleName, " .addGeneScoreMat useTSS = FALSE")) @@ -387,7 +407,7 @@ addGeneScoreMatrix <- function( totalGSz <- Matrix::colSums(matGS) #Save tmp file - saveRDS(matGS, file = paste0(tmpFile, "-", chrz, ".rds"), compress = FALSE) + .safeSaveRDS(matGS, file = paste0(tmpFile, "-", chrz, ".rds"), compress = FALSE) #Clean Memory rm(isMinus, signDist, extendedGeneRegion, uniqueTiles) diff --git a/R/MatrixTiles.R b/R/MatrixTiles.R index 378b8c51..23f90f4e 100644 --- a/R/MatrixTiles.R +++ b/R/MatrixTiles.R @@ -190,11 +190,21 @@ addTileMatrix <- function( #N Tiles nTiles <- trunc(chromLengths[z] / tileSize) + 1 - #Create Sparse Matrix + #Match Cells matchID <- S4Vectors::match(mcols(fragments)$RG, cellNames) + + #Log Info + .logThis(nTiles, paste0("NTiles_TileMatrix_",z,"_",chr), logFile = logFile) + .logThis(length(cellNames), paste0("NCells_TileMatrix_",z,"_",chr), logFile = logFile) + .logThis(trunc(min(start(fragments)) / tileSize) + 1, paste0("MinTile_TileMatrix_",z,"_",chr), logFile = logFile) + .logThis(trunc(max(end(fragments)) / tileSize) + 1, paste0("MaxTile_TileMatrix_",z,"_",chr), logFile = logFile) + .logThis(min(matchID), paste0("MinCell_TileMatrix_",z,"_",chr), logFile = logFile) + .logThis(max(matchID), paste0("MaxCell_TileMatrix_",z,"_",chr), logFile = logFile) + + #Create Sparse Matrix mat <- Matrix::sparseMatrix( i = c(trunc(start(fragments) / tileSize), trunc(end(fragments) / tileSize)) + 1, - j = c(matchID, matchID), + j = as.vector(c(matchID, matchID)), x = rep(1, 2*length(fragments)), dims = c(nTiles, length(cellNames)) ) diff --git a/R/ModuleScore.R b/R/ModuleScore.R new file mode 100644 index 00000000..99af34de --- /dev/null +++ b/R/ModuleScore.R @@ -0,0 +1,122 @@ +#' Add Module Scores to an ArchRProject +#' +#' This function computes imputations weights that describe each cell as a linear combination of many cells based on a MAGIC diffusion matrix. +#' +#' RRR +#' +#' @param ArchRProj An `ArchRProject` object. +#' @param seed A number to be used as the seed for random number generation. It is recommended to keep track of the seed used so that you can +#' reproduce results downstream. +#' @param threads The number of threads to be used for parallel computing. +#' @param logFile The path to a file to be used for logging ArchR output. +#' @export +addModuleScore <- function( + ArchRProj = NULL, + useMatrix = NULL, + name = "Module", + features = NULL, + nBin = 25, + nBgd = 100, + seed = 1, + threads = getArchRThreads(), + logFile = createLogFile("addModuleScore") + ){ + + if(!is.null(seed)) set.seed(seed) + + #Get Feature DF + featureDF <- ArchR:::.getFeatureDF(head(getArrowFiles(ArchRProj),2), subGroup=useMatrix) + rownames(featureDF) <- paste0(featureDF$seqnames, ":", featureDF$idx) + featureDF$Match <- seq_len(nrow(featureDF)) + + if(useMatrix %ni% getAvailableMatrices(ArchRProj)){ + stop("useMatrix not in available matrices! See getAvailableMatrices!") + } + + matrixClass <- h5read(getArrowFiles(ArchRProj)[1], paste0(useMatrix, "/Info/Class")) + + if(matrixClass == "Sparse.Assays.Matrix"){ + if(!all(unlist(lapply(unlist(features), function(x) grepl(":",x))))){ + .logMessage("When accessing features from a matrix of class Sparse.Assays.Matrix it requires seqnames\n(denoted by seqnames:name) specifying to which assay to pull the feature from.\nIf confused, try getFeatures(ArchRProj, useMatrix) to list out available formats for input!", logFile = logFile) + stop("When accessing features from a matrix of class Sparse.Assays.Matrix it requires seqnames\n(denoted by seqnames:name) specifying to which assay to pull the feature from.\nIf confused, try getFeatures(ArchRProj, useMatrix) to list out available formats for input!") + } + } + + if(grepl(":",unlist(features)[1])){ + + sname <- stringr::str_split(unlist(features),pattern=":",simplify=TRUE)[,1] + name <- stringr::str_split(unlist(features),pattern=":",simplify=TRUE)[,2] + + idx <- lapply(seq_along(name), function(x){ + ix <- intersect(which(tolower(name[x]) == tolower(featureDF$name)), BiocGenerics::which(tolower(sname[x]) == tolower(featureDF$seqnames))) + if(length(ix)==0){ + .logStop(sprintf("FeatureName (%s) does not exist! See getFeatures", name[x]), logFile = logFile) + } + ix + }) %>% unlist + + }else{ + + idx <- lapply(seq_along(unlist(features)), function(x){ + ix <- which(tolower(unlist(features)[x]) == tolower(featureDF$name))[1] + if(length(ix)==0){ + .logStop(sprintf("FeatureName (%s) does not exist! See getFeatures", unlist(features)[x]), logFile = logFile) + } + ix + }) %>% unlist + + } + + if(is.null(names(features))){ + names(features) <- paste0(name, seq_along(features)) + }else{ + names(features) <- paste0(name, ".", names(features)) + } + + featuresUse <- featureDF[idx,] + featuresUse$Module <- Rle(stack(features)[,2]) + + #Get Averages + rS <- ArchR:::.getRowSums(ArrowFiles = getArrowFiles(ArchRProj), useMatrix = useMatrix) + rS <- rS[order(rS[,3]), ] + rS$Bins <- Rle(ggplot2::cut_number(x = rS[,3] + rnorm(length(rS[,3]))/1e30, n = nBin, labels = FALSE, right = FALSE)) + rS$Match <- match(paste0(rS$seqnames, ":", rS$idx), rownames(featureDF)) + + if(nBgd > min(rS$Bins@lengths)){ + stop("nBgd must be lower than ", min(rS$Bins@lengths), "!") + } + + idxMatch <- match(paste0(featuresUse$seqnames, ":", featuresUse$idx), paste0(rS$seqnames, ":", rS$idx)) + featuresUse$Bins <- as.vector(rS$Bins[idxMatch]) + + #MakeLists + featureList <- split(featuresUse$Match, featuresUse$Module) + moduleList <- split(featuresUse$Bins, featuresUse$Module) + binList <- split(rS$Match, rS$Bins) + + dfM <- lapply(seq_along(featureList), function(x){ + message("Computing Module ",x, " of ", length(featureList)) + binx <- binList[moduleList[[x]]] + idxFgd <- featureList[[x]] + idxBgd <- unlist(lapply(binx, function(x) sample(x, nBgd)), use.names=FALSE) + m <- ArchR:::.getPartialMatrix( + ArrowFiles = getArrowFiles(ArchRProj), + featureDF = featureDF[c(idxFgd, idxBgd), ], + useMatrix = useMatrix, + cellNames = ArchRProj$cellNames, + threads = threads, + verbose = FALSE, + doSampleCells = FALSE + ) + Matrix::colMeans(m[seq_along(idxFgd), ]) - Matrix::colMeans(m[-seq_along(idxFgd), ]) + }) %>% Reduce("cbind", .) + + for(x in seq_len(ncol(dfM))){ + ArchRProj <- addCellColData(ArchRProj, data = dfM[,x], name=names(featureList)[x], cells=rownames(dfM), force = TRUE) + } + + ArchRProj + +} + + diff --git a/R/MultiModal.R b/R/MultiModal.R new file mode 100644 index 00000000..ac20df74 --- /dev/null +++ b/R/MultiModal.R @@ -0,0 +1,180 @@ +#################################################################### +# Import Multi-Modal Data +#################################################################### + +#' Import Feature Matrix from 10x Feature HDF5 file. +#' +#' This function will import the feature matrix from a 10x feature hdf5 file. +#' +#' @param input A character of paths to 10x feature hdf5 file(s). These will traditionally have a suffix similar to "filtered_feature_bc_matrix.h5". +#' @param names A character of sample names associated with each input file. +#' @param featureType The name of the feature to extract from the 10x feature file. +#' See https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/advanced/h5_matrices for more information. +#' @export +import10xFeatureMatrix <- function( + input = NULL, + names = NULL, + featureType = "Gene Expression" + ){ + + if(!all(file.exists(input))){ + stop("Not all input file paths exist!") + } + + featureMats <- lapply(seq_along(input), function(y){ + message("Importing Feature Matrix ", y, " of ", length(input)) + .importFM(featureMatrix = input[y], featureType = featureType, name = names[y]) + }) + + featureMats <- tryCatch({ + Reduce("cbind", featureMats) + }, error = function(e){ + message("Error in combining individual feature matrices! Returning as a list of individual feature matrices!") + featureMats + }) + + featureMats + +} + +.importFM <- function(featureMatrix = NULL, featureType = NULL, name = NULL){ + + o <- h5closeAll() + barcodes <- h5read(featureMatrix, "/matrix/barcodes") + data <- h5read(featureMatrix, "/matrix/data") + indices <- h5read(featureMatrix, "/matrix/indices") + indptr <- h5read(featureMatrix, "/matrix/indptr") + shape <- h5read(featureMatrix, "/matrix/shape") + + spMat <- sparseMatrix( + i = indices, + p = indptr, + x = data, + dims = shape, + index1 = FALSE + ) + + colnames(spMat) <- paste0(name, "#", barcodes) + + features <- h5read(featureMatrix, "/matrix/features") + features <- lapply(seq_along(features), function(x){ + if(length(features[[x]]) == nrow(spMat)){ + if(object.size(features[[x]]) > object.size(Rle(features[[x]]))){ + df <- DataFrame(x = Rle(features[[x]])) + }else{ + df <- DataFrame(x = features[[x]]) + } + colnames(df) <- names(features)[x] + df + }else{ + NULL + } + }) + features <- Reduce("cbind",features[!unlist(lapply(features,is.null))]) + + se <- SummarizedExperiment(assays = SimpleList(counts = spMat), rowData = features) + + rownames(se) <- features$name + + if("feature_type" %in% colnames(rowData(se))){ + if(!is.null(featureType)){ + idx <- BiocGenerics::which(rowData(se)$feature_type %bcin% featureType) + if(length(idx) == 0){ + stop("Error featureType not within provided features!") + } + se <- se[idx] + } + } + + if("interval" %in% colnames(rowData(se))){ + idxNA <- which(rowData(se)$interval=="NA") + if(length(idxNA) > 0){ + se <- se[-idxNA, ] + } + rr <- GRanges(paste0(rowData(se)$interval)) + mcols(rr) <- rowData(se) + se <- SummarizedExperiment(assays = SimpleList(counts = assay(se)), rowRanges = rr) + } + + idxDup <- which(rownames(se) %in% rownames(se[duplicated(rownames(se))])) + names(idxDup) <- rownames(se)[idxDup] + if(length(idxDup) > 0){ + dupOrder <- idxDup[order(Matrix::rowSums(assay(se[idxDup])),decreasing=TRUE)] + dupOrder <- dupOrder[!duplicated(names(dupOrder))] + se <- se[-as.vector(idxDup[idxDup %ni% dupOrder])] + } + + gc() + + se + +} + +#################################################################### +# Combined Modalities +#################################################################### + +#' Combine two or more modalities dimensionality reductions. +#' +#' This function will combine two or more modalities dimensionality reductions into a single reduction. +#' +#' @param ArchRProj An `ArchRProject` object. +#' @param name The name for the combinedDims to be stored as. +#' @param reducedDims The name of the `reducedDims` objects (i.e. "IterativeLSI") to use from the designated `ArchRProject`. +#' @param dimWeights A vector of weights to be used to weight each dimensionality reduction when combining. +#' @param dimsToUse A vector containing the dimensions from the `reducedDims` objects to use. +#' @param scaleDims A boolean value that indicates whether to z-score the reduced dimensions for each cell. This is useful for minimizing +#' the contribution of strong biases (dominating early PCs) and lowly abundant populations. However, this may lead to stronger sample-specific +#' biases since it is over-weighting latent PCs. If set to `NULL` this will scale the dimensions based on the value of `scaleDims` when the +#' `reducedDims` were originally created during dimensionality reduction. This idea was introduced by Timothy Stuart. +#' @param corCutOff A numeric cutoff for the correlation of each dimension to the sequencing depth. If the dimension has a correlation to +#' sequencing depth that is greater than the `corCutOff`, it will be excluded from analysis. +#' @export +addCombinedDims <- function( + ArchRProj = NULL, + name = "CombinedDims", + reducedDims = NULL, + dimWeights = NULL, + dimsToUse = NULL, + scaleDims = NULL, + corCutOff = 0.75 + ){ + + if(is.null(dimWeights)){ + dimWeights <- rep(1, length(reducedDims)) + } + + combinedDims <- lapply(seq_along(reducedDims), function(x){ + rD <- getReducedDims( + ArchRProj = ArchRProj, + reducedDims = reducedDims[x], + dimsToUse = dimsToUse, + scaleDims = scaleDims, + corCutOff = corCutOff + ) + cV <- apply(as.matrix(rD), 2, var) + normV <- 1 / sqrt(sum(cV)) + rD * normV * dimWeights[x] + }) %>% Reduce("cbind", .) + + ArchRProj@reducedDims[[name]] <- SimpleList( + matRD = combinedDims, + scaleDims = NA, + corToDepth = list(scaled = rep(0, ncol(combinedDims)), none = rep(0, ncol(combinedDims))) + ) + + ArchRProj + +} + + + + + + + + + + + + diff --git a/R/ProjectMethods.R b/R/ProjectMethods.R index f829add3..5609cf0f 100644 --- a/R/ProjectMethods.R +++ b/R/ProjectMethods.R @@ -413,6 +413,9 @@ getGenomeAnnotation <- function(ArchRProj = NULL){ #' @param ArchRProj An `ArchRProject` object. #' @export getBlacklist <- function(ArchRProj = NULL){ + if(is.character(ArchRProj)){ + ArchRProj <- NULL + } .validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProject","null")) if(is.null(ArchRProj)){ genomeAnnotation <- getArchRGenome(genomeAnnotation = TRUE) diff --git a/R/QualityControl.R b/R/QualityControl.R index 037e5b12..20c83f30 100644 --- a/R/QualityControl.R +++ b/R/QualityControl.R @@ -4,12 +4,15 @@ #' used when making this plot. #' #' @param ArchRProj An `ArchRProject` object. +#' @param groupBy The name of the column in `cellColData` to use for grouping cells together for summarizing. +#' @param chromSizes A GRanges object of the chromosome lengths. See `getChromSizes` for more info. #' @param TSS A `GRanges` object containing the locations of stranded TSS regions. The default behavior is to try to retrieve #' this information from the `geneAnnotation` stored in the `ArchRProject`. #' @param flank An integer that specifies how far in bp (+/-) to extend the TSS for plotting. #' @param norm An integer that specifies the number of base pairs from the ends of the flanks to be used for normalization. #' For example if `flank=2000` and `norm=100`, the TSS insertions will be normalized by +/- 1900-2000 bp from the TSS. #' @param smooth An integer that indicates the smoothing window (in basepairs) to be applied to the TSS plot. +#' @param pal A color palette representing the groups from groupBy in TSS plot. #' @param returnDF A boolean value that indicates whether to return a `data.frame` containing the plot information #' instead of plotting the TSS enrichment plot. #' @param threads An integer specifying the number of threads to use for calculation. By default this uses the number of threads set by `addArchRThreads()`. @@ -17,10 +20,13 @@ #' @export plotTSSEnrichment <- function( ArchRProj = NULL, + groupBy = "Sample", + chromSizes = getChromSizes(ArchRProj), TSS = getTSS(ArchRProj), flank = 2000, norm = 100, smooth = 11, + pal = NULL, returnDF = FALSE, threads = getArchRThreads(), logFile = createLogFile("plotTSSEnrichment") @@ -39,70 +45,94 @@ plotTSSEnrichment <- function( .startLogging(logFile = logFile) .logThis(mget(names(formals()),sys.frame(sys.nframe())), "plotTSSEnrichment Input-Parameters", logFile = logFile) - ArrowFiles <- getArrowFiles(ArchRProj) - chr <- .availableChr(ArrowFiles) + chr <- paste0(seqnames(chromSizes)) chr <- gtools::mixedsort(intersect(chr, paste0(seqnames(TSS)))) - cellNames <- ArchRProj$cellNames TSS <- sort(sortSeqlevels(TSS)) splitTSS <- split(resize(TSS,1,"start"), seqnames(TSS))[chr] window <- 2 * flank + 1 + groups <- getCellColData(ArchRProj = ArchRProj, select = groupBy, drop = FALSE) + uniqGroups <- gtools::mixedsort(unique(groups[,1])) - dfTSS <- .safelapply(seq_along(ArrowFiles), function(x){ + if(threads > 1){ + h5disableFileLocking() + } + + dfTSS <- .safelapply(seq_along(uniqGroups), function(x){ - .logDiffTime(paste0(names(ArrowFiles)[x], " Computing TSS (",x," of ",length(ArrowFiles),")!"), t1 = tstart, logFile = logFile) + .logDiffTime(paste0(uniqGroups[x], " Computing TSS (",x," of ",length(uniqGroups),")!"), t1 = tstart, logFile = logFile) + + cellx <- rownames(groups)[which(paste0(groups[,1]) == uniqGroups[x])] for(i in seq_along(chr)){ TSSi <- splitTSS[[chr[i]]] - covi <- .getFragsFromArrow( - ArrowFile = ArrowFiles[x], - chr = chr[i], - out = "IRanges", - cellNames = cellNames - ) %>% {coverage(IRanges(c(start(.), end(.)), width = 1))} - - if(i == 1){ - sumTSS <- rleSumsStranded(list(chr1=covi), list(chr1=TSSi), window, as.integer) - }else{ - sumTSS <- sumTSS + rleSumsStranded(list(chr1=covi), list(chr1=TSSi), window, as.integer) - } - + covi <- unlist(suppressMessages(getFragmentsFromProject( + ArchRProj = ArchRProj, + subsetBy = chromSizes[paste0(seqnames(chromSizes)) %in% chr[i]], + cellNames = cellx, + logFile = logFile + )), use.names=FALSE) %>% + sort %>% + {coverage(IRanges(c(start(.), end(.)), width = 1))} + + .logThis(covi, paste0(uniqGroups[x], " : Cov : ", chr[i]), logFile = logFile) + + if(i == 1){ + sumTSS <- rleSumsStranded(list(chr1=covi), list(chr1=TSSi), window, as.integer) + }else{ + sumTSS <- sumTSS + rleSumsStranded(list(chr1=covi), list(chr1=TSSi), window, as.integer) + } + + .logThis(sumTSS, paste0(uniqGroups[x], " : SumTSS : ", chr[i]), logFile = logFile) + } normBy <- mean(sumTSS[c(1:norm,(flank*2-norm+1):(flank*2+1))]) df <- DataFrame( - sampleName = names(ArrowFiles)[x], + group = uniqGroups[x], x = seq_along(sumTSS) - flank - 1, value = sumTSS, - normValue = sumTSS/normBy, + normValue = sumTSS / normBy, smoothValue = .centerRollMean(sumTSS/normBy, 11) ) - .logDiffTime(paste0(names(ArrowFiles)[x], " Finished Computing TSS (",x," of ",length(ArrowFiles),")!"), t1 = tstart, logFile = logFile) + .logThis(df, paste0(uniqGroups[x], " : TSSDf"), logFile = logFile) + + .logDiffTime(paste0(uniqGroups[x], " Finished Computing TSS (",x," of ",length(uniqGroups),")!"), t1 = tstart, logFile = logFile) df }, threads = threads) %>% Reduce("rbind", .) + .logThis(dfTSS, paste0("All : TSSDf"), logFile = logFile) + .endLogging(logFile = logFile) + if(threads > 1){ + h5enableFileLocking() + } + if(returnDF){ return(dfTSS) }else{ - plotDF <- data.frame(x=dfTSS$x,v=dfTSS$smoothValue,sampleName=dfTSS$sampleName) + plotDF <- data.frame(x=dfTSS$x,v=dfTSS$smoothValue,group=dfTSS$group) plotDF <- plotDF[sort(unique(c(1,seq(1,nrow(plotDF),11),nrow(plotDF)))), , drop = FALSE] - p <- ggplot(plotDF, aes(x,v,color=sampleName)) + + if(is.null(pal)){ + pal <- paletteDiscrete(values=unique(plotDF$group)) + } + + p <- ggplot(plotDF, aes(x,v,color=group)) + geom_line(size = 1) + theme_ArchR() + xlab("Distance From Center (bp)") + ylab("Normalized Insertion Profile") + - scale_color_manual(values=paletteDiscrete(values=unique(plotDF$sampleName))) + + scale_color_manual(values=pal) + scale_y_continuous(limits = c(0, max(plotDF$v)*1.05), expand = c(0,0)) + scale_x_continuous(limits = c(min(plotDF$x), max(plotDF$x)), expand = c(0,0)) @@ -118,7 +148,10 @@ plotTSSEnrichment <- function( #' This function will plot a fragment size distribution for each sample. Only cells in the `ArchRProject` are used when making this plot. #' #' @param ArchRProj An `ArchRProject` object. +#' @param groupBy The name of the column in `cellColData` to use for grouping cells together for summarizing. +#' @param chromSizes A GRanges object of the chromosome lengths. See `getChromSizes` for more info. #' @param maxSize The maximum fragment size (in basepairs) to be included when plotting the fragment size distribution. +#' @param pal A color palette representing the groups from groupBy in fragment size plot. #' @param returnDF A boolean value that indicates whether to return a `data.frame` containing the plot information #' instead of plotting the fragment size distribution. #' @param threads An integer specifying the number of threads to use for calculation. By default this uses the number of threads set by `addArchRThreads()`. @@ -126,7 +159,10 @@ plotTSSEnrichment <- function( #' @export plotFragmentSizes <- function( ArchRProj = NULL, + groupBy = "Sample", + chromSizes = getChromSizes(ArchRProj), maxSize = 750, + pal = NULL, returnDF = FALSE, threads = getArchRThreads(), logFile = createLogFile("plotFragmentSizes") @@ -142,48 +178,61 @@ plotFragmentSizes <- function( .startLogging(logFile = logFile) .logThis(mget(names(formals()),sys.frame(sys.nframe())), "plotFragmentSizes Input-Parameters", logFile = logFile) - ArrowFiles <- getArrowFiles(ArchRProj) - chr <- gtools::mixedsort(.availableChr(ArrowFiles)) - cellNames <- ArchRProj$cellNames + chr <- paste0(seqnames(chromSizes)) + groups <- getCellColData(ArchRProj = ArchRProj, select = groupBy, drop = FALSE) + uniqGroups <- gtools::mixedsort(unique(groups[,1])) + + if(threads > 1){ + h5disableFileLocking() + } - dfFS <- .safelapply(seq_along(ArrowFiles), function(x){ + dfFS <- .safelapply(seq_along(uniqGroups), function(x){ - .logDiffTime(paste0(names(ArrowFiles)[x], " Computing FragmentSizes (",x," of ",length(ArrowFiles),")!"), t1 = tstart, logFile = logFile) + .logDiffTime(paste0(uniqGroups[x], " Computing FragmentSizes (",x," of ",length(uniqGroups),")!"), t1 = tstart, logFile = logFile) - for(i in seq_along(chr)){ + cellx <- rownames(groups)[which(paste0(groups[,1]) == uniqGroups[x])] + for(i in seq_along(chr)){ if(i == 1){ - fsi <- .getFragsFromArrow( - ArrowFile = ArrowFiles[x], - chr = chr[i], - out = "IRanges", - cellNames = cellNames - ) %>% width %>% tabulate(nbins = maxSize) + fsi <- unlist(suppressMessages(getFragmentsFromProject( + ArchRProj = ArchRProj, + subsetBy = chromSizes[paste0(seqnames(chromSizes)) %in% chr[i]], + cellNames = cellx, + logFile = logFile + )), use.names=FALSE) %>% width %>% tabulate(nbins = maxSize) }else{ - fsi <- fsi + .getFragsFromArrow( - ArrowFile = ArrowFiles[x], - chr = chr[i], - out = "IRanges", - cellNames = cellNames - ) %>% width %>% tabulate(nbins = maxSize) + fsi <- fsi + unlist(suppressMessages(getFragmentsFromProject( + ArchRProj = ArchRProj, + subsetBy = chromSizes[paste0(seqnames(chromSizes)) %in% chr[i]], + cellNames = cellx, + logFile = logFile + )), use.names=FALSE) %>% width %>% tabulate(nbins = maxSize) } - + .logThis(fsi, paste0(uniqGroups[x], " : FragSizes : ", chr[i]), logFile = logFile) } df <- DataFrame( - sampleName = names(ArrowFiles)[x], + group = uniqGroups[x], fragmentSize = seq_along(fsi), fragmentPercent = round(100*fsi/sum(fsi),4) ) - .logDiffTime(paste0(names(ArrowFiles)[x], " Finished Computing FragmentSizes (",x," of ",length(ArrowFiles),")!"), t1 = tstart, logFile = logFile) + .logThis(df, paste0(uniqGroups[x], " : Frag DF"), logFile = logFile) + + .logDiffTime(paste0(uniqGroups[x], " Finished Computing FragmentSizes (",x," of ",length(uniqGroups),")!"), t1 = tstart, logFile = logFile) df }, threads = threads) %>% Reduce("rbind", .) + .logThis(dfFS, paste0("All : FragSizes DF"), logFile = logFile) + .endLogging(logFile = logFile) + if(threads > 1){ + h5enableFileLocking() + } + if(returnDF){ return(dfFS) @@ -192,12 +241,16 @@ plotFragmentSizes <- function( plotDF <- data.frame(dfFS) - p <- ggplot(plotDF, aes(fragmentSize, fragmentPercent,color=sampleName)) + + if(is.null(pal)){ + pal <- paletteDiscrete(values=unique(plotDF$group)) + } + + p <- ggplot(plotDF, aes(fragmentSize, fragmentPercent,color=group)) + geom_line(size = 1) + theme_ArchR() + xlab("ATAC-seq Fragment Size (bp)") + ylab("Percentage of Fragments") + - scale_color_manual(values=paletteDiscrete(values=unique(plotDF$sampleName))) + + scale_color_manual(values=pal) + scale_y_continuous(limits = c(0, max(plotDF$fragmentPercent)*1.05), expand = c(0,0)) + scale_x_continuous(limits = c(min(plotDF$fragmentSize), max(plotDF$fragmentSize)), expand = c(0,0)) @@ -207,3 +260,5 @@ plotFragmentSizes <- function( } + + diff --git a/R/RNAIntegration.R b/R/RNAIntegration.R index 7c4b1be4..6e751a66 100644 --- a/R/RNAIntegration.R +++ b/R/RNAIntegration.R @@ -29,6 +29,13 @@ #' should have a row for each single cell described in `row.names` and 2 columns, one for each dimension of the embedding. #' @param embeddingRNA A `data.frame` of cell embeddings such as a UMAP for scRNA-seq cells to be used for density sampling. The `data.frame` object #' should have a row for each single cell described in `row.names` and 2 columns, one for each dimension of the embedding. +#' @param dimsToUse A vector containing the dimensions from the `reducedDims` object to use in clustering. +#' @param scaleDims A boolean value that indicates whether to z-score the reduced dimensions for each cell. This is useful for minimizing +#' the contribution of strong biases (dominating early PCs) and lowly abundant populations. However, this may lead to stronger sample-specific +#' biases since it is over-weighting latent PCs. If set to `NULL` this will scale the dimensions based on the value of `scaleDims` when the +#' `reducedDims` were originally created during dimensionality reduction. This idea was introduced by Timothy Stuart. +#' @param corCutOff A numeric cutoff for the correlation of each dimension to the sequencing depth. If the dimension has a +#' correlation to sequencing depth that is greater than the `corCutOff`, it will be excluded from analysis. #' @param plotUMAP A boolean determining whether to plot a UMAP for each integration block. #' @param UMAPParams The list of parameters to pass to the UMAP function if "plotUMAP = TRUE". See the function `umap` in the uwot package. #' @param nGenes The number of variable genes determined by `Seurat::FindVariableGenes()` to use for integration. @@ -60,6 +67,9 @@ addGeneIntegrationMatrix <- function( sampleCellsRNA = 10000, embeddingATAC = NULL, embeddingRNA = NULL, + dimsToUse = 1:30, + scaleDims = NULL, + corCutOff = 0.75, plotUMAP = TRUE, UMAPParams = list(n_neighbors = 40, min_dist = 0.4, metric = "cosine", verbose = FALSE), nGenes = 2000, @@ -90,6 +100,9 @@ addGeneIntegrationMatrix <- function( .validInput(input = sampleCellsRNA, name = "sampleCellsRNA", valid = c("integer", "null")) .validInput(input = embeddingATAC, name = "embeddingATAC", valid = c("data.frame", "null")) .validInput(input = embeddingRNA, name = "embeddingRNA", valid = c("data.frame", "null")) + .validInput(input = reducedDims, name = "reducedDims", valid = c("character")) + .validInput(input = dimsToUse, name = "dimsToUse", valid = c("numeric", "null")) + .validInput(input = scaleDims, name = "scaleDims", valid = c("boolean", "null")) .validInput(input = plotUMAP, name = "plotUMAP", valid = c("boolean")) .validInput(input = UMAPParams, name = "UMAPParams", valid = c("list")) .validInput(input = nGenes, name = "nGenes", valid = c("integer")) @@ -227,6 +240,15 @@ addGeneIntegrationMatrix <- function( ######################################################################################### # 3. Create Integration Blocks ######################################################################################### + + #Check Gene Names And Seurat RowNames + geneDF <- .getFeatureDF(getArrowFiles(ArchRProj), useMatrix) + sumOverlap <- sum(unique(geneDF$name) %in% unique(rownames(seuratRNA))) + if(sumOverlap < 5){ + stop("Error not enough overlaps (",sumOverlap,") between gene names from gene scores (ArchR) and rna matrix (seRNA)!") + } + .logDiffTime(paste0("Found ", sumOverlap, " overlapping gene names from gene scores and rna matrix!"), tstart, verbose = TRUE, logFile = logFile) + .logDiffTime("Creating Integration Blocks", tstart, verbose = verbose, logFile = logFile) blockList <- SimpleList() @@ -321,10 +343,7 @@ addGeneIntegrationMatrix <- function( h5disableFileLocking() } - rD <- getReducedDims( - ArchRProj = ArchRProj, - reducedDims = reducedDims - ) + rD <- getReducedDims(ArchRProj = ArchRProj, reducedDims = reducedDims, corCutOff = corCutOff, dimsToUse = dimsToUse) #Create Output Directory outDir1 <- getOutputDirectory(ArchRProj) @@ -389,6 +408,10 @@ addGeneIntegrationMatrix <- function( imputeParams <- list() imputeParams$ArchRProj <- subProj imputeParams$randomSuffix <- TRUE + imputeParams$reducedDims <- reducedDims + imputeParams$dimsToUse <- dimsToUse + imputeParams$scaleDims <- scaleDims + imputeParams$corCutOff <- corCutOff imputeParams$threads <- 1 imputeParams$logFile <- logFile subProj <- suppressMessages(do.call(addImputeWeights, imputeParams)) @@ -475,7 +498,7 @@ addGeneIntegrationMatrix <- function( jointCCA[paste0(colnames(subRNA), "_reference"), "Group"] <- subRNA$Group jointCCA[paste0(matchDF$cellNames, "_query"), "Group"] <- matchDF$predictedGroup jointCCA[paste0(matchDF$cellNames, "_query"), "Score"] <- matchDF$predictionScore - saveRDS(object = jointCCA, file = file.path(outDir3, paste0("Save-Block", i,"-JointCCA.rds"))) + .safeSaveRDS(object = jointCCA, file = file.path(outDir3, paste0("Save-Block", i,"-JointCCA.rds"))) #Clean Memory rm(transferParams, transferAnchors) @@ -583,7 +606,7 @@ addGeneIntegrationMatrix <- function( #Add UMAP and Save Again jointCCA$UMAP1 <- uwotUmap[,1] jointCCA$UMAP2 <- uwotUmap[,2] - saveRDS(object = jointCCA, file = file.path(outDir3, paste0("Save-Block", i,"-JointCCA.rds"))) + .safeSaveRDS(object = jointCCA, file = file.path(outDir3, paste0("Save-Block", i,"-JointCCA.rds"))) p1 <- ggPoint( x = uwotUmap[,1], diff --git a/R/Trajectory.R b/R/Trajectory.R index 57e85454..69d28c65 100644 --- a/R/Trajectory.R +++ b/R/Trajectory.R @@ -277,7 +277,7 @@ getTrajectory <- function( .validInput(input = useMatrix, name = "useMatrix", valid = c("character")) .validInput(input = groupEvery, name = "groupEvery", valid = c("numeric")) .validInput(input = log2Norm, name = "log2Norm", valid = c("boolean")) - .validInput(input = scaleTo, name = "scaleTo", valid = c("numeric")) + .validInput(input = scaleTo, name = "scaleTo", valid = c("numeric", "null")) .validInput(input = smoothWindow, name = "smoothWindow", valid = c("integer")) .validInput(input = threads, name = "threads", valid = c("integer")) @@ -900,6 +900,380 @@ plotTrajectory <- function( list(out, out2) } + + +################################################################### +# New Trajectory Analyses +# +# - Support for Monocle3 based trajectory analysis +# - Support for Slingshot based trajectory analysis +# +################################################################### + +################################################################### +# Monocle3 +################################################################### + +#' Get a Monocle CDS of Trajectories that can be added to an ArchRProject #NEW +#' +#' This function will use monocle3 to find trajectories and then returns a monocle CDS object that can be used as +#' input for `addMonocleTrajectory`. +#' +#' @param ArchRProj An `ArchRProject` object. +#' @param name A string indicating the name of the fitted trajectory. +#' @param useGroups A character vector that is used to select a subset of groups by name from the designated `groupBy` column +#' in `cellColData`. This limits the groups used to identify trajectories. +#' @param principalGroup The principal group which represents the group that will be the starting point for all trajectories. +#' @param groupBy A string indicating the column name from `cellColData` that contains the cell group definitions used in +#' `useGroups` to constrain trajectory analysis. +#' @param embedding A string indicating the name of the `embedding` object from the `ArchRProject` that should be used for trajectory analysis. +#' @param clusterParams A list of parameters to be added when clustering cells for monocle3 with `monocle3::cluster_cells`. +#' @param graphParams A list of parameters to be added when learning graphs for monocle3 with `monocle3::learn_graph`. +#' @param seed A number to be used as the seed for random number generation for trajectory creation. +#' @export +getMonocleTrajectories <- function( + ArchRProj = NULL, + name = "Trajectory", + useGroups = NULL, + principalGroup = NULL, + groupBy = NULL, + embedding = NULL, + clusterParams = list(), + graphParams = list(), + seed = 1 + ){ + + .validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) + .validInput(input = name, name = "name", valid = c("character")) + .validInput(input = useGroups, name = "useGroups", valid = c("character")) + .validInput(input = principalGroup, name = "principalGroup", valid = c("character")) + .validInput(input = groupBy, name = "groupBy", valid = c("character")) + .validInput(input = embedding, name = "embedding", valid = c("character")) + .validInput(input = clusterParams, name = "clusterParams", valid = c("list")) + .validInput(input = graphParams, name = "graphParams", valid = c("list")) + .validInput(input = seed, name = "seed", valid = c("numeric")) + + .requirePackage("monocle3") + + set.seed(seed) + + message("Running Monocole3 Trajectory Infrastructure!") + + #Create CDS + sce <- SingleCellExperiment( + assays = SimpleList( + counts = as(matrix(rnorm(nCells(ArchRProj) * 3), ncol = nCells(ArchRProj), nrow = 3), "dgCMatrix") + ), + colData = getCellColData(ArchRProj) + ) + + cds <- methods::new( + "cell_data_set", + assays = SummarizedExperiment::Assays(list(counts = methods::as(assay(sce), "dgCMatrix"))), + colData = colData(sce), + int_elementMetadata = int_elementMetadata(sce), + int_colData = int_colData(sce), + int_metadata = int_metadata(sce), + metadata = metadata(sce), + NAMES = NULL, + elementMetadata = elementMetadata(sce)[, 0], + rowRanges = rowRanges(sce) + ) + metadata(cds)$cds_version <- Biobase::package.version("monocle3") + + rm(sce) + + #Add Embedding + message("Adding Embedding") + reducedDims(cds)$UMAP <- getEmbedding(ArchRProj, embedding = embedding) + + if(!is.null(useGroups)){ + cds <- cds[, which(colData(cds)[, groupBy] %in% useGroups)] + } + + #Check principalGroup + pCells <- which(colData(cds)[, groupBy] == principalGroup) + if(length(pCells) == 0){ + stop("No Cells in groupBy are equal to principalGroup") + } + + #Run Clustering on Embedding and LearnGraph + message("Clustering Embedding") + clusterParams$cds <- cds + cds <- do.call(monocle3::cluster_cells, clusterParams) + rm(clusterParams) + gc() + + message("Learning Graphs") + graphParams$cds <- cds + cds <- do.call(monocle3::learn_graph, graphParams) + rm(graphParams) + gc() + + #Get Prinicipal Node + message("Getting Principal Node") + closestVertex <- cds@principal_graph_aux[["UMAP"]]$pr_graph_cell_proj_closest_vertex + closestVertex <- as.matrix(closestVertex[colnames(cds), ]) + rootNodes <- igraph::V(principal_graph(cds)[["UMAP"]])$name[as.numeric(names(which.max(table(closestVertex[pCells,]))))] + + #Order Cells + message("Ordering Cells") + cds <- order_cells(cds, root_pr_nodes = rootNodes) + + #Get Pseudotime + cds@principal_graph_aux[[1]]$pseudotime <- ArchR:::.getQuantiles(cds@principal_graph_aux[[1]]$pseudotime) * 100 + + #Plot Results + canRaster <- requireNamespace("ggrastr", quietly = TRUE) + + p1 <- plot_cells(cds, + color_cells_by = groupBy, + rasterize = canRaster, + label_groups_by_cluster=FALSE, + label_leaves=FALSE, + label_branch_points=FALSE) + + scale_colour_manual(values = paletteDiscrete(values = colData(cds)[,groupBy])) + theme_ArchR() + + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), + axis.text.y = element_blank(), axis.ticks.y = element_blank()) + + p2 <- plot_cells(cds, + color_cells_by = "pseudotime", + label_cell_groups=FALSE, + rasterize = canRaster, + label_leaves=FALSE, + label_branch_points=FALSE, + graph_label_size=1.5) + theme_ArchR() + + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), + axis.text.y = element_blank(), axis.ticks.y = element_blank()) + + + path <- file.path(getOutputDirectory(ArchRProj), "Monocole3", paste0("Plot-Results-", name, ".pdf")) + + message("Plotting Results - ", path) + pdf(path, width = 6, height = 6, useDingbats = FALSE) + ArchR:::.fixPlotSize(p1) + ArchR:::.fixPlotSize(p2, newPage = TRUE) + dev.off() + + cds + +} + +#' Add a Monocle Trajectory to an ArchR Project #NEW +#' +#' This function will add a trajectory from a monocle CDS created from `getMonocleTrajectories` to an +#' ArchRProject. +#' +#' @param ArchRProj An `ArchRProject` object. +#' @param name A string indicating the name of the fitted trajectory to be added in `cellColData`. +#' @param useGroups The cell groups to be used for creating trajectory analysis. +#' @param groupBy A string indicating the column name from `cellColData` that contains the cell group definitions used in +#' `useGroups` to constrain trajectory analysis. +#' @param monocleCDS A monocle CDS object created from `getMonocleTrajectories`. +#' @param force A boolean value indicating whether to force the trajactory indicated by `name` to be overwritten if it already exists in the given `ArchRProject`. +#' @export +addMonocleTrajectory <- function( + ArchRProj = NULL, + name = "Trajectory", + useGroups = NULL, + groupBy = "Clusters", + monocleCDS = NULL, + force = FALSE + ){ + + .validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) + .validInput(input = name, name = "name", valid = c("character")) + .validInput(input = useGroups, name = "useGroups", valid = c("character")) + .validInput(input = groupBy, name = "groupBy", valid = c("character")) + + .requirePackage("monocle3") + + groupDF <- getCellColData(ArchRProj = ArchRProj, select = groupBy) + groupDF <- groupDF[groupDF[,1] %in% useGroups,,drop=FALSE] + + if(sum(unique(groupDF[,1]) %in% useGroups)==0){ + stop("useGroups does not span any groups in groupBy! Are you sure your input is correct?") + } + + monoclePT <- pseudotime(monocleCDS) + monoclePT <- monoclePT[rownames(groupDF)] + monoclePT <- ArchR:::.getQuantiles(monoclePT) * 100 + + #Add To ArchR Project + ArchRProj <- addCellColData( + ArchRProj = ArchRProj, + data = as.vector(monoclePT), + name = name, + cells = names(monoclePT), + force = force + ) + + ArchRProj + +} + +################################################################### +# Slingshot +################################################################### + + +#' Add a Slingshot Trajectories to an ArchR Project #NEW +#' +#' This function will fit a supervised trajectory in a lower dimensional space that +#' can then be used for downstream analyses. +#' +#' @param ArchRProj An `ArchRProject` object. +#' @param name A string indicating the name of the fitted trajectory to be added in `cellColData`. +#' @param useGroups A character vector that is used to select a subset of groups by name from the designated `groupBy` column +#' in `cellColData`. This limits the groups used to identify trajectories. +#' @param principalGroup The principal group which represents the group that will be the starting point for all trajectories. +#' @param groupBy A string indicating the column name from `cellColData` that contains the cell group definitions used in +#' `useGroups` to constrain trajectory analysis. +#' @param embedding A string indicating the name of the `embedding` object from the `ArchRProject` that should be used for trajectory analysis. +#' @param reducedDims A string indicating the name of the `reducedDims` object from the `ArchRProject` that should be used for trajectory analysis. `embedding` must equal NULL to use. +#' @param force A boolean value indicating whether to force the trajactory indicated by `name` to be overwritten if it already exists in the given `ArchRProject`. +#' @param seed A number to be used as the seed for random number generation for trajectory creation. +#' @export +addSlingShotTrajectories <- function( + ArchRProj = NULL, + name = "SlingShot", + useGroups = NULL, + principalGroup = NULL, + groupBy = NULL, + embedding = NULL, + reducedDims = NULL, + force = FALSE, + seed = 1 + ){ + + .validInput(input = ArchRProj, name = "ArchRProj", valid = c("ArchRProj")) + .validInput(input = name, name = "name", valid = c("character")) + .validInput(input = useGroups, name = "useGroups", valid = c("character")) + .validInput(input = principalGroup, name = "principalGroup", valid = c("character")) + .validInput(input = groupBy, name = "groupBy", valid = c("character")) + .validInput(input = embedding, name = "embedding", valid = c("character", "null")) + .validInput(input = reducedDims, name = "reducedDims", valid = c("character", "null")) + .validInput(input = force, name = "force", valid = c("boolean")) + .validInput(input = seed, name = "seed", valid = c("numeric")) + + .requirePackage("slingshot") + + set.seed(seed) + + if(!is.null(embedding)){ + rD <- getEmbedding(ArchRProj, embedding = embedding) + }else{ + rD <- getReducedDims(ArchRProj, reducedDims = reducedDims) + } + + groups <- getCellColData(ArchRProj, groupBy) + + if(!is.null(useGroups)){ + idx <- which(groups[,1] %in% useGroups) + rD <- rD[idx, , drop = FALSE] + groups <- groups[idx, , drop = FALSE] + } + + sds <- slingshot( + data = rD, + clusterLabels = groups[rownames(rD), ], + start.clus = principalGroup + ) + + #Get PseudoTimes + pt <- slingPseudotime(sds) + colnames(pt) <- paste0(name, ".Curve", seq_len(ncol(pt))) + + #Scale + ptn <- apply(pt, 2, ArchR:::.getQuantiles) * 100 + + for(i in seq_len(ncol(ptn))){ + + ArchRProj <- addCellColData( + ArchRProj = ArchRProj, + data = as.vector(ptn[, i]), + name = colnames(ptn)[i], + cells = rownames(ptn), + force = force + ) + + } + + ArchRProj + +} + +################################################################### +# STREAM +################################################################### + +#' Get a PeakMatrix stored in an ArchRProject and write out for STREAM +#' +#' This function gets a PeakMatrix from an `ArchRProject` and writes it to a set of files for STREAM (https://github.com/pinellolab/STREAM) +#' +#' @param ArchRProj An `ArchRProject` object to get data matrix from. +#' @param useSeqnames A character vector of chromosome names to be used to subset the data matrix being obtained. +#' @param verbose A boolean value indicating whether to use verbose output during execution of this function. Can be set to FALSE for a cleaner output. +#' @param binarize A boolean value indicating whether the matrix should be binarized before return. This is often desired when working with insertion counts. +#' @param logFile The path to a file to be used for logging ArchR output. +#' @export +exportPeakMatrixForSTREAM <- function( + ArchRProj = NULL, + useSeqnames = NULL, + verbose = TRUE, + binarize = FALSE, + threads = getArchRThreads(), + logFile = createLogFile("exportMatrixForSTREAM") + ){ + + mat <- getMatrixFromProject( + ArchRProj = ArchRProj, + useMatrix = "PeakMatrix", + useSeqnames = useSeqnames, + verbose = verbose, + binarize = binarize, + threads = threads, + logFile = logFile + ) + + featureDF <- ArchR:::.getFeatureDF(getArrowFiles(ArchRProj)[1], "PeakMatrix") + + stopifnot(all(featureDF$idx == rowData(mat)$idx)) + + countsDF <- Matrix::summary(assay(mat)) + peaksDF <- data.frame(as.vector(featureDF[,1]), featureDF[,3], featureDF[,4]) + cellsDF <- data.frame(colnames(mat)) + + data.table::fwrite(countsDF, file = "STREAM_Counts.tsv.gz", sep = "\t", row.names = FALSE, col.names = FALSE) + data.table::fwrite(peaksDF, file = "STREAM_Regions.tsv.gz", sep = "\t", row.names = FALSE, col.names = FALSE) + data.table::fwrite(cellsDF, file = "STREAM_Sample.tsv.gz", sep = "\t", row.names = FALSE, col.names = FALSE) + + return(0) + +} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/R/ValidationUtils.R b/R/ValidationUtils.R index f2b5577b..3daeeabe 100644 --- a/R/ValidationUtils.R +++ b/R/ValidationUtils.R @@ -30,7 +30,7 @@ if(all(is.numeric(input))){ #https://stackoverflow.com/questions/3476782/check-if-the-number-is-integer - cv <- min(abs(c(input%%1, input%%1-1))) < .Machine$double.eps^0.5 + cv <- min(abs(c(input%%1, input%%1-1)), na.rm = TRUE) < .Machine$double.eps^0.5 }else{ cv <- FALSE } diff --git a/R/VisualizeData.R b/R/VisualizeData.R index 8c693d27..04e4daee 100644 --- a/R/VisualizeData.R +++ b/R/VisualizeData.R @@ -92,13 +92,22 @@ plotPDF <- function( for(i in seq_along(plotList)){ if(inherits(plotList[[i]], "gg")){ - - message("Plotting Ggplot!") - if(!is.null(attr(plotList[[i]], "ratioYX"))){ - .fixPlotSize(plotList[[i]], plotWidth = width, plotHeight = height, height = attr(plotList[[i]], "ratioYX"), newPage = FALSE) + if(inherits(plotList[[i]], "patchwork")){ + + message("Plotting Patchwork!") + print(plotList[[i]]) + }else{ - .fixPlotSize(plotList[[i]], plotWidth = width, plotHeight = height, newPage = FALSE) + + message("Plotting Ggplot!") + + if(!is.null(attr(plotList[[i]], "ratioYX"))){ + .fixPlotSize(plotList[[i]], plotWidth = width, plotHeight = height, height = attr(plotList[[i]], "ratioYX"), newPage = FALSE) + }else{ + .fixPlotSize(plotList[[i]], plotWidth = width, plotHeight = height, newPage = FALSE) + } + } if(i != length(plotList)){ @@ -305,6 +314,14 @@ plotEmbedding <- function( if(x == 1){ .logThis(colorParams, name = "ColorParams 1", logFile = logFile) } + + if(!is.null(imputeWeights)){ + message("Imputing Matrix") + colorMat <- matrix(colorParams$color, nrow=1) + colnames(colorMat) <- rownames(df) + colorMat <- imputeMatrix(mat = colorMat, imputeWeights = imputeWeights, logFile = logFile) + colorParams$color <- as.vector(colorMat) + } colorParams }) diff --git a/README.md b/README.md index 49987962..01464e8f 100755 --- a/README.md +++ b/README.md @@ -3,6 +3,23 @@ [![Lifecycle: maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) +### ArchR has new features available for scATAC-seq Analysis + +**Paired scATAC-seq and scRNA-seq Analysis** + +ArchR now supports paired scATAC-seq and scRNA-seq Analysis!
+      See updates with importFeatureMatrix, addGeneExpressionMatrix, addIterativeLSI, addCombinedDims
+      For a brief tutorial of these features : https://greenleaflab.github.io/ArchR_2020/Ex-Analyze-Multiome.html + +**Trajectory Analysis** + +ArchR now directly supports both monocle3 and Slingshot based trajectory analysis!
+      See updates with getMonocleTrajectories, addMonocleTrajectory, addSlingShotTrajectories
+      For a brief tutorial of these features : https://greenleaflab.github.io/ArchR_2020/Ex-Analyze-Trajectory.html + +Additionally ArchR now enables export of a peak matrix that is compatible with STREAM!
+      See updates with exportPeakMatrixForSTREAM
+ ### ArchR is currently in Beta and will be in active development through the peer review process. ArchR is a full-featured R package for processing and analyzing single-cell ATAC-seq data. ArchR provides the most extensive suite of scATAC-seq analysis tools of any software available. Additionally, ArchR excels in both speed and resource usage, making it possible to analyze 1 million cells in 8 hours on a MacBook Pro laptop. diff --git a/data/geneAnnoHg19test.rda b/data/geneAnnoHg19test.rda new file mode 100644 index 0000000000000000000000000000000000000000..932d10a35bd4563f099bed0f5cd55220ef7c9588 GIT binary patch literal 502826 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

gz#^<-;??MIRdG-{8I2w;$;EF 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

N7-+4thb5@pEJzY%IC%PWsbEu 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 p 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 literal 0 HcmV?d00001 diff --git a/data/genomeAnnoHg19test.rda b/data/genomeAnnoHg19test.rda new file mode 100644 index 0000000000000000000000000000000000000000..9937ecc4bc7e6f04a9707b6c2c814d6e679bfd0c GIT binary patch literal 2321 zcmV+s3GVhEiwFP!000001ML|LbX3K4-gn;Hef#nuK*T5kp-O}#yJ2G@q#-{EkVMFj zkAN1efJYEWj6~%d1zH+YLwhu|h@e&hg_Q_`h@6$49;HYR2rXbK z>FmC@*~eq^<7-cO=iHrpXYS1X%$=D#v)QRrbgC&T000gMngBR~P!dN!7$5SQ-A943CrH@e)qCWkt&g zt(?%wi5NLCQcmdQM68^6Oiskf3AqM3xduA920FR%Q)Kv5g)1qe#bEb(vctc#4MsF1VV=PC)KTry zu!PhLd(?}J@FEdDUAy)oY?s{T7SJZvF{qAh7jad4kF8fLg>`Q(GS=jG%~5uT!RC-u zYx6X4MVr9DNm}r*IS3@L_zFypDFxFa=YypuFi=N4iGjBa*jddvTs@>8p4xtnz_XHx zsE=n7xl|h&l6HtJICp_uyE>byn3zXxC|g8rsMtY2@M9CLH}kY`X$dV{olfu1o(H2M zRzZDKJsee&z`WakC9}6?5aZmjn+<+cV4u_-W=qGu&6e-bvh$;B*maxVQZbXtRQD}N zRt;LGQ;q*NMddvBiMnLt2kJMBPjL^2CU6J7PT`Jyzd$p6({jz?j4hh_aWgfI)B0+D zvvHW_yXst?OB~E|)hBswNh{ASyTo%VD)^w)HT;96Y5Z`air0>q!fT@j@LF9VuZ{hR z*T!w(wTWAKZHAH8W`*(E$+P*^^_Tf$t~|iLcN_#R-V7cJ9t5K6hJi22hhdY?e1|=6 zTaT?7)(5-X+=A21n{l?~O?(7q#!L4d!+&htPQZe-L~!H{GdSc{E)}V^TW%j5$_zNViW7BeC;I4Fr$Kc`;+C=wuD6L zi@<7nXhb7D^w+iYi*E+e`*#OHO!XX=0xy%hcg|rjB07)G<1yPP3D# z8xX)aC%@0M<=dFHP3g?v3qNE|XJTyT@G3SdM$2Z!g|b=y_!FCTF_oR&x1Rm&r95`W z$uHT%6ZWu|rfyTgAggM?!ilO6KVwvX`Du^ZTokQ-Up0eM+fH!m=icDdm8-eHhG;JE zb(#xo4dKF%#B<@t2Xf&jU*N*O@6Uyw`6bu%+A6MTZ93PqK7wm%EasZFxVWaR2!8*# zX63ejYX0!It(tdY^7wv@AMvq|82Q){!F*+NnsSkqn+qIsIu@DQ76L%|4*>9i0BgB| z_JNTAG&V9RJTg~-MSq{+gTneYtYto0P%i|{Bl~7w_WtdEZO*OntcX<3BV@@ z>;ZraL-<;mPfm%v*eaPm^8k3pCFzih%HN6ms+%T)P`L=fa{$DD4!8@S0s3SZ$kZ(a zSc%)OzXI@x#pidV16k#rmug=<*%#R{28|ab&C_xuBS^9p*+g)nzL?jy|B~cKin`#h zBKiZ#j>U*RfuIZl+VHU>lB~s2JDNwl1wkC@kMtZE2JmL&TVfWfdmicX4btVPB!qo>&p&r|=$v9H`i2| zD&*H|Gt^KNFW`29GSbZUr;TQtvCLv{XMU=?paL!4)POgh+)<6b|J~C60?d(?kpBh9 zjrBNT9O6ht+oF6GqIK@)QfezM7cZsP?;eyDHF^U|mb>Ha(k&O4X1Yyk_xE8kP|}@2 zcYMmRyOY_~c*=2lqic6#_f+Sb@lj7~>q^hw*l?%dPV02H>{rTlfAaOzm2ZH8Ro#oH4f^`x#l+d7-W&h+{@e78fVn~AsE_4%25#epWCbe<(M8H<3uQ8jB0uiG*}=1}RV38%&;A_Y3h8HbYTwU$eSUp!6O5_|9%4Fra{PmBDinr{JhsAsOe(&@B zUOcsW-HzRv=T^?&)Vt;1_V;A`&KRhX8OV3ype?Oa2$3 Date: Wed, 11 Nov 2020 13:10:43 -0800 Subject: [PATCH 32/41] resolve conflicts --- DESCRIPTION | 6 +----- NAMESPACE | 3 --- R/IntegrativeAnalysis.R | 13 ------------- R/MarkerFeatures.R | 12 ------------ R/MatrixGeneScores.R | 3 --- man/addCoAccessibility.Rd | 3 --- man/addGeneScoreMatrix.Rd | 3 +-- man/addMotifAnnotations.Rd | 5 ++--- man/createGeneAnnotation.Rd | 5 +---- man/getPeak2GeneLinks.Rd | 6 ------ man/plotBrowserTrack.Rd | 3 --- man/plotMarkerHeatmap.Rd | 4 ++-- man/plotPeak2GeneHeatmap.Rd | 13 ------------- man/plotTrajectoryHeatmap.Rd | 4 ++-- 14 files changed, 9 insertions(+), 74 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 11143943..572a5b27 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,15 +2,11 @@ Package: ArchR Type: Package Date: 2020-10-01 Title: Analyzing single-cell regulatory chromatin in R. -<<<<<<< HEAD -Version: 0.9.6 -======= -Version: 1.0.0 ->>>>>>> 2f022a4... Release 1.0.0 (#376) Authors@R: c( person("Jeffrey", "Granja", email = "jgranja.stanford@gmail.com", role = c("aut","cre")), person("Ryan", "Corces", role = "aut")) Description: This package is designed to streamline scATAC analyses in R. +Version: 1.0.0 Roxygen: list(markdown = TRUE) License: GPL (>= 2) LinkingTo: Rcpp diff --git a/NAMESPACE b/NAMESPACE index f75dd3fb..db3ccd9d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -58,11 +58,8 @@ export(createGenomeAnnotation) export(createLogFile) export(enrichHeatmap) export(exportGroupSE) -<<<<<<< HEAD export(exportMonocle3) -======= export(exportPeakMatrixForSTREAM) ->>>>>>> 2f022a4... Release 1.0.0 (#376) export(extendGR) export(filterChrGR) export(filterDoublets) diff --git a/R/IntegrativeAnalysis.R b/R/IntegrativeAnalysis.R index 0c6f636b..4e31311c 100644 --- a/R/IntegrativeAnalysis.R +++ b/R/IntegrativeAnalysis.R @@ -762,13 +762,9 @@ addCoAccessibility <- function( o$seqnames <- seqnames(peakSet)[o[,1]] o$idx1 <- peakSet$idx[o[,1]] o$idx2 <- peakSet$idx[o[,2]] -<<<<<<< HEAD - o$correlation <- NA -======= o$correlation <- -999.999 o$Variability1 <- 0.000 o$Variability2 <- 0.000 ->>>>>>> 2f022a4... Release 1.0.0 (#376) #Peak Matrix ColSums cS <- .getColSums(getArrowFiles(ArchRProj), chri, verbose = FALSE, useMatrix = "PeakMatrix") @@ -801,9 +797,6 @@ addCoAccessibility <- function( #Correlations idx <- BiocGenerics::which(o$seqnames==chri[x]) -<<<<<<< HEAD - o[idx,]$correlation <- rowCorCpp(idxX = o[idx,]$idx1, idxY = o[idx,]$idx2, X = as.matrix(groupMat), Y = as.matrix(groupMat)) -======= corVals <- rowCorCpp(idxX = o[idx,]$idx1, idxY = o[idx,]$idx2, X = as.matrix(groupMat), Y = as.matrix(groupMat)) .logThis(head(corVals), paste0("SubsetCorVals-", x), logFile = logFile) @@ -812,8 +805,6 @@ addCoAccessibility <- function( o[idx,]$correlation <- as.numeric(corVals) o[idx,]$Variability1 <- rowVars[o[idx,]$idx1] o[idx,]$Variability2 <- rowVars[o[idx,]$idx2] ->>>>>>> 2f022a4... Release 1.0.0 (#376) - .logThis(groupMat, paste0("SubsetGroupMat-", x), logFile = logFile) .logThis(o[idx,], paste0("SubsetCoA-", x), logFile = logFile) @@ -1459,8 +1450,6 @@ plotPeak2GeneHeatmap <- function( colOrder <- colnames(bS[[1]]) kDF[,3] <- as.integer(mapLabels(paste0(kDF[,1]), newLabels = paste0(seq_along(rowOrder)), oldLabels = rowOrder)) -<<<<<<< HEAD -======= if(returnMatrices){ out <- SimpleList( @@ -1490,8 +1479,6 @@ plotPeak2GeneHeatmap <- function( .logThis(cD[colOrder,,drop=FALSE], "cD", logFile = logFile) .logThis(mATAC[kDF[,2],colOrder], "mATAC2", logFile = logFile) .logThis(mRNA[kDF[,2],colOrder], "mRNA2", logFile = logFile) - ->>>>>>> 2f022a4... Release 1.0.0 (#376) ######################################### # Plot Heatmaps ######################################### diff --git a/R/MarkerFeatures.R b/R/MarkerFeatures.R index a52e4f10..72517394 100644 --- a/R/MarkerFeatures.R +++ b/R/MarkerFeatures.R @@ -890,11 +890,6 @@ plotMarkerHeatmap <- function( mat[mat < min(limits)] <- min(limits) .logThis(mat, "mat", logFile = logFile) -<<<<<<< HEAD - idx <- which(rowSums(passMat, na.rm = TRUE) > 0 & matrixStats::rowVars(mat) != 0 & !is.na(matrixStats::rowVars(mat))) - mat <- mat[idx,] - passMat <- passMat[idx,] -======= if(ncol(mat) == 1){ idx <- which(rowSums(passMat, na.rm = TRUE) > 0) }else{ @@ -902,7 +897,6 @@ plotMarkerHeatmap <- function( } mat <- mat[idx,,drop=FALSE] passMat <- passMat[idx,,drop=FALSE] ->>>>>>> 2f022a4... Release 1.0.0 (#376) if(nrow(mat) == 0){ stop("No Makers Found!") @@ -994,15 +988,9 @@ plotMarkerHeatmap <- function( if(transpose){ if(!is.null(clusterCols)){ -<<<<<<< HEAD - mat <- t(mat[seq_len(nrow(mat)), clusterCols$order]) - }else{ - mat <- t(mat[seq_len(nrow(mat)), ]) -======= mat <- t(mat[seq_len(nrow(mat)), , drop = FALSE]) }else{ mat <- t(mat[seq_len(nrow(mat)), clusterCols$order, drop = FALSE]) ->>>>>>> 2f022a4... Release 1.0.0 (#376) } if(!is.null(labelMarkers)){ diff --git a/R/MatrixGeneScores.R b/R/MatrixGeneScores.R index 2fba6ffb..73a049f0 100644 --- a/R/MatrixGeneScores.R +++ b/R/MatrixGeneScores.R @@ -20,8 +20,6 @@ #' @param useGeneBoundaries A boolean value indicating whether gene boundaries should be employed during gene activity score #' calculation. Gene boundaries refers to the process of preventing tiles from contributing to the gene score of a given gene #' if there is a second gene's transcription start site between the tile and the gene of interest. -<<<<<<< HEAD -======= #' @param geneUpstream An integer describing the number of bp upstream the gene to extend the gene body. This effectively makes the gene body larger as there #' are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'. #' @param geneDownstream An integer describing the number of bp downstream the gene to extend the gene body.This effectively makes the gene body larger as there @@ -34,7 +32,6 @@ #' @param geneScaleFactor A numeric scaling factor to weight genes based on the inverse of there length i.e. [(Scale Factor)/(Gene Length)]. This #' is scaled from 1 to the scale factor. Small genes will be the scale factor while extremely large genes will be closer to 1. This scaling helps with #' the relative gene score value. ->>>>>>> 2f022a4... Release 1.0.0 (#376) #' @param scaleTo Each column in the calculated gene score matrix will be normalized to a column sum designated by `scaleTo`. #' @param excludeChr A character vector containing the `seqnames` of the chromosomes that should be excluded from this analysis. #' @param blacklist A `GRanges` object containing genomic regions to blacklist that may be extremeley over-represented and thus diff --git a/man/addCoAccessibility.Rd b/man/addCoAccessibility.Rd index 881e697f..581994a4 100644 --- a/man/addCoAccessibility.Rd +++ b/man/addCoAccessibility.Rd @@ -10,7 +10,6 @@ addCoAccessibility( dimsToUse = 1:30, scaleDims = NULL, corCutOff = 0.75, - cellsToUse = NULL, k = 100, knnIteration = 500, overlapCutoff = 0.8, @@ -38,8 +37,6 @@ biases since it is over-weighting latent PCs. If set to \code{NULL} this will sc \item{corCutOff}{A numeric cutoff for the correlation of each dimension to the sequencing depth. If the dimension has a correlation to sequencing depth that is greater than the \code{corCutOff}, it will be excluded from analysis.} -\item{cellsToUse}{A character vector of cellNames to compute coAccessibility on if desired to run on a subset of the total cells.} - \item{k}{The number of k-nearest neighbors to use for creating single-cell groups for correlation analyses.} \item{knnIteration}{The number of k-nearest neighbor groupings to test for passing the supplied \code{overlapCutoff}.} diff --git a/man/addGeneScoreMatrix.Rd b/man/addGeneScoreMatrix.Rd index 04e50485..4654b4c6 100644 --- a/man/addGeneScoreMatrix.Rd +++ b/man/addGeneScoreMatrix.Rd @@ -42,8 +42,7 @@ should be a function of \code{x}, where \code{x} is the stranded distance from t \item{extendUpstream}{The minimum and maximum number of basepairs upstream of the transcription start site to consider for gene activity score calculation.} -\item{extendDownstream}{The minimum and maximum number of basepairs downstream of the transcription start site or transcription termination site -(based on 'useTSS') to consider for gene activity score calculation.} +\item{extendDownstream}{The minimum and maximum number of basepairs downstream of the transcription start site to consider for gene activity score calculation.} \item{geneUpstream}{An integer describing the number of bp upstream the gene to extend the gene body. This effectively makes the gene body larger as there are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'.} diff --git a/man/addMotifAnnotations.Rd b/man/addMotifAnnotations.Rd index e78aa964..7ef12e55 100644 --- a/man/addMotifAnnotations.Rd +++ b/man/addMotifAnnotations.Rd @@ -10,7 +10,6 @@ addMotifAnnotations( name = "Motif", species = NULL, collection = "CORE", - motifPWMs = NULL, cutOff = 5e-05, width = 7, version = 2, @@ -34,8 +33,6 @@ used from CisBP/JASPAR. By default, this function will attempt to guess the spec \item{collection}{If one of the JASPAR motif sets is used via \code{motifSet}, this parameter allows you to indicate the JASPAR collection to be used. See \code{getMatrixSet()} from \code{TFBSTools} for all options to supply for collection.} -\item{motifPWMs}{A custom set of motif PWMs as a PWMList for adding motif annotations.} - \item{cutOff}{The p-value cutoff to be used for motif search. The p-value is determined vs a background set of sequences (see \code{MOODS} for more details on this determination).} @@ -49,6 +46,8 @@ it already exists in the given \code{ArchRProject}.} \item{logFile}{The path to a file to be used for logging ArchR output.} \item{...}{Additional parameters to be passed to \code{TFBSTools::getMatrixSet} for getting a PWM object.} + +\item{motifPWMs}{A custom set of motif PWMs as a PWMList for adding motif annotations.} } \description{ This function adds information about which peaks contain motifs to a given ArchRProject. For each peak, a binary value diff --git a/man/createGeneAnnotation.Rd b/man/createGeneAnnotation.Rd index a4fd536e..59021c00 100644 --- a/man/createGeneAnnotation.Rd +++ b/man/createGeneAnnotation.Rd @@ -10,8 +10,7 @@ createGeneAnnotation( OrgDb = NULL, genes = NULL, exons = NULL, - TSS = NULL, - annoStyle = NULL + TSS = NULL ) } \arguments{ @@ -29,8 +28,6 @@ For example, from \code{orgdb <- org.Hs.eg.db}.} \item{exons}{A \code{GRanges} object containing gene exon coordinates. Must have a symbols column matching the symbols column of \code{genes}.} \item{TSS}{A \code{GRanges} object containing standed transcription start site coordinates for computing TSS enrichment scores downstream.} - -\item{annoStyle}{annotation style to map between gene names and various gene identifiers e.g. "ENTREZID", "ENSEMBL".} } \description{ This function will create a gene annotation object that can be used for creating ArrowFiles or an ArchRProject, etc. diff --git a/man/getPeak2GeneLinks.Rd b/man/getPeak2GeneLinks.Rd index 66e712f5..332b8a00 100644 --- a/man/getPeak2GeneLinks.Rd +++ b/man/getPeak2GeneLinks.Rd @@ -8,8 +8,6 @@ getPeak2GeneLinks( ArchRProj = NULL, corCutOff = 0.45, FDRCutOff = 1e-04, - varCutOffATAC = 0.25, - varCutOffRNA = 0.25, resolution = 1, returnLoops = TRUE ) @@ -21,10 +19,6 @@ getPeak2GeneLinks( \item{FDRCutOff}{A numeric describing the maximum numeric peak-to-gene false discovery rate to return.} -\item{varCutOffATAC}{A numeric describing the minimum variance quantile of the ATAC peak accessibility when selecting links.} - -\item{varCutOffRNA}{A numeric describing the minimum variance quantile of the RNA gene expression when selecting links.} - \item{resolution}{A numeric describing the bp resolution to return loops as. This helps with overplotting of correlated regions.} \item{returnLoops}{A boolean indicating to return the peak-to-gene links as a \code{GRanges} "loops" object designed for use with diff --git a/man/plotBrowserTrack.Rd b/man/plotBrowserTrack.Rd index f3374f1b..172ba3e7 100644 --- a/man/plotBrowserTrack.Rd +++ b/man/plotBrowserTrack.Rd @@ -23,7 +23,6 @@ plotBrowserTrack( normMethod = "ReadsInTSS", threads = getArchRThreads(), ylim = NULL, - pal = NULL, baseSize = 7, scTileSize = 0.5, scCellsMax = 100, @@ -89,8 +88,6 @@ is "ReadsInTSS" which simultaneously normalizes tracks based on sequencing depth \item{ylim}{The numeric quantile y-axis limit to be used for for "bulkTrack" plotting. If not provided, the y-axis limit will be c(0, 0.999).} -\item{pal}{A custom palette (see \code{paletteDiscrete} or \code{ArchRPalettes}) used to override coloring for groups.} - \item{baseSize}{The numeric font size to be used in the plot. This applies to all plot labels.} \item{scTileSize}{The width of the tiles in scTracks. Larger numbers may make cells overlap more. Default is 0.5 for about 100 cells.} diff --git a/man/plotMarkerHeatmap.Rd b/man/plotMarkerHeatmap.Rd index 7ad7c9d7..797342fa 100644 --- a/man/plotMarkerHeatmap.Rd +++ b/man/plotMarkerHeatmap.Rd @@ -20,7 +20,7 @@ plotMarkerHeatmap( nLabel = 15, nPrint = 15, labelRows = FALSE, - returnMatrix = FALSE, + returnMat = FALSE, transpose = FALSE, invert = FALSE, logFile = createLogFile("plotMarkerHeatmap") @@ -59,7 +59,7 @@ rownames from \code{seMarker} to be excluded from the heatmap.} \item{labelRows}{A boolean value that indicates whether all rows should be labeled on the side of the heatmap.} -\item{returnMatrix}{A boolean value that indicates whether the final heatmap matrix should be returned in lieu of plotting the actual heatmap.} +\item{returnMat}{A boolean value that indicates whether the final heatmap matrix should be returned in lieu of plotting the actual heatmap.} \item{transpose}{A boolean value that indicates whether the heatmap should be transposed prior to plotting or returning.} diff --git a/man/plotPeak2GeneHeatmap.Rd b/man/plotPeak2GeneHeatmap.Rd index 52d77d6b..ed78a7ee 100644 --- a/man/plotPeak2GeneHeatmap.Rd +++ b/man/plotPeak2GeneHeatmap.Rd @@ -8,8 +8,6 @@ plotPeak2GeneHeatmap( ArchRProj = NULL, corCutOff = 0.45, FDRCutOff = 1e-04, - varCutOffATAC = 0.25, - varCutOffRNA = 0.25, k = 25, nPlot = 25000, limitsATAC = c(-2, 2), @@ -19,8 +17,6 @@ plotPeak2GeneHeatmap( palATAC = paletteContinuous("solarExtra"), palRNA = paletteContinuous("blueYellow"), verbose = TRUE, - returnMatrices = FALSE, - seed = 1, logFile = createLogFile("plotPeak2GeneHeatmap") ) } @@ -31,10 +27,6 @@ plotPeak2GeneHeatmap( \item{FDRCutOff}{A numeric describing the maximum numeric peak-to-gene false discovery rate to return.} -\item{varCutOffATAC}{A numeric describing the minimum variance quantile of the ATAC peak accessibility when selecting links.} - -\item{varCutOffRNA}{A numeric describing the minimum variance quantile of the RNA gene expression when selecting links.} - \item{k}{An integer describing the number of k-means clusters to group peak-to-gene links prior to plotting heatmaps.} \item{nPlot}{An integer describing the maximum number of peak-to-gene links to plot in heatmap.} @@ -53,11 +45,6 @@ plotPeak2GeneHeatmap( \item{verbose}{A boolean value that determines whether standard output should be printed.} -\item{returnMatrices}{A boolean value that determines whether the matrices should be returned with kmeans id versus plotting.} - -\item{seed}{A number to be used as the seed for random number generation. It is recommended to keep track of the seed used so that you can -reproduce results downstream.} - \item{logFile}{The path to a file to be used for logging ArchR output.} } \description{ diff --git a/man/plotTrajectoryHeatmap.Rd b/man/plotTrajectoryHeatmap.Rd index 4a22c00f..13449fc5 100644 --- a/man/plotTrajectoryHeatmap.Rd +++ b/man/plotTrajectoryHeatmap.Rd @@ -17,7 +17,7 @@ plotTrajectoryHeatmap( labelRows = FALSE, rowOrder = NULL, useSeqnames = NULL, - returnMatrix = FALSE, + returnMat = FALSE, force = FALSE, logFile = createLogFile("plotTrajectoryHeatmap") ) @@ -54,7 +54,7 @@ to rownmaes) can be provided here.} deviations, the \code{seqnames} do not correspond to chromosomes, rather they correspond to the sub-portions of the matrix, for example raw deviations ("deviations") or deviation z-scores ("z") for a chromVAR deviations matrix.} -\item{returnMatrix}{A boolean value that indicates whether the final heatmap matrix should be returned in lieu of plotting the actual heatmap.} +\item{returnMat}{A boolean value that indicates whether the final heatmap matrix should be returned in lieu of plotting the actual heatmap.} \item{force}{If useSeqnames is longer than 1 if matrixClass is "Sparse.Assays.Matrix" to continue. This is not recommended because these matrices can be in different units.} From f40483f1f54e036030236ef92f2e5d8114b2019f Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 11 Nov 2020 13:18:21 -0800 Subject: [PATCH 33/41] catching up1 --- R/AnnotationGenome.R | 44 +++++++++++++++++++++-------------------- R/IntegrativeAnalysis.R | 2 +- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/R/AnnotationGenome.R b/R/AnnotationGenome.R index eb905511..3e0a20fe 100644 --- a/R/AnnotationGenome.R +++ b/R/AnnotationGenome.R @@ -110,28 +110,30 @@ createGeneAnnotation <- function( ########################### message("Getting Genes..") genes <- GenomicFeatures::genes(TxDb) - isEntrez <- mcols(genes)$symbol <- tryCatch({ - suppressMessages(AnnotationDbi::mapIds(OrgDb, keys = mcols(genes)$gene_id, column = "SYMBOL", keytype = "ENTREZID", multiVals = "first")) - TRUE - }, error = function(x){ - FALSE - }) - - isEnsembl <- mcols(genes)$symbol <- tryCatch({ - suppressMessages(AnnotationDbi::mapIds(OrgDb, keys = mcols(genes)$gene_id, column = "SYMBOL", keytype = "ENSEMBL", multiVals = "first")) - TRUE - }, error = function(x){ - FALSE - }) - - if(isEntrez){ - annoStyle <- "ENTREZID" - }else if(isEnsembl){ - annoStyle <- "ENSEMBL" - }else{ - stop("Could not identify keytype for annotation format!") + + if(is.null(annoStyle)){ + isEntrez <- mcols(genes)$symbol <- tryCatch({ + suppressMessages(AnnotationDbi::mapIds(OrgDb, keys = mcols(genes)$gene_id, column = "SYMBOL", keytype = "ENTREZID", multiVals = "first")) + TRUE + }, error = function(x){ + FALSE + }) + isEnsembl <- mcols(genes)$symbol <- tryCatch({ + suppressMessages(AnnotationDbi::mapIds(OrgDb, keys = mcols(genes)$gene_id, column = "SYMBOL", keytype = "ENSEMBL", multiVals = "first")) + TRUE + }, error = function(x){ + FALSE + }) + if(isEntrez){ + annoStyle <- "ENTREZID" + }else if(isEnsembl){ + annoStyle <- "ENSEMBL" + }else{ + stop("Could not identify keytype for annotation format!") + } } - + annoStyle <- toupper(annoStyle) + message("Determined Annotation Style = ", annoStyle) ########################### diff --git a/R/IntegrativeAnalysis.R b/R/IntegrativeAnalysis.R index 4e31311c..a2bb7699 100644 --- a/R/IntegrativeAnalysis.R +++ b/R/IntegrativeAnalysis.R @@ -1166,7 +1166,7 @@ addPeak2GeneLinks <- function( o$Correlation <- rowCorCpp(as.integer(o$A), as.integer(o$B), assay(seATAC), assay(seRNA)) o$VarAssayA <- .getQuantiles(matrixStats::rowVars(assay(seATAC)))[o$A] o$VarAssayB <- .getQuantiles(matrixStats::rowVars(assay(seRNA)))[o$B] - o$TStat <- (o$correlation / sqrt((max(1-o$Correlation^2, 0.00000000000000001))/(ncol(seATAC)-2))) #T-statistic P-value + o$TStat <- (o$Correlation / sqrt((max(1-o$Correlation^2, 0.00000000000000001))/(ncol(seATAC)-2))) #T-statistic P-value o$Pval <- 2*pt(-abs(o$TStat), ncol(seATAC) - 2) o$FDR <- p.adjust(o$Pval, method = "fdr") out <- o[, c("A", "B", "Correlation", "FDR", "VarAssayA", "VarAssayB")] From 784fac3e595e329d3a48b4f195c32089be72bdf4 Mon Sep 17 00:00:00 2001 From: scfurl Date: Wed, 11 Nov 2020 13:45:42 -0800 Subject: [PATCH 34/41] updated finally --- DESCRIPTION | 2 -- R/GroupExport.R | 64 ++++++++++++++++++++++++-------------- R/RcppExports.R | 39 ----------------------- man/addGeneScoreMatrix.Rd | 6 ---- man/addMotifAnnotations.Rd | 2 -- 5 files changed, 40 insertions(+), 73 deletions(-) delete mode 100644 R/RcppExports.R diff --git a/DESCRIPTION b/DESCRIPTION index 87e52c81..e4d19a0a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -7,7 +7,6 @@ Authors@R: c( person("Jeffrey", "Granja", email = "jgranja.stanford@gmail.com", role = c("aut","cre")), person("Ryan", "Corces", role = "aut")) Description: This package is designed to streamline scATAC analyses in R. -Version: 1.0.0 Roxygen: list(markdown = TRUE) License: GPL (>= 2) LinkingTo: Rcpp @@ -82,7 +81,6 @@ Collate: 'ProjectMethods.R' 'QualityControl.R' 'RNAIntegration.R' - 'RcppExports.R' 'ReproduciblePeakSet.R' 'Trajectory.R' 'ValidationUtils.R' diff --git a/R/GroupExport.R b/R/GroupExport.R index e2017bae..7f7bb567 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -474,6 +474,7 @@ getmode<-function(v) { uniqv[which.max(tabulate(match(v, uniqv)))] } + .createGroupBW <- function( i = NULL, cellGroups = NULL, @@ -491,22 +492,22 @@ getmode<-function(v) { verbose = TRUE, logFile = NULL, threads = 1 - ){ - +){ + .logDiffTime(sprintf("%s (%s of %s) : Creating BigWig for Group", names(cellGroups)[i], i, length(cellGroups)), tstart, logFile = logFile, verbose = verbose) - + #Cells cellGroupi <- cellGroups[[i]] #print(sum(normBy[cellGroupi, 1])) - + #Bigwig File! covFile <- file.path(bwDir, paste0(make.names(names(cellGroups)[i]), "-TileSize-",tileSize,"-normMethod-",normMethod,"-ArchR.bw")) rmf <- .suppressAll(file.remove(covFile)) - + covList <- .safelapply(seq_along(availableChr), function(k){ - + it <- 0 - + for(j in seq_along(ArrowFiles)){ cellsInI <- sum(cellsInArrow[[names(ArrowFiles)[j]]] %in% cellGroupi) if(cellsInI > 0){ @@ -518,28 +519,28 @@ getmode<-function(v) { } } } - + tilesk <- tiles[BiocGenerics::which(seqnames(tiles) %bcin% availableChr[k])] - + if(length(fragik) == 0){ - + tilesk$reads <- 0 - + }else{ - + #N Tiles nTiles <- trunc(chromLengths[availableChr[k]] / tileSize) + 1 - + #Create Sparse Matrix matchID <- S4Vectors::match(mcols(fragik)$RG, cellGroupi) mat <- Matrix::sparseMatrix( - i = c(trunc(start(fragik) / tileSize), trunc(end(fragik) / tileSize)) + 1, - j = as.vector(c(matchID, matchID)), - x = rep(1, 2*length(fragik)), - dims = c(nTiles, length(cellGroupi)) - ) - + i = c(trunc(start(fragik) / tileSize), trunc(end(fragik) / tileSize)) + 1, + j = as.vector(c(matchID, matchID)), + x = rep(1, 2*length(fragik)), + dims = c(nTiles, length(cellGroupi)) + ) + if(!is.null(ceiling)){ mat@x[mat@x > ceiling] <- ceiling } @@ -547,9 +548,9 @@ getmode<-function(v) { mat <- Matrix::rowSums(mat) rm(fragik, matchID) - + tilesk$reads <- mat - + if(tolower(normMethod) %in% c("readsintss", "readsinpromoter", "nfrags")){ tilesk$reads <- tilesk$reads * 10^4 / sum(normBy[cellGroupi, 1]) }else if(tolower(normMethod) %in% c("ncells")){ @@ -558,6 +559,21 @@ getmode<-function(v) { }else{ stop("NormMethod not recognized!") } - - - + + } + + tilesk <- coverage(tilesk, weight = tilesk$reads)[[availableChr[k]]] + + tilesk + + }, threads = threads) + + names(covList) <- availableChr + + covList <- as(covList, "RleList") + + rtracklayer::export.bw(object = covList, con = covFile) + + return(covFile) + +} diff --git a/R/RcppExports.R b/R/RcppExports.R deleted file mode 100644 index b03ff458..00000000 --- a/R/RcppExports.R +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by using Rcpp::compileAttributes() -> do not edit by hand -# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -rowCorCpp <- function(idxX, idxY, X, Y) { - .Call('_ArchR_rowCorCpp', PACKAGE = 'ArchR', idxX, idxY, X, Y) -} - -rleSumsStrandedChr <- function(rle, x, strand, width) { - .Call('_ArchR_rleSumsStrandedChr', PACKAGE = 'ArchR', rle, x, strand, width) -} - -rleSumsStranded <- function(rleList, grList, width, as_integer) { - .Call('_ArchR_rleSumsStranded', PACKAGE = 'ArchR', rleList, grList, width, as_integer) -} - -tabulate2dCpp <- function(x, xmin, xmax, y, ymin, ymax) { - .Call('_ArchR_tabulate2dCpp', PACKAGE = 'ArchR', x, xmin, xmax, y, ymin, ymax) -} - -computeSparseRowVariances <- function(j, val, rm, n) { - .Call('_ArchR_computeSparseRowVariances', PACKAGE = 'ArchR', j, val, rm, n) -} - -determineOverlapCpp <- function(m, overlapCut) { - .Call('_ArchR_determineOverlapCpp', PACKAGE = 'ArchR', m, overlapCut) -} - -kmerIdxCpp <- function(str, window, n, kmer) { - .Call('_ArchR_kmerIdxCpp', PACKAGE = 'ArchR', str, window, n, kmer) -} - -kmerPositionFrequencyCpp <- function(string_vector, strand_vector, window, w, kmer) { - .Call('_ArchR_kmerPositionFrequencyCpp', PACKAGE = 'ArchR', string_vector, strand_vector, window, w, kmer) -} - -kmerIDFrequencyCpp <- function(string_vector, id_vector, n_id, window, w, kmer) { - .Call('_ArchR_kmerIDFrequencyCpp', PACKAGE = 'ArchR', string_vector, id_vector, n_id, window, w, kmer) -} - diff --git a/man/addGeneScoreMatrix.Rd b/man/addGeneScoreMatrix.Rd index c21fa30f..04e50485 100644 --- a/man/addGeneScoreMatrix.Rd +++ b/man/addGeneScoreMatrix.Rd @@ -51,12 +51,6 @@ are proximal peaks that should be weighted equally to the gene body. This parame \item{geneDownstream}{An integer describing the number of bp downstream the gene to extend the gene body.This effectively makes the gene body larger as there are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'.} -\item{geneUpstream}{An integer describing the number of bp upstream the gene to extend the gene body. This effectively makes the gene body larger as there -are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'.} - -\item{geneDownstream}{An integer describing the number of bp downstream the gene to extend the gene body.This effectively makes the gene body larger as there -are proximal peaks that should be weighted equally to the gene body. This parameter is used if 'useTSS=FALSE'.} - \item{useGeneBoundaries}{A boolean value indicating whether gene boundaries should be employed during gene activity score calculation. Gene boundaries refers to the process of preventing tiles from contributing to the gene score of a given gene if there is a second gene's transcription start site between the tile and the gene of interest.} diff --git a/man/addMotifAnnotations.Rd b/man/addMotifAnnotations.Rd index 756c1a8d..e78aa964 100644 --- a/man/addMotifAnnotations.Rd +++ b/man/addMotifAnnotations.Rd @@ -49,8 +49,6 @@ it already exists in the given \code{ArchRProject}.} \item{logFile}{The path to a file to be used for logging ArchR output.} \item{...}{Additional parameters to be passed to \code{TFBSTools::getMatrixSet} for getting a PWM object.} - -\item{motifPWMs}{A custom set of motif PWMs as a PWMList for adding motif annotations.} } \description{ This function adds information about which peaks contain motifs to a given ArchRProject. For each peak, a binary value From 4e3695c2097e6fe156ff398d4bd0d89ac216ae0f Mon Sep 17 00:00:00 2001 From: scfurl Date: Tue, 17 Nov 2020 12:01:02 -0800 Subject: [PATCH 35/41] unknown --- R/GroupExport.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/GroupExport.R b/R/GroupExport.R index 578a42d5..7e461bdb 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -309,8 +309,8 @@ exportMonocle3 <- function( cds<-cds[,rownames(ArchRProj@reducedDims$IterativeLSI$matSVD)] reducedDims(cds)<-SimpleList(LSI=ArchRProj@reducedDims$IterativeLSI$matSVD, UMAP=ArchRProj@embeddings$UMAP$df) - irlba_rotation = ArchRProj@reducedDims$IterativeLSI$svd$u - row.names(irlba_rotation) = paste0(ArchRProj@reducedDims$IterativeLSI$LSIFeatures$seqnames, "_", ArchRProj@reducedDims$IterativeLSI$LSIFeatures$idx) + # irlba_rotation = ArchRProj@reducedDims$IterativeLSI$svd$u + # rownames(irlba_rotation) = ArchRProj@reducedDims$IterativeLSI$LSIFeatures$idx iLSI<-SimpleList(svd=ArchRProj@reducedDims$IterativeLSI$svd, features=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, row_sums = ArchRProj@reducedDims$IterativeLSI$rowSm, @@ -321,7 +321,7 @@ exportMonocle3 <- function( resolution=NULL, granges=ArchRProj@reducedDims$IterativeLSI$LSIFeatures, LSI_method=ArchRProj@reducedDims$IterativeLSI$LSIMethod, outliers=NULL) - pp_aux <- SimpleList(iLSI=iLSI, gene_loadings=irlba_rotation) + pp_aux <- SimpleList(iLSI=iLSI, gene_loadings=NULL) cds@preprocess_aux <- pp_aux if(is.null(cds@preprocess_aux$iLSI$granges$end)){ starts<-cds@preprocess_aux$iLSI$granges[as.character(cds@preprocess_aux$iLSI$granges$seqnames) %in% as.character(cds@preprocess_aux$iLSI$granges$seqnames)[1],]$start From 110071a025c915341e4666dba9b654dbae9ec2a3 Mon Sep 17 00:00:00 2001 From: scfurl Date: Thu, 19 Nov 2020 23:15:07 -0800 Subject: [PATCH 36/41] bugfix --- DESCRIPTION | 1 + R/MatrixGeneExpression.R | 2 +- R/RcppExports.R | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 R/RcppExports.R diff --git a/DESCRIPTION b/DESCRIPTION index e4d19a0a..5a51e729 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -80,6 +80,7 @@ Collate: 'MultiModal.R' 'ProjectMethods.R' 'QualityControl.R' + 'RcppExports.R' 'RNAIntegration.R' 'ReproduciblePeakSet.R' 'Trajectory.R' diff --git a/R/MatrixGeneExpression.R b/R/MatrixGeneExpression.R index 513c04fe..1b432e45 100644 --- a/R/MatrixGeneExpression.R +++ b/R/MatrixGeneExpression.R @@ -73,7 +73,7 @@ addGeneExpressionMatrix <- function( .logMessage("Overlap Per Sample w/ scATAC : ", paste(paste(names(overlapPerSample), round(overlapPerSample,3), sep = "="), collapse=","), logFile = logFile, verbose = TRUE) #Get QC Info - assay(se) <- Matrix::Matrix(assay(se), sparse=TRUE) + assay(seRNA) <- Matrix::Matrix(assay(seRNA), sparse=TRUE) nUMI <- Matrix::colSums(assay(seRNA)) mb <- assay(seRNA) mb@x[mb@x > 0] <- 1 diff --git a/R/RcppExports.R b/R/RcppExports.R new file mode 100644 index 00000000..b03ff458 --- /dev/null +++ b/R/RcppExports.R @@ -0,0 +1,39 @@ +# Generated by using Rcpp::compileAttributes() -> do not edit by hand +# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +rowCorCpp <- function(idxX, idxY, X, Y) { + .Call('_ArchR_rowCorCpp', PACKAGE = 'ArchR', idxX, idxY, X, Y) +} + +rleSumsStrandedChr <- function(rle, x, strand, width) { + .Call('_ArchR_rleSumsStrandedChr', PACKAGE = 'ArchR', rle, x, strand, width) +} + +rleSumsStranded <- function(rleList, grList, width, as_integer) { + .Call('_ArchR_rleSumsStranded', PACKAGE = 'ArchR', rleList, grList, width, as_integer) +} + +tabulate2dCpp <- function(x, xmin, xmax, y, ymin, ymax) { + .Call('_ArchR_tabulate2dCpp', PACKAGE = 'ArchR', x, xmin, xmax, y, ymin, ymax) +} + +computeSparseRowVariances <- function(j, val, rm, n) { + .Call('_ArchR_computeSparseRowVariances', PACKAGE = 'ArchR', j, val, rm, n) +} + +determineOverlapCpp <- function(m, overlapCut) { + .Call('_ArchR_determineOverlapCpp', PACKAGE = 'ArchR', m, overlapCut) +} + +kmerIdxCpp <- function(str, window, n, kmer) { + .Call('_ArchR_kmerIdxCpp', PACKAGE = 'ArchR', str, window, n, kmer) +} + +kmerPositionFrequencyCpp <- function(string_vector, strand_vector, window, w, kmer) { + .Call('_ArchR_kmerPositionFrequencyCpp', PACKAGE = 'ArchR', string_vector, strand_vector, window, w, kmer) +} + +kmerIDFrequencyCpp <- function(string_vector, id_vector, n_id, window, w, kmer) { + .Call('_ArchR_kmerIDFrequencyCpp', PACKAGE = 'ArchR', string_vector, id_vector, n_id, window, w, kmer) +} + From 40bede0c2b96b5bb496eb23a760a192a3075b3b9 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Sun, 22 Nov 2020 18:47:13 -0800 Subject: [PATCH 37/41] bugfix remove sys.time for weird error in R 4.0 --- .DS_Store | Bin 14340 -> 14340 bytes R/FilterCells.R | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.DS_Store b/.DS_Store index 81914b4f67252247a22d169e8ec55185b6100a30..18e5b820c2bf2a36e2c9fb7519b302e6d21adbd4 100644 GIT binary patch delta 602 zcmb8rOGs347>4ohu^P_Fll~`loSQjf3KIj9HWP|e17nv->1II?gr+W}ypUAtIObx& zs9YVoC=pZ?g-OC_7b;vtkP@~?ksu@5xXeZOHXWLRwtc&gXZ8M)9m$TdD#esJ>FD=6 zRY>e;=PH!A@hBpkYUqi51LQ?QS+F+ zCi7rRV|!a&OHZ>RHD@n^UUM{W&FSLEdP$!q1yU~6QY-axT;eh)mt{o8<-R}4N^sOJccG|@^YCpgI|`Z>c{ z&T*a#rCjA2*SW!6M!Clrle}PxX=a(@9g8gSnJ;E4CuZBeBev71{X5A0&mjFxR<^RQ z&dJSloXPEK&MfsBYC_XzJubI%U8&crGBj=0>2iCFptnp{4Vqf^`}Ky5 zjhbrG)rxejG^%vfsjKDby4i?mszz6~bd4HYbvv(gC0cRhe;B9bwS2G$eqZVEp?R3#ioL>4E_(M3zMJ_S4mSL`NlUv;8 i4kL^+!9yPLm?u1EhI!tyU^?7|sib2-Pp$O*$o~cT{FX%k delta 556 zcmaLTOKePG9ES1#Q&s20!8iBmbZSnOsW6cl(@sZAv?8UQNGzypBm@l-nh+ILQl{xf z;_``=q(UTExO9ruG$B}6m^PY-OT`6{6R2rnU$@N3YtE#)9Rc3M(F7ZmQjen(=Rj>#TZ1?KRcRVr{Tin(C;jN{e;1)oiGYsmh9Vt<_?> zD40r&>ZT&$e*s73y?m8PN|?nQ2QK8GEq1_CG|}RKwUJ>1?GD*?cCeFu)7XyF#R+;j zOO`$d@1ldJxx!TjxXul3I*9kExX(id9mG7tJmneBdBJPm@|kh%3q^A0{QYKbw*4dU E7o~)VqW}N^ diff --git a/R/FilterCells.R b/R/FilterCells.R index 6ef51514..54a89ac1 100644 --- a/R/FilterCells.R +++ b/R/FilterCells.R @@ -99,7 +99,7 @@ filterDoublets <- function(ArchRProj = NULL, cutEnrich = 1, cutScore = -Inf, fil } ArchRProj <- addProjectSummary(ArchRProj = ArchRProj, name = "filterDoublets", - summary = c("Date" = Sys.time(), cutEnrich = cutEnrich, cutScore = cutScore, filterRatio = filterRatio)) + summary = c(cutEnrich = cutEnrich, cutScore = cutScore, filterRatio = filterRatio)) ArchRProj From 4820aa76901541f7c5824000f6bd0e4a675b2303 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Sun, 22 Nov 2020 18:58:48 -0800 Subject: [PATCH 38/41] bug fix new uwot save and loading features --- R/Embedding.R | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/R/Embedding.R b/R/Embedding.R index ba59be35..c7edb013 100644 --- a/R/Embedding.R +++ b/R/Embedding.R @@ -207,9 +207,18 @@ addUMAP <- function( } +#New Save UWOT +.saveUWOT <- function(model, file){ + tryCatch({ + uwot::save_uwot(model = model, file = file, verbose = TRUE) + }, error = function(x){ + .saveUWOT_Depreciated(model = model, file = file) #backwards to previous version + }) +} + #save_uwot does not work because tarring doesnt work for some reason on Stanford's compute server #Adapted from save_uwot -.saveUWOT <- function(model, file){ +.saveUWOT_Depreciated <- function(model, file){ file <- file.path(normalizePath(dirname(file)), basename(file)) wd <- getwd() mod_dir <- tempfile(pattern = "dir") @@ -243,8 +252,17 @@ addUMAP <- function( return(o) } +#New Save UWOT +.loadUWOT <- function(file){ + tryCatch({ + uwot::load_uwot(file = file, verbose = TRUE) + }, error = function(x){ + .loadUWOT_Depreciated(file = file, nDim = nDim) #backwards to previous version + }) +} + #Adapted from load_uwot -.loadUWOT <- function(file, nDim = NULL){ +.loadUWOT_Depreciated <- function(file, nDim = NULL){ model <- NULL tryCatch({ mod_dir <- tempfile(pattern = "dir") From 523cc7cfb28f0f570846ee88af3de87a3dd529d2 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Sun, 22 Nov 2020 19:06:01 -0800 Subject: [PATCH 39/41] deprecated --- R/Embedding.R | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/R/Embedding.R b/R/Embedding.R index c7edb013..e0ead19c 100644 --- a/R/Embedding.R +++ b/R/Embedding.R @@ -211,14 +211,14 @@ addUMAP <- function( .saveUWOT <- function(model, file){ tryCatch({ uwot::save_uwot(model = model, file = file, verbose = TRUE) - }, error = function(x){ - .saveUWOT_Depreciated(model = model, file = file) #backwards to previous version + }, error = function(e){ + .saveUWOT_Deprecated(model = model, file = file) #backwards to previous version }) } #save_uwot does not work because tarring doesnt work for some reason on Stanford's compute server #Adapted from save_uwot -.saveUWOT_Depreciated <- function(model, file){ +.saveUWOT_Deprecated <- function(model, file){ file <- file.path(normalizePath(dirname(file)), basename(file)) wd <- getwd() mod_dir <- tempfile(pattern = "dir") @@ -256,13 +256,13 @@ addUMAP <- function( .loadUWOT <- function(file){ tryCatch({ uwot::load_uwot(file = file, verbose = TRUE) - }, error = function(x){ - .loadUWOT_Depreciated(file = file, nDim = nDim) #backwards to previous version + }, error = function(e){ + .loadUWOT_Deprecated(file = file, nDim = nDim) #backwards to previous version }) } #Adapted from load_uwot -.loadUWOT_Depreciated <- function(file, nDim = NULL){ +.loadUWOT_Deprecated <- function(file, nDim = NULL){ model <- NULL tryCatch({ mod_dir <- tempfile(pattern = "dir") From a22aa299b5d86bc192c0cca27058eb61677a2b35 Mon Sep 17 00:00:00 2001 From: jgranja24 Date: Sun, 21 Feb 2021 21:13:28 -0800 Subject: [PATCH 40/41] update to 1.0.1 --- DESCRIPTION | 4 +- NAMESPACE | 2 + R/AllClasses.R | 4 +- R/AnnotationGenome.R | 9 +++- R/AnnotationPeaks.R | 27 ++++++++++-- R/ArchRBrowser.R | 6 +++ R/ArrowRead.R | 22 +++++++++- R/ArrowUtils.R | 12 +++++- R/CreateArrow.R | 76 ++++++++++++++++++++++----------- R/GgplotUtils.R | 2 + R/GlobalDefaults.R | 24 ++++++++++- R/GroupCoverages.R | 14 +++--- R/GroupExport.R | 6 ++- R/IntegrativeAnalysis.R | 15 +++++-- R/IterativeLSI.R | 5 +-- R/LoggerUtils.R | 43 ++++++++++++++++--- R/MarkerFeatures.R | 4 ++ R/MatrixDeviations.R | 6 +++ R/MatrixGeneScores.R | 8 ++++ R/ProjectMethods.R | 38 ++++++++++++++++- R/RNAIntegration.R | 7 ++- R/ReproduciblePeakSet.R | 11 ++++- R/Trajectory.R | 17 +++++++- R/VisualizeData.R | 32 +++++++------- man/addArchRVerbose.Rd | 14 ++++++ man/addGeneIntegrationMatrix.Rd | 3 ++ man/addPeakAnnotations.Rd | 2 +- man/addPeakSet.Rd | 10 ++++- man/getArchRVerbose.Rd | 11 +++++ 29 files changed, 354 insertions(+), 80 deletions(-) create mode 100644 man/addArchRVerbose.Rd create mode 100644 man/getArchRVerbose.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 5a51e729..9cb3f83d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: ArchR Type: Package -Date: 2020-10-01 +Date: 2020-11-23 Title: Analyzing single-cell regulatory chromatin in R. -Version: 1.0.0 +Version: 1.0.1 Authors@R: c( person("Jeffrey", "Granja", email = "jgranja.stanford@gmail.com", role = c("aut","cre")), person("Ryan", "Corces", role = "aut")) diff --git a/NAMESPACE b/NAMESPACE index 63f00e07..03663903 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -17,6 +17,7 @@ export(addArchRDebugging) export(addArchRGenome) export(addArchRLogging) export(addArchRThreads) +export(addArchRVerbose) export(addBgdPeaks) export(addCellColData) export(addClusters) @@ -69,6 +70,7 @@ export(getArchRDebugging) export(getArchRGenome) export(getArchRLogging) export(getArchRThreads) +export(getArchRVerbose) export(getArrowFiles) export(getAvailableMatrices) export(getBgdPeaks) diff --git a/R/AllClasses.R b/R/AllClasses.R index 608482d9..368bffc9 100644 --- a/R/AllClasses.R +++ b/R/AllClasses.R @@ -130,7 +130,7 @@ ArchRProject <- function( message("Getting SampleNames...") sampleNames <- unlist(.safelapply(seq_along(ArrowFiles), function(x){ - message(x, " ", appendLF = FALSE) + if(getArchRVerbose()) message(x, " ", appendLF = FALSE) .sampleName(ArrowFiles[x]) }, threads = threads)) message("") @@ -159,7 +159,7 @@ ArchRProject <- function( #Cell Information message("Getting Cell Metadata...") metadataList <- .safelapply(seq_along(ArrowFiles), function(x){ - message(x, " ", appendLF = FALSE) + if(getArchRVerbose()) message(x, " ", appendLF = FALSE) .getMetadata(ArrowFiles[x]) }, threads = threads) message("") diff --git a/R/AnnotationGenome.R b/R/AnnotationGenome.R index f169be7f..d2fa9a65 100644 --- a/R/AnnotationGenome.R +++ b/R/AnnotationGenome.R @@ -41,7 +41,14 @@ createGenomeAnnotation <- function( ################## message("Getting blacklist..") - blacklist <- .getBlacklist(genome = bsg@provider_version) + + genomeName <- tryCatch({ + bsg@provider_version + }, error = function(e){ + strsplit(bsg@pkgname,"\\.")[[1]][4] + }) + + blacklist <- .getBlacklist(genome = genomeName) }else{ diff --git a/R/AnnotationPeaks.R b/R/AnnotationPeaks.R index 60b30642..13df1f22 100644 --- a/R/AnnotationPeaks.R +++ b/R/AnnotationPeaks.R @@ -98,7 +98,7 @@ getMatches <- function(ArchRProj = NULL, name = NULL, annoName = NULL){ #' binary value is stored indicating whether each region is observed within the peak region. #' #' @param ArchRProj An `ArchRProject` object. -#' @param regions A `list` of `GRanges` that are to be overlapped with the `peakSet` in the `ArchRProject`. +#' @param regions A named `list` of `GRanges` that are to be overlapped with the `peakSet` in the `ArchRProject`. #' @param name The name of `peakAnnotation` object to be stored as in `ArchRProject`. #' @param force A boolean value indicating whether to force the `peakAnnotation` object indicated by `name` to be overwritten #' if it already exists in the given `ArchRProject`. @@ -136,6 +136,10 @@ addPeakAnnotations <- function( }else{ + if(is.null(names(regions))){ + names(regions) <- paste0("Region_", seq_along(regions)) + } + regionPositions <- lapply(seq_along(regions), function(x){ .logThis(regions[[x]], paste0("regions[[x]]-", x), logFile = logFile) @@ -184,6 +188,9 @@ addPeakAnnotations <- function( # Peak Overlap Matrix ############################################################# peakSet <- getPeakSet(ArchRProj) + if(is.null(peakSet)){ + .logStop("peakSet is NULL. You need a peakset to run addMotifAnnotations! See addReproduciblePeakSet!", logFile = logFile) + } allPositions <- unlist(regionPositions) .logDiffTime("Creating Peak Overlap Matrix", t1 = tstart, verbose = TRUE, logFile = logFile) @@ -431,6 +438,9 @@ addMotifAnnotations <- function( ############################################################# .logDiffTime("Finding Motif Positions with motifmatchr!", t1 = tstart, verbose = TRUE, logFile = logFile) peakSet <- ArchRProj@peakSet + if(is.null(peakSet)){ + .logStop("peakSet is NULL. You need a peakset to run addMotifAnnotations! See addReproduciblePeakSet!", logFile = logFile) + } motifPositions <- motifmatchr::matchMotifs( pwms = motifs, subject = peakSet, @@ -606,7 +616,11 @@ addArchRAnnotations <- function( } } - genome <- tolower(validBSgenome(getGenome(ArchRProj))@provider_version) + genome <- tolower(tryCatch({ + validBSgenome(getGenome(ArchRProj))$provider_version + }, error = function(e){ + strsplit(validBSgenome(getGenome(ArchRProj))@pkgname,"\\.")[[1]][4] + })) annoPath <- file.path(find.package("ArchR", NULL, quiet = TRUE), "data", "Annotations") dir.create(annoPath, showWarnings = FALSE) @@ -690,6 +704,9 @@ addArchRAnnotations <- function( # Peak Overlap Matrix ############################################################# peakSet <- getPeakSet(ArchRProj) + if(is.null(peakSet)){ + .logStop("peakSet is NULL. You need a peakset to run addMotifAnnotations! See addReproduciblePeakSet!", logFile = logFile) + } chr <- paste0(unique(seqnames(peakSet))) .logMessage("Annotating Chromosomes", verbose = TRUE, logFile = logFile) @@ -1061,6 +1078,10 @@ plotEnrichHeatmap <- function( mat <- mat[keep, ,drop = FALSE] .logThis(mat, "mat-mlog10Padj-Filter", logFile = logFile) + if(nrow(mat)==0){ + stop("No enrichments found for your cutoff!") + } + passMat <- lapply(seq_len(nrow(mat)), function(x){ (mat[x, ] >= 0.9*max(mat[x, ])) * 1 }) %>% Reduce("rbind", .) %>% data.frame @@ -1070,7 +1091,7 @@ plotEnrichHeatmap <- function( mat[mat > pMax] <- pMax if(nrow(mat)==0){ - stop("No enrichments found!") + stop("No enrichments found for your cutoff!") } mat <- .rowScale(as.matrix(mat), min = 0) diff --git a/R/ArchRBrowser.R b/R/ArchRBrowser.R index 27a01fbd..c496cc9f 100644 --- a/R/ArchRBrowser.R +++ b/R/ArchRBrowser.R @@ -1749,6 +1749,12 @@ plotBrowserTrack <- function( title <- paste0(as.character(seqnames(region)),":", start(region)-1, "-", end(region), " ", title) + #Re-Order + groupDF$group2 <- factor( + paste0(groupDF$group2), + levels = gtools::mixedsort(unique(paste0(groupDF$group2))) + ) + p <- ggplot(groupDF, aes(x=bp, y=y, width = tileSize, fill = group2, color = group2)) + geom_tile(size = scTileSize) + facet_grid(group2 ~ ., scales="free_y") + diff --git a/R/ArrowRead.R b/R/ArrowRead.R index 0fa26ae1..20bbdb6c 100644 --- a/R/ArrowRead.R +++ b/R/ArrowRead.R @@ -783,6 +783,11 @@ getMatrixFromArrow <- function( matFiles <- lapply(mat, function(x) x[[2]]) %>% Reduce("c", .) mat <- lapply(mat, function(x) x[[1]]) %>% Reduce("cbind", .) + if(!all(cellNames %in% colnames(mat))){ + .logThis(sampledCellNames, "cellNames supplied", logFile = logFile) + .logThis(colnames(mat), "cellNames from matrix", logFile = logFile) + stop("Error not all cellNames found in partialMatrix") + } mat <- mat[,sampledCellNames, drop = FALSE] mat <- .checkSparseMatrix(mat, length(sampledCellNames)) @@ -793,6 +798,11 @@ getMatrixFromArrow <- function( }else{ mat <- Reduce("cbind", mat) + if(!all(cellNames %in% colnames(mat))){ + .logThis(cellNames, "cellNames supplied", logFile = logFile) + .logThis(colnames(mat), "cellNames from matrix", logFile = logFile) + stop("Error not all cellNames found in partialMatrix") + } mat <- mat[,cellNames, drop = FALSE] mat <- .checkSparseMatrix(mat, length(cellNames)) @@ -902,6 +912,16 @@ getMatrixFromArrow <- function( stop("Means Variances and Ns lengths not identical") } + #Check if samples have NAs due to N = 1 sample or some other weird thing. + #Set it to min non NA variance + dfVars <- lapply(seq_len(nrow(dfVars)), function(x){ + vx <- dfVars[x, ] + if(any(is.na(vx))){ + vx[is.na(vx)] <- min(vx[!is.na(vx)]) + } + vx + }) %>% Reduce("rbind", .) + combinedMeans <- rowSums(t(t(dfMeans) * ns)) / sum(ns) summedVars <- rowSums(t(t(dfVars) * (ns - 1)) + t(t(dfMeans^2) * ns)) combinedVars <- (summedVars - sum(ns)*combinedMeans^2)/(sum(ns)-1) @@ -925,8 +945,6 @@ getMatrixFromArrow <- function( length(.availableCells(ArrowFiles[y], useMatrix)) }) %>% unlist - - #Compute RowVars summaryDF <- .safelapply(seq_along(featureDF), function(x){ diff --git a/R/ArrowUtils.R b/R/ArrowUtils.R index 7fa584b5..f8e4af75 100644 --- a/R/ArrowUtils.R +++ b/R/ArrowUtils.R @@ -379,10 +379,20 @@ o <- h5createGroup(outArrow, groupName) mData <- ArrowInfo[[groupName]] + cellNames <- .h5read(inArrow, "Metadata/CellNames") + idx <- which(cellNames %in% stringr::str_split(cellsKeep, pattern="#", simplify=TRUE)[,2]) + if(length(idx)==0){ + stop("No cells matching in arrow file!") + } + for(i in seq_len(nrow(mData))){ h5name <- paste0(groupName, "/", mData$name[i]) - h5write(.h5read(inArrow, h5name), file = outArrow, name = h5name) + mDatai <- .h5read(inArrow, h5name) + if(length(mDatai)==length(cellNames)){ + mDatai <- mDatai[idx] + } + h5write(mDatai, file = outArrow, name = h5name) } #2. scATAC-Fragments diff --git a/R/CreateArrow.R b/R/CreateArrow.R index a0ad4564..9bbd880e 100644 --- a/R/CreateArrow.R +++ b/R/CreateArrow.R @@ -474,7 +474,7 @@ createArrowFiles <- function( .logDiffTime("Continuing through after error ggplot for Fragment Size Distribution", t1 = tstart, logFile = logFile) #print(x) - message("\n") + if(getArchRVerbose()) message("\n") }) gc() @@ -538,7 +538,7 @@ createArrowFiles <- function( .logDiffTime("Continuing through after error ggplot for TSS by Frags", t1 = tstart, logFile = logFile) #message(x) - message("\n") + if(getArchRVerbose()) message("\n") }) @@ -1120,7 +1120,7 @@ createArrowFiles <- function( TRUE }, error = function(x){ tryCatch({ - message("Attempting to index ", file," as tabix..") + if(getArchRVerbose()) message("Attempting to index ", file," as tabix..") indexTabix(file, format = "bed") TRUE }, error = function(y){ @@ -1139,7 +1139,7 @@ createArrowFiles <- function( } }, error = function(x){ tryCatch({ - message("Attempting to index ", file," as bam...") + if(getArchRVerbose()) message("Attempting to index ", file," as bam...") indexBam(file) TRUE }, error = function(y){ @@ -1279,7 +1279,7 @@ createArrowFiles <- function( o <- .suppressAll(h5createDataset(tmpFile, chrRGLengths, storage.mode = "integer", dims = c(lengthRG, 1), level = 0)) o <- .suppressAll(h5createDataset(tmpFile, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, size = max(nchar(RG@values)) + 1)) - o <- h5write(obj = cbind(dt$V2,dt$V3-dt$V2), file = tmpFile, name = chrPos) + o <- h5write(obj = cbind(dt$V2,dt$V3 - dt$V2 + 1), file = tmpFile, name = chrPos) o <- h5write(obj = RG@lengths, file = tmpFile, name = chrRGLengths) o <- h5write(obj = RG@values, file = tmpFile, name = chrRGValues) @@ -1315,7 +1315,7 @@ createArrowFiles <- function( o <- .suppressAll(h5createDataset(tmpChrFile, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, size = max(nchar(RG@values)) + 1)) - o <- h5write(obj = cbind(dt$V2,dt$V3-dt$V2), file = tmpChrFile, name = chrPos) + o <- h5write(obj = cbind(dt$V2,dt$V3 - dt$V2 + 1), file = tmpChrFile, name = chrPos) o <- h5write(obj = RG@lengths, file = tmpChrFile, name = chrRGLengths) o <- h5write(obj = RG@values, file = tmpChrFile, name = chrRGValues) @@ -1651,7 +1651,7 @@ createArrowFiles <- function( o <- .suppressAll(h5createDataset(tmpFile, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, size = max(nchar(RG@values)) + 1)) - o <- h5write(obj = cbind(dt$start,dt$end-dt$start), file = tmpFile, name = chrPos) + o <- h5write(obj = cbind(dt$start, dt$end - dt$start + 1), file = tmpFile, name = chrPos) o <- h5write(obj = RG@lengths, file = tmpFile, name = chrRGLengths) o <- h5write(obj = RG@values, file = tmpFile, name = chrRGValues) @@ -1687,7 +1687,7 @@ createArrowFiles <- function( o <- .suppressAll(h5createDataset(tmpChrFile, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, size = max(nchar(RG@values)) + 1)) - o <- h5write(obj = cbind(dt$start,dt$end-dt$start), file = tmpChrFile, name = chrPos) + o <- h5write(obj = cbind(dt$start, dt$end - dt$start + 1), file = tmpChrFile, name = chrPos) o <- h5write(obj = RG@lengths, file = tmpChrFile, name = chrRGLengths) o <- h5write(obj = RG@values, file = tmpChrFile, name = chrRGValues) @@ -1931,14 +1931,29 @@ createArrowFiles <- function( chrPos <- paste0("Fragments/",chr,"/Ranges") chrRGLengths <- paste0("Fragments/",chr,"/RGLengths") chrRGValues <- paste0("Fragments/",chr,"/RGValues") - o <- h5createGroup(outArrow, paste0("Fragments/",chr)) - o <- .suppressAll(h5createDataset(outArrow, chrPos, storage.mode = "integer", dims = c(length(fragments), 2), level = 0)) - o <- .suppressAll(h5createDataset(outArrow, chrRGLengths, storage.mode = "integer", dims = c(lengthRG, 1), level = 0)) - o <- .suppressAll(h5createDataset(outArrow, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, - size = max(nchar(mcols(fragments)$RG@values)) + 1)) - o <- h5write(obj = cbind(start(fragments),width(fragments)), file = outArrow, name = chrPos) - o <- h5write(obj = mcols(fragments)$RG@lengths, file = outArrow, name = chrRGLengths) - o <- h5write(obj = mcols(fragments)$RG@values, file = outArrow, name = chrRGValues) + + if(lengthRG == 0){ + + .logMessage(msg = paste0(prefix, " detected 0 Fragments in cells passing filtering threshold for ", chr), logFile = logFile) + + o <- h5createGroup(outArrow, paste0("Fragments/",chr)) + o <- .suppressAll(h5createDataset(outArrow, chrPos, storage.mode = "integer", dims = c(0, 2), level = 0)) + o <- .suppressAll(h5createDataset(outArrow, chrRGLengths, storage.mode = "integer", dims = c(0, 1), level = 0)) + o <- .suppressAll(h5createDataset(outArrow, chrRGValues, storage.mode = "character", dims = c(0, 1), level = 0, + size = 10)) + + }else{ + + o <- h5createGroup(outArrow, paste0("Fragments/",chr)) + o <- .suppressAll(h5createDataset(outArrow, chrPos, storage.mode = "integer", dims = c(length(fragments), 2), level = 0)) + o <- .suppressAll(h5createDataset(outArrow, chrRGLengths, storage.mode = "integer", dims = c(lengthRG, 1), level = 0)) + o <- .suppressAll(h5createDataset(outArrow, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, + size = max(nchar(mcols(fragments)$RG@values)) + 1)) + + o <- h5write(obj = cbind(start(fragments),width(fragments)), file = outArrow, name = chrPos) + o <- h5write(obj = mcols(fragments)$RG@lengths, file = outArrow, name = chrRGLengths) + o <- h5write(obj = mcols(fragments)$RG@values, file = outArrow, name = chrRGValues) + } #Free Some Memory! rm(fragments) @@ -1996,15 +2011,26 @@ createArrowFiles <- function( chrRGLengths <- paste0(chr, "._.RGLengths") chrRGValues <- paste0(chr, "._.RGValues") - #HDF5 Write - o <- .suppressAll(h5createDataset(tmpChrFile, chrPos, storage.mode = "integer", dims = c(length(fragments), 2), level = 0)) - o <- .suppressAll(h5createDataset(tmpChrFile, chrRGLengths, storage.mode = "integer", dims = c(lengthRG, 1), level = 0)) - o <- .suppressAll(h5createDataset(tmpChrFile, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, - size = max(nchar(mcols(fragments)$RG@values)) + 1)) - - o <- h5write(obj = cbind(start(fragments),width(fragments)), file = tmpChrFile, name = chrPos) - o <- h5write(obj = mcols(fragments)$RG@lengths, file = tmpChrFile, name = chrRGLengths) - o <- h5write(obj = mcols(fragments)$RG@values, file = tmpChrFile, name = chrRGValues) + if(lengthRG == 0){ + + #HDF5 Write + o <- .suppressAll(h5createDataset(tmpChrFile, chrPos, storage.mode = "integer", dims = c(0, 2), level = 0)) + o <- .suppressAll(h5createDataset(tmpChrFile, chrRGLengths, storage.mode = "integer", dims = c(0, 1), level = 0)) + o <- .suppressAll(h5createDataset(tmpChrFile, chrRGValues, storage.mode = "character", dims = c(0, 1), level = 0, + size = 10)) + + }else{ + + #HDF5 Write + o <- .suppressAll(h5createDataset(tmpChrFile, chrPos, storage.mode = "integer", dims = c(length(fragments), 2), level = 0)) + o <- .suppressAll(h5createDataset(tmpChrFile, chrRGLengths, storage.mode = "integer", dims = c(lengthRG, 1), level = 0)) + o <- .suppressAll(h5createDataset(tmpChrFile, chrRGValues, storage.mode = "character", dims = c(lengthRG, 1), level = 0, + size = max(nchar(mcols(fragments)$RG@values)) + 1)) + + o <- h5write(obj = cbind(start(fragments),width(fragments)), file = tmpChrFile, name = chrPos) + o <- h5write(obj = mcols(fragments)$RG@lengths, file = tmpChrFile, name = chrRGLengths) + o <- h5write(obj = mcols(fragments)$RG@values, file = tmpChrFile, name = chrRGValues) + } #Free Some Memory! rm(fragments) diff --git a/R/GgplotUtils.R b/R/GgplotUtils.R index c0339437..609caa08 100644 --- a/R/GgplotUtils.R +++ b/R/GgplotUtils.R @@ -952,8 +952,10 @@ theme_ArchR <- function( .checkCairo <- function(){ tryCatch({ + tmp <- dev.cur() Cairo::Cairo(type='raster') dev.off() + dev.set(tmp) TRUE }, error = function(e){ FALSE diff --git a/R/GlobalDefaults.R b/R/GlobalDefaults.R index 26854c57..aae3753b 100644 --- a/R/GlobalDefaults.R +++ b/R/GlobalDefaults.R @@ -8,7 +8,8 @@ ArchRDefaults <- list( ArchR.logging = TRUE, ArchR.genome = NA, ArchR.chrPrefix = TRUE, - ArchR.debugging = FALSE + ArchR.debugging = FALSE, + ArchR.verbose = TRUE ) .onAttach <- function(libname, pkgname){ @@ -27,9 +28,30 @@ ArchRDefaults <- list( if(!.checkCairo()){ packageStartupMessage("WARNING : Cairo check shows Cairo is not functional.\n ggplot2 rasterization will not be available without Cario.\n This may cause issues editing plots with many thousands of points from single cells.") } + if(.checkJupyter()){ + packageStartupMessage("Detected Jupyer Notebook session. Disabling Log Messages!\n\tIf this is undesired use `addArchRVerbose(TRUE)`") + addArchRVerbose(verbose = FALSE) + } invisible() } +#Check Jupyer Status +.checkJupyter <- function(){ + tryCatch({ + sysID <- Sys.getenv("JPY_PARENT_PID") + if(!is.character(sysID)){ + return(FALSE) + } + if(sysID == ""){ + FALSE + }else{ + TRUE + } + },error= function(e){ + FALSE + }) +} + #' Install extra packages used in ArchR that are not installed by default #' #' This function will install extra packages used in ArchR that are not installed by default. diff --git a/R/GroupCoverages.R b/R/GroupCoverages.R index 549ec840..63859218 100644 --- a/R/GroupCoverages.R +++ b/R/GroupCoverages.R @@ -195,7 +195,11 @@ addGroupCoverages <- function( args$ArrowFiles <- getArrowFiles(ArchRProj) args$availableChr <- .availableSeqnames(getArrowFiles(ArchRProj)) args$chromLengths <- getChromLengths(ArchRProj) - args$cellsInArrow <- split(rownames(getCellColData(ArchRProj)), getCellColData(ArchRProj)$Sample) + #args$cellsInArrow <- split(rownames(getCellColData(ArchRProj)), getCellColData(ArchRProj)$Sample) + args$cellsInArrow <- cellsInArrow <- split( + rownames(getCellColData(ArchRProj)), + stringr::str_split(rownames(getCellColData(ArchRProj)), pattern="\\#", simplify=TRUE)[,1] + ) args$covDir <- file.path(getOutputDirectory(ArchRProj), "GroupCoverages", groupBy) args$parallelParam <- parallelParam args$threads <- threads @@ -218,9 +222,6 @@ addGroupCoverages <- function( nCells <- lapply(seq_along(batchOut),function(x) batchOut[[x]]$nCells) %>% unlist nFragments <- lapply(seq_along(batchOut),function(x) batchOut[[x]]$nFragments) %>% unlist - #Enable Hdf5 File Locking - h5enableFileLocking() - #Add To Project coverageMetadata <- DataFrame( Group = stringr::str_split(names(unlistGroups), pattern = "\\._.", simplify=TRUE)[,1], @@ -245,6 +246,9 @@ addGroupCoverages <- function( ArchRProj@projectMetadata$GroupCoverages[[groupBy]] <- SimpleList(Params = Params, coverageMetadata = coverageMetadata) + #Enable Hdf5 File Locking + h5enableFileLocking() + .logDiffTime(sprintf("Finished Creation of Coverage Files!"), tstart, addHeader = FALSE) .endLogging(logFile = logFile) @@ -671,7 +675,7 @@ addGroupCoverages <- function( .getCoverageMetadata <- function(ArchRProj = NULL, groupBy = NULL, useGroups = NULL, minCells = NULL){ coverageMetadata <- ArchRProj@projectMetadata$GroupCoverages[[groupBy]]$coverageMetadata if(is.null(coverageMetadata)){ - stop("No Coverage Metadata found for : ", groupBy) + stop("No Coverage Metadata found for : ", groupBy, ". Please run addGroupCoverages!") } if(!is.null(useGroups)){ if(sum(coverageMetadata[,1] %in% useGroups) == 0){ diff --git a/R/GroupExport.R b/R/GroupExport.R index b3e83897..adbbcc1a 100644 --- a/R/GroupExport.R +++ b/R/GroupExport.R @@ -222,7 +222,11 @@ getGroupBW <- function( o <- suppressWarnings(file.remove(list.files(bwDir2, full.names = TRUE))) - cellsInArrow <- split(rownames(getCellColData(ArchRProj)), getCellColData(ArchRProj)$Sample) + #cellsInArrow <- split(rownames(getCellColData(ArchRProj)), getCellColData(ArchRProj)$Sample) + cellsInArrow <- split( + rownames(getCellColData(ArchRProj)), + stringr::str_split(rownames(getCellColData(ArchRProj)), pattern="\\#", simplify=TRUE)[,1] + ) availableChr <- .availableSeqnames(head(getArrowFiles(ArchRProj))) chromLengths <- getChromLengths(ArchRProj) chromSizes <- getChromSizes(ArchRProj) diff --git a/R/IntegrativeAnalysis.R b/R/IntegrativeAnalysis.R index c85afab8..5bd67784 100644 --- a/R/IntegrativeAnalysis.R +++ b/R/IntegrativeAnalysis.R @@ -820,7 +820,7 @@ addCoAccessibility <- function( o$idx2 <- NULL o <- o[!is.na(o$correlation),] - o$TStat <- (o$correlation / sqrt((max(1-o$correlation^2, 0.00000000000000001))/(length(knnObj)-2))) #T-statistic P-value + o$TStat <- (o$correlation / sqrt((pmax(1-o$correlation^2, 0.00000000000000001, na.rm = TRUE))/(length(knnObj)-2))) #T-statistic P-value o$Pval <- 2*pt(-abs(o$TStat), length(knnObj) - 2) o$FDR <- p.adjust(o$Pval, method = "fdr") o$VarQuantile1 <- .getQuantiles(o$Variability1) @@ -1027,9 +1027,16 @@ addPeak2GeneLinks <- function( tstart <- Sys.time() dfAll <- .safelapply(seq_along(ArrowFiles), function(x){ + cNx <- paste0(names(ArrowFiles)[x], "#", h5read(ArrowFiles[x], paste0(useMatrix, "/Info/CellNames"))) + pSx <- tryCatch({ + h5read(ArrowFiles[x], paste0(useMatrix, "/Info/predictionScore")) + }, error = function(e){ + if(getArchRVerbose()) message("No predictionScore found. Continuing without predictionScore!") + rep(9999999, length(cNx)) + }) DataFrame( - cellNames = paste0(names(ArrowFiles)[x], "#", h5read(ArrowFiles[x], paste0(useMatrix, "/Info/CellNames"))), - predictionScore = h5read(ArrowFiles[x], paste0(useMatrix, "/Info/predictionScore")) + cellNames = cNx, + predictionScore = pSx ) }, threads = threads) %>% Reduce("rbind", .) @@ -1172,7 +1179,7 @@ addPeak2GeneLinks <- function( o$Correlation <- rowCorCpp(as.integer(o$A), as.integer(o$B), assay(seATAC), assay(seRNA)) o$VarAssayA <- .getQuantiles(matrixStats::rowVars(assay(seATAC)))[o$A] o$VarAssayB <- .getQuantiles(matrixStats::rowVars(assay(seRNA)))[o$B] - o$TStat <- (o$Correlation / sqrt((max(1-o$Correlation^2, 0.00000000000000001))/(ncol(seATAC)-2))) #T-statistic P-value + o$TStat <- (o$Correlation / sqrt((pmax(1-o$Correlation^2, 0.00000000000000001, na.rm = TRUE))/(ncol(seATAC)-2))) #T-statistic P-value o$Pval <- 2*pt(-abs(o$TStat), ncol(seATAC) - 2) o$FDR <- p.adjust(o$Pval, method = "fdr") out <- o[, c("A", "B", "Correlation", "FDR", "VarAssayA", "VarAssayB")] diff --git a/R/IterativeLSI.R b/R/IterativeLSI.R index 97f1dcac..57300734 100644 --- a/R/IterativeLSI.R +++ b/R/IterativeLSI.R @@ -803,9 +803,7 @@ addIterativeLSI <- function( UMAPParams$n_threads <- floor(threads / 2) uwotUmap <- do.call(uwot::umap, UMAPParams) - #Plot - pdf(file.path(outDir, paste0("Save-LSI-Iteration-",j,".pdf")), width = 6, height = 6) - + #Plot p1 <- ggPoint( uwotUmap[,1], uwotUmap[,2], @@ -831,6 +829,7 @@ addIterativeLSI <- function( theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) + pdf(file.path(outDir, paste0("Save-LSI-Iteration-",j,".pdf")), width = 6, height = 6) .fixPlotSize(p1, plotWidth = 6, plotHeight = 6) grid::grid.newpage() .fixPlotSize(p2, plotWidth = 6, plotHeight = 6) diff --git a/R/LoggerUtils.R b/R/LoggerUtils.R index f704cf94..bc498e08 100644 --- a/R/LoggerUtils.R +++ b/R/LoggerUtils.R @@ -56,6 +56,33 @@ getArchRDebugging <- function(){ ArchRDebugging } +#' Set ArchR Verbosity for Log Messaging +#' +#' This function will set ArchR logging verbosity. +#' +#' @param verbose A boolean describing whether to printMessages in addition to logging with ArchR. +#' @export +addArchRVerbose <- function(verbose = TRUE){ + .validInput(input = verbose, name = "verbose", valid = "boolean") + message("Setting addArchRVerbose = ", verbose) + options(ArchR.verbose = verbose) + return(invisible(0)) +} + +#' Set ArchR Verbosity for Log Messaging +#' +#' This function will get ArchR logging verbosity. +#' +#' @export +getArchRVerbose <- function(){ + ArchRVerbose <- options()[["ArchR.verbose"]] + if(!is.logical(ArchRVerbose)){ + options(ArchR.verbose = TRUE) + return(TRUE) + } + ArchRVerbose +} + #' Create a Log File for ArchR #' #' This function will create a log file for ArchR functions. If ArchRLogging is not TRUE @@ -113,9 +140,9 @@ createLogFile <- function( }else{ msg <- sprintf("%s : %s, %s %s %s", Sys.time(), main, dt, units, tail) } - message(msg) + if(getArchRVerbose()) message(msg) }, error = function(x){ - message("Time Error : ", x) + if(getArchRVerbose()) message("Time Error : ", x) }) } @@ -172,7 +199,7 @@ createLogFile <- function( } } - message("ArchR logging to : ", logFile, + if(getArchRVerbose()) message("ArchR logging to : ", logFile, "\nIf there is an issue, please report to github with logFile!") #Begin With @@ -220,8 +247,12 @@ createLogFile <- function( useLogs = getArchRLogging() ){ - msg <- utils::capture.output(message(...), type = "message") - msg <- paste0(msg, collapse = "\n") + if(getArchRVerbose()){ + msg <- utils::capture.output(message(...), type = "message") + msg <- paste0(msg, collapse = "\n") + }else{ + msg <- "SuppressedMessaged due to getArchRVerbose() is FALSE!" + } if(is.null(msg)){ stop("Message must be provided when logging!") @@ -556,7 +587,7 @@ createLogFile <- function( cat(paste0("Elapsed Time Minutes = ", mn), file = logFile, append = TRUE) cat(paste0("\nElapsed Time Hours = ", hr), file = logFile, append = TRUE) cat("\n\n-------\n\n\n\n", file = logFile, append = TRUE) - message("ArchR logging successful to : ", logFile) + if(getArchRVerbose()) message("ArchR logging successful to : ", logFile) }, error = function(x){ }) diff --git a/R/MarkerFeatures.R b/R/MarkerFeatures.R index 0cf5bf56..0ed03a5b 100644 --- a/R/MarkerFeatures.R +++ b/R/MarkerFeatures.R @@ -410,6 +410,10 @@ getMarkerFeatures <- function( } + .logThis(o, paste0(group, "_", seqnames[y], "_diffResult"), logFile = logFile) + + o + }) %>% Reduce("rbind", .) idxFilter <- rowSums(pairwiseDF[,c("mean1","mean2")]) != 0 diff --git a/R/MatrixDeviations.R b/R/MatrixDeviations.R index 6fd0d467..fd9de175 100644 --- a/R/MatrixDeviations.R +++ b/R/MatrixDeviations.R @@ -378,11 +378,17 @@ addDeviationsMatrix <- function( if("z" %in% tolower(out)){ z <- t(vapply(results, function(x) x[["z"]], rep(0, length(cn)))) + if(length(cn)==1){ + z <- matrix(z, ncol=length(cn)) + } }else{ z <- matrix(0, nrow = ncol(annotationsMatrix), ncol = length(cn)) } if("deviations" %in% tolower(out)){ dev <- t(vapply(results, function(x) x[["dev"]], rep(0, length(cn)))) + if(length(cn)==1){ + dev <- matrix(dev, ncol=length(cn)) + } }else{ dev <- matrix(0, nrow = ncol(annotationsMatrix), ncol = length(cn)) } diff --git a/R/MatrixGeneScores.R b/R/MatrixGeneScores.R index 1325d4ce..ef34822d 100644 --- a/R/MatrixGeneScores.R +++ b/R/MatrixGeneScores.R @@ -100,6 +100,10 @@ addGeneScoreMatrix <- function( stop("Error Input Arrow Files do not all exist!") } + if(inherits(mcols(genes)$symbol, "list") | inherits(mcols(genes)$symbol, "SimpleList")){ + stop("Found a list in genes symbol! This is an incorrect format. Please correct your genes!") + } + .startLogging(logFile = logFile) .logThis(mget(names(formals()),sys.frame(sys.nframe())), "addGeneScoreMatrix Input-Parameters", logFile = logFile) @@ -191,6 +195,10 @@ addGeneScoreMatrix <- function( .validInput(input = force, name = "force", valid = c("boolean")) .validInput(input = tmpFile, name = "tmpFile", valid = c("character", "null")) + if(inherits(mcols(genes)$symbol, "list") | inherits(mcols(genes)$symbol, "SimpleList")){ + stop("Found a list in genes symbol! This is an incorrect format. Please correct your genes!") + } + ArrowFile <- ArrowFiles[i] sampleName <- .sampleName(ArrowFile) diff --git a/R/ProjectMethods.R b/R/ProjectMethods.R index 5609cf0f..1cb18b7d 100644 --- a/R/ProjectMethods.R +++ b/R/ProjectMethods.R @@ -363,24 +363,56 @@ getPeakSet <- function(ArchRProj = NULL){ #' #' @param ArchRProj An `ArchRProject` object. #' @param peakSet A `GRanges` object containing the set of regions that define all peaks in the desired peak set. +#' @param genomeAnnotation The genomeAnnotation (see `createGenomeAnnotation()`) to be used for generating peak metadata such as nucleotide +#' information (GC content) or chromosome sizes. #' @param force If a `peakSet` object has already been added to the given `ArchRProject`, the value of `force` determines #' whether or not to overwrite this `peakSet`. #' @export -addPeakSet <- function(ArchRProj = NULL, peakSet = NULL, force = FALSE){ +addPeakSet <- function( + ArchRProj = NULL, + peakSet = NULL, + genomeAnnotation = getGenomeAnnotation(ArchRProj), + force = FALSE + ){ + .validInput(input = ArchRProj, name = "ArchRProj", valid = "ArchRProject") .validInput(input = peakSet, name = "peakSet", valid = c("GRanges")) .validInput(input = force, name = "force", valid = c("boolean")) + genomeAnnotation <- .validGenomeAnnotation(genomeAnnotation) + if(is.null(ArchRProj@peakSet) | force){ + #Index The Peak Set peakSet <- lapply(split(peakSet, seqnames(peakSet)), function(x){ mcols(x)$idx <- seq_along(x) x }) %>% Reduce("c", .) %>% sortSeqlevels %>% sort + + #Get NucleoTide Content + peakSet <- tryCatch({ + .requirePackage(genomeAnnotation$genome) + .requirePackage("Biostrings",source="bioc") + BSgenome <- eval(parse(text = genomeAnnotation$genome)) + BSgenome <- validBSgenome(BSgenome) + nucFreq <- BSgenome::alphabetFrequency(getSeq(BSgenome, peakSet)) + mcols(peakSet)$GC <- round(rowSums(nucFreq[,c("G","C")]) / rowSums(nucFreq),4) + mcols(peakSet)$N <- round(nucFreq[,c("N")] / rowSums(nucFreq),4) + peakSet + }, error = function(e){ + peakSet + }) + + #Add PeakSet ArchRProj@peakSet <- peakSet + }else{ + stop("Error peakSet exists! Set force=TRUE to override!") + } + return(ArchRProj) + } ########################################################################################## @@ -571,6 +603,10 @@ getGenes <- function(ArchRProj = NULL, symbols = NULL){ genes <- genes[which(tolower(genes$symbol) %in% tolower(symbols))] } + if(inherits(mcols(genes)$symbol, "list") | inherits(mcols(genes)$symbol, "SimpleList")){ + stop("Found a list in genes symbol! This is an incorrect format. Please correct your genes!") + } + genes } diff --git a/R/RNAIntegration.R b/R/RNAIntegration.R index 53a367f6..8e11b27e 100644 --- a/R/RNAIntegration.R +++ b/R/RNAIntegration.R @@ -43,6 +43,7 @@ #' @param reduction The Seurat reduction method to use for integrating modalities. See `Seurat::FindTransferAnchors()` for possible reduction methods. #' @param addToArrow A boolean value indicating whether to add the log2-normalized transcript counts from the integrated matched RNA to the Arrow files. #' @param scaleTo Each column in the integrated RNA matrix will be normalized to a column sum designated by `scaleTo` prior to adding to Arrow files. +#' @param genesUse If desired a character vector of gene names to use for integration instead of determined ones from Seurat::variableGenes. #' @param nameCell A column name to add to `cellColData` for the predicted scRNA-seq cell in the specified `ArchRProject`. This is useful for identifying which cell was closest to the scATAC-seq cell. #' @param nameGroup A column name to add to `cellColData` for the predicted scRNA-seq group in the specified `ArchRProject`. See `groupRNA` for more details. #' @param nameScore A column name to add to `cellColData` for the predicted scRNA-seq score in the specified `ArchRProject`. These scores represent @@ -77,6 +78,7 @@ addGeneIntegrationMatrix <- function( reduction = "cca", addToArrow = TRUE, scaleTo = 10000, + genesUse = NULL, nameCell = "predictedCell", nameGroup = "predictedGroup", nameScore = "predictedScore", @@ -110,6 +112,7 @@ addGeneIntegrationMatrix <- function( .validInput(input = reduction, name = "reduction", valid = c("character")) .validInput(input = addToArrow, name = "addToArrow", valid = c("boolean")) .validInput(input = scaleTo, name = "scaleTo", valid = c("numeric")) + .validInput(input = genesUse, name = "genesUse", valid = c("character", "null")) .validInput(input = nameCell, name = "nameCell", valid = c("character")) .validInput(input = nameGroup, name = "nameGroup", valid = c("character")) .validInput(input = nameScore, name = "nameScore", valid = c("character")) @@ -385,7 +388,9 @@ addGeneIntegrationMatrix <- function( .logDiffTime(sprintf("%s Identifying Variable Genes", prefix), tstart, verbose = verbose, logFile = logFile) subRNA <- FindVariableFeatures(object = subRNA, nfeatures = nGenes, verbose = FALSE) subRNA <- ScaleData(object = subRNA, verbose = FALSE) - genesUse <- VariableFeatures(object = subRNA) + if(is.null(genesUse)){ + genesUse <- VariableFeatures(object = subRNA) + } ############################################################################################## #2. Get Gene Score Matrix and Create Seurat ATAC diff --git a/R/ReproduciblePeakSet.R b/R/ReproduciblePeakSet.R index 8a48530e..ad023923 100644 --- a/R/ReproduciblePeakSet.R +++ b/R/ReproduciblePeakSet.R @@ -262,7 +262,7 @@ addReproduciblePeakSet <- function( }else if(tolower(peakMethod) == "tiles"){ - .logMessage("Calling Peaks with TileMatrix", logFile = logFile) + .logMessage("Calling Peaks with TileMatrix. We recommend using the Macs2 Version.\nThis method is still under development.", logFile = logFile) useMatrix <- "TileMatrix" @@ -325,11 +325,13 @@ addReproduciblePeakSet <- function( #Compute Row Sums Across All Samples .logDiffTime("Computing Total Accessibility Across All Features", tstart, addHeader = FALSE, verbose = verbose) totalAcc <- .getRowSums(ArrowFiles = ArrowFiles, useMatrix = useMatrix, seqnames = chrToRun) + .logThis(totalAcc, "PeakCallTiles-totalAcc", logFile=logFile) nTiles <- nrow(totalAcc) gc() #Pre-Filter 0s topFeatures <- totalAcc[which(totalAcc$rowSums != 0), ] + .logThis(topFeatures, "PeakCallTiles-topFeatures", logFile=logFile) #Group Matrix #Consider reading in group-wise if this is getting too large? @@ -344,9 +346,12 @@ addReproduciblePeakSet <- function( asSparse = TRUE, verbose = FALSE ) - + .logThis(groupMat, "PeakCallTiles-groupMat", logFile=logFile) + .logDiffTime(sprintf("Created Pseudo-Grouped Tile Matrix (%s GB)", round(object.size(groupMat) / 10^9, 3)), tstart, addHeader = FALSE, verbose = verbose) expectation <- Matrix::colSums(groupMat) / nTiles + .logMessage(paste0("colSums = ", Matrix::colSums(groupMat)), logFile = logFile) + .logMessage(paste0("nTiles = ", nTiles), logFile = logFile) .logMessage(paste0("Expectation = ", expectation), logFile = logFile) ##################################################### @@ -401,6 +406,8 @@ addReproduciblePeakSet <- function( }, threads = threads) %>% Reduce("rbind", .) + .logThis(groupPeaks, "PeakCallTiles-groupPeaks", logFile=logFile) + groupPeaks <- groupPeaks[order(groupPeaks$normmlogp, decreasing=TRUE), ] ##################################################### diff --git a/R/Trajectory.R b/R/Trajectory.R index c1931e30..ceee126d 100644 --- a/R/Trajectory.R +++ b/R/Trajectory.R @@ -72,7 +72,9 @@ addTrajectory <- function( } if(sum(unique(groupDF[,1]) %in% trajectory) < 3){ - .logStop("trajectory must span at least 3 groups in groupBy!", logFile = logFile) + if(!force){ + .logStop("trajectory must span at least 3 groups in groupBy!", logFile = logFile) + } } if(is.null(embedding)){ @@ -475,6 +477,13 @@ plotTrajectoryHeatmap <- function( } mat <- assay(seTrajectory) + + if(!is.null(grepExclude)){ + idxExclude <- grep(grepExclude, rownames(mat)) + if(length(idxExclude) > 0){ + mat <- mat[-grep(grepExclude, rownames(mat)), , drop = FALSE] + } + } #Rows with NA rSNA <- rowSums(is.na(mat)) @@ -676,7 +685,7 @@ plotTrajectory <- function( .validInput(input = pal, name = "pal", valid = c("character", "null")) .validInput(input = size, name = "size", valid = c("numeric")) .validInput(input = rastr, name = "rastr", valid = c("boolean")) - .validInput(input = quantCut, name = "quantCut", valid = c("numeric")) + .validInput(input = quantCut, name = "quantCut", valid = c("numeric", "null")) .validInput(input = quantHex, name = "quantHex", valid = c("numeric")) .validInput(input = discreteSet, name = "discreteSet", valid = c("character", "null")) .validInput(input = continuousSet, name = "continuousSet", valid = c("character", "null")) @@ -693,6 +702,10 @@ plotTrajectory <- function( .startLogging(logFile = logFile) .logThis(mget(names(formals()),sys.frame(sys.nframe())), "Input-Parameters", logFile=logFile) + if(is.null(quantCut)){ + quantCut <- c(0, 1) + } + #Make Sure ColorBy is valid! if(length(colorBy) > 1){ stop("colorBy must be of length 1!") diff --git a/R/VisualizeData.R b/R/VisualizeData.R index 6f2daa8d..d675abd4 100644 --- a/R/VisualizeData.R +++ b/R/VisualizeData.R @@ -95,12 +95,12 @@ plotPDF <- function( if(inherits(plotList[[i]], "patchwork")){ - message("Plotting Patchwork!") + if(getArchRVerbose()) message("Plotting Patchwork!") print(plotList[[i]]) }else{ - message("Plotting Ggplot!") + if(getArchRVerbose()) message("Plotting Ggplot!") if(!is.null(attr(plotList[[i]], "ratioYX"))){ .fixPlotSize(plotList[[i]], plotWidth = width, plotHeight = height, height = attr(plotList[[i]], "ratioYX"), newPage = FALSE) @@ -116,7 +116,7 @@ plotPDF <- function( }else if(inherits(plotList[[i]], "gtable")){ - message("Plotting Gtable!") + if(getArchRVerbose()) message("Plotting Gtable!") print(grid::grid.draw(plotList[[i]])) if(i != length(plotList)){ @@ -124,7 +124,7 @@ plotPDF <- function( } }else if(inherits(plotList[[i]], "HeatmapList") | inherits(plotList[[i]], "Heatmap") ){ - message("Plotting ComplexHeatmap!") + if(getArchRVerbose()) message("Plotting ComplexHeatmap!") padding <- 15 draw(plotList[[i]], @@ -135,7 +135,7 @@ plotPDF <- function( }else{ - message("Plotting Other") + if(getArchRVerbose()) message("Plotting Other") print(plotList[[i]]) @@ -147,7 +147,7 @@ plotPDF <- function( }, error = function(x){ - message(x) + if(getArchRVerbose()) message(x) }) @@ -320,7 +320,7 @@ plotEmbedding <- function( } if(!is.null(imputeWeights)){ - message("Imputing Matrix") + if(getArchRVerbose()) message("Imputing Matrix") colorMat <- matrix(colorParams$color, nrow=1) colnames(colorMat) <- rownames(df) colorMat <- imputeMatrix(mat = colorMat, imputeWeights = imputeWeights, logFile = logFile) @@ -367,7 +367,7 @@ plotEmbedding <- function( .logThis(colorMat, "colorMat-Before-Impute", logFile = logFile) if(!is.null(imputeWeights)){ - message("Imputing Matrix") + if(getArchRVerbose()) message("Imputing Matrix") colorMat <- imputeMatrix(mat = as.matrix(colorMat), imputeWeights = imputeWeights, logFile = logFile) if(!inherits(colorMat, "matrix")){ colorMat <- matrix(colorMat, ncol = nrow(df)) @@ -401,11 +401,11 @@ plotEmbedding <- function( } - message("Plotting Embedding") + if(getArchRVerbose()) message("Plotting Embedding") ggList <- lapply(seq_along(colorList), function(x){ - message(x, " ", appendLF = FALSE) + if(getArchRVerbose()) message(x, " ", appendLF = FALSE) plotParamsx <- .mergeParams(colorList[[x]], plotParams) @@ -483,7 +483,7 @@ plotEmbedding <- function( }) names(ggList) <- name - message("") + if(getArchRVerbose()) message("") if(length(ggList) == 1){ ggList <- ggList[[1]] @@ -663,7 +663,7 @@ plotGroups <- function( pl <- lapply(seq_along(colorList), function(x){ - message(paste0(x, " "), appendLF = FALSE) + if(getArchRVerbose()) message(paste0(x, " "), appendLF = FALSE) if(is.null(ylim)){ ylim <- range(colorList[[x]]$color,na.rm=TRUE) %>% extendrange(f = 0.05) @@ -692,7 +692,7 @@ plotGroups <- function( }) names(pl) <- name - message("") + if(getArchRVerbose()) message("") if(length(name)==1){ pl[[1]] @@ -764,7 +764,7 @@ plotGroups <- function( cellNamesList <- split(rownames(getCellColData(ArchRProj)), getCellColData(ArchRProj)$Sample) values <- .safelapply(seq_along(cellNamesList), function(x){ - message(x, " ", appendLF = FALSE) + if(getArchRVerbose()) message(x, " ", appendLF = FALSE) valuesx <- tryCatch({ o <- h5closeAll() ArrowFile <- getSampleColData(ArchRProj)[names(cellNamesList)[x],"ArrowFiles"] @@ -792,7 +792,7 @@ plotGroups <- function( valuesx }, threads = threads) %>% Reduce("cbind", .) values <- values[, ArchRProj$cellNames, drop = FALSE] - message("") + if(getArchRVerbose()) message("") gc() .logThis(values, "Feature-Matrix", logFile = logFile) @@ -804,7 +804,7 @@ plotGroups <- function( #Values Summary if(!is.null(log2Norm)){ if(log2Norm){ - message("Log2 Normalizing...") + if(getArchRVerbose()) message("Log2 Normalizing...") values <- log2(values + 1) } } diff --git a/man/addArchRVerbose.Rd b/man/addArchRVerbose.Rd new file mode 100644 index 00000000..dadc3508 --- /dev/null +++ b/man/addArchRVerbose.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/LoggerUtils.R +\name{addArchRVerbose} +\alias{addArchRVerbose} +\title{Set ArchR Verbosity for Log Messaging} +\usage{ +addArchRVerbose(verbose = TRUE) +} +\arguments{ +\item{verbose}{A boolean describing whether to printMessages in addition to logging with ArchR.} +} +\description{ +This function will set ArchR logging verbosity. +} diff --git a/man/addGeneIntegrationMatrix.Rd b/man/addGeneIntegrationMatrix.Rd index 9b89ffdb..dba7957d 100644 --- a/man/addGeneIntegrationMatrix.Rd +++ b/man/addGeneIntegrationMatrix.Rd @@ -28,6 +28,7 @@ addGeneIntegrationMatrix( reduction = "cca", addToArrow = TRUE, scaleTo = 10000, + genesUse = NULL, nameCell = "predictedCell", nameGroup = "predictedGroup", nameScore = "predictedScore", @@ -98,6 +99,8 @@ correlation to sequencing depth that is greater than the \code{corCutOff}, it wi \item{scaleTo}{Each column in the integrated RNA matrix will be normalized to a column sum designated by \code{scaleTo} prior to adding to Arrow files.} +\item{genesUse}{If desired a character vector of gene names to use for integration instead of determined ones from Seurat::variableGenes.} + \item{nameCell}{A column name to add to \code{cellColData} for the predicted scRNA-seq cell in the specified \code{ArchRProject}. This is useful for identifying which cell was closest to the scATAC-seq cell.} \item{nameGroup}{A column name to add to \code{cellColData} for the predicted scRNA-seq group in the specified \code{ArchRProject}. See \code{groupRNA} for more details.} diff --git a/man/addPeakAnnotations.Rd b/man/addPeakAnnotations.Rd index d96db49d..72775a9f 100644 --- a/man/addPeakAnnotations.Rd +++ b/man/addPeakAnnotations.Rd @@ -15,7 +15,7 @@ addPeakAnnotations( \arguments{ \item{ArchRProj}{An \code{ArchRProject} object.} -\item{regions}{A \code{list} of \code{GRanges} that are to be overlapped with the \code{peakSet} in the \code{ArchRProject}.} +\item{regions}{A named \code{list} of \code{GRanges} that are to be overlapped with the \code{peakSet} in the \code{ArchRProject}.} \item{name}{The name of \code{peakAnnotation} object to be stored as in \code{ArchRProject}.} diff --git a/man/addPeakSet.Rd b/man/addPeakSet.Rd index 26b597d7..81dcd3e6 100644 --- a/man/addPeakSet.Rd +++ b/man/addPeakSet.Rd @@ -4,13 +4,21 @@ \alias{addPeakSet} \title{Add a peak set to an ArchRProject} \usage{ -addPeakSet(ArchRProj = NULL, peakSet = NULL, force = FALSE) +addPeakSet( + ArchRProj = NULL, + peakSet = NULL, + genomeAnnotation = getGenomeAnnotation(ArchRProj), + force = FALSE +) } \arguments{ \item{ArchRProj}{An \code{ArchRProject} object.} \item{peakSet}{A \code{GRanges} object containing the set of regions that define all peaks in the desired peak set.} +\item{genomeAnnotation}{The genomeAnnotation (see \code{createGenomeAnnotation()}) to be used for generating peak metadata such as nucleotide +information (GC content) or chromosome sizes.} + \item{force}{If a \code{peakSet} object has already been added to the given \code{ArchRProject}, the value of \code{force} determines whether or not to overwrite this \code{peakSet}.} } diff --git a/man/getArchRVerbose.Rd b/man/getArchRVerbose.Rd new file mode 100644 index 00000000..0ed46322 --- /dev/null +++ b/man/getArchRVerbose.Rd @@ -0,0 +1,11 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/LoggerUtils.R +\name{getArchRVerbose} +\alias{getArchRVerbose} +\title{Set ArchR Verbosity for Log Messaging} +\usage{ +getArchRVerbose() +} +\description{ +This function will get ArchR logging verbosity. +} From a83e23b12ae6efdbbdc4d6ce2968c50f2af83e6b Mon Sep 17 00:00:00 2001 From: Scott Furlan Date: Tue, 4 May 2021 08:05:40 -0700 Subject: [PATCH 41/41] vb --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9cb3f83d..40311f0c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -80,8 +80,8 @@ Collate: 'MultiModal.R' 'ProjectMethods.R' 'QualityControl.R' - 'RcppExports.R' 'RNAIntegration.R' + 'RcppExports.R' 'ReproduciblePeakSet.R' 'Trajectory.R' 'ValidationUtils.R'