From 722ed5d4cd8c8a9497a4a0b11028ac767d833a73 Mon Sep 17 00:00:00 2001 From: jkanche Date: Sat, 15 Jun 2024 06:24:22 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20BiocPy/c?= =?UTF-8?q?ellarr@0e145e7efdd9ed0357ecb81bf69a97ba4f6f9020=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .buildinfo | 2 +- _modules/cellarr/CellArrDataset.html | 437 +++ _modules/cellarr/build_cellarrdataset.html | 719 +++++ _modules/cellarr/utils_anndata.html | 476 ++++ _modules/cellarr/utils_tiledb_array.html | 479 ++++ ...{skeleton.html => utils_tiledb_frame.html} | 212 +- _modules/index.html | 17 +- _sources/api/cellarr.rst.txt | 46 +- _sources/index.md.txt | 18 +- _sources/tutorial.md.txt | 58 + _static/documentation_options.js | 2 +- ...69c37c29e427902b24a333a5f9fcb2f0b3ac41.css | 2342 +++++++++++++++++ api/cellarr.html | 509 +++- api/modules.html | 55 +- authors.html | 11 +- changelog.html | 11 +- contributing.html | 17 +- genindex.html | 156 +- index.html | 41 +- license.html | 11 +- objects.inv | Bin 400 -> 632 bytes py-modindex.html | 43 +- readme.html | 118 +- search.html | 11 +- searchindex.js | 2 +- tutorial.html | 396 +++ 26 files changed, 5844 insertions(+), 345 deletions(-) create mode 100644 _modules/cellarr/CellArrDataset.html create mode 100644 _modules/cellarr/build_cellarrdataset.html create mode 100644 _modules/cellarr/utils_anndata.html create mode 100644 _modules/cellarr/utils_tiledb_array.html rename _modules/cellarr/{skeleton.html => utils_tiledb_frame.html} (52%) create mode 100644 _sources/tutorial.md.txt create mode 100644 _static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css create mode 100644 tutorial.html diff --git a/.buildinfo b/.buildinfo index 4b302b5..c752f75 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c2816a1d94bae1060883498f48c5259b +config: c8acf869f0515f592e67571142b76a30 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_modules/cellarr/CellArrDataset.html b/_modules/cellarr/CellArrDataset.html new file mode 100644 index 0000000..baf2c96 --- /dev/null +++ b/_modules/cellarr/CellArrDataset.html @@ -0,0 +1,437 @@ + + + + + + + + cellarr.CellArrDataset - cellarr 0.0.2 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for cellarr.CellArrDataset

+import os
+from typing import Union
+
+import tiledb
+
+__author__ = "Jayaram Kancherla"
+__copyright__ = "Jayaram Kancherla"
+__license__ = "MIT"
+
+
+
+[docs] +class CellArrDataset: + """A class that represent a collection of cells in TileDB.""" + +
+[docs] + def __init__( + self, + dataset_path: str, + counts_tdb_uri: str = "counts", + gene_metadata_uri: str = "gene_metadata", + cell_metadata_uri: str = "cell_metadata", + ): + """Initialize a ``CellArr`` dataset. + + Args: + counts_tdb_uri: + Path to counts TileDB. + + gene_metadata_uri: + Path to gene metadata TileDB. + + cell_metadata_uri: + Path to cell metadata TileDB. + """ + + if not os.path.isdir(dataset_path): + raise ValueError("'dataset_path' is not a directory.") + + self._dataset_path = dataset_path + # TODO: Maybe switch to on-demand loading of these objects + self._counts_tdb_tdb = tiledb.open(f"{dataset_path}/{counts_tdb_uri}", "r") + self._gene_metadata_tdb = tiledb.open( + f"{dataset_path}/{gene_metadata_uri}", "r" + ) + self._cell_metadata_tdb = tiledb.open( + f"{dataset_path}/{cell_metadata_uri}", "r" + )
+ + +
+[docs] + def __del__(self): + self._counts_tdb_tdb.close() + self._gene_metadata_tdb.close() + self._cell_metadata_tdb.close()
+ + + # TODO: + # Methods to implement + # search by gene + # search by cell metadata + # slice counts after search + +
+[docs] + def get_cell_metadata_columns(self): + columns = [] + for i in range(self._cell_metadata_tdb.schema.nattr): + columns.append(self._cell_metadata_tdb.schema.attr(i).name) + + return columns
+ + +
+[docs] + def get_cell_metadata_column(self, column_name: str): + return self._cell_metadata_tdb.query(attrs=[column_name]).df[:]
+ + +
+[docs] + def get_cell_subset( + self, subset: Union[slice, tiledb.QueryCondition], columns=None + ): + if columns is None: + columns = self.get_cell_metadata_columns() + + query = self._cell_metadata_tdb.query(cond=subset, attrs=columns) + data = query.df[:] + result = data.dropna() + return result
+ + +
+[docs] + def get_gene_metadata_columns(self): + columns = [] + for i in range(self._gene_metadata_tdb.schema.nattr): + columns.append(self._gene_metadata_tdb.schema.attr(i).name) + + return columns
+ + +
+[docs] + def get_gene_metadata_column(self, column_name: str): + return self._gene_metadata_tdb.query(attrs=[column_name]).df[:]
+ + +
+[docs] + def get_gene_subset( + self, subset: Union[slice, tiledb.QueryCondition], columns=None + ): + if columns is None: + columns = self.get_gene_metadata_columns() + + query = self._gene_metadata_tdb.query(cond=subset, attrs=columns) + data = query.df[:] + result = data.dropna() + return result
+ + +
+[docs] + def get_slice( + self, + cell_subset: Union[slice, tiledb.QueryCondition], + gene_subset: Union[slice, tiledb.QueryCondition], + ): + _csubset = self.get_cell_subset(cell_subset) + _cell_indices = _csubset.index.tolist() + + _gsubset = self.get_gene_subset(gene_subset) + _gene_indices = _gsubset.index.tolist() + + return self._counts_tdb_tdb.multi_index[_cell_indices, _gene_indices]
+
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/_modules/cellarr/build_cellarrdataset.html b/_modules/cellarr/build_cellarrdataset.html new file mode 100644 index 0000000..b916b9e --- /dev/null +++ b/_modules/cellarr/build_cellarrdataset.html @@ -0,0 +1,719 @@ + + + + + + + + cellarr.build_cellarrdataset - cellarr 0.0.2 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for cellarr.build_cellarrdataset

