Beispiel #1
0
    def test_data_named_gene(self):
        var_index_col_name = self.data.get_schema(
        )["annotations"]["var"]["index"]
        filter_ = {
            "filter": {
                "var": {
                    "annotation_value": [{
                        "name": var_index_col_name,
                        "values": ["RER1"]
                    }]
                }
            }
        }
        fbs = self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
        data = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(data["n_rows"], 2638)
        self.assertEqual(data["n_cols"], 1)
        self.assertEqual(data["col_idx"], [4])

        filter_ = {
            "filter": {
                "var": {
                    "annotation_value": [{
                        "name": var_index_col_name,
                        "values": ["SPEN", "TYMP", "PRMT2"]
                    }]
                }
            }
        }
        fbs = self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
        data = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(data["n_rows"], 2638)
        self.assertEqual(data["n_cols"], 3)
        self.assertTrue((data["col_idx"] == [15, 1818, 1837]).all())
Beispiel #2
0
    def test_annotation_fields(self):
        fbs = self.data.annotation_to_fbs_matrix("obs", ["n_genes", "n_counts"])
        annotations = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(annotations["n_rows"], 2638)
        self.assertEqual(annotations["n_cols"], 2)

        var_index_col_name = self.data.get_schema()["annotations"]["var"]["index"]
        fbs = self.data.annotation_to_fbs_matrix("var", [var_index_col_name])
        annotations = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(annotations["n_rows"], 1838)
        self.assertEqual(annotations["n_cols"], 1)
Beispiel #3
0
    def test_layout_fields(self):
        """ X_pca, X_tsne, X_umap are available """
        fbs = self.data.layout_to_fbs_matrix(["pca"])
        layout = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(layout["n_cols"], 2)
        self.assertEqual(layout["n_rows"], 2638)
        self.assertCountEqual(layout["col_idx"], ["pca_0", "pca_1"])

        fbs = self.data.layout_to_fbs_matrix(["tsne", "pca"])
        layout = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(layout["n_cols"], 4)
        self.assertEqual(layout["n_rows"], 2638)
        self.assertCountEqual(layout["col_idx"], ["tsne_0", "tsne_1", "pca_0", "pca_1"])
Beispiel #4
0
    def on_start(self):
        self.client.verify = False
        self.dataset = random.choice(DataSets)

        with self.client.get(f"{self.dataset}{API}/config",
                             catch_response=True) as r:
            if r.status_code == 200:
                self.config = r.json()["config"]
                r.success()
            else:
                self.config = None
                r.failure(f"bad response code {r.status_code}")

        with self.client.get(f"{self.dataset}{API}/schema",
                             catch_response=True) as r:
            if r.status_code == 200:
                self.schema = r.json()["schema"]
                r.success()
            else:
                self.schema = None
                r.failure(f"bad response code {r.status_code}")

        with self.client.get(
                f"{self.dataset}{API}/annotations/var?annotation-name={self.var_index_name()}",
                headers={"Accept": "application/octet-stream"},
                catch_response=True,
        ) as r:
            if r.status_code == 200:
                df = decode_fbs.decode_matrix_FBS(r.content)
                gene_names_idx = df["col_idx"].index(self.var_index_name())
                self.gene_names = df["columns"][gene_names_idx]
            else:
                self.gene_names = None
                r.failure(f"bad response code {r.status_code}")
Beispiel #5
0
    def test_annotations(self):
        fbs = self.data.annotation_to_fbs_matrix("obs")
        annotations = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(annotations["n_rows"], 2638)
        self.assertEqual(annotations["n_cols"], 5)
        obs_index_col_name = self.data.get_schema()["annotations"]["obs"]["index"]
        self.assertEqual(
            annotations["col_idx"], [obs_index_col_name, "n_genes", "percent_mito", "n_counts", "louvain"],
        )

        fbs = self.data.annotation_to_fbs_matrix("var")
        annotations = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(annotations["n_rows"], 1838)
        self.assertEqual(annotations["n_cols"], 2)
        var_index_col_name = self.data.get_schema()["annotations"]["var"]["index"]
        self.assertEqual(annotations["col_idx"], [var_index_col_name, "n_cells"])
