rajewsky-lab / openst

Open-ST: profile and analyze tissue transcriptomes in 3D with high resolution in your lab
https://rajewsky-lab.github.io/openst/
Other
78 stars 11 forks source link

Error in openst pairwise_aligner #52

Closed falsetry1514 closed 3 months ago

falsetry1514 commented 3 months ago

Describe the bug

When I run this code in shell, it gave me a warning: multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '

This is my config: PhysMem: 22G used (7981M wired, 0B compressor), 234G unused. CPU: 2.7 GHz 24 cores Intel Xeon W sonoma 14.5 GPU: AMD Radeon Pro 580X 8 GB

Steps to reproduce the bug

This is the code: openst from_spacemake --project-id openst_demo --sample-id e13_mouse_head --run-mode openst pairwise_aligner --metadata aligner.json --only-coarse

Sample code to reproduce the bug

I ran the example data named E13_mouse_head, and ran it on mac. I figure out the problem how to run spacemake on mac.

Expected results

I hope it will run successfully.

This is the whole script: shell: $ openst from_spacemake --project-id openst_demo --sample-id e13_mouse_head --run-mode openst pairwise_aligner --metadata aligner.json --only-coarse INFO 2024-07-17 20:21:57,577 - openst from_spacemake - running from spacemake directory INFO 2024-07-17 20:21:57,577 - {'subcommand': 'from_spacemake', 'project_id': 'openst_demo', 'sample_id': 'e13_mouse_head', 'run_mode': 'openst', 'func': <function cmd_run_from_spacemake at 0x10840f370>} INFO 2024-07-17 20:21:57,981 - openst pairwise_aligner - running with the following parameters: INFO 2024-07-17 20:21:57,981 - {'project_id': 'openst_demo', 'sample_id': 'e13_mouse_head', 'run_mode': 'openst', 'subcommand': 'pairwise_aligner', 'h5_in': 'projects/openst_demo/processed_data/e13_mouse_head/multimodal/stitched_spots.h5ad', 'image_in': 'uns/spatial/staining_image', 'metadata': 'aligner.json', 'only_coarse': True, 'rescale_factor_coarse': 20, 'threshold_counts_coarse': 1, 'pseudoimage_size_coarse': 500, 'ransac_coarse_min_samples': 3, 'ransac_coarse_residual_threshold': 2, 'ransac_coarse_max_trials': 2, 'rescale_factor_fine': 10, 'gaussian_sigma_fine': 2, 'threshold_counts_fine': 0, 'pseudoimage_size_fine': 2000, 'ransac_fine_min_samples': 3, 'ransac_fine_residual_threshold': 2, 'ransac_fine_max_trials': 1, 'min_matches': 50, 'mask_tissue': False, 'mask_gaussian_sigma': 5, 'keep_black_background': False, 'feature_matcher': 'LoFTR', 'num_workers': 1, 'device': 'cpu', 'func': <function cmd_run_pairwise_aligner at 0x10840ee60>} INFO 2024-07-17 20:22:00,142 - Coarse registration, 21015579 coordinates INFO 2024-07-17 20:22:00,142 - Rescaling input image for coarse registration INFO 2024-07-17 20:22:02,685 - Flip (1, 1), rotation 0 Segmentation fault: 11 $ miniforge3/envs/openst/lib/python3.10/multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '

falsetry1514 commented 3 months ago

Hi @danilexn I find the function that caused this problem.

which is in '.../miniforge3/envs/openst/lib/python3.10/site-packages/openst/alignment/feature_matching.py'

def _find_matches_loftr(im_0: np.ndarray, im_1: np.ndarray, pretrained: str = "outdoor", device: str = "cpu") -> tuple: ... matcher = KF.LoFTR(pretrained=pretrained).to(device) ...

But I don't know how to solve it.

falsetry1514 commented 3 months ago

Hi, I report a bug in pairwise_aligner.

typed this line in bash shell openst from_spacemake --project-id openst_demo --sample-id e13_mouse_head pairwise_aligner

argparse will pass the parameter in args, when it came to STAGE 2: fine registration per tile.

IPdb [35]: np.unique(tile_id.codes)
Out  [35]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11], dtype=int8)
IPdb [51]: np.unique(tile_id[(total_counts > args.threshold_counts_coarse)].codes)
Out  [51]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11], dtype=int8)
IPdb [52]: np.unique(tile_id[(total_counts > args.threshold_counts_coarse)].codes[_i_sts_coords_coarse_within_image_bounds])
Out  [52]: array([ 1,  2,  3,  5,  6,  7,  9, 10, 11], dtype=int8)

this will cause a zero array '_t_valid_coords'

IPdb [53]: np.isin(tile_id[(total_counts > args.threshold_counts_coarse)].codes[_i_sts_coords_coarse_within_image_bounds], tile_code,).any()
Out  [53]: False

caused that

logging.info(f"Registering tile 0 with 0 coordinates")

this will cause an error that a number divided by zero in the function create_paired_pseudoimage:

# sts_pseudoimage.max() is equal to zero
sts_pseudoimage = ((sts_pseudoimage / sts_pseudoimage.max()) * 255).astype(np.uint8)
danilexn commented 3 months ago

Hi @falsetry1514!

Thanks for the very detailed issue. I will take a look - might take a while because we don't have access to Intel-based Macs, and the first issue looks like something platform-specific, but we'll try our best. Regarding the second issue, will fix it asap :smile:

falsetry1514 commented 3 months ago

Hi @falsetry1514!

Thanks for the very detailed issue. I will take a look - might take a while because we don't have access to Intel-based Macs, and the first issue looks like something platform-specific, but we'll try our best. Regarding the second issue, will fix it asap 😄

Hi, @danilexn I have work it on macos by using the example of e13_mouse_head! This is the solution that running the whole program of openst and spacemake on macos:

modify this line:

improt multiprocessing as mp

into:

import multiprocess as mp

The reason is that the first module will report an error, but the second one will not.

2.Second py file path = </PATH/to/spacemake>/snakemake/scripts/automated_analysis.py enclosed the script by: if name == 'main':

- Second: modify two smk file main.smk & mapping.smk modify: ``` 'ln -sr' or 'ln -rs' ``` into ``` ln -s ``` ln command on mac don't have the parameter of '-r' main.smk modify: 'zcat {input} | cut -f2 | head -{wildcards.n_beads} > {output}' into 'gunzip -c {input} | cut -f2 | head -{wildcards.n_beads} > {output}' zcat command on mac will add '.z' suffix on gz file, the 'gunzip -c' command do the same function on it.