+"""Build the `CellArrDatset`
+
+The `CellArrDataset` method is designed to store single-cell RNA-seq
+datasets but can be generalized to store any 2-dimensional experimental data.
+
+This method creates three TileDB files in the directory specified by `output_path`:
+- `gene_metadata`: A TileDB file containing gene metadata.
+- `cell_metadata`: A TileDB file containing cell metadata.
+- A matrix TileDB file named as specified by the `layer_matrix_name` parameter.
+
+The TileDB matrix file is stored in a cell X gene orientation. This orientation
+is chosen because the fastest-changing dimension as new files are added to the
+collection is usually the cells rather than genes.
+
+## Process
+
+1. **Scan the Collection**: Scan the entire collection of files to create
+a unique set of gene symbols. Store this gene set as the
+`gene_metadata` TileDB file.
+2. **Store Cell Metadata**: Store cell metadata as the
+`cell_metadata` TileDB file.
+3. **Remap and Orient Data**: For each dataset in the collection,
+remap and orient the gene dimension using the gene set from Step 1.
+This step ensures consistency in gene measurement and order, even if
+some genes are unmeasured or ordered differently in the original experiments.
+
+
+Example:
+
+    .. code-block:: python
+
+        import anndata
+        import numpy as np
+        import tempfile
+        from cellarr import build_cellarrdataset, CellArrDataset
+
+        # Create a temporary directory
+        tempdir = tempfile.mkdtemp()
+
+        # Read AnnData objects
+        adata1 = anndata.read_h5ad("path/to/object1.h5ad")
+        # or just provide the path
+        adata2 = "path/to/object2.h5ad"
+
+        # Build CellArrDataset
+        dataset = build_cellarrdataset(
+            output_path=tempdir,
+            h5ad_or_adata=[adata1, adata2],
+            matrix_dim_dtype=np.float32
+        )
+"""
+
+import os
+import warnings
+from typing import List, Union
+
+import anndata
+import numpy as np
+import pandas as pd
+
+from . import utils_anndata as uad
+from . import utils_tiledb_array as uta
+from . import utils_tiledb_frame as utf
+from .CellArrDataset import CellArrDataset
+
+__author__ = "Jayaram Kancherla"
+__copyright__ = "Jayaram Kancherla"
+__license__ = "MIT"
+
+
+
+[docs] +def build_cellarrdataset( + files: List[Union[str, anndata.AnnData]], + output_path: str, + num_cells: int = None, + num_genes: int = None, + cell_metadata: Union[pd.DataFrame, str] = None, + gene_metadata: Union[List[str], dict, str, pd.DataFrame] = None, + var_gene_column: str = "index", + layer_matrix_name: str = "counts", + skip_gene_tiledb: bool = False, + skip_cell_tiledb: bool = False, + skip_matrix_tiledb: bool = False, + cell_dim_dtype: np.dtype = np.uint32, + gene_dim_dtype: np.dtype = np.uint32, + matrix_dim_dtype: np.dtype = np.uint32, + optimize_tiledb: bool = True, + num_threads: int = 1, +): + """Generate the `CellArrDataset`. + + All files are expected to be consistent and any modifications + to make them consistent is outside the scope of this function + and package. + + There's a few assumptions this process makes: + - If object in ``files`` is an AnnData or H5AD object, these must + contain an assay matrix in layer names as ``layer_matrix_name`` + parameter. + - Feature information must contain a column defined by + ``var_gene_column`` that contains gene symbols or a common entity + across all files. + - + + Args: + files: + List of file paths to `H5AD` or ``AnnData`` objects. + Each object in this list must contain + - gene symbols as index or the column specified by + ``var_gene_column``. + - Must contain a layers with a matrix named as + ``layer_matrix_name``. + + output_path: + Path to where the output tiledb files should be stored. + + num_cells: + Number of cells across all files. + + Defualts to None, in which case, automatically inferred by + scanning all objects in ``h5ad_or_adata``. + + num_genes: + Number of genes across all cells. + + Defualts to None, in which case, automatically inferred by + scanning all objects in ``h5ad_or_adata``. + + cell_metadata: + Path to the file containing a concatenated cell metadata across + all cells. In this case, the first row is expected to contain the + column names. + + Alternatively, may also provide a dataframe containing the cell + metadata across all objects. + + Regardless of the input type, the number of rows in the file or + DataFrame must match the ``num_cells`` argument. + + Defaults to None, then a simple range index is created using the + ``num_cells`` argument. + + gene_metadata: + Path to the file containing a concatenated gene annotations across + all datasets. In this case, the first row is + expected to contain the column names and an index column + containing the gene symbols to remap the matrix. + + Alternatively, may also provide a dataframe containing the gene + annotations across all objects. + + Alternatively, a list or a dictionary of gene symbols. + + Regardless of the input type, the number of rows in the file or + DataFrame must match the ``num_genes`` argument. + + Defaults to None, then a gene set is generated by scanning all + objects in ``h5ad_or_adata``. + + var_gene_column: + Column name from ``var`` slot that contains the gene symbols. + Must be consistent across all objects in ``h5ad_or_adata``. + + Defaults to "index". + + layer_matrix_name: + Matrix name from ``layers`` slot to add to tiledb. + Must be consistent across all objects in ``h5ad_or_adata``. + + Defaults to "counts". + + skip_gene_tiledb: + Whether to skip generating gene metadata tiledb. + + Defaults to False. + + skip_cell_tiledb: + Whether to skip generating cell metadata tiledb. + + Defaults to False. + + skip_matrix_tiledb: + Whether to skip generating matrix tiledb. + + Defaults to False. + + cell_dim_dtype: + NumPy dtype for the cell dimension. + Defaults to np.uint32. + + Note: make sure the number of cells fit + within the range limits of unsigned-int32. + + gene_dim_dtype: + NumPy dtype for the gene dimension. + Defaults to np.uint32. + + Note: make sure the number of genes fit + within the range limits of unsigned-int32. + + matrix_dim_dtype: + NumPy dtype for the values in the matrix. + Defaults to np.uint32. + + Note: make sure the matrix values fit + within the range limits of unsigned-int32. + + num_threads: + Number of threads. + + Defaults to 1. + """ + if not os.path.isdir(output_path): + raise ValueError("'output_path' must be a directory.") + + if gene_metadata is None: + warnings.warn( + "Scanning all files for gene symbols, this may take long", UserWarning + ) + gene_set = uad.scan_for_genes( + files, var_gene_column=var_gene_column, num_threads=num_threads + ) + + gene_set = sorted(gene_set) + + gene_metadata = pd.DataFrame({"genes": gene_set}, index=gene_set) + elif isinstance(gene_metadata, list): + _gene_list = sorted(list(set(gene_metadata))) + gene_metadata = pd.DataFrame({"genes": _gene_list}, index=_gene_list) + elif isinstance(gene_metadata, dict): + _gene_list = sorted(list(gene_metadata.keys())) + gene_metadata = pd.DataFrame({"genes": _gene_list}, index=_gene_list) + elif isinstance(gene_metadata, str): + gene_metadata = pd.read_csv(gene_metadata, index=True, header=True) + + gene_metadata["genes_index"] = gene_metadata.index.tolist() + + if not isinstance(gene_metadata, pd.DataFrame): + raise TypeError("'gene_metadata' must be a pandas dataframe.") + + if len(gene_metadata.index.unique()) != len(gene_metadata.index.tolist()): + raise ValueError("'gene_metadata' must contain a unique index.") + + if num_genes is None: + num_genes = len(gene_metadata) + + # Create the gene metadata tiledb + if not skip_gene_tiledb: + _col_types = {} + for col in gene_metadata.columns: + _col_types[col] = "ascii" + + _gene_output_uri = f"{output_path}/gene_metadata" + generate_metadata_tiledb_frame( + _gene_output_uri, gene_metadata, column_types=_col_types + ) + + if optimize_tiledb: + uta.optimize_tiledb_array(_gene_output_uri) + + if cell_metadata is None: + if num_cells is None: + warnings.warn( + "Scanning all files to compute cell counts, this may take long", + UserWarning, + ) + cell_counts = uad.scan_for_cellcounts(files, num_threads=num_threads) + num_cells = sum(cell_counts) + + cell_metadata = pd.DataFrame({"cell_index": [x for x in range(num_cells)]}) + + if isinstance(cell_metadata, str): + warnings.warn( + "Scanning 'cell_metadata' to count number of cells, this may take long", + UserWarning, + ) + with open(cell_metadata) as fp: + count = 0 + for _ in fp: + count += 1 + + num_cells = count - 1 # removing 1 for the header line + elif isinstance(cell_metadata, pd.DataFrame): + num_cells = len(cell_metadata) + + if num_cells is None: + raise ValueError( + "Cannot determine 'num_cells', we recommend setting this parameter." + ) + + # Create the cell metadata tiledb + if not skip_cell_tiledb: + _cell_output_uri = f"{output_path}/cell_metadata" + + if isinstance(cell_metadata, str): + _cell_metaframe = pd.read_csv(cell_metadata, chunksize=5, header=True) + generate_metadata_tiledb_csv( + _cell_output_uri, cell_metadata, _cell_metaframe.columns + ) + elif isinstance(cell_metadata, pd.DataFrame): + _col_types = {} + for col in gene_metadata.columns: + _col_types[col] = "ascii" + + _to_write = gene_metadata.astype(str) + + generate_metadata_tiledb_frame( + _cell_output_uri, _to_write, column_types=_col_types + ) + + if optimize_tiledb: + uta.optimize_tiledb_array(_cell_output_uri) + + # create the counts metadata + if not skip_matrix_tiledb: + gene_idx = gene_metadata.index.tolist() + gene_set = {} + for i, x in enumerate(gene_idx): + gene_set[x] = i + + _counts_uri = f"{output_path}/{layer_matrix_name}" + uta.create_tiledb_array( + _counts_uri, + num_cells=num_cells, + num_genes=num_genes, + matrix_attr_name=layer_matrix_name, + x_dim_dtype=cell_dim_dtype, + y_dim_dtype=gene_dim_dtype, + matrix_dim_dtype=matrix_dim_dtype, + ) + + offset = 0 + for fd in files: + mat = uad.remap_anndata( + fd, + gene_set, + var_gene_column=var_gene_column, + layer_matrix_name=layer_matrix_name, + ) + uta.write_csr_matrix_to_tiledb( + _counts_uri, matrix=mat, row_offset=offset, value_dtype=matrix_dim_dtype + ) + offset += int(mat.shape[0]) + + if optimize_tiledb: + uta.optimize_tiledb_array(_counts_uri) + + return CellArrDataset(dataset_path=output_path, counts_tdb_uri=layer_matrix_name)
+ + + +
+[docs] +def generate_metadata_tiledb_frame( + output_uri: str, input: pd.DataFrame, column_types: dict = None +): + """Generate metadata tiledb from a :pu:class:`~pandas.DataFrame`. + + Args: + output_uri: + TileDB URI or path to save the file. + + input: + Input dataframe. + + column_types: + You can specify type of each column name to cast into. + "ascii" or str works best for most scenarios. + + Defaults to None. + """ + _to_write = input.astype(str) + utf.create_tiledb_frame_from_dataframe( + output_uri, _to_write, column_types=column_types + )
+ + + +
+[docs] +def generate_metadata_tiledb_csv( + output_uri: str, + input: str, + column_dtype=str, + chunksize=1000, +): + """Generate a metadata tiledb from csv. + + The difference between this and ``generate_metadata_tiledb_frame`` + is when the csv is super large and it won't fit into memory. + + Args: + output_uri: + TileDB URI or path to save the file. + + input: + Path to the csv file. The first row is expected to + contain the column names. + + column_dtype: + Dtype of the columns. + Defaults to str. + + chunksize: + Chunk size to read the dataframe. + Defaults to 1000. + """ + chunksize = 1000 + initfile = True + offset = 0 + + for chunk in pd.read_csv(input, chunksize=chunksize, header=True): + if initfile: + utf.create_tiledb_frame_from_column_names( + output_uri, chunk.columns, column_dtype + ) + initfile = False + + _to_write = chunk.astype(str) + utf.append_to_tiledb_frame(output_uri, _to_write, offset) + offset += len(chunk)
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/_modules/cellarr/utils_anndata.html b/_modules/cellarr/utils_anndata.html new file mode 100644 index 0000000..e60e385 --- /dev/null +++ b/_modules/cellarr/utils_anndata.html @@ -0,0 +1,476 @@ + + + + + + + + cellarr.utils_anndata - cellarr 0.0.2 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for cellarr.utils_anndata