Beispiel #6
0
    def on_start(self):

        self.client.verify = False
        self.dataset = random.choice(DataSets)

        with self.client.get(
            f"{self.dataset}/{API_SUFFIX}/schema", stream=True, catch_response=True
        ) as schema_response:
            if schema_response.status_code == 200:
                self.schema = schema_response.json()["schema"]
            else:
                self.schema = None

        with self.client.get(
            f"{self.dataset}/{API_SUFFIX}/config", stream=True, catch_response=True
        ) as config_response:
            if config_response.status_code == 200:
                self.config = config_response.json()["config"]
            else:
                self.config = None

        with self.client.get(
            f"{self.dataset}/{API_SUFFIX}/annotations/var?annotation-name={self.var_index_name()}",
            headers={"Accept": "application/octet-stream"},
            catch_response=True,
        ) as var_index_response:
            if var_index_response.status_code == 200:
                df = decode_fbs.decode_matrix_FBS(var_index_response.content)
                gene_names_idx = df["col_idx"].index(self.var_index_name())
                self.gene_names = df["columns"][gene_names_idx]
            else:
                self.gene_names = []
Beispiel #7
0
    def test_filtered_data_frame(self):
        filter_ = {
            "filter": {
                "var": {
                    "annotation_value": [{
                        "name": "n_cells",
                        "min": 100
                    }]
                }
            }
        }
        fbs = self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
        data = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(data["n_rows"], 2638)
        self.assertEqual(data["n_cols"], 1040)

        filter_ = {
            "filter": {
                "obs": {
                    "annotation_value": [{
                        "name": "n_counts",
                        "min": 3000
                    }]
                }
            }
        }
        with self.assertRaises(FilterError):
            self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
Beispiel #8
0
 def test_filter_complex(self):
     filter_ = {
         "filter": {"var": {"annotation_value": [{"name": "n_cells", "min": 10}], "index": [1, 99, [200, 300]]}}
     }
     fbs = self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
     data = decode_fbs.decode_matrix_FBS(fbs)
     self.assertEqual(data["n_rows"], 2638)
     self.assertEqual(data["n_cols"], 91)
Beispiel #9
0
    def test_annotation(self):
        annotations = decode_fbs.decode_matrix_FBS(
            self.data.annotation_to_fbs_matrix("obs"))
        obs_index_col_name = self.data.schema["annotations"]["obs"]["index"]
        self.assertEqual(annotations["col_idx"], [
            obs_index_col_name, "n_genes", "percent_mito", "n_counts",
            "louvain"
        ])
        self.assertEqual(annotations["n_rows"], 100)
        self.assertTrue(math.isnan(annotations["columns"][2][0]))

        annotations = decode_fbs.decode_matrix_FBS(
            self.data.annotation_to_fbs_matrix("var"))
        var_index_col_name = self.data.schema["annotations"]["var"]["index"]
        self.assertEqual(annotations["col_idx"],
                         [var_index_col_name, "n_cells", "var_with_nans"])
        self.assertEqual(annotations["n_rows"], 100)
        self.assertTrue(math.isnan(annotations["columns"][2][0]))
Beispiel #10
0
 def test_annotation_var(self):
     endpoint = "annotations/var"
     url = f"{self.url_base}{endpoint}"
     result = self.session.get(url)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"],
                      "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertTrue(math.isnan(df["columns"][2][0]))
Beispiel #11
0
    def test_data_frame(self):
        f1 = {"var": {"index": [[0, 10]]}}
        fbs = self.data.data_frame_to_fbs_matrix(f1, "var")
        data = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(data["n_rows"], 2638)
        self.assertEqual(data["n_cols"], 10)

        with self.assertRaises(ValueError):
            self.data.data_frame_to_fbs_matrix(None, "obs")
