diff --git a/DESCRIPTION b/DESCRIPTION index 95dbbc39e..746f644fc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: Seurat -Version: 3.1.5 -Date: 2020-04-14 +Version: 3.2.0 +Date: 2020-07-15 Title: Tools for Single Cell Genomics -Description: A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) , Macosko E, Basu A, Satija R, et al (2015) , and Stuart T, Butler A, et al (2019) for more details. Please note: SDMTools is available is available from the CRAN archives with install.packages(<"https://cran.rstudio.com//src/contrib/Archive/SDMTools/SDMTools_1.1-221.2.tar.gz">, repos = NULL); it is not in the standard repositories. +Description: A toolkit for quality control, analysis, and exploration of single cell RNA sequencing data. 'Seurat' aims to enable users to identify and interpret sources of heterogeneity from single cell transcriptomic measurements, and to integrate diverse types of single cell data. See Satija R, Farrell J, Gennert D, et al (2015) , Macosko E, Basu A, Satija R, et al (2015) , and Stuart T, Butler A, et al (2019) for more details. Authors@R: c( person(given = 'Rahul', family = 'Satija', email = 'rsatija@nygenome.org', role = 'aut', comment = c(ORCID = '0000-0001-9448-8833')), person(given = 'Andrew', family = 'Butler', email = 'abutler@nygenome.org', role = 'aut', comment = c(ORCID = '0000-0003-3608-0463')), @@ -37,14 +37,16 @@ Imports: ica, igraph, irlba, + jsonlite, KernSmooth, leiden (>= 0.3.1), lmtest, MASS, Matrix (>= 1.2-14), + miniUI, patchwork, pbapply, - plotly, + plotly (>= 4.9.0), png, RANN, RColorBrewer, @@ -57,9 +59,11 @@ Imports: Rtsne, scales, sctransform (>= 0.2.0), + shiny, + spatstat, stats, + tibble, tools, - tsne, utils, uwot (>= 0.1.5) LinkingTo: Rcpp (>= 0.11.0), RcppEigen, RcppProgress @@ -80,12 +84,10 @@ Collate: 'tree.R' 'utilities.R' 'zzz.R' -RoxygenNote: 7.1.0 +RoxygenNote: 7.1.1 Encoding: UTF-8 -biocViews: Suggests: loomR, - SDMTools, testthat, hdf5r, S4Vectors, @@ -98,6 +100,7 @@ Suggests: GenomeInfoDb, IRanges, rtracklayer, + Rfast2, monocle, Biobase, VGAM, diff --git a/NAMESPACE b/NAMESPACE index f4d68b414..1cb4e1524 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,11 +8,13 @@ S3method("DefaultAssay<-",Assay) S3method("DefaultAssay<-",DimReduc) S3method("DefaultAssay<-",Graph) S3method("DefaultAssay<-",Seurat) +S3method("DefaultAssay<-",SpatialImage) S3method("Idents<-",Seurat) S3method("JS<-",DimReduc) S3method("JS<-",JackStrawData) S3method("Key<-",Assay) S3method("Key<-",DimReduc) +S3method("Key<-",SpatialImage) S3method("Loadings<-",DimReduc) S3method("Misc<-",Assay) S3method("Misc<-",DimReduc) @@ -25,9 +27,13 @@ S3method("[",Assay) S3method("[",DimReduc) S3method("[",Seurat) S3method("[",SeuratCommand) +S3method("[",SlideSeq) +S3method("[",SpatialImage) +S3method("[",VisiumV1) S3method("[[",Assay) S3method("[[",DimReduc) S3method("[[",Seurat) +S3method("dimnames<-",Assay) S3method("levels<-",Seurat) S3method(.DollarNames,JackStrawData) S3method(.DollarNames,Seurat) @@ -35,13 +41,20 @@ S3method(.DollarNames,SeuratCommand) S3method(AddMetaData,Assay) S3method(AddMetaData,Seurat) S3method(Cells,DimReduc) +S3method(Cells,STARmap) +S3method(Cells,SlideSeq) +S3method(Cells,SpatialImage) +S3method(Cells,VisiumV1) S3method(Cells,default) S3method(Command,Seurat) +S3method(CreateSeuratObject,Assay) +S3method(CreateSeuratObject,default) S3method(DefaultAssay,Assay) S3method(DefaultAssay,DimReduc) S3method(DefaultAssay,Graph) S3method(DefaultAssay,Seurat) S3method(DefaultAssay,SeuratCommand) +S3method(DefaultAssay,SpatialImage) S3method(Embeddings,DimReduc) S3method(Embeddings,Seurat) S3method(FindClusters,Seurat) @@ -52,22 +65,37 @@ S3method(FindNeighbors,Assay) S3method(FindNeighbors,Seurat) S3method(FindNeighbors,default) S3method(FindNeighbors,dist) +S3method(FindSpatiallyVariableFeatures,Assay) +S3method(FindSpatiallyVariableFeatures,Seurat) +S3method(FindSpatiallyVariableFeatures,default) S3method(FindVariableFeatures,Assay) S3method(FindVariableFeatures,Seurat) S3method(FindVariableFeatures,default) S3method(GetAssay,Seurat) S3method(GetAssayData,Assay) S3method(GetAssayData,Seurat) +S3method(GetImage,STARmap) +S3method(GetImage,Seurat) +S3method(GetImage,SlideSeq) +S3method(GetImage,SpatialImage) +S3method(GetImage,VisiumV1) +S3method(GetTissueCoordinates,STARmap) +S3method(GetTissueCoordinates,Seurat) +S3method(GetTissueCoordinates,SlideSeq) +S3method(GetTissueCoordinates,SpatialImage) +S3method(GetTissueCoordinates,VisiumV1) S3method(HVFInfo,Assay) S3method(HVFInfo,Seurat) S3method(Idents,Seurat) S3method(IsGlobal,DimReduc) +S3method(IsGlobal,SpatialImage) S3method(IsGlobal,default) S3method(JS,DimReduc) S3method(JS,JackStrawData) S3method(Key,Assay) S3method(Key,DimReduc) S3method(Key,Seurat) +S3method(Key,SpatialImage) S3method(Loadings,DimReduc) S3method(Loadings,Seurat) S3method(Misc,Assay) @@ -79,11 +107,19 @@ S3method(NormalizeData,default) S3method(OldWhichCells,Assay) S3method(OldWhichCells,Seurat) S3method(Project,Seurat) +S3method(Radius,STARmap) +S3method(Radius,SlideSeq) +S3method(Radius,SpatialImage) +S3method(Radius,VisiumV1) S3method(ReadH5AD,H5File) S3method(ReadH5AD,character) S3method(RenameCells,Assay) S3method(RenameCells,DimReduc) +S3method(RenameCells,STARmap) S3method(RenameCells,Seurat) +S3method(RenameCells,SlideSeq) +S3method(RenameCells,SpatialImage) +S3method(RenameCells,VisiumV1) S3method(RenameIdents,Seurat) S3method(ReorderIdent,Seurat) S3method(RunALRA,Seurat) @@ -106,15 +142,20 @@ S3method(RunTSNE,matrix) S3method(RunUMAP,Graph) S3method(RunUMAP,Seurat) S3method(RunUMAP,default) +S3method(SVFInfo,Assay) +S3method(SVFInfo,Seurat) S3method(ScaleData,Assay) S3method(ScaleData,Seurat) S3method(ScaleData,default) +S3method(ScaleFactors,VisiumV1) S3method(ScoreJackStraw,DimReduc) S3method(ScoreJackStraw,JackStrawData) S3method(ScoreJackStraw,Seurat) S3method(SetAssayData,Assay) S3method(SetAssayData,Seurat) S3method(SetIdent,Seurat) +S3method(SpatiallyVariableFeatures,Assay) +S3method(SpatiallyVariableFeatures,Seurat) S3method(StashIdent,Seurat) S3method(Stdev,DimReduc) S3method(Stdev,Seurat) @@ -143,7 +184,11 @@ S3method(as.sparse,data.frame) S3method(as.sparse,matrix) S3method(dim,Assay) S3method(dim,DimReduc) +S3method(dim,STARmap) S3method(dim,Seurat) +S3method(dim,SlideSeq) +S3method(dim,SpatialImage) +S3method(dim,VisiumV1) S3method(dimnames,Assay) S3method(dimnames,DimReduc) S3method(dimnames,Seurat) @@ -157,7 +202,11 @@ S3method(names,Seurat) S3method(print,DimReduc) S3method(subset,Assay) S3method(subset,DimReduc) +S3method(subset,STARmap) S3method(subset,Seurat) +S3method(subset,SlideSeq) +S3method(subset,SpatialImage) +S3method(subset,VisiumV1) export("DefaultAssay<-") export("Idents<-") export("JS<-") @@ -173,6 +222,7 @@ export(AddModuleScore) export(Assays) export(AugmentPlot) export(AverageExpression) +export(BGTextColor) export(BarcodeInflectionsPlot) export(BlackAndWhite) export(BlueAndRed) @@ -214,26 +264,38 @@ export(FeatureLocator) export(FeaturePlot) export(FeatureScatter) export(FetchData) +export(FilterSlideSeq) export(FindAllMarkers) export(FindClusters) export(FindConservedMarkers) export(FindIntegrationAnchors) export(FindMarkers) export(FindNeighbors) +export(FindSpatiallyVariableFeatures) export(FindTransferAnchors) export(FindVariableFeatures) export(FontSize) export(GeneSymbolThesarus) export(GetAssay) export(GetAssayData) +export(GetImage) export(GetIntegrationData) export(GetResidual) +export(GetTissueCoordinates) +export(GetTransferPredictions) +export(GroupCorrelation) +export(GroupCorrelationPlot) export(HTODemux) export(HTOHeatmap) export(HVFInfo) export(HoverLocator) +export(IFeaturePlot) +export(ISpatialDimPlot) +export(ISpatialFeaturePlot) export(Idents) +export(Images) export(IntegrateData) +export(Intensity) export(IsGlobal) export(JS) export(JackStraw) @@ -243,11 +305,16 @@ export(L2CCA) export(L2Dim) export(LabelClusters) export(LabelPoints) +export(LinkedDimPlot) +export(LinkedFeaturePlot) +export(Load10X_Spatial) +export(LoadSTARmap) export(Loadings) export(LocalStruct) export(LogNormalize) export(LogSeuratCommand) export(LogVMR) +export(Luminance) export(MULTIseqDemux) export(MetaFeature) export(MinMax) @@ -269,11 +336,14 @@ export(PrepSCTIntegration) export(Project) export(ProjectDim) export(PurpleAndYellow) +export(Radius) export(Read10X) +export(Read10X_Image) export(Read10X_h5) export(ReadAlevin) export(ReadAlevinCsv) export(ReadH5AD) +export(ReadSlideSeq) export(Reductions) export(RegroupIdents) export(RelativeCounts) @@ -289,12 +359,16 @@ export(RunALRA) export(RunCCA) export(RunICA) export(RunLSI) +export(RunMarkVario) +export(RunMoransI) export(RunPCA) export(RunTSNE) export(RunUMAP) export(SCTransform) +export(SVFInfo) export(SampleUMI) export(ScaleData) +export(ScaleFactors) export(ScoreJackStraw) export(SelectIntegrationFeatures) export(SetAssayData) @@ -302,7 +376,11 @@ export(SetIdent) export(SetIntegrationData) export(SeuratAxes) export(SeuratTheme) +export(SpatialDimPlot) +export(SpatialFeaturePlot) +export(SpatialPlot) export(SpatialTheme) +export(SpatiallyVariableFeatures) export(SplitObject) export(StashIdent) export(Stdev) @@ -330,6 +408,7 @@ export(as.Seurat) export(as.SingleCellExperiment) export(as.loom) export(as.sparse) +export(scalefactors) exportClasses(AnchorSet) exportClasses(Assay) exportClasses(DimReduc) @@ -338,6 +417,8 @@ exportClasses(IntegrationData) exportClasses(JackStrawData) exportClasses(Seurat) exportClasses(SeuratCommand) +exportClasses(SpatialImage) +exportClasses(VisiumV1) import(Matrix) importClassesFrom(Matrix,dgCMatrix) importFrom(KernSmooth,bkde) @@ -351,6 +432,7 @@ importFrom(Matrix,rowMeans) importFrom(Matrix,rowSums) importFrom(Matrix,sparseMatrix) importFrom(RANN,nn2) +importFrom(RColorBrewer,brewer.pal) importFrom(RColorBrewer,brewer.pal.info) importFrom(ROCR,performance) importFrom(ROCR,prediction) @@ -360,6 +442,7 @@ importFrom(RcppAnnoy,AnnoyEuclidean) importFrom(RcppAnnoy,AnnoyHamming) importFrom(RcppAnnoy,AnnoyManhattan) importFrom(Rtsne,Rtsne) +importFrom(ape,Moran.I) importFrom(ape,as.phylo) importFrom(ape,drop.tip) importFrom(ape,nodelabels) @@ -372,25 +455,32 @@ importFrom(fitdistrplus,fitdist) importFrom(future,nbrOfWorkers) importFrom(future.apply,future_lapply) importFrom(future.apply,future_sapply) +importFrom(ggplot2,Geom) importFrom(ggplot2,GeomPolygon) importFrom(ggplot2,GeomViolin) importFrom(ggplot2,aes) importFrom(ggplot2,aes_string) +importFrom(ggplot2,alpha) importFrom(ggplot2,annotation_raster) importFrom(ggplot2,coord_cartesian) importFrom(ggplot2,coord_fixed) importFrom(ggplot2,coord_flip) importFrom(ggplot2,cut_number) importFrom(ggplot2,discrete_scale) +importFrom(ggplot2,draw_key_point) importFrom(ggplot2,dup_axis) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_line) importFrom(ggplot2,element_rect) importFrom(ggplot2,element_text) +importFrom(ggplot2,facet_grid) importFrom(ggplot2,facet_wrap) importFrom(ggplot2,geom_abline) importFrom(ggplot2,geom_blank) +importFrom(ggplot2,geom_boxplot) +importFrom(ggplot2,geom_hline) importFrom(ggplot2,geom_jitter) +importFrom(ggplot2,geom_label) importFrom(ggplot2,geom_line) importFrom(ggplot2,geom_point) importFrom(ggplot2,geom_polygon) @@ -403,6 +493,7 @@ importFrom(ggplot2,geom_vline) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggplot_build) importFrom(ggplot2,ggproto) +importFrom(ggplot2,ggproto_parent) importFrom(ggplot2,ggsave) importFrom(ggplot2,ggtitle) importFrom(ggplot2,guide_colorbar) @@ -412,12 +503,15 @@ importFrom(ggplot2,labs) importFrom(ggplot2,layer) importFrom(ggplot2,margin) importFrom(ggplot2,position_jitterdodge) +importFrom(ggplot2,scale_alpha) +importFrom(ggplot2,scale_alpha_ordinal) importFrom(ggplot2,scale_color_brewer) importFrom(ggplot2,scale_color_distiller) importFrom(ggplot2,scale_color_gradient) importFrom(ggplot2,scale_color_gradientn) importFrom(ggplot2,scale_color_identity) importFrom(ggplot2,scale_color_manual) +importFrom(ggplot2,scale_fill_brewer) importFrom(ggplot2,scale_fill_continuous) importFrom(ggplot2,scale_fill_gradient) importFrom(ggplot2,scale_fill_gradientn) @@ -434,17 +528,21 @@ importFrom(ggplot2,stat_density2d) importFrom(ggplot2,stat_qq) importFrom(ggplot2,sym) importFrom(ggplot2,theme) +importFrom(ggplot2,theme_void) +importFrom(ggplot2,transform_position) +importFrom(ggplot2,unit) importFrom(ggplot2,vars) importFrom(ggplot2,waiver) importFrom(ggplot2,xlab) importFrom(ggplot2,xlim) importFrom(ggplot2,ylab) importFrom(ggplot2,ylim) +importFrom(ggrepel,geom_label_repel) importFrom(ggrepel,geom_text_repel) importFrom(ggridges,geom_density_ridges) importFrom(ggridges,theme_ridges) +importFrom(grDevices,as.raster) importFrom(grDevices,col2rgb) -importFrom(grDevices,colorRamp) importFrom(grDevices,colorRampPalette) importFrom(grDevices,rgb) importFrom(graphics,axis) @@ -453,9 +551,17 @@ importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,plot.new) importFrom(graphics,smoothScatter) +importFrom(grid,addGrob) +importFrom(grid,editGrob) +importFrom(grid,gTree) +importFrom(grid,gpar) importFrom(grid,grobName) importFrom(grid,grobTree) +importFrom(grid,nullGrob) +importFrom(grid,pointsGrob) +importFrom(grid,rasterGrob) importFrom(grid,unit) +importFrom(grid,viewport) importFrom(httr,GET) importFrom(httr,accept_json) importFrom(httr,content) @@ -470,6 +576,7 @@ importFrom(igraph,graph_from_adj_list) importFrom(igraph,graph_from_adjacency_matrix) importFrom(igraph,plot.igraph) importFrom(irlba,irlba) +importFrom(jsonlite,fromJSON) importFrom(leiden,leiden) importFrom(lmtest,lrtest) importFrom(methods,"slot<-") @@ -484,12 +591,19 @@ importFrom(methods,setOldClass) importFrom(methods,signature) importFrom(methods,slot) importFrom(methods,slotNames) +importFrom(miniUI,gadgetTitleBar) +importFrom(miniUI,miniButtonBlock) +importFrom(miniUI,miniContentPanel) +importFrom(miniUI,miniPage) +importFrom(miniUI,miniTitleBarButton) importFrom(patchwork,wrap_plots) importFrom(pbapply,pbapply) importFrom(pbapply,pblapply) importFrom(pbapply,pbsapply) +importFrom(plotly,add_annotations) importFrom(plotly,layout) importFrom(plotly,plot_ly) +importFrom(plotly,raster2uri) importFrom(png,readPNG) importFrom(reticulate,dict) importFrom(reticulate,import) @@ -502,12 +616,36 @@ importFrom(rlang,enquo) importFrom(rlang,eval_tidy) importFrom(rlang,is_quosure) importFrom(rsvd,rsvd) +importFrom(scales,brewer_pal) importFrom(scales,hue_pal) +importFrom(scales,rescale) +importFrom(scales,squish_infinite) importFrom(scales,zero_range) importFrom(sctransform,correct_counts) importFrom(sctransform,get_residual_var) importFrom(sctransform,get_residuals) importFrom(sctransform,vst) +importFrom(shiny,brushOpts) +importFrom(shiny,brushedPoints) +importFrom(shiny,clickOpts) +importFrom(shiny,fillRow) +importFrom(shiny,hoverOpts) +importFrom(shiny,nearPoints) +importFrom(shiny,observe) +importFrom(shiny,observeEvent) +importFrom(shiny,plotOutput) +importFrom(shiny,reactiveValues) +importFrom(shiny,renderPlot) +importFrom(shiny,renderPrint) +importFrom(shiny,runGadget) +importFrom(shiny,selectInput) +importFrom(shiny,sidebarPanel) +importFrom(shiny,sliderInput) +importFrom(shiny,stopApp) +importFrom(shiny,updateSelectInput) +importFrom(shiny,verbatimTextOutput) +importFrom(spatstat,markvario) +importFrom(spatstat,ppp) importFrom(stats,aggregate) importFrom(stats,anova) importFrom(stats,approxfun) @@ -515,6 +653,7 @@ importFrom(stats,as.dist) importFrom(stats,as.formula) importFrom(stats,ave) importFrom(stats,coef) +importFrom(stats,complete.cases) importFrom(stats,cor) importFrom(stats,dist) importFrom(stats,dnorm) @@ -542,9 +681,9 @@ importFrom(stats,setNames) importFrom(stats,t.test) importFrom(stats,var) importFrom(stats,wilcox.test) +importFrom(tibble,tibble) importFrom(tools,file_ext) importFrom(tools,file_path_sans_ext) -importFrom(tsne,tsne) importFrom(utils,.DollarNames) importFrom(utils,argsAnywhere) importFrom(utils,browseURL) diff --git a/NEWS.md b/NEWS.md index 29bae530a..1495bc47f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,12 +2,34 @@ All notable changes to Seurat will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +## [3.2.0] - 2020-07-15 +### Added +- Added ability to create a Seurat object from an existing Assay object, or any +object inheriting from the Assay class +- Added ability to cluster idents and group features in `DotPlot` +- Added ability to use RColorBrewer plaettes for split `DotPlots` +- Added visualization and analysis functionality for spatially resolved datasets (Visium, Slide-seq). + +### Changes +- Removed `add.iter` parameter from `RunTSNE` function +- Fixed integer overflow error in the WilcoxDETest function +- Minor visual fixes in `DoHeatmap` group bar + labels +- Efficiency improvements in anchor scoring (`ScoreAnchors`) +- Fix bug in `FindClusters()` when the last node has no edges +- Default to weighted = TRUE when constructing igraph objects in `RunLeiden`. Remove corresponding weights parameter from `FindClusters()`. +- Fix handling of keys in `FeatureScatter()` +- Change `CellSelector` to use Shiny gadgets instead of SDMTools +- Mark `PointLocator` as defunct +- Remove `SDMTools` +- Fixed data slot return in `AverageExpression` when subsetting features and returning a Seurat object + ## [3.1.5] - 2020-04-14 ### Added - New `scale` parameter in `DotPlot` - New `keep.sparse parameter in `CreateGeneActivityMatrix` for a more memory efficient option - Added ability to store model learned by UMAP and project new data -- New `stip.suffix` option in `Read10X` +- New `strip.suffix` option in `Read10X`. **This changes the default behavior of `Read10X`**. + A trailing `-1` present in all cell names will not be removed by default. - Added `group.by` parameter to `FeatureScatter` ### Changes diff --git a/R/RcppExports.R b/R/RcppExports.R index 2fbd3b2d0..572786cd2 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -85,10 +85,6 @@ IntegrateDataC <- function(integration_matrix, weights, expression_cells2) { .Call('_Seurat_IntegrateDataC', PACKAGE = 'Seurat', integration_matrix, weights, expression_cells2) } -SNNAnchor <- function(k_matrix, anchor_only) { - .Call('_Seurat_SNNAnchor', PACKAGE = 'Seurat', k_matrix, anchor_only) -} - ComputeSNN <- function(nn_ranked, prune) { .Call('_Seurat_ComputeSNN', PACKAGE = 'Seurat', nn_ranked, prune) } diff --git a/R/clustering.R b/R/clustering.R index 3db948751..b1d0aed12 100644 --- a/R/clustering.R +++ b/R/clustering.R @@ -15,7 +15,7 @@ NULL #' @importFrom future nbrOfWorkers #' #' @param modularity.fxn Modularity function (1 = standard; 2 = alternative). -#' @param initial.membership,weights,node.sizes Parameters to pass to the Python leidenalg function. +#' @param initial.membership,node.sizes Parameters to pass to the Python leidenalg function. #' @param resolution Value of the resolution parameter, use a value above #' (below) 1.0 if you want to obtain a larger (smaller) number of communities. #' @param algorithm Algorithm for modularity optimization (1 = original Louvain @@ -40,7 +40,6 @@ FindClusters.default <- function( object, modularity.fxn = 1, initial.membership = NULL, - weights = NULL, node.sizes = NULL, resolution = 0.8, method = "matrix", @@ -87,7 +86,6 @@ FindClusters.default <- function( method = method, partition.type = "RBConfigurationVertexPartition", initial.membership = initial.membership, - weights = weights, node.sizes = node.sizes, resolution.parameter = r, random.seed = random.seed, @@ -125,7 +123,6 @@ FindClusters.default <- function( method = method, partition.type = "RBConfigurationVertexPartition", initial.membership = initial.membership, - weights = weights, node.sizes = node.sizes, resolution.parameter = r, random.seed = random.seed, @@ -155,7 +152,6 @@ FindClusters.Seurat <- function( graph.name = NULL, modularity.fxn = 1, initial.membership = NULL, - weights = NULL, node.sizes = NULL, resolution = 0.8, method = "matrix", @@ -181,7 +177,6 @@ FindClusters.Seurat <- function( object = object[[graph.name]], modularity.fxn = modularity.fxn, initial.membership = initial.membership, - weights = weights, node.sizes = node.sizes, resolution = resolution, method = method, @@ -671,7 +666,7 @@ NNHelper <- function(data, query = data, k, method, ...) { # RBERVertexPartition, CPMVertexPartition, MutableVertexPartition, # SignificanceVertexPartition, SurpriseVertexPartition (see the Leiden python # module documentation for more details) -# @param initial.membership,weights,node.sizes Parameters to pass to the Python leidenalg function. +# @param initial.membership,node.sizes Parameters to pass to the Python leidenalg function. # @param resolution.parameter A parameter controlling the coarseness of the clusters # for Leiden algorithm. Higher values lead to more clusters. (defaults to 1.0 for # partition types that accept a resolution parameter) @@ -701,7 +696,6 @@ RunLeiden <- function( 'SurpriseVertexPartition' ), initial.membership = NULL, - weights = NULL, node.sizes = NULL, resolution.parameter = 1, random.seed = 0, @@ -720,17 +714,12 @@ RunLeiden <- function( }, "igraph" = { input <- if (inherits(x = object, what = 'list')) { - if (is.null(x = weights)) { - graph_from_adj_list(adjlist = object) - } else { - graph_from_adj_list(adjlist = object) + graph_from_adj_list(adjlist = object) + } else if (inherits(x = object, what = c('dgCMatrix', 'matrix', 'Matrix'))) { + if (inherits(x = object, what = 'Graph')) { + object <- as(object = object, Class = "dgCMatrix") } - } else if (inherits(x = object, what = c('dgCMatrix', 'matrix', "Matrix"))) { - if (is.null(x = weights)) { - graph_from_adjacency_matrix(adjmatrix = object) - } else { graph_from_adjacency_matrix(adjmatrix = object, weighted = TRUE) - } } else if (inherits(x = object, what = 'igraph')) { object } else { @@ -747,7 +736,7 @@ RunLeiden <- function( object = input, partition_type = partition.type, initial_membership = initial.membership, - weights = weights, + weights = NULL, node_sizes = node.sizes, resolution_parameter = resolution.parameter, seed = random.seed, diff --git a/R/convenience.R b/R/convenience.R index 307268d51..8d7707243 100644 --- a/R/convenience.R +++ b/R/convenience.R @@ -28,6 +28,92 @@ PCAPlot <- function(object, ...) { return(SpecificDimPlot(object = object, ...)) } +#' @rdname SpatialPlot +#' @export +#' +SpatialDimPlot <- function( + object, + group.by = NULL, + images = NULL, + cols = NULL, + crop = TRUE, + cells.highlight = NULL, + cols.highlight = c('#DE2D26', 'grey50'), + facet.highlight = FALSE, + label = FALSE, + label.size = 7, + label.color = 'white', + repel = FALSE, + ncol = NULL, + combine = TRUE, + pt.size.factor = 1.6, + alpha = c(1, 1), + stroke = 0.25, + label.box = TRUE, + interactive = FALSE, + information = NULL +) { + return(SpatialPlot( + object = object, + group.by = group.by, + images = images, + cols = cols, + crop = crop, + cells.highlight = cells.highlight, + cols.highlight = cols.highlight, + facet.highlight = facet.highlight, + label = label, + label.size = label.size, + label.color = label.color, + repel = repel, + ncol = ncol, + combine = combine, + pt.size.factor = pt.size.factor, + alpha = alpha, + stroke = stroke, + label.box = label.box, + interactive = interactive, + information = information + )) +} + +#' @rdname SpatialPlot +#' @export +#' +SpatialFeaturePlot <- function( + object, + features, + images = NULL, + crop = TRUE, + slot = 'data', + min.cutoff = NA, + max.cutoff = NA, + ncol = NULL, + combine = TRUE, + pt.size.factor = 1.6, + alpha = c(1, 1), + stroke = 0.25, + interactive = FALSE, + information = NULL +) { + return(SpatialPlot( + object = object, + features = features, + images = images, + crop = crop, + slot = slot, + min.cutoff = min.cutoff, + max.cutoff = max.cutoff, + ncol = ncol, + combine = combine, + pt.size.factor = pt.size.factor, + alpha = alpha, + stroke = stroke, + interactive = interactive, + information = information + )) +} + #' @rdname DimPlot #' @export #' diff --git a/R/differential_expression.R b/R/differential_expression.R index 8cbc3440b..5333fbfd8 100644 --- a/R/differential_expression.R +++ b/R/differential_expression.R @@ -671,7 +671,7 @@ FindMarkers.default <- function( ) if (is.null(x = reduction)) { diff.col <- ifelse( - test = slot == "scale.data" || test.use == 'roc', + test = slot == "scale.data", yes = "avg_diff", no = "avg_logFC" ) @@ -1556,8 +1556,13 @@ WilcoxDETest <- function( yes = pbsapply, no = future_sapply ) + overflow.check <- ifelse( + test = is.na(x = suppressWarnings(length(x = data.use[1, ]) * length(x = data.use[1, ]))), + yes = FALSE, + no = TRUE + ) limma.check <- PackageCheck("limma", error = FALSE) - if (limma.check[1]) { + if (limma.check[1] && overflow.check) { p_val <- my.sapply( X = 1:nrow(x = data.use), FUN = function(x) { @@ -1565,9 +1570,9 @@ WilcoxDETest <- function( } ) } else { - if (getOption('Seurat.limma.wilcox.msg', TRUE)) { + if (getOption('Seurat.limma.wilcox.msg', TRUE) && overflow.check) { message( - "For a more efficient implementation of the Wilcoxon Rank Sum Test,", + "For a more efficient implementation of the Wilcoxon Rank Sum Test,", "\n(default method for FindMarkers) please install the limma package", "\n--------------------------------------------", "\ninstall.packages('BiocManager')", diff --git a/R/dimensional_reduction.R b/R/dimensional_reduction.R index 4e7151d51..66480d135 100644 --- a/R/dimensional_reduction.R +++ b/R/dimensional_reduction.R @@ -962,14 +962,10 @@ RunPCA.Seurat <- function( #' \item{FIt-SNE: }{Use the FFT-accelerated Interpolation-based t-SNE. Based on #' Kluger Lab code found here: https://github.com/KlugerLab/FIt-SNE} #' } -#' @param add.iter If an existing tSNE has already been computed, uses the -#' current tSNE to seed the algorithm and then adds additional iterations on top -#' of this #' @param dim.embed The dimensional space of the resulting tSNE embedding #' (default is 2). For example, set to 3 for a 3d tSNE #' @param reduction.key dimensional reduction key, specifies the string before the number for the dimension names. tSNE_ by default #' -#' @importFrom tsne tsne #' @importFrom Rtsne Rtsne #' #' @rdname RunTSNE @@ -981,7 +977,6 @@ RunTSNE.matrix <- function( assay = NULL, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, reduction.key = "tSNE_", ... @@ -999,14 +994,6 @@ RunTSNE.matrix <- function( 'FIt-SNE' = fftRtsne(X = object, dims = dim.embed, rand_seed = seed.use, ...), stop("Invalid tSNE method: please choose from 'Rtsne' or 'FIt-SNE'") ) - if (add.iter > 0) { - tsne.data <- tsne( - X = object, - initial_config = as.matrix(x = tsne.data), - max_iter = add.iter, - ... - ) - } colnames(x = tsne.data) <- paste0(reduction.key, 1:ncol(x = tsne.data)) rownames(x = tsne.data) <- rownames(x = object) tsne.reduction <- CreateDimReducObject( @@ -1031,7 +1018,6 @@ RunTSNE.DimReduc <- function( dims = 1:5, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, reduction.key = "tSNE_", ... @@ -1054,7 +1040,6 @@ RunTSNE.dist <- function( assay = NULL, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, reduction.key = "tSNE_", ... @@ -1087,7 +1072,6 @@ RunTSNE.Seurat <- function( features = NULL, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, distance.matrix = NULL, reduction.name = "tsne", @@ -1101,7 +1085,6 @@ RunTSNE.Seurat <- function( assay = DefaultAssay(object = object), seed.use = seed.use, tsne.method = tsne.method, - add.iter = add.iter, dim.embed = dim.embed, reduction.key = reduction.key, is_distance = TRUE, @@ -1114,7 +1097,6 @@ RunTSNE.Seurat <- function( dims = dims, seed.use = seed.use, tsne.method = tsne.method, - add.iter = add.iter, dim.embed = dim.embed, reduction.key = reduction.key, pca = FALSE, @@ -1126,7 +1108,6 @@ RunTSNE.Seurat <- function( assay = DefaultAssay(object = object), seed.use = seed.use, tsne.method = tsne.method, - add.iter = add.iter, dim.embed = dim.embed, reduction.key = reduction.key, pca = FALSE, diff --git a/R/generics.R b/R/generics.R index c5f0101dc..ee3adefda 100644 --- a/R/generics.R +++ b/R/generics.R @@ -115,6 +115,9 @@ as.sparse <- function(x, ...) { #' #' @return A vector of cell names #' +#' @note The default method simply calls \code{\link[base]{colnames}} on \code{x}; +#' other methods are provided for objects where colnames aren't necessarily cell names +#' #' @rdname Cells #' @export Cells #' @@ -141,6 +144,60 @@ Command <- function(object, ...) { UseMethod(generic = 'Command', object = object) } +#' Create a \code{Seurat} object +#' +#' Create a \code{Seurat} object from raw data +#' +#' @param counts Either a \code{\link[base]{matrix}}-like object with +#' unnormalized data with cells as columns and features as rows or an +#' \code{\link{Assay}}-derived object +#' @param project \link{Project} name for the \code{Seurat} object +#' @param assay Name of the initial assay +#' @param names.field For the initial identity class for each cell, choose this +#' field from the cell's name. E.g. If your cells are named as +#' BARCODE_CLUSTER_CELLTYPE in the input matrix, set \code{names.field} to 3 to +#' set the initial identities to CELLTYPE. +#' @param names.delim For the initial identity class for each cell, choose this +#' delimiter from the cell's column name. E.g. If your cells are named as +#' BARCODE-CLUSTER-CELLTYPE, set this to \dQuote{-} to separate the cell name +#' into its component parts for picking the relevant field. +#' @param meta.data Additional cell-level metadata to add to the Seurat object. +#' Should be a \code{\link[base]{data.frame}} where the rows are cell names and +#' the columns are additional metadata fields. +#' @param ... Arguments passed to other methods +#' +#' @note In previous versions (<3.0), this function also accepted a parameter to +#' set the expression threshold for a \sQuote{detected} feature (gene). This +#' functionality has been removed to simplify the initialization +#' process/assumptions. If you would still like to impose this threshold for +#' your particular dataset, simply filter the input expression matrix before +#' calling this function. +#' +#' @return A \code{\link{Seurat}} object +#' +#' @rdname CreateSeuratObject +#' @export +#' +#' @examples +#' pbmc_raw <- read.table( +#' file = system.file('extdata', 'pbmc_raw.txt', package = 'Seurat'), +#' as.is = TRUE +#' ) +#' pbmc_small <- CreateSeuratObject(counts = pbmc_raw) +#' pbmc_small +#' +CreateSeuratObject <- function( + counts, + project = 'CreateSeuratObject', + assay = 'RNA', + names.field = 1, + names.delim = '_', + meta.data = NULL, + ... +) { + UseMethod(generic = 'CreateSeuratObject', object = counts) +} + #' Get and set the default assay #' #' @param object An object @@ -281,7 +338,9 @@ FindMarkers <- function(object, ...) { #' @param object An object #' @param ... Arguments passed to other methods #' -#' @return Returns the object with object@@snn filled +#' @return When running on a \code{\link{Seurat}} object, returns fills the +#' \code{graphs} slot; names of graphs can be found with +#' \code{Filter(function(x) inherits(object[[x]], "Graph"), names(object))} #' #' @examples #' pbmc_small @@ -325,6 +384,21 @@ FindVariableFeatures <- function(object, ...) { UseMethod(generic = 'FindVariableFeatures', object = object) } +#' Find spatially variable features +#' +#' Identify features whose variability in expression can be explained to some +#' degree by spatial location. +#' +#' @param object An object +#' @param ... Arguments passed to other methods +#' +#' @rdname FindSpatiallyVariableFeatures +#' @export FindSpatiallyVariableFeatures +#' +FindSpatiallyVariableFeatures <- function(object, ...) { + UseMethod(generic = 'FindSpatiallyVariableFeatures', object = object) +} + #' Get an Assay object from a given Seurat object. #' #' @param object An object @@ -356,6 +430,45 @@ GetAssayData <- function(object, ...) { UseMethod(generic = 'GetAssayData', object = object) } +#' Get image data +#' +#' @param object An object +#' @param mode How to return the image; should accept one of 'grob', 'raster', +#' 'plotly', or 'raw' +#' @param ... Arguments passed to other methods +#' +#' @return Image data, varying depending on the value of \code{mode}: +#' \describe{ +#' \item{'grob'}{An object representing image data inheriting from \code{grob} objects (eg. \code{rastergrob})} +#' \item{'raster'}{An object of class \code{raster}} +#' \item{'plotly'}{A list with image data suitable for Plotly rendering, see \code{\link[plotly]{layout}} for more details} +#' \item{'raw'}{The raw image data as stored in the object} +#' } +#' +#' @seealso \code{\link[plotly]{layout}} +#' +#' @rdname GetImage +#' @export GetImage +#' +GetImage <- function(object, mode = c('grob', 'raster', 'plotly', 'raw'), ...) { + mode <- match.arg(arg = mode) + UseMethod(generic = 'GetImage', object = object) +} + +#' Get tissue coordinates +#' +#' @param object An object +#' @param ... Arguments passed to other methods +#' +#' @return A data.frame with tissue coordinates +#' +#' @rdname GetTissueCoordinates +#' @export GetTissueCoordinates +#' +GetTissueCoordinates <- function(object, ...) { + UseMethod(generic = 'GetTissueCoordinates', object = object) +} + #' Get highly variable feature information #' #' @param object An object @@ -421,7 +534,6 @@ Idents <- function(object, ... ) { #' the associated object will remain even if its original assay was deleted #' #' @param object An object -#' @param ... Arguments passed to other methods #' #' @return \code{TRUE} if the object is global/persistent otherwise \code{FALSE} #' @@ -431,7 +543,7 @@ Idents <- function(object, ... ) { #' @examples #' IsGlobal(pbmc_small[['pca']]) #' -IsGlobal <- function(object, ...) { +IsGlobal <- function(object) { UseMethod(generic = 'IsGlobal', object = object) } @@ -449,7 +561,7 @@ JS <- function(object, ...) { #' Set JackStraw information #' -#' @inherit JS +#' @inheritParams JS #' @param value JackStraw information #' #' @rdname JS @@ -598,6 +710,19 @@ Project <- function(object, ...) { UseMethod(generic = 'Project<-', object = object) } +#' Get the spot radius from an image +#' +#' @param object An image object +#' +#' @return The radius size +#' +#' @rdname Radius +#' @export Radius +#' +Radius <- function(object) { + UseMethod(generic = 'Radius', object = object) +} + #' Read from and write to h5ad files #' #' Utilize the Anndata h5ad file format for storing and sharing single-cell expression @@ -901,7 +1026,7 @@ RunUMAP <- function(object, ...) { #' Scale and center the data. #' #' Scales and centers features in the dataset. If variables are provided in vars.to.regress, -#' they are individually regressed against each feautre, and the resulting residuals are +#' they are individually regressed against each feature, and the resulting residuals are #' then scaled and centered. #' #' ScaleData now incorporates the functionality of the function formerly known @@ -909,9 +1034,9 @@ RunUMAP <- function(object, ...) { #' and then scaled the residuals). To make use of the regression functionality, #' simply pass the variables you want to remove to the vars.to.regress parameter. #' -#' Setting center to TRUE will center the expression for each feautre by subtracting -#' the average expression for that feautre. Setting scale to TRUE will scale the -#' expression level for each feautre by dividing the centered feautre expression +#' Setting center to TRUE will center the expression for each feature by subtracting +#' the average expression for that feature. Setting scale to TRUE will scale the +#' expression level for each feature by dividing the centered feature expression #' levels by their standard deviations if center is TRUE and by their root mean #' square otherwise. #' @@ -925,6 +1050,20 @@ ScaleData <- function(object, ...) { UseMethod(generic = 'ScaleData', object = object) } +#' Get image scale factors +#' +#' @param object An object to get scale factors from +#' @param ... Arguments passed to other methods +#' +#' @return An object of class \code{scalefactors} +#' +#' @rdname ScaleFactors +#' @export ScaleFactors +#' +ScaleFactors <- function(object, ...) { + UseMethod(generic = 'ScaleFactors', object = object) +} + #' Compute Jackstraw scores significance. #' #' Significant PCs should show a p-value distribution that is @@ -976,6 +1115,15 @@ SetIdent <- function(object, ...) { UseMethod(generic = 'SetIdent', object = object) } +#' Get spatially variable feature information +#' +#' @rdname SpatiallyVariableFeatures +#' @export SpatiallyVariableFeatures +#' +SpatiallyVariableFeatures <- function(object, ...){ + UseMethod(generic = 'SpatiallyVariableFeatures', object = object) +} + #' @return \code{StashIdent}: An object with the identities stashed #' #' @rdname Idents @@ -1026,6 +1174,17 @@ SubsetData <- function(object, ...) { UseMethod(generic = 'SubsetData', object = object) } +#' Get spatially variable feature information +#' +#' @param object An object +#' @param ... Arguments passed to other methods +#' +#' @rdname SVFInfo +#' @export SVFInfo +#' +SVFInfo <- function(object, ...) { + UseMethod(generic = 'SVFInfo', object = object) +} #' Get and set additional tool data #' #' Use \code{Tool} to get tool data. If no additional arguments are provided, diff --git a/R/integration.R b/R/integration.R index 2a73bab3f..ef52009c5 100644 --- a/R/integration.R +++ b/R/integration.R @@ -689,7 +689,10 @@ FindTransferAnchors <- function( key = "ProjectPC_", assay = reference.assay ) - combined.ob <- merge(x = reference, y = query) + combined.ob <- merge( + x = DietSeurat(object = reference, features = features), + y = DietSeurat(object = query, features = features) + ) combined.ob[["pcaproject"]] <- combined.pca old.loadings <- Loadings(object = reference[["pca"]]) colnames(x = old.loadings) <- paste0("ProjectPC_", 1:ncol(x = old.loadings)) @@ -748,6 +751,45 @@ FindTransferAnchors <- function( return(anchor.set) } +#' Get the predicted identity +#' +#' Utility function to easily pull out the name of the class with the maximum +#' prediction. This is useful if you've set \code{prediction.assay = TRUE} in +#' \code{\link{TransferData}} and want to have a vector with the predicted class. +#' +#' @param object Seurat object +#' @param assay Name of the assay holding the predictions +#' @param slot Slot of the assay in which the prediction scores are stored +#' @param score.filter Return "Unassigned" for any cell with a score less than +#' this value +#' +#' @return Returns a vector of predicted class names +#' +#' @examples +#' \dontrun{ +#' prediction.assay <- TransferData(anchorset = anchors, refdata = reference$class) +#' query[["predictions"]] <- prediction.assay +#' query$predicted.id <- GetTransferPredictions(query) +#' } +#' @export +#' +GetTransferPredictions <- function(object, assay = "predictions", slot = "data", score.filter = 0.75) { + dat <- GetAssayData(object[[assay]], slot = slot) + predictions <- apply( + X = dat, + MARGIN = 2, + FUN = function(x){ + if (x['max'] < score.filter) { + "Unassigned" + } else { + x <- x[-which(x = names(x = x) == "max")] + names(x = which.max(x = x)) + } + } + ) + return(predictions) +} + #' Integrate data #' #' Perform dataset integration using a pre-computed \code{\link{AnchorSet}}. @@ -1547,6 +1589,8 @@ SelectIntegrationFeatures <- function( #' @param verbose Print progress bars and output #' @param slot Slot to store the imputed data. Must be either "data" (default) #' or "counts" +#' @param prediction.assay Return an \code{Assay} object with the prediction +#' scores for each class stored in the \code{data} slot. #' #' @return If \code{refdata} is a vector, returns a data.frame with label #' predictions. If \code{refdata} is a matrix, returns an Assay object where the @@ -1595,7 +1639,8 @@ TransferData <- function( eps = 0, do.cpp = TRUE, verbose = TRUE, - slot = "data" + slot = "data", + prediction.assay = FALSE ) { combined.ob <- slot(object = anchorset, name = "object.list")[[1]] anchors <- slot(object = anchorset, name = "anchors") @@ -1729,7 +1774,12 @@ TransferData <- function( row.names = query.cells, stringsAsFactors = FALSE) ) - return(predictions) + if (prediction.assay) { + pa <- CreateAssayObject(data = t(x = as.matrix(x = prediction.scores))) + return(pa) + } else { + return(predictions) + } } else { # case for transferring features reference.cell.indices <- reference.cells[anchors$cell1] refdata.anchors <- refdata[, reference.cell.indices] @@ -3044,33 +3094,20 @@ ScoreAnchors <- function( anchor.df <- as.data.frame(x = GetIntegrationData(object = object, integration.name = integration.name, slot = 'anchors')) neighbors <- GetIntegrationData(object = object, integration.name = integration.name, slot = "neighbors") offset <- length(x = neighbors$cells1) - anchor.df$cell2 <- anchor.df$cell2 + offset - # make within dataset df - if (verbose) { - message("Extracting within-dataset neighbors") - } - total.cells <- offset + length(neighbors$cells2) - nn.m1 <- ConstructNNMat(nn.idx = neighbors$nnaa$nn.idx[,1:k.score], offset1 = 0, offset2 = 0, dims = c(total.cells, total.cells)) - nn.m2 <- ConstructNNMat(nn.idx = neighbors$nnab$nn.idx[,1:k.score], offset1 = 0, offset2 = offset, dims = c(total.cells, total.cells)) - nn.m3 <- ConstructNNMat(nn.idx = neighbors$nnba$nn.idx[,1:k.score], offset1 = offset, offset2 = 0, dims = c(total.cells, total.cells)) - nn.m4 <- ConstructNNMat(nn.idx = neighbors$nnbb$nn.idx[,1:k.score], offset1 = offset, offset2 = offset, dims = c(total.cells, total.cells)) - k.matrix <- nn.m1 + nn.m2 + nn.m3 + nn.m4 - anchor.only <- sparseMatrix(i = anchor.df[, 1], j = anchor.df[, 2], x = 1, dims = c(total.cells, total.cells)) - - if (do.cpp){ - anchor.matrix <- SNNAnchor(k_matrix = k.matrix, anchor_only = anchor.only) - } else { - jaccard.dist <- tcrossprod(x = k.matrix) - anchor.matrix <- jaccard.dist * anchor.only - } - - anchor.matrix <- as(object = anchor.matrix, Class = "dgTMatrix") + nbrsetA <- function(x) c(neighbors$nnaa$nn.idx[x, 1:k.score], neighbors$nnab$nn.idx[x, 1:k.score] + offset) + nbrsetB <- function(x) c(neighbors$nnba$nn.idx[x, 1:k.score], neighbors$nnbb$nn.idx[x, 1:k.score] + offset) + # score = number of shared neighbors anchor.new <- data.frame( - 'cell1' = anchor.matrix@i + 1, - 'cell2' = anchor.matrix@j + 1, - 'score' = anchor.matrix@x + 'cell1' = anchor.df[, 1], + 'cell2' = anchor.df[, 2], + 'score' = mapply( + FUN = function(x, y) { + length(x = intersect(x = nbrsetA(x = x), nbrsetB(x = y)))}, + anchor.df[, 1], + anchor.df[, 2] + ) ) - anchor.new$cell2 <- anchor.new$cell2 - offset + # normalize the score max.score <- quantile(anchor.new$score, 0.9) min.score <- quantile(anchor.new$score, 0.01) anchor.new$score <- anchor.new$score - min.score diff --git a/R/objects.R b/R/objects.R index 8c6a05443..51175ce19 100644 --- a/R/objects.R +++ b/R/objects.R @@ -2,7 +2,7 @@ #' @importFrom Rcpp evalCpp #' @importFrom Matrix colSums rowSums colMeans rowMeans #' @importFrom methods setClass setOldClass setClassUnion slot -#' slot<- setMethod new signature slotNames is +#' slot<- setMethod new signature slotNames is .hasSlot #' @importClassesFrom Matrix dgCMatrix #' @useDynLib Seurat #' @@ -198,6 +198,29 @@ IntegrationData <- setClass( ) ) +#' @note \code{scalefactors} objects can be created with \code{scalefactors()} +#' +#' @param spot Spot full resolution scale factor +#' @param fiducial Fiducial full resolution scale factor +#' @param hires High resolutoin scale factor +#' @param lowres Low resolution scale factor +#' +#' @rdname ScaleFactors +#' @export +#' +scalefactors <- function(spot, fiducial, hires, lowres) { + object <- list( + spot = spot, + fiducial = fiducial, + hires = hires, + lowres = lowres + ) + object <- sapply(X = object, FUN = as.numeric, simplify = FALSE, USE.NAMES = TRUE) + return(structure(.Data = object, class = 'scalefactors')) +} + +setOldClass(Classes = c('scalefactors')) + #' The SeuratCommand Class #' #' The SeuratCommand is used for logging commands that are run on a SeuratObject. It stores parameters and timestamps @@ -239,8 +262,9 @@ SeuratCommand <- setClass( #' @slot active.assay Name of the active, or default, assay; settable using \code{\link{DefaultAssay}} #' @slot active.ident The active cluster identity for this Seurat object; settable using \code{\link{Idents}} #' @slot graphs A list of \code{\link{Graph-class}} objects -#' @slot neighbors ... +#' @slot neighbors Unused at this time #' @slot reductions A list of dimmensional reduction objects for this object +#' @slot images A list of spatial image objects #' @slot project.name Name of the project #' @slot misc A list of miscellaneous information #' @slot version Version of Seurat this object was built under @@ -261,6 +285,7 @@ Seurat <- setClass( graphs = 'list', neighbors = 'list', reductions = 'list', + images = 'list', project.name = 'character', misc = 'list', version = 'package_version', @@ -331,6 +356,122 @@ seurat <- setClass( ) ) +#' The SpatialImage class +#' +#' The SpatialImage class is a virtual class representing spatial information for +#' Seurat. All spatial image information must inherit from this class for use with +#' \code{Seurat} objects +#' +#' @slot assay Name of assay to associate image data with; will give this image +#' priority for visualization when the assay is set as the active/default assay +#' in a \code{Seurat} object +#' @slot key Key for the image +#' +#' @section Provided methods: +#' These methods are defined on the \code{SpatialImage} object and should not be +#' overwritten without careful thought +#' \itemize{ +#' \item \code{\link{DefaultAssay}} and \code{\link{DefaultAssay<-}} +#' \item \code{\link{Key}} and \code{\link{Key<-}} +#' \item \code{\link{IsGlobal}} +#' \item \code{\link{Radius}}; this method \emph{can} be overridden to provide +#' a spot radius for image objects +#' } +#' +#' @section Required methods: +#' All subclasses of the \code{SpatialImage} class must define the following methods; +#' simply relying on the \code{SpatialImage} method will result in errors. For required +#' parameters and their values, see the \code{Usage} and \code{Arguments} sections +#' \describe{ +#' \item{\code{\link{Cells}}}{Return the cell/spot barcodes associated with each position} +#' \item{\code{\link{dim}}}{Return the dimensions of the image for plotting in \code{(Y, X)} format} +#' \item{\code{\link{GetImage}}}{Return image data; by default, must return a grob object} +#' \item{\code{\link{GetTissueCoordinates}}}{Return tissue coordinates; by default, +#' must return a two-column data.frame with x-coordinates in the first column and y-coordiantes +#' in the second} +#' \item{\code{\link{Radius}}}{Return the spot radius; returns \code{NULL} by +#' default for use with non-spot image technologies} +#' \item{\code{\link{RenameCells}}}{Rename the cell/spot barcodes for this image} +#' \item{\code{\link{subset}} and \code{[}}{Subset the image data by cells/spots; +#' \code{[} should only take \code{i} for subsetting by cells/spots} +#' } +#' These methods are used throughout Seurat, so defining them and setting the proper +#' defaults will allow subclasses of \code{SpatialImage} to work seamlessly +#' +#' @name SpatialImage-class +#' @rdname SpatialImage-class +#' @exportClass SpatialImage +#' +SpatialImage <- setClass( + Class = 'SpatialImage', + contains = 'VIRTUAL', + slots = list( + 'assay' = 'character', + 'key' = 'character' + ) +) + +#' The SlideSeq class +#' +#' The SlideSeq class represents spatial information from the Slide-seq platform +#' +#' @inheritSection SpatialImage Slots +#' @slot coordinates ... +#' @slot ... +#' +SlideSeq <- setClass( + Class = 'SlideSeq', + contains = 'SpatialImage', + slots = list( + 'coordinates' = 'data.frame' + ) +) + +#' The STARmap class +#' +#' The STARmap class represents spatial information from the STARmap platform +#' +#' @inheritSection SpatialImage Slots +#' @slot ... +#' +STARmap <- setClass( + Class = 'STARmap', + contains = 'SpatialImage', + slots = list( + 'coordinates' = 'data.frame', + 'qhulls' = 'data.frame' + ) +) + +#' The VisiumV1 class +#' +#' The VisiumV1 class represents spatial information from the 10X Genomics Visium +#' platform +#' +#' @slot image A three-dimensional array with PNG image data, see +#' \code{\link[png]{readPNG}} for more details +#' @slot scale.factors An object of class \code{\link{scalefactors}}; see +#' \code{\link{scalefactors}} for more information +#' @slot coordinates A data frame with tissue coordinate information +#' @slot spot.radius Single numeric value giving the radius of the spots +#' +#' @name VisiumV1-class +#' @rdname VisiumV1-class +#' @exportClass VisiumV1 +#' +VisiumV1 <- setClass( + Class = 'VisiumV1', + contains = 'SpatialImage', + slots = list( + 'image' = 'array', + 'scale.factors' = 'scalefactors', + 'coordinates' = 'data.frame', + 'spot.radius' = 'numeric' + ) +) + +setClass(Class = 'SliceImage', contains = 'VisiumV1') + #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Functions #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -408,6 +549,36 @@ CellsByIdentities <- function(object, idents = NULL, cells = NULL) { return(cells.idents) } +#' Get a vector of cell names associated with an image (or set of images) +#' +#' @param object Seurat object +#' @param images Vector of image names +#' @param unlist Return as a single vector of cell names as opposed to a list, +#' named by image name. +#' +#' @return A vector of cell names +#' +#' @examples +#' \dontrun{ +#' CellsByImage(object = object, images = "slice1") +#' } +#' +CellsByImage <- function(object, images = NULL, unlist = FALSE) { + images <- images %||% Images(object = object) + cells <- sapply( + X = images, + FUN = function(x) { + Cells(x = object[[x]]) + }, + simplify = FALSE, + USE.NAMES = TRUE + ) + if (unlist) { + cells <- unname(obj = unlist(x = cells)) + } + return(cells) +} + #' Create an Assay object #' #' Create an Assay object from a feature (e.g. gene) expression matrix. The @@ -575,13 +746,14 @@ CreateAssayObject <- function( } # Initialize meta.features init.meta.features <- data.frame(row.names = rownames(x = data)) - assay <- new( - Class = 'Assay', - counts = counts, - data = data, - scale.data = new(Class = 'matrix'), - meta.features = init.meta.features + object.list <- list( + 'Class' = 'Assay', + 'counts' = counts, + 'data' = data, + 'scale.data' = new(Class = 'matrix'), + 'meta.features' = init.meta.features ) + assay <- do.call(what = 'new', args = object.list) return(assay) } @@ -710,50 +882,65 @@ CreateDimReducObject <- function( return(dim.reduc) } -#' Create a Seurat object -#' -#' Create a Seurat object from a feature (e.g. gene) expression matrix. The expected format of the -#' input matrix is features x cells. -#' -#' -#' Note: In previous versions (<3.0), this function also accepted a parameter to set the expression -#' threshold for a 'detected' feature (gene). This functionality has been removed to simplify the -#' initialization process/assumptions. If you would still like to impose this threshold for your -#' particular dataset, simply filter the input expression matrix before calling this function. -#' #' @inheritParams CreateAssayObject -#' @param project Sets the project name for the Seurat object. -#' @param assay Name of the assay corresponding to the initial input data. -#' @param names.field For the initial identity class for each cell, choose this field from the -#' cell's name. E.g. If your cells are named as BARCODE_CLUSTER_CELLTYPE in the input matrix, set -#' names.field to 3 to set the initial identities to CELLTYPE. -#' @param names.delim For the initial identity class for each cell, choose this delimiter from the -#' cell's column name. E.g. If your cells are named as BARCODE-CLUSTER-CELLTYPE, set this to "-" to -#' separate the cell name into its component parts for picking the relevant field. -#' @param meta.data Additional cell-level metadata to add to the Seurat object. Should be a data -#' frame where the rows are cell names and the columns are additional metadata fields. #' -#' @importFrom utils packageVersion -#' @importFrom Matrix colSums +#' @rdname CreateSeuratObject +#' @method CreateSeuratObject default #' @export #' -#' @examples -#' pbmc_raw <- read.table( -#' file = system.file('extdata', 'pbmc_raw.txt', package = 'Seurat'), -#' as.is = TRUE -#' ) -#' pbmc_small <- CreateSeuratObject(counts = pbmc_raw) -#' pbmc_small -#' -CreateSeuratObject <- function( +CreateSeuratObject.default <- function( counts, project = 'SeuratProject', assay = 'RNA', + names.field = 1, + names.delim = '_', + meta.data = NULL, min.cells = 0, min.features = 0, + ... +) { + if (!is.null(x = meta.data)) { + if (!all(rownames(x = meta.data) %in% colnames(x = counts))) { + warning("Some cells in meta.data not present in provided counts matrix") + } + } + assay.data <- CreateAssayObject( + counts = counts, + min.cells = min.cells, + min.features = min.features + ) + if (!is.null(x = meta.data)) { + common.cells <- intersect( + x = rownames(x = meta.data), y = colnames(x = assay.data) + ) + meta.data <- meta.data[common.cells, , drop = FALSE] + } + Key(object = assay.data) <- suppressWarnings(expr = UpdateKey(key = tolower( + x = assay + ))) + return(CreateSeuratObject( + counts = assay.data, + project = project, + assay = assay, + names.field = names.field, + names.delim = names.delim, + meta.data = meta.data, + ... + )) +} + +#' @rdname CreateSeuratObject +#' @method CreateSeuratObject Assay +#' @export +#' +CreateSeuratObject.Assay <- function( + counts, + project = 'SeuratProject', + assay = 'RNA', names.field = 1, - names.delim = "_", - meta.data = NULL + names.delim = '_', + meta.data = NULL, + ... ) { if (!is.null(x = meta.data)) { if (is.null(x = rownames(x = meta.data))) { @@ -761,7 +948,7 @@ CreateSeuratObject <- function( } if (length(x = setdiff(x = rownames(x = meta.data), y = colnames(x = counts)))) { warning("Some cells in meta.data not present in provided counts matrix.") - meta.data <- meta.data[intersect(x = rownames(x = meta.data), y = colnames(x = counts)), ] + meta.data <- meta.data[intersect(x = rownames(x = meta.data), y = colnames(x = counts)), , drop = FALSE] } if (is.data.frame(x = meta.data)) { new.meta.data <- data.frame(row.names = colnames(x = counts)) @@ -771,35 +958,32 @@ CreateSeuratObject <- function( meta.data <- new.meta.data } } - assay.data <- CreateAssayObject( - counts = counts, - min.cells = min.cells, - min.features = min.features - ) - Key(object = assay.data) <- paste0(tolower(x = assay), '_') - assay.list <- list(assay.data) + assay.list <- list(counts) names(x = assay.list) <- assay - init.meta.data <- data.frame(row.names = colnames(x = assay.list[[assay]])) # Set idents idents <- factor(x = unlist(x = lapply( - X = colnames(x = assay.data), + X = colnames(x = counts), FUN = ExtractField, field = names.field, delim = names.delim ))) if (any(is.na(x = idents))) { - warning("Input parameters result in NA values for initial cell identities. Setting all initial idents to the project name") + warning( + "Input parameters result in NA values for initial cell identities. Setting all initial idents to the project name", + call. = FALSE, + immediate. = TRUE + ) } # if there are more than 100 idents, set all idents to ... name ident.levels <- length(x = unique(x = idents)) if (ident.levels > 100 || ident.levels == 0 || ident.levels == length(x = idents)) { - idents <- rep.int(x = factor(x = project), times = ncol(x = assay.data)) + idents <- rep.int(x = factor(x = project), times = ncol(x = counts)) } - names(x = idents) <- colnames(x = assay.data) + names(x = idents) <- colnames(x = counts) object <- new( Class = 'Seurat', assays = assay.list, - meta.data = init.meta.data, + meta.data = data.frame(row.names = colnames(x = counts)), active.assay = assay, active.ident = idents, project.name = project, @@ -807,11 +991,12 @@ CreateSeuratObject <- function( ) object[['orig.ident']] <- idents # Calculate nCount and nFeature - n.calc <- CalcN(object = assay.data) + n.calc <- CalcN(object = counts) if (!is.null(x = n.calc)) { names(x = n.calc) <- paste(names(x = n.calc), assay, sep = '_') object[[names(x = n.calc)]] <- n.calc } + # Add metadata if (!is.null(x = meta.data)) { object <- AddMetaData(object = object, metadata = meta.data) } @@ -846,6 +1031,7 @@ DietSeurat <- function( dimreducs = NULL, graphs = NULL ) { + object <- UpdateSlots(object = object) assays <- assays %||% FilterObjects(object = object, classes.keep = "Assay") assays <- assays[assays %in% FilterObjects(object = object, classes.keep = 'Assay')] if (length(x = assays) == 0) { @@ -872,7 +1058,7 @@ DietSeurat <- function( } } else { if (counts) { - if (!is.null(x = features)) { + if (!is.null(x = features) && !IsMatrixEmpty(x = GetAssayData(object = object[[assay]], slot = "counts"))) { slot(object = object[[assay]], name = 'counts') <- slot(object = object[[assay]], name = 'counts')[features.assay, ] } } else { @@ -926,18 +1112,18 @@ DietSeurat <- function( #' head(x = FetchData(object = pbmc_small, vars = c('groups', 'ident'))) #' FetchData <- function(object, vars, cells = NULL, slot = 'data') { + object <- UpdateSlots(object = object) cells <- cells %||% colnames(x = object) if (is.numeric(x = cells)) { cells <- colnames(x = object)[cells] } # Get a list of all objects to search through and their keys - objects.use <- FilterObjects(object = object) - object.keys <- sapply(X = objects.use, FUN = function(i) {return(Key(object[[i]]))}) + object.keys <- Key(object = object) # Find all vars that are keyed keyed.vars <- lapply( X = object.keys, FUN = function(key) { - if (length(x = key) == 0) { + if (length(x = key) == 0 || nchar(x = key) == 0) { return(integer(length = 0L)) } return(grep(pattern = paste0('^', key), x = vars)) @@ -978,6 +1164,12 @@ FetchData <- function(object, vars, cells = NULL, slot = 'data') { colnames(x = data.vars) <- paste0(key.use, vars.use) } data.vars + } else if (inherits(x = object[[x]], what = 'SpatialImage')) { + vars.unkeyed <- gsub(pattern = paste0('^', key.use), replacement = '', x = vars.use) + names(x = vars.use) <- vars.unkeyed + coords <- GetTissueCoordinates(object = object[[x]])[cells, vars.unkeyed, drop = FALSE] + colnames(x = coords) <- vars.use[colnames(x = coords)] + coords } data.return <- as.list(x = as.data.frame(x = data.return)) return(data.return) @@ -985,10 +1177,10 @@ FetchData <- function(object, vars, cells = NULL, slot = 'data') { ) data.fetched <- unlist(x = data.fetched, recursive = FALSE) # Pull vars from object metadata - meta.vars <- vars[vars %in% colnames(x = object[[]]) & ! vars %in% names(x = data.fetched)] + meta.vars <- vars[vars %in% colnames(x = object[[]]) & !(vars %in% names(x = data.fetched))] data.fetched <- c(data.fetched, object[[meta.vars]][cells, , drop = FALSE]) # Pull vars from the default assay - default.vars <- vars[vars %in% rownames(x = GetAssayData(object = object, slot = slot)) & ! vars %in% names(x = data.fetched)] + default.vars <- vars[vars %in% rownames(x = GetAssayData(object = object, slot = slot)) & !(vars %in% names(x = data.fetched))] data.fetched <- c( data.fetched, tryCatch( @@ -1118,6 +1310,82 @@ FetchData <- function(object, vars, cells = NULL, slot = 'data') { return(data.fetched) } +#' Filter stray beads from Slide-seq puck +#' +#' This function is useful for removing stray beads that fall outside the main +#' Slide-seq puck area. Essentially, it's a circular filter where you set a +#' center and radius defining a circle of beads to keep. If the center is not +#' set, it will be estimated from the bead coordinates (removing the 1st and +#' 99th quantile to avoid skewing the center by the stray beads). By default, +#' this function will display a \code{\link{SpatialDimPlot}} showing which cells +#' were removed for easy adjustment of the center and/or radius. +#' +#' @param object Seurat object with slide-seq data +#' @param image Name of the image where the coordinates are stored +#' @param center Vector specifying the x and y coordinates for the center of the +#' inclusion circle +#' @param radius Radius of the circle of inclusion +#' @param do.plot Display a \code{\link{SpatialDimPlot}} with the cells being +#' removed labeled. +#' +#' @return Returns a Seurat object with only the subset of cells that pass the +#' circular filter +#' +#' @examples +#' \dontrun{ +#' # This example uses the ssHippo dataset which you can download +#' # using the SeuratData package. +#' library(SeuratData) +#' data('ssHippo') +#' # perform filtering of beads +#' ssHippo.filtered <- FilterSlideSeq(ssHippo, radius = 2300) +#' # This radius looks to small so increase and repeat until satisfied +#' } +#' @export +#' +FilterSlideSeq <- function( + object, + image = "image", + center = NULL, + radius = NULL, + do.plot = TRUE +) { + if (!inherits(x = object[[image]], what = "SlideSeq")) { + warning( + "This fxn is intended for filtering SlideSeq data and is untested ", + "outside of that context." + ) + } + dat <- GetTissueCoordinates(object[[image]]) + if (is.null(x = center)) { + # heuristic for determining center of puck + center <- c() + x.vals <- dat[, 1] + center[1] <- mean( + x = x.vals[x.vals < quantile(x = x.vals, probs = 0.99) & + x.vals > quantile(x = x.vals, probs = 0.01)] + ) + y.vals <- dat[, 2] + center[2] <- mean( + x = y.vals[y.vals < quantile(x = y.vals, probs = 0.99) & + y.vals > quantile(x = y.vals, probs = 0.01)] + ) + } + if (is.null(x = radius)) { + stop("Please provide a radius.") + } + dists <- apply(X = dat, MARGIN = 1, FUN = function(x) { + as.numeric(dist(rbind(x[c(1, 2)], center))) + }) + cells.to.remove <- names(x = which(x = (dists > radius))) + if (do.plot){ + Idents(object) <- "keep" + object <- SetIdent(object = object, cells = cells.to.remove, value = "remove") + print(SpatialDimPlot(object = object)) + } + return(subset(x = object, cells = cells.to.remove, invert = TRUE)) +} + #' Get integation data #' #' @param object Seurat object @@ -1137,6 +1405,38 @@ GetIntegrationData <- function(object, integration.name, slot) { return(slot(object = int.data, name = slot)) } +#' Pull spatial image names +#' +#' List the names of \code{SpatialImage} objects present in a \code{Seurat} object. +#' If \code{assay} is provided, limits search to images associated with that assay +#' +#' @param object A \code{Seurat} object +#' @param assay Name of assay to limit search to +#' +#' @return A list of image names +#' +#' @export +#' +#' @examples +#' \dontrun{ +#' Images(object) +#' } +#' +Images <- function(object, assay = NULL) { + object <- UpdateSlots(object = object) + images <- names(x = slot(object = object, name = 'images')) + if (!is.null(x = assay)) { + assays <- c(assay, DefaultAssay(object = object[[assay]])) + images <- Filter( + f = function(x) { + return(DefaultAssay(object = object[[x]]) %in% assays) + }, + x = images + ) + } + return(images) +} + #' Log a command #' #' Logs command run, storing the name, timestamp, and argument list. Stores in @@ -1154,6 +1454,7 @@ GetIntegrationData <- function(object, integration.name, slot) { #' LogSeuratCommand <- function(object, return.command = FALSE) { time.stamp <- Sys.time() + object <- UpdateSlots(object = object) #capture function name which.frame <- sys.nframe() - 1 if (which.frame < 1) { @@ -1468,7 +1769,6 @@ TopCells <- function(object, dim = 1, ncells = 20, balanced = FALSE, ...) { #' @return Returns a Seurat object compatible with latest changes #' #' @importFrom utils packageVersion -#' @importFrom methods .hasSlot new slotNames as #' #' @export #' @@ -1647,6 +1947,7 @@ UpdateSeuratObject <- function(object) { # Update object version slot(object = object, name = 'version') <- packageVersion(pkg = 'Seurat') } + object <- UpdateSlots(object = object) message("Object representation is consistent with the most current Seurat version") return(object) } @@ -1843,6 +2144,7 @@ as.loom.Seurat <- function( stop("Please install loomR from GitHub before converting to a loom object") } CheckDots(..., fxns = 'loomR::create') + object <- UpdateSlots(object = x) # Set the default assay to make life easy assay <- assay %||% DefaultAssay(object = x) DefaultAssay(object = x) <- assay @@ -2714,6 +3016,7 @@ Cells.DimReduc <- function(x) { #' Command.Seurat <- function(object, command = NULL, value = NULL, ...) { CheckDots(...) + object <- UpdateSlots(object = object) commands <- slot(object = object, name = "commands") if (is.null(x = command)) { return(names(x = commands)) @@ -2732,6 +3035,45 @@ Command.Seurat <- function(object, command = NULL, value = NULL, ...) { return(params[[value]]) } +#' @rdname Cells +#' @method Cells SlideSeq +#' @export +#' +Cells.SlideSeq <- function(x) { + return(rownames(x = GetTissueCoordinates(object = x))) +} + +#' @param x,object An object inheriting from \code{SpatialImage} +#' +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method Cells SpatialImage +#' @export +#' +Cells.SpatialImage <- function(x) { + stop( + "'Cells' must be implemented for all subclasses of 'SpatialImage'", + call. = FALSE + ) +} + +#' @rdname Cells +#' @method Cells STARmap +#' @export +#' +Cells.STARmap <- function(x) { + return(rownames(x = GetTissueCoordinates(object = x))) +} + +#' @rdname Cells +#' @method Cells VisiumV1 +#' @export +#' +Cells.VisiumV1 <- function(x) { + return(rownames(x = GetTissueCoordinates(object = x, scale = NULL))) +} + #' @rdname DefaultAssay #' @export #' @method DefaultAssay Assay @@ -2769,6 +3111,7 @@ DefaultAssay.Graph <- function(object, ...) { #' DefaultAssay.Seurat <- function(object, ...) { CheckDots(...) + object <- UpdateSlots(object = object) return(slot(object = object, name = 'active.assay')) } @@ -2781,6 +3124,15 @@ DefaultAssay.SeuratCommand <- function(object, ...) { return(slot(object = object, name = 'assay.used')) } +#' @rdname DefaultAssay +#' @method DefaultAssay SpatialImage +#' @export +#' +DefaultAssay.SpatialImage <- function(object, ...) { + CheckDots(...) + return(slot(object = object, name = 'assay')) +} + #' @export #' @method DefaultAssay<- Assay #' @@ -2825,6 +3177,7 @@ DefaultAssay.SeuratCommand <- function(object, ...) { #' "DefaultAssay<-.Seurat" <- function(object, ..., value) { CheckDots(...) + object <- UpdateSlots(object = object) if (!value %in% names(x = slot(object = object, name = 'assays'))) { stop("Cannot find assay ", value) } @@ -2832,6 +3185,16 @@ DefaultAssay.SeuratCommand <- function(object, ...) { return(object) } +#' @rdname DefaultAssay +#' @method DefaultAssay<- SpatialImage +#' @export +#' +"DefaultAssay<-.SpatialImage" <- function(object, ..., value) { + CheckDots(...) + slot(object = object, name = 'assay') <- value + return(object) +} + #' @rdname Embeddings #' @export #' @method Embeddings DimReduc @@ -2856,6 +3219,7 @@ Embeddings.DimReduc <- function(object, ...) { #' Embeddings(object = pbmc_small, reduction = "pca")[1:5, 1:5] #' Embeddings.Seurat <- function(object, reduction = 'pca', ...) { + object <- UpdateSlots(object = object) return(Embeddings(object = object[[reduction]], ...)) } @@ -2909,6 +3273,7 @@ GetAssayData.Assay <- function(object, slot = 'data', ...) { #' GetAssayData.Seurat <- function(object, slot = 'data', assay = NULL, ...) { CheckDots(...) + object <- UpdateSlots(object = object) assay <- assay %||% DefaultAssay(object = object) return(GetAssayData( object = GetAssay(object = object, assay = assay), @@ -2916,6 +3281,191 @@ GetAssayData.Seurat <- function(object, slot = 'data', assay = NULL, ...) { )) } +#' @param image Name of \code{SpatialImage} object to pull image data for; if +#' \code{NULL}, will attempt to select an image automatically +#' +#' @rdname GetImage +#' @method GetImage Seurat +#' @export +#' +GetImage.Seurat <- function( + object, + mode = c('grob', 'raster', 'plotly', 'raw'), + image = NULL, + ... +) { + mode <- match.arg(arg = mode) + image <- image %||% DefaultImage(object = object) + if (is.null(x = image)) { + stop("No images present in this Seurat object", call. = FALSE) + } + return(GetImage(object = object[[image]], mode = mode, ...)) +} + +#' @method GetImage SlideSeq +#' @export +#' +GetImage.SlideSeq <- function( + object, + mode = c('grob', 'raster', 'plotly', 'raw'), + ... +) { + mode <- match.arg(arg = mode) + return(NullImage(mode = mode)) +} + +#' @inheritParams GetImage +#' +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method GetImage SpatialImage +#' @export +#' +GetImage.SpatialImage <- function( + object, + mode = c('grob', 'raster', 'plotly', 'raw'), + ... +) { + mode <- match.arg(arg = mode) + stop( + "'GetImage' must be implemented for all subclasses of 'SpatialImage'", + call. = FALSE + ) +} + +#' @method GetImage STARmap +#' @export +#' +GetImage.STARmap <- function( + object, + mode = c('grob', 'raster', 'plotly', 'raw'), + ... +) { + mode <- match.arg(arg = mode) + return(NullImage(mode = mode)) +} + +#' @importFrom plotly raster2uri +#' @importFrom grDevices as.raster +#' @importFrom grid rasterGrob unit +#' +#' @rdname GetImage +#' @method GetImage VisiumV1 +#' @export +#' +GetImage.VisiumV1 <- function( + object, + mode = c('grob', 'raster', 'plotly', 'raw'), + ... +) { + mode <- match.arg(arg = mode) + image <- slot(object = object, name = 'image') + image <- switch( + EXPR = mode, + 'grob' = rasterGrob( + image = image, + width = unit(x = 1, units = 'npc'), + height = unit(x = 1, units = 'npc') + ), + 'raster' = as.raster(x = image), + 'plotly' = list( + source = raster2uri(r = GetImage(object = object, mode = 'raster')), + xref = 'x', + yref = 'y', + # x = -7, + # y = -7, + sizex = ncol(x = object), + sizey = nrow(x = object), + sizing = 'stretch', + opacity = 1, + layer = 'below' + ), + 'raw' = image, + stop("Unknown image mode: ", mode, call. = FALSE) + ) + return(image) +} + +#' @param image Name of \code{SpatialImage} object to get coordinates for; if +#' \code{NULL}, will attempt to select an image automatically +#' +#' @rdname GetTissueCoordinates +#' @method GetTissueCoordinates Seurat +#' @export +#' +GetTissueCoordinates.Seurat <- function(object, image = NULL, ...) { + image <- image %||% DefaultImage(object = object) + if (is.null(x = image)) { + stop("No images present in this Seurat object", call. = FALSE) + } + return(GetTissueCoordinates(object = object[[image]], ...)) +} + +#' @method GetTissueCoordinates SlideSeq +#' @export +#' +GetTissueCoordinates.SlideSeq <- function(object, ...) { + coords <- slot(object = object, name = 'coordinates') + colnames(x = coords) <- c('x', 'y') + # coords$y <- -rev(x = coords$y) + 1 + # coords$y <- FlipCoords(x = coords$y) + coords$cells <- rownames(x = coords) + return(coords) +} + +#' @inheritParams GetTissueCoordinates +#' +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method GetTissueCoordinates SpatialImage +#' @export +#' +GetTissueCoordinates.SpatialImage <- function(object, ...) { + stop( + "'GetTissueCoordinates' must be implemented for all subclasses of 'SpatialImage'", + call. = FALSE + ) +} + +#' @param qhulls return qhulls instead of centroids +#' @method GetTissueCoordinates STARmap +#' @export +#' +GetTissueCoordinates.STARmap <- function(object, qhulls = FALSE, ...) { + if (qhulls) { + return(slot(object = object, name = 'qhulls')) + } + return(slot(object = object, name = 'coordinates')) +} + +#' @param scale A factor to scale the coordinates by; choose from: 'tissue', +#' 'fiducial', 'hires', 'lowres', or \code{NULL} for no scaling +#' @param cols Columns of tissue coordinates data.frame to pull +#' +#' @rdname GetTissueCoordinates +#' @method GetTissueCoordinates VisiumV1 +#' @export +#' +GetTissueCoordinates.VisiumV1 <- function( + object, + scale = 'lowres', + cols = c('imagerow', 'imagecol'), + ... +) { + cols <- cols %||% colnames(x = slot(object = object, name = 'coordinates')) + if (!is.null(x = scale)) { + coordinates <- slot(object = object, name = 'coordinates')[, c('imagerow', 'imagecol')] + scale <- match.arg(arg = scale, choices = c('spot', 'fiducial', 'hires', 'lowres')) + scale.use <- ScaleFactors(object = object)[[scale]] + coordinates <- coordinates * scale.use + } else { + coordinates <- slot(object = object, name = 'coordinates')[, cols] + } + return(coordinates) +} + #' @param selection.method Which method to pull; choose one from \code{c('sctransform', 'sct')} #' or \code{c('mean.var.plot', 'dispersion', 'mvp', 'disp')} #' @param status Add variable status to the resulting data.frame @@ -2984,6 +3534,7 @@ HVFInfo.Seurat <- function( ... ) { CheckDots(...) + object <- UpdateSlots(object = object) assay <- assay %||% DefaultAssay(object = object) if (is.null(x = selection.method)) { cmds <- apply( @@ -3033,6 +3584,7 @@ HVFInfo.Seurat <- function( #' Idents.Seurat <- function(object, ...) { CheckDots(...) + object <- UpdateSlots(object = object) return(slot(object = object, name = 'active.ident')) } @@ -3045,6 +3597,7 @@ Idents.Seurat <- function(object, ...) { #' "Idents<-.Seurat" <- function(object, cells = NULL, drop = FALSE, ..., value) { CheckDots(...) + object <- UpdateSlots(object = object) cells <- cells %||% colnames(x = object) if (is.numeric(x = cells)) { cells <- colnames(x = object)[cells] @@ -3092,7 +3645,7 @@ Idents.Seurat <- function(object, ...) { #' @export #' @method IsGlobal default #' -IsGlobal.default <- function(object, ...) { +IsGlobal.default <- function(object) { return(FALSE) } @@ -3100,11 +3653,19 @@ IsGlobal.default <- function(object, ...) { #' @export #' @method IsGlobal DimReduc #' -IsGlobal.DimReduc <- function(object, ...) { +IsGlobal.DimReduc <- function(object) { object <- UpdateSlots(object = object) return(slot(object = object, name = 'global')) } +#' @rdname IsGlobal +#' @method IsGlobal SpatialImage +#' @export +#' +IsGlobal.SpatialImage <- function(object) { + return(TRUE) +} + #' @param slot Name of slot to store JackStraw scores to #' Can shorten to 'empirical', 'fake', 'full', or 'overall' #' @@ -3208,7 +3769,11 @@ Key.DimReduc <- function(object, ...) { #' Key.Seurat <- function(object, ...) { CheckDots(...) - keyed.objects <- FilterObjects(object = object) + object <- UpdateSlots(object = object) + keyed.objects <- FilterObjects( + object = object, + classes.keep = c('Assay', 'DimReduc', 'SpatialImage') + ) return(sapply( X = keyed.objects, FUN = function(x) { @@ -3217,6 +3782,16 @@ Key.Seurat <- function(object, ...) { )) } +#' @rdname Key +#' @method Key SpatialImage +#' @export +#' +Key.SpatialImage <- function(object, ...) { + CheckDots(...) + object <- UpdateSlots(object = object) + return(slot(object = object, name = 'key')) +} + #' @rdname Key #' @export #' @method Key<- Assay @@ -3266,6 +3841,18 @@ Key.Seurat <- function(object, ...) { return(object) } +#' @rdname Key +#' @method Key<- SpatialImage +#' @export +#' +"Key<-.SpatialImage" <- function(object, ..., value) { + CheckDots(...) + object <- UpdateSlots(object = object) + value <- UpdateKey(key = value) + slot(object = object, name = 'key') <- value + return(object) +} + #' @param projected Pull the projected feature loadings? #' #' @rdname Loadings @@ -3298,6 +3885,7 @@ Loadings.DimReduc <- function(object, projected = FALSE, ...) { #' Loadings(object = pbmc_small, reduction = "pca")[1:5,1:5] #' Loadings.Seurat <- function(object, reduction = 'pca', projected = FALSE, ...) { + object <- UpdateSlots(object = object) return(Loadings(object = object[[reduction]], projected = projected, ...)) } @@ -3361,6 +3949,7 @@ Misc.DimReduc <- function(object, slot = NULL, ...) { #' Misc.Seurat <- function(object, slot = NULL, ...) { CheckDots(...) + object <- UpdateSlots(object = object) if (is.null(x = slot)) { return(slot(object = object, name = 'misc')) } @@ -3411,6 +4000,7 @@ Misc.Seurat <- function(object, slot = NULL, ...) { #' "Misc<-.Seurat" <- function(object, slot, ..., value) { CheckDots(...) + object <- UpdateSlots(object = object) if (slot %in% names(x = Misc(object = object))) { warning("Overwriting miscellanous data for ", slot) } @@ -3505,6 +4095,7 @@ OldWhichCells.Seurat <- function( ) { # input checking .Deprecated(new = "WhichCells", old = "OldWhichCells") + object <- UpdateSlots(object = object) if (length(x = subset.name) > 1) { stop("subset.name must be a single parameter") } @@ -3612,6 +4203,7 @@ OldWhichCells.Seurat <- function( #' Project.Seurat <- function(object, ...) { CheckDots(...) + object <- UpdateSlots(object = object) return(slot(object = object, name = 'project.name')) } @@ -3621,10 +4213,45 @@ Project.Seurat <- function(object, ...) { #' "Project<-.Seurat" <- function(object, ..., value) { CheckDots(...) + object <- UpdateSlots(object = object) slot(object = object, name = 'project.name') <- as.character(x = value) return(object) } +#' @rdname Radius +#' @method Radius SlideSeq +#' @export +#' +Radius.SlideSeq <- function(object) { + return(0.005) +} + +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method Radius SpatialImage +#' @export +#' +Radius.SpatialImage <- function(object) { + return(NULL) +} + +#' @rdname Radius +#' @method Radius STARmap +#' @export +#' +Radius.STARmap <- function(object) { + return(NULL) +} + +#' @rdname Radius +#' @method Radius VisiumV1 +#' @export +#' +Radius.VisiumV1 <- function(object) { + return(slot(object = object, name = 'spot.radius')) +} + #' @param assay Name of assay to store #' @param layers Slot to store layers as; choose from 'counts' or 'data'; pass #' \code{FALSE} to not pull layers; may pass one value of 'counts' or 'data' for @@ -4089,6 +4716,7 @@ ReorderIdent.Seurat <- function( reorder.numeric = FALSE, ... ) { + object <- UpdateSlots(object = object) data.use <- FetchData(object = object, vars = var, ...)[, 1] rfxn <- ifelse( test = reverse, @@ -4215,6 +4843,7 @@ RenameCells.Seurat <- function( ... ) { CheckDots(...) + object <- UpdateSlots(object = object) if (missing(x = add.cell.id) && missing(x = new.names)) { stop("One of 'add.cell.id' and 'new.names' must be set") } @@ -4236,6 +4865,7 @@ RenameCells.Seurat <- function( ) } } + old.names <- colnames(x = object) # rename in the assay objects assays <- FilterObjects(object = object, classes.keep = 'Assay') for (assay in assays) { @@ -4265,6 +4895,65 @@ RenameCells.Seurat <- function( for (g in graphs) { rownames(x = object[[g]]) <- colnames(x = object[[g]]) <- new.cell.names } + # Rename the images + names(x = new.cell.names) <- old.names + for (i in Images(object = object)) { + object[[i]] <- RenameCells( + object = object[[i]], + new.names = unname(obj = new.cell.names[Cells(x = object[[i]])]) + ) + } + return(object) +} + +#' @method RenameCells SlideSeq +#' @export +#' +RenameCells.SlideSeq <- function(object, new.names = NULL, ...) { + return(RenameCells.VisiumV1(object = object, new.names = new.names)) +} + +#' @inheritParams RenameCells +#' +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method RenameCells SpatialImage +#' @export +#' +RenameCells.SpatialImage <- function(object, new.names = NULL, ...) { + stop( + "'RenameCells' must be implemented for all subclasses of 'SpatialImage'", + call. = FALSE + ) +} + +#' @method RenameCells STARmap +#' @export +#' +RenameCells.STARmap <- function(object, new.names = NULL, ...) { + names(x = new.names) <- Cells(x = object) + object <- RenameCells.VisiumV1(object = object, new.names = new.names) + qhulls <- GetTissueCoordinates(object = object, qhull = TRUE) + qhulls$cell <- new.names[qhulls$cell] + slot(object = object, name = "qhulls") <- qhulls + return(object) +} + +#' @rdname RenameCells +#' @method RenameCells VisiumV1 +#' @export +#' +RenameCells.VisiumV1 <- function(object, new.names = NULL, ...) { + if (is.null(x = new.names)) { + return(object) + } else if (length(x = new.names) != length(x = Cells(x = object))) { + stop("Wrong number of cell/spot names", call. = FALSE) + } + names(x = new.names) <- Cells(x = object) + coordinates <- GetTissueCoordinates(object = object, scale = NULL, cols = NULL) + rownames(x = coordinates) <- new.names[rownames(x = coordinates)] + slot(object = object, name = 'coordinates') <- coordinates return(object) } @@ -4299,6 +4988,14 @@ RenameIdents.Seurat <- function(object, ...) { return(object) } +#' @rdname ScaleFactors +#' @method ScaleFactors VisiumV1 +#' @export +#' +ScaleFactors.VisiumV1 <- function(object, ...) { + return(slot(object = object, name = 'scale.factors')) +} + #' @param slot Where to store the new data #' @param new.data New data to insert #' @@ -4420,6 +5117,7 @@ SetAssayData.Seurat <- function( ... ) { CheckDots(...) + object <- UpdateSlots(object = object) assay <- assay %||% DefaultAssay(object = object) object[[assay]] <- SetAssayData(object = object[[assay]], slot = slot, new.data = new.data, ...) return(object) @@ -4443,10 +5141,52 @@ SetIdent.Seurat <- function(object, cells = NULL, value, ...) { # deparse(expr = substitute(expr = value)) #) CheckDots(...) + object <- UpdateSlots(object = object) Idents(object = object, cells = cells) <- value return(object) } +#' @inheritParams FindSpatiallyVariableFeatures +#' @param decreasing Return features in decreasing order (most spatially +#' variable first). +#' @rdname SpatiallyVariableFeatures +#' @export +#' @method SpatiallyVariableFeatures Assay +#' +SpatiallyVariableFeatures.Assay <- function( + object, + selection.method = "markvariogram", + decreasing = TRUE, + ... +) { + CheckDots(...) + vf <- SVFInfo(object = object, selection.method = selection.method, status = TRUE) + vf <- vf[rownames(x = vf)[which(x = vf[, "variable"][, 1])], ] + if (!is.null(x = decreasing)) { + vf <- vf[order(x = vf[, "rank"], decreasing = !decreasing), ] + } + return(rownames(x = vf)[which(x = vf[, "variable"][, 1])]) +} + +#' @param Seurat object +#' @param assay Name of assay to pull spatially variable features for +#' +#' @rdname SpatiallyVariableFeatures +#' @export +#' @method SpatiallyVariableFeatures Seurat +#' +SpatiallyVariableFeatures.Seurat <- function( + object, + assay = NULL, + selection.method = "markvariogram", + decreasing = TRUE, + ... +) { + CheckDots(...) + assay <- assay %||% DefaultAssay(object = object) + return(SpatiallyVariableFeatures(object = object[[assay]], selection.method = selection.method, decreasing = decreasing)) +} + #' @inheritParams Idents #' @param save.name Store current identity information under this name #' @@ -4465,6 +5205,7 @@ StashIdent.Seurat <- function(object, save.name = 'orig.ident', ...) { ')' ) CheckDots(...) + object <- UpdateSlots(object = object) object[[save.name]] <- Idents(object = object) return(object) } @@ -4569,6 +5310,7 @@ SubsetData.Seurat <- function( ... ) { .Deprecated(old = "SubsetData", new = "subset") + object <- UpdateSlots(object = object) expression <- character(length = 0L) if (!is.null(x = subset.name)) { sub <- gsub( @@ -4652,6 +5394,69 @@ SubsetData.Seurat <- function( return(object) } +#' @param selection.method Which method to pull. Options: markvariogram, moransi +#' @param status Add variable status to the resulting data.frame +#' +#' @rdname SVFInfo +#' @export +#' @method SVFInfo Assay +#' +SVFInfo.Assay <- function( + object, + selection.method = c("markvariogram", "moransi"), + status = FALSE, + ... +) { + CheckDots(...) + vars <- switch( + EXPR = selection.method, + 'markvariogram' = grep(pattern = "r.metric", x = colnames(x = object[[]]), value = TRUE), + 'moransi' = grep(pattern = 'moransi', x = colnames(x = object[[]]), value = TRUE), + stop("Unknown method: '", selection.method, "'", call. = FALSE) + ) + tryCatch( + expr = svf.info <- object[[vars]], + error = function(e) { + stop( + "Unable to find highly variable feature information for method '", + selection.method, + "'", + call. = FALSE + ) + } + ) + colnames(x = svf.info) <- vars + if (status) { + svf.info$variable <- object[[paste0(selection.method, '.spatially.variable')]] + svf.info$rank <- object[[paste0(selection.method, '.spatially.variable.rank')]] + } + return(svf.info) +} + +#' @param assay Name of assay to pull highly variable feature information for +#' +#' @importFrom tools file_path_sans_ext +#' +#' @rdname SVFInfo +#' @export +#' @method SVFInfo Seurat +#' +SVFInfo.Seurat <- function( + object, + selection.method = c("markvariogram", "moransi"), + assay = NULL, + status = FALSE, + ... +) { + CheckDots(...) + assay <- assay %||% DefaultAssay(object = object) + return(SVFInfo( + object = GetAssay(object = object, assay = assay), + selection.method = selection.method, + status = status + )) +} + #' @param slot Name of tool to pull #' #' @rdname Tool @@ -4663,6 +5468,7 @@ SubsetData.Seurat <- function( #' Tool.Seurat <- function(object, slot = NULL, ...) { CheckDots(...) + object <- UpdateSlots(object = object) if (is.null(x = slot)) { return(names(x = slot(object = object, name = 'tools'))) } @@ -4681,6 +5487,7 @@ Tool.Seurat <- function(object, slot = NULL, ...) { #' } "Tool<-.Seurat" <- function(object, ..., value) { CheckDots(...) + object <- UpdateSlots(object = object) calls <- as.character(x = sys.calls()) calls <- lapply( X = strsplit(x = calls, split = '(', fixed = TRUE), @@ -4729,6 +5536,7 @@ VariableFeatures.Assay <- function(object, selection.method = NULL, ...) { #' VariableFeatures.Seurat <- function(object, assay = NULL, selection.method = NULL, ...) { CheckDots(...) + object <- UpdateSlots(object = object) assay <- assay %||% DefaultAssay(object = object) return(VariableFeatures(object = object[[assay]], selection.method = selection.method)) } @@ -4776,6 +5584,7 @@ VariableFeatures.Seurat <- function(object, assay = NULL, selection.method = NUL #' "VariableFeatures<-.Seurat" <- function(object, assay = NULL, ..., value) { CheckDots(...) + object <- UpdateSlots(object = object) assay <- assay %||% DefaultAssay(object = object) VariableFeatures(object = object[[assay]]) <- value return(object) @@ -4871,6 +5680,7 @@ WhichCells.Seurat <- function( ... ) { CheckDots(...) + object <- UpdateSlots(object = object) cells <- cells %||% colnames(x = object) if (is.numeric(x = cells)) { cells <- colnames(x = object)[cells] @@ -4900,7 +5710,10 @@ WhichCells.Seurat <- function( cells <- intersect(x = cells, y = cells.idents) } if (!missing(x = expression)) { - objects.use <- FilterObjects(object = object) + objects.use <- FilterObjects( + object = object, + classes.keep = c('Assay', 'DimReduc', 'SpatialImage') + ) object.keys <- sapply( X = objects.use, FUN = function(i) { @@ -5389,6 +6202,7 @@ WriteH5AD.Seurat <- function( #' pbmc_small[, 1:10] #' "[.Seurat" <- function(x, i, j, ...) { + x <- UpdateSlots(object = x) if (missing(x = i) && missing(x = j)) { return(x) } @@ -5429,6 +6243,35 @@ WriteH5AD.Seurat <- function( return(slot(object = x, name = i)) } +#' @method [ SlideSeq +#' @export +#' +"[.SlideSeq" <- function(x, i, ...) { + return(subset(x = x, cells = i, ...)) +} + +#' @param i,cells A vector of cells to keep +#' +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method [ SpatialImage +#' @export +#' +"[.SpatialImage" <- function(x, i, ...) { + stop( + "'[' must be implemented for all subclasses of 'SpatialImage'", + call. = FALSE + ) +} + +#' @method [ VisiumV1 +#' @export +#' +"[.VisiumV1" <- function(x, i, ...) { + return(subset(x = x, cells = i)) +} + #' @export #' @method [[ Assay #' @@ -5472,6 +6315,7 @@ WriteH5AD.Seurat <- function( #' @method [[ Seurat #' "[[.Seurat" <- function(x, i, ..., drop = FALSE) { + x <- UpdateSlots(object = x) if (missing(x = i)) { i <- colnames(x = slot(object = x, name = 'meta.data')) } @@ -5495,7 +6339,7 @@ WriteH5AD.Seurat <- function( } } else { slot.use <- unlist(x = lapply( - X = c('assays', 'reductions', 'graphs', 'neighbors', 'commands'), + X = c('assays', 'reductions', 'graphs', 'neighbors', 'commands', 'images'), FUN = function(s) { if (any(i %in% names(x = slot(object = x, name = s)))) { return(s) @@ -5504,7 +6348,7 @@ WriteH5AD.Seurat <- function( } )) if (is.null(x = slot.use)) { - stop("Cannot find '", i, "' in this Seurat object") + stop("Cannot find '", i, "' in this Seurat object", call. = FALSE) } data.return <- slot(object = x, name = slot.use)[[i]] } @@ -5577,9 +6421,49 @@ dim.DimReduc <- function(x) { #' @method dim Seurat #' dim.Seurat <- function(x) { + x <- UpdateSlots(object = x) return(dim(x = GetAssay(object = x))) } +#' @method dim SlideSeq +#' @export +#' +dim.SlideSeq <- function(x) { + # return(dim(x = GetImage(object = x, mode = 'raw'))) + return(c(599, 600)) +} + +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method dim SpatialImage +#' @export +#' +dim.SpatialImage <- function(x) { + stop( + "'dim' must be implemented for all subclasses of 'SpatialImage'", + call. = FALSE + ) +} + +#' @method dim STARmap +#' @export +#' +dim.STARmap <- function(x) { + coords <- GetTissueCoordinates(object = x) + return(c( + max(coords[, 1]) - min(coords[, 1]), + max(coords[, 2]) - min(coords[, 2]) + )) +} + +#' @method dim VisiumV1 +#' @export +#' +dim.VisiumV1 <- function(x) { + return(dim(x = GetImage(object = x)$raster)) +} + #' @export #' @method dimnames Assay #' @@ -5598,13 +6482,51 @@ dimnames.DimReduc <- function(x) { #' @method dimnames Seurat #' dimnames.Seurat <- function(x) { + x <- UpdateSlots(object = x) return(dimnames(x = GetAssay(object = x))) } +#' @export +#' @method dimnames<- Assay +#' +"dimnames<-.Assay" <- function(x, value) { + if (!is.list(x = value) || length(x = value) != 2L) { + stop("Invalid 'dimnames' for Assays", call. = FALSE) + } else if (!all(sapply(X = value, FUN = length) == dim(x = x))) { + stop("Missing row (feature) and/or column (cell) names", call. = FALSE) + } + value[[1L]] <- as.character(x = value[[1L]]) + value[[2L]] <- as.character(x = value[[2L]]) + if (!IsMatrixEmpty(x = GetAssayData(object = x, slot = 'scale.data'))) { + value.scaled <- value + features.scaled <- match( + x = rownames(x = GetAssayData(object = x, slot = 'scale.data')), + table = rownames(x = x) + ) + value.scaled[[1L]] <- value.scaled[[1L]][features.scaled] + dimnames(x = slot(object = x, name = 'scale.data')) <- value.scaled + } + if (length(x = VariableFeatures(object = x)) > 0) { + features.variable <- match( + x = VariableFeatures(object = x), + table = rownames(x = x) + ) + VariableFeatures(object = x) <- value[[1L]][features.variable] + } + for (slot in c('counts', 'data')) { + if (!IsMatrixEmpty(x = GetAssayData(object = x, slot = slot))) { + dimnames(x = slot(object = x, name = slot)) <- value + } + } + rownames(x = slot(object = x, name = 'meta.features')) <- value[[1L]] + return(x) +} + #' @export #' @method droplevels Seurat #' droplevels.Seurat <- function(x, ...) { + x <- UpdateSlots(object = x) slot(object = x, name = 'active.ident') <- droplevels(x = Idents(object = x), ...) return(x) } @@ -5625,6 +6547,7 @@ length.DimReduc <- function(x) { #' levels(x = pbmc_small) #' levels.Seurat <- function(x) { + x <- UpdateSlots(object = x) return(levels(x = Idents(object = x))) } @@ -5639,6 +6562,7 @@ levels.Seurat <- function(x) { #' levels(x = pbmc_small) #' "levels<-.Seurat" <- function(x, value) { + x <- UpdateSlots(object = x) idents <- Idents(object = x) if (!all(levels(x = idents) %in% value)) { stop("NA's generated by missing levels", call. = FALSE) @@ -5882,9 +6806,36 @@ merge.Seurat <- function( } else { new.default.assay <- assays[1] } + # Merge images + combined.images <- vector( + mode = 'list', + length = length(x = unlist(x = lapply(X = objects, FUN = Images))) + ) + index <- 1L + for (i in 1:length(x = objects)) { + object <- objects[[i]] + for (image in Images(object = object)) { + image.obj <- object[[image]] + if (image %in% names(x = combined.images)) { + image <- if (is.null(x = add.cell.ids)) { + make.unique(names = c( + na.omit(object = names(x = combined.images)), + image + ))[index] + } else { + paste(image, add.cell.ids[i], sep = '_') + } + } + combined.images[[index]] <- image.obj + names(x = combined.images)[index] <- image + index <- index + 1L + } + } + # Create merged Seurat object merged.object <- new( Class = 'Seurat', assays = combined.assays, + images = combined.images, meta.data = combined.meta.data, active.assay = new.default.assay, active.ident = new.idents, @@ -5905,7 +6856,10 @@ names.DimReduc <- function(x) { #' @method names Seurat #' names.Seurat <- function(x) { - return(FilterObjects(object = x, classes.keep = c('Assay', 'DimReduc', 'Graph'))) + return(FilterObjects( + object = x, + classes.keep = c('Assay', 'DimReduc', 'Graph', 'SpatialImage') + )) } #' Print the results of a dimensional reduction analysis @@ -6002,7 +6956,7 @@ subset.Assay <- function(x, cells = NULL, features = NULL, ...) { replacement = '', x = features ) - features <- intersect(x = rownames(x = x), y = features) + features <- intersect(x = features, y = rownames(x = x)) if (length(x = features) == 0) { stop("Cannot find features provided") } @@ -6022,6 +6976,30 @@ subset.Assay <- function(x, cells = NULL, features = NULL, ...) { } VariableFeatures(object = x) <- VariableFeatures(object = x)[VariableFeatures(object = x) %in% features] slot(object = x, name = 'meta.features') <- x[[]][features, , drop = FALSE] + if (IsSCT(assay = x)) { + # subset cells and genes in the SCT assay + obj.misc <- Misc(object = x) + if ("vst.set" %in% names(x = obj.misc)) { + # set of vst.out objects + vst.info <- obj.misc[["vst.set"]] + for (i in seq_along(along.with = vst.info)) { + vst.info[[i]] <- SubsetVST( + sct.info = vst.info[[i]], + cells = cells, + features = features + ) + } + obj.misc[["vst.set"]] <- vst.info + } else { + # just one vst.out + obj.misc[["vst.out"]] <- SubsetVST( + sct.info = obj.misc[["vst.out"]], + cells = cells, + features = features + ) + } + slot(object = x, name = "misc") <- obj.misc + } return(x) } @@ -6114,6 +7092,7 @@ subset.DimReduc <- function(x, cells = NULL, features = NULL, ...) { #' subset(x = pbmc_small, features = VariableFeatures(object = pbmc_small)) #' subset.Seurat <- function(x, subset, cells = NULL, features = NULL, idents = NULL, ...) { + x <- UpdateSlots(object = x) if (!missing(x = subset)) { subset <- enquo(arg = subset) } @@ -6169,7 +7148,50 @@ subset.Seurat <- function(x, subset, cells = NULL, features = NULL, idents = NUL } slot(object = x, name = 'graphs') <- list() Idents(object = x, drop = TRUE) <- Idents(object = x)[cells] + # subset images + for (image in Images(object = x)) { + x[[image]] <- base::subset(x = x[[image]], cells = cells) + } + return(x) +} + +#' @method subset SlideSeq +#' @export +#' +subset.SlideSeq <- function(x, cells, ...) { + x <- subset.VisiumV1(x = x, cells = cells, ...) + return(x) +} + +#' @method subset STARmap +#' @export +#' +subset.STARmap <- function(x, cells, ...) { + x <- subset.VisiumV1(x = x, cells = cells, ...) + qhulls <- GetTissueCoordinates(object = x, qhulls = TRUE) + qhulls <- qhulls[qhulls$cell %in% cells, ] + slot(object = x, name = 'qhulls') <- qhulls + return(x) +} + +#' @rdname SpatialImage-class +#' @name SpatialImage-class +#' +#' @method subset SpatialImage +#' @export +#' +subset.SpatialImage <- function(x, cells, ...) { + stop("'subset' must be implemented for all subclasses of 'SpatialImage'") +} +#' @method subset VisiumV1 +#' @export +#' +subset.VisiumV1 <- function(x, cells, ...) { + coordinates <- GetTissueCoordinates(object = x, scale = NULL, cols = NULL) + cells <- cells[cells %in% rownames(x = coordinates)] + coordinates <- coordinates[cells, ] + slot(object = x, name = 'coordinates') <- coordinates return(x) } @@ -6231,6 +7253,7 @@ setMethod( # because R doesn't allow S3-style [[<- for S4 classes f = '[[<-', signature = c('x' = 'Seurat'), definition = function(x, i, ..., value) { + x <- UpdateSlots(object = x) # Require names, no index setting if (!is.character(x = i)) { stop("'i' must be a character", call. = FALSE) @@ -6286,6 +7309,20 @@ setMethod( # because R doesn't allow S3-style [[<- for S4 classes } } 'assays' + } else if (inherits(x = value, what = 'SpatialImage')) { + # Ensure that all cells for this image are present + if (!all(Cells(x = value) %in% Cells(x = x))) { + stop("", call. = FALSE) + } + # Ensure Assay that SpatialImage is associated with is present in Seurat object + if (!DefaultAssay(object = value) %in% Assays(object = x)) { + warning( + "Adding image data that isn't associated with any assay present", + call. = FALSE, + immediate. = TRUE + ) + } + 'images' } else if (inherits(x = value, what = 'Graph')) { # Ensure Assay that Graph is associated with is present in the Seurat object if (is.null(x = DefaultAssay(object = value))) { @@ -6373,11 +7410,11 @@ setMethod( # because R doesn't allow S3-style [[<- for S4 classes } else { # Add other object to Seurat object # Ensure cells match in value and order - if (!(class(x = value) %in% c('SeuratCommand', 'NULL')) && !all(Cells(x = value) == Cells(x = x))) { + if (!inherits(x = value, what = c('SeuratCommand', 'NULL', 'SpatialImage')) && !all(Cells(x = value) == Cells(x = x))) { stop("All cells in the object being added must match the cells in this object", call. = FALSE) } # Ensure we're not duplicating object names - if (!is.null(x = FindObject(object = x, name = i)) && !(class(x = value) %in% c(class(x = x[[i]]), 'NULL'))) { + if (!is.null(x = FindObject(object = x, name = i)) && !inherits(x = value, what = c(class(x = x[[i]]), 'NULL'))) { stop( "This object already contains ", i, @@ -6393,8 +7430,8 @@ setMethod( # because R doesn't allow S3-style [[<- for S4 classes ) } # Check keyed objects - if (inherits(x = value, what = c('Assay', 'DimReduc'))) { - if (length(x = Key(object = value)) == 0) { + if (inherits(x = value, what = c('Assay', 'DimReduc', 'SpatialImage'))) { + if (length(x = Key(object = value)) == 0 || nchar(x = Key(object = value)) == 0) { Key(object = value) <- paste0(tolower(x = i), '_') } Key(object = value) <- UpdateKey(key = Key(object = value)) @@ -6659,6 +7696,7 @@ setMethod( f = "show", signature = "Seurat", definition = function(object) { + object <- UpdateSlots(object = object) assays <- FilterObjects(object = object, classes.keep = 'Assay') nfeatures <- sum(vapply( X = assays, @@ -6742,6 +7780,23 @@ setMethod( } ) +setMethod( + f = 'show', + signature = 'SpatialImage', + definition = function(object) { + object <- UpdateSlots(object = object) + cat( + "Spatial data from the", + class(x = object), + "technology for", + length(x = Cells(x = object)), + "samples\n" + ) + cat("Associated assay:", DefaultAssay(object = object), "\n") + cat("Image key:", Key(object = object), "\n") + } +) + #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -6755,6 +7810,7 @@ setMethod( # @return object with metadata added # .AddMetaData <- function(object, metadata, col.name = NULL) { + object <- UpdateSlots(object = object) if (is.null(x = col.name) && is.atomic(x = metadata)) { stop("'col.name' must be provided for atomic metadata types (eg. vectors)") } @@ -6810,6 +7866,25 @@ CalcN <- function(object) { )) } +# Get the default image of an object +# +# Attempts to find all images associated with the default assay of the object. +# If none present, finds all images present in the object. Returns the name of +# the first image +# +# @param object A Seurat object +# +# @return The name of the default image +# +DefaultImage <- function(object) { + object <- UpdateSlots(object = object) + images <- Images(object = object, assay = DefaultAssay(object = object)) + if (length(x = images) < 1) { + images <- Images(object = object) + } + return(images[[1]]) +} + # Get the names of objects within a Seurat object that are of a certain class # # @param object A Seurat object @@ -6818,6 +7893,7 @@ CalcN <- function(object) { # @return A vector with the names of objects within the Seurat object that are of class \code{classes.keep} # FilterObjects <- function(object, classes.keep = c('Assay', 'DimReduc')) { + object <- UpdateSlots(object = object) slots <- na.omit(object = Filter( f = function(x) { sobj <- slot(object = object, name = x) @@ -6854,7 +7930,14 @@ FilterObjects <- function(object, classes.keep = c('Assay', 'DimReduc')) { # @return The collection (slot) of the object # FindObject <- function(object, name) { - collections <- c('assays', 'graphs', 'neighbors', 'reductions', 'commands') + collections <- c( + 'assays', + 'graphs', + 'neighbors', + 'reductions', + 'commands', + 'images' + ) object.names <- lapply( X = collections, FUN = function(x) { @@ -6871,6 +7954,26 @@ FindObject <- function(object, name) { return(NULL) } +# Return a null image +# +# @param mode Image representation to return +# see \code{\link{GetImage}} for more details +# +#' @importFrom grid nullGrob +#' @importFrom grDevices as.raster +# +NullImage <- function(mode) { + image <- switch( + EXPR = mode, + 'grob' = nullGrob(), + 'raster' = as.raster(x = new(Class = 'matrix')), + 'plotly' = list('visible' = FALSE), + 'raw' = NULL, + stop("Unknown image mode: ", mode, call. = FALSE) + ) + return(image) +} + # Check to see if projected loadings have been set # # @param object a DimReduc object @@ -6885,6 +7988,19 @@ Projected <- function(object) { return(!all(projected.dims == 0)) } +# Subset cells in vst data +# @param sct.info A vst.out list +# @param cells vector of cells to retain +# @param features vector of features to retain +SubsetVST <- function(sct.info, cells, features) { + cells.keep <- intersect(x = cells, y = rownames(x = sct.info$cell_attr)) + sct.info$cell_attr <- sct.info$cell_attr[cells.keep, ] + # find which subset of features are in the SCT assay + feat.keep <- intersect(x = features, y = rownames(x = sct.info$gene_attr)) + sct.info$gene_attr <- sct.info$gene_attr[feat.keep, ] + return(sct.info) +} + # Get the top # # @param data Data to pull the top from @@ -7034,7 +8150,7 @@ UpdateKey <- function(key) { key, " to ", new.key, - call. = FALSE, + call. = FALSE, immediate. = TRUE ) return(new.key) @@ -7102,6 +8218,7 @@ ValidateDataForMerge <- function(assay, slot) { ncol = data.dims[2], dimnames = dimnames(x = GetAssayData(object = assay, slot = data.slot)) ) + mat <- as(object = mat, Class = "dgCMatrix") } return(mat) } diff --git a/R/preprocessing.R b/R/preprocessing.R index f2805779e..1c78f7f16 100644 --- a/R/preprocessing.R +++ b/R/preprocessing.R @@ -166,8 +166,8 @@ CalculateBarcodeInflections <- function( #' @param upstream Number of bases upstream to consider #' @param downstream Number of bases downstream to consider #' @param keep.sparse Leave the matrix as a sparse matrix. Setting this option to -#' TRUE will take much longer but will use less memory. This can be useful if -#' you have a very large matrix that cannot fit into memory when converted to +#' TRUE will take much longer but will use less memory. This can be useful if +#' you have a very large matrix that cannot fit into memory when converted to #' a dense form. #' @param verbose Print progress/messages #' @@ -539,24 +539,29 @@ GetResidual <- function( vst_out <- vst.set[[v]] # confirm that cells from SCT model also exist in the integrated object cells.v <- intersect(x = rownames(x = vst_out$cell_attr), y = Cells(x = object)) - vst_out$cell_attr <- vst_out$cell_attr[cells.v, ] - vst_out$cells_step1 <- intersect(x = vst_out$cells_step1, y = cells.v) - object.v <- subset(x = object, cells = cells.v) - - object.v <- GetResidualVstOut( - object = object.v, - assay = assay, - umi.assay = umi.assay[[v]], - new_features = new_features, - vst_out = vst_out, - clip.range = clip.range, - verbose = verbose - ) - new.scale.data <- cbind( - new.scale.data, - GetAssayData(object = object.v, assay = assay, slot ="scale.data" )[new_features, , drop = FALSE] - ) + if (length(x = cells.v) != 0) { + vst_out$cell_attr <- vst_out$cell_attr[cells.v, ] + vst_out$cells_step1 <- intersect(x = vst_out$cells_step1, y = cells.v) + object.v <- subset(x = object, cells = cells.v) + object.v <- GetResidualVstOut( + object = object.v, + assay = assay, + umi.assay = umi.assay[[v]], + new_features = new_features, + vst_out = vst_out, + clip.range = clip.range, + verbose = verbose + ) + new.scale.data <- cbind( + new.scale.data, + GetAssayData( + object = object.v, + assay = assay, + slot ="scale.data")[new_features, , drop = FALSE] + ) + } } + object <- SetAssayData( object = object, assay = assay, @@ -572,6 +577,127 @@ GetResidual <- function( return(object) } +#' Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object +#' +#' @inheritParams Read10X +#' @inheritParams CreateSeuratObject +#' @param filename Name of H5 file containing the feature barcode matrix +#' @param slice Name for the stored image of the tissue slice +#' @param filter.matrix Only keep spots that have been determined to be over +#' tissue +#' @param to.upper Converts all feature names to upper case. Can be useful when +#' analyses require comparisons between human and mouse gene names for example. +#' @param ... Arguments passed to \code{\link{Read10X_h5}} +#' +#' @return A \code{Seurat} object +#' +#' @importFrom png readPNG +#' @importFrom grid rasterGrob +#' @importFrom jsonlite fromJSON +#' +#' @export +#' +#' @examples +#' \dontrun{ +#' data_dir <- 'path/to/data/directory' +#' list.files(data_dir) # Should show filtered_feature_bc_matrix.h5 +#' Load10X_Spatial(data.dir = data_dir) +#' } +#' +Load10X_Spatial <- function( + data.dir, + filename = 'filtered_feature_bc_matrix.h5', + assay = 'Spatial', + slice = 'slice1', + filter.matrix = TRUE, + to.upper = FALSE, + ... +) { + data <- Read10X_h5(filename = file.path(data.dir, filename), ...) + if (to.upper) { + rownames(x = data) <- toupper(x = rownames(x = data)) + } + object <- CreateSeuratObject(counts = data, assay = assay) + image <- Read10X_Image( + image.dir = file.path(data.dir, 'spatial'), + filter.matrix = filter.matrix + ) + image <- image[Cells(x = object)] + DefaultAssay(object = image) <- assay + object[[slice]] <- image + return(object) +} + +#' Load STARmap data +#' +#' @param data.dir location of data directory that contains the counts matrix, +#' gene name, qhull, and centroid files. +#' @param counts.file name of file containing the counts matrix (csv) +#' @param gene.file name of file containing the gene names (csv) +#' @param qhull.file name of file containing the hull coordinates (tsv) +#' @param centroid.file name of file containing the centroid positions (tsv) +#' @param assay Name of assay to associate spatial data to +#' @param image Name of "image" object storing spatial coordinates +#' +#' @return A \code{\link{Seurat}} object +#' +#' @importFrom methods new +#' @importFrom utils read.csv read.table +#' +#' @seealso \code{\link{STARmap}} +#' +#' @export +#' +LoadSTARmap <- function( + data.dir, + counts.file = "cell_barcode_count.csv", + gene.file = "genes.csv", + qhull.file = "qhulls.tsv", + centroid.file = "centroids.tsv", + assay = "Spatial", + image = "image" +) { + if (!dir.exists(paths = data.dir)) { + stop("Cannot find directory ", data.dir, call. = FALSE) + } + counts <- read.csv( + file = file.path(data.dir, counts.file), + as.is = TRUE, + header = FALSE + ) + gene.names <- read.csv( + file = file.path(data.dir, gene.file), + as.is = TRUE, + header = FALSE + ) + qhulls <- read.table( + file = file.path(data.dir, qhull.file), + sep = '\t', + col.names = c('cell', 'y', 'x'), + as.is = TRUE + ) + centroids <- read.table( + file = file.path(data.dir, centroid.file), + sep = '\t', + as.is = TRUE, + col.names = c('y', 'x') + ) + colnames(x = counts) <- gene.names[, 1] + rownames(x = counts) <- paste0('starmap', seq(1:nrow(x = counts))) + counts <- as.matrix(x = counts) + rownames(x = centroids) <- rownames(x = counts) + qhulls$cell <- paste0('starmap', qhulls$cell) + centroids <- as.matrix(x = centroids) + starmap <- CreateSeuratObject(counts = t(x = counts), assay = assay) + starmap[[image]] <- new( + Class = 'STARmap', + assay = assay, + coordinates = as.data.frame(x = centroids), + qhulls = qhulls + ) + return(starmap) +} + #' Normalize raw data #' #' Normalize count data per cell and transform to log scale @@ -1061,6 +1187,83 @@ Read10X_h5 <- function(filename, use.names = TRUE, unique.features = TRUE) { } } +#' Load a 10X Genomics Visium Image +#' +#' @param image.dir Path to directory with 10X Genomics visium image data; +#' should include files \code{tissue_lowres_iamge.png}, +#' \code{scalefactors_json.json} and \code{tissue_positions_list.csv} +#' @param filter.matrix Filter spot/feature matrix to only include spots that +#' have been determined to be over tissue. +#' @param ... Ignored for now +#' +#' @return A \code{\link{VisiumV1}} object +#' +#' @importFrom png readPNG +#' @importFrom jsonlite fromJSON +#' +#' @seealso \code{\link{VisiumV1}} \code{\link{Load10X_Spatial}} +#' +#' @export +#' +Read10X_Image <- function(image.dir, filter.matrix = TRUE, ...) { + image <- readPNG(source = file.path(image.dir, 'tissue_lowres_image.png')) + scale.factors <- fromJSON(txt = file.path(image.dir, 'scalefactors_json.json')) + tissue.positions <- read.csv( + file = file.path(image.dir, 'tissue_positions_list.csv'), + col.names = c('barcodes', 'tissue', 'row', 'col', 'imagerow', 'imagecol'), + header = FALSE, + as.is = TRUE, + row.names = 1 + ) + if (filter.matrix) { + tissue.positions <- tissue.positions[which(x = tissue.positions$tissue == 1), , drop = FALSE] + } + unnormalized.radius <- scale.factors$fiducial_diameter_fullres * scale.factors$tissue_lowres_scalef + spot.radius <- unnormalized.radius / max(dim(x = image)) + return(new( + Class = 'VisiumV1', + image = image, + scale.factors = scalefactors( + spot = scale.factors$tissue_hires_scalef, + fiducial = scale.factors$fiducial_diameter_fullres, + hires = scale.factors$tissue_hires_scalef, + scale.factors$tissue_lowres_scalef + ), + coordinates = tissue.positions, + spot.radius = spot.radius + )) +} + +#' Load Slide-seq spatial data +#' +#' @param coord.file Path to csv file containing bead coordinate positions +#' @param assay Name of assay to associate image to +#' +#' @return A \code{\link{SlideSeq}} object +#' +#' @importFrom utils read.csv +#' +#' @seealso \code{\link{SlideSeq}} +#' +#' @export +#' +ReadSlideSeq <- function(coord.file, assay = 'Spatial') { + if (!file.exists(paths = coord.file)) { + stop("Cannot find coord file ", coord.file, call. = FALSE) + } + slide.seq <- new( + Class = 'SlideSeq', + assay = assay, + coordinates = read.csv( + file = coord.file, + header = TRUE, + as.is = TRUE, + row.names = 1 + ) + ) + return(slide.seq) +} + #' Normalize raw data to fractions #' #' Normalize count data to relative counts per cell by dividing by the total @@ -1098,6 +1301,109 @@ RelativeCounts <- function(data, scale.factor = 1, verbose = TRUE) { return(norm.data) } +#' Run the mark variogram computation on a given position matrix and expression +#' matrix. +#' +#' Wraps the functionality of markvario from the spatstat package. +#' +#' @param spatial.location A 2 column matrix giving the spatial locations of +#' each of the data points also in data +#' @param data Matrix containing the data used as "marks" (e.g. gene expression) +#' @param ... Arguments passed to markvario +#' +#' @importFrom spatstat markvario ppp +#' +#' @export +#' +RunMarkVario <- function( + spatial.location, + data, + ... +) { + pp <- ppp( + x = spatial.location[, 1], + y = spatial.location[, 2], + xrange = range(spatial.location[, 1]), + yrange = range(spatial.location[, 2]) + ) + if (nbrOfWorkers() > 1) { + chunks <- nbrOfWorkers() + features <- rownames(x = data) + features <- split( + x = features, + f = ceiling(x = seq_along(along.with = features) / (length(x = features) / chunks)) + ) + mv <- future_lapply(X = features, FUN = function(x) { + pp[["marks"]] <- as.data.frame(x = t(x = data[x, ])) + markvario(X = pp, normalise = TRUE, ...) + }) + mv <- unlist(x = mv, recursive = FALSE) + names(x = mv) <- rownames(x = data) + } else { + pp[["marks"]] <- as.data.frame(x = t(x = data)) + mv <- markvario(X = pp, normalise = TRUE, ...) + } + return(mv) +} + +#' Compute Moran's I value. +#' +#' Wraps the functionality of the Moran.I function from the ape package. +#' Weights are computed as 1/distance. +#' +#' @param data Expression matrix +#' @param pos Position matrix +#' @param verbose Display messages/progress +#' +#' @importFrom stats dist +#' @importFrom ape Moran.I +#' +#' @export +#' +RunMoransI <- function(data, pos, verbose = TRUE) { + mysapply <- sapply + if (verbose) { + message("Computing Moran's I") + mysapply <- pbsapply + } + Rfast2.installed <- PackageCheck("Rfast2", error = FALSE) + if (Rfast2.installed) { + MyMoran <- Rfast2::moranI + } else { + MyMoran <- ape::Moran.I + if (getOption('Seurat.Rfast2.msg', TRUE)) { + message( + "For a more efficient implementation of the Morans I calculation,", + "\n(selection.method = 'moransi') please install the Rfast2 package", + "\n--------------------------------------------", + "\ninstall.packages('Rfast2')", + "\n--------------------------------------------", + "\nAfter installation of Rfast2, Seurat will automatically use the more ", + "\nefficient implementation (no further action necessary).", + "\nThis message will be shown once per session" + ) + options(Seurat.Rfast2.msg = FALSE) + } + } + pos.dist <- dist(x = pos) + pos.dist.mat <- as.matrix(x = pos.dist) + # weights as 1/dist^2 + weights <- 1/pos.dist.mat^2 + diag(x = weights) <- 0 + results <- mysapply(X = 1:nrow(x = data), FUN = function(x) { + tryCatch( + expr = MyMoran(data[x, ], weights), + error = function(x) c(1,1,1,1) + ) + }) + results <- data.frame( + observed = unlist(x = results[1, ]), + p.value = unlist(x = results[2, ]) + ) + rownames(x = results) <- rownames(x = data) + return(results) +} + #' Sample UMI #' #' Downsample each cell to a specified number of UMIs. Includes @@ -1714,6 +2020,176 @@ FindVariableFeatures.Seurat <- function( return(object) } +#' @param object A Seurat object, assay, or expression matrix +#' @param spatial.location Coordinates for each cell/spot/bead +#' @param selection.method Method for selecting spatially variable features. +#' \itemize{ +#' \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details +#' \item \code{moransi}: See \code{\link{RunMoransI}} for details. +#' } +#' +#' @param r.metric r value at which to report the "trans" value of the mark +#' variogram +#' @param x.cuts Number of divisions to make in the x direction, helps define +#' the grid over which binning is performed +#' @param y.cuts Number of divisions to make in the y direction, helps define +#' the grid over which binning is performed +#' @param verbose Print messages and progress +#' +#' @method FindSpatiallyVariableFeatures default +#' @rdname FindSpatiallyVariableFeatures +#' @export +#' +#' +FindSpatiallyVariableFeatures.default <- function( + object, + spatial.location, + selection.method = c('markvariogram', 'moransi'), + r.metric = 5, + x.cuts = NULL, + y.cuts = NULL, + verbose = TRUE, + ... +) { + # error check dimensions + if (ncol(x = object) != nrow(x = spatial.location)) { + stop("Please provide the same number of observations as spatial locations.") + } + if (!is.null(x = x.cuts) & !is.null(x = y.cuts)) { + binned.data <- BinData( + data = object, + pos = spatial.location, + x.cuts = x.cuts, + y.cuts = y.cuts, + verbose = verbose + ) + object <- binned.data$data + spatial.location <- binned.data$pos + } + svf.info <- switch( + EXPR = selection.method, + 'markvariogram' = RunMarkVario( + spatial.location = spatial.location, + data = object + ), + 'moransi' = RunMoransI( + data = object, + pos = spatial.location, + verbose = verbose + ), + stop("Invalid selection method. Please choose one of: markvariogram, moransi.") + ) + return(svf.info) +} + +#' @param slot Slot in the Assay to pull data from +#' @param features If provided, only compute on given features. Otherwise, +#' compute for all features. +#' @param nfeatures Number of features to mark as the top spatially variable. +#' +#' @method FindSpatiallyVariableFeatures Assay +#' @rdname FindSpatiallyVariableFeatures +#' @export +#' +FindSpatiallyVariableFeatures.Assay <- function( + object, + slot = "scale.data", + spatial.location, + selection.method = c('markvariogram', 'moransi'), + features = NULL, + r.metric = 5, + x.cuts = NULL, + y.cuts = NULL, + nfeatures = nfeatures, + verbose = TRUE, + ... +) { + features <- features %||% rownames(x = object) + if (selection.method == "markvariogram" && "markvariogram" %in% names(x = Misc(object = object))) { + features.computed <- names(x = Misc(object = object, slot = "markvariogram")) + features <- features[! features %in% features.computed] + } + data <- GetAssayData(object = object, slot = slot) + data <- as.matrix(x = data[features, ]) + data <- data[RowVar(x = data) > 0, ] + if (nrow(x = data) != 0) { + svf.info <- FindSpatiallyVariableFeatures( + object = data, + spatial.location = spatial.location, + selection.method = selection.method, + r.metric = r.metric, + x.cuts = x.cuts, + y.cuts = y.cuts, + verbose = verbose, + ... + ) + } else { + svf.info <- c() + } + if (selection.method == "markvariogram") { + if ("markvariogram" %in% names(x = Misc(object = object))) { + svf.info <- c(svf.info, Misc(object = object, slot = "markvariogram")) + } + suppressWarnings(expr = Misc(object = object, slot = "markvariogram") <- svf.info) + svf.info <- ComputeRMetric(mv = svf.info, r.metric) + svf.info <- svf.info[order(svf.info[, 1]), , drop = FALSE] + } + if (selection.method == "moransi") { + colnames(x = svf.info) <- paste0("MoransI_", colnames(x = svf.info)) + svf.info <- svf.info[order(svf.info[, 2], -abs(svf.info[, 1])), , drop = FALSE] + } + var.name <- paste0(selection.method, ".spatially.variable") + var.name.rank <- paste0(var.name, ".rank") + svf.info[[var.name]] <- FALSE + svf.info[[var.name]][1:(min(nrow(x = svf.info), nfeatures))] <- TRUE + svf.info[[var.name.rank]] <- 1:nrow(x = svf.info) + object[[names(x = svf.info)]] <- svf.info + return(object) +} + +#' @param assay Assay to pull the features (marks) from +#' @param image Name of image to pull the coordinates from +#' +#' @method FindSpatiallyVariableFeatures Seurat +#' @rdname FindSpatiallyVariableFeatures +#' @export +#' +FindSpatiallyVariableFeatures.Seurat <- function( + object, + assay = NULL, + slot = "scale.data", + features = NULL, + image = NULL, + selection.method = c('markvariogram', 'moransi'), + r.metric = 5, + x.cuts = NULL, + y.cuts = NULL, + nfeatures = 2000, + verbose = TRUE, + ... +) { + assay <- assay %||% DefaultAssay(object = object) + features <- features %||% rownames(x = object[[assay]]) + image <- image %||% DefaultImage(object = object) + tc <- GetTissueCoordinates(object = object[[image]]) + # check if markvariogram has been run on necessary features + # only run for new ones + object[[assay]] <- FindSpatiallyVariableFeatures( + object = object[[assay]], + slot = slot, + features = features, + spatial.location = tc, + selection.method = selection.method, + r.metric = r.metric, + x.cuts = x.cuts, + y.cuts = y.cuts, + nfeatures = nfeatures, + verbose = verbose, + ... + ) + object <- LogSeuratCommand(object = object) +} + #' @importFrom future.apply future_lapply #' @importFrom future nbrOfWorkers #' @@ -2144,10 +2620,10 @@ RunALRA.Seurat <- function( #' @param do.scale Whether to scale the data. #' @param do.center Whether to center the data. #' @param scale.max Max value to return for scaled data. The default is 10. -#' Setting this can help reduce the effects of feautres that are only expressed in +#' Setting this can help reduce the effects of features that are only expressed in #' a very small number of cells. If regressing out latent variables and using a #' non-linear model, the default is 50. -#' @param block.size Default size for number of feautres to scale at in a single +#' @param block.size Default size for number of features to scale at in a single #' computation. Increasing block.size may speed up calculations but at an #' additional memory cost. #' @param min.cells.to.block If object contains fewer than this number of cells, @@ -2503,6 +2979,47 @@ ScaleData.Seurat <- function( # Internal #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# Bin spatial regions into grid and average expression values +# +# @param dat Expression data +# @param pos Position information/coordinates for each sample +# @param x.cuts Number of cuts to make in the x direction (defines grid along +# with y.cuts) +# @param y.cuts Number of cuts to make in the y direction +# +# @return returns a list with positions as centers of the bins and average +# expression within the bins +# +#' @importFrom Matrix rowMeans +# +BinData <- function(data, pos, x.cuts = 10, y.cuts = x.cuts, verbose = TRUE) { + if (verbose) { + message("Binning spatial data") + } + pos$x.cuts <- cut(x = pos[, 1], breaks = x.cuts) + pos$y.cuts <- cut(x = pos[, 2], breaks = y.cuts) + pos$bin <- paste0(pos$x.cuts, "_", pos$y.cuts) + all.bins <- unique(x = pos$bin) + new.pos <- matrix(data = numeric(), nrow = length(x = all.bins), ncol = 2) + new.dat <- matrix(data = numeric(), nrow = nrow(x = data), ncol = length(x = all.bins)) + for(i in 1:length(x = all.bins)) { + samples <- rownames(x = pos)[which(x = pos$bin == all.bins[i])] + dat <- data[, samples] + if (is.null(x = dim(x = dat))) { + new.dat[, i] <- dat + } else { + new.dat[, i] <- rowMeans(data[, samples]) + } + new.pos[i, 1] <- mean(pos[samples, "x"]) + new.pos[i, 2] <- mean(pos[samples, "y"]) + } + rownames(x = new.dat) <- rownames(x = data) + colnames(x = new.dat) <- all.bins + rownames(x = new.pos) <- all.bins + colnames(x = new.pos) <- colnames(x = pos)[1:2] + return(list(data = new.dat, pos = new.pos)) +} + # Sample classification from MULTI-seq # # Identify singlets, doublets and negative cells from multiplexing experiments. @@ -2582,6 +3099,27 @@ ClassifyCells <- function(data, q) { return(calls) } +# Computes the metric at a given r (radius) value and stores in meta.features +# +# @param mv Results of running markvario +# @param r.metric r value at which to report the "trans" value of the mark +# variogram +# +# @return Returns a data.frame with r.metric values +# +# +ComputeRMetric <- function(mv, r.metric = 5) { + r.metric.results <- unlist(x = lapply( + X = mv, + FUN = function(x) { + x$trans[which.min(x = abs(x = x$r - r.metric))] + } + )) + r.metric.results <- as.data.frame(x = r.metric.results) + colnames(r.metric.results) <- paste0("r.metric.", r.metric) + return(r.metric.results) +} + # Normalize a given data matrix # # Normalize a given matrix with a custom function. Essentially just a wrapper diff --git a/R/utilities.R b/R/utilities.R index 90b133ba2..8b63f64ef 100644 --- a/R/utilities.R +++ b/R/utilities.R @@ -340,10 +340,22 @@ AverageExpression <- function( assay = names(x = data.return)[1], ... ) + toRet <- SetAssayData( + object = toRet, + assay = names(x = data.return)[1], + slot = "data", + new.data = log1p(x = as.matrix(x = data.return[[1]])) + ) #for multimodal data if (length(x = data.return) > 1) { for (i in 2:length(x = data.return)) { toRet[[names(x = data.return)[i]]] <- CreateAssayObject(counts = data.return[[i]]) + toRet <- SetAssayData( + object = toRet, + assay = names(x = data.return)[i], + slot = "data", + new.data = log1p(x = as.matrix(x = data.return[[i]])) + ) } } if (DefaultAssay(object = object) %in% names(x = data.return)) { @@ -356,7 +368,6 @@ AverageExpression <- function( ordered = TRUE ) # finish setting up object if it is to be returned - toRet <- NormalizeData(object = toRet, verbose = verbose) toRet <- ScaleData(object = toRet, verbose = verbose) return(toRet) } else { @@ -973,6 +984,69 @@ GeneSymbolThesarus <- function( return(synonyms) } +#' Compute the correlation of features broken down by groups with another +#' covariate +#' +#' @param object Seurat object +#' @param assay Assay to pull the data from +#' @param slot Slot in the assay to pull feature expression data from (counts, +#' data, or scale.data) +#' @param var Variable with which to correlate the features +#' @param group.assay Compute the gene groups based off the data in this assay. +#' @param min.cells Only compute for genes in at least this many cells +#' @param ngroups Number of groups to split into +#' @param do.plot Display the group correlation boxplot (via +#' \code{GroupCorrelationPlot}) +#' +#' @return A Seurat object with the correlation stored in metafeatures +#' +#' @export +#' +GroupCorrelation <- function( + object, + assay = NULL, + slot = "scale.data", + var = NULL, + group.assay = NULL, + min.cells = 5, + ngroups = 6, + do.plot = TRUE +) { + assay <- assay %||% DefaultAssay(object = object) + group.assay <- group.assay %||% assay + var <- var %||% paste0("nCount_", group.assay) + gene.grp <- GetFeatureGroups( + object = object, + assay = group.assay, + min.cells = min.cells, + ngroups = ngroups + ) + data <- as.matrix(x = GetAssayData(object = object[[assay]], slot = slot)) + data <- data[rowMeans(x = data) != 0, ] + grp.cors <- apply( + X = data, + MARGIN = 1, + FUN = function(x) { + cor(x = x, y = object[[var]]) + } + ) + grp.cors <- grp.cors[names(x = gene.grp)] + grp.cors <- as.data.frame(x = grp.cors[which(x = !is.na(x = grp.cors))]) + grp.cors$gene_grp <- gene.grp[rownames(x = grp.cors)] + colnames(x = grp.cors) <- c("cor", "feature_grp") + object[[assay]][["feature.grp"]] <- grp.cors[, "feature_grp", drop = FALSE] + object[[assay]][[paste0(var, "_cor")]] <- grp.cors[, "cor", drop = FALSE] + if (do.plot) { + print(GroupCorrelationPlot( + object = object, + assay = assay, + feature.group = "feature.grp", + cor = paste0(var, "_cor") + )) + } + return(object) +} + #' Calculate the variance to mean ratio of logged values #' #' Calculate the variance to mean ratio (VMR) in non-logspace (return answer in @@ -1716,6 +1790,17 @@ MaxN <- function(x, N = 2){ sort(x, partial = len - N + 1)[len - N + 1] } +# Given a range from cut, compute the mean +# +# @x range from cut as a string (e.g. (10, 20] ) +# @return returns a numeric with the mean of the range +# +MeanRange <- function(x) { + left <- gsub(pattern = "\\]", replacement = "", x = sub(pattern = "\\([[:digit:]\\.e+]*,", x = x, replacement = "")) + right <- gsub(pattern = "\\(", replacement = "", x = sub(pattern = ",[[:digit:]\\.e+]*]", x = x, replacement = "")) + return(mean(c(as.numeric(x = left), as.numeric(x = right)))) +} + # Melt a data frame # # @param x A data frame diff --git a/R/visualization.R b/R/visualization.R index 1e19939d9..9f71b9573 100644 --- a/R/visualization.R +++ b/R/visualization.R @@ -258,7 +258,6 @@ DoHeatmap <- function( data <- as.data.frame(x = as.matrix(x = t(x = GetAssayData( object = object, slot = slot)[features, cells, drop = FALSE]))) - object <- suppressMessages(expr = StashIdent(object = object, save.name = 'ident')) group.by <- group.by %||% 'ident' groups.use <- object[[group.by]][cells, , drop = FALSE] @@ -346,11 +345,13 @@ DoHeatmap <- function( y.range <- diff(x = pbuild$layout$panel_params[[1]]$y.range) y.pos <- max(pbuild$layout$panel_params[[1]]$y.range) + y.range * 0.015 y.max <- y.pos + group.bar.height * y.range + x.min <- min(pbuild$layout$panel_params[[1]]$x.range) + 0.1 + x.max <- max(pbuild$layout$panel_params[[1]]$x.range) - 0.1 plot <- plot + annotation_raster( raster = t(x = cols[group.use2]), - xmin = -Inf, - xmax = Inf, + xmin = x.min, + xmax = x.max, ymin = y.pos, ymax = y.max ) + @@ -359,9 +360,15 @@ DoHeatmap <- function( if (label) { x.max <- max(pbuild$layout$panel_params[[1]]$x.range) # Attempt to pull xdivs from x.major in ggplot2 < 3.3.0; if NULL, pull from the >= 3.3.0 slot - x.divs <- pbuild$layout$panel_params[[1]]$x.major %||% pbuild$layout$panel_params[[1]]$x$break_positions() + x.divs <- pbuild$layout$panel_params[[1]]$x.major %||% attr(x = pbuild$layout$panel_params[[1]]$x$get_breaks(), which = "pos") x <- data.frame(group = sort(x = group.use), x = x.divs) - label.x.pos <- tapply(X = x$x, INDEX = x$group, FUN = median) * x.max + label.x.pos <- tapply(X = x$x, INDEX = x$group, FUN = function(y) { + if (isTRUE(x = draw.lines)) { + mean(x = y[-length(x = y)]) + } else { + mean(x = y) + } + }) label.x.pos <- data.frame(group = names(x = label.x.pos), label.x.pos) plot <- plot + geom_text( stat = "identity", @@ -859,6 +866,7 @@ DimPlot <- function( #' @param by.col If splitting by a factor, plot the splits per column with the features as rows; ignored if \code{blend = TRUE} #' @param sort.cell Redundant with \code{order}. This argument is being #' deprecated. Please use \code{order} instead. +#' @param interactive Launch an interactive \code{\link[Seurat:IFeaturePlot]{FeaturePlot}} #' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} #' ggplot object. If \code{FALSE}, return a list of ggplot objects #' @@ -912,6 +920,7 @@ FeaturePlot <- function( coord.fixed = FALSE, by.col = TRUE, sort.cell = NULL, + interactive = FALSE, combine = TRUE ) { # TODO: deprecate fully on 3.2.0 @@ -926,6 +935,15 @@ FeaturePlot <- function( order <- sort.cell } } + if (interactive) { + return(IFeaturePlot( + object = object, + feature = features[1], + dims = dims, + reduction = reduction, + slot = slot + )) + } # Set a theme to remove right-hand Y axis lines # Also sets right-hand Y axis text label formatting no.right <- theme( @@ -1083,8 +1101,8 @@ FeaturePlot <- function( } else { switch( EXPR = split.by, - ident = Idents(object = object)[cells], - object[[split.by, drop = TRUE]][cells] + ident = Idents(object = object)[cells, drop = TRUE], + object[[split.by, drop = TRUE]][cells, drop = TRUE] ) } if (!is.factor(x = data$split)) { @@ -1229,7 +1247,7 @@ FeaturePlot <- function( if (unique.feature.exp == 0) { cols.grad <- cols[1] } else{ - cols.grad <- cols + cols.grad <- cols } } plot <- suppressMessages( @@ -1374,6 +1392,231 @@ FeaturePlot <- function( return(plots) } +#' Visualize features in dimensional reduction space interactively +#' +#' @inheritParams FeaturePlot +#' @param feature Feature to plot +#' +#' @return Returns the final plot as a ggplot object +#' +#' @importFrom cowplot theme_cowplot +#' @importFrom ggplot2 theme element_text guides scale_color_gradientn +#' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel +#' @importFrom shiny fillRow sidebarPanel selectInput plotOutput reactiveValues +#' observeEvent stopApp observe updateSelectInput renderPlot runGadget +#' +#' @export +#' +IFeaturePlot <- function(object, feature, dims = c(1, 2), reduction = NULL, slot = 'data') { + # Set initial data values + feature.label <- 'Feature to visualize' + assay.keys <- Key(object = object)[Assays(object = object)] + keyed <- sapply(X = assay.keys, FUN = grepl, x = feature) + assay <- if (any(keyed)) { + names(x = which(x = keyed))[1] + } else { + DefaultAssay(object = object) + } + features <- sort(x = rownames(x = GetAssayData( + object = object, + slot = slot, + assay = assay + ))) + assays.use <- vapply( + X = Assays(object = object), + FUN = function(x) { + return(!IsMatrixEmpty(x = GetAssayData( + object = object, + slot = slot, + assay = x + ))) + }, + FUN.VALUE = logical(length = 1L) + ) + assays.use <- sort(x = Assays(object = object)[assays.use]) + reduction <- reduction %||% DefaultDimReduc(object = object) + dims.reduc <- gsub( + pattern = Key(object = object[[reduction]]), + replacement = '', + x = colnames(x = object[[reduction]]) + ) + # Set up the gadget UI + ui <- miniPage( + miniButtonBlock(miniTitleBarButton( + inputId = 'done', + label = 'Done', + primary = TRUE + )), + miniContentPanel( + fillRow( + sidebarPanel( + selectInput( + inputId = 'assay', + label = 'Assay', + choices = assays.use, + selected = assay, + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'feature', + label = feature.label, + choices = features, + selected = feature, + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'reduction', + label = 'Dimensional reduction', + choices = Reductions(object = object), + selected = reduction, + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'xdim', + label = 'X dimension', + choices = dims.reduc, + selected = as.character(x = dims[1]), + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'ydim', + label = 'Y dimension', + choices = dims.reduc, + selected = as.character(x = dims[2]), + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'palette', + label = 'Color scheme', + choices = names(x = FeaturePalettes), + selected = 'Seurat', + selectize = FALSE, + width = '100%' + ), + width = '100%' + ), + plotOutput(outputId = 'plot', height = '100%'), + flex = c(1, 4) + ) + ) + ) + # Prepare plotting data + dims <- paste0(Key(object = object[[reduction]]), dims) + plot.data <- FetchData(object = object, vars = c(dims, feature), slot = slot) + # Shiny server + server <- function(input, output, session) { + plot.env <- reactiveValues( + data = plot.data, + dims = paste0(Key(object = object[[reduction]]), dims), + feature = feature, + palette = 'Seurat' + ) + # Observe events + observeEvent( + eventExpr = input$done, + handlerExpr = stopApp(returnValue = plot.env$plot) + ) + observe(x = { + assay <- input$assay + feature.use <- input$feature + features.assay <- sort(x = rownames(x = GetAssayData( + object = object, + slot = slot, + assay = assay + ))) + feature.use <- ifelse( + test = feature.use %in% features.assay, + yes = feature.use, + no = features.assay[1] + ) + reduc <- input$reduction + dims.reduc <- gsub( + pattern = Key(object = object[[reduc]]), + replacement = '', + x = colnames(x = object[[reduc]]) + ) + dims <- c(input$xdim, input$ydim) + for (i in seq_along(along.with = dims)) { + if (!dims[i] %in% dims.reduc) { + dims[i] <- dims.reduc[i] + } + } + updateSelectInput( + session = session, + inputId = 'xdim', + label = 'X dimension', + choices = dims.reduc, + selected = as.character(x = dims[1]) + ) + updateSelectInput( + session = session, + inputId = 'ydim', + label = 'Y dimension', + choices = dims.reduc, + selected = as.character(x = dims[2]) + ) + updateSelectInput( + session = session, + inputId = 'feature', + label = feature.label, + choices = features.assay, + selected = feature.use + ) + }) + observe(x = { + feature.use <- input$feature + feature.keyed <- paste0(Key(object = object[[input$assay]]), feature.use) + reduc <- input$reduction + dims <- c(input$xdim, input$ydim) + dims <- paste0(Key(object = object[[reduc]]), dims) + plot.data <- tryCatch( + expr = FetchData( + object = object, + vars = c(dims, feature.keyed), + slot = slot + ), + warning = function(...) { + return(plot.env$data) + }, + error = function(...) { + return(plot.env$data) + } + ) + dims <- colnames(x = plot.data)[1:2] + colnames(x = plot.data) <- c(dims, feature.use) + plot.env$data <- plot.data + plot.env$feature <- feature.use + plot.env$dims <- dims + }) + observe(x = { + plot.env$palette <- input$palette + }) + # Create the plot + output$plot <- renderPlot(expr = { + plot.env$plot <- SingleDimPlot( + data = plot.env$data, + dims = plot.env$dims, + col.by = plot.env$feature, + label = FALSE + ) + + theme_cowplot() + + theme(plot.title = element_text(hjust = 0.5)) + + guides(color = NULL) + + scale_color_gradientn( + colors = FeaturePalettes[[plot.env$palette]], + guide = 'colorbar' + ) + plot.env$plot + }) + } + runGadget(app = ui, server = server) +} + #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Scatter plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1480,13 +1723,15 @@ FeatureScatter <- function( cells = cells, slot = slot ) - if (isFALSE(x = feature1 %in% colnames(x = data))) { + if (!grepl(pattern = feature1, x = colnames(x = data)[1])) { stop("Feature 1 (", feature1, ") not found.", call. = FALSE) } - if (isFALSE(x = feature2 %in% colnames(x = data))) { + if (!grepl(pattern = feature2, x = colnames(x = data)[2])) { stop("Feature 2 (", feature2, ") not found.", call. = FALSE) } data <- as.data.frame(x = data) + feature1 <- colnames(x = data)[1] + feature2 <- colnames(x = data)[2] for (group in group.by) { if (!is.factor(x = data[, group])) { data[, group] <- factor(x = data[, group]) @@ -1551,7 +1796,7 @@ VariableFeaturePlot <- function( assay = assay, selection.method = selection.method, status = TRUE - ) + ) var.status <- c('no', 'yes')[unlist(x = hvf.info[, ncol(x = hvf.info)]) + 1] hvf.info <- hvf.info[, c(1, 3)] axis.labels <- switch( @@ -1737,140 +1982,1188 @@ PolyFeaturePlot <- function( } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# Other plotting functions +# Spatial Plots #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#' ALRA Approximate Rank Selection Plot +#' Visualize spatial and clustering (dimensional reduction) data in a linked, +#' interactive framework #' -#' Plots the results of the approximate rank selection process for ALRA. +#' @inheritParams DimPlot +#' @inheritParams FeaturePlot +#' @inheritParams SpatialPlot +#' @param feature Feature to visualize +#' @param image Name of the image to use in the plot #' -#' @note ALRAChooseKPlot and associated functions are being moved to SeuratWrappers; -#' for more information on SeuratWrappers, please see \url{https://github.com/satijalab/seurat-wrappers} +#' @return Returns final plots. If \code{combine}, plots are stiched together +#' using \code{\link{CombinePlots}}; otherwise, returns a list of ggplot objects #' -#' @param object Seurat object -#' @param start Index to start plotting singular value spacings from. -#' The transition from "signal" to "noise" in the is hard to see because the -#' first singular value spacings are so large. Nicer visualizations result from -#' skipping the first few. If set to 0 (default) starts from k/2. -#' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} -#' ggplot object. If \code{FALSE}, return a list of ggplot objects +#' @rdname LinkedPlots +#' @name LinkedPlots #' -#' @return A list of 3 \code{\link[patchwork]{patchwork}ed} ggplot objects -#' splotting the singular values, the spacings of the singular values, and the -#' p-values of the singular values. +#' @importFrom scales hue_pal +#' @importFrom patchwork wrap_plots +#' @importFrom ggplot2 scale_alpha_ordinal guides +#' @importFrom miniUI miniPage gadgetTitleBar miniTitleBarButton miniContentPanel +#' @importFrom shiny fillRow plotOutput brushOpts clickOpts hoverOpts +#' verbatimTextOutput reactiveValues observeEvent stopApp nearPoints +#' brushedPoints renderPlot renderPrint runGadget #' -#' @author Jun Zhao, George Linderman -#' @seealso \code{\link{RunALRA}} +#' @aliases LinkedPlot LinkedDimPlot #' -#' @importFrom cowplot theme_cowplot -#' @importFrom ggplot2 ggplot aes_string geom_point geom_line -#' geom_vline scale_x_continuous labs -#' @importFrom patchwork wrap_plots #' @export #' -ALRAChooseKPlot <- function(object, start = 0, combine = TRUE) { - .Deprecated( - new = 'SeruatWrappers::ALRAChooseKPlot', - msg = paste( - 'ALRAChooseKPlot and associated functions are being moved to SeuratWrappers;', - 'for more information on SeuratWrappers, please see https://github.com/satijalab/seurat-wrappers' +#' @examples +#' \dontrun{ +#' LinkedDimPlot(seurat.object) +#' LinkedFeaturePlot(seurat.object, feature = 'Hpca') +#' } +#' +LinkedDimPlot <- function( + object, + dims = 1:2, + reduction = NULL, + image = NULL, + group.by = NULL, + alpha = c(0.1, 1), + combine = TRUE +) { + # Setup gadget UI + ui <- miniPage( + gadgetTitleBar( + title = 'LinkedDimPlot', + left = miniTitleBarButton(inputId = 'reset', label = 'Reset') + ), + miniContentPanel( + fillRow( + plotOutput( + outputId = 'spatialplot', + height = '100%', + # brush = brushOpts(id = 'brush', delay = 10, clip = TRUE, resetOnNew = FALSE), + click = clickOpts(id = 'spclick', clip = TRUE), + hover = hoverOpts(id = 'sphover', delay = 10, nullOutside = TRUE) + ), + plotOutput( + outputId = 'dimplot', + height = '100%', + brush = brushOpts(id = 'brush', delay = 10, clip = TRUE, resetOnNew = FALSE), + click = clickOpts(id = 'dimclick', clip = TRUE), + hover = hoverOpts(id = 'dimhover', delay = 10, nullOutside = TRUE) + ), + height = '97%' + ), + verbatimTextOutput(outputId = 'info') ) ) - alra.data <- Tool(object = object, slot = 'RunALRA') - if (is.null(x = alra.data)) { - stop('RunALRA should be run prior to using this function.') - } - d <- alra.data[["d"]] - diffs <- alra.data[["diffs"]] - k <- alra.data[["k"]] - if (start == 0) { - start <- floor(x = k / 2) - } - if (start > k) { - stop("Plots should include k (i.e. starting.from should be less than k)") - } - breaks <- seq(from = 10, to = length(x = d), by = 10) - ggdata <- data.frame(x = 1:length(x = d), y = d) - gg1 <- ggplot(data = ggdata, mapping = aes_string(x = 'x', y = 'y')) + - geom_point(size = 1) + - geom_line(size = 0.5) + - geom_vline(xintercept = k) + - theme_cowplot() + - scale_x_continuous(breaks = breaks) + - labs(x = NULL, y = 's_i', title = 'Singular values') - ggdata <- data.frame(x = 1:(length(x = d) - 1), y = diffs)[-(1:(start - 1)), ] - gg2 <- ggplot(data = ggdata, mapping = aes_string(x = 'x', y = 'y')) + - geom_point(size = 1) + - geom_line(size = 0.5) + - geom_vline(xintercept = k + 1) + - theme_cowplot() + - scale_x_continuous(breaks = breaks) + - labs(x = NULL, y = 's_{i} - s_{i-1}', title = 'Singular value spacings') - plots <- list(spectrum = gg1, spacings = gg2) - if (combine) { - plots <- wrap_plots(plots) + # Prepare plotting data + image <- image %||% DefaultImage(object = object) + cells.use <- Cells(x = object[[image]]) + reduction <- reduction %||% DefaultDimReduc(object = object) + dims <- dims[1:2] + dims <- paste0(Key(object = object[[reduction]]), dims) + group.by <- group.by %||% 'ident' + group.data <- FetchData( + object = object, + vars = group.by, + cells = cells.use + ) + coords <- GetTissueCoordinates(object = object[[image]]) + embeddings <- Embeddings(object = object[[reduction]])[cells.use, dims] + plot.data <- cbind(coords, group.data, embeddings) + plot.data$selected_ <- FALSE + Idents(object = object) <- group.by + # Setup the server + server <- function(input, output, session) { + click <- reactiveValues(pt = NULL, invert = FALSE) + plot.env <- reactiveValues(data = plot.data, alpha.by = NULL) + # Handle events + observeEvent( + eventExpr = input$done, + handlerExpr = { + plots <- list(plot.env$spatialplot, plot.env$dimplot) + if (combine) { + plots <- wrap_plots(plots, ncol = 2) + } + stopApp(returnValue = plots) + } + ) + observeEvent( + eventExpr = input$reset, + handlerExpr = { + click$pt <- NULL + click$invert <- FALSE + session$resetBrush(brushId = 'brush') + } + ) + observeEvent(eventExpr = input$brush, handlerExpr = click$pt <- NULL) + observeEvent( + eventExpr = input$spclick, + handlerExpr = { + click$pt <- input$spclick + click$invert <- TRUE + } + ) + observeEvent( + eventExpr = input$dimclick, + handlerExpr = { + click$pt <- input$dimclick + click$invert <- FALSE + } + ) + observeEvent( + eventExpr = c(input$brush, input$spclick, input$dimclick), + handlerExpr = { + plot.env$data <- if (is.null(x = input$brush)) { + clicked <- nearPoints( + df = plot.data, + coordinfo = if (click$invert) { + InvertCoordinate(x = click$pt) + } else { + click$pt + }, + threshold = 10, + maxpoints = 1 + ) + if (nrow(x = clicked) == 1) { + cell.clicked <- rownames(x = clicked) + group.clicked <- plot.data[cell.clicked, group.by, drop = TRUE] + idx.group <- which(x = plot.data[[group.by]] == group.clicked) + plot.data[idx.group, 'selected_'] <- TRUE + plot.data + } else { + plot.data + } + } else if (input$brush$outputId == 'dimplot') { + brushedPoints(df = plot.data, brush = input$brush, allRows = TRUE) + } else if (input$brush$outputId == 'spatialplot') { + brushedPoints(df = plot.data, brush = InvertCoordinate(x = input$brush), allRows = TRUE) + } + plot.env$alpha.by <- if (any(plot.env$data$selected_)) { + 'selected_' + } else { + NULL + } + } + ) + # Set plots + output$spatialplot <- renderPlot( + expr = { + plot.env$spatialplot <- SingleSpatialPlot( + data = plot.env$data, + image = object[[image]], + col.by = group.by, + pt.size.factor = 1.6, + crop = TRUE, + alpha.by = plot.env$alpha.by + ) + scale_alpha_ordinal(range = alpha) + NoLegend() + plot.env$spatialplot + } + ) + output$dimplot <- renderPlot( + expr = { + plot.env$dimplot <- SingleDimPlot( + data = plot.env$data, + dims = dims, + col.by = group.by, + alpha.by = plot.env$alpha.by + ) + scale_alpha_ordinal(range = alpha) + guides(alpha = FALSE) + plot.env$dimplot + } + ) + # Add hover text + output$info <- renderPrint( + expr = { + cell.hover <- rownames(x = nearPoints( + df = plot.data, + coordinfo = if (is.null(x = input[['sphover']])) { + input$dimhover + } else { + InvertCoordinate(x = input$sphover) + }, + threshold = 10, + maxpoints = 1 + )) + # if (length(x = cell.hover) == 1) { + # palette <- hue_pal()(n = length(x = levels(x = object))) + # group <- plot.data[cell.hover, group.by, drop = TRUE] + # background <- palette[which(x = levels(x = object) == group)] + # text <- unname(obj = BGTextColor(background = background)) + # style <- paste0( + # paste( + # paste('background-color:', background), + # paste('color:', text), + # sep = '; ' + # ), + # ';' + # ) + # info <- paste(cell.hover, paste('Group:', group), sep = '
') + # } else { + # style <- 'background-color: white; color: black' + # info <- NULL + # } + # HTML(text = paste0("
", info, "
")) + # p(HTML(info), style = style) + # paste0('
', info, '
') + # TODO: Get newlines, extra information, and background color working + if (length(x = cell.hover) == 1) { + paste(cell.hover, paste('Group:', plot.data[cell.hover, group.by, drop = TRUE]), collapse = '
') + } else { + NULL + } + } + ) } - return(plots) + # Run the thang + runGadget(app = ui, server = server) } -#' Plot the Barcode Distribution and Calculated Inflection Points +#' @rdname LinkedPlots #' -#' This function plots the calculated inflection points derived from the barcode-rank -#' distribution. +#' @aliases LinkedFeaturePlot #' -#' See [CalculateBarcodeInflections()] to calculate inflection points and -#' [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. +#' @importFrom ggplot2 scale_fill_gradientn theme scale_alpha guides +#' scale_color_gradientn guide_colorbar #' -#' @param object Seurat object +#' @export #' -#' @return Returns a `ggplot2` object showing the by-group inflection points and provided -#' (or default) rank threshold values in grey. +LinkedFeaturePlot <- function( + object, + feature, + dims = 1:2, + reduction = NULL, + image = NULL, + slot = 'data', + alpha = c(0.1, 1), + combine = TRUE +) { + # Setup gadget UI + ui <- miniPage( + gadgetTitleBar( + title = 'LinkedFeaturePlot', + left = NULL + ), + miniContentPanel( + fillRow( + plotOutput( + outputId = 'spatialplot', + height = '100%', + hover = hoverOpts(id = 'sphover', delay = 10, nullOutside = TRUE) + ), + plotOutput( + outputId = 'dimplot', + height = '100%', + hover = hoverOpts(id = 'dimhover', delay = 10, nullOutside = TRUE) + ), + height = '97%' + ), + verbatimTextOutput(outputId = 'info') + ) + ) + # Prepare plotting data + cols <- SpatialColors(n = 100) + image <- image %||% DefaultImage(object = object) + cells.use <- Cells(x = object[[image]]) + reduction <- reduction %||% DefaultDimReduc(object = object) + dims <- dims[1:2] + dims <- paste0(Key(object = object[[reduction]]), dims) + group.data <- FetchData( + object = object, + vars = feature, + cells = cells.use + ) + coords <- GetTissueCoordinates(object = object[[image]]) + embeddings <- Embeddings(object = object[[reduction]])[cells.use, dims] + plot.data <- cbind(coords, group.data, embeddings) + # Setup the server + server <- function(input, output, session) { + plot.env <- reactiveValues() + # Handle events + observeEvent( + eventExpr = input$done, + handlerExpr = { + plots <- list(plot.env$spatialplot, plot.env$dimplot) + if (combine) { + plots <- wrap_plots(plots, ncol = 2) + } + stopApp(returnValue = plots) + } + ) + # Set plots + output$spatialplot <- renderPlot( + expr = { + plot.env$spatialplot <- SingleSpatialPlot( + data = plot.data, + image = object[[image]], + col.by = feature, + pt.size.factor = 1.6, + crop = TRUE, + alpha.by = feature + ) + + scale_fill_gradientn(name = feature, colours = cols) + + theme(legend.position = 'top') + + scale_alpha(range = alpha) + + guides(alpha = FALSE) + plot.env$spatialplot + } + ) + output$dimplot <- renderPlot( + expr = { + plot.env$dimplot <- SingleDimPlot( + data = plot.data, + dims = dims, + col.by = feature + ) + + scale_color_gradientn(name = feature, colours = cols, guide = 'colorbar') + + guides(color = guide_colorbar()) + plot.env$dimplot + } + ) + # Add hover text + output$info <- renderPrint( + expr = { + cell.hover <- rownames(x = nearPoints( + df = plot.data, + coordinfo = if (is.null(x = input[['sphover']])) { + input$dimhover + } else { + InvertCoordinate(x = input$sphover) + }, + threshold = 10, + maxpoints = 1 + )) + # TODO: Get newlines, extra information, and background color working + if (length(x = cell.hover) == 1) { + paste(cell.hover, paste('Expression:', plot.data[cell.hover, feature, drop = TRUE]), collapse = '
') + } else { + NULL + } + } + ) + } + runGadget(app = ui, server = server) +} + +#' Visualize clusters spatially and interactively #' -#' @importFrom methods slot -#' @importFrom cowplot theme_cowplot -#' @importFrom ggplot2 ggplot geom_line geom_vline aes_string +#' @inheritParams DimPlot +#' @inheritParams SpatialPlot +#' @inheritParams LinkedPlots #' -#' @export +#' @return Returns final plot as a ggplot object #' -#' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} -#' @seealso \code{\link{CalculateBarcodeInflections}} \code{\link{SubsetByBarcodeInflections}} +#' @importFrom ggplot2 scale_alpha_ordinal +#' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel +#' @importFrom shiny fillRow plotOutput verbatimTextOutput reactiveValues +#' observeEvent stopApp nearPoints renderPlot runGadget #' -#' @examples -#' pbmc_small <- CalculateBarcodeInflections(pbmc_small, group.column = 'groups') -#' BarcodeInflectionsPlot(pbmc_small) +#' @export #' -BarcodeInflectionsPlot <- function(object) { - cbi.data <- Tool(object = object, slot = 'CalculateBarcodeInflections') - if (is.null(x = cbi.data)) { - stop("Barcode inflections not calculated, please run CalculateBarcodeInflections") - } - ## Extract necessary data frames - inflection_points <- cbi.data$inflection_points - barcode_distribution <- cbi.data$barcode_distribution - threshold_values <- cbi.data$threshold_values - # Set a cap to max rank to avoid plot being overextended - if (threshold_values$rank[[2]] > max(barcode_distribution$rank, na.rm = TRUE)) { - threshold_values$rank[[2]] <- max(barcode_distribution$rank, na.rm = TRUE) - } - ## Infer the grouping/barcode variables - group_var <- colnames(x = barcode_distribution)[1] - barcode_var <- colnames(x = barcode_distribution)[2] - barcode_distribution[, barcode_var] <- log10(x = barcode_distribution[, barcode_var] + 1) - ## Make the plot - plot <- ggplot( - data = barcode_distribution, - mapping = aes_string( - x = 'rank', - y = barcode_var, - group = group_var, - colour = group_var +ISpatialDimPlot <- function( + object, + image = NULL, + group.by = NULL, + alpha = c(0.3, 1) +) { + # Setup gadget UI + ui <- miniPage( + miniButtonBlock(miniTitleBarButton( + inputId = 'done', + label = 'Done', + primary = TRUE + )), + miniContentPanel( + fillRow( + plotOutput( + outputId = 'plot', + height = '100%', + click = clickOpts(id = 'click', clip = TRUE), + hover = hoverOpts(id = 'hover', delay = 10, nullOutside = TRUE) + ), + height = '97%' + ), + verbatimTextOutput(outputId = 'info') ) - ) + - geom_line() + - geom_vline( - data = threshold_values, - aes_string(xintercept = 'rank'), - linetype = "dashed", + ) + # Get plotting data + # Prepare plotting data + image <- image %||% DefaultImage(object = object) + cells.use <- Cells(x = object[[image]]) + group.by <- group.by %||% 'ident' + group.data <- FetchData( + object = object, + vars = group.by, + cells = cells.use + ) + coords <- GetTissueCoordinates(object = object[[image]]) + plot.data <- cbind(coords, group.data) + plot.data$selected_ <- FALSE + Idents(object = object) <- group.by + # Set up the server + server <- function(input, output, session) { + click <- reactiveValues(pt = NULL) + plot.env <- reactiveValues(data = plot.data, alpha.by = NULL) + # Handle events + observeEvent( + eventExpr = input$done, + handlerExpr = stopApp(returnValue = plot.env$plot) + ) + observeEvent( + eventExpr = input$click, + handlerExpr = { + clicked <- nearPoints( + df = plot.data, + coordinfo = InvertCoordinate(x = input$click), + threshold = 10, + maxpoints = 1 + ) + plot.env$data <- if (nrow(x = clicked) == 1) { + cell.clicked <- rownames(x = clicked) + cell.clicked <- rownames(x = clicked) + group.clicked <- plot.data[cell.clicked, group.by, drop = TRUE] + idx.group <- which(x = plot.data[[group.by]] == group.clicked) + plot.data[idx.group, 'selected_'] <- TRUE + plot.data + } else { + plot.data + } + plot.env$alpha.by <- if (any(plot.env$data$selected_)) { + 'selected_' + } else { + NULL + } + } + ) + # Set plot + output$plot <- renderPlot( + expr = { + plot.env$plot <- SingleSpatialPlot( + data = plot.env$data, + image = object[[image]], + col.by = group.by, + crop = TRUE, + alpha.by = plot.env$alpha.by, + pt.size.factor = 1.6 + ) + scale_alpha_ordinal(range = alpha) + NoLegend() + plot.env$plot + } + ) + # Add hover text + output$info <- renderPrint( + expr = { + cell.hover <- rownames(x = nearPoints( + df = plot.data, + coordinfo = InvertCoordinate(x = input$hover), + threshold = 10, + maxpoints = 1 + )) + if (length(x = cell.hover) == 1) { + paste(cell.hover, paste('Group:', plot.data[cell.hover, group.by, drop = TRUE]), collapse = '
') + } else { + NULL + } + } + ) + } + runGadget(app = ui, server = server) +} + +#' Visualize features spatially and interactively +#' +#' @inheritParams FeaturePlot +#' @inheritParams SpatialPlot +#' @inheritParams LinkedPlots +#' +#' @return Returns final plot as a ggplot object +#' +#' @importFrom ggplot2 scale_fill_gradientn theme scale_alpha guides +#' @importFrom miniUI miniPage miniButtonBlock miniTitleBarButton miniContentPanel +#' @importFrom shiny fillRow sidebarPanel sliderInput selectInput reactiveValues +#' observeEvent stopApp observe updateSelectInput plotOutput renderPlot runGadget +#' +#' @export +#' +ISpatialFeaturePlot <- function( + object, + feature, + image = NULL, + slot = 'data', + alpha = c(0.1, 1) +) { + # Set inital data values + assay.keys <- Key(object = object)[Assays(object = object)] + keyed <- sapply(X = assay.keys, FUN = grepl, x = feature) + assay <- if (any(keyed)) { + names(x = which(x = keyed))[1] + } else { + DefaultAssay(object = object) + } + features <- sort(x = rownames(x = GetAssayData( + object = object, + slot = slot, + assay = assay + ))) + feature.label <- 'Feature to visualize' + assays.use <- vapply( + X = Assays(object = object), + FUN = function(x) { + return(!IsMatrixEmpty(x = GetAssayData( + object = object, + slot = slot, + assay = x + ))) + }, + FUN.VALUE = logical(length = 1L) + ) + assays.use <- sort(x = Assays(object = object)[assays.use]) + # Setup gadget UI + ui <- miniPage( + miniButtonBlock(miniTitleBarButton( + inputId = 'done', + label = 'Done', + primary = TRUE + )), + miniContentPanel( + fillRow( + sidebarPanel( + sliderInput( + inputId = 'alpha', + label = 'Alpha intensity', + min = 0, + max = max(alpha), + value = min(alpha), + step = 0.01, + width = '100%' + ), + sliderInput( + inputId = 'pt.size', + label = 'Point size', + min = 0, + max = 5, + value = 1.6, + step = 0.1, + width = '100%' + ), + selectInput( + inputId = 'assay', + label = 'Assay', + choices = assays.use, + selected = assay, + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'feature', + label = feature.label, + choices = features, + selected = feature, + selectize = FALSE, + width = '100%' + ), + selectInput( + inputId = 'palette', + label = 'Color scheme', + choices = names(x = FeaturePalettes), + selected = 'Spatial', + selectize = FALSE, + width = '100%' + ), + width = '100%' + ), + plotOutput(outputId = 'plot', height = '100%'), + flex = c(1, 4) + ) + ) + ) + # Prepare plotting data + image <- image %||% DefaultImage(object = object) + cells.use <- Cells(x = object[[image]]) + coords <- GetTissueCoordinates(object = object[[image]]) + feature.data <- FetchData( + object = object, + vars = feature, + cells = cells.use, + slot = slot + ) + plot.data <- cbind(coords, feature.data) + server <- function(input, output, session) { + plot.env <- reactiveValues( + data = plot.data, + feature = feature, + palette = 'Spatial' + ) + # Observe events + observeEvent( + eventExpr = input$done, + handlerExpr = stopApp(returnValue = plot.env$plot) + ) + observe(x = { + assay <- input$assay + feature.use <- input$feature + features.assay <- sort(x = rownames(x = GetAssayData( + object = object, + slot = slot, + assay = assay + ))) + feature.use <- ifelse( + test = feature.use %in% features.assay, + yes = feature.use, + no = features.assay[1] + ) + updateSelectInput( + session = session, + inputId = 'assay', + label = 'Assay', + choices = assays.use, + selected = assay + ) + updateSelectInput( + session = session, + inputId = 'feature', + label = feature.label, + choices = features.assay, + selected = feature.use + ) + }) + observe(x = { + feature.use <- input$feature + try( + expr = { + feature.data <- FetchData( + object = object, + vars = paste0(Key(object = object[[input$assay]]), feature.use), + cells = cells.use, + slot = slot + ) + colnames(x = feature.data) <- feature.use + plot.env$data <- cbind(coords, feature.data) + plot.env$feature <- feature.use + }, + silent = TRUE + ) + }) + observe(x = { + plot.env$palette <- input$palette + }) + # Create plot + output$plot <- renderPlot(expr = { + plot.env$plot <- SingleSpatialPlot( + data = plot.env$data, + image = object[[image]], + col.by = plot.env$feature, + pt.size.factor = input$pt.size, + crop = TRUE, + alpha.by = plot.env$feature + ) + + # scale_fill_gradientn(name = plot.env$feature, colours = cols) + + scale_fill_gradientn(name = plot.env$feature, colours = FeaturePalettes[[plot.env$palette]]) + + theme(legend.position = 'top') + + scale_alpha(range = c(input$alpha, 1)) + + guides(alpha = FALSE) + plot.env$plot + }) + } + runGadget(app = ui, server = server) +} + +#' Visualize spatial clustering and expression data. +#' +#' SpatialPlot plots a feature or discrete grouping (e.g. cluster assignments) as +#' spots over the image that was collected. We also provide SpatialFeaturePlot +#' and SpatialDimPlot as wrapper functions around SpatialPlot for a consistent +#' naming framework. +#' +#' @inheritParams HoverLocator +#' @param object A Seurat object +#' @param group.by Name of meta.data column to group the data by +#' @param features Name of the feature to visualize. Provide either group.by OR +#' features, not both. +#' @param images Name of the images to use in the plot(s) +#' @param cols Vector of colors, each color corresponds to an identity class. +#' This may also be a single character or numeric value corresponding to a +#' palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By +#' default, ggplot2 assigns colors +#' @param image.alpha Adjust the opacity of the background images. Set to 0 to +#' remove. +#' @param crop Crop the plot in to focus on points plotted. Set to FALSE to show +#' entire background image. +#' @param slot If plotting a feature, which data slot to pull from (counts, +#' data, or scale.data) +#' @param min.cutoff,max.cutoff Vector of minimum and maximum cutoff +#' values for each feature, may specify quantile in the form of 'q##' where '##' +#' is the quantile (eg, 'q1', 'q10') +#' @param cells.highlight A list of character or numeric vectors of cells to +#' highlight. If only one group of cells desired, can simply pass a vector +#' instead of a list. If set, colors selected cells to the color(s) in +#' cols.highlight +#' @param cols.highlight A vector of colors to highlight the cells as; ordered +#' the same as the groups in cells.highlight; last color corresponds to +#' unselected cells. +#' @param facet.highlight When highlighting certain groups of cells, split each +#' group into its own plot +#' @param label Whether to label the clusters +#' @param label.size Sets the size of the labels +#' @param label.color Sets the color of the label text +#' @param label.box Whether to put a box around the label text (geom_text vs +#' geom_label) +#' @param repel Repels the labels to prevent overlap +#' @param ncol Number of columns if plotting multiple plots +#' @param combine Combine plots into a single gg object; note that if TRUE; +#' themeing will not work when plotting multiple features/groupings +#' @param pt.size.factor Scale the size of the spots. +#' @param alpha Controls opacity of spots. Provide as a vector specifying the +#' min and max +#' @param stroke Control the width of the border around the spots +#' @param interactive Launch an interactive SpatialDimPlot or SpatialFeaturePlot +#' session, see \code{\link{ISpatialDimPlot}} or +#' \code{\link{ISpatialFeaturePlot}} for more details +#' @param do.identify,do.hover DEPRECATED in favor of \code{interactive} +#' @param identify.ident DEPRECATED +#' +#' @return If \code{do.identify}, either a vector of cells selected or the object +#' with selected cells set to the value of \code{identify.ident} (if set). Else, +#' if \code{do.hover}, a plotly object with interactive graphics. Else, a ggplot +#' object +#' +#' @importFrom ggplot2 scale_fill_gradientn ggtitle theme element_text scale_alpha +#' @importFrom patchwork wrap_plots +#' @export +#' +#' @examples +#' \dontrun{ +#' # For functionality analagous to FeaturePlot +#' SpatialPlot(seurat.object, features = "MS4A1") +#' SpatialFeaturePlot(seurat.object, features = "MS4A1") +#' +#' # For functionality analagous to DimPlot +#' SpatialPlot(seurat.object, group.by = "clusters") +#' SpatialDimPlot(seurat.object, group.by = "clusters") +#' } +#' +SpatialPlot <- function( + object, + group.by = NULL, + features = NULL, + images = NULL, + cols = NULL, + image.alpha = 1, + crop = TRUE, + slot = 'data', + min.cutoff = NA, + max.cutoff = NA, + cells.highlight = NULL, + cols.highlight = c('#DE2D26', 'grey50'), + facet.highlight = FALSE, + label = FALSE, + label.size = 5, + label.color = 'white', + label.box = TRUE, + repel = FALSE, + ncol = NULL, + combine = TRUE, + pt.size.factor = 1.6, + alpha = c(1, 1), + stroke = 0.25, + interactive = FALSE, + do.identify = FALSE, + identify.ident = NULL, + do.hover = FALSE, + information = NULL +) { + if (isTRUE(x = do.hover) || isTRUE(x = do.identify)) { + warning( + "'do.hover' and 'do.identify' are deprecated as we are removing plotly-based interactive graphics, use 'interactive' instead for Shiny-based interactivity", + call. = FALSE, + immediate. = TRUE + ) + interactive <- TRUE + } + if (!is.null(x = group.by) & !is.null(x = features)) { + stop("Please specific either group.by or features, not both.") + } + images <- images %||% Images(object = object, assay = DefaultAssay(object = object)) + if (is.null(x = features)) { + if (interactive) { + return(ISpatialDimPlot( + object = object, + image = image, + group.by = group.by, + alpha = alpha + )) + } + group.by <- group.by %||% 'ident' + object[['ident']] <- Idents(object = object) + data <- object[[group.by]] + for (group in group.by) { + if (!is.factor(x = data[, group])) { + data[, group] <- factor(x = data[, group]) + } + } + } else { + if (interactive) { + return(ISpatialFeaturePlot( + object = object, + feature = features[1], + image = images[1], + slot = slot, + alpha = alpha + )) + } + data <- FetchData( + object = object, + vars = features, + slot = slot + ) + features <- colnames(x = data) + # Determine cutoffs + min.cutoff <- mapply( + FUN = function(cutoff, feature) { + return(ifelse( + test = is.na(x = cutoff), + yes = min(data[, feature]), + no = cutoff + )) + }, + cutoff = min.cutoff, + feature = features + ) + max.cutoff <- mapply( + FUN = function(cutoff, feature) { + return(ifelse( + test = is.na(x = cutoff), + yes = max(data[, feature]), + no = cutoff + )) + }, + cutoff = max.cutoff, + feature = features + ) + check.lengths <- unique(x = vapply( + X = list(features, min.cutoff, max.cutoff), + FUN = length, + FUN.VALUE = numeric(length = 1) + )) + if (length(x = check.lengths) != 1) { + stop("There must be the same number of minimum and maximum cuttoffs as there are features") + } + # Apply cutoffs + data <- sapply( + X = 1:ncol(x = data), + FUN = function(index) { + data.feature <- as.vector(x = data[, index]) + min.use <- SetQuantile(cutoff = min.cutoff[index], data.feature) + max.use <- SetQuantile(cutoff = max.cutoff[index], data.feature) + data.feature[data.feature < min.use] <- min.use + data.feature[data.feature > max.use] <- max.use + return(data.feature) + } + ) + colnames(x = data) <- features + rownames(x = data) <- Cells(x = object) + } + if (length(x = images) == 0) { + images <- Images(object = object) + } + if (length(x = images) < 1) { + stop("Could not find any spatial image information") + } + features <- colnames(x = data) + colnames(x = data) <- features + rownames(x = data) <- colnames(x = object) + facet.highlight <- facet.highlight && (!is.null(x = cells.highlight) && is.list(x = cells.highlight)) + if (do.hover) { + if (length(x = images) > 1) { + images <- images[1] + warning( + "'do.hover' requires only one image, using image ", + images, + call. = FALSE, + immediate. = TRUE + ) + } + if (length(x = features) > 1) { + features <- features[1] + type <- ifelse(test = is.null(x = group.by), yes = 'feature', no = 'grouping') + warning( + "'do.hover' requires only one ", + type, + ", using ", + features, + call. = FALSE, + immediate. = TRUE + ) + } + if (facet.highlight) { + warning( + "'do.hover' requires no faceting highlighted cells", + call. = FALSE, + immediate. = TRUE + ) + facet.highlight <- FALSE + } + } + if (facet.highlight) { + if (length(x = images) > 1) { + images <- images[1] + warning( + "Faceting the highlight only works with a single image, using image ", + images, + call. = FALSE, + immediate. = TRUE + ) + } + ncols <- length(x = cells.highlight) + } else { + ncols <- length(x = images) + } + plots <- vector( + mode = "list", + length = length(x = features) * ncols + ) + for (i in 1:ncols) { + plot.idx <- i + image.idx <- ifelse(test = facet.highlight, yes = 1, no = i) + image.use <- object[[images[[image.idx]]]] + coordinates <- GetTissueCoordinates(object = image.use) + highlight.use <- if (facet.highlight) { + cells.highlight[i] + } else { + cells.highlight + } + for (j in 1:length(x = features)) { + cols.unset <- is.factor(x = data[, features[j]]) && is.null(x = cols) + if (cols.unset) { + cols <- hue_pal()(n = length(x = levels(x = data[, features[j]]))) + names(x = cols) <- levels(x = data[, features[j]]) + } + plot <- SingleSpatialPlot( + data = cbind( + coordinates, + data[rownames(x = coordinates), features[j], drop = FALSE] + ), + image = image.use, + image.alpha = image.alpha, + col.by = features[j], + cols = cols, + alpha.by = if (is.null(x = group.by)) { + features[j] + } else { + NULL + }, + geom = if (inherits(x = image.use, what = "STARmap")) { + 'poly' + } else { + 'spatial' + }, + cells.highlight = highlight.use, + cols.highlight = cols.highlight, + pt.size.factor = pt.size.factor, + stroke = stroke, + crop = crop + ) + if (is.null(x = group.by)) { + plot <- plot + + scale_fill_gradientn( + name = features[j], + colours = SpatialColors(n = 100) + ) + + theme(legend.position = 'top') + + scale_alpha(range = alpha) + + guides(alpha = FALSE) + } else if (label) { + plot <- LabelClusters( + plot = plot, + id = ifelse( + test = is.null(x = cells.highlight), + yes = features[j], + no = 'highlight' + ), + geom = if (inherits(x = image.use, what = "STARmap")) { + 'GeomPolygon' + } else { + 'GeomSpatial' + }, + repel = repel, + size = label.size, + color = label.color, + box = label.box, + position = "nearest" + ) + } + if (j == 1 && length(x = images) > 1 && !facet.highlight) { + plot <- plot + + ggtitle(label = images[[image.idx]]) + + theme(plot.title = element_text(hjust = 0.5)) + } + if (facet.highlight) { + plot <- plot + + ggtitle(label = names(x = cells.highlight)[i]) + + theme(plot.title = element_text(hjust = 0.5)) + + NoLegend() + } + plots[[plot.idx]] <- plot + plot.idx <- plot.idx + ncols + if (cols.unset) { + cols <- NULL + } + } + } + # if (do.identify) { + # return(CellSelector( + # plot = plot, + # object = identify.ident %iff% object, + # ident = identify.ident + # )) + # } else if (do.hover) { + # return(HoverLocator( + # plot = plots[[1]], + # information = information %||% data[, features, drop = FALSE], + # axes = FALSE, + # # cols = c('size' = 'point.size.factor', 'colour' = 'fill'), + # images = GetImage(object = object, mode = 'plotly', image = images) + # )) + # } + if (length(x = images) > 1 && combine) { + plots <- wrap_plots(plots = plots, ncol = length(x = images)) + } else if (length(x = images == 1) && combine) { + plots <- wrap_plots(plots = plots, ncol = ncol) + } + return(plots) +} + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# Other plotting functions +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +#' ALRA Approximate Rank Selection Plot +#' +#' Plots the results of the approximate rank selection process for ALRA. +#' +#' @note ALRAChooseKPlot and associated functions are being moved to SeuratWrappers; +#' for more information on SeuratWrappers, please see \url{https://github.com/satijalab/seurat-wrappers} +#' +#' @param object Seurat object +#' @param start Index to start plotting singular value spacings from. +#' The transition from "signal" to "noise" in the is hard to see because the +#' first singular value spacings are so large. Nicer visualizations result from +#' skipping the first few. If set to 0 (default) starts from k/2. +#' @param combine Combine plots into a single \code{\link[patchwork]{patchwork}ed} +#' ggplot object. If \code{FALSE}, return a list of ggplot objects +#' +#' @return A list of 3 \code{\link[patchwork]{patchwork}ed} ggplot objects +#' splotting the singular values, the spacings of the singular values, and the +#' p-values of the singular values. +#' +#' @author Jun Zhao, George Linderman +#' @seealso \code{\link{RunALRA}} +#' +#' @importFrom cowplot theme_cowplot +#' @importFrom ggplot2 ggplot aes_string geom_point geom_line +#' geom_vline scale_x_continuous labs +#' @importFrom patchwork wrap_plots +#' @export +#' +ALRAChooseKPlot <- function(object, start = 0, combine = TRUE) { + .Deprecated( + new = 'SeruatWrappers::ALRAChooseKPlot', + msg = paste( + 'ALRAChooseKPlot and associated functions are being moved to SeuratWrappers;', + 'for more information on SeuratWrappers, please see https://github.com/satijalab/seurat-wrappers' + ) + ) + alra.data <- Tool(object = object, slot = 'RunALRA') + if (is.null(x = alra.data)) { + stop('RunALRA should be run prior to using this function.') + } + d <- alra.data[["d"]] + diffs <- alra.data[["diffs"]] + k <- alra.data[["k"]] + if (start == 0) { + start <- floor(x = k / 2) + } + if (start > k) { + stop("Plots should include k (i.e. starting.from should be less than k)") + } + breaks <- seq(from = 10, to = length(x = d), by = 10) + ggdata <- data.frame(x = 1:length(x = d), y = d) + gg1 <- ggplot(data = ggdata, mapping = aes_string(x = 'x', y = 'y')) + + geom_point(size = 1) + + geom_line(size = 0.5) + + geom_vline(xintercept = k) + + theme_cowplot() + + scale_x_continuous(breaks = breaks) + + labs(x = NULL, y = 's_i', title = 'Singular values') + ggdata <- data.frame(x = 1:(length(x = d) - 1), y = diffs)[-(1:(start - 1)), ] + gg2 <- ggplot(data = ggdata, mapping = aes_string(x = 'x', y = 'y')) + + geom_point(size = 1) + + geom_line(size = 0.5) + + geom_vline(xintercept = k + 1) + + theme_cowplot() + + scale_x_continuous(breaks = breaks) + + labs(x = NULL, y = 's_{i} - s_{i-1}', title = 'Singular value spacings') + plots <- list(spectrum = gg1, spacings = gg2) + if (combine) { + plots <- wrap_plots(plots) + } + return(plots) +} + +#' Plot the Barcode Distribution and Calculated Inflection Points +#' +#' This function plots the calculated inflection points derived from the barcode-rank +#' distribution. +#' +#' See [CalculateBarcodeInflections()] to calculate inflection points and +#' [SubsetByBarcodeInflections()] to subsequently subset the Seurat object. +#' +#' @param object Seurat object +#' +#' @return Returns a `ggplot2` object showing the by-group inflection points and provided +#' (or default) rank threshold values in grey. +#' +#' @importFrom methods slot +#' @importFrom cowplot theme_cowplot +#' @importFrom ggplot2 ggplot geom_line geom_vline aes_string +#' +#' @export +#' +#' @author Robert A. Amezquita, \email{robert.amezquita@fredhutch.org} +#' @seealso \code{\link{CalculateBarcodeInflections}} \code{\link{SubsetByBarcodeInflections}} +#' +#' @examples +#' pbmc_small <- CalculateBarcodeInflections(pbmc_small, group.column = 'groups') +#' BarcodeInflectionsPlot(pbmc_small) +#' +BarcodeInflectionsPlot <- function(object) { + cbi.data <- Tool(object = object, slot = 'CalculateBarcodeInflections') + if (is.null(x = cbi.data)) { + stop("Barcode inflections not calculated, please run CalculateBarcodeInflections") + } + ## Extract necessary data frames + inflection_points <- cbi.data$inflection_points + barcode_distribution <- cbi.data$barcode_distribution + threshold_values <- cbi.data$threshold_values + # Set a cap to max rank to avoid plot being overextended + if (threshold_values$rank[[2]] > max(barcode_distribution$rank, na.rm = TRUE)) { + threshold_values$rank[[2]] <- max(barcode_distribution$rank, na.rm = TRUE) + } + ## Infer the grouping/barcode variables + group_var <- colnames(x = barcode_distribution)[1] + barcode_var <- colnames(x = barcode_distribution)[2] + barcode_distribution[, barcode_var] <- log10(x = barcode_distribution[, barcode_var] + 1) + ## Make the plot + plot <- ggplot( + data = barcode_distribution, + mapping = aes_string( + x = 'rank', + y = barcode_var, + group = group_var, + colour = group_var + ) + ) + + geom_line() + + geom_vline( + data = threshold_values, + aes_string(xintercept = 'rank'), + linetype = "dashed", colour = 'grey60', size = 0.5 ) + @@ -1896,20 +3189,27 @@ BarcodeInflectionsPlot <- function(object) { #' #' @param object Seurat object #' @param assay Name of assay to use, defaults to the active assay -#' @param features Input vector of features -#' @param cols Colors to plot, can pass a single character giving the name of -#' a palette from \code{RColorBrewer::brewer.pal.info} -#' @param col.min Minimum scaled average expression threshold (everything smaller -#' will be set to this) +#' @param features Input vector of features, or named list of feature vectors +#' if feature-grouped panels are desired (replicates the functionality of the +#' old SplitDotPlotGG) +#' @param cols Colors to plot: the name of a palette from +#' \code{RColorBrewer::brewer.pal.info}, a pair of colors defining a gradient, +#' or 3+ colors defining multiple gradients (if split.by is set) +#' @param col.min Minimum scaled average expression threshold (everything +#' smaller will be set to this) #' @param col.max Maximum scaled average expression threshold (everything larger #' will be set to this) #' @param dot.min The fraction of cells at which to draw the smallest dot #' (default is 0). All cell groups with less than this expressing the given #' gene will have no dot drawn. #' @param dot.scale Scale the size of the points, similar to cex +#' @param idents Identity classes to include in plot (default is all) #' @param group.by Factor to group the cells by -#' @param split.by Factor to split the groups by (replicates the functionality of the old SplitDotPlotGG); +#' @param split.by Factor to split the groups by (replicates the functionality +#' of the old SplitDotPlotGG); #' see \code{\link{FetchData}} for more details +#' @param cluster.idents Whether to order identities by hierarchical clusters +#' based on given features, default is FALSE #' @param scale Determine whether the data is scaled, TRUE for default #' @param scale.by Scale the size of the points by 'size' or by 'radius' #' @param scale.min Set lower limit for scaling, use NA for default @@ -1919,8 +3219,13 @@ BarcodeInflectionsPlot <- function(object) { #' #' @importFrom grDevices colorRampPalette #' @importFrom cowplot theme_cowplot -#' @importFrom ggplot2 ggplot aes_string scale_size scale_radius geom_point theme element_blank labs -#' scale_color_identity scale_color_distiller scale_color_gradient guides guide_legend guide_colorbar +#' @importFrom ggplot2 ggplot aes_string scale_size scale_radius geom_point +#' theme element_blank labs scale_color_identity scale_color_distiller +#' scale_color_gradient guides guide_legend guide_colorbar +#' facet_grid unit +#' @importFrom stats dist hclust +#' @importFrom RColorBrewer brewer.pal.info +#' #' @export #' #' @aliases SplitDotPlotGG @@ -1941,8 +3246,10 @@ DotPlot <- function( col.max = 2.5, dot.min = 0, dot.scale = 6, + idents = NULL, group.by = NULL, split.by = NULL, + cluster.idents = FALSE, scale = TRUE, scale.by = 'radius', scale.min = NA, @@ -1950,17 +3257,37 @@ DotPlot <- function( ) { assay <- assay %||% DefaultAssay(object = object) DefaultAssay(object = object) <- assay + split.colors <- !is.null(x = split.by) && !any(cols %in% rownames(x = brewer.pal.info)) scale.func <- switch( EXPR = scale.by, 'size' = scale_size, 'radius' = scale_radius, stop("'scale.by' must be either 'size' or 'radius'") ) - data.features <- FetchData(object = object, vars = features) + feature.groups <- NULL + if (is.list(features) | any(!is.na(names(features)))) { + feature.groups <- unlist(x = sapply( + X = 1:length(features), + FUN = function(x) { + return(rep(x = names(x = features)[x], each = length(features[[x]]))) + } + )) + if (any(is.na(x = feature.groups))) { + warning( + "Some feature groups are unnamed.", + call. = FALSE, + immediate. = TRUE + ) + } + features <- unlist(x = features) + names(x = feature.groups) <- features + } + cells <- unlist(x = CellsByIdentities(object = object, idents = idents)) + data.features <- FetchData(object = object, vars = features, cells = cells) data.features$id <- if (is.null(x = group.by)) { - Idents(object = object) + Idents(object = object)[cells, drop = TRUE] } else { - object[[group.by, drop = TRUE]] + object[[group.by, drop = TRUE]][cells, drop = TRUE] } if (!is.factor(x = data.features$id)) { data.features$id <- factor(x = data.features$id) @@ -1968,12 +3295,14 @@ DotPlot <- function( id.levels <- levels(x = data.features$id) data.features$id <- as.vector(x = data.features$id) if (!is.null(x = split.by)) { - splits <- object[[split.by, drop = TRUE]] - if (length(x = unique(x = splits)) > length(x = cols)) { - stop("Not enought colors for the number of groups") + splits <- object[[split.by, drop = TRUE]][cells, drop = TRUE] + if (split.colors) { + if (length(x = unique(x = splits)) > length(x = cols)) { + stop("Not enough colors for the number of groups") + } + cols <- cols[1:length(x = unique(x = splits))] + names(x = cols) <- unique(x = splits) } - cols <- cols[1:length(x = unique(x = splits))] - names(x = cols) <- unique(x = splits) data.features$id <- paste(data.features$id, splits, sep = '_') unique.splits <- unique(x = splits) id.levels <- paste0(rep(x = id.levels, each = length(x = unique.splits)), "_", rep(x = unique(x = splits), times = length(x = id.levels))) @@ -1994,6 +3323,14 @@ DotPlot <- function( } ) names(x = data.plot) <- unique(x = data.features$id) + if (cluster.idents) { + mat <- do.call( + what = rbind, + args = lapply(X = data.plot, FUN = unlist) + ) + mat <- scale(x = mat) + id.levels <- id.levels[hclust(d = dist(x = mat))$order] + } data.plot <- lapply( X = names(x = data.plot), FUN = function(x) { @@ -2007,38 +3344,39 @@ DotPlot <- function( if (!is.null(x = id.levels)) { data.plot$id <- factor(x = data.plot$id, levels = id.levels) } - if (length(x = levels(x = data.plot$id)) == 1) { - scale <- FALSE - warning("Only one identity present, the expression values will be not scaled.") - } - avg.exp.scaled <- sapply( - X = unique(x = data.plot$features.plot), - FUN = function(x) { - data.use <- data.plot[data.plot$features.plot == x, 'avg.exp'] - if (scale) { - data.use <- scale(x = data.use) - data.use <- MinMax(data = data.use, min = col.min, max = col.max) - } else { - data.use <- log(x = data.use) - } - return(data.use) - } + if (length(x = levels(x = data.plot$id)) == 1) { + scale <- FALSE + warning( + "Only one identity present, the expression values will be not scaled", + call. = FALSE, + immediate. = TRUE ) - - - + } + avg.exp.scaled <- sapply( + X = unique(x = data.plot$features.plot), + FUN = function(x) { + data.use <- data.plot[data.plot$features.plot == x, 'avg.exp'] + if (scale) { + data.use <- scale(x = data.use) + data.use <- MinMax(data = data.use, min = col.min, max = col.max) + } else { + data.use <- log(x = data.use) + } + return(data.use) + } + ) avg.exp.scaled <- as.vector(x = t(x = avg.exp.scaled)) - if (!is.null(x = split.by)) { + if (split.colors) { avg.exp.scaled <- as.numeric(x = cut(x = avg.exp.scaled, breaks = 20)) } data.plot$avg.exp.scaled <- avg.exp.scaled data.plot$features.plot <- factor( x = data.plot$features.plot, - levels = rev(x = features) + levels = features ) data.plot$pct.exp[data.plot$pct.exp < dot.min] <- NA data.plot$pct.exp <- data.plot$pct.exp * 100 - if (!is.null(x = split.by)) { + if (split.colors) { splits.use <- vapply( X = as.character(x = data.plot$id), FUN = gsub, @@ -2059,13 +3397,19 @@ DotPlot <- function( value = avg.exp.scaled ) } - color.by <- ifelse(test = is.null(x = split.by), yes = 'avg.exp.scaled', no = 'colors') + color.by <- ifelse(test = split.colors, yes = 'colors', no = 'avg.exp.scaled') if (!is.na(x = scale.min)) { data.plot[data.plot$pct.exp < scale.min, 'pct.exp'] <- scale.min } if (!is.na(x = scale.max)) { data.plot[data.plot$pct.exp > scale.max, 'pct.exp'] <- scale.max } + if (!is.null(x = feature.groups)) { + data.plot$feature.groups <- factor( + x = feature.groups[data.plot$features.plot], + levels = unique(x = feature.groups) + ) + } plot <- ggplot(data = data.plot, mapping = aes_string(x = 'features.plot', y = 'id')) + geom_point(mapping = aes_string(size = 'pct.exp', color = color.by)) + scale.func(range = c(0, dot.scale), limits = c(scale.min, scale.max)) + @@ -2076,14 +3420,25 @@ DotPlot <- function( y = ifelse(test = is.null(x = split.by), yes = 'Identity', no = 'Split Identity') ) + theme_cowplot() - if (!is.null(x = split.by)) { + if (!is.null(x = feature.groups)) { + plot <- plot + facet_grid( + facets = ~feature.groups, + scales = "free_x", + space = "free_x", + switch = "y" + ) + theme( + panel.spacing = unit(x = 1, units = "lines"), + strip.background = element_blank() + ) + } + if (split.colors) { plot <- plot + scale_color_identity() } else if (length(x = cols) == 1) { plot <- plot + scale_color_distiller(palette = cols) } else { plot <- plot + scale_color_gradient(low = cols[1], high = cols[2]) } - if (is.null(x = split.by)) { + if (!split.colors) { plot <- plot + guides(color = guide_colorbar(title = 'Average Expression')) } return(plot) @@ -2133,6 +3488,55 @@ ElbowPlot <- function(object, ndims = 20, reduction = 'pca') { return(plot) } +#' Boxplot of correlation of a variable (e.g. number of UMIs) with expression +#' data +#' +#' @param object Seurat object +#' @param assay Assay where the feature grouping info and correlations are +#' stored +#' @param feature.group Name of the column in meta.features where the feature +#' grouping info is stored +#' @param cor Name of the column in meta.features where correlation info is +#' stored +#' +#' @return Returns a ggplot boxplot of correlations split by group +#' +#' @importFrom ggplot2 geom_boxplot scale_fill_manual geom_hline +#' @importFrom cowplot theme_cowplot +#' @importFrom scales brewer_pal +#' @importFrom stats complete.cases +#' +#' @export +#' +GroupCorrelationPlot <- function( + object, + assay = NULL, + feature.group = "feature.grp", + cor = "nCount_RNA_cor" +) { + assay <- assay %||% DefaultAssay(object = object) + data <- object[[assay]][[c(feature.group, cor)]] + data <- data[complete.cases(data), ] + colnames(x = data) <- c('grp', 'cor') + plot <- ggplot(data = data, aes_string(x = "grp", y = "cor", fill = "grp")) + + geom_boxplot() + + theme_cowplot() + + scale_fill_manual(values = rev(x = brewer_pal(palette = 'YlOrRd')(n = 7))) + + ylab(paste( + "Correlation with", + gsub(x = cor, pattern = "_cor", replacement = "") + )) + + geom_hline(yintercept = 0) + + NoLegend() + + theme( + axis.line.x = element_blank(), + axis.title.x = element_blank(), + axis.ticks.x = element_blank(), + axis.text.x = element_blank() + ) + return(plot) +} + #' JackStraw Plot #' #' Plots the results of the JackStraw analysis for PCA significance. For each @@ -2387,6 +3791,50 @@ AugmentPlot <- function(plot, width = 10, height = 10, dpi = 100) { return(blank) } +#' Determine text color based on background color +#' +#' @param background A vector of background colors; supports R color names and +#' hexadecimal codes +#' @param threshold Intensity threshold for light/dark cutoff; intensities +#' greater than \code{theshold} yield \code{dark}, others yield \code{light} +#' @param w3c Use \href{http://www.w3.org/TR/WCAG20/}{W3C} formula for calculating +#' background text color; ignores \code{threshold} +#' @param dark Color for dark text +#' @param light Color for light text +#' +#' @return A named vector of either \code{dark} or \code{light}, depending on +#' \code{background}; names of vector are \code{background} +#' +#' @export +#' +#' @source \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} +#' +#' @examples +#' BGTextColor(background = c('black', 'white', '#E76BF3')) +#' +BGTextColor <- function( + background, + threshold = 186, + w3c = FALSE, + dark = 'black', + light = 'white' +) { + if (w3c) { + luminance <- Luminance(color = background) + threshold <- 179 + return(ifelse( + test = luminance > sqrt(x = 1.05 * 0.05) - 0.05, + yes = dark, + no = light + )) + } + return(ifelse( + test = Intensity(color = background) > threshold, + yes = dark, + no = light + )) +} + #' @inheritParams CustomPalette #' #' @export @@ -2417,26 +3865,28 @@ BlueAndRed <- function(k = 50) { return(CustomPalette(low = "#313695" , high = "#A50026", mid = "#FFFFBF", k = k)) } -#' Cell selector +#' Cell Selector #' #' Select points on a scatterplot and get information about them #' #' @param plot A ggplot2 plot -#' @param object An optional Seurat object; if passes, will return an object with -#' the identities of selected cells set to \code{ident} +#' @param object An optional Seurat object; if passes, will return an object +#' with the identities of selected cells set to \code{ident} #' @param ident An optional new identity class to assign the selected cells -#' @param ... Extra parameters, such as dark.theme, recolor, or smooth for using a dark theme, -#' recoloring based on selected cells, or using a smooth scatterplot, respectively +#' @param ... Ignored #' -#' @return If \code{object} is \code{NULL}, the names of the points selected; otherwise, -#' a Seurat object with the selected cells identity classes set to \code{ident} +#' @return If \code{object} is \code{NULL}, the names of the points selected; +#' otherwise, a Seurat object with the selected cells identity classes set to +#' \code{ident} +#' +#' @importFrom miniUI miniPage gadgetTitleBar miniTitleBarButton +#' miniContentPanel +#' @importFrom shiny fillRow plotOutput brushOpts reactiveValues observeEvent +#' stopApp brushedPoints renderPlot runGadget #' -#' @importFrom ggplot2 ggplot_build #' @export #' -# @aliases FeatureLocator -#' @seealso \code{\link[graphics]{locator}} \code{\link[ggplot2]{ggplot_build}} -#' \code{\link[SDMTools]{pnt.in.poly}} \code{\link{DimPlot}} \code{\link{FeaturePlot}} +#' @seealso \code{\link{DimPlot}} \code{\link{FeaturePlot}} #' #' @examples #' \dontrun{ @@ -2449,17 +3899,100 @@ BlueAndRed <- function(k = 50) { #' } #' CellSelector <- function(plot, object = NULL, ident = 'SelectedCells', ...) { - located <- PointLocator(plot = plot, ...) - data <- ggplot_build(plot = plot)$plot$data - selected <- rownames(x = data[as.numeric(x = rownames(x = located)), ]) - if (inherits(x = object, what = 'Seurat')) { - if (!all(selected %in% Cells(x = object))) { - stop("Cannot find selected cells in the Seurat object, please be sure you pass the same object used to generate the plot", call. = FALSE) + # Set up the gadget UI + ui <- miniPage( + gadgetTitleBar( + title = "Cell Selector", + left = miniTitleBarButton(inputId = "reset", label = "Reset") + ), + miniContentPanel( + fillRow( + plotOutput( + outputId = "plot", + height = '100%', + brush = brushOpts( + id = 'brush', + delay = 100, + delayType = 'debounce', + clip = TRUE, + resetOnNew = FALSE + ) + ) + ), + ) + ) + # Get some plot information + if (inherits(x = plot, what = 'patchwork')) { + if (length(x = plot$patches$plots)) { + warning( + "Multiple plots passed, using last plot", + call. = FALSE, + immediate. = TRUE + ) } - Idents(object = object, cells = selected) <- ident - return(object) + class(x = plot) <- grep( + pattern = 'patchwork', + x = class(x = plot), + value = TRUE, + invert = TRUE + ) } - return(selected) + xy.aes <- GetXYAesthetics(plot = plot) + dark.theme <- !is.null(x = plot$theme$plot.background$fill) && + plot$theme$plot.background$fill == 'black' + plot.data <- GGpointToBase(plot = plot, do.plot = FALSE) + plot.data$selected_ <- FALSE + rownames(x = plot.data) <- rownames(x = plot$data) + # Server function + server <- function(input, output, session) { + plot.env <- reactiveValues(data = plot.data) + # Event handlers + observeEvent( + eventExpr = input$done, + handlerExpr = { + PlotBuild(data = plot.env$data, dark.theme = dark.theme) + selected <- rownames(x = plot.data)[plot.env$data$selected_] + if (inherits(x = object, what = 'Seurat')) { + if (!all(selected %in% Cells(x = object))) { + stop("Cannot find the selected cells in the Seurat object, please be sure you pass the same object used to generate the plot") + } + Idents(object = object, cells = selected) <- ident + selected <- object + } + stopApp(returnValue = selected) + } + ) + observeEvent( + eventExpr = input$reset, + handlerExpr = { + plot.env$data <- plot.data + session$resetBrush(brushId = 'brush') + } + ) + observeEvent( + eventExpr = input$brush, + handlerExpr = { + plot.env$data <- brushedPoints( + df = plot.data, + brush = input$brush, + xvar = xy.aes$x, + yvar = xy.aes$y, + allRows = TRUE + ) + plot.env$data$color <- ifelse( + test = plot.env$data$selected_, + yes = '#DE2D26', + no = '#C3C3C3' + ) + } + ) + # Render the plot + output$plot <- renderPlot(expr = PlotBuild( + data = plot.env$data, + dark.theme = dark.theme + )) + } + return(runGadget(app = ui, server = server)) } #' Move outliers towards center on dimension reduction plot @@ -2756,10 +4289,11 @@ FeatureLocator <- function(plot, ...) { #' @param plot A ggplot2 plot #' @param information An optional dataframe or matrix of extra information to be displayed on hover #' @param dark.theme Plot using a dark theme? -#' @param ... Extra parameters to be passed to \code{plotly::layout} +#' @param axes Display or hide x- and y-axes +#' @param ... Extra parameters to be passed to \code{\link[plotly]{layout}} #' #' @importFrom ggplot2 ggplot_build -#' @importFrom plotly plot_ly layout +#' @importFrom plotly plot_ly layout add_annotations #' @export #' #' @seealso \code{\link[plotly]{layout}} \code{\link[ggplot2]{ggplot_build}} @@ -2774,53 +4308,37 @@ FeatureLocator <- function(plot, ...) { HoverLocator <- function( plot, information = NULL, + axes = TRUE, dark.theme = FALSE, ... ) { - # Use GGpointToBase because we already have ggplot objects - # with colors (which are annoying in plotly) - plot.build <- GGpointToBase(plot = plot, do.plot = FALSE) + # Use GGpointToBase because we already have ggplot objects + # with colors (which are annoying in plotly) + plot.build <- suppressWarnings(expr = GGpointToPlotlyBuild( + plot = plot, + information = information, + ... + )) data <- ggplot_build(plot = plot)$plot$data - rownames(x = plot.build) <- rownames(x = data) - # Reset the names to 'x' and 'y' - names(x = plot.build) <- c( - 'x', - 'y', - names(x = plot.build)[3:length(x = plot.build)] - ) - # Add the names we're looking for (eg. cell name, gene name) - if (is.null(x = information)) { - plot.build$feature <- rownames(x = data) - } else { - info <- apply( - X = information, - MARGIN = 1, - FUN = function(x, names) { - return(paste0(names, ': ', x, collapse = '
')) - }, - names = colnames(x = information) + # Set up axis labels here + # Also, a bunch of stuff to get axis lines done properly + if (axes) { + xaxis <- list( + title = names(x = data)[1], + showgrid = FALSE, + zeroline = FALSE, + showline = TRUE ) - data.info <- data.frame( - feature = paste(rownames(x = information), info, sep = '
'), - row.names = rownames(x = information) + yaxis <- list( + title = names(x = data)[2], + showgrid = FALSE, + zeroline = FALSE, + showline = TRUE ) - plot.build <- merge(x = plot.build, y = data.info, by = 0) + } else { + xaxis <- yaxis <- list(visible = FALSE) } - # Set up axis labels here - # Also, a bunch of stuff to get axis lines done properly - xaxis <- list( - title = names(x = data)[1], - showgrid = FALSE, - zeroline = FALSE, - showline = TRUE - ) - yaxis <- list( - title = names(x = data)[2], - showgrid = FALSE, - zeroline = FALSE, - showline = TRUE - ) - # Check for dark theme + # Check for dark theme if (dark.theme) { title <- list(color = 'white') xaxis <- c(xaxis, color = 'white') @@ -2830,11 +4348,11 @@ HoverLocator <- function( title = list(color = 'black') plotbg = 'white' } - # The `~' means pull from the data passed (this is why we reset the names) - # Use I() to get plotly to accept the colors from the data as is - # Set hoverinfo to 'text' to override the default hover information - # rather than append to it - p <- plotly::layout( + # The `~' means pull from the data passed (this is why we reset the names) + # Use I() to get plotly to accept the colors from the data as is + # Set hoverinfo to 'text' to override the default hover information + # rather than append to it + p <- layout( p = plot_ly( data = plot.build, x = ~x, @@ -2853,13 +4371,15 @@ HoverLocator <- function( plot_bgcolor = plotbg, ... ) - # add labels + # Add labels label.layer <- which(x = sapply( X = plot$layers, - FUN = function(x) class(x$geom)[1] == "GeomText") - ) + FUN = function(x) { + return(inherits(x = x$geom, what = c('GeomText', 'GeomTextRepel'))) + } + )) if (length(x = label.layer) == 1) { - p <- plotly::add_annotations( + p <- add_annotations( p = p, x = plot$layers[[label.layer]]$data[, 1], y = plot$layers[[label.layer]]$data[, 2], @@ -2874,6 +4394,37 @@ HoverLocator <- function( return(p) } +#' Get the intensity and/or luminance of a color +#' +#' @param color A vector of colors +#' +#' @return A vector of intensities/luminances for each color +#' +#' @name contrast-theory +#' @rdname contrast-theory +#' +#' @importFrom grDevices col2rgb +#' +#' @export +#' +#' @source \url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} +#' +#' @examples +#' Intensity(color = c('black', 'white', '#E76BF3')) +#' +Intensity <- function(color) { + intensities <- apply( + X = col2rgb(col = color), + MARGIN = 2, + FUN = function(col) { + col <- rbind(as.vector(x = col), c(0.299, 0.587, 0.114)) + return(sum(apply(X = col, MARGIN = 2, FUN = prod))) + } + ) + names(x = intensities) <- color + return(intensities) +} + #' Label clusters on a ggplot2-based scatter plot #' #' @param plot A ggplot2-based scatter plot @@ -2883,13 +4434,21 @@ HoverLocator <- function( #' @param split.by Split labels by some grouping label, useful when using #' \code{\link[ggplot2]{facet_wrap}} or \code{\link[ggplot2]{facet_grid}} #' @param repel Use \code{geom_text_repel} to create nicely-repelled labels +#' @param geom Name of geom to get X/Y aesthetic names for +#' @param box Use geom_label/geom_label_repel (includes a box around the text +#' labels) +#' @param position How to place the label if repel = FALSE. If "median", place +#' the label at the median position. If "nearest" place the label at the +#' position of the nearest data point to the median. #' @param ... Extra parameters to \code{\link[ggrepel]{geom_text_repel}}, such as \code{size} #' #' @return A ggplot2-based scatter plot with cluster labels #' #' @importFrom stats median -#' @importFrom ggrepel geom_text_repel -#' @importFrom ggplot2 aes_string geom_text +#' @importFrom ggrepel geom_text_repel geom_label_repel +#' @importFrom ggplot2 aes_string geom_text geom_label +#' @importFrom RANN nn2 +#' #' @export #' #' @seealso \code{\link[ggrepel]{geom_text_repel}} \code{\link[ggplot2]{geom_text}} @@ -2905,9 +4464,12 @@ LabelClusters <- function( labels = NULL, split.by = NULL, repel = TRUE, + box = FALSE, + geom = 'GeomPoint', + position = "median", ... ) { - xynames <- unlist(x = GetXYAesthetics(plot = plot), use.names = TRUE) + xynames <- unlist(x = GetXYAesthetics(plot = plot, geom = geom), use.names = TRUE) if (!id %in% colnames(x = plot$data)) { stop("Cannot find variable ", id, " in plotting data") } @@ -2921,6 +4483,30 @@ LabelClusters <- function( if (any(!groups %in% possible.clusters)) { stop("The following clusters were not found: ", paste(groups[!groups %in% possible.clusters], collapse = ",")) } + if (geom == 'GeomSpatial') { + pb <- ggplot_build(plot = plot) + data[, xynames["y"]] = max(data[, xynames["y"]]) - data[, xynames["y"]] + min(data[, xynames["y"]]) + if (!pb$plot$plot_env$crop) { + # pretty hacky solution to learn the linear transform to put the data into + # the rescaled coordinates when not cropping in. Probably a better way to + # do this via ggplot + y.transform <- c(0, nrow(x = pb$plot$plot_env$image)) - pb$layout$panel_params[[1]]$y.range + data[, xynames["y"]] <- data[, xynames["y"]] + sum(y.transform) + data$x <- data[, xynames["x"]] + data$y <- data[, xynames["y"]] + panel_params_image <- c() + panel_params_image$x.range <- c(0, ncol(x = pb$plot$plot_env$image)) + panel_params_image$y.range <- c(0, nrow(x = pb$plot$plot_env$image)) + suppressWarnings(panel_params_image$x$continuous_range <- c(0, ncol(x = pb$plot$plot_env$image))) + suppressWarnings(panel_params_image$y$continuous_range <- c(0, nrow(x = pb$plot$plot_env$image))) + image.xform <- pb$layout$coord$transform(data, panel_params_image)[, c("x", "y")] + plot.xform <- pb$layout$coord$transform(data, pb$layout$panel_params[[1]])[, c("x", "y")] + x.xform <- lm(data$x ~ plot.xform$x) + y.xform <- lm(data$y ~ plot.xform$y) + data[, xynames['y']] <- image.xform$y * y.xform$coefficients[2] + y.xform$coefficients[1] + data[, xynames['x']] <- image.xform$x *x.xform$coefficients[2] + x.xform$coefficients[1] + } + } labels.loc <- lapply( X = groups, FUN = function(group) { @@ -2955,7 +4541,16 @@ LabelClusters <- function( return(data.medians) } ) + if (position == "nearest") { + labels.loc <- lapply(X = labels.loc, FUN = function(x) { + group.data <- data[as.character(x = data[, id]) == as.character(x[3]), ] + nearest.point <- nn2(data = group.data[, 1:2], query = as.matrix(x = x[c(1,2)]), k = 1)$nn.idx + x[1:2] <- group.data[nearest.point, 1:2] + return(x) + }) + } labels.loc <- do.call(what = 'rbind', args = labels.loc) + labels.loc[, id] <- factor(x = labels.loc[, id], levels = levels(data[, id])) labels <- labels %||% groups if (length(x = unique(x = labels.loc[, id])) != length(x = labels)) { stop("Length of labels (", length(x = labels), ") must be equal to the number of clusters being labeled (", length(x = labels.loc), ").") @@ -2964,12 +4559,24 @@ LabelClusters <- function( for (group in groups) { labels.loc[labels.loc[, id] == group, id] <- labels[group] } - geom.use <- ifelse(test = repel, yes = geom_text_repel, no = geom_text) - plot <- plot + geom.use( - data = labels.loc, - mapping = aes_string(x = xynames['x'], y = xynames['y'], label = id), - ... - ) + if (box) { + geom.use <- ifelse(test = repel, yes = geom_label_repel, no = geom_label) + plot <- plot + geom.use( + data = labels.loc, + mapping = aes_string(x = xynames['x'], y = xynames['y'], label = id, fill = id), + show.legend = FALSE, + ... + ) + } else { + geom.use <- ifelse(test = repel, yes = geom_text_repel, no = geom_text) + plot <- plot + geom.use( + data = labels.loc, + mapping = aes_string(x = xynames['x'], y = xynames['y'], label = id), + show.legend = FALSE, + ... + ) + } + return(plot) } @@ -3038,6 +4645,40 @@ LabelPoints <- function( return(plot) } +#' @name contrast-theory +#' @rdname contrast-theory +#' +#' @importFrom grDevices col2rgb +#' +#' @export +#' +#' @examples +#' Luminance(color = c('black', 'white', '#E76BF3')) +#' +Luminance <- function(color) { + luminance <- apply( + X = col2rgb(col = color), + MARGIN = 2, + function(col) { + col <- as.vector(x = col) / 255 + col <- sapply( + X = col, + FUN = function(x) { + return(ifelse( + test = x <= 0.03928, + yes = x / 12.92, + no = ((x + 0.055) / 1.055) ^ 2.4 + )) + } + ) + col <- rbind(col, c(0.2126, 0.7152, 0.0722)) + return(sum(apply(X = col, MARGIN = 2, FUN = prod))) + } + ) + names(x = luminance) <- color + return(luminance) +} + #' @inheritParams CustomPalette #' #' @export @@ -3411,7 +5052,7 @@ WhiteBackground <- function(...) { # AutoPointSize(data = df) # AutoPointSize <- function(data) { - return(min(1583 / nrow(x = data), 1)) + return(min(1583 / nrow(x = data), 1)) } # Calculate bandwidth for use in ggplot2-based smooth scatter plots @@ -3638,6 +5279,7 @@ Col2Hex <- function(...) { # @return The default DimReduc, if possible # DefaultDimReduc <- function(object, assay = NULL) { + object <- UpdateSlots(object = object) assay <- assay %||% DefaultAssay(object = object) drs.use <- c('umap', 'tsne', 'pca') dim.reducs <- FilterObjects(object = object, classes.keep = 'DimReduc') @@ -3847,42 +5489,84 @@ FacetTheme <- function(...) { )) } -# Convert a ggplot2 scatterplot to base R graphics +#' @importFrom RColorBrewer brewer.pal +#' @importFrom grDevices colorRampPalette +#' +#' +SpatialColors <- colorRampPalette(colors = rev(x = brewer.pal(n = 11, name = "Spectral"))) + +# Feature plot palettes +# +FeaturePalettes <- list( + 'Spatial' = SpatialColors(n = 100), + 'Seurat' = c('lightgrey', 'blue') +) + +# Get colour aesththics from a plot for a certain geom +# +# @param plot A ggplot2 object +# @param geom Geom class to filter to +# @param plot.first Use plot-wide colour aesthetics before geom-specific aesthetics +# +# @return A named list with values 'colour' for the colour aesthetic +# +GetColourAesthetics <- function(plot, geom = 'GeomPoint', plot.first = TRUE) { + geoms <- sapply( + X = plot$layers, + FUN = function(layer) { + return(class(x = layer$geom)[1]) + } + ) + geoms <- which(x = geoms == geom) + if (!length(x = geoms)) { + stop("Cannot find a geom of class ", geom) + } + geoms <- min(geoms) + if (plot.first) { + colour <- as.character(x = plot$mapping$colour %||% plot$layers[[geoms]]$mapping$colour)[2] + } else { + colour <- as.character(x = plot$layers[[geoms]]$mapping$colour %||% plot$mapping$colour)[2] + } + return(list(colour = colour)) +} + +# Splits features into groups based on log expression levels # -# @param plot A ggplot2 scatterplot -# @param do.plot Create the plot with base R graphics -# @param ... Extra parameters passed to PlotBuild +# @param object Seurat object +# @param assay Assay for expression data +# @param min.cells Only compute for features in at least this many cells +# @param ngroups Number of groups to split into # -# @return A dataframe with the data that created the ggplot2 scatterplot +# @return A Seurat object with the feature group stored as a factor in +# metafeatures # -#' @importFrom ggplot2 ggplot_build +#' @importFrom Matrix rowMeans rowSums # -GGpointToBase <- function(plot, do.plot = TRUE, ...) { - plot.build <- ggplot_build(plot = plot) - cols <- c('x', 'y', 'colour', 'shape', 'size') - build.use <- which(x = vapply( - X = plot.build$data, - FUN = function(dat) { - return(all(cols %in% colnames(x = dat))) - }, - FUN.VALUE = logical(length = 1L) - )) - if (length(x = build.use) == 0) { - stop("GGpointToBase only works on geom_point ggplot objects") - } - build.data <- plot.build$data[[min(build.use)]] - plot.data <- build.data[, cols] - names(x = plot.data) <- c( - plot.build$plot$labels$x, - plot.build$plot$labels$y, - 'color', - 'pch', - 'cex' +GetFeatureGroups <- function(object, assay, min.cells = 5, ngroups = 6) { + cm <- GetAssayData(object = object[[assay]], slot = "counts") + # subset to keep only genes detected in at least min.cells cells + cm <- cm[rowSums(cm > 0) >= min.cells, ] + # use the geometric mean of the features to group them + # (using the arithmetic mean would usually not change things much) + # could use sctransform:::row_gmean here but not exported + feature.gmean <- exp(x = rowMeans(log1p(x = cm))) - 1 + feature.grp.breaks <- seq( + from = min(log10(x = feature.gmean)) - 10*.Machine$double.eps, + to = max(log10(x = feature.gmean)), + length.out = ngroups + 1 ) - if (do.plot) { - PlotBuild(data = plot.data, ...) - } - return(plot.data) + feature.grp <- cut( + x = log10(x = feature.gmean), + breaks = feature.grp.breaks, + ordered_result = TRUE + ) + feature.grp <- factor( + x = feature.grp, + levels = rev(x = levels(x = feature.grp)), + ordered = TRUE + ) + names(x = feature.grp) <- names(x = feature.gmean) + return(feature.grp) } # Get X and Y aesthetics from a plot for a certain geom @@ -3915,6 +5599,169 @@ GetXYAesthetics <- function(plot, geom = 'GeomPoint', plot.first = TRUE) { return(list('x' = x, 'y' = y)) } +# For plotting the tissue image +#' @importFrom ggplot2 ggproto Geom aes ggproto_parent alpha draw_key_point +#' @importFrom grid unit gpar editGrob pointsGrob viewport gTree addGrob grobName +#' +GeomSpatial <- ggproto( + "GeomSpatial", + Geom, + required_aes = c("x", "y"), + extra_params = c("na.rm", "image", "image.alpha", "crop"), + default_aes = aes( + shape = 21, + colour = "black", + point.size.factor = 1.0, + fill = NA, + alpha = NA, + stroke = 0.25 + ), + setup_data = function(self, data, params) { + data <- ggproto_parent(Geom, self)$setup_data(data, params) + # We need to flip the image as the Y coordinates are reversed + data$y = max(data$y) - data$y + min(data$y) + data + }, + draw_key = draw_key_point, + draw_panel = function(data, panel_scales, coord, image, image.alpha, crop) { + # This should be in native units, where + # Locations and sizes are relative to the x- and yscales for the current viewport. + if (!crop) { + y.transform <- c(0, nrow(x = image)) - panel_scales$y.range + data$y <- data$y + sum(y.transform) + panel_scales$x$continuous_range <- c(0, nrow(x = image)) + panel_scales$y$continuous_range <- c(0, ncol(x = image)) + panel_scales$y.range <- c(0, nrow(x = image)) + panel_scales$x.range <- c(0, ncol(x = image)) + } + z <- coord$transform( + data.frame(x = c(0, ncol(x = image)), y = c(0, nrow(x = image))), + panel_scales + ) + # Flip Y axis for image + z$y <- -rev(z$y) + 1 + wdth <- z$x[2] - z$x[1] + hgth <- z$y[2] - z$y[1] + vp <- viewport( + x = unit(x = z$x[1], units = "npc"), + y = unit(x = z$y[1], units = "npc"), + width = unit(x = wdth, units = "npc"), + height = unit(x = hgth, units = "npc"), + just = c("left", "bottom") + ) + img.grob <- GetImage(object = image) + + img <- editGrob(grob = img.grob, vp = vp) + # spot.size <- slot(object = image, name = "spot.radius") + spot.size <- Radius(object = image) + coords <- coord$transform(data, panel_scales) + pts <- pointsGrob( + x = coords$x, + y = coords$y, + pch = data$shape, + size = unit(spot.size, "npc") * data$point.size.factor, + gp = gpar( + col = alpha(colour = coords$colour, alpha = coords$alpha), + fill = alpha(colour = coords$fill, alpha = coords$alpha), + lwd = coords$stroke) + ) + vp <- viewport() + gt <- gTree(vp = vp) + if (image.alpha > 0) { + if (image.alpha != 1) { + img$raster = as.raster( + x = matrix( + data = alpha(colour = img$raster, alpha = image.alpha), + nrow = nrow(x = img$raster), + ncol = ncol(x = img$raster), + byrow = TRUE) + ) + } + gt <- addGrob(gTree = gt, child = img) + } + gt <- addGrob(gTree = gt, child = pts) + # Replacement for ggname + gt$name <- grobName(grob = gt, prefix = 'geom_spatial') + return(gt) + # ggplot2:::ggname("geom_spatial", gt) + } +) + +# influenced by: https://stackoverflow.com/questions/49475201/adding-tables-to-ggplot2-with-facet-wrap-in-r +# https://ggplot2.tidyverse.org/articles/extending-ggplot2.html +#' @importFrom ggplot2 layer +#' +#' +geom_spatial <- function( + mapping = NULL, + data = NULL, + image = image, + image.alpha = image.alpha, + crop = crop, + stat = "identity", + position = "identity", + na.rm = FALSE, + show.legend = NA, + inherit.aes = TRUE, + ... +) { + layer( + geom = GeomSpatial, + mapping = mapping, + data = data, + stat = stat, + position = position, + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list(na.rm = na.rm, image = image, image.alpha = image.alpha, crop = crop, ...) + ) +} + +#' @importFrom grid viewport editGrob grobName +#' @importFrom ggplot2 ggproto Geom ggproto_parent +# +GeomSpatialInteractive <- ggproto( + "GeomSpatialInteractive", + Geom, + setup_data = function(self, data, params) { + data <- ggproto_parent(parent = Geom, self = self)$setup_data(data, params) + data + }, + draw_group = function(data, panel_scales, coord) { + vp <- viewport(x = data$x, y = data$y) + g <- editGrob(grob = data$grob[[1]], vp = vp) + # Replacement for ggname + g$name <- grobName(grob = g, prefix = 'geom_spatial_interactive') + return(g) + # return(ggname(prefix = "geom_spatial", grob = g)) + }, + required_aes = c("grob","x","y") +) + +#' @importFrom ggplot2 layer +# +geom_spatial_interactive <- function( + mapping = NULL, + data = NULL, + stat = "identity", + position = "identity", + na.rm = FALSE, + show.legend = NA, + inherit.aes = FALSE, + ... +) { + layer( + geom = GeomSpatialInteractive, + mapping = mapping, + data = data, + stat = stat, + position = position, + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list(na.rm = na.rm, ...) + ) +} + # A split violin plot geom # #' @importFrom scales zero_range @@ -4014,6 +5861,176 @@ geom_split_violin <- function( )) } +# Convert a ggplot2 scatterplot to base R graphics +# +# @param plot A ggplot2 scatterplot +# @param do.plot Create the plot with base R graphics +# @param cols A named vector of column names to pull. Vector names must be 'x', +# 'y', 'colour', 'shape', and/or 'size'; vector values must be the names of +# columns in plot data that correspond to these values. May pass only values that +# differ from the default (eg. \code{cols = c('size' = 'point.size.factor')}) +# @param ... Extra parameters passed to PlotBuild +# +# @return A dataframe with the data that created the ggplot2 scatterplot +# +#' @importFrom ggplot2 ggplot_build +# +GGpointToBase <- function( + plot, + do.plot = TRUE, + cols = c( + 'x' = 'x', + 'y' = 'y', + 'colour' = 'colour', + 'shape' = 'shape', + 'size' = 'size' + ), + ... +) { + plot.build <- ggplot_build(plot = plot) + default.cols <- c( + 'x' = 'x', + 'y' = 'y', + 'colour' = 'colour', + 'shape' = 'shape', + 'size' = 'size' + ) + cols <- cols %||% default.cols + if (is.null(x = names(x = cols))) { + if (length(x = cols) > length(x = default.cols)) { + warning( + "Too many columns provided, selecting only first ", + length(x = default.cols), + call. = FALSE, + immediate. = TRUE + ) + cols <- cols[1:length(x = default.cols)] + } + names(x = cols) <- names(x = default.cols)[1:length(x = cols)] + } + cols <- c( + cols[intersect(x = names(x = default.cols), y = names(x = cols))], + default.cols[setdiff(x = names(x = default.cols), y = names(x = cols))] + ) + cols <- cols[names(x = default.cols)] + build.use <- which(x = vapply( + X = plot.build$data, + FUN = function(dat) { + return(all(cols %in% colnames(x = dat))) + }, + FUN.VALUE = logical(length = 1L) + )) + if (length(x = build.use) == 0) { + stop("GGpointToBase only works on geom_point ggplot objects") + } + build.data <- plot.build$data[[min(build.use)]] + plot.data <- build.data[, cols] + names(x = plot.data) <- c( + plot.build$plot$labels$x, + plot.build$plot$labels$y, + 'color', + 'pch', + 'cex' + ) + if (do.plot) { + PlotBuild(data = plot.data, ...) + } + return(plot.data) +} + +# Convert a ggplot2 scatterplot to plotly graphics +# +# @inheritParams GGpointToBase +# @param information Extra information for hovering +# @param ... Ignored +# +# @return A dataframe with the data that greated the ggplot2 scatterplot +#' @importFrom ggplot2 ggplot_build +# +GGpointToPlotlyBuild <- function( + plot, + information = NULL, + cols = eval(expr = formals(fun = GGpointToBase)$cols), + ... +) { + CheckDots(...) + plot.build <- GGpointToBase(plot = plot, do.plot = FALSE, cols = cols) + data <- ggplot_build(plot = plot)$plot$data + rownames(x = plot.build) <- rownames(data) + # Reset the names to 'x' and 'y' + names(x = plot.build) <- c( + 'x', + 'y', + names(x = plot.build)[3:length(x = plot.build)] + ) + # Add the hover information we're looking for + if (is.null(x = information)) { + plot.build$feature <- rownames(x = data) + } else { + info <- apply( + X = information, + MARGIN = 1, + FUN = function(x, names) { + return(paste0(names, ': ', x, collapse = '
')) + }, + names = colnames(x = information) + ) + data.info <- data.frame( + feature = paste(rownames(x = information), info, sep = '
'), + row.names = rownames(x = information) + ) + plot.build <- merge(x = plot.build, y = data.info, by = 0) + rownames(x = plot.build) <- plot.build$Row.names + plot.build <- plot.build[, which(x = colnames(x = plot.build) != 'Row.names'), drop = FALSE] + } + return(plot.build) +} + +#' @importFrom stats quantile +#' +InvertCoordinate <- function(x, MARGIN = 2) { + if (!is.null(x = x)) { + switch( + EXPR = MARGIN, + '1' = { + rmin <- 'left' + rmax <- 'right' + cmin <- 'xmin' + cmax <- 'xmax' + }, + '2' = { + rmin <- 'bottom' + rmax <- 'top' + cmin <- 'ymin' + cmax <- 'ymax' + }, + stop("'MARGIN' must be either 1 or 2", call. = FALSE) + ) + # Fix the range so that rmin becomes rmax and vice versa + # Needed for both points and brushes + range <- x$range + x$range[[rmin]] <- range[[rmax]] + x$range[[rmax]] <- range[[rmin]] + # Fix the cmin and cmax values, if provided + # These are used for brush boundaries + coords <- c(x[[cmin]], x[[cmax]]) + if (all(!is.null(x = coords))) { + names(x = coords) <- c(cmin, cmax) + x[[cmin]] <- quantile( + x = x$range[[rmin]]:x$range[[rmax]], + probs = 1 - (coords[cmax] / x$range[[rmax]]), + names = FALSE + ) + x[[cmax]] <- quantile( + x = x$range[[rmin]]:x$range[[rmax]], + probs = 1 - (coords[cmin] / x$range[[rmax]]), + names = FALSE + ) + } + } + return(x) +} + # Invert a Hexadecimal color # # @param hexadecimal A character vector of hexadecimal colors @@ -4154,30 +6171,31 @@ PlotBuild <- function(data, dark.theme = FALSE, smooth = FALSE, ...) { # @importFrom SDMTools pnt.in.poly # PointLocator <- function(plot, recolor = TRUE, dark.theme = FALSE, ...) { - # Convert the ggplot object to a data.frame - PackageCheck('SDMTools') - plot.data <- GGpointToBase(plot = plot, dark.theme = dark.theme, ...) - npoints <- nrow(x = plot.data) - cat("Click around the cluster of points you wish to select\n") - cat("ie. select the vertecies of a shape around the cluster you\n") - cat("are interested in. Press when finished (right click for R-terminal users)\n\n") - polygon <- locator(n = npoints, type = 'l') - polygon <- data.frame(polygon) - # pnt.in.poly returns a data.frame of points - points.all <- SDMTools::pnt.in.poly( - pnts = plot.data[, c(1, 2)], - poly.pnts = polygon - ) - # Find the located points - points.located <- points.all[which(x = points.all$pip == 1), ] - # If we're recoloring, do the recolor - if (recolor) { - no <- ifelse(test = dark.theme, yes = 'white', no = '#C3C3C3') - points.all$color <- ifelse(test = points.all$pip == 1, yes = '#DE2D26', no = no) - plot.data$color <- points.all$color - PlotBuild(data = plot.data, dark.theme = dark.theme, ...) - } - return(points.located[, c(1, 2)]) + .Defunct(new = "CellSelector") + # # Convert the ggplot object to a data.frame + # PackageCheck('SDMTools') + # plot.data <- GGpointToBase(plot = plot, dark.theme = dark.theme, ...) + # npoints <- nrow(x = plot.data) + # cat("Click around the cluster of points you wish to select\n") + # cat("ie. select the vertecies of a shape around the cluster you\n") + # cat("are interested in. Press when finished (right click for R-terminal users)\n\n") + # polygon <- locator(n = npoints, type = 'l') + # polygon <- data.frame(polygon) + # # pnt.in.poly returns a data.frame of points + # points.all <- SDMTools::pnt.in.poly( + # pnts = plot.data[, c(1, 2)], + # poly.pnts = polygon + # ) + # # Find the located points + # points.located <- points.all[which(x = points.all$pip == 1), ] + # # If we're recoloring, do the recolor + # if (recolor) { + # no <- ifelse(test = dark.theme, yes = 'white', no = '#C3C3C3') + # points.all$color <- ifelse(test = points.all$pip == 1, yes = '#DE2D26', no = no) + # plot.data$color <- points.all$color + # PlotBuild(data = plot.data, dark.theme = dark.theme, ...) + # } + # return(points.located[, c(1, 2)]) } # Create quantile segments for quantiles on violin plots in ggplot2 @@ -4332,6 +6350,23 @@ SetQuantile <- function(cutoff, data) { return(as.numeric(x = cutoff)) } +#' @importFrom shiny brushedPoints +# +ShinyBrush <- function(plot.data, brush, outputs, inverts = character(length = 0L)) {#}, selected = NULL) { + selected <- NULL + if (!is.null(x = brush)) { + if (brush$outputId %in% outputs) { + selected <- rownames(x = brushedPoints(df = plot.data, brush = brush)) + } else if (brush$outputId %in% inverts) { + selected <- rownames(x = brushedPoints( + df = plot.data, + brush = InvertCoordinate(x = brush) + )) + } + } + return(selected) +} + globalVariables(names = '..density..', package = 'Seurat') # A single correlation plot # @@ -4426,11 +6461,11 @@ SingleCorPlot <- function( # ) plot <- plot + stat_density2d( mapping = aes(fill = ..density.. ^ 0.25), - geom = 'tile', - contour = FALSE, - n = 200, - h = Bandwidth(data = data[, names.plot]) - ) + + geom = 'tile', + contour = FALSE, + n = 200, + h = Bandwidth(data = data[, names.plot]) + ) + # geom_tile( # mapping = aes_string( # x = 'x', @@ -4485,6 +6520,7 @@ SingleCorPlot <- function( # @param shape.by If NULL, all points are circles (default). You can specify any cell attribute # (that can be pulled with FetchData) allowing for both different colors and different shapes on # cells. +# @param alpha.by Mapping variable for the point alpha value # @param order Specify the order of plotting for the idents. This can be useful for crowded plots if # points of interest are being buried. Provide either a full list of valid idents or a subset to be # plotted last (on top). @@ -4514,6 +6550,7 @@ SingleDimPlot <- function( cols = NULL, pt.size = NULL, shape.by = NULL, + alpha.by = NULL, order = NULL, label = FALSE, repel = FALSE, @@ -4586,13 +6623,24 @@ SingleDimPlot <- function( if (!is.null(x = shape.by) && !shape.by %in% colnames(x = data)) { warning("Cannot find ", shape.by, " in plotting data, not shaping plot") } + if (!is.null(x = alpha.by) && !alpha.by %in% colnames(x = data)) { + warning( + "Cannot find alpha variable ", + alpha.by, + " in data, setting to NULL", + call. = FALSE, + immediate. = TRUE + ) + alpha.by <- NULL + } plot <- ggplot(data = data) + geom_point( mapping = aes_string( x = dims[1], y = dims[2], color = paste0("`", col.by, "`"), - shape = shape.by + shape = shape.by, + alpha = alpha.by ), size = pt.size ) + @@ -4907,3 +6955,174 @@ SingleRasterMap <- function( } return(plot) } + +# Base plotting function for all Spatial plots +# +# @param data Data.frame with info to be plotted +# @param image SpatialImage object to be plotted +# @param cols Vector of colors, each color corresponds to an identity class. This may also be a single character +# or numeric value corresponding to a palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. +# By default, ggplot2 assigns colors +# @param image.alpha Adjust the opacity of the background images. Set to 0 to +# remove. +# @param crop Crop the plot in to focus on points plotted. Set to FALSE to show +# entire background image. +# @param pt.size.factor Sets the size of the points relative to spot.radius +# @param stroke Control the width of the border around the spots +# @param col.by Mapping variable for the point color +# @param alpha.by Mapping variable for the point alpha value +# @param cells.highlight A list of character or numeric vectors of cells to +# highlight. If only one group of cells desired, can simply pass a vector +# instead of a list. If set, colors selected cells to the color(s) in +# cols.highlight +# @param cols.highlight A vector of colors to highlight the cells as; ordered +# the same as the groups in cells.highlight; last color corresponds to +# unselected cells. +# @param geom Switch between normal spatial geom and geom to enable hover +# functionality +# @param na.value Color for spots with NA values + +#' @importFrom tibble tibble +#' @importFrom ggplot2 ggplot aes_string coord_fixed geom_point xlim ylim +#' coord_cartesian labs theme_void theme scale_fill_brewer +#' +SingleSpatialPlot <- function( + data, + image, + cols = NULL, + image.alpha = 1, + crop = TRUE, + pt.size.factor = NULL, + stroke = 0.25, + col.by = NULL, + alpha.by = NULL, + cells.highlight = NULL, + cols.highlight = c('#DE2D26', 'grey50'), + geom = c('spatial', 'interactive', 'poly'), + na.value = 'grey50' +) { + geom <- match.arg(arg = geom) + if (!is.null(x = col.by) && !col.by %in% colnames(x = data)) { + warning("Cannot find '", col.by, "' in data, not coloring", call. = FALSE, immediate. = TRUE) + col.by <- NULL + } + col.by <- col.by %iff% paste0("`", col.by, "`") + alpha.by <- alpha.by %iff% paste0("`", alpha.by, "`") + if (!is.null(x = cells.highlight)) { + highlight.info <- SetHighlight( + cells.highlight = cells.highlight, + cells.all = rownames(x = data), + sizes.highlight = pt.size.factor, + cols.highlight = cols.highlight[1], + col.base = cols.highlight[2] + ) + order <- highlight.info$plot.order + data$highlight <- highlight.info$highlight + col.by <- 'highlight' + levels(x = data$ident) <- c(order, setdiff(x = levels(x = data$ident), y = order)) + data <- data[order(data$ident), ] + } + plot <- ggplot(data = data, aes_string( + x = colnames(x = data)[2], + y = colnames(x = data)[1], + fill = col.by, + alpha = alpha.by + )) + plot <- switch( + EXPR = geom, + 'spatial' = { + plot + geom_spatial( + point.size.factor = pt.size.factor, + data = data, + image = image, + image.alpha = image.alpha, + crop = crop, + stroke = stroke + ) + coord_fixed() + }, + 'interactive' = { + plot + geom_spatial_interactive( + data = tibble(grob = list(GetImage(object = image, mode = 'grob'))), + mapping = aes_string(grob = 'grob'), + x = 0.5, + y = 0.5 + ) + + geom_point(mapping = aes_string(color = col.by)) + + xlim(0, ncol(x = image)) + + ylim(nrow(x = image), 0) + + coord_cartesian(expand = FALSE) + }, + 'poly' = { + data$cell <- rownames(x = data) + data[, c('x', 'y')] <- NULL + data <- merge( + x = data, + y = GetTissueCoordinates(object = image, qhulls = TRUE), + by = "cell" + ) + plot + geom_polygon( + data = data, + mapping = aes_string(fill = col.by, group = 'cell') + ) + coord_fixed() + theme_cowplot() + + }, + stop("Unknown geom, choose from 'spatial' or 'interactive'", call. = FALSE) + ) + if (!is.null(x = cells.highlight)) { + plot <- plot + scale_fill_manual(values = cols.highlight) + } + if (!is.null(x = cols) && is.null(x = cells.highlight)) { + if (length(x = cols) == 1 && (is.numeric(x = cols) || cols %in% rownames(x = brewer.pal.info))) { + scale <- scale_fill_brewer(palette = cols, na.value = na.value) + } else if (length(x = cols) == 1 && (cols %in% c('alphabet', 'alphabet2', 'glasbey', 'polychrome', 'stepped'))) { + colors <- DiscretePalette(length(unique(data[[col.by]])), palette = cols) + scale <- scale_fill_manual(values = colors, na.value = na.value) + } else { + scale <- scale_fill_manual(values = cols, na.value = na.value) + } + plot <- plot + scale + } + plot <- plot + theme_void() + return(plot) +} + +# Reimplementation of ggplot2 coord$transform +# +# @param data A data frame with x-coordinates in the first column and y-coordinates +# in the second +# @param xlim,ylim X- and Y-limits for the transformation, must be two-length +# numeric vectors +# +# @return \code{data} with transformed coordinates +# +#' @importFrom ggplot2 transform_position +#' @importFrom scales rescale squish_infinite +# +Transform <- function(data, xlim = c(-Inf, Inf), ylim = c(-Inf, Inf)) { + # Quick input argument checking + if (!all(sapply(X = list(xlim, ylim), FUN = length) == 2)) { + stop("'xlim' and 'ylim' must be two-length numeric vectors", call. = FALSE) + } + # Save original names + df.names <- colnames(x = data) + colnames(x = data)[1:2] <- c('x', 'y') + # Rescale the X and Y values + data <- transform_position( + df = data, + trans_x = function(df) { + return(rescale(x = df, from = xlim)) + }, + trans_y = function(df) { + return(rescale(x = df, from = ylim)) + } + ) + # Something that ggplot2 does + data <- transform_position( + df = data, + trans_x = squish_infinite, + trans_y = squish_infinite + ) + # Restore original names + colnames(x = data) <- df.names + return(data) +} diff --git a/R/zzz.R b/R/zzz.R index 5b2de9a8a..a7397deef 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -13,15 +13,17 @@ #' This can be helpful in cleaning up the memory status of the R session and #' prevent use of swap space. However, it does add to the computational overhead #' and setting to FALSE can speed things up if you're working in an environment -#' where RAM availabiliy is not a concern.} +#' where RAM availability is not a concern.} #' \item{\code{Seurat.warn.umap.uwot}}{Show warning about the default backend #' for \code{\link{RunUMAP}} changing from Python UMAP via reticulate to UWOT} #' \item{\code{Seurat.checkdots}}{For functions that have ... as a parameter, #' this controls the behavior when an item isn't used. Can be one of warn, #' stop, or silent.} -#' \item{\code{Seurat.limma.wilcox.msg}}{Show message about more efficient -#' Wilcoxon Rank Sum test available via the limma package} -#' \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to +#' \item{\code{Seurat.limma.wilcox.msg}}{{Show message about more efficient +#' Wilcoxon Rank Sum test available via the limma package}} +#' \item{\code{Seurat.Rfast2.msg}}{{Show message about more efficient +#' Moran's I function available via the Rfast2 package}} +#' \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to #' default behavior of split/multi violin plots} #' } #' @@ -36,6 +38,7 @@ seurat_default_options <- list( Seurat.warn.umap.uwot = TRUE, Seurat.checkdots = "warn", Seurat.limma.wilcox.msg = TRUE, + Seurat.Rfast2.msg = TRUE, Seurat.warn.vlnplot.split = TRUE ) @@ -43,5 +46,5 @@ seurat_default_options <- list( op <- options() toset <- !(names(x = seurat_default_options) %in% names(x = op)) if (any(toset)) options(seurat_default_options[toset]) - invisible() + invisible(x = NULL) } diff --git a/README.md b/README.md index 3be4fd4de..2149c20c8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![CRAN Version](https://www.r-pkg.org/badges/version/Seurat)](https://cran.r-project.org/package=Seurat) [![CRAN Downloads](https://cranlogs.r-pkg.org/badges/Seurat)](https://cran.r-project.org/package=Seurat) -# Seurat v3.1.5 +# Seurat v3.2.0 Seurat is an R toolkit for single cell genomics, developed and maintained by the Satija Lab at NYGC. @@ -22,6 +22,12 @@ Improvements and new features will be added on a regular basis, please contact s Version History +July 15, 2020 + +* Version 3.2 +* Changes: + * Support for analysis and visualization of spatially resolved datasets + August 20, 2019 * Version 3.1 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 19e5a1c9b..d631b7d42 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -22,5 +22,5 @@ jobs: steps: - script: | R CMD build . - R CMD check --as-cran -no-manual Seurat_* + R CMD check --as-cran --no-manual Seurat_* displayName: 'R CMD Check' diff --git a/cran-comments.md b/cran-comments.md index 1bbd87b9c..2ebbb72a1 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,12 +1,13 @@ -# Seurat v3.1.5 +# Seurat v3.2.0 ## Test environments -* local Ubuntu 16.04.6 and 18.04.2 installs, R 3.6.1 -* local Windows 10 install, R 3.5.3, R-devel (4.1.0) -* Ubuntu 16.04.6 (on travis-ci), R 3.6.1 -* macOS 10.13.3 (on travis-ci), R 3.6.1 -* Windows Server 2012 R2 (on AppVeyor), R 3.6.1 Patched -* win-builder (oldrelease, release, devel, devel_gcc8) +* local Ubuntu 16.04.6 install, R 3.6.1 +* local Ubuntu 18.04.4 install, R 4.0.1 +* local Windows 10 install, R 4.0.0 +* Ubuntu 16.04.6 (on travis-ci), R 4.0.0, R devel +* macOS 10.13.6 (on travis-ci), R 4.0.2 +* Windows Server 2012 R2 (on AppVeyor), R 4.0.2 Patched +* win-builder (oldrelease, release, devel) ## R CMD check results There were no ERRORs or WARNINGs @@ -17,22 +18,17 @@ There were 3 NOTEs: Maintainer: ‘Paul Hoffman ’ Suggests or Enhances not in mainstream repositories: - loomR, SDMTools + loomR Availability using Additional_repositories specification: loomR yes https://mojaveazure.github.io/loomR - SDMTools no ? - One of the packages we suggest, loomR, is currently under development and not yet available on CRAN. This package is not required for core functionality of Seurat. The other package, SDMTools is also not required for core functionality. We are working to replace the function that calls SDMTools with a new function using non-orphaned packages + The package we suggest, loomR, is currently under development and not yet available on CRAN. This package is not required for core functionality of Seurat. * checking package dependencies ... NOTE Package suggested but not available for checking: 'loomR' - Suggests orphaned package: ‘SDMTools’ - loomR is a suggested package hosted on a custom repository and maintained by us (both the package and repository). - SDMTools is not required for any essential functionality. We are working to replace the function that calls SDMTools with a new function using non-orphaned packages. - * checking Rd cross-references ... NOTE Package unavailable to check Rd xrefs: 'loomR' @@ -40,6 +36,6 @@ There were 3 NOTEs: ## Downstream dependencies -There are three pacakges that imports Seurat: multicross, scMappR, and Signac; this update does not impact their functionality +There are three pacakges that imports Seurat: scMappR, Signac, and SoupX; this update does not impact their functionality -There are four packages that suggest Seurat: BisqueRNA, clustree, Rmagic, and treefit; this update does not impact their functionality. +There are four packages that suggest Seurat: BisqueRNA, clustree, nanny, Rmagic, singleCellHaystack, treefit; this update does not impact their functionality. diff --git a/man/BGTextColor.Rd b/man/BGTextColor.Rd new file mode 100644 index 000000000..2f9c334b2 --- /dev/null +++ b/man/BGTextColor.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{BGTextColor} +\alias{BGTextColor} +\title{Determine text color based on background color} +\source{ +\url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} +} +\usage{ +BGTextColor( + background, + threshold = 186, + w3c = FALSE, + dark = "black", + light = "white" +) +} +\arguments{ +\item{background}{A vector of background colors; supports R color names and +hexadecimal codes} + +\item{threshold}{Intensity threshold for light/dark cutoff; intensities +greater than \code{theshold} yield \code{dark}, others yield \code{light}} + +\item{w3c}{Use \href{http://www.w3.org/TR/WCAG20/}{W3C} formula for calculating +background text color; ignores \code{threshold}} + +\item{dark}{Color for dark text} + +\item{light}{Color for light text} +} +\value{ +A named vector of either \code{dark} or \code{light}, depending on +\code{background}; names of vector are \code{background} +} +\description{ +Determine text color based on background color +} +\examples{ +BGTextColor(background = c('black', 'white', '#E76BF3')) + +} diff --git a/man/CellSelector.Rd b/man/CellSelector.Rd index d58990fb9..eada1d28b 100644 --- a/man/CellSelector.Rd +++ b/man/CellSelector.Rd @@ -3,7 +3,7 @@ \name{CellSelector} \alias{CellSelector} \alias{FeatureLocator} -\title{Cell selector} +\title{Cell Selector} \usage{ CellSelector(plot, object = NULL, ident = "SelectedCells", ...) @@ -12,17 +12,17 @@ FeatureLocator(plot, ...) \arguments{ \item{plot}{A ggplot2 plot} -\item{object}{An optional Seurat object; if passes, will return an object with -the identities of selected cells set to \code{ident}} +\item{object}{An optional Seurat object; if passes, will return an object +with the identities of selected cells set to \code{ident}} \item{ident}{An optional new identity class to assign the selected cells} -\item{...}{Extra parameters, such as dark.theme, recolor, or smooth for using a dark theme, -recoloring based on selected cells, or using a smooth scatterplot, respectively} +\item{...}{Ignored} } \value{ -If \code{object} is \code{NULL}, the names of the points selected; otherwise, -a Seurat object with the selected cells identity classes set to \code{ident} +If \code{object} is \code{NULL}, the names of the points selected; +otherwise, a Seurat object with the selected cells identity classes set to +\code{ident} } \description{ Select points on a scatterplot and get information about them @@ -39,6 +39,5 @@ pbmc_small <- CellSelector(plot = plot, object = pbmc_small, ident = 'SelectedCe } \seealso{ -\code{\link[graphics]{locator}} \code{\link[ggplot2]{ggplot_build}} -\code{\link[SDMTools]{pnt.in.poly}} \code{\link{DimPlot}} \code{\link{FeaturePlot}} +\code{\link{DimPlot}} \code{\link{FeaturePlot}} } diff --git a/man/Cells.Rd b/man/Cells.Rd index ccfb1a005..f4a8b8eef 100644 --- a/man/Cells.Rd +++ b/man/Cells.Rd @@ -4,6 +4,9 @@ \alias{Cells} \alias{Cells.default} \alias{Cells.DimReduc} +\alias{Cells.SlideSeq} +\alias{Cells.STARmap} +\alias{Cells.VisiumV1} \title{Get cells present in an object} \usage{ Cells(x) @@ -11,6 +14,12 @@ Cells(x) \method{Cells}{default}(x) \method{Cells}{DimReduc}(x) + +\method{Cells}{SlideSeq}(x) + +\method{Cells}{STARmap}(x) + +\method{Cells}{VisiumV1}(x) } \arguments{ \item{x}{An object} @@ -21,6 +30,10 @@ A vector of cell names \description{ Get cells present in an object } +\note{ +The default method simply calls \code{\link[base]{colnames}} on \code{x}; +other methods are provided for objects where colnames aren't necessarily cell names +} \examples{ Cells(x = pbmc_small) diff --git a/man/CellsByImage.Rd b/man/CellsByImage.Rd new file mode 100644 index 000000000..ca0acaa3c --- /dev/null +++ b/man/CellsByImage.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\name{CellsByImage} +\alias{CellsByImage} +\title{Get a vector of cell names associated with an image (or set of images)} +\usage{ +CellsByImage(object, images = NULL, unlist = FALSE) +} +\arguments{ +\item{object}{Seurat object} + +\item{images}{Vector of image names} + +\item{unlist}{Return as a single vector of cell names as opposed to a list, +named by image name.} +} +\value{ +A vector of cell names +} +\description{ +Get a vector of cell names associated with an image (or set of images) +} +\examples{ +\dontrun{ +CellsByImage(object = object, images = "slice1") +} + +} diff --git a/man/CreateGeneActivityMatrix.Rd b/man/CreateGeneActivityMatrix.Rd index 825452336..e52e276f9 100644 --- a/man/CreateGeneActivityMatrix.Rd +++ b/man/CreateGeneActivityMatrix.Rd @@ -29,8 +29,8 @@ CreateGeneActivityMatrix( \item{downstream}{Number of bases downstream to consider} \item{keep.sparse}{Leave the matrix as a sparse matrix. Setting this option to -TRUE will take much longer but will use less memory. This can be useful if -you have a very large matrix that cannot fit into memory when converted to +TRUE will take much longer but will use less memory. This can be useful if +you have a very large matrix that cannot fit into memory when converted to a dense form.} \item{verbose}{Print progress/messages} diff --git a/man/CreateSeuratObject.Rd b/man/CreateSeuratObject.Rd index a464b8dc7..49f8ddede 100644 --- a/man/CreateSeuratObject.Rd +++ b/man/CreateSeuratObject.Rd @@ -1,26 +1,67 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/objects.R +% Please edit documentation in R/generics.R, R/objects.R \name{CreateSeuratObject} \alias{CreateSeuratObject} -\title{Create a Seurat object} +\alias{CreateSeuratObject.default} +\alias{CreateSeuratObject.Assay} +\title{Create a \code{Seurat} object} \usage{ CreateSeuratObject( + counts, + project = "CreateSeuratObject", + assay = "RNA", + names.field = 1, + names.delim = "_", + meta.data = NULL, + ... +) + +\method{CreateSeuratObject}{default}( counts, project = "SeuratProject", assay = "RNA", + names.field = 1, + names.delim = "_", + meta.data = NULL, min.cells = 0, min.features = 0, + ... +) + +\method{CreateSeuratObject}{Assay}( + counts, + project = "SeuratProject", + assay = "RNA", names.field = 1, names.delim = "_", - meta.data = NULL + meta.data = NULL, + ... ) } \arguments{ -\item{counts}{Unnormalized data such as raw counts or TPMs} +\item{counts}{Either a \code{\link[base]{matrix}}-like object with +unnormalized data with cells as columns and features as rows or an +\code{\link{Assay}}-derived object} + +\item{project}{\link{Project} name for the \code{Seurat} object} + +\item{assay}{Name of the initial assay} + +\item{names.field}{For the initial identity class for each cell, choose this +field from the cell's name. E.g. If your cells are named as +BARCODE_CLUSTER_CELLTYPE in the input matrix, set \code{names.field} to 3 to +set the initial identities to CELLTYPE.} -\item{project}{Sets the project name for the Seurat object.} +\item{names.delim}{For the initial identity class for each cell, choose this +delimiter from the cell's column name. E.g. If your cells are named as +BARCODE-CLUSTER-CELLTYPE, set this to \dQuote{-} to separate the cell name +into its component parts for picking the relevant field.} -\item{assay}{Name of the assay corresponding to the initial input data.} +\item{meta.data}{Additional cell-level metadata to add to the Seurat object. +Should be a \code{\link[base]{data.frame}} where the rows are cell names and +the columns are additional metadata fields.} + +\item{...}{Arguments passed to other methods} \item{min.cells}{Include features detected in at least this many cells. Will subset the counts matrix as well. To reintroduce excluded features, create a @@ -28,27 +69,20 @@ new object with a lower cutoff.} \item{min.features}{Include cells where at least this many features are detected.} - -\item{names.field}{For the initial identity class for each cell, choose this field from the -cell's name. E.g. If your cells are named as BARCODE_CLUSTER_CELLTYPE in the input matrix, set -names.field to 3 to set the initial identities to CELLTYPE.} - -\item{names.delim}{For the initial identity class for each cell, choose this delimiter from the -cell's column name. E.g. If your cells are named as BARCODE-CLUSTER-CELLTYPE, set this to "-" to -separate the cell name into its component parts for picking the relevant field.} - -\item{meta.data}{Additional cell-level metadata to add to the Seurat object. Should be a data -frame where the rows are cell names and the columns are additional metadata fields.} +} +\value{ +A \code{\link{Seurat}} object } \description{ -Create a Seurat object from a feature (e.g. gene) expression matrix. The expected format of the -input matrix is features x cells. +Create a \code{Seurat} object from raw data } -\details{ -Note: In previous versions (<3.0), this function also accepted a parameter to set the expression -threshold for a 'detected' feature (gene). This functionality has been removed to simplify the -initialization process/assumptions. If you would still like to impose this threshold for your -particular dataset, simply filter the input expression matrix before calling this function. +\note{ +In previous versions (<3.0), this function also accepted a parameter to +set the expression threshold for a \sQuote{detected} feature (gene). This +functionality has been removed to simplify the initialization +process/assumptions. If you would still like to impose this threshold for +your particular dataset, simply filter the input expression matrix before +calling this function. } \examples{ pbmc_raw <- read.table( diff --git a/man/DefaultAssay.Rd b/man/DefaultAssay.Rd index 5b0e755c8..7a06bf7f4 100644 --- a/man/DefaultAssay.Rd +++ b/man/DefaultAssay.Rd @@ -8,7 +8,9 @@ \alias{DefaultAssay.Graph} \alias{DefaultAssay.Seurat} \alias{DefaultAssay.SeuratCommand} +\alias{DefaultAssay.SpatialImage} \alias{DefaultAssay<-.Seurat} +\alias{DefaultAssay<-.SpatialImage} \title{Get and set the default assay} \usage{ DefaultAssay(object, ...) @@ -25,7 +27,11 @@ DefaultAssay(object, ...) <- value \method{DefaultAssay}{SeuratCommand}(object, ...) +\method{DefaultAssay}{SpatialImage}(object, ...) + \method{DefaultAssay}{Seurat}(object, ...) <- value + +\method{DefaultAssay}{SpatialImage}(object, ...) <- value } \arguments{ \item{object}{An object} diff --git a/man/DotPlot.Rd b/man/DotPlot.Rd index a7cd18516..cd0cca233 100644 --- a/man/DotPlot.Rd +++ b/man/DotPlot.Rd @@ -14,8 +14,10 @@ DotPlot( col.max = 2.5, dot.min = 0, dot.scale = 6, + idents = NULL, group.by = NULL, split.by = NULL, + cluster.idents = FALSE, scale = TRUE, scale.by = "radius", scale.min = NA, @@ -27,13 +29,16 @@ DotPlot( \item{assay}{Name of assay to use, defaults to the active assay} -\item{features}{Input vector of features} +\item{features}{Input vector of features, or named list of feature vectors +if feature-grouped panels are desired (replicates the functionality of the +old SplitDotPlotGG)} -\item{cols}{Colors to plot, can pass a single character giving the name of -a palette from \code{RColorBrewer::brewer.pal.info}} +\item{cols}{Colors to plot: the name of a palette from +\code{RColorBrewer::brewer.pal.info}, a pair of colors defining a gradient, +or 3+ colors defining multiple gradients (if split.by is set)} -\item{col.min}{Minimum scaled average expression threshold (everything smaller -will be set to this)} +\item{col.min}{Minimum scaled average expression threshold (everything +smaller will be set to this)} \item{col.max}{Maximum scaled average expression threshold (everything larger will be set to this)} @@ -44,11 +49,17 @@ gene will have no dot drawn.} \item{dot.scale}{Scale the size of the points, similar to cex} +\item{idents}{Identity classes to include in plot (default is all)} + \item{group.by}{Factor to group the cells by} -\item{split.by}{Factor to split the groups by (replicates the functionality of the old SplitDotPlotGG); +\item{split.by}{Factor to split the groups by (replicates the functionality +of the old SplitDotPlotGG); see \code{\link{FetchData}} for more details} +\item{cluster.idents}{Whether to order identities by hierarchical clusters +based on given features, default is FALSE} + \item{scale}{Determine whether the data is scaled, TRUE for default} \item{scale.by}{Scale the size of the points by 'size' or by 'radius'} diff --git a/man/FeaturePlot.Rd b/man/FeaturePlot.Rd index b81f43986..a0839ac9a 100644 --- a/man/FeaturePlot.Rd +++ b/man/FeaturePlot.Rd @@ -29,6 +29,7 @@ FeaturePlot( coord.fixed = FALSE, by.col = TRUE, sort.cell = NULL, + interactive = FALSE, combine = TRUE ) } @@ -95,6 +96,8 @@ different colors and different shapes on cells} \item{sort.cell}{Redundant with \code{order}. This argument is being deprecated. Please use \code{order} instead.} +\item{interactive}{Launch an interactive \code{\link[Seurat:IFeaturePlot]{FeaturePlot}}} + \item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} ggplot object. If \code{FALSE}, return a list of ggplot objects} } diff --git a/man/FilterSlideSeq.Rd b/man/FilterSlideSeq.Rd new file mode 100644 index 000000000..76644b72c --- /dev/null +++ b/man/FilterSlideSeq.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\name{FilterSlideSeq} +\alias{FilterSlideSeq} +\title{Filter stray beads from Slide-seq puck} +\usage{ +FilterSlideSeq( + object, + image = "image", + center = NULL, + radius = NULL, + do.plot = TRUE +) +} +\arguments{ +\item{object}{Seurat object with slide-seq data} + +\item{image}{Name of the image where the coordinates are stored} + +\item{center}{Vector specifying the x and y coordinates for the center of the +inclusion circle} + +\item{radius}{Radius of the circle of inclusion} + +\item{do.plot}{Display a \code{\link{SpatialDimPlot}} with the cells being +removed labeled.} +} +\value{ +Returns a Seurat object with only the subset of cells that pass the +circular filter +} +\description{ +This function is useful for removing stray beads that fall outside the main +Slide-seq puck area. Essentially, it's a circular filter where you set a +center and radius defining a circle of beads to keep. If the center is not +set, it will be estimated from the bead coordinates (removing the 1st and +99th quantile to avoid skewing the center by the stray beads). By default, +this function will display a \code{\link{SpatialDimPlot}} showing which cells +were removed for easy adjustment of the center and/or radius. +} +\examples{ +\dontrun{ +# This example uses the ssHippo dataset which you can download +# using the SeuratData package. +library(SeuratData) +data('ssHippo') +# perform filtering of beads +ssHippo.filtered <- FilterSlideSeq(ssHippo, radius = 2300) +# This radius looks to small so increase and repeat until satisfied +} +} diff --git a/man/FindClusters.Rd b/man/FindClusters.Rd index 83f45f22e..18e264c6a 100644 --- a/man/FindClusters.Rd +++ b/man/FindClusters.Rd @@ -12,7 +12,6 @@ FindClusters(object, ...) object, modularity.fxn = 1, initial.membership = NULL, - weights = NULL, node.sizes = NULL, resolution = 0.8, method = "matrix", @@ -32,7 +31,6 @@ FindClusters(object, ...) graph.name = NULL, modularity.fxn = 1, initial.membership = NULL, - weights = NULL, node.sizes = NULL, resolution = 0.8, method = "matrix", @@ -54,7 +52,7 @@ FindClusters(object, ...) \item{modularity.fxn}{Modularity function (1 = standard; 2 = alternative).} -\item{initial.membership, weights, node.sizes}{Parameters to pass to the Python leidenalg function.} +\item{initial.membership, node.sizes}{Parameters to pass to the Python leidenalg function.} \item{resolution}{Value of the resolution parameter, use a value above (below) 1.0 if you want to obtain a larger (smaller) number of communities.} diff --git a/man/FindNeighbors.Rd b/man/FindNeighbors.Rd index 61d15cc1e..38c8e1986 100644 --- a/man/FindNeighbors.Rd +++ b/man/FindNeighbors.Rd @@ -116,7 +116,9 @@ default of 0.0 implies exact nearest neighbor search} assay.name_snn.} } \value{ -Returns the object with object@snn filled +When running on a \code{\link{Seurat}} object, returns fills the +\code{graphs} slot; names of graphs can be found with +\code{Filter(function(x) inherits(object[[x]], "Graph"), names(object))} } \description{ Constructs a Shared Nearest Neighbor (SNN) Graph for a given dataset. We diff --git a/man/FindSpatiallyVariableFeatures.Rd b/man/FindSpatiallyVariableFeatures.Rd new file mode 100644 index 000000000..e708955ed --- /dev/null +++ b/man/FindSpatiallyVariableFeatures.Rd @@ -0,0 +1,90 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/preprocessing.R +\name{FindSpatiallyVariableFeatures} +\alias{FindSpatiallyVariableFeatures} +\alias{FindSpatiallyVariableFeatures.default} +\alias{FindSpatiallyVariableFeatures.Assay} +\alias{FindSpatiallyVariableFeatures.Seurat} +\title{Find spatially variable features} +\usage{ +FindSpatiallyVariableFeatures(object, ...) + +\method{FindSpatiallyVariableFeatures}{default}( + object, + spatial.location, + selection.method = c("markvariogram", "moransi"), + r.metric = 5, + x.cuts = NULL, + y.cuts = NULL, + verbose = TRUE, + ... +) + +\method{FindSpatiallyVariableFeatures}{Assay}( + object, + slot = "scale.data", + spatial.location, + selection.method = c("markvariogram", "moransi"), + features = NULL, + r.metric = 5, + x.cuts = NULL, + y.cuts = NULL, + nfeatures = nfeatures, + verbose = TRUE, + ... +) + +\method{FindSpatiallyVariableFeatures}{Seurat}( + object, + assay = NULL, + slot = "scale.data", + features = NULL, + image = NULL, + selection.method = c("markvariogram", "moransi"), + r.metric = 5, + x.cuts = NULL, + y.cuts = NULL, + nfeatures = 2000, + verbose = TRUE, + ... +) +} +\arguments{ +\item{object}{A Seurat object, assay, or expression matrix} + +\item{...}{Arguments passed to other methods} + +\item{spatial.location}{Coordinates for each cell/spot/bead} + +\item{selection.method}{Method for selecting spatially variable features. + \itemize{ + \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details + \item \code{moransi}: See \code{\link{RunMoransI}} for details. +}} + +\item{r.metric}{r value at which to report the "trans" value of the mark +variogram} + +\item{x.cuts}{Number of divisions to make in the x direction, helps define +the grid over which binning is performed} + +\item{y.cuts}{Number of divisions to make in the y direction, helps define +the grid over which binning is performed} + +\item{verbose}{Print messages and progress} + +\item{slot}{Slot in the Assay to pull data from} + +\item{features}{If provided, only compute on given features. Otherwise, +compute for all features.} + +\item{nfeatures}{Number of features to mark as the top spatially variable.} + +\item{assay}{Assay to pull the features (marks) from} + +\item{image}{Name of image to pull the coordinates from} +} +\description{ +Identify features whose variability in expression can be explained to some +degree by spatial location. +} diff --git a/man/GetImage.Rd b/man/GetImage.Rd new file mode 100644 index 000000000..61d2d046d --- /dev/null +++ b/man/GetImage.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/objects.R +\name{GetImage} +\alias{GetImage} +\alias{GetImage.Seurat} +\alias{GetImage.VisiumV1} +\title{Get image data} +\usage{ +GetImage(object, mode = c("grob", "raster", "plotly", "raw"), ...) + +\method{GetImage}{Seurat}( + object, + mode = c("grob", "raster", "plotly", "raw"), + image = NULL, + ... +) + +\method{GetImage}{VisiumV1}(object, mode = c("grob", "raster", "plotly", "raw"), ...) +} +\arguments{ +\item{object}{An object} + +\item{mode}{How to return the image; should accept one of 'grob', 'raster', +'plotly', or 'raw'} + +\item{...}{Arguments passed to other methods} + +\item{image}{Name of \code{SpatialImage} object to pull image data for; if +\code{NULL}, will attempt to select an image automatically} +} +\value{ +Image data, varying depending on the value of \code{mode}: +\describe{ + \item{'grob'}{An object representing image data inheriting from \code{grob} objects (eg. \code{rastergrob})} + \item{'raster'}{An object of class \code{raster}} + \item{'plotly'}{A list with image data suitable for Plotly rendering, see \code{\link[plotly]{layout}} for more details} + \item{'raw'}{The raw image data as stored in the object} +} +} +\description{ +Get image data +} +\seealso{ +\code{\link[plotly]{layout}} +} diff --git a/man/GetTissueCoordinates.Rd b/man/GetTissueCoordinates.Rd new file mode 100644 index 000000000..03af50e51 --- /dev/null +++ b/man/GetTissueCoordinates.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/objects.R +\name{GetTissueCoordinates} +\alias{GetTissueCoordinates} +\alias{GetTissueCoordinates.Seurat} +\alias{GetTissueCoordinates.VisiumV1} +\title{Get tissue coordinates} +\usage{ +GetTissueCoordinates(object, ...) + +\method{GetTissueCoordinates}{Seurat}(object, image = NULL, ...) + +\method{GetTissueCoordinates}{VisiumV1}( + object, + scale = "lowres", + cols = c("imagerow", "imagecol"), + ... +) +} +\arguments{ +\item{object}{An object} + +\item{...}{Arguments passed to other methods} + +\item{image}{Name of \code{SpatialImage} object to get coordinates for; if +\code{NULL}, will attempt to select an image automatically} + +\item{scale}{A factor to scale the coordinates by; choose from: 'tissue', +'fiducial', 'hires', 'lowres', or \code{NULL} for no scaling} + +\item{cols}{Columns of tissue coordinates data.frame to pull} +} +\value{ +A data.frame with tissue coordinates +} +\description{ +Get tissue coordinates +} diff --git a/man/GetTransferPredictions.Rd b/man/GetTransferPredictions.Rd new file mode 100644 index 000000000..4f8362593 --- /dev/null +++ b/man/GetTransferPredictions.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/integration.R +\name{GetTransferPredictions} +\alias{GetTransferPredictions} +\title{Get the predicted identity} +\usage{ +GetTransferPredictions( + object, + assay = "predictions", + slot = "data", + score.filter = 0.75 +) +} +\arguments{ +\item{object}{Seurat object} + +\item{assay}{Name of the assay holding the predictions} + +\item{slot}{Slot of the assay in which the prediction scores are stored} + +\item{score.filter}{Return "Unassigned" for any cell with a score less than +this value} +} +\value{ +Returns a vector of predicted class names +} +\description{ +Utility function to easily pull out the name of the class with the maximum +prediction. This is useful if you've set \code{prediction.assay = TRUE} in +\code{\link{TransferData}} and want to have a vector with the predicted class. +} +\examples{ +\dontrun{ + prediction.assay <- TransferData(anchorset = anchors, refdata = reference$class) + query[["predictions"]] <- prediction.assay + query$predicted.id <- GetTransferPredictions(query) +} +} diff --git a/man/GroupCorrelation.Rd b/man/GroupCorrelation.Rd new file mode 100644 index 000000000..99c7bef4b --- /dev/null +++ b/man/GroupCorrelation.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilities.R +\name{GroupCorrelation} +\alias{GroupCorrelation} +\title{Compute the correlation of features broken down by groups with another +covariate} +\usage{ +GroupCorrelation( + object, + assay = NULL, + slot = "scale.data", + var = NULL, + group.assay = NULL, + min.cells = 5, + ngroups = 6, + do.plot = TRUE +) +} +\arguments{ +\item{object}{Seurat object} + +\item{assay}{Assay to pull the data from} + +\item{slot}{Slot in the assay to pull feature expression data from (counts, +data, or scale.data)} + +\item{var}{Variable with which to correlate the features} + +\item{group.assay}{Compute the gene groups based off the data in this assay.} + +\item{min.cells}{Only compute for genes in at least this many cells} + +\item{ngroups}{Number of groups to split into} + +\item{do.plot}{Display the group correlation boxplot (via +\code{GroupCorrelationPlot})} +} +\value{ +A Seurat object with the correlation stored in metafeatures +} +\description{ +Compute the correlation of features broken down by groups with another +covariate +} diff --git a/man/GroupCorrelationPlot.Rd b/man/GroupCorrelationPlot.Rd new file mode 100644 index 000000000..1fd265955 --- /dev/null +++ b/man/GroupCorrelationPlot.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{GroupCorrelationPlot} +\alias{GroupCorrelationPlot} +\title{Boxplot of correlation of a variable (e.g. number of UMIs) with expression +data} +\usage{ +GroupCorrelationPlot( + object, + assay = NULL, + feature.group = "feature.grp", + cor = "nCount_RNA_cor" +) +} +\arguments{ +\item{object}{Seurat object} + +\item{assay}{Assay where the feature grouping info and correlations are +stored} + +\item{feature.group}{Name of the column in meta.features where the feature +grouping info is stored} + +\item{cor}{Name of the column in meta.features where correlation info is +stored} +} +\value{ +Returns a ggplot boxplot of correlations split by group +} +\description{ +Boxplot of correlation of a variable (e.g. number of UMIs) with expression +data +} diff --git a/man/HoverLocator.Rd b/man/HoverLocator.Rd index fd1843def..4ee3b0816 100644 --- a/man/HoverLocator.Rd +++ b/man/HoverLocator.Rd @@ -4,16 +4,18 @@ \alias{HoverLocator} \title{Hover Locator} \usage{ -HoverLocator(plot, information = NULL, dark.theme = FALSE, ...) +HoverLocator(plot, information = NULL, axes = TRUE, dark.theme = FALSE, ...) } \arguments{ \item{plot}{A ggplot2 plot} \item{information}{An optional dataframe or matrix of extra information to be displayed on hover} +\item{axes}{Display or hide x- and y-axes} + \item{dark.theme}{Plot using a dark theme?} -\item{...}{Extra parameters to be passed to \code{plotly::layout}} +\item{...}{Extra parameters to be passed to \code{\link[plotly]{layout}}} } \description{ Get quick information from a scatterplot by hovering over points diff --git a/man/IFeaturePlot.Rd b/man/IFeaturePlot.Rd new file mode 100644 index 000000000..91eb22e99 --- /dev/null +++ b/man/IFeaturePlot.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{IFeaturePlot} +\alias{IFeaturePlot} +\title{Visualize features in dimensional reduction space interactively} +\usage{ +IFeaturePlot(object, feature, dims = c(1, 2), reduction = NULL, slot = "data") +} +\arguments{ +\item{object}{Seurat object} + +\item{feature}{Feature to plot} + +\item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} + +\item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} + +\item{slot}{Which slot to pull expression data from?} +} +\value{ +Returns the final plot as a ggplot object +} +\description{ +Visualize features in dimensional reduction space interactively +} diff --git a/man/ISpatialDimPlot.Rd b/man/ISpatialDimPlot.Rd new file mode 100644 index 000000000..509de50ff --- /dev/null +++ b/man/ISpatialDimPlot.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{ISpatialDimPlot} +\alias{ISpatialDimPlot} +\title{Visualize clusters spatially and interactively} +\usage{ +ISpatialDimPlot(object, image = NULL, group.by = NULL, alpha = c(0.3, 1)) +} +\arguments{ +\item{object}{Seurat object} + +\item{image}{Name of the image to use in the plot} + +\item{group.by}{Name of one or more metadata columns to group (color) cells by +(for example, orig.ident); pass 'ident' to group by identity class} + +\item{alpha}{Controls opacity of spots. Provide as a vector specifying the +min and max} +} +\value{ +Returns final plot as a ggplot object +} +\description{ +Visualize clusters spatially and interactively +} diff --git a/man/ISpatialFeaturePlot.Rd b/man/ISpatialFeaturePlot.Rd new file mode 100644 index 000000000..0aa3da853 --- /dev/null +++ b/man/ISpatialFeaturePlot.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{ISpatialFeaturePlot} +\alias{ISpatialFeaturePlot} +\title{Visualize features spatially and interactively} +\usage{ +ISpatialFeaturePlot( + object, + feature, + image = NULL, + slot = "data", + alpha = c(0.1, 1) +) +} +\arguments{ +\item{object}{Seurat object} + +\item{feature}{Feature to visualize} + +\item{image}{Name of the image to use in the plot} + +\item{slot}{Which slot to pull expression data from?} + +\item{alpha}{Controls opacity of spots. Provide as a vector specifying the +min and max} +} +\value{ +Returns final plot as a ggplot object +} +\description{ +Visualize features spatially and interactively +} diff --git a/man/Images.Rd b/man/Images.Rd new file mode 100644 index 000000000..abe02d839 --- /dev/null +++ b/man/Images.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\name{Images} +\alias{Images} +\title{Pull spatial image names} +\usage{ +Images(object, assay = NULL) +} +\arguments{ +\item{object}{A \code{Seurat} object} + +\item{assay}{Name of assay to limit search to} +} +\value{ +A list of image names +} +\description{ +List the names of \code{SpatialImage} objects present in a \code{Seurat} object. +If \code{assay} is provided, limits search to images associated with that assay +} +\examples{ +\dontrun{ +Images(object) +} + +} diff --git a/man/IsGlobal.Rd b/man/IsGlobal.Rd index 6850a4bde..63bfc6317 100644 --- a/man/IsGlobal.Rd +++ b/man/IsGlobal.Rd @@ -4,18 +4,19 @@ \alias{IsGlobal} \alias{IsGlobal.default} \alias{IsGlobal.DimReduc} +\alias{IsGlobal.SpatialImage} \title{Is an object global/persistent?} \usage{ -IsGlobal(object, ...) +IsGlobal(object) -\method{IsGlobal}{default}(object, ...) +\method{IsGlobal}{default}(object) -\method{IsGlobal}{DimReduc}(object, ...) +\method{IsGlobal}{DimReduc}(object) + +\method{IsGlobal}{SpatialImage}(object) } \arguments{ \item{object}{An object} - -\item{...}{Arguments passed to other methods} } \value{ \code{TRUE} if the object is global/persistent otherwise \code{FALSE} diff --git a/man/Key.Rd b/man/Key.Rd index 97cbbc7eb..367983be7 100644 --- a/man/Key.Rd +++ b/man/Key.Rd @@ -6,8 +6,10 @@ \alias{Key.Assay} \alias{Key.DimReduc} \alias{Key.Seurat} +\alias{Key.SpatialImage} \alias{Key<-.Assay} \alias{Key<-.DimReduc} +\alias{Key<-.SpatialImage} \title{Get a key} \usage{ Key(object, ...) @@ -20,9 +22,13 @@ Key(object, ...) <- value \method{Key}{Seurat}(object, ...) +\method{Key}{SpatialImage}(object, ...) + \method{Key}{Assay}(object, ...) <- value \method{Key}{DimReduc}(object, ...) <- value + +\method{Key}{SpatialImage}(object, ...) <- value } \arguments{ \item{object}{An object} diff --git a/man/LabelClusters.Rd b/man/LabelClusters.Rd index ba34e2a94..1e0b9a4f1 100644 --- a/man/LabelClusters.Rd +++ b/man/LabelClusters.Rd @@ -11,6 +11,9 @@ LabelClusters( labels = NULL, split.by = NULL, repel = TRUE, + box = FALSE, + geom = "GeomPoint", + position = "median", ... ) } @@ -28,6 +31,15 @@ LabelClusters( \item{repel}{Use \code{geom_text_repel} to create nicely-repelled labels} +\item{box}{Use geom_label/geom_label_repel (includes a box around the text +labels)} + +\item{geom}{Name of geom to get X/Y aesthetic names for} + +\item{position}{How to place the label if repel = FALSE. If "median", place +the label at the median position. If "nearest" place the label at the +position of the nearest data point to the median.} + \item{...}{Extra parameters to \code{\link[ggrepel]{geom_text_repel}}, such as \code{size}} } \value{ diff --git a/man/LinkedPlots.Rd b/man/LinkedPlots.Rd new file mode 100644 index 000000000..01c2a5ab4 --- /dev/null +++ b/man/LinkedPlots.Rd @@ -0,0 +1,68 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{LinkedPlots} +\alias{LinkedPlots} +\alias{LinkedDimPlot} +\alias{LinkedPlot} +\alias{LinkedFeaturePlot} +\title{Visualize spatial and clustering (dimensional reduction) data in a linked, +interactive framework} +\usage{ +LinkedDimPlot( + object, + dims = 1:2, + reduction = NULL, + image = NULL, + group.by = NULL, + alpha = c(0.1, 1), + combine = TRUE +) + +LinkedFeaturePlot( + object, + feature, + dims = 1:2, + reduction = NULL, + image = NULL, + slot = "data", + alpha = c(0.1, 1), + combine = TRUE +) +} +\arguments{ +\item{object}{Seurat object} + +\item{dims}{Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions} + +\item{reduction}{Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca} + +\item{image}{Name of the image to use in the plot} + +\item{group.by}{Name of one or more metadata columns to group (color) cells by +(for example, orig.ident); pass 'ident' to group by identity class} + +\item{alpha}{Controls opacity of spots. Provide as a vector specifying the +min and max} + +\item{combine}{Combine plots into a single \code{\link[patchwork]{patchwork}ed} +ggplot object. If \code{FALSE}, return a list of ggplot objects} + +\item{feature}{Feature to visualize} + +\item{slot}{Which slot to pull expression data from?} +} +\value{ +Returns final plots. If \code{combine}, plots are stiched together +using \code{\link{CombinePlots}}; otherwise, returns a list of ggplot objects +} +\description{ +Visualize spatial and clustering (dimensional reduction) data in a linked, +interactive framework +} +\examples{ +\dontrun{ +LinkedDimPlot(seurat.object) +LinkedFeaturePlot(seurat.object, feature = 'Hpca') +} + +} diff --git a/man/Load10X_Spatial.Rd b/man/Load10X_Spatial.Rd new file mode 100644 index 000000000..5680cd8ab --- /dev/null +++ b/man/Load10X_Spatial.Rd @@ -0,0 +1,50 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/preprocessing.R +\name{Load10X_Spatial} +\alias{Load10X_Spatial} +\title{Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object} +\usage{ +Load10X_Spatial( + data.dir, + filename = "filtered_feature_bc_matrix.h5", + assay = "Spatial", + slice = "slice1", + filter.matrix = TRUE, + to.upper = FALSE, + ... +) +} +\arguments{ +\item{data.dir}{Directory containing the matrix.mtx, genes.tsv (or features.tsv), and barcodes.tsv +files provided by 10X. A vector or named vector can be given in order to load +several data directories. If a named vector is given, the cell barcode names +will be prefixed with the name.} + +\item{filename}{Name of H5 file containing the feature barcode matrix} + +\item{assay}{Name of the initial assay} + +\item{slice}{Name for the stored image of the tissue slice} + +\item{filter.matrix}{Only keep spots that have been determined to be over +tissue} + +\item{to.upper}{Converts all feature names to upper case. Can be useful when +analyses require comparisons between human and mouse gene names for example.} + +\item{...}{Arguments passed to \code{\link{Read10X_h5}}} +} +\value{ +A \code{Seurat} object +} +\description{ +Load a 10x Genomics Visium Spatial Experiment into a \code{Seurat} object +} +\examples{ +\dontrun{ +data_dir <- 'path/to/data/directory' +list.files(data_dir) # Should show filtered_feature_bc_matrix.h5 +Load10X_Spatial(data.dir = data_dir) +} + +} diff --git a/man/LoadSTARmap.Rd b/man/LoadSTARmap.Rd new file mode 100644 index 000000000..4a933a6eb --- /dev/null +++ b/man/LoadSTARmap.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/preprocessing.R +\name{LoadSTARmap} +\alias{LoadSTARmap} +\title{Load STARmap data} +\usage{ +LoadSTARmap( + data.dir, + counts.file = "cell_barcode_count.csv", + gene.file = "genes.csv", + qhull.file = "qhulls.tsv", + centroid.file = "centroids.tsv", + assay = "Spatial", + image = "image" +) +} +\arguments{ +\item{data.dir}{location of data directory that contains the counts matrix, +gene name, qhull, and centroid files.} + +\item{counts.file}{name of file containing the counts matrix (csv)} + +\item{gene.file}{name of file containing the gene names (csv)} + +\item{qhull.file}{name of file containing the hull coordinates (tsv)} + +\item{centroid.file}{name of file containing the centroid positions (tsv)} + +\item{assay}{Name of assay to associate spatial data to} + +\item{image}{Name of "image" object storing spatial coordinates} +} +\value{ +A \code{\link{Seurat}} object +} +\description{ +Load STARmap data +} +\seealso{ +\code{\link{STARmap}} +} diff --git a/man/Radius.Rd b/man/Radius.Rd new file mode 100644 index 000000000..97dd95ec8 --- /dev/null +++ b/man/Radius.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/objects.R +\name{Radius} +\alias{Radius} +\alias{Radius.SlideSeq} +\alias{Radius.STARmap} +\alias{Radius.VisiumV1} +\title{Get the spot radius from an image} +\usage{ +Radius(object) + +\method{Radius}{SlideSeq}(object) + +\method{Radius}{STARmap}(object) + +\method{Radius}{VisiumV1}(object) +} +\arguments{ +\item{object}{An image object} +} +\value{ +The radius size +} +\description{ +Get the spot radius from an image +} diff --git a/man/Read10X_Image.Rd b/man/Read10X_Image.Rd new file mode 100644 index 000000000..8e4141926 --- /dev/null +++ b/man/Read10X_Image.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/preprocessing.R +\name{Read10X_Image} +\alias{Read10X_Image} +\title{Load a 10X Genomics Visium Image} +\usage{ +Read10X_Image(image.dir, filter.matrix = TRUE, ...) +} +\arguments{ +\item{image.dir}{Path to directory with 10X Genomics visium image data; +should include files \code{tissue_lowres_iamge.png}, +\code{scalefactors_json.json} and \code{tissue_positions_list.csv}} + +\item{filter.matrix}{Filter spot/feature matrix to only include spots that +have been determined to be over tissue.} + +\item{...}{Ignored for now} +} +\value{ +A \code{\link{VisiumV1}} object +} +\description{ +Load a 10X Genomics Visium Image +} +\seealso{ +\code{\link{VisiumV1}} \code{\link{Load10X_Spatial}} +} diff --git a/man/ReadSlideSeq.Rd b/man/ReadSlideSeq.Rd new file mode 100644 index 000000000..cf805b67d --- /dev/null +++ b/man/ReadSlideSeq.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/preprocessing.R +\name{ReadSlideSeq} +\alias{ReadSlideSeq} +\title{Load Slide-seq spatial data} +\usage{ +ReadSlideSeq(coord.file, assay = "Spatial") +} +\arguments{ +\item{coord.file}{Path to csv file containing bead coordinate positions} + +\item{assay}{Name of assay to associate image to} +} +\value{ +A \code{\link{SlideSeq}} object +} +\description{ +Load Slide-seq spatial data +} +\seealso{ +\code{\link{SlideSeq}} +} diff --git a/man/RenameCells.Rd b/man/RenameCells.Rd index 8a071cf75..9de23c626 100644 --- a/man/RenameCells.Rd +++ b/man/RenameCells.Rd @@ -5,6 +5,7 @@ \alias{RenameCells.Assay} \alias{RenameCells.DimReduc} \alias{RenameCells.Seurat} +\alias{RenameCells.VisiumV1} \title{Rename cells} \usage{ RenameCells(object, ...) @@ -20,6 +21,8 @@ RenameCells(object, ...) for.merge = FALSE, ... ) + +\method{RenameCells}{VisiumV1}(object, new.names = NULL, ...) } \arguments{ \item{object}{An object} diff --git a/man/RunMarkVario.Rd b/man/RunMarkVario.Rd new file mode 100644 index 000000000..400edd640 --- /dev/null +++ b/man/RunMarkVario.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/preprocessing.R +\name{RunMarkVario} +\alias{RunMarkVario} +\title{Run the mark variogram computation on a given position matrix and expression +matrix.} +\usage{ +RunMarkVario(spatial.location, data, ...) +} +\arguments{ +\item{spatial.location}{A 2 column matrix giving the spatial locations of +each of the data points also in data} + +\item{data}{Matrix containing the data used as "marks" (e.g. gene expression)} + +\item{...}{Arguments passed to markvario} +} +\description{ +Wraps the functionality of markvario from the spatstat package. +} diff --git a/man/RunMoransI.Rd b/man/RunMoransI.Rd new file mode 100644 index 000000000..f397ea3d7 --- /dev/null +++ b/man/RunMoransI.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/preprocessing.R +\name{RunMoransI} +\alias{RunMoransI} +\title{Compute Moran's I value.} +\usage{ +RunMoransI(data, pos, verbose = TRUE) +} +\arguments{ +\item{data}{Expression matrix} + +\item{pos}{Position matrix} + +\item{verbose}{Display messages/progress} +} +\description{ +Wraps the functionality of the Moran.I function from the ape package. +Weights are computed as 1/distance. +} diff --git a/man/RunTSNE.Rd b/man/RunTSNE.Rd index 34136f686..9184e9e00 100644 --- a/man/RunTSNE.Rd +++ b/man/RunTSNE.Rd @@ -15,7 +15,6 @@ RunTSNE(object, ...) assay = NULL, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, reduction.key = "tSNE_", ... @@ -27,7 +26,6 @@ RunTSNE(object, ...) dims = 1:5, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, reduction.key = "tSNE_", ... @@ -38,7 +36,6 @@ RunTSNE(object, ...) assay = NULL, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, reduction.key = "tSNE_", ... @@ -52,7 +49,6 @@ RunTSNE(object, ...) features = NULL, seed.use = 1, tsne.method = "Rtsne", - add.iter = 0, dim.embed = 2, distance.matrix = NULL, reduction.name = "tsne", @@ -77,10 +73,6 @@ methods are: Kluger Lab code found here: https://github.com/KlugerLab/FIt-SNE} }} -\item{add.iter}{If an existing tSNE has already been computed, uses the -current tSNE to seed the algorithm and then adds additional iterations on top -of this} - \item{dim.embed}{The dimensional space of the resulting tSNE embedding (default is 2). For example, set to 3 for a 3d tSNE} diff --git a/man/STARmap-class.Rd b/man/STARmap-class.Rd new file mode 100644 index 000000000..484a3833b --- /dev/null +++ b/man/STARmap-class.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\docType{class} +\name{STARmap-class} +\alias{STARmap-class} +\alias{STARmap} +\title{The STARmap class} +\description{ +The STARmap class represents spatial information from the STARmap platform +} +\section{Slots}{ + +\describe{ +\item{\code{...}}{} +}} + diff --git a/man/SVFInfo.Rd b/man/SVFInfo.Rd new file mode 100644 index 000000000..2aa396635 --- /dev/null +++ b/man/SVFInfo.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/objects.R +\name{SVFInfo} +\alias{SVFInfo} +\alias{SVFInfo.Assay} +\alias{SVFInfo.Seurat} +\title{Get spatially variable feature information} +\usage{ +SVFInfo(object, ...) + +\method{SVFInfo}{Assay}( + object, + selection.method = c("markvariogram", "moransi"), + status = FALSE, + ... +) + +\method{SVFInfo}{Seurat}( + object, + selection.method = c("markvariogram", "moransi"), + assay = NULL, + status = FALSE, + ... +) +} +\arguments{ +\item{object}{An object} + +\item{...}{Arguments passed to other methods} + +\item{selection.method}{Which method to pull. Options: markvariogram, moransi} + +\item{status}{Add variable status to the resulting data.frame} + +\item{assay}{Name of assay to pull highly variable feature information for} +} +\description{ +Get spatially variable feature information +} diff --git a/man/ScaleData.Rd b/man/ScaleData.Rd index d39e0791c..af65204d5 100644 --- a/man/ScaleData.Rd +++ b/man/ScaleData.Rd @@ -87,11 +87,11 @@ modeling, but automatically set to TRUE if model.use is 'negbinom' or 'poisson'} \item{do.center}{Whether to center the data.} \item{scale.max}{Max value to return for scaled data. The default is 10. -Setting this can help reduce the effects of feautres that are only expressed in +Setting this can help reduce the effects of features that are only expressed in a very small number of cells. If regressing out latent variables and using a non-linear model, the default is 50.} -\item{block.size}{Default size for number of feautres to scale at in a single +\item{block.size}{Default size for number of features to scale at in a single computation. Increasing block.size may speed up calculations but at an additional memory cost.} @@ -104,7 +104,7 @@ don't block for scaling calculations.} } \description{ Scales and centers features in the dataset. If variables are provided in vars.to.regress, -they are individually regressed against each feautre, and the resulting residuals are +they are individually regressed against each feature, and the resulting residuals are then scaled and centered. } \details{ @@ -113,9 +113,9 @@ as RegressOut (which regressed out given the effects of provided variables and then scaled the residuals). To make use of the regression functionality, simply pass the variables you want to remove to the vars.to.regress parameter. -Setting center to TRUE will center the expression for each feautre by subtracting -the average expression for that feautre. Setting scale to TRUE will scale the -expression level for each feautre by dividing the centered feautre expression +Setting center to TRUE will center the expression for each feature by subtracting +the average expression for that feature. Setting scale to TRUE will scale the +expression level for each feature by dividing the centered feature expression levels by their standard deviations if center is TRUE and by their root mean square otherwise. } diff --git a/man/ScaleFactors.Rd b/man/ScaleFactors.Rd new file mode 100644 index 000000000..e16722baa --- /dev/null +++ b/man/ScaleFactors.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/objects.R +\name{ScaleFactors} +\alias{ScaleFactors} +\alias{scalefactors} +\alias{ScaleFactors.VisiumV1} +\title{Get image scale factors} +\usage{ +ScaleFactors(object, ...) + +scalefactors(spot, fiducial, hires, lowres) + +\method{ScaleFactors}{VisiumV1}(object, ...) +} +\arguments{ +\item{object}{An object to get scale factors from} + +\item{...}{Arguments passed to other methods} + +\item{spot}{Spot full resolution scale factor} + +\item{fiducial}{Fiducial full resolution scale factor} + +\item{hires}{High resolutoin scale factor} + +\item{lowres}{Low resolution scale factor} +} +\value{ +An object of class \code{scalefactors} +} +\description{ +Get image scale factors +} +\note{ +\code{scalefactors} objects can be created with \code{scalefactors()} +} diff --git a/man/Seurat-class.Rd b/man/Seurat-class.Rd index 64eb5ee76..80302f43e 100644 --- a/man/Seurat-class.Rd +++ b/man/Seurat-class.Rd @@ -28,10 +28,12 @@ and the original identity class (orig.ident); more information is added using \c \item{\code{graphs}}{A list of \code{\link{Graph-class}} objects} -\item{\code{neighbors}}{...} +\item{\code{neighbors}}{Unused at this time} \item{\code{reductions}}{A list of dimmensional reduction objects for this object} +\item{\code{images}}{A list of spatial image objects} + \item{\code{project.name}}{Name of the project} \item{\code{misc}}{A list of miscellaneous information} diff --git a/man/Seurat-package.Rd b/man/Seurat-package.Rd index 8fe0af6ab..6e4f76fa7 100644 --- a/man/Seurat-package.Rd +++ b/man/Seurat-package.Rd @@ -20,15 +20,17 @@ Seurat uses the following [options()] to configure behaviour: This can be helpful in cleaning up the memory status of the R session and prevent use of swap space. However, it does add to the computational overhead and setting to FALSE can speed things up if you're working in an environment - where RAM availabiliy is not a concern.} + where RAM availability is not a concern.} \item{\code{Seurat.warn.umap.uwot}}{Show warning about the default backend for \code{\link{RunUMAP}} changing from Python UMAP via reticulate to UWOT} \item{\code{Seurat.checkdots}}{For functions that have ... as a parameter, this controls the behavior when an item isn't used. Can be one of warn, stop, or silent.} - \item{\code{Seurat.limma.wilcox.msg}}{Show message about more efficient - Wilcoxon Rank Sum test available via the limma package} - \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to + \item{\code{Seurat.limma.wilcox.msg}}{{Show message about more efficient + Wilcoxon Rank Sum test available via the limma package}} + \item{\code{Seurat.Rfast2.msg}}{{Show message about more efficient + Moran's I function available via the Rfast2 package}} + \item{\code{Seurat.warn.vlnplot.split}}{Show message about changes to default behavior of split/multi violin plots} } } diff --git a/man/SlideSeq-class.Rd b/man/SlideSeq-class.Rd new file mode 100644 index 000000000..d572ad700 --- /dev/null +++ b/man/SlideSeq-class.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\docType{class} +\name{SlideSeq-class} +\alias{SlideSeq-class} +\alias{SlideSeq} +\title{The SlideSeq class} +\description{ +The SlideSeq class represents spatial information from the Slide-seq platform +} +\section{Slots}{ + +\describe{ +\item{\code{coordinates}}{...} + +\item{\code{...}}{} +}} + diff --git a/man/SpatialImage-class.Rd b/man/SpatialImage-class.Rd new file mode 100644 index 000000000..1708dc10c --- /dev/null +++ b/man/SpatialImage-class.Rd @@ -0,0 +1,94 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\docType{class} +\name{SpatialImage-class} +\alias{SpatialImage-class} +\alias{SpatialImage} +\alias{Cells.SpatialImage} +\alias{GetImage.SpatialImage} +\alias{GetTissueCoordinates.SpatialImage} +\alias{Radius.SpatialImage} +\alias{RenameCells.SpatialImage} +\alias{[.SpatialImage} +\alias{dim.SpatialImage} +\alias{subset.SpatialImage} +\title{The SpatialImage class} +\usage{ +\method{Cells}{SpatialImage}(x) + +\method{GetImage}{SpatialImage}(object, mode = c("grob", "raster", "plotly", "raw"), ...) + +\method{GetTissueCoordinates}{SpatialImage}(object, ...) + +\method{Radius}{SpatialImage}(object) + +\method{RenameCells}{SpatialImage}(object, new.names = NULL, ...) + +\method{[}{SpatialImage}(x, i, ...) + +\method{dim}{SpatialImage}(x) + +\method{subset}{SpatialImage}(x, cells, ...) +} +\arguments{ +\item{x, object}{An object inheriting from \code{SpatialImage}} + +\item{mode}{How to return the image; should accept one of 'grob', 'raster', +'plotly', or 'raw'} + +\item{...}{Arguments passed to other methods} + +\item{new.names}{vector of new cell names} + +\item{i, cells}{A vector of cells to keep} +} +\description{ +The SpatialImage class is a virtual class representing spatial information for +Seurat. All spatial image information must inherit from this class for use with +\code{Seurat} objects +} +\section{Slots}{ + +\describe{ +\item{\code{assay}}{Name of assay to associate image data with; will give this image +priority for visualization when the assay is set as the active/default assay +in a \code{Seurat} object} + +\item{\code{key}}{Key for the image} +}} + +\section{Provided methods}{ + +These methods are defined on the \code{SpatialImage} object and should not be +overwritten without careful thought +\itemize{ + \item \code{\link{DefaultAssay}} and \code{\link{DefaultAssay<-}} + \item \code{\link{Key}} and \code{\link{Key<-}} + \item \code{\link{IsGlobal}} + \item \code{\link{Radius}}; this method \emph{can} be overridden to provide + a spot radius for image objects +} +} + +\section{Required methods}{ + +All subclasses of the \code{SpatialImage} class must define the following methods; +simply relying on the \code{SpatialImage} method will result in errors. For required +parameters and their values, see the \code{Usage} and \code{Arguments} sections +\describe{ + \item{\code{\link{Cells}}}{Return the cell/spot barcodes associated with each position} + \item{\code{\link{dim}}}{Return the dimensions of the image for plotting in \code{(Y, X)} format} + \item{\code{\link{GetImage}}}{Return image data; by default, must return a grob object} + \item{\code{\link{GetTissueCoordinates}}}{Return tissue coordinates; by default, + must return a two-column data.frame with x-coordinates in the first column and y-coordiantes + in the second} + \item{\code{\link{Radius}}}{Return the spot radius; returns \code{NULL} by + default for use with non-spot image technologies} + \item{\code{\link{RenameCells}}}{Rename the cell/spot barcodes for this image} + \item{\code{\link{subset}} and \code{[}}{Subset the image data by cells/spots; + \code{[} should only take \code{i} for subsetting by cells/spots} +} +These methods are used throughout Seurat, so defining them and setting the proper +defaults will allow subclasses of \code{SpatialImage} to work seamlessly +} + diff --git a/man/SpatialPlot.Rd b/man/SpatialPlot.Rd new file mode 100644 index 000000000..c4e1cfbda --- /dev/null +++ b/man/SpatialPlot.Rd @@ -0,0 +1,176 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R, R/convenience.R +\name{SpatialPlot} +\alias{SpatialPlot} +\alias{SpatialDimPlot} +\alias{SpatialFeaturePlot} +\title{Visualize spatial clustering and expression data.} +\usage{ +SpatialPlot( + object, + group.by = NULL, + features = NULL, + images = NULL, + cols = NULL, + image.alpha = 1, + crop = TRUE, + slot = "data", + min.cutoff = NA, + max.cutoff = NA, + cells.highlight = NULL, + cols.highlight = c("#DE2D26", "grey50"), + facet.highlight = FALSE, + label = FALSE, + label.size = 5, + label.color = "white", + label.box = TRUE, + repel = FALSE, + ncol = NULL, + combine = TRUE, + pt.size.factor = 1.6, + alpha = c(1, 1), + stroke = 0.25, + interactive = FALSE, + do.identify = FALSE, + identify.ident = NULL, + do.hover = FALSE, + information = NULL +) + +SpatialDimPlot( + object, + group.by = NULL, + images = NULL, + cols = NULL, + crop = TRUE, + cells.highlight = NULL, + cols.highlight = c("#DE2D26", "grey50"), + facet.highlight = FALSE, + label = FALSE, + label.size = 7, + label.color = "white", + repel = FALSE, + ncol = NULL, + combine = TRUE, + pt.size.factor = 1.6, + alpha = c(1, 1), + stroke = 0.25, + label.box = TRUE, + interactive = FALSE, + information = NULL +) + +SpatialFeaturePlot( + object, + features, + images = NULL, + crop = TRUE, + slot = "data", + min.cutoff = NA, + max.cutoff = NA, + ncol = NULL, + combine = TRUE, + pt.size.factor = 1.6, + alpha = c(1, 1), + stroke = 0.25, + interactive = FALSE, + information = NULL +) +} +\arguments{ +\item{object}{A Seurat object} + +\item{group.by}{Name of meta.data column to group the data by} + +\item{features}{Name of the feature to visualize. Provide either group.by OR +features, not both.} + +\item{images}{Name of the images to use in the plot(s)} + +\item{cols}{Vector of colors, each color corresponds to an identity class. +This may also be a single character or numeric value corresponding to a +palette as specified by \code{\link[RColorBrewer]{brewer.pal.info}}. By +default, ggplot2 assigns colors} + +\item{image.alpha}{Adjust the opacity of the background images. Set to 0 to +remove.} + +\item{crop}{Crop the plot in to focus on points plotted. Set to FALSE to show +entire background image.} + +\item{slot}{If plotting a feature, which data slot to pull from (counts, +data, or scale.data)} + +\item{min.cutoff, max.cutoff}{Vector of minimum and maximum cutoff +values for each feature, may specify quantile in the form of 'q##' where '##' +is the quantile (eg, 'q1', 'q10')} + +\item{cells.highlight}{A list of character or numeric vectors of cells to +highlight. If only one group of cells desired, can simply pass a vector +instead of a list. If set, colors selected cells to the color(s) in +cols.highlight} + +\item{cols.highlight}{A vector of colors to highlight the cells as; ordered +the same as the groups in cells.highlight; last color corresponds to +unselected cells.} + +\item{facet.highlight}{When highlighting certain groups of cells, split each +group into its own plot} + +\item{label}{Whether to label the clusters} + +\item{label.size}{Sets the size of the labels} + +\item{label.color}{Sets the color of the label text} + +\item{label.box}{Whether to put a box around the label text (geom_text vs +geom_label)} + +\item{repel}{Repels the labels to prevent overlap} + +\item{ncol}{Number of columns if plotting multiple plots} + +\item{combine}{Combine plots into a single gg object; note that if TRUE; +themeing will not work when plotting multiple features/groupings} + +\item{pt.size.factor}{Scale the size of the spots.} + +\item{alpha}{Controls opacity of spots. Provide as a vector specifying the +min and max} + +\item{stroke}{Control the width of the border around the spots} + +\item{interactive}{Launch an interactive SpatialDimPlot or SpatialFeaturePlot +session, see \code{\link{ISpatialDimPlot}} or +\code{\link{ISpatialFeaturePlot}} for more details} + +\item{do.identify, do.hover}{DEPRECATED in favor of \code{interactive}} + +\item{identify.ident}{DEPRECATED} + +\item{information}{An optional dataframe or matrix of extra information to be displayed on hover} +} +\value{ +If \code{do.identify}, either a vector of cells selected or the object +with selected cells set to the value of \code{identify.ident} (if set). Else, +if \code{do.hover}, a plotly object with interactive graphics. Else, a ggplot +object +} +\description{ +SpatialPlot plots a feature or discrete grouping (e.g. cluster assignments) as +spots over the image that was collected. We also provide SpatialFeaturePlot +and SpatialDimPlot as wrapper functions around SpatialPlot for a consistent +naming framework. +} +\examples{ +\dontrun{ +# For functionality analagous to FeaturePlot +SpatialPlot(seurat.object, features = "MS4A1") +SpatialFeaturePlot(seurat.object, features = "MS4A1") + +# For functionality analagous to DimPlot +SpatialPlot(seurat.object, group.by = "clusters") +SpatialDimPlot(seurat.object, group.by = "clusters") +} + +} diff --git a/man/SpatiallyVariableFeatures.Rd b/man/SpatiallyVariableFeatures.Rd new file mode 100644 index 000000000..3674b1cfc --- /dev/null +++ b/man/SpatiallyVariableFeatures.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/generics.R, R/objects.R +\name{SpatiallyVariableFeatures} +\alias{SpatiallyVariableFeatures} +\alias{SpatiallyVariableFeatures.Assay} +\alias{SpatiallyVariableFeatures.Seurat} +\title{Get spatially variable feature information} +\usage{ +SpatiallyVariableFeatures(object, ...) + +\method{SpatiallyVariableFeatures}{Assay}( + object, + selection.method = "markvariogram", + decreasing = TRUE, + ... +) + +\method{SpatiallyVariableFeatures}{Seurat}( + object, + assay = NULL, + selection.method = "markvariogram", + decreasing = TRUE, + ... +) +} +\arguments{ +\item{object}{A Seurat object, assay, or expression matrix} + +\item{...}{Arguments passed to other methods} + +\item{selection.method}{Method for selecting spatially variable features. + \itemize{ + \item \code{markvariogram}: See \code{\link{RunMarkVario}} for details + \item \code{moransi}: See \code{\link{RunMoransI}} for details. +}} + +\item{decreasing}{Return features in decreasing order (most spatially +variable first).} + +\item{assay}{Name of assay to pull spatially variable features for} + +\item{Seurat}{object} +} +\description{ +Get spatially variable feature information +} diff --git a/man/TransferData.Rd b/man/TransferData.Rd index 705ac8638..80401c55d 100644 --- a/man/TransferData.Rd +++ b/man/TransferData.Rd @@ -15,7 +15,8 @@ TransferData( eps = 0, do.cpp = TRUE, verbose = TRUE, - slot = "data" + slot = "data", + prediction.assay = FALSE ) } \arguments{ @@ -54,6 +55,9 @@ dimensional reduction} \item{slot}{Slot to store the imputed data. Must be either "data" (default) or "counts"} + +\item{prediction.assay}{Return an \code{Assay} object with the prediction +scores for each class stored in the \code{data} slot.} } \value{ If \code{refdata} is a vector, returns a data.frame with label diff --git a/man/VisiumV1-class.Rd b/man/VisiumV1-class.Rd new file mode 100644 index 000000000..b9239b703 --- /dev/null +++ b/man/VisiumV1-class.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/objects.R +\docType{class} +\name{VisiumV1-class} +\alias{VisiumV1-class} +\alias{VisiumV1} +\title{The VisiumV1 class} +\description{ +The VisiumV1 class represents spatial information from the 10X Genomics Visium +platform +} +\section{Slots}{ + +\describe{ +\item{\code{image}}{A three-dimensional array with PNG image data, see +\code{\link[png]{readPNG}} for more details} + +\item{\code{scale.factors}}{An object of class \code{\link{scalefactors}}; see +\code{\link{scalefactors}} for more information} + +\item{\code{coordinates}}{A data frame with tissue coordinate information} + +\item{\code{spot.radius}}{Single numeric value giving the radius of the spots} +}} + diff --git a/man/contrast-theory.Rd b/man/contrast-theory.Rd new file mode 100644 index 000000000..5c75f0057 --- /dev/null +++ b/man/contrast-theory.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/visualization.R +\name{contrast-theory} +\alias{contrast-theory} +\alias{Intensity} +\alias{Luminance} +\title{Get the intensity and/or luminance of a color} +\source{ +\url{https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color} +} +\usage{ +Intensity(color) + +Luminance(color) +} +\arguments{ +\item{color}{A vector of colors} +} +\value{ +A vector of intensities/luminances for each color +} +\description{ +Get the intensity and/or luminance of a color +} +\examples{ +Intensity(color = c('black', 'white', '#E76BF3')) + +Luminance(color = c('black', 'white', '#E76BF3')) + +} diff --git a/man/merge.Seurat.Rd b/man/merge.Seurat.Rd index 7c003b9e0..efedf801d 100644 --- a/man/merge.Seurat.Rd +++ b/man/merge.Seurat.Rd @@ -33,7 +33,7 @@ approach was applied to all objects.} \item{...}{Arguments passed to other methods} -\item{project}{Sets the project name for the Seurat object.} +\item{project}{\link{Project} name for the \code{Seurat} object} } \value{ Merged object diff --git a/src/ModularityOptimizer.cpp b/src/ModularityOptimizer.cpp index e5c1ba255..a5007c02c 100644 --- a/src/ModularityOptimizer.cpp +++ b/src/ModularityOptimizer.cpp @@ -756,11 +756,10 @@ void VOSClusteringTechnique::removeSmallClusters(int minNNodesPerCluster) { clustering->mergeClusters(*vosClusteringTechnique.clustering); } -std::shared_ptr ModularityOptimizer::matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction) { +std::shared_ptr ModularityOptimizer::matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction, int nNodes) { int n1_max = *std::max_element(node1.cbegin(), node1.cend()); int n2_max = *std::max_element(node2.cbegin(), node2.cend()); - int nNodes = std::max(n1_max, n2_max) + 1; IVector nNeighbors(nNodes); for (size_t i = 0; i < node1.size(); i++) if (node1[i] < node2[i]) @@ -832,7 +831,10 @@ std::shared_ptr ModularityOptimizer::readInputFile(std::string fname, i edgeWeight1[j] = std::stod(splittedLine[2]); } } - return matrixToNetwork(node1, node2, edgeWeight1, modularityFunction); + int n1_max = *std::max_element(node1.cbegin(), node1.cend()); + int n2_max = *std::max_element(node2.cbegin(), node2.cend()); + int nNodes = std::max(n1_max, n2_max) + 1; + return matrixToNetwork(node1, node2, edgeWeight1, modularityFunction, nNodes); } std::vector ModularityOptimizer::split(const std::string& s, char delimiter) diff --git a/src/ModularityOptimizer.h b/src/ModularityOptimizer.h index 3bbd82f94..9ea0fca25 100644 --- a/src/ModularityOptimizer.h +++ b/src/ModularityOptimizer.h @@ -153,7 +153,7 @@ class VOSClusteringTechnique { }; -std::shared_ptr matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction); +std::shared_ptr matrixToNetwork(IVector& node1, IVector& node2, DVector& edgeWeight1, int modularityFunction, int nNodes); std::shared_ptr readInputFile(std::string fname, int modularityFunction); std::vector split(const std::string& s, char delimiter); }; diff --git a/src/RModularityOptimizer.cpp b/src/RModularityOptimizer.cpp index a5c330788..e2c40f2b2 100644 --- a/src/RModularityOptimizer.cpp +++ b/src/RModularityOptimizer.cpp @@ -82,8 +82,8 @@ IntegerVector RunModularityClusteringCpp(Eigen::SparseMatrix SNN, if(node1.size() == 0) { stop("Matrix contained no network data. Check format."); } - - network = matrixToNetwork(node1, node2, edgeweights, modularityFunction); + int nNodes = std::max(SNN.cols(), SNN.rows()); + network = matrixToNetwork(node1, node2, edgeweights, modularityFunction, nNodes); Rcpp::checkUserInterrupt(); } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index f46e94455..d46af4e38 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -298,18 +298,6 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } -// SNNAnchor -Eigen::SparseMatrix SNNAnchor(Eigen::SparseMatrix k_matrix, Eigen::SparseMatrix anchor_only); -RcppExport SEXP _Seurat_SNNAnchor(SEXP k_matrixSEXP, SEXP anchor_onlySEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type k_matrix(k_matrixSEXP); - Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type anchor_only(anchor_onlySEXP); - rcpp_result_gen = Rcpp::wrap(SNNAnchor(k_matrix, anchor_only)); - return rcpp_result_gen; -END_RCPP -} // ComputeSNN Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune); RcppExport SEXP _Seurat_ComputeSNN(SEXP nn_rankedSEXP, SEXP pruneSEXP) { @@ -371,7 +359,6 @@ static const R_CallMethodDef CallEntries[] = { {"_Seurat_ReplaceColsC", (DL_FUNC) &_Seurat_ReplaceColsC, 3}, {"_Seurat_FindWeightsC", (DL_FUNC) &_Seurat_FindWeightsC, 10}, {"_Seurat_IntegrateDataC", (DL_FUNC) &_Seurat_IntegrateDataC, 3}, - {"_Seurat_SNNAnchor", (DL_FUNC) &_Seurat_SNNAnchor, 2}, {"_Seurat_ComputeSNN", (DL_FUNC) &_Seurat_ComputeSNN, 2}, {"_Seurat_WriteEdgeFile", (DL_FUNC) &_Seurat_WriteEdgeFile, 3}, {"_Seurat_DirectSNNToFile", (DL_FUNC) &_Seurat_DirectSNNToFile, 4}, diff --git a/src/integration.cpp b/src/integration.cpp index afb16c289..7917c6315 100644 --- a/src/integration.cpp +++ b/src/integration.cpp @@ -84,7 +84,6 @@ Eigen::SparseMatrix FindWeightsC( return(return_mat); } - // [[Rcpp::export]] Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix integration_matrix, @@ -94,33 +93,3 @@ Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix corrected = expression_cells2 - weights.transpose() * integration_matrix; return(corrected); } - - -int getCoeff (Eigen::SparseMatrix& mat, size_t i, size_t j){ - int score{0}; - if (i == j) { - for (Eigen::SparseMatrix::InnerIterator it(mat, i); it; ++it){ - score++; - } - } else { - for(int k=0; k < mat.outerSize(); ++k) { - if (mat.coeff(i, k) and mat.coeff(j, k)) { score++; } - } - } - - return score; -} - - -//[[Rcpp::export]] -Eigen::SparseMatrix SNNAnchor( - Eigen::SparseMatrix k_matrix, - Eigen::SparseMatrix anchor_only -) { - for (int k=0; k::InnerIterator it(anchor_only,k); it; ++it){ - it.valueRef() = getCoeff(k_matrix, it.row(), it.col()); - } - } - return(anchor_only); -} diff --git a/src/integration.h b/src/integration.h index ea5cf936f..50da40709 100644 --- a/src/integration.h +++ b/src/integration.h @@ -24,10 +24,6 @@ Eigen::SparseMatrix IntegrateDataC( Eigen::SparseMatrix weights, Eigen::SparseMatrix expression_cells2 ); -Eigen::SparseMatrix SNNAnchor( - Eigen::SparseMatrix k_matrix, - Eigen::SparseMatrix anchor_only -); //---------------------------------------------------- #endif//CORRECT_EXPRESSION diff --git a/tests/testdata/visium/filtered_feature_bc_matrix.h5 b/tests/testdata/visium/filtered_feature_bc_matrix.h5 new file mode 100644 index 000000000..24110a1ec Binary files /dev/null and b/tests/testdata/visium/filtered_feature_bc_matrix.h5 differ diff --git a/tests/testdata/visium/spatial/scalefactors_json.json b/tests/testdata/visium/spatial/scalefactors_json.json new file mode 100644 index 000000000..3b7167131 --- /dev/null +++ b/tests/testdata/visium/spatial/scalefactors_json.json @@ -0,0 +1 @@ +{"spot_diameter_fullres": 96.3607212981978, "tissue_hires_scalef": 0.17211704, "fiducial_diameter_fullres": 144.54108194729673, "tissue_lowres_scalef": 0.051635113} \ No newline at end of file diff --git a/tests/testdata/visium/spatial/tissue_lowres_image.png b/tests/testdata/visium/spatial/tissue_lowres_image.png new file mode 100644 index 000000000..e061991c8 Binary files /dev/null and b/tests/testdata/visium/spatial/tissue_lowres_image.png differ diff --git a/tests/testdata/visium/spatial/tissue_positions_list.csv b/tests/testdata/visium/spatial/tissue_positions_list.csv new file mode 100644 index 000000000..995edc329 --- /dev/null +++ b/tests/testdata/visium/spatial/tissue_positions_list.csv @@ -0,0 +1,4992 @@ +ACGCCTGACACGCGCT-1,0,0,0,1487,1480 +TACCGATCCAACACTT-1,0,1,1,1607,1549 +ATTAAAGCGGACGAGC-1,0,0,2,1487,1617 +GATAAGGGACGATTAG-1,0,1,3,1607,1686 +GTGCAAATCACCAATA-1,0,0,4,1487,1755 +TGTTGGCTGGCGGAAG-1,0,1,5,1607,1824 +GCATCCTCTCCTATTA-1,0,0,6,1487,1893 +GCGAGGGACTGCTAGA-1,0,1,7,1607,1962 +TGGTACCGGCACAGCC-1,0,0,8,1487,2030 +GCGCGTTTAAATCGTA-1,0,1,9,1607,2099 +TGCCTTGCCCTTACGG-1,0,0,10,1487,2168 +GACGACTTTCCAAGAA-1,0,1,11,1607,2237 +CCAGTGAGCTCCTTGT-1,0,0,12,1487,2306 +ATACCCTGGCTCAAAT-1,0,1,13,1607,2375 +GGGTTTCCGGCTTCCA-1,0,0,14,1487,2443 +TAACCGTCCAGTTCAT-1,0,1,15,1607,2512 +AAACAACGAATAGTTC-1,0,0,16,1487,2581 +CAAGGGAGTGTATTTG-1,0,1,17,1607,2650 +CCAAGCTTGATCTCCT-1,0,0,18,1487,2719 +TTATTTCATCCCAAAC-1,0,1,19,1607,2788 +GAGCGCTATGTCAGGC-1,0,0,20,1487,2856 +TATGGCAGACTTTCGA-1,0,1,21,1607,2925 +CTTCGTGCCCGCATCG-1,0,0,22,1487,2994 +AAACGGGTTGGTATCC-1,0,1,23,1607,3063 +TGCAAACCCACATCAA-1,0,0,24,1487,3132 +GACGGGATGTCTTATG-1,0,1,25,1607,3200 +GGCGAGCATCGAGGAC-1,0,0,26,1487,3269 +CGCGTGCTATCAACGA-1,0,1,27,1607,3338 +TGAAACCTCAACTCAC-1,0,0,28,1487,3407 +CACATAAGGCGACCGT-1,0,1,29,1607,3476 +TGACCCAACTCACATT-1,0,0,30,1487,3545 +ATACGCCGATCTACCG-1,0,1,31,1607,3613 +ACTTATCTGATCTATA-1,0,0,32,1487,3682 +GTGTGAGCCGAGGTGC-1,0,1,33,1607,3751 +GATGATTTGAAACTGG-1,0,0,34,1487,3820 +GGGAACCACCTGTTTC-1,0,1,35,1607,3889 +GTTCGTTGCGGACCAG-1,0,0,36,1487,3958 +TGAGGTTGATCCCAAG-1,0,1,37,1607,4026 +GATGCCACACTACAGC-1,0,0,38,1487,4095 +AGGCAAAGAGGAATCA-1,0,1,39,1607,4164 +AAGTAAGCTTCCAAAC-1,0,0,40,1487,4233 +AACGTAGTCTACCCAT-1,0,1,41,1607,4302 +GTTTGAGCGGTTATGT-1,0,0,42,1487,4371 +GAAGCAAGGCAATGTT-1,0,1,43,1607,4439 +TCACTCAGCGCATTAG-1,0,0,44,1487,4508 +TACAATGAAACCAGCA-1,0,1,45,1607,4577 +GTGCGCTTACAAATGA-1,0,0,46,1487,4646 +GCACTCCCACAGTCCC-1,0,1,47,1607,4715 +CGAAGACTGCCCGGGA-1,0,0,48,1487,4784 +CAGGATCCGCCCGACC-1,0,1,49,1607,4852 +CACGATTGGTCGTTAA-1,0,0,50,1487,4921 +GGTTGTATCGTGAAAT-1,0,1,51,1607,4990 +TCTTATGGGTAGTACC-1,0,0,52,1487,5059 +TACAAGCTGTTCACTG-1,0,1,53,1607,5128 +GTATCTTGTTGCTCAC-1,0,0,54,1487,5197 +ATACCAGGTGAGCGAT-1,0,1,55,1607,5265 +CCTAAACAGGGTCCGT-1,0,0,56,1487,5334 +ATGGTGCTCAAAGCCA-1,0,1,57,1607,5403 +CAAATGCGGAGTGTTC-1,0,0,58,1487,5472 +CGTGCCCGACATTTGT-1,0,1,59,1607,5541 +GTATCTCCCTAACTGT-1,0,0,60,1487,5610 +ATTTGCCTAGTTACGA-1,0,1,61,1607,5678 +ACGTCCTAAACGAGAT-1,0,0,62,1487,5747 +CTGGGATCGCCCAGAT-1,0,1,63,1607,5816 +CTGCAAATGGGCTCCA-1,0,0,64,1487,5885 +CATTATAACAGGGTCC-1,0,1,65,1607,5954 +ACCTTTCCTTTAGAAG-1,0,0,66,1487,6022 +ATAGATTTGCAGTCGG-1,0,1,67,1607,6091 +CTCGGGCATCGTCGGG-1,0,0,68,1487,6160 +GTGGCGGGCCGTAGCT-1,0,1,69,1607,6229 +CAACAGTGCCAAACGG-1,0,0,70,1487,6298 +TGCGGGTATTGGGATC-1,0,1,71,1607,6367 +GTCTCGCCAACACGCC-1,0,0,72,1487,6435 +CTGGGCGGCCAAATGT-1,0,1,73,1607,6504 +TAAAGGAGAAACTAGT-1,0,0,74,1487,6573 +TCCCACGGAGGGAGCT-1,0,1,75,1607,6642 +AGCTTCAATACTTTGA-1,0,0,76,1487,6711 +TTCCACATTTCTCGTC-1,0,1,77,1607,6780 +ACAAACCGACAAGGCG-1,0,0,78,1487,6848 +AGACGGGATTGGTATA-1,0,1,79,1607,6917 +AACCTAAAGCCGTCCG-1,0,0,80,1487,6986 +TACAAATTGCGGAGGT-1,0,1,81,1607,7055 +CCCGCTAGAGGGTTAA-1,0,0,82,1487,7124 +CATTGCAAAGCATAAT-1,0,1,83,1607,7193 +TGTACGCTATCAGCTT-1,0,0,84,1487,7261 +TTCTTCGCAATAGAGC-1,0,1,85,1607,7330 +TGTGATTCCAGCGCTT-1,0,0,86,1487,7399 +ATTCAGGATCGCCTCT-1,0,1,87,1607,7468 +GCCCATGGGTGCAATG-1,0,0,88,1487,7537 +TTCCCGACGCTTCACT-1,0,1,89,1607,7606 +AGCGGTTGAGATGTAC-1,0,0,90,1487,7674 +GCTGTCTGTGATCGAC-1,0,1,91,1607,7743 +AAAGACATGAAGTTTA-1,0,0,92,1487,7812 +CAACAGAATAACGCTA-1,0,1,93,1607,7881 +TGCGGTCTACGAGTAA-1,0,0,94,1487,7950 +AAGACTCACGCCCACT-1,0,1,95,1607,8019 +CTTTGAAACATATTCC-1,0,0,96,1487,8087 +CTGGGCACTAGTCGGA-1,0,1,97,1607,8156 +CGCCCTTACATCCACC-1,0,0,98,1487,8225 +CACGACCACAGACTTT-1,0,1,99,1607,8294 +CAATCCATTATCCGTT-1,0,0,100,1487,8363 +GTGGCGTGCACCAGAG-1,0,1,101,1607,8432 +CGGAGTCCTAACCTGG-1,0,0,102,1487,8500 +GGTCCCATAACATAGA-1,0,1,103,1607,8569 +ATCTCATAAACCTACC-1,0,0,104,1487,8638 +TGCATGGCAGTCTTGC-1,0,1,105,1607,8707 +TTGCAGGTCATGAAGT-1,0,0,106,1487,8776 +AGCTGCATTTGAGGTG-1,0,1,107,1607,8844 +TAATCAGGAATGCTGC-1,0,0,108,1487,8913 +CCATCATAAGAACAGG-1,0,1,109,1607,8982 +TCGTATCACCAAGCTA-1,0,0,110,1487,9051 +ATTCAGATGAATCCCT-1,0,1,111,1607,9120 +AAAGGTCAACGACATG-1,0,0,112,1487,9189 +AGCTGCTGTGCCGAAT-1,0,1,113,1607,9257 +CTAGCGCCAATCCTAC-1,0,0,114,1487,9326 +GCTCGACCGAACTGAA-1,0,1,115,1607,9395 +ACAGTGCAGCGCATTT-1,0,0,116,1487,9464 +CGGCTGAAGGTTACGC-1,0,1,117,1607,9533 +CACCTCTACGAGTGTG-1,0,0,118,1487,9602 +ATACGACAGATGGGTA-1,0,1,119,1607,9670 +ACTTCCTGTCGTGCGA-1,0,0,120,1487,9739 +CGTAACGGAACGATCA-1,0,1,121,1607,9808 +AAATCACTCCTAAACG-1,0,0,122,1487,9877 +CTCCGAGTAAATCCGC-1,0,1,123,1607,9946 +ACGCTAGTATCAGTGC-1,0,0,124,1487,10015 +AGAGTGAACAGACACC-1,0,1,125,1607,10083 +ACACCCGTAAATCTGT-1,0,0,126,1487,10152 +GCTTTGCTGCCGGGTA-1,0,1,127,1607,10221 +ACAGGAGGCGCAGCCG-1,0,2,0,1727,1480 +AGGCAATACGGAGGAC-1,0,3,1,1847,1549 +TGGTGTGACAGACGAT-1,0,2,2,1727,1617 +ATCTATCGATGATCAA-1,0,3,3,1847,1686 +CGGTAACAAGATACAT-1,0,2,4,1727,1755 +TCGCCGGAGAGTCTTA-1,0,3,5,1847,1824 +GGAGGAGTGTGTTTAT-1,0,2,6,1727,1893 +TTAGGTGTGACTGGTC-1,0,3,7,1847,1962 +CAGGGCTAACGAAACC-1,0,2,8,1727,2030 +CCCGTGGGTTAATTGA-1,0,3,9,1847,2099 +GACCGACCGCTAATAT-1,0,2,10,1727,2168 +GGTATCAAGCATAGAA-1,0,3,11,1847,2237 +TGCATGAGTAGATTCG-1,0,2,12,1727,2306 +AATTCCAACTTGGTGA-1,0,3,13,1847,2375 +TGCCGATGTCATCAAT-1,0,2,14,1727,2443 +GCTGGGTCCGCTGTTA-1,0,3,15,1847,2512 +TGAACACCCGAAGCAG-1,0,2,16,1727,2581 +AACATTGGTCAGCCGT-1,0,3,17,1847,2650 +GTGGGTCTTCTTTGCG-1,0,2,18,1727,2719 +CATCGAATGGATCTCT-1,0,3,19,1847,2788 +GCTACACTGTCCGAAC-1,0,2,20,1727,2856 +CGGGTTGTAGCTTTGG-1,0,3,21,1847,2925 +CCTAAGTGTCTAACCG-1,0,2,22,1727,2994 +TCTGTGACTGACCGTT-1,0,3,23,1847,3063 +TTATCATACTCGCAAA-1,0,2,24,1727,3132 +AGCGTAGCGCTAGACC-1,0,3,25,1847,3201 +TCCCTCCGAAATCGTT-1,0,2,26,1727,3269 +AGGTCGCCACTTCGGT-1,0,3,27,1847,3338 +CTAGCAACTAATTTAC-1,0,2,28,1727,3407 +TTGCTAGCTACCAATC-1,0,3,29,1847,3476 +GCCGGTTTGGGCGGAT-1,0,2,30,1727,3545 +TGTAACTTGTCAACCT-1,0,3,31,1847,3613 +CGAGATGTTGCCTATA-1,0,2,32,1727,3682 +GTTACGAAATCCACGC-1,0,3,33,1847,3751 +CTTGTCGTACGTGTCA-1,0,2,34,1727,3820 +GCGTCCAGCTCGTGGC-1,0,3,35,1847,3889 +CCCTTCTCGTACGCGA-1,0,2,36,1727,3958 +CCAAAGTCCCGCTAAC-1,0,3,37,1847,4026 +CCGCTTCGCGGTTAAC-1,0,2,38,1727,4095 +GTTACGGCCCGACTGC-1,0,3,39,1847,4164 +CCCGCTTGCCCTCGTC-1,0,2,40,1727,4233 +TAGTGAGAAGTGGTTG-1,0,3,41,1847,4302 +CGCTACCGCCCTATGA-1,0,2,42,1727,4371 +AAACAATCTACTAGCA-1,0,3,43,1847,4439 +GCGCGATGGGTCAAGT-1,0,2,44,1727,4508 +ATAAACCATTGGACGG-1,0,3,45,1847,4577 +TCGGGCACTTCTGGAT-1,0,2,46,1727,4646 +TCTGTGGCTACATTTC-1,0,3,47,1847,4715 +CTCTGTGCCTGCTATG-1,0,2,48,1727,4784 +CACGACTAAAGTTCTG-1,0,3,49,1847,4852 +GAGGAGTAATTCCTAC-1,0,2,50,1727,4921 +AGAGGTATCTCGGTCC-1,0,3,51,1847,4990 +GGCGTACCCTATATAA-1,0,2,52,1727,5059 +GCCGGAAACACATCTT-1,0,3,53,1847,5128 +AAATGTGGGTGCTCCT-1,0,2,54,1727,5197 +ACCAGGAGTGTGATCT-1,0,3,55,1847,5265 +TGTGGAGGAAGCTTAA-1,0,2,56,1727,5334 +AAGGAGAACTTATAAG-1,0,3,57,1847,5403 +CCCTCGGGAGCCTTGT-1,0,2,58,1727,5472 +ACTGTTTAGTGTAGGC-1,0,3,59,1847,5541 +CGTCAGTTTATCGTCT-1,0,2,60,1727,5610 +GCGTGTATGTCGTATT-1,0,3,61,1847,5678 +ACAATCGATCTTTATA-1,0,2,62,1727,5747 +CAGCCCTCACAGGCAG-1,0,3,63,1847,5816 +CGCGTCATATTAAACC-1,0,2,64,1727,5885 +GAAGACTTCAATGCCG-1,0,3,65,1847,5954 +TTGCGGCGACTCATGC-1,0,2,66,1727,6022 +ACCAAACTAGAAATCC-1,0,3,67,1847,6091 +TTACTGTTTCTCTACG-1,0,2,68,1727,6160 +GACCAGGTCATTCATA-1,0,3,69,1847,6229 +TTCTTCCCTTTGATAT-1,0,2,70,1727,6298 +ACGCCCAGCTGTCGAT-1,0,3,71,1847,6367 +AGTAGCGTGAACGAAC-1,0,2,72,1727,6435 +CCTCGACCCACTGCCT-1,0,3,73,1847,6504 +AGTTATTGAAAGGTAA-1,0,2,74,1727,6573 +TCAGTTACGGAATGAT-1,0,3,75,1847,6642 +GAATCTATACTCGGAC-1,0,2,76,1727,6711 +TCGGCTAACTTCCCTT-1,0,3,77,1847,6780 +ACGTGGTCGAATGTGC-1,0,2,78,1727,6848 +ATATCGTGCCAGACCC-1,0,3,79,1847,6917 +GTAGCTAGTAAGCGCG-1,0,2,80,1727,6986 +ACGCTTAGTGTCTCTC-1,0,3,81,1847,7055 +TCCGGCCTGCATCGAT-1,0,2,82,1727,7124 +TAGTGGAACTCATACA-1,0,3,83,1847,7193 +ATCATCTGCCCAGTGT-1,0,2,84,1727,7261 +GTTATTAAATACGACC-1,0,3,85,1847,7330 +GCGCTAAGTATGCATG-1,0,2,86,1727,7399 +CCTGACGCAACCTTTA-1,0,3,87,1846,7468 +CCCAAGAATGCACGGT-1,0,2,88,1727,7537 +AACTGGGTTCGAGCCG-1,0,3,89,1846,7606 +GGTTCCACCCGCTTCT-1,0,2,90,1727,7674 +CATGCACGTGTTACTG-1,0,3,91,1846,7743 +AGCGTTCCGATTTAAA-1,0,2,92,1727,7812 +CCTACGCGACCTTACA-1,0,3,93,1846,7881 +CGAATTACATGGTGTT-1,0,2,94,1727,7950 +GAGGTCTTAGTGGGTC-1,0,3,95,1846,8019 +GCCGCTAGATACGCAG-1,0,2,96,1727,8087 +GTCACCTGTCTATGTC-1,0,3,97,1846,8156 +CCGATTGGTCAATGAA-1,0,2,98,1727,8225 +CCTGTGCGGATTGTAA-1,0,3,99,1846,8294 +TTACGTAGCGCGTGCT-1,0,2,100,1727,8363 +GGAGGCGAAGAACCGC-1,0,3,101,1846,8432 +GGGTCACGTGCTTATG-1,0,2,102,1727,8500 +GCTCCGGACGTTGATA-1,0,3,103,1846,8569 +ATGTTTGTAAGATCAT-1,0,2,104,1727,8638 +TGACCCAGCATTCCCG-1,0,3,105,1846,8707 +TGGTCGTTTGATAGAT-1,0,2,106,1727,8776 +TGTAATGCCTTCGGAC-1,0,3,107,1846,8844 +TGCTCACACAACAACC-1,0,2,108,1727,8913 +TACGATCCAAGCCACT-1,0,3,109,1846,8982 +TTGTAACTTCATAGCG-1,0,2,110,1727,9051 +AGATTCAAGCGGGTCG-1,0,3,111,1846,9120 +CTCAGCAGACTGCCGA-1,0,2,112,1727,9189 +GTAACATCAGCTCATC-1,0,3,113,1846,9257 +ATGGAACAGAATAAAC-1,0,2,114,1727,9326 +GGGCCTATACAACCGG-1,0,3,115,1846,9395 +TCAAACAATTAGGACA-1,0,2,116,1727,9464 +AAACCACTACACAGAT-1,0,3,117,1846,9533 +AAACGACAGTCTTGCC-1,0,2,118,1727,9602 +TTGAGGGTCGAACGCG-1,0,3,119,1846,9670 +TGTTGATCACTGTTTA-1,0,2,120,1727,9739 +AGGGTGTGCTACACGC-1,0,3,121,1846,9808 +GTAGTTAGACAATATA-1,0,2,122,1727,9877 +AATGGCCGCCAATGCG-1,0,3,123,1846,9946 +TCGGCGGTATTAGATT-1,0,2,124,1727,10015 +GGGTCACTGAGTAGTG-1,0,3,125,1846,10083 +GAATTATGCAACCTAC-1,0,2,126,1727,10152 +GATCTTAGTGAACGTG-1,0,3,127,1846,10221 +CTAATGCGCCCAACAA-1,0,4,0,1966,1480 +GCCACCCATTCCACTT-1,0,5,1,2086,1549 +TACTCACAACGTAGTA-1,0,4,2,1966,1617 +GTTCGGTGTGGATTTA-1,0,5,3,2086,1686 +TCTTTCGGCGGGACAC-1,0,4,4,1966,1755 +GGAGACATTCACGGGC-1,0,5,5,2086,1824 +GGGATTATCTCACAAC-1,0,4,6,1966,1893 +TAGAACGCCAGTAACG-1,0,5,7,2086,1962 +ACGAGTCGCCGGCGTT-1,0,4,8,1966,2030 +TGATGGGACTAAGTCA-1,0,5,9,2086,2099 +TGCGAGAAACGTTACG-1,0,4,10,1966,2168 +TCGCCTCGACCTGTTG-1,0,5,11,2086,2237 +AACTCGATAAACACGT-1,0,4,12,1966,2306 +AGGAAAGCCTCTGATG-1,0,5,13,2086,2375 +GAAGGACTAAATTGAA-1,0,4,14,1966,2443 +GTATCGGGACGAGCTG-1,0,5,15,2086,2512 +CCTGTGCATAGGAGAC-1,0,4,16,1966,2581 +CATACGGGTGCATGAT-1,0,5,17,2086,2650 +CCACTAAACTGAATCG-1,0,4,18,1966,2719 +AAATTGCGGCGGTTCT-1,0,5,19,2086,2788 +AGTCCAGCGGGTACGT-1,0,4,20,1966,2856 +CATTCAGGTCAGTGCG-1,0,5,21,2086,2925 +CTAAAGTCCGAAGCTA-1,0,4,22,1966,2994 +AATCAGACTGCAGGAC-1,0,5,23,2086,3063 +AGTATCCATAATAACG-1,0,4,24,1966,3132 +CTGGCTGCTAACGTAA-1,0,5,25,2086,3201 +GTTCCAAGACAGCGAC-1,0,4,26,1966,3269 +AAGACTAACCCGTTGT-1,0,5,27,2086,3338 +GATTAATCCTGGCTCA-1,0,4,28,1966,3407 +CGCGCAAGGAACTACA-1,0,5,29,2086,3476 +CAGTAGCGAGGTAGTA-1,0,4,30,1966,3545 +ACGGCGGGTTGCCCTG-1,0,5,31,2086,3613 +CTAGGCGGCAGAGAAT-1,0,4,32,1966,3682 +GTGCGCAGCTTGCTCC-1,0,5,33,2086,3751 +TCACTATCGTGCAATC-1,0,4,34,1966,3820 +TATGATTCTGCTTGGT-1,0,5,35,2086,3889 +TAAGATTTAGCGGGAG-1,0,4,36,1966,3958 +TTACGGTGTCACCGAG-1,0,5,37,2086,4026 +CTACACTAGCTTGTTC-1,0,4,38,1966,4095 +TGAGCAGTCGTGAAGT-1,0,5,39,2086,4164 +CGCTGAGGACGTCCAA-1,0,4,40,1966,4233 +GTGTATGACTTTAAAG-1,0,5,41,2086,4302 +CTAAACGGGTGTAATC-1,0,4,42,1966,4371 +TGTACTGTGCCAAAGT-1,0,5,43,2086,4439 +GGCCACAAGCGATGGC-1,0,4,44,1966,4508 +GTCAATTGTACTGAAG-1,0,5,45,2086,4577 +AGGGACAGCACGGCGG-1,0,4,46,1966,4646 +AGCTTATAGAGACCTG-1,0,5,47,2086,4715 +AACTAGCGTATCGCAC-1,0,4,48,1966,4784 +AACTTTAGCTGCTGAG-1,0,5,49,2086,4852 +CCCAAGACAGAGTATG-1,0,4,50,1966,4921 +GGCATCAACGAGCACG-1,0,5,51,2086,4990 +ATGCATTCCGTGATGG-1,0,4,52,1966,5059 +TTATAGATGCACATTA-1,0,5,53,2086,5128 +GAACCATCTGGGAGAC-1,0,4,54,1966,5197 +TGCTATACAAACGGAC-1,0,5,55,2086,5265 +ACTTGCCATATTGTAC-1,0,4,56,1966,5334 +TATTCCGGCAGTCCTA-1,0,5,57,2086,5403 +GACGGACCGCGTTCCT-1,0,4,58,1966,5472 +ATGTGTAGTTTAGTCA-1,0,5,59,2086,5541 +ATACCAGCAAATTGCT-1,0,4,60,1966,5610 +AAGTTTACTAATGGCA-1,0,5,61,2086,5678 +CTCTCGATGTGCGCCT-1,0,4,62,1966,5747 +GATTGACACTCTGCTC-1,0,5,63,2086,5816 +TATCACAGCACGGGCA-1,0,4,64,1966,5885 +ACCGTTCCCGCTCTGA-1,0,5,65,2086,5954 +CCGCCACCACAATCCA-1,0,4,66,1966,6023 +CATTCACTGACAGCTA-1,0,5,67,2086,6091 +CGGCTGCAAGATTAAG-1,0,4,68,1966,6160 +CATGAACCTCTTATCA-1,0,5,69,2086,6229 +TTAATGCGAGGTAACT-1,0,4,70,1966,6298 +AATAAGTCCTCGAGAC-1,0,5,71,2086,6367 +ACCAGCCCGGTCTTTG-1,0,4,72,1966,6435 +CTACGAACTAGGTCGA-1,0,5,73,2086,6504 +ACATCTCAACGCGTAA-1,0,4,74,1966,6573 +CACTACTCAGTTCTGT-1,0,5,75,2086,6642 +CCGACTCGCATAGTCT-1,0,4,76,1966,6711 +CATTTATCGTTCAAGA-1,0,5,77,2086,6780 +CAAACGTGGTCTTGCG-1,0,4,78,1966,6848 +TAGAAACCACTAAGTA-1,0,5,79,2086,6917 +ACTGATTTAGTGATTC-1,0,4,80,1966,6986 +TCGTATTTCGTCCGGA-1,0,5,81,2086,7055 +CGGAAATTTCACATCC-1,0,4,82,1966,7124 +ATCCACGCTAAATGTT-1,0,5,83,2086,7193 +GTTCAATCTATGTCAA-1,0,4,84,1966,7261 +ATAAAGGTCAAGTACG-1,0,5,85,2086,7330 +CAACTCCAACGTTTAG-1,0,4,86,1966,7399 +TAGGAACAGCCTCCAG-1,0,5,87,2086,7468 +ATGGGAACGGAAGCGG-1,0,4,88,1966,7537 +CACACGTTTCAATGGG-1,0,5,89,2086,7606 +GGTGTTCTGTTTCTAC-1,0,4,90,1966,7674 +AGTAACGTTCATCCTG-1,0,5,91,2086,7743 +GTATAGTGGCCCATGT-1,0,4,92,1966,7812 +TCTACACGTTCATGCA-1,0,5,93,2086,7881 +AATCTGGGTAGACCCT-1,0,4,94,1966,7950 +TCGGTTAGCCATGTAG-1,0,5,95,2086,8019 +TGCCATGGCTTATAAG-1,0,4,96,1966,8087 +TAAGTAAATGTGCCGC-1,0,5,97,2086,8156 +GTGTCCGATAAGGCAT-1,0,4,98,1966,8225 +TGGCACGAGCTCGAGT-1,0,5,99,2086,8294 +ACCGGTCTGAGTACGG-1,0,4,100,1966,8363 +GAACTTAGCGCCCGGT-1,0,5,101,2086,8432 +AGTAGCTAGACGCCGA-1,0,4,102,1966,8500 +ATAGGAATCTAAGCTT-1,0,5,103,2086,8569 +CTTCCTGCATATTTAC-1,0,4,104,1966,8638 +CAATATGTAGATTTAC-1,0,5,105,2086,8707 +ACAAGGCCTACCAGCC-1,0,4,106,1966,8776 +TTATAGTCCAAGGTGC-1,0,5,107,2086,8845 +AAACGCCCGAGATCGG-1,0,4,108,1966,8913 +CCTCGTTACGCCTGTT-1,0,5,109,2086,8982 +GAACGGTGTAAAGCAG-1,0,4,110,1966,9051 +ACGCATAAATGACATG-1,0,5,111,2086,9120 +GGTTCGATGCTGAGTT-1,0,4,112,1966,9189 +CTTTGGCAGACAGAGT-1,0,5,113,2086,9257 +TTCGTGGGCTGGAAGC-1,0,4,114,1966,9326 +CAAAGGTTAAATTCAG-1,0,5,115,2086,9395 +GTTTGGCGTCAGGCAC-1,0,4,116,1966,9464 +GCTTTCTATCTCAACT-1,0,5,117,2086,9533 +TGCATCTCCGGATCTT-1,0,4,118,1966,9602 +CTGAAACGGCCCTCAG-1,0,5,119,2086,9670 +TAGCAGTAAATACGCG-1,0,4,120,1966,9739 +CGGGCTACTTAAATTG-1,0,5,121,2086,9808 +ATTATGCTCAGTATTG-1,0,4,122,1966,9877 +TGATGCTCACGTAGTC-1,0,5,123,2086,9946 +GTCTAAGATGCCCAGC-1,0,4,124,1966,10015 +AACCCGATAGGGCTTC-1,0,5,125,2086,10083 +CGCTATCGTGGCTTTA-1,0,4,126,1966,10152 +CGTCTCTCGCCGAGGC-1,0,5,127,2086,10221 +AGTGGGAGTATACACG-1,0,6,0,2206,1480 +GGTCTTGGTGTTAACT-1,0,7,1,2326,1549 +GGCTGGCAGCTTTATG-1,0,6,2,2206,1617 +CGCCAATTATTGCGTT-1,0,7,3,2326,1686 +GGTAACCGGCAAAGGT-1,0,6,4,2206,1755 +TGGGACCATTGGGAGT-1,0,7,5,2326,1824 +CTGCAGGTGCTCGGCC-1,0,6,6,2206,1893 +CCGGTGCGAGTGATAG-1,0,7,7,2326,1962 +GGGTACACTCTGGAGG-1,0,6,8,2206,2030 +TAGCCAGAGGGTCCGG-1,0,7,9,2326,2099 +CTTGTGAGGACAGCGG-1,0,6,10,2206,2168 +GAAGGGCATAACCATG-1,0,7,11,2326,2237 +CAACATGGCCTGATAA-1,0,6,12,2206,2306 +CAATTTGACCGGGAAG-1,0,7,13,2326,2375 +TCTGACTGTAATGGTT-1,0,6,14,2206,2443 +TTCATAGCCTTGTAAC-1,0,7,15,2326,2512 +TGGAAACGGAGTGAAC-1,0,6,16,2206,2581 +ATCGCACGATTGTTCA-1,0,7,17,2326,2650 +CGCCACCCGCATTAAC-1,0,6,18,2206,2719 +TGGACCACGGCGTTGA-1,0,7,19,2326,2788 +GTATATGTTACGGCGG-1,0,6,20,2206,2856 +GTATTCTTACCGTGCT-1,0,7,21,2326,2925 +TTCAGAGTAACCTGAC-1,0,6,22,2206,2994 +GCGGTAACCCAAATGA-1,0,7,23,2326,3063 +CTACGTGTTGCCACCA-1,0,6,24,2206,3132 +CTAGATAAACTCCTCG-1,0,7,25,2326,3201 +TCCATTAGTTGGATAG-1,0,6,26,2206,3269 +CTGGCTCCTGCGGGAT-1,0,7,27,2326,3338 +CAGTCTCTCGGCTAAT-1,0,6,28,2206,3407 +GTATGACGTGGGAAAC-1,0,7,29,2326,3476 +AGTCACTCCGCCTCAT-1,0,6,30,2206,3545 +GCAGCGGTGGGCATTA-1,0,7,31,2326,3614 +TATGGAGTTTCTCGTT-1,0,6,32,2206,3682 +ACTCAACGAATGTATT-1,0,7,33,2326,3751 +AACACGCGGCCGCGAA-1,0,6,34,2206,3820 +CGATATTAGCCGCAGG-1,0,7,35,2326,3889 +AGCGTCTGAACCCGCA-1,0,6,36,2206,3958 +GATGTCCGGATCACAT-1,0,7,37,2326,4026 +GGTCACGTTAGATTCA-1,0,6,38,2206,4095 +TTAAGGATACGGAGGT-1,0,7,39,2326,4164 +GTGCGGGACCATCGGC-1,0,6,40,2206,4233 +CCATCTTGTTCACAAT-1,0,7,41,2326,4302 +TCCGAGAAGGCTAAGC-1,0,6,42,2206,4371 +TGGCGGTGTGCGATTG-1,0,7,43,2326,4439 +ATCCTGCTGCAGATAG-1,0,6,44,2206,4508 +TTATGCGTCCCGGTCC-1,0,7,45,2326,4577 +CATAATGAGCGGGCGA-1,0,6,46,2206,4646 +AGACATAGATCCTTCC-1,0,7,47,2326,4715 +GGTGAAACCGGGAATG-1,0,6,48,2206,4784 +AACTGGTGTGGGCCTT-1,0,7,49,2326,4852 +GTAGCGCTGTTGTAGT-1,0,6,50,2206,4921 +TTGTTTGTGTAAATTC-1,0,7,51,2326,4990 +GGATCAAAGGACGAGG-1,0,6,52,2206,5059 +CGTAGCGCCGACGTTG-1,0,7,53,2326,5128 +CAAGTGAACTTTGGTT-1,0,6,54,2206,5197 +GTAGACAACCGATGAA-1,0,7,55,2326,5265 +CAATGGTCGGCCTGGG-1,0,6,56,2206,5334 +ACAGATTAGGTTAGTG-1,0,7,57,2326,5403 +GTTATCACCTTCTGAA-1,0,6,58,2206,5472 +TGGTATCGGTCTGTAT-1,0,7,59,2326,5541 +GGAATAACCTCAAGAA-1,0,6,60,2206,5610 +ATTATCTCGACAGATC-1,0,7,61,2326,5678 +CCGAGGGATGTTAGGC-1,0,6,62,2206,5747 +TGAGATCAAATACTCA-1,0,7,63,2326,5816 +AAACGAAGAACATACC-1,0,6,64,2206,5885 +CTGGTCCTAACTTGGC-1,0,7,65,2326,5954 +TGCACGAGTCGGCAGC-1,0,6,66,2206,6023 +ATAGTCTTTGACGTGC-1,0,7,67,2326,6091 +TGGAGCTAAAGTTCCC-1,0,6,68,2206,6160 +GGGTGGTCCAGCCTGT-1,0,7,69,2326,6229 +CATGCATGGAGACCCT-1,0,6,70,2206,6298 +ACACGGCACTATGCAT-1,0,7,71,2326,6367 +CCCTGGTATGGGCGGC-1,0,6,72,2206,6435 +GGAGGATTGAAAGGAG-1,0,7,73,2326,6504 +CCGCTGGTGCCATTCA-1,0,6,74,2206,6573 +GTTAGAGTGTGCCGCT-1,0,7,75,2326,6642 +TCGGAATGACCATCAA-1,0,6,76,2206,6711 +TTCAATTAGCCATAAT-1,0,7,77,2326,6780 +GATGTGTTGTCACAAG-1,0,6,78,2206,6848 +TCTTTCTCTTAAGGAG-1,0,7,79,2326,6917 +ACCCTTTAGTTCTCCA-1,0,6,80,2206,6986 +ACCACAACTCAGAACA-1,0,7,81,2326,7055 +TATGATAAATCTAACG-1,0,6,82,2206,7124 +GATCCTCTTGCGCTTA-1,0,7,83,2326,7193 +TTCTACCTTTATGTTG-1,0,6,84,2206,7261 +GAAATACCTGCTGGCT-1,0,7,85,2326,7330 +ATTCTGAGTATGAACT-1,0,6,86,2206,7399 +GGATTAAGCTAAGGTC-1,0,7,87,2326,7468 +AGTACGTGGCCTGTCT-1,0,6,88,2206,7537 +TCAGGGTGCACGAAAC-1,0,7,89,2326,7606 +AAATTTACCGAAATCC-1,0,6,90,2206,7674 +TTGAGGCATTTAACTC-1,0,7,91,2326,7743 +AACCAGTATCACTCTT-1,0,6,92,2206,7812 +CACCGGAGATATCTCC-1,0,7,93,2326,7881 +GACTGGGCGCCGCAAC-1,0,6,94,2206,7950 +CACGTCTATGATGTGG-1,0,7,95,2326,8019 +TTAAGACGAACGAACC-1,0,6,96,2206,8087 +TGACCAGCTTCAAAGT-1,0,7,97,2326,8156 +AGAGTTAGAGACCGAT-1,0,6,98,2206,8225 +TTCGGACTGATGCCTT-1,0,7,99,2326,8294 +CTCGAATGGAACGTAT-1,0,6,100,2206,8363 +GGACGGCTTGCGCAAC-1,0,7,101,2326,8432 +CTAAGTACAGGGCTAC-1,0,6,102,2206,8500 +ACAAATTCAGATCTGA-1,0,7,103,2326,8569 +CATGGAAATGGGACCA-1,0,6,104,2206,8638 +GGTGGACCACGTGTTA-1,0,7,105,2326,8707 +CACGACGTAATAGTAA-1,0,6,106,2206,8776 +CGGGTTCGGCACGTAT-1,0,7,107,2325,8845 +CTGGGCTATCCTTTGG-1,0,6,108,2206,8913 +GTATTAGGGTTCGCGT-1,0,7,109,2325,8982 +TCATTCGTATAATTTG-1,0,6,110,2206,9051 +AATAGCAAGCCTCCTG-1,0,7,111,2325,9120 +CATCTACCCGAGAACG-1,0,6,112,2206,9189 +GCTTCAGTGGGATTAC-1,0,7,113,2325,9257 +TCTGTGATGGAGGTTG-1,0,6,114,2206,9326 +ATCCACTTTCAGACTA-1,0,7,115,2325,9395 +ATGGTTACGAAACATG-1,0,6,116,2206,9464 +GGCCCAATCTAGAGGG-1,0,7,117,2325,9533 +GATGGTGAAATAACCC-1,0,6,118,2206,9602 +AGAGGGACAATTGTCC-1,0,7,119,2325,9670 +CGCGTACATTCTGGAA-1,0,6,120,2206,9739 +CAAGAAACCCTAAACT-1,0,7,121,2325,9808 +TTGGTGCGGTGTTGAA-1,0,6,122,2206,9877 +GGTTCCCTAGTGTCTC-1,0,7,123,2325,9946 +CGATAACCAATTTGAG-1,0,6,124,2206,10015 +GCCCACTGGTCCACAA-1,0,7,125,2325,10083 +GAGGGCCGGCAGAGTC-1,0,6,126,2206,10152 +CGACACGGATGCCCAC-1,0,7,127,2325,10221 +CTGTCTGTGGCTGGCT-1,0,8,0,2446,1480 +ATATTATCCCGTATTT-1,0,9,1,2565,1549 +GCGCTGGCGGAAAGTC-1,0,8,2,2446,1617 +ATCTAACGTCCCTATG-1,0,9,3,2565,1686 +GTCAGACAGCGTTGGA-1,0,8,4,2446,1755 +GCCAGGCTTAGTGGTA-1,0,9,5,2565,1824 +ATTCAAAGTACCTGTT-1,0,8,6,2446,1893 +TGGACGTAGGCGAATC-1,0,9,7,2565,1962 +ACACATTGACGCAACA-1,0,8,8,2446,2030 +GATATCAGTATGTATC-1,0,9,9,2565,2099 +TGGGCCTTGCCTGCAT-1,0,8,10,2446,2168 +CAAAGTCAGGTTAGCT-1,0,9,11,2565,2237 +GGATCCCTACCAGCTA-1,0,8,12,2446,2306 +ATCGTCCAATCGAGTC-1,0,9,13,2565,2375 +ACATGGCTCAATTTAG-1,0,8,14,2445,2443 +AGGCCCAGTGACTGGT-1,0,9,15,2565,2512 +GCTTCCAGCTTAGATT-1,0,8,16,2445,2581 +TGCTTGAAACCATGCA-1,0,9,17,2565,2650 +CAATATTGGACTAGTG-1,0,8,18,2445,2719 +CGTGCTGGCCTAGTCG-1,0,9,19,2565,2788 +CCTGCGATAGAACTGT-1,0,8,20,2445,2856 +GGGTAATGCTGTGTTT-1,0,9,21,2565,2925 +AACGCGAACGGCAACA-1,0,8,22,2445,2994 +TGTCGGCATGGTGGAA-1,0,9,23,2565,3063 +AGCGTACGAGAGCTAG-1,0,8,24,2445,3132 +ATACTCTCGCCACTCT-1,0,9,25,2565,3201 +AATCCATGCAAGGGTG-1,0,8,26,2445,3269 +TTAAACAGAGTCCCGC-1,0,9,27,2565,3338 +CCACAGCTGAAATCAT-1,0,8,28,2445,3407 +CGGTTCCGGCTTCTTG-1,0,9,29,2565,3476 +GACGTGAGACTCCATG-1,0,8,30,2445,3545 +TCGTTGGCTCGTCAAT-1,0,9,31,2565,3614 +GGTGAACGGGCTAGCC-1,0,8,32,2445,3682 +GCACTGTGCAAATGTA-1,0,9,33,2565,3751 +ACGAGAACCCATCACG-1,0,8,34,2445,3820 +CCAGCTACGCCTCATA-1,0,9,35,2565,3889 +TCCCGGTCAGGAATTT-1,0,8,36,2445,3958 +TCGCATTCAATGACTT-1,0,9,37,2565,4026 +CTGGTTCAACGCATCA-1,0,8,38,2445,4095 +GGTGATTTCATCTTGT-1,0,9,39,2565,4164 +CACCCTTTCCTCGCTC-1,0,8,40,2445,4233 +CAACTTGTAGTGGGCA-1,0,9,41,2565,4302 +AATATCAAGGTCGGAT-1,0,8,42,2445,4371 +ACTCAGACCTGCTTCT-1,0,9,43,2565,4439 +TTGGAGTCTCCCTTCT-1,0,8,44,2445,4508 +GGATACTCATGAATTG-1,0,9,45,2565,4577 +TGGGCACAAACAGAAC-1,0,8,46,2445,4646 +GAGCCACGGTAGTAGG-1,0,9,47,2565,4715 +TCGATAGGCTAGTCGC-1,0,8,48,2445,4784 +TAACCGCCCGCAGTGC-1,0,9,49,2565,4852 +GCCTATTTGCTACACA-1,0,8,50,2445,4921 +TTGACGATTCAGCACG-1,0,9,51,2565,4990 +TTAAACCGGTAGCGAC-1,0,8,52,2445,5059 +ACCGAAAGGGCCCTGC-1,0,9,53,2565,5128 +ACGTTCCGCGCTCCGT-1,0,8,54,2445,5197 +ATACCAGGCTAATAGA-1,0,9,55,2565,5265 +CGGCTTTGTATGATAA-1,0,8,56,2445,5334 +CTTGACCCGAAAGATA-1,0,9,57,2565,5403 +CGCAGAAACATTTGCG-1,0,8,58,2445,5472 +GACCCGTCGCCGGCTA-1,0,9,59,2565,5541 +AATCGGGACACTACGA-1,0,8,60,2445,5610 +GTCACAAAGTTTCCAA-1,0,9,61,2565,5678 +TATATTCGCGTCGATA-1,0,8,62,2445,5747 +CCTCCCGACAATCCCT-1,0,9,63,2565,5816 +CGACATGCGATCTTCT-1,0,8,64,2445,5885 +AACACGACTGTACTGA-1,0,9,65,2565,5954 +CCCAACCACACTAACA-1,0,8,66,2445,6023 +CACCGCCGACCAGCGA-1,0,9,67,2565,6091 +TGGTATCGCATCCCAA-1,0,8,68,2445,6160 +CAGAGTGATTTAACGT-1,0,9,69,2565,6229 +AACCCTGGTGGAACCA-1,0,8,70,2445,6298 +GTCAGTTGTGCTCGTT-1,0,9,71,2565,6367 +ATTGACGTAACTCGGT-1,0,8,72,2445,6435 +GATGTCGGTCAACTGC-1,0,9,73,2565,6504 +AGGGCAGCGGCGTGGT-1,0,8,74,2445,6573 +ACATCGTTAACCTAGT-1,0,9,75,2565,6642 +TCCATTGTGACCTCGT-1,0,8,76,2445,6711 +TGTTTAATACTTCATC-1,0,9,77,2565,6780 +TTGCTGGCCGGGCTTC-1,0,8,78,2445,6848 +CATATTATTTGCCCTA-1,0,9,79,2565,6917 +CTGCCTAGCCACCAAG-1,0,8,80,2445,6986 +ACGAGATATTTGCTTA-1,0,9,81,2565,7055 +GACTACAATTGCTCGT-1,0,8,82,2445,7124 +AACGTGATGAAGGACA-1,0,9,83,2565,7193 +ACTCTCTTATACACGA-1,0,8,84,2445,7261 +CGCATCATGGCTTCAG-1,0,9,85,2565,7330 +CGGCTCTTCGTCGAAC-1,0,8,86,2445,7399 +ATTCTTCGTACTTATG-1,0,9,87,2565,7468 +AGTGAGGGTTTCTGAC-1,0,8,88,2445,7537 +GCCAGGCGTTCGCATG-1,0,9,89,2565,7606 +GACTAACACAGCACCT-1,0,8,90,2445,7674 +CAATGGAATCTACATA-1,0,9,91,2565,7743 +GTGGTCAGCGAAGTAT-1,0,8,92,2445,7812 +ATGGCTGGAAATGGCC-1,0,9,93,2565,7881 +ATCAGGTCGCCATTGC-1,0,8,94,2445,7950 +TATCACCATGTAAAGT-1,0,9,95,2565,8019 +AGCGCTTATGGGCAAG-1,0,8,96,2445,8087 +AAGCGGCGTCATGGGT-1,0,9,97,2565,8156 +ACTAATACGTCAGGCG-1,0,8,98,2445,8225 +GGCTGAGCATCGTAAG-1,0,9,99,2565,8294 +CGGTTGGGTTCAAGTT-1,0,8,100,2445,8363 +GACTGATTGGTCACAA-1,0,9,101,2565,8432 +AGACGGGCCGATTTAA-1,0,8,102,2445,8500 +ACCAGTGCCCGGTCAA-1,0,9,103,2565,8569 +GTCCTTTAATGACTTC-1,0,8,104,2445,8638 +CCTACAAGTCCGGAAT-1,0,9,105,2565,8707 +GCCTGCTACACTGAGA-1,0,8,106,2445,8776 +GACTCGGTCGGCGGAT-1,0,9,107,2565,8845 +CTAGACATATATGTAG-1,0,8,108,2445,8913 +TCGCCCAACTGACTCC-1,0,9,109,2565,8982 +AAACTAACGTGGCGAC-1,0,8,110,2445,9051 +AACTGAGGTCAGCGTC-1,0,9,111,2565,9120 +ACAATGATTCTTCTAC-1,0,8,112,2445,9189 +ATAAGTACCCGATTGT-1,0,9,113,2565,9257 +ATTGGGAGTTCTGTAA-1,0,8,114,2445,9326 +CGAACATAGTCAGAAA-1,0,9,115,2565,9395 +TAGCTCAGATCCTAGT-1,0,8,116,2445,9464 +GTGTCGTATTCACCTT-1,0,9,117,2565,9533 +CTCACCGATCCAAACT-1,0,8,118,2445,9602 +ATATGTGCACAAACCA-1,0,9,119,2565,9670 +CAGTCCAACGCCTTCT-1,0,8,120,2445,9739 +TCGTCCGGGTACACTC-1,0,9,121,2565,9808 +GCAGAAACGTAATCCA-1,0,8,122,2445,9877 +TTCGAGCCGGCGCTAC-1,0,9,123,2565,9946 +GGAAGATAAGACTGTA-1,0,8,124,2445,10015 +ATAAGCAAACACCGAG-1,0,9,125,2565,10083 +GCATAAATTGAACGCC-1,0,8,126,2445,10152 +CGCCGGTGTCGCAGTA-1,0,9,127,2565,10221 +GACCTGGTCTGGGCGT-1,0,10,0,2685,1480 +AGCCGCTTGATTAGCG-1,0,11,1,2805,1549 +CCCGGCTAGGTGAGAA-1,0,10,2,2685,1617 +CGAGCCGAGCACTCGA-1,0,11,3,2805,1686 +TAGTGCTTGAATCCTT-1,0,10,4,2685,1755 +CAACCGCACCTAGACA-1,0,11,5,2805,1824 +ACCACTGTTCAAGAAG-1,0,10,6,2685,1893 +AGATGCTATAACGAGC-1,0,11,7,2805,1962 +AATTACTCGTACGCTC-1,0,10,8,2685,2030 +CGTCAATCTTTAACAT-1,0,11,9,2805,2099 +CCAAAGCAGTTGGTTG-1,0,10,10,2685,2168 +CCATATTGGATCATGA-1,0,11,11,2805,2237 +CGTACCGAAAGTCTAG-1,0,10,12,2685,2306 +CTCGAGATCCAAAGCA-1,0,11,13,2805,2375 +TGGATAGAGTAACAGA-1,0,10,14,2685,2443 +TCACAGATCCTCAAAC-1,0,11,15,2805,2512 +AGAGCTACGAAAGCAT-1,0,10,16,2685,2581 +TGCGTGATTGGGTGTC-1,0,11,17,2805,2650 +CACATGTTTGGACATG-1,0,10,18,2685,2719 +TTCGCATCCGGAAGCA-1,0,11,19,2805,2788 +CCCTAGTGTCAGGTGT-1,0,10,20,2685,2856 +TTACCGCCTTAGGGAA-1,0,11,21,2805,2925 +CCAGTCCATTATTCGA-1,0,10,22,2685,2994 +CGTAAACGCTTGAGTG-1,0,11,23,2805,3063 +ATTCCTTCCAGGCGGT-1,0,10,24,2685,3132 +TTCCTTTCTGTGTTGC-1,0,11,25,2805,3201 +AGTTGACATCGGCTGG-1,0,10,26,2685,3269 +AACTCGATGGCGCAGT-1,0,11,27,2805,3338 +GATAAGGCAGATGCAA-1,0,10,28,2685,3407 +GGCTGGCTAGCTTAAA-1,0,11,29,2805,3476 +CCTCATGCAGCTACGA-1,0,10,30,2685,3545 +GACGCCTGTTGCAGGG-1,0,11,31,2805,3614 +TAATTAGATGGATATG-1,0,10,32,2685,3682 +GAGGGCATCGCGTATC-1,0,11,33,2805,3751 +CTTGTGAGTCTTTGAC-1,0,10,34,2685,3820 +TCAACACATTGGGTAA-1,0,11,35,2805,3889 +ACTGTATACGCGAGCA-1,0,10,36,2685,3958 +GTGAAACGTGCTCCAC-1,0,11,37,2805,4026 +CGAGTGCTATAGTTCG-1,0,10,38,2685,4095 +GTACTGCATGAAGCGT-1,0,11,39,2805,4164 +GTAACTTGCGGCAGTC-1,0,10,40,2685,4233 +GAATCGCCGGACACGG-1,0,11,41,2805,4302 +GGGAGTAATGGCTGGC-1,0,10,42,2685,4371 +CATGAACCGACATTTG-1,0,11,43,2805,4439 +TCTGTCATACAAGAGC-1,0,10,44,2685,4508 +GTCGTCAATTATAAGG-1,0,11,45,2805,4577 +TAAAGAGCCCGAAACC-1,0,10,46,2685,4646 +GTACTGAGGTCGTAAC-1,0,11,47,2805,4715 +AAAGACCCAAGTCGCG-1,0,10,48,2685,4784 +CGTCAGTGCGCACAAG-1,0,11,49,2805,4852 +TGTATCCTTATTCCAT-1,0,10,50,2685,4921 +ATTCTCGTCTCTTTAG-1,0,11,51,2805,4990 +AAAGTCACTGATGTAA-1,0,10,52,2685,5059 +TGTCTACAGTTTCTGT-1,0,11,53,2805,5128 +TTAACGTCGCAAGACC-1,0,10,54,2685,5197 +CTATGTCTATTGAAAC-1,0,11,55,2805,5265 +TCGGGTGAAACTGCTA-1,0,10,56,2685,5334 +TGTCCCGACATAGCAC-1,0,11,57,2805,5403 +ACAGCATAGAGCCAGT-1,0,10,58,2685,5472 +ATATTCCCACAGGTCA-1,0,11,59,2805,5541 +TTGGATCGACTTCTGG-1,0,10,60,2685,5610 +CACCATCGGAGGAGAC-1,0,11,61,2805,5678 +TCGTTCGTTATTATGT-1,0,10,62,2685,5747 +CTTAACTTCGAAGTAC-1,0,11,63,2805,5816 +GCACAAGTGTCGGAAG-1,0,10,64,2685,5885 +TACCAGCTAGGTTTAA-1,0,11,65,2805,5954 +ACGTACAGATTTCTCT-1,0,10,66,2685,6023 +AATTTGGTTCCAAAGA-1,0,11,67,2805,6091 +GTAAGGATTTGTCGGA-1,0,10,68,2685,6160 +CATCATCTACCCGGAC-1,0,11,69,2805,6229 +ACGATGGATCCGATGC-1,0,10,70,2685,6298 +CACTCAGCTCTTGAGG-1,0,11,71,2805,6367 +TAGATCCGAAGTCGCA-1,0,10,72,2685,6436 +TGAAACTTATGCAAGC-1,0,11,73,2805,6504 +GCGATTCTGGAAGCAG-1,0,10,74,2685,6573 +CAAACTATTGAGCTTC-1,0,11,75,2805,6642 +TAGAATTAAGGGCAAC-1,0,10,76,2685,6711 +CGAAACATAGATGGCA-1,0,11,77,2805,6780 +GATGGTGCCCTAGGCA-1,0,10,78,2685,6848 +CCCGCAGGGCCCAAAG-1,0,11,79,2805,6917 +ACAGCGCACCCGCAGC-1,0,10,80,2685,6986 +GGTAAATGTGCGTTAC-1,0,11,81,2805,7055 +GTCCTTCTAGTGGGTT-1,0,10,82,2685,7124 +GGAAGCTCGCTTACAG-1,0,11,83,2805,7193 +CACCGATACACCGAGC-1,0,10,84,2685,7261 +CAGCCGGGCCCTCTAT-1,0,11,85,2805,7330 +CGGAGCTTATAACACC-1,0,10,86,2685,7399 +ATTACAACTACCGGCC-1,0,11,87,2805,7468 +TCCTCTGGCCCATTAG-1,0,10,88,2685,7537 +CGGCACCGTTAGCGCC-1,0,11,89,2805,7606 +TCGGTCCCTGACTCCA-1,0,10,90,2685,7674 +TGGTTGGAGGATCCTG-1,0,11,91,2805,7743 +CTGCGGTAGTCACGTG-1,0,10,92,2685,7812 +GTGCCTCAGTGTACGG-1,0,11,93,2805,7881 +ATCGTTCACTTTCGCC-1,0,10,94,2685,7950 +ACTTACCGGGCGCGCA-1,0,11,95,2805,8019 +CTAGACTGCATTTCGT-1,0,10,96,2685,8087 +TTGCCGGTGATCCCTC-1,0,11,97,2805,8156 +CTGTCACGCCAGGCGC-1,0,10,98,2685,8225 +CGGTATAGGTATTAGC-1,1,11,99,2805,8294 +CCAACGCTTGCCAGGG-1,0,10,100,2685,8363 +CGTTGAGTAATTGCGT-1,1,11,101,2805,8432 +TGTATTTACCTAATGC-1,0,10,102,2685,8500 +TAAATGCCGTCTCATG-1,1,11,103,2805,8569 +CGGTTTATGAAGGAAC-1,0,10,104,2685,8638 +GCAAGATGTGTTCGCG-1,1,11,105,2805,8707 +AAAGGTAAGCTGTACC-1,0,10,106,2685,8776 +GTACGTCACGTATTAA-1,1,11,107,2805,8845 +AGTACCTTCGAGTGCT-1,0,10,108,2685,8913 +ATTGTGACTTCGCTGC-1,1,11,109,2805,8982 +TGTATCAGACTGAAGC-1,1,10,110,2685,9051 +GAGACCCTGCAACGCC-1,1,11,111,2805,9120 +TGGGTGGGATGTCATT-1,1,10,112,2685,9189 +GGCTAATGATTGAAAT-1,1,11,113,2805,9258 +ATAACGTTACCTCCAC-1,1,10,114,2685,9326 +TGCGAGATGGCGGCCA-1,1,11,115,2805,9395 +CACACTTGTATTGCGA-1,0,10,116,2685,9464 +GCTGGTGACTCGTAGT-1,1,11,117,2805,9533 +CGACACCGCTTAAGGA-1,0,10,118,2685,9602 +GTAACAACTGACCTTG-1,0,11,119,2805,9670 +CAACTGAGGGTATGAC-1,0,10,120,2685,9739 +CTAATTATGAAGCGTA-1,0,11,121,2805,9808 +CCGATCTTAAGAGGCT-1,0,10,122,2685,9877 +CGACTCGGTACACGGT-1,0,11,123,2805,9946 +TGCTGCGTCAGAGTTA-1,0,10,124,2685,10015 +AGAGTTGCAGGCCTCC-1,0,11,125,2805,10083 +ACTGGCGAACCTGCGT-1,0,10,126,2685,10152 +ACTAAGGACGCACACC-1,0,11,127,2804,10221 +CGTCCAGATGGCTCCA-1,0,12,0,2925,1480 +ACTATCGCCGGCTAAA-1,0,13,1,3044,1549 +GATAGCGTACCACGCG-1,0,12,2,2925,1617 +AGGACTTATAGGAGAA-1,0,13,3,3044,1686 +TAGTCGGGATTCTTCG-1,0,12,4,2925,1755 +ACCATTAAGGGTGTCA-1,0,13,5,3044,1824 +TTAATGTGTTTGCAGG-1,0,12,6,2925,1893 +TCCGCAGCCACCTAGC-1,0,13,7,3044,1962 +GAGGAGATCCTCATGC-1,0,12,8,2925,2030 +GGTCCTTCATACGACT-1,0,13,9,3044,2099 +CCCTGTTGGCAAAGAC-1,0,12,10,2925,2168 +GTGCCTAGCTATGCTT-1,0,13,11,3044,2237 +GTCATCTCCTACAGCT-1,0,12,12,2925,2306 +GCGAGAAACGGGAGTT-1,0,13,13,3044,2375 +CGTCGCGGCGGGATTT-1,0,12,14,2925,2443 +CATTGTGTGCTAGATC-1,0,13,15,3044,2512 +CGCGGCAGTATTACGG-1,0,12,16,2925,2581 +GAAATGGGATGTAAAC-1,0,13,17,3044,2650 +CATTCCCTAAGTACAA-1,0,12,18,2925,2719 +AGTTCTGCGTTGTATC-1,0,13,19,3044,2788 +ACCCTATAGGACTGAG-1,0,12,20,2925,2856 +TTAGATAGGTCGATAC-1,0,13,21,3044,2925 +ATTGATAGCAACGAGA-1,0,12,22,2925,2994 +TCTCGGCTCCAGGACT-1,0,13,23,3044,3063 +CTTGAGGTTATCCCGA-1,0,12,24,2925,3132 +AAGAAGGATCAGTTAG-1,0,13,25,3044,3201 +GTACGACGGCGCTGCG-1,0,12,26,2925,3269 +CTTATGTTGACTACCA-1,0,13,27,3044,3338 +CGGCACTCAAGAAAGT-1,0,12,28,2925,3407 +GTCAAAGTTTACATAG-1,0,13,29,3044,3476 +CTCCTAAGTTATGTCT-1,0,12,30,2925,3545 +ACTGTGCTAGTAGATC-1,0,13,31,3044,3614 +GTTTGGCCGCTCAGCG-1,0,12,32,2925,3682 +TTATCCAATCGAACTC-1,0,13,33,3044,3751 +CCGTACCCAAGCGCCA-1,0,12,34,2924,3820 +CATACAAAGCCGAACC-1,0,13,35,3044,3889 +GGTCGGTAATTAGACA-1,0,12,36,2924,3958 +AGCGGGAAGGGTCCAT-1,0,13,37,3044,4027 +GCCCACCAAGGCTGTC-1,0,12,38,2924,4095 +GTAGACGTCGTTACAT-1,0,13,39,3044,4164 +GAGCATCATCCCTGGG-1,0,12,40,2924,4233 +AGGTAACCTCCTATTC-1,0,13,41,3044,4302 +GGTTTGAGTGCTGGAA-1,0,12,42,2924,4371 +GCACTAGTCGCGCTAT-1,0,13,43,3044,4439 +GGTAACTATGTATCTG-1,0,12,44,2924,4508 +GCGGTCCCTAGACGCA-1,0,13,45,3044,4577 +CGAGCGTTGATCAGCC-1,0,12,46,2924,4646 +AATCCAAGGGCCTGAG-1,0,13,47,3044,4715 +CCGTGCCCATGACGGC-1,0,12,48,2924,4784 +GAAATTCACATCGCTG-1,0,13,49,3044,4852 +CTCTGCGAAGCAAGCA-1,0,12,50,2924,4921 +AGTAGGTAACATACAT-1,0,13,51,3044,4990 +ATTGGGAATATCTTGG-1,0,12,52,2924,5059 +TAGAGCTACGAAGAAC-1,0,13,53,3044,5128 +TGCGGCATAGTTCAAC-1,0,12,54,2924,5197 +CCGCCGGTCAACACAC-1,0,13,55,3044,5265 +TCGTATAGTGCAATTA-1,0,12,56,2924,5334 +TAGTTTATTCTTGCTT-1,0,13,57,3044,5403 +GATATCTCATGCAATA-1,0,12,58,2924,5472 +CGTTTAAGCGGAGCAC-1,0,13,59,3044,5541 +CATGCTGGCTCCAATT-1,0,12,60,2924,5610 +GAAACAGCCATGCAGT-1,0,13,61,3044,5678 +AGTTTCGCAGGTCGGA-1,0,12,62,2924,5747 +CTCATGGCTCACAATC-1,0,13,63,3044,5816 +AACCGTTGTGTTTGCT-1,0,12,64,2924,5885 +ACCCTTCATCTGCGAA-1,0,13,65,3044,5954 +TGCGGTGAAATTTCAT-1,0,12,66,2924,6023 +CAAATTGTCAGCAAGC-1,0,13,67,3044,6091 +GAGGTACATCCATCTT-1,0,12,68,2924,6160 +AAATGGCATGTCTTGT-1,0,13,69,3044,6229 +TCATCCCAGAGGGTGG-1,0,12,70,2924,6298 +CGTAGCGAATTGTCAG-1,0,13,71,3044,6367 +CCTAGTTAGTCGCATG-1,0,12,72,2924,6436 +GAAACTCTAATGAAGG-1,0,13,73,3044,6504 +TTGTATCACACAGAAT-1,0,12,74,2924,6573 +TTCAAGCCGAGCTGAG-1,0,13,75,3044,6642 +AGGTACGATATTGCCA-1,0,12,76,2924,6711 +TTAAGCCGACAACTTC-1,0,13,77,3044,6780 +GTCTTAGTACAGCCGG-1,0,12,78,2924,6848 +TGGGTAAGGTTCCCGC-1,0,13,79,3044,6917 +CTACGCCATTTCCGAT-1,0,12,80,2924,6986 +GACCGTCAGGTCGTGA-1,0,13,81,3044,7055 +TAGTTAAGATAGGATA-1,0,12,82,2924,7124 +GAATATTCGGAGTCCC-1,0,13,83,3044,7193 +CAAACTACGATAGAGA-1,0,12,84,2924,7261 +CAGGAAGACTTTATAT-1,0,13,85,3044,7330 +TTCGTAATCCCAGCGG-1,0,12,86,2924,7399 +GTGAGGAGCGGTTGAG-1,1,13,87,3044,7468 +CAATCCCTATACCAGC-1,1,12,88,2924,7537 +AGGGAAACGAGGTACT-1,1,13,89,3044,7606 +TCCTGCCAACTGGAGA-1,1,12,90,2924,7674 +AATTTGGGACATAGTA-1,1,13,91,3044,7743 +AACTCCTAATCCCATG-1,1,12,92,2924,7812 +GCTCATTACTGCATGT-1,1,13,93,3044,7881 +TCTCGAACGAGGTCAC-1,1,12,94,2924,7950 +TCACTACGACCAATGC-1,1,13,95,3044,8019 +GTGATGCACAACATCT-1,1,12,96,2924,8087 +CCGACGTAAACACAAC-1,1,13,97,3044,8156 +TGGGATGCACTCATTC-1,1,12,98,2924,8225 +TTCCATCATGCGGTGA-1,1,13,99,3044,8294 +TGCACAGTGAAGTTAT-1,1,12,100,2924,8363 +CTATTGTGTTTGGTCA-1,1,13,101,3044,8432 +TGCGAGCCCTTCCGCG-1,1,12,102,2924,8500 +TTGAAAGGTGTAAAGG-1,1,13,103,3044,8569 +GGTGCAGAGCCTATCG-1,1,12,104,2924,8638 +ACTATATGCTGTGTTC-1,1,13,105,3044,8707 +TCCTGGCGCTGCCTGG-1,1,12,106,2924,8776 +GAGCCGAGCGTTTATT-1,1,13,107,3044,8845 +AGAATGCGGGTTCGGA-1,1,12,108,2924,8913 +ATGCGACAATTGGTCC-1,1,13,109,3044,8982 +TTCCGGCTCGACTTCT-1,1,12,110,2924,9051 +TGATTATGGCACGCAG-1,1,13,111,3044,9120 +GGTTTGACAAGAAGCT-1,1,12,112,2924,9189 +GCAGCTATGGACAGGT-1,1,13,113,3044,9258 +CACCATGATCGCAAAG-1,1,12,114,2924,9326 +GTCGGAAGGATACCAG-1,1,13,115,3044,9395 +GGCCCAGTTATCAGCA-1,0,12,116,2924,9464 +GGGCCTATTTAAGTAT-1,0,13,117,3044,9533 +GTTGTTACATTGCGCT-1,0,12,118,2924,9602 +CAACTCCGTAACTTGC-1,0,13,119,3044,9670 +GATCTTTGCTCAAAGA-1,0,12,120,2924,9739 +TCGCTTAATTACGAAG-1,0,13,121,3044,9808 +CGATCATTAGAGGCAC-1,0,12,122,2924,9877 +TGTTCTCTACTCCCTA-1,0,13,123,3044,9946 +GCTTAGGGAAGCGGTA-1,0,12,124,2924,10015 +CAGGTTTAGTACTACA-1,0,13,125,3044,10083 +AAGCGGAGTGCGCGCA-1,0,12,126,2924,10152 +TCAGATGGAGACGTAG-1,0,13,127,3044,10221 +TCGCACTAACGTTTGT-1,0,14,0,3164,1480 +CACGTCGGGTTCTAGA-1,0,15,1,3284,1549 +GGAGTACACATGAGCT-1,0,14,2,3164,1617 +GTGTGTCGACGTCGCT-1,0,15,3,3284,1686 +GAAGCTCTTTGCTTAG-1,0,14,4,3164,1755 +ACACCGAGCGCTCTTT-1,0,15,5,3284,1824 +CGTAATAATTACGAGT-1,0,14,6,3164,1893 +CATCAACACCTACTAA-1,0,15,7,3284,1962 +CCAAGTTTCTACAGAT-1,0,14,8,3164,2030 +ACGGGTCATGTGACTT-1,0,15,9,3284,2099 +AGTGTGCTAAGATCGC-1,0,14,10,3164,2168 +GGCGGTTTGCCGGTGC-1,0,15,11,3284,2237 +GTATAATCTCCCGGAT-1,0,14,12,3164,2306 +TAGTCCGTATGCATAA-1,0,15,13,3284,2375 +CACTTCGTCTTATCTC-1,0,14,14,3164,2443 +CATCCGCAGGCCCGAA-1,0,15,15,3284,2512 +CCCTGATGTAACTCGT-1,0,14,16,3164,2581 +CCATAGTCAGTAACCC-1,0,15,17,3284,2650 +CGGGCCATAGCCGCAC-1,0,14,18,3164,2719 +CTCCGGCTTGTAGACA-1,0,15,19,3284,2788 +AACTTGCGTTCTCGCG-1,0,14,20,3164,2856 +AATGAGTTCGCATATG-1,0,15,21,3284,2925 +CGAGGCCAGGCATTGG-1,0,14,22,3164,2994 +TCTGCGTCCGGTTTCT-1,0,15,23,3284,3063 +CAATCCTGCCGTGGAG-1,0,14,24,3164,3132 +CTGAGCAAGTAACAAG-1,0,15,25,3284,3201 +GGGTACCCACGGTCCT-1,0,14,26,3164,3269 +ACGGAATTTAGCAAAT-1,0,15,27,3284,3338 +GGGCGGTCCTATTGTC-1,0,14,28,3164,3407 +ATGTTACGAGCAATAC-1,0,15,29,3284,3476 +AACCATGGGATCGCTA-1,0,14,30,3164,3545 +TCGCATCCCTAAGTGT-1,0,15,31,3284,3614 +ACTTAGTACGACAAGA-1,0,14,32,3164,3682 +GAGCTCTCGGACCTAA-1,0,15,33,3284,3751 +TCTATTACGCTGGCGA-1,0,14,34,3164,3820 +AGATACGACTTCATAT-1,0,15,35,3284,3889 +CGCTATACCGCCCACT-1,0,14,36,3164,3958 +CAGTGTCCGCAGAATG-1,0,15,37,3284,4027 +CCATCCATACCAAGTC-1,0,14,38,3164,4095 +AACCCAGAGACGGAGA-1,0,15,39,3284,4164 +GAAGAACGGTGCAGGT-1,0,14,40,3164,4233 +GATAAATCGGTGGATG-1,0,15,41,3284,4302 +CAGCTCGTGCTTGTGT-1,0,14,42,3164,4371 +GAGTACGGGTATACAA-1,0,15,43,3284,4439 +CATCGCCCGCGGCCAA-1,0,14,44,3164,4508 +TCTTACAGAGGTACCG-1,0,15,45,3284,4577 +TGGAAGACGAACACCA-1,0,14,46,3164,4646 +GTTGTCGTGTTAGTTG-1,0,15,47,3284,4715 +CCAAGGAACAGAGAGG-1,0,14,48,3164,4784 +CTGCACCTGGAACCGC-1,0,15,49,3284,4852 +CGCTTTCATACCGGTG-1,0,14,50,3164,4921 +GTTCTTCCCTCGATGT-1,0,15,51,3284,4990 +ATTTAACTCGTATTAC-1,0,14,52,3164,5059 +AACGATAGAAGGGCCG-1,0,15,53,3284,5128 +TATCCTGCATGGGAAT-1,0,14,54,3164,5197 +AGGCCCATTGTACAGG-1,0,15,55,3284,5265 +CCGGCGCATATTGGAT-1,0,14,56,3164,5334 +ATCTGTAATTGTACCC-1,0,15,57,3284,5403 +GAGCGAGGGAGTACCG-1,0,14,58,3164,5472 +TTATTAGGGAAGCATC-1,0,15,59,3284,5541 +CTTCTTACGTCGTATA-1,0,14,60,3164,5610 +GAAGTGCTGGATAGCT-1,0,15,61,3284,5678 +GTGCAACAAATGTGGC-1,0,14,62,3164,5747 +CATGCGTTAGACAGAA-1,0,15,63,3284,5816 +ACACACTTTCTACACG-1,0,14,64,3164,5885 +AGCCCTAAGCGAAGTT-1,0,15,65,3284,5954 +ATTAATTCGGTCACTC-1,0,14,66,3164,6023 +AACAGGAAATCGAATA-1,0,15,67,3284,6091 +ACGTTTAGTTGTGATC-1,0,14,68,3164,6160 +TCCTTCAGTGGTCGAA-1,0,15,69,3284,6229 +CGAACGCCCAGTGCCG-1,0,14,70,3164,6298 +CCTCGAAGTGGACGGG-1,0,15,71,3284,6367 +CTCTGTTTGAGGATTC-1,0,14,72,3164,6436 +TGGGCACGTTCTATGG-1,0,15,73,3284,6504 +ACTATTCGTCCGTGGT-1,0,14,74,3164,6573 +CCTCTGGCCTAGACGG-1,1,15,75,3284,6642 +CCATAAACAACCCGAC-1,0,14,76,3164,6711 +CATAGTACATTGAGAG-1,1,15,77,3284,6780 +ATTTCATTATTTCGCG-1,0,14,78,3164,6848 +CAACTATATCGAATGC-1,1,15,79,3284,6917 +CTAGTATTCGGAATTA-1,0,14,80,3164,6986 +GTGGAACCTACATGCG-1,1,15,81,3284,7055 +CCTAAAGGCTGACGCT-1,1,14,82,3164,7124 +CGTGACATTGGGTCGT-1,1,15,83,3284,7193 +CCAATCGGTAGATCGA-1,1,14,84,3164,7261 +ATTGTCGCAATACCTT-1,1,15,85,3284,7330 +AAATTACACGACTCTG-1,1,14,86,3164,7399 +CACTCCTCTCGGTCGG-1,1,15,87,3284,7468 +AAATAACCATACGGGA-1,1,14,88,3164,7537 +AGTTACTCTATCGTGG-1,1,15,89,3284,7606 +CGTTAGCTCACAACTG-1,1,14,90,3164,7674 +GAATGTATGGCAGGTC-1,1,15,91,3284,7743 +GCAACCACCAGACCGG-1,1,14,92,3164,7812 +TCACTCGTGCAACGGC-1,1,15,93,3284,7881 +AAACAGAGCGACTCCT-1,1,14,94,3164,7950 +CAGCCTCTCCTCAAGA-1,1,15,95,3284,8019 +TTGCGTGAACGCTTAG-1,1,14,96,3164,8087 +CCGCCTGCGAATTGGT-1,1,15,97,3284,8156 +AGATGAGGGTTGCGAT-1,1,14,98,3164,8225 +CGGTGGGCTCCAGCCT-1,1,15,99,3284,8294 +GGCAGCGGTAATCCTA-1,1,14,100,3164,8363 +GCTAGCAGGGAGTGGG-1,1,15,101,3284,8432 +CTCAAGACATTAGCGC-1,1,14,102,3164,8500 +CACGGCGCGCCAAAGG-1,1,15,103,3284,8569 +TGCAATTTGGGCACGG-1,1,14,104,3164,8638 +ATGCCAATCGCTCTGC-1,1,15,105,3284,8707 +GCTGGACCCAAAGTGG-1,1,14,106,3164,8776 +ATTCCTAAGACGTGGA-1,1,15,107,3284,8845 +TCCGGAGGAAGGGCTG-1,1,14,108,3164,8913 +TCGGTGACCGCTCCGG-1,1,15,109,3284,8982 +TCCGAAGTAGTCACCA-1,1,14,110,3164,9051 +CATGTAGGAGCGCCAA-1,1,15,111,3284,9120 +CACAAGAAAGATATTA-1,1,14,112,3164,9189 +AGGGTCAGTAACCCTA-1,1,15,113,3284,9258 +TAAGCCCTTACGACCA-1,1,14,114,3164,9326 +ATACCGTCATCCATAA-1,1,15,115,3284,9395 +GGACGTCCATAGTTGG-1,1,14,116,3164,9464 +CATCAAACTGGCGCCC-1,0,15,117,3284,9533 +AAACGTGTTCGCCCTA-1,0,14,118,3164,9602 +AAATTGGTGAGAAGCA-1,0,15,119,3284,9670 +GGTCATTGTAGTCATA-1,0,14,120,3164,9739 +TGCAGTGAGGCTCGGG-1,0,15,121,3284,9808 +GAACATTAGTATGTTA-1,0,14,122,3164,9877 +GGTTTGCGAACACGTA-1,0,15,123,3284,9946 +ACACAAATATTCCTAG-1,0,14,124,3164,10015 +TTGGGTTTATTCAGCG-1,0,15,125,3284,10083 +ATTCGCAGAGGACACT-1,0,14,126,3164,10152 +GATTTAGTGCGTACTG-1,0,15,127,3284,10221 +TAGAAACACAATAGTG-1,0,16,0,3404,1480 +CAGTAGATGATGTCCG-1,0,17,1,3523,1549 +TCTTAACTCGGATGTA-1,0,16,2,3404,1617 +TACATCTTGTTTCTTG-1,0,17,3,3523,1686 +TTCATAGGGTGTCCAT-1,0,16,4,3404,1755 +TGAAGTAGCTTACGGA-1,0,17,5,3523,1824 +GCACAAGTGGATCATA-1,0,16,6,3404,1893 +GGGCGAATTTCTCCAC-1,0,17,7,3523,1962 +ATGTTCCTGCCCACCT-1,0,16,8,3404,2030 +GCTCAACCTCTTAGAG-1,0,17,9,3523,2099 +ATAGCTGCTCTTGTTA-1,0,16,10,3404,2168 +CGTCAGCTATTTACTC-1,0,17,11,3523,2237 +ATCTGATAGTGTCTTA-1,0,16,12,3404,2306 +TGCACTATGTGAGTGC-1,0,17,13,3523,2375 +CCGACAAACACATGAG-1,0,16,14,3404,2443 +GCCTTGTATATGCAGT-1,0,17,15,3523,2512 +ATAATACCGTTAGCCG-1,0,16,16,3404,2581 +ACACTCCAATGTCACT-1,0,17,17,3523,2650 +AGTTGCTGACTGATAT-1,0,16,18,3404,2719 +GGCGCTCCTCATCAAT-1,0,17,19,3523,2788 +TGCCTGACATCGGTCA-1,0,16,20,3404,2856 +TTGGCCATCTTGCGCT-1,0,17,21,3523,2925 +CAGTGGTTGCACATGA-1,0,16,22,3404,2994 +AGAATTGTTTGACATA-1,0,17,23,3523,3063 +AAATGCTCGTTACGTT-1,0,16,24,3404,3132 +CACCTAATAGAGTCGT-1,0,17,25,3523,3201 +CATTTCTAGCAGACTA-1,0,16,26,3404,3269 +CCGAAAGTGGTGAGCA-1,0,17,27,3523,3338 +AGTCAGCCACCGCCTG-1,0,16,28,3404,3407 +TCATCACTCGAGCTCG-1,0,17,29,3523,3476 +CTCAGGACTCACCTGT-1,0,16,30,3404,3545 +CGGTGTACTTGATCCC-1,0,17,31,3523,3614 +CCTACGGCTCAGTCGA-1,0,16,32,3404,3682 +GTACTTGGGCACTTCT-1,0,17,33,3523,3751 +TGATTTCCTCCTGACG-1,0,16,34,3404,3820 +CCTCACCAATCTTGAC-1,0,17,35,3523,3889 +GGTGAGATGCAGATAA-1,0,16,36,3404,3958 +GCTAGTTTCATTGAGG-1,0,17,37,3523,4027 +AGGACATCGCACGTCG-1,0,16,38,3404,4095 +GTGGACGTGCTGAGAC-1,0,17,39,3523,4164 +TAAGGAACTTGTGGGA-1,0,16,40,3404,4233 +TCGCTGTGCGTAAATC-1,0,17,41,3523,4302 +GCATCCCTAACTTTGA-1,0,16,42,3404,4371 +CACCCACACGTCACCC-1,0,17,43,3523,4439 +CCCTCATTCTGGAATT-1,0,16,44,3404,4508 +AGGGCGTGATCGGCTA-1,0,17,45,3523,4577 +GGTGCGGATAAGTGGC-1,0,16,46,3404,4646 +TAATATTGAAATTCGC-1,0,17,47,3523,4715 +CTTACACTGGGAAATA-1,0,16,48,3404,4784 +ACCAAGAACGCGTGTC-1,0,17,49,3523,4852 +GCCTTCAGCCCTACCG-1,0,16,50,3404,4921 +GATGCTACAAGCGCCT-1,0,17,51,3523,4990 +CCGGGACCCGCAGAGA-1,0,16,52,3404,5059 +GTTCCAGTCTGACCAT-1,0,17,53,3523,5128 +ATGATCGGGAATAGAC-1,0,16,54,3403,5197 +TTGGATTGGGTACCAC-1,0,17,55,3523,5265 +TACCTCACGCTTGTAC-1,0,16,56,3403,5334 +CATGGCAGGAAGATCG-1,0,17,57,3523,5403 +ATGACGCCGGCTCTAA-1,0,16,58,3403,5472 +AGCGACATCCCATTCA-1,0,17,59,3523,5541 +AGTAATGTCTTGCCGC-1,0,16,60,3403,5610 +TTCTTAGTGGCTCAGA-1,0,17,61,3523,5678 +CGTCTGGAAGGGCCCG-1,0,16,62,3403,5747 +ACGTGCGCCTCGTGCA-1,1,17,63,3523,5816 +AGAGCGGGCTAATCAT-1,0,16,64,3403,5885 +GCGTCGAAATGTCGGT-1,1,17,65,3523,5954 +AACTGATATTAGGCCT-1,0,16,66,3403,6023 +CGAGCTGGGCTTTAGG-1,1,17,67,3523,6091 +GGGTGTTTCAGCTATG-1,0,16,68,3403,6160 +TTAATTTCAGACGCGG-1,1,17,69,3523,6229 +ACTGCCGTCGTAACTC-1,1,16,70,3403,6298 +GTGCACGAAAGTGACT-1,1,17,71,3523,6367 +ATCTCCCTGCAATCTA-1,1,16,72,3403,6436 +ACGCCAGATGATTTCT-1,1,17,73,3523,6504 +AGCTATTTAATCCAAC-1,1,16,74,3403,6573 +CCACGAGAAGAGAATC-1,1,17,75,3523,6642 +GATTCCGCGTTTCCGT-1,1,16,76,3403,6711 +GTCGGATGTAGCGCGC-1,1,17,77,3523,6780 +TATTTATACCGAGTAG-1,1,16,78,3403,6849 +GTAGGTGATCCGTGTA-1,1,17,79,3523,6917 +AGTTAAGCGGTCCCGG-1,1,16,80,3403,6986 +CTGGCGACATAAGTCC-1,1,17,81,3523,7055 +TTGGCCTAGAATTTCG-1,1,16,82,3403,7124 +GGCATATCGGTTCTGC-1,1,17,83,3523,7193 +GGGCGTCCACTGGCTC-1,1,16,84,3403,7261 +TTACCCATTGCCGGGT-1,1,17,85,3523,7330 +TTAGACACGATCGTTG-1,1,16,86,3403,7399 +GCGCTGATCCAGACTC-1,1,17,87,3523,7468 +TTCGGCAACCCGCTGA-1,1,16,88,3403,7537 +GATATTTCCTACATGG-1,1,17,89,3523,7606 +CTGCGTTACGATATAA-1,1,16,90,3403,7674 +TAATAAACAAGGAGAT-1,1,17,91,3523,7743 +AACCTTTACGACGTCT-1,1,16,92,3403,7812 +AGTCCCGCCTTTAATT-1,1,17,93,3523,7881 +TGAGATTAGGCCCTAA-1,1,16,94,3403,7950 +AGTGTATTGCGCATTG-1,1,17,95,3523,8019 +GTTGGATTCAGTGGCT-1,1,16,96,3403,8087 +TAAAGCTGCAATAGGG-1,1,17,97,3523,8156 +AGTAGGAAGGAAGTTG-1,1,16,98,3403,8225 +TATCACTTCGAGTAAC-1,1,17,99,3523,8294 +TGATCTACGCTGATCT-1,1,16,100,3403,8363 +GGATCATCCCGTACGC-1,1,17,101,3523,8432 +TGACACTTCTCTTTGC-1,1,16,102,3403,8500 +AGCCCTTCTAATCCGA-1,1,17,103,3523,8569 +CACCGCGTCCACTCTA-1,1,16,104,3403,8638 +TAATTGGAATCGGGAA-1,1,17,105,3523,8707 +TCGTAAGCTCCGAGGA-1,1,16,106,3403,8776 +TATATTACAAATGTCG-1,1,17,107,3523,8845 +CGCGAGAGGGACTTGT-1,1,16,108,3403,8913 +GGACCTACGGTAACGT-1,1,17,109,3523,8982 +GAAATATGCTTGAATG-1,1,16,110,3403,9051 +CCGTATTAGCGCAGTT-1,1,17,111,3523,9120 +AGGCGTCTATGGACGG-1,1,16,112,3403,9189 +AACATCGATACGTCTA-1,1,17,113,3523,9258 +TGAATATGCTATAAAC-1,1,16,114,3403,9326 +ACCAAACACCCAGCGA-1,1,17,115,3523,9395 +TGGCTTGTACAAGCTT-1,1,16,116,3403,9464 +GAATGAAGGTCTTCAG-1,0,17,117,3523,9533 +AGATACCAGCACTTCA-1,0,16,118,3403,9602 +GCGGTCCCGGTGAAGG-1,0,17,119,3523,9671 +GAGGCATTTGCAGCAG-1,0,16,120,3403,9739 +GGCAAGCCAGGGATAG-1,0,17,121,3523,9808 +TCTACGGGCTCAGTTG-1,0,16,122,3403,9877 +TCTGCGAATCGTTCGC-1,0,17,123,3523,9946 +AGCTCGTTGATGGAAA-1,0,16,124,3403,10015 +TGAATGAGATACAGCA-1,0,17,125,3523,10083 +ACCCTTGCCTGGGTCG-1,0,16,126,3403,10152 +GGCGAACCGTTCTGAT-1,0,17,127,3523,10221 +GCGATGTCTGTGCTTG-1,0,18,0,3643,1480 +ATTAACACCTGAGATA-1,0,19,1,3763,1549 +GAAATCTGACCAAGTT-1,0,18,2,3643,1618 +CCTGACAAACTCGCGC-1,0,19,3,3763,1686 +ATGTCATTTCCCATTG-1,0,18,4,3643,1755 +GCGGTGCGGAGCATCG-1,0,19,5,3763,1824 +CGGAAAGCAAATGTGC-1,0,18,6,3643,1893 +GCTGAGCAACGGTTCT-1,0,19,7,3763,1962 +TCACTCTTCGTCTGTC-1,0,18,8,3643,2030 +GATCTTCATTGTCCTC-1,0,19,9,3763,2099 +ACTCGATGTATTTCAT-1,0,18,10,3643,2168 +TGAAGAGCGGTCCTAG-1,0,19,11,3763,2237 +TAAACGTCGTCAATGA-1,0,18,12,3643,2306 +ACGTTATTGGTCACTC-1,0,19,13,3763,2375 +ATAGCCTCAGTACCCA-1,0,18,14,3643,2443 +CGGGAGTATACCGCCG-1,0,19,15,3763,2512 +GTCCTACAGGCGGCTC-1,0,18,16,3643,2581 +CGGATAAGCGGACATG-1,0,19,17,3763,2650 +AACTTCTGCGTCTATC-1,0,18,18,3643,2719 +GGGTTCAGACGAACAA-1,0,19,19,3763,2788 +AGTCTGGACATCCTTG-1,0,18,20,3643,2856 +TTGAACGAATCCTTTG-1,0,19,21,3763,2925 +GAAATACTAAACGTTT-1,0,18,22,3643,2994 +CCCGCGCAATGCACCC-1,0,19,23,3763,3063 +TTCGGCTAGAGATGGT-1,0,18,24,3643,3132 +GACACGAGTTAGAGGA-1,0,19,25,3763,3201 +GAGGTCCCAAAGATCT-1,0,18,26,3643,3269 +TAACTCCATGGAGGCT-1,0,19,27,3763,3338 +CTTGTTTATGTAGCCA-1,0,18,28,3643,3407 +GATGGCGCACACATTA-1,0,19,29,3763,3476 +ATAATAGTGTAGGGAC-1,0,18,30,3643,3545 +CGCTATTCAATGTATG-1,0,19,31,3763,3614 +ATATTGCTGTCAAAGT-1,0,18,32,3643,3682 +GGATTCAGTACGGTGG-1,0,19,33,3763,3751 +TTCTTAGTGAACGGTG-1,0,18,34,3643,3820 +AATGGTTCTCACAAGC-1,0,19,35,3763,3889 +TATACACGCAAAGTAT-1,0,18,36,3643,3958 +CTTCATAGCTCAAGAA-1,0,19,37,3763,4027 +CAACGGTTCTTGATAC-1,0,18,38,3643,4095 +ACACCCGAGAAATCCG-1,0,19,39,3763,4164 +TCTATCATGCAGTTAC-1,0,18,40,3643,4233 +CCCGCCATGCTCCCGT-1,0,19,41,3763,4302 +CGCTTCCACTGAAATC-1,0,18,42,3643,4371 +CACTGTCCAAGTGAGA-1,0,19,43,3763,4440 +ATTACTAGCCTCTTGC-1,0,18,44,3643,4508 +CATAGTAGCATAGTAG-1,0,19,45,3763,4577 +CAACTCCTTGATCCCG-1,0,18,46,3643,4646 +AAGTAGAAGACCGGGT-1,0,19,47,3763,4715 +GCGGGAACCAGGCCCT-1,0,18,48,3643,4784 +ATTAGATTGATAGCGG-1,0,19,49,3763,4852 +CTCGGTCCGTAGCCTG-1,0,18,50,3643,4921 +TGGCTTTGGGTAGACA-1,0,19,51,3763,4990 +TATCCATATCATGCGA-1,0,18,52,3643,5059 +GGAGTGCCGCCCTGGA-1,0,19,53,3763,5128 +TGAGAATGCTTTACCG-1,0,18,54,3643,5197 +TTAACCAACCCTCCCT-1,1,19,55,3763,5265 +TGTTTCGGTACTTCTC-1,0,18,56,3643,5334 +TTGCTGAAGGAACCAC-1,1,19,57,3763,5403 +TATTTAGTCTAGATCG-1,1,18,58,3643,5472 +CTCCGGCCTAATATGC-1,1,19,59,3763,5541 +TTGTGGCCCTGACAGT-1,1,18,60,3643,5610 +TCGCCGGTCGATCCGT-1,1,19,61,3763,5678 +CCATAGGTTGGCGTGG-1,1,18,62,3643,5747 +GAACGACCGAATGATA-1,1,19,63,3763,5816 +TCCGATAATTGCCATA-1,1,18,64,3643,5885 +CATTACGTCGGCCCGT-1,1,19,65,3763,5954 +CAAGCACCAAATGCCT-1,1,18,66,3643,6023 +TGCATGGATCGGATCT-1,1,19,67,3763,6091 +GAAATCGCGCGCAACT-1,1,18,68,3643,6160 +CTGAAAGAGATCCGAC-1,1,19,69,3763,6229 +CACCTCGATGGTGGAC-1,1,18,70,3643,6298 +ATTTGTTCCAGGGCTC-1,1,19,71,3763,6367 +TGGGCCACAAGAGCGC-1,1,18,72,3643,6436 +CCTTCTTGATCCAGTG-1,1,19,73,3763,6504 +CCTCGCCAGCAAATTA-1,1,18,74,3643,6573 +TTCATGGCGCAACAGG-1,1,19,75,3763,6642 +TTAATCAGTACGTCAG-1,1,18,76,3643,6711 +CCTATCTATATCGGAA-1,1,19,77,3763,6780 +ATTATACTTTGCTCGT-1,1,18,78,3643,6849 +ATGGATCCGGCGTCCG-1,1,19,79,3763,6917 +CGCCCGCTTCCGTACA-1,1,18,80,3643,6986 +GGATTCCGCTATACCC-1,1,19,81,3763,7055 +CGGTCTATCAACCCGT-1,1,18,82,3643,7124 +ATGCCGGTTGATGGGA-1,1,19,83,3763,7193 +TCATGCAGGTTCTCAT-1,1,18,84,3643,7261 +TGAGCTTTAATGACGC-1,1,19,85,3763,7330 +TCCCTTAGATTACTCG-1,1,18,86,3643,7399 +ATATCTCCCTCGTTAA-1,1,19,87,3763,7468 +AGCTCTTCCCAGTGCA-1,1,18,88,3643,7537 +TCGCTAAACCGCTATC-1,1,19,89,3763,7606 +CACATTCTTTCGATGG-1,1,18,90,3643,7674 +GATATGCGGTAGCCAA-1,1,19,91,3763,7743 +CGTTTCACTTCGGGCG-1,1,18,92,3643,7812 +CCAATTACGGGTCGAG-1,1,19,93,3763,7881 +GCAGGTAGAGTATGGT-1,1,18,94,3643,7950 +GTCGTATTGGCGTACA-1,1,19,95,3763,8019 +GAAATTAGCACGGATA-1,1,18,96,3643,8087 +AATGCACCAAGCAATG-1,1,19,97,3763,8156 +AGGACGCTCGATGTTG-1,1,18,98,3643,8225 +GGCTAAAGGGCGGGTC-1,1,19,99,3763,8294 +CATCTATCCCGTGTCT-1,1,18,100,3643,8363 +CAGTAACTATTTATTG-1,1,19,101,3763,8432 +CATATACTACTGATAA-1,1,18,102,3643,8500 +GCGTTCGGAGACCGGG-1,1,19,103,3763,8569 +AAGTTCAGTCTGCGTA-1,1,18,104,3643,8638 +CGAAGCTATAAATTCA-1,1,19,105,3763,8707 +CGCGGTCACAAACCAA-1,1,18,106,3643,8776 +GGGAATGAGCCCTCAC-1,1,19,107,3763,8845 +ACGGAGCGCAAATTAC-1,1,18,108,3643,8913 +CGTTCTTCGCACACCT-1,1,19,109,3763,8982 +GAATAGCCCTGCGGTC-1,1,18,110,3643,9051 +AATAGCTACCGCGTGC-1,1,19,111,3763,9120 +CCGAGCTGTGCTTGTC-1,1,18,112,3643,9189 +GATGACGATGATCGCG-1,1,19,113,3763,9258 +GCCTATGCTGGGCCTT-1,0,18,114,3643,9326 +TTACTGTCTAGAGCTC-1,1,19,115,3763,9395 +AGCGGTTGCCGCTCTG-1,0,18,116,3643,9464 +GCTTGCAGCACAATTG-1,0,19,117,3763,9533 +CCGGAGGTCTTATGGT-1,0,18,118,3643,9602 +ACAGTATACCGTGGGA-1,0,19,119,3763,9671 +GGGATCCCAATACAAA-1,0,18,120,3643,9739 +ATTACGACTCCACAGT-1,0,19,121,3763,9808 +CTCACACGCAAGCCTA-1,0,18,122,3643,9877 +CCAGATGTAAATGGGT-1,0,19,123,3763,9946 +GAACTTGTGCACGGGA-1,0,18,124,3643,10015 +AAGCCGCTTTACCTTG-1,0,19,125,3763,10083 +TCCATTCCCACTAGAG-1,0,18,126,3643,10152 +AGAGCGCTTGTAACGG-1,0,19,127,3763,10221 +TGGGTTCCCGGACGGA-1,0,20,0,3883,1480 +GCTGCGCCTCCCACGT-1,0,21,1,4002,1549 +CTGTTGGCTCTTCTGA-1,0,20,2,3883,1618 +TTGTTCTAGATACGCT-1,0,21,3,4002,1686 +CCCTCAAGCTCTTAGT-1,0,20,4,3883,1755 +TGGTCTAGCTTACATG-1,0,21,5,4002,1824 +ATGCACCTTCCTTAAT-1,0,20,6,3883,1893 +GGGATACGGTAATAAT-1,0,21,7,4002,1962 +AGTTCACCGGTTGGAC-1,0,20,8,3883,2030 +GACATACTGTCGCAGA-1,0,21,9,4002,2099 +TGGACACCGTTGCTTG-1,0,20,10,3883,2168 +TGCGATGCTAATGGCT-1,0,21,11,4002,2237 +TTCTGTTTCCTGTCGC-1,0,20,12,3883,2306 +CGTTGTAAACGTCAGG-1,0,21,13,4002,2375 +GATCGGCGATAAGTCG-1,0,20,14,3883,2443 +AGCCTTAAAGCGGAAG-1,0,21,15,4002,2512 +TCCGTAACCACAATCC-1,0,20,16,3883,2581 +GAATGCCGAAATGACC-1,0,21,17,4002,2650 +TATACTCATGCGGCAA-1,0,20,18,3883,2719 +TAGTGTCAGAAACGGC-1,0,21,19,4002,2788 +CGTCATACCATATCCA-1,0,20,20,3883,2856 +TAGTACCTTAGTGGTC-1,0,21,21,4002,2925 +CTGGCGGGAATAAGTA-1,0,20,22,3883,2994 +AGTGTGGTCTATTGTG-1,0,21,23,4002,3063 +GCTATCGCGGCGCAAC-1,0,20,24,3883,3132 +CAGTAATCCCTCCCAG-1,0,21,25,4002,3201 +GTATTAAGGCGTCTAA-1,0,20,26,3883,3269 +CTAATTTCAACAACAC-1,0,21,27,4002,3338 +TTAGCAACATGGATGT-1,0,20,28,3883,3407 +ATGCTCAGTGTTGCAT-1,0,21,29,4002,3476 +GATGTTTGTGCGAGAT-1,0,20,30,3883,3545 +CACTTCGCCACAGGCT-1,0,21,31,4002,3614 +CTGTATGGTGTAGAAA-1,0,20,32,3883,3682 +TACGTGCACTATGCTG-1,0,21,33,4002,3751 +GTATCAGCTTGGGTTC-1,0,20,34,3883,3820 +TAACAAAGGGAGAAGC-1,0,21,35,4002,3889 +TTACATCGTGGCCTGG-1,0,20,36,3883,3958 +TCTGAACCGGTCGGCT-1,0,21,37,4002,4027 +GGCTCGTGCCACCAGC-1,0,20,38,3883,4095 +TATAAGTGAGGATAGC-1,0,21,39,4002,4164 +GCCCGCGCGTTTGACA-1,0,20,40,3883,4233 +TGCTGGTTGGACAATT-1,0,21,41,4002,4302 +GCCTAGCGATCTGACC-1,0,20,42,3883,4371 +CCATGCTCTGCAGGAA-1,0,21,43,4002,4440 +TATAAATCCACAAGCT-1,0,20,44,3883,4508 +CGCTCGACATAATGAT-1,0,21,45,4002,4577 +CCAATTGAATGTTAAT-1,0,20,46,3883,4646 +GCTAATACCGAATGCC-1,1,21,47,4002,4715 +TTCAACGACCCGACCG-1,0,20,48,3883,4784 +TTCCTCGAGGGTGTCT-1,1,21,49,4002,4852 +CAACGACCCGTTTACA-1,1,20,50,3883,4921 +CTTGTACTTGTTGACT-1,1,21,51,4002,4990 +TCTCTAATAGCTGGTA-1,1,20,52,3883,5059 +ATTATGCCATAGGGAG-1,1,21,53,4002,5128 +GACAACGCAGCTTACG-1,1,20,54,3883,5197 +AGATGACTCGCCCACG-1,1,21,55,4002,5265 +GTGCGGGTCTCCAAAT-1,1,20,56,3883,5334 +GTACGAGATTGCGACA-1,1,21,57,4002,5403 +GTATAGGACTCAGTAG-1,1,20,58,3883,5472 +TTGCACGGAGCAGCAC-1,1,21,59,4002,5541 +CACAGCTAGGGAGTGA-1,1,20,60,3883,5610 +ATACTAGCATGACCCT-1,1,21,61,4002,5678 +CCAAGACTTCTGCGAA-1,1,20,62,3883,5747 +ACATAATAAGGCGGTG-1,1,21,63,4002,5816 +TAATACACAGTAGTAT-1,1,20,64,3883,5885 +TCTTGGTAACACCAAA-1,1,21,65,4002,5954 +AACTGGGTCCCGACGT-1,1,20,66,3883,6023 +ATCACTTCATCCTCGC-1,1,21,67,4002,6091 +TGGAAGGATAAAGATG-1,1,20,68,3883,6160 +CATGATGCACAATTCT-1,1,21,69,4002,6229 +TGCCTGATCAAACGAT-1,1,20,70,3883,6298 +ATAGGGATATCCTTGA-1,1,21,71,4002,6367 +CACCTAATCAGTTTAC-1,1,20,72,3883,6436 +TGTGACTACGCCAGTC-1,1,21,73,4002,6504 +CCCGACCATAGTCCGC-1,1,20,74,3882,6573 +CGCGCCCGACTTAATA-1,1,21,75,4002,6642 +TGCCACCTGGCGAAAC-1,1,20,76,3882,6711 +CTGCCAAGGTTGGAAG-1,1,21,77,4002,6780 +TCTCCAACGTAGGTTA-1,1,20,78,3882,6849 +TTCTTGGAGTAATGAG-1,1,21,79,4002,6917 +GTCTCGATCTGCTTTC-1,1,20,80,3882,6986 +TACTCTCCGAACAAAT-1,1,21,81,4002,7055 +ATCACATTAGAATATC-1,1,20,82,3882,7124 +TACGGGATGCTAGCAG-1,1,21,83,4002,7193 +AGCTGAAGTAAACCAA-1,1,20,84,3882,7261 +CATGGGTCGGGTGTGG-1,1,21,85,4002,7330 +CACCCACGAGGCAATT-1,1,20,86,3882,7399 +TGCCATTACTAAAGAA-1,1,21,87,4002,7468 +CCGTTACGTTAGAACA-1,1,20,88,3882,7537 +GCCAGGAGTAACCGAT-1,1,21,89,4002,7606 +GGAAAGTGCCCATGCC-1,1,20,90,3882,7674 +TCTTACCGGAACTCGT-1,1,21,91,4002,7743 +TATGTCAAGACCGACT-1,1,20,92,3882,7812 +CCTAACTAAGGCTCTA-1,1,21,93,4002,7881 +GCGGTGAACTGCGCTC-1,1,20,94,3882,7950 +CCTCGCGCGATATAGG-1,1,21,95,4002,8019 +ATCGGCAAGCAGTCCA-1,1,20,96,3882,8087 +AGATCGTGCATAAGAT-1,1,21,97,4002,8156 +ATTCAGGACCTATTTC-1,1,20,98,3882,8225 +AGCTAGAAGCAGAAGT-1,1,21,99,4002,8294 +TTCGCTATCTGACGTG-1,1,20,100,3882,8363 +TTCCGCAGAGAAATAT-1,1,21,101,4002,8432 +CAGTACATTCTCTAAA-1,1,20,102,3882,8500 +GTGAAGATTTCAAGTG-1,1,21,103,4002,8569 +AACGCATGATCTGGGT-1,1,20,104,3882,8638 +CCCAGAGGAGGGCGTA-1,1,21,105,4002,8707 +GGAAACCTTGTTGAAT-1,1,20,106,3882,8776 +GTGAAGCCGTATAGTC-1,1,21,107,4002,8845 +GAGCTGTCGTCTCGGA-1,1,20,108,3882,8913 +TGTCATTTGTTGGGAA-1,1,21,109,4002,8982 +ACCAACACCACACACT-1,1,20,110,3882,9051 +AAATGATTCGATCAGC-1,1,21,111,4002,9120 +CTGCTTTATGTCCGCG-1,1,20,112,3882,9189 +GCGAGAGGCCATGTAA-1,1,21,113,4002,9258 +ATTGACCGGCGATGAC-1,1,20,114,3882,9326 +ACCCTGGTAACGCCCT-1,1,21,115,4002,9395 +GTTGGACCGCATCAGG-1,1,20,116,3882,9464 +CGTTTACAAGGCAGCT-1,0,21,117,4002,9533 +CGGTCCATGAGACTCC-1,0,20,118,3882,9602 +GTTCGTCTGGGTCCCT-1,0,21,119,4002,9671 +TGTACTACTCTCACGG-1,0,20,120,3882,9739 +AGTGAAGATGGTGTCC-1,0,21,121,4002,9808 +GAGGGCCATAATATTA-1,0,20,122,3882,9877 +ACTCCCGTAGACTAGG-1,0,21,123,4002,9946 +CGTCAAATGGTCGCAG-1,0,20,124,3882,10015 +AAGTCTAGTAGCTGCC-1,0,21,125,4002,10083 +AAGAAATCACCAGATT-1,0,20,126,3882,10152 +GAGTGCACGGACAACA-1,0,21,127,4002,10221 +GTTCAAATCAGATGTC-1,0,22,0,4122,1480 +CATGGCTCCCTATGTC-1,0,23,1,4242,1549 +GGCCACACGAAAGCCT-1,0,22,2,4122,1618 +GAAGCCGGGTAAGCTC-1,0,23,3,4242,1686 +TTGCGCTCTCTCGCTT-1,0,22,4,4122,1755 +TACATGACCTTATCCG-1,0,23,5,4242,1824 +GTCCTTCTACAACCCA-1,0,22,6,4122,1893 +TATATGCTGGGTTGCC-1,0,23,7,4242,1962 +GTTTATGGGATTTAGA-1,0,22,8,4122,2030 +GGAACCCGAACAAGAA-1,0,23,9,4242,2099 +AACGTTATCAGCACCT-1,0,22,10,4122,2168 +CATCGTCCGGTTACTA-1,0,23,11,4242,2237 +AGACAGCTCAGAATCC-1,0,22,12,4122,2306 +GCAGATCCTCGCAAAT-1,0,23,13,4242,2375 +GGGTCATGCGTACCAT-1,0,22,14,4122,2443 +CTGGTCATTCCAATCC-1,0,23,15,4242,2512 +TCAGGGCGCAAACTCG-1,0,22,16,4122,2581 +GATGCCAGCAGAAGGC-1,0,23,17,4242,2650 +GTTATTAACGTGGGAG-1,0,22,18,4122,2719 +AATACAATGTTTCAGG-1,0,23,19,4242,2788 +TTGCTGCACCTATCCA-1,0,22,20,4122,2856 +CCAGAGACAAAGCCGG-1,0,23,21,4242,2925 +CCGAAGTATATTGTTC-1,0,22,22,4122,2994 +GCTAAACCTGAGGTGA-1,0,23,23,4242,3063 +TCATACTTACAGATCC-1,0,22,24,4122,3132 +CGAGCACTTCAAGTTT-1,0,23,25,4242,3201 +TAGCAACCTGTCACAA-1,0,22,26,4122,3269 +TGGGAAATGCCTTTCC-1,0,23,27,4242,3338 +AGACCATGGGATACAA-1,0,22,28,4122,3407 +TAAATGAATCCGTTTC-1,0,23,29,4242,3476 +ACAACGGTCCCTGCGA-1,0,22,30,4122,3545 +GTCACTCTCCAAATCT-1,0,23,31,4242,3614 +TTCTACTTGCGAGGGC-1,0,22,32,4122,3682 +CGCAATTACTTTCGGT-1,0,23,33,4242,3751 +CTGTTCATCTCACGGG-1,0,22,34,4122,3820 +TTCTTGTAACCTAATG-1,0,23,35,4242,3889 +GCTTGATGATAATCAG-1,0,22,36,4122,3958 +TTGGCTCGCATGAGAC-1,0,23,37,4242,4027 +GCCCAGTTGGTATGCC-1,0,22,38,4122,4095 +ATTCCTCCGCCAGTGC-1,0,23,39,4242,4164 +TCGTCCGCTGGCGTCT-1,0,22,40,4122,4233 +GGAGAAGTCATTGGCA-1,1,23,41,4242,4302 +TTGTTAGCAAATTCGA-1,0,22,42,4122,4371 +TCTAGCATCTTCGATG-1,1,23,43,4242,4440 +TTCTAGGCCAATTGTG-1,1,22,44,4122,4508 +TCACGGTCATCGCACA-1,1,23,45,4242,4577 +ATGAAGCCAAGGAGCC-1,1,22,46,4122,4646 +AATGACTGTCAGCCGG-1,1,23,47,4242,4715 +CCAAACAGAACCCTCG-1,1,22,48,4122,4784 +TATCGATGATTAAACG-1,1,23,49,4242,4852 +GAACACACATCAACCA-1,1,22,50,4122,4921 +CCCGTCAGCGTCTGAC-1,1,23,51,4242,4990 +AGCATCGTCGATAATT-1,1,22,52,4122,5059 +GACTAAGATCATGCAC-1,1,23,53,4242,5128 +TAGGGTGTTTCAAGAG-1,1,22,54,4122,5197 +TGGTTCGTAGCAAAGG-1,1,23,55,4242,5265 +CTGTTCACTGCCTGTG-1,1,22,56,4122,5334 +ATGTGCATCCGACGCA-1,1,23,57,4242,5403 +TTGTCGTTCAGTTACC-1,1,22,58,4122,5472 +CGGGATCAATGTAAGA-1,1,23,59,4242,5541 +TTATCTGTATCATAAC-1,1,22,60,4122,5610 +ATCGACTCTTTCCGTT-1,1,23,61,4242,5678 +CTCATTTGATGGGCGG-1,1,22,62,4122,5747 +GTAAGCGGGCAGTCAG-1,1,23,63,4242,5816 +TCTATCGGTCGCAACA-1,1,22,64,4122,5885 +AACGCGGTCTCCAGCC-1,1,23,65,4242,5954 +ATTAATACTACGCGGG-1,1,22,66,4122,6023 +CTTTAACTTTCAAAGG-1,1,23,67,4242,6091 +CGTACCTGATAGGCCT-1,1,22,68,4122,6160 +GAATGTTGGGTAATCT-1,1,23,69,4242,6229 +TGCGGAGTAAAGGTGC-1,1,22,70,4122,6298 +CCTGAATATTTACATA-1,1,23,71,4242,6367 +TTGCTCCCATACCGGA-1,1,22,72,4122,6436 +CCTCTAATCTGCCAAG-1,1,23,73,4242,6504 +AGGTTGAGGCACGCTT-1,1,22,74,4122,6573 +TCCCGTCAGTCCCGCA-1,1,23,75,4242,6642 +TCCGATGACTGAGCTC-1,1,22,76,4122,6711 +CAGCCTCCTGCAGAGG-1,1,23,77,4242,6780 +CTTAGCCTTCCACATG-1,1,22,78,4122,6849 +ATTAATGAACCAGTCG-1,1,23,79,4242,6917 +ACGATACATAGAACTA-1,1,22,80,4122,6986 +AGCCACTCCCGTGCTT-1,1,23,81,4242,7055 +ATACGGGTTTCGATTG-1,1,22,82,4122,7124 +CTGTCAAATGGCTCGG-1,1,23,83,4242,7193 +GCTCGGAATTTAAAGC-1,1,22,84,4122,7262 +TAGGCATGTTACGCCA-1,1,23,85,4242,7330 +TGGCAACTCGCGCGCC-1,1,22,86,4122,7399 +ATCAGTAGGCAGGGAT-1,1,23,87,4242,7468 +TATCGATCTATGCATA-1,1,22,88,4122,7537 +CGACTCAGGATGTTAT-1,1,23,89,4242,7606 +GCCATATTGCACACAG-1,1,22,90,4122,7674 +AATTCATAAGGGATCT-1,1,23,91,4242,7743 +CGGTAGAGGTGCAGGT-1,1,22,92,4122,7812 +AATGATGATACGCTAT-1,1,23,93,4242,7881 +CTTGTGCTCACCGATT-1,1,22,94,4122,7950 +TTCCAATCAGAGCTAG-1,1,23,95,4242,8019 +CGATGGACCCTACGCC-1,1,22,96,4122,8087 +GGTCGGATAAACGGCG-1,1,23,97,4242,8156 +TTAGCTAATACGATCT-1,1,22,98,4122,8225 +CTCGATATTTGCGAGC-1,1,23,99,4242,8294 +ATTACTTACTGGGCAT-1,1,22,100,4122,8363 +CTAGCCGATGTTATGA-1,1,23,101,4242,8432 +TACTGCAATCAATTAC-1,1,22,102,4122,8500 +TAGTCTGTGACGTTGC-1,1,23,103,4242,8569 +CTCGTTTCTAATGTTT-1,1,22,104,4122,8638 +TTCGTTCAACGAAGTT-1,1,23,105,4242,8707 +CTGAATTTATTGCCAG-1,1,22,106,4122,8776 +TGGAATATCCTTGACC-1,1,23,107,4242,8845 +CAGATCATTTAAAGTC-1,1,22,108,4122,8913 +CTCCTTTACGCAAGTC-1,1,23,109,4242,8982 +TCCCAAACAGACAACG-1,1,22,110,4122,9051 +ATCGCTGCGTGCAGCA-1,1,23,111,4242,9120 +TTAGTTCAAGTGTTCG-1,1,22,112,4122,9189 +AAACTCGTGATATAAG-1,1,23,113,4242,9258 +TTAACGAACAAGCAGT-1,1,22,114,4122,9326 +GTTATATCAGGAGCCA-1,1,23,115,4242,9395 +CAAATTGGATTATGCC-1,0,22,116,4122,9464 +CGAGGAGCTTCCATAT-1,0,23,117,4242,9533 +GGAGACCAATGTGCTT-1,0,22,118,4122,9602 +CATTGATGAACACGCC-1,0,23,119,4242,9671 +GTCAATGCTATAATTT-1,0,22,120,4122,9739 +ACCACCCTCTCTTCTA-1,0,23,121,4242,9808 +TGGAGGGAAACACCTC-1,0,22,122,4122,9877 +CACGGACGTGGATGGC-1,0,23,123,4242,9946 +AACTTTCTCGATCATG-1,0,22,124,4122,10015 +CGTATTGTTTCCTAAT-1,0,23,125,4242,10084 +CCTACTGCGGCGGCCA-1,0,22,126,4122,10152 +CTTAGGTCCCAATCGT-1,0,23,127,4242,10221 +CGCAATCGATCATTAG-1,0,24,0,4362,1480 +TGGTTATGCTTGCGGT-1,0,25,1,4481,1549 +GGCTTGGCTCTCACCT-1,0,24,2,4362,1618 +ATTGGTAGGATCCGCT-1,0,25,3,4481,1686 +TCAGGGCGACTTCCTT-1,0,24,4,4362,1755 +TCTGCAGATTCGAGTC-1,0,25,5,4481,1824 +CTCTCGCTGTACTATG-1,0,24,6,4362,1893 +AATAGTCGCGAGTCGG-1,0,25,7,4481,1962 +AGTTACCCTTAAGACT-1,0,24,8,4362,2031 +CTTAAATAAGACCCAT-1,0,25,9,4481,2099 +GGTTGTGCTCTTGTCC-1,0,24,10,4362,2168 +GTGAGTCTAAGACGGA-1,0,25,11,4481,2237 +CGCGACACTGCGCAGC-1,0,24,12,4362,2306 +GCTCGCGGTTCCGCTC-1,0,25,13,4481,2375 +TTAACTCACGCGTGGA-1,0,24,14,4362,2443 +GGAACGGCCTGCAGCC-1,0,25,15,4481,2512 +GTAGAAACGGGTGGAG-1,0,24,16,4362,2581 +TAATGAAAGACCCTTG-1,0,25,17,4481,2650 +AGGCTTGCTAGACACC-1,0,24,18,4362,2719 +TTGCGTAGTTTGAGGA-1,0,25,19,4481,2788 +CGCCCTTGAAGGCTGA-1,0,24,20,4362,2856 +CCCGGTGGAAGAACCT-1,0,25,21,4481,2925 +TTAACACCTCGAACAT-1,0,24,22,4362,2994 +GATTCCTATACGGCGC-1,0,25,23,4481,3063 +TTACCCTAACAGTCCT-1,0,24,24,4362,3132 +ACCCACCTACATGCTC-1,0,25,25,4481,3201 +AAAGGGCAGCTTGAAT-1,0,24,26,4362,3269 +CACACAGGGATAGATT-1,0,25,27,4481,3338 +AGAGCGTACAAGCTCG-1,0,24,28,4362,3407 +TCTTACGGCATCCGAC-1,0,25,29,4481,3476 +GCCTATTCCGATATAG-1,0,24,30,4362,3545 +GAAAGTGACTAACTGC-1,0,25,31,4481,3614 +CCGGAATGGTTTCAGT-1,0,24,32,4362,3682 +AGTATAATACTAGGCA-1,0,25,33,4481,3751 +TAACTATCGAAGGTCC-1,0,24,34,4362,3820 +ATGAGGAGTGTTAATC-1,1,25,35,4481,3889 +TGTGTCGCGAGTTGCA-1,0,24,36,4362,3958 +ATCCAACGCAGTCATA-1,1,25,37,4481,4027 +AAGGCGCGTAAAGCTT-1,1,24,38,4362,4095 +AGTCGGCCCAAACGAC-1,1,25,39,4481,4164 +AACGTCAGACTAGTGG-1,1,24,40,4362,4233 +ACTACCAGCTCTCTGG-1,1,25,41,4481,4302 +GCAAGTGCACAGAGAA-1,1,24,42,4362,4371 +ACACCTTAAGTAGGGC-1,1,25,43,4481,4440 +TTCGACGGGAAGGGCG-1,1,24,44,4362,4508 +TTCGCACTCGCGTGCT-1,1,25,45,4481,4577 +TATTTGTTACCCTTTA-1,1,24,46,4362,4646 +CGCTGTGACGCCGCAC-1,1,25,47,4481,4715 +GTTGCACGGAGTTTCG-1,1,24,48,4362,4784 +GTTTCCTGGAGGGTGA-1,1,25,49,4481,4853 +ACACCCAGCATGCAGC-1,1,24,50,4362,4921 +TCAACCATGTTCGGGC-1,1,25,51,4481,4990 +TTACAACTACGCATCC-1,1,24,52,4362,5059 +TCCGATGGTGCGACAT-1,1,25,53,4481,5128 +GGGCGTACATTTATAT-1,1,24,54,4362,5197 +AGCGACCAACGATATT-1,1,25,55,4481,5265 +ACACAAAGACGGGTGG-1,1,24,56,4362,5334 +ATCGCACGCCGGGAGA-1,1,25,57,4481,5403 +GCTCTAAACCCTGACG-1,1,24,58,4362,5472 +AATGCAACCGGGTACC-1,1,25,59,4481,5541 +TCAAACAACCGCGTCG-1,1,24,60,4362,5610 +TATGCTCCCTACTTAC-1,1,25,61,4481,5678 +AAAGGGATGTAGCAAG-1,1,24,62,4362,5747 +ACGATCATACATAGAG-1,1,25,63,4481,5816 +TTGTTCAGTGTGCTAC-1,1,24,64,4362,5885 +ATGCATGATCCAGGAT-1,1,25,65,4481,5954 +AGTCTTCTCCTCAAAT-1,1,24,66,4362,6023 +GATTCCCTTGTCGCAG-1,1,25,67,4481,6091 +CTCGCACCTATATAGT-1,1,24,68,4362,6160 +ACTCAATAAAGGCACG-1,1,25,69,4481,6229 +AACCGAGCTTGGTCAT-1,1,24,70,4362,6298 +TAAGGCAACATAAGAT-1,1,25,71,4481,6367 +CACGCACAGCGCAGCT-1,1,24,72,4362,6436 +GGTTTACAATCTCAAT-1,1,25,73,4481,6504 +TGCAGGATCGGCAAAG-1,1,24,74,4362,6573 +ATAACGGAGTCCAACG-1,1,25,75,4481,6642 +AACGATATGTCAACTG-1,1,24,76,4362,6711 +GACAACGACCATTGAA-1,1,25,77,4481,6780 +TTGACCATGTTCTCCG-1,1,24,78,4362,6849 +AGTACGGGCACCTGGC-1,1,25,79,4481,6917 +CGCCATCCGATTATGA-1,1,24,80,4362,6986 +AAGGTATCCTAATATA-1,1,25,81,4481,7055 +TGTTGTCAAGAAGTCT-1,1,24,82,4362,7124 +CAGTGAATAAATGACT-1,1,25,83,4481,7193 +CACCTTGCGAAACTCG-1,1,24,84,4362,7262 +CATTTAGCGGACCATG-1,1,25,85,4481,7330 +CCAGTCTAGACGGCGC-1,1,24,86,4362,7399 +TCGCTTTAAACGTTTG-1,1,25,87,4481,7468 +GTGAAACGGCGCCACC-1,1,24,88,4362,7537 +GGGCTCATCGAACCCA-1,1,25,89,4481,7606 +TTGATGTGTAGTCCCG-1,1,24,90,4362,7674 +CAGTAGCCCACGCGGT-1,1,25,91,4481,7743 +AGCGCGGGTGCCAATG-1,1,24,92,4362,7812 +TAATCGATCCGTACGT-1,1,25,93,4481,7881 +AGTGGCGGCAATTTGA-1,1,24,94,4361,7950 +CCTTTCAATGAAGAAA-1,1,25,95,4481,8019 +CTCAGTCACGACAAAT-1,1,24,96,4361,8087 +ATAGGCTAGCTTCGCA-1,1,25,97,4481,8156 +CGGTTCAAGTAGGTGT-1,1,24,98,4361,8225 +CAGTCGAGGATGCAAT-1,1,25,99,4481,8294 +TATCACCCAACCGACC-1,1,24,100,4361,8363 +AATGATGCGACTCCTG-1,1,25,101,4481,8432 +TGGAACCACTGACACA-1,1,24,102,4361,8500 +GCCAATAGGGCATCTC-1,1,25,103,4481,8569 +TTCTTTGGTCGCGACG-1,1,24,104,4361,8638 +ATTAGATTCCTCAGCA-1,1,25,105,4481,8707 +CCGTGGAACGATCCAA-1,1,24,106,4361,8776 +GGGTCGTGGCAAGTGT-1,1,25,107,4481,8845 +TCGCTCGGCACCAGCG-1,1,24,108,4361,8913 +ACGCAATCACTACAGC-1,1,25,109,4481,8982 +CTCTAATGCATTGATC-1,1,24,110,4361,9051 +GTCTCGACTAAGTTTG-1,1,25,111,4481,9120 +TGGTTTAAACGTGGGT-1,1,24,112,4361,9189 +CGCAGATCTTCACCCG-1,1,25,113,4481,9258 +TCCAGATGTACGCCAA-1,1,24,114,4361,9326 +CATTGCGGGTCAATTC-1,1,25,115,4481,9395 +GACGTTCGTAAATACA-1,0,24,116,4361,9464 +TACACCGTCGTTAGTC-1,0,25,117,4481,9533 +ACGGGCGTATGCGACA-1,0,24,118,4361,9602 +GAAGGCTACCATTGTT-1,0,25,119,4481,9671 +TAAATCTTTACACCTC-1,0,24,120,4361,9739 +AGTTTATGTAAAGACA-1,0,25,121,4481,9808 +AGGAGACATCCACAGT-1,0,24,122,4361,9877 +CAACCTGAACCTGCCA-1,0,25,123,4481,9946 +AGTCCCTCGCAGAAAG-1,0,24,124,4361,10015 +TGTATACGGATGATGA-1,0,25,125,4481,10084 +TTGTGGTATAGGTATG-1,0,24,126,4361,10152 +TCTGCACCATTAGTAA-1,0,25,127,4481,10221 +AAATGTATCTTATCCC-1,0,26,0,4601,1480 +ACTCTAAACCTGGGAT-1,0,27,1,4721,1549 +GCTGGCAGGTGCCGTG-1,0,26,2,4601,1618 +CTCATTCGTGAACATC-1,0,27,3,4721,1686 +TCGCCGGATGGGCAAG-1,0,26,4,4601,1755 +GGACTAAGTCAGGAGT-1,0,27,5,4721,1824 +TATCAAAGGTCTGTAA-1,0,26,6,4601,1893 +TTCAGTTTGTGGCAGC-1,0,27,7,4721,1962 +TGTTCATAAATGTGCT-1,0,26,8,4601,2031 +CTTAGCCCGGATAGTG-1,0,27,9,4721,2099 +GATGCGAATGGTATTA-1,0,26,10,4601,2168 +TCTAACTGTATGTAAA-1,0,27,11,4721,2237 +TTAAACCTGGTTCCTT-1,0,26,12,4601,2306 +GCTAAGTAAAGGCGAT-1,0,27,13,4721,2375 +AGTTACCGCACATGGT-1,0,26,14,4601,2443 +GACTGCGGCACGTGTA-1,0,27,15,4721,2512 +TGGTGATCGTATTTGT-1,0,26,16,4601,2581 +TTATCGCCTGCGAAGC-1,0,27,17,4721,2650 +TGGAATTAGACGCTTT-1,0,26,18,4601,2719 +TCGTCACACTGTTAGC-1,0,27,19,4721,2788 +TTATGTTTGCGATAGA-1,0,26,20,4601,2856 +GGTGCTGATCACAAAG-1,0,27,21,4721,2925 +CATAGCCGCCCGGGAT-1,0,26,22,4601,2994 +GGTTAGTTACGGCGCC-1,0,27,23,4721,3063 +ATTCCCACATAAACAA-1,0,26,24,4601,3132 +ATTCAGTAGCAGGGTC-1,0,27,25,4721,3201 +CAGTTCCGCGGGTCGA-1,0,26,26,4601,3269 +AAGAGATGAATCGGTA-1,0,27,27,4721,3338 +CGCAATTCTACAATAA-1,0,26,28,4601,3407 +TAACGCTTTGAGAGCG-1,0,27,29,4721,3476 +AGGCTATGGTTAGCTT-1,0,26,30,4601,3545 +GAGGAATGGAGAGGTT-1,1,27,31,4721,3614 +TCCTCTACGAGATGGC-1,1,26,32,4601,3682 +TTGATTATGCAGATGA-1,1,27,33,4721,3751 +TCAGTACTGACCCGCG-1,1,26,34,4601,3820 +TTATGACAAACTGGAT-1,1,27,35,4721,3889 +GTAAGTAGGGTATACC-1,1,26,36,4601,3958 +CGCAAACACGAGTTAC-1,1,27,37,4721,4027 +TGGCCGTATATTGACC-1,1,26,38,4601,4095 +ACTGTAGCACTTTGGA-1,1,27,39,4721,4164 +GCTCTATGTTACGTGC-1,1,26,40,4601,4233 +TGCGCGATTAACGGAG-1,1,27,41,4721,4302 +GAATCGACATGGTCAC-1,1,26,42,4601,4371 +GACTAAGTAGGCTCAC-1,1,27,43,4721,4440 +ATCTTGACCTGCAACG-1,1,26,44,4601,4508 +ATGCACTACCGCATTG-1,1,27,45,4721,4577 +CAGATACTAACATAGT-1,1,26,46,4601,4646 +GATCGACACTATCTGA-1,1,27,47,4721,4715 +ATAGAGTACTGGGACA-1,1,26,48,4601,4784 +CCTACTGCTTACACTT-1,1,27,49,4721,4853 +CCTGCTATTTGAGAAG-1,1,26,50,4601,4921 +CGCGTTCATGAAATAC-1,1,27,51,4721,4990 +CATTATGCTTGTTGTG-1,1,26,52,4601,5059 +CCAGGGACGTGGCCTC-1,1,27,53,4721,5128 +TATGGATGTGCTACGC-1,1,26,54,4601,5197 +GTACTAAGATTTGGAG-1,1,27,55,4721,5265 +AGACCCGCCCTCCTCG-1,1,26,56,4601,5334 +CGCATTAGCTAATAGG-1,1,27,57,4721,5403 +GCTCTCGGGTACCGAA-1,1,26,58,4601,5472 +CACCGCCAGAAGGTTT-1,1,27,59,4721,5541 +TCCCAAAGACGAAGGA-1,1,26,60,4601,5610 +ATGGATTGACCAAACG-1,1,27,61,4721,5678 +GTCATGGACATGACTA-1,1,26,62,4601,5747 +CTACTGCCACCTGACC-1,1,27,63,4721,5816 +TTATATTTGGCAATCC-1,1,26,64,4601,5885 +AGCACCAGTACTCACG-1,1,27,65,4721,5954 +CATGGTCTAGATACCG-1,1,26,66,4601,6023 +TCTACCGTCCACAAGC-1,1,27,67,4721,6091 +CTAGTTGGGCCCGGTA-1,1,26,68,4601,6160 +TCCCGCGTACTCCTGG-1,1,27,69,4721,6229 +CAGAGCATGAGCTTGC-1,1,26,70,4601,6298 +ACACGGGAACTTAGGG-1,1,27,71,4721,6367 +GGCTCTGCTCCAACGC-1,1,26,72,4601,6436 +AGAACGTGGTACATTC-1,1,27,73,4721,6504 +CAATAAACCTTGGCCC-1,1,26,74,4601,6573 +ACTTCGCCATACGCAC-1,1,27,75,4721,6642 +ATCTGGTTAAGACTGT-1,1,26,76,4601,6711 +TCGTAAGACGACATTG-1,1,27,77,4721,6780 +GTGTACCTTGGCTACG-1,1,26,78,4601,6849 +GCCCGTAATACCTTCT-1,1,27,79,4721,6917 +CGGTCAAGTGGGAACC-1,1,26,80,4601,6986 +TTGTAAGGCCAGTTGG-1,1,27,81,4721,7055 +GGAGCACCAAGAACTA-1,1,26,82,4601,7124 +TAATAGTGACGACCAG-1,1,27,83,4721,7193 +CTAAATCCTATTCCGG-1,1,26,84,4601,7262 +CGAGTTCTGTCCCACC-1,1,27,85,4721,7330 +AGGCAGATGCGTAAAC-1,1,26,86,4601,7399 +AAGGATGAGGGACCTC-1,1,27,87,4721,7468 +AGAGAACCGTCTAGGA-1,1,26,88,4601,7537 +GAGGGCGCAGCTCTGC-1,1,27,89,4721,7606 +AAGATTGGCGGAACGT-1,1,26,90,4601,7674 +CCAGTAGTCTGATCCA-1,1,27,91,4721,7743 +AAGGGACAGATTCTGT-1,1,26,92,4601,7812 +ATAGAGTTATCAACTT-1,1,27,93,4721,7881 +AAATTACCTATCGATG-1,1,26,94,4601,7950 +GATCCTAAATCGGGAC-1,1,27,95,4721,8019 +TTACAGACCTAAATGA-1,1,26,96,4601,8087 +CCTCACCTTAGCATCG-1,1,27,97,4721,8156 +CATGCGACCAGTTTAA-1,1,26,98,4601,8225 +AACATATCAACTGGTG-1,1,27,99,4721,8294 +CTATAAGAGCCAATCG-1,1,26,100,4601,8363 +AATATCGAGGGTTCTC-1,1,27,101,4721,8432 +GTACTCCTGGGTATGC-1,1,26,102,4601,8500 +ATAAGTAGGATTCAGA-1,1,27,103,4721,8569 +AGGTCGCGGAGTTACT-1,1,26,104,4601,8638 +CTAATTCTCAGATATT-1,1,27,105,4721,8707 +GCCAACCATTTCCGGA-1,1,26,106,4601,8776 +TGATCCCAGCATTAGT-1,1,27,107,4721,8845 +CGTTGTAAGATTGATT-1,1,26,108,4601,8913 +GAAACCATGGTGCGCT-1,1,27,109,4721,8982 +AATCTATGCCGGAGCC-1,1,26,110,4601,9051 +GACTCCCAGAATAAGG-1,1,27,111,4721,9120 +TATGATCCGGCACGCC-1,1,26,112,4601,9189 +CCGCTTGCTGACATGG-1,1,27,113,4721,9258 +TGGTTAAGGGCGCTGG-1,1,26,114,4601,9326 +TTGATAGTCAATACAT-1,1,27,115,4721,9395 +GGTTTAATTGAGCAGG-1,1,26,116,4601,9464 +CATTACATAGATTGTG-1,0,27,117,4721,9533 +GGTACACCAGATTTAT-1,0,26,118,4601,9602 +GGCCCGTATACCATGC-1,0,27,119,4721,9671 +ATCTTTCGTATAACCA-1,0,26,120,4601,9739 +GAGATGACAATCCTTA-1,0,27,121,4721,9808 +AAAGCTTGCCTACATA-1,0,26,122,4601,9877 +GAACGATAAGTTAAAG-1,0,27,123,4721,9946 +TAATAGCTAAATGATG-1,0,26,124,4601,10015 +TATGGCTAGGCTAATT-1,0,27,125,4721,10084 +AGGAGAGTCTGGCTAC-1,0,26,126,4601,10152 +TGCTCTGCCGGTTCAC-1,0,27,127,4721,10221 +CCAATAGATTTCATCT-1,0,28,0,4841,1480 +GGGCACGAATTGGCCG-1,0,29,1,4961,1549 +TCGTTGACAGGGTCCC-1,0,28,2,4841,1618 +ATCGTATTCCGAGAAC-1,0,29,3,4961,1686 +GGGAATTCTGTCCAGT-1,0,28,4,4841,1755 +ACGCGTTTCTTAAGAG-1,0,29,5,4961,1824 +GAGAGCGCAGTCCCTG-1,0,28,6,4841,1893 +GTCCTATTGTTGTGGT-1,0,29,7,4961,1962 +CATCTGCAGGATCATT-1,0,28,8,4841,2031 +GAGTCGACAGACCCTC-1,0,29,9,4961,2099 +AAGTGCAAAGGTAGAC-1,0,28,10,4841,2168 +AGGGTGGATAGTGCAT-1,0,29,11,4961,2237 +TGATAGCGGGATTCTA-1,0,28,12,4841,2306 +GTCAGTTTGGTAGTCG-1,0,29,13,4961,2375 +GCATTCGAAATGAACA-1,0,28,14,4841,2443 +AAAGACTGGGCGCTTT-1,0,29,15,4961,2512 +TAACAATATTTGTTGC-1,0,28,16,4841,2581 +CCAGCTTCCGCCCGCA-1,0,29,17,4961,2650 +GATATGGATTACGCGG-1,0,28,18,4841,2719 +AGAGCAGTTATGAGAC-1,0,29,19,4960,2788 +TCACATCTTATCTGAT-1,0,28,20,4841,2856 +TATGAAGACAGGTGCG-1,0,29,21,4960,2925 +TACCTGCTGCACTGTG-1,0,28,22,4841,2994 +TAGGTCCAAGTAAGGA-1,0,29,23,4960,3063 +GAAACTCGTGCGATGC-1,0,28,24,4841,3132 +AACAATTACTCTACGC-1,0,29,25,4960,3201 +CCGCACGTGACCTCGG-1,0,28,26,4841,3269 +AACTTGCCCGTATGCA-1,1,29,27,4960,3338 +GGGTATGTATGCACTT-1,1,28,28,4841,3407 +TTCGTACTCCAGAACG-1,1,29,29,4960,3476 +GAATTTCTCGCTGCAG-1,1,28,30,4841,3545 +AACAGGATGGGCCGCG-1,1,29,31,4960,3614 +GACGTGTAGGGATTAT-1,1,28,32,4841,3682 +TAGGTGAGCCCTACTC-1,1,29,33,4960,3751 +CTAATTCGCACGCGCT-1,1,28,34,4841,3820 +GAAGCTTGCTGACCGC-1,1,29,35,4960,3889 +GGTTAGGCTTGGAGAA-1,1,28,36,4841,3958 +ACAAGGACAAGAGGTT-1,1,29,37,4960,4027 +AGGCCACCCGTTATGA-1,1,28,38,4841,4095 +GTGGGCTTAGACACAC-1,1,29,39,4960,4164 +CGTGTCCCATTCGCGA-1,1,28,40,4841,4233 +TGGAGTGATGCGATGA-1,1,29,41,4960,4302 +AACAACTGGTAGTTGC-1,1,28,42,4841,4371 +CCTGGCTAGACCCGCC-1,1,29,43,4960,4440 +CGCAATTAGGGTAATA-1,1,28,44,4841,4508 +TCGAAATTTAGGACCA-1,1,29,45,4960,4577 +AGACTAGCCTTCCAGA-1,1,28,46,4841,4646 +TTGATCTAACTTTGTC-1,1,29,47,4960,4715 +AAGGAGCGGTTGGTGC-1,1,28,48,4841,4784 +ACTTGGGACCCGGTGG-1,1,29,49,4960,4853 +TGATCTCCGGCGCCAG-1,1,28,50,4841,4921 +CAGTTCAAATTGACAC-1,1,29,51,4960,4990 +GTCCGGCTGAATTGCG-1,1,28,52,4841,5059 +CTGGAAATGGATGCTT-1,1,29,53,4960,5128 +TGATCGGTTTGACCCT-1,1,28,54,4841,5197 +TAGAGTCTAAGCGAAC-1,1,29,55,4960,5265 +GAGACTGATGGGTAGA-1,1,28,56,4841,5334 +TAGCTAAGTCCGGGAG-1,1,29,57,4960,5403 +GGGCGATATGTGTGAA-1,1,28,58,4841,5472 +CTCGAGGTCGAACAGT-1,1,29,59,4960,5541 +GATCCCTTTATACTGC-1,1,28,60,4841,5610 +GTCATGCACCTCCGTT-1,1,29,61,4960,5678 +ACTTTCCTATAGCTTC-1,1,28,62,4841,5747 +TCGCTCGATATATTCC-1,1,29,63,4960,5816 +ATAGGTTGGGCAGATG-1,1,28,64,4841,5885 +CAATTAAGGGTGATGA-1,1,29,65,4960,5954 +ACCGACTGAGTCCCAC-1,1,28,66,4841,6023 +CCTGTCACCCGGGCTC-1,1,29,67,4960,6091 +GATCGGTGGCCATAAC-1,1,28,68,4841,6160 +CCTATGGGTTACCGTC-1,1,29,69,4960,6229 +TTGGGACACTGCCCGC-1,1,28,70,4841,6298 +CGAGGCTAAATATGGC-1,1,29,71,4960,6367 +TCAGGGTGTAACGTAA-1,1,28,72,4841,6436 +CGAGAGATGTGAACCT-1,1,29,73,4960,6504 +TCGCTGGGCGGATTGT-1,1,28,74,4841,6573 +AGATCTCAGGTGTGAT-1,1,29,75,4960,6642 +TGGCCAAACTGAAGTA-1,1,28,76,4841,6711 +GCTTCCGTCCCTAGAC-1,1,29,77,4960,6780 +CAGCAGCCCGTTCCTT-1,1,28,78,4841,6849 +TGTATAACAGATCCTG-1,1,29,79,4960,6917 +CGCGGGAATTAGGCAG-1,1,28,80,4841,6986 +TGCATGTGGTAATCTA-1,1,29,81,4960,7055 +ACAATTTGAGCAGTGG-1,1,28,82,4841,7124 +GAGCTAAGGGCATATC-1,1,29,83,4960,7193 +CCAGATAGTTGAGTGA-1,1,28,84,4841,7262 +CCACAATGTACGTCTT-1,1,29,85,4960,7330 +CAATGGATCTCTACCA-1,1,28,86,4841,7399 +TGTGGCAAAGCGTATG-1,1,29,87,4960,7468 +TAAAGCGTTAGGAGAA-1,1,28,88,4841,7537 +TCCGTTTAGCCTTGAA-1,1,29,89,4960,7606 +CAGCTCGACAAGTTAA-1,1,28,90,4841,7675 +GCCTATAGTGTCAGGG-1,1,29,91,4960,7743 +ATAGACAACGGGACCT-1,1,28,92,4841,7812 +CTACTATCTTTCAGAG-1,1,29,93,4960,7881 +GCGCTGCTTTGCATTT-1,1,28,94,4841,7950 +GCGCATCCAGTCAGCA-1,1,29,95,4960,8019 +GACTCGCGGGAATGAC-1,1,28,96,4841,8087 +CTGGTAACGAGCTCTT-1,1,29,97,4960,8156 +TCCGGCCTAGCGTACA-1,1,28,98,4841,8225 +TCTAGGTGGCGACGCT-1,1,29,99,4960,8294 +ACGCTAGTGATACACT-1,1,28,100,4841,8363 +ATCTGCACCTCTGCGA-1,1,29,101,4960,8432 +CCTCACCTGAGGGAGC-1,1,28,102,4841,8500 +AGTGAGCCTCGCCGCC-1,1,29,103,4960,8569 +ACGAGTACGGATGCCC-1,1,28,104,4841,8638 +GGTACCATTAAGACGG-1,1,29,105,4960,8707 +TTCTGCTAGACTCCAA-1,1,28,106,4841,8776 +TAACTATTACGCCAAA-1,1,29,107,4960,8845 +GCATTCAAGGCAACGC-1,1,28,108,4841,8913 +AGTACATCATTTATCA-1,1,29,109,4960,8982 +GTCGTGTCTGGTCATC-1,1,28,110,4841,9051 +AGTCTAAAGTATACTC-1,1,29,111,4960,9120 +CGGCCCAACCTGTAGT-1,1,28,112,4841,9189 +AGGGAGACATACTTCG-1,1,29,113,4960,9258 +TCCCTAGATCAATAGG-1,1,28,114,4840,9326 +TCCCGTCGCGTCATAG-1,1,29,115,4960,9395 +CGCATCCATCAGCCAG-1,0,28,116,4840,9464 +CTGCACCTAGTCCACA-1,0,29,117,4960,9533 +CGAGGATCGGGAACGA-1,0,28,118,4840,9602 +CAATGAGGTTCGACTA-1,0,29,119,4960,9671 +TCTGACGGGCTAACCC-1,0,28,120,4840,9739 +TTCTATGCCTTTCGCA-1,0,29,121,4960,9808 +AGAGTATAGTGTTACG-1,0,28,122,4840,9877 +CCATTGTTTCCTCCAT-1,0,29,123,4960,9946 +CTCATCACTTAGTGAT-1,0,28,124,4840,10015 +CCGAAGGGCGTACCGC-1,0,29,125,4960,10084 +TCAAGCTGCCTTGAAA-1,0,28,126,4840,10152 +CTCATTAACGTTGCCC-1,0,29,127,4960,10221 +GTCTTCCTCACCTAAG-1,0,30,0,5080,1480 +GGTGATGAAGGAAGTG-1,0,31,1,5200,1549 +TCAATACAATTGCTGC-1,0,30,2,5080,1618 +GCAACCCAAGTTGTTT-1,0,31,3,5200,1686 +ATGAAGTGGACCCAGC-1,0,30,4,5080,1755 +GAGAATCTCACGATCA-1,0,31,5,5200,1824 +TATATCATTGATCAGT-1,0,30,6,5080,1893 +AACTTTACGGGAGCTT-1,0,31,7,5200,1962 +TTCTTGTGTCCATCAG-1,0,30,8,5080,2031 +ACAATTTAGGAGGCTC-1,0,31,9,5200,2099 +ATACTTGTTCTCGAGC-1,0,30,10,5080,2168 +CACGGGATTGAGGGTT-1,0,31,11,5200,2237 +GTTAATGTCTATCTTA-1,0,30,12,5080,2306 +GCGTTATATTTGGAAC-1,0,31,13,5200,2375 +CGTCAAGGCTATAAAT-1,0,30,14,5080,2444 +TTAGCTCTGTAATCCG-1,0,31,15,5200,2512 +AATGGTCCACCGTTCA-1,0,30,16,5080,2581 +GTCATTGCATTGACCC-1,0,31,17,5200,2650 +TGTCCGTGGCGCCTTT-1,0,30,18,5080,2719 +TCAACTAACGTATAAC-1,0,31,19,5200,2788 +TCCTCTCCAGTTGTCC-1,0,30,20,5080,2856 +TGTGTTCGTATCCAAG-1,0,31,21,5200,2925 +CCGCGTAGGTAAGGGC-1,0,30,22,5080,2994 +CTGCGGGTGAAATGTT-1,0,31,23,5200,3063 +TATCTACAGAGGTAAT-1,0,30,24,5080,3132 +CTACTCTAGGCCCGGC-1,1,31,25,5200,3201 +ACAAGCAGTGCCTAGC-1,1,30,26,5080,3269 +TACAAGTCTCGTGCAT-1,1,31,27,5200,3338 +TCGGAATGCGCTCTGA-1,1,30,28,5080,3407 +TCGCGTCCAGAAGGTC-1,1,31,29,5200,3476 +TATGGCCCGGCCTCGC-1,1,30,30,5080,3545 +GCTGGCATATTCACCT-1,1,31,31,5200,3614 +GTCAGAATAGTCTATG-1,1,30,32,5080,3682 +GGCGTCCTATCCGCTG-1,1,31,33,5200,3751 +CGGAGTTTGAGAGACA-1,1,30,34,5080,3820 +AGCACTTAAGGACGCC-1,1,31,35,5200,3889 +TCCACAATGGTTTACG-1,1,30,36,5080,3958 +CCAACGATGCACTGAT-1,1,31,37,5200,4027 +ATTTACAGTTTACTGG-1,1,30,38,5080,4095 +CCCTGAAATGAGTTGA-1,1,31,39,5200,4164 +CAAACGGTCGCACTTT-1,1,30,40,5080,4233 +TGATTCGTCTATCACT-1,1,31,41,5200,4302 +TCAGGTTCTTTGAGAA-1,1,30,42,5080,4371 +CACGCAGCGAGGCTTT-1,1,31,43,5200,4440 +TTAAGCGCCTGACCCA-1,1,30,44,5080,4508 +CTTACACGGTATTCCA-1,1,31,45,5200,4577 +AAGGCTGTGCTCATCG-1,1,30,46,5080,4646 +GACCAGAGCCCTGTAG-1,1,31,47,5200,4715 +TCCCAGGCTTAGCTAA-1,1,30,48,5080,4784 +ATTGAAGATCTTAGTG-1,1,31,49,5200,4853 +AGTTCCTACAGAATTA-1,1,30,50,5080,4921 +GGGCTGGTTAGTCGCG-1,1,31,51,5200,4990 +GAAATGGCGGTGTTAG-1,1,30,52,5080,5059 +TACGAACACGACTTCA-1,1,31,53,5200,5128 +ACCACAAGTTTCTATC-1,1,30,54,5080,5197 +ATATTTAACCCTCAAG-1,1,31,55,5200,5266 +GATCATTCCAAACATT-1,1,30,56,5080,5334 +TCCAGGCGAGTACGGT-1,1,31,57,5200,5403 +GTTTGACCAAATCCTA-1,1,30,58,5080,5472 +CACAGCACCCACGGCA-1,1,31,59,5200,5541 +TGCAAGAATGACGTAA-1,1,30,60,5080,5610 +GCGAAGCCATACCCGT-1,1,31,61,5200,5678 +TCCTTTCTTACGCTTA-1,1,30,62,5080,5747 +GCTGCTCTCCGGACAC-1,1,31,63,5200,5816 +ACTGTCTTCTTTAGAA-1,1,30,64,5080,5885 +TCAAACTTAGATTGTT-1,1,31,65,5200,5954 +CTATGTCACTAGCCCA-1,1,30,66,5080,6023 +TGCGCAAAGCATTTGG-1,1,31,67,5200,6091 +TTAATGTAGACCAGGT-1,1,30,68,5080,6160 +GGCGGTAGGATCATTG-1,1,31,69,5200,6229 +GGCAATAGTCAATGAG-1,1,30,70,5080,6298 +ACACGAGACTCCTTCT-1,1,31,71,5200,6367 +GACACAAGGGAAGAAA-1,1,30,72,5080,6436 +TCAGCAAATGCATCTC-1,1,31,73,5200,6504 +GAGATCTGTCACTCCG-1,1,30,74,5080,6573 +ATGCCGGTCTTGCATA-1,1,31,75,5200,6642 +TTGGGCGGCGGTTGCC-1,1,30,76,5080,6711 +TTGTTGTGTGTCAAGA-1,1,31,77,5200,6780 +ACTGTACGATACACAT-1,1,30,78,5080,6849 +TCCACTTTATCTAGGT-1,1,31,79,5200,6917 +GGTCTGAGAATCTGGA-1,1,30,80,5080,6986 +TAGAAAGGTGGCGCTA-1,1,31,81,5200,7055 +TATGTCTCATTGTGCC-1,1,30,82,5080,7124 +GGATTTCACTTCTATA-1,1,31,83,5200,7193 +TGAGTGGTCCGTGACG-1,1,30,84,5080,7262 +CGCTTTCTTGCATTCG-1,1,31,85,5200,7330 +ACCCAACGCCCGTGGC-1,1,30,86,5080,7399 +GAACGTCTCATGGTCG-1,1,31,87,5200,7468 +AGGGTTCCCTTTGGTT-1,1,30,88,5080,7537 +GTAGCTTCCTCTTGTT-1,1,31,89,5200,7606 +GCATGAGGGACGCGGC-1,1,30,90,5080,7675 +CTACCCTAAGGTCATA-1,1,31,91,5200,7743 +TCACCGCTCGGCACTC-1,1,30,92,5080,7812 +GGCTCGCGTTGAGGTA-1,1,31,93,5200,7881 +CTAACGAAACTTGCTG-1,1,30,94,5080,7950 +TTAAACTCGAATTCAT-1,1,31,95,5200,8019 +TACTTTACTGAGCCGG-1,1,30,96,5080,8087 +GCTTGGATCGATTAGG-1,1,31,97,5200,8156 +CGGTTATCCAACAGTG-1,1,30,98,5080,8225 +CAGACCTGTAAGTGTT-1,1,31,99,5200,8294 +GACGGTCAATAGAAGC-1,1,30,100,5080,8363 +CTGACTGCGCAGCTCG-1,1,31,101,5200,8432 +CCATACCTTTACTTGT-1,1,30,102,5080,8500 +GTAATAAAGGGCTCCC-1,1,31,103,5200,8569 +GTGAACTCCCATTCGA-1,1,30,104,5080,8638 +GTGGTTACTTCTTTCG-1,1,31,105,5200,8707 +TCAGAACCTCCACAGG-1,1,30,106,5080,8776 +TCCCACTCTCTTCCGG-1,1,31,107,5200,8845 +ATCTTGACTTGTCCAA-1,1,30,108,5080,8913 +TCGGGAACGTGCCTAG-1,1,31,109,5200,8982 +GTTAGCCGTAAATCAA-1,1,30,110,5080,9051 +ATTTACTAAGTCCATT-1,1,31,111,5200,9120 +GGGTGCATATGAAAGC-1,1,30,112,5080,9189 +TCCGAATGGTCCTGAG-1,1,31,113,5200,9258 +TGATGGCTGTTTCTGA-1,1,30,114,5080,9326 +AAATAAGGTAGTGCCC-1,1,31,115,5200,9395 +CCACTATCCGGGTCAC-1,0,30,116,5080,9464 +ACACCACATAATTAGC-1,0,31,117,5200,9533 +CGCGGTAAGTCTAGCT-1,0,30,118,5080,9602 +GCGGGCATTACGATGC-1,0,31,119,5200,9671 +AGGATTGCTTACGACA-1,0,30,120,5080,9739 +CTCGGGATAACACCTA-1,0,31,121,5200,9808 +GTCGTCTGGTTGGCTA-1,0,30,122,5080,9877 +GCAATTAGTCGCACCG-1,0,31,123,5200,9946 +GTGACCTAAAGAATAA-1,0,30,124,5080,10015 +CTGAGCGAGACTTATT-1,0,31,125,5200,10084 +CAAGACTCAGAAGCGC-1,0,30,126,5080,10152 +ACTTCGCTAGCGAGTG-1,0,31,127,5200,10221 +CCATACTCGCCTCTCC-1,0,32,0,5320,1480 +ACGATACCTATCCTGA-1,0,33,1,5440,1549 +CTCACCAGTACAAGTG-1,0,32,2,5320,1618 +CGAAGACGGTGAGTGC-1,0,33,3,5440,1686 +AAATTAATAAGCGCGA-1,0,32,4,5320,1755 +GGGCCCTTATCTATAC-1,0,33,5,5440,1824 +CTGCCCACGAAGCGTT-1,0,32,6,5320,1893 +GGACAAGTTGCAGTGA-1,0,33,7,5440,1962 +GTCCGAGAGCAATCAT-1,0,32,8,5320,2031 +ATGGCAGCCGAGAAAC-1,0,33,9,5440,2099 +CCTCGGATGCTACCTG-1,0,32,10,5320,2168 +ATACGGTGAAGATGCA-1,0,33,11,5440,2237 +ACATCAGCTGGGACGC-1,0,32,12,5320,2306 +GGTTGTGTAGCCTGGC-1,0,33,13,5440,2375 +CCTGCGTTCTACGCTT-1,0,32,14,5320,2444 +GAACGTTAGGAAGACG-1,0,33,15,5440,2512 +CTGATAGTGTATCTCA-1,0,32,16,5320,2581 +TTCTGCGAGCGCCCTT-1,0,33,17,5440,2650 +CTTTGGCGCTTTATAC-1,0,32,18,5320,2719 +TCCGAACTTGGCTTAC-1,0,33,19,5440,2788 +TAGATTCCTGGTTATT-1,0,32,20,5320,2856 +CCGACAAAGGGAGTGC-1,0,33,21,5440,2925 +CCATGGCCCTTGTACC-1,0,32,22,5320,2994 +GAAATATCACCATCAG-1,1,33,23,5440,3063 +ACGAAATGGGCGGCAC-1,1,32,24,5320,3132 +GTGAGCGTGCTGCACT-1,1,33,25,5440,3201 +CCGCGGGTACGAAGAA-1,1,32,26,5320,3269 +TCCCTGGCTCGCTGGA-1,1,33,27,5440,3338 +CAGCTTAGTAGGTAGC-1,1,32,28,5320,3407 +CACGAAAGTTAGTCCC-1,1,33,29,5440,3476 +ACCTAATCGACTTCCT-1,1,32,30,5320,3545 +AAGTAGTGACGCGAGG-1,1,33,31,5440,3614 +TCCGATTACATTGCCG-1,1,32,32,5320,3682 +CCTCCGACAATTCAAG-1,1,33,33,5440,3751 +GTTCACAGGAGTCTAG-1,1,32,34,5320,3820 +CGAAGTTGCTCTGTGT-1,1,33,35,5440,3889 +GTCGGATATCTCAGAC-1,1,32,36,5320,3958 +CGCTCTCCGTAGATTA-1,1,33,37,5440,4027 +CAAGCAACGTCGGAGT-1,1,32,38,5320,4095 +CCATTCCCTGCCCACA-1,1,33,39,5439,4164 +CTTTGGCTTTAGTAAA-1,1,32,40,5320,4233 +GGCTATTAAGTTGTAT-1,1,33,41,5439,4302 +CCATTAGCGATAATCC-1,1,32,42,5320,4371 +TGTTCTTCCATTGACT-1,1,33,43,5439,4440 +AGATAACTTCAGGGCC-1,1,32,44,5320,4508 +ATAGACGAAGAGAAAG-1,1,33,45,5439,4577 +GGCGGAGTAATATTAG-1,1,32,46,5320,4646 +TGACCCACGTTAGACA-1,1,33,47,5439,4715 +TCACAGGTTATTGGGC-1,1,32,48,5320,4784 +TCACGCATTGTAGATC-1,1,33,49,5439,4853 +TTGAAGAATTCCCAGG-1,1,32,50,5320,4921 +AAATGGTCAATGTGCC-1,1,33,51,5439,4990 +TAGTGCCCTCCAGAGT-1,1,32,52,5320,5059 +GGTATTGCCGAGTTTA-1,1,33,53,5439,5128 +CGTATTAAGAGATCTA-1,1,32,54,5320,5197 +ACTGTCCAGGATTATA-1,1,33,55,5439,5266 +CGGGCAGCTAAACCGC-1,1,32,56,5320,5334 +TTGCTGATCATGTTCG-1,1,33,57,5439,5403 +TATGGGTACGTATCGT-1,1,32,58,5320,5472 +CAGCTCACTGAGACAT-1,1,33,59,5439,5541 +GGGACTGCATAGATAG-1,1,32,60,5320,5610 +ACGCATTCGTGAGTAC-1,1,33,61,5439,5678 +CTCTGGACGCCTGGTG-1,1,32,62,5320,5747 +AGGGTTTAGTTCGGGA-1,1,33,63,5439,5816 +GGGAGAACTCACAGTA-1,1,32,64,5320,5885 +ATCAATCTGGGCTGCA-1,1,33,65,5439,5954 +TCTTCGATACCAATAA-1,1,32,66,5320,6023 +ACGTAGATTGCTGATG-1,1,33,67,5439,6091 +TCTTGATGCGTAGCGA-1,1,32,68,5320,6160 +GGGCTGCCTAGGGCGA-1,1,33,69,5439,6229 +CTCTCACAATCGATGA-1,1,32,70,5320,6298 +CCAAGCGTAACTCGTA-1,1,33,71,5439,6367 +ACAACAGCATGAGCTA-1,1,32,72,5320,6436 +GTCCCAACGTAAAGTA-1,1,33,73,5439,6504 +TCGGAGTACATGAGTA-1,1,32,74,5320,6573 +GGGAGTTAATGAGGCG-1,1,33,75,5439,6642 +CCGGGCGGTCTCGTCA-1,1,32,76,5320,6711 +CCGTAAGTTGGTCCCA-1,1,33,77,5439,6780 +GGAGGGCTTGGTTGGC-1,1,32,78,5320,6849 +TCGGACGCCCAGCCCA-1,1,33,79,5439,6917 +TCTGTGCCATCATAGT-1,1,32,80,5320,6986 +GTACTGGAGTTAGACC-1,1,33,81,5439,7055 +GGAATGCGCTAGCGTG-1,1,32,82,5320,7124 +GTGTGAATAACTTAGG-1,1,33,83,5439,7193 +GGTCGGCCAGGAGCTT-1,1,32,84,5320,7262 +TAGCCGGCGGTCAGCG-1,1,33,85,5439,7330 +CGGGTGTACCCATTTA-1,1,32,86,5320,7399 +AGTGATTCAAGCAGGA-1,1,33,87,5439,7468 +GTTGGATTGAGAACAC-1,1,32,88,5320,7537 +CACACGCGCTGTCTTA-1,1,33,89,5439,7606 +TAGACGCCCGTACCGG-1,1,32,90,5320,7675 +GGTTTCAATCGGTCAG-1,1,33,91,5439,7743 +AATCTGCGTTGGGACG-1,1,32,92,5320,7812 +TTACGGATGGTTCGAG-1,1,33,93,5439,7881 +CGGCAGGGTCGGGTTG-1,1,32,94,5320,7950 +GCTTTCAGAGGAGGTG-1,1,33,95,5439,8019 +TCTTCCCATGGGCACA-1,1,32,96,5320,8088 +TACCGCGGACTTGCAG-1,1,33,97,5439,8156 +AGAATTATGGATTCGA-1,1,32,98,5320,8225 +ATTGATGAGTCCTAAC-1,1,33,99,5439,8294 +TAGGTCGCCGGAACTG-1,1,32,100,5320,8363 +TAACCTACCGTCCGAG-1,1,33,101,5439,8432 +CTTAGTAGGCCTACAG-1,1,32,102,5320,8500 +CTAGATGTGAGTGTAA-1,1,33,103,5439,8569 +ACTCCCGAATTCGTTT-1,1,32,104,5320,8638 +GTTCATCGTTTGGCTG-1,1,33,105,5439,8707 +ACTTTACCCTCATGAA-1,1,32,106,5320,8776 +GCGAGAGTTGCGTCCA-1,1,33,107,5439,8845 +GTTCGGGCGTACCATT-1,1,32,108,5320,8913 +CGACTTTGTATAGCCT-1,1,33,109,5439,8982 +GCCATCGATGCTGCAT-1,1,32,110,5320,9051 +GCATTTCCAAGGCTCC-1,1,33,111,5439,9120 +ATGTAAGGCTGCTCTT-1,1,32,112,5320,9189 +ACGTTCGCAATCAATT-1,1,33,113,5439,9258 +GTGACGAGGGTGACCC-1,1,32,114,5320,9326 +ATTATAGCTACTTTAC-1,1,33,115,5439,9395 +CGTGTGTTAAACCCTG-1,0,32,116,5320,9464 +TTGGTATGGCTTGTGT-1,0,33,117,5439,9533 +CATTCCCATTCCGTCG-1,0,32,118,5320,9602 +TGCCGAAAGCGTATTC-1,0,33,119,5439,9671 +CAACACATCTCCTGCC-1,0,32,120,5320,9739 +CTGCCTCATATGCAAC-1,0,33,121,5439,9808 +TCCCGCCTATGTGCGT-1,0,32,122,5320,9877 +GGTTACCCGACACTTT-1,0,33,123,5439,9946 +CCAGCGGGATCACCAG-1,0,32,124,5320,10015 +ATGTTTCGGCCCGGAG-1,0,33,125,5439,10084 +GCGTCTAACCTCCTAA-1,0,32,126,5320,10152 +ATCAGGTAGCTGACAG-1,0,33,127,5439,10221 +GGTATGAAAGAACTGA-1,0,34,0,5559,1480 +GTGGCCTAATATCATT-1,0,35,1,5679,1549 +CCTGTGAAACCGTAAC-1,0,34,2,5559,1618 +GGCAGAGAGATCGGGA-1,0,35,3,5679,1686 +TAGCGTCGAATATTGA-1,0,34,4,5559,1755 +CGCCGACTATTCGCTA-1,0,35,5,5679,1824 +TCTGGCGCAAGCCGGG-1,0,34,6,5559,1893 +AGTGGTTGCGTATAGG-1,0,35,7,5679,1962 +ATCGGTTACCTAGTAA-1,0,34,8,5559,2031 +CCTGCCCGTTGTCTAG-1,0,35,9,5679,2099 +GCACACGCCCATGGTC-1,0,34,10,5559,2168 +AGTACGGCCCGTATCG-1,0,35,11,5679,2237 +TATCTAGCCTAAAGGA-1,0,34,12,5559,2306 +CACTCGGTTAGGAGGA-1,0,35,13,5679,2375 +ATGTTCGTCGACCCAC-1,0,34,14,5559,2444 +TTCCTCTGCCCGAATA-1,0,35,15,5679,2512 +TTACTATCGGCTTCTC-1,0,34,16,5559,2581 +GCCGCATTAGTCCGGC-1,0,35,17,5679,2650 +TAAGGGCTGGGAGAGG-1,0,34,18,5559,2719 +TAAGCAGGCGACACGC-1,0,35,19,5679,2788 +AGCACTACCGGCCTGT-1,0,34,20,5559,2856 +GAAAGCCCTTTGGACC-1,1,35,21,5679,2925 +GACCGACTGAAGCGTC-1,1,34,22,5559,2994 +CGGTGAAGACTAAAGT-1,1,35,23,5679,3063 +CCCTGCGCTACGCATA-1,1,34,24,5559,3132 +TACTGGACAGCTCGGC-1,1,35,25,5679,3201 +TTAGTAGGGCGGCGGG-1,1,34,26,5559,3269 +GAGGCTATCAAAGTCG-1,1,35,27,5679,3338 +TTACCATTGATTACCC-1,1,34,28,5559,3407 +ATACCACGGGCAACTT-1,1,35,29,5679,3476 +TGTCCTAAGTCACCGC-1,1,34,30,5559,3545 +AGGTAGGTACAAAGCT-1,1,35,31,5679,3614 +GGCATACAGGTAGCGG-1,1,34,32,5559,3682 +TGTAGTGATCTATAAT-1,1,35,33,5679,3751 +TCCCGGGTGTGCTGCT-1,1,34,34,5559,3820 +TACGATGTTGATCATC-1,1,35,35,5679,3889 +CCTCTCTCCCATCTAG-1,1,34,36,5559,3958 +GCAGGACTATAGAATA-1,1,35,37,5679,4027 +CTAGTGAAGGACAGGA-1,1,34,38,5559,4095 +TACGAGAACTTCACGT-1,1,35,39,5679,4164 +CGTTGTTTCAATTCCC-1,1,34,40,5559,4233 +GCAAATATTACGCTTT-1,1,35,41,5679,4302 +CCAATAGTGCCGTCGA-1,1,34,42,5559,4371 +ATTGCTGCTCCTCCAT-1,1,35,43,5679,4440 +GAGATCTGCTTGGCAT-1,1,34,44,5559,4508 +GCCGAAATTCCTACGT-1,1,35,45,5679,4577 +GGCACTCCACTGGGCA-1,1,34,46,5559,4646 +GGGTCACCGTGACGGT-1,1,35,47,5679,4715 +CACTTAATCAGACGGA-1,1,34,48,5559,4784 +CGTTTCGCTCATTACA-1,1,35,49,5679,4853 +ATAAAGGCTCGGTCGT-1,1,34,50,5559,4921 +CACTAAAGTTGCCTAT-1,1,35,51,5679,4990 +GTGCTCAAGTACTGTC-1,1,34,52,5559,5059 +CCATGCCTGTTTAGTA-1,1,35,53,5679,5128 +TCTAGTTATCAGAAGA-1,1,34,54,5559,5197 +TTGTAATCCGTACTCG-1,1,35,55,5679,5266 +TCCCAGCTTTAGTCTG-1,1,34,56,5559,5334 +CTACGCACGGAGTACC-1,1,35,57,5679,5403 +AAATTAACGGGTAGCT-1,1,34,58,5559,5472 +CGGCCACGCACAAAGT-1,1,35,59,5679,5541 +GAAGCGTGAGGAATTT-1,1,34,60,5559,5610 +ATATCTTAGGGCCTTC-1,1,35,61,5679,5678 +ACGCGGGCCAAGGACA-1,1,34,62,5559,5747 +GCGAGTTCTGCAAAGA-1,1,35,63,5679,5816 +TATTCGTGCCAGAATA-1,1,34,64,5559,5885 +AGGGCTGCAGTTACAG-1,1,35,65,5679,5954 +CTAGCATAGTATAATG-1,1,34,66,5559,6023 +TAGGTTCGAGTTCGTC-1,1,35,67,5679,6091 +GAATTATAGTGAAAGG-1,1,34,68,5559,6160 +CTATCGGGTCTCAACA-1,1,35,69,5679,6229 +GCGCTAATTGAATAGA-1,1,34,70,5559,6298 +ATGCGACAGTCCCATT-1,1,35,71,5679,6367 +GGTAGTGCTCGCACCA-1,1,34,72,5559,6436 +AAGCTCGTGCCAAGTC-1,1,35,73,5679,6504 +TATTCAATTCTAATCC-1,1,34,74,5559,6573 +TTCAAAGTCTCTAGCC-1,1,35,75,5679,6642 +TTGAATATGGACTTTC-1,1,34,76,5559,6711 +AAGAGCTCTTTATCGG-1,1,35,77,5679,6780 +TTACTCCGGCCGGGAA-1,1,34,78,5559,6849 +AAACGAGACGGTTGAT-1,1,35,79,5679,6917 +GCTAAGTAGTTTCTCT-1,1,34,80,5559,6986 +ATAACGCCGGAGGGTC-1,1,35,81,5679,7055 +GGATCCGGAATATACT-1,1,34,82,5559,7124 +TGAAAGGACCTGACTC-1,1,35,83,5679,7193 +TCCGCGGCAGCATCTG-1,1,34,84,5559,7262 +TGCATATGTCTGTCAC-1,1,35,85,5679,7330 +TGTAGGAGAAATTTCC-1,1,34,86,5559,7399 +AGTGAGACTTCCAGTA-1,1,35,87,5679,7468 +CCCAAACATGCTGCTC-1,1,34,88,5559,7537 +GCTTATGAAGCAGGAA-1,1,35,89,5679,7606 +TTCTAACCGAAGCTTA-1,1,34,90,5559,7675 +GGATGTCCTTACCGCA-1,1,35,91,5679,7743 +AGGGTGCTCTCGAGGG-1,1,34,92,5559,7812 +AACTCTCAATAGAGCG-1,1,35,93,5679,7881 +TCTGAATTCCGTACAA-1,1,34,94,5559,7950 +GCGTGGTACTGGGTTA-1,1,35,95,5679,8019 +CGTCGGATAGTGTTGA-1,1,34,96,5559,8088 +ATATGTCTCCCTAGCC-1,1,35,97,5679,8156 +TCTTTAAGACTATGAA-1,1,34,98,5559,8225 +TCATTTAAGTCTCCGA-1,1,35,99,5679,8294 +GATATTGAGATTGGCG-1,1,34,100,5559,8363 +TGACATCGAGCGGACC-1,1,35,101,5679,8432 +GCGTAAATGGCCATAA-1,1,34,102,5559,8500 +ATTGTACAACTCGGCT-1,1,35,103,5679,8569 +TACGCTATAGAAACCT-1,1,34,104,5559,8638 +CACCCAAATCTTATGT-1,1,35,105,5679,8707 +AGATGATGGAGTCTGG-1,1,34,106,5559,8776 +CCACGGTGCCCGGTAG-1,1,35,107,5679,8845 +TCAAGAAATACTAGCT-1,1,34,108,5559,8913 +AGGTATAATTGATAGT-1,1,35,109,5679,8982 +CAAGGTCCTATAGGCT-1,1,34,110,5559,9051 +CCGGCACGACCGTTTC-1,1,35,111,5679,9120 +ACCTCCGTTATTCACC-1,1,34,112,5559,9189 +GCAGCCTATATCACAT-1,1,35,113,5679,9258 +GGTATAGTGACACATA-1,1,34,114,5559,9326 +AAATTCCAGGTCCAAA-1,1,35,115,5679,9395 +TCTTTAGCAGGCGAAC-1,0,34,116,5559,9464 +TATTGACATTTCTGCC-1,0,35,117,5679,9533 +TCTGATCGGGTGCTAG-1,0,34,118,5559,9602 +GGCCCGGAGCATGTCT-1,0,35,119,5679,9671 +GGGCGCAGCGTTACTC-1,0,34,120,5559,9739 +TTGGCGATCCGAATAT-1,0,35,121,5679,9808 +CCACGTAAATTAGACT-1,0,34,122,5559,9877 +TCTGATTGGAAATGGA-1,0,35,123,5679,9946 +ATGGCGGAATAGTCGC-1,0,34,124,5559,10015 +ATCGCTTTACGTCTCA-1,0,35,125,5679,10084 +TACGTGCAAGGTTCCT-1,0,34,126,5559,10152 +CAGGACAGCTGCCCTT-1,0,35,127,5679,10221 +CAAACCAGGTCTGCAT-1,0,36,0,5799,1480 +ACAAGCTATATGGAAG-1,0,37,1,5919,1549 +TCGCCCACTGCGAGAG-1,0,36,2,5799,1618 +AGCCGCAAATTCAAAT-1,0,37,3,5919,1686 +TTAACGTTAAAGCCTG-1,0,36,4,5799,1755 +CAGCGCCAACACGATA-1,0,37,5,5919,1824 +ATCCAATGGTACCGAA-1,0,36,6,5799,1893 +GTGCTGCAGATAAGGA-1,0,37,7,5919,1962 +GGCCTTTGCAACTGGC-1,0,36,8,5799,2031 +GTCGTACCTACGATTG-1,1,37,9,5919,2099 +TAGAAATTCACGTATA-1,0,36,10,5799,2168 +AGAATAAATCTTCAGG-1,0,37,11,5919,2237 +CATTGCGAAATGGGCG-1,0,36,12,5799,2306 +GTCTACTCAATTACAA-1,0,37,13,5919,2375 +TGTAATGACCACAATA-1,0,36,14,5799,2444 +AAAGTCGACCCTCAGT-1,0,37,15,5919,2512 +TACTCGGCACGCCGGG-1,0,36,16,5799,2581 +AGGTGTATCGCCATGA-1,0,37,17,5919,2650 +TGTGCTTTACGTAAGA-1,0,36,18,5799,2719 +AAACCTCATGAAGTTG-1,0,37,19,5919,2788 +TATAGGGTACTCATGA-1,0,36,20,5799,2857 +CCAGCTGATGGTACTT-1,1,37,21,5919,2925 +AATATTGGAGTATTGA-1,1,36,22,5799,2994 +GGCCCTCACCCACTTA-1,1,37,23,5919,3063 +AACCAAGACTTCTCTG-1,1,36,24,5799,3132 +TCGTATTACCCATTGC-1,1,37,25,5919,3201 +ATTCGACGCCGGGCCT-1,1,36,26,5799,3269 +GGCGCAGGACATCTTC-1,1,37,27,5919,3338 +GTACTCCCTTATCGCT-1,1,36,28,5799,3407 +TGGTCTGTTGGGCGTA-1,1,37,29,5919,3476 +AATAACAACGCTCGGC-1,1,36,30,5799,3545 +CATACCCGTACCCAGT-1,1,37,31,5919,3614 +ACAATCCATTTAAACC-1,1,36,32,5799,3682 +GTTACAATTGGTGACG-1,1,37,33,5919,3751 +TTGCCCTGATCACGGG-1,1,36,34,5799,3820 +CTAACCGCGCGCCCGT-1,1,37,35,5919,3889 +CTAAAGAATGCCTACT-1,1,36,36,5799,3958 +ACCCATCTTGAGGGTA-1,1,37,37,5919,4027 +GATCTTTGCAGGGTAT-1,1,36,38,5799,4095 +GGGTACTTCATGAACT-1,1,37,39,5919,4164 +GCCGCTTGTGAGAAAC-1,1,36,40,5799,4233 +CCTGTAAGACATGATA-1,1,37,41,5919,4302 +CGACAGTTCGCGTTAT-1,1,36,42,5799,4371 +ACGATGCATATGTTAT-1,1,37,43,5919,4440 +TGTTCCGCTTCCATGA-1,1,36,44,5799,4508 +GGATGACGCGAGTTTA-1,1,37,45,5919,4577 +GAAGTTTCCACTCAAT-1,1,36,46,5799,4646 +GCGAGGCCCGAGCAGA-1,1,37,47,5919,4715 +CATACTATGTAATTGT-1,1,36,48,5799,4784 +CCAATGTCACAGCAAG-1,1,37,49,5919,4853 +GTTGGATTTGCGTTGG-1,1,36,50,5799,4921 +GGGAGGATGCCCGAAA-1,1,37,51,5919,4990 +GATCGCGGGCTCTCCA-1,1,36,52,5799,5059 +GTTCGCCATAAGTGCC-1,1,37,53,5919,5128 +AGATTATAGGACGTTT-1,1,36,54,5799,5197 +TCGAGACCAACACCGT-1,1,37,55,5919,5266 +TATGGGACCGAGCAGG-1,1,36,56,5799,5334 +GATGCGTCCTGCATTC-1,1,37,57,5919,5403 +TATGGTCTGAGTAACA-1,1,36,58,5799,5472 +GCATAGAGCACTCAGG-1,1,37,59,5918,5541 +CTTCATTGTCAGTGGA-1,1,36,60,5799,5610 +GCAGATTAGGGATATC-1,1,37,61,5918,5679 +CCTGTCGCCCGTAAAT-1,1,36,62,5799,5747 +CAATTTCGTATAAGGG-1,1,37,63,5918,5816 +GTACACTTACCTGAAG-1,1,36,64,5799,5885 +CCAGCCTGGACCAATA-1,1,37,65,5918,5954 +ATGGAGCAGGCCGTGA-1,1,36,66,5799,6023 +GTCATTAGAGCGAACG-1,1,37,67,5918,6091 +AAGACTGCAAGCTACT-1,1,36,68,5799,6160 +CTAGTCACGTCTTAAG-1,1,37,69,5918,6229 +ACTCTTGTATAGTAAC-1,1,36,70,5799,6298 +ATTAGGCGATGCTTTC-1,1,37,71,5918,6367 +TTCGGGACTAATCGCG-1,1,36,72,5799,6436 +TGGACTGTTCGCTCAA-1,1,37,73,5918,6504 +AACGTGCGAAAGTCTC-1,1,36,74,5799,6573 +CCACCCAAGGAAAGTG-1,1,37,75,5918,6642 +CCGCACAAAGACCAAC-1,1,36,76,5799,6711 +GCGATTGTTAACGTTA-1,1,37,77,5918,6780 +ACTCGTCAGTAATCCC-1,1,36,78,5799,6849 +GGTGATAAGGAGCAGT-1,1,37,79,5918,6917 +AAGAGGCATGGATCGC-1,1,36,80,5799,6986 +CACGTTCGTGCTCTAG-1,1,37,81,5918,7055 +CTATTTGGTTACGGAT-1,1,36,82,5799,7124 +GTACAGAGGCAAGGGT-1,1,37,83,5918,7193 +GGGCCGGCCGAAGTAC-1,1,36,84,5799,7262 +CCTGAACGATATATTC-1,1,37,85,5918,7330 +CCGGGCTGCTCCATAC-1,1,36,86,5799,7399 +TACTTGTTAGTAGTCC-1,1,37,87,5918,7468 +CCTAGGCGTAGCGATC-1,1,36,88,5799,7537 +CTGGCGCACAGGTCTG-1,1,37,89,5918,7606 +ACTTATACTTACCCGG-1,1,36,90,5799,7675 +GAAGTCTCCCTAGCGA-1,1,37,91,5918,7743 +ACCGATGGTAGCATCG-1,1,36,92,5799,7812 +CGAGTTTATCGGACTG-1,1,37,93,5918,7881 +CATAACGGACAGTCGT-1,1,36,94,5799,7950 +TGACGATGCACTAGAA-1,1,37,95,5918,8019 +TAGGGAGCTTGGGATG-1,1,36,96,5799,8088 +AGGGTCGATGCGAACT-1,1,37,97,5918,8156 +TATATCCCTGGGAGGA-1,1,36,98,5799,8225 +CATCTTACACCACCTC-1,1,37,99,5918,8294 +GTGCGACAGGGAGTGT-1,1,36,100,5799,8363 +CCGATCTCAACCTTAT-1,1,37,101,5918,8432 +ACGATCATCTTGTAAA-1,1,36,102,5799,8500 +GAAAGAACAGCGTTAT-1,1,37,103,5918,8569 +CTAGGTCTGAAGGAAT-1,1,36,104,5799,8638 +ATATCAACCTACAGAG-1,1,37,105,5918,8707 +AAATAGCTTAGACTTT-1,1,36,106,5799,8776 +GCGACATGTAAACATC-1,1,37,107,5918,8845 +ATAAGTAGGGCGACTC-1,1,36,108,5799,8913 +GCGAGCGCATGCTCCC-1,1,37,109,5918,8982 +AGGGACCGGCTGCGTT-1,1,36,110,5799,9051 +CCTATGAAGTGGTGCC-1,1,37,111,5918,9120 +GCTTACGTAGTTAGTA-1,1,36,112,5799,9189 +CATACTTAGGCAATAC-1,1,37,113,5918,9258 +CCTGTCCCTCACGTTA-1,1,36,114,5799,9326 +CAATGTGCCAACCCTT-1,1,37,115,5918,9395 +GTTAAGTTAGAGTGGG-1,0,36,116,5799,9464 +CTGGGATACGCTACCC-1,0,37,117,5918,9533 +AACCTGTCACGGAATT-1,0,36,118,5799,9602 +ACTGCGGACACACCGT-1,0,37,119,5918,9671 +CCGTGAGGCATTCATG-1,0,36,120,5799,9739 +GCCCAGATGCTGGAGA-1,0,37,121,5918,9808 +TCTGGCCGTTCAAGTT-1,0,36,122,5799,9877 +ATACGAAGGCTTTCCA-1,0,37,123,5918,9946 +GATCCGAATATAAGTG-1,0,36,124,5799,10015 +GTGGAGCATGTCGGCC-1,0,37,125,5918,10084 +ACTCTTCAGCTCCCGC-1,0,36,126,5799,10152 +CCCGATAGCCTCGCCT-1,0,37,127,5918,10221 +ACAGGTGTGTTGTTGC-1,0,38,0,6038,1480 +TGAACTGCTATGACTT-1,1,39,1,6158,1549 +TGACATATATGACGAT-1,1,38,2,6038,1618 +AAGTCTTCTGTGGCCT-1,1,39,3,6158,1686 +ACCAGACCATAACAAC-1,1,38,4,6038,1755 +TGAGACGTACCTCTCA-1,1,39,5,6158,1824 +GACCGTTACATGCGAC-1,1,38,6,6038,1893 +GGTTCGGATTATACTA-1,1,39,7,6158,1962 +CCTCCTGAGCCCACAT-1,1,38,8,6038,2031 +CCGCGATTTGGTAGGT-1,1,39,9,6158,2099 +AATCTCTACTGTGGTT-1,1,38,10,6038,2168 +ACTTTGACTGCATCCT-1,1,39,11,6158,2237 +CCCTGACTAACAAATT-1,0,38,12,6038,2306 +ACGCTGTGAGGCGTAG-1,1,39,13,6158,2375 +GCATACGAGGTCTTTA-1,0,38,14,6038,2444 +TCGGGATTCAAACATA-1,0,39,15,6158,2512 +GGGCCCTACGAAAGGG-1,0,38,16,6038,2581 +CGCCAAGAAGCCGAGT-1,0,39,17,6158,2650 +GGTACATCTGGGACGA-1,0,38,18,6038,2719 +GGATGCTGGCGTTCCT-1,0,39,19,6158,2788 +CCGATTCGAGGGACCC-1,1,38,20,6038,2857 +CCACTGGTGGCTGGTT-1,1,39,21,6158,2925 +GACAGGCACACACTAT-1,1,38,22,6038,2994 +TCAACGCGACCGGCAG-1,1,39,23,6158,3063 +CTACGACTAGCTATAA-1,1,38,24,6038,3132 +CGGTTGACCTGGCATA-1,1,39,25,6158,3201 +ATCCTGAATCGCTGCG-1,1,38,26,6038,3269 +GTTTCATATCGTCGCT-1,1,39,27,6158,3338 +ATAAATATTAGCAGCT-1,1,38,28,6038,3407 +AAGAGGATGTACGCGA-1,1,39,29,6158,3476 +TCCTGCGTTGATACTC-1,1,38,30,6038,3545 +CGTGCATTGTCGACGC-1,1,39,31,6158,3614 +CCGGGTTCGAGGTTAC-1,1,38,32,6038,3682 +CCCAATTTCACAACTT-1,1,39,33,6158,3751 +TGATTTATTAGCTGTG-1,1,38,34,6038,3820 +TGGAAGAAGGGAACGT-1,1,39,35,6158,3889 +GACGCTTGCTTCTAAA-1,1,38,36,6038,3958 +GGGAACGGGAGGTTAG-1,1,39,37,6158,4027 +GCGGCTCTGACGTACC-1,1,38,38,6038,4095 +ACGTTAGATTTGCCCG-1,1,39,39,6158,4164 +GAGAGGGCGCGAGGTT-1,1,38,40,6038,4233 +GCGTCTCTGCATTGGG-1,1,39,41,6158,4302 +GCAGCACACAGCCCAG-1,1,38,42,6038,4371 +CAGGCCGTTTGGGTGT-1,1,39,43,6158,4440 +AACTCAAGTTAATTGC-1,1,38,44,6038,4508 +CTTCGTAGATAGGTGA-1,1,39,45,6158,4577 +TGCAGAGTACCGAGCA-1,1,38,46,6038,4646 +GAAGTGATTTATCGTG-1,1,39,47,6158,4715 +CGCTACGGGACATTTA-1,1,38,48,6038,4784 +CCACACTGAGATATTA-1,1,39,49,6158,4853 +CGATCCGACCCAGTGC-1,1,38,50,6038,4921 +CTGTACTTCTTAGCAT-1,1,39,51,6158,4990 +ACTTATTAGGATCGGT-1,1,38,52,6038,5059 +TAGTCCGCAGAGAATG-1,1,39,53,6158,5128 +TTCACGAAAGGATCAC-1,1,38,54,6038,5197 +TACATTTCTAACGTGC-1,1,39,55,6158,5266 +ACCATATCCGCAATAA-1,1,38,56,6038,5334 +CACTCAAGAGCTATGG-1,1,39,57,6158,5403 +TGTACGAACAAATCCG-1,1,38,58,6038,5472 +ATCATCCAATATTTGT-1,1,39,59,6158,5541 +CGCTATTCTTAGGCTC-1,1,38,60,6038,5610 +TGGCAGCAGTAATAGT-1,1,39,61,6158,5679 +TCACGTGCCCGATTCA-1,1,38,62,6038,5747 +CATACGGCGTCTGGGC-1,1,39,63,6158,5816 +CACATGATTCAGCAAC-1,1,38,64,6038,5885 +GCTAGTAGAGCTTGTA-1,1,39,65,6158,5954 +TGCTGTTGAAGAACTC-1,1,38,66,6038,6023 +CGGAGCATGGCGATCC-1,1,39,67,6158,6091 +TAGCGTTGGGTCTTAC-1,1,38,68,6038,6160 +GTAGCGGCTATACACT-1,1,39,69,6158,6229 +TAACATACAATGTGGG-1,1,38,70,6038,6298 +TCTTCGAATAGACGTT-1,1,39,71,6158,6367 +GATCGTGACTGATATC-1,1,38,72,6038,6436 +GATCCGGGAATTAACA-1,1,39,73,6158,6504 +TTATATACGCTGTCAC-1,1,38,74,6038,6573 +GTCGCGTAACCCGTTG-1,1,39,75,6158,6642 +AGCTCTAGACGTTCCA-1,1,38,76,6038,6711 +GTCAAGCGGACTCGGG-1,1,39,77,6158,6780 +CGAGGGACTGCGGTCG-1,1,38,78,6038,6849 +AATCGCCTCAGCGCCA-1,1,39,79,6158,6917 +CTTGTTGCTGAGTCAA-1,1,38,80,6038,6986 +GATATGAGACACTAAC-1,1,39,81,6158,7055 +TTATGATCTTAACGAA-1,1,38,82,6038,7124 +CGCCGCCCATGCCTGT-1,1,39,83,6158,7193 +CTGGGATAAATAATGG-1,1,38,84,6038,7262 +GTGCCCGTTCGGATTC-1,1,39,85,6158,7330 +TTCAATACTCTGAATC-1,1,38,86,6038,7399 +CGCACATGTCCACTAC-1,1,39,87,6158,7468 +AGAAGAGCGCCGTTCC-1,1,38,88,6038,7537 +GATAACTCGCACTGTG-1,1,39,89,6158,7606 +AGTCGACGGTCTCAAG-1,1,38,90,6038,7675 +GTGACCGCACACTACG-1,1,39,91,6158,7743 +GTATGTGGGTCTAGTT-1,1,38,92,6038,7812 +CTTGAGTTAGGGTAAT-1,1,39,93,6158,7881 +TTAGCTGATTTGCCGT-1,1,38,94,6038,7950 +GCTGTTGCTACCGAAC-1,1,39,95,6158,8019 +TATTACCATCCTGCTT-1,1,38,96,6038,8088 +TTGAATTCACGTGAGG-1,1,39,97,6158,8156 +CCATCTCACCAGTGAA-1,1,38,98,6038,8225 +CGCACGTGCGCTATCA-1,1,39,99,6158,8294 +ACCCGGATGACGCATC-1,1,38,100,6038,8363 +CGCTAGAGACCGCTGC-1,1,39,101,6158,8432 +ATAGTTCCACCCACTC-1,1,38,102,6038,8501 +GCAGACCCAGCACGTA-1,1,39,103,6158,8569 +TAGACTACCTAGCGTT-1,1,38,104,6038,8638 +GGTTCTACTCGTCTGA-1,1,39,105,6158,8707 +GACTCACCCACGTGAG-1,1,38,106,6038,8776 +AGCTCTTCGTAACCTT-1,1,39,107,6158,8845 +ACTATCCAGGGCATGG-1,1,38,108,6038,8913 +AAGGATCGATCGCTTG-1,1,39,109,6158,8982 +ATATCGGTAGGGAGAT-1,1,38,110,6038,9051 +TTCCAGACGAGATTTA-1,1,39,111,6158,9120 +GACCGACGTGAAAGCA-1,1,38,112,6038,9189 +CCTGGAAACGTTCTGC-1,1,39,113,6158,9258 +CCGGTAATGGCTAGTC-1,1,38,114,6038,9326 +GCCGTGGAAGAAATGT-1,1,39,115,6158,9395 +GTCTTGAGGAGCAGTG-1,0,38,116,6038,9464 +TCCCAAAGCCCTAAAT-1,0,39,117,6158,9533 +TTGAGCGCCACGTGAT-1,0,38,118,6038,9602 +TTGAGTCCCGCTGCTG-1,0,39,119,6158,9671 +ATGGAACCTTTGCACA-1,0,38,120,6038,9739 +GCTAGCACCTGGGCCA-1,0,39,121,6158,9808 +CGCCGTCTACCCATCG-1,0,38,122,6038,9877 +GATAGGTGTCCCGGGC-1,0,39,123,6158,9946 +AGGTATGCGGACATTA-1,0,38,124,6038,10015 +TTGGTTCGCTCAAAGG-1,0,39,125,6158,10084 +TCTGGAGCGTAAGAGT-1,0,38,126,6038,10152 +TGCCTAAATTTAATAG-1,0,39,127,6158,10221 +TAATTTCCGTCCAGTA-1,1,40,0,6278,1480 +TCCTTCAATCCCTACG-1,1,41,1,6398,1549 +TACCTATCCCTAGAGG-1,1,40,2,6278,1618 +GCATGGGTACTGACGC-1,1,41,3,6398,1686 +GTCGGGAACATGGTAG-1,1,40,4,6278,1755 +GCAAATGAGGACACTT-1,1,41,5,6398,1824 +GAATGGGCTTATCGAC-1,1,40,6,6278,1893 +TGGTCGTGCAAGGCAA-1,1,41,7,6398,1962 +CACCACGCCACACAGA-1,1,40,8,6278,2031 +GAACCTCGACCTACAC-1,1,41,9,6398,2099 +CAATACGCTCTGAGGC-1,1,40,10,6278,2168 +TGGTAAGCAGGATTGA-1,1,41,11,6398,2237 +AGTGGCTCCGTCGGCC-1,1,40,12,6278,2306 +GATCGGATAGAACCAT-1,1,41,13,6398,2375 +GCTACAGTACGGACCG-1,1,40,14,6278,2444 +TCTATTACTAGAGGAT-1,1,41,15,6398,2512 +TTCAGGCGTCAAAGCC-1,1,40,16,6278,2581 +AGACCGGGAAACCCTG-1,1,41,17,6398,2650 +AGAGATCTCTAAAGCG-1,1,40,18,6278,2719 +CCCTGCCCAATCCGCT-1,1,41,19,6398,2788 +GTGGCGGTCCCAGCGT-1,1,40,20,6278,2857 +GCATTGTAATTCATAT-1,1,41,21,6398,2925 +CCGTTCCGAATCTCGG-1,1,40,22,6278,2994 +AGCTTGATCTTAACTT-1,1,41,23,6398,3063 +CCTGTACTCACGCCCA-1,1,40,24,6278,3132 +AAGTGACGACCGAATT-1,1,41,25,6398,3201 +CTCACTTGGCTGGTAA-1,1,40,26,6278,3270 +CGCCTGGCCTACGTAA-1,1,41,27,6398,3338 +CCCGTAAGTCTAGGCC-1,1,40,28,6278,3407 +TTGGACATGTGGCTTA-1,1,41,29,6398,3476 +ATTACGCGCTGGCAGG-1,1,40,30,6278,3545 +ACGCGCTACACAGGGT-1,1,41,31,6398,3614 +TACGTTTACCGGCAAT-1,1,40,32,6278,3682 +CGAAACGCAATTCATG-1,1,41,33,6398,3751 +TAGTCTAACAACGAGA-1,1,40,34,6278,3820 +TTGCATGCTGATCACG-1,1,41,35,6398,3889 +TCTGGGTAGCGCTCAT-1,1,40,36,6278,3958 +ACATCGGTCAGCCGCG-1,1,41,37,6398,4027 +AGATACCGGTGTTCAC-1,1,40,38,6278,4095 +GATTACTGAATTTGGG-1,1,41,39,6398,4164 +TCCAACTTTAAATTCT-1,1,40,40,6278,4233 +TCCTAGCAAAGAAGCT-1,1,41,41,6398,4302 +GTCTATCTGAGTTTCT-1,1,40,42,6278,4371 +GATGTTCAATCCACGA-1,1,41,43,6398,4440 +AGTTAAACACTTGCGA-1,1,40,44,6278,4508 +AGCTCTTTACTCAGTT-1,1,41,45,6398,4577 +ATCCAGGATTCGTGAA-1,1,40,46,6278,4646 +AGTCAACACCACCATC-1,1,41,47,6398,4715 +CGATACCTCGCGGACA-1,1,40,48,6278,4784 +TACAACGCACAACTCA-1,1,41,49,6398,4853 +AATTAAAGGTCGGCGT-1,1,40,50,6278,4921 +TACGCAGTTCTTTCCT-1,1,41,51,6398,4990 +GACCGTGCTGACGGTG-1,1,40,52,6278,5059 +GGCAAATTACTTTACT-1,1,41,53,6398,5128 +GGTACAAACATGCTAT-1,1,40,54,6278,5197 +CGGGCCTTCTTTGTAA-1,1,41,55,6398,5266 +CGTGAAGTTAATTCAC-1,1,40,56,6278,5334 +ATAGTGAAGCGTTCTC-1,1,41,57,6398,5403 +TACGCCATATTCTAAT-1,1,40,58,6278,5472 +GCCGGGTTAGGGTCGC-1,1,41,59,6398,5541 +TACATAGGCATACACC-1,1,40,60,6278,5610 +GCCGATTGGCCAAGCT-1,1,41,61,6398,5679 +CTGCCATGCATCACAT-1,1,40,62,6278,5747 +TTATGAATGAAAGGGA-1,1,41,63,6398,5816 +GCTGAGGCGTGAGTAT-1,1,40,64,6278,5885 +GCGCCGTTCCACGATA-1,1,41,65,6398,5954 +CGCATGGTGCGATGCT-1,1,40,66,6278,6023 +AGGTTTCACACACCTT-1,1,41,67,6398,6091 +CAAGGATCGCATGTTC-1,1,40,68,6278,6160 +ACGTTAATGTCGAAGA-1,1,41,69,6398,6229 +TCCAGAGCACCGGTTC-1,1,40,70,6278,6298 +GATTCGACGGTTCACG-1,1,41,71,6398,6367 +GTTTCTGCAGTCTCCC-1,1,40,72,6278,6436 +GCTGCACGGTTTCTTA-1,1,41,73,6398,6504 +CGTGCAGACTGGGACA-1,1,40,74,6278,6573 +GTGTTACTATGCGTCC-1,1,41,75,6398,6642 +TCCTCGGGCTGGGCTT-1,1,40,76,6278,6711 +GTGAGGACACTTAAGG-1,1,41,77,6398,6780 +ATACGCCGGCGAAACC-1,1,40,78,6278,6849 +TCTGCCAGAAACTGCA-1,1,41,79,6397,6917 +TTCTGCGGGTTAGCGG-1,1,40,80,6278,6986 +CTCGGTACCACTGCTC-1,1,41,81,6397,7055 +GTAAGTAACAGTCTGG-1,1,40,82,6278,7124 +GTGCGTGTATATGAGC-1,1,41,83,6397,7193 +ATTTGTCTTGGGAGCT-1,1,40,84,6278,7262 +CCTCGGACCGGGATAG-1,1,41,85,6397,7330 +TAGGTGCTCGCCTAGC-1,1,40,86,6278,7399 +CTTTAGGAACACTGTT-1,1,41,87,6397,7468 +TCGGGCCGTCGTGGTA-1,1,40,88,6278,7537 +AGTGCTTGCACGAATA-1,1,41,89,6397,7606 +TGCAGTTTCCTCCCAT-1,1,40,90,6278,7675 +TGAGAGATTTACCACG-1,1,41,91,6397,7743 +GAAACAGATGACCACC-1,1,40,92,6278,7812 +AGCAACATATCTTATT-1,1,41,93,6397,7881 +CAAGTGTGGTTGCAAA-1,1,40,94,6278,7950 +GCCTCATCTGGAAATA-1,1,41,95,6397,8019 +AACCCTACTGTCAATA-1,1,40,96,6278,8088 +ACGTATTACTCCGATC-1,1,41,97,6397,8156 +TCTGGGAACCTTTGAA-1,1,40,98,6278,8225 +GCTCGCTCATGTCCAA-1,1,41,99,6397,8294 +GCGCAAGAGCGCGCTG-1,1,40,100,6278,8363 +TTGACGCTCCATGAGC-1,1,41,101,6397,8432 +TATAGATGGTCGCAGT-1,1,40,102,6278,8501 +TTACATGCCACAACTA-1,1,41,103,6397,8569 +ACATGGCGCCAAAGTA-1,1,40,104,6278,8638 +TATGGTTAGTGGGAGA-1,1,41,105,6397,8707 +CATGACTTCGCTGAAT-1,1,40,106,6278,8776 +ACCACCAATGTAACAA-1,1,41,107,6397,8845 +TCTTAGAGCTCCAATT-1,1,40,108,6278,8913 +CCACGAATTTAACCTC-1,1,41,109,6397,8982 +TTCTTGCTAGCATCTC-1,1,40,110,6278,9051 +ACACCTTACTACTTGC-1,1,41,111,6397,9120 +AGTCGGTTGCGTGAGA-1,1,40,112,6278,9189 +ACCTACAGTATGTGGT-1,1,41,113,6397,9258 +GAGGATAAACAGTGCT-1,1,40,114,6278,9326 +TTCCGGTATCTGTGTC-1,0,41,115,6397,9395 +GGAGGCCGAAGTCGTC-1,0,40,116,6278,9464 +TTCGCTAGGAAGTTGT-1,0,41,117,6397,9533 +TAAAGACAACCCTTTA-1,0,40,118,6278,9602 +GTTGCGCTAACATTAC-1,0,41,119,6397,9671 +GCTGAACTCTCCAGGG-1,0,40,120,6278,9739 +AGCCCTGTCGCACCGT-1,0,41,121,6397,9808 +AGCGCTAGAGCGATGT-1,0,40,122,6278,9877 +TGCGCCGTTAATAACG-1,0,41,123,6397,9946 +TGACAACGCATGTCGC-1,0,40,124,6278,10015 +CGTCTTGAGTGTGACG-1,0,41,125,6397,10084 +GATAGGATTAATTACA-1,0,40,126,6278,10152 +GATACCGTGTCGGAGT-1,0,41,127,6397,10221 +TGTGTCGAAGTCGAGG-1,1,42,0,6517,1480 +GGATCAGAGCCATCAG-1,1,43,1,6637,1549 +GTCCCAATCATCCCGC-1,1,42,2,6517,1618 +TGCCACACTAGAGGAA-1,1,43,3,6637,1686 +TGAATTTCACTTGCCT-1,1,42,4,6517,1755 +CTCAGATTGTGATAAG-1,1,43,5,6637,1824 +CGGACGTTACTTGAAG-1,1,42,6,6517,1893 +CCGCCTTGCGATGTCG-1,1,43,7,6637,1962 +CCAGTCAAATCTCTTA-1,1,42,8,6517,2031 +AAACAGCTTTCAGAAG-1,1,43,9,6637,2099 +TAGCTGATGTGAAGCG-1,1,42,10,6517,2168 +CTTATGCGCTCAGGGC-1,1,43,11,6637,2237 +TGGCTCTTGTCGCGTA-1,1,42,12,6517,2306 +TTGTGAGGCATGACGC-1,1,43,13,6637,2375 +CATAAGCTCTCCGTCT-1,1,42,14,6517,2444 +CCTTCTCAGCGTTCCT-1,1,43,15,6637,2512 +TGCAGCTACGTACTTC-1,1,42,16,6517,2581 +CTCTACACTGGCGATT-1,1,43,17,6637,2650 +TGCAGATCGTCCTAGG-1,1,42,18,6517,2719 +TGCCAAAGTCAGACTT-1,1,43,19,6637,2788 +ACAATAGTCGTACGTT-1,1,42,20,6517,2857 +CATGCCAACTCGCAAA-1,1,43,21,6637,2925 +TGCAGAACTATATCGT-1,1,42,22,6517,2994 +TCGTGTCACGCTGACA-1,1,43,23,6637,3063 +TGATCAGGGAACTGCT-1,1,42,24,6517,3132 +CTTGCAACCGCCTCCT-1,1,43,25,6637,3201 +AGCCCATACATGTAAG-1,1,42,26,6517,3270 +ATCCAATGGAGGGTCC-1,1,43,27,6637,3338 +AAACCGGGTAGGTACC-1,1,42,28,6517,3407 +GCAACCACGGCCGCGT-1,1,43,29,6637,3476 +CGCTTATTCCCGGTCG-1,1,42,30,6517,3545 +TTACTCTGGTACGTAC-1,1,43,31,6637,3614 +GTGGTTTCCGCCTTTC-1,1,42,32,6517,3682 +ATAGGCGGCTATAGAA-1,1,43,33,6637,3751 +GTGCCATCACACGGTG-1,1,42,34,6517,3820 +CCCAACATACGTCGCG-1,1,43,35,6637,3889 +CGGTGCAGATAGAACG-1,1,42,36,6517,3958 +GGGCGGGTTCCCTACG-1,1,43,37,6637,4027 +TGAGCCATACAGTCTC-1,1,42,38,6517,4095 +CTCCGCCCACATGAGG-1,1,43,39,6637,4164 +GTTGAACCGGTTCCAT-1,1,42,40,6517,4233 +TTGACTACCATATGGT-1,1,43,41,6637,4302 +ACCATCGTATATGGTA-1,1,42,42,6517,4371 +TGCGTAAGAACCTGAT-1,1,43,43,6637,4440 +AGAAGGTTGCCGAATT-1,1,42,44,6517,4508 +AGGACGACCCATTAGA-1,1,43,45,6637,4577 +GGTGCTGGTACACATT-1,1,42,46,6517,4646 +GCGCTATGCCGAGGCA-1,1,43,47,6637,4715 +ACCCGGTTACACTTCC-1,1,42,48,6517,4784 +TAACTCATCCGCGCGG-1,1,43,49,6637,4853 +CACAATGAGCTGCTAT-1,1,42,50,6517,4921 +GTTACTTTGGGCCTAG-1,1,43,51,6637,4990 +GGGCCCGTCTTAAACA-1,1,42,52,6517,5059 +GAAATTGTCTCTATAA-1,1,43,53,6637,5128 +GGCGCATGAATTGATG-1,1,42,54,6517,5197 +CATATAGGTACAGTCA-1,1,43,55,6637,5266 +TCAACGAGGAGACAAA-1,1,42,56,6517,5334 +TTGCACAATTCAGAAA-1,1,43,57,6637,5403 +CATCGGACGGGTTAAT-1,1,42,58,6517,5472 +ATTAAACATGCGGACC-1,1,43,59,6637,5541 +TATCTACCACAGCGGG-1,1,42,60,6517,5610 +CGAGACCCTAGAGTGT-1,1,43,61,6637,5679 +ACATCGATCGTTTACC-1,1,42,62,6517,5747 +ATCGACCCAATACAGA-1,1,43,63,6637,5816 +GAATCTGAACATTCTC-1,1,42,64,6517,5885 +AGTTCCTATTTATGTT-1,1,43,65,6637,5954 +CAGTCTGTATACTGGG-1,1,42,66,6517,6023 +GGAGACGACACCTTTG-1,1,43,67,6637,6092 +CCTAAATTAACGGTTC-1,1,42,68,6517,6160 +GCTACGACTTATTGGG-1,1,43,69,6637,6229 +CTGTGCAGGGTAGGTC-1,1,42,70,6517,6298 +ACGCCGCTAGACGACC-1,1,43,71,6637,6367 +ACTTGACTCCCTCTTT-1,1,42,72,6517,6436 +CGCCTCCCTCCTCTAT-1,1,43,73,6637,6504 +CTAGATTTACGACGGC-1,1,42,74,6517,6573 +GATGCTGTATTTCATC-1,1,43,75,6637,6642 +TGCGTTTGTTGACACT-1,1,42,76,6517,6711 +CGTGCCCTCCCGAAGA-1,1,43,77,6637,6780 +ACTCTCTGACTTAGGT-1,1,42,78,6517,6849 +CTGGGTAGGCAGTTAA-1,1,43,79,6637,6917 +GTTTGGCCCAAGTTAT-1,1,42,80,6517,6986 +GAATGTGGTCCGGATT-1,1,43,81,6637,7055 +CCCAGTTAAGGCGCCG-1,1,42,82,6517,7124 +CGGTACTAGAATCAAA-1,1,43,83,6637,7193 +GCTTAATGTAACTAAC-1,1,42,84,6517,7262 +AGGACAGTCGAATCCC-1,1,43,85,6637,7330 +GACAGCCAGACCTGAC-1,1,42,86,6517,7399 +GGCGAAATCTAACTTG-1,1,43,87,6637,7468 +CTGGTAACACATAGAA-1,1,42,88,6517,7537 +TAGCCATTTCAAAGTC-1,1,43,89,6637,7606 +GGGATTTACCGCACCT-1,1,42,90,6517,7675 +ATGCCATTTGCGACCA-1,1,43,91,6637,7743 +GAATAGACGCGACCCA-1,1,42,92,6517,7812 +TGTATGGCGCAGACAG-1,1,43,93,6637,7881 +GGATGAAGATCGCTGA-1,1,42,94,6517,7950 +CGACAATTTGATCTAA-1,1,43,95,6637,8019 +AAAGTTGACTCCCGTA-1,1,42,96,6517,8088 +CGCGGCTCAACTTGAA-1,1,43,97,6637,8156 +CACGCGGAACTGTTGC-1,1,42,98,6517,8225 +TCTTAGAGTGAACTCT-1,1,43,99,6637,8294 +AGTCCATTGGCTGATG-1,1,42,100,6517,8363 +TTAAGATAGGATTGAC-1,1,43,101,6637,8432 +ACATCCTGGTAACTGT-1,1,42,102,6517,8501 +CACCTTGGCGCCTTTG-1,1,43,103,6637,8569 +GCTAGACCGTCTACTG-1,1,42,104,6517,8638 +CGGCCCAGGTATATCC-1,1,43,105,6637,8707 +GTCCATTACTGCTACG-1,1,42,106,6517,8776 +GGGTTTAGGATAGGAT-1,1,43,107,6637,8845 +TAATTAGGACATCCGT-1,1,42,108,6517,8913 +GCTCCCAGTCGGTCCA-1,1,43,109,6637,8982 +ATTCGTGCTATCTCTT-1,1,42,110,6517,9051 +GTTAACTATGTTGTCA-1,1,43,111,6637,9120 +GCTCCGCTCGCTTCAG-1,1,42,112,6517,9189 +GCAACGGCTAGTTATG-1,1,43,113,6637,9258 +AATCGCGCAGAGGACT-1,1,42,114,6517,9326 +AGGTTACACCATGCCG-1,1,43,115,6637,9395 +CGAGATTTCGCTCGGG-1,0,42,116,6517,9464 +CGATAATACTCAGGTT-1,0,43,117,6637,9533 +AAGGCAGGCTGTCTCC-1,0,42,118,6517,9602 +GTAAGTCCACACTCTA-1,0,43,119,6637,9671 +ATGAGGGCAGCGGCTA-1,0,42,120,6517,9739 +GCCGCACTCCGTTTCA-1,0,43,121,6637,9808 +GAGCACGGCGCCTCTT-1,0,42,122,6517,9877 +ACAATTTGGCCATATT-1,0,43,123,6637,9946 +CTGGTTCGCGAGCTAC-1,0,42,124,6517,10015 +GACGGTCCTAGGGTGT-1,0,43,125,6637,10084 +ACTCGCGATCTGACGC-1,0,42,126,6517,10152 +GTGTACGAACCGTTCC-1,0,43,127,6637,10221 +CTTTGACGTCGCTTCT-1,1,44,0,6757,1480 +CGTTATCATACTTCCA-1,1,45,1,6877,1549 +GCTATGCCAGCTTATG-1,1,44,2,6757,1618 +CAGTCGGCCTAGATAT-1,1,45,3,6877,1686 +CCCGTGAGGGCGGTGA-1,1,44,4,6757,1755 +TCTCGTGTTACGAGGA-1,1,45,5,6877,1824 +ACGTCTCGTTCCGGGA-1,1,44,6,6757,1893 +CGAGAGCGCGTAGATA-1,1,45,7,6877,1962 +GACAGATTTCTGGCTC-1,1,44,8,6757,2031 +GGGCCTAAATGGGCTA-1,1,45,9,6877,2099 +ACTTGTAGTCCCTTCA-1,1,44,10,6757,2168 +CCCGAAGTTTCGCGAA-1,1,45,11,6877,2237 +ACCATCCGCCAACTAG-1,1,44,12,6757,2306 +TGCGAATATGGGATTT-1,1,45,13,6877,2375 +TACATCCCTATCCCTG-1,1,44,14,6757,2444 +GTGGGAAGACTGAATC-1,1,45,15,6877,2512 +TCAACATCGACCGAGA-1,1,44,16,6757,2581 +CTATGTGAGTCACGGC-1,1,45,17,6877,2650 +CCGAACACTGGGCCTC-1,1,44,18,6757,2719 +AAACTTGCAAACGTAT-1,1,45,19,6877,2788 +AGGGCGAGCAGCTGAT-1,1,44,20,6757,2857 +AACACGAGACGCGGCC-1,1,45,21,6877,2925 +TGACGAATATTTCCCT-1,1,44,22,6757,2994 +TCGGAGAGTATCGGGA-1,1,45,23,6877,3063 +CAAATCTCTCACAAGG-1,1,44,24,6757,3132 +AGGCCCTAGAACGCCA-1,1,45,25,6877,3201 +TAGAGATCATGCAACT-1,1,44,26,6757,3270 +TTGTTTCCATACAACT-1,1,45,27,6877,3338 +GAGAGGTGCATTCTGG-1,1,44,28,6757,3407 +GTGGACCAACCCGATT-1,1,45,29,6877,3476 +CTGGGCCTGCTATATC-1,1,44,30,6757,3545 +CATAGTCCACAAGAAC-1,1,45,31,6877,3614 +TTGACATGAACGTGGA-1,1,44,32,6757,3682 +GGTTACCACCCTCGGG-1,1,45,33,6877,3751 +TACCGGTCGTTTCCAT-1,1,44,34,6757,3820 +CGAGTACTAAAGAGGA-1,1,45,35,6877,3889 +GCAAGAATTCCTTGGC-1,1,44,36,6757,3958 +TCGCCGAAGTTGCGTC-1,1,45,37,6877,4027 +TTGAGAGTACTGCTAA-1,1,44,38,6757,4095 +GCCACAATTTAAGGAC-1,1,45,39,6877,4164 +ATATTCAGTTAAACCT-1,1,44,40,6757,4233 +TGAGTGCCTCTTAAAT-1,1,45,41,6877,4302 +ATCAGACGGCACGCCG-1,1,44,42,6757,4371 +GTGCGAAATCGAACAC-1,1,45,43,6877,4440 +GTGCCGCTTCAAAGGT-1,1,44,44,6757,4508 +GATACGATGGGAGTCA-1,1,45,45,6877,4577 +GACACTGAGTTCAGTG-1,1,44,46,6757,4646 +ATCCTGCGTGGAATGG-1,1,45,47,6877,4715 +ATCCTACCTAAGCTCT-1,1,44,48,6757,4784 +AGTGATATGAGTAGTT-1,1,45,49,6877,4853 +ATGATGCAATGGTACA-1,1,44,50,6757,4921 +GAAACCGAATTACCTT-1,1,45,51,6877,4990 +AGTGACCTACTTTACG-1,1,44,52,6757,5059 +CAAATGTCCTTCCGTG-1,1,45,53,6877,5128 +TTACTGGGATATTTCA-1,1,44,54,6757,5197 +CTTGCCCAGGCTCTAC-1,1,45,55,6877,5266 +AAATCGTGTACCACAA-1,1,44,56,6757,5334 +GTGATCATAGATCTGC-1,1,45,57,6877,5403 +TGGCAGATTACGATCA-1,1,44,58,6757,5472 +TCACCCTCTTAAGATT-1,1,45,59,6877,5541 +CAGGATATATCGTTGT-1,1,44,60,6757,5610 +CCTGACCACCGATGGT-1,1,45,61,6877,5679 +CTAAAGGGAAATAGGA-1,1,44,62,6757,5747 +CCGCTATCAGCACCAG-1,1,45,63,6877,5816 +CTTTAGTGCTATTATT-1,1,44,64,6757,5885 +CGGGAATTTATGTAAA-1,1,45,65,6877,5954 +TACGACTGCCTCTTAG-1,1,44,66,6757,6023 +AAACTGCTGGCTCCAA-1,1,45,67,6877,6092 +GTACGTTTGCCCGTCA-1,1,44,68,6757,6160 +GGCAAGGCGAAATAGC-1,1,45,69,6877,6229 +GATCTTGGAGGGCATA-1,1,44,70,6757,6298 +AGCGTGGTATTCTACT-1,1,45,71,6877,6367 +CTAAGGGAATGATTGG-1,1,44,72,6757,6436 +CATGGTAAGTAGCGTT-1,1,45,73,6877,6504 +CGTTGAGCGACCGTCG-1,1,44,74,6757,6573 +TGCCCGTACCGTTAAA-1,1,45,75,6877,6642 +ACAAGGGCAGGCTCTG-1,1,44,76,6757,6711 +GAGATCTTCCATGACA-1,1,45,77,6877,6780 +AATGACGTAGGATGTC-1,1,44,78,6757,6849 +GTGGTGGCCAAGTGAA-1,1,45,79,6877,6917 +TCCCGTGTGCAATTTG-1,1,44,80,6757,6986 +ACATCGTATGCAATGG-1,1,45,81,6877,7055 +GCGAAACTTAACTGGA-1,1,44,82,6757,7124 +AATTGAACGCTCTGGT-1,1,45,83,6877,7193 +ACAAATGGTAGTGTTT-1,1,44,84,6757,7262 +ATGGTCGCGTGGTTTC-1,1,45,85,6877,7330 +TGTTATTGTATGTGGC-1,1,44,86,6757,7399 +TTCCGGTTACCCACTT-1,1,45,87,6877,7468 +GAGTGTGCGGTACCCA-1,1,44,88,6757,7537 +CAAGATATTATAACGT-1,1,45,89,6877,7606 +ACACACCAGGACCAGT-1,1,44,90,6757,7675 +ATGGGCCTCGGCCTCT-1,1,45,91,6877,7743 +AAGGTGATAAACCAGC-1,1,44,92,6757,7812 +TCTTACTTATGCCTCT-1,1,45,93,6877,7881 +AAAGTGTGATTTATCT-1,1,44,94,6757,7950 +TGCTCCACAGTTCTTA-1,1,45,95,6877,8019 +CTGGCTGATTCATCCT-1,1,44,96,6757,8088 +TAAGGCTGAATCCCTC-1,1,45,97,6877,8156 +TCTAGTGATATCGTGG-1,1,44,98,6757,8225 +TCGAAGAACCGAGCAC-1,1,45,99,6876,8294 +GACAAACATATGCAGG-1,1,44,100,6757,8363 +AAGTCAATTGTCGTCA-1,1,45,101,6876,8432 +AGTGAACAAACTTCTC-1,1,44,102,6757,8501 +CATGATGGAAGTTAGC-1,1,45,103,6876,8569 +AAGTGCCTTGACTGTA-1,1,44,104,6757,8638 +ATCGCCAGTCAACATT-1,1,45,105,6876,8707 +ACCGCGGTGGAAGTCG-1,1,44,106,6757,8776 +TCTTCTATAACCCGCC-1,1,45,107,6876,8845 +CACATTTCTTGTCAGA-1,1,44,108,6757,8914 +TAGCGTCCCTCGATTG-1,1,45,109,6876,8982 +GTTCGGATCGGGAACA-1,1,44,110,6757,9051 +CAAACTCGCGACGCCG-1,1,45,111,6876,9120 +GTCTTGTAGCTATTCA-1,1,44,112,6757,9189 +TCTCGACGTATCGCCG-1,1,45,113,6876,9258 +TTGCCAAGCAGAACCC-1,1,44,114,6757,9326 +AAACCCGAACGAAATC-1,0,45,115,6876,9395 +TTGAGCAGCCCACGGT-1,0,44,116,6757,9464 +CGCCTTTAGCATGCTC-1,0,45,117,6876,9533 +TGTGGCTCCCACCAAC-1,0,44,118,6757,9602 +CCGCCGTTGAGGATAA-1,0,45,119,6876,9671 +CAATACGAGAGTCTGA-1,0,44,120,6757,9739 +CATCTAGTGAAGGGAA-1,0,45,121,6876,9808 +GGTGGAGGTTGATACG-1,0,44,122,6757,9877 +CCGCACACGAACGTGT-1,0,45,123,6876,9946 +AGAACCCAGCGTGACA-1,0,44,124,6757,10015 +GCGCTCGATCACCTGT-1,0,45,125,6876,10084 +ATCATGGACTACCGAC-1,0,44,126,6757,10152 +TACGCCGCCTCAGAAG-1,0,45,127,6876,10221 +CGACCTACTAGACAAT-1,1,46,0,6997,1480 +GAGTCTTGTAAAGGAC-1,1,47,1,7116,1549 +AATATCCTAGCAAACT-1,1,46,2,6997,1618 +CCCTAGGCAACAAGAG-1,1,47,3,7116,1686 +ACAAAGAAGGTAGGCC-1,1,46,4,6997,1755 +CCCTGGCTGTTCCTTC-1,1,47,5,7116,1824 +TCGCCGCACCGCGTGA-1,1,46,6,6996,1893 +TATAGCGCACGTTATC-1,1,47,7,7116,1962 +TTATCTGACATTAGGA-1,1,46,8,6996,2031 +AGTGGTGTTACCCGTG-1,1,47,9,7116,2099 +GCCAAGAATACTTCTG-1,1,46,10,6996,2168 +CCGGCGTGAGACTCTG-1,1,47,11,7116,2237 +TTCCCGGCGCCAATAG-1,1,46,12,6996,2306 +AAACAGGGTCTATATT-1,1,47,13,7116,2375 +ACAGTAATACAACTTG-1,1,46,14,6996,2444 +CGAACGGCCGGACAAC-1,1,47,15,7116,2512 +GCAACACACTAGAACT-1,1,46,16,6996,2581 +ACTCCCATTCCTAAAG-1,1,47,17,7116,2650 +ACCTGCGTGTCATGTT-1,1,46,18,6996,2719 +TACTTTCCGCACGCCA-1,1,47,19,7116,2788 +AGGTCAGGTGAGAGTG-1,1,46,20,6996,2857 +TCCTCCTAAGACATTC-1,1,47,21,7116,2925 +ATGTGAAAGCCTAATG-1,1,46,22,6996,2994 +AGTCGGCTCAACTTTA-1,1,47,23,7116,3063 +CGATCTGTTGGAGGAC-1,1,46,24,6996,3132 +ACGGGAGTGTCGGCCC-1,1,47,25,7116,3201 +TTAACTTCAGGTAGGA-1,1,46,26,6996,3270 +CCACGGAGCCATAAGA-1,1,47,27,7116,3338 +CTTCTATGTTGAAGTA-1,1,46,28,6996,3407 +CACCGTTGCGCGATAT-1,1,47,29,7116,3476 +TCTAGCAATCTCCGCC-1,1,46,30,6996,3545 +AGTTTGGCCAGACCTA-1,1,47,31,7116,3614 +TTGTAAGGACCTAAGT-1,1,46,32,6996,3683 +AAATTTGCGGGTGTGG-1,1,47,33,7116,3751 +AAGTTCGGCCAACAGG-1,1,46,34,6996,3820 +CCGCTTACCTCACTCT-1,1,47,35,7116,3889 +ATCACGTGCTAATTAA-1,1,46,36,6996,3958 +GGTGAAGTACAGGGAT-1,1,47,37,7116,4027 +GCTGTATTACTGGCCC-1,1,46,38,6996,4095 +AACGGCCATCTCCGGT-1,1,47,39,7116,4164 +TAAGTAACATCTTGAC-1,1,46,40,6996,4233 +TTCTTGAGCCGCGCTA-1,1,47,41,7116,4302 +AGTGCGTAGCTCGTAA-1,1,46,42,6996,4371 +GGGATGGTCGTAACCG-1,1,47,43,7116,4440 +GTCTGGGCGGTCGAGA-1,1,46,44,6996,4508 +CGGAACGTAAACATAG-1,1,47,45,7116,4577 +TGCGACACCCTAGTGC-1,1,46,46,6996,4646 +CAAACGAGTATCGCAG-1,1,47,47,7116,4715 +TCAGTAGGGACTATAA-1,1,46,48,6996,4784 +GCGGTTCCCTATCATG-1,1,47,49,7116,4853 +GTGACTTCAGTAGTGC-1,1,46,50,6996,4921 +CGTCACGTCCATTGGT-1,1,47,51,7116,4990 +ATAAGTTACCGCGACG-1,1,46,52,6996,5059 +CTGAATCCGAGACCTC-1,1,47,53,7116,5128 +TACGACGCTTGCTGCG-1,1,46,54,6996,5197 +GAATTCACCCGGGTGT-1,1,47,55,7116,5266 +GGGTGACACCTTAACT-1,1,46,56,6996,5334 +TGAGTAAATTAGCGTA-1,1,47,57,7116,5403 +GAGTCCGCTTACCGGA-1,1,46,58,6996,5472 +GGCGCGTTCGAGTTTA-1,1,47,59,7116,5541 +ATTCATATACTGTCCA-1,1,46,60,6996,5610 +ATAAACGGACCCGTAA-1,1,47,61,7116,5679 +GTCGTACCATCTCGGG-1,1,46,62,6996,5747 +ATAATAGCTGTTGAAT-1,1,47,63,7116,5816 +TTCCGCGTGAGGCGAT-1,1,46,64,6996,5885 +TACCGGCTCACTGCCC-1,1,47,65,7116,5954 +GTATCTTTCATAACCA-1,1,46,66,6996,6023 +GTTACCTACAACTTGC-1,1,47,67,7116,6092 +TGACTATAATCCTTTC-1,1,46,68,6996,6160 +AAATACCTATAAGCAT-1,1,47,69,7116,6229 +TTATTAGAGCGTGTTC-1,1,46,70,6996,6298 +ATGTGGACATCTTGAT-1,1,47,71,7116,6367 +GTACGCTTCATTGCAC-1,1,46,72,6996,6436 +CACATATTAGCAGGAT-1,1,47,73,7116,6504 +CAAGAGGGCGGAGTAC-1,1,46,74,6996,6573 +TCGCAAAGATGCATTT-1,1,47,75,7116,6642 +GTCGTTATTCGCTTAT-1,1,46,76,6996,6711 +TCGTGTACTATGGATG-1,1,47,77,7116,6780 +GCGGAGAGGGAGAACG-1,1,46,78,6996,6849 +TCACAGGGAATCGCAA-1,1,47,79,7116,6917 +GACTGCACCAGCCCAG-1,1,46,80,6996,6986 +TCCGCTGTCATCCCGG-1,1,47,81,7116,7055 +AGATACTCAAGATCGA-1,1,46,82,6996,7124 +ACTGAATGGCGAAAGT-1,1,47,83,7116,7193 +TCCTACATCCACGGCC-1,1,46,84,6996,7262 +TTCAGCCCTGGTCCAC-1,1,47,85,7116,7330 +TTAGAGTTTAGAAGGA-1,1,46,86,6996,7399 +GGTTAGCTATATGTCT-1,1,47,87,7116,7468 +CTGGTTTCGAGCAAGA-1,1,46,88,6996,7537 +TGGGCCCATACTAATT-1,1,47,89,7116,7606 +ACTTATTTATGTGCCA-1,1,46,90,6996,7675 +TTAGTTATTCGTGGCA-1,1,47,91,7116,7743 +AACCGCTAAGGGATGC-1,1,46,92,6996,7812 +ATACGTCCACTCCTGT-1,1,47,93,7116,7881 +CGACACGCTCCGACAG-1,1,46,94,6996,7950 +TCTGAACTCGTACCCG-1,1,47,95,7116,8019 +AGGATATAGGGATTTA-1,1,46,96,6996,8088 +GTGATCACTAACGCCT-1,1,47,97,7116,8156 +ACCGGGCCTTTGTTGA-1,1,46,98,6996,8225 +TTGACAGGAGCTCCCG-1,1,47,99,7116,8294 +CTCTTCTATTGACTGG-1,1,46,100,6996,8363 +CGTGGCCGAATATCTA-1,1,47,101,7116,8432 +GGTTTAGCCTTTCTTG-1,1,46,102,6996,8501 +TCAAGGTTACTACACC-1,1,47,103,7116,8569 +TTGACTATTGTCCGGC-1,1,46,104,6996,8638 +CGGGAATATAGTATAC-1,1,47,105,7116,8707 +GCAACAGCAGTATGCG-1,1,46,106,6996,8776 +ATCAAACACTGTTCCA-1,1,47,107,7116,8845 +TGGGCAATAGTTGGGT-1,1,46,108,6996,8914 +TGAATGTCAGCCGGCC-1,1,47,109,7116,8982 +CGGCTCTAAAGCTGCA-1,1,46,110,6996,9051 +GGACACAAGTTTACAC-1,1,47,111,7116,9120 +CCGAGAAGTCGCATAA-1,1,46,112,6996,9189 +AACTACCCGTTTGTCA-1,1,47,113,7116,9258 +GCACAAACGAGGCGTG-1,1,46,114,6996,9326 +CACACAGCTTGCGCTC-1,0,47,115,7116,9395 +GTGCTTACATCAGCGC-1,0,46,116,6996,9464 +GCAAACGTCGCCAGGT-1,0,47,117,7116,9533 +GAATAGCATTTAGGGT-1,0,46,118,6996,9602 +TACTGTTTCTCTGGTA-1,0,47,119,7116,9671 +TCCTATCATAGGTAAC-1,0,46,120,6996,9739 +TTCGGTGGAGACGCCC-1,0,47,121,7116,9808 +TGTTGCCGTCGTCCCA-1,0,46,122,6996,9877 +CCAACTTGATAGATCC-1,0,47,123,7116,9946 +CAAAGGTCATCTGAAA-1,0,46,124,6996,10015 +CTAGCTTAATGGTCCC-1,0,47,125,7116,10084 +AGGCCACATTGGTTAC-1,0,46,126,6996,10152 +TTAGGATGGGAGGGTA-1,0,47,127,7116,10221 +TATGACCTTGCGCTGG-1,1,48,0,7236,1480 +ATATACATGTATGGTA-1,1,49,1,7356,1549 +TGTGTGACCATGAATC-1,1,48,2,7236,1618 +CCCACTCCACGGTATC-1,1,49,3,7356,1686 +GGGCAGACGTCACTGC-1,1,48,4,7236,1755 +TCAAAGAGCTATCTGT-1,1,49,5,7356,1824 +AGATGCATCCTGTGTC-1,1,48,6,7236,1893 +GTGAAGTCACGACTCG-1,1,49,7,7356,1962 +TGATTCAGGTCCCGCG-1,1,48,8,7236,2031 +CGCCACAGGTCGCGAT-1,1,49,9,7356,2099 +TTGAATCGTTGTATAA-1,1,48,10,7236,2168 +TGGCCAATTTGGTACT-1,1,49,11,7356,2237 +CGACCCTTAACGCCGG-1,1,48,12,7236,2306 +TCGGCGTACTGCACAA-1,1,49,13,7356,2375 +GAGTAAGGCCACGGGA-1,1,48,14,7236,2444 +ATCAGCTCGTCCACTA-1,1,49,15,7356,2512 +AGGATCACGCGATCTG-1,1,48,16,7236,2581 +AAATGGCCCGTGCCCT-1,1,49,17,7356,2650 +CAGTACCAGTTTACGT-1,1,48,18,7236,2719 +GGTCGTAAGCTCGCAC-1,1,49,19,7356,2788 +CGTTCATGGTGCGCGT-1,1,48,20,7236,2857 +GACTACAAAGCGGTGG-1,1,49,21,7356,2925 +CAGCTGGCGTAACCGT-1,1,48,22,7236,2994 +ACTCGTAACCCGTCCT-1,1,49,23,7356,3063 +CATATGTCAGGCTACG-1,1,48,24,7236,3132 +GCCCGACTTCTTCCCG-1,1,49,25,7356,3201 +CTGGCATCCGAATGAG-1,1,48,26,7236,3270 +AAGTGCGTTAGAATCT-1,1,49,27,7356,3338 +AGAAGTGATTCGTGAT-1,1,48,28,7236,3407 +TACCTTAAGATTTCCC-1,1,49,29,7356,3476 +AATGACAGCAATGTCT-1,1,48,30,7236,3545 +TCAACGCAGGAAATAA-1,1,49,31,7356,3614 +TATTCCTCCGCCCACT-1,1,48,32,7236,3683 +ATCAAACGAAGGTTTG-1,1,49,33,7356,3751 +TTGATTAGCTGTTTCT-1,1,48,34,7236,3820 +CTGCTGAGGCCACGAA-1,1,49,35,7356,3889 +CCGTGTTAAATTCCAT-1,1,48,36,7236,3958 +CACGTCGGCAACCTCT-1,1,49,37,7356,4027 +GTATTCTGAGAAACGA-1,1,48,38,7236,4095 +CGGTGCGCGTTGGTCC-1,1,49,39,7356,4164 +GTGATTCGCCGCTCAA-1,1,48,40,7236,4233 +GCCCGCGCGTAAACGG-1,1,49,41,7356,4302 +AACGTACTGTGGGTAC-1,1,48,42,7236,4371 +GAGTATGCCCGCCTTG-1,1,49,43,7356,4440 +TGATTCTGTCGCCGGT-1,1,48,44,7236,4508 +GGGCGGCAAATGAATT-1,1,49,45,7356,4577 +TTCCAATCTGGCTATC-1,1,48,46,7236,4646 +GGAACCGTGTAAATTG-1,1,49,47,7356,4715 +TTGGTCACACTCGTAA-1,1,48,48,7236,4784 +CGAACCCGCATGCGTC-1,1,49,49,7356,4853 +GGGCGTCACCACGTAA-1,1,48,50,7236,4921 +TACCAGAAGTAGGTTC-1,1,49,51,7356,4990 +TTGGATATCGTCTACG-1,1,48,52,7236,5059 +TAGATATGGACTGGAA-1,1,49,53,7356,5128 +GCGACGATAGTTGTAC-1,1,48,54,7236,5197 +CTGGATTTACACTTGA-1,1,49,55,7356,5266 +GTTATATTATCTCCCT-1,1,48,56,7236,5334 +TATTCCACTCAGCTCG-1,1,49,57,7356,5403 +CTGTTACCCAATCTAG-1,1,48,58,7236,5472 +ACGCGAAGTCAGACGA-1,1,49,59,7356,5541 +GATAGGTAACGTTGAC-1,1,48,60,7236,5610 +TGTTCGTATTGCGGTG-1,1,49,61,7356,5679 +GGTCAGTGGGTCCCAC-1,1,48,62,7236,5747 +AATTCTAGAGTTAGGC-1,1,49,63,7356,5816 +GTTTACGTTCCATCTG-1,1,48,64,7236,5885 +AGACCCACCGCTGATC-1,1,49,65,7356,5954 +TCTAGCATGCCCAGAA-1,1,48,66,7236,6023 +CCCGCAGCGCGAACTA-1,1,49,67,7356,6092 +CTCTATTTGGCTGCAG-1,1,48,68,7236,6160 +TTCTGCCGCGCCTAGA-1,1,49,69,7356,6229 +ACTCCCTAGAATAGTA-1,1,48,70,7236,6298 +CCGAACCTTCCCGGCC-1,1,49,71,7356,6367 +TCAGACGCTATAGAAG-1,1,48,72,7236,6436 +CAGGCGCCATGCTAGG-1,1,49,73,7356,6505 +CACTCGAGCTGAACAA-1,1,48,74,7236,6573 +ACAAGGAAATCCGCCC-1,1,49,75,7356,6642 +ACCACGTGCAGCTATA-1,1,48,76,7236,6711 +ACGGCGACGATGGGAA-1,1,49,77,7356,6780 +TTACTAAAGGACTTTA-1,1,48,78,7236,6849 +GGCTGAAATAGCAAAG-1,1,49,79,7356,6917 +TTAGACGAGTCACCTC-1,1,48,80,7236,6986 +GTAGTCGCGGGAATCA-1,1,49,81,7356,7055 +GCAAACCCTACATTAT-1,1,48,82,7236,7124 +GTTAAAGTAGGACTGG-1,1,49,83,7356,7193 +ACCCTCCCTTGCTATT-1,1,48,84,7236,7262 +CATGTCTCATTTATGG-1,1,49,85,7356,7330 +AATAGAATCTGTTTCA-1,1,48,86,7236,7399 +TCTCATGAGATAGGGT-1,1,49,87,7356,7468 +ATGACTATGCGACATT-1,1,48,88,7236,7537 +CCTAACCCAAACAAGT-1,1,49,89,7356,7606 +AGTCAAGATGACACTT-1,1,48,90,7236,7675 +CGGGAGCTTCAGTGTA-1,1,49,91,7356,7743 +CCACAGTACCCATCCT-1,1,48,92,7236,7812 +GAGCGCGCACGAGTAG-1,1,49,93,7356,7881 +ACCAGTGCGGGAGACG-1,1,48,94,7236,7950 +TCCTTACGACGGTCCG-1,1,49,95,7356,8019 +TAGTCGATCACGGGTT-1,1,48,96,7236,8088 +AGACGAAGTGCCGGTC-1,1,49,97,7356,8156 +CGCTGGTGACTACCCT-1,1,48,98,7236,8225 +AGGCATTGTCGTAGGG-1,1,49,99,7356,8294 +TGGTAGAATATATGGG-1,1,48,100,7236,8363 +TTCTTATCCGCTGGGT-1,1,49,101,7356,8432 +AGTTTGGCACGGGTTG-1,1,48,102,7236,8501 +GCATCGGCCGTGTAGG-1,1,49,103,7356,8569 +ATGCGAGTCCCACCAC-1,1,48,104,7236,8638 +TCGGCGAACCCAAACC-1,1,49,105,7356,8707 +AGAGTAAACTTCACTA-1,1,48,106,7236,8776 +AAGCCGAAGCGGTTTA-1,1,49,107,7356,8845 +CCCGAGTTTCTCCGTA-1,1,48,108,7236,8914 +AATATCGAATCAATGC-1,1,49,109,7356,8982 +GCGCCTCCCACTCCGA-1,1,48,110,7236,9051 +CGTTAAACTAGTTAGG-1,1,49,111,7356,9120 +TGAGTTAAAGACATTC-1,1,48,112,7236,9189 +AACAGGTAGTATGGAT-1,1,49,113,7356,9258 +GAACGCGGGTCACACG-1,1,48,114,7236,9326 +TGTTTGAGATCGTCAG-1,1,49,115,7356,9395 +ATCTCGTGAGCGAAAC-1,0,48,116,7236,9464 +CTGAGAAAGTTCGGCG-1,0,49,117,7356,9533 +ATTACCACACTGCCTG-1,0,48,118,7236,9602 +CTGCTGTCTAACGAGC-1,0,49,119,7355,9671 +CGTGGAAGCCTCGTAC-1,0,48,120,7236,9739 +GGACTCACAAATTAGG-1,0,49,121,7355,9808 +CTTTGCTGTCATGGAT-1,0,48,122,7236,9877 +GGTGTTGGGCGTCTTA-1,0,49,123,7355,9946 +TACCATGTATTGATTT-1,0,48,124,7236,10015 +GGTCTCCAAGTAGTGC-1,0,49,125,7355,10084 +ATCCTTCTGAAAGAAC-1,0,48,126,7236,10152 +CCGGAAGTTATCAGTC-1,0,49,127,7355,10221 +TTAGAGGGATATACAG-1,1,50,0,7476,1480 +TTGTACACCTCGAACA-1,1,51,1,7595,1549 +GTGGGTACTGAGCGTA-1,1,50,2,7476,1618 +CTTAAGCAGCGAGCCG-1,1,51,3,7595,1686 +GCATTGACTTGCGGAA-1,1,50,4,7476,1755 +CCATAACCTGTGCAGT-1,1,51,5,7595,1824 +GGGCTACTATTTCGTG-1,1,50,6,7476,1893 +GGCGAGCGAAACGGCA-1,1,51,7,7595,1962 +GGAGACCATCTACATA-1,1,50,8,7476,2031 +AGACCAAACCACACCT-1,1,51,9,7595,2099 +CGACGCATCCGTACCT-1,1,50,10,7476,2168 +CCTAGGTAAAGGTAGC-1,1,51,11,7595,2237 +AGCGGCGGTTAGCGGT-1,1,50,12,7476,2306 +CTGGACGCAGTCCGGC-1,1,51,13,7595,2375 +AGCCTAATACCCACGT-1,1,50,14,7476,2444 +AATCTGGCTTTCTAGT-1,1,51,15,7595,2512 +CACCCTTGGTGAGACC-1,1,50,16,7476,2581 +GGATCTTGACTCAACC-1,1,51,17,7595,2650 +ACGAGGATACCACTCT-1,1,50,18,7476,2719 +GAGTTGATGGCAATTT-1,1,51,19,7595,2788 +GTGGCAAACAGCGGCA-1,1,50,20,7476,2857 +GATGTAACGAACCACC-1,1,51,21,7595,2925 +AGCCGTGGCTAAATGT-1,1,50,22,7476,2994 +CTCCCTCCTTTCGATC-1,1,51,23,7595,3063 +TTGGAAGAATACAGTC-1,1,50,24,7476,3132 +AGTTAAGTCAACCGCT-1,1,51,25,7595,3201 +CTCATGGTAATTTGCG-1,1,50,26,7475,3270 +AAAGTAGCATTGCTCA-1,1,51,27,7595,3338 +TTGTGGTAGGAGGGAT-1,1,50,28,7475,3407 +AGTCGTGGGCATTACG-1,1,51,29,7595,3476 +ACCTAAGTACCTTTCA-1,1,50,30,7475,3545 +GTAGAGGGAGACAAGT-1,1,51,31,7595,3614 +GATCCTCGACACTGGC-1,1,50,32,7475,3683 +CCTACATTCACAGACG-1,1,51,33,7595,3751 +TTGACCGTGTTAATGA-1,1,50,34,7475,3820 +TCTGTTACCCAGCATA-1,1,51,35,7595,3889 +CTAACTGGTCCGGTTC-1,1,50,36,7475,3958 +AGCGACAGGAACGGTC-1,1,51,37,7595,4027 +TAATAGAACAGAGTTA-1,1,50,38,7475,4095 +ACAGGTGGAGGTGAGG-1,1,51,39,7595,4164 +TGCGAGAATATTACCC-1,1,50,40,7475,4233 +TTGCGTCGGCCAACCG-1,1,51,41,7595,4302 +AGGCTTCCCGAAGAAG-1,1,50,42,7475,4371 +GCGGACCGCGTTGTGG-1,1,51,43,7595,4440 +GTAATCTGATTCTTCG-1,1,50,44,7475,4508 +CCGCGGAATGCGTCAC-1,1,51,45,7595,4577 +TTCCACACAGATTTGA-1,1,50,46,7475,4646 +CTTCTATTAATGCTAG-1,1,51,47,7595,4715 +CATTTGAGTGGTACGT-1,1,50,48,7475,4784 +TCACAGCAAACTCGAA-1,1,51,49,7595,4853 +CAGACGAACCTGATAC-1,1,50,50,7475,4921 +TAGCTAGAAGGCATGA-1,1,51,51,7595,4990 +ATCCAGAGCAACAACC-1,1,50,52,7475,5059 +TCCGGTTCGTCCGGTC-1,1,51,53,7595,5128 +CGCGCATGTTTGATTG-1,1,50,54,7475,5197 +TGGCGATCAAGTTATG-1,1,51,55,7595,5266 +CCCTTTGACAGGTCTT-1,1,50,56,7475,5334 +CAGAGACGGTCACCCA-1,1,51,57,7595,5403 +TAGCTCGCCTGATAAC-1,1,50,58,7475,5472 +TTGTGTTTCCCGAAAG-1,1,51,59,7595,5541 +TATACACAGACGCCTT-1,1,50,60,7475,5610 +ACATTAGTTTATATCC-1,1,51,61,7595,5679 +CCATCGCAGTTAAACT-1,1,50,62,7475,5747 +AATTAGCGCTGCAGCG-1,1,51,63,7595,5816 +TCCGCTTATCCCATTA-1,1,50,64,7475,5885 +GTTTGGGCTTGTGAGC-1,1,51,65,7595,5954 +CTTGTCAACATTCGAG-1,1,50,66,7475,6023 +GGACCAACAGGATAAC-1,1,51,67,7595,6092 +AAGCTAGATCGAGTAA-1,1,50,68,7475,6160 +TACCGTGCCTCGGACC-1,1,51,69,7595,6229 +GTAGCCAAACATGGGA-1,1,50,70,7475,6298 +TGCCAGTACGTGGAGA-1,1,51,71,7595,6367 +ATAAGGTGGAGAACAT-1,1,50,72,7475,6436 +CTTTAATATTGGTCGA-1,1,51,73,7595,6505 +TGGTTCAACGGGTAAT-1,1,50,74,7475,6573 +GCTGCTACTGCGTAGC-1,1,51,75,7595,6642 +CTGCACAACTACATAT-1,1,50,76,7475,6711 +ATATTCCACATAGTGA-1,1,51,77,7595,6780 +TGGCAAACTAAATTAC-1,1,50,78,7475,6849 +ACCGCAATAACTGCCT-1,1,51,79,7595,6917 +TCGCACCAGGAGGCAG-1,1,50,80,7475,6986 +ACTTCAGGCTGATCCC-1,1,51,81,7595,7055 +ACAAATCGCACCGAAT-1,1,50,82,7475,7124 +TCTGATGTATTCTGTC-1,1,51,83,7595,7193 +CTTTACCGAATAGTAG-1,1,50,84,7475,7262 +GCAGATCCATAAGACT-1,1,51,85,7595,7330 +TTCCTCGGACTAACCA-1,1,50,86,7475,7399 +TTATCCGGGATCTATA-1,1,51,87,7595,7468 +CTGGAAGACACGGTGG-1,1,50,88,7475,7537 +GTTCGTCTAAAGAACT-1,1,51,89,7595,7606 +GTCTATTGGTTCCGGT-1,1,50,90,7475,7675 +CTAGGCGCCCTATCAG-1,1,51,91,7595,7743 +AACGGACGTACGTATA-1,1,50,92,7475,7812 +AACACACGCTCGCCGC-1,1,51,93,7595,7881 +GCTACTATAGTAGAGT-1,1,50,94,7475,7950 +AGCATATCAATATGCT-1,1,51,95,7595,8019 +CGAACAGTATGGGCGT-1,1,50,96,7475,8088 +ACAATTGTGTCTCTTT-1,1,51,97,7595,8156 +GATCGCTACCCGATTT-1,1,50,98,7475,8225 +ATTGCGATCAGTAACT-1,1,51,99,7595,8294 +CAGCAGTCCAGACTAT-1,1,50,100,7475,8363 +AGAGGCTTCGGAAACC-1,1,51,101,7595,8432 +AAACAAGTATCTCCCA-1,1,50,102,7475,8501 +GGCAGCAAACCTATGC-1,1,51,103,7595,8569 +ACTAGTTGCGATCGTC-1,1,50,104,7475,8638 +TTGGACCATCTGGCAA-1,1,51,105,7595,8707 +CCCTCCTCGCTCGTAT-1,1,50,106,7475,8776 +GAGCGCAAATACTCCG-1,1,51,107,7595,8845 +ATTACATGTCAGTCTT-1,1,50,108,7475,8914 +TTGGGACGTAAGAGTT-1,1,51,109,7595,8982 +CTTCGGCCAATTGTTT-1,1,50,110,7475,9051 +AGACCGCTCCGCGGTT-1,1,51,111,7595,9120 +GACCGCGTCTGACGTG-1,1,50,112,7475,9189 +CCAAATAACAAGATTC-1,1,51,113,7595,9258 +TCTTTAGAGTCTAACA-1,1,50,114,7475,9327 +CTCCCAATGAGTCGCG-1,0,51,115,7595,9395 +TAGTCTTTCCGAATTG-1,0,50,116,7475,9464 +GAGTAAACCGGAAAGT-1,0,51,117,7595,9533 +GATCTCGACGCTGTGG-1,0,50,118,7475,9602 +CTGACATAGAAATAGA-1,0,51,119,7595,9671 +TATACCGAGTGCCACA-1,0,50,120,7475,9739 +TCCGAACGTTGCCGCT-1,0,51,121,7595,9808 +GCAGAAGGTAATCTCC-1,0,50,122,7475,9877 +GGTACTAAGTGCTTTG-1,0,51,123,7595,9946 +CAGAATATTCGTTATC-1,0,50,124,7475,10015 +TAATCAACCAAATGGG-1,0,51,125,7595,10084 +TCTGCTTAGAACAAGC-1,0,50,126,7475,10152 +AACTGAGTTATACTGA-1,0,51,127,7595,10221 +CCTCAACGATCGCTGT-1,1,52,0,7715,1480 +CGGTACGGCAAACCCA-1,1,53,1,7835,1549 +CAGATGTTTGTCCCAA-1,1,52,2,7715,1618 +GTTTGTTAGCCAAGTA-1,1,53,3,7835,1686 +ACGTGACAAAGTAAGT-1,1,52,4,7715,1755 +TTGTCACCGCGGTATC-1,1,53,5,7835,1824 +GATCTAACCGTATTCA-1,1,52,6,7715,1893 +ATGGAAATTTAAGGAG-1,1,53,7,7835,1962 +ATTGATCACCACATTT-1,1,52,8,7715,2031 +ACTGCTCGGAAGGATG-1,1,53,9,7835,2099 +TCTAAAGAACAGTCTC-1,1,52,10,7715,2168 +CTGGGTTGAGTTAAAG-1,1,53,11,7835,2237 +CCCAGTAAACTTGGGA-1,1,52,12,7715,2306 +AGATTCACAACCGATA-1,1,53,13,7835,2375 +AGAAGGTACACTTCAC-1,1,52,14,7715,2444 +GCAGGAACTTAGATCT-1,1,53,15,7835,2512 +AATCTAGGTTTACTTG-1,1,52,16,7715,2581 +CCCGGTGTATCGGAAT-1,1,53,17,7835,2650 +TTATCCTCAAGGAATA-1,1,52,18,7715,2719 +AGCATCATTTCGAAAG-1,1,53,19,7835,2788 +CGCGAGTCTGCCGGGT-1,1,52,20,7715,2857 +TGCGTCATGACTGAGC-1,1,53,21,7835,2925 +GTATGAAATTTCACTC-1,1,52,22,7715,2994 +TTGGTTGCGGTGCGCG-1,1,53,23,7835,3063 +ACAGAACTGAGAACAA-1,1,52,24,7715,3132 +CTACTATCATAGGTTT-1,1,53,25,7835,3201 +CCTCTATCGATTAGCA-1,1,52,26,7715,3270 +CCGTATCTCGTCGTAG-1,1,53,27,7835,3338 +TCACGATGTCCGTGGA-1,1,52,28,7715,3407 +TCAACAAAGATAATTC-1,1,53,29,7835,3476 +ATGACGCGTTCTATCC-1,1,52,30,7715,3545 +ATTTGCGCGAGTAGCT-1,1,53,31,7835,3614 +TTCTTGGACGATCTGC-1,1,52,32,7715,3683 +AGACGACGATGCCGCT-1,1,53,33,7835,3751 +GGTCTCTGAATGGACT-1,1,52,34,7715,3820 +GCTCAATCCGTTTATT-1,1,53,35,7835,3889 +CCAGAAAGCAACTCAT-1,1,52,36,7715,3958 +CACCGTTAGGGATCAC-1,1,53,37,7835,4027 +AATAACACTAGAACAA-1,1,52,38,7715,4096 +CACCCGGTTTGTGACT-1,1,53,39,7835,4164 +CCACCAACTTTACTGT-1,1,52,40,7715,4233 +AACTCTCAGTGTGCTC-1,1,53,41,7835,4302 +AAACCGTTCGTCCAGG-1,1,52,42,7715,4371 +CAGCGATTCCCTTCAA-1,1,53,43,7835,4440 +GCTAGCTTGAATAGCT-1,1,52,44,7715,4508 +TTGCGGCATCAGAAAG-1,1,53,45,7835,4577 +AATAGAACAGAGTGGC-1,1,52,46,7715,4646 +GCCATCGAGCTGCGTG-1,1,53,47,7835,4715 +ACACTGATCAAGGTGT-1,1,52,48,7715,4784 +ACCAACGCTTATTTAT-1,1,53,49,7835,4853 +GACATCGATTTATAAC-1,1,52,50,7715,4921 +CAGACACCGATCGCTG-1,1,53,51,7835,4990 +CCAAGAAAGTGGGCGA-1,1,52,52,7715,5059 +GGTAGACCGTTGGGCG-1,1,53,53,7835,5128 +TCGTTAGGAGTCCCTA-1,1,52,54,7715,5197 +ACGGCCAACATGGACT-1,1,53,55,7835,5266 +GTGAGTGGTACAACGC-1,1,52,56,7715,5334 +GAGACTTCGCGACCGA-1,1,53,57,7835,5403 +GAAGTCAGTTGCACTA-1,1,52,58,7715,5472 +GTTTGGTAGGGTCAAC-1,1,53,59,7835,5541 +ACGGCACTTGCTTGGG-1,1,52,60,7715,5610 +CCTCTGTACTATTCTA-1,1,53,61,7835,5679 +CTATTCATGTGTCCCA-1,1,52,62,7715,5747 +GCCCGATCTGTGGTCG-1,1,53,63,7835,5816 +TTAGAAGAACATGACT-1,1,52,64,7715,5885 +AGGATAAAGTCGGGAT-1,1,53,65,7835,5954 +CGGCAAACATCGTGCG-1,1,52,66,7715,6023 +CTAGTTACAACCCGGT-1,1,53,67,7835,6092 +TTCGACAGAGCCCGTG-1,1,52,68,7715,6160 +AAGCATACTCTCCTGA-1,1,53,69,7835,6229 +GACGACGATCCGCGTT-1,1,52,70,7715,6298 +GGTAGAAGACCGCCTG-1,1,53,71,7835,6367 +GAGATGGGAGTCGACA-1,1,52,72,7715,6436 +AACGATAATGCCGTAG-1,1,53,73,7835,6505 +TGGTCCCACGCTACGG-1,1,52,74,7715,6573 +CTGCTTGGCGATAGCT-1,1,53,75,7835,6642 +ATCGGAGACAGACGGC-1,1,52,76,7715,6711 +TAGCGTCCGGTGTGGT-1,1,53,77,7835,6780 +GTTGAGTCCCGCCGGT-1,1,52,78,7715,6849 +AAATAGGGTGCTATTG-1,1,53,79,7835,6917 +AAGTGTTTGGAGACGG-1,1,52,80,7715,6986 +AGCACTACCTCACCAG-1,1,53,81,7835,7055 +TGCCTTGGCCAGGCAA-1,1,52,82,7715,7124 +TCGTCTTAGGCGTTAA-1,1,53,83,7835,7193 +TTCTGACCGGGCTCAA-1,1,52,84,7715,7262 +CAGAACTTAGCCCTCT-1,1,53,85,7835,7330 +AGCTCCTTCGCACATC-1,1,52,86,7715,7399 +ACAGGCTTGCCCGACT-1,1,53,87,7835,7468 +GCTATACGTCTCGGAC-1,1,52,88,7715,7537 +GAGCCAGCTACCTGTG-1,1,53,89,7835,7606 +TGCTAAGTGTCTATTT-1,1,52,90,7715,7675 +GTCCTACGAATAGTCT-1,1,53,91,7835,7743 +CAGTGTCGGCTGGCCC-1,1,52,92,7715,7812 +CTATCGACGAAATACA-1,1,53,93,7835,7881 +CATCATTACCCTGAGG-1,1,52,94,7715,7950 +TAAGTTGCGACGTAGG-1,1,53,95,7835,8019 +AGTGCACGCTTAAGAA-1,1,52,96,7715,8088 +TGTGCCGGTGCCGGAA-1,1,53,97,7835,8156 +AGGAGGCCTTCGCGCG-1,1,52,98,7715,8225 +TCCGCGGCCCAATGAA-1,1,53,99,7835,8294 +TCCGTTAAGCTAATAT-1,1,52,100,7715,8363 +AAATCTAGCCCTGCTA-1,1,53,101,7835,8432 +CGCAGGCGATCCAAAC-1,1,52,102,7715,8501 +CCATATGGAAACTATA-1,1,53,103,7835,8569 +CACCGTATCCCATCCG-1,1,52,104,7715,8638 +GGTCAAGACTACTTCG-1,1,53,105,7835,8707 +CCCGTTTCGCAGATGT-1,1,52,106,7715,8776 +GTTATAATACGGTGAA-1,1,53,107,7835,8845 +ACTTGTGGATGGAACG-1,1,52,108,7715,8914 +GTTCGCTGAGACGTCT-1,1,53,109,7835,8982 +GACACTGGAACCCGAT-1,1,52,110,7715,9051 +CCCAGGTCTGAAGGCT-1,1,53,111,7835,9120 +TCTCGAGGAGGTTCGC-1,1,52,112,7715,9189 +ACTATCTGCCCGCGTA-1,1,53,113,7835,9258 +CCTAAATTGTATCCTA-1,1,52,114,7715,9327 +AGAAATTATGACTCGC-1,0,53,115,7835,9395 +TCCAGCGCTATAAGCG-1,0,52,116,7715,9464 +TCGTGTATTGGTCACG-1,0,53,117,7835,9533 +CCACATACTGCACCCA-1,0,52,118,7715,9602 +GTTGCGGACGGTCAGG-1,0,53,119,7835,9671 +GTATTTAATGGCATAA-1,0,52,120,7715,9739 +GTCGATAGGTGACTTT-1,0,53,121,7835,9808 +AATAATCTTCGTATCG-1,0,52,122,7715,9877 +ATTGTTCAACGATCCG-1,0,53,123,7835,9946 +GTGCAGCGTAGAGTAG-1,0,52,124,7715,10015 +TGTGGTAGGGTGCCTT-1,0,53,125,7835,10084 +TGTGGACTATCTACGT-1,0,52,126,7715,10152 +GGCGGGCTCTAAGAGT-1,0,53,127,7835,10221 +TGTGCCAGAGGCAAAG-1,1,54,0,7955,1480 +TGGCTTATGTATAATG-1,1,55,1,8074,1549 +GCAAGCTGGAAACCGC-1,1,54,2,7955,1618 +GATATCAAGCAGGAGC-1,1,55,3,8074,1686 +CACCAATCATCCGTCT-1,1,54,4,7955,1755 +CCACATGGCTCTTTAT-1,1,55,5,8074,1824 +GTCCTACTCTACGGGC-1,1,54,6,7955,1893 +CTCGAGACATACGATA-1,1,55,7,8074,1962 +TATCAGTGGCGTAGTC-1,1,54,8,7955,2031 +TGACAGGACAAGTCCA-1,1,55,9,8074,2099 +TATTAACACCAAAGCA-1,1,54,10,7955,2168 +TAGGCGATGAGGTCTC-1,1,55,11,8074,2237 +CCGCCGGAACTTCTCG-1,1,54,12,7955,2306 +GCCATTAGCCTCAAAC-1,1,55,13,8074,2375 +GTTAGGCTACCCGTTT-1,1,54,14,7955,2444 +GGGTATTCTAGCAAAC-1,1,55,15,8074,2512 +GCCCTAGCCGTCGCGA-1,1,54,16,7955,2581 +CAGATCCTGGTTTGAA-1,1,55,17,8074,2650 +CTTCAGTGGTCGCCTA-1,1,54,18,7955,2719 +GGGCAACCGCACGTGC-1,1,55,19,8074,2788 +GACCCAATTATGATAC-1,1,54,20,7955,2857 +GAAGCTCGGACCCGTC-1,1,55,21,8074,2925 +CGTCGGGTCTAAGCGC-1,1,54,22,7955,2994 +GAGGCCCGACTCCGCA-1,1,55,23,8074,3063 +TTGCCATAGCCCGCTC-1,1,54,24,7955,3132 +TAACATACACGCGATC-1,1,55,25,8074,3201 +CCGACGGGCATGAGGT-1,1,54,26,7955,3270 +AATGTGCCCGAGGTGT-1,1,55,27,8074,3338 +AGCTGTAACCTCAATC-1,1,54,28,7955,3407 +CGAGTGAAGGTACCAG-1,1,55,29,8074,3476 +AGTCTCACAAGACTAC-1,1,54,30,7955,3545 +AAATTGATAGTCCTTT-1,1,55,31,8074,3614 +TAAGTCGCCGAGTATC-1,1,54,32,7955,3683 +GCGGAGAAACTTCGCA-1,1,55,33,8074,3751 +GGCAAAGGCGCCAATA-1,1,54,34,7955,3820 +ATTTCCGGGTTCTGCG-1,1,55,35,8074,3889 +TAAACCCAGGAGGGCA-1,1,54,36,7955,3958 +TTCGGGCGCTAGTCTT-1,1,55,37,8074,4027 +GTGGAGTCGGCGGTTG-1,1,54,38,7955,4096 +GCACGCCTACTTAGAT-1,1,55,39,8074,4164 +CAATATTCTTGACCTA-1,1,54,40,7955,4233 +CGTTTGTGTAGAGGGT-1,1,55,41,8074,4302 +CATAGCGTTGCCCACC-1,1,54,42,7955,4371 +TGATACATTTAGCCGT-1,1,55,43,8074,4440 +TTCCGGCCTTGAGGCT-1,1,54,44,7955,4508 +CCTATACCGTCCTGTC-1,1,55,45,8074,4577 +TCGTTGCTATCCGGTC-1,1,54,46,7954,4646 +TGGCGACTGCTCCAAA-1,1,55,47,8074,4715 +CAGAGGCGATGCATGA-1,1,54,48,7954,4784 +TCACAGGAGAATAAGA-1,1,55,49,8074,4853 +GGGTTAACATTTGAGT-1,1,54,50,7954,4921 +GCGGGCGAGCCTTACC-1,1,55,51,8074,4990 +TGCCAATGGGTACTCT-1,1,54,52,7954,5059 +AGGGACTCTACGCGAC-1,1,55,53,8074,5128 +GACGCCGTAAAGGCTA-1,1,54,54,7954,5197 +AAAGGCTCTCGCGCCG-1,1,55,55,8074,5266 +CTGGCTGGTTGTCAGT-1,1,54,56,7954,5334 +ACATCCCGGCCATACG-1,1,55,57,8074,5403 +CTCTTGTCCCGCTTGG-1,1,54,58,7954,5472 +TACGCCTCCATTCCGA-1,1,55,59,8074,5541 +CGGAGCAATTTAATCG-1,1,54,60,7954,5610 +AACTAGGCTTGGGTGT-1,1,55,61,8074,5679 +GCGTCGCCAGGGTGAT-1,1,54,62,7954,5747 +GTTGGTCATGCTATCC-1,1,55,63,8074,5816 +GCTGGCGGCGCATGCT-1,1,54,64,7954,5885 +TGAGCGGAAAGTGTTC-1,1,55,65,8074,5954 +CTTTCTGTGCGGGCTT-1,1,54,66,7954,6023 +ATCTAATATCCTACGG-1,1,55,67,8074,6092 +AACCTTTAAATACGGT-1,1,54,68,7954,6160 +TTCACTCGAGCACCTA-1,1,55,69,8074,6229 +CTGCACTCCAGTACAG-1,1,54,70,7954,6298 +CCATTTCTACCTATTA-1,1,55,71,8074,6367 +CAAGCGGCACATAATT-1,1,54,72,7954,6436 +GTTAACATCACTTAAA-1,1,55,73,8074,6505 +ATATAAATGTAGCTGC-1,1,54,74,7954,6573 +GCCTCTATACATAGCA-1,1,55,75,8074,6642 +GTGTCGTATAGCGTTC-1,1,54,76,7954,6711 +ATACGTACTTAGCCAC-1,1,55,77,8074,6780 +GCTATCATACTCATGG-1,1,54,78,7954,6849 +TATCCAATTGGTTATC-1,1,55,79,8074,6918 +TCTCCCTGGGCAGCGT-1,1,54,80,7954,6986 +CCTATAATGAGTGCCC-1,1,55,81,8074,7055 +CAATGCGAGAAGTATC-1,1,54,82,7954,7124 +TACCAATAAAGTACCA-1,1,55,83,8074,7193 +GCTAGGCACCACGGAG-1,1,54,84,7954,7262 +GGTGGACTGCTCTGGC-1,1,55,85,8074,7330 +TATTCCGAGCTGTTAT-1,1,54,86,7954,7399 +TTGAGAAGTTTAGCAT-1,1,55,87,8074,7468 +GTCCGGACCTGAAATT-1,1,54,88,7954,7537 +CTGTGGTCGGGAGATA-1,1,55,89,8074,7606 +CATGTAAGAGACATTT-1,1,54,90,7954,7675 +CACGTTTCGTACACAC-1,1,55,91,8074,7743 +CATCCTCTCAAAGATC-1,1,54,92,7954,7812 +GATTAACCGAAAGCCC-1,1,55,93,8074,7881 +AACGCTGTTGCTGAAA-1,1,54,94,7954,7950 +TTCAGCTGGCGTGCCC-1,1,55,95,8074,8019 +TAGAGGTTCTACTTGT-1,1,54,96,7954,8088 +GTATCAAACGTTAGCT-1,1,55,97,8074,8156 +AATCATGTAAAGACTC-1,1,54,98,7954,8225 +AGTCACTAGCTCTCGA-1,1,55,99,8074,8294 +GCGAAACGATCGGGAG-1,1,54,100,7954,8363 +CATGGATTGTCTTCCG-1,1,55,101,8074,8432 +ATTGGATTACAGCGTA-1,1,54,102,7954,8501 +CACACACGCTAACGAG-1,1,55,103,8074,8569 +CTATGGGAAGCGGAAT-1,1,54,104,7954,8638 +TGCCTAATTGAAGATT-1,1,55,105,8074,8707 +TGGCAATGGGACGGCG-1,1,54,106,7954,8776 +ACCTCCGCCCTCGCTG-1,1,55,107,8074,8845 +CGGCAATAAGATCGCC-1,1,54,108,7954,8914 +CCTTGACCACTTTATT-1,1,55,109,8074,8982 +TCATTTAGAAGTGTGA-1,1,54,110,7954,9051 +CAGAATAACACACGGA-1,1,55,111,8074,9120 +TCTGAGCAATTGACTG-1,1,54,112,7954,9189 +CAACGTGGTGGAGTCT-1,1,55,113,8074,9258 +CACAGTTCGCTTCCCA-1,1,54,114,7954,9327 +TCTCTCGCCGCACATA-1,0,55,115,8074,9395 +TGGGCAGGCCACCGCA-1,0,54,116,7954,9464 +CTCCTGTTCAAGGCAG-1,0,55,117,8074,9533 +TATTTGATTTGCACAG-1,0,54,118,7954,9602 +GCCACTCCTTACGGTA-1,0,55,119,8074,9671 +ACCGATATTTAATCAT-1,0,54,120,7954,9739 +TTATTATCTGGAAGGC-1,0,55,121,8074,9808 +TACATGCCGGAATTGT-1,0,54,122,7954,9877 +GGCACTCAGCCGACCC-1,0,55,123,8074,9946 +AAACCGGAAATGTTAA-1,0,54,124,7954,10015 +AGACAGGCATCTCAGC-1,0,55,125,8074,10084 +GTGGTGATGGTTTGTG-1,0,54,126,7954,10152 +CCGATATGACGTAAGG-1,0,55,127,8074,10221 +CATACACAAAGTCAGC-1,1,56,0,8194,1480 +TGCCGTTCTTAATCGG-1,1,57,1,8314,1549 +TCGAGTCTACGATTCG-1,1,56,2,8194,1618 +ACTTCCAGTGGAAGCT-1,1,57,3,8314,1687 +CAATTGGGCCGCACTC-1,1,56,4,8194,1755 +AAATCGCGGAAGGAGT-1,1,57,5,8314,1824 +ATATCAATTCCAGCCT-1,1,56,6,8194,1893 +CTTTGTCGAATGCTCC-1,1,57,7,8314,1962 +TGAGGCATGTACTGTG-1,1,56,8,8194,2031 +TTCGCCGCTCGCGCTA-1,1,57,9,8314,2099 +GACTCCTTCCAATTGA-1,1,56,10,8194,2168 +ACCGAAGAGTCTGGTT-1,1,57,11,8314,2237 +TGGCATGAAGTTTGGG-1,1,56,12,8194,2306 +ACGAGGTTTACAACGT-1,1,57,13,8314,2375 +AACCCATCCCATGATC-1,1,56,14,8194,2444 +TCGACAACTGAACCCG-1,1,57,15,8314,2512 +TATCTTGCAATACAAC-1,1,56,16,8194,2581 +TATTATGTTTGCCTGC-1,1,57,17,8314,2650 +GTCAAAGAAGTGGTGT-1,1,56,18,8194,2719 +GGGACAGAGTTACTCC-1,1,57,19,8314,2788 +AGCAACCGAAAGTAAT-1,1,56,20,8194,2857 +CTCTCTAACTGCCTAG-1,1,57,21,8314,2925 +ATACGGAACGTCGTTT-1,1,56,22,8194,2994 +TCGGTCCCGACAATAG-1,1,57,23,8314,3063 +CGCGCAAATGTCCAGA-1,1,56,24,8194,3132 +TCTAATACTGCCTCAG-1,1,57,25,8314,3201 +CTCGGTTGTCGGCCCT-1,1,56,26,8194,3270 +GGTAACCGGGAGGATA-1,1,57,27,8314,3338 +CAGGCGCACGGTGGTC-1,1,56,28,8194,3407 +TCATCGATGGTCCCAA-1,1,57,29,8314,3476 +CAAAGATTATTGGGCC-1,1,56,30,8194,3545 +ACAATGAATACGGAGA-1,1,57,31,8314,3614 +GCTCCTGACATACTGG-1,1,56,32,8194,3683 +GATGACAAGTAGGGCA-1,1,57,33,8314,3751 +TACGCCGAGGGTACCC-1,1,56,34,8194,3820 +AAGCGTCCCTCATCGA-1,1,57,35,8314,3889 +CACTCCTATGTAAGAT-1,1,56,36,8194,3958 +TCGAGCCAGGCAGGCC-1,0,57,37,8314,4027 +TCGTCAAGTACGCGCA-1,1,56,38,8194,4096 +CCCGTAGCTGGGAAGA-1,1,57,39,8314,4164 +ACCCTATGCCATATCG-1,1,56,40,8194,4233 +GTGGTATAGTCTGCCG-1,1,57,41,8314,4302 +CCGGTTTGTAATTGTG-1,1,56,42,8194,4371 +GTCGCCGTTGTGTGTT-1,1,57,43,8314,4440 +TACTGAACAGATTTAG-1,1,56,44,8194,4508 +TATTAACCTGACCGCG-1,1,57,45,8314,4577 +CTGTAGCCATCTCACT-1,1,56,46,8194,4646 +TACTATGGTTCCTCAG-1,1,57,47,8314,4715 +GAGTCAGACCAGAATC-1,1,56,48,8194,4784 +TAAGGCATAACATCAA-1,1,57,49,8314,4853 +CTTCCGCTCCGTGAAG-1,1,56,50,8194,4921 +GGGCTATGATCGATGG-1,1,57,51,8314,4990 +GGTCGGTCGTCCACAG-1,1,56,52,8194,5059 +GGGACCCGTATATCTT-1,1,57,53,8314,5128 +GAAAGCAGTGCACTTT-1,1,56,54,8194,5197 +AGCGCATAATGAATCG-1,1,57,55,8314,5266 +GCTGCTAAGTAGTCGA-1,1,56,56,8194,5334 +AATAGTCCGTCCCGAC-1,1,57,57,8314,5403 +AGCAGCCAGATGAATA-1,1,56,58,8194,5472 +CCTCGCGCTGTGCGAT-1,1,57,59,8314,5541 +TTGTGTATGCCACCAA-1,1,56,60,8194,5610 +TGCTCGGCGAAACCCA-1,1,57,61,8314,5679 +CGATTAAATATCTCCT-1,1,56,62,8194,5747 +TGCCGTGGATCGTCCT-1,1,57,63,8314,5816 +GTGGACGCATTTGTCC-1,1,56,64,8194,5885 +ACCCGGAAACTCCCAG-1,1,57,65,8314,5954 +CCGCATGTGGTACGAT-1,1,56,66,8194,6023 +GCAAACCTTGGCCATA-1,1,57,67,8314,6092 +ATTCACTGATGTTGGA-1,1,56,68,8194,6160 +ACTCCCTAATGCTAAA-1,1,57,69,8314,6229 +TCCTAAATTGGGAAGC-1,1,56,70,8194,6298 +GAACAGATTACTAAAT-1,1,57,71,8314,6367 +ATACAGGCCCTCCAAT-1,1,56,72,8194,6436 +CGATTCGCCTGGCTGC-1,1,57,73,8314,6505 +TCCGCCTGTCTACAAG-1,1,56,74,8194,6573 +CACATCTCACCGACGA-1,1,57,75,8314,6642 +CGTCGTCCTTCGCGAA-1,1,56,76,8194,6711 +CGTTGAATACCGCGCT-1,1,57,77,8314,6780 +ACCAATATGCAAGTTA-1,1,56,78,8194,6849 +ACGGATGGTGCGGATA-1,1,57,79,8314,6918 +CACCCTAACAAGATCT-1,1,56,80,8194,6986 +AAGCTCTTTCATGGTG-1,1,57,81,8314,7055 +CATGGGTATGCCTTAT-1,1,56,82,8194,7124 +GCGCGTCATTGGTACA-1,1,57,83,8314,7193 +TCTGAAGCACGTGGTC-1,1,56,84,8194,7262 +AAGTTCACTCCAAGCT-1,1,57,85,8314,7330 +TTGGACCTATAACAGT-1,1,56,86,8194,7399 +ATCAGCCTCATGCTGC-1,1,57,87,8314,7468 +AGTACTCTTATGCCCA-1,1,56,88,8194,7537 +GCGCTTAAATAATTGG-1,1,57,89,8314,7606 +TTGTGAACCTAATCCG-1,1,56,90,8194,7675 +AGTCGTCGACCACCAA-1,1,57,91,8314,7743 +TCCTTTAAATCCGCTT-1,1,56,92,8194,7812 +ACTGAAACGCCGTTAG-1,1,57,93,8314,7881 +GCACACACTGGTAGCC-1,1,56,94,8194,7950 +TAAGGGCCTGTCCGAT-1,1,57,95,8314,8019 +GCTAGAGTAGAGATGT-1,1,56,96,8194,8088 +CACAGGGCCATATAGT-1,1,57,97,8314,8156 +CCATGCCCTAGATTTC-1,1,56,98,8194,8225 +TCGCGTAGCAGTGTCC-1,1,57,99,8314,8294 +GACGAGGCTAATAAAC-1,1,56,100,8194,8363 +CTACACTCGCAGATGG-1,1,57,101,8314,8432 +ACGCATACGTTTACTA-1,1,56,102,8194,8501 +GGAGCAACATTTCAAG-1,1,57,103,8314,8569 +CGAGAGGGTAGCCGCG-1,1,56,104,8194,8638 +TCGTGTTCGACCACAA-1,1,57,105,8314,8707 +TCTACCCAATAGAGAG-1,1,56,106,8194,8776 +ATAAACGTTGCACCAC-1,1,57,107,8314,8845 +TCAACTGCAGAGTCAG-1,1,56,108,8194,8914 +AGCTCCATATATGTTC-1,1,57,109,8314,8982 +GTAACATCTAAGATAA-1,1,56,110,8194,9051 +CCGACAATAGGCCGCC-1,1,57,111,8314,9120 +ATGCTTAGGAGTTGAT-1,1,56,112,8194,9189 +AACCCGAGCAGAATCG-1,1,57,113,8314,9258 +CGGGTTTGTTAGGGCT-1,1,56,114,8194,9327 +AGGCACGTGACTGTCC-1,0,57,115,8314,9395 +GACAAGAGATGAGATT-1,0,56,116,8194,9464 +AGCCCTTGGACATCCC-1,0,57,117,8314,9533 +GCAGTTCGATCCGAGC-1,0,56,118,8194,9602 +TCGAGGGCAACAGACG-1,0,57,119,8314,9671 +ACTTTGTCGACGCACT-1,0,56,120,8194,9740 +GAGTATCAAAGTTACA-1,0,57,121,8314,9808 +CCAGGCTGGCGTCTGA-1,0,56,122,8194,9877 +GGACTCTTCCGGTTGA-1,0,57,123,8314,9946 +TCCCAGCACACGACAT-1,0,56,124,8194,10015 +GCTCCATGAGTGCAGA-1,0,57,125,8314,10084 +GCAGTGCGGGCGGATG-1,0,56,126,8194,10152 +GCGTTCTGACTAAGCG-1,0,57,127,8314,10221 +ATTTGGAGATTGCGGT-1,1,58,0,8434,1480 +AAGGGTTTGATTTCAG-1,1,59,1,8553,1549 +CCGGCCGCGAGCATAT-1,1,58,2,8434,1618 +GAGTTCTGTGGGTGCT-1,1,59,3,8553,1687 +AAACGAAGATGGAGTA-1,1,58,4,8434,1755 +AATTACGAGACCCATC-1,1,59,5,8553,1824 +CCTTTGAATTATGGCT-1,1,58,6,8434,1893 +CATGGTATTAGTTTGT-1,1,59,7,8553,1962 +AACGAAAGTCGTCCCA-1,1,58,8,8434,2031 +ACATAAGTCGTGGTGA-1,1,59,9,8553,2099 +GCACAACCTCGGGCGT-1,1,58,10,8434,2168 +ATGCACGCGCTGTTCA-1,1,59,11,8553,2237 +CGATGTTGTTATCTAC-1,1,58,12,8434,2306 +GTCTCCTGCCAGTATG-1,1,59,13,8553,2375 +GATGCCTTCTGCGGCA-1,1,58,14,8434,2444 +ACCGGTCAGGTACACC-1,1,59,15,8553,2512 +GTGGAGCGTTTACCGA-1,1,58,16,8434,2581 +AGGCGGTTTGTCCCGC-1,1,59,17,8553,2650 +TCCCTGGCGTATTAAC-1,1,58,18,8434,2719 +AAACACCAATAACTGC-1,1,59,19,8553,2788 +TGGACGCAATCCAGCC-1,1,58,20,8434,2857 +GGAACCTTGACTCTGC-1,1,59,21,8553,2925 +GTATCTCAGTCTTGAC-1,1,58,22,8434,2994 +GCTGAATCTTCCAATC-1,1,59,23,8553,3063 +AGATGCAAGACGTGCA-1,1,58,24,8434,3132 +TTAAGGCCCGTACTTT-1,1,59,25,8553,3201 +AGTATGCTGGAGACCA-1,1,58,26,8434,3270 +GCGGCAAAGTATTGCC-1,1,59,27,8553,3338 +GCGCAAATATATTCAA-1,1,58,28,8434,3407 +GAAGAAACGATATTGT-1,1,59,29,8553,3476 +GGACCTCTAGGCCGCC-1,1,58,30,8434,3545 +AACAGCTGTGTGGCAA-1,0,59,31,8553,3614 +TCGAATATCCCGCAGG-1,1,58,32,8434,3683 +GCGACCCAACCATCTG-1,0,59,33,8553,3751 +AGAGAAGGAGTACAAT-1,1,58,34,8434,3820 +GGCTCCTCCACCTGTT-1,0,59,35,8553,3889 +TCAGTGTATACGTCAT-1,1,58,36,8434,3958 +ATTATTATGTCCGTCA-1,1,59,37,8553,4027 +TTAGGTCATAACCGAC-1,0,58,38,8434,4096 +AAGATGGCACCGGACC-1,1,59,39,8553,4164 +CTACAAGAAATAACCC-1,0,58,40,8434,4233 +ACTATTTCCGGGCCCA-1,1,59,41,8553,4302 +TTGTTTCACATCCAGG-1,1,58,42,8434,4371 +CGCTGTGTGGATGTTG-1,1,59,43,8553,4440 +TCAACATAGCGCCCTA-1,1,58,44,8434,4509 +GGCCGTTTGGGTTTCA-1,1,59,45,8553,4577 +TACTCTTTCGTCTTCA-1,1,58,46,8434,4646 +TTCGCGCGCCATACGA-1,1,59,47,8553,4715 +CGGAAAGAATCAAACG-1,1,58,48,8434,4784 +AGGCAGGGAGCGTACT-1,1,59,49,8553,4853 +CCTTTAAGGGAGCACT-1,1,58,50,8434,4921 +CGCCCAGCACGCCTAG-1,1,59,51,8553,4990 +AGTATTTGGCACGACC-1,1,58,52,8434,5059 +TATCCGCACCGTCGGG-1,1,59,53,8553,5128 +ACCCGTGTCATCAGTA-1,1,58,54,8434,5197 +CAACTGCTCATCCGAT-1,1,59,55,8553,5266 +CCGGAGCGTACTTTCT-1,1,58,56,8434,5334 +TACCGTAGGTTAACTA-1,1,59,57,8553,5403 +TGAGGAGTGCCAGCTT-1,1,58,58,8434,5472 +CCAGTCTTGTCATAGA-1,1,59,59,8553,5541 +GGGCAGAGCAATCGTT-1,1,58,60,8434,5610 +TACCAAATAGCCCAGA-1,1,59,61,8553,5679 +TACCTACTCCCAGTAT-1,1,58,62,8434,5747 +TGTGAGACTAGCCCAA-1,1,59,63,8553,5816 +ATACCTAACCAAGAAA-1,1,58,64,8434,5885 +GTCGGGAAGCAGAAAC-1,1,59,65,8553,5954 +AATTAACGGATTTCCA-1,1,58,66,8433,6023 +GAACCCTCTGTGTTCT-1,1,59,67,8553,6092 +ATATAAAGCGCTCGTG-1,1,58,68,8433,6160 +CCTGGTCGAATGTGGG-1,1,59,69,8553,6229 +CTAGGTTCGGACGTGA-1,1,58,70,8433,6298 +TCGGGAGACAGCGTAC-1,1,59,71,8553,6367 +CATAAGAAGCTTGGCT-1,1,58,72,8433,6436 +AAGCACCCTGCGTATC-1,1,59,73,8553,6505 +AGTTTGCACCTGCCTC-1,1,58,74,8433,6573 +GACTGCAAATCGAGCT-1,1,59,75,8553,6642 +GTGTATATCAGCGGGC-1,1,58,76,8433,6711 +CTTCAACTCCACTTGG-1,1,59,77,8553,6780 +ACTTACGCATCCACGC-1,1,58,78,8433,6849 +CATGAGATGCACTCTC-1,1,59,79,8553,6918 +GAGCACCTGTGTCCAG-1,1,58,80,8433,6986 +CGCGACCGCGACAGAT-1,1,59,81,8553,7055 +GTCCCGCGACGTTATG-1,1,58,82,8433,7124 +GCAGTGTGGCTATAGG-1,1,59,83,8553,7193 +ATACTGCCTTACACCG-1,1,58,84,8433,7262 +TACAGAAACGGTGGGC-1,1,59,85,8553,7330 +GGCGCGGAGATCTTTC-1,1,58,86,8433,7399 +CGTTAATGTCCCGACG-1,1,59,87,8553,7468 +GCTAACTGAAGTCTGA-1,1,58,88,8433,7537 +AGTGATAACCTGCGCG-1,1,59,89,8553,7606 +TATGATCTTCTCTTTA-1,1,58,90,8433,7675 +TGTACCTACACGAGGG-1,1,59,91,8553,7743 +ATATCGTTCCTCGAAC-1,1,58,92,8433,7812 +CGGCGCCATCAATCCC-1,1,59,93,8553,7881 +CCTGTTTGAAGACACG-1,1,58,94,8433,7950 +GCCACTCAGAGCGCGA-1,1,59,95,8553,8019 +TCGGCTTGTATCGACG-1,1,58,96,8433,8088 +TAGATGGTTCCTTACT-1,1,59,97,8553,8156 +ATCGTTAGCTAGCGGA-1,1,58,98,8433,8225 +ACAGCGACATTCTCAT-1,1,59,99,8553,8294 +ATTCAACCATTTAAGG-1,1,58,100,8433,8363 +CACTCTTCTGCTAGCC-1,1,59,101,8553,8432 +CTAACTGATAATCGCC-1,1,58,102,8433,8501 +TGATGTCAATTAAGTG-1,1,59,103,8553,8569 +CGCCGTTCAGCATAGT-1,1,58,104,8433,8638 +ATACTACCCGTACCAC-1,1,59,105,8553,8707 +CCACTGTTTGGATTAA-1,1,58,106,8433,8776 +CACTACGGGAGCTGCC-1,1,59,107,8553,8845 +GACCAAACGTTGACTG-1,1,58,108,8433,8914 +AAGAGGCCCTTTGGAA-1,1,59,109,8553,8982 +ACACGTAGGCCACAAG-1,1,58,110,8433,9051 +TACTCTTACTTTACTG-1,1,59,111,8553,9120 +AGAGCCGCCGAGATTT-1,1,58,112,8433,9189 +GGCCTGCTTCTCCCGA-1,1,59,113,8553,9258 +TCAAGCGCGGACGGTA-1,1,58,114,8433,9327 +ACACTGGGACAGTCGT-1,0,59,115,8553,9395 +TGTGTAGTAGCACGTG-1,0,58,116,8433,9464 +CTAGCCACAGGCGAGC-1,0,59,117,8553,9533 +CTATCGCGTAGAGAAC-1,0,58,118,8433,9602 +GTTCCCGTAAACATAT-1,0,59,119,8553,9671 +TCTTTCCTTCGAGATA-1,0,58,120,8433,9740 +ATATTGGAGAGGCCTT-1,0,59,121,8553,9808 +AGGCGATAACTGGCGT-1,0,58,122,8433,9877 +ACCCGGAGCACCACAA-1,0,59,123,8553,9946 +TGAGCTCAACTGTATA-1,0,58,124,8433,10015 +ACGACCCATGAGTTGC-1,0,59,125,8553,10084 +CGGTCAGTCCATATTT-1,0,58,126,8433,10152 +TCCGGCTGTCGGGTCG-1,0,59,127,8553,10221 +ATTCCCGAAGGTACAG-1,1,60,0,8673,1480 +CTAACAGCACAATAAC-1,1,61,1,8793,1549 +TTGTGCGGAAGCGGAT-1,1,60,2,8673,1618 +GGGCACTATTGACCAT-1,1,61,3,8793,1687 +CCATAGAGGCTGCCAG-1,1,60,4,8673,1755 +CCGAAGCATTGACCAA-1,1,61,5,8793,1824 +TACTGAGGGAAGAAAG-1,1,60,6,8673,1893 +TATGTAGAAACCCGGC-1,1,61,7,8793,1962 +TGGTTAACTTACATTT-1,1,60,8,8673,2031 +AGAACCCTCAATTGGG-1,1,61,9,8793,2099 +CCTATATCGTGTCACG-1,1,60,10,8673,2168 +ACGGCTGGATGTAGAA-1,1,61,11,8793,2237 +CTCGCATTGCATAGCC-1,1,60,12,8673,2306 +ACTTTGGTCGTGCTCC-1,1,61,13,8793,2375 +GCTGGTTTAGGCCATA-1,1,60,14,8673,2444 +TGTCGTTATCACATAT-1,1,61,15,8793,2512 +ACACATGATCAAATCT-1,1,60,16,8673,2581 +TATCCATCTCGGTTAG-1,1,61,17,8793,2650 +CTCGTCGAGGGCTCAT-1,1,60,18,8673,2719 +ATCAATGCCGTGGCTG-1,1,61,19,8793,2788 +GAAACATAGGAAACAG-1,1,60,20,8673,2857 +TAATAGGTCACCAGAA-1,1,61,21,8793,2925 +CACCAGTCAGCATGCA-1,1,60,22,8673,2994 +GAGCGCTGTTAGGTAA-1,1,61,23,8793,3063 +CCCTATGTAGAGCAGA-1,1,60,24,8673,3132 +GATCGCTATATCTCAG-1,1,61,25,8793,3201 +AAGGGACTATGCATTC-1,1,60,26,8673,3270 +CTCGGGTTCTCTGGCC-1,0,61,27,8793,3338 +TATATATCGAGAAATG-1,1,60,28,8673,3407 +ACCCGAGCGAAATTAC-1,0,61,29,8793,3476 +TTGTTTCATTAGTCTA-1,0,60,30,8673,3545 +ATGGGACCTGCTGAAC-1,0,61,31,8793,3614 +TGCGACGGCCGAACGT-1,0,60,32,8673,3683 +AGCTAACAAGCAATGT-1,0,61,33,8793,3751 +CGTGTCTCGTTACGAC-1,0,60,34,8673,3820 +CTAAATCCGGTGTACA-1,0,61,35,8793,3889 +GAATAGTGCTCGATTA-1,0,60,36,8673,3958 +AACAATACATTGTCGA-1,0,61,37,8793,4027 +CACATCGTGCACGCGC-1,0,60,38,8673,4096 +ACCGTGACCACGTGGG-1,0,61,39,8793,4164 +CCCAATGAGATTTGCA-1,0,60,40,8673,4233 +TCAGCAGTAGGCCCTG-1,0,61,41,8793,4302 +CTACTCAAGGTATAGT-1,1,60,42,8673,4371 +TAGTAGCTTATACCAG-1,1,61,43,8793,4440 +ACGTTCGTTCAGGAAA-1,1,60,44,8673,4509 +TTAGAATAAGGGTCGG-1,1,61,45,8793,4577 +TTCTAGAAAGTCTTAT-1,1,60,46,8673,4646 +CCTTCAGTTAAAGTGA-1,1,61,47,8793,4715 +TAGCTAGTGATGATGG-1,1,60,48,8673,4784 +AGCCCGGTAGCCTGTA-1,1,61,49,8793,4853 +TACCTCAGTTGTCTGT-1,1,60,50,8673,4921 +GACGGGTTGGCCCGTA-1,1,61,51,8793,4990 +GAAACCTATACAAATG-1,1,60,52,8673,5059 +TCCACCTCTAGCCTTT-1,1,61,53,8793,5128 +AAGACCCAACTGAACA-1,1,60,54,8673,5197 +CATACACGGTTCCCAC-1,1,61,55,8793,5266 +ACTACGCGTTAGAATT-1,1,60,56,8673,5334 +CTTGGCCAAGCTGGGA-1,1,61,57,8793,5403 +TTACCCTAGGGATTGG-1,1,60,58,8673,5472 +TTCGCACTGTACGACA-1,1,61,59,8793,5541 +TAGGTGTTCCACAGAT-1,1,60,60,8673,5610 +GAAGCCTGCACATTCC-1,1,61,61,8793,5679 +GGCTTTCAATAAGGGT-1,1,60,62,8673,5747 +TCCAGGGTATATACGA-1,1,61,63,8793,5816 +CTCGCCGAATGTAGGG-1,1,60,64,8673,5885 +AGGAAGCTGTCCGCCG-1,1,61,65,8793,5954 +GTCTCAAGGCCCGGCT-1,1,60,66,8673,6023 +ACCGACACATCTCCCA-1,1,61,67,8793,6092 +TATACGCGTCATCACT-1,1,60,68,8673,6160 +ATCTGGGCTGTTCTTG-1,1,61,69,8793,6229 +TCAAATTTGAGACTCA-1,1,60,70,8673,6298 +GTTAAGGGTGCGATGT-1,1,61,71,8793,6367 +AGCAAAGGCCGCTAGT-1,1,60,72,8673,6436 +TTATAGGTAATTGTCT-1,1,61,73,8793,6505 +TTGTGCAGCCACGTCA-1,1,60,74,8673,6573 +ACGGACTCTCAAAGCG-1,1,61,75,8793,6642 +ATGCTCTGGCGCGGTA-1,1,60,76,8673,6711 +ATAATCTTGGAGAACC-1,1,61,77,8793,6780 +CTCATTGCTCTAACAA-1,1,60,78,8673,6849 +TAGGTGACGATAACCT-1,1,61,79,8793,6918 +CGGATCCTCAAGGACT-1,1,60,80,8673,6986 +GGGCGTGGTTTCCCAG-1,1,61,81,8793,7055 +TGGCTATGTGACATAC-1,1,60,82,8673,7124 +CTTAGTGTAGTAGCAT-1,1,61,83,8793,7193 +GGATTGCTGTGACTCC-1,1,60,84,8673,7262 +ACTTCCATGCGGGACA-1,1,61,85,8793,7331 +ACTCAAGTGCAAGGCT-1,1,60,86,8673,7399 +ACAAGGATGCTTTAGG-1,1,61,87,8793,7468 +TTGAACGACGTGCTGA-1,1,60,88,8673,7537 +ATTCATCGTTGAGGCA-1,1,61,89,8793,7606 +TGCAACCCATCTGCGG-1,1,60,90,8673,7675 +AGTGCTAAACACAGCA-1,1,61,91,8793,7743 +AACTCCAGAGCGTGTT-1,1,60,92,8673,7812 +TCTCCACAAGTTGAAT-1,1,61,93,8793,7881 +CTTTGCATCGCTCTTG-1,1,60,94,8673,7950 +TCACAAACCGAGGTAC-1,1,61,95,8793,8019 +CCGTAGGAAATCCCTG-1,1,60,96,8673,8088 +AAACATTTCCCGGATT-1,1,61,97,8793,8156 +GCCTCCGACAATTCAC-1,1,60,98,8673,8225 +TCTGCATACCTTGCTT-1,1,61,99,8793,8294 +ACCCATTTGTCCCTCT-1,1,60,100,8673,8363 +CTGCAGAGAATCAGAG-1,1,61,101,8793,8432 +GGAAACTAAATGGGCC-1,1,60,102,8673,8501 +CAACCTACCGAGCAGT-1,1,61,103,8793,8569 +CCGTAGGGTTGTTTAC-1,1,60,104,8673,8638 +GGTTTGTGACCTGAGG-1,1,61,105,8793,8707 +TAACCTAGGGAGTCCA-1,1,60,106,8673,8776 +TTCCATCGACAGCGTG-1,1,61,107,8793,8845 +ATCTCCCACGGAATAT-1,1,60,108,8673,8914 +GTTTCAAACGAGTTGT-1,1,61,109,8793,8982 +GGAACTTTGGCGATTA-1,1,60,110,8673,9051 +CTGCAAGCACGTTCCG-1,1,61,111,8793,9120 +CACAGTCCCGCTTCGC-1,1,60,112,8673,9189 +TACGCTCGGTATTGGA-1,1,61,113,8793,9258 +CTGGTAAAGTGTGGGC-1,0,60,114,8673,9327 +CAACCAGTGGCCTACC-1,0,61,115,8793,9395 +TCTTCGCGGTGAGAGG-1,0,60,116,8673,9464 +TTCGGGTTGCCACGGG-1,0,61,117,8793,9533 +ACCGATAGGCATAACC-1,0,60,118,8673,9602 +CTTATAGATGGCTGTT-1,0,61,119,8793,9671 +AGACGCCCACTTCGCC-1,0,60,120,8673,9740 +AGGTCGCCTCCCAACA-1,0,61,121,8793,9808 +CCTCACGTCAGCTAAT-1,0,60,122,8673,9877 +CCACCTGTATGGAATA-1,0,61,123,8793,9946 +GGACTCGAAGCTTTCA-1,0,60,124,8673,10015 +AAGCCGGAGAGCAGGA-1,0,61,125,8793,10084 +GCCTATCAGGTAAGAT-1,0,60,126,8673,10152 +TCAGAGTGTGAGCATG-1,0,61,127,8793,10221 +AAACATGGTGAGAGGA-1,1,62,0,8913,1480 +ATCATTGTACCGCATT-1,1,63,1,9032,1549 +TCAGCTTGAGCTTTCG-1,1,62,2,8913,1618 +CCGCGCAAGATACCCA-1,1,63,3,9032,1687 +CTATACTTAAAGCGAG-1,1,62,4,8913,1755 +ACCGTCCACTGGGCCC-1,1,63,5,9032,1824 +AAGACCAAATAACTCA-1,1,62,6,8913,1893 +TGTTTCTGAAGCGTGC-1,1,63,7,9032,1962 +TTCTCTTACAGGTGAT-1,1,62,8,8913,2031 +AATTCATTGTCATGCA-1,1,63,9,9032,2100 +GCCCGAGAGTCTAAAT-1,1,62,10,8913,2168 +ATATAGAGTATTGGTC-1,1,63,11,9032,2237 +TTGAAGGATGGGCGCC-1,1,62,12,8913,2306 +TAGTACCACAACTTTC-1,1,63,13,9032,2375 +ATCCCATCCACAGCGC-1,1,62,14,8913,2444 +CTTAGGTATAGACCAG-1,1,63,15,9032,2512 +TGACTCCGAATCATAC-1,1,62,16,8913,2581 +ACTACATCCCGACAAG-1,1,63,17,9032,2650 +TTGCCGCAGACCTACA-1,1,62,18,8913,2719 +TAAGAGGGACAGGGAC-1,1,63,19,9032,2788 +CGAATGAAGTCATTGC-1,1,62,20,8913,2857 +AAGGGAACGACTGGCT-1,1,63,21,9032,2925 +CGAATCTGCTCGACGC-1,1,62,22,8913,2994 +ATCGTGGAAAGTCTGG-1,0,63,23,9032,3063 +CCTATGGCTCCTAGTG-1,1,62,24,8913,3132 +CGTCGCTTGGTTATAC-1,0,63,25,9032,3201 +TGCTTAGAGAGAATGC-1,0,62,26,8913,3270 +GATTGCTCCAGTTGCA-1,0,63,27,9032,3338 +CGTGCTTCTACCTAAA-1,0,62,28,8913,3407 +ACTCCAATATCATCAT-1,0,63,29,9032,3476 +GCCGACCCACGACTGC-1,0,62,30,8913,3545 +GAGGGTAGTAACAAAG-1,0,63,31,9032,3614 +GGCCGAGACTCTGGTG-1,0,62,32,8913,3683 +TATATAGGGCTTTACG-1,0,63,33,9032,3751 +TGCCGGATGTACGAGC-1,0,62,34,8913,3820 +AGGTAGATCGAGATAT-1,0,63,35,9032,3889 +GATCAACATAAAGGGA-1,0,62,36,8913,3958 +TAACAGCGTTTGTGCT-1,0,63,37,9032,4027 +CTATAGGCGTTGATGT-1,0,62,38,8913,4096 +GGTTTAATTACCATCG-1,0,63,39,9032,4164 +CTCTTCTGGAAGTTAG-1,0,62,40,8913,4233 +ATCTGACATGGAAGGA-1,0,63,41,9032,4302 +TACGTACTAGTGCTGA-1,0,62,42,8913,4371 +ATGACTATCAGCTGTG-1,0,63,43,9032,4440 +CTTTGGGATTGTTGCA-1,0,62,44,8913,4509 +AGACTGTTACCGGGTC-1,0,63,45,9032,4577 +TCCTAACCGTCGGGCA-1,1,62,46,8913,4646 +ACGCAAACTAATAGAT-1,1,63,47,9032,4715 +AAGTGAGTCGGGTTTA-1,1,62,48,8913,4784 +TAAAGCGGTATTTCCA-1,1,63,49,9032,4853 +CTCCTCCAGCTCACAC-1,1,62,50,8913,4921 +CGGTCCGTCGCAAGCC-1,1,63,51,9032,4990 +CCTATATTTGTCCTGG-1,1,62,52,8913,5059 +TCCAATAAAGGCTACC-1,1,63,53,9032,5128 +AAAGGCTACGGACCAT-1,1,62,54,8913,5197 +CGTGACCAGTCCTCTG-1,1,63,55,9032,5266 +GATCTGCTATCTAAGG-1,1,62,56,8913,5334 +CGAATGACGCATAATG-1,1,63,57,9032,5403 +GCTCAATGTAATACCG-1,1,62,58,8913,5472 +CTATGCCCGAATGCAA-1,1,63,59,9032,5541 +CACAGGGCCGTTGTCA-1,1,62,60,8913,5610 +TCAATACGCCGTCATG-1,1,63,61,9032,5679 +AGCGGACACTTCGTAG-1,1,62,62,8913,5747 +ATACGTTATGCACGGA-1,1,63,63,9032,5816 +GAGTAGATACTAGTTG-1,1,62,64,8913,5885 +CCAGCTCGAACGCATT-1,1,63,65,9032,5954 +TGCTTCCCAAGCAGTA-1,1,62,66,8913,6023 +GTAGACACGCCTGACT-1,1,63,67,9032,6092 +CTCACATTTACTAAAT-1,1,62,68,8913,6160 +GAATGCGAATCGGTTC-1,1,63,69,9032,6229 +TAAGGCCCGTCACCCT-1,1,62,70,8913,6298 +GAGTATGCGCGTGCAT-1,1,63,71,9032,6367 +ATCCACATCGACAGAA-1,1,62,72,8913,6436 +TAGACGAAACGCCAAT-1,1,63,73,9032,6505 +CAGCAGTCTGTGCTGC-1,1,62,74,8913,6573 +CTCACTGTGATACTTA-1,1,63,75,9032,6642 +TTAATTGCTTTGGGTG-1,1,62,76,8913,6711 +GTAGTCTACGATATTG-1,1,63,77,9032,6780 +TTGCCGCTTTCTAGTA-1,1,62,78,8913,6849 +GAACCTTTAACGATCC-1,1,63,79,9032,6918 +TGGACCAATCTAAGAT-1,1,62,80,8913,6986 +CTAGTAGAAAGGGATT-1,1,63,81,9032,7055 +AACCTCGCTTTAGCCC-1,1,62,82,8913,7124 +GAGTGTCAACCAGAAA-1,1,63,83,9032,7193 +GTGATCCTTGTCATGA-1,1,62,84,8913,7262 +CTCAACTAACCCGGAT-1,1,63,85,9032,7331 +AGTGGCGTCTGAAGGT-1,1,62,86,8912,7399 +GGGAAGGGCTTTCTCA-1,1,63,87,9032,7468 +AGGCCTGAGAATCTCG-1,1,62,88,8912,7537 +AGCCACAGGTTACCCG-1,1,63,89,9032,7606 +TGCAATCTAACACGGT-1,1,62,90,8912,7675 +GTTTGGGTTTCGCCCG-1,1,63,91,9032,7743 +CCTATGTCCACTCCAC-1,1,62,92,8912,7812 +CTGCCTTTCTAGTAAA-1,1,63,93,9032,7881 +TTAGTAAACCTGCTCT-1,1,62,94,8912,7950 +TTGTGGTGGTACTAAG-1,1,63,95,9032,8019 +CCTCCTGTTGTGTCGT-1,1,62,96,8912,8088 +ACAAAGCATGACCTAG-1,1,63,97,9032,8156 +ATAGCAACTAGGGAAG-1,1,62,98,8912,8225 +CCGCTCTTCCGAACTA-1,1,63,99,9032,8294 +TAGAATAGCCGATGAA-1,1,62,100,8912,8363 +GGTCTCCGTCCAGGTT-1,1,63,101,9032,8432 +TAATTACGTCAGTAGA-1,1,62,102,8912,8501 +TACGTAAAGCGGAGTG-1,1,63,103,9032,8569 +GCTACAATCGAGGATA-1,1,62,104,8912,8638 +TCAGCCAATCCGTAAA-1,1,63,105,9032,8707 +ATCATAGCCCTATGTA-1,1,62,106,8912,8776 +GAGGCCTGTTGATACA-1,1,63,107,9032,8845 +ATATACGCTCGTGACG-1,1,62,108,8912,8914 +CCCTTTAATGGAGTTC-1,1,63,109,9032,8982 +TTACACGATCTGCGAC-1,1,62,110,8912,9051 +TCGCATAAAGGGCGCA-1,1,63,111,9032,9120 +TGTAGCCATCCCATTC-1,1,62,112,8912,9189 +GGGTCTATCGCTTTCC-1,1,63,113,9032,9258 +GGAGGGTCAAGTAAGA-1,0,62,114,8912,9327 +TACGGCATGGACGCTA-1,0,63,115,9032,9395 +CACGTCAATCAATGGA-1,0,62,116,8912,9464 +CGCTTGGACGGATAGA-1,0,63,117,9032,9533 +CGCGGTACGGTATACA-1,0,62,118,8912,9602 +CCTACTCAACACGATT-1,0,63,119,9032,9671 +CGTTTGGTGTTGTGGG-1,0,62,120,8912,9740 +GTTGTTGCAAGATGGC-1,0,63,121,9032,9808 +CATTCGTCGTAGCGGT-1,0,62,122,8912,9877 +CAGCCTCGATAGCGGT-1,0,63,123,9032,9946 +TCATAAGTCCAAGAAG-1,0,62,124,8912,10015 +AAAGTGCCATCAATTA-1,0,63,125,9032,10084 +GTTGCAGTCGACAACA-1,0,62,126,8912,10153 +TAAATGGGCTACTGAG-1,0,63,127,9032,10221 +GGACAAGCCATGATCG-1,0,64,0,9152,1480 +TCCAATGCGTCGCCGC-1,0,65,1,9272,1549 +AAAGAATGACCTTAGA-1,0,64,2,9152,1618 +CCTATTATTCCGGCCG-1,0,65,3,9272,1687 +CAGTAAGGGACGTCTC-1,1,64,4,9152,1755 +GGGATGGACCCGCGTC-1,0,65,5,9272,1824 +GACGCATACCCGTCGG-1,1,64,6,9152,1893 +GGGCAGGATTTCTGTG-1,0,65,7,9272,1962 +TATCTGAGCCGATATT-1,1,64,8,9152,2031 +AATGTATGGCACTGTA-1,0,65,9,9272,2100 +GCCTTTGTCAGTGGAC-1,1,64,10,9152,2168 +AACCATAGGGTTGAAC-1,0,65,11,9272,2237 +AAACTTAATTGCACGC-1,1,64,12,9152,2306 +TAGGCGGCTGCAAAGA-1,0,65,13,9272,2375 +TCCATCAATACTAATC-1,1,64,14,9152,2444 +ACCTCGAACTTATGCT-1,0,65,15,9272,2512 +ACAAACCATGCGTCCT-1,1,64,16,9152,2581 +ACACCGGTCTGACCGC-1,0,65,17,9272,2650 +ATGGCAGCATTACGAT-1,1,64,18,9152,2719 +CTGGTGAATGGGCCTA-1,0,65,19,9272,2788 +CACAGAGACGAGGACG-1,0,64,20,9152,2857 +GCACAAACCCTAGATG-1,0,65,21,9272,2925 +ACTATGTCCAGCTGCC-1,0,64,22,9152,2994 +AAGCCGCCGTGAAATC-1,0,65,23,9272,3063 +ATGGGTGTATACCTCC-1,0,64,24,9152,3132 +TAAGCGCGAATCAAAT-1,0,65,25,9272,3201 +AGCCCGGCATTAGAGG-1,0,64,26,9152,3270 +GTGATCAAGCGTGCAC-1,0,65,27,9272,3338 +CTGCCTTTAATACCTT-1,0,64,28,9152,3407 +TACCTCCACACCAATG-1,0,65,29,9272,3476 +GAGCATCAACAACTTG-1,0,64,30,9152,3545 +CATACGAACTAGCTGG-1,0,65,31,9272,3614 +GGGAACGGTTTCAGAT-1,0,64,32,9152,3683 +AGGGTGCCGTTCTTTA-1,0,65,33,9272,3751 +ACGACTGGTCATACTC-1,0,64,34,9152,3820 +GGATCTTACTGCCCTT-1,0,65,35,9272,3889 +TACTCCTCTAGTTGAC-1,0,64,36,9152,3958 +GTAGCTCCGGGAGGCT-1,0,65,37,9272,4027 +GGACTCGTGAGTGGTC-1,0,64,38,9152,4096 +GTAGTTCGAAGGCGAA-1,0,65,39,9272,4164 +CTCAAACCACTGCCCG-1,0,64,40,9152,4233 +GAGGGAGTCAGATCGC-1,0,65,41,9272,4302 +GCGTCCCTAAGACATA-1,0,64,42,9152,4371 +TCTCTTACCGCGAACC-1,0,65,43,9272,4440 +GGCTACTATACACTCC-1,0,64,44,9152,4509 +CGTTGCCCGCGTGGGA-1,0,65,45,9272,4577 +TATAGAGTCGCTTGAA-1,0,64,46,9152,4646 +ATGTTGTAGTCTGTTT-1,0,65,47,9272,4715 +AGTATACACAGCGACA-1,0,64,48,9152,4784 +TGTGGTTGCTAAAGCT-1,0,65,49,9272,4853 +TGATTCCCGGTTACCT-1,1,64,50,9152,4922 +CACTGACGATTGTGGA-1,1,65,51,9272,4990 +AACATTGTGACTCGAG-1,1,64,52,9152,5059 +GTCCAATATTTAGCCT-1,1,65,53,9272,5128 +GCTCTTTCCGCTAGTG-1,1,64,54,9152,5197 +GGGTCAGGAGCTAGAT-1,1,65,55,9272,5266 +AGGTGGTGACCTTCGC-1,1,64,56,9152,5334 +CCCGGGTCGTTCAGGG-1,1,65,57,9272,5403 +AGCCAAGCTTTGTGTC-1,1,64,58,9152,5472 +TGTGGCGGGCTTCTGG-1,1,65,59,9272,5541 +CGAGGGTATCCAGGTG-1,1,64,60,9152,5610 +CGTTCAGACCCGCGAA-1,1,65,61,9272,5679 +TCATATGAGCTTTGTT-1,1,64,62,9152,5747 +AGTTGACGGTCCTTGC-1,1,65,63,9272,5816 +ATAATTAGCTAAGTAG-1,1,64,64,9152,5885 +GGTCTTGAGCGCTCTT-1,1,65,65,9272,5954 +CGTTGTCGGCAATTGA-1,1,64,66,9152,6023 +TCTTGCTCCCGATACT-1,1,65,67,9272,6092 +AGCAGAAGGAGAAAGA-1,1,64,68,9152,6160 +GAAGCCACTGATTATG-1,1,65,69,9272,6229 +TGCTCTTGAGAGTTTG-1,1,64,70,9152,6298 +GACATCCGTCGAACTG-1,1,65,71,9272,6367 +AGATATAATACGACTA-1,1,64,72,9152,6436 +TCGCTACTGGCTTTGA-1,1,65,73,9272,6505 +GTGACAGCTTCCCACT-1,1,64,74,9152,6573 +GTGACGCAGGTTTCAT-1,1,65,75,9272,6642 +GGGAAGACGGTCTGTC-1,1,64,76,9152,6711 +CGTCGCATGTGAGCCA-1,1,65,77,9272,6780 +AGAAGGTTGTAGGTCG-1,1,64,78,9152,6849 +GGCCGGCGTCTGCTAT-1,1,65,79,9272,6918 +TTGACCAGGAACAACT-1,1,64,80,9152,6986 +AGTCGTATAAAGCAGA-1,1,65,81,9272,7055 +GGCGTAGGGAAAGCTG-1,1,64,82,9152,7124 +AAACCTAAGCAGCCGG-1,1,65,83,9272,7193 +ATTGCCTTTATGTTTG-1,1,64,84,9152,7262 +CAGGCAGTCTTACCAG-1,1,65,85,9272,7331 +AGCTAAGTACGCAGGC-1,1,64,86,9152,7399 +AAATCCGATACACGCC-1,1,65,87,9272,7468 +CGAGAGCTTTCACTAC-1,1,64,88,9152,7537 +CGCCCAGCGTTTCACG-1,1,65,89,9272,7606 +TTAAGTATTGTTATCC-1,1,64,90,9152,7675 +AAACGGGCGTACGGGT-1,1,65,91,9272,7744 +GTATCCTTTGGTAACC-1,1,64,92,9152,7812 +CATAGTCAAATACATA-1,1,65,93,9272,7881 +TCTATGCTATAACGAC-1,1,64,94,9152,7950 +ACGTTCTGTACAAGTC-1,1,65,95,9272,8019 +CGCGAAGTGGCATACT-1,1,64,96,9152,8088 +ACCAACCGCACTCCAC-1,1,65,97,9272,8156 +GTCATGCGCGAGGGCT-1,1,64,98,9152,8225 +TAGGCTAAAGTGGCAC-1,1,65,99,9272,8294 +TGGCTACACTCTACCT-1,1,64,100,9152,8363 +TGTCCACGGCTCAACT-1,1,65,101,9272,8432 +AATTGCAGCAATCGAC-1,1,64,102,9152,8501 +GTCAACCAGGCCTATA-1,1,65,103,9272,8569 +ATCTTATCGCACACCC-1,1,64,104,9152,8638 +GTCTATTGCATGCTCG-1,1,65,105,9272,8707 +GCACGTGGTTTACTTA-1,1,64,106,9152,8776 +ATTCGCGCCTTGAGAG-1,1,65,107,9272,8845 +AGCGATGCGCCTAATA-1,1,64,108,9152,8914 +TCTATAGGTGGGTAAT-1,1,65,109,9272,8982 +AGATACCAATAGAACC-1,1,64,110,9152,9051 +CGTGTATGGGAGCTGA-1,1,65,111,9272,9120 +ATGTACATGCGGTGAG-1,1,64,112,9152,9189 +TTGGCTCAATATGTGT-1,1,65,113,9272,9258 +GTTCGGAGCACTCAAC-1,0,64,114,9152,9327 +TCCCTCTTCTCAAGGG-1,0,65,115,9272,9395 +TTACGTATCTATGACA-1,0,64,116,9152,9464 +CCCATATAGGTCGATT-1,0,65,117,9272,9533 +GTCCACGTCGCATTCG-1,0,64,118,9152,9602 +AATTGTGGTTGCCAAA-1,0,65,119,9272,9671 +AGGAACGAACGACTTC-1,0,64,120,9152,9740 +TAATTCCAATGCTTCA-1,0,65,121,9272,9808 +AGGGCCCTAATGTTCT-1,0,64,122,9152,9877 +AGGTGTTGCCGACCAC-1,0,65,123,9272,9946 +CTGAGAGTAGAAATAC-1,0,64,124,9152,10015 +TAGAAGAAGGGTTACA-1,0,65,125,9272,10084 +GGTGACTGATAGAGAG-1,0,64,126,9152,10153 +TACCCTCGGTAACCCT-1,0,65,127,9272,10221 +TGTAAGACTGATAAGA-1,0,66,0,9392,1480 +GTCACTCATGAGCGAT-1,0,67,1,9512,1549 +CGGTTTACTGAACATT-1,0,66,2,9392,1618 +GAGATCGATCTTACTC-1,0,67,3,9512,1687 +TCTTTCATCCGTCCTT-1,0,66,4,9392,1755 +TCGGATCTGGATGACC-1,0,67,5,9512,1824 +GTCCTAGGATACCTTA-1,0,66,6,9392,1893 +TGTACCCGACCCTAAT-1,0,67,7,9512,1962 +AGGTTCTCCTTTCCGG-1,0,66,8,9392,2031 +AATTGCGTGGATTACA-1,0,67,9,9512,2100 +CGATAGCGATACAGTG-1,0,66,10,9392,2168 +CGCCCTAATTGTTCAA-1,0,67,11,9511,2237 +ATTATGAGACCCAATT-1,0,66,12,9392,2306 +CCTCCTAGCTAGAGTC-1,0,67,13,9511,2375 +CGAAGGGTTTCAGATT-1,0,66,14,9392,2444 +CACAAGCTAAGAAAGG-1,0,67,15,9511,2512 +CACCGGTAGAGACATT-1,0,66,16,9392,2581 +ACTCATGGCAGCCTTC-1,0,67,17,9511,2650 +CATCCAATATAGTTTG-1,0,66,18,9392,2719 +CAGATATGAAGATGAC-1,0,67,19,9511,2788 +GCAAAGGGCGTTAGCC-1,0,66,20,9392,2857 +CTGTTGTTCAGTCGTA-1,0,67,21,9511,2925 +AAAGGCCCTATAATAC-1,0,66,22,9392,2994 +AACATTGAAGTTGATC-1,0,67,23,9511,3063 +GCTAGCGATAGGTCTT-1,0,66,24,9392,3132 +ATTGCCTATTAGACCG-1,0,67,25,9511,3201 +GGGCGTTTACATTCAT-1,0,66,26,9392,3270 +CCTCTACAAGGATTGG-1,0,67,27,9511,3338 +AGTGACTGTGACACAA-1,0,66,28,9392,3407 +AGCCCTCCCTGGTGGC-1,0,67,29,9511,3476 +CGGTTGAGTATCCTTC-1,0,66,30,9392,3545 +CATTATCCCATTAACG-1,0,67,31,9511,3614 +AATGTGCTAATCTGAG-1,0,66,32,9392,3683 +CTTAGTTGAGGAATCG-1,0,67,33,9511,3751 +CTTCTGGGCGTACCTA-1,0,66,34,9392,3820 +AGTCAAATGATGTGAT-1,0,67,35,9511,3889 +TGAACAAGCAGGGACT-1,0,66,36,9392,3958 +AATACCGGAGGGCTGT-1,0,67,37,9511,4027 +GTTTGGTGATCGGTGC-1,0,66,38,9392,4096 +GACTGCTGGTGAGAAA-1,0,67,39,9511,4164 +CGATCCTCGCAACATA-1,0,66,40,9392,4233 +CCAACCTTATGTAACT-1,0,67,41,9511,4302 +CGTGGTACCCAAAGGC-1,0,66,42,9392,4371 +AACCCGACAACCCGTG-1,0,67,43,9511,4440 +TATGTAAAGTGCTTAA-1,0,66,44,9392,4509 +GCAAGTGTAAAGCATG-1,0,67,45,9511,4577 +GTAACTGCCCAAGGAG-1,0,66,46,9392,4646 +GGTGCATAAATGATTA-1,0,67,47,9511,4715 +TAGTCCCGGAGACCAC-1,0,66,48,9392,4784 +CGGCCAGAGCGACCAT-1,0,67,49,9511,4853 +TGAATGAGTGTTTCCC-1,0,66,50,9392,4922 +TTCACTTCCTAGAACG-1,0,67,51,9511,4990 +CGCTTAGTATTGATAC-1,0,66,52,9392,5059 +AACGCGACCTTGGGCG-1,0,67,53,9511,5128 +GTGCACCAGCTTCAAC-1,1,66,54,9392,5197 +TTCTATTAAACGCAGC-1,1,67,55,9511,5266 +TGGCAAGCACAAGTCG-1,1,66,56,9392,5334 +ATCTGCTGTTATCGCC-1,1,67,57,9511,5403 +AATTCCAAGCATGTAC-1,1,66,58,9392,5472 +AAACGGTTGCGAACTG-1,1,67,59,9511,5541 +GAAGGAGTCGAGTGCG-1,1,66,60,9392,5610 +GGCAAGCCCATAGTGG-1,1,67,61,9511,5679 +TGACCAAATCTTAAAC-1,1,66,62,9392,5747 +TTCGGTACTGTAGAGG-1,1,67,63,9511,5816 +ATGTACGATGACGTCG-1,1,66,64,9392,5885 +ATCTAGCTTGTGAGGG-1,1,67,65,9511,5954 +AGCGGGTCTGACACTC-1,1,66,66,9392,6023 +GAGGTACGCGTGTCCC-1,1,67,67,9511,6092 +GCACTGCCTACCTTTA-1,1,66,68,9392,6160 +GGAGCGAGGCCTACTT-1,1,67,69,9511,6229 +AAACTCGGTTCGCAAT-1,1,66,70,9392,6298 +GGCGCTTCATTCCCTG-1,1,67,71,9511,6367 +TGCTCGGTGGGTCACC-1,1,66,72,9392,6436 +AAGCGCAGGGCTTTGA-1,1,67,73,9511,6505 +GACCTTCCACGTCTAC-1,1,66,74,9392,6573 +GTTAGCCCATGACATC-1,1,67,75,9511,6642 +AATTCGATTCGAGGAT-1,1,66,76,9392,6711 +AGTCTTTAAAGTGTCC-1,1,67,77,9511,6780 +GACTAGGCCGTTAGGT-1,1,66,78,9392,6849 +TCCAAGCCTAGACACA-1,1,67,79,9511,6918 +GATTGGGAAAGGTTGT-1,1,66,80,9392,6986 +GATGAGGAACCTTCGG-1,1,67,81,9511,7055 +TGAATACCGACGCGTA-1,1,66,82,9392,7124 +AATCGTGAGCCGAGCA-1,1,67,83,9511,7193 +GCGAAGAATCTGACGG-1,1,66,84,9392,7262 +GAACAACTGGGATGAA-1,1,67,85,9511,7331 +TCGCCGACATATTCGC-1,1,66,86,9392,7399 +CGTAGAGAGTAATTAT-1,1,67,87,9511,7468 +CGATAGTCGTACTGCA-1,1,66,88,9392,7537 +CGCATGCCGAATGCGT-1,1,67,89,9511,7606 +CTCTAGCCCTCGGAAA-1,1,66,90,9392,7675 +TCCAACTCAGCTATCT-1,1,67,91,9511,7744 +GTCTAGTGAGCCGCTT-1,1,66,92,9392,7812 +TACCGAATAATTGTAA-1,1,67,93,9511,7881 +ATATAACACGGGCGCA-1,1,66,94,9392,7950 +GCATGCTAATAACGAT-1,1,67,95,9511,8019 +TCCGGGCTTGACGGGA-1,1,66,96,9392,8088 +ATTATTCAGAGTCACT-1,1,67,97,9511,8156 +TAGCAGTATGACTAAA-1,1,66,98,9392,8225 +TATGAAGAATTAAGGT-1,1,67,99,9511,8294 +CAAGGCCAGTGGTGCA-1,1,66,100,9392,8363 +TGCGTACGGCTAATTG-1,1,67,101,9511,8432 +CAGATAATGGGCGGGT-1,1,66,102,9392,8501 +GAGAACGGTTCTGACT-1,1,67,103,9511,8569 +CGCTTCGGTCTAAGAC-1,1,66,104,9392,8638 +AGCATTACGAGGCAAG-1,1,67,105,9511,8707 +AAGTTGTGATGTTATA-1,1,66,106,9391,8776 +TTGCTCATAGTACGTG-1,1,67,107,9511,8845 +TACTTAAACATGTACA-1,1,66,108,9391,8914 +AGTGAGTCGAATTAAC-1,1,67,109,9511,8982 +TAGGCCTATATAGTCT-1,1,66,110,9391,9051 +ACTCGCCGTTCGATAA-1,1,67,111,9511,9120 +GGTACGTTGCGGCCGG-1,1,66,112,9391,9189 +TATTGCCGGGCTTGTA-1,1,67,113,9511,9258 +GGTAAACTCTGCGCTG-1,0,66,114,9391,9327 +TCCCTTGTCTGAAACT-1,0,67,115,9511,9395 +CATGATCGCTTTGAGA-1,0,66,116,9391,9464 +GGACGGGCGACCAACC-1,0,67,117,9511,9533 +GAGAGGCCTATGTGTA-1,0,66,118,9391,9602 +TCGTAACTCCCAAGAC-1,0,67,119,9511,9671 +CGTATCTAGAACTAAG-1,0,66,120,9391,9740 +GCACCTTCCCGAAGGT-1,0,67,121,9511,9808 +TACCTCTTTACCATCC-1,0,66,122,9391,9877 +TGACTCTAACTGGTAA-1,0,67,123,9511,9946 +GAGAAACTGGATCCCA-1,0,66,124,9391,10015 +ATCCGGACCAGCCTGA-1,0,67,125,9511,10084 +TTATTTAGGTTCCTTA-1,0,66,126,9391,10153 +CGAATTCCCGGTTCAA-1,0,67,127,9511,10221 +TAGTTTGATCGGTCGC-1,0,68,0,9631,1480 +AGTCGAAACGATTCAG-1,0,69,1,9751,1549 +ACGTCGGGCAACTCGG-1,0,68,2,9631,1618 +ACTTGCTCTATCTACC-1,0,69,3,9751,1687 +ATTACGGGCTACGGTT-1,0,68,4,9631,1755 +GCAAACGTAAGCGACC-1,0,69,5,9751,1824 +TTCGGACTGGGCATGG-1,0,68,6,9631,1893 +GGGCCATTCGTGCTGG-1,0,69,7,9751,1962 +GAGTTGTCACCAGTCT-1,0,68,8,9631,2031 +AGTAATTTGCAAGCGT-1,0,69,9,9751,2100 +GTGGCCGGTTTCTCGG-1,0,68,10,9631,2168 +ATCTTAGGGCATTAAT-1,0,69,11,9751,2237 +CTACATATCGCGGGAC-1,0,68,12,9631,2306 +ATGGTATTTACTGATT-1,0,69,13,9751,2375 +CCGTCAACCTCTGGCG-1,0,68,14,9631,2444 +GCTTCGACGTTCAATC-1,0,69,15,9751,2513 +GACCGATTAAATATGT-1,0,68,16,9631,2581 +GTCGAATTTGGGCGCT-1,0,69,17,9751,2650 +TCACGGCCCAAGAGAG-1,0,68,18,9631,2719 +CTACGATCCTATCCTA-1,0,69,19,9751,2788 +TGCAGTGGTAGGGAAC-1,0,68,20,9631,2857 +TTGCCTAATCCAAAGT-1,0,69,21,9751,2925 +AGCGAGACGTGAAGGC-1,0,68,22,9631,2994 +TTCTACCTCAATCGGT-1,0,69,23,9751,3063 +TACGCTGCTGTGTTAA-1,0,68,24,9631,3132 +TAGTCCTGCACTAAGC-1,0,69,25,9751,3201 +AGCACACGTTTAGACT-1,0,68,26,9631,3270 +GTTCGACAATTGTATA-1,0,69,27,9751,3338 +CCATGTTCATCTATAT-1,0,68,28,9631,3407 +CCCTCGATAATACACA-1,0,69,29,9751,3476 +ACTGCCCGCCATTCTC-1,0,68,30,9631,3545 +CTATATCCAGCCTGGC-1,0,69,31,9751,3614 +CGCACGTCTGTTTATG-1,0,68,32,9631,3683 +AATCAGGTTTCATTTA-1,0,69,33,9751,3751 +AGAGAAACACCAGAAA-1,0,68,34,9631,3820 +ACCCGATTGGTTCCGA-1,0,69,35,9751,3889 +TACCAGGAATCCCGTC-1,0,68,36,9631,3958 +AAGTGCTTCTCTATTG-1,0,69,37,9751,4027 +TGCATGTGACCCATAG-1,0,68,38,9631,4096 +TAGATTCAAAGTGCGG-1,0,69,39,9751,4164 +AGGGTCAGAGCACTCG-1,0,68,40,9631,4233 +GTGAGATAACCTTATA-1,0,69,41,9751,4302 +GTGTCAGTGTACGTGG-1,0,68,42,9631,4371 +CTGTAGTGAGGATCGA-1,0,69,43,9751,4440 +GATAGTGCGAGTAAGT-1,0,68,44,9631,4509 +AGGGTTCAGACGGTCC-1,0,69,45,9751,4577 +GGACTCGACAGCGCAT-1,0,68,46,9631,4646 +CACTCTCAAGCATCGA-1,0,69,47,9751,4715 +GAGCGGAATGCGGTGT-1,0,68,48,9631,4784 +CAGTTCGAGGACCCGA-1,0,69,49,9751,4853 +CGTAACTTCGACACTT-1,0,68,50,9631,4922 +TGATCACCACACTGAC-1,0,69,51,9751,4990 +CATACTTCTTTCTCCG-1,0,68,52,9631,5059 +CAAGTAAGTGATAGAC-1,0,69,53,9751,5128 +AGCCCGCAACAAGCAG-1,0,68,54,9631,5197 +GCTCCATGCAAAGCAA-1,0,69,55,9751,5266 +TCGTACCGACGTCAAG-1,1,68,56,9631,5334 +ATTATCGGAATGTACG-1,0,69,57,9751,5403 +ACCTACTATAAATCTA-1,1,68,58,9631,5472 +TATCCTATCAACTGGT-1,0,69,59,9751,5541 +GCGCGGTCTAGTAACT-1,1,68,60,9631,5610 +CCTTCGTATAGAATCC-1,1,69,61,9751,5679 +TGGGCGATACAATAAG-1,1,68,62,9631,5747 +TGACATGTAACGTGAC-1,1,69,63,9751,5816 +TTGGGAAGACGAGCCG-1,1,68,64,9631,5885 +GGTGTAAATCGATTGT-1,1,69,65,9751,5954 +GAACTGTGGAGAGACA-1,1,68,66,9631,6023 +TCCACATCGTATATTG-1,1,69,67,9751,6092 +CCTATGGTCAAAGCTG-1,1,68,68,9631,6160 +TCCTTGTCCTTTAATT-1,1,69,69,9751,6229 +AAGTTTATGGGCCCAA-1,1,68,70,9631,6298 +GTCCGGGTTCACATTA-1,1,69,71,9751,6367 +ATGTAGCGCGCGTAGG-1,1,68,72,9631,6436 +TACGGAAGCCAAACCA-1,1,69,73,9751,6505 +GCCCTGAGGATGGGCT-1,1,68,74,9631,6573 +CGGGCGATGGATCACG-1,1,69,75,9751,6642 +TGCGGACTTGACTCCG-1,1,68,76,9631,6711 +TAATACTAGAACAGAC-1,1,69,77,9751,6780 +TCAAATTGTTGTGCCG-1,1,68,78,9631,6849 +GGGCAGTCAACGCCAA-1,1,69,79,9751,6918 +TCGCTGCCAATGCTGT-1,1,68,80,9631,6986 +TACGTGGGCCCAGGGC-1,1,69,81,9751,7055 +GCCTACGTTCTGTGCA-1,1,68,82,9631,7124 +TTGCGTGTGTAGGCAT-1,1,69,83,9751,7193 +TCCTAAAGATTCAGAC-1,1,68,84,9631,7262 +TGGGTGCACAAGCCAT-1,1,69,85,9751,7331 +GGGAGCGACCGTAGTG-1,1,68,86,9631,7399 +CATAGAGGAGATACTA-1,1,69,87,9751,7468 +CTTCGATTGCGCAAGC-1,1,68,88,9631,7537 +GTGCCTGAGACCAAAC-1,1,69,89,9751,7606 +TCATCCTCAGCTGCTT-1,1,68,90,9631,7675 +TGCAACTACTGGTTGA-1,1,69,91,9751,7744 +ATGTTGATTAGAGACT-1,1,68,92,9631,7812 +GTTTCTAGAGGCGCGG-1,1,69,93,9751,7881 +TACAAGGGCTTCTTTA-1,1,68,94,9631,7950 +ACAGGCACGGATCCTT-1,1,69,95,9751,8019 +CCCAAGTCATTACACT-1,1,68,96,9631,8088 +ACTCTGACCTAATAGA-1,1,69,97,9751,8156 +GGATGGCTTGAAGTAT-1,1,68,98,9631,8225 +ACCCTCCCGTCAGGGC-1,1,69,99,9751,8294 +AGCTTCTTCTCGAGCA-1,1,68,100,9631,8363 +TTGCGCTTGATCAATA-1,1,69,101,9751,8432 +TGGGTGTAATAGATTT-1,1,68,102,9631,8501 +CATGGTTTATTAATCA-1,1,69,103,9751,8569 +TTGCCTTCTCGCCGGG-1,1,68,104,9631,8638 +TTAAAGTAAGTCGCCA-1,1,69,105,9751,8707 +AGTTGGCAAGGCTAGA-1,1,68,106,9631,8776 +CCGCACTTGCAATGAC-1,1,69,107,9751,8845 +AATGTTGTCGTGAGAC-1,1,68,108,9631,8914 +CCAAGGTTGCCCTTTC-1,1,69,109,9751,8982 +TGTGACTAGAGTTTGC-1,1,68,110,9631,9051 +TTGTGATCTGTTCAGT-1,1,69,111,9751,9120 +GGAGTTGATTCTGTGT-1,1,68,112,9631,9189 +GTAGTGAGCAACCTCA-1,1,69,113,9751,9258 +AAGACATACGTGGTTT-1,1,68,114,9631,9327 +CATCCCGAGATTCATA-1,0,69,115,9751,9395 +GGCCGCAGGAACCGCA-1,0,68,116,9631,9464 +CCAGAAACTGATGCGA-1,0,69,117,9751,9533 +ACCCGTAGTCTAGTTG-1,0,68,118,9631,9602 +AGGGTCTGGACGCAGT-1,0,69,119,9751,9671 +TTGAAACCCTCATTCC-1,0,68,120,9631,9740 +TCAATCCCGCGCCAAA-1,0,69,121,9751,9808 +AGGACATCGGCACACT-1,0,68,122,9631,9877 +GACAAGACGCCCGTGC-1,0,69,123,9751,9946 +GAGTAAATTAAGAACC-1,0,68,124,9631,10015 +TAAGTCGGTGAGCTAG-1,0,69,125,9751,10084 +CTTACTGACTCCTCTG-1,0,68,126,9631,10153 +TTAACTGATCGTTTGG-1,0,69,127,9751,10221 +GGGCGATCCATAGGCC-1,0,70,0,9871,1480 +CGTATTGTTTGGCGCC-1,0,71,1,9991,1549 +CGCGTGGGCCTGTGTT-1,0,70,2,9871,1618 +AAATCTGCCCGCGTCC-1,0,71,3,9991,1687 +GCTGAAGGGTTCTTGG-1,0,70,4,9871,1755 +TAATTGCGCTGATTAC-1,0,71,5,9991,1824 +TCGCGCGTTTACATGA-1,0,70,6,9871,1893 +TAACTGAAATACGCCT-1,0,71,7,9991,1962 +CCTGTCGTGTATGAAG-1,0,70,8,9871,2031 +CGGGAACGCCCTGCAT-1,0,71,9,9991,2100 +AGTTGCGGTCCTCAAC-1,0,70,10,9871,2168 +GGGTCCTTGGAAGAAG-1,0,71,11,9991,2237 +CGGGAAGTACCGTGGC-1,0,70,12,9871,2306 +ACGGTCACCGAGAACA-1,0,71,13,9991,2375 +TAGACTCAGTTGGCCT-1,0,70,14,9871,2444 +CCTTCCGCAACGCTGC-1,0,71,15,9991,2513 +CAGTGTTAATCTCTCA-1,0,70,16,9871,2581 +CAGGCCAGTACCACCT-1,0,71,17,9991,2650 +GATCGCTGTGGTGCGT-1,0,70,18,9871,2719 +GTATCTCGGGCGCTTT-1,0,71,19,9991,2788 +CCGGGCTAAGAATTTC-1,0,70,20,9871,2857 +CTTCACGCCCTGGTAC-1,0,71,21,9991,2925 +CGGATGAATGCTGTGA-1,0,70,22,9871,2994 +CTCTGCAGGCATTCTT-1,0,71,23,9991,3063 +TCAAAGTCACGGCGTC-1,0,70,24,9871,3132 +TGGGTTTCGGGCGTAC-1,0,71,25,9991,3201 +TGCTATGGCAAAGGGA-1,0,70,26,9871,3270 +TTCACGGTCGTCACGT-1,0,71,27,9991,3338 +CGTAAAGCAAGAAATC-1,0,70,28,9871,3407 +CTGATCCCTTTATGCA-1,0,71,29,9991,3476 +GAGTATACCCTAATCA-1,0,70,30,9871,3545 +CCACGGCAGGTGTAGG-1,0,71,31,9990,3614 +ACGTACTTTGGCACGG-1,0,70,32,9871,3683 +CCTGAGAATAAATGCA-1,0,71,33,9990,3751 +TTGATGCCGCTCGTCG-1,0,70,34,9871,3820 +GCCAGGAAAGAACACT-1,0,71,35,9990,3889 +TCCGACCGCTAATCAA-1,0,70,36,9871,3958 +TATATCAAAGTGATCT-1,0,71,37,9990,4027 +CCTCGGTTTCCTTGCC-1,0,70,38,9871,4096 +TAAATTTAGTAACACC-1,0,71,39,9990,4164 +CTCGTTACGGCTACCA-1,0,70,40,9871,4233 +GCCGTCGGTTTCGGGC-1,0,71,41,9990,4302 +GTTCCGTCCGCCTGCA-1,0,70,42,9871,4371 +CTAGGGATAGGGACAA-1,0,71,43,9990,4440 +GTCCAGGCACGTGTGC-1,0,70,44,9871,4509 +GAGGAATATCTCTTTG-1,0,71,45,9990,4577 +CGTTCAAGGAAACGGA-1,0,70,46,9871,4646 +GTGGGAACAAACCGGG-1,0,71,47,9990,4715 +GGGCACGTAGTACTGT-1,0,70,48,9871,4784 +ACTACAAAGAGAGGTG-1,0,71,49,9990,4853 +GGTGTAGGTAAGTAAA-1,0,70,50,9871,4922 +CCTGTTCAACCTCGGG-1,0,71,51,9990,4990 +TGAGGTGTGTGGCGGA-1,0,70,52,9871,5059 +ATTGTCTGTTTCATGT-1,0,71,53,9990,5128 +GCCGGTCGTATCTCTC-1,0,70,54,9871,5197 +ATATGGGATAGCAACT-1,0,71,55,9990,5266 +GATAGAACCCGCTAGG-1,0,70,56,9871,5335 +ATCCCATTTCCGTGGG-1,0,71,57,9990,5403 +GATGCTACCTTCGATG-1,0,70,58,9871,5472 +TGCAAAGTTCGTCTGT-1,0,71,59,9990,5541 +GTTCAGTCGCCAAATG-1,0,70,60,9871,5610 +GTCTCCGCCTCAATAC-1,0,71,61,9990,5679 +AGTAGAAGGCGCCTCA-1,0,70,62,9871,5747 +GTTGTAGATTTATGAG-1,0,71,63,9990,5816 +CTATTTGCTTGGAGGA-1,1,70,64,9871,5885 +AGCCATATAGTATGTG-1,0,71,65,9990,5954 +TGTTCCGGCCTGAGCT-1,1,70,66,9871,6023 +TGCCGTGGGACCCAAT-1,1,71,67,9990,6092 +TTGCAAGAAGACTCCT-1,1,70,68,9871,6160 +CCGCTCCAGGGCGATC-1,1,71,69,9990,6229 +CAAACCCTCCGGCGGG-1,1,70,70,9871,6298 +CGGACCTTTACGTCCC-1,1,71,71,9990,6367 +ACGTAGGAGAGTCGCT-1,1,70,72,9871,6436 +CTGCGACCTCGCCGAA-1,1,71,73,9990,6505 +GGCCCAGCTGGTTTGC-1,1,70,74,9871,6573 +GGATTAATCATGGACC-1,1,71,75,9990,6642 +GAGATGGCTTTAATCA-1,1,70,76,9871,6711 +AGTACAGAAGCTTATA-1,1,71,77,9990,6780 +GCGGCTTTAGCAAGTT-1,1,70,78,9871,6849 +ACCGAGTCTCCTTATT-1,1,71,79,9990,6918 +GACCACACTTCCCTTT-1,1,70,80,9871,6986 +TGTAGCCAATTCCGTT-1,1,71,81,9990,7055 +CTCGTCTGTGCCTTCG-1,1,70,82,9871,7124 +GGACTCTTTGACTAAG-1,1,71,83,9990,7193 +TCATCGACGACCGTCG-1,1,70,84,9871,7262 +TACTACGTGCAATGCG-1,1,71,85,9990,7331 +CCCTACTTGAACAATG-1,1,70,86,9871,7399 +GCAGCTGTCAACGCAT-1,1,71,87,9990,7468 +ATCTACCATCTGCTCC-1,1,70,88,9871,7537 +TCTCAAATCAATCGGG-1,1,71,89,9990,7606 +ACTCCGGCCGACCACT-1,1,70,90,9871,7675 +TACACCTCTTCGAATC-1,1,71,91,9990,7744 +GTGGCTGTTTCTGTTC-1,1,70,92,9871,7812 +ACGACTCTAGGGCCGA-1,1,71,93,9990,7881 +TCGTTTACGCGACCCT-1,1,70,94,9871,7950 +AGGATATCCGACTGCA-1,1,71,95,9990,8019 +GACACTTCCAATTACC-1,1,70,96,9871,8088 +ACGGTACAGTTCAATG-1,1,71,97,9990,8157 +CTTGATGACCATCCAG-1,1,70,98,9871,8225 +CTGGTAAAGACTTACA-1,1,71,99,9990,8294 +CTTGCCCACCCACGCA-1,1,70,100,9871,8363 +CATTACGCAGGAAGGG-1,1,71,101,9990,8432 +GGACAACCATGAAGCC-1,1,70,102,9871,8501 +GTTATCAAGCTATCGA-1,1,71,103,9990,8569 +AGGTGCACGTCCACAT-1,1,70,104,9871,8638 +AAAGAATGTGGACTAA-1,1,71,105,9990,8707 +ACCAAGTCATCGGCAG-1,1,70,106,9871,8776 +AGTAACTATAGCAGCC-1,1,71,107,9990,8845 +GGGAAAGAATGCCAAC-1,1,70,108,9871,8914 +AATCGGTATAGCCCTC-1,1,71,109,9990,8982 +GGCACTGCGGTGGTTT-1,1,70,110,9871,9051 +CGTCCTCATCGCGTGC-1,1,71,111,9990,9120 +CTTAACTTACAGTATA-1,1,70,112,9871,9189 +GTGAGTCGACTAATAG-1,1,71,113,9990,9258 +TGTACTTCCGGGCATG-1,1,70,114,9871,9327 +CACAAACCGCAGAACT-1,0,71,115,9990,9395 +GCTTTACACAACTGGG-1,0,70,116,9871,9464 +CACCGATGATGGGTAC-1,0,71,117,9990,9533 +TCAATATACAGGAGGC-1,0,70,118,9871,9602 +AACGACCTCCTAGCCG-1,0,71,119,9990,9671 +GTTACCAAGGCGTACG-1,0,70,120,9871,9740 +TAGCTCACTGTGTTTG-1,0,71,121,9990,9808 +TCGGCAGGGTTAAGGG-1,0,70,122,9871,9877 +TGTTAACAAAGTGACT-1,0,71,123,9990,9946 +CAGAGCGATGGATGCT-1,0,70,124,9871,10015 +CATAGTGGGCACGCCT-1,0,71,125,9990,10084 +AAACGCTGGGCACGAC-1,0,70,126,9870,10153 +TGTTCTCATACTATAG-1,0,71,127,9990,10221 +TCCGCTGGGTCGATCG-1,0,72,0,10110,1480 +TTAGCATCCCTCACGT-1,0,73,1,10230,1549 +AGCCTTGTCACTGATA-1,0,72,2,10110,1618 +GTTTCTTGTTAGAGCT-1,0,73,3,10230,1687 +TCGGAGTCCTGGTTGC-1,0,72,4,10110,1755 +ACGGGTTGTGACCTGT-1,0,73,5,10230,1824 +TGACAGAAATCTTGCT-1,0,72,6,10110,1893 +TAGCCATGATTGCCTA-1,0,73,7,10230,1962 +CGAAGCCACAGCATGG-1,0,72,8,10110,2031 +ACCCGTAGCAGAGAAT-1,0,73,9,10230,2100 +AGCTTGATCAGGGTAG-1,0,72,10,10110,2168 +CTATAAGTAGGGTTTG-1,0,73,11,10230,2237 +TATAGTTAGGTGTACT-1,0,72,12,10110,2306 +TACGCTGATAGTTGTA-1,0,73,13,10230,2375 +TTCTCAATTGCTACAA-1,0,72,14,10110,2444 +GTTGCCCTAACGGGTG-1,0,73,15,10230,2513 +GACATTTCGCCCAGCC-1,0,72,16,10110,2581 +GTAACTACGTAGACCT-1,0,73,17,10230,2650 +CCAGTGTACAGACCGA-1,0,72,18,10110,2719 +GCCCGATGCCCAGTTC-1,0,73,19,10230,2788 +CGAACCTCTTTCCTAG-1,0,72,20,10110,2857 +CATGCACATGAGAGGC-1,0,73,21,10230,2925 +CCAAATCAAAGGGCAA-1,0,72,22,10110,2994 +GTAGTTTAAGCACACG-1,0,73,23,10230,3063 +TAAGTGAATAGTCTAC-1,0,72,24,10110,3132 +GGTCCACGTCTATTTG-1,0,73,25,10230,3201 +CCCTCAGATCGAGAAC-1,0,72,26,10110,3270 +ACATTCGCGCGGAATA-1,0,73,27,10230,3338 +CTATGAACACCTTGCC-1,0,72,28,10110,3407 +CGAATGGTAGGTCGTC-1,0,73,29,10230,3476 +TCGACATAGCGTAGCG-1,0,72,30,10110,3545 +GACGTTGCTCGGCGGC-1,0,73,31,10230,3614 +CTCGAGGCAAGTTTCA-1,0,72,32,10110,3683 +GCTGGGAGCGCGTCAA-1,0,73,33,10230,3751 +GACGATATCACTGGGT-1,0,72,34,10110,3820 +CAGCTCTGGGCTCACT-1,0,73,35,10230,3889 +TAGTCTGCGGCACATT-1,0,72,36,10110,3958 +TGGTCGATATACCTCT-1,0,73,37,10230,4027 +TTCAGTTCAAGAGGAG-1,0,72,38,10110,4096 +GTCTGTAGGTTGAACA-1,0,73,39,10230,4164 +GAGAGTCTCGGGAGAG-1,0,72,40,10110,4233 +TTGTTTGTATTACACG-1,0,73,41,10230,4302 +GCACAGCACGGGCCGA-1,0,72,42,10110,4371 +AAACAGTGTTCCTGGG-1,0,73,43,10230,4440 +TGGAGAATAATCGTCC-1,0,72,44,10110,4509 +CGCCGCGTTCTGAACG-1,0,73,45,10230,4577 +CATGCGTTGAGAGGAG-1,0,72,46,10110,4646 +TACGCTCCTAGAACTG-1,0,73,47,10230,4715 +CCTTGTGAACGTGGTT-1,0,72,48,10110,4784 +TTAAAGGCGATGCTCG-1,0,73,49,10230,4853 +TAAAGTGCACGTCTCG-1,0,72,50,10110,4922 +TGTCCGCAAACAATTC-1,0,73,51,10230,4990 +AGGCCTATCATACCAA-1,0,72,52,10110,5059 +ACTGGGATGCCAGTGC-1,0,73,53,10230,5128 +CGATCCACCATTGTTG-1,0,72,54,10110,5197 +GGGCATGCATGTCGAG-1,0,73,55,10230,5266 +TCCAGGCAGGACGATC-1,0,72,56,10110,5335 +CAATGACCCTTAATTT-1,0,73,57,10230,5403 +ATCAAGATCCCAGGAC-1,0,72,58,10110,5472 +CTCAGAGCTAATGTCG-1,0,73,59,10230,5541 +CTGCGATTTCGAGATT-1,0,72,60,10110,5610 +ATGGTATTGGGAACCG-1,0,73,61,10230,5679 +TAGGTTCTGCTGAGAA-1,0,72,62,10110,5747 +GCCTGTCCCGGTGCAT-1,0,73,63,10230,5816 +GGCCTGCTCTGATGTT-1,0,72,64,10110,5885 +TAGAGGGAGTTTATCT-1,0,73,65,10230,5954 +CTCTACATCCTGCGTG-1,0,72,66,10110,6023 +ACACATTTCCGTAGAC-1,0,73,67,10230,6092 +TGGGTGTTAAGTAGAA-1,0,72,68,10110,6160 +GAGCTCAACATGAGCG-1,0,73,69,10230,6229 +GCACACAGCTATTACC-1,0,72,70,10110,6298 +GCGACGGTAGTCTCCT-1,0,73,71,10230,6367 +GTATCAAGGTACTTCC-1,0,72,72,10110,6436 +GGAAAGGGAATTGAGC-1,0,73,73,10230,6505 +TACACAGCCGTGGTGC-1,1,72,74,10110,6573 +CGGTTGGGCAGGGTCC-1,0,73,75,10230,6642 +GCACGCCGATTCCCGC-1,1,72,76,10110,6711 +CGCTTTCCGCCAAGGT-1,0,73,77,10230,6780 +TGCCCGATAGTTAGAA-1,1,72,78,10110,6849 +TCAGAACGGCGGTAAT-1,0,73,79,10230,6918 +CCACTCAGATCCGCAA-1,1,72,80,10110,6986 +GAAGGGTCATTAAGAC-1,0,73,81,10230,7055 +GCGGTCTTGCTTTCAC-1,1,72,82,10110,7124 +GGAAGGACACCGTATA-1,0,73,83,10230,7193 +CGCGGGAATTCCTTTC-1,1,72,84,10110,7262 +TCTATCCGATTGCACA-1,0,73,85,10230,7331 +TACTCGTTTGAATCAA-1,1,72,86,10110,7399 +GTCTGCCGACTCGACG-1,0,73,87,10230,7468 +TACGGGTAATAACATA-1,1,72,88,10110,7537 +CCAGTTCGGTAACTCA-1,1,73,89,10230,7606 +CGTGCACACCACTGTA-1,1,72,90,10110,7675 +CTTCAGTTGGACAACG-1,1,73,91,10230,7744 +TGATCTATCACACTCT-1,1,72,92,10110,7812 +TAGCAGATACTTAGGG-1,1,73,93,10230,7881 +CACCGGGCATCACAAG-1,1,72,94,10110,7950 +AGTGGCCCGCAAATGG-1,1,73,95,10230,8019 +CTCGCTAGGTAAGCGA-1,1,72,96,10110,8088 +GATAGATAGTACAGTC-1,1,73,97,10230,8157 +CGAGACTACTGCTGCT-1,1,72,98,10110,8225 +ACATTTGAAACCTAAC-1,1,73,99,10230,8294 +GACACAGCCGGGACTG-1,1,72,100,10110,8363 +ACGGAACACGAGTGCC-1,1,73,101,10230,8432 +ACGCCAGTGCGTTTGC-1,1,72,102,10110,8501 +GCACCTAGGCGAGTCC-1,1,73,103,10230,8569 +TCACTATCCCTTCGGT-1,1,72,104,10110,8638 +TGAGTGTAACAACGGG-1,1,73,105,10230,8707 +ATTGGTTGTGCATTAC-1,1,72,106,10110,8776 +CTGGCGATTTACATGT-1,1,73,107,10230,8845 +TCCACCAAGACATAGG-1,1,72,108,10110,8914 +AACGTCGCTGCACTTC-1,1,73,109,10230,8982 +GTCTCCCGAGTCCCGT-1,1,72,110,10110,9051 +AGCCCGCACTACAATG-1,1,73,111,10230,9120 +GGCACGCTGCTACAGT-1,1,72,112,10110,9189 +GCTTGAGTGACCTCTG-1,1,73,113,10230,9258 +ATAGCCATAACAGTCA-1,1,72,114,10110,9327 +TAGGAGGCTCGAGAAC-1,1,73,115,10230,9395 +GTCGGGTGAAGTACCG-1,0,72,116,10110,9464 +CACCCGCGTTTGACAC-1,0,73,117,10230,9533 +TCTCAGGCTACTCGCT-1,0,72,118,10110,9602 +TAGATTCTCTAGCAAA-1,0,73,119,10230,9671 +CCCATTATTGTATCCT-1,0,72,120,10110,9740 +GTTAATAGCGTCATTA-1,0,73,121,10230,9808 +TACTCATTGACGCATC-1,0,72,122,10110,9877 +TAGTGACAAGCTCTAC-1,0,73,123,10230,9946 +ATCGCCGTGGTTCATG-1,0,72,124,10110,10015 +CTGCTCTCAACACACC-1,0,73,125,10230,10084 +GCATGACACAAAGGAA-1,0,72,126,10110,10153 +CAACGATCGATCCAAT-1,0,73,127,10230,10221 +ATACAGCGTCCACTGA-1,0,74,0,10350,1480 +TCACGATTAATACGTT-1,0,75,1,10470,1549 +CGTGAACTGACCCGAT-1,0,74,2,10350,1618 +TCGATGTTACGGCCGT-1,0,75,3,10470,1687 +GACCGGTGATACTCTC-1,0,74,4,10350,1755 +TCTGTTTAGATTGTTC-1,0,75,5,10470,1824 +GCTACTCGGACGCAGA-1,0,74,6,10350,1893 +AAGAAAGTTTGATGGG-1,0,75,7,10470,1962 +CGCCAGTAGTACCTTG-1,0,74,8,10350,2031 +CTCCCTTGTATCAAGG-1,0,75,9,10470,2100 +ACTTTATACACCACTT-1,0,74,10,10350,2168 +AGATCTGGAGAGGATA-1,0,75,11,10470,2237 +TCATCCATCTGATCAC-1,0,74,12,10350,2306 +AGAACACGGCGATGGT-1,0,75,13,10470,2375 +CCGCTCCGGATAAGCT-1,0,74,14,10350,2444 +TGGTCGGGTACAGGGC-1,0,75,15,10470,2513 +ACGGACGCAGCGACAA-1,0,74,16,10350,2581 +ACATGCTTACGGCAGC-1,0,75,17,10470,2650 +CAGGGAGATAGGCCAG-1,0,74,18,10350,2719 +TCGCCACCCGGATTAC-1,0,75,19,10470,2788 +TCTTGGTCAATGATAC-1,0,74,20,10350,2857 +CATAGGGACACTTGTG-1,0,75,21,10470,2926 +CACGAGCAAACCAGAC-1,0,74,22,10350,2994 +GGGATATTGATCGCCA-1,0,75,23,10470,3063 +TAATGTCGGTTCATGG-1,0,74,24,10350,3132 +CGATTTGTCATTAATG-1,0,75,25,10470,3201 +TTAAGATACCCAGAGA-1,0,74,26,10350,3270 +CGACCGTTGGTATTCG-1,0,75,27,10470,3338 +ACTACCATCCGAGGGC-1,0,74,28,10350,3407 +TCTACGCACGATCTCC-1,0,75,29,10470,3476 +AAGCCACTTGCAGGTA-1,0,74,30,10350,3545 +ACGTTGTCGTTGAAAG-1,0,75,31,10470,3614 +ACCGCTAGTCATTGGT-1,0,74,32,10350,3683 +CATGAGTCCATCACGG-1,0,75,33,10470,3751 +ATGTCTTGTTTGACTC-1,0,74,34,10350,3820 +TCCCAAACATCCTCTA-1,0,75,35,10470,3889 +CAACGCGATGAGCCAA-1,0,74,36,10350,3958 +GACACCCAAAGACGCG-1,0,75,37,10470,4027 +ACGTTCACTATGCCGC-1,0,74,38,10350,4096 +ATGGACTGCTTAGTTG-1,0,75,39,10470,4164 +CCATGGCAAACGCTCA-1,0,74,40,10350,4233 +TTGTCTCGGCAAGATG-1,0,75,41,10470,4302 +TTCGAACGAAACATGC-1,0,74,42,10350,4371 +GGAAAGTCTTGATTGT-1,0,75,43,10470,4440 +ATCATAGATCGACGAG-1,0,74,44,10350,4509 +GATTAGAAACAAGCGT-1,0,75,45,10470,4577 +GCTGCGAAGAATTATT-1,0,74,46,10350,4646 +TTCCAGTGGGTTTCGT-1,0,75,47,10470,4715 +GCTCATTGATCATATC-1,0,74,48,10350,4784 +ATACGAGGTTTGTAAG-1,0,75,49,10470,4853 +GTCTATACACGCATGG-1,0,74,50,10350,4922 +GATTTGCGCTAACACC-1,0,75,51,10469,4990 +TGGTGCCCTGCCTTAC-1,0,74,52,10350,5059 +TCGAATCGCAGGGTAG-1,0,75,53,10469,5128 +GGTAGGCCAATATCAC-1,0,74,54,10350,5197 +CGTAAATAACAAAGGG-1,0,75,55,10469,5266 +GACTCTAGAGTTCCAA-1,0,74,56,10350,5335 +ACTTGTTACCGGATCA-1,0,75,57,10469,5403 +GGCATTGAACATCTCA-1,0,74,58,10350,5472 +AACCCGCTGTATTCCA-1,0,75,59,10469,5541 +TAACAGGTTCCCTTAG-1,0,74,60,10350,5610 +GTTCTTGTAACTCAAT-1,0,75,61,10469,5679 +GATTCTGTTAATGAGT-1,0,74,62,10350,5747 +GGACACCTCGGTGTTG-1,0,75,63,10469,5816 +CGATCGAGAAGCACCA-1,0,74,64,10350,5885 +CTGCTCTGACGGCAAA-1,0,75,65,10469,5954 +CCCAGGAAGAATTCGA-1,0,74,66,10350,6023 +TGTCGTGGGTATAGGC-1,0,75,67,10469,6092 +ATATGTCTAGAGCGTG-1,0,74,68,10350,6160 +GCGGGCAGACGGGTGA-1,0,75,69,10469,6229 +CGAAGATCAGTTTCAT-1,0,74,70,10350,6298 +ACGCCACTCGAAACAG-1,0,75,71,10469,6367 +CTTAGATGTTTCATCC-1,0,74,72,10350,6436 +GCGAATGGACTAGCGA-1,0,75,73,10469,6505 +TAAATTGTGGGTAAAG-1,0,74,74,10350,6573 +ATTTATACTGGTAAAG-1,0,75,75,10469,6642 +GCGTCGTAACATGGTC-1,0,74,76,10350,6711 +CGGTATGGGCACTCTG-1,0,75,77,10469,6780 +CTATCACAACGCTGGA-1,0,74,78,10350,6849 +ACCACACGGTTGATGG-1,0,75,79,10469,6918 +TCAGCGCACGCCGTTT-1,0,74,80,10350,6986 +AATGTTAAGACCCTGA-1,0,75,81,10469,7055 +CTTACATAGATTTCTT-1,0,74,82,10350,7124 +AACATAGCGTGTATCG-1,0,75,83,10469,7193 +AGCAGTCGAAGCATGC-1,0,74,84,10350,7262 +GTACTACGGCCTCGTT-1,0,75,85,10469,7331 +TTGGCCAAATTGTATC-1,0,74,86,10350,7399 +TCAGAGGACGCGTTAG-1,0,75,87,10469,7468 +AGTAATCTAAGGGTGG-1,0,74,88,10350,7537 +AATTATACCCAGCAAG-1,0,75,89,10469,7606 +CCCTACCCACACCCAG-1,0,74,90,10350,7675 +CTCTGTCCATGCACCA-1,0,75,91,10469,7744 +TCGCCTCCTTCGGCTC-1,0,74,92,10350,7812 +CCTGATTCGCGAAGAA-1,0,75,93,10469,7881 +GACTTCAACGCATCAA-1,0,74,94,10350,7950 +GCTTCCCGTAAGCTCC-1,0,75,95,10469,8019 +AGAACTGTACTTTGTA-1,0,74,96,10350,8088 +CCTTAAGTACGCAATT-1,0,75,97,10469,8157 +GGCCAATTGTATAGAC-1,1,74,98,10350,8225 +AGAATACAGGCTATCC-1,0,75,99,10469,8294 +AATACCTGATGTGAAC-1,1,74,100,10350,8363 +TAGAGTGTTCCGGGTA-1,0,75,101,10469,8432 +GCTTCCATGTAACCGC-1,1,74,102,10350,8501 +GGTTCGCATTTGCCGT-1,0,75,103,10469,8569 +TCAATCCGGGAAGTTT-1,1,74,104,10350,8638 +CCGGAAGTGCAATATG-1,0,75,105,10469,8707 +CTCATAAATGTGTATA-1,1,74,106,10350,8776 +GACGGGCATCGAATTT-1,0,75,107,10469,8845 +GCTAAGCCCAGTATGC-1,1,74,108,10350,8914 +GCTATAAGGGCCAGGA-1,0,75,109,10469,8982 +GCGGATTACTTGTTCT-1,1,74,110,10350,9051 +TACAACAGCGCATACA-1,1,75,111,10469,9120 +TCTAACCTAGCCTGCG-1,1,74,112,10350,9189 +TCTACCCGCATCATTT-1,1,75,113,10469,9258 +GTCTTACCACGCCAAG-1,1,74,114,10350,9327 +AATAACGTCGCGCCCA-1,0,75,115,10469,9395 +CGTTTCGGTTATATGC-1,0,74,116,10350,9464 +TACGCTGCACGGTCGT-1,0,75,117,10469,9533 +CGTTAAATACGACCAG-1,0,74,118,10350,9602 +TCGACTGACGATGGCT-1,0,75,119,10469,9671 +ACGCTACTGAATGGGC-1,0,74,120,10350,9740 +AAGGGTTAGCCATGCG-1,0,75,121,10469,9808 +ACGTTTCGGTGCACTT-1,0,74,122,10350,9877 +TTAACCCGAGGCGTGT-1,0,75,123,10469,9946 +GCCCGTCAAGCCCAAT-1,0,74,124,10350,10015 +ATTCGTCCCGAGGTTA-1,0,75,125,10469,10084 +TCAAATTATGTTCGAC-1,0,74,126,10350,10153 +AACGTTCTACCATTGT-1,0,75,127,10469,10221 +CTGTCCTGCGCACTAC-1,0,76,0,10589,1480 +GCCCAGCGACACAAAG-1,0,77,1,10709,1549 +TATAGCTATTATCTCT-1,0,76,2,10589,1618 +AAGCTATGGATTGACC-1,0,77,3,10709,1687 +CCGAAACACGACCTCT-1,0,76,4,10589,1755 +ATCAGAAGCTGGTTGC-1,0,77,5,10709,1824 +TGAACCTGAATGTGAG-1,0,76,6,10589,1893 +TCAGAGCATGTCAACG-1,0,77,7,10709,1962 +ATACCCTCCCGGCCAA-1,0,76,8,10589,2031 +GCCACCTTATTCGCGA-1,0,77,9,10709,2100 +CAACGAGCTTATTATG-1,0,76,10,10589,2168 +GATCCAACCTTTAAAC-1,0,77,11,10709,2237 +TTGTGGAGACAGCCGG-1,0,76,12,10589,2306 +AGATAATCACACCTAT-1,0,77,13,10709,2375 +GGTTAGGGATGCTAAT-1,0,76,14,10589,2444 +TCATGAAGCGCTGCAT-1,0,77,15,10709,2513 +CCAGGCGAGATGGTCT-1,0,76,16,10589,2581 +CGACTTGCCGGGAAAT-1,0,77,17,10709,2650 +GTGCCAAACGTTTCGA-1,0,76,18,10589,2719 +TGCTCAAAGGATGCAC-1,0,77,19,10709,2788 +GCCTCAGGTACCGGTC-1,0,76,20,10589,2857 +ACAAGTAATTGTAAGG-1,0,77,21,10709,2926 +TTAGAGTATTGTCGAG-1,0,76,22,10589,2994 +GTCATCCCAAACTCAC-1,0,77,23,10709,3063 +CTCCTAGTAATCGTGA-1,0,76,24,10589,3132 +CCCTCATCACAGAGTA-1,0,77,25,10709,3201 +GGAAACAGAGCTTGGG-1,0,76,26,10589,3270 +ACATCGCAATATTCGG-1,0,77,27,10709,3338 +TTAGCCATAGGGCTCG-1,0,76,28,10589,3407 +CGGATTCTGCCTTATG-1,0,77,29,10709,3476 +TTGTTGGCAATGACTG-1,0,76,30,10589,3545 +GGATCTACCGTTCGTC-1,0,77,31,10709,3614 +GGTGGGATTAGGTCCC-1,0,76,32,10589,3683 +AATAGGCACGACCCTT-1,0,77,33,10709,3751 +GAGGTCCGTTCGCTGT-1,0,76,34,10589,3820 +TGACAACTTAAAGGTG-1,0,77,35,10709,3889 +AGCTAAGCTCCGTCCG-1,0,76,36,10589,3958 +CTAGCCCGGGAGACGA-1,0,77,37,10709,4027 +CCCAGATTCCCGTGAC-1,0,76,38,10589,4096 +GCCCGTTCACACAATT-1,0,77,39,10709,4164 +ACAAACTCCATCAGAG-1,0,76,40,10589,4233 +GGTTCCGTACGACTAA-1,0,77,41,10709,4302 +TTGCGGAAAGCTGCCC-1,0,76,42,10589,4371 +GGAACTCGTGAATACG-1,0,77,43,10709,4440 +GGTTACCGCTCCCTAC-1,0,76,44,10589,4509 +AGCGACTTTGAAGACA-1,0,77,45,10709,4577 +CCGTTTCCTTTCCGTG-1,0,76,46,10589,4646 +TGGATGGCATCTTGGA-1,0,77,47,10709,4715 +CAAGTCGTTGAAATCT-1,0,76,48,10589,4784 +TGCAAACGTACTAGTT-1,0,77,49,10709,4853 +GGCTGTCCTACTGCGG-1,0,76,50,10589,4922 +TACTGCATGATTAAAT-1,0,77,51,10709,4990 +CGGACCTCTGTAGTTA-1,0,76,52,10589,5059 +CCCTAGCTCTAAGGTC-1,0,77,53,10709,5128 +GTAACAGGTTAACGGC-1,0,76,54,10589,5197 +CCCGCAAATAATCATC-1,0,77,55,10709,5266 +AATCCCGCTCAGAGCC-1,0,76,56,10589,5335 +AACGTCATCCGGCTTG-1,0,77,57,10709,5403 +CTCGTGGCACTGAAAG-1,0,76,58,10589,5472 +CTTTATCCGACGCATG-1,0,77,59,10709,5541 +AAATGACTGATCAAAC-1,0,76,60,10589,5610 +TTCGTGCATGTTATAG-1,0,77,61,10709,5679 +ATCAAAGAGCCGTGGT-1,0,76,62,10589,5748 +ATGTCATAATAAACGA-1,0,77,63,10709,5816 +CTTAATCGACTTAGTA-1,0,76,64,10589,5885 +CTAAAGGATGAGATAC-1,0,77,65,10709,5954 +GTGCTATCCAGCTGGA-1,0,76,66,10589,6023 +GACAGAGGTCTTCAGT-1,0,77,67,10709,6092 +TCGATTTACGAAACGA-1,0,76,68,10589,6160 +AGGCTTAAGTTGCACA-1,0,77,69,10709,6229 +TAGGATCTTAACCGCA-1,0,76,70,10589,6298 +GACTTTCGAGCGGTTC-1,0,77,71,10709,6367 +CCCTGGGAGGGATCCT-1,0,76,72,10589,6436 +TAGTAGTTGCCGGACA-1,0,77,73,10709,6505 +GCCCTAAGTGCAGGAT-1,0,76,74,10589,6573 +ACTTGGGCTTTCGCCA-1,0,77,75,10709,6642 +CATGATACGGTGAAAC-1,0,76,76,10589,6711 +TCCTGCAGCCGCCAAT-1,0,77,77,10709,6780 +GTCCGTTAGAGGGCCT-1,0,76,78,10589,6849 +GCTTTATTAAGTTACC-1,0,77,79,10709,6918 +AATCGAGGTCTCAAGG-1,0,76,80,10589,6986 +GTGCTGTTAGAACATA-1,0,77,81,10709,7055 +GGCTTCTCGTGGGTGG-1,0,76,82,10589,7124 +CCTACAGTTGAGGGAG-1,0,77,83,10709,7193 +TATCCCTCGATCTGCA-1,0,76,84,10589,7262 +CCGGTATCTGGCGACT-1,0,77,85,10709,7331 +CTCTAACACCGGCAGC-1,0,76,86,10589,7399 +CTTCATCACCAGGGCT-1,0,77,87,10709,7468 +GGCTGGCAATCCCACG-1,0,76,88,10589,7537 +CAAACCATAAGCGTAT-1,0,77,89,10709,7606 +CATGTGGGCTCATCAC-1,0,76,90,10589,7675 +CCCGTGACAGTGCCTT-1,0,77,91,10709,7744 +GATTATCTTGCATTAT-1,0,76,92,10589,7812 +GAGTCCACCAGGTTTA-1,0,77,93,10709,7881 +TGTACTATCGCTCGTT-1,0,76,94,10589,7950 +TTAGCGAATAGATAGG-1,0,77,95,10709,8019 +ACATACAATCAAGCGG-1,0,76,96,10589,8088 +ATTCGTGTACCCATTC-1,0,77,97,10709,8157 +GCTAGCAACGCACCTA-1,0,76,98,10589,8225 +ACCTCAGCGAGGCGCA-1,0,77,99,10709,8294 +TCCGGGCCACTAACGG-1,0,76,100,10589,8363 +TCCCAATATCGACGAC-1,0,77,101,10709,8432 +GGATTGAAGTAGCCTC-1,0,76,102,10589,8501 +GGCGCACAGTTTACCT-1,0,77,103,10709,8570 +CCCGGCACGTGTCAGG-1,0,76,104,10589,8638 +AGTAAGGGACAGAATC-1,0,77,105,10709,8707 +TTGCGCACAACCACGT-1,0,76,106,10589,8776 +CCTGCTACAACCATAC-1,0,77,107,10709,8845 +CTGGGCTACTGGAGAG-1,0,76,108,10589,8914 +AGCTACGAATGGTGGT-1,0,77,109,10709,8982 +ATTCGTTTATCGTATT-1,0,76,110,10589,9051 +GGCATTCCCTCCCTCG-1,0,77,111,10709,9120 +AGTTATTCAGACTGTG-1,0,76,112,10589,9189 +CCACTTTCCTTCTAGG-1,0,77,113,10709,9258 +CGCAGTTCTATCTTTC-1,0,76,114,10589,9327 +AGGAGCGTTTATTATC-1,0,77,115,10709,9395 +GACAGGTAATCCGTGT-1,0,76,116,10589,9464 +TTCCCAAAGTACTGAT-1,0,77,117,10709,9533 +CTGCAGGGTGACGCTC-1,0,76,118,10589,9602 +TCATGGAGGCCTTTGT-1,0,77,119,10709,9671 +ATGGCCCGAAAGGTTA-1,0,76,120,10589,9740 +CGTAATATGGCCCTTG-1,0,77,121,10709,9808 +AGAGTCTTAATGAAAG-1,0,76,122,10589,9877 +GAACGTTTGTATCCAC-1,0,77,123,10709,9946 +ATTGAATTCCCTGTAG-1,0,76,124,10589,10015 +TACCTCACCAATTGTA-1,0,77,125,10709,10084 +AGTCGAATTAGCGTAA-1,0,76,126,10589,10153 +TTGAAGTGCATCTACA-1,0,77,127,10709,10221 diff --git a/tests/testthat/test_differential_expression.R b/tests/testthat/test_differential_expression.R index 8dce1582a..5173fd433 100644 --- a/tests/testthat/test_differential_expression.R +++ b/tests/testthat/test_differential_expression.R @@ -168,7 +168,8 @@ test_that("bimod test works", { results <- FindMarkers(object = pbmc_small, ident.1 = 0, ident.2 = 1, test.use = "roc", verbose = FALSE) test_that("roc test works", { expect_equal(nrow(x = results), 201) - expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "pct.1", "pct.2")) + # expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "pct.1", "pct.2")) + expect_equal(colnames(x = results), c("myAUC", "avg_diff", "power", "avg_logFC", "pct.1", "pct.2")) expect_equal(results["CST3", "myAUC"], 0.018) expect_equal(results["CST3", "avg_diff"], -2.552769, tolerance = 1e-6) expect_equal(results["CST3", "power"], 0.964) diff --git a/tests/testthat/test_load_10X.R b/tests/testthat/test_load_10X.R index 1ab15b134..7767cc2bd 100644 --- a/tests/testthat/test_load_10X.R +++ b/tests/testthat/test_load_10X.R @@ -26,3 +26,25 @@ test_that("Read10X handles missing files properly", { expect_error(Read10X("./notadir/")) expect_error(Read10X(dname, gene.column = 10)) }) + +# Tests for reading in spatial 10x data +context("Load10X_Spatial") +dname <- "../testdata/visium" +# txsp <- Read10X_Spatial(outs_path = "../testdata/visium/") +txsp <- Load10X_Spatial(data.dir = '../testdata/visium') + +test_that("10x Spatial Data Parsing", { + expect_is(txsp, "Seurat") + expect_equal(ncol(x = txsp), 2695) + expect_equal(nrow(x = txsp), 100) + expect_equal(Cells(x = txsp)[1], "AAACAAGTATCTCCCA-1") + expect_equal(Assays(object = txsp), "Spatial") + expect_equal(GetAssayData(object = txsp[["Spatial"]], slot = "counts")[5, 9], 1) +}) + +test_that("Read10X_Spatial handles missing files properly", { + expect_error(Load10X_Spatial(data.dir = ".")) + expect_error(Load10X_Spatial(data.dir = "./notadir/")) +}) + +