+import itertools
+from multiprocessing import Pool
+from typing import List, Union
+
+import anndata
+import numpy as np
+from scipy.sparse import coo_matrix, csr_array, csr_matrix
+
+__author__ = "Jayaram Kancherla, Tony Kuo"
+__copyright__ = "Jayaram Kancherla"
+__license__ = "MIT"
+
+
+
+[docs] +def remap_anndata( + h5ad_or_adata: Union[str, anndata.AnnData], + gene_set_order: dict, + var_gene_column: str = "index", + layer_matrix_name: str = "counts", +) -> csr_matrix: + """Extract and remap the count matrix to the provided gene set order from the :py:class:`~anndata.AnnData` object. + + Args: + adata: + Input ``AnnData`` object. + + Alternatively, may also provide a path to the H5ad file. + + The index of the `var` slot must contain the gene symbols + for the columns in the matrix. + + gene_set_order: + A dictionary with the symbols as keys and their index as value. + The gene symbols from the ``AnnData`` object are remapped to the + gene order from this dictionary. + + var_gene_column: + Column in ``var`` containing the symbols. + Defaults to the index of the ``var`` slot. + + layer_matrix_name: + Layer containing the matrix to add to tiledb. + Defaults to "counts". + + Returns: + A ``csr_matrix`` representation of the assay matrix. + """ + + if isinstance(h5ad_or_adata, str): + adata = anndata.read_h5ad(h5ad_or_adata) + else: + if not isinstance(h5ad_or_adata, anndata.AnnData): + raise TypeError("Input is not an 'AnnData' object.") + + adata = h5ad_or_adata + + mat = adata.layers[layer_matrix_name] + + if var_gene_column == "index": + symbols = adata.var.index.tolist() + else: + symbols = adata.var[var_gene_column].tolist() + + indices_to_keep = [i for i, x in enumerate(symbols) if x in gene_set_order] + symbols_to_keep = [symbols[i] for i in indices_to_keep] + + mat = mat[:, indices_to_keep].copy() + + indices_to_map = [] + for x in symbols_to_keep: + indices_to_map.append(gene_set_order[x]) + + if isinstance(mat, np.ndarray): + mat_coo = coo_matrix(mat) + elif isinstance(mat, (csr_array, csr_matrix)): + mat_coo = mat.tocoo() + else: + raise TypeError(f"Unknown matrix type: {type(mat)}.") + + new_col = np.array([indices_to_map[i] for i in mat_coo.col]) + + return coo_matrix( + (mat_coo.data, (mat_coo.row, new_col)), + shape=(adata.shape[0], len(gene_set_order)), + ).tocsr()
+ + + +def _get_genes_index( + h5ad_or_adata: Union[str, anndata.AnnData], + var_gene_column: str = "index", +) -> List[str]: + if isinstance(h5ad_or_adata, str): + adata = anndata.read_h5ad(h5ad_or_adata, backed=True) + else: + if not isinstance(h5ad_or_adata, anndata.AnnData): + raise TypeError("Input is not an 'AnnData' object.") + + adata = h5ad_or_adata + + if var_gene_column == "index": + symbols = adata.var.index.tolist() + else: + symbols = adata.var[var_gene_column].tolist() + + return symbols + + +def _wrapper_get_genes(args): + file, gcol = args + return _get_genes_index(file, gcol) + + +
+[docs] +def scan_for_genes( + h5ad_or_adata: List[Union[str, anndata.AnnData]], + var_gene_column: str = "index", + num_threads: int = 1, +) -> List[str]: + """Extract and generate the list of unique genes identifiers across files. + + Args: + h5ad_or_adata: + List of anndata objects or path to h5ad files. + + var_gene_column: + Column containing the gene symbols. + Defaults to "index". + + num_threads: + Number of threads to use. + Defaults to 1. + + Returns: + List of all unique gene symbols across all files. + """ + with Pool(num_threads) as p: + _args = [(file_info, var_gene_column) for file_info in h5ad_or_adata] + all_symbols = p.map(_wrapper_get_genes, _args) + return list(set(itertools.chain.from_iterable(all_symbols)))
+ + + +def _get_cellcounts(h5ad_or_adata: Union[str, anndata.AnnData]) -> int: + if isinstance(h5ad_or_adata, str): + adata = anndata.read_h5ad(h5ad_or_adata, backed=True) + else: + if not isinstance(h5ad_or_adata, anndata.AnnData): + raise TypeError("Input is not an 'AnnData' object.") + + adata = h5ad_or_adata + + return adata.shape[0] + + +
+[docs] +def scan_for_cellcounts( + h5ad_or_adata: List[Union[str, anndata.AnnData]], + num_threads: int = 1, +) -> List[int]: + """Extract cell counts across files. + + Args: + h5ad_or_adata: + List of anndata objects or path to h5ad files. + + num_threads: + Number of threads to use. + Defaults to 1. + + Returns: + List of cell counts across files. + """ + with Pool(num_threads) as p: + all_counts = p.map(_get_cellcounts, h5ad_or_adata) + return all_counts
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/_modules/cellarr/utils_tiledb_array.html b/_modules/cellarr/utils_tiledb_array.html new file mode 100644 index 0000000..67cc07a --- /dev/null +++ b/_modules/cellarr/utils_tiledb_array.html @@ -0,0 +1,479 @@ + + + + + + + + cellarr.utils_tiledb_array - cellarr 0.0.2 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for cellarr.utils_tiledb_array