Beispiel #12
0
 def test_data(self):
     endpoint = "data/var"
     url = f"{self.url_base}{endpoint}"
     filter = {"filter": {"var": {"index": [[0, 20]]}}}
     result = self.session.put(url, json=filter)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"],
                      "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertTrue(math.isnan(df["columns"][3][3]))
Beispiel #13
0
    def test_layout(self):
        fbs = self.data.layout_to_fbs_matrix(fields=None)
        layout = decode_fbs.decode_matrix_FBS(fbs)
        self.assertEqual(layout["n_cols"], 6)
        self.assertEqual(layout["n_rows"], 2638)

        X = layout["columns"][0]
        self.assertTrue((X >= 0).all() and (X <= 1).all())
        Y = layout["columns"][1]
        self.assertTrue((Y >= 0).all() and (Y <= 1).all())
Beispiel #14
0
 def test_data_put_single_var(self):
     endpoint = "data/var"
     url = f"{self.URL_BASE}{endpoint}"
     header = {"Accept": "application/octet-stream"}
     index_col_name = self.schema["schema"]["annotations"]["var"]["index"]
     var_filter = {"filter": {"var": {"annotation_value": [{"name": index_col_name, "values": ["RER1"]}]}}}
     result = self.session.put(url, headers=header, json=var_filter)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 2638)
     self.assertEqual(df["n_cols"], 1)
Beispiel #15
0
 def test_data_get_unknown_filter_fbs(self):
     index_col_name = self.schema["schema"]["annotations"]["var"]["index"]
     endpoint = "data/var"
     query = f"var:{index_col_name}=UNKNOWN"
     url = f"{self.URL_BASE}{endpoint}?{query}"
     header = {"Accept": "application/octet-stream"}
     result = self.session.get(url, headers=header)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 2638)
     self.assertEqual(df["n_cols"], 0)
Beispiel #16
0
 def fbs_checks(self, fbs, dims, expected_types, expected_column_idx):
     d = decode_fbs.decode_matrix_FBS(fbs)
     self.assertEqual(d["n_rows"], dims[0])
     self.assertEqual(d["n_cols"], dims[1])
     self.assertIsNone(d["row_idx"])
     self.assertEqual(len(d["columns"]), dims[1])
     for i in range(0, len(d["columns"])):
         self.assertEqual(len(d["columns"][i]), dims[0])
         self.assertIsInstance(d["columns"][i], expected_types[i][0])
         if expected_types[i][1] is not None:
             self.assertEqual(d["columns"][i].dtype, expected_types[i][1])
     if expected_column_idx is not None:
         self.assertSetEqual(set(expected_column_idx), set(d["col_idx"]))
Beispiel #17
0
    def test_dataframe(self):
        data_frame_var = decode_fbs.decode_matrix_FBS(
            self.data.data_frame_to_fbs_matrix(None, "var"))
        self.assertIsNotNone(data_frame_var)
        self.assertEqual(data_frame_var["n_rows"], 100)
        self.assertEqual(data_frame_var["n_cols"], 100)
        self.assertTrue(math.isnan(data_frame_var["columns"][3][3]))

        with pytest.raises(FilterError):
            self.data.data_frame_to_fbs_matrix("an erroneous filter", "var")
        with pytest.raises(FilterError):
            filter_ = {"filter": {"obs": {"index": [1, 99, [200, 300]]}}}
            self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
