Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# Changelog

## Version 0.6.0
## Version 0.6.0 - 0.6.2

- Changed related to SummarizedExperiment and implementation of `CompressedGenomicRangesList` in the genomic ranges package.
- Update versions of relevant dependency packages.
- Rename `reduced_dims` to `reduced_dimensions`.
- Implement coercions to/from RSE/SE.

## Version 0.5.8 - 0.5.9

Expand Down
81 changes: 81 additions & 0 deletions src/singlecellexperiment/SingleCellExperiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import biocframe
import biocutils as ut
from summarizedexperiment import SummarizedExperiment
from summarizedexperiment._combineutils import (
check_assays_are_equal,
merge_assays,
Expand Down Expand Up @@ -1277,6 +1278,86 @@ def combine_columns(self, *other) -> SingleCellExperiment:
"""Wrapper around :py:func:`~combine_columns`."""
return combine_columns(self, *other)

#######################
######>> to rse <<#####
#######################

def to_rangedsummarizedexperiment(self) -> RangedSummarizedExperiment:
"""Coerce to :py:class:`~summarizedexperiment.RangedSummarizedExperiment.RangedSummarizedExperiment`.

Returns:
A ``RangedSummarizedExperiment`` object.
"""
return RangedSummarizedExperiment(
assays=self._assays,
row_ranges=self._row_ranges,
row_data=self._rows,
column_data=self._cols,
row_names=self._row_names,
column_names=self._column_names,
metadata=self._metadata,
_validate=False,
)

def to_rse(self) -> RangedSummarizedExperiment:
"""Alias for :py:meth:`~to_rangedsummarizedexperiment`."""
return self.to_rangedsummarizedexperiment()

@classmethod
def from_rangedsummarizedexperiment(cls, rse: RangedSummarizedExperiment) -> SingleCellExperiment:
"""Coerce from :py:class:`~summarizedexperiment.RangedSummarizedExperiment.RangedSummarizedExperiment`.

Args:
rse:
A ``RangedSummarizedExperiment`` object.

Returns:
A ``SingleCellExperiment`` object.
"""
return cls(
assays=rse.assays,
row_ranges=rse.row_ranges,
row_data=rse.row_data,
column_data=rse.col_data,
row_names=rse.row_names,
column_names=rse.column_names,
metadata=rse.metadata,
)

@classmethod
def from_rse(cls, rse: RangedSummarizedExperiment) -> SingleCellExperiment:
"""Alias for :py:meth:`~from_rangedsummarizedexperiment`."""
return cls.from_rangedsummarizedexperiment(rse)

########################
######>> from se <<#####
########################

@classmethod
def from_summarizedexperiment(cls, se: SummarizedExperiment) -> SingleCellExperiment:
"""Coerce from :py:class:`~summarizedexperiment.SummarizedExperiment.SummarizedExperiment`.

Args:
se:
A ``SummarizedExperiment`` object.

Returns:
A ``SingleCellExperiment`` object.
"""
return cls(
assays=se.assays,
row_data=se.row_data,
column_data=se.col_data,
row_names=se.row_names,
column_names=se.column_names,
metadata=se.metadata,
)

@classmethod
def from_se(cls, se: SummarizedExperiment) -> SingleCellExperiment:
"""Alias for :py:meth:`~from_summarizedexperiment`."""
return cls.from_summarizedexperiment(se)


############################
######>> combine ops <<#####
Expand Down
44 changes: 43 additions & 1 deletion tests/test_sce_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import numpy as np
import pandas as pd
import pytest
from summarizedexperiment import SummarizedExperiment
from summarizedexperiment import SummarizedExperiment, RangedSummarizedExperiment

from singlecellexperiment import SingleCellExperiment
from singlecellexperiment.SingleCellExperiment import SingleCellExperiment as sce
Expand Down Expand Up @@ -90,3 +90,45 @@ def test_SCE_props():

assert tse.reduced_dim_names is not None
assert len(tse.reduced_dim_names) == 1

def test_SCE_to_RSE():
tse = SingleCellExperiment(
assays={"counts": counts}, row_data=row_data, column_data=col_data, row_ranges=gr
)

rse = tse.to_rangedsummarizedexperiment()
assert isinstance(rse, RangedSummarizedExperiment)
assert not isinstance(rse, SingleCellExperiment)
assert rse.shape == tse.shape
assert rse.row_ranges is not None

def test_RSE_to_SCE():
rse = RangedSummarizedExperiment(
assays={"counts": counts}, row_data=row_data, column_data=col_data, row_ranges=gr
)

tse = SingleCellExperiment.from_rangedsummarizedexperiment(rse)
assert isinstance(tse, SingleCellExperiment)
assert tse.shape == rse.shape
assert tse.row_ranges is not None

def test_SCE_to_SE():
tse = SingleCellExperiment(
assays={"counts": counts}, row_data=row_data, column_data=col_data, row_ranges=gr
)

se = tse.to_summarizedexperiment()
assert isinstance(se, SummarizedExperiment)
assert not isinstance(se, SingleCellExperiment)
assert se.shape == tse.shape
assert se.row_data is not None
assert "seqnames" in se.row_data.column_names

def test_SE_to_SCE():
se = SummarizedExperiment(
assays={"counts": counts}, row_data=row_data, column_data=col_data
)

tse = SingleCellExperiment.from_summarizedexperiment(se)
assert isinstance(tse, SingleCellExperiment)
assert tse.shape == se.shape