+import os
+import shutil
+from typing import Union
+
+import numpy as np
+import tiledb
+from scipy.sparse import csr_array, csr_matrix
+
+__author__ = "Jayaram Kancherla"
+__copyright__ = "Jayaram Kancherla"
+__license__ = "MIT"
+
+
+
+[docs] +def create_tiledb_array( + tiledb_uri_path: str, + num_cells: int, + num_genes: int, + x_dim_name: str = "cell_index", + y_dim_name: str = "gene_index", + matrix_attr_name: str = "counts", + x_dim_dtype: np.dtype = np.uint32, + y_dim_dtype: np.dtype = np.uint32, + matrix_dim_dtype: np.dtype = np.uint32, + is_sparse: bool = True, +): + """Create a tiledb file with the provided attributes to persistent storage. + + This will materialize the array directory and all + related schema files. + + Args: + tiledb_uri_path: + Path to create the array tiledb file. + + num_cells: + Number of cells (x/fastest-changing dimension). + + num_genes: + Number fo genes (y dimension). + + x_dim_name: + Name for the x-dimension. + Defaults to "cell_index". + + y_dim_name: + Name for the y-dimension. + Defaults to "gene_index". + + matrix_attr_name: + Name for the attribute in the array. + Defaults to "counts". + + x_dim_dtype: + NumPy dtype for the x-dimension. + Defaults to np.uint32. + + y_dim_dtype: + NumPy dtype for the y-dimension. + Defaults to np.uint32. + + matrix_dim_dtype: + NumPy dtype for the values in the matrix. + Defaults to np.uint32. + + is_sparse: + Whether the matrix is sparse. + Defaults to True. + """ + + xdim = tiledb.Dim(name=x_dim_name, domain=(0, num_cells - 1), dtype=x_dim_dtype) + ydim = tiledb.Dim(name=y_dim_name, domain=(0, num_genes - 1), dtype=y_dim_dtype) + + dom = tiledb.Domain(xdim, ydim) + + # expecting counts + tdb_attr = tiledb.Attr( + name=matrix_attr_name, + dtype=matrix_dim_dtype, + filters=tiledb.FilterList([tiledb.GzipFilter()]), + ) + + schema = tiledb.ArraySchema(domain=dom, sparse=is_sparse, attrs=[tdb_attr]) + + if os.path.exists(tiledb_uri_path): + shutil.rmtree(tiledb_uri_path) + + tiledb.Array.create(tiledb_uri_path, schema) + + tdbfile = tiledb.open(tiledb_uri_path, "w") + tdbfile.close()
+ + + +
+[docs] +def write_csr_matrix_to_tiledb( + tiledb_array_uri: Union[str, tiledb.SparseArray], + matrix: csr_matrix, + value_dtype: np.dtype = np.uint32, + row_offset: int = 0, + batch_size: int = 25000, +): + """Append and save a :py:class:`~scipy.sparse.csr_matrix` to tiledb. + + Args: + tiledb_array_uri: + Tiledb array object or path to a tiledb object. + + matrix: + Input matrix to write to tiledb, must be a + :py:class:`~scipy.sparse.csr_matrix` matrix. + + value_dtype: + NumPy dtype to reformat the matrix values. + Defaults to ``uint32``. + + row_offset: + Offset row number to append to matrix. + Defaults to 0. + + batch_size: + Batch size. + Defaults to 25000. + """ + tiledb_fp = tiledb_array_uri + if isinstance(tiledb_array_uri, str): + tiledb_fp = tiledb.open(tiledb_array_uri, "w") + + if not isinstance(matrix, (csr_array, csr_matrix)): + raise TypeError("sparse matrix must be in csr format.") + + indptrs = matrix.indptr + indices = matrix.indices + data = matrix.data.astype(value_dtype) + + x = [] + y = [] + vals = [] + for i, indptr in enumerate(indptrs): + if i != 0 and (i % batch_size == 0 or i == len(indptrs) - 1): + tiledb_fp[x, y] = vals + x = [] + y = [] + vals = [] + + stop = None + if i != len(indptrs) - 1: + stop = indptrs[i + 1] + + val_slice = data[slice(indptr, stop)] + ind_slice = indices[slice(indptr, stop)] + + x.extend([row_offset + i] * len(ind_slice)) + y.extend(ind_slice) + vals.extend(val_slice) + + tiledb_fp[x, y] = vals
+ + + +
+[docs] +def optimize_tiledb_array(tiledb_array_uri: str, verbose: bool = True): + """Consolidate tiledb fragments.""" + if verbose: + print(f"Optimizing {tiledb_array_uri}") + + frags = tiledb.array_fragments(tiledb_array_uri) + if verbose: + print("Fragments before consolidation: {}".format(len(frags))) + + cfg = tiledb.Config() + cfg["sm.consolidation.step_min_frags"] = 1 + cfg["sm.consolidation.step_max_frags"] = 200 + tiledb.consolidate(tiledb_array_uri, config=cfg) + tiledb.vacuum(tiledb_array_uri) + + frags = tiledb.array_fragments(tiledb_array_uri) + if verbose: + print("Fragments after consolidation: {}".format(len(frags)))
+ +
+
+
+
+ + +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/_modules/cellarr/skeleton.html b/_modules/cellarr/utils_tiledb_frame.html similarity index 52% rename from _modules/cellarr/skeleton.html rename to _modules/cellarr/utils_tiledb_frame.html index ae48649..0c94b48 100644 --- a/_modules/cellarr/skeleton.html +++ b/_modules/cellarr/utils_tiledb_frame.html @@ -5,9 +5,10 @@ - cellarr.skeleton - cellarr 0.0.1 documentation + cellarr.utils_tiledb_frame - cellarr 0.0.2 documentation + @@ -178,7 +179,7 @@
-
cellarr 0.0.1 documentation
+
cellarr 0.0.2 documentation
@@ -202,7 +203,7 @@ +
diff --git a/_modules/index.html b/_modules/index.html index abfed26..be225ea 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -5,9 +5,10 @@ - Overview: module code - cellarr 0.0.1 documentation + Overview: module code - cellarr 0.0.2 documentation + @@ -178,7 +179,7 @@
-
cellarr 0.0.1 documentation
+
cellarr 0.0.2 documentation
@@ -202,7 +203,7 @@ -
+
diff --git a/_sources/api/cellarr.rst.txt b/_sources/api/cellarr.rst.txt index 548d860..6cc3e43 100644 --- a/_sources/api/cellarr.rst.txt +++ b/_sources/api/cellarr.rst.txt @@ -4,10 +4,50 @@ cellarr package Submodules ---------- -cellarr.skeleton module ------------------------ +cellarr.CellArrDataset module +----------------------------- -.. automodule:: cellarr.skeleton +.. automodule:: cellarr.CellArrDataset + :members: + :undoc-members: + :show-inheritance: + +cellarr.build\_cellarrdataset module +------------------------------------ + +.. automodule:: cellarr.build_cellarrdataset + :members: + :undoc-members: + :show-inheritance: + +cellarr.dataloader module +------------------------- + +.. automodule:: cellarr.dataloader + :members: + :undoc-members: + :show-inheritance: + +cellarr.utils\_anndata module +----------------------------- + +.. automodule:: cellarr.utils_anndata + :members: + :undoc-members: + :show-inheritance: + +cellarr.utils\_tiledb\_array module +----------------------------------- + +.. automodule:: cellarr.utils_tiledb_array + :members: + :undoc-members: + :show-inheritance: + +cellarr.utils\_tiledb\_frame module +----------------------------------- + +.. automodule:: cellarr.utils_tiledb_frame :members: :undoc-members: :show-inheritance: diff --git a/_sources/index.md.txt b/_sources/index.md.txt index 458985e..7283ccf 100644 --- a/_sources/index.md.txt +++ b/_sources/index.md.txt @@ -1,25 +1,21 @@ # cellarr -Add a short description here! +Cell Arrays is a Python package that provides a TileDB-backed store for large collections of genomic experimental data, such as millions of cells across multiple single-cell experiment objects. +## Install -## Note - -> This is the main page of your project's [Sphinx] documentation. It is -> formatted in [Markdown]. Add additional pages by creating md-files in -> `docs` or rst-files (formatted in [reStructuredText]) and adding links to -> them in the `Contents` section below. -> -> Please check [Sphinx] and [MyST] for more information -> about how to document your project and how to configure your preferences. +To get started, install the package from [PyPI](https://pypi.org/project/cellarr/) +```bash +pip install cellarr +``` ## Contents ```{toctree} :maxdepth: 2 -Overview +Overview Contributions & Help License Authors diff --git a/_sources/tutorial.md.txt b/_sources/tutorial.md.txt new file mode 100644 index 0000000..4778202 --- /dev/null +++ b/_sources/tutorial.md.txt @@ -0,0 +1,58 @@ +--- +file_format: mystnb +kernelspec: + name: python +--- + +# Cell Arrays + +Cell Arrays is a Python package that provides a TileDB-backed store for large collections of genomic experimental data, such as millions of cells across multiple single-cell experiment objects. + +## Usage + +### Create the `CellArrDataset` + +Creating a CellArrDataset generates three TileDB files in the specified output directory: + +- `gene_metadata`: Contains feature annotations. +- `cell_metadata`: Contains cell or sample metadata. +- `matrix`: A TileDB-backed sparse array containing expression vectors. + +***Note: Currently only supports either paths to H5AD or `AnnData` objects*** + +To build a `CellArrDataset` from a collection of `H5AD` or `AnnData` objects: + +```python +import anndata +import numpy as np +import tempfile +from cellarr import build_cellarrdataset, CellArrDataset + +# Create a temporary directory +tempdir = tempfile.mkdtemp() + +# Read AnnData objects +adata1 = anndata.read_h5ad("path/to/object1.h5ad") +# or just provide the path +adata2 = "path/to/object2.h5ad" + +# Build CellArrDataset +dataset = build_cellarrdataset( + output_path=tempdir, + h5ad_or_adata=[adata1, adata2], + matrix_dim_dtype=np.float32 +) +``` +---- + +#### TODO: This following section does not work yet. + +Users have the option to reuse the `dataset` object retuned when building the dataset or by creating a `CellArrDataset` object by initializng it to the path where the files were created. + +```python +# Create a CellArrDataset object from the existing dataset +dataset = CellArrDataset(dataset_path=tempdir) + +# Query data from the dataset +expression_data = dataset[10, ["gene1", "gene10", "gene500"]] +``` diff --git a/_static/documentation_options.js b/_static/documentation_options.js index d1f2291..b15f8b4 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '0.0.1', + VERSION: '0.0.2', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css new file mode 100644 index 0000000..3356631 --- /dev/null +++ b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css @@ -0,0 +1,2342 @@ +/* Variables */ +:root { + --mystnb-source-bg-color: #f7f7f7; + --mystnb-stdout-bg-color: #fcfcfc; + --mystnb-stderr-bg-color: #fdd; + --mystnb-traceback-bg-color: #fcfcfc; + --mystnb-source-border-color: #ccc; + --mystnb-source-margin-color: green; + --mystnb-stdout-border-color: #f7f7f7; + --mystnb-stderr-border-color: #f7f7f7; + --mystnb-traceback-border-color: #ffd6d6; + --mystnb-hide-prompt-opacity: 70%; + --mystnb-source-border-radius: .4em; + --mystnb-source-border-width: 1px; +} + +/* Whole cell */ +div.container.cell { + padding-left: 0; + margin-bottom: 1em; +} + +/* Removing all background formatting so we can control at the div level */ +.cell_input div.highlight, +.cell_output pre, +.cell_input pre, +.cell_output .output { + border: none; + box-shadow: none; +} + +.cell_output .output pre, +.cell_input pre { + margin: 0px; +} + +/* Input cells */ +div.cell div.cell_input, +div.cell details.above-input>summary { + padding-left: 0em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + background-color: var(--mystnb-source-bg-color); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; + border-radius: var(--mystnb-source-border-radius); +} + +div.cell_input>div, +div.cell_output div.output>div.highlight { + margin: 0em !important; + border: none !important; +} + +/* All cell outputs */ +.cell_output { + padding-left: 1em; + padding-right: 0em; + margin-top: 1em; +} + +/* Text outputs from cells */ +.cell_output .output.text_plain, +.cell_output .output.traceback, +.cell_output .output.stream, +.cell_output .output.stderr { + margin-top: 1em; + margin-bottom: 0em; + box-shadow: none; +} + +.cell_output .output.text_plain, +.cell_output .output.stream { + background: var(--mystnb-stdout-bg-color); + border: 1px solid var(--mystnb-stdout-border-color); +} + +.cell_output .output.stderr { + background: var(--mystnb-stderr-bg-color); + border: 1px solid var(--mystnb-stderr-border-color); +} + +.cell_output .output.traceback { + background: var(--mystnb-traceback-bg-color); + border: 1px solid var(--mystnb-traceback-border-color); +} + +/* Collapsible cell content */ +div.cell details.above-input div.cell_input { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; +} + +div.cell div.cell_input.above-output-prompt { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.cell details.above-input>summary { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; + padding-left: 1em; + margin-bottom: 0; +} + +div.cell details.above-output>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.below-input>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-top: none; + border-bottom-left-radius: var(--mystnb-source-border-radius); + border-bottom-right-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.hide>summary>span { + opacity: var(--mystnb-hide-prompt-opacity); +} + +div.cell details.hide[open]>summary>span.collapsed { + display: none; +} + +div.cell details.hide:not([open])>summary>span.expanded { + display: none; +} + +@keyframes collapsed-fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} +div.cell details.hide[open]>summary~* { + -moz-animation: collapsed-fade-in 0.3s ease-in-out; + -webkit-animation: collapsed-fade-in 0.3s ease-in-out; + animation: collapsed-fade-in 0.3s ease-in-out; +} + +/* Math align to the left */ +.cell_output .MathJax_Display { + text-align: left !important; +} + +/* Pandas tables. Pulled from the Jupyter / nbsphinx CSS */ +div.cell_output table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 1em; + table-layout: fixed; +} + +div.cell_output thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} + +div.cell_output tr, +div.cell_output th, +div.cell_output td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +div.cell_output th { + font-weight: bold; +} + +div.cell_output tbody tr:nth-child(odd) { + background: #f5f5f5; +} + +div.cell_output tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/** source code line numbers **/ +span.linenos { + opacity: 0.5; +} + +/* Inline text from `paste` operation */ + +span.pasted-text { + font-weight: bold; +} + +span.pasted-inline img { + max-height: 2em; +} + +tbody span.pasted-inline img { + max-height: none; +} + +/* Font colors for translated ANSI escape sequences +Color values are copied from Jupyter Notebook +https://github.com/jupyter/notebook/blob/52581f8eda9b319eb0390ac77fe5903c38f81e3e/notebook/static/notebook/less/ansicolors.less#L14-L21 +Background colors from +https://nbsphinx.readthedocs.io/en/latest/code-cells.html#ANSI-Colors +*/ +div.highlight .-Color-Bold { + font-weight: bold; +} + +div.highlight .-Color[class*=-Black] { + color: #3E424D +} + +div.highlight .-Color[class*=-Red] { + color: #E75C58 +} + +div.highlight .-Color[class*=-Green] { + color: #00A250 +} + +div.highlight .-Color[class*=-Yellow] { + color: #DDB62B +} + +div.highlight .-Color[class*=-Blue] { + color: #208FFB +} + +div.highlight .-Color[class*=-Magenta] { + color: #D160C4 +} + +div.highlight .-Color[class*=-Cyan] { + color: #60C6C8 +} + +div.highlight .-Color[class*=-White] { + color: #C5C1B4 +} + +div.highlight .-Color[class*=-BGBlack] { + background-color: #3E424D +} + +div.highlight .-Color[class*=-BGRed] { + background-color: #E75C58 +} + +div.highlight .-Color[class*=-BGGreen] { + background-color: #00A250 +} + +div.highlight .-Color[class*=-BGYellow] { + background-color: #DDB62B +} + +div.highlight .-Color[class*=-BGBlue] { + background-color: #208FFB +} + +div.highlight .-Color[class*=-BGMagenta] { + background-color: #D160C4 +} + +div.highlight .-Color[class*=-BGCyan] { + background-color: #60C6C8 +} + +div.highlight .-Color[class*=-BGWhite] { + background-color: #C5C1B4 +} + +/* Font colors for 8-bit ANSI */ + +div.highlight .-Color[class*=-C0] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC0] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C1] { + color: #800000 +} + +div.highlight .-Color[class*=-BGC1] { + background-color: #800000 +} + +div.highlight .-Color[class*=-C2] { + color: #008000 +} + +div.highlight .-Color[class*=-BGC2] { + background-color: #008000 +} + +div.highlight .-Color[class*=-C3] { + color: #808000 +} + +div.highlight .-Color[class*=-BGC3] { + background-color: #808000 +} + +div.highlight .-Color[class*=-C4] { + color: #000080 +} + +div.highlight .-Color[class*=-BGC4] { + background-color: #000080 +} + +div.highlight .-Color[class*=-C5] { + color: #800080 +} + +div.highlight .-Color[class*=-BGC5] { + background-color: #800080 +} + +div.highlight .-Color[class*=-C6] { + color: #008080 +} + +div.highlight .-Color[class*=-BGC6] { + background-color: #008080 +} + +div.highlight .-Color[class*=-C7] { + color: #C0C0C0 +} + +div.highlight .-Color[class*=-BGC7] { + background-color: #C0C0C0 +} + +div.highlight .-Color[class*=-C8] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC8] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C9] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC9] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C10] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC10] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C11] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC11] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C12] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC12] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C13] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC13] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C14] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC14] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C15] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC15] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C16] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC16] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C17] { + color: #00005F +} + +div.highlight .-Color[class*=-BGC17] { + background-color: #00005F +} + +div.highlight .-Color[class*=-C18] { + color: #000087 +} + +div.highlight .-Color[class*=-BGC18] { + background-color: #000087 +} + +div.highlight .-Color[class*=-C19] { + color: #0000AF +} + +div.highlight .-Color[class*=-BGC19] { + background-color: #0000AF +} + +div.highlight .-Color[class*=-C20] { + color: #0000D7 +} + +div.highlight .-Color[class*=-BGC20] { + background-color: #0000D7 +} + +div.highlight .-Color[class*=-C21] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC21] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C22] { + color: #005F00 +} + +div.highlight .-Color[class*=-BGC22] { + background-color: #005F00 +} + +div.highlight .-Color[class*=-C23] { + color: #005F5F +} + +div.highlight .-Color[class*=-BGC23] { + background-color: #005F5F +} + +div.highlight .-Color[class*=-C24] { + color: #005F87 +} + +div.highlight .-Color[class*=-BGC24] { + background-color: #005F87 +} + +div.highlight .-Color[class*=-C25] { + color: #005FAF +} + +div.highlight .-Color[class*=-BGC25] { + background-color: #005FAF +} + +div.highlight .-Color[class*=-C26] { + color: #005FD7 +} + +div.highlight .-Color[class*=-BGC26] { + background-color: #005FD7 +} + +div.highlight .-Color[class*=-C27] { + color: #005FFF +} + +div.highlight .-Color[class*=-BGC27] { + background-color: #005FFF +} + +div.highlight .-Color[class*=-C28] { + color: #008700 +} + +div.highlight .-Color[class*=-BGC28] { + background-color: #008700 +} + +div.highlight .-Color[class*=-C29] { + color: #00875F +} + +div.highlight .-Color[class*=-BGC29] { + background-color: #00875F +} + +div.highlight .-Color[class*=-C30] { + color: #008787 +} + +div.highlight .-Color[class*=-BGC30] { + background-color: #008787 +} + +div.highlight .-Color[class*=-C31] { + color: #0087AF +} + +div.highlight .-Color[class*=-BGC31] { + background-color: #0087AF +} + +div.highlight .-Color[class*=-C32] { + color: #0087D7 +} + +div.highlight .-Color[class*=-BGC32] { + background-color: #0087D7 +} + +div.highlight .-Color[class*=-C33] { + color: #0087FF +} + +div.highlight .-Color[class*=-BGC33] { + background-color: #0087FF +} + +div.highlight .-Color[class*=-C34] { + color: #00AF00 +} + +div.highlight .-Color[class*=-BGC34] { + background-color: #00AF00 +} + +div.highlight .-Color[class*=-C35] { + color: #00AF5F +} + +div.highlight .-Color[class*=-BGC35] { + background-color: #00AF5F +} + +div.highlight .-Color[class*=-C36] { + color: #00AF87 +} + +div.highlight .-Color[class*=-BGC36] { + background-color: #00AF87 +} + +div.highlight .-Color[class*=-C37] { + color: #00AFAF +} + +div.highlight .-Color[class*=-BGC37] { + background-color: #00AFAF +} + +div.highlight .-Color[class*=-C38] { + color: #00AFD7 +} + +div.highlight .-Color[class*=-BGC38] { + background-color: #00AFD7 +} + +div.highlight .-Color[class*=-C39] { + color: #00AFFF +} + +div.highlight .-Color[class*=-BGC39] { + background-color: #00AFFF +} + +div.highlight .-Color[class*=-C40] { + color: #00D700 +} + +div.highlight .-Color[class*=-BGC40] { + background-color: #00D700 +} + +div.highlight .-Color[class*=-C41] { + color: #00D75F +} + +div.highlight .-Color[class*=-BGC41] { + background-color: #00D75F +} + +div.highlight .-Color[class*=-C42] { + color: #00D787 +} + +div.highlight .-Color[class*=-BGC42] { + background-color: #00D787 +} + +div.highlight .-Color[class*=-C43] { + color: #00D7AF +} + +div.highlight .-Color[class*=-BGC43] { + background-color: #00D7AF +} + +div.highlight .-Color[class*=-C44] { + color: #00D7D7 +} + +div.highlight .-Color[class*=-BGC44] { + background-color: #00D7D7 +} + +div.highlight .-Color[class*=-C45] { + color: #00D7FF +} + +div.highlight .-Color[class*=-BGC45] { + background-color: #00D7FF +} + +div.highlight .-Color[class*=-C46] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC46] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C47] { + color: #00FF5F +} + +div.highlight .-Color[class*=-BGC47] { + background-color: #00FF5F +} + +div.highlight .-Color[class*=-C48] { + color: #00FF87 +} + +div.highlight .-Color[class*=-BGC48] { + background-color: #00FF87 +} + +div.highlight .-Color[class*=-C49] { + color: #00FFAF +} + +div.highlight .-Color[class*=-BGC49] { + background-color: #00FFAF +} + +div.highlight .-Color[class*=-C50] { + color: #00FFD7 +} + +div.highlight .-Color[class*=-BGC50] { + background-color: #00FFD7 +} + +div.highlight .-Color[class*=-C51] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC51] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C52] { + color: #5F0000 +} + +div.highlight .-Color[class*=-BGC52] { + background-color: #5F0000 +} + +div.highlight .-Color[class*=-C53] { + color: #5F005F +} + +div.highlight .-Color[class*=-BGC53] { + background-color: #5F005F +} + +div.highlight .-Color[class*=-C54] { + color: #5F0087 +} + +div.highlight .-Color[class*=-BGC54] { + background-color: #5F0087 +} + +div.highlight .-Color[class*=-C55] { + color: #5F00AF +} + +div.highlight .-Color[class*=-BGC55] { + background-color: #5F00AF +} + +div.highlight .-Color[class*=-C56] { + color: #5F00D7 +} + +div.highlight .-Color[class*=-BGC56] { + background-color: #5F00D7 +} + +div.highlight .-Color[class*=-C57] { + color: #5F00FF +} + +div.highlight .-Color[class*=-BGC57] { + background-color: #5F00FF +} + +div.highlight .-Color[class*=-C58] { + color: #5F5F00 +} + +div.highlight .-Color[class*=-BGC58] { + background-color: #5F5F00 +} + +div.highlight .-Color[class*=-C59] { + color: #5F5F5F +} + +div.highlight .-Color[class*=-BGC59] { + background-color: #5F5F5F +} + +div.highlight .-Color[class*=-C60] { + color: #5F5F87 +} + +div.highlight .-Color[class*=-BGC60] { + background-color: #5F5F87 +} + +div.highlight .-Color[class*=-C61] { + color: #5F5FAF +} + +div.highlight .-Color[class*=-BGC61] { + background-color: #5F5FAF +} + +div.highlight .-Color[class*=-C62] { + color: #5F5FD7 +} + +div.highlight .-Color[class*=-BGC62] { + background-color: #5F5FD7 +} + +div.highlight .-Color[class*=-C63] { + color: #5F5FFF +} + +div.highlight .-Color[class*=-BGC63] { + background-color: #5F5FFF +} + +div.highlight .-Color[class*=-C64] { + color: #5F8700 +} + +div.highlight .-Color[class*=-BGC64] { + background-color: #5F8700 +} + +div.highlight .-Color[class*=-C65] { + color: #5F875F +} + +div.highlight .-Color[class*=-BGC65] { + background-color: #5F875F +} + +div.highlight .-Color[class*=-C66] { + color: #5F8787 +} + +div.highlight .-Color[class*=-BGC66] { + background-color: #5F8787 +} + +div.highlight .-Color[class*=-C67] { + color: #5F87AF +} + +div.highlight .-Color[class*=-BGC67] { + background-color: #5F87AF +} + +div.highlight .-Color[class*=-C68] { + color: #5F87D7 +} + +div.highlight .-Color[class*=-BGC68] { + background-color: #5F87D7 +} + +div.highlight .-Color[class*=-C69] { + color: #5F87FF +} + +div.highlight .-Color[class*=-BGC69] { + background-color: #5F87FF +} + +div.highlight .-Color[class*=-C70] { + color: #5FAF00 +} + +div.highlight .-Color[class*=-BGC70] { + background-color: #5FAF00 +} + +div.highlight .-Color[class*=-C71] { + color: #5FAF5F +} + +div.highlight .-Color[class*=-BGC71] { + background-color: #5FAF5F +} + +div.highlight .-Color[class*=-C72] { + color: #5FAF87 +} + +div.highlight .-Color[class*=-BGC72] { + background-color: #5FAF87 +} + +div.highlight .-Color[class*=-C73] { + color: #5FAFAF +} + +div.highlight .-Color[class*=-BGC73] { + background-color: #5FAFAF +} + +div.highlight .-Color[class*=-C74] { + color: #5FAFD7 +} + +div.highlight .-Color[class*=-BGC74] { + background-color: #5FAFD7 +} + +div.highlight .-Color[class*=-C75] { + color: #5FAFFF +} + +div.highlight .-Color[class*=-BGC75] { + background-color: #5FAFFF +} + +div.highlight .-Color[class*=-C76] { + color: #5FD700 +} + +div.highlight .-Color[class*=-BGC76] { + background-color: #5FD700 +} + +div.highlight .-Color[class*=-C77] { + color: #5FD75F +} + +div.highlight .-Color[class*=-BGC77] { + background-color: #5FD75F +} + +div.highlight .-Color[class*=-C78] { + color: #5FD787 +} + +div.highlight .-Color[class*=-BGC78] { + background-color: #5FD787 +} + +div.highlight .-Color[class*=-C79] { + color: #5FD7AF +} + +div.highlight .-Color[class*=-BGC79] { + background-color: #5FD7AF +} + +div.highlight .-Color[class*=-C80] { + color: #5FD7D7 +} + +div.highlight .-Color[class*=-BGC80] { + background-color: #5FD7D7 +} + +div.highlight .-Color[class*=-C81] { + color: #5FD7FF +} + +div.highlight .-Color[class*=-BGC81] { + background-color: #5FD7FF +} + +div.highlight .-Color[class*=-C82] { + color: #5FFF00 +} + +div.highlight .-Color[class*=-BGC82] { + background-color: #5FFF00 +} + +div.highlight .-Color[class*=-C83] { + color: #5FFF5F +} + +div.highlight .-Color[class*=-BGC83] { + background-color: #5FFF5F +} + +div.highlight .-Color[class*=-C84] { + color: #5FFF87 +} + +div.highlight .-Color[class*=-BGC84] { + background-color: #5FFF87 +} + +div.highlight .-Color[class*=-C85] { + color: #5FFFAF +} + +div.highlight .-Color[class*=-BGC85] { + background-color: #5FFFAF +} + +div.highlight .-Color[class*=-C86] { + color: #5FFFD7 +} + +div.highlight .-Color[class*=-BGC86] { + background-color: #5FFFD7 +} + +div.highlight .-Color[class*=-C87] { + color: #5FFFFF +} + +div.highlight .-Color[class*=-BGC87] { + background-color: #5FFFFF +} + +div.highlight .-Color[class*=-C88] { + color: #870000 +} + +div.highlight .-Color[class*=-BGC88] { + background-color: #870000 +} + +div.highlight .-Color[class*=-C89] { + color: #87005F +} + +div.highlight .-Color[class*=-BGC89] { + background-color: #87005F +} + +div.highlight .-Color[class*=-C90] { + color: #870087 +} + +div.highlight .-Color[class*=-BGC90] { + background-color: #870087 +} + +div.highlight .-Color[class*=-C91] { + color: #8700AF +} + +div.highlight .-Color[class*=-BGC91] { + background-color: #8700AF +} + +div.highlight .-Color[class*=-C92] { + color: #8700D7 +} + +div.highlight .-Color[class*=-BGC92] { + background-color: #8700D7 +} + +div.highlight .-Color[class*=-C93] { + color: #8700FF +} + +div.highlight .-Color[class*=-BGC93] { + background-color: #8700FF +} + +div.highlight .-Color[class*=-C94] { + color: #875F00 +} + +div.highlight .-Color[class*=-BGC94] { + background-color: #875F00 +} + +div.highlight .-Color[class*=-C95] { + color: #875F5F +} + +div.highlight .-Color[class*=-BGC95] { + background-color: #875F5F +} + +div.highlight .-Color[class*=-C96] { + color: #875F87 +} + +div.highlight .-Color[class*=-BGC96] { + background-color: #875F87 +} + +div.highlight .-Color[class*=-C97] { + color: #875FAF +} + +div.highlight .-Color[class*=-BGC97] { + background-color: #875FAF +} + +div.highlight .-Color[class*=-C98] { + color: #875FD7 +} + +div.highlight .-Color[class*=-BGC98] { + background-color: #875FD7 +} + +div.highlight .-Color[class*=-C99] { + color: #875FFF +} + +div.highlight .-Color[class*=-BGC99] { + background-color: #875FFF +} + +div.highlight .-Color[class*=-C100] { + color: #878700 +} + +div.highlight .-Color[class*=-BGC100] { + background-color: #878700 +} + +div.highlight .-Color[class*=-C101] { + color: #87875F +} + +div.highlight .-Color[class*=-BGC101] { + background-color: #87875F +} + +div.highlight .-Color[class*=-C102] { + color: #878787 +} + +div.highlight .-Color[class*=-BGC102] { + background-color: #878787 +} + +div.highlight .-Color[class*=-C103] { + color: #8787AF +} + +div.highlight .-Color[class*=-BGC103] { + background-color: #8787AF +} + +div.highlight .-Color[class*=-C104] { + color: #8787D7 +} + +div.highlight .-Color[class*=-BGC104] { + background-color: #8787D7 +} + +div.highlight .-Color[class*=-C105] { + color: #8787FF +} + +div.highlight .-Color[class*=-BGC105] { + background-color: #8787FF +} + +div.highlight .-Color[class*=-C106] { + color: #87AF00 +} + +div.highlight .-Color[class*=-BGC106] { + background-color: #87AF00 +} + +div.highlight .-Color[class*=-C107] { + color: #87AF5F +} + +div.highlight .-Color[class*=-BGC107] { + background-color: #87AF5F +} + +div.highlight .-Color[class*=-C108] { + color: #87AF87 +} + +div.highlight .-Color[class*=-BGC108] { + background-color: #87AF87 +} + +div.highlight .-Color[class*=-C109] { + color: #87AFAF +} + +div.highlight .-Color[class*=-BGC109] { + background-color: #87AFAF +} + +div.highlight .-Color[class*=-C110] { + color: #87AFD7 +} + +div.highlight .-Color[class*=-BGC110] { + background-color: #87AFD7 +} + +div.highlight .-Color[class*=-C111] { + color: #87AFFF +} + +div.highlight .-Color[class*=-BGC111] { + background-color: #87AFFF +} + +div.highlight .-Color[class*=-C112] { + color: #87D700 +} + +div.highlight .-Color[class*=-BGC112] { + background-color: #87D700 +} + +div.highlight .-Color[class*=-C113] { + color: #87D75F +} + +div.highlight .-Color[class*=-BGC113] { + background-color: #87D75F +} + +div.highlight .-Color[class*=-C114] { + color: #87D787 +} + +div.highlight .-Color[class*=-BGC114] { + background-color: #87D787 +} + +div.highlight .-Color[class*=-C115] { + color: #87D7AF +} + +div.highlight .-Color[class*=-BGC115] { + background-color: #87D7AF +} + +div.highlight .-Color[class*=-C116] { + color: #87D7D7 +} + +div.highlight .-Color[class*=-BGC116] { + background-color: #87D7D7 +} + +div.highlight .-Color[class*=-C117] { + color: #87D7FF +} + +div.highlight .-Color[class*=-BGC117] { + background-color: #87D7FF +} + +div.highlight .-Color[class*=-C118] { + color: #87FF00 +} + +div.highlight .-Color[class*=-BGC118] { + background-color: #87FF00 +} + +div.highlight .-Color[class*=-C119] { + color: #87FF5F +} + +div.highlight .-Color[class*=-BGC119] { + background-color: #87FF5F +} + +div.highlight .-Color[class*=-C120] { + color: #87FF87 +} + +div.highlight .-Color[class*=-BGC120] { + background-color: #87FF87 +} + +div.highlight .-Color[class*=-C121] { + color: #87FFAF +} + +div.highlight .-Color[class*=-BGC121] { + background-color: #87FFAF +} + +div.highlight .-Color[class*=-C122] { + color: #87FFD7 +} + +div.highlight .-Color[class*=-BGC122] { + background-color: #87FFD7 +} + +div.highlight .-Color[class*=-C123] { + color: #87FFFF +} + +div.highlight .-Color[class*=-BGC123] { + background-color: #87FFFF +} + +div.highlight .-Color[class*=-C124] { + color: #AF0000 +} + +div.highlight .-Color[class*=-BGC124] { + background-color: #AF0000 +} + +div.highlight .-Color[class*=-C125] { + color: #AF005F +} + +div.highlight .-Color[class*=-BGC125] { + background-color: #AF005F +} + +div.highlight .-Color[class*=-C126] { + color: #AF0087 +} + +div.highlight .-Color[class*=-BGC126] { + background-color: #AF0087 +} + +div.highlight .-Color[class*=-C127] { + color: #AF00AF +} + +div.highlight .-Color[class*=-BGC127] { + background-color: #AF00AF +} + +div.highlight .-Color[class*=-C128] { + color: #AF00D7 +} + +div.highlight .-Color[class*=-BGC128] { + background-color: #AF00D7 +} + +div.highlight .-Color[class*=-C129] { + color: #AF00FF +} + +div.highlight .-Color[class*=-BGC129] { + background-color: #AF00FF +} + +div.highlight .-Color[class*=-C130] { + color: #AF5F00 +} + +div.highlight .-Color[class*=-BGC130] { + background-color: #AF5F00 +} + +div.highlight .-Color[class*=-C131] { + color: #AF5F5F +} + +div.highlight .-Color[class*=-BGC131] { + background-color: #AF5F5F +} + +div.highlight .-Color[class*=-C132] { + color: #AF5F87 +} + +div.highlight .-Color[class*=-BGC132] { + background-color: #AF5F87 +} + +div.highlight .-Color[class*=-C133] { + color: #AF5FAF +} + +div.highlight .-Color[class*=-BGC133] { + background-color: #AF5FAF +} + +div.highlight .-Color[class*=-C134] { + color: #AF5FD7 +} + +div.highlight .-Color[class*=-BGC134] { + background-color: #AF5FD7 +} + +div.highlight .-Color[class*=-C135] { + color: #AF5FFF +} + +div.highlight .-Color[class*=-BGC135] { + background-color: #AF5FFF +} + +div.highlight .-Color[class*=-C136] { + color: #AF8700 +} + +div.highlight .-Color[class*=-BGC136] { + background-color: #AF8700 +} + +div.highlight .-Color[class*=-C137] { + color: #AF875F +} + +div.highlight .-Color[class*=-BGC137] { + background-color: #AF875F +} + +div.highlight .-Color[class*=-C138] { + color: #AF8787 +} + +div.highlight .-Color[class*=-BGC138] { + background-color: #AF8787 +} + +div.highlight .-Color[class*=-C139] { + color: #AF87AF +} + +div.highlight .-Color[class*=-BGC139] { + background-color: #AF87AF +} + +div.highlight .-Color[class*=-C140] { + color: #AF87D7 +} + +div.highlight .-Color[class*=-BGC140] { + background-color: #AF87D7 +} + +div.highlight .-Color[class*=-C141] { + color: #AF87FF +} + +div.highlight .-Color[class*=-BGC141] { + background-color: #AF87FF +} + +div.highlight .-Color[class*=-C142] { + color: #AFAF00 +} + +div.highlight .-Color[class*=-BGC142] { + background-color: #AFAF00 +} + +div.highlight .-Color[class*=-C143] { + color: #AFAF5F +} + +div.highlight .-Color[class*=-BGC143] { + background-color: #AFAF5F +} + +div.highlight .-Color[class*=-C144] { + color: #AFAF87 +} + +div.highlight .-Color[class*=-BGC144] { + background-color: #AFAF87 +} + +div.highlight .-Color[class*=-C145] { + color: #AFAFAF +} + +div.highlight .-Color[class*=-BGC145] { + background-color: #AFAFAF +} + +div.highlight .-Color[class*=-C146] { + color: #AFAFD7 +} + +div.highlight .-Color[class*=-BGC146] { + background-color: #AFAFD7 +} + +div.highlight .-Color[class*=-C147] { + color: #AFAFFF +} + +div.highlight .-Color[class*=-BGC147] { + background-color: #AFAFFF +} + +div.highlight .-Color[class*=-C148] { + color: #AFD700 +} + +div.highlight .-Color[class*=-BGC148] { + background-color: #AFD700 +} + +div.highlight .-Color[class*=-C149] { + color: #AFD75F +} + +div.highlight .-Color[class*=-BGC149] { + background-color: #AFD75F +} + +div.highlight .-Color[class*=-C150] { + color: #AFD787 +} + +div.highlight .-Color[class*=-BGC150] { + background-color: #AFD787 +} + +div.highlight .-Color[class*=-C151] { + color: #AFD7AF +} + +div.highlight .-Color[class*=-BGC151] { + background-color: #AFD7AF +} + +div.highlight .-Color[class*=-C152] { + color: #AFD7D7 +} + +div.highlight .-Color[class*=-BGC152] { + background-color: #AFD7D7 +} + +div.highlight .-Color[class*=-C153] { + color: #AFD7FF +} + +div.highlight .-Color[class*=-BGC153] { + background-color: #AFD7FF +} + +div.highlight .-Color[class*=-C154] { + color: #AFFF00 +} + +div.highlight .-Color[class*=-BGC154] { + background-color: #AFFF00 +} + +div.highlight .-Color[class*=-C155] { + color: #AFFF5F +} + +div.highlight .-Color[class*=-BGC155] { + background-color: #AFFF5F +} + +div.highlight .-Color[class*=-C156] { + color: #AFFF87 +} + +div.highlight .-Color[class*=-BGC156] { + background-color: #AFFF87 +} + +div.highlight .-Color[class*=-C157] { + color: #AFFFAF +} + +div.highlight .-Color[class*=-BGC157] { + background-color: #AFFFAF +} + +div.highlight .-Color[class*=-C158] { + color: #AFFFD7 +} + +div.highlight .-Color[class*=-BGC158] { + background-color: #AFFFD7 +} + +div.highlight .-Color[class*=-C159] { + color: #AFFFFF +} + +div.highlight .-Color[class*=-BGC159] { + background-color: #AFFFFF +} + +div.highlight .-Color[class*=-C160] { + color: #D70000 +} + +div.highlight .-Color[class*=-BGC160] { + background-color: #D70000 +} + +div.highlight .-Color[class*=-C161] { + color: #D7005F +} + +div.highlight .-Color[class*=-BGC161] { + background-color: #D7005F +} + +div.highlight .-Color[class*=-C162] { + color: #D70087 +} + +div.highlight .-Color[class*=-BGC162] { + background-color: #D70087 +} + +div.highlight .-Color[class*=-C163] { + color: #D700AF +} + +div.highlight .-Color[class*=-BGC163] { + background-color: #D700AF +} + +div.highlight .-Color[class*=-C164] { + color: #D700D7 +} + +div.highlight .-Color[class*=-BGC164] { + background-color: #D700D7 +} + +div.highlight .-Color[class*=-C165] { + color: #D700FF +} + +div.highlight .-Color[class*=-BGC165] { + background-color: #D700FF +} + +div.highlight .-Color[class*=-C166] { + color: #D75F00 +} + +div.highlight .-Color[class*=-BGC166] { + background-color: #D75F00 +} + +div.highlight .-Color[class*=-C167] { + color: #D75F5F +} + +div.highlight .-Color[class*=-BGC167] { + background-color: #D75F5F +} + +div.highlight .-Color[class*=-C168] { + color: #D75F87 +} + +div.highlight .-Color[class*=-BGC168] { + background-color: #D75F87 +} + +div.highlight .-Color[class*=-C169] { + color: #D75FAF +} + +div.highlight .-Color[class*=-BGC169] { + background-color: #D75FAF +} + +div.highlight .-Color[class*=-C170] { + color: #D75FD7 +} + +div.highlight .-Color[class*=-BGC170] { + background-color: #D75FD7 +} + +div.highlight .-Color[class*=-C171] { + color: #D75FFF +} + +div.highlight .-Color[class*=-BGC171] { + background-color: #D75FFF +} + +div.highlight .-Color[class*=-C172] { + color: #D78700 +} + +div.highlight .-Color[class*=-BGC172] { + background-color: #D78700 +} + +div.highlight .-Color[class*=-C173] { + color: #D7875F +} + +div.highlight .-Color[class*=-BGC173] { + background-color: #D7875F +} + +div.highlight .-Color[class*=-C174] { + color: #D78787 +} + +div.highlight .-Color[class*=-BGC174] { + background-color: #D78787 +} + +div.highlight .-Color[class*=-C175] { + color: #D787AF +} + +div.highlight .-Color[class*=-BGC175] { + background-color: #D787AF +} + +div.highlight .-Color[class*=-C176] { + color: #D787D7 +} + +div.highlight .-Color[class*=-BGC176] { + background-color: #D787D7 +} + +div.highlight .-Color[class*=-C177] { + color: #D787FF +} + +div.highlight .-Color[class*=-BGC177] { + background-color: #D787FF +} + +div.highlight .-Color[class*=-C178] { + color: #D7AF00 +} + +div.highlight .-Color[class*=-BGC178] { + background-color: #D7AF00 +} + +div.highlight .-Color[class*=-C179] { + color: #D7AF5F +} + +div.highlight .-Color[class*=-BGC179] { + background-color: #D7AF5F +} + +div.highlight .-Color[class*=-C180] { + color: #D7AF87 +} + +div.highlight .-Color[class*=-BGC180] { + background-color: #D7AF87 +} + +div.highlight .-Color[class*=-C181] { + color: #D7AFAF +} + +div.highlight .-Color[class*=-BGC181] { + background-color: #D7AFAF +} + +div.highlight .-Color[class*=-C182] { + color: #D7AFD7 +} + +div.highlight .-Color[class*=-BGC182] { + background-color: #D7AFD7 +} + +div.highlight .-Color[class*=-C183] { + color: #D7AFFF +} + +div.highlight .-Color[class*=-BGC183] { + background-color: #D7AFFF +} + +div.highlight .-Color[class*=-C184] { + color: #D7D700 +} + +div.highlight .-Color[class*=-BGC184] { + background-color: #D7D700 +} + +div.highlight .-Color[class*=-C185] { + color: #D7D75F +} + +div.highlight .-Color[class*=-BGC185] { + background-color: #D7D75F +} + +div.highlight .-Color[class*=-C186] { + color: #D7D787 +} + +div.highlight .-Color[class*=-BGC186] { + background-color: #D7D787 +} + +div.highlight .-Color[class*=-C187] { + color: #D7D7AF +} + +div.highlight .-Color[class*=-BGC187] { + background-color: #D7D7AF +} + +div.highlight .-Color[class*=-C188] { + color: #D7D7D7 +} + +div.highlight .-Color[class*=-BGC188] { + background-color: #D7D7D7 +} + +div.highlight .-Color[class*=-C189] { + color: #D7D7FF +} + +div.highlight .-Color[class*=-BGC189] { + background-color: #D7D7FF +} + +div.highlight .-Color[class*=-C190] { + color: #D7FF00 +} + +div.highlight .-Color[class*=-BGC190] { + background-color: #D7FF00 +} + +div.highlight .-Color[class*=-C191] { + color: #D7FF5F +} + +div.highlight .-Color[class*=-BGC191] { + background-color: #D7FF5F +} + +div.highlight .-Color[class*=-C192] { + color: #D7FF87 +} + +div.highlight .-Color[class*=-BGC192] { + background-color: #D7FF87 +} + +div.highlight .-Color[class*=-C193] { + color: #D7FFAF +} + +div.highlight .-Color[class*=-BGC193] { + background-color: #D7FFAF +} + +div.highlight .-Color[class*=-C194] { + color: #D7FFD7 +} + +div.highlight .-Color[class*=-BGC194] { + background-color: #D7FFD7 +} + +div.highlight .-Color[class*=-C195] { + color: #D7FFFF +} + +div.highlight .-Color[class*=-BGC195] { + background-color: #D7FFFF +} + +div.highlight .-Color[class*=-C196] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC196] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C197] { + color: #FF005F +} + +div.highlight .-Color[class*=-BGC197] { + background-color: #FF005F +} + +div.highlight .-Color[class*=-C198] { + color: #FF0087 +} + +div.highlight .-Color[class*=-BGC198] { + background-color: #FF0087 +} + +div.highlight .-Color[class*=-C199] { + color: #FF00AF +} + +div.highlight .-Color[class*=-BGC199] { + background-color: #FF00AF +} + +div.highlight .-Color[class*=-C200] { + color: #FF00D7 +} + +div.highlight .-Color[class*=-BGC200] { + background-color: #FF00D7 +} + +div.highlight .-Color[class*=-C201] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC201] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C202] { + color: #FF5F00 +} + +div.highlight .-Color[class*=-BGC202] { + background-color: #FF5F00 +} + +div.highlight .-Color[class*=-C203] { + color: #FF5F5F +} + +div.highlight .-Color[class*=-BGC203] { + background-color: #FF5F5F +} + +div.highlight .-Color[class*=-C204] { + color: #FF5F87 +} + +div.highlight .-Color[class*=-BGC204] { + background-color: #FF5F87 +} + +div.highlight .-Color[class*=-C205] { + color: #FF5FAF +} + +div.highlight .-Color[class*=-BGC205] { + background-color: #FF5FAF +} + +div.highlight .-Color[class*=-C206] { + color: #FF5FD7 +} + +div.highlight .-Color[class*=-BGC206] { + background-color: #FF5FD7 +} + +div.highlight .-Color[class*=-C207] { + color: #FF5FFF +} + +div.highlight .-Color[class*=-BGC207] { + background-color: #FF5FFF +} + +div.highlight .-Color[class*=-C208] { + color: #FF8700 +} + +div.highlight .-Color[class*=-BGC208] { + background-color: #FF8700 +} + +div.highlight .-Color[class*=-C209] { + color: #FF875F +} + +div.highlight .-Color[class*=-BGC209] { + background-color: #FF875F +} + +div.highlight .-Color[class*=-C210] { + color: #FF8787 +} + +div.highlight .-Color[class*=-BGC210] { + background-color: #FF8787 +} + +div.highlight .-Color[class*=-C211] { + color: #FF87AF +} + +div.highlight .-Color[class*=-BGC211] { + background-color: #FF87AF +} + +div.highlight .-Color[class*=-C212] { + color: #FF87D7 +} + +div.highlight .-Color[class*=-BGC212] { + background-color: #FF87D7 +} + +div.highlight .-Color[class*=-C213] { + color: #FF87FF +} + +div.highlight .-Color[class*=-BGC213] { + background-color: #FF87FF +} + +div.highlight .-Color[class*=-C214] { + color: #FFAF00 +} + +div.highlight .-Color[class*=-BGC214] { + background-color: #FFAF00 +} + +div.highlight .-Color[class*=-C215] { + color: #FFAF5F +} + +div.highlight .-Color[class*=-BGC215] { + background-color: #FFAF5F +} + +div.highlight .-Color[class*=-C216] { + color: #FFAF87 +} + +div.highlight .-Color[class*=-BGC216] { + background-color: #FFAF87 +} + +div.highlight .-Color[class*=-C217] { + color: #FFAFAF +} + +div.highlight .-Color[class*=-BGC217] { + background-color: #FFAFAF +} + +div.highlight .-Color[class*=-C218] { + color: #FFAFD7 +} + +div.highlight .-Color[class*=-BGC218] { + background-color: #FFAFD7 +} + +div.highlight .-Color[class*=-C219] { + color: #FFAFFF +} + +div.highlight .-Color[class*=-BGC219] { + background-color: #FFAFFF +} + +div.highlight .-Color[class*=-C220] { + color: #FFD700 +} + +div.highlight .-Color[class*=-BGC220] { + background-color: #FFD700 +} + +div.highlight .-Color[class*=-C221] { + color: #FFD75F +} + +div.highlight .-Color[class*=-BGC221] { + background-color: #FFD75F +} + +div.highlight .-Color[class*=-C222] { + color: #FFD787 +} + +div.highlight .-Color[class*=-BGC222] { + background-color: #FFD787 +} + +div.highlight .-Color[class*=-C223] { + color: #FFD7AF +} + +div.highlight .-Color[class*=-BGC223] { + background-color: #FFD7AF +} + +div.highlight .-Color[class*=-C224] { + color: #FFD7D7 +} + +div.highlight .-Color[class*=-BGC224] { + background-color: #FFD7D7 +} + +div.highlight .-Color[class*=-C225] { + color: #FFD7FF +} + +div.highlight .-Color[class*=-BGC225] { + background-color: #FFD7FF +} + +div.highlight .-Color[class*=-C226] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC226] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C227] { + color: #FFFF5F +} + +div.highlight .-Color[class*=-BGC227] { + background-color: #FFFF5F +} + +div.highlight .-Color[class*=-C228] { + color: #FFFF87 +} + +div.highlight .-Color[class*=-BGC228] { + background-color: #FFFF87 +} + +div.highlight .-Color[class*=-C229] { + color: #FFFFAF +} + +div.highlight .-Color[class*=-BGC229] { + background-color: #FFFFAF +} + +div.highlight .-Color[class*=-C230] { + color: #FFFFD7 +} + +div.highlight .-Color[class*=-BGC230] { + background-color: #FFFFD7 +} + +div.highlight .-Color[class*=-C231] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC231] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C232] { + color: #080808 +} + +div.highlight .-Color[class*=-BGC232] { + background-color: #080808 +} + +div.highlight .-Color[class*=-C233] { + color: #121212 +} + +div.highlight .-Color[class*=-BGC233] { + background-color: #121212 +} + +div.highlight .-Color[class*=-C234] { + color: #1C1C1C +} + +div.highlight .-Color[class*=-BGC234] { + background-color: #1C1C1C +} + +div.highlight .-Color[class*=-C235] { + color: #262626 +} + +div.highlight .-Color[class*=-BGC235] { + background-color: #262626 +} + +div.highlight .-Color[class*=-C236] { + color: #303030 +} + +div.highlight .-Color[class*=-BGC236] { + background-color: #303030 +} + +div.highlight .-Color[class*=-C237] { + color: #3A3A3A +} + +div.highlight .-Color[class*=-BGC237] { + background-color: #3A3A3A +} + +div.highlight .-Color[class*=-C238] { + color: #444444 +} + +div.highlight .-Color[class*=-BGC238] { + background-color: #444444 +} + +div.highlight .-Color[class*=-C239] { + color: #4E4E4E +} + +div.highlight .-Color[class*=-BGC239] { + background-color: #4E4E4E +} + +div.highlight .-Color[class*=-C240] { + color: #585858 +} + +div.highlight .-Color[class*=-BGC240] { + background-color: #585858 +} + +div.highlight .-Color[class*=-C241] { + color: #626262 +} + +div.highlight .-Color[class*=-BGC241] { + background-color: #626262 +} + +div.highlight .-Color[class*=-C242] { + color: #6C6C6C +} + +div.highlight .-Color[class*=-BGC242] { + background-color: #6C6C6C +} + +div.highlight .-Color[class*=-C243] { + color: #767676 +} + +div.highlight .-Color[class*=-BGC243] { + background-color: #767676 +} + +div.highlight .-Color[class*=-C244] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC244] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C245] { + color: #8A8A8A +} + +div.highlight .-Color[class*=-BGC245] { + background-color: #8A8A8A +} + +div.highlight .-Color[class*=-C246] { + color: #949494 +} + +div.highlight .-Color[class*=-BGC246] { + background-color: #949494 +} + +div.highlight .-Color[class*=-C247] { + color: #9E9E9E +} + +div.highlight .-Color[class*=-BGC247] { + background-color: #9E9E9E +} + +div.highlight .-Color[class*=-C248] { + color: #A8A8A8 +} + +div.highlight .-Color[class*=-BGC248] { + background-color: #A8A8A8 +} + +div.highlight .-Color[class*=-C249] { + color: #B2B2B2 +} + +div.highlight .-Color[class*=-BGC249] { + background-color: #B2B2B2 +} + +div.highlight .-Color[class*=-C250] { + color: #BCBCBC +} + +div.highlight .-Color[class*=-BGC250] { + background-color: #BCBCBC +} + +div.highlight .-Color[class*=-C251] { + color: #C6C6C6 +} + +div.highlight .-Color[class*=-BGC251] { + background-color: #C6C6C6 +} + +div.highlight .-Color[class*=-C252] { + color: #D0D0D0 +} + +div.highlight .-Color[class*=-BGC252] { + background-color: #D0D0D0 +} + +div.highlight .-Color[class*=-C253] { + color: #DADADA +} + +div.highlight .-Color[class*=-BGC253] { + background-color: #DADADA +} + +div.highlight .-Color[class*=-C254] { + color: #E4E4E4 +} + +div.highlight .-Color[class*=-BGC254] { + background-color: #E4E4E4 +} + +div.highlight .-Color[class*=-C255] { + color: #EEEEEE +} + +div.highlight .-Color[class*=-BGC255] { + background-color: #EEEEEE +} diff --git a/api/cellarr.html b/api/cellarr.html index 2f8cf71..0a5abfc 100644 --- a/api/cellarr.html +++ b/api/cellarr.html @@ -6,9 +6,10 @@ - cellarr package - cellarr 0.0.1 documentation + cellarr package - cellarr 0.0.2 documentation + @@ -179,7 +180,7 @@
@@ -203,7 +204,7 @@