Beispiel #18
0
 def test_get_annotations_var_keys_fbs(self):
     endpoint = "annotations/var"
     query = "annotation-name=n_cells"
     url = f"{self.URL_BASE}{endpoint}?{query}"
     header = {"Accept": "application/octet-stream"}
     result = self.session.get(url, headers=header)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 1838)
     self.assertEqual(df["n_cols"], 1)
     self.assertIsNotNone(df["columns"])
     self.assertIsNone(df["row_idx"])
     self.assertEqual(len(df["columns"]), df["n_cols"])
     self.assertCountEqual(df["col_idx"], ["n_cells"])
Beispiel #19
0
 def test_data_put_filter_fbs(self):
     endpoint = "data/var"
     url = f"{self.URL_BASE}{endpoint}"
     header = {"Accept": "application/octet-stream"}
     filter = {"filter": {"var": {"index": [0, 1, 4]}}}
     result = self.session.put(url, headers=header, json=filter)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 2638)
     self.assertEqual(df["n_cols"], 3)
     self.assertIsNotNone(df["columns"])
     self.assertIsNone(df["row_idx"])
     self.assertEqual(len(df["columns"]), df["n_cols"])
     self.assertListEqual(df["col_idx"].tolist(), [0, 1, 4])
Beispiel #20
0
 def _test_get_user_annotations_obs_keys_fbs(self, annotation_name, columns):
     endpoint = "annotations/obs"
     query = f"annotation-name={annotation_name}"
     url = f"{self.URL_BASE}{endpoint}?{query}"
     header = {"Accept": "application/octet-stream"}
     result = self.session.get(url, headers=header)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 2638)
     self.assertEqual(df["n_cols"], 1)
     self.assertListEqual(df["col_idx"], [annotation_name])
     self.assertEqual(set(df["columns"][0]), columns)
     self.assertIsNone(df["row_idx"])
     self.assertEqual(len(df["columns"]), df["n_cols"])
Beispiel #21
0
 def test_get_layout_fbs(self):
     endpoint = "layout/obs"
     url = f"{self.URL_BASE}{endpoint}"
     header = {"Accept": "application/octet-stream"}
     result = self.session.get(url, headers=header)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 2638)
     self.assertEqual(df["n_cols"], 8)
     self.assertIsNotNone(df["columns"])
     self.assertSetEqual(
         set(df["col_idx"]),
         {"pca_0", "pca_1", "tsne_0", "tsne_1", "umap_0", "umap_1", "draw_graph_fr_0", "draw_graph_fr_1"},
     )
     self.assertIsNone(df["row_idx"])
     self.assertEqual(len(df["columns"]), df["n_cols"])
