Vectorfit
This code is distributed as accompanying software for Calibration-free estimation of field dependent aberrations for single molecule localization microscopy across large fields of view by Isabel Droste, Erik Schuitema, Sajjad A. Khan, Myron Hensgens, Stijn Heldens, Carlas S. Smith, Ben van Werkhoven, Hylkje Geertsema, Keith A. Lidke, Sjoerd Stallinga, and Bernd Rieger.
The paper is available here.
This code implements full vectorial point spread function (PSF) fitting for Single Molecule Localization Microscopy (SMLM) including field dependent aberrations that are estimated directly from the single molecule data.
The code is developed in MATLAB and includes a fast CPU/GPU implementation in C++ with CUDA support. This implementation can be accessed directly from MATLAB using MEX files.
Operating system
The CPU/GPU implementation has been tested on Linux and Windows.
Alternatively, the code can run entirely within MATLAB on both Linux and Windows without requiring compilation. However, this approach has significantly slower localization performance.
Requirements and installation
Linux CPU/GPU
The code was tested to work on Ubuntu 22.04 and Ubuntu 24.04 with Matlab R2024b, GCC 10 and CUDA 12.6.2, but may also work with other configurations. Make sure you use a version of GCC that is compatible with your version of Matlab. You can check the supported GCC compiler for your version of Matlab here.
Download or clone the repository
git clone https://gitlab.tudelft.nl/imphys/ci/vectorfit.git
The code requires Eigen3, FFTW, HDF5, and PkgConfig libraries. These are preinstalled in most high-performance computing environments. If you want to install them locally on Ubuntu you can use:
sudo apt install libeigen3-dev libfftw3-dev libhdf5-dev pkg-config
When running the code on an HPC environment, you need to load Matlab before compilation, together with a compatible version of GCC.
module load matlab/R2024b
module load compiler/gcc/10
module load cuda/12.6.2
omit the last line when running without GPU support.
To compile, please run the following commands inside the path of the source code. First, move to the cpp folder
cd cpp
Then, run the following commands to compile the code
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DUSECUDA=1 ..
make
Omit the variable -DUSECUDA=1 to disable GPU support.
In case you get an error that looks like this
version 'GLIBCXX_3.4.32' not found (required by .../xxx.mexa64)
make sure you are using the correct version of GCC that is compatible with your version of matlab.
When running the code on an HPC environment with multiple versions of GCC installed, it can be the case that the systems picks up on the default GCC version, even when you loaded the correct version. In that case, you can force the correct GCC version using
export CC=/usr/bin/gcc-10
export CXX=/usr/bin/g++-10
export PATH=/usr/bin:$PATH
If that does not work, try:
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
To enable the CPU/GPU mode, set params.cpp = true in the parameter file. For the example code, the parameter file can be found in set_parameters_scripts/set_parameters_microtubules_3D.
In addition, to use the GPU mode, set params.cpp_fitmode = "gpu-lowaccuracy" to perform the Fourier transforms in single precision and params.cpp_fitmode = "gpu" to perform the Fourier transforms in double precision. To use the CPU mode, set params.cpp_fitmode = "cpu".
The DIPImage toolbox for MATLAB is required, please see http://www.diplib.org for installation instructions.
Windows CPU
The code was tested to work on Windows 11 with Matlab R2024b, but may also work with other configurations. Unfortunately, however, it does not work for GPU on Windows.
Download or clone the repository
git clone https://gitlab.tudelft.nl/imphys/ci/vectorfit.git
The code requires Eigen3, FFTW, HDF5, and PkgConfig libraries, which can be installed using vcpkg.'
First, install vcpkg using
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
Then install required libraries
vcpkg install eigen3 fftw3 hdf5 pkgconf
Integrate vcpkg with Visual Studio
vcpkg integrate install
To compile, please run the following commands inside the path of the source code. First, move to the cpp folder in the command line
cd cpp
Run the following commands (be sure to have modified the path to vcpkg)
mkdir build
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..
Then, in a Powershell, move to the cpp folder and run
cd build
cmake --build . --config Release
Matlab
The code was tested to work with Matlab R2024b but may work with other versions as well. Download the code or clone the repository using
git clone https://gitlab.tudelft.nl/imphys/ci/vectorfit.git
The DIPImage toolbox for MATLAB is required, please see http://www.diplib.org for installation instructions. It is also necessary to install the Parallel Computing Toolbox, Image Processing Toolbox and Bioinformatics Toolbox that can be found in the MATLAB Add-ons.
No further compilation of the code is needed.
To enable the purely Matlab mode, set params.cpp = false; in the parameter file. For the example code, the parameter file can be found in set_parameters_scripts/set_parameters_microtubules_3D.
Software Demo
Follow the steps below to apply the SMLM pipeline to a test dataset.
-
Download the test data and place the file
microtubules_3D_data0001.tifin the foldervectorfit/data/0_raw_data/. This data contains the first 800 frames from the 3D microtuble dataset from Figure 2 from the article (This is 1% of the full dataset).When you are running the code on linux machine via
ssh, you can copy the test data from your local machine to the linux machine viascp /path/to/local/file/microtubules_3D_data0001.tif username@remote_host:/path/to/vectorfit/data/0_raw_data/ -
The parameter file is located at
set_parameter_scripts/set_parameters_microtubules_3D.m. It contains all the imaging and fitting parameters. When using your own data, you need adjust the parameters to your own microscope parameters. When you change the name of the parameter file, make sure to declare it at the top of each of the three scriptssegmentation.m,estimate_aberrations.mandlocalize.mthat we will run below. -
When you are running the code on a high performance computing environment, you can load the required modules via
module load matlab/R2024b cuda/12.6.2 diplib -
When you are running the code in an environment that supports graphical output (such as the Matlab user interface, or when running Matlab from the terminal with
matlab -nodesktop), make sure thatparams.show_plots = truein the parameter file to enable plot visualisation. Otherwise, setparams.show_plots = false. -
Start Matlab and add all scripts in the code directory to Matlab's path. You can do this by running
addpath(genpath('rootDir'))where you replace
rootDirwith to path to the code directory, so for example:addpath(genpath('/home/idroste/vectorfit')) -
Within Matlab, navigate into the root directory of the code, and run the scripts below:
-
Run the segmentation script
run('segmentation.m')This will segment the raw SMLM data into regions of iterest (ROIs). The expected output is
Starting parallel pool (parpool) using the 'Threads' profile ... Connected to parallel pool with 12 workers. Found 1 files Input file = microtubules_3D_data0001.tif Found 800 frames Load 800 frames Finished loading 800 frames Elapsed time is 6.020052 seconds. Skip first 0 frames Found 169332 ROIs in file 1 Saved segmentation in data/1_segmentation/segmentation_microtubules_3D_data0001.mat Elapsed time is 9.060499 seconds. Finished segmentation Elapsed time is 17.018615 seconds. Parallel pool using the 'Threads' profile is shutting down.When your output gives an error and shows
Found 0 fileson the third line, make sure that within Matlab you are inside the root directory of the code.Depending on your system, you may also get the error
A minimum pool size of 10 was requested. The maximum thread-based pool size is currently 2.This is because MATLAB can use 10 compute threads internally, but thread-based parallel pool are limited to 2 workers on your system (in this case). To correct this, changeparams.nr_of_parallel_workers = feature('numcores');toparams.nr_of_parallel_workers = 2;inset_parameter_scripts/set_parameters_microtubules_3D.m.When plotting is enabled, the following 4 plots will appear:
The upper left plot shows that raw SMLM data. You can step trough all of the frames by selecting Actions>Step through slices and then clicking the plot. The upper right plot can be used to determine the segmentation threshold. An optimal value lies slightly above the noise level. For the test data, the segmentation threshold is set to 15.5. You can change the segmentation threshold by changing the parameter
params.segmentation_ROI_thrin the parameter file. The bottom left plot shows the centers of all ROIs in the field of view. The bottom right plot shows all segmented ROIs: you can step through them by selecting Actions>Step through slices and then clicking the plot.The segmented ROIs will be saved in the folder
data/1_segmentation. -
Next, run the aberration estimation script
run('estimate_aberrations.m')This will load the segmented ROIs and estimate the field dependent aberrations from a subset of 5000 ROIs. When plotting is enabled, the following 4 plots will appear:
The first plot shows the estimated aberration surfaces. The second plot shows the selected measured ROIs and the corresponding modeled PSFs, which you can step through by selecting Actions>Step through slices and then clicking the plot. The third plot shows the measured and modeled PSFs, averaged and upsampled on a 3x3 grid of the FOV. The fourth plot shows the evolution of gamma coefficients depending on the number of iterations.
The estimated NAT coefficients can be found in
theta_full.global. The output will be saved indata/2_estimate_aberrations/.[To do: add instruction on how to use the code for 2D data]
-
Finally, run the localization script
run('localize.m')This will localize all segmented ROIs using the estimated field dependent aberrations. When plotting is enabled, the final image will be rendered:
You can change the super-resolution pixel size and the rendered area of the FOV by adusting
pixelsize,xlimandylimat the bottom of the scriptlocalize.m.Use
params.FlagOTF = trueto use the precomputation of OTFs. This will only work in the CPU/GPU mode. The output localizations can be found in the arraylocalizationsand represent the parameters:[ID, x (nm), y (nm), z(nm), framenumber, CRLBx, CRLBy, CRLBz, Nph, bg]. The output will be saved indata/3_localize/.
Bead fitting
When you want to estimate aberrations from a z-stack of beads, use the script bead_fitting/fit_bead_aberrations.m. This code segments the raw data into 3D ROIs, and estimated the Zernike coefficient aberrations for each ROI separately. The parameters file set_parameters/set_parameters_nuclearlamin_240819_beads_crop.m can serve as an example parameter file for bead fitting.
Helpful notes
When using you own segmentation, make sure that your input to the rest of the code contains the following, where Ncfg is the total number of emitters:
allspots: Array of size [Mx,My,Mz,Ncfg] that contains the segmented ROIs
framelist: Array of size [1,Ncfg] that contains the framenumber of each ROI. NB: the first frame is 1 and not 0
ID: Array of size [1,Ncfg] that contains a unique number for each ROI. You can use 1,2,...,Ncfg
roixy: Array of size [2,Ncfg] that contains the pixel coordinates of the segmented ROIs within the FOV.
Troubleshooting and contributing
If you run into issues installing or using the software, please create an issue on the issue tracker, or contact the authors: Isabel Droste i.e.a.c.droste@tudelft.nl, Sjoerd Stallinga s.stallinga@tudelft.nl, Bernd Rieger b.rieger@tudelft.nl.
Release files for vectorfit-py 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| vectorfit_py-0.2.0-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| vectorfit_py-0.2.0-cp313-cp313-manylinux_2_39_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.39+ x86-64 | Details |
| vectorfit_py-0.2.0-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| vectorfit_py-0.2.0-cp312-cp312-manylinux_2_39_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.39+ x86-64 | Details |
| vectorfit_py-0.2.0-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| vectorfit_py-0.2.0-cp311-cp311-manylinux_2_39_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.39+ x86-64 | Details |
Total release size: 18.9 MB
Release files / vectorfit_py-0.2.0-cp313-cp313-win_amd64.whl
| Download URL | vectorfit_py-0.2.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3c2a84f9dbe9b2e2c18f19e7be8f1635017731826a05f2b21e11ff2c3d22186e
|
|
BLAKE2b-256 checksum How to use checksums |
ae387001264e2450aa67b6802d1a0985c13a82ac71c708167e691f6e3e362237
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / vectorfit_py-0.2.0-cp313-cp313-manylinux_2_39_x86_64.whl
| Download URL | vectorfit_py-0.2.0-cp313-cp313-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.13 Linux glibc 2.39+ x86-64 |
|
SHA-256 checksum How to use checksums |
009f88a07326299f3c2371df68541026945ff0c23427d6b279ba3df215b5d740
|
|
BLAKE2b-256 checksum How to use checksums |
54757261b66553021f9b3dd1298d2527bebe5c49e73fae446e133a67bbaf8392
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / vectorfit_py-0.2.0-cp312-cp312-win_amd64.whl
| Download URL | vectorfit_py-0.2.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fc32f6ba9c380e82f3ce54f0dc8fcbf3f681eb0bb2d2ed906f02325ff04c04b5
|
|
BLAKE2b-256 checksum How to use checksums |
88f140fc45268ad9c42f8e8649830d47858542c54683471bb13636e7398b1356
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / vectorfit_py-0.2.0-cp312-cp312-manylinux_2_39_x86_64.whl
| Download URL | vectorfit_py-0.2.0-cp312-cp312-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.12 Linux glibc 2.39+ x86-64 |
|
SHA-256 checksum How to use checksums |
97fd0b60dbcec63ff32bfd80e887d8c70b35bde4da0e55c3791cc6b1b4dff508
|
|
BLAKE2b-256 checksum How to use checksums |
4eec8b3ecd853cbd2fa518f09688aee14152b009253fbe0d5bb152e49f98da91
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / vectorfit_py-0.2.0-cp311-cp311-win_amd64.whl
| Download URL | vectorfit_py-0.2.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
55d8c0cc7c295651adcdc6854c08ac342d87fd76211b4abdb3bff9f2c0eb9b8d
|
|
BLAKE2b-256 checksum How to use checksums |
484967dc73560ad1e0c464f3ad8070ab47fa346dcca6c192f53e98a6b2165cd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / vectorfit_py-0.2.0-cp311-cp311-manylinux_2_39_x86_64.whl
| Download URL | vectorfit_py-0.2.0-cp311-cp311-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.11 Linux glibc 2.39+ x86-64 |
|
SHA-256 checksum How to use checksums |
dbc62a391c7289a3fd531931a4f00ce68efb55b5fa0681e4b42d71ea6efab181
|
|
BLAKE2b-256 checksum How to use checksums |
5b859568223a803edb4e57842ee00c44e1fac57fb510dc15626bc9fee3aaed7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|