Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement a registry for cellfinder test data #1

Closed
wants to merge 4 commits into from
Closed
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
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,12 @@ See [our blog posts](https://brainglobe.info/blog/) for more information on the
If you have encountered a bug whilst using cellfinder, please [open an issue on GitHub](https://github.com/brainglobe/cellfinder/issues).

If you are interested in contributing to cellfinder (thank you!) - please head over to our [developer documentation](https://brainglobe.info/community/developers/index.html).

## Citation
If you find this package useful, and use it in your research, please cite the following paper:
> Tyson, A. L., Rousseau, C. V., Niedworok, C. J., Keshavarzi, S., Tsitoura, C., Cossell, L., Strom, M. and Margrie, T. W. (2021) “A deep learning algorithm for 3D cell detection in whole mouse brain image datasets’ PLOS Computational Biology, 17(5), e1009074
[https://doi.org/10.1371/journal.pcbi.1009074](https://doi.org/10.1371/journal.pcbi.1009074)

**If you use this, or any other tools in the brainglobe suite, please
[let us know](https://brainglobe.info/contact.html), and
we'd be happy to promote your paper/talk etc.**
16 changes: 11 additions & 5 deletions cellfinder/core/detect/filters/volume/structure_splitting.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ def ball_filter_imgs(
good_tiles_mask = np.ones((1, 1, volume.shape[2]), dtype=np.bool_)

plane_width, plane_height = volume.shape[:2]
current_z = ball_z_size // 2

bf = BallFilter(
plane_width,
Expand All @@ -86,9 +87,7 @@ def ball_filter_imgs(
threshold_value=threshold_value,
soma_centre_value=soma_centre_value,
)
cell_detector = CellDetector(
plane_width, plane_height, start_z=ball_z_size // 2
)
cell_detector = CellDetector(plane_width, plane_height, start_z=current_z)

# FIXME: hard coded type
ball_filtered_volume = np.zeros(volume.shape, dtype=np.uint32)
Expand All @@ -98,7 +97,11 @@ def ball_filter_imgs(
if bf.ready:
bf.walk()
middle_plane = bf.get_middle_plane()
ball_filtered_volume[:, :, z] = middle_plane[:]

# first valid middle plane is the current_z, not z
ball_filtered_volume[:, :, current_z] = middle_plane[:]
current_z += 1

# DEBUG: TEST: transpose
previous_plane = cell_detector.process(
middle_plane.copy(), previous_plane
Expand Down Expand Up @@ -134,7 +137,10 @@ def iterative_ball_filter(
vol, cell_centres = ball_filter_imgs(
vol, threshold_value, soma_centre_value
)
vol -= 1

# vol is unsigned, so can't let zeros underflow to max value
vol[:, :, :] = np.where(vol != 0, vol - 1, 0)

n_structures = len(cell_centres)
ns.append(n_structures)
centres.append(cell_centres)
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ cellfinder = "cellfinder.napari:napari.yaml"
dev = [
"black",
"pre-commit",
"pooch >=1",
"pyinstrument",
"pytest-cov",
"pytest-mock",
Expand Down
62 changes: 62 additions & 0 deletions tests/core/conftest.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import os
from pathlib import Path
from typing import Tuple

import numpy as np
import pooch
import pytest
import torch.backends.mps
from skimage.filters import gaussian
Expand Down Expand Up @@ -85,3 +87,63 @@ def synthetic_bright_spots() -> Tuple[np.ndarray, np.ndarray]:
background_array = np.zeros_like(signal_array)

return signal_array, background_array


@pytest.fixture
def test_data_registry():
"""
Create a test data registry for BrainGlobe.

Returns:
pooch.Pooch: The test data registry object.

"""
registry = pooch.create(
pooch.os_cache("brainglobe_test_data"),
base_url="https://gin.g-node.org/BrainGlobe/test-data/raw/master/",
env="BRAINGLOBE_TEST_DATA_DIR",
)
registry.load_registry(Path(__file__).parent / "registry.txt")
return registry


@pytest.fixture
def fetch_pooch_directory():
"""
Fetches files from the Pooch registry that belong to a specific directory.

Parameters:
registry (pooch.Pooch): The Pooch registry object.
directory_name (str):
The remote relative path of the directory to fetch files from.
processor (callable, optional):
A function to process the fetched files. Defaults to None.
downloader (callable, optional):
A function to download the files. Defaults to None.
progressbar (bool, optional):
Whether to display a progress bar during the fetch.
Defaults to False.

Returns:
str: The local absolute path to the fetched directory.
"""

def _fetch_pooch_registry(
registry: pooch.Pooch,
directory_name: str,
processor=None,
downloader=None,
progressbar=False,
):
for name in registry.registry_files:
if name.startswith(f"{directory_name}/"):
registry.fetch(
name,
processor=processor,
downloader=downloader,
progressbar=progressbar,
)

return str(registry.abspath / directory_name)

return _fetch_pooch_registry
131 changes: 131 additions & 0 deletions tests/core/registry.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
bright_brain/2d_filter/signal0001.tif f2cf4bb55ba9a57e99a01baf98830668cbbb1634619fc59c7d1e34dd1974b217
bright_brain/2d_filter/signal0002.tif 7291fecc69430a746cde85248958b037c95d5f0c278900c6b4f2eb48447d8ec0
bright_brain/2d_filter/signal0003.tif dec11106fcce6c19e3da8665614367bfca1499af1c805f7efa2fdefa31c55464
bright_brain/2d_filter/signal0004.tif 2f03d5dbbfe9634847a82dbb2495777b127fcb7f385735fb8e2116ae0052a53f
bright_brain/2d_filter/signal0005.tif 2fa6ed1d094560f3becb987c9eef847a1c95dc0f8b791c2ec7b5a7944207dd95
bright_brain/3d_filter/plane_0002.tif ae8427a59696e5a35ae40d1b0998c4c4c478fbe46800c89f09b4556614ec0b3a
bright_brain/3d_filter/plane_0003.tif d4a0e82b5e95b77c3b9d760591969ec99c5ac9ce7d835ea054c120a69a29fc56
bright_brain/3d_filter/plane_0004.tif 312243944133fb8a58b86ea6ee762229582372c01b7c5c1761d56ef017856b15
bright_brain/detected_cells.xml c13a4609d3b1f44c84d58e5f56610333769424bb07c87b23e8c5c62908045274
bright_brain/info.txt 753533da65bf47c01791378c04972d4394061fbd8724d32b292a5d6bb1eedbf8
bright_brain/peak_enhanced/signal0001.tif cf5008afd80ef665ae5f56798440c7e377936dbed83bcfa8989329f8eb9a1ff7
bright_brain/peak_enhanced/signal0002.tif dc083752c40280d0fb05dbc384f25c5a1458f377f73cc5aeaaf86aa9b3fa50fc
bright_brain/peak_enhanced/signal0003.tif a11708ce790b22d7abf2685d26a6a681fbf5acc9544902bf02da281e48d30d07
bright_brain/peak_enhanced/signal0004.tif b1f12d130e8b429f4932d2d2ab2331944623daa15f4a2c3388dc341d1b26f881
bright_brain/peak_enhanced/signal0005.tif 36a2c7136440ee0df0f76ff0385e869223cda94d1d1dfc156aa7bb5e59227397
bright_brain/signal/signal0001.tif 1db2af2d72f62afe09ea99f682006bfee2814cf4bd83259f80428f0742d14f91
bright_brain/signal/signal0002.tif 00d97024f67ca3dc455f7945f82520ceb991922c33f26318674a834a521b9960
bright_brain/signal/signal0003.tif 31e2c7a93226d6e5077ca25a4da8c64065e4f8a330e15b7b771780f661b5c5dc
bright_brain/signal/signal0004.tif a51660160329ecb63c0f4ddc28cf513c33a63de4d1a55b2212e49e57e1679cb0
bright_brain/signal/signal0005.tif 16861fde570c2f8fc93447e1a43c911a0d126b4ed458d0a5ef1e52845ec23e0c
bright_brain/tiles/signal0001.tif d76dba3ac06272bb29ac507fdf059ff6c7308ce04de77f621b09fc16753d71f0
bright_brain/tiles/signal0002.tif d76dba3ac06272bb29ac507fdf059ff6c7308ce04de77f621b09fc16753d71f0
bright_brain/tiles/signal0003.tif d76dba3ac06272bb29ac507fdf059ff6c7308ce04de77f621b09fc16753d71f0
bright_brain/tiles/signal0004.tif d76dba3ac06272bb29ac507fdf059ff6c7308ce04de77f621b09fc16753d71f0
bright_brain/tiles/signal0005.tif 609627eefd5f46e6034a2839663dcf5eabdddc5b921982f0f4feffaddb510694
cellfinder-test-data.zip b0ef53b1530e4fa3128fcc0a752d0751909eab129d701f384fc0ea5f138c5914
edge_cells_brain/2d_filter/signal0000.tif 4803df36346838928c2cc9afa5041cdc7f57fcac21eda55e1c3bd2f70761bd8d
edge_cells_brain/2d_filter/signal0001.tif 39a008a23e3b91e10b0dd327a229550c85260cf57fd627a758877c668dd65cba
edge_cells_brain/2d_filter/signal0002.tif 501a706b007872353b9a638b952c4499e4b7e41a421092d33b99f3ad37432eff
edge_cells_brain/2d_filter/signal0003.tif 8c3f3ada6f6d7c108f778e8a0805a9d93dbd396d28b1e8a935a701b35e3797ef
edge_cells_brain/2d_filter/signal0004.tif 81d203c47e2e1752620cc80d79047683a5a3947973b840f4afef56ec77f5e61d
edge_cells_brain/2d_filter/signal0005.tif be0759a6601155d09f1698a67cb8b1c590a1deb51c9ece2d2fe52e9ff1eb2194
edge_cells_brain/2d_filter/signal0006.tif 41acc77bbe3b4eb3379746939f659d6ec5b7b36f5cc9970427a9cc0cd59c2e25
edge_cells_brain/2d_filter/signal0007.tif d8516e2a5c59b950536166525e9cefe2be81ed54527f92e9bf269431f471532a
edge_cells_brain/2d_filter/signal0008.tif d59a4ac8275882fbb8b1947a07ae45716616302e35cdeb731529d1a8f521c298
edge_cells_brain/2d_filter/signal0009.tif 2715c53774793b395cd1ee340eb3438617414d769c5f1e293fd5698588125960
edge_cells_brain/2d_filter/signal0010.tif 525b30be7f86ae957c8e2edae1ecc958c869d21979c8452455356020df112523
edge_cells_brain/2d_filter/signal0011.tif 83a808ac1be98329a3767213f3a4396721a33aa13cef252bfa8906b496173101
edge_cells_brain/2d_filter/signal0012.tif 110042dfedbc8f0189ff1e9a04a5e01ae1cc4d5a0d593dc4884bdd4a7c1dbdaa
edge_cells_brain/2d_filter/signal0013.tif c71930b8e6ed5d52b0c3699553faf75da728e343f766da174ee15057ff531e43
edge_cells_brain/2d_filter/signal0014.tif d4b20626c940a35f5995be0b5ad36557634df3af947db10a24843ff325f94d1b
edge_cells_brain/2d_filter/signal0015.tif 1f6ed840d97320421cb9cb9e48487126e428cca4135036642292f9b6572d98b8
edge_cells_brain/2d_filter/signal0016.tif 6e975a52d7eb282ecffa7e0ed90d6c814347b6be2fde77842f80da97d1ede01c
edge_cells_brain/2d_filter/signal0017.tif 4f3ef278746323db7cf585b4c40fead0925ce7a193af6a10ed84e330a9fd16a0
edge_cells_brain/2d_filter/signal0018.tif f07233fe5134dff9f9935f3335b847aa1bd83e44ab379e45a48906fa4c1c7403
edge_cells_brain/2d_filter/signal0019.tif c581dc2533e01f1e1c8d937c364f37c67af83ab3f85efb02eb9b1150a2e591dd
edge_cells_brain/2d_filter/signal0020.tif 25224c7965908fa3a6229f15ff0f79db4e76e4e50d50b3813830f844a11fa529
edge_cells_brain/3d_filter/plane_0002.tif 26a15013be4b4120a045da6209f384dc9551a11b2726c9f702cbf6ef1046f3d5
edge_cells_brain/3d_filter/plane_0003.tif 0fd764081ea03d6a24a9ff167c6f5c648612914c4f9451a8d5be246704d9dcce
edge_cells_brain/3d_filter/plane_0004.tif 6d09059ac4b4b67d02143223cb88b25925433a9bf9feea01826979cc697555a8
edge_cells_brain/3d_filter/plane_0005.tif 3f71392ca5ee4c4f1164f8220ede6ffb1f6c15fa611e7ab258825929d9574601
edge_cells_brain/3d_filter/plane_0006.tif 518320cd8b56a9f88adb647614672e8d02824125e89355facc49e6a98353bd8c
edge_cells_brain/3d_filter/plane_0007.tif e0184c6791393856a6bb2c4955891992db2f66d6c82ceaf0b1ba63511363a195
edge_cells_brain/3d_filter/plane_0008.tif 05eca0b171879e6e837325d299b98d6cac7c2134cd456b85dbc7ba64e51d5ee7
edge_cells_brain/3d_filter/plane_0009.tif 25c398550efc467b82e89ecca8e8188082c0dbfca3e630d47b4e7a8f9cf77141
edge_cells_brain/3d_filter/plane_0010.tif 9b02d5a99544245c5367e5f54a0daafd3f55be43bb66220903c6b6766144070f
edge_cells_brain/3d_filter/plane_0011.tif 820b6064971a73ab5c346dda0710cf665ad87d9caf75a4d00440da56a0390e93
edge_cells_brain/3d_filter/plane_0012.tif de1633ab4807bf61370d4ef7ff13d6cd73c8241030396013f977371a9291ade3
edge_cells_brain/3d_filter/plane_0013.tif 819003634068868c17e6b9cca71a82607047e0e7aab01c4c61fa63df7355d7db
edge_cells_brain/3d_filter/plane_0014.tif deae555248b8b03c6b7b1cd2b02213f13255645e83737decf9a920bae30d1508
edge_cells_brain/3d_filter/plane_0015.tif 063e8370dfdf80202a052d370d86357b6f07e263139f1f9cb115968d96ca1e76
edge_cells_brain/3d_filter/plane_0016.tif dead984c00ef4d14582b125797d2743ce774eec46242e855a58342820e47063e
edge_cells_brain/3d_filter/plane_0017.tif d890497d0349c51379add2b188bded46ef528c56e016131da257fead119681ab
edge_cells_brain/3d_filter/plane_0018.tif d75f0a2e767dfa46f0d2cc3f63c367391eac47b3076427bce688b39305d20387
edge_cells_brain/3d_filter/plane_0019.tif e7ee64795b3f07c4cff4f8a2700ba0c1055604ce50039fe0590c900c6ece43b8
edge_cells_brain/3d_filter/plane_0020.tif 7f94a93aa45877be81732c5be4f4d1d67bb1d4059bb6de833d60c146be621efc
edge_cells_brain/detected_cells.xml 623df13b2ea1370713ab261d82691bb1d551a2fcc56645c87262e5276a27bee1
edge_cells_brain/info.txt 779b34aae0ef50fad814e86409ee48839b2970c63eb5124548cfbc46126157fe
edge_cells_brain/peak_enhanced/signal0000.tif 11dc924b3f30def59f6ca0b31a428a8cb454c163f4e6417d620659028ac544d9
edge_cells_brain/peak_enhanced/signal0001.tif ac3605624094838c229f2d4ca2af9df9df17ba742b11d7ca684c42ce8e49557e
edge_cells_brain/peak_enhanced/signal0002.tif a7759610b69fd0e9d023231488038482d8e810b9f4c096374ea267d2b7e2c5e7
edge_cells_brain/peak_enhanced/signal0003.tif 25d712b49e7d97368c9f924876c23b132c0b0902f899ad5150c0b4bfe24d591b
edge_cells_brain/peak_enhanced/signal0004.tif e8607d850649ccd68d8bcd0af12c9cfb98f191bb5c092b81ed9b6c87837b986e
edge_cells_brain/peak_enhanced/signal0005.tif eff9cefc56c34f4307b9c94af90bcd6e41ef03d45855018eef9e40ab0bbdf116
edge_cells_brain/peak_enhanced/signal0006.tif e5a058f759640b198069526772f972b9db0fb77d5502b5473a573d2f1a8fb746
edge_cells_brain/peak_enhanced/signal0007.tif 44f7a1658c8c61f8e5b680ebb03d1f50779f0f22cf0066fb1b938764cd7353c2
edge_cells_brain/peak_enhanced/signal0008.tif 5439cfeb6a6f17e6231bb532791a4d37c9fa00ea1c32b78184e8708938adf233
edge_cells_brain/peak_enhanced/signal0009.tif 46c460f41e2ead3d694c9646ed4c21e6db57cae4fc3fd1fd4d411385877fdec7
edge_cells_brain/peak_enhanced/signal0010.tif 0e74e27ef728f1c7b6db97172df8961917d9dba8c87cef045b7f2f523eec4da2
edge_cells_brain/peak_enhanced/signal0011.tif 97495a61cfabec5df5a144305b394c306d56063307a911c7024d1b8e40089663
edge_cells_brain/peak_enhanced/signal0012.tif 9809f14393cae19d7815c16370265e318ab13ea5188e075b73295a4968f071b5
edge_cells_brain/peak_enhanced/signal0013.tif 136b1dd0b90be087fe87c1cf0caef02f136d54dc642aa91fc03a96944a113a0b
edge_cells_brain/peak_enhanced/signal0014.tif a74e9bed032952209bdffdd9c351dff8f0bb46b4272999dd14822c254e824f2c
edge_cells_brain/peak_enhanced/signal0015.tif eb675b9cabf241b2209473e62d84011349a997677a7e32b1d4a59b9f95229364
edge_cells_brain/peak_enhanced/signal0016.tif 0df886c3fb7cc9a9dcd0c5803629ccd57125e5c9c574bca7445222cbb14d9be7
edge_cells_brain/peak_enhanced/signal0017.tif 675125f17b0a4784aa5f56240abad9c155831f8fa3be0c6be13bd29cd1323a90
edge_cells_brain/peak_enhanced/signal0018.tif be3df5edb2280eb69e05e94d7864d36635e929744667ae10e608f33b02f4363d
edge_cells_brain/peak_enhanced/signal0019.tif 90ea965719aa7ad0f4a6480ab1e860d58ddc1a6bd6441365f6edf6f1e76edfab
edge_cells_brain/peak_enhanced/signal0020.tif 7ba5bae6b3b8845cbbe0726da8d28138702e681167f6a99d050b063c4a271a23
edge_cells_brain/signal/signal0000.tif 8214694de0e41dc6f9a456cc335cff60091129ebe700a1fe6f3a38ebbb02cc28
edge_cells_brain/signal/signal0001.tif 6b7dec437f06c7a66f70d2c16dc8d5ec0f039a11b68a458e216574d281238d88
edge_cells_brain/signal/signal0002.tif 4ebf6e8b96a970a64816210f9270fb19f5055cfe7fe6b2c3debd78485853c4b3
edge_cells_brain/signal/signal0003.tif 920e5b95386d01766b94b357eb7e2906d2c6f1d27eee4e4765edb7455adcf91c
edge_cells_brain/signal/signal0004.tif 90b84ea67c92d086f993588649dd6570a2baa46de6ceaf5aa64213673c922bbd
edge_cells_brain/signal/signal0005.tif a6072c68f0636f4f7a34ada3ff3fad43105d2c7dbcf831aca6662a8b358a4d90
edge_cells_brain/signal/signal0006.tif 87773e1f7bbbfad1324e5f83214e7339119b2e9b244a34d18f5f4211fd25978e
edge_cells_brain/signal/signal0007.tif 2a91b8ba0128314753542a7890438b0805b039c3b74de80f8d967e4aa45f31e3
edge_cells_brain/signal/signal0008.tif e2883d175bebc48f1cf7a82690f709d379715e471ccab740205040a203c3e88e
edge_cells_brain/signal/signal0009.tif 854398ddc2de9f1f43256f935bb4bb2d3b36726ed615fedc045050adb618dda2
edge_cells_brain/signal/signal0010.tif 8ccb209331784fe4aa8f43eb3174e68fee8abdc0d29acbb388ddf9b8236d8a31
edge_cells_brain/signal/signal0011.tif 883722f089d5318881a2767ca4717857e52ccf0005e4535e09ed24de9ab9f73b
edge_cells_brain/signal/signal0012.tif 127d14bb8e1f7a721d23f02f05d949345d78a1471e41270c8ad0cf012454fb95
edge_cells_brain/signal/signal0013.tif b4cd368115d17048c81934dcb310e43663cc43ea14535516e75496e4622cee1d
edge_cells_brain/signal/signal0014.tif 28c9d9dc3db609d48c69271f3755bcc5fbe3b870a8939b2c4685e7d8f3dfa8dd
edge_cells_brain/signal/signal0015.tif 2388045546ed504281a190eddbe1a362d0f4f5803cc4cd3bac92a8e10ee5c7d6
edge_cells_brain/signal/signal0016.tif 96f834737b8be786db9aca7edbdbae04d11c8f6c4deea51616a8567f39d1d03b
edge_cells_brain/signal/signal0017.tif e79d979915c85598d1fc64e9d19c5a22f575a8c0ab7ae402f9da070027a19af9
edge_cells_brain/signal/signal0018.tif af5d97c6365694fcff26bb04a37bab2c008b6d3ccacaaedf17ce4d003b289aec
edge_cells_brain/signal/signal0019.tif bb798c254f2627e26ec53b110ad572e0494eddb06ce79d48de7267cb6e629f89
edge_cells_brain/signal/signal0020.tif edcc27ab82449b3d11202a8866096e885bacab2dd63471fdb8e142293a9a99e8
edge_cells_brain/tiles/signal0000.tif ea8bd86e6c8ee62e7de84a1f6792ba7d2174d3dffe9d1b578fbbde9c71dacc8c
edge_cells_brain/tiles/signal0001.tif aa757c580996cd69264617ce3b2b7ac0a1173bac78fe5c5bdfbd7e61f633a764
edge_cells_brain/tiles/signal0002.tif ea8bd86e6c8ee62e7de84a1f6792ba7d2174d3dffe9d1b578fbbde9c71dacc8c
edge_cells_brain/tiles/signal0003.tif aa757c580996cd69264617ce3b2b7ac0a1173bac78fe5c5bdfbd7e61f633a764
edge_cells_brain/tiles/signal0004.tif e0aaa58adcf0f13402494ce34112f7b937bf9421a1e0064856f57946e0267a02
edge_cells_brain/tiles/signal0005.tif e0aaa58adcf0f13402494ce34112f7b937bf9421a1e0064856f57946e0267a02
edge_cells_brain/tiles/signal0006.tif e0aaa58adcf0f13402494ce34112f7b937bf9421a1e0064856f57946e0267a02
edge_cells_brain/tiles/signal0007.tif f382330f73c2625e84bc36a3faee169a074ed8e59db836fcbbd236061f3888b4
edge_cells_brain/tiles/signal0008.tif e0aaa58adcf0f13402494ce34112f7b937bf9421a1e0064856f57946e0267a02
edge_cells_brain/tiles/signal0009.tif e0aaa58adcf0f13402494ce34112f7b937bf9421a1e0064856f57946e0267a02
edge_cells_brain/tiles/signal0010.tif d3560fff32b42f8d7baa32b2746535137675ade1bb3e726d8ef890e321daf8cc
edge_cells_brain/tiles/signal0011.tif d3560fff32b42f8d7baa32b2746535137675ade1bb3e726d8ef890e321daf8cc
edge_cells_brain/tiles/signal0012.tif d3560fff32b42f8d7baa32b2746535137675ade1bb3e726d8ef890e321daf8cc
edge_cells_brain/tiles/signal0013.tif d3560fff32b42f8d7baa32b2746535137675ade1bb3e726d8ef890e321daf8cc
edge_cells_brain/tiles/signal0014.tif d3560fff32b42f8d7baa32b2746535137675ade1bb3e726d8ef890e321daf8cc
edge_cells_brain/tiles/signal0015.tif e0aaa58adcf0f13402494ce34112f7b937bf9421a1e0064856f57946e0267a02
edge_cells_brain/tiles/signal0016.tif bc89f955fb25b3f536246912eaac757c7c3db4d9eddfdd5cb9b546800b782c2e
edge_cells_brain/tiles/signal0017.tif b0a9789d16458fcfc92166c4363fe48859311247939587acb1d04d2885a36476
edge_cells_brain/tiles/signal0018.tif 5307038034e5d4ca98c33557bc5ed9ef5ccb12672934e5387ff7e1d236f5cac7
edge_cells_brain/tiles/signal0019.tif 40c4474b4ec25a8c68ac20f6649e7296af058e1bd854585ef7d71facb11a37e0
edge_cells_brain/tiles/signal0020.tif b0a9789d16458fcfc92166c4363fe48859311247939587acb1d04d2885a36476
35 changes: 35 additions & 0 deletions tests/core/test_integration/test_detection_structure_splitting.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@

import os

import numpy as np
import pytest
from brainglobe_utils.IO.image.load import read_with_dask

from cellfinder.core.detect.filters.volume.structure_splitting import (
split_cells,
)
from cellfinder.core.main import main

data_dir = os.path.join(
Expand Down Expand Up @@ -46,3 +50,34 @@ def test_structure_splitting(signal_array, background_array):
voxel_sizes,
n_free_cpus=0,
)


def test_underflow_issue_435():
# two cells centered at (9, 10, 10), (19, 10, 10) with radius 5
p1 = np.array([9, 10, 10])
p2 = np.array([19, 10, 10])
radius = 5

bright_voxels = np.zeros((30, 20, 20), dtype=np.bool_)

pos = np.empty((30, 20, 20, 3))
pos[:, :, :, 0] = np.arange(30).reshape((-1, 1, 1))
pos[:, :, :, 1] = np.arange(20).reshape((1, -1, 1))
pos[:, :, :, 2] = np.arange(20).reshape((1, 1, -1))

dist1 = pos - p1.reshape((1, 1, 1, 3))
dist1 = np.sqrt(np.sum(np.square(dist1), axis=3))
inside1 = dist1 <= radius
dist2 = pos - p2.reshape((1, 1, 1, 3))
dist2 = np.sqrt(np.sum(np.square(dist2), axis=3))
inside2 = dist2 <= radius

bright_voxels[np.logical_or(inside1, inside2)] = True
bright_indices = np.argwhere(bright_voxels)

centers = split_cells(bright_indices)

# for some reason, same with pytorch, it's shifted by 1. Probably rounding
expected = {(10, 11, 11), (20, 11, 11)}
got = set(map(tuple, centers.tolist()))
assert expected == got
Loading