Repository 'vitessce_spatial'
hg clone https://toolshed.g2.bx.psu.edu/repos/goeckslab/vitessce_spatial

Changeset 0:9f60ef2d586e (2022-09-08)
Next changeset 1:4bf852448b5d (2024-02-28)
Commit message:
planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/vitessce commit 9b2dc921e692af8045773013d9f87d4d790e2ea1
added:
gate_finder.py
index.html
main_macros.xml
static/css/2.f290e260.chunk.css
static/css/2.f290e260.chunk.css.map
static/css/main.a53cc462.chunk.css
static/css/main.a53cc462.chunk.css.map
static/js/2.eb2fd6ea.chunk.js
static/js/2.eb2fd6ea.chunk.js.LICENSE.txt
static/js/2.eb2fd6ea.chunk.js.map
static/js/main.303f671d.chunk.js
static/js/main.303f671d.chunk.js.map
static/js/runtime-main.784d90f4.js
static/js/runtime-main.784d90f4.js.map
static/media/complement.c220ca8c.svg
static/media/intersection.b0003109.svg
static/media/menu.bc56e94a.svg
static/media/near_me.2a308adc.svg
static/media/selection_lasso.00e80a33.svg
static/media/selection_rectangle.aa477261.svg
static/media/union.de5168c6.svg
test-data/cropped_reactive_core.ome.tiff
test-data/cropped_tutorial_data_pheno.h5ad
test-data/tutorial_vitessce.html
vitessce_spatial.py
vitessce_spatial.xml
b
diff -r 000000000000 -r 9f60ef2d586e gate_finder.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gate_finder.py Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,156 @@
+import argparse
+import json
+import warnings
+from pathlib import Path
+
+import numpy as np
+import pandas as pd
+from anndata import read_h5ad
+from sklearn.mixture import GaussianMixture
+from sklearn.preprocessing import MinMaxScaler
+from vitessce import (
+    AnnDataWrapper,
+    Component as cm,
+    MultiImageWrapper,
+    OmeTiffWrapper,
+    VitessceConfig,
+)
+
+
+# Generate binarized phenotype for a gate
+def get_gate_phenotype(g, d):
+    dd = d.copy()
+    dd = np.where(dd < g, 0, dd)
+    np.warnings.filterwarnings('ignore')
+    dd = np.where(dd >= g, 1, dd)
+    return dd
+
+
+def get_gmm_phenotype(data):
+    low = np.percentile(data, 0.01)
+    high = np.percentile(data, 99.99)
+    data = np.clip(data, low, high)
+
+    sum = np.sum(data)
+    median = np.median(data)
+    data_med = data / sum * median
+
+    data_log = np.log1p(data_med)
+    data_log = data_log.reshape(-1, 1)
+
+    scaler = MinMaxScaler(feature_range=(0, 1))
+    data_norm = scaler.fit_transform(data_log)
+
+    gmm = GaussianMixture(n_components=2)
+    gmm.fit(data_norm)
+    gate = np.mean(gmm.means_)
+
+    return get_gate_phenotype(gate, np.ravel(data_norm))
+
+
+def main(inputs, output, image, anndata, masks=None):
+    """
+    Parameter
+    ---------
+    inputs : str
+        File path to galaxy tool parameter.
+    output : str
+        Output folder for saving web content.
+    image : str
+        File path to the OME Tiff image.
+    anndata : str
+        File path to anndata containing phenotyping info.
+    masks : str
+        File path to the image masks.
+    """
+    warnings.simplefilter('ignore')
+
+    with open(inputs, 'r') as param_handler:
+        params = json.load(param_handler)
+
+    marker = params['marker'].strip()
+    from_gate = params['from_gate']
+    to_gate = params['to_gate']
+    increment = params['increment']
+    x_coordinate = params['x_coordinate'].strip() or 'X_centroid'
+    y_coordinate = params['y_coordinate'].strip() or 'Y_centroid'
+
+    adata = read_h5ad(anndata)
+
+    # If no raw data is available make a copy
+    if adata.raw is None:
+        adata.raw = adata
+
+    # Copy of the raw data if it exisits
+    if adata.raw is not None:
+        adata.X = adata.raw.X
+
+    data = pd.DataFrame(
+        adata.X,
+        columns=adata.var.index,
+        index=adata.obs.index
+    )
+    marker_values = data[[marker]].values
+    marker_values_log = np.log1p(marker_values)
+
+    # Identify the list of increments
+    gate_names = []
+    for num in np.arange(from_gate, to_gate, increment):
+        num = round(num, 3)
+        key = marker + '--' + str(num)
+        adata.obs[key] = get_gate_phenotype(num, marker_values_log)
+        gate_names.append(key)
+
+    adata.obs['GMM_auto'] = get_gmm_phenotype(marker_values)
+    gate_names.append('GMM_auto')
+
+    adata.obsm['XY_coordinate'] = adata.obs[[x_coordinate, y_coordinate]].values
+
+    vc = VitessceConfig(name=None, description=None)
+    dataset = vc.add_dataset()
+    image_wrappers = [OmeTiffWrapper(img_path=image, name='OMETIFF')]
+    if masks:
+        image_wrappers.append(
+            OmeTiffWrapper(img_path=masks, name='MASKS', is_bitmask=True)
+        )
+    dataset.add_object(MultiImageWrapper(image_wrappers))
+
+    dataset.add_object(
+        AnnDataWrapper(
+            adata,
+            spatial_centroid_obsm='XY_coordinate',
+            cell_set_obs=gate_names,
+            cell_set_obs_names=[obj[0].upper() + obj[1:] for obj in gate_names],
+            expression_matrix="X"
+        )
+    )
+    spatial = vc.add_view(dataset, cm.SPATIAL)
+    cellsets = vc.add_view(dataset, cm.CELL_SETS)
+    status = vc.add_view(dataset, cm.STATUS)
+    lc = vc.add_view(dataset, cm.LAYER_CONTROLLER)
+    genes = vc.add_view(dataset, cm.GENES)
+    cell_set_sizes = vc.add_view(dataset, cm.CELL_SET_SIZES)
+    cell_set_expression = vc.add_view(dataset, cm.CELL_SET_EXPRESSION)
+
+    vc.layout(
+        (status / genes / cell_set_expression)
+        | (cellsets / cell_set_sizes / lc)
+        | (spatial)
+    )
+    config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output)
+
+    with open(Path(output).joinpath('config.json'), 'w') as f:
+        json.dump(config_dict, f, indent=4)
+
+
+if __name__ == '__main__':
+    aparser = argparse.ArgumentParser()
+    aparser.add_argument("-i", "--inputs", dest="inputs", required=True)
+    aparser.add_argument("-e", "--output", dest="output", required=True)
+    aparser.add_argument("-g", "--image", dest="image", required=True)
+    aparser.add_argument("-a", "--anndata", dest="anndata", required=True)
+    aparser.add_argument("-m", "--masks", dest="masks", required=False)
+
+    args = aparser.parse_args()
+
+    main(args.inputs, args.output, args.image, args.anndata, args.masks)
b
diff -r 000000000000 -r 9f60ef2d586e index.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/index.html Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,39 @@
+<!doctype html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <style>
+        body,html{height:100%}
+        body{
+            font-family:-apple-system,'Helvetica Neue',Arial,sans-serif;display:flex;flex-direction:column}
+        #full-app{flex:1}
+        #full-app .vitessce-container{
+            height:max(100%,100vh);width:100%;overflow:hidden}
+        #full-app #small-app .vitessce-container{height:600px}
+        </style>
+        <title>Vitessce</title>
+        <link href="./static/css/2.f290e260.chunk.css" rel="stylesheet">
+        <link href="./static/css/main.a53cc462.chunk.css" rel="stylesheet">
+    </head>
+    <body>
+        <div id="full-app">
+            <div class="container-fluid">
+                <div class="row p-2">
+                    <div class="col col-full">
+                        <h1>Vitessce is loading...</h1>
+                        <div style="width:1000px">
+                            <div id="small-app">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <noscript>You need to enable JavaScript to run this app.</noscript>
+        <script>
+        !function(e){function t(t){for(var n,i,l=t[0],f=t[1],a=t[2],p=0,s=[];p<l.length;p++)i=l[p],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,a||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var f=r[l];0!==o[f]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="./";var l=this.webpackJsonpvitessce=this.webpackJsonpvitessce||[],f=l.push.bind(l);l.push=t,l=l.slice();for(var a=0;a<l.length;a++)t(l[a]);var c=f;r()}([])
+        </script>
+        <script src="./static/js/2.eb2fd6ea.chunk.js"></script>
+        <script src="./static/js/main.303f671d.chunk.js"></script>
+    </body>
+</html>
\ No newline at end of file
b
diff -r 000000000000 -r 9f60ef2d586e main_macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main_macros.xml Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,84 @@
+<macros>
+    <token name="@TOOL_VERSION@">1.0.4</token>
+    <token name="@VERSION_SUFFIX@">0</token>
+    <token name="@PROFILE@">20.01</token>
+
+    <xml name="vitessce_requirements">
+        <requirements>
+            <container type="docker">quay.io/goeckslab/vitessce:@TOOL_VERSION@</container>
+        </requirements>
+    </xml>
+
+    <xml name="macro_stdio">
+        <stdio>
+            <exit_code range="1:" level="fatal" description="Error occurred. Please check Tool Standard Error" />
+        </stdio>
+    </xml>
+
+    <xml name="vitessce_cmd" token_tool_id="vitessce_spatial">
+        <command>
+        <![CDATA[
+        export BF_MAX_MEM="\${GALAXY_MEMORY_MB}m" &&
+        mkdir -p '${output.files_path}/A/0' &&
+        ln -sf '$image' '${output.files_path}/A/0/image01.ome.tiff' &&
+        #if $masks
+            info=\$(showinf -nopix -nometa -noflat '${output.files_path}/A/0/image01.ome.tiff') &&
+            echo '>showinf -nopix -nometa -noflat \$image' &&
+            echo "\$info\n" &&
+            masks_info=\$(showinf -nopix -nometa -noflat '$masks') &&
+            echo '>showinf -nopix -nometa -noflat \$masks' &&
+            echo "\$masks_info\n" &&
+            masks_n_resolutions=\$(echo "\$masks_info" | grep '^\s*Resolutions\s*=' -m1 | cut -d'=' -f2 | xargs) &&
+            if [ -z \$masks_n_resolutions ]; then
+                n_resolutions=\$(echo "\$info" | grep '^\s*Resolutions\s*=' -m1 | cut -d'=' -f2 | xargs) &&
+                pyramid_scale=1 &&
+                if [ -z "\$n_resolutions" ]; then
+                    echo "Warning: Failded to retrieve the number of pyramid resolutions. Set pyramid resolutions to 4 and scale to 2!";
+                    n_resolutions=4;
+                    pyramid_scale=2;
+                else
+                    echo "Found the number of pyramid resolutions: \$n_resolutions";
+                    if [ "\$n_resolutions" -gt 1 ]; then
+                        sizeX0=\$(echo "\$info" | grep '^\s*sizeX\[0\]\s*=' -m1 | cut -d'=' -f2 | xargs) ;
+                        sizeX1=\$(echo "\$info" | grep '^\s*sizeX\[1\]\s*=' -m1 | cut -d'=' -f2 | xargs) ;
+                        if [ "\$sizeX0" -gt 0 ] && [ "\$sizeX1" -gt 0 ]; then
+                            pyramid_scale=\$(((\$sizeX0 + \$sizeX1 / 2 ) / \$sizeX1));
+                            echo "Calculate pyramid scale: \$sizeX0 / \$sizeX1 ~= \$pyramid_scale.";
+                        else
+                            pyramid_scale=2;
+                            echo "Warning: Failed to calculate the pyramid scale; set it to 2!";
+                        fi;
+                    fi;
+                fi;
+                tile_info=\$(showinf -nopix -nometa -noflat '${output.files_path}/A/0/image01.ome.tiff' | grep '^\s*Tile\ssize\s*=' -m1);
+                tile_x=\$(echo "\$tile_info" | cut -d' ' -f4);
+                tile_y=\$(echo "\$tile_info" | cut -d' ' -f6);
+                convert_cmd="bfconvert -pyramid-resolutions \$n_resolutions -pyramid-scale \$pyramid_scale -noflat -tilex \$tile_x -tiley \$tile_y '$masks' '${output.files_path}/A/0/masks01.ome.tiff'";
+                echo "\n>\$convert_cmd";
+                eval \$convert_cmd;
+                masks_info_new=\$(showinf -nopix -nometa -noflat '${output.files_path}/A/0/masks01.ome.tiff');
+                echo "\n>showinf -nopix -nometa -noflat '${output.files_path}/A/0/masks01.ome.tiff'";
+                echo "\$masks_info_new\n";
+            else
+                ln -sf '$masks' '${output.files_path}/A/0/masks01.ome.tiff';
+            fi &&
+        #end if
+        python '$__tool_directory__/@TOOL_ID@.py'
+            --inputs '$inputs'
+            --output '${output.files_path}'
+            --image '${output.files_path}/A/0/image01.ome.tiff'
+            #if $masks
+                --masks '${output.files_path}/A/0/masks01.ome.tiff'
+            #end if
+            #if $do_phenotyping.phenotyping_choice
+            --anndata '$anndata'
+            #end if
+            &&
+        cp -R '$__tool_directory__/static' '${output.files_path}' &&
+        cp '$__tool_directory__/index.html' '$output';
+
+        ]]>
+        </command>
+    </xml>
+
+</macros>
b
diff -r 000000000000 -r 9f60ef2d586e static/css/2.f290e260.chunk.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/css/2.f290e260.chunk.css Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,2 @@
+.react-grid-layout{position:relative;transition:height .2s ease}.react-grid-item{transition:all .2s ease;transition-property:left,top}.react-grid-item.cssTransforms{transition-property:transform}.react-grid-item.resizing{z-index:1;will-change:width,height}.react-grid-item.react-draggable-dragging{transition:none;z-index:3;will-change:transform}.react-grid-item.dropping{visibility:hidden}.react-grid-item.react-grid-placeholder{background:red;opacity:.2;transition-duration:.1s;z-index:2;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.react-grid-item>.react-resizable-handle{position:absolute;width:20px;height:20px;bottom:0;right:0;cursor:se-resize}.react-grid-item>.react-resizable-handle:after{content:"";position:absolute;right:3px;bottom:3px;width:5px;height:5px;border-right:2px solid rgba(0,0,0,.4);border-bottom:2px solid rgba(0,0,0,.4)}.react-resizable-hide>.react-resizable-handle{display:none}.react-resizable{position:relative}.react-resizable-handle{position:absolute;width:20px;height:20px;background-repeat:no-repeat;background-origin:content-box;box-sizing:border-box;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYwMCIgd2lkdGg9IjYiIGhlaWdodD0iNiI+PHBhdGggZD0iTTYgNkgwVjQuMmg0LjJWMEg2djZ6IiBvcGFjaXR5PSIuMzAyIi8+PC9zdmc+");background-position:100% 100%;padding:0 3px 3px 0}.react-resizable-handle-sw{bottom:0;left:0;cursor:sw-resize;transform:rotate(90deg)}.react-resizable-handle-se{bottom:0;right:0;cursor:se-resize}.react-resizable-handle-nw{top:0;left:0;cursor:nw-resize;transform:rotate(180deg)}.react-resizable-handle-ne{top:0;right:0;cursor:ne-resize;transform:rotate(270deg)}.react-resizable-handle-e,.react-resizable-handle-w{top:50%;margin-top:-10px;cursor:ew-resize}.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-resizable-handle-n,.react-resizable-handle-s{left:50%;margin-left:-10px;cursor:ns-resize}.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}
+/*# sourceMappingURL=2.f290e260.chunk.css.map */
\ No newline at end of file
b
diff -r 000000000000 -r 9f60ef2d586e static/css/2.f290e260.chunk.css.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/css/2.f290e260.chunk.css.map Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,1 @@
+{"version":3,"sources":["styles.css"],"names":[],"mappings":"AAAA,mBACE,iBAAkB,CAClB,0BACF,CACA,iBACE,uBAA0B,CAC1B,4BACF,CACA,+BACE,6BACF,CACA,0BACE,SAAU,CACV,wBACF,CAEA,0CACE,eAAgB,CAChB,SAAU,CACV,qBACF,CAEA,0BACE,iBACF,CAEA,wCACE,cAAe,CACf,UAAY,CACZ,uBAA0B,CAC1B,SAAU,CACV,wBAAyB,CAEzB,oBAAqB,CACrB,mBAAoB,CACpB,gBACF,CAEA,yCACE,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,OAAQ,CACR,gBACF,CAEA,+CACE,UAAW,CACX,iBAAkB,CAClB,SAAU,CACV,UAAW,CACX,SAAU,CACV,UAAW,CACX,qCAA0C,CAC1C,sCACF,CAEA,8CACE,YACF,CA5DA,iBACE,iBACF,CACA,wBACE,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,2BAA4B,CAC5B,6BAA8B,CAC9B,qBAAsB,CACtB,0PAAuY,CACvY,6BAAiC,CACjC,mBACF,CACA,2BACE,QAAS,CACT,MAAO,CACP,gBAAiB,CACjB,uBACF,CACA,2BACE,QAAS,CACT,OAAQ,CACR,gBACF,CACA,2BACE,KAAM,CACN,MAAO,CACP,gBAAiB,CACjB,wBACF,CACA,2BACE,KAAM,CACN,OAAQ,CACR,gBAAiB,CACjB,wBACF,CACA,oDAEE,OAAQ,CACR,gBAAiB,CACjB,gBACF,CACA,0BACE,MAAO,CACP,wBACF,CACA,0BACE,OAAQ,CACR,wBACF,CACA,oDAEE,QAAS,CACT,iBAAkB,CAClB,gBACF,CACA,0BACE,KAAM,CACN,wBACF,CACA,0BACE,QAAS,CACT,uBACF","file":"2.f290e260.chunk.css","sourcesContent":[".react-resizable {\n  position: relative;\n}\n.react-resizable-handle {\n  position: absolute;\n  width: 20px;\n  height: 20px;\n  background-repeat: no-repeat;\n  background-origin: content-box;\n  box-sizing: border-box;\n  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2IDYiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYwMCIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI2cHgiIGhlaWdodD0iNnB4Ij48ZyBvcGFjaXR5PSIwLjMwMiI+PHBhdGggZD0iTSA2IDYgTCAwIDYgTCAwIDQuMiBMIDQgNC4yIEwgNC4yIDQuMiBMIDQuMiAwIEwgNiAwIEwgNiA2IEwgNiA2IFoiIGZpbGw9IiMwMDAwMDAiLz48L2c+PC9zdmc+');\n  background-position: bottom right;\n  padding: 0 3px 3px 0;\n}\n.react-resizable-handle-sw {\n  bottom: 0;\n  left: 0;\n  cursor: sw-resize;\n  transform: rotate(90deg);\n}\n.react-resizable-handle-se {\n  bottom: 0;\n  right: 0;\n  cursor: se-resize;\n}\n.react-resizable-handle-nw {\n  top: 0;\n  left: 0;\n  cursor: nw-resize;\n  transform: rotate(180deg);\n}\n.react-resizable-handle-ne {\n  top: 0;\n  right: 0;\n  cursor: ne-resize;\n  transform: rotate(270deg);\n}\n.react-resizable-handle-w,\n.react-resizable-handle-e {\n  top: 50%;\n  margin-top: -10px;\n  cursor: ew-resize;\n}\n.react-resizable-handle-w {\n  left: 0;\n  transform: rotate(135deg);\n}\n.react-resizable-handle-e {\n  right: 0;\n  transform: rotate(315deg);\n}\n.react-resizable-handle-n,\n.react-resizable-handle-s {\n  left: 50%;\n  margin-left: -10px;\n  cursor: ns-resize;\n}\n.react-resizable-handle-n {\n  top: 0;\n  transform: rotate(225deg);\n}\n.react-resizable-handle-s {\n  bottom: 0;\n  transform: rotate(45deg);\n}"]}
\ No newline at end of file
b
diff -r 000000000000 -r 9f60ef2d586e static/css/main.a53cc462.chunk.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/css/main.a53cc462.chunk.css Thu Sep 08 17:23:33 2022 +0000
b
b'@@ -0,0 +1,2 @@\n+.react-draggable-transparent-selection .react-grid-item{-webkit-user-select:none!important;-moz-user-select:none!important;-o-user-select:none!important;-ms-user-select:none!important;user-select:none!important}body{margin:0;text-align:left}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto;box-sizing:border-box}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-2OwvL{position:fixed;background-color:hsla(0,0%,100%,.95);border:1px solid rgba(0,0,0,.1);border-radius:3px;font-size:12px;cursor:default;padding:3px;box-shadow:0 0 3px 0 rgba(0,0,0,.1),0 1px 5px 0 rgba(0,0,0,.05)}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-dark-2PO31{color:#ccc;background-color:rgba(68,68,68,.97)}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-icon-I4kiw{display:inline-block;margin-right:3px;vertical-align:middle}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-icon-I4kiw>svg{width:30px;height:20px}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-item-1HeVv{padding:2px;white-space:nowrap;border-radius:2px;transition:background .15s ease,color .15s ease}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-item-1HeVv:hover{background:#337ab7;color:#fff}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-hr-3yapb{margin-top:5px;margin-bottom:5px;border:0;border-top:1px solid rgba(0,0,0,.1)}.vitessce-container .higlass-wrapper .ContextMenu-module_play-icon-R4pIO{width:12px;height:12px;position:absolute;right:5px}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-span-8EUfZ{margin-right:20px;vertical-align:middle;display:inline-block;line-height:normal;white-space:nowrap}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-thumbnail-2vHLD{margin-right:10px;border:1px solid #888}.vitessce-container .higlass-wrapper .ContextMenu-module_context-menu-thumbnail-inline-1iOcg{display:inline-block;margin-right:10px;vertical-align:middle}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-2zDf3,.vitessce-container .higlass-wrapper .TrackControl-module_track-control-vertical-2McB_{position:absolute;z-index:1;display:flex;background:hsla(0,0%,100%,.75);right:2px;top:2px;border-radius:2.5px;box-shadow:0 0 0 1px rgba(0,0,0,.05),0 0 3px 0 rgba(0,0,0,.1);opacity:0;transition:opacity .15s ease,background .15s ease,box-shadow .15s ease}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-dark-fP2uZ,.vitessce-container .higlass-wrapper .TrackControl-module_track-control-dark-fP2uZ .TrackControl-module_track-control-active-2JD9i{background:rgba(40,40,40,.85)}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-vertical-2McB_{flex-direction:column-reverse}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-left-zHd9W{left:2px;right:auto}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-active-2JD9i,.vitessce-container .higlass-wrapper .TrackControl-module_track-control-vertical-active-1QCKn{opacity:1;z-index:1}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-active-2JD9i:hover,.vitessce-container .higlass-wrapper .TrackControl-module_track-control-vertical-active-1QCKn:hover{background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.1),0 0 3px 0 rgba(0,0,0,.2)}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-dark-fP2uZ.TrackControl-module_track-control-active-2JD9i:hover{background:rgba(34,34,34,.95)}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-padding-right-2p6Lp{right:80px}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-button-2fdIb{width:20px;height:20px;padding:4px;cursor:pointer;opacity:.66;transition:background .15s ease,color .15s ease,opacity .15s ease}.vitessce-container .higlass-wrapper .TrackControl-module_track-control-button-2fdIb:hover{'..b'ainer.vitessce-theme-light .selectable-table .table-row{display:flex;flex-direction:row;border-bottom:1px solid silver}.vitessce-container.vitessce-theme-light .selectable-table .table-item{cursor:pointer}.vitessce-container.vitessce-theme-light .selectable-table .table-item:not(.row-checked):hover{background-color:#dadada}.vitessce-container.vitessce-theme-light .selectable-table .table-item.row-checked{background-color:silver}.vitessce-container.vitessce-theme-light .selectable-table .table-item .hidden-input-column{display:none}.vitessce-container.vitessce-theme-light .selectable-table .table-item .table-cell{padding:0 4px}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container{width:1em}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container label{display:block;margin:0;cursor:pointer}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input{cursor:pointer}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input.checkbox,.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input.radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-block;width:1em;height:1em;margin:.3em .5em 0;padding:6px!important;background-clip:content-box;border:2px solid #d3d3d3;background-color:#d3d3d3}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input.checkbox:checked,.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input.radio:checked{background-clip:unset}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input.radio{border-radius:50%}.vitessce-container.vitessce-theme-light .selectable-table .table-item .input-container input.checkbox{border-radius:2px}.vitessce-container.vitessce-theme-light .higlass-title-wrapper{height:calc(100% - 20px)}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body{width:inherit;height:inherit;padding:5px;background-color:#f1f1f1}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-lazy-wrapper{width:inherit;height:inherit}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent{display:block;position:relative;box-sizing:border-box;font-size:12px;color:#333;overflow:hidden}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent .higlass-wrapper{width:inherit;height:inherit;position:relative;display:block;text-align:left;box-sizing:border-box}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent .higlass-wrapper .higlass{width:100%;height:100%}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent .higlass-wrapper .higlass .react-grid-layout{background-color:transparent!important}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent .higlass-wrapper .higlass nav{display:flex}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent .higlass-wrapper .higlass input{font-size:12px}.vitessce-container.vitessce-theme-light .higlass-title-wrapper .card-body .higlass-wrapper-parent .higlass-wrapper .higlass .btn{color:#999;font-size:12px}.vitessce-container.vitessce-theme-light .vega-container{display:flex;flex:1 1 auto;overflow:hidden}.vitessce-container.vitessce-theme-light .heatmap{width:100%;left:0;position:absolute;padding-right:inherit;padding-left:inherit}.vitessce-container.vitessce-theme-light .heatmap-container{position:absolute;top:1.25rem;left:1.25rem;width:calc(100% - 2.5rem);height:calc(100% - 2.5rem)}.vitessce-container.vitessce-theme-light .search-bar{margin-bottom:.25rem;border:0;padding:2px;border-radius:2px}\n+/*# sourceMappingURL=main.a53cc462.chunk.css.map */\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/css/main.a53cc462.chunk.css.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/css/main.a53cc462.chunk.css.map Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,1 @@\n+{"version":3,"sources":["index.scss","_app.scss","../../node_modules/higlass/dist/hglib.css","_bootstrap-minimal.scss","_controls.scss","_channels.scss","_error.scss","_plot-tooltips.scss","_help-tooltips.scss","_sets-manager.scss","_selectable-table.scss","_higlass.scss","_vega.scss","_heatmap.scss","_genes.scss"],"names":[],"mappings":"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'..b'         -moz-appearance: none;\\n                        appearance: none;\\n                        /* create custom radiobutton appearance */\\n                        display: inline-block;\\n                        width: 1em;\\n                        height: 1em;\\n                        margin: 0.3em 0.5em 0.0em 0.5em;\\n                        padding: 6px !important; /* TODO: Only need \\"important\\" to override Bootstrap. */\\n                        /* background-color only for content */\\n                        background-clip: content-box;\\n                        border: 2px solid map-get($global-colors, \\"gray-light\\");\\n                        background-color: map-get($global-colors, \\"gray-light\\");\\n                    \\n                        &:checked {\\n                            background-clip: unset;\\n                        }\\n                    }\\n                    &.radio {\\n                        border-radius: 50%;\\n                    }\\n                    &.checkbox {\\n                        border-radius: 2px;\\n                    }\\n                }\\n            }\\n        } \\n    }\\n}\\n  ","\\n.vitessce-container .higlass-wrapper {\\n  // https://sass-lang.com/documentation/at-rules/import#nesting\\n  // https://sass-lang.com/documentation/at-rules/import#importing-css\\n  @import \\"../../node_modules/higlass/dist/hglib\\";\\n}\\n@mixin higlass($theme-name, $theme-colors) {\\n\\n    .higlass-title-wrapper {\\n        height: calc(100% - 20px);\\n        .card-body {\\n          width: inherit;\\n          height: inherit;\\n          padding: 5px;\\n          background-color: map-get($theme-colors, \\"secondary-background\\");\\n          .higlass-lazy-wrapper {\\n            width: inherit;\\n            height: inherit;\\n          }\\n          .higlass-wrapper-parent {\\n            display: block;\\n            position: relative;\\n            box-sizing: border-box;\\n            font-size: 12px;\\n            color: #333;\\n            overflow: hidden;\\n            .higlass-wrapper {\\n              width: inherit;\\n              height: inherit;\\n              position: relative;\\n              display: block;\\n              text-align: left;\\n              box-sizing: border-box;\\n              .higlass {\\n                width: 100%;\\n                height: 100%;\\n                .react-grid-layout {\\n                  background-color: transparent !important;\\n                }\\n                nav {\\n                  display: flex;\\n                }\\n                input {\\n                  font-size: 12px;\\n                }\\n                .btn {\\n                  color: #999;\\n                  font-size: 12px;\\n                }\\n              }\\n            }\\n          }\\n        }\\n      }\\n          \\n}\\n","@mixin vega($theme-name, $theme-colors) {\\n    .vega-container {\\n        display: flex;\\n        flex: 1 1 auto;\\n        overflow: hidden;\\n    }\\n}","/*\\nSee https://github.com/vitessce/vitessce/issues/368 for why this css needs to exist and https://github.com/vitessce/vitessce/pull/607 for a longer explanation.\\nThe absolute positioning gives us the control we need to force the canvas elements to \\"fill\\" the container - this was not happening in Safari with the bootstrap css.\\n*/\\n@mixin heatmap($theme-name, $theme-colors) {\\n    .heatmap {\\n      width: 100%;\\n      left: 0;\\n      position: absolute;\\n      padding-right: inherit;\\n      padding-left: inherit;\\n    }\\n\\n    .heatmap-container {\\n        position: absolute;\\n        top: 1.25rem; // Corresponds to the padding on .vitessce-container .card-body\\n        left: 1.25rem; // Corresponds to the padding on .vitessce-container .card-body\\n        width: calc(100% - 2.5rem);\\n        height: calc(100% - 2.5rem);\\n    }\\n}","@mixin genes($theme-name, $theme-colors) {\\n    .search-bar {\\n      margin-bottom: .25rem;\\n      border: 0;\\n      padding: 2px;\\n      border-radius: 2px;\\n    }\\n}\\n"]}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/js/2.eb2fd6ea.chunk.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/2.eb2fd6ea.chunk.js Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,3 @@\n+/*! For license information please see 2.eb2fd6ea.chunk.js.LICENSE.txt */\n+(this.webpackJsonpvitessce=this.webpackJsonpvitessce||[]).push([[2],[function(e,t,A){"use strict";e.exports=A(750)},function(e,t,A){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}A.d(t,"a",(function(){return n}))},function(e,t,A){"use strict";function n(e,t,A){return t in e?Object.defineProperty(e,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):e[t]=A,e}A.d(t,"a",(function(){return n}))},function(e,t,A){e.exports=A(853)},function(e,t,A){"use strict";function n(e,t){for(var A=0;A<t.length;A++){var n=t[A];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function r(e,t,A){return t&&n(e.prototype,t),A&&n(e,A),e}A.d(t,"a",(function(){return r}))},function(e,t,A){"use strict";function n(e,t,A){return e.fields=t||[],e.fname=A,e}function r(e){return null==e?null:e.fname}function i(e){return null==e?null:e.fields}function o(e){return 1===e.length?a(e[0]):s(e)}A.d(t,"a",(function(){return v})),A.d(t,"b",(function(){return E})),A.d(t,"c",(function(){return y})),A.d(t,"d",(function(){return p})),A.d(t,"e",(function(){return Q})),A.d(t,"f",(function(){return n})),A.d(t,"g",(function(){return i})),A.d(t,"h",(function(){return r})),A.d(t,"i",(function(){return X})),A.d(t,"j",(function(){return ee})),A.d(t,"k",(function(){return q})),A.d(t,"l",(function(){return $})),A.d(t,"m",(function(){return re})),A.d(t,"n",(function(){return ie})),A.d(t,"o",(function(){return g})),A.d(t,"p",(function(){return oe})),A.d(t,"q",(function(){return ae})),A.d(t,"r",(function(){return se})),A.d(t,"s",(function(){return d})),A.d(t,"t",(function(){return le})),A.d(t,"u",(function(){return u})),A.d(t,"v",(function(){return Ie})),A.d(t,"w",(function(){return ce})),A.d(t,"x",(function(){return l})),A.d(t,"y",(function(){return I})),A.d(t,"z",(function(){return Ce})),A.d(t,"A",(function(){return he})),A.d(t,"B",(function(){return b})),A.d(t,"C",(function(){return fe})),A.d(t,"D",(function(){return de})),A.d(t,"E",(function(){return z})),A.d(t,"F",(function(){return Be})),A.d(t,"G",(function(){return pe})),A.d(t,"H",(function(){return w})),A.d(t,"I",(function(){return Ee})),A.d(t,"J",(function(){return Qe})),A.d(t,"K",(function(){return ye})),A.d(t,"L",(function(){return ve})),A.d(t,"M",(function(){return m})),A.d(t,"N",(function(){return me})),A.d(t,"O",(function(){return be})),A.d(t,"P",(function(){return F})),A.d(t,"Q",(function(){return h})),A.d(t,"R",(function(){return Se})),A.d(t,"S",(function(){return L})),A.d(t,"T",(function(){return T})),A.d(t,"U",(function(){return Z})),A.d(t,"V",(function(){return H})),A.d(t,"W",(function(){return G})),A.d(t,"X",(function(){return K})),A.d(t,"Y",(function(){return we})),A.d(t,"Z",(function(){return Fe})),A.d(t,"ab",(function(){return c})),A.d(t,"bb",(function(){return Re})),A.d(t,"cb",(function(){return De})),A.d(t,"db",(function(){return ke})),A.d(t,"eb",(function(){return k})),A.d(t,"fb",(function(){return Ne})),A.d(t,"gb",(function(){return xe})),A.d(t,"hb",(function(){return Ue})),A.d(t,"ib",(function(){return f})),A.d(t,"jb",(function(){return W})),A.d(t,"kb",(function(){return _e})),A.d(t,"lb",(function(){return R})),A.d(t,"mb",(function(){return C})),A.d(t,"nb",(function(){return J})),A.d(t,"ob",(function(){return j})),A.d(t,"pb",(function(){return P})),A.d(t,"qb",(function(){return V}));var a=function(e){return function(t){return t[e]}},s=function(e){var t=e.length;return function(A){for(var n=0;n<t;++n)A=A[e[n]];return A}};function g(e){throw Error(e)}function c(e){var t,A,n,r=[],i=e.length,o=null,a=0,s="";function c(){r.push(s+e.substring(t,A)),s="",t=A+1}for(e+="",t=A=0;A<i;++A)if("\\\\"===(n=e[A]))s+=e.substring(t,A),s+=e.substring(++A,++A),t=A;else if(n===o)c(),o=null,a=-1;else{if(o)continue;t===a&&\'"\'===n||t===a&&"\'"===n?(t=A+1,o=n):"."!==n||a?"["===n?(A>t&&c(),a=t=A+1):"]"===n&&(a||g("Access p'..b';return u&&(A.autoFocus=!0),void 0===e.props.tabIndex&&"selectedMenu"===F&&(A.tabIndex=0),i.cloneElement(e,A)}return e}));return i.createElement(l,Object(n.a)({role:"menu",ref:x,className:Q,onKeyDown:function(e){var t=D.current,A=e.key,n=Object(a.a)(t).activeElement;if("ArrowDown"===A)e.preventDefault(),B(t,n,b,v,h);else if("ArrowUp"===A)e.preventDefault(),B(t,n,b,v,f);else if("Home"===A)e.preventDefault(),B(t,null,b,v,h);else if("End"===A)e.preventDefault(),B(t,null,b,v,f);else if(1===A.length){var r=G.current,i=A.toLowerCase(),o=performance.now();r.keys.length>0&&(o-r.lastTime>500?(r.keys=[],r.repeating=!0,r.previousKeyMatched=!0):r.repeating&&i!==r.keys[0]&&(r.repeating=!1)),r.lastTime=o,r.keys.push(i);var s=n&&!r.repeating&&d(n,r);r.previousKeyMatched&&(s||B(t,n,!1,v,h,r))?e.preventDefault():r.previousKeyMatched=!1}w&&w(e)},tabIndex:g?0:-1},R),U)}));t.a=E},function(e,t,A){"use strict";var n=A(14),r=A(21),i=A(0),o=(A(13),A(19)),a=A(166),s=A(167),g=A(28),c=A(40),u=i.forwardRef((function(e,t){var A=e.children,g=e.classes,u=e.className,l=(e.color,e.component),I=void 0===l?"label":l,C=(e.disabled,e.error,e.filled,e.focused,e.required,Object(r.a)(e,["children","classes","className","color","component","disabled","error","filled","focused","required"])),h=Object(s.a)(),f=Object(a.a)({props:e,muiFormControl:h,states:["color","required","focused","disabled","error","filled"]});return i.createElement(I,Object(n.a)({className:Object(o.a)(g.root,g["color".concat(Object(c.a)(f.color||"primary"))],u,f.disabled&&g.disabled,f.error&&g.error,f.filled&&g.filled,f.focused&&g.focused,f.required&&g.required),ref:t},C),A,f.required&&i.createElement("span",{"aria-hidden":!0,className:Object(o.a)(g.asterisk,f.error&&g.error)},"\\u2009","*"))})),l=Object(g.a)((function(e){return{root:Object(n.a)({color:e.palette.text.secondary},e.typography.body1,{lineHeight:1,padding:0,"&$focused":{color:e.palette.primary.main},"&$disabled":{color:e.palette.text.disabled},"&$error":{color:e.palette.error.main}}),colorSecondary:{"&$focused":{color:e.palette.secondary.main}},focused:{},disabled:{},error:{},filled:{},required:{},asterisk:{"&$error":{color:e.palette.error.main}}}}),{name:"MuiFormLabel"})(u),I=i.forwardRef((function(e,t){var A=e.classes,g=e.className,c=e.disableAnimation,u=void 0!==c&&c,I=(e.margin,e.shrink),C=(e.variant,Object(r.a)(e,["classes","className","disableAnimation","margin","shrink","variant"])),h=Object(s.a)(),f=I;"undefined"===typeof f&&h&&(f=h.filled||h.focused||h.adornedStart);var d=Object(a.a)({props:e,muiFormControl:h,states:["margin","variant"]});return i.createElement(l,Object(n.a)({"data-shrink":f,className:Object(o.a)(A.root,g,h&&A.formControl,!u&&A.animated,f&&A.shrink,"dense"===d.margin&&A.marginDense,{filled:A.filled,outlined:A.outlined}[d.variant]),classes:{focused:A.focused,disabled:A.disabled,error:A.error,required:A.required,asterisk:A.asterisk},ref:t},C))}));t.a=Object(g.a)((function(e){return{root:{display:"block",transformOrigin:"top left"},focused:{},disabled:{},error:{},required:{},asterisk:{},formControl:{position:"absolute",left:0,top:0,transform:"translate(0, 24px) scale(1)"},marginDense:{transform:"translate(0, 21px) scale(1)"},shrink:{transform:"translate(0, 1.5px) scale(0.75)",transformOrigin:"top left"},animated:{transition:e.transitions.create(["color","transform"],{duration:e.transitions.duration.shorter,easing:e.transitions.easing.easeOut})},filled:{zIndex:1,pointerEvents:"none",transform:"translate(12px, 20px) scale(1)","&$marginDense":{transform:"translate(12px, 17px) scale(1)"},"&$shrink":{transform:"translate(12px, 10px) scale(0.75)","&$marginDense":{transform:"translate(12px, 7px) scale(0.75)"}}},outlined:{zIndex:1,pointerEvents:"none",transform:"translate(14px, 20px) scale(1)","&$marginDense":{transform:"translate(14px, 12px) scale(1)"},"&$shrink":{transform:"translate(14px, -6px) scale(0.75)"}}}}),{name:"MuiInputLabel"})(I)}]]);\n+//# sourceMappingURL=2.eb2fd6ea.chunk.js.map\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/js/2.eb2fd6ea.chunk.js.LICENSE.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/2.eb2fd6ea.chunk.js.LICENSE.txt Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,163 @@
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+/* Copyright 2015-2018 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */
+
+/*!
+      Copyright (c) 2017 Jed Watson.
+      Licensed under the MIT License (MIT), see
+      http://jedwatson.github.io/classnames
+    */
+
+/*!
+  Copyright (c) 2017 Jed Watson.
+  Licensed under the MIT License (MIT), see
+  http://jedwatson.github.io/classnames
+*/
+
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <http://feross.org>
+ * @license  MIT
+ */
+
+/*!
+ * https://github.com/Starcounter-Jack/JSON-Patch
+ * (c) 2017 Joachim Wester
+ * MIT license
+ */
+
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+
+/*! Hammer.JS - v2.0.7 - 2016-04-22
+ * http://hammerjs.github.io/
+ *
+ * Copyright (c) 2016 Jorik Tangelder;
+ * Licensed under the MIT license */
+
+/**
+   * splaytree v3.1.0
+   * Fast Splay tree for Node and browser
+   *
+   * @author Alexander Milevski <info@w8r.name>
+   * @license MIT
+   * @preserve
+   */
+
+/**
+ * @license Complex.js v2.0.11 11/02/2016
+ *
+ * Copyright (c) 2016, Robert Eisele (robert@xarg.org)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ **/
+
+/**
+ * @license Fraction.js v4.0.12 09/09/2015
+ * http://www.xarg.org/2014/03/rational-numbers-in-javascript/
+ *
+ * Copyright (c) 2015, Robert Eisele (robert@xarg.org)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ **/
+
+/**
+ * @license long.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
+ * Released under the Apache License, Version 2.0
+ * see: https://github.com/dcodeIO/long.js for details
+ */
+
+/**
+ * A better abstraction over CSS.
+ *
+ * @copyright Oleg Isonen (Slobodskoi) / Isonen 2014-present
+ * @website https://github.com/cssinjs/jss
+ * @license MIT
+ */
+
+/** @license React v0.19.1
+ * scheduler.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.13.0
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.14.0
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.14.0
+ * react-jsx-dev-runtime.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.14.0
+ * react.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license URI.js v4.2.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
+
+/**!
+ * @fileOverview Kickass library to create and place poppers near their reference elements.
+ * @version 1.16.1-lts
+ * @license
+ * Copyright (c) 2016 Federico Zivolo and contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
b
diff -r 000000000000 -r 9f60ef2d586e static/js/2.eb2fd6ea.chunk.js.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/2.eb2fd6ea.chunk.js.map Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,1 @@\n+{"version":3,"sources":["../node_modules/react/index.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/regenerator/index.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createClass.js","../node_modules/vega-util/build/vega-util.module.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelper.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/inherits.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createSuper.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../node_modules/prop-types/index.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/get.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/superPropBase.js","../../../../src/utils/log.js","../../../../src/utils/device-pixels.js","../../../../src/context/context.js","../../../src/index.js","../node_modules/clsx/dist/clsx.m.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../../src/utils/assert.js","../node_modules/gl-matrix/esm/mat4.js","../node_modules/@material-ui/styles/esm/withStyles/withStyles.js","../node_modules/@material-ui/core/esm/styles/withStyles.js","../node_modules/gl-matrix/esm/vec3.js","../node_modules/@math.gl/core/node_modules/gl-matrix/esm/common.js","../node_modules/gl-matrix/esm/common.js","../../../../src/lib/common.js","../../../../src/lib/validators.js","../node_modules/gl-matrix/esm/quat.js","../../../../../src/effects/lighting/point-light.js","../../../../../src/effects/lighting/camera-light.js","../../../../../src/effects/lighting/suncalc.js","../../../../../src/effects/lighting/sun-light.js","../../../../src/passes/screen-pass.js","../../../../src/effects/post-process-effect.js","../../../../src/viewports/globe-viewport.js","../../../../src/controllers/first-person-controller.js","../../../../src/views/first-person-view.js","../../../../src/controllers/globe-controller.js","../../../../src/views/globe-view.js","../../../../src/transitions/viewport-fly-to-interpolator.js","../../../../src/lib/constants.js","../node_modules/lodash/isEqual.js","../node_modules/react-dom/index.js","../node_modules/@material-ui/core/esm/utils/capitalize.js","../node_modules/@math.gl/web-mercator/node_modules/gl-matrix/esm/common.js","../node_modules/@math.gl/web-mercator/node_modules/gl-matrix/e'..b'px) scale(1)\'\\n      },\\n      \'&$shrink\': {\\n        transform: \'translate(12px, 10px) scale(0.75)\',\\n        \'&$marginDense\': {\\n          transform: \'translate(12px, 7px) scale(0.75)\'\\n        }\\n      }\\n    },\\n\\n    /* Styles applied to the root element if `variant=\\"outlined\\"`. */\\n    outlined: {\\n      // see comment above on filled.zIndex\\n      zIndex: 1,\\n      pointerEvents: \'none\',\\n      transform: \'translate(14px, 20px) scale(1)\',\\n      \'&$marginDense\': {\\n        transform: \'translate(14px, 12px) scale(1)\'\\n      },\\n      \'&$shrink\': {\\n        transform: \'translate(14px, -6px) scale(0.75)\'\\n      }\\n    }\\n  };\\n};\\nvar InputLabel = /*#__PURE__*/React.forwardRef(function InputLabel(props, ref) {\\n  var classes = props.classes,\\n      className = props.className,\\n      _props$disableAnimati = props.disableAnimation,\\n      disableAnimation = _props$disableAnimati === void 0 ? false : _props$disableAnimati,\\n      margin = props.margin,\\n      shrinkProp = props.shrink,\\n      variant = props.variant,\\n      other = _objectWithoutProperties(props, [\\"classes\\", \\"className\\", \\"disableAnimation\\", \\"margin\\", \\"shrink\\", \\"variant\\"]);\\n\\n  var muiFormControl = useFormControl();\\n  var shrink = shrinkProp;\\n\\n  if (typeof shrink === \'undefined\' && muiFormControl) {\\n    shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;\\n  }\\n\\n  var fcs = formControlState({\\n    props: props,\\n    muiFormControl: muiFormControl,\\n    states: [\'margin\', \'variant\']\\n  });\\n  return /*#__PURE__*/React.createElement(FormLabel, _extends({\\n    \\"data-shrink\\": shrink,\\n    className: clsx(classes.root, className, muiFormControl && classes.formControl, !disableAnimation && classes.animated, shrink && classes.shrink, fcs.margin === \'dense\' && classes.marginDense, {\\n      \'filled\': classes.filled,\\n      \'outlined\': classes.outlined\\n    }[fcs.variant]),\\n    classes: {\\n      focused: classes.focused,\\n      disabled: classes.disabled,\\n      error: classes.error,\\n      required: classes.required,\\n      asterisk: classes.asterisk\\n    },\\n    ref: ref\\n  }, other));\\n});\\nprocess.env.NODE_ENV !== \\"production\\" ? InputLabel.propTypes = {\\n  // ----------------------------- Warning --------------------------------\\n  // | These PropTypes are generated from the TypeScript type definitions |\\n  // |     To update them edit the d.ts file and run \\"yarn proptypes\\"     |\\n  // ----------------------------------------------------------------------\\n\\n  /**\\n   * The contents of the `InputLabel`.\\n   */\\n  children: PropTypes.node,\\n\\n  /**\\n   * Override or extend the styles applied to the component.\\n   * See [CSS API](#css) below for more details.\\n   */\\n  classes: PropTypes.object,\\n\\n  /**\\n   * @ignore\\n   */\\n  className: PropTypes.string,\\n\\n  /**\\n   * The color of the component. It supports those theme colors that make sense for this component.\\n   */\\n  color: PropTypes.oneOf([\'primary\', \'secondary\']),\\n\\n  /**\\n   * If `true`, the transition animation is disabled.\\n   */\\n  disableAnimation: PropTypes.bool,\\n\\n  /**\\n   * If `true`, apply disabled class.\\n   */\\n  disabled: PropTypes.bool,\\n\\n  /**\\n   * If `true`, the label will be displayed in an error state.\\n   */\\n  error: PropTypes.bool,\\n\\n  /**\\n   * If `true`, the input of this label is focused.\\n   */\\n  focused: PropTypes.bool,\\n\\n  /**\\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\\n   * FormControl.\\n   */\\n  margin: PropTypes.oneOf([\'dense\']),\\n\\n  /**\\n   * if `true`, the label will indicate that the input is required.\\n   */\\n  required: PropTypes.bool,\\n\\n  /**\\n   * If `true`, the label is shrunk.\\n   */\\n  shrink: PropTypes.bool,\\n\\n  /**\\n   * The variant to use.\\n   */\\n  variant: PropTypes.oneOf([\'filled\', \'outlined\', \'standard\'])\\n} : void 0;\\nexport default withStyles(styles, {\\n  name: \'MuiInputLabel\'\\n})(InputLabel);"],"sourceRoot":""}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/js/main.303f671d.chunk.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/main.303f671d.chunk.js Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,2 @@\n+(this.webpackJsonpvitessce=this.webpackJsonpvitessce||[]).push([[0],{1107:function(e,t){},1145:function(e,t,n){},1148:function(e,t,n){"use strict";n.r(t);n(748);var a=n(39),r=n.n(a),o=n(8),i=n(0),s=n.n(i),l=n(7),c=n(2),p=n(11),u=n(1),d=n(4);function m(e){return Object(p.a)(e).reduce((function(e,t){var n=t[0],a=t[1];return Object.assign(e,Object(c.a)({},n,a))}),{})}function f(e,t,n){return 1===n?e:t}function y(e){return e.charAt(0).toUpperCase()+e.slice(1)}function h(e){var t,n="ABCDEFGHIJKLMNOPQRSTUVWXYZ",a=[0];function r(){var e=[];a.forEach((function(t){e.unshift(n[t])}));for(var t=!0,r=0;r<a.length;r++){if(!(++a[r]>=n.length)){t=!1;break}a[r]=0}return t&&a.push(0),e.join("")}do{t=r()}while(e.includes(t));return t}function g(e,t){var n=e.data;return Array.isArray(n)?n[t||n.length-1]:n}function v(e){var t=g(e),n=t.shape,a=t.dtype;return 3===n[t.labels.indexOf("c")]&&"Uint8"===a}var b={DESCRIPTION:"description",STATUS:"status",GENES:"genes",CELL_SETS:"cellSets",SCATTERPLOT:"scatterplot",SPATIAL:"spatial",HEATMAP:"heatmap",LAYER_CONTROLLER:"layerController",CELL_SET_SIZES:"cellSetSizes",GENOMIC_PROFILES:"genomicProfiles",CELL_SET_EXPRESSION:"cellSetExpression",EXPRESSION_HISTOGRAM:"expressionHistogram"},x={CELLS_JSON:"cells.json",CELL_SETS_JSON:"cell-sets.json",EXPRESSION_MATRIX_ZARR:"expression-matrix.zarr",GENOMIC_PROFILES_ZARR:"genomic-profiles.zarr",MOLECULES_JSON:"molecules.json",NEIGHBORHOODS_JSON:"neighborhoods.json",RASTER_JSON:"raster.json",RASTER_OME_ZARR:"raster.ome-zarr",CLUSTERS_JSON:"clusters.json",GENES_JSON:"genes.json",ANNDATA_CELL_SETS_ZARR:"anndata-cell-sets.zarr",ANNDATA_CELLS_ZARR:"anndata-cells.zarr",ANNDATA_EXPRESSION_MATRIX_ZARR:"anndata-expression-matrix.zarr"},O={DATASET:"dataset",EMBEDDING_TYPE:"embeddingType",EMBEDDING_ZOOM:"embeddingZoom",EMBEDDING_ROTATION:"embeddingRotation",EMBEDDING_TARGET_X:"embeddingTargetX",EMBEDDING_TARGET_Y:"embeddingTargetY",EMBEDDING_TARGET_Z:"embeddingTargetZ",EMBEDDING_CELL_SET_POLYGONS_VISIBLE:"embeddingCellSetPolygonsVisible",EMBEDDING_CELL_SET_LABELS_VISIBLE:"embeddingCellSetLabelsVisible",EMBEDDING_CELL_SET_LABEL_SIZE:"embeddingCellSetLabelSize",EMBEDDING_CELL_RADIUS:"embeddingCellRadius",EMBEDDING_CELL_RADIUS_MODE:"embeddingCellRadiusMode",EMBEDDING_CELL_OPACITY:"embeddingCellOpacity",EMBEDDING_CELL_OPACITY_MODE:"embeddingCellOpacityMode",SPATIAL_ZOOM:"spatialZoom",SPATIAL_ROTATION:"spatialRotation",SPATIAL_TARGET_X:"spatialTargetX",SPATIAL_TARGET_Y:"spatialTargetY",SPATIAL_TARGET_Z:"spatialTargetZ",SPATIAL_ROTATION_X:"spatialRotationX",SPATIAL_ROTATION_Y:"spatialRotationY",SPATIAL_ROTATION_Z:"spatialRotationZ",SPATIAL_ROTATION_ORBIT:"spatialRotationOrbit",SPATIAL_ORBIT_AXIS:"spatialOrbitAxis",SPATIAL_AXIS_FIXED:"spatialAxisFixed",HEATMAP_ZOOM_X:"heatmapZoomX",HEATMAP_ZOOM_Y:"heatmapZoomY",HEATMAP_TARGET_X:"heatmapTargetX",HEATMAP_TARGET_Y:"heatmapTargetY",CELL_FILTER:"cellFilter",CELL_HIGHLIGHT:"cellHighlight",CELL_SET_SELECTION:"cellSetSelection",CELL_SET_HIGHLIGHT:"cellSetHighlight",CELL_SET_COLOR:"cellSetColor",GENE_FILTER:"geneFilter",GENE_HIGHLIGHT:"geneHighlight",GENE_SELECTION:"geneSelection",GENE_EXPRESSION_COLORMAP:"geneExpressionColormap",GENE_EXPRESSION_TRANSFORM:"geneExpressionTransform",GENE_EXPRESSION_COLORMAP_RANGE:"geneExpressionColormapRange",CELL_COLOR_ENCODING:"cellColorEncoding",SPATIAL_RASTER_LAYERS:"spatialRasterLayers",SPATIAL_CELLS_LAYER:"spatialCellsLayer",SPATIAL_MOLECULES_LAYER:"spatialMoleculesLayer",SPATIAL_NEIGHBORHOODS_LAYER:"spatialNeighborhoodsLayer",GENOMIC_ZOOM_X:"genomicZoomX",GENOMIC_ZOOM_Y:"genomicZoomY",GENOMIC_TARGET_X:"genomicTargetX",GENOMIC_TARGET_Y:"genomicTargetY",ADDITIONAL_CELL_SETS:"additionalCellSets",MOLECULE_HIGHLIGHT:"moleculeHighlight"},j=function(){function e(t,n,a,r){Object(u.a)(this,e),this.file=Object(l.a)({url:t,type:n,fileType:a},null!==r?{options:r}:{})}return Object(d.a)(e,[{key:"toJSON",value:function(){return this.file}}]),e}(),E=function(){function e(t,n,a){Object(u.a)(this,e),this.d'..b'function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":u&&u in Object(t)?o(t):i(t)}},function(t,n,e){var r=e(8).Symbol;t.exports=r},function(t,n){t.exports=function(t,n,e){return t===t&&(void 0!==e&&(t=t<=e?t:e),void 0!==n&&(t=t>=n?t:n)),t}},function(t,n,e){var r=e(4),o=e(13);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},function(t,n,e){var r=e(9),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,n,e){(function(n){var e="object"==typeof n&&n&&n.Object===Object&&n;t.exports=e}).call(this,e(10))},function(t,n){var e;e=function(){return this}();try{e=e||new Function("return this")()}catch(r){"object"===typeof window&&(e=window)}t.exports=e},function(t,n,e){var r=e(5),o=Object.prototype,i=o.hasOwnProperty,u=o.toString,c=r?r.toStringTag:void 0;t.exports=function(t){var n=i.call(t,c),e=t[c];try{t[c]=void 0;var r=!0}catch(f){}var o=u.call(t);return r&&(n?t[c]=e:delete t[c]),o}},function(t,n){var e=Object.prototype.toString;t.exports=function(t){return e.call(t)}},function(t,n){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,n,e){var r=e(15),o=e(16),i=e(22);t.exports=function(t){return function(n,e,u){return u&&"number"!=typeof u&&o(n,e,u)&&(e=u=void 0),n=i(n),void 0===e?(e=n,n=0):e=i(e),u=void 0===u?n<e?1:-1:i(u),r(n,e,u,t)}}},function(t,n){var e=Math.ceil,r=Math.max;t.exports=function(t,n,o,i){for(var u=-1,c=r(e((n-t)/(o||1)),0),f=Array(c);c--;)f[i?c:++u]=t,t+=o;return f}},function(t,n,e){var r=e(17),o=e(18),i=e(21),u=e(0);t.exports=function(t,n,e){if(!u(e))return!1;var c=typeof n;return!!("number"==c?o(e)&&i(n,e.length):"string"==c&&n in e)&&r(e[n],t)}},function(t,n){t.exports=function(t,n){return t===n||t!==t&&n!==n}},function(t,n,e){var r=e(19),o=e(20);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},function(t,n,e){var r=e(4),o=e(0);t.exports=function(t){if(!o(t))return!1;var n=r(t);return"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n}},function(t,n){t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},function(t,n){var e=/^(?:0|[1-9]\\\\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&e.test(t))&&t>-1&&t%1==0&&t<n}},function(t,n,e){var r=e(3);t.exports=function(t){return t?(t=r(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t===t?t:0:0===t?t:0}},function(t,n,e){"use strict";e.r(n);e(1);var r=e(2),o=e.n(r);function i(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}var u,c=9728,f=10240,l=10241,a=10242,s=10243,p=33071;i(u={},l,c),i(u,f,c),i(u,a,p),i(u,s,p);function v(t,n){var e,r,i,u=n.tileSize,c=n.tileI,f=n.tileJ,l=n.numCells,a=n.numGenes,s=n.cellOrdering,p=n.cells,v=new Uint8Array(u*u),d=o()(u);return d.forEach((function(n){(r=f*u+n)<l&&(i=p.indexOf(s[r]))>=-1&&d.forEach((function(r){e=t[i*a+(c*u+r)],v[(u-r-1)*u+n]=e}))})),v}function d(t,n){var e,r,i,u,c=n.tileSize,f=n.tileI,l=n.tileJ,a=n.numCells,s=n.numGenes,p=n.cellOrdering,v=n.cells,d=new Uint8Array(c*c),b=o()(c);return b.forEach((function(n){(r=f*c+n)<a&&(u=v.indexOf(p[r]))>=-1&&b.forEach((function(r){e=(i=l*c+r)<s?t[u*s+i]:0,d[(c-n-1)*c+r]=e}))})),d}if("undefined"!==typeof self){const t={getTile:function({curr:t,tileI:n,tileJ:e,tileSize:r,cellOrdering:o,rows:i,cols:u,data:c,transpose:f}){const l=new Uint8Array(c),a=u.length;return[{tile:(f?v:d)(l,{tileSize:r,tileI:n,tileJ:e,numCells:o.length,numGenes:a,cellOrdering:o,cells:i}),buffer:c,curr:t},[c]]}};self.addEventListener("message",n=>{try{const[e,r]=n.data,[o,i]=t[e](r);self.postMessage(o,i)}catch(e){console.warn(e)}})}}]);\\n//# sourceMappingURL=6f6f723a7874f4178a42.worker.js.map\',null)}},747:function(e,t,n){e.exports=n(1148)},863:function(e,t){},875:function(e,t){}},[[747,1,2]]]);\n+//# sourceMappingURL=main.303f671d.chunk.js.map\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/js/main.303f671d.chunk.js.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/main.303f671d.chunk.js.map Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,1 @@\n+{"version":3,"sources":["utils.js","app/constants.js","api/VitessceConfig.js","demo/utils.js","demo/view-configs/codeluppi.js","demo/view-configs/eng.js","demo/view-configs/wang.js","demo/view-configs/spraggins.js","demo/view-configs/satija.js","demo/view-configs/blin.js","demo/view-configs/ome-ngff-legacy.js","demo/view-configs/hubmap.js","demo/view-configs/coordination-types/embeddingZoom.js","demo/view-configs/coordination-types/embeddingTargetX.js","demo/view-configs/coordination-types/embeddingTargetY.js","demo/view-configs/coordination-types/embeddingCellSetPolygonsVisible.js","demo/configs.js","demo/view-configs/rao.js","demo/view-configs/tenx.js","components/classNames.js","app/Warning.js","components/shared-mui/styles.js","app/state/hooks.js","app/vitessce-grid-layout/layout-utils.js","app/vitessce-grid-layout/VitessceGridLayout.js","loaders/AbstractTwoStepLoader.js","loaders/AbstractLoader.js","loaders/errors/AbstractLoaderError.js","loaders/errors/LoaderValidationError.js","loaders/errors/LoaderNotFoundError.js","loaders/LoaderResult.js","loaders/JsonLoader.js","loaders/MatrixZarrLoader.js","loaders/GenesJsonAsMatrixZarrLoader.js","loaders/ClustersJsonAsMatrixZarrLoader.js","components/sets/constants.js","components/utils.js","components/spatial/constants.js","layers/constants.js","layers/BitmaskLayer.js","layers/bitmask-layer-shaders.js","components/layer-controller/utils.js","components/spatial/utils.js","loaders/RasterJsonLoader.js","loaders/OmeZarrLoader.js","components/sets/utils.js","components/sets/cell-set-utils.js","components/sets/io.js","loaders/CellSetsJsonLoader.js","loaders/anndata-loaders/CellSetsZarrLoader.js","loaders/anndata-loaders/MatrixZarrLoader.js","loaders/anndata-loaders/index.js","loaders/anndata-loaders/CellsZarrLoader.js","loaders/GenomicProfilesZarrLoader.js","loaders/data-sources/ZarrDataSource.js","loaders/data-sources/AnnDataSource.js","loaders/errors/DataSourceFetchError.js","loaders/data-sources/JsonSource.js","loaders/types.js","app/vitessce-grid-utils.js","components/hooks.js","app/VitessceGrid.js","app/state/coordination.js","app/view-config-upgraders.js","app/view-config-versions.js","app/CallbackPublisher.js","components/data-hooks.js","components/LoadingIndicator.js","components/shared-mui/components.js","components/TitleInfo.js","components/description/Description.js","components/description/DescriptionSubscriber.js","components/status/Status.js","components/selectable-table/SelectableTable.js","components/genes/Genes.js","components/genes/GenesSubscriber.js","components/sets/Tree.js","components/sets/HelpTooltip.js","components/sets/Popover.js","components/sets/PopoverMenu.js","assets/menu.svg","components/sets/TreeNode.js","assets/sets/union.svg","assets/sets/intersection.svg","assets/sets/complement.svg","components/sets/SetsManagerButtons.js","components/sets/SetsManager.js","components/sets/CellSetsManagerSubscriber.js","components/interpolate-colors.js","layers/SelectionLayer.js","layers/selection-utils.js","layers/heatmap-constants.js","layers/heatmap-bitmap-layer-shaders.js","layers/HeatmapBitmapLayer.js","layers/PixelatedBitmapLayer.js","layers/HeatmapCompositeTextLayer.js","components/shared-spatial-scatterplot/quadtree.js","assets/tools/near_me.svg","assets/tools/selection_rectangle.svg","assets/tools/selection_lasso.svg","components/shared-spatial-scatterplot/ToolMenu.js","components/shared-spatial-scatterplot/cursor.js","components/shared-spatial-scatterplot/AbstractSpatialOrScatterplot.js","components/shared-spatial-scatterplot/force-collide-rects.js","layer-extensions/ScaledExpressionExtension/shader-module.js","layer-extensions/ScaledExpressionExtension/ScaledExpressionExtension.js","layer-extensions/ScaledExpressionExtension/index.js","layer-extensions/SelectionExtension/shader-module.js","layer-extensions/SelectionExtension/SelectionExtension.js","layer-extensions/SelectionExtension/index.js","components/scatterplot/Scatterplot.js","compone'..b'll==t?void 0===t?\\\\\\"[object Undefined]\\\\\\":\\\\\\"[object Null]\\\\\\":u&&u in Object(t)?o(t):i(t)}},function(t,n,e){var r=e(8).Symbol;t.exports=r},function(t,n){t.exports=function(t,n,e){return t===t&&(void 0!==e&&(t=t<=e?t:e),void 0!==n&&(t=t>=n?t:n)),t}},function(t,n,e){var r=e(4),o=e(13);t.exports=function(t){return\\\\\\"symbol\\\\\\"==typeof t||o(t)&&\\\\\\"[object Symbol]\\\\\\"==r(t)}},function(t,n,e){var r=e(9),o=\\\\\\"object\\\\\\"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function(\\\\\\"return this\\\\\\")();t.exports=i},function(t,n,e){(function(n){var e=\\\\\\"object\\\\\\"==typeof n&&n&&n.Object===Object&&n;t.exports=e}).call(this,e(10))},function(t,n){var e;e=function(){return this}();try{e=e||new Function(\\\\\\"return this\\\\\\")()}catch(r){\\\\\\"object\\\\\\"===typeof window&&(e=window)}t.exports=e},function(t,n,e){var r=e(5),o=Object.prototype,i=o.hasOwnProperty,u=o.toString,c=r?r.toStringTag:void 0;t.exports=function(t){var n=i.call(t,c),e=t[c];try{t[c]=void 0;var r=!0}catch(f){}var o=u.call(t);return r&&(n?t[c]=e:delete t[c]),o}},function(t,n){var e=Object.prototype.toString;t.exports=function(t){return e.call(t)}},function(t,n){t.exports=function(t){return null!=t&&\\\\\\"object\\\\\\"==typeof t}},function(t,n,e){var r=e(15),o=e(16),i=e(22);t.exports=function(t){return function(n,e,u){return u&&\\\\\\"number\\\\\\"!=typeof u&&o(n,e,u)&&(e=u=void 0),n=i(n),void 0===e?(e=n,n=0):e=i(e),u=void 0===u?n<e?1:-1:i(u),r(n,e,u,t)}}},function(t,n){var e=Math.ceil,r=Math.max;t.exports=function(t,n,o,i){for(var u=-1,c=r(e((n-t)/(o||1)),0),f=Array(c);c--;)f[i?c:++u]=t,t+=o;return f}},function(t,n,e){var r=e(17),o=e(18),i=e(21),u=e(0);t.exports=function(t,n,e){if(!u(e))return!1;var c=typeof n;return!!(\\\\\\"number\\\\\\"==c?o(e)&&i(n,e.length):\\\\\\"string\\\\\\"==c&&n in e)&&r(e[n],t)}},function(t,n){t.exports=function(t,n){return t===n||t!==t&&n!==n}},function(t,n,e){var r=e(19),o=e(20);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},function(t,n,e){var r=e(4),o=e(0);t.exports=function(t){if(!o(t))return!1;var n=r(t);return\\\\\\"[object Function]\\\\\\"==n||\\\\\\"[object GeneratorFunction]\\\\\\"==n||\\\\\\"[object AsyncFunction]\\\\\\"==n||\\\\\\"[object Proxy]\\\\\\"==n}},function(t,n){t.exports=function(t){return\\\\\\"number\\\\\\"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},function(t,n){var e=/^(?:0|[1-9]\\\\\\\\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&(\\\\\\"number\\\\\\"==r||\\\\\\"symbol\\\\\\"!=r&&e.test(t))&&t>-1&&t%1==0&&t<n}},function(t,n,e){var r=e(3);t.exports=function(t){return t?(t=r(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t===t?t:0:0===t?t:0}},function(t,n,e){\\\\\\"use strict\\\\\\";e.r(n);e(1);var r=e(2),o=e.n(r);function i(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}var u,c=9728,f=10240,l=10241,a=10242,s=10243,p=33071;i(u={},l,c),i(u,f,c),i(u,a,p),i(u,s,p);function v(t,n){var e,r,i,u=n.tileSize,c=n.tileI,f=n.tileJ,l=n.numCells,a=n.numGenes,s=n.cellOrdering,p=n.cells,v=new Uint8Array(u*u),d=o()(u);return d.forEach((function(n){(r=f*u+n)<l&&(i=p.indexOf(s[r]))>=-1&&d.forEach((function(r){e=t[i*a+(c*u+r)],v[(u-r-1)*u+n]=e}))})),v}function d(t,n){var e,r,i,u,c=n.tileSize,f=n.tileI,l=n.tileJ,a=n.numCells,s=n.numGenes,p=n.cellOrdering,v=n.cells,d=new Uint8Array(c*c),b=o()(c);return b.forEach((function(n){(r=f*c+n)<a&&(u=v.indexOf(p[r]))>=-1&&b.forEach((function(r){e=(i=l*c+r)<s?t[u*s+i]:0,d[(c-n-1)*c+r]=e}))})),d}if(\\\\\\"undefined\\\\\\"!==typeof self){const t={getTile:function({curr:t,tileI:n,tileJ:e,tileSize:r,cellOrdering:o,rows:i,cols:u,data:c,transpose:f}){const l=new Uint8Array(c),a=u.length;return[{tile:(f?v:d)(l,{tileSize:r,tileI:n,tileJ:e,numCells:o.length,numGenes:a,cellOrdering:o,cells:i}),buffer:c,curr:t},[c]]}};self.addEventListener(\\\\\\"message\\\\\\",n=>{try{const[e,r]=n.data,[o,i]=t[e](r);self.postMessage(o,i)}catch(e){console.warn(e)}})}}]);\\\\n//# sourceMappingURL=6f6f723a7874f4178a42.worker.js.map\\", null);\\n};"],"sourceRoot":""}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/js/runtime-main.784d90f4.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/runtime-main.784d90f4.js Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,2 @@
+!function(e){function t(t){for(var n,i,l=t[0],f=t[1],a=t[2],p=0,s=[];p<l.length;p++)i=l[p],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,a||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var f=r[l];0!==o[f]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="./";var l=this.webpackJsonpvitessce=this.webpackJsonpvitessce||[],f=l.push.bind(l);l.push=t,l=l.slice();for(var a=0;a<l.length;a++)t(l[a]);var c=f;r()}([]);
+//# sourceMappingURL=runtime-main.784d90f4.js.map
\ No newline at end of file
b
diff -r 000000000000 -r 9f60ef2d586e static/js/runtime-main.784d90f4.js.map
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/js/runtime-main.784d90f4.js.map Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,1 @@\n+{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.784d90f4.js","sourcesContent":[" \\t// install a JSONP callback for chunk loading\\n \\tfunction webpackJsonpCallback(data) {\\n \\t\\tvar chunkIds = data[0];\\n \\t\\tvar moreModules = data[1];\\n \\t\\tvar executeModules = data[2];\\n\\n \\t\\t// add \\"moreModules\\" to the modules object,\\n \\t\\t// then flag all \\"chunkIds\\" as loaded and fire callback\\n \\t\\tvar moduleId, chunkId, i = 0, resolves = [];\\n \\t\\tfor(;i < chunkIds.length; i++) {\\n \\t\\t\\tchunkId = chunkIds[i];\\n \\t\\t\\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\\n \\t\\t\\t\\tresolves.push(installedChunks[chunkId][0]);\\n \\t\\t\\t}\\n \\t\\t\\tinstalledChunks[chunkId] = 0;\\n \\t\\t}\\n \\t\\tfor(moduleId in moreModules) {\\n \\t\\t\\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\\n \\t\\t\\t\\tmodules[moduleId] = moreModules[moduleId];\\n \\t\\t\\t}\\n \\t\\t}\\n \\t\\tif(parentJsonpFunction) parentJsonpFunction(data);\\n\\n \\t\\twhile(resolves.length) {\\n \\t\\t\\tresolves.shift()();\\n \\t\\t}\\n\\n \\t\\t// add entry modules from loaded chunk to deferred list\\n \\t\\tdeferredModules'..b'lfilled = true;\\n \\t\\t\\tfor(var j = 1; j < deferredModule.length; j++) {\\n \\t\\t\\t\\tvar depId = deferredModule[j];\\n \\t\\t\\t\\tif(installedChunks[depId] !== 0) fulfilled = false;\\n \\t\\t\\t}\\n \\t\\t\\tif(fulfilled) {\\n \\t\\t\\t\\tdeferredModules.splice(i--, 1);\\n \\t\\t\\t\\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\\n \\t\\t\\t}\\n \\t\\t}\\n\\n \\t\\treturn result;\\n \\t}\\n\\n \\t// The module cache\\n \\tvar installedModules = {};\\n\\n \\t// object to store loaded and loading chunks\\n \\t// undefined = chunk not loaded, null = chunk preloaded/prefetched\\n \\t// Promise = chunk loading, 0 = chunk loaded\\n \\tvar installedChunks = {\\n \\t\\t1: 0\\n \\t};\\n\\n \\tvar deferredModules = [];\\n\\n \\t// The require function\\n \\tfunction __webpack_require__(moduleId) {\\n\\n \\t\\t// Check if module is in cache\\n \\t\\tif(installedModules[moduleId]) {\\n \\t\\t\\treturn installedModules[moduleId].exports;\\n \\t\\t}\\n \\t\\t// Create a new module (and put it into the cache)\\n \\t\\tvar module = installedModules[moduleId] = {\\n \\t\\t\\ti: moduleId,\\n \\t\\t\\tl: false,\\n \\t\\t\\texports: {}\\n \\t\\t};\\n\\n \\t\\t// Execute the module function\\n \\t\\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n \\t\\t// Flag the module as loaded\\n \\t\\tmodule.l = true;\\n\\n \\t\\t// Return the exports of the module\\n \\t\\treturn module.exports;\\n \\t}\\n\\n\\n \\t// expose the modules object (__webpack_modules__)\\n \\t__webpack_require__.m = modules;\\n\\n \\t// expose the module cache\\n \\t__webpack_require__.c = installedModules;\\n\\n \\t// define getter function for harmony exports\\n \\t__webpack_require__.d = function(exports, name, getter) {\\n \\t\\tif(!__webpack_require__.o(exports, name)) {\\n \\t\\t\\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\\n \\t\\t}\\n \\t};\\n\\n \\t// define __esModule on exports\\n \\t__webpack_require__.r = function(exports) {\\n \\t\\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\\n \\t\\t\\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\\n \\t\\t}\\n \\t\\tObject.defineProperty(exports, \'__esModule\', { value: true });\\n \\t};\\n\\n \\t// create a fake namespace object\\n \\t// mode & 1: value is a module id, require it\\n \\t// mode & 2: merge all properties of value into the ns\\n \\t// mode & 4: return value when already ns object\\n \\t// mode & 8|1: behave like require\\n \\t__webpack_require__.t = function(value, mode) {\\n \\t\\tif(mode & 1) value = __webpack_require__(value);\\n \\t\\tif(mode & 8) return value;\\n \\t\\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\\n \\t\\tvar ns = Object.create(null);\\n \\t\\t__webpack_require__.r(ns);\\n \\t\\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\\n \\t\\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\\n \\t\\treturn ns;\\n \\t};\\n\\n \\t// getDefaultExport function for compatibility with non-harmony modules\\n \\t__webpack_require__.n = function(module) {\\n \\t\\tvar getter = module && module.__esModule ?\\n \\t\\t\\tfunction getDefault() { return module[\'default\']; } :\\n \\t\\t\\tfunction getModuleExports() { return module; };\\n \\t\\t__webpack_require__.d(getter, \'a\', getter);\\n \\t\\treturn getter;\\n \\t};\\n\\n \\t// Object.prototype.hasOwnProperty.call\\n \\t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\\n\\n \\t// __webpack_public_path__\\n \\t__webpack_require__.p = \\"./\\";\\n\\n \\tvar jsonpArray = this[\\"webpackJsonpvitessce\\"] = this[\\"webpackJsonpvitessce\\"] || [];\\n \\tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\\n \\tjsonpArray.push = webpackJsonpCallback;\\n \\tjsonpArray = jsonpArray.slice();\\n \\tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\\n \\tvar parentJsonpFunction = oldJsonpFunction;\\n\\n\\n \\t// run deferred modules from other chunks\\n \\tcheckDeferredModules();\\n"],"sourceRoot":""}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 9f60ef2d586e static/media/complement.c220ca8c.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/complement.c220ca8c.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,24 @@
+<svg
+   id="svg14"
+   version="1.1"
+   viewBox="0 0 25.3804963846 16"
+   height="16"
+   width="25.3804963846">
+    <defs>
+        <mask id="union-mask" x="0" y="0" width="25.3804963846" height="16">
+                <rect x="5%" width="90%" height="100%" fill="white"/>
+                <g
+                    transform="translate(4.69,0)"
+                >
+                    <path
+                        d="m 11.467471,11.811278 c 0.198237,-0.322177 0.508,-1.011333 0.653661,-1.454255 0.659343,-2.0049141 0.44323,-4.2620847 -0.577734,-6.0340822 l -0.168844,-0.2930481 0.105744,0.017887 c 0.759902,0.1285441 1.368762,0.3699553 1.856675,0.7361658 1.988296,1.4923476 2.192477,4.3353549 0.434717,6.0529895 -0.641216,0.626581 -1.299647,0.94683 -2.294136,1.115833 l -0.108488,0.01844 z M 4.3162122,11.919169 C 1.9278944,11.487872 0.46692382,9.0323123 1.234873,6.7401372 1.5621727,5.763213 2.2610593,4.9489746 3.1840041,4.4693005 3.5978035,4.2542401 3.9427842,4.145371 4.5197023,4.0477802 L 4.6254464,4.0298927 4.4571836,4.3223069 C 3.4332707,6.1017061 3.2180432,8.3476022 3.878868,10.357023 c 0.1458466,0.443487 0.4554716,1.132155 0.6542959,1.455285 0.054471,0.08853 0.087814,0.159599 0.074096,0.157937 -0.013718,-0.0017 -0.1446898,-0.02465 -0.2910477,-0.05108 z M 5.0000001,3 C 2.2,3 0,5.2 0,8 c 0,2.8 2.2,5 5.0000001,5 0.6,0 1.1,-0.1 1.6,-0.3 C 5.3000001,11.6 4.5,9.7999998 4.5,8 4.5,6.2 5.3000001,4.5 6.6000001,3.3 c -0.5,-0.2 -1,-0.3 -1.6,-0.3 z M 4.65,4.02 C 3.92,5.17 3.51,6.54 3.51,8 c 0,1.4599998 0.42,2.83 1.14,3.98 C 2.61,11.8 1.01,10.08 1.01,8 1.01,5.92 2.61,4.2 4.65,4.02 Z M 8,4 C 6.8,4.9 6,6.4 6,8 6,9.6 6.8,11.1 8,12 9.2,11.1 10,9.7 10,8 10,6.3 9.2,4.9 8,4 Z m 3,-1 c 2.8,0 5,2.2 5,5 0,2.8 -2.2,5 -5,5 C 10.4,13 9.9,12.9 9.4,12.7 10.7,11.6 11.5,9.8 11.5,8 11.5,6.2 10.7,4.5 9.4,3.3 9.9,3.1 10.4,3 11,3 Z m 0.35,1.02 c 0.73,1.15 1.14,2.52 1.14,3.98 0,1.46 -0.42,2.83 -1.14,3.98 2.04,-0.18 3.64,-1.9 3.64,-3.98 0,-2.08 -1.6,-3.8 -3.64,-3.98 z"
+                        style="stroke-width:0.234;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+                        fill="black"
+                    />
+                </g>
+        </mask>
+    </defs>
+  <g>
+      <rect x="0" y="0" width="25.3804963846" height="16" mask="url(#union-mask)"/>
+  </g>
+</svg>
b
diff -r 000000000000 -r 9f60ef2d586e static/media/intersection.b0003109.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/intersection.b0003109.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,14 @@
+<svg
+   width="18"
+   height="12"
+   viewBox="0 0 16 10"
+   version="1.1">
+  <g
+     transform="translate(0,-3)"
+   >
+      <path
+         d="M 5.0000001,3 C 2.2,3 0,5.2 0,8 c 0,2.8 2.2,5 5.0000001,5 0.6,0 1.1,-0.1 1.6,-0.3 C 5.3000001,11.6 4.5,9.7999998 4.5,8 4.5,6.2 5.3000001,4.5 6.6000001,3.3 c -0.5,-0.2 -1,-0.3 -1.6,-0.3 z M 4.65,4.02 C 3.92,5.17 3.51,6.54 3.51,8 c 0,1.4599998 0.42,2.83 1.14,3.98 C 2.61,11.8 1.01,10.08 1.01,8 1.01,5.92 2.61,4.2 4.65,4.02 Z M 8,4 C 6.8,4.9 6,6.4 6,8 6,9.6 6.8,11.1 8,12 9.2,11.1 10,9.7 10,8 10,6.3 9.2,4.9 8,4 Z m 3,-1 c 2.8,0 5,2.2 5,5 0,2.8 -2.2,5 -5,5 C 10.4,13 9.9,12.9 9.4,12.7 10.7,11.6 11.5,9.8 11.5,8 11.5,6.2 10.7,4.5 9.4,3.3 9.9,3.1 10.4,3 11,3 Z m 0.35,1.02 c 0.73,1.15 1.14,2.52 1.14,3.98 0,1.46 -0.42,2.83 -1.14,3.98 2.04,-0.18 3.64,-1.9 3.64,-3.98 0,-2.08 -1.6,-3.8 -3.64,-3.98 z"
+         style="stroke-width:0.234;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+      />
+  </g>
+</svg>
b
diff -r 000000000000 -r 9f60ef2d586e static/media/menu.bc56e94a.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/menu.bc56e94a.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12 18c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3zm0-9c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3zm0-9c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3z"/></svg>
\ No newline at end of file
b
diff -r 000000000000 -r 9f60ef2d586e static/media/near_me.2a308adc.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/near_me.2a308adc.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path fill="none" d="M0 0h24v24H0V0z"/>
+    <path d="M21 3L3 10.53v.98l6.84 2.65L12.48 21h.98L21 3z"/>
+</svg>
b
diff -r 000000000000 -r 9f60ef2d586e static/media/selection_lasso.00e80a33.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/selection_lasso.00e80a33.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+  <g transform="translate(0,3)">
+    <path
+      style="stroke-width:0.343565"
+      d="M 23.942314,4.6958443 C 23.446206,1.8868581 19.727461,0 14.687364,0 13.437819,0 12.150138,0.11543779 10.859708,0.34287772 4.1629423,1.5250844 -0.58168816,5.2884937 0.05768601,8.911385 c 0.25355086,1.439193 1.35605049,2.63583 3.04638949,3.461072 -0.2569865,0.387198 -0.4074679,0.826617 -0.4074679,1.29524 0,1.337498 1.1863293,2.457176 2.7639791,2.728248 l -1.3615475,2.333149 c -0.1576963,0.271073 -0.066308,0.61876 0.2047647,0.776457 0.090014,0.05291 0.1886171,0.07799 0.2858459,0.07799 0.1951448,0 0.3851362,-0.100665 0.4912977,-0.281723 l 1.6803757,-2.88148 C 8.41868,16.20561 9.6895264,15.063601 9.6998333,13.683844 c 6.872e-4,-0.0055 0.00137,-0.01065 0.00137,-0.01615 0,-0.02336 -0.00344,-0.04569 -0.00481,-0.06837 1.1292977,-0.0213 2.2847067,-0.130211 3.4435507,-0.334975 6.69711,-1.181863 11.44174,-4.9456164 10.802366,-8.5685077 z M 3.83312,13.667353 c 0,-0.30749 0.1281497,-0.59849 0.3470005,-0.848261 0.1219655,0.04295 0.2456489,0.08383 0.3717372,0.123339 l 1.2234344,2.352045 C 4.6865351,15.149835 3.83312,14.46408 3.83312,13.667353 Z M 7.0141869,15.216144 6.0223152,13.309702 5.4008064,12.114097 c 0.121622,-0.03161 0.2477103,-0.05634 0.3772342,-0.07387 0.1367388,-0.0189 0.2772568,-0.02886 0.420867,-0.02886 0.5067581,0 0.980534,0.11956 1.3701366,0.317454 0.5696305,0.289968 0.9554538,0.750345 0.9904974,1.262944 0.00137,0.02542 0.0055,0.05016 0.0055,0.07593 0,0.698124 -0.6562089,1.310356 -1.5508518,1.548447 z m 5.9185921,-3.126441 c -1.217251,0.214728 -2.429691,0.323982 -3.6060571,0.324669 -0.5765018,-0.911821 -1.7614569,-1.53917 -3.1278143,-1.53917 -0.4717146,0 -0.921441,0.07593 -1.332001,0.211292 -0.3061162,0.100665 -0.5878394,0.237403 -0.8427645,0.39991 C 2.4598914,10.828133 1.4360682,9.8579062 1.2319907,8.7035283 0.72660678,5.8381974 5.2307418,2.5475333 11.067221,1.5175259 c 1.222061,-0.2161023 2.439998,-0.3246688 3.620143,-0.3246688 4.371863,0 7.694479,1.5250844 8.080645,3.7101568 0.505041,2.8653309 -3.998751,6.1566821 -9.83523,7.1866891 z"
+      id="path10" />
+  </g>
+</svg>
b
diff -r 000000000000 -r 9f60ef2d586e static/media/selection_rectangle.aa477261.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/selection_rectangle.aa477261.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,18 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+  <!-- Based on rounded_corner.svg -->
+    <path  d="
+      M19 19h2v2h-2v-2zm0-2h2v-2h-2v2z
+      M3 13h2v-2H3v2zm0 4h2v-2H3v2z
+      m0-8h2V7H3v2zm0-4h2V3H3v2z
+      m4 0h2V3H7v2zm8 16h2v-2h-2v2z
+      m-4 0h2v-2h-2v2z
+      m4 0h2v-2h-2v2z
+      m-8 0h2v-2H7v2z
+      m-4 0h2v-2H3v2z
+      M11 5h2v-2h-2v2z
+      M15 5h2v-2h-2v2z
+      M19 5h2v-2h-2v2z
+      M19 9h2v-2h-2v2z
+      M19 13h2v-2h-2v2z
+    "/>
+</svg>
b
diff -r 000000000000 -r 9f60ef2d586e static/media/union.de5168c6.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/media/union.de5168c6.svg Thu Sep 08 17:23:33 2022 +0000
b
@@ -0,0 +1,14 @@
+<svg
+   version="1.1"
+   viewBox="0 0 16.433999 10.234"
+   height="12"
+   width="18">
+  <g
+     transform="translate(0.117,-2.883)"
+   >
+      <path
+         d="m 11.467471,11.811278 c 0.198237,-0.322177 0.508,-1.011333 0.653661,-1.454255 0.659343,-2.0049141 0.44323,-4.2620847 -0.577734,-6.0340822 l -0.168844,-0.2930481 0.105744,0.017887 c 0.759902,0.1285441 1.368762,0.3699553 1.856675,0.7361658 1.988296,1.4923476 2.192477,4.3353549 0.434717,6.0529895 -0.641216,0.626581 -1.299647,0.94683 -2.294136,1.115833 l -0.108488,0.01844 z M 4.3162122,11.919169 C 1.9278944,11.487872 0.46692382,9.0323123 1.234873,6.7401372 1.5621727,5.763213 2.2610593,4.9489746 3.1840041,4.4693005 3.5978035,4.2542401 3.9427842,4.145371 4.5197023,4.0477802 L 4.6254464,4.0298927 4.4571836,4.3223069 C 3.4332707,6.1017061 3.2180432,8.3476022 3.878868,10.357023 c 0.1458466,0.443487 0.4554716,1.132155 0.6542959,1.455285 0.054471,0.08853 0.087814,0.159599 0.074096,0.157937 -0.013718,-0.0017 -0.1446898,-0.02465 -0.2910477,-0.05108 z M 5.0000001,3 C 2.2,3 0,5.2 0,8 c 0,2.8 2.2,5 5.0000001,5 0.6,0 1.1,-0.1 1.6,-0.3 C 5.3000001,11.6 4.5,9.7999998 4.5,8 4.5,6.2 5.3000001,4.5 6.6000001,3.3 c -0.5,-0.2 -1,-0.3 -1.6,-0.3 z M 4.65,4.02 C 3.92,5.17 3.51,6.54 3.51,8 c 0,1.4599998 0.42,2.83 1.14,3.98 C 2.61,11.8 1.01,10.08 1.01,8 1.01,5.92 2.61,4.2 4.65,4.02 Z M 8,4 C 6.8,4.9 6,6.4 6,8 6,9.6 6.8,11.1 8,12 9.2,11.1 10,9.7 10,8 10,6.3 9.2,4.9 8,4 Z m 3,-1 c 2.8,0 5,2.2 5,5 0,2.8 -2.2,5 -5,5 C 10.4,13 9.9,12.9 9.4,12.7 10.7,11.6 11.5,9.8 11.5,8 11.5,6.2 10.7,4.5 9.4,3.3 9.9,3.1 10.4,3 11,3 Z m 0.35,1.02 c 0.73,1.15 1.14,2.52 1.14,3.98 0,1.46 -0.42,2.83 -1.14,3.98 2.04,-0.18 3.64,-1.9 3.64,-3.98 0,-2.08 -1.6,-3.8 -3.64,-3.98 z"
+         style="stroke-width:0.234;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+      />
+  </g>
+</svg>
b
diff -r 000000000000 -r 9f60ef2d586e test-data/cropped_reactive_core.ome.tiff
b
Binary file test-data/cropped_reactive_core.ome.tiff has changed
b
diff -r 000000000000 -r 9f60ef2d586e test-data/cropped_tutorial_data_pheno.h5ad
b
Binary file test-data/cropped_tutorial_data_pheno.h5ad has changed
b
diff -r 000000000000 -r 9f60ef2d586e test-data/tutorial_vitessce.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/tutorial_vitessce.html Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,39 @@
+<!doctype html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <style>
+        body,html{height:100%}
+        body{
+            font-family:-apple-system,'Helvetica Neue',Arial,sans-serif;display:flex;flex-direction:column}
+        #full-app{flex:1}
+        #full-app .vitessce-container{
+            height:max(100%,100vh);width:100%;overflow:hidden}
+        #full-app #small-app .vitessce-container{height:600px}
+        </style>
+        <title>Vitessce</title>
+        <link href="./static/css/2.f290e260.chunk.css" rel="stylesheet">
+        <link href="./static/css/main.a53cc462.chunk.css" rel="stylesheet">
+    </head>
+    <body>
+        <div id="full-app">
+            <div class="container-fluid">
+                <div class="row p-2">
+                    <div class="col col-full">
+                        <h1>Vitessce is loading...</h1>
+                        <div style="width:1000px">
+                            <div id="small-app">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <noscript>You need to enable JavaScript to run this app.</noscript>
+        <script>
+        !function(e){function t(t){for(var n,i,l=t[0],f=t[1],a=t[2],p=0,s=[];p<l.length;p++)i=l[p],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,a||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var f=r[l];0!==o[f]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="./";var l=this.webpackJsonpvitessce=this.webpackJsonpvitessce||[],f=l.push.bind(l);l.push=t,l=l.slice();for(var a=0;a<l.length;a++)t(l[a]);var c=f;r()}([])
+        </script>
+        <script src="./static/js/2.eb2fd6ea.chunk.js"></script>
+        <script src="./static/js/main.303f671d.chunk.js"></script>
+    </body>
+</html>
\ No newline at end of file
b
diff -r 000000000000 -r 9f60ef2d586e vitessce_spatial.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vitessce_spatial.py Thu Sep 08 17:23:33 2022 +0000
[
@@ -0,0 +1,121 @@
+import argparse
+import json
+import warnings
+from pathlib import Path
+
+import scanpy as sc
+from anndata import read_h5ad
+from vitessce import (
+    AnnDataWrapper,
+    Component as cm,
+    MultiImageWrapper,
+    OmeTiffWrapper,
+    VitessceConfig,
+)
+
+
+def main(inputs, output, image, anndata=None, masks=None):
+    """
+    Parameter
+    ---------
+    inputs : str
+        File path to galaxy tool parameter.
+    output : str
+        Output folder for saving web content.
+    image : str
+        File path to the OME Tiff image.
+    anndata : str
+        File path to anndata containing phenotyping info.
+    masks : str
+        File path to the image masks.
+    """
+    warnings.simplefilter('ignore')
+
+    with open(inputs, 'r') as param_handler:
+        params = json.load(param_handler)
+
+    vc = VitessceConfig(name=None, description=None)
+    dataset = vc.add_dataset()
+    image_wrappers = [OmeTiffWrapper(img_path=image, name='OMETIFF')]
+    if masks:
+        image_wrappers.append(
+            OmeTiffWrapper(img_path=masks, name='MASKS', is_bitmask=True)
+        )
+    dataset.add_object(MultiImageWrapper(image_wrappers))
+
+    status = vc.add_view(dataset, cm.STATUS)
+    spatial = vc.add_view(dataset, cm.SPATIAL)
+    lc = vc.add_view(dataset, cm.LAYER_CONTROLLER)
+
+    if not anndata:
+        vc.layout(status / lc | spatial)
+        config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output)
+        with open(Path(output).joinpath('config.json'), 'w') as f:
+            json.dump(config_dict, f, indent=4)
+        return
+
+    adata = read_h5ad(anndata)
+
+    params = params['do_phenotyping']
+    embedding = params['scatterplot_embeddings']['embedding']
+    embedding_options = params['scatterplot_embeddings']['options']
+    if embedding == 'umap':
+        sc.pp.neighbors(adata, **embedding_options)
+        sc.tl.umap(adata)
+        mappings_obsm = 'X_umap'
+        mappings_obsm_name = "UMAP"
+    elif embedding == 'tsne':
+        sc.tl.tsne(adata, **embedding_options)
+        mappings_obsm = 'X_tsne'
+        mappings_obsm_name = "tSNE"
+    else:         # pca
+        sc.tl.pca(adata, **embedding_options)
+        mappings_obsm = 'X_pca'
+        mappings_obsm_name = "PCA"
+
+    adata.obsm['XY_centroid'] = adata.obs[['X_centroid', 'Y_centroid']].values
+
+    cell_set_obs = params['phenotype_factory']['phenotypes']
+    if not isinstance(cell_set_obs, list):
+        cell_set_obs = [x.strip() for x in cell_set_obs.split(',')]
+    cell_set_obs_names = [obj[0].upper() + obj[1:] for obj in cell_set_obs]
+    dataset.add_object(
+        AnnDataWrapper(
+            adata,
+            mappings_obsm=[mappings_obsm],
+            mappings_obsm_names=[mappings_obsm_name],
+            spatial_centroid_obsm='XY_centroid',
+            cell_set_obs=cell_set_obs,
+            cell_set_obs_names=cell_set_obs_names,
+            expression_matrix="X"
+        )
+    )
+
+    cellsets = vc.add_view(dataset, cm.CELL_SETS)
+    scattorplot = vc.add_view(dataset, cm.SCATTERPLOT, mapping=mappings_obsm_name)
+    heatmap = vc.add_view(dataset, cm.HEATMAP)
+    genes = vc.add_view(dataset, cm.GENES)
+    cell_set_sizes = vc.add_view(dataset, cm.CELL_SET_SIZES)
+    cell_set_expression = vc.add_view(dataset, cm.CELL_SET_EXPRESSION)
+    vc.layout(
+        (status / genes / cell_set_expression)
+        | (cellsets / lc / scattorplot)
+        | (cell_set_sizes / heatmap / spatial)
+    )
+    config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output)
+
+    with open(Path(output).joinpath('config.json'), 'w') as f:
+        json.dump(config_dict, f, indent=4)
+
+
+if __name__ == '__main__':
+    aparser = argparse.ArgumentParser()
+    aparser.add_argument("-i", "--inputs", dest="inputs", required=True)
+    aparser.add_argument("-e", "--output", dest="output", required=True)
+    aparser.add_argument("-g", "--image", dest="image", required=True)
+    aparser.add_argument("-a", "--anndata", dest="anndata", required=False)
+    aparser.add_argument("-m", "--masks", dest="masks", required=False)
+
+    args = aparser.parse_args()
+
+    main(args.inputs, args.output, args.image, args.anndata, args.masks)
b
diff -r 000000000000 -r 9f60ef2d586e vitessce_spatial.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vitessce_spatial.xml Thu Sep 08 17:23:33 2022 +0000
[
b'@@ -0,0 +1,142 @@\n+<tool id="vitessce_spatial" name="Vitessce Visualization" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">\n+    <description>integrative visualization of multi-modal, spatial single-cell data</description>\n+\n+    <macros>\n+        <import>main_macros.xml</import>\n+    </macros>\n+\n+    <expand macro="vitessce_requirements"/>\n+    <expand macro="macro_stdio" />\n+    <version_command> "@VERSION@"</version_command>\n+    <expand macro="vitessce_cmd" />\n+\n+    <configfiles>\n+        <inputs name="inputs" />\n+    </configfiles>\n+\n+    <inputs>\n+        <param name="image" type="data" format="ome.tiff" label="Select the OME Tiff image" />\n+        <param name="masks" type="data" format="tiff,ome.tiff" optional="true" label="Select masks for the OME Tiff image (Optional)" />\n+        <conditional name="do_phenotyping">\n+            <param name="phenotyping_choice" type="boolean" checked="true" label="Whether to do phenotyping">\n+            </param>\n+            <when value="true">\n+                <param name="anndata" type="data" format="h5ad" label="Select the anndata contaning phenotyping info" />\n+                <conditional name="scatterplot_embeddings">\n+                    <param name="embedding" type="select" label="Select an embedding algorithm for scatterplot">\n+                        <option value="umap" selected="true">UMAP</option>\n+                        <option value="tsne">tSNE</option>\n+                        <option value="pca">PCA</option>\n+                    </param>\n+                    <when value="umap">\n+                        <section name="options" title="Advance Options for neighbor search">\n+                            <param argument="n_neighbors" type="integer" value="30" label="The size of local neighborhood used for manifold approximation" />\n+                            <param argument="n_pcs" type="integer" value="10" label="Number of PCs" />\n+                            <param argument="knn" type="boolean" checked="true" label="Whether to use knn graph" help="If false, use a Gaussian Kernel to assign low weights to neighbors more distant than the n_neighbors nearest neighbor." />\n+                            <param argument="random_state" type="integer" value="0" optional="true" label="Randomness seed" />\n+                        </section>\n+                    </when>\n+                    <when value="tsne">\n+                        <section name="options" title="Advance Options for computing tSNE">\n+                            <param argument="n_pcs" type="integer" value="10" label="Number of PCs" />\n+                            <param argument="learning_rate" type="float" value="1000" label="Learning rate" help="Should be 100-1000." />\n+                            <param argument="random_state" type="integer" value="0" optional="true" label="Randomness seed" />\n+                        </section>\n+                    </when>\n+                    <when value="pca">\n+                        <section name="options" title="Advance Options for computing PCA">\n+                            <param argument="n_comps" type="integer" value="" optional="true" label="Number of principal components to compute" help="Defaults to 50, or 1 - minimum dimension size of selected representation." />\n+                            <param argument="zero_center" type="boolean" checked="true" label="Whether to compute standard PCA from covariance matrix" help="If False, omit zero-centering variables (uses TruncatedSVD)" />\n+                            <param argument="svd_solver" type="select" label="Select the SVD solver">\n+                                <option value="arpack" selected="true">arpack</option>\n+                                <option value="randomized">randomized</option>\n+                                <option value="auto">auto</option>\n+                                <option value="lobpcg">lobpcg</option>\n+                            </param>\n+              '..b'"integer" value="0" optional="true" label="Randomness seed" />\n+                        </section>\n+                    </when>\n+                </conditional>\n+                <conditional name="phenotype_factory">\n+                    <param name="phenotype_mode" type="select" label="Input phenotyping keys">\n+                        <option value="choices" selected="true">Multiple choices</option>\n+                        <option value="type_in">Type in</option>\n+                    </param>\n+                    <when value="choices">\n+                        <param name="phenotypes" type="select" multiple="true" display="checkboxes" label="Select the key(s)" >\n+                            <option value="phenotype" selected="true">\'phenotype\' (via scimap phenotyping)</option>\n+                            <option value="kmeans">\'kmeans\' (via clustering)</option>\n+                            <option value="leiden">\'leiden\' (via clustering)</option>\n+                            <option value="phenograph">\'phenograph\' (via clustering)</option>\n+                            <option value="parc">\'parc\' (via clustering)</option>\n+                        </param>\n+                    </when>\n+                    <when value="type_in">\n+                        <param name="phenotypes" type="text" value="" label="Type in the keys storing phenotypes" help="Comma delimited for multiple keys."/>\n+                    </when>\n+                </conditional>\n+            </when>\n+            <when value="false">\n+            </when>\n+        </conditional>\n+    </inputs>\n+    <outputs>\n+        <data format="html" name="output" />\n+    </outputs>\n+    <tests>\n+        <test>\n+            <param name="image" value="cropped_reactive_core.ome.tiff" ftype="ome.tiff" />\n+            <conditional name="do_phenotyping">\n+                <param name="phenotyping_choice" value="yes" />\n+                <param name="anndata" value="cropped_tutorial_data_pheno.h5ad" ftype="h5ad" />\n+                <conditional name="phenotype_factory">\n+                    <param name="phenotype_mode" value="type_in" />\n+                    <param name="phenotypes" value="leiden" />\n+                </conditional>\n+            </conditional>\n+            <output name="output" file="tutorial_vitessce.html" compare="sim_size" delta="20" />\n+        </test>\n+        <test>\n+            <param name="image" value="cropped_reactive_core.ome.tiff" ftype="ome.tiff" />\n+            <conditional name="do_phenotyping">\n+                <param name="phenotyping_choice" value="yes" />\n+                <param name="anndata" value="cropped_tutorial_data_pheno.h5ad" ftype="h5ad" />\n+                <conditional name="scatterplot_embeddings">\n+                    <param name="embedding" value="pca" />\n+                </conditional>\n+                <conditional name="phenotype_factory">\n+                    <param name="phenotype_mode" value="type_in" />\n+                    <param name="phenotypes" value="leiden" />\n+                </conditional>\n+            </conditional>\n+            <output name="output" file="tutorial_vitessce.html" compare="sim_size" delta="20" />\n+        </test>\n+        <test>\n+            <param name="image" value="cropped_reactive_core.ome.tiff" ftype="ome.tiff" />\n+            <conditional name="do_phenotyping">\n+                <param name="phenotyping_choice" value="no" />\n+            </conditional>\n+            <output name="output" file="tutorial_vitessce.html" compare="sim_size" delta="20" />\n+        </test>\n+    </tests>\n+    <help>\n+        <![CDATA[\n+**What it does**\n+This tools provides web-based, interactive and scalable visualizations of single cell data.\n+\n+**Input**\n+\n+OME-TIFF image.\n+Segmentation masks (optional).\n+AnnData with marker intensities.\n+\n+**Output**\n+\n+An HTML file with Vitessce component. \n+\n+        ]]>\n+    </help>\n+    <citations>\n+        <citation type="doi">10.31219/osf.io/y8thv</citation>\n+    </citations>\n+</tool>\n'