Skip to main content

fusion-tools

Modular visualization and analysis dashboard creation for high-resolution microscopy images.

Installation

fusion-tools is deployed through PyPI and can be installed using:

$ pip install fusion-tools

Usage

fusion-tools is intended to bring some of the functionality found in FUSION to developers working with whole slide images (WSIs) stored locally.

One such example would be the Visualization and SlideMap class:

from fusion_tools.visualization import Visualization
from fusion_tools.components import SlideMap

vis_session = Visualization(
    local_slides = [path_to_slide]
    components = [
        [
            SlideMap()
        ]
    ]
)

vis_session.start()

The Visualization class lets users construct custom layouts of different tools by passing a list containing rows, columns, and tabs. (e.g. [ [column in row 1], [ [ tab 1 in column 2 in row 1, tab 2 in column 2 in row 1] ], [ [ column 1 in row 2 ] ] ] ).

By passing a list of paths to locally-stored whole slide images (WSIs), fusion-tools automatically generates a LocalTileServer which is bundled in with the Visualization session to allow for high-resolution image viewing.

from fusion_tools.visualization import Visualization
from fusion_tools.components import SlideMap, OverlayOptions, PropertyViewer
from fusion_tools.utils.shapes import load_aperio


path_to_slide = '/path/to/wsi.svs'
path_to_annotations = '/path/to/aperio_annotations.xml'

annotations = load_aperio(path_to_annotations)

vis_session = Visualization(
    local_slides = [path_to_slide],
    local_annotations = [annotations],
    components = [
        [
            SlideMap(),
            [
                OverlayOptions(),
                PropertyViewer()
            ]
        ]
    ]
)

vis_session.start()

You can also access remote tile servers (either through DSATileServer or CustomTileServer) as well as annotations stored on a Digital Slide Archive instance.

from fusion_tools.visualization import Visualization
from fusion_tools.handler.dsa_handler import DSAHandler
from fusion_tools.components import SlideMap

# Grabbing first item from demo DSA instance
base_url = 'https://demo.kitware.com/histomicstk/api/v1'
item_id = '5bbdeed1e629140048d01bcb'

# Starting the DSAHandler to grab information:
dsa_handler = DSAHandler(
    girderApiUrl = base_url
)

# Checking how many annotations this item has:
#print('This item has the following annotations: ')
#print(dsa_handler.query_annotation_count(item=item_id).to_dict('records'))

vis_session = Visualization(
    tileservers = [dsa_handler.get_tile_server(item_id)],
    components = [
        [
            SlideMap()
        ]
    ]
)

vis_session.start()

You can also use some of segmentation components for adding labels and annotations to structures in the slide.

Creating annotations on top of structures

Applying labels to many structures at the same time

from fusion_tools.visualization import Visualization
from fusion_tools.handler.dsa_handler import DSAHandler
from fusion_tools.components import SlideMap, FeatureAnnotation, BulkLabels

# Grabbing first item from demo DSA instance
base_url = 'https://demo.kitware.com/histomicstk/api/v1'
item_id = '5bbdeed1e629140048d01bcb'

# Starting the DSAHandler to grab information:
dsa_handler = DSAHandler(
    girderApiUrl = base_url
)

# Checking how many annotations this item has:
#print('This item has the following annotations: ')
#print(dsa_handler.query_annotation_count(item=item_id).to_dict('records'))

vis_session = Visualization(
    tileservers = [dsa_handler.get_tile_server(item_id)],
    components = [
        [
            SlideMap(),
            [
                FeatureAnnotation(
                    storage_path = os.getcwd()+'\\tests\\Test_Annotations\\',
                    labels_format = 'json',
                    annotations_format = 'rgb'
                ),
                BulkLabels()
            ]
        ]
    ]
)

vis_session.start()

New in fusion-tools>2.0.0!

Now you can add multiple slides to a single visualization session and you can even view them side-by-side!

  • By default, components in the same row are linked, or they can interact with each other through callbacks. This can be updated using the "linkage" kwarg when initializing a Visualization session.
  • If two of the same types of components (e.g., two SlideMap components) are placed in the same row and "linkage" is set to "row", callbacks will not work. Beware!
from fusion_tools.visualization import Visualization
from fusion_tools.components import SlideMap, OverlayOptions, PropertyViewer, PropertyPlotter
from fusion_tools.handler.dsa_handler import DSAHandler

