mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-17 05:47:58 +08:00
* icons, partway * redux for values * onChange * cancel * annotations lifecycle for category names * copy categorical * edit category * add Dataframe.withColsFrom * render user annotations; default add/delete annotation category * add label name to actions * category name edit * error checking improvements * change schema field isUserAnnotation to writable * always have an unassigned label; implement delete label * implement add new label and edit label name * label current cell selection * fix select exact bug in crossfilter * clean up categorical reducer * fix tests * remove debugging printf * implement subset/reset for user annotations * undo redo support for user annotations * remove duplicate button from categories * add modal * remove obsolete duplicate annotation reducers * remove old debugging printf * connect modal to annotation create and dup * initial full-stack wiring * finish up end-to-end wiring * fix existing unit tests * fix pytests to match new schema API * remove debugging printfs * add label file rotation * remove obsolete comment * add fbs encode/decode tests * add tests for writable annotations * simplify code * fix hashing bug with FBS encoding * lint * fix smoke tests * improve error checking in Dataframe.withColsFrom * add unit test for Dataframe.withColsFrom * add unit test for Dataframe.columns and Dataframe.renameCol * fix bug in FBS encode, add better error checks, refactor * add FBS encode/decode test * add clarifying comment * clean up action type names; fix state inconsistency in crossfilter update * change autosave timer to 2.5sec * sort categorical metadata render order so it remains consistent * add temporary autogenerated label for add-new-label operation * fix hover-over label menu interference with cell highlighting * remove debugging code * add missing reducer cases & fix typo * make dataframe memoize more general purpose * add dev mode for annos * fix error on select duplicate * handle zero occupancy categories * correctly maintain unclipped AND clipped world * correctly handle zero length FBS matrix and label files * ensure all writable categorical schema contains an unassigned category * handle case where building occupancy stack for category with no members * dialog for creating label, disable button if duplicate or empty * visually separate writeable * edit category * fix edit category name * remove debugging code * fix edit annotation label * visually define unassigned, change options * Pull in requirements.txt from `master` * label currently selected cells * duplicate label * lint * fix pytest merge issues * rename --label-file to --experimental-label-file * remove debugging console log * spelling error fix; fix bug found in PR review. * lint
100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
from abc import ABCMeta, abstractmethod
|
|
|
|
"""
|
|
Sort order for methods
|
|
1. Initialize
|
|
2. Helper
|
|
3. Filter
|
|
4. Data & Metadata
|
|
5. Computation
|
|
"""
|
|
|
|
|
|
class CXGDriver(metaclass=ABCMeta):
|
|
def __init__(self, data=None, args={}):
|
|
self.config = self._get_default_config()
|
|
self.config.update(args)
|
|
if data:
|
|
self._load_data(data)
|
|
else:
|
|
self.data = None
|
|
|
|
def update(self, data=None, args={}):
|
|
self.config.update(args)
|
|
if data:
|
|
self._load_data(data)
|
|
|
|
@staticmethod
|
|
def _get_default_config():
|
|
return {
|
|
"layout": None,
|
|
"max_category_items": None,
|
|
"diffexp_lfc_cutoff": None
|
|
}
|
|
|
|
@property
|
|
def features(self):
|
|
features = {
|
|
"cluster": {"available": False},
|
|
"layout": {"obs": {"available": False}, "var": {"available": False}},
|
|
"diffexp": {"available": True, "interactiveLimit": 50000}
|
|
}
|
|
# TODO - Interactive limit should be generated from the actual available methods see GH issue #94
|
|
if self.config["layout"]:
|
|
# TODO handle "var" when gene layout becomes available
|
|
features["layout"]["obs"] = {"available": True, "interactiveLimit": 50000}
|
|
return features
|
|
|
|
@abstractmethod
|
|
def get_schema(self):
|
|
"""
|
|
Return current schema
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def _load_data(self, data_locator):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def annotation_to_fbs_matrix(self, axis, field=None):
|
|
"""
|
|
Gets annotation value for each observation
|
|
:param axis: string obs or var
|
|
:param fields: list of keys for annotation to return, returns all annotation values if not set.
|
|
:return: flatbuffer: in fbs/matrix.fbs encoding
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def annotation_put_fbs(self, axis, fbs):
|
|
"""
|
|
Put/save FBS as user-defined labels
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def data_frame_to_fbs_matrix(self, filter, axis):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def diffexp_topN(self, obsFilter1, obsFilter2, top_n=None, interactive_limit=None):
|
|
"""
|
|
Computes the top N differentially expressed variables between two observation sets. If mode
|
|
is "TOP_N", then stats for the top N
|
|
dataframes
|
|
contain a subset of variables, then statistics for all variables will be returned, otherwise
|
|
only the top N vars will be returned.
|
|
:param obsFilter1: filter: dictionary with filter params for first set of observations
|
|
:param obsFilter2: filter: dictionary with filter params for second set of observations
|
|
:param top_n: Limit results to top N (Top var mode only)
|
|
:param interactive_limit: -- don't compute if total # genes in dataframes are larger than this
|
|
:return: top N genes and corresponding stats
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def layout_to_fbs_matrix(self, filter):
|
|
""" same as layout, except returns a flatbuffer """
|
|
pass
|