FlowCyPy: Flow Cytometer Simulation Tool
Meta |
|||
Testing |
|||
PyPi |
|||
Anaconda |
Overview
FlowCyPy is a cutting-edge Python library designed to simulate flow cytometer experiments. By generating realistic Forward Scatter (FSC) and Side Scatter (SSC) signals, FlowCyPy enables detailed modeling of flow cytometry setups, making it ideal for researchers and engineers working with extracellular vesicles (EVs) or other scatterers.
Key Features
Particle Event Simulation: Create detailed FSC/SSC signals with customizable particle size and refractive index distributions.
Noise and Signal Modeling: Incorporate realistic noise sources (thermal, shot, dark current) and baseline shifts.
Detector Configurations: Simulate real-world detector behaviors, including saturation and responsivity.
Fluorescence Modeling: Simulate fluorescence signals for labeled particles (e.g., EV surface markers).
Visualization Tools: Generate advanced plots, including density maps and signal traces.
For full documentation and examples, visit the FlowCyPy Documentation.
Installation
Install FlowCyPy via pip or conda`:
pip install FlowCyPy
conda install FlowCyPy --channels MartinPdeS
Requirements: Python 3.11 or higher with dependencies: numpy, pint, tabulate, seaborn, MPSPlots, PyMieSim, pydantic>=2.6.3
Prebuilt wheels are published for Linux x86_64 and macOS ARM64. Other platforms require building from source with FFTW and OpenMP available.
Quick Start
Simulate a simple flow cytometer experiment:
from FlowCyPy.units import ureg
from FlowCyPy.fluidics import (
Fluidics,
FlowCell,
ScattererCollection,
populations,
SampleFlowRate,
SheathFlowRate,
)
# from FlowCyPy.sampling_method import GammaModel, ExplicitModel
from FlowCyPy.fluidics import distributions
flow_cell = FlowCell(
sample_volume_flow=SampleFlowRate.MEDIUM.value,
sheath_volume_flow=SheathFlowRate.MEDIUM.value,
width=400 * ureg.micrometer,
height=150 * ureg.micrometer,
)
scatterer_collection = ScattererCollection()
medium_refractive_index = distributions.Delta(1.33)
diameter_dist = distributions.RosinRammler(
scale=200 * ureg.nanometer,
shape=10,
)
ri_dist = distributions.Normal(
mean=1.44,
standard_deviation=0.002,
low_cutoff=1.33,
)
sampling_method = populations.ExplicitModel()
population_0 = populations.SpherePopulation(
name="Pop 0",
medium_refractive_index=medium_refractive_index,
concentration=1e10 * ureg.particle / ureg.milliliter,
diameter=diameter_dist,
refractive_index=ri_dist,
sampling_method=sampling_method,
)
diameter_dist = distributions.RosinRammler(
scale=30 * ureg.nanometer,
shape=50,
)
ri_dist = distributions.Normal(
mean=1.44,
standard_deviation=0.002,
low_cutoff=1.33,
)
population_1 = populations.SpherePopulation(
name="Pop 1",
medium_refractive_index=medium_refractive_index,
concentration=5e11 * ureg.particle / ureg.milliliter,
diameter=diameter_dist,
refractive_index=ri_dist,
sampling_method=populations.GammaModel(number_of_samples=5_000),
)
scatterer_collection.add_population(population_0, population_1)
scatterer_collection.dilute(factor=80)
fluidics = Fluidics(scatterer_collection=scatterer_collection, flow_cell=flow_cell)
# %%
# Step 2: Define Optical Subsystem
# --------------------------------
from FlowCyPy.opto_electronics import (
Detector,
Digitizer,
OptoElectronics,
Amplifier,
source,
circuits,
)
analog_processing = [
circuits.BaselineRestorationServo(time_constant=100 * ureg.microsecond),
circuits.BesselLowPass(cutoff_frequency=2 * ureg.megahertz, order=4, gain=2),
]
source = source.Gaussian(
waist_z=10e-6 * ureg.meter, # Beam waist along flow direction (z-axis)
waist_y=60e-6 * ureg.meter,
wavelength=405 * ureg.nanometer,
optical_power=200 * ureg.milliwatt,
rin=-140 * ureg.dB_per_Hz,
bandwidth=10 * ureg.megahertz,
)
detectors = [
Detector(
name="side",
phi_angle=90 * ureg.degree,
numerical_aperture=1.1,
responsivity=1 * ureg.ampere / ureg.watt,
),
Detector(
name="forward",
phi_angle=0 * ureg.degree,
numerical_aperture=0.3,
cache_numerical_aperture=0.1,
responsivity=1 * ureg.ampere / ureg.watt,
),
]
digitizer = Digitizer(
sampling_rate=60 * ureg.megahertz,
bit_depth=14,
use_auto_range=True,
channel_range_mode="shared",
)
amplifier = Amplifier(
gain=10 * ureg.volt / ureg.ampere,
bandwidth=10 * ureg.megahertz,
voltage_noise_density=0.0 * ureg.nanovolt / ureg.sqrt_hertz,
current_noise_density=0.0 * ureg.femtoampere / ureg.sqrt_hertz,
)
opto_electronics = OptoElectronics(
digitizer=digitizer,
detectors=detectors,
source=source,
amplifier=amplifier,
analog_processing=analog_processing,
)
# %%
# Step 3: Signal Processing Configuration
# ---------------------------------------
from FlowCyPy.digital_processing import (
DigitalProcessing,
peak_locator,
discriminator,
)
triggering = discriminator.FixedWindow(
trigger_channel="side",
threshold="4sigma",
pre_buffer=40,
post_buffer=40,
max_triggers=-1,
)
peak_algo = peak_locator.GlobalPeakLocator()
digital_processing = DigitalProcessing(
discriminator=triggering,
peak_algorithm=peak_algo,
)
# %%
# Step 4: Run Simulation
# ----------------------
from FlowCyPy import FlowCytometer
cytometer = FlowCytometer(
fluidics=fluidics,
background_power=0.001 * ureg.milliwatt,
)
run_record = cytometer.run(
opto_electronics=opto_electronics,
digital_processing=digital_processing,
run_time=1 * ureg.millisecond,
)
run_record.event_collection.plot(x="Diameter")
run_record.event_collection.plot(x="forward")
run_record.plot_analog()
run_record.plot_digital()
run_record.peaks.plot(x=("forward", "Height"))
_ = run_record.plot_analog(
figure_size=(12, 8),
show=False,
save_as=f"{dir_path}/../images/readme_analog.png",
)
_ = run_record.plot_digital(
figure_size=(12, 8),
show=False,
save_as=f"{dir_path}/../images/readme_digital.png",
)
Explore more examples in the FlowCyPy Examples.
Code structure
Here is the architecture for a standard workflow using FlowCyPy:
Development and Contribution
Clone the Repository
git clone https://github.com/MartinPdeS/FlowCyPy.git
cd FlowCyPy
Install Locally
Install in editable mode with testing and documentation dependencies:
pip install -e .[testing,documentation] (on linux system)
pip install -e ".[testing,documentation]" (on macOS system)
Run Tests
Use pytest to validate functionality:
pytest
Build Documentation
Build the documentation locally:
cd docs
make html
Find the documentation in docs/_build/html.
Additional Resources
Documentation: Full guide and API reference at FlowCyPy Documentation
Examples: Explore use cases in the Examples Section
GitHub Repository: Access the source code and contribute at FlowCyPy GitHub
Contributions
Contributions are welcome! If you have suggestions, issues, or would like to collaborate, visit the GitHub repository.
Contact
For inquiries or collaboration, contact Martin Poinsinet de Sivry-Houle.
Metadata
Release files for FlowCyPy 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| flowcypy-1.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| flowcypy-1.1.1-cp313-cp313-macosx_26_0_arm64.whl | CPython 3.13 | CPython 3.13 | macOS 26.0+ ARM64 | Details |
| flowcypy-1.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| flowcypy-1.1.1-cp312-cp312-macosx_26_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 26.0+ ARM64 | Details |
| flowcypy-1.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| flowcypy-1.1.1-cp311-cp311-macosx_26_0_arm64.whl | CPython 3.11 | CPython 3.11 | macOS 26.0+ ARM64 | Details |
Total release size: 23.2 MB
Release files / flowcypy-1.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | flowcypy-1.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
9742f3a3dc524fc49ecd6adee800b4e5b8260c38050ede145e3790c1f1507288
|
|
BLAKE2b-256 checksum How to use checksums |
297b8ad3ba47288bc72094015c28c8fdc540af1e0f96d35b8a039138c2655cab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / flowcypy-1.1.1-cp313-cp313-macosx_26_0_arm64.whl
| Download URL | flowcypy-1.1.1-cp313-cp313-macosx_26_0_arm64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.13 macOS 26.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
31ed5d76293ab38eac29c27b834bac63c1f4a3ac0bd58dee38942c43fcd406ae
|
|
BLAKE2b-256 checksum How to use checksums |
22d5711c648f11f5741ee86f46344a57250b7547f497cf59f2a2f809c2a55ad7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / flowcypy-1.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | flowcypy-1.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0d69eb0d3cb646ff0b36b6ccffdc4f81a83f4ac20c501fe25e50b0f918ec6902
|
|
BLAKE2b-256 checksum How to use checksums |
51b4d52359a438e52270f87dd3539f3150b2de82eef70e57d41e67f08c6c40d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / flowcypy-1.1.1-cp312-cp312-macosx_26_0_arm64.whl
| Download URL | flowcypy-1.1.1-cp312-cp312-macosx_26_0_arm64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.12 macOS 26.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
be01cfcbfcca7dbef3be15c2b33ec81fa70f901bc047ff5ad42121ba513da574
|
|
BLAKE2b-256 checksum How to use checksums |
a5b0d32674ea429c2c003ad340cc13ba565e3991b9cd65a2e5e54a4038affdb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / flowcypy-1.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | flowcypy-1.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
cb491476a7aecf5064ba50f1ab3287c3c80503d69900325cf448a024dc98af60
|
|
BLAKE2b-256 checksum How to use checksums |
4839cf79494db4b7f40256dbaf3ca89346fa964df59c2d96a73d7076f5b72c62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / flowcypy-1.1.1-cp311-cp311-macosx_26_0_arm64.whl
| Download URL | flowcypy-1.1.1-cp311-cp311-macosx_26_0_arm64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.11 macOS 26.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c078190221677540ac17f901456e82b0b4702b3d21216351d5d17342a9bfd8d6
|
|
BLAKE2b-256 checksum How to use checksums |
ae0c7b2d6eaa1cb5acff495918d52dde680d2164d48ce1661100d01fb9854a67
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|