# Mixed types of slides and annotations
local_slide_list = ['slide1.tif','slide2.ome.tif','slide3.svs']
local_annotations_list = ['slide1_annotations.xml','slide2 annotations.json','annotations for slide3.h5ad']

dsa_handler = DSAHandler(
    girderApiUrl = 'http://example_dsa_address.com/api/v1'
)

dsa_items_list = [
    'item_uuid_1',
    'item_uuid_2'
]

dsa_tileservers = [dsa_handler.get_tile_server(i) for i in dsa_items_list]

# Setting linkage to "col" to enable side-by-side visualization
vis_sess = Visualization(
    local_slides = local_slide_list,
    local_annotations = local_annotations_list,
    tileservers = dsa_tileservers,
    linkage = 'col',
    components = [
        [
            [
                SlideMap(),
                OverlayOptions(),
                PropertyViewer(),
                PropertyPlotter()
            ],            
            [
                SlideMap(),
                OverlayOptions(),
                PropertyViewer(),
                PropertyPlotter()
            ]
        ]
    ],
    app_options={'port': 8050}
)

vis_sess.start()

Examples:

For more examples including how to load specific types of spatial --omics datasets (10x Visium, VisiumHD, MxIF, etc.) see this dedicated example page:

https://spborder.github.io/fusion-welcome-page/

Contributing

Open to contributions. Feel free to submit a PR or post feature requests in Issues

Open Projects:

  • Automated segmentation workflow for locally stored images (active-learning, SAM, etc.)
  • Monitoring long-running model training/other external processes

License

fusion-tools was created by Samuel Border. It is licensed under the terms of the Apache 2.0 License

Citation

If you find this work useful in your own research, please consider citing:

@article{border2025fusion,
  title={FUSION: A web-based application for in-depth exploration of multi-omics data with brightfield histology},
  author={Border, Samuel P and Ferreira, Ricardo Melo and Lucarelli, Nicholas and Kumar, Suhas Katari Chaluva and Paul, Anindya S and Manthey, David and Barisoni, Laura and Levites Strekalova, Yulia A and Ray, Jessica and Cheng, Ying-Hua and others},
  journal={Nature Communications},
  volume={16},
  number={1},
  pages={8388},
  year={2025},
  publisher={Nature Publishing Group UK London}
}

Metadata

Release files for fusion-tools 3.6.93

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fusion-tools 3.6.93
File Size Uploaded
fusion_tools-3.6.93.tar.gz 263.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fusion-tools 3.6.93
File Interpreter ABI Platform
fusion_tools-3.6.93-py3-none-any.whl Python 3 none any Details

Total release size: 546.5 kB

Release files / fusion_tools-3.6.93.tar.gz

Download URL fusion_tools-3.6.93.tar.gz
Size 263.4 kB
Tags Source
SHA-256 checksum
How to use checksums
6847353121ae56151d86a4c56a7ab4ab84bff6e223fb6e7894e9e402f01ac3e0
BLAKE2b-256 checksum
How to use checksums
3eae4ad043bb582974b92f9efd5d2df52c7fa4ad7ea3a212edf2bd81f9573ed2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.3 CPython/3.12.3 Linux/6.8.0-146-generic

Release files / fusion_tools-3.6.93-py3-none-any.whl

Download URL fusion_tools-3.6.93-py3-none-any.whl
Size 283.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3034fdf05333203ef39591233dc1f53c2547c457b262c1eb5575ccbcce1a9350
BLAKE2b-256 checksum
How to use checksums
7191569a20c51f7c8d38c6a181ed47bc35d118e60d7382a741e9e6043d045450
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.3 CPython/3.12.3 Linux/6.8.0-146-generic

Release history Release notifications | RSS feed

This release

3.6.93 This release

2 release files

3.6.92

2 release files

3.6.91

2 release files

3.6.89

2 release files

3.6.88

2 release files

3.6.87

2 release files

3.6.86

2 release files

3.6.85

2 release files

3.6.84

2 release files

3.6.83

2 release files

3.6.82

2 release files

3.6.81

2 release files

3.6.80

2 release files

3.6.79

2 release files

3.6.78

2 release files

3.6.77

2 release files

3.6.76

2 release files

3.6.75

2 release files

3.6.74

2 release files

3.6.73

2 release files

3.6.72

2 release files

3.6.71

2 release files

3.6.70

