Diff of /docs/conversion.html [000000] .. [413088]

Switch to side-by-side view

--- a
+++ b/docs/conversion.html
@@ -0,0 +1,812 @@
+<!DOCTYPE html>
+
+<html>
+
+<head>
+
+<meta charset="utf-8" />
+<meta name="generator" content="pandoc" />
+<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
+
+
+
+
+<title>Conversion</title>
+
+<script src="site_libs/header-attrs-2.29/header-attrs.js"></script>
+<script src="site_libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<link href="site_libs/bootstrap-3.3.5/css/flatly.min.css" rel="stylesheet" />
+<script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
+<script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
+<script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script>
+<style>h1 {font-size: 34px;}
+       h1.title {font-size: 38px;}
+       h2 {font-size: 30px;}
+       h3 {font-size: 24px;}
+       h4 {font-size: 18px;}
+       h5 {font-size: 16px;}
+       h6 {font-size: 12px;}
+       code {color: inherit; background-color: rgba(0, 0, 0, 0.04);}
+       pre:not([class]) { background-color: white }</style>
+<script src="site_libs/jqueryui-1.13.2/jquery-ui.min.js"></script>
+<link href="site_libs/tocify-1.9.1/jquery.tocify.css" rel="stylesheet" />
+<script src="site_libs/tocify-1.9.1/jquery.tocify.js"></script>
+<script src="site_libs/navigation-1.1/tabsets.js"></script>
+<link href="site_libs/highlightjs-9.12.0/textmate.css" rel="stylesheet" />
+<script src="site_libs/highlightjs-9.12.0/highlight.js"></script>
+<link href="site_libs/font-awesome-6.5.2/css/all.min.css" rel="stylesheet" />
+<link href="site_libs/font-awesome-6.5.2/css/v4-shims.min.css" rel="stylesheet" />
+
+<style type="text/css">
+  code{white-space: pre-wrap;}
+  span.smallcaps{font-variant: small-caps;}
+  span.underline{text-decoration: underline;}
+  div.column{display: inline-block; vertical-align: top; width: 50%;}
+  div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
+  ul.task-list{list-style: none;}
+    </style>
+
+<style type="text/css">code{white-space: pre;}</style>
+<script type="text/javascript">
+if (window.hljs) {
+  hljs.configure({languages: []});
+  hljs.initHighlightingOnLoad();
+  if (document.readyState && document.readyState === "complete") {
+    window.setTimeout(function() { hljs.initHighlighting(); }, 0);
+  }
+}
+</script>
+
+
+
+
+
+
+
+
+
+<style type = "text/css">
+.main-container {
+  max-width: 940px;
+  margin-left: auto;
+  margin-right: auto;
+}
+img {
+  max-width:100%;
+}
+.tabbed-pane {
+  padding-top: 12px;
+}
+.html-widget {
+  margin-bottom: 20px;
+}
+button.code-folding-btn:focus {
+  outline: none;
+}
+summary {
+  display: list-item;
+}
+details > summary > p:only-child {
+  display: inline;
+}
+pre code {
+  padding: 0;
+}
+</style>
+
+
+<style type="text/css">
+.dropdown-submenu {
+  position: relative;
+}
+.dropdown-submenu>.dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  border-radius: 0 6px 6px 6px;
+}
+.dropdown-submenu:hover>.dropdown-menu {
+  display: block;
+}
+.dropdown-submenu>a:after {
+  display: block;
+  content: " ";
+  float: right;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #cccccc;
+  margin-top: 5px;
+  margin-right: -10px;
+}
+.dropdown-submenu:hover>a:after {
+  border-left-color: #adb5bd;
+}
+.dropdown-submenu.pull-left {
+  float: none;
+}
+.dropdown-submenu.pull-left>.dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  border-radius: 6px 0 6px 6px;
+}
+</style>
+
+<script type="text/javascript">
+// manage active state of menu based on current page
+$(document).ready(function () {
+  // active menu anchor
+  href = window.location.pathname
+  href = href.substr(href.lastIndexOf('/') + 1)
+  if (href === "")
+    href = "index.html";
+  var menuAnchor = $('a[href="' + href + '"]');
+
+  // mark the anchor link active (and if it's in a dropdown, also mark that active)
+  var dropdown = menuAnchor.closest('li.dropdown');
+  if (window.bootstrap) { // Bootstrap 4+
+    menuAnchor.addClass('active');
+    dropdown.find('> .dropdown-toggle').addClass('active');
+  } else { // Bootstrap 3
+    menuAnchor.parent().addClass('active');
+    dropdown.addClass('active');
+  }
+
+  // Navbar adjustments
+  var navHeight = $(".navbar").first().height() + 15;
+  var style = document.createElement('style');
+  var pt = "padding-top: " + navHeight + "px; ";
+  var mt = "margin-top: -" + navHeight + "px; ";
+  var css = "";
+  // offset scroll position for anchor links (for fixed navbar)
+  for (var i = 1; i <= 6; i++) {
+    css += ".section h" + i + "{ " + pt + mt + "}\n";
+  }
+  style.innerHTML = "body {" + pt + "padding-bottom: 40px; }\n" + css;
+  document.head.appendChild(style);
+});
+</script>
+
+<!-- tabsets -->
+
+<style type="text/css">
+.tabset-dropdown > .nav-tabs {
+  display: inline-table;
+  max-height: 500px;
+  min-height: 44px;
+  overflow-y: auto;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+}
+
+.tabset-dropdown > .nav-tabs > li.active:before, .tabset-dropdown > .nav-tabs.nav-tabs-open:before {
+  content: "\e259";
+  font-family: 'Glyphicons Halflings';
+  display: inline-block;
+  padding: 10px;
+  border-right: 1px solid #ddd;
+}
+
+.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
+  content: "\e258";
+  font-family: 'Glyphicons Halflings';
+  border: none;
+}
+
+.tabset-dropdown > .nav-tabs > li.active {
+  display: block;
+}
+
+.tabset-dropdown > .nav-tabs > li > a,
+.tabset-dropdown > .nav-tabs > li > a:focus,
+.tabset-dropdown > .nav-tabs > li > a:hover {
+  border: none;
+  display: inline-block;
+  border-radius: 4px;
+  background-color: transparent;
+}
+
+.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
+  display: block;
+  float: none;
+}
+
+.tabset-dropdown > .nav-tabs > li {
+  display: none;
+}
+</style>
+
+<!-- code folding -->
+
+
+
+<style type="text/css">
+
+#TOC {
+  margin: 25px 0px 20px 0px;
+}
+@media (max-width: 768px) {
+#TOC {
+  position: relative;
+  width: 100%;
+}
+}
+
+@media print {
+.toc-content {
+  /* see https://github.com/w3c/csswg-drafts/issues/4434 */
+  float: right;
+}
+}
+
+.toc-content {
+  padding-left: 30px;
+  padding-right: 40px;
+}
+
+div.main-container {
+  max-width: 1200px;
+}
+
+div.tocify {
+  width: 20%;
+  max-width: 260px;
+  max-height: 85%;
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+  div.tocify {
+    width: 25%;
+  }
+}
+
+@media (max-width: 767px) {
+  div.tocify {
+    width: 100%;
+    max-width: none;
+  }
+}
+
+.tocify ul, .tocify li {
+  line-height: 20px;
+}
+
+.tocify-subheader .tocify-item {
+  font-size: 0.90em;
+}
+
+.tocify .list-group-item {
+  border-radius: 0px;
+}
+
+.tocify-subheader {
+  display: inline;
+}
+.tocify-subheader .tocify-item {
+  font-size: 0.95em;
+}
+
+</style>
+
+
+
+</head>
+
+<body>
+
+
+<div class="container-fluid main-container">
+
+
+<!-- setup 3col/9col grid for toc_float and main content  -->
+<div class="row">
+<div class="col-xs-12 col-sm-4 col-md-3">
+<div id="TOC" class="tocify">
+</div>
+</div>
+
+<div class="toc-content col-xs-12 col-sm-8 col-md-9">
+
+
+
+
+<div class="navbar navbar-default  navbar-fixed-top" role="navigation">
+  <div class="container">
+    <div class="navbar-header">
+      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-bs-toggle="collapse" data-target="#navbar" data-bs-target="#navbar">
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+      </button>
+      <a class="navbar-brand" href="index.html">VoltRon</a>
+    </div>
+    <div id="navbar" class="navbar-collapse collapse">
+      <ul class="nav navbar-nav">
+        <li>
+  <a href="tutorials.html">Explore</a>
+</li>
+<li class="dropdown">
+  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
+    Vignette
+     
+    <span class="caret"></span>
+  </a>
+  <ul class="dropdown-menu" role="menu">
+    <li class="dropdown-submenu">
+      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">Spatial Data Integration</a>
+      <ul class="dropdown-menu" role="menu">
+        <li>
+          <a href="registration.html">Spatial Data Alignment</a>
+        </li>
+        <li>
+          <a href="multiomic.html">Multi-omic Integration</a>
+        </li>
+        <li>
+          <a href="nicheclustering.html">Niche Clustering</a>
+        </li>
+      </ul>
+    </li>
+    <li class="dropdown-submenu">
+      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">Downstream Analysis</a>
+      <ul class="dropdown-menu" role="menu">
+        <li>
+          <a href="roianalysis.html">ROI Analysis</a>
+        </li>
+        <li>
+          <a href="spotanalysis.html">Cell/Spot Analysis</a>
+        </li>
+        <li>
+          <a href="moleculeanalysis.html">Molecule Analysis</a>
+        </li>
+        <li>
+          <a href="pixelanalysis.html">Pixels (Image Only) Analysis</a>
+        </li>
+      </ul>
+    </li>
+    <li class="dropdown-submenu">
+      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">Utilities</a>
+      <ul class="dropdown-menu" role="menu">
+        <li>
+          <a href="interactive.html">Interactive Utilities</a>
+        </li>
+        <li>
+          <a href="importingdata.html">Importing Spatial Data</a>
+        </li>
+        <li>
+          <a href="voltronobjects.html">Working with VoltRon Objects</a>
+        </li>
+        <li>
+          <a href="conversion.html">Converting VoltRon Objects</a>
+        </li>
+        <li>
+          <a href="ondisk.html">OnDisk-based Analysis Utilities</a>
+        </li>
+      </ul>
+    </li>
+  </ul>
+</li>
+      </ul>
+      <ul class="nav navbar-nav navbar-right">
+        <li class="dropdown">
+  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
+    <span class="fa fa-envelope-o"></span>
+     
+    Contact
+     
+    <span class="caret"></span>
+  </a>
+  <ul class="dropdown-menu" role="menu">
+    <li>
+      <a href="https://bioinformatics.mdc-berlin.de">Altuna Lab/BIMSB Bioinfo</a>
+    </li>
+    <li>
+      <a href="https://www.mdc-berlin.de/landthaler">Landthaler Lab/BIMSB</a>
+    </li>
+  </ul>
+</li>
+<li class="dropdown">
+  <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
+    <span class="fa fa-github"></span>
+     
+    GitHub
+     
+    <span class="caret"></span>
+  </a>
+  <ul class="dropdown-menu" role="menu">
+    <li>
+      <a href="https://github.com/BIMSBbioinfo/VoltRon">VoltRon</a>
+    </li>
+    <li>
+      <a href="https://github.com/BIMSBbioinfo">BIMSB Bioinfo</a>
+    </li>
+  </ul>
+</li>
+      </ul>
+    </div><!--/.nav-collapse -->
+  </div><!--/.container -->
+</div><!--/.navbar -->
+
+<div id="header">
+
+
+
+<h1 class="title toc-ignore">Conversion</h1>
+
+</div>
+
+
+<style>
+.title{
+  display: none;
+}
+body {
+  text-align: justify   
+}
+.center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+</style>
+<style type="text/css">
+.watch-out {
+  color: black;
+}
+</style>
+<p><br></p>
+<div id="conversion-to-other-platforms" class="section level1">
+<h1>Conversion to Other Platforms</h1>
+<p>VoltRon is capable of end-to-end spatial data analysis for all levels
+of spatial resolutions, including those of single cell resolution.
+However, VoltRon provides a ecosystem friendly infrastructure where
+VoltRon objects could be transformed into data structures used by
+popular computational platforms such as <a
+href="https://satijalab.org/seurat/">Seurat</a>, <a
+href="https://squidpy.readthedocs.io/en/stable/">Squidpy</a> and even <a
+href="http://vitessce.io/docs/data-file-types/#anndata-zarr">Zarr</a>
+for interactive spatial data visualizatiob with <a
+href="http://vitessce.io/">Vitessce</a>.</p>
+<p>For both <strong>Seurat (R)</strong> and <strong>Squidpy
+(Python)</strong>, we analyse readouts of the experiments conducted on
+example tissue sections analysed by the <a
+href="https://www.10xgenomics.com/platforms/xenium">Xenium In Situ</a>
+platform. For more information on processing and analyzing Xenium
+datasets, check the <a href="spotanalysis.html">Cell/Spot Analysis</a>
+tutorial.</p>
+<p><br></p>
+<div id="seurat" class="section level2">
+<h2>Seurat</h2>
+<p>We will first see how we can transform VoltRon objects into Seurat
+object and use built-in functions such as
+<strong>FindAllMarkers</strong> to visualize marker genes of clusters
+found by VoltRon. You can find the clustered Xenium data using VoltRon
+<a
+href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered.rds">here</a>.</p>
+<pre class="r watch-out"><code>Xen_data &lt;- readRDS(&quot;Xenium_data_clustered.rds&quot;)
+SampleMetadata(Xen_data)</code></pre>
+<pre><code>        Assay    Layer   Sample
+Assay1 Xenium Section1 XeniumR1
+Assay3 Xenium Section1 XeniumR2</code></pre>
+<p><br></p>
+<p>We use the <strong>as.Seurat</strong> function to convert spatial
+assays of VoltRon into Seurat objects. Here, a Seurat object defines
+spatial components of cellular and subcellular assays as
+<strong>FOV</strong> objects, and we use the <strong>type =
+“image”</strong> argument to convert spatial coordinates of cells and
+molecules into individual FOV objects for each Xenium assay/layer in the
+VoltRon object.</p>
+<p>Please check the <a
+href="https://satijalab.org/seurat/articles/seurat5_spatial_vignette_2">Analysis
+of Image-based Spatial Data in Seurat</a> tutorial for more information
+on analyzing FOV-based spatial data sets with Seurat.</p>
+<p>note: Use VoltRon::as.Seurat to avoid conflict with Seurat package’s
+as.Seurat function</p>
+<pre class="r watch-out"><code>library(Seurat)
+Xen_data_seu &lt;- VoltRon::as.Seurat(Xen_data, cell.assay = &quot;Xenium&quot;, type = &quot;image&quot;)
+Xen_data_seu &lt;- NormalizeData(Xen_data_seu)
+Xen_data_seu</code></pre>
+<pre><code>An object of class Seurat 
+313 features across 283298 samples within 1 assay 
+Active assay: Xenium (313 features, 0 variable features)
+ 1 layers present: counts
+ 2 dimensional reductions calculated: pca, umap
+ 2 spatial fields of view present: fov_Assay1 fov_Assay3</code></pre>
+<p><br></p>
+<div id="marker-analysis" class="section level3">
+<h3>Marker Analysis</h3>
+<p>Now that we converted VoltRon into a Seurat object, we can pick the
+<strong>Clusters</strong> metadata column indicating the clustering of
+cells and test for marker genes of each individual cluster.</p>
+<pre class="r watch-out"><code>Idents(Xen_data_seu) &lt;- &quot;Clusters&quot;
+markers &lt;- FindAllMarkers(Xen_data_seu)
+head(markers[order(markers$avg_log2FC, decreasing = TRUE),])</code></pre>
+<div>
+<pre><code style="font-size: 13px;">         p_val avg_log2FC pct.1 pct.2 p_val_adj cluster   gene
+CPA3         0   7.343881 0.977 0.029         0      16   CPA3
+CTSG         0   7.114698 0.878 0.011         0      16   CTSG
+LILRA4.1     0   6.992717 0.939 0.015         0      19 LILRA4
+ADIPOQ       0   6.860190 0.974 0.025         0       5 ADIPOQ
+MS4A1        0   6.763083 0.919 0.027         0      17  MS4A1
+BANK1        0   6.082192 0.889 0.037         0      17  BANK1</code></pre>
+</div>
+<p><br></p>
+</div>
+<div id="visualization" class="section level3">
+<h3>Visualization</h3>
+<p>We can now pick top positive markers from each of these clusters
+prior to visualization.</p>
+<pre class="r watch-out"><code>library(dplyr)
+topmarkers &lt;- markers %&gt;%
+  group_by(cluster) %&gt;%
+  top_n(n = 5, wt = avg_log2FC)</code></pre>
+<p>Here, VoltRon incorporates the unique markers learned by the
+<strong>FindAllMarkers</strong> function from Seurat and uses them to
+visualize the expression of these markers on heatmaps, and now we can
+also use these markers for annotating the clusters.</p>
+<pre class="r watch-out"><code>library(ComplexHeatmap)
+marker_features &lt;- unique(topmarkers$gene)
+vrHeatmapPlot(Xen_data, features = marker_features, group.by = &quot;Clusters&quot;, 
+              show_row_names = TRUE, font.size = 10)</code></pre>
+<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_seurat_heatmap.png" class="center"></p>
+<p><br></p>
+</div>
+<div id="convert-with-molecule-data" class="section level3">
+<h3>Convert with Molecule Data</h3>
+<p>If defined, the <strong>as.Seurat</strong> function may also convert
+the molecule assay of the VoltRon object into a Seurat FOV object and
+allow visualizing molecules. You can find the Xenium VoltRon object with
+the molecule assay <a
+href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xen_R1.rds">here</a>.</p>
+<pre class="r watch-out"><code>Xen_R1 &lt;- readRDS(&quot;Xen_R1.rds&quot;)
+SampleMetadata(Xen_R1)</code></pre>
+<pre><code>            Assay    Layer   Sample
+Assay1     Xenium Section1 XeniumR1
+Assay2 Xenium_mol Section1 XeniumR1</code></pre>
+<p><br></p>
+<p>We define both the cell level assay and the molecule level assay.</p>
+<pre class="r watch-out"><code>Xen_R1_seu &lt;- as.Seurat(Xen_R1, cell.assay = &quot;Xenium&quot;, molecule.assay = &quot;Xenium_mol&quot;, type = &quot;image&quot;)</code></pre>
+<p><br></p>
+<p>Now we can visualize molecules alongside with cells.</p>
+<pre class="r watch-out"><code>ImageDimPlot(Xen_R1_seu, fov = &quot;fovAssay1&quot;, molecules = &quot;PGR&quot;, group.by = &quot;orig.ident&quot;, cols = &quot;lightgrey&quot;, mols.size = 1)</code></pre>
+<p><img width="60%" height="60%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_seurat_imagedimplot.png" class="center"></p>
+<p><br></p>
+</div>
+</div>
+<div id="spatialexperiment" class="section level2">
+<h2>SpatialExperiment</h2>
+<p>VoltRon can also convert objects in <a
+href="https://www.bioconductor.org/packages/release/bioc/html/SpatialExperiment.html">SpatialExperiment</a>
+objects. We are going to use the Xenium data clustered using VoltRon <a
+href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered.rds">here</a>.</p>
+<pre class="r watch-out"><code>Xen_data &lt;- readRDS(&quot;Xenium_data_clustered.rds&quot;)
+SampleMetadata(Xen_data)</code></pre>
+<p>We use the <strong>as.SpatialExperiment</strong> function to convert
+spatial assays of VoltRon into SpatialExperiment objects. Please check
+the <a
+href="https://www.bioconductor.org/packages/release/bioc/vignettes/SpatialExperiment/inst/doc/SpatialExperiment.html">Introduction
+to the SpatialExperiment class</a> tutorial for more information.</p>
+<pre class="r watch-out"><code>library(SpatialExperiment)
+spe &lt;- as.SpatialExperiment(Xen_data, assay = &quot;Xenium&quot;)</code></pre>
+<p>Here we can parse the image and visualize.</p>
+<pre class="r watch-out"><code>img &lt;- imgRaster(spe, 
+                 sample_id = &quot;Assay1&quot;, 
+                 image_id = &quot;main&quot;)
+plot(img)</code></pre>
+<p><br></p>
+</div>
+<div id="squidpy-anndata-h5ad" class="section level2">
+<h2>Squidpy (Anndata, h5ad)</h2>
+<p>A true ecosystem friendly computational platform should support data
+types across multiple computing environments. By allowing users to
+convert VoltRon objects into annotated data matrix formats such as <a
+href="https://github.com/scverse/anndata">anndata</a>, we can use
+built-in spatial data analysis methods available on <a
+href="https://squidpy.readthedocs.io/en/stable/">squidpy</a>.</p>
+<p>You can find the clustered and the annotated Xenium data using
+VoltRon <a
+href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered_annotated.rds">here</a>.</p>
+<p>Anndata objects wrapped on h5ad files are commonly used by the <a
+href="https://www.nature.com/articles/s41587-023-01733-8">scverse</a>
+ecosystem for single cell analysis which bring together numeruous tools
+maintained and distributed by a large community effort. Both squidpy and
+<a href="https://scanpy.readthedocs.io/en/stable/">scanpy</a> are
+currently available on scverse.</p>
+<pre class="r watch-out"><code>Xen_data &lt;- readRDS(&quot;Xenium_data_clustered_annotated.rds&quot;)
+as.AnnData(Xen_data, assay = &quot;Xenium&quot;, file = &quot;Xen_adata_annotated.h5ad&quot;)</code></pre>
+<p><br></p>
+<div id="configure-squidpy-scverse" class="section level3">
+<h3>Configure Squidpy (scverse)</h3>
+<p>Here, we use the <a
+href="https://rstudio.github.io/reticulate/">reticulate</a> package to
+call <strong>scverse</strong> module in Python through a prebuilt
+anaconda environment. However, any python installation with the scverse
+module can be incorporated by reticulate.</p>
+<pre class="r watch-out"><code>library(reticulate)
+use_condaenv(&quot;scverse&quot;, required = T)</code></pre>
+<p>We import some other necessary modules such as pandas, scanpy and
+squidpy.</p>
+<pre class="python watch-out"><code>from pathlib import Path
+import numpy as np
+import pandas as pd
+import matplotlib.pyplot as plt
+import seaborn as sns
+import scanpy as sc
+import squidpy as sq
+sc.logging.print_header()</code></pre>
+<p><br></p>
+</div>
+<div id="filter-and-normalize" class="section level3">
+<h3>Filter and Normalize</h3>
+<p>We read the annotated Xenium object that was saved as an h5ad file
+using the <strong>as.Anndata</strong> function in VoltRon, and process
+before analysis. For more information using scanpy and squidpy on Xenium
+datasets, check the <a
+href="https://squidpy.readthedocs.io/en/stable/notebooks/tutorials/tutorial_xenium.html">Analyzing
+Xenium data</a> tutorial at squidpy webpage.</p>
+<pre class="python watch-out"><code>adata = sc.read_h5ad(&quot;Xen_adata_annotated.h5ad&quot;)
+adata.layers[&quot;counts&quot;] = adata.X.copy()
+sc.pp.normalize_total(adata, inplace=True)
+sc.pp.log1p(adata)</code></pre>
+<p><br></p>
+</div>
+<div id="visualize" class="section level3">
+<h3>Visualize</h3>
+<p>We use the <strong>squidpy.pl.spatial_scatter</strong> functions
+available in squidpy to visualize the spatial localization of cell types
+of both Xenium replicates.</p>
+<pre class="python watch-out"><code>fig, ax = plt.subplots(1, 2, figsize=(10, 7))
+sq.pl.spatial_scatter(adata, library_key = &quot;library_id&quot;, library_id = &quot;Assay1&quot;, 
+                      color=[&quot;CellType&quot;], shape=None, size=1, img = False, ax=ax[0])
+sq.pl.spatial_scatter(adata, library_key = &quot;library_id&quot;, library_id = &quot;Assay3&quot;, 
+                      color=[&quot;CellType&quot;], shape=None, size=1, img = False, ax=ax[1])
+plt.show(ax)</code></pre>
+<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_anndata_spatial_scatter.png" class="center"></p>
+<p><br></p>
+</div>
+<div id="neighborhood-enrichment" class="section level3">
+<h3>Neighborhood Enrichment</h3>
+<p>We can now use high level spatially-aware functions available in
+squidpy. We first establish spatial neighbors using the delaunay graphs.
+The spatial graph and distances will be stored under
+<strong>.obsp</strong> attribute/matrix.</p>
+<pre class="python watch-out"><code>sq.gr.spatial_neighbors(adata, coord_type=&quot;generic&quot;, delaunay=True)
+adata</code></pre>
+<pre><code>AnnData object with n_obs × n_vars = 283298 × 313
+    obs: &#39;Count&#39;, &#39;Assay&#39;, &#39;Layer&#39;, &#39;Sample&#39;, &#39;Clusters&#39;, &#39;CellType&#39;, &#39;library_id&#39;
+    uns: &#39;log1p&#39;, &#39;spatial_neighbors&#39;
+    obsm: &#39;spatial&#39;
+    layers: &#39;counts&#39;
+    obsp: &#39;spatial_connectivities&#39;, &#39;spatial_distances&#39;</code></pre>
+<p>We can now conduct the permutation test for neighborhood enrichment
+across cell type pairs.</p>
+<pre class="python watch-out"><code>sq.gr.nhood_enrichment(adata, cluster_key=&quot;CellType&quot;)</code></pre>
+<pre class="python watch-out"><code>fig, ax = plt.subplots(1, 2, figsize=(13, 7))
+sq.pl.nhood_enrichment(adata, cluster_key=&quot;CellType&quot;, figsize=(8, 8), 
+                       title=&quot;Neighborhood enrichment adata&quot;, ax=ax[0])
+sq.pl.spatial_scatter(adata, color=&quot;CellType&quot;, library_key = &quot;library_id&quot;, 
+                      library_id = &quot;Assay1&quot;, shape=None, size=2, ax=ax[1])
+plt.show(ax)</code></pre>
+<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_anndata_neighborhood.png" class="center"></p>
+<p><br></p>
+</div>
+</div>
+<div id="vitessce-anndata-zarr" class="section level2">
+<h2>Vitessce (Anndata, zarr)</h2>
+<p>In this section, we will transform VoltRon objects of Xenium data
+into zarr arrays, and use them for interactive visualization in <a
+href="http://vitessce.io/">Vitessce</a>. We should first download the
+vitessceR package which incorporates wrapper function to visualize zarr
+arrays interactively in R.</p>
+<pre class="r watch-out"><code>install.packages(&quot;devtools&quot;)
+devtools::install_github(&quot;vitessce/vitessceR&quot;)</code></pre>
+<p><br></p>
+<p>You can find the clustered and annotated Xenium data using VoltRon <a
+href="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Cellanalysis/Xenium/Xenium_data_clustered_annotated.rds">here</a>.</p>
+<pre class="r watch-out"><code>Xen_data &lt;- readRDS(&quot;Xenium_data_clustered_annotated.rds&quot;)
+SampleMetadata(Xen_data)</code></pre>
+<pre><code>        Assay    Layer   Sample
+Assay1 Xenium Section1 XeniumR1
+Assay2 Xenium Section1 XeniumR2</code></pre>
+<p><br></p>
+<div id="interactive-visualization" class="section level3">
+<h3>Interactive Visualization</h3>
+<p>Now we can convert the VoltRon object into a zarr array using the
+<strong>as.Zarr</strong> function which will create the array in a
+specified location.</p>
+<pre class="r watch-out"><code>as.AnnData(Xen_data, assays = &quot;Assay1&quot;, 
+           file = &quot;xendata_clustered_annotated.zarr&quot;, flip_coordinates = TRUE)</code></pre>
+<p>We can use the zarr file directly in the
+<strong>vrSpatialPlot</strong> function to visualize the zarr array
+interactively in Rstudio viewer. The <strong>reduction</strong>
+arguement allows the umap of the Xenium data to be visualized alongside
+with the spatial coordinates of the Xenium cells.</p>
+<pre class="r watch-out"><code>vrSpatialPlot(&quot;xendata_clustered_annotated.zarr&quot;, group.by = &quot;CellType&quot;, reduction = &quot;umap&quot;)</code></pre>
+<p><img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_interactive.png" class="center">
+<br>
+<img width="100%" height="100%" src="https://bimsbstatic.mdc-berlin.de/landthaler/VoltRon/Package/images/conversions_interactive_zoom.png" class="center"></p>
+</div>
+</div>
+</div>
+
+
+
+</div>
+</div>
+
+</div>
+
+<script>
+
+// add bootstrap table styles to pandoc tables
+function bootstrapStylePandocTables() {
+  $('tr.odd').parent('tbody').parent('table').addClass('table table-condensed');
+}
+$(document).ready(function () {
+  bootstrapStylePandocTables();
+});
+
+
+</script>
+
+<!-- tabsets -->
+
+<script>
+$(document).ready(function () {
+  window.buildTabsets("TOC");
+});
+
+$(document).ready(function () {
+  $('.tabset-dropdown > .nav-tabs > li').click(function () {
+    $(this).parent().toggleClass('nav-tabs-open');
+  });
+});
+</script>
+
+<!-- code folding -->
+
+<script>
+$(document).ready(function ()  {
+
+    // temporarily add toc-ignore selector to headers for the consistency with Pandoc
+    $('.unlisted.unnumbered').addClass('toc-ignore')
+
+    // move toc-ignore selectors from section div to header
+    $('div.section.toc-ignore')
+        .removeClass('toc-ignore')
+        .children('h1,h2,h3,h4,h5').addClass('toc-ignore');
+
+    // establish options
+    var options = {
+      selectors: "h1,h2,h3",
+      theme: "bootstrap3",
+      context: '.toc-content',
+      hashGenerator: function (text) {
+        return text.replace(/[.\\/?&!#<>]/g, '').replace(/\s/g, '_');
+      },
+      ignoreSelector: ".toc-ignore",
+      scrollTo: 0
+    };
+    options.showAndHide = false;
+    options.smoothScroll = false;
+
+    // tocify
+    var toc = $("#TOC").tocify(options).data("toc-tocify");
+});
+</script>
+
+<!-- dynamically load mathjax for compatibility with self-contained -->
+<script>
+  (function () {
+    var script = document.createElement("script");
+    script.type = "text/javascript";
+    script.src  = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
+    document.getElementsByTagName("head")[0].appendChild(script);
+  })();
+</script>
+
+</body>
+</html>