Supplementary data, Python code and images for the paper "Dual Color Imaging from a Single BF2-Azadipyrromethene Fluorophore Demonstrated in vivo for Lymph Node Identification" (Niamh Curtin, Dan Wu,Ronan Cahill, Anwesha Sarkar, Pól Mac Aonghusa, Sergiy Zhuk, Manuel Barberio, Mahdi Al-Taher, Jacques Marescaux, Michele Diana, Donal F. O’Shea)
Dual emissions at ~700 and 800 nm have been achieved from a single NIR-AZA fluorophore 1 by establishing parameters in which it can exist in either its isolated molecular or aggregated states. Dual near infrared (NIR) fluorescence color lymph node (LN) mapping with 1 was achieved in a large-animal porcine model, with injection site, channels and nodes all detectable at both 700 and 800 nm using a preclinical open camera system. The fluorophore was also compatible with imaging using two clinical instruments for fluorescence guided surgery.
Link to ChemRxiv Preprint
Supplementary material for the paper is located in the folder SI_4_Paper
. It contains four mp4 format videos containing the images used in the paper.
- This code was written and tested using Python 3.8. The Numpy, Matplotlib, Seaborn and PIL Python packages are required. *
The Python script read_solaris_ir.py contains all of the code necessary to read raw data files exported from the Perkins-Elmer Solaris imaging stack. The script reads NIR & RGB data sources and outputs Black & White NIT images plus Colour RGB images. The images are labelled sequentially as they are read from the raw data. By default the script will save all the images as PNG image files. It will also create the 3D image overlays shown in the paper. The 3D images take most time to compute - so if you do not require them you can comment out line 411:
plot = make_plot(z, figsize=(15, 15), scale=255 * 257,
wavelength=wl, terrain=underlay)
The Perkins-Elmer archive has a structure like:
root
|_ Project_1
|_ Video_1
:
|_ Video_M
|
:
|_ Project_N
|_ Video_1
:
|_ Video_X
The Project directories are named using the identifier that was entered into the camera when the
project was created at the start of the session. In the example provided our projects were named
'spe_no1, spe_no2, ...' so we use 'spe_no' as the common search string for project directories. I
realise this could be programmed more flexibly - but the objective is to get the data from the
archive - and this is simple and works :-)
The Video_X directories are where the image data are placed. A new Video_X is created every time
the NIR wavelength is changed on the camera.
The following variables (Lines 338 - 341)
are hard-coded default locations and search terms so we can find the Solaris SVM and SVR files and save outputs. You should to edit them to suit your project.
p_search_term = 'spe_no' # We use a search term to navigate the raw data, you entered this when you created the project
v_search_term = 'Video' # Every time you reset the wavelength on the DSolaris stack a new Video XX directory is created under the project
input_dir = 'input' # The root folder where you put the raw data
out_dir = 'output' # Where you want the output to go - the script will use the same project/video subdirectory structurefrom the input folder
Since the images are sequentially numbered it's straightforward to use a utility like ffmpeg
to stitch the images together into videos from the command line if you wish.
The raw data is in the directory input
. It is organised by test subject (spe no1, spe no2)
each test subject has a number of ``Video nn``` subdirectories, one for each tim the wavelength on the Solaris stack was changed.
The data in spe no1/Video 5
comes from a reasonably short case and is useful as a test to check if the Python script is correctly configured.
The resulting video from processing input/spe no1/Video 5
with the Python script and then using ffmpeg
to create an mp4
video
is saved in output/spe no1/Video 5
as spe_no1_Video 5_fluorescence.mp4
.