2 release files

3.6.69

2 release files

3.6.68

2 release files

3.6.67

2 release files

3.6.66

2 release files

3.6.65

2 release files

3.6.64

2 release files

3.6.63

2 release files

3.6.62

2 release files

3.6.61

2 release files

3.6.60

2 release files

3.6.59

2 release files

3.6.58

2 release files

3.6.57

2 release files

3.6.42

2 release files

3.6.41

2 release files

3.6.40

2 release files

3.6.39

2 release files

3.6.38

2 release files

3.6.37

2 release files

3.6.35

2 release files

3.6.34

2 release files

3.6.33

2 release files

3.6.32

2 release files

3.6.31

2 release files

3.6.30

2 release files

3.6.29

2 release files

3.6.28

2 release files

3.6.27

2 release files

3.6.26

2 release files

3.6.25

2 release files

3.6.24

2 release files

3.6.23

2 release files

3.6.22

2 release files

3.6.21

2 release files

3.6.20

2 release files

3.6.19

2 release files

3.6.18

2 release files

3.6.17

2 release files

3.6.16

2 release files

3.6.15

2 release files

3.6.14

2 release files

3.6.13

2 release files

3.6.12

2 release files

3.6.11

2 release files

3.6.10

2 release files

3.6.9

2 release files

3.6.8

2 release files

3.6.7

2 release files

3.6.6

2 release files

3.6.5

2 release files

3.6.4

2 release files

3.6.3

2 release files

3.6.2

2 release files

3.6.1

2 release files

3.6.0

2 release files

3.5.71

2 release files

3.5.70

2 release files

3.5.69

2 release files

3.5.68

2 release files

3.5.63

2 release files

3.5.62

2 release files

3.5.61

2 release files

3.5.60

2 release files

3.5.59

2 release files

3.5.58

2 release files

3.5.57

2 release files

3.5.56

2 release files

3.5.55

2 release files

3.5.54

2 release files

3.5.53

2 release files

3.5.52

2 release files

3.5.51

2 release files

3.5.50

2 release files

3.5.49

2 release files

3.5.41

2 release files

3.5.40

2 release files

3.5.39

2 release files

3.5.38

2 release files

3.5.37

2 release files

3.5.36

2 release files

3.5.35

2 release files

3.5.34

2 release files

3.5.33

2 release files

3.5.32

2 release files

3.5.31

2 release files

3.5.30

2 release files

3.5.29

2 release files

3.5.28

2 release files

3.5.27

2 release files

3.5.26

2 release files

3.5.25

2 release files

3.5.24

2 release files

3.5.23

2 release files

3.5.22

2 release files

3.5.21

2 release files

3.5.20

2 release files

3.5.19

2 release files

3.5.18

2 release files

3.5.17

2 release files

3.5.16

2 release files

3.5.15

2 release files

3.5.14

2 release files

3.5.13

2 release files

3.5.12

2 release files

3.5.11

2 release files

3.5.10

2 release files

3.5.9

2 release files

3.5.8

2 release files

3.5.7

2 release files

3.5.6

2 release files

3.5.5

2 release files

3.5.4

2 release files

3.5.3

2 release files

3.5.2

2 release files

3.5.1

2 release files

3.5.0

2 release files

3.4.2

2 release files

3.4.1

2 release files

3.4.0

2 release files

3.3.15

2 release files

3.3.14

2 release files

3.3.13

2 release files

3.3.12

2 release files

3.3.11

2 release files

3.3.10

2 release files

3.3.9

2 release files

3.3.8

2 release files

3.3.7

2 release files

3.3.6

2 release files

3.3.5

2 release files

3.3.4

2 release files

3.3.3

2 release files

3.3.2

2 release files

3.3.1

2 release files

3.3.0

2 release files

3.2.0

2 release files

3.1.3

2 release files

3.1.2

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.6

2 release files

3.0.5

2 release files

3.0.4

2 release files

3.0.3

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.6.0

2 release files

2.5.5

2 release files

2.5.4

2 release files

2.5.3

2 release files

2.5.2

2 release files

2.5.1

2 release files

2.5.0

2 release files

2.4.4

2 release files

2.4.3

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.3

2 release files

2.3.2

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.6

2 release files

2.2.5

2 release files

2.2.4

2 release files

2.2.3

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.8

2 release files

2.0.7

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.0.24

2 release files

0.0.23

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page