Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add function to export spatialdata to legacy anndata format - #102

Merged
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata
Mar 20, 2024
Merged

Add function to export spatialdata to legacy anndata format#102
LucaMarconato merged 30 commits into
mainfrom
feat/to_legacy_anndata

Conversation

@grst

@grstgrst commented Jan 25, 2024

Copy link
Copy Markdown
Contributor

@codecov-commenter

codecov-commenter commented Jan 25, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 53.19149% with 66 lines in your changes are missing coverage. Please review.

Project coverage is 37.13%. Comparing base (d58382b) to head (3a4f87a).

Additional details and impacted files
@@ Coverage Diff @@## main #102 +/- ##
==========================================
+ Coverage 35.27% 37.13% +1.85% 
==========================================
Files 16 18 +2 Lines 1219 1360 +141 ==========================================
+ Hits 430 505 +75 - Misses 789 855 +66 
FilesCoverage Δ
src/spatialdata_io/experimental/__init__.py100.00% <100.00%> (ø)
src/spatialdata_io/converters/legacy_anndata.py52.51% <52.51%> (ø)

@grst

grst commented Jan 25, 2024

Copy link
Copy Markdown
ContributorAuthor

should I be adding tests anywhere?

@LucaMarconato

LucaMarconato commented Jan 25, 2024

Copy link
Copy Markdown
Member

Thank you @grst for the PR. I am adding a from_legacy_anndata() function so that I can setup some tests of bidirectional conversion on artificial data.

One note on your implementation. I see that the code assumes that adata.uns is populated with dataset information. This is generally not the case, so I was thinking on generalizing your function, especially for the non-Visium case. I would change the signature by adding a new coordinate_system parameter. I explain how the implementation will change in the docstring below:

defto_legacy_anndata(sdata: SpatialData, coordinate_system: str|None=None) ->AnnData:
""" Convert a SpatialData object to a (legacy) spatial AnnData object. This is useful for using packages expecting spatial information in AnnData, for example Scanpy and older versions of Squidpy. Using this format for any new package is not recommended. Parameters ---------- sdata SpatialData object coordinate_system The coordinate system to consider. The AnnData object will be populated with the data aligned to this coordinate system. Returns ------- The legacy spatial AnnData object Notes ----- Limitations and edge cases: - The Table can only annotate Shapes, not Labels. If labels are needed, please manually compute the centroids, approximate radii from the Labels areas, add this as a Shapes element to the SpatialData object and make the table annotate the Shapes element. - The Table cannot annotate more than one Shapes element. If more than one Shapes element are present, please merge them into a single Shapes element and make the table annotate the new Shapes element. - Table rows not annotating geometries in the coordinate system will be dropped. Similarly, Shapes rows not annotated by Table rows will be dropped. How resolutions, coordinates, indices and Table rows will be affected: - The Images will be scaled (see later) and will not maintain the original resolution. - The Shapes centroids will change iff their transformation is not an Identity. - The Table and Shapes rows will have the same indices but, as mentioned above, some rows may be dropped. The AnnData object does support only low-resolution images and limited coordinate transformations; eventual transformations are applied before conversion. Precisely, this is how the Images are prepared for the AnnData object: - For each Image aligned to the specified coordinate system, the coordinate transformation to the coordinate system is applied; all the Images are rendered to a common target bounding box, which is the bounding box of the union of the Images aligned to the target coordinate system. - Practically the above implies that if the Images have very dissimilar locations, most the rendered Images will have empty spaces. - Each Image is downscaled during rendering to fit a 2000x2000 pixels image (downscaled_hires) and a 600x600 pixels image (downscaled_lowres). """pass

What do you think about this? If you agree on the above I will continue your PR and proceed with the implementation.

@LucaMarconato

Copy link
Copy Markdown
Member

Actually I realized that even if the legacy AnnData is a format that we don't aim to support and we don't encourage, the conversion functions and the tests would be similar to the ones that would be required for supporting bidirectional conversion to emObject and voyager-py objects. Therefore I am going to put more time into this and prepare exhaustive tests.

I won't have time tomorrow, I will get back on ~monday.

@grst

grst commented Jan 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Sounds good, I'm just wondering how generalizable this function needs to be. Has the "legacy AnnData" format been used for anything but visium?

@LucaMarconato

Copy link
Copy Markdown
Member

Yes it has been for many techs, for instance in the legacy squidpy datasets and with SODB. Anyway I'll try to not overgeneralize: I want to lay down some foundations for eventual converters for other libraries but I'll still keep it focused on the legacy anndata.

@LucaMarconato
LucaMarconato marked this pull request as draft February 13, 2024 15:13
@LucaMarconatoLucaMarconato linked an issue Mar 18, 2024 that may be closed by this pull request
@LucaMarconato
LucaMarconato marked this pull request as ready for review March 18, 2024 18:36
@LucaMarconato

LucaMarconato commented Mar 18, 2024

Copy link
Copy Markdown
Member

I finally finalized this, ready for review 😊

An example of the converter functions in action is in this notebook (updated version of the "squidpy interoperability" notebook in the docs): https://github.com/scverse/spatialdata-notebooks/blob/improve/docs/notebooks/examples/squidpy_integration.ipynb.

Some notes:

  • The function is under the submodule experimental
  • One of the cells fail because of a PR in spatialdata-plot not being merged yet, but the example is valid anyway, and the PR will be ready soon
  • The tests are failing because we need to cut a release in spatialdata, but they pass locally
  • Not sure what's wrong with the docs, if anybody can have a look please go ahead; otherwise I will try later on when the tests pass.

Comment on lines +1 to +6
from spatialdata_io.converters.legacy_anndata import (
from_legacy_anndata,
to_legacy_anndata,
)

__all__ = ["from_legacy_anndata", "to_legacy_anndata"]

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this necessary for a package with version number 0.0.x?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. The reason why we put experimental (which we use also here: #75) is because we are not super sure about the need/utility of the code and because we would like to get more feedback from the users before adjusting things to a "definitive version" or dropping the support.

@LucaMarconatoLucaMarconatoMar 18, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Therefore even if the 0.0.x indicates that the library is still, in a way, work in progress, I would still mark those parts of the code as experimental to suggest extra care/expect that things may not work.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I would probably argue that you should be 0.x since some time ;) Actually, the semver spec even suggest to start at 0.1.0.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, another good point 😁 We actually want to release a 0.1.0 this week, so we'll fix that!

@LucaMarconato

Copy link
Copy Markdown
Member

I think I fixed the problem with the docs. Now all the errors (docs and tests) are due to the lack of a release in spatialdata.

@LucaMarconato

Copy link
Copy Markdown
Member

I made a pre-release in spatialdata and changed the CI configuration to run the tests and build the docs against the latest pre-release. Now all the checks pass.

I will merge already because the code is marked as experimental; happy to eventually reiterate on this.

@LucaMarconato
LucaMarconato merged commit 8b6c01c into mainMar 20, 2024
@LucaMarconato
LucaMarconato deleted the feat/to_legacy_anndata branch March 20, 2024 13:10
lucas-diedrich pushed a commit to lucas-diedrich/spatialdata-io that referenced this pull request Nov 26, 2024
Add function to export spatialdata to legacy anndata format
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

anndata2spatialdata conversion

3 participants

@grst@codecov-commenter@LucaMarconato