Beispiel #22
0
 def test_get_annotations_obs_fbs(self):
     endpoint = "annotations/obs"
     url = f"{self.URL_BASE}{endpoint}"
     header = {"Accept": "application/octet-stream"}
     result = self.session.get(url, headers=header)
     self.assertEqual(result.status_code, HTTPStatus.OK)
     self.assertEqual(result.headers["Content-Type"], "application/octet-stream")
     df = decode_fbs.decode_matrix_FBS(result.content)
     self.assertEqual(df["n_rows"], 2638)
     self.assertEqual(df["n_cols"], 6 if self.ANNOTATIONS_ENABLED else 5)
     self.assertIsNotNone(df["columns"])
     self.assertIsNone(df["row_idx"])
     self.assertEqual(len(df["columns"]), df["n_cols"])
     obs_index_col_name = self.schema["schema"]["annotations"]["obs"]["index"]
     self.assertCountEqual(
         df["col_idx"],
         [obs_index_col_name, "n_genes", "percent_mito", "n_counts", "louvain"]
         + (["cluster-test"] if self.ANNOTATIONS_ENABLED else []),
     )
    def test_put_float_data(self):
        # verify that OBS PUTs (annotation_put_fbs) are accessible via
        # GET (annotation_to_fbs_matrix)

        n_rows = self.data.get_shape()[0]

        # verifies that floating point with decimals fail.
        fbs = make_fbs(
            {"cat_F_FAIL": pd.Series([1.1] * n_rows, dtype=np.dtype("float"))})
        with self.assertRaises(ValueError) as exception_context:
            res = self.annotation_put_fbs(fbs)
        self.assertEqual(str(exception_context.exception),
                         "Columns may not have floating point types")

        # verifies that floating point that can be converted to int passes
        fbs = make_fbs(
            {"cat_F_PASS": pd.Series([1.0] * n_rows, dtype="float")})
        res = self.annotation_put_fbs(fbs)
        self.assertEqual(res, json.dumps({"status": "OK"}))

        # check read_labels
        labels = self.annotations.read_labels(None)
        fbsAll = self.data.annotation_to_fbs_matrix("obs", None, labels)
        schema = schema_get_helper(self.data)
        annotations = decode_fbs.decode_matrix_FBS(fbsAll)
        self.assertEqual(annotations["n_rows"], n_rows)
        all_col_schema = {
            c["name"]: c
            for c in schema["annotations"]["obs"]["columns"]
        }
        self.assertEqual(
            all_col_schema["cat_F_PASS"],
            {
                "name": "cat_F_PASS",
                "type": "int32",
                "writable": True
            },
        )
    def test_put_get_roundtrip(self):
        # verify that OBS PUTs (annotation_put_fbs) are accessible via
        # GET (annotation_to_fbs_matrix)

        n_rows = self.data.get_shape()[0]
        fbs = make_fbs({
            "cat_A":
            pd.Series(["label_A"] * n_rows, dtype="category"),
            "cat_B":
            pd.Series(["label_B"] * n_rows, dtype="category"),
        })

        # put
        res = self.annotation_put_fbs(fbs)
        self.assertEqual(res, json.dumps({"status": "OK"}))

        # get
        labels = self.annotations.read_labels(None)
        fbsAll = self.data.annotation_to_fbs_matrix("obs", None, labels)
        schema = schema_get_helper(self.data)
        annotations = decode_fbs.decode_matrix_FBS(fbsAll)
        obs_index_col_name = schema["annotations"]["obs"]["index"]
        self.assertEqual(annotations["n_rows"], n_rows)
        self.assertEqual(annotations["n_cols"], 7)
        self.assertIsNone(annotations["row_idx"])
        self.assertEqual(
            annotations["col_idx"],
            [
                obs_index_col_name, "n_genes", "percent_mito", "n_counts",
                "louvain", "cat_A", "cat_B"
            ],
        )
        col_idx = annotations["col_idx"]
        self.assertEqual(annotations["columns"][col_idx.index("cat_A")],
                         ["label_A"] * n_rows)
        self.assertEqual(annotations["columns"][col_idx.index("cat_B")],
                         ["label_B"] * n_rows)

        # verify the schema was updated
        all_col_schema = {
            c["name"]: c
            for c in schema["annotations"]["obs"]["columns"]
        }
        self.assertEqual(
            all_col_schema["cat_A"],
            {
                "name": "cat_A",
                "type": "categorical",
                "categories": ["label_A"],
                "writable": True
            },
        )
        self.assertEqual(
            all_col_schema["cat_B"],
            {
                "name": "cat_B",
                "type": "categorical",
                "categories": ["label_B"],
                "writable": True
            },
        )
Beispiel #25
0
 def test_filter_idx(self):
     filter_ = {"filter": {"var": {"index": [1, 99, [200, 300]]}}}
     fbs = self.data.data_frame_to_fbs_matrix(filter_["filter"], "var")
     data = decode_fbs.decode_matrix_FBS(fbs)
     self.assertEqual(data["n_rows"], 2638)
     self.assertEqual(data["n_cols"], 102)
Beispiel #26
0
 def test_dataframe_obs_not_implemented(self):
     with self.assertRaises(ValueError) as cm:
         decode_fbs.decode_matrix_FBS(
             self.data.data_frame_to_fbs_matrix(None, "obs"))
     self.assertIsNotNone(cm.exception)