feat: init

This commit is contained in:
2025-12-04 16:07:30 +08:00
commit 262583a57f
681 changed files with 117578 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

27
.github/ISSUE_TEMPLATE/issue-report.md vendored Normal file
View File

@@ -0,0 +1,27 @@
---
name: Issue report
about: Create an issue to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Traceback**
Please copy and paste the traceback provided in your Anaconda Prompt here.
**Logs & Configuration Files**
Please drag and drop the logs and configuration files here. These are located in your `.navigate` folder, and can be found easily be opening Navigate, selecting File, then `Open Log Files` and `Open Configuration Files`.

13
.github/workflows/black.yml vendored Normal file
View File

@@ -0,0 +1,13 @@
name: Lint
on: workflow_dispatch
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: psf/black@stable
with:
src: "./src"
jupyter: true

54
.github/workflows/build_docs.yaml vendored Normal file
View File

@@ -0,0 +1,54 @@
name: Build Documentation
on:
push:
branches: [ develop ]
paths: [ 'docs/**' ]
workflow_dispatch:
jobs:
deploy:
strategy:
matrix:
python-version: [ "3.9" ]
runs-on: ubuntu-latest
permissions:
contents: write
pages: write
id-token: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- name: Checkout GitHub Pages
uses: actions/checkout@v4
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependencies
run: |
python3 -m pip install --upgrade pip
pip install -e '.[docs]'
- name: Setup Pages
uses: actions/configure-pages@v4
- name: Build HTML with Sphinx
run: |
cd docs
make html
- name: Upload Artifact
uses: actions/upload-pages-artifact@v3
with:
path: './docs/build/html'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

52
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,52 @@
name: deploy
on:
release:
workflow_dispatch:
jobs:
deploy:
runs-on: ${{ matrix.operating-system }}
strategy:
matrix:
python-version: ["3.9"]
operating-system: [windows-latest]
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Create .pypirc file
shell: pwsh
run: |
@"
[distutils]
index-servers =
pypi
navigate-micro
[pypi]
repository: https://upload.pypi.org/legacy/
username: $env:PYPI_USERNAME
password: $env:PYPI_PASSWORD
[navigate-micro]
repository: https://upload.pypi.org/legacy/
username: $env:PYPI_USERNAME
password: $env:PYPI_PASSWORD
"@ | Set-Content -Path $env:USERPROFILE\.pypirc
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -U setuptools build twine
- name: Build and publish
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.TWINE_API_KEY }}
run: |
git tag
python -m build
twine upload -r navigate-micro dist/*

43
.github/workflows/push_checks.yaml vendored Normal file
View File

@@ -0,0 +1,43 @@
# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Tests
on:
push:
branches:
- develop
pull_request:
workflow_dispatch:
jobs:
test:
runs-on: ${{ matrix.operating-system }}
strategy:
matrix:
python-version: ["3.9"]
operating-system: [windows-latest] # [ubuntu-latest, windows-latest]
env:
MPLBACKEND: Agg # https://github.com/microsoft/azure-pipelines-tasks/issues/16426
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e '.[dev]'
- name: Test with pytest
run: |
python3 -m pytest
- name: Codecov
uses: codecov/codecov-action@v3.1.0
with:
token: ${{ secrets.CODECOV_TOKEN }}
directory: ./coverage/reports/
env_vars: OS,PYTHON
fail_ci_if_error: false
files: ./coverage.xml
flags: unittests
name: codecov-umbrella
verbose: true

301
.gitignore vendored Normal file
View File

@@ -0,0 +1,301 @@
# Created by https://www.gitignore.io/api/r,perl,linux,macos,python,windows,microsoftoffice
# Edit at https://www.gitignore.io/?templates=r,perl,linux,macos,python,windows,microsoftoffice
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
*.icloud
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### MicrosoftOffice ###
*.tmp
# Word temporary
~$*.doc*
# Word Auto Backup File
Backup of *.doc*
# Excel temporary
~$*.xls*
# Excel Backup File
*.xlk
# PowerPoint temporary
~$*.ppt*
# Visio autosave temporary files
*.~vsd*
### Perl ###
!Build/
.last_cover_stats
/META.yml
/META.json
/MYMETA.*
*.o
*.pm.tdy
*.bs
# Devel::Cover
cover_db/
# Devel::NYTProf
nytprof.out
# Dizt::Zilla
/.build/
# Module::Build
_build/
Build
Build.bat
# Module::Install
inc/
# ExtUtils::MakeMaker
/blib/
/_eumm/
/*.gz
/Makefile
/Makefile.old
/MANIFEST.bak
/pm_to_blib
/*.zip
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_*
docs/source/_autosummary
# PyBuilder
target/
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
### R ###
# History files
.Rhistory
.Rapp.history
# Session Data files
.RData
# User-specific files
.Ruserdata
# Example code in package build process
*-Ex.R
# Output files from R CMD build
/*.tar.gz
# Output files from R CMD check
/*.Rcheck/
# RStudio files
.Rproj.user/
# produced vignettes
vignettes/*.html
vignettes/*.pdf
# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3
.httr-oauth
# knitr and R markdown default cache directories
*_cache/
/cache/
# Temporary files created by R markdown
*.utf8.md
*.knit.md
### R.Bookdown Stack ###
# R package: bookdown caching files
/*_files/
### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# End of https://www.gitignore.io/api/r,perl,linux,macos,python,windows,microsoftoffice
.vscode/settings.json
temp.py
temp.txt
temp-BICF-JG-LE4350.txt
.idea/*
.idea/
.vscode/launch.json
# Custom Ignore
*.log
*.icloud
src/navigate/log_files/LOGS
*.tiff
*.ipynb
*.tif
test.n5
test_dir
test.xml
*_log.txt
/docs/source/05_reference/_autosummary
/docs/source/05_reference/_autosummary
codex.md

18
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,18 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
hooks:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/psf/black
rev: 22.10.0
hooks:
- id: black
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.0.191'
hooks:
- id: ruff
# Respect `exclude` and `extend-exclude` settings.
args: ["--force-exclude"]

36
LICENSE.md Normal file
View File

@@ -0,0 +1,36 @@
Copyright (c) 2021-2024 The University of Texas Southwestern Medical Center.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are
permitted for academic research use only (subject to the limitations in the
disclaimer below) provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
* Neither the name of the copyright holders nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
ANY USE OR REDISTRIBUTION OF THIS SOFTWARE FOR COMMERCIAL PURPOSES, WHETHER IN SOURCE
OR BINARY FORM, WITH OR WITHOUT MODIFICATION, IS EXPRESSLY PROHIBITED; ANY USE OR
REDISTRIBUTION BY A FOR-PROFIT ENTITY SHALL COMPRISE USE OR REDISTRIBUTION FOR
COMMERCIAL PURPOSES.
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
LICENSE. THIS SOFTWARE, AND ANY ACCOMPANYING DOCUMENTATION, IS PROVIDED BY THE
COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE OR ANY OF ITS ACCOMPANYING DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.

5
MANIFEST.in Normal file
View File

@@ -0,0 +1,5 @@
recursive-include src *.yml
recursive-include src *.yaml
recursive-include src *.ico
recursive-include src *.png
include src/navigate/VERSION

58
README.md Normal file
View File

@@ -0,0 +1,58 @@
<h1 align="center">
<img src="https://github.com/TheDeanLab/navigate/blob/develop/src/navigate/view/icon/mic.ico?raw=true" />
navigate
<h2 align="center">
open source light sheet microscope control
</h2>
</h1>
[![Tests](https://github.com/TheDeanLab/navigate/actions/workflows/push_checks.yaml/badge.svg)](https://github.com/TheDeanLab/navigate/actions/workflows/push_checks.yaml)
[![codecov](https://codecov.io/gh/TheDeanLab/navigate/branch/develop/graph/badge.svg?token=270RFSZGG5)](https://codecov.io/gh/TheDeanLab/navigate)
**navigate** is an open source Python package for control of light-sheet microscopes.
It allows for easily reconfigurable hardware setups and automated acquisition routines.
### Quick install
Download and install [Miniconda](https://docs.conda.io/en/latest/miniconda.html#latest-miniconda-installer-links).
```
conda create -n navigate python=3.9.7
conda activate navigate
pip install git+https://github.com/TheDeanLab/navigate.git
```
To test, run `conda activate navigate` and launch in synthetic hardware mode with `navigate
-sh`. Developers will have to install additional dependencies with
`pip install -e '.[dev]'`.
### Documentation
Please refer to and contribute to the documentation, which can be found on GitHub Pages: [https://thedeanlab.github.io/navigate/](https://thedeanlab.github.io/navigate/).
### Command Line Arguments
Below are the optional arguments that can be passed to the navigate software:
- `-h, --help`
Provides information on the optional arguments that can be passed to **navigate**.
- `-sh, --synthetic_hardware`
Open the software without any hardware attached for testing
and setting up a new system.
- `-c, --configurator`
Open the **navigate** configuration wizard, which provides a
graphical interface for setting up the hardware configuration.
- `-d`
Enables the debugging menu in the software.
- `--config-file`
Pass a non-default `configuration.yaml` file to **navigate**.
- `--experiment_file`
Pass a non-default `experiment.yaml` file to **navigate**.
- `--gui-config-file`
Pass a non-default `gui_config.yaml` file to **navigate**.
- `--waveform-constants-file`
Pass a non-default waveform constants file to **navigate**.
- `--rest_api_file`
Pass a non-default REST API file to **navigate**.
- `--logging_config`
Pass a non-default logging configuration file to **navigate**.

9
codecov.yml Normal file
View File

@@ -0,0 +1,9 @@
coverage:
status:
project: off
patch: off
ignore:
- "test"
- "design"
- "docs"
- "setup.py"

22
docs/Makefile Normal file
View File

@@ -0,0 +1,22 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
$(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS)
$(O)

97
docs/capture_gui.py Normal file
View File

@@ -0,0 +1,97 @@
import tkinter as tk
import os
from navigate.tools.gui import capture_region, tk_window_bbox
from navigate.view.splash_screen import SplashScreen
from navigate.controller.controller import Controller
from navigate.tools.main_functions import create_parser, evaluate_parser_input_arguments
def get_controller():
root = tk.Tk()
root.withdraw()
# Create splash screen
current_directory = os.path.dirname(os.path.realpath(__file__))
splash_screen = SplashScreen(
root,
os.path.join(
current_directory,
"..",
"navigate",
"view",
"icon",
"splash_screen_image.png",
),
)
# Parse arguments with -sh flag
parser = create_parser()
args = parser.parse_args(["-sh"])
# Get paths from arguments
(
configuration_path,
experiment_path,
waveform_constants_path,
rest_api_path,
waveform_templates_path,
logging_path,
configurator,
gui_configuration_path,
multi_positions_path,
) = evaluate_parser_input_arguments(args)
# Create and return controller
controller = Controller(
root,
splash_screen,
configuration_path,
experiment_path,
waveform_constants_path,
rest_api_path,
waveform_templates_path,
gui_configuration_path,
multi_positions_path,
args,
)
return root, controller
if __name__ == "__main__":
root, controller = get_controller()
current_directory = os.path.dirname(os.path.realpath(__file__))
# Main Window
bbox = tk_window_bbox(controller.view)
save_path = os.path.join(
current_directory, f"{controller.view.__class__.__name__}.png"
)
capture_region(*bbox, out_path=save_path)
root.update()
# Settings Tabs
for tab in [
controller.view.settings.camera_settings_tab,
controller.view.settings.channels_tab,
controller.view.settings.stage_control_tab,
controller.view.settings.multiposition_tab,
]:
controller.view.settings.select(tab)
root.update()
bbox = tk_window_bbox(controller.view.settings)
save_path = os.path.join(current_directory, f"{tab.__class__.__name__}.png")
capture_region(*bbox, out_path=save_path)
# Camera Tabs
for tab in [
controller.view.camera_waveform.camera_tab,
# controller.view.camera_waveform.waveform_tab,
controller.view.camera_waveform.mip_tab,
]:
controller.view.camera_waveform.select(tab)
root.update()
bbox = tk_window_bbox(controller.view.camera_waveform)
save_path = os.path.join(current_directory, f"{tab.__class__.__name__}.png")
capture_region(*bbox, out_path=save_path)

50
docs/make.bat Normal file
View File

@@ -0,0 +1,50 @@
@ECHO OFF
REM Save the current directory and change to the script's directory
pushd %~dp0
REM Command file for Sphinx documentation
REM Set the SPHINXBUILD variable if it is not already set
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
REM Define the source and build directories
set SOURCEDIR=source
set BUILDDIR=build
REM Check if sphinx-build is available
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
REM If no argument is provided, show help
if "%1" == "" goto help
REM Handle the linkcheck target
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %SOURCEDIR% %BUILDDIR%/linkcheck %SPHINXOPTS% %O%
goto end
)
REM Run the specified target
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
REM Return to the original directory
popd

View File

@@ -0,0 +1,60 @@
.. _Quick_Start_Guide:
=================================
Quick Start Guide
=================================
This quick start guide covers how to install **navigate**, launch it in synthetic hardware mode to confirm it is working, and save an image to disk.
Installation
------------
1. *Install Miniconda.* Download and install Miniconda from the `official website <https://docs.conda.io/en/latest/miniconda.html>`_.
2. *Create and Activate a Conda Environment.* Launch a Miniconda Prompt (or a Terminal on MacOS) and enter the following.
.. code-block:: console
(base) conda create -n navigate python=3.9.7
(base) conda activate navigate
3. *Install* **navigate**.
.. code-block:: console
(navigate) pip install navigate-micro
4. *Launch* **navigate** *in synthetic hardware mode.* This will allow you to test its functionality without actual hardware.
.. code-block:: console
(navigate) navigate -sh
Saving a Z-Stack to Disk
------------------------
To save an image to disk, follow these steps:
* Launch **navigate** in synthetic hardware mode as described above.
* Next to the :guilabel:`Acquire` button on the upper left, make sure that the acquisition mode in the dropdown is set to "Continuous Scan".
* Press :guilabel:`Acquire` (:kbd:`ctrl + enter`) and confirm that a synthetic noise image is displayed in the :guilabel:`Camera View` window.
.. Note::
At least one channel must be selected (checkbox marked) in the :guilabel:`Channel Settings` window, and all of the parameters (e.g., :guilabel:`Power`) in that row must be populated.
* Select the :guilabel:`Channels` tab. In the :guilabel:`Stack Acquisition Settings` window in this tab, press the :guilabel:`Set Start Pos/Foc` button. This specifies the starting ``Z`` and ``F`` (e.g., Focus) positions for the stack acquisition.
* Select the :guilabel:`Stage Control` tab (:kbd:`ctrl + 3`), move the ``Z`` stage to the desired position (e.g., ``100`` μm), go back to the :guilabel:`Channels` tab (:kbd:`ctrl + 1`), and press the :guilabel:`Set End Pos/Foc` button. This specifies the ending ``Z`` and ``F`` positions for the stack acquisition.
* In the :guilabel:`Stack Acquisition Settings` frame, you can now adjust the step size, which determines the number of slices in a z-stack.
* In the :guilabel:`Timepoint Settings` window, select :guilabel:`Save Data` by marking the checkbox. If the number of timepoints is set to ``1``, only a single stack will be acquired.
* Next to the :guilabel:`Acquire` button on the upper left, change the acquisition mode in the dropdown to "Z-Stack", and press :guilabel:`Acquire` (:kbd:`ctrl + enter`).
* A :guilabel:`File Saving Dialog` popup window will appear.
* With the exception of :guilabel:`Notes`, all fields must be populated. Any spaces in the fields will be replaced with an underscore.
* :guilabel:`Notes` is saved with the metadata, and can be useful for describing the experiment.
* :guilabel:`Solvent` is useful for tissue clearing experiments.
* :guilabel:`File Type` can be set to :guilabel:`.TIFF`, :guilabel:`OME-TIFF`, :guilabel:`H5`, or :guilabel:`N5`. The latter two options are pyramidal file formats that are best used for large datasets and are immediately compatible with `BigDataViewer <https://imagej.net/plugins/bdv/>`_ and `BigStitcher <https://imagej.net/plugins/bigstitcher/index>`_.
* Press :guilabel:`Acquire` to begin the acquisition.
* Once complete, the data can be opened using standard image processing software such as `Fiji <https://imagej.net/software/fiji/>`_.
.. image:: images/save_dialog.png
:align: center
:alt: File Saving Dialog

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,149 @@
=====================
Software Installation
=====================
.. _software_installation:
Computer Specifications
=======================
Below are the recommended specifications for **navigate**.
Operating System Compatibility
------------------------------
.. important::
**navigate** is developed for use on Windows-based systems. This is due to the compatibility of device drivers for various microscope hardware components, such as cameras, stages, and data acquisition cards, which are predominantly designed for the Windows environment. The software is only partially tested on MacOS and Linux systems. Users considering the use of **navigate** software on Linux should proceed with caution and be prepared for potential compatibility issues. For optimal performance and compatibility, it is strongly recommended to run **navigate** on a Windows machine.
.. _computer_considerations:
Computer Considerations
-----------------------
**navigate** will run on a mid-range laptop with at least 8 GB of RAM and a processor with two cores. Most of its operations are undemanding. Saving data at a reasonable rate, however, will require an SSD. The hardware configuration for an example microscope control machine is shown below.
.. important::
Scientific cameras are capable of rapidly generating large amounts of high-resolution data. As such, the read/write speed of the data storage device is critical for smooth operation of the software. For example, for a standard Hamamatsu camera with a 2048 x 2048 sensor, operating at 16-bit depth and 20 frames per second, the data save rate is approximately ~167 MB/s. While such capabilities are well within the capabilities of modern SSDs, they are beyond the capabilities of most HDDs. Therefore, it is recommended to use a fast SSD for data saving operations.
.. collapse:: Example Computer Configuration
- *Base Platform*
- **Product Name**: `Colfax SX6300 Workstation <https://www.colfax-intl.com/workstations/sx6300>`_
- **Colfax Part #**: CX-116263
- *Primary and Secondary CPU*
- **CPU Model**: Intel Xeon Silver 4215R
- **Configuration**: 8 Cores / 16 Threads
- **Frequency**: 3.2 GHz
- **Cache**: 11 MB
- **TDP**: 130W
- **Memory Support**: 2400 MHz
- *Memory*
- **Type**: Registered ECC DDR4
- **Speed**: 3200 MHz
- **Configuration**: 16 GB per socket, 8 sockets per CPU
- **Total RAM**: >64 GB (recommended)
- *Operating System Drive*:
- **Type**: M.2 NVMe SSD
- **Model**: Micron 7450 Max
- **Capacity**: 800 GB
- **Endurance**: 3 DWPD
- *Primary Data Drive*:
- **Type**: NVMe SSD
- **Model**: Samsung PM9A3
- **Capacity**: 7.68 TB
- **Interface**: U.2 Gen4
- *Secondary Data Drive*:
- **Type**: SATA HDD
- **Model**: Seagate Exos X20
- **Capacity**: 20 TB
- **Speed**: 7200 RPM
- **Cache**: 256 MB
- **Interface**: SATA 6.0 Gb/s
- *Video Card*
- **Model**: PNY nVidia T1000
- **Memory**: 4 GB
- **Interface**: PCI Express
- *Network Interface*
- **Model**: Intel X710-T2L RJ45 Copper
- **Type**: Dual Port 10GbE
- **Interface**: PCI-E x 8
.. note::
The specifications listed are based on an example system configuration and can be adjusted based on specific needs and availability.
---------------------
Quick install
=============
**Setup your Python Environment**
Head over to the `miniconda website <https://docs.conda.io/en/latest/miniconda.html>`_ and install the appropriate version based on your operating system.
.. tip::
It is also handy to have the `conda cheatsheet <https://docs.conda.io/projects/conda/en/4.6.0/_downloads/52a95608c49671267e40c689e0bc00ca/conda-cheatsheet.pdf>`_ open when first using miniconda to get accustomed to the commands available.
* Windows: Use the Windows taskbar search to find ``Anaconda Prompt (Miniconda3)``. Given how frequently you will use this, we recommend pinning it to your taskbar. * Linux/Mac: Open a Terminal.
**Create a Python environment called navigate that uses Python version 3.9.7**
.. code-block:: console
(base) MyComputer ~ $ conda create -n navigate python=3.9.7
**Activate the navigate environment**
.. code-block:: console
(base) MyComputer ~ $ conda activate navigate
The active environment is shown in parentheses on the far-left. Originally, we were in the miniconda ``(base)`` environment. After activating the navigate environment, it should now show ``(navigate)``.
**Install navigate via pip**
To install the latest stable release of **navigate**, run the following command:
.. code-block:: console
(navigate) MyComputer ~ $ pip install navigate-micro
To install the bleeding edge version of **navigate**, run the following command:
.. code-block:: console
(navigate) MyComputer ~ $ pip install git+https://github.com/TheDeanLab/navigate.git
**Run navigate software**
.. code-block:: console
(navigate) MyComputer ~ $ navigate
.. note::
If you are running the software on a computer that is not connected to microscope hardware, you can add the flag ``-sh`` (``--synthetic-hardware``) to launch the program:
.. code-block:: console
navigate -sh
Launching **navigate**
======================
Open an ``Anaconda Prompt (Miniconda3)`` and enter the following.
.. code-block:: console
(base) conda activate navigate
(navigate) navigate
.. tip::
If you are running Windows, you can create a desktop shortcut to **navigate** by right-clicking the Desktop, navigating to New and then Shortcut and entering ``%windir%\system32\cmd.exe "/c" C:\path\to\miniconda\Scripts\activate.bat navigate && navigate`` into the location text box.
This provides a convenient executable shortcut to launch the software, which is advantageous for users who are not comfortable with the command line.

View File

@@ -0,0 +1,19 @@
============
I Want To...
============
This section contains how-to documents organized into three levels of difficulty: beginner, intermediate, and advanced.
- The beginner how-to is intended for users who have little to no experience with computer programming and simply wish to acquire an image.
- The intermediate how-to is intended for users who want to learn how to use the graphical user interface to create their own smart acquisition workflows.
- The advanced how-to is intended for users who have experience with computer programming and wish to extend the functionality of **navigate** by adding new devices or writing their own acquisition features.
Through this tiered approach, we hope to provide a gentle introduction to the software while also reaching the maximum number of users.
.. toctree::
:maxdepth: 1
beginner
intermediate
advanced
add_new_device

View File

@@ -0,0 +1,101 @@
======================================
Add a New Hardware Device (Advanced)
======================================
**navigate** includes several standard hardware device types. These include:
- Cameras
- Data Acquisition Cards
- Filter Wheels
- Galvo Scanners
- Lasers
- Deformable Mirrors
- Remote Focusing Systems
- Shutters
- Stages
- Zoom Devices
To add a new piece of hardware to one of these device types requires knowledge about the software's device abstraction layer. Heres a detailed guide to help you integrate a new ``CustomStage`` device into **navigate**. The same principles work for other device types.
.. note::
A strong knowledge of Python and object-oriented programming is required to integrate new hardware devices into **navigate**.
----------------
What is the Device Abstraction Layer?
-------------------------------------
To ensure compatibility and extendability, **navigate** utilizes a device abstraction layer, which allows the same commands to be used across different hardware devices. For example, all stages in **navigate** are programmed to include the `stop()` command, which can be used to stop the stage's movement. When someone hits the :guilabel:`Stop Stage` button on the GUI, this action is relayed from the ``Controller`` to the ``Model`` and ultimately the ``CustomStage``, which communicates with the hardware in a device-specific format to stop the stage's movement.
--------------
Device Integration Approaches
-----------------------------
There are two primary approaches to integrating new hardware into **navigate**:
- **Plugin**: If you want to continue to work with an up-to-date version of **navigate**, consider integrating your new hardware device as a plugin. This allows you to pull updates from the main repository without losing your custom hardware integration. It also allows you to integrate non-standard device types. Learn more about the plugin architecture :ref:`here <plugin>`, and how to write a custom plugin :ref:`here <advanced>`.
- **Fork**: Alternatively, you can fork the **navigate** repository on GitHub and modify it directly. This is useful for custom, in-house developments. In select circumstances, you can contribute your changes back to the main repository through a pull request. Please contact the **navigate** development team for guidance on this approach.
--------------
Device Class Creation
---------------------
- New hardware devices must have a corresponding device class in navigate. To ensure consistency and reduce redundancy, each device must inherit the appropriate abstract base class. For instance, a ``CustomStage`` device would inherit from ``StageBase``.
- Classes should follow CamelCase naming conventions and reflect the device they control (e.g., ``NewportStage`` for a stage from the manufacturer Newport).
- Place the new device class within the appropriate device directory, `src/navigate/model/devices/`.
- Place related API or hardware documentation within the appropriate manufacturer directory, typically under `src/navigate/model/devices/APIs/`.
--------------
Establish Device Communication
------------------------------
- Each device requires a unique method to initialize a connection, which may involve APIs, serial communication, or other protocols. This method should be separate from the device class and is typically located at the beginning of the device file.
- For example, a function named `build_custom_stage_connection()` would handle the connection setup for ``CustomStage`` class.
- By separating the connection setup from the device class, you can easily interact with the hardware device outside of the larger **navigate** ecosystem, which can be useful for debugging and testing (e.g., within a Jupyter notebook).
--------------
Device Class Constructor
------------------------
- The constructor for the device class (`__init__`) should accept parameters for the `microscope_name`, `device_connection`, `configuration_file`, and an optional `device_ID` (useful when multiple instances of the same device are used).
- The constructor should load and enforce device settings from the `configuration_file`. For a new stage, this could be defining the axes mapping between **navigate** and the device, `{x:'X', y:'Y', z:'Z'}`.
- Ensure the device class uses the connection established by your `build_custom_stage_connection` method.
--------------
Device Class Methods
--------------------
- Implement any necessary device-specific methods within your device class.
- Essential methods are inherited from the base class (e.g., ``StageBase`` for the ``CustomStage``), but you can override them or add new methods as needed for specialized functionality.
--------------
Startup and Configuration
-------------------------
- Utilize or modify methods within `src/navigate/model/device_startup_functions` to configure and start your device upon system initialization.
- These functions should handle configuration parsing and the device communication setup.
- Implement a retry mechanism, such as `auto_redial`, to handle communication issues robustly, attempting multiple times before failing.
--------------
Integration with Microscope Object Configurations
-------------------------------------------------
- Each microscope configuration in **navigate** that uses the new device should receive a reference to the established communication object.
- This setup is defined in the *configuration.yaml* and handled within the `device_startup_functions`, ensuring each configuration has access to the necessary hardware.
--------------
Testing and Validation
----------------------
- Thoroughly test the new hardware integration to ensure it functions correctly within navigate, across all intended use cases and configurations.
- The naming convention for test files is: `test_` + module name.
- Device test files are located in `test\model\devices\`
- Device testing utilizes the `pytest` package.
By following these steps, you can effectively integrate new hardware into the **navigate** platform, enhancing its functionality and ensuring it meets specific experimental needs.

View File

@@ -0,0 +1,445 @@
.. _advanced:
=======================================
Write a Custom Device Plugin (Advanced)
=======================================
**navigate**'s :ref:`plugin system <plugin>` enables users to easily incorporate new devices and integrate new features and acquisition modes. In this guide, we will add a new device type, titled ``CustomDevice``, and a dedicated GUI window to control it. This hypothetical ``CustomDevice`` is capable of moving a certain distance, rotating a specified number of degrees, and applying a force to halt its movement.
**navigate** plugins are implemented using a Model-View-Controller architecture. The model contains the device-specific code, the view contains the GUI code, and the controller contains the code that communicates between the model and the view.
-----------------
Initial Steps
-------------
To ease the addition of a new plugin, we have created a template plugin that can be used as a starting point.
* Go to `navigate-plugin-template <https://github.com/TheDeanLab/navigate-plugin-template>`_.
* In the upper right, click "Use this template" and then "Create a new repository".
* In this repository, rename the ``plugin_device`` folder to ``custom_device``.
* Rename the file ``plugin_device.py`` to ``custom_device.py``.
-----------------
Model Code
----------
Create a new custom device using the following code.
.. code-block:: python
class CustomDevice:
""" A Custom Device Class """
def __init__(self, device_connection, *args):
""" Initialize the Custom Device
Parameters
----------
device_connection : object
The device connection object
args : list
The arguments for the device
"""
self.device_connection = device_connection
def move(self, step_size=1.0):
""" Move the Custom Device
Parameters
----------
step_size : float
The step size of the movement. Default is 1.0 micron.
"""
print("*** Custom Device is moving by", step_size)
def stop(self):
""" Stop the Custom Device """
print("*** Stopping the Custom Device!")
def turn(self, angle=0.1):
""" Turn the Custom Device
Parameters
----------
angle : float
The angle of the rotation. Default is 0.1 degree.
"""
print("*** Custom Device is turning by", angle)
@property
def commands(self):
""" Return the commands for the Custom Device
Returns
-------
dict
The commands for the Custom Device
"""
return {
"move_custom_device": lambda *args: self.move(args[0]),
"stop_custom_device": lambda *args: self.stop(),
"rotate_custom_device": lambda *args: self.rotate(args[0]),
}
All devices should be accompanied by synthetic versions, which enables the software to run without the hardware connected. Thus, in a manner that is similar to the ``CustomDevice`` class, we edit the code in ``synthetic_device.py``, albeit without any calls to the device itself.
.. code-block:: python
class SyntheticCustomDevice:
""" A Synthetic Device Class """
def __init__(self, device_connection, *args):
""" Initialize the Synthetic Device
Parameters
----------
device_connection : object
The device connection object
args : list
The arguments for the device
"""
pass
def move(self, step_size=1.0):
""" Move the Synthetic Device
Parameters
----------
step_size : float
The step size of the movement. Default is 1.0 micron.
"""
print("*** Synthetic Device receive command: move", step_size)
def stop(self):
""" Stop the Synthetic Device """
print("*** Synthetic Device receive command: stop")
def rotate(self, angle=0.1):
""" Turn the Synthetic Device
Parameters
----------
angle : float
The angle of the rotation. Default is 0.1 degree.
"""
print("*** Synthetic Device receive command: turn", angle)
@property
def commands(self):
""" Return the commands for the Synthetic Device.
Returns
-------
dict
The commands for the Synthetic Device
"""
return {
"move_custom_device": lambda *args: self.move(args[0]),
"stop_custom_device": lambda *args: self.stop(),
"rotate_custom_device": lambda *args: self.rotate(args[0]),
}
Edit ``device_startup_functions.py`` to tell **navigate** how to connect to and start the ``CustomDevice``. This is the portion of the code that actually makes a connection to the hardware. ``load_device()`` should return an object that can control the hardware.
**navigate** establishes communication with each device independently, and passes the instance of that device to class that controls it (e.g., in this case, the `CustomDevice` class). This allows **navigate** to be initialized with multiple microscope :ref:`configurations <multiple_microscopes>`, some of which may share devices.
.. code-block:: python
# Standard library imports
import os
from pathlib import Path
# Third party imports
# Local application imports
from navigate.tools.common_functions import load_module_from_file
from navigate.model.device_startup_functions import (
auto_redial,
device_not_found,
DummyDeviceConnection,
)
DEVICE_TYPE_NAME = "custom_device"
DEVICE_REF_LIST = ["type"]
def load_device(configuration, is_synthetic=False):
""" Load the Custom Device
Parameters
----------
configuration : dict
The configuration for the Custom Device
is_synthetic : bool
Whether the device is synthetic or not. Default is False.
Returns
-------
object
The Custom Device object
"""
return DummyDeviceConnection()
def start_device(microscope_name, device_connection, configuration, is_synthetic=False):
""" Start the Custom Device
Parameters
----------
microscope_name : str
The name of the microscope
device_connection : object
The device connection object
configuration : dict
The configuration for the Custom Device
is_synthetic : bool
Whether the device is synthetic or not. Default is False.
Returns
-------
object
The Custom Device object
"""
if is_synthetic:
device_type = "synthetic"
else:
device_type = configuration["configuration"]["microscopes"][microscope_name][
"custom_device"
]["hardware"]["type"]
if device_type == "CustomDevice":
custom_device = load_module_from_file(
"custom_device",
os.path.join(Path(__file__).resolve().parent, "custom_device.py"),
)
return custom_device.CustomDevice(
microscope_name, device_connection, configuration
)
elif device_type == "synthetic":
synthetic_device = load_module_from_file(
"custom_synthetic_device",
os.path.join(Path(__file__).resolve().parent, "synthetic_device.py"),
)
return synthetic_device.SyntheticDevice(
microscope_name, device_connection, configuration
)
else:
device_not_found(microscope_name, device_type)
-----------------
View Code
---------
To add a GUI control window, go to the ``view`` folder, rename ``plugin_name_frame.py`` to ``custom_device_frame.py``, and edit the code as follows.
.. code-block:: python
# Standard library imports
import tkinter as tk
from tkinter import ttk
# Third party imports
# Local application imports
from navigate.view.custom_widgets.LabelInputWidgetFactory import LabelInput
class CustomDeviceFrame(ttk.Frame):
""" The Custom Device Frame """
def __init__(self, root, *args, **kwargs):
""" Initialize the Custom Device Frame
Parameters
----------
root : object
The root Tk object
args : list
The arguments for the Custom Device Frame
kwargs : dict
The keyword arguments for the Custom Device Frame
"""
ttk.Frame.__init__(self, root, *args, **kwargs)
# Formatting
tk.Grid.columnconfigure(self, "all", weight=1)
tk.Grid.rowconfigure(self, "all", weight=1)
# Dictionary for widgets and buttons
#: dict: Dictionary of the widgets in the frame
self.inputs = {}
self.inputs["step_size"] = LabelInput(
parent=self,
label="Step Size",
label_args={"padding": (0, 0, 10, 0)},
input_class=ttk.Entry,
input_var=tk.DoubleVar(),
)
self.inputs["step_size"].grid(row=0, column=0, sticky="N", padx=6)
self.inputs["step_size"].label.grid(sticky="N")
self.inputs["angle"] = LabelInput(
parent=self,
label="Angle",
label_args={"padding": (0, 5, 25, 0)},
input_class=ttk.Entry,
input_var=tk.DoubleVar(),
)
self.inputs["angle"].grid(row=1, column=0, sticky="N", padx=6)
self.inputs["angle"].label.grid(sticky="N")
self.buttons = {}
self.buttons["move"] = ttk.Button(self, text="MOVE")
self.buttons["rotate"] = ttk.Button(self, text="ROTATE")
self.buttons["stop"] = ttk.Button(self, text="STOP")
self.buttons["move"].grid(row=0, column=1, sticky="N", padx=6)
self.buttons["rotate"].grid(row=1, column=1, sticky="N", padx=6)
self.buttons["stop"].grid(row=2, column=1, sticky="N", padx=6)
# Getters
def get_variables(self):
variables = {}
for key, widget in self.inputs.items():
variables[key] = widget.get_variable()
return variables
def get_widgets(self):
return self.inputs
.. tip::
**navigate** comes equipped with a large number of validated widgets, which prevent users from entering invalid values that can crash the program or result in undesirable outcomes. It is highly recommended that you use these, which include the following:
* The ``LabelInput`` widget conveniently combines a label and an input widget into a single object. It is used to create the ``step_size`` and ``angle`` widgets in the code above.
* The ``LabelInput`` widget can accept multiple types of ``input_class`` objects, which can include standard tkinter widgets (e.g., spinbox, entry, etc.) or custom widgets. In this example, we use the ``ttk.Entry`` widget.
* Other examples of validated widgets include a ``ValidatedSpinbox``, ``ValidatedEntry``, ``ValidatedCombobox``, and ``ValidatedMixin``.
* Please see the :any:`navigate.view.custom_widgets` module for more details.
-----------------
Controller Code
----------------
Now, let's build a controller. Open the ``controller`` folder, rename ``plugin_name_controller.py`` to ``custom_device_controller.py``, and edit the code as follows.
.. code-block:: python
# Standard library imports
import tkinter as tk
# Third party imports
# Local application imports
from navigate.controller.sub_controllers.gui_controller import GUIController
class CustomDeviceController(GUIController):
""" The Custom Device Controller """
def __init__(self, view, parent_controller=None):
""" Initialize the Custom Device Controller
Parameters
----------
view : object
The Custom Device View object
parent_controller : object
The parent (e.g., main) controller object
"""
super().__init__(view, parent_controller)
# Get the variables and buttons from the view
self.variables = self.view.get_variables()
self.buttons = self.view.buttons
# Set the trace commands for the variables associated with the widgets in the View.
self.buttons["move"].configure(command=self.move_device)
self.buttons["rotate"].configure(command=self.rotate_device)
self.buttons["stop"].configure(command=self.stop_device)
def move_device(self, *args):
""" Listen to the move button and move the Custom Device upon clicking.
Parameters
----------
args : list
The arguments for the move_device function. Should be included as the tkinter event
is passed to this function.
"""
self.parent_controller.execute(
"move_custom_device", self.variables["step_size"].get()
)
def rotate_device(self, *args):
""" Listen to the rotate button and rotate the Custom Device upon clicking.
Parameters
----------
args : list
The arguments for the rotate_device function. Should be included as the tkinter event
is passed to this function.
"""
self.parent_controller.execute(
"rotate_custom_device", self.variables["angle"].get()
)
def stop_device(self, *args):
""" Listen to the stop button and stop the Custom Device upon clicking.
Parameters
----------
args : list
The arguments for the stop_device function. Should be included as the tkinter event
is passed to this function.
"""
self.parent_controller.execute("stop_custom_device")
In each case above, the sub-controller for the ``custom-device`` establishes what actions should take place once a button in the view is clicked. In this case, the methods ``move_device``, ``rotate_device``, and ``stop_device``. This triggers a sequence of events:
* The sub-controller passes the command to the parent controller, which is the main controller for the software.
* The parent controller passes the command to the model, which is operating in its own sub-process, using an event queue. This eliminates the need for the controller to know anything about the model and prevents race conditions.
* The model then executes command, and any updates to the controller from the model are relayed using another event queue.
-----------------
Plugin Configuration
--------------------
Next, update the ``plugin_config.yml`` file as follows:
.. code-block:: yaml
name: Custom Device
view: Popup
Remove the folder ``./model/features``, the file ``feature_list.py``, and the file ``plugin_acquisition_mode.py``. The plugin folder structure is as follows.
.. code-block:: none
custom_device/
├── controller/
│ └── custom_device_controller.py
|
├── model/
| └── devices/
│ └── custom_device/
│ ├── device_startup_functions.py
│ ├── custom_device.py
│ └── synthetic_device.py
├── view/
| └── custom_device_frame.py
└── plugin_config.yml
Install the plugin using one of two methods:
* Install a plugin by putting the whole plugin folder directly into ``navigate/plugins/``. In this example, put ``custom_device`` folder and all its contents into ``navigate/plugins``.
* Alternatively, install this plugin through the menu :menuselection:`Plugins --> Install Plugin` by selecting the plugin folder.
The plugin is ready to use. For this plugin, you can now specify a CustomDevice in the ``configuration.yaml`` as follows.
.. code-block:: yaml
microscopes:
microscope_1:
daq:
hardware:
name: daq
type: NI
...
custom_device:
hardware:
type: CustomDevice
The ``custom_device`` will be loaded when **navigate** is launched, and it can be controlled through the GUI.

View File

@@ -0,0 +1,207 @@
.. _beginner:
===========================
Acquire an Image (Beginner)
===========================
This guide will describe how to acquire a single image and a z-stack using the **navigate** software package.
Launching the Software Package
==============================
Open Anaconda Prompt
--------------------
To start, you need to open the Anaconda Prompt. Follow these steps:
1. On Windows, click on the Start menu.
2. Type ``Anaconda Prompt`` into the search bar.
3. Click on the Anaconda Prompt application to open it.
.. note:: Ensure that Anaconda and **navigate** are already installed on your system. If not, please refer to our :ref:`Quick_Start_Guide` for more information.
Activate Conda Environment
--------------------------
Once the Anaconda Prompt is open, activate the desired conda environment. By default, the command prompt will open the base environment (as shown in parentheses). To activate **navigate** environment, type the following command into the Anaconda command window and press :kbd:`Enter`:
.. code-block:: console
(base) conda activate navigate
Launch the Software Package
---------------------------
After activating the environment, **navigate** should now be shown in parentheses. After you have already :ref:`configured <setup_microscope>` **navigate**, you can launch it by typing the following command into the Anaconda command window:
.. code-block:: console
(navigate) navigate
The **navigate** software package will launch and the main window will appear.
.. image:: images/beginner/open-navigate.png
:alt: Opening **navigate**.
Configure the Channel Settings
==============================
* Select the :guilabel:`Channels` tab, which is located on the upper left of the main window.
* Under the :guilabel:`Channel Settings` section, select the number of channels needed for imaging. For each channel selected, you will need to configure the acquisition settings:
.. image:: images/beginner/channel-selector.png
:alt: Channel settings in the **navigate** software package.
* Select the appropriate :guilabel:`Laser` from the dropdown menu.
* Select the appropriate :guilabel:`Power` for the laser.
* Select the appropriate emission :guilabel:`Filter` from the dropdown menu.
.. image:: images/beginner/channel-selector-filter.png
:alt: Changing the emission filter in **navigate**.
* Specify the camera :guilabel:`Exp. Time (ms)`. A good default value is ``100`` or ``200`` ms.
* Specify the :guilabel:`Interval` to be ``1.0``. While this feature is not currently implemented, future releases will allow users to image different channels at different time intervals.
* Specify the :guilabel:`Defocus` to be ``0``. This feature allows you to adjust for chromatic aberrations that result in focal shifts between each imaging channel.
Configure the Camera Settings
=============================
* Select the :guilabel:`Camera Settings` tab.
* For standard imaging applications, select :guilabel:`Normal` in the :guilabel:`Sensor Modes` dropdown menu within the :guilabel:`Camera Modes` section.
* If you are using the rolling shutter, select :guilabel:`Light-Sheet` and specify its :guilabel:`Readout Direction` and :guilabel:`Number of Pixels`.
.. note:: For more information on how to configure the rolling shutter for ASLM operation, please refer to :ref:`ASLM <setup_aslm>`.
.. image:: images/beginner/sensor-mode.png
:alt: Changing the camera sensor mode in **navigate**.
* Choose the size of your camera's field of view.
* Specify the :guilabel:`Region of Interest Settings` by entering the appropriate :guilabel:`Number of Pixels` for both the :guilabel:`Width` and :guilabel:`Height` values. Alternatively, one can select from one of several default values in the :guilabel:`Default FOVs` section.
.. note:: The :guilabel:`FOV Dimensions (microns)` is automatically calculated based on the :guilabel:`Number of Pixels` and the `pixel_size` as specified in the `zoom` section of your ``configuration.yaml`` file.
.. code-block:: yaml
zoom:
pixel_size:
20x: 0.325 # magnification, and pixel size in microns
.. image:: images/beginner/ROI-definition.png
:alt: Changing the camera region of interest in **navigate**.
.. note:: If multiple channels are selected, each channel will be acquired with the same camera :guilabel:`Sensor Mode`, :guilabel:`Readout Direction`, and :guilabel:`Region of Interest Settings`.
Acquire in a Continuous Scan Mode
=================================
* Select "Continuous Scan" in the dropdown next to the :guilabel:`Acquire` button in the :ref:`acquisition bar <ui_acquisition_bar>`.
.. image:: images/beginner/continuous-scan-dropdown.png
:alt: Selecting the continuous scan mode in **navigate**.
* Press :guilabel:`Acquire`. This will launch a live acquisition mode.
.. note:: If multiple channels are selected, each channel will be imaged sequentially. The order of imaging is determined by the order of the channels in the :guilabel:`Channel Settings` section of the :guilabel:`Channels` tab, and will proceed from the top to the bottom of this channel list.
.. image:: images/beginner/continuous-scan-acquire.png
:alt: Launching the continuous scan mode in **navigate**.
* Move the stage to identify the location of the sample.
* Select the :guilabel:`Stage Control` tab, and use the graphical user interface to move the stage. This includes buttons for moving the stage in ``X``, ``Y``, ``Z``, ``F``, and ``Theta`` directions.
* The step size for each axis can be adjusted with the spinbox next to each button.
* For stages loaded in a synthetic mode, buttons will be disabled.
* Absolute positions can be entered in the text boxes next to each button.
* Check :ref:`configuration settings <configuration_file>` for more information.
* Alternatively, if available, use the manufacturer-provided joystick to position the sample.
.. note:: The axes for a light-sheet microscope vary in the literature. Here, we define the ``Y`` axis as the direction of the light-sheet propagation, the ``Z`` axis as the direction of the detection objective, and the ``X`` axis as the direction perpendicular to the light-sheet and detection objective axes. The ``F`` axis typically controls the position of the detection objective along the detection axis. The ``Theta`` axis typically controls the rotation of the sample.
.. warning:: One should always be careful when moving the stage. If the stage is moved too quickly, the sample and/or microscope may be damaged. We strongly recommend that you implement stage limits in your configuration file. Please refer to the :ref:`configuration settings <configuration_file>` for more information.
.. image:: images/beginner/stage-movement-panel.png
:alt: Moving the stage in **navigate**.
* Press the :guilabel:`Stop` button in the acquisition bar to stop acquisition.
.. image:: images/beginner/stop-acquisition.png
:alt: Stopping the continuous scan mode in **navigate**.
Acquiring a Single Image
=========================
* Check the :guilabel:`Save Data` box in the :guilabel:`Timepoint Settings` section under the :guilabel:`Channels` tab to save the acquired images. Check this box before acquiring data.
.. image:: images/beginner/save-data.png
:alt: Saving data in **navigate**.
* Select :guilabel:`Single Acquisition` from the dropdown next to the :guilabel:`Acquire` button.
.. image:: images/beginner/single-acquisition-dropdown.png
:alt: Selecting the single acquisition mode in **navigate**.
* Press :guilabel:`Acquire` to open the :guilabel:`File Saving Dialog` interface. Enter the sample parameters, notes, location to save file, and filetype in the :guilabel:`File Saving Dialog` that pops up.
.. image:: images/beginner/save-dialog-box.png
:alt: Saving data in **navigate**.
* Press :guilabel:`Acquire Data` to initiate acquisition. Acquisition will automatically stop once the image is acquired.
.. note:: Each acquisition will be saved in a separate folder (e.g., ``Cell01``, ``Cell02``, ...) within the directory specified in the :guilabel:`File Saving Dialog` interface. Data will not be overwritten between acquisitions.
.. image:: images/beginner/save-dialog-box-acquire.png
:alt: Saving data in **navigate**.
.. _i_want_to_z_stack:
Acquiring a Z-Stack
===================
* Using the :guilabel:`Stage Control`, go to the desired z-position in the sample. Make sure that the sample is in focus. To use the autofocus feature, please refer to the :ref:`Autofocus Settings <ui_autofocus>`.
.. image:: images/beginner/stage-control-start-pos-zstack.png
:alt: Adjusting the stage position in **navigate**.
* Under the :guilabel:`Channels` tab, in :guilabel:`Stack Acquisition Settings (μm)` press :guilabel:`Set Start Pos`.
.. image:: images/beginner/press-start-pos.png
:alt: Adjusting the stage position in **navigate**.
* Using the :guilabel:`Stage Control`, go to a different z-position within the sample. Again, make sure that the sample is in focus.
.. image:: images/beginner/stage-control-end-pos-zstack.png
:alt: Adjusting the stage position in **navigate**.
* Under the :guilabel:`Channels` tab, in :guilabel:`Stack Acquisition Settings (μm)` press :guilabel:`Set End Pos`.
.. image:: images/beginner/press-end-pos.png
:alt: Adjusting the stage position in **navigate**.
.. note:: If there is a shift in ``F`` between the start and stop positions, the ``F`` axis will be ramped synchronously with ``Z`` to maintain focus. Check :ref:`configuration settings <configuration_file>` for more information to determine if focus is enabled in hardware. Refer to :ref:`Imaging on a mesoSPIM BT <acquire_mesospimbt>` section for an example of how to acquire a z-stack with a focus ramp.
* Type the desired step size in microns in the :guilabel:`Step Size` dialog box in :guilabel:`Stack Acquisition Settings (μm)`.
.. note:: The minimum step size, and increment between steps, are graphical user interface defaults that are specified in the ``configuration.yaml`` file. More information can :ref:`configuration settings <configuration_file>`.
.. code-block:: yaml
gui:
stack_acquisition:
step_size:
min: 0.100
max: 1000
step: 0.1
.. image:: images/beginner/define-step-size.png
* If using multiple channels for imaging, select either :guilabel:`Per Z` or :guilabel:`Per Stack` under :guilabel:`Laser Cycling Settings` in the :guilabel:`Stack Acquisition Settings (μm)` section under the :guilabel:`Channels` tab.
* :guilabel:`Per Z` acquires all channels before moving the stage to a new position.
* :guilabel:`Per Stack` acquires all images in a stack acquisition for a single channel before moving the stage back to the start position and restarting acquisition for the subsequent channel until all channels are imaged.
.. image:: images/beginner/laser-cycling-settings.png
* Select :guilabel:`Z-Stack` from the dropdown next to the :guilabel:`Acquire` button. Press :guilabel:`Acquire`.
.. image:: images/beginner/z-stack-acquisition.png
* Enter the sample parameters, notes, location to save file, and filetype in the :guilabel:`File Saving Dialog` that pops up.
* Press :guilabel:`Acquire Data` to initiate acquisition. Acquisition will automatically stop once the image series is acquired.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

View File

@@ -0,0 +1,92 @@
.. _intermediate:
================================================
Write A Smart Acquisition Routine (Intermediate)
================================================
**navigate**'s :ref:`feature container <user_guide_features>` enables us to write acquisition routines on the fly by chaining existing :ref:`features <user_guide_features>` into lists. Please see :ref:`Currently Implemented Features <currently_implemented_features>` for a complete list of features. Users can build additional features within :ref:`plugins <plugin>`.
In this guide, we will use existing features to write a routine that scans through an imaging chamber and takes z-stacks only where it finds the sample.
Suppose there are two positions listed in the :ref:`multiposition table <ui_multiposition>`, one containing tissue and one empty, as shown below.
.. image:: images/intermediate/multiposition_tissue.png
.. image:: images/intermediate/multiposition_empty.png
We will build a feature that scans both positions, but only takes a z-stack at the one containing tissue. To access the GUI feature list editor, navigate to :menuselection:`Features --> Add Customized Feature List`. A window titled "Add New Feature List" will pop up. Enter ``TestFeature`` in the text box at the top of the popup. Enter
.. code-block:: python
[{"name": PrepareNextChannel}]
in the text box at the bottom of this popup and press :guilabel:`Preview`. The window should appear as below.
.. image:: images/feature_gui_1.png
The square brackets ``[]`` create a sequence of events to run in the feature container. The ``{}`` braces contain features. In this case, we have a single feature, ``PrepareNextChannel``, which will set up the next color channel for acquisition. The complete sequence (as it stands) will take an image in the first :ref:`selected color channel <ui_channel_settings>`.
We can build much of the rest of our desired acquisition in the GUI. Right-click on the ``PrepareNextChannel`` tile to reveal the editing menu.
.. image:: images/feature_gui_2.png
Select :guilabel:`Insert After`. A second copy of ``PrepareNextChannel`` will appear in the feature list.
.. image:: images/feature_gui_3.png
Left-click on this second tile to reveal a popup that allows us to select which feature we want to use in this tile.
.. image:: images/feature_gui_4.png
Select ``MoveToNextPositionInMultiPositionTable`` and then close the popup. Your feature list editing window should now appear as below.
.. image:: images/feature_gui_5.png
Our feature now takes one image of the first selected color channel at each position in the multiposition table.
Now, right-click ``MoveToNextPositionInMultiPositionTable`` and press :guilabel:`Insert After`. Click the new tile and change it to ``DetectTissueInStackAndReturn``. There are three options associated with this feature.
.. image:: images/feature_gui_6.png
* :guilabel:`planes` indicates how many planes of the z-stack this feature should check for tissue.
* :guilabel:`percentage` indicates what percent of the total image must contain tissue for this feature to return ``true`` that tissue was detected. 1 indicates that the entire image contains tissue, 0.5 indicates that half of the image contains tissue, and so on.
* :guilabel:`detect_func` is one of the tissue detection functions in :doc:`remove_empty_tiles <../../../05_reference/_autosummary/navigate.model.features.remove_empty_tiles>`. If this is set to ``None``, it defaults to ``detect_tissue()``, which states that tissue is present if signal is above the Otsu threshold of the stack of images acquired.
In this example, if any plane meets the desired threshold, the feature will return ``true`` and it will be acquired. If no plane meets the desired threshold, the feature will return ``false``.
Now, right-click ``DetectTissueInStackAndReturn`` and press :guilabel:`Insert After`. Click the new tile and change it to ``LoopByCount``.
.. image:: images/feature_gui_7.png
We want to iterate over all of the positions in the multi-position table, so we will set ``steps`` to ``experiment.MicroscopeState.multiposition_count``.
Notice that the acquisition protocol does not appear to loop, but rather still moves in a sequence. This is because all of the tiles are still in the sequence brackets ``[]``. We can now enclose the section of the protocol we want to loop in parentheses ``()`` and press :guilabel:`Preview` to see the update.
.. image:: images/feature_gui_8.png
Now, we set up one color channel to image (``PrepareNextChannel``), and then within this channel visit every position in the multiposition table, and detect if there is tissue. However, we do not yet make any decisions of what to do if tissue is found. To do this, we will convert ``DetectTissueInStackAndReturn`` into a decision node.
To do this, we add ``true`` and ``false`` options within the feature braces:
.. code-block:: python
{"name": DetectTissueInStackAndReturn,
"args": (1, 0.5, None),
"true": [{"name": ZStackAcquisition,"args": (False,False,"z-stack",),}],
"false": "continue",}
Our ``true`` argument tells the software what to do if tissue is detected. In this case, we take a z-stack at the positions where tissue is found. The ``false`` argument tells the software how to proceed if no tissue is found. In this case, the ``continue`` option tells the software to keep moving through the loop to the next position in the multi-position table. Press :guilabel:`Preview` to see the update.
.. image:: images/feature_gui_9.png
``DetectTissueInStackAndReturn`` now has a red border, indicating it is a decision node. Click on it to access the decision node GUI.
.. image:: images/feature_gui_10.png
This contains the same settings for ``DetectTissueInStackAndReturn`` we saw before, but now also features GUI editing windows for the results of ``true`` and ``false`` decisions arising from this node.
Close the node window and press :guilabel:`Add` in the "Add New Feature List" window. This feature is now available under :menuselection:`Features --> TestFeature` and can be run in "Customized" :ref:`acquisition mode <ui_acquisition_bar>`.
Select "Customized" acquisition mode, select :menuselection:`Features --> TestFeature`, and press :guilabel:`Acquire`. For the positions shown at the start of this guide, the software will go to the first position in the multi-position table, decide there is tissue present, and take a z-stack. It will then go to the second position in the multi-position table, find there is no tissue, and decide not to take a z-stack. It will then exit the loop as no more positions are available in the multi-position table.
Now you can use this feature or build another smart acquisition routine suited to your microscope's needs.

View File

@@ -0,0 +1,288 @@
.. _camera_configuration:
=======
Cameras
=======
The software supports camera-based acquisition. It can run both normal and rolling
shutter modes of contemporary scientific CMOS cameras.
-------------------
Daheng
------
MER2-1220-32U3C
~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information on the Daheng MER2-1220-32U3C camera can be found
`here <https://en.daheng-imaging.com/show-106-1997-1.html>`_.
.. warning::
This camera class has not been internally tested by our team. Users are advised to exercise caution when using it.
.. note::
This camera requires Daheng Imaging's proprietary Python SDK and must be installed manually. Download the SDK `here <https://www.daheng-imaging.com/>`_. Locate 'gxipy' under: Development/Samples/Python/gxipy and then install it using pip. Also, this camera class uses the Line0 trigger input by default for external triggering.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: daheng.Daheng
serial_number: "123456"
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|
Hamamatsu
---------
.. note::
**navigate** has been tested with the following versions of the Hamamatsu's
drivers:
- DCAM API: 20.7.641, 21.7.4321, 22.9.6509, 22.11.4321, 23.12.6736
- Camera Firmware: 2.21B, 2.53.A, 3.20.A, 4.30.B,
- Active Silicon CoaXpress: 1.10, 1.13, 1.21.
-----------------
ORCA-Flash4.0 V3
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :ref:`Install Directions <dcam>`.
- `ORCA-Flash 4.0 v3 Manual <https://www.hamamatsu
.com/us/en/product/cameras/cmos-cameras/C13440-20CU.html>`_.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: HamamatsuOrca
serial_number: 111
camera_connection:
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|
------------------
ORCA-Fusion
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :ref:`Install Directions <dcam>`.
- `ORCA-Fusion Manual <https://www.hamamatsu
.com/jp/en/product/cameras/cmos-cameras/C15440-20UP.html>`_.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: HamamatsuOrcaFusion
serial_number: 111
camera_connection:
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|
------------------
ORCA-Lightning
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :ref:`Install Directions <dcam>`.
- `ORCA-Lightning Manual <https://camera.hamamatsu.com/content/dam/hamamatsu-photonics/sites/static/sys/en/manual/C14120-20P_IM_En.pdf>`_.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: HamamatsuOrcaLightning
serial_number: 111
camera_connection:
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|
------------------
ORCA-Fire
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :ref:`Install Directions <dcam>`.
- `ORCA-Fire Manual <https://www.hamamatsu.com/us/en/product/cameras/cmos-cameras/C16240-20UP.html>`_.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: HamamatsuOrcaFire
serial_number: 111
camera_connection:
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|
------------------
Photometrics
------------
- :ref:`Install Directions <pvcam>`.
.. note::
**navigate** has been tested with the following versions of the Photometric's drivers:
- PVCAM: 3.9.13
-----------------
Iris 15
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: Photometrics
serial_number: 111
camera_connection: PMPCIECam00
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|
-----------------
Ximea
--------------------------------
MU196MR-ON
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: ximea.MU196XR
serial_number: 111
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
gain: 1
pixel_size_in_microns: 1.4
readout_port: 0
readout_speed: 1.0
settle_down: 0.0
speed_table_index: 0
supported_readout_directions: ['Top-to-Bottom']
supported_sensor_modes: ['Normal']
supported_trigger_sources: ['External']
trigger_active: 1.0
trigger_mode: 1.0
trigger_polarity: 2.0
trigger_source: 2.0
x_pixels: 5112
x_pixels_min: 192
x_pixels_step: 24
y_pixels: 3840
y_pixels_min: 2
y_pixels_step: 2
|
------------------
.. _synthetic_camera:
Synthetic Camera
----------------
The synthetic camera simulates noise images from an sCMOS camera. If no camera is present,
the synthetic camera class must be used.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
camera:
hardware:
type: synthetic
serial_number: 111
camera_connection:
defect_correct_mode: 2.0
delay: 1.0 #ms
settle_down: 0.1 #ms
flip_x: False
flip_y: False
|

View File

@@ -0,0 +1,221 @@
======================
Data Acquisition Cards
======================
Data acquisition cards deliver and receive analog and digital signals.
To acquire an image, the software calculates all of the analog and digital waveforms and
queues these waveforms on the data acquisition card. Upon receipt of a trigger (either from the software itself,
or an external piece of hardware), all
of the analog and digital signals are delivered in parallel. This provides
deterministic behavior on a per-frame basis, which is necessary for proper acquisition of light-sheet data.
It does not however provide us with deterministic behavior between image
frames, and some jitter in timing is anticipated.
------------------
.. _hardware_ni:
National Instruments
--------------------
In principle, most NI-based data acquisition cards should work with the software, so long
as there are a sufficient number of analog and digital ports, and the sampling rate (typically 100 kHz)
is high enough per port.
Prior to installing the card within
the computer, first install the `NI-DAQmx drivers <https://www.ni.com/en/support/downloads/drivers/download.ni-daq-mx.html>`_.
Once installed, connect the PCIe or PXIe-based device to the computer. A functioning
system should be recognized by the operating system, and visible in the Windows Device
Manager as a **NI Data Acquisition Device**.
.. note::
**navigate** has been tested with the following versions of the NI-DAQmx drivers:
- 22.5.0
- 22.8.0
- 23.3.0
- 23.8.0
.. tip::
**The most important aspect is to wire up the breakout box properly.**
To find the device pin outs for your NI-based data acquisition card, open NI
MAX, find the card under devices, right-click and select "device pinouts".
Important: Should you use the SCB-68A breakout box, do not look at the pinout on
the back of the cover. This is misleading. You must look at the device pinouts in
NI MAX.
.. note::
For NI-based cards, ``port0/line1`` is the equivalent of ``P0.1``.
There are multiple pins for each PFIO, including source, out, gate, etc. You must
use the out terminal.
- Identify the device name in NI MAX, and change it if you would like. Common names are
``Dev1``, ``Dev2``, etc. This name must correspond with the pinouts provided in the
configuration file.
- Connect the ``master_trigger_out_line`` to the ``trigger_source`` with a direct wire,
commonly ``PXI6259/port0/line1`` and ``/PXI6259/PFI0``. In this example, the default name
for the device (e.g., ``Dev1``) has been changed to ``PXI6259``.
- Connect the ``camera_trigger_out_line`` to the ``Ext. Trigger`` on the camera using
the ``CTR0Out`` pin.
- These values must precisely match those in the configuration file. An example is provided below:
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
daq:
hardware:
type: NI
sample_rate: 10000
master_trigger_out_line: PXI6259/port0/line1
camera_trigger_out_line: /PXI6259/ctr0
trigger_source: /PXI6259/PFIO
laser_port_switcher: PXI6733/port0/line0
laser_switch_state: False
|
------------------
**navigate** has been tested with the following NI-based cards:
PCIe/PXIe-6738
"""""""""""""""
The PCIe-6738 can only create one software-timed analog task for every four channels.
As such, the lasers much be attached to analog output ports outside of the banks (shown as solid lines in the device pinout) used
by the galvo/remote focus units. For example, if you use ao0, ao2, and ao6 for the
remote focus, galvo, and galvo stage, the lasers should be connected to ao8, ao9, and
ao10. In such a configuration, they will not compete with the other analog output
ports. Since only one task will be created created on the ao8, ao9, ao10 bank at a time
(only one laser is on at a time), only one laser can be on at a time. If we wanted to
turn lasers on simultaneously, we could distribute the lasers across independent banks
(e.g. ao8, ao14, ao19).
.. collapse:: Device Pinout
.. image:: images/6738_pinout.png
|
------------------
PCIe/PXIe-6259
"""""""""""""""
The PXI-6259 can create one software-timed analog task per channel. As such, the
galvo/remote focus/lasers can be attached to any of the analog output ports. The 6259 has
two connectors, and it is important to make sure that the analog and digital ports that you
are using are connected to the correct connector. For example, if you are using ``ao0``, this is
located on ``connector 0``.
.. collapse:: Device Pinout
.. image:: images/6259_pinout.png
|
------------------
PCIe/PXIe-6723
"""""""""""""""
The PXI-6723 can also create one software-timed analog task per channel. As such, the analog
outputs can be wired up as is most convenient.
.. collapse:: Device Pinout
.. image:: images/6723_pinout.png
------------------
Applied Scientific Instrumentation
----------------------------------
Tiger Controller
~~~~~~~~~~~~~~~~
.. warning::
USE OF THE TIGER CONTROLLER AS A DATA ACQUISITION CARD IS STILL IN DEVELOPMENT.
The ASI `Tiger Controller <https://www.asiimaging.com/controllers/tiger-controller/>`_ is
a multi-purpose controller for ASI stages, filter wheels, and dichroic sliders.
It can also control lasers, shutters, remote focusing devices, and galvanometers. More info
for these devices can be found on their respective documention pages.
Remote focus device, galvanometer, and analog laser control is done by the `TGGALVO <https://asiimaging.com/docs/tggalvo>`_ control card.
Shutter and digital laser control is done by the `TGPLC <https://asiimaging.com/docs/tiger_programmable_logic_card>`_ control card.
TGPLC output 1 delivers the camera trigger signal (equivalent to camera_trigger_out_line for the NI Card).
We communicate with Tiger Controllers via a serial port. It is recommended that you
first establish communication with the device using `ASI provided software <https://asiimaging.com/docs/products/tiger>`_.
If not, simply install the `USB driver <https://www.asiimaging.com/support/downloads/usb-support-on-ms-2000-wk-controllers/>`_
to communicate with the Tiger Controller
.. note::
**navigate** has been tested with the following versions of the ASI's Tiger
Controller software:
- Tiger Controller 2.2.0.
.. note::
Some users have reported intermittent connection issues at random intervals when
used with Coherent OBIS lasers. These issues, and how to address them, are discussed
in the :ref:`communication challenges <obis_tiger_connection>` section.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
daq:
hardware:
type: ASI
port: COM4
|
------------------
Synthetic Data Acquisition Card
-------------------------------
If no data acquisition card is present, one must configure the software to use a synthetic
data acquisition card.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
daq:
hardware:
type: NI
sample_rate: 10000
master_trigger_out_line: PXI6259/port0/line1
camera_trigger_out_line: /PXI6259/ctr0
trigger_source: /PXI6259/PFIO
laser_port_switcher: PXI6733/port0/line0
laser_switch_state: False
|

View File

@@ -0,0 +1,19 @@
.. _dcam:
=================
Hamamatsu Drivers
=================
* Insert the USB that came with the camera into the computer and install HCImageLive. Alternatively,
download DCAM-API. The software can be found `here <https://dcam-api.com>`_.
* When prompted with the DCAM-API Setup
* If you are going to use the Frame Grabber, install the Active Silicon Firebird drivers.
* Select ... next to the tools button, and install DCAM tools onto the computer.
* Shutdown the computer and install the Hamamatsu frame grabber into an appropriate
PCIe-x16 slot on the motherboard.
* Turn on the computer and the camera, and confirm that it is functioning properly in
HCImageLive or Excap (one of the DCAM tools installed).
* Connect the `camera_trigger_out_line` to the External Trigger of the Hamamatsu
Camera. Commonly, this is done with a counter port, e.g., ``/PXI6259/ctr0``

View File

@@ -0,0 +1,59 @@
==================
Deformable Mirrors
==================
Deformable mirrors enable correction for aberrations in the image that arise from
sample or system-specific distortions in the optical wavefront.
------------
Imagine Optic
-------------
Mirao 52E
~~~~~~~~~
We currently have support for a
`Mirao 52E <https://www.imagine-optic.com/products/deformable-mirror-mirao-52e/>`_.
The ``flat_path`` provides a path to a system correction ``.wcs`` file, an Imagine
Optic proprietary file that stores actuator voltages and corresponding Zernike
coefficients.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
mirror:
hardware:
type: ImagineOpticsMirror
flat_path: D:\WaveKitX64\MirrorFiles\BeadsCoverslip_20231212.wcs
n_modes: 32
|
-------------
Synthetic Mirror
----------------
It is not necessary to have a deformable mirror to run the software. If no deformable
mirror is present, but one wants to evaluate the deformable mirror correction features,
one must configure the software to use a synthetic deformable mirror.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
mirror:
hardware:
type: SyntheticMirror
flat_path: D:\WaveKitX64\MirrorFiles\BeadsCoverslip_20231212.wcs
n_modes: 32
|

View File

@@ -0,0 +1,67 @@
================
Dichroic Turrets
================
Dichroics can be used to reflect the excitation light towards the camera, while
permitting the emission light that is captured by the objective to be transmitted
to the camera. Alternatively, they can be placed in the detection path to separate
different emission wavelengths and to direct it to the appropriate camera.
Currently, **navigate** incorporates a dichroic turret as a filter wheel, which enables
you to add as many different dichroic turrets as you would like.
.. note::
The `name` parameter under `hardware` is optional. If not provided, the name of the
device will be default to Filter 0, Filter 1, ... Filter N in the GUI. However, if
is is provided, then the GUI will automatically use the name provided as a label.
ASI
---
C60-CUBE-SLDR
~~~~~~~~~~~~~
The `C60-CUBE-SLDR <https://www.asiimaging.com/products/modular-infinity-microscope-mim/modular-infinity-microscope-mim/cubes/>`_
is a motorized dichroic slider that can be controlled by the ASI Tiger Controller.
The example below shows the configuration file with one dichroic turret, and one
filter wheel. The same communication instance is used for both the stage and filter
wheel. It holds a maximum of 4 dichroics.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
-
filter_wheel:
hardware:
type: ASI
name: Filter Wheel 1
wheel_number: 1
port: COM1
baudrate: 115200
filter_wheel_delay: 0.03
available_filters:
Empty-Alignment: 0
GFP: 1
RFP: 2
Far-Red: 3
-
filter_wheel:
hardware:
type: ASICubeSlider
name: Dichroic Turret 1
wheel_number: 2
port: COM1
baudrate: 115200
filter_wheel_delay: 0.25
available_filters:
510LP: 0
560LP: 1
600LP: 2
660LP: 3
|

View File

@@ -0,0 +1,218 @@
=============
Filter Wheels
=============
Filter wheels can be used in both illumination and detection paths. The user
is expected to change the names of available filters to match what is in the
filter wheel or turret. If more than one filter wheel is present, the user
should add additional filter_wheel instances in the ``configuration.yaml``
file as follows:
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
-
filter_wheel:
hardware:
name: Lower Filter Wheel
type: SutterFilterWheel
wheel_number: 1
port: COM1
baudrate: 9600
filter_wheel_delay: 0.03
available_filters:
Empty-Alignment: 0
GFP: 1
RFP: 2
Far-Red: 3
-
filter_wheel:
hardware:
name: Upper Filter Wheel
type: SutterFilterWheel
wheel_number: 2
port: COM1
baudrate: 9600
filter_wheel_delay: 0.03
available_filters:
CFP: 0
YFP: 1
RFP: 2
Far-Red: 3
|
.. note::
The `name` parameter under `hardware` is optional. If not provided, the name of the
device will be default to Filter 0, Filter 1, ... Filter N in the GUI. However, if
is is provided, then the GUI will automatically use the name provided as a label.
-----------
ASI
---
FW-1000
~~~~~~~
The ASI `filter wheel <https://www.asiimaging
.com/illumination-control/fw-1000-high-speed-filter-wheel/>`_ is controlled by the
ASI Tiger Controller. Thus, you should provide the same ``comport`` entry as you did
for the stage. A single communication instance is used for both the stage and filter wheel.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
-
filter_wheel:
hardware:
type: ASI
wheel_number: 1
port: COM1
baudrate: 115200
filter_wheel_delay: 0.03
available_filters:
Empty-Alignment: 0
GFP: 1
RFP: 2
Far-Red: 3
|
--------------
Sutter Instruments
------------------
Lambda 10-3 & 10-B
~~~~~~~~~~~~~~~~~~
We typically communicate with Sutter Lambda 10-3 controllers via serial port. It is
recommended that you first establish communication with the device using manufacturer
provided software. Alternatively, one can use MicroManager. For some filter wheel types,
the filter_wheel_delay is calculated according to the size of the move and model of the
filter wheel. For other filter wheel types, the filter_wheel_delay is a fixed value, which is specified as
the ``filter_wheel_delay`` entry in the configuration file. The number of filter wheels
connected to the controller is specified as ``wheel_number`` in the configuration file.
Currently, both wheels are moved to the same position, but future implementations will
enable control of both filter wheels independently.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
-
filter_wheel:
hardware:
type: SutterFilterWheel
wheel_number: 1
port: COM1
baudrate: 9600
filter_wheel_delay: 0.03
available_filters:
Empty-Alignment: 0
GFP: 1
RFP: 2
Far-Red: 3
|
-------------
LUDL Electronic Products
------------------------
MAC6000
~~~~~~~
.. note::
Currently, the software only supports a single filter wheel for the MAC6000
device. Should additional filter wheels be necessary, please reach out to the
**navigate** team by placing a feature request on GitHub.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
-
filter_wheel:
hardware:
type: LUDLFilterWheel
wheel_number: 1
port: COM1
baudrate: 9600
filter_wheel_delay: 0.03
available_filters:
Empty-Alignment: 0
GFP: 1
RFP: 2
Far-Red: 3
|
-------------
National Instruments
--------------------
Some manufacturers provide filter wheels that are controlled by analog or digital signals. Here, each digital signal corresponds to a filter position. The user must specify the number of filters in the filter wheel and the digital signal that corresponds to each filter position.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
filter_wheel:
hardware:
type: NI
wheel_number: 1
filter_wheel_delay: 0.050
available_filters:
473nm: Dev2/port0/line1
561nm: Dev2/port0/line3
638nm: Dev2/port0/line5
Empty: Dev2/port0/line7
|
-------------
Synthetic Filter Wheel
----------------------
If no filter wheel is present, one must configure the software to use a synthetic
filter wheel.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
filter_wheel:
hardware:
type: synthetic
wheel_number: 1
port: COM1
baudrate: 9600
filter_wheel_delay: 0.03
available_filters:
Empty-Alignment: 0
GFP: 1
RFP: 2
Far-Red: 3
|

View File

@@ -0,0 +1,118 @@
=============
Galvanometers
=============
Galvo mirrors are used for fast scanning, shadow reduction, and occasionally as stages
(see :ref:`Analog-Controlled Galvo/Piezo <galvo_stage>`).
------------
National Instruments
--------------------
Multiple types of galvanometers have been used, including Cambridge Technologies/Novanta, Thorlabs, and ScannerMAX. Each of these devices are externally controlled via analog signals delivered from an NI-based data acquisition card.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
galvo:
-
hardware:
type: NI
channel: PXI6259/ao1
min: -1.0
max: 1.0
waveform: sawtooth
phase: 0
-
hardware:
type: NI
channel: PXI6259/ao1
min: -1.0
max: 1.0
waveform: square
phase: 0
|
------------
Applied Scientific Instrumentation
----------------------------------
In principle, this hardware type can support any analog-controlled galvanometer,
including those from Cambridge Technologies/Novanta, Thorlabs, and ScannerMAX.
Each of these devices are externally controlled via analog signals delivered from the ASI Tiger Controller (`TG-1000 <https://asiimaging.com/docs/products/tiger>`_).
Galvanometers can take two types of analog waveforms: sawtooth and sine.
The sawtooth waveform is a periodic analog waveform. There are three duty cycle values
accepted, 0, 50, and 100. If the duty cycle is 0, the waveform is a falling sawtooth
waveform. If the duty cycle is 50, then it is a triangle wave. If the duty cycle is 100,
the waveform is a rising sawtooth waveform. The duty cycle will be rounded to the nearest acceptable value.
The ASI Tiger Controller has a few limitations for the analog signals.
The period value will be rounded to the nearest whole number of milliseconds,
and for the triangle wave, the period will be rounded to the nearest even number.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
galvo:
-
hardware:
type: ASI
axis: A
min: 0
max: 1.0
waveform: sine
phase: 0
-
hardware:
type: ASI
axis: B
min: -5.0
max: 5.0
waveform: sawtooth
phase: 1.57
|
-----------------
Synthetic Galvo
---------------
If no galvo is present, one must configure the software to use a synthetic
galvo.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
galvo:
-
hardware:
type: synthetic
channel: PXI6259/ao1
min: -1.0
max: 1.0
waveform: sawtooth
phase: 0
-
hardware:
type: synthetic
channel: PXI6259/ao1
min: -1.0
max: 1.0
waveform: square
phase: 0
|

View File

@@ -0,0 +1,26 @@
====================
Supported Hardware
====================
.. _hardware_overview:
**navigate** provides access to a growing list of hardware devices. Information on how to configure each of these devices, including supported firmware, is provided here.
Additional devices are available by installing the **navigate-mmcore-plugin**. To learn more, please visit the **navigate-mmcore-plugin**
`documentation <https://thedeanlab.github.io/navigate-mmcore-plugin/>`_.
.. toctree::
:caption: Devices
:maxdepth: 4
daq.rst
camera.rst
remote_focus.rst
stage.rst
filter_wheel.rst
dichroic.rst
galvo.rst
laser.rst
shutter.rst
zoom.rst
deformable_mirror.rst

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -0,0 +1,151 @@
======
Lasers
======
We currently support laser control via voltage signals. In the near-future, we will consider implementing laser control via serial communication for power control, but digital modulation will still be controlled via voltage signals. The ``onoff`` entry is for digital modulation. The ``power`` entry is for analog modulation.
---------------------
Applied Scientific Instrumentation
----------------------------------
The Tiger Controller (`TG-1000 <https://asiimaging.com/docs/products/tiger>`_) from ASI can also be used to perform analog, digital, and mixed modulation of lasers.
Digital modulation is controlled with a `TGPLC <https://asiimaging.com/docs/tiger_programmable_logic_card>`_
or `TGGALVO <https://asiimaging.com/docs/tggalvo>`_ control cards, while analog modulation is controlled with a TGGALVO control card.
TGPLC output 1 is reserved for the camera trigger.
--------------------------------
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
lasers:
-
wavelength: 488
onoff:
hardware:
type: ASI
axis: 2
min: 0.0
max: 5.0
power:
hardware:
type: ASI
axis: A
min: 0.0
max: 5.0
-
wavelength: 561
onoff:
hardware:
type: ASI
axis: 3
min: 0.0
max: 5.0
power:
hardware:
type: ASI
axis: B
min: 0.0
max: 5.0
-------------------
National Instruments
--------------------
Most lasers are controlled externally via mixed analog and digital modulation. Thus, a NI data acquisition card may be used to control the laser. In general, an analog output can be used to control both the digital and analog modulation of the laser, whereas a digital output can only be used to control the digital modulation of the laser.
.. note::
Omicron LightHUB Ultra laser launches include both Coherent- and LuxX lasers, which vary according to wavelength. LuxX lasers should be operated in an ACC operating mode with the analog modulation option enabled. The Coherent Obis lasers should be set in the mixed modulation mode.
.. note::
Coherent Obis lasers should be set in the mixed modulation mode. It is not uncommon for the slew rate from the data acquisition card to be insufficient to drive the modulation of the laser if the laser is set to an analog modulation mode.
.. note::
Users have reported intermittent connection issues at random intervals arising from USB-based communication instance with Coherent Obis controllers. Specifically, these errors were observed as a conflict over COM port assignments between the Coherent OBIS laser and the ASI Tiger controller. These issues are discussed in depth in the :ref:`communication challenges <obis_tiger_connection>` section.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
lasers:
-
wavelength: 488
onoff:
hardware:
type: NI
channel: PXI6733/port0/line2
min: 0.0
max: 5.0
power:
hardware:
type: NI
channel: PXI6733/ao0
min: 0.0
max: 5.0
-
wavelength: 561
onoff:
hardware:
type: NI
channel: PXI6733/port0/line3
min: 0.0
max: 5.0
power:
hardware:
type: NI
channel: PXI6733/ao1
min: 0.0
max: 5.0
|
-------------------
Synthetic Lasers
--------------------------------
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
lasers:
-
wavelength: 488
onoff:
hardware:
type: synthetic
channel: PXI6733/port0/line2
min: 0.0
max: 5.0
power:
hardware:
type: synthetic
channel: PXI6733/ao0
min: 0.0
max: 5.0
-
wavelength: 561
onoff:
hardware:
type: synthetic
channel: PXI6733/port0/line3
min: 0.0
max: 5.0
power:
hardware:
type: synthetic
channel: PXI6733/ao1
min: 0.0
max: 5.0
|

View File

@@ -0,0 +1,22 @@
.. _pvcam:
====================
Photometrics Drivers
====================
* Download the `PVCAM software <https://www.teledynevisionsolutions.com/company/about-teledyne-vision-solutions/teledyne-photometrics/>`_ from Photometrics. The PVCAM SDK is also available form this location. You will likely have to register and agree to Photometrics terms.
* Perform the Full Installation of the PVCAM software.
* Should a "Base Device" still show up as unknown in the Windows Device Manager, you may need to install the `Broadcom PCI/PCIe Software Development Kit <https://www.broadcom.com/products/pcie-switches-retimers/software-dev-kits>`_
* Upon successful installation, one should be able to acquire images with the manufacturer-provided PVCamTest software.
.. Note::
A static version of the Photometrics API is provided with this software. It is located in in srcs/model/devices/APIs/photo_metrics/PyVCAM-master. To install this API, go to this folder in the command line and from within your **navigate** environment, run ``python setup.py install``.
.. Note::
The most up-to-date version of PVCAM can be found on `GitHub <https://github.com/Photometrics/PyVCAM>`_.

View File

@@ -0,0 +1,168 @@
=======================
Remote Focusing Devices
=======================
Voice coils, also known as linear actuators, play a crucial role in implementing
aberration-free remote focusing in **navigate**. These electromagnetic actuators are
used to control the axial position of the light-sheet and the sample relative to the
microscope objective lens. By precisely adjusting the axial position, the focal plane
can be shifted without moving the objective lens, thus enabling remote focusing.
Focus tunable lenses serve as an alternative to voice coils owing to their simple
operation and high bandwidth. Tunable lenses axially scan
a beam by introducing defocus into the optical train. Nonetheless, they do not provide the
higher-order correction provided by voice coils in an aberration-free remote focusing system.
--------------
Equipment Solutions
-------------------
LFA-2010
~~~~~~~~
Configuration of the device can be variable. Many voice coils we have received require
establishing serial communication with the device to explicitly place it in an analog
control mode. In this case, the comport must be specified properly in the configuration
file.
More recently, Equipment Solutions has begun delivering devices that
automatically initialize in an analog control mode, and thus no longer need the
serial communication to be established. For these devices, we recommend using the analog
control mode described in the next section.
The `LFA-2010 Linear Focus Actuator <https://www.equipsolutions.com/products/linear-focus-actuators/lfa-2010-linear-focus-actuator/>`_
is controlled with a `SCA814 Linear Servo Controller <https://www.equipsolutions.com/products/linear-servo-controllers/sca814-linear-servo-controller/>`_,
which accepts a +/- 2.5 Volt analog signal. The minimum and maximum voltages can be set
in the configuration file to prevent the device from receiving a voltage outside of its
operating range.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
remote_focus_device:
hardware:
type: EquipmentSolutions
channel: PXI6269/ao3
min: -5.0
max: 5.0
port: COM2
baudrate: 9600
|
-------------
National Instruments
--------------------
In principle, this hardware type can support any analog-controlled voice coil or tunable lens. The `BLINK <https://www.thorlabs.com/thorproduct.cfm?partnumber=BLINK>`_ and the `Optotune Focus Tunable Lens <https://www.optotune.com/tunable-lenses>`_ are controlled with an analog signal from the DAQ.
-----------------
Thorlabs BLINK
~~~~~~~~~~~~~~
The BLINK is a voice coil that is
pneumatically actuated voice coil. It is recommended that you specify the min and max
voltages that are compatible with your device to prevent the device from receiving a
voltage outside of its operating range.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
remote_focus_device:
hardware:
type: NI
channel: PXI6269/ao3
min: -5.0
max: 5.0
port: COM2
baudrate: 9600
|
-----------------
Optotune Focus Tunable Lens
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
remote_focus_device:
hardware:
type: NI
channel: PXI6269/ao3
min: -5.0
max: 5.0
port: COM2
baudrate: 9600
|
------------------
Applied Scientific Instrumentation
----------------------------------
In principle, this hardware type can support any analog-controlled voice coil or tunable lens.
The `BLINK <https://www.thorlabs.com/thorproduct.cfm?partnumber=BLINK>`_ and the `Optotune Focus Tunable Lens <https://www.optotune.com/tunable-lenses>`_
can be controlled with an analog signal from the ASI Tiger Controller (`TG-1000 <https://asiimaging.com/docs/products/tiger>`_).
The ASI Tiger Controller has a few limitations for the analog signals.
The remote focus waveform is a periodic ramp waveform with a delay period between each ramp.
The ramp lasts for the exposure time, falls very quickly and rests until the next exposure time.
Fall time is not configurable so there is no 'gentle' fall with this hardware.
The ramp waveform must last a whole number of milliseconds. If exposure time is not a whole number,
the ramp time will be rounded to the nearest whole number.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
remote_focus_device:
hardware:
type: ASI
axis: A
min: 0
max: 5
port: COM4
|
------------------
Synthetic Remote Focus Device
-----------------------------
If no remote focus device is present, one must configure the software to use a synthetic
remote focus device.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
remote_focus_device:
hardware:
type: synthetic
channel: PXI6269/ao3
min: -5.0
max: 5.0
port: COM2
baudrate: 9600
|

View File

@@ -0,0 +1,98 @@
========
Shutters
========
When only controlled with analog modulation, many laser sources do not
reduce their emitted intensity to 0 watts. In such cases, residual illumination subjects
the specimen to unnecessary irradiation between image acquisitions. Shutters overcome
this by completely blocking the laser, albeit on a much slower timescale than direct
modulation of the laser. With **navigate**, shutters automatically open at the start
of acquisition and close upon finish.
Most shutters are controlled via a digital voltage. When the voltage is high (e.g., >
2.5 V), the shutter is open, and when the voltage is low (e.g., < 2.5 V), the shutter
is closed.
------------
Applied Scientific Instrumentation
----------------------------------
The `TGPLC <https://asiimaging.com/docs/tiger_programmable_logic_card>`_ control card for the
Tiger Controller (`TG-1000 <https://asiimaging.com/docs/products/tiger>`_) from ASI can be used to trigger shutter operation.
TGPLC output 1 is reserved for the camera trigger.
-----------------
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
shutter:
hardware:
type: ASI
axis: 2
min: 0.0
max: 5.0
port: COM4
|
-----------------
National Instruments
--------------------
We can control these shutters using a digital output from a National Instruments (NI) data acquisition card.
.. Note::
If the shutter opens and closes immediately upon starting an acquisition, try a
different port for the digital I/O on the NI data acquisition card. Some NI devices
(e.g.PCIe-6738) have port/sample size limitations. If the port/sample size is
exceeded, the shutter will not open. For example, on our `NI PCIe-6738 <https://www
.ni.com/docs/en-US/bundle/pcie-6738-specs/page/specs.html>`_ using port 0 for the
shutter causes this issue, but switching the shutter to any port 1 channel fixed it.
In comparison, for the `NI PCIe-6259 <https://www.ni
.com/docs/en-US/bundle/pci-pcie-pxi-pxie-usb-6259-specs/page/specs.html>`_,
using port 0 had no averse effects.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
shutter:
hardware:
type: NI
channel: PXI6249/port0/line0
min: 0.0
max: 5.0
|
------------------
Synthetic Shutter
-----------------
If no shutter is present, one must configure the software to use a synthetic
shutter.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
shutter:
hardware:
type: synthetic
channel: PXI6249/port0/line0
min: 0.0
max: 5.0
------------------

View File

@@ -0,0 +1,689 @@
======
Stages
======
Our software empowers users with a flexible solution for configuring multiple stages, catering to diverse microscope modalities. Each stage can be customized to suit the specific requirements of a particular modality or shared across various modalities. Our unique approach allows seamless integration of stages from different manufacturers, enabling users to mix and match components for a truly versatile and optimized setup tailored to their research needs.
.. Note::
The software provides configure specific hardware axes to software axes. This is specified in the configuration file. For example, if specified as follows, the software x, y, z, and f axes can be mapped to the hardware axes M, Y, X, and Z, respectively.
.. code-block:: yaml
axes: [x, y, z, f]
axes_mapping: [M, Y, X, Z]
------------------
Applied Scientific Instrumentation
----------------------------------
Tiger Controller
~~~~~~~~~~~~~~~~
The ASI `Tiger Controller <https://www.asiimaging.com/controllers/tiger-controller/>`_. is
a multi-purpose controller for ASI stages, filter wheels, dichroic sliders,
and more. We communicate with Tiger Controllers via a serial port. It is recommended that you
first establish communication with the device using `ASI provided software <https://asiimaging.com/docs/products/tiger>`_.
.. note::
**navigate** has been tested with the following versions of the ASI's Tiger
Controller software:
- Tiger Controller 2.2.0.
.. note::
Some users have reported intermittent connection issues at random intervals when
used with Coherent OBIS lasers. These issues, and how to address them, are discussed
in the :ref:`communication challenges <obis_tiger_connection>` section.
.. warning::
If you are using the FTP-2000 stage, do not change the F stage axis. This
will differentially drive the two vertical posts, causing them to torque and
potentially damage one another.
.. tip::
ASI stage's include a configuration option, ``feedback_alignment``, which
corresponds to the `Tiger Controller AA Command <https://asiimaging.com/docs/commands/aalign>`_.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: ASI
serial_number: 001
axes: [x, y, z, theta, f]
axes_mapping: [A, B, C, D, E]
feedback_alignment: [90, 90, 90, 5, 90]
volts_per_micron: 0.0
min: 0.0
max: 1.0
controllername:
stages:
refmode:
port: COM12
baudrate: 115200
timeout: 0.25
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
-----------------
MFC2000
~~~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: MFC2000
serial_number: 001
axes: [x, y, z, theta, f]
axes_mapping: [A, B, C, D, E]
feedback_alignment: [90, 90, 90, 5, 90]
volts_per_micron: 0.0
min: 0.0
max: 1.0
controllername:
stages:
refmode:
port: COM12
baudrate: 9600
timeout: 0.25
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
-----------------
MS2000
~~~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: MS2000
serial_number: 001
axes: [x, y, z, theta, f]
axes_mapping: [A, B, C, D, E]
feedback_alignment: [90, 90, 90, 5, 90]
volts_per_micron: 0.0
min: 0.0
max: 1.0
controllername:
stages:
refmode:
port: COM12
baudrate: 9600
timeout: 0.25
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
------------------
Sutter Instruments
------------------
MP-285
~~~~~~
The `Sutter MP-285 <https://www.sutter.com/MICROMANIPULATION/mp285.html>`_ communicates
via serial port and is quite particular. We have done our best to ensure the
communication is stable, but occasionally the stage will send or receive an extra
character, throwing off communication. In this case, the MP-285's screen will be
covered in 0s, 1s or look garbled. If this happens, simply turn off the software,
power cycle the stage, and press the "MOVE" button on the MP-285 controller once. When
the software is restarted, it should work.
.. tip::
Sometimes the Coherent Connection software messes with the MP-285 serial
communication if it is connected to the lasers.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: MP285
serial_number: 001
axes: [x, y, z]
axes_mapping: [x, y, z]
feedback_alignment:
volts_per_micron: 0.0
min: 0.0
max: 25000
controllername:
stages:
refmode:
port: COM1
baudrate: 9600
timeout: 0.25
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
-----------------
Physik Instrumente
------------------
These stages are controlled by `PI <https://www.pi-usa.us/en/>`_'s own
`Python code <https://pypi.org/project/PIPython/>`_.
.. note::
**navigate** has been tested with the following versions of the Physik
Instrumente software and drivers:
- PIMikroMove: 2.36.1.0
- PI_GCS2_DLL: 3.22.0.0
.. note::
PI stages require a special ``hardware`` option in the configuration.yaml file, ``refmode``,
which corresponds to how the PI stage chooses to self-reference. Options are:
* ``REF``
* ``FRF``
* ``MNL``
* ``FNL``
* ``MPL``
* ``FPL``
* ``" "`` - An empty string can be provided if no stage referencing mode is needed.
These are PI's GCS commands, and the correct reference mode for your stage should be found by
launching PIMikroMove, which comes with your stage and can be downloaded
`here <https://www.pi-usa.us/en/products/controllers-drivers-motion-control-software/motion-control-software>`_.
Stage names (e.g. ``L-509.20DG10``) can also be found in PIMikroMove or on a label on the side of your stage.
-----------------
C-884
~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: PI
serial_number: 119060508
axes: [x, y, z, theta, f]
axes_mapping: [1, 2, 3, 4, 5]
feedback_alignment:
volts_per_micron: 0.0
min:
max:
controllername: C-884
stages: L-509.20DG10 L-509.40DG10 L-509.20DG10 M-060.DG M-406.4PD NOSTAGE
refmode: FRF FRF FRF FRF FRF FRF
port:
baudrate:
timeout:
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
-----------------
E-709
~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: PI
serial_number: 119060508
axes: [x, y, z, theta, f]
axes_mapping: [1, 2, 3, 4, 5]
feedback_alignment:
volts_per_micron: 0.0
min:
max:
controllername: E-709
stages: L-509.20DG10 L-509.40DG10 L-509.20DG10 M-060.DG M-406.4PD NOSTAGE
refmode: FRF FRF FRF FRF FRF FRF
port:
baudrate:
timeout:
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
------------------
Thorlabs
--------
KIM001
~~~~~~
**navigate** supports the `KIM001 <https://www.thorlabs.com/thorproduct
.cfm?partnumber=KIM001>`_ controller. However, this device shows significant
hysteresis, and thus we do not recommend it for precise positioning tasks (e.g.,
autofocusing). It serves as a cost-effective solution for manual, user-driven
positioning.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: Thorlabs
serial_number: 74000375
axes: [f]
axes_mapping: [1]
feedback_alignment:
volts_per_micron: 0.0
min:
max:
controllername:
stages:
refmode:
port:
baudrate:
timeout:
joystick_axes: [f]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
-----------------
KST101
~~~~~~
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: KST101
serial_number: 26001318
axes: [f]
axes_mapping: [1]
feedback_alignment:
device_units_per_mm: 20000000/9.957067
volts_per_micron: 0.0
min: 0
max: 25
controllername:
stages:
refmode:
port:
baudrate:
timeout:
joystick_axes: [f]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
--------------
.. _galvo_stage:
National Instruments
--------------------
We sometimes control position via a galvo or piezo with no software API.
In this case, we treat a standard galvo mirror or piezo as a stage axis. We control the
"stage" via voltages sent to the galvo or piezo. The ``volts_per_micron`` setting
allows the user to pass an equation that converts position in microns ``X``, which is
passed from the software stage controls, to a voltage. Note that we use
``GalvoNIStage`` whether or not the device is a galvo or a piezo since the logic is
identical. The voltage signal is delivered via the data acquisition card specified in the
``axes_mapping`` entry.
.. note::
The parameters ``distance_threshold`` and ``settle_duration_ms`` are used to provide
a settle time for large moves. if the move is larger than the ``distance_threshold``,
then a wait duration of ``settle_duration_ms`` is used to allow the stage to settle
before the image is acquired.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: GalvoNIStage
serial_number: 001
axes: [Z]
axes_mapping: [PCI6738/ao6]
volts_per_micron: 0.05*x
min: 0.0
max: 1.0
distance_threshold: 5
settle_duration_ms: 5
controllername:
stages:
refmode:
port:
baudrate: 0
joystick_axes: [f]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|
----------------
Newport
-------
Newport offers motion control solutions for various applications in microscopy. Our software supports two Newport stage controllers that provide accurate positioning capabilities.
Conex Controller
~~~~~~~~~~~~~~~~
The Newport Conex Controller series offers compact, integrated motion control solutions that come pre-wired with dedicated controllers for quick, out-of-the-box operation. While the Conex series offers four `different controller types with various drive technologies <https://www.newport.com/c/controller-&-stage-kits>`_, we have used it to drive a `TRA6CC <https://www.newport.com/p/TRA6CC>`_ (Linear Actuator, DC Servo, 6 mm Travel, TRA6CC and CONEX-CC Controller) connected to a `M-SV-0.5 <https://www.newport.com/p/M-SV-0.5>`_ adjustable width slit that is positioned conjugate to the back pupil of the illumination objective. This setup allows precise and automated control of the illumination numerical aperture.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
name: slit
type: conex.ConexStage
serial_number: 126
port: COM4
axes: [S]
axes_mapping: [S]
s_min: -10000.0
s_max: 10000.0
s_offset: 0.0
|
--------------
ESP302 Motion Controller Controller
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Newport `ESP302 Motion Controller <https://www.newport.com/f/esp30x-3-axis-dc-and-stepper-motion-controller>`_ is a versatile, 1-, 2-, or 3-axis motion controller that provides precise positioning capabilities for a wide range of Newport stages.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
name: delay_stage
type: newport.NewportStage
serial_number: 127
axes: [theta]
axes_mapping: [1]
port: "192.168.1.90"
baudrate: 5001
timeout: 5.0
|
---------------
Synthetic Stage
---------------
If no stage is present for a particular axis, one must configure the software to use a synthetic
stage. For example, not all microscopes have a theta axis.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
stage:
hardware:
-
type: synthetic
serial_number: 001
axes: [x, y, z, theta, f]
axes_mapping: [A, B, C, D, E]
volts_per_micron: 0.0
min: 0.0
max: 1.0
controllername:
stages:
refmode:
port:
baudrate: 0
joystick_axes: [x, y, z]
x_min: -10000.0
x_max: 10000.0
y_min: -10000.0
y_max: 10000.0
z_min: -10000.0
z_max: 10000.0
theta_min: 0.0
theta_max: 360.0
f_min: -10000.0
f_max: 10000.0
x_offset: 0.0
y_offset: 0.0
z_offset: 0.0
theta_offset: 0.0
f_offset: 0.0
flip_x: False
flip_y: False
flip_z: False
flip_f: False
|

View File

@@ -0,0 +1,89 @@
.. _mechanical_zoom:
===============
Mechanical Zoom
===============
Zoom devices control the magnification of the microscope. If such control is not
needed, the software expects a :ref:`Synthetic Zoom <synthetic_zoom>` to provide
the fixed magnification and the effective pixel size of the microscope.
---------------
Dynamixel
---------
MX-28R
~~~~~~
This software supports the
`Dynamixel Smart Actuator <https://www.dynamixel.com/>`_.
.. note::
The ``positions`` specify the voltage of the actuator at different zoom positions.
The ``stage_positions`` account for focal shifts in between the different zoom values
(the MVXPLAPO does not have a consistent focal plane). These may change depending on
the immersion media. Here it is specified for a ``BABB`` (Benzyl Alcohol Benzyl
Benzoate) immersion media. The ``pixel_size`` specifies the effective pixel size of
the system at each zoom.
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
zoom:
hardware:
type: DynamixelZoom
servo_id: 1
port: COM1
baudrate: 9600
position:
1x: 200.0
6.5x: 2000.0
pixel_size:
1x: 6.5
6.5x: 1.0
stage_positions:
BABB:
f:
1X: 0
6.5x: 2
|
---------------
.. _synthetic_zoom:
Synthetic Zoom
--------------
.. collapse:: Configuration File
.. code-block:: yaml
microscopes:
microscope_name:
zoom:
hardware:
type: synthetic
servo_id: 1
port: COM1
baudrate: 9600
position:
1x: 200.0
6.5x: 2000.0
pixel_size:
1x: 6.5
6.5x: 1.0
stage_positions:
BABB:
f:
1X: 0
6.5x: 2
|

View File

@@ -0,0 +1,89 @@
======================
Supported File Formats
======================
The choice of file format for saving imaging data in microscopy is crucial because it affects write speed, data integrity, accessibility, and analysis efficiency. Formats like TIFF and its derivative OME-TIFF are widely used due to their ability to store metadata and support multiple imaging channels. However, modern formats such as Zarr, N5, and HDF5, including OME-Zarr, cater to the needs of large-scale, multi-dimensional datasets by enabling efficient data storage, access, and processing at cloud-compute scales.
To enable ambitious imaging projects, **navigate** comes pre-packaged with TIFF, OME-TIFF, OME-Zarr, and HDF5/N5 (`BigDataViewer <https://imagej.net/plugins/bdv/>`_) file saving formats. OME, or Open Microscopy Environment, is a standardized metadata model that ensures that imaging data can be accurately understood, shared, and analyzed across different software platforms and research groups.
.. Note::
The performance of saving to these data sources is limited by write speed to disk. To achieve maximal saving speed, we recommend saving all data to a local solid state drive. See :ref:`Hardware Considerations <computer_considerations>` for more information.
----------------
TIFF/OME-TIFF
-------------
**navigate** uses the `tifffile <https://pypi.org/project/tifffile/>`_ package to write TIFF, BigTIFF, and OME-TIFF data to file. The **navigate** package creates a custom :doc:`OME-TIFF XML <../../05_reference/_autosummary/navigate.model.metadata_sources.ome_tiff_metadata.OMETIFFMetadata>` to store metadata.
----------------
BigDataViewer H5/N5
-------------------
**navigate** uses `h5py <https://docs.h5py.org/en/stable/index.html>`_ (H5) and `zarr <https://zarr.readthedocs.io/en/stable/>`_ (N5) to store data in a BigDataViewer file format. This is a pyramidal format, necessitating the saving of both the original data and down sampled versions of this data. The additional data slows down the write speed. The N5 format can be faster than H5 because it allows for multithreaded writes.
OME-Zarr
--------
OME-Zarr is a Zarr file format that adheres to strict metadata specifications, detailed at https://ngff.openmicroscopy.org/0.4/index.html. It allows for pyramidal data writing, storage of segmentation labels with the data set, and updating the pyramidal structure on the fly.
----------------
Image Writing Benchmarks
------------------------
To evaluate the performance of saving imaging data in different formats, we conducted benchmarks on a Windows 10 system. We assessed the median disk write time for TIFF, OME-TIFF, H5, N5, and OME-Zarr formats across image resolutions of 512x512, 1024x1024, and 2048x2048 under two conditions: (A) capturing 1000 single-plane images and (B) acquiring a single z-stack composed of 1000 planes. All times are measured in milliseconds. Results are presented below. For z-stack imaging, TIFF and OME-TIFF formats achieved write speeds of up to approximately 300 Hz for a 2048x2048 camera resolution, surpassing the operational speeds of most contemporary sCMOS cameras. The Big-TIFF variant was used for both TIFF and OME-TIFF formats to accommodate the large file sizes.
Timelapse Imaging
~~~~~~~~~~~~~~~~~
1000 images acquired, with a single Z plane. Median write time reported in milliseconds.
.. table::
:widths: auto
:align: center
+-------------+---------+----------+-------+-------+---------+
| | TIFF | OME-TIFF | H5 | N5 | OME-Zarr|
+=============+=========+==========+=======+=======+=========+
| 512x512 | 1.19 | 29.24 | 3.17 | 9.00 | 5.30 |
+-------------+---------+----------+-------+-------+---------+
| 1024x1024 | 1.84 | 36.69 | 18.59 | 14.55 | 8.81 |
+-------------+---------+----------+-------+-------+---------+
| 2048x2048 | 5.55 | 44.65 | 84.18 | 38.60 | 25.02 |
+-------------+---------+----------+-------+-------+---------+
Z-Stack Imaging
~~~~~~~~~~~~~~~
1 image acquired, with 1000 Z planes. Median write speed time in milliseconds.
.. table::
:widths: auto
:align: center
+--------------+---------+----------+-------+-------+---------+
| | TIFF | OME-TIFF | H5 | N5 | OME-Zarr|
+==============+=========+==========+=======+=======+=========+
| 512x512 | 0.28 | 0.25 | 7.30 | 5.10 | 3.29 |
+--------------+---------+----------+-------+-------+---------+
| 1024x1024 | 0.89 | 0.88 | 29.15 | 12.44 | 8.26 |
+--------------+---------+----------+-------+-------+---------+
| 2048x2048 | 4.12 | 3.30 | 135.74| 37.09 | 24.83 |
+--------------+---------+----------+-------+-------+---------+
Additional Sources of Overhead
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The initial setup for writing H5/N5 files introduces significant overhead, and to a lesser extent for TIFF and OME-TIFF files, which elevates the average write time. However, the median write time remains consistently low and stable across most of the acquisition.
Computer Specifications for Benchmarks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The computer specifications that the benchmarks were performed on are as follows.
- CPU: Intel(R) Xeon(R) Silver 4112 CPU @ 2.60GHz
- Memory: 88 GB
- Hard Drive: Micron 5200 ECO 7680gb SSD

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 511 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,586 @@
==========================
User Interface Walkthrough
==========================
**navigate**'s user interface is modular and designed to be reconfigurable to a user's preferences. At a high level, it is split into a menu bar, an acquisition bar, settings notebooks, and display notebooks.
.. image:: images/home_screen.png
-----------------
.. _ui_menu_bar:
Menu Bar
========
The menu bar is an entry point for much of **navigate**.
.. _ui_file_menu:
File
----
.. image:: images/menu_file.png
The :guilabel:`File` menu lets a user create, load, and save :ref:`experiment files <experiment_file>`, which store the states of the GUI and the hardware. The menu also provides an option to load and save :ref:`waveform constants files <configure_waveform_templates>` to store the waveform constants used for a given experiment. This is useful if a user wants to perform an experiment with the same parameters multiple times but close the software in between acquisitions. To facilitate reproducibility, `experiment.yml` and `waveform_constants.yml` files are always saved with the collected image data.
The :guilabel:`File` menu also provides access to toggle the :guilabel:`Save Data` flag, also found under :guilabel:`Timepoint Settings` in the :guilabel:`Channels Settings Notebook`, and to start an acquisition (which can also be done by pressing :guilabel:`Acquire` in the :ref:`ui_acquisition_bar`). Loading and unloading images only works if there is a :ref:`synthetic camera <synthetic_camera>`. In this case, the camera loads images to display in lieu of the simulated noise usually generated by the synthetic camera.
:guilabel:`Open Log Files` opens the folder containing the software's log files. This is helpful for debugging code and configuration problems.
:guilabel:`Open Configuration Files` opens the folder containing the software's :ref:`configuration file <configuration_file>`.
-----------------
.. _ui_microscope_configuration:
Microscope Configuration
------------------------
.. image:: images/menu_microscope_configuration.png
The :guilabel:`Microscope Configuration` menu is split into two parts, above and below the horizontal divider.
Above the horizontal divider, it lists the names of all microscopes named in the ``microscopes`` section of the :ref:`configuration file <configuration_file>`. This allows users to readily switch between different microscopes, each with their own hardware configurations. Mousing over a microscope name reveals all zoom values available under the :ref:`Mechanical Zoom <mechanical_zoom>`. Selecting one of these zoom values changes the magnification of the microscope.
Below the horizontal divider is access to the :ref:`Waveform Parameters <ui_waveform_parameters>` settings panel and the :ref:`Configure Microscope <ui_configure_microscopes>` settings panel.
-------------------
.. _stage_control_menu:
Stage Control Menu
------------------
.. image:: images/menu_stage_control.png
The stage control menu is split by horizontal dividers into three parts.
The top part provides similar functionality to the :ref:`Stage Control Settings Notebook <stage_control_notebook>`. It allows movement of the stage along ``X``, ``Y``, ``Z``, ``focus`` and ``Theta``. The ``w``, ``s``, ``a`` and ``d`` keys are bound to movement in ``X`` and ``Y``, and these can be used to scroll around a sample.
The middle part provides similar functionality to the :ref:`Multiposition Settings Notebook <ui_multiposition>`. Here, a user can launch the :ref:`Tiling Wizard <ui_multiposition_tiling_wizard>`, load and export (save) positions stored in the :guilabel:`Multiposition Settings Notebook`, and add the current stage position to the multiposition table.
The bottom part of the menu is used to enable and disable the stage limits set in the configuration file (see the :ref:`stage subsection <configure_stages>`).
-------------------
.. _ui_autofocus_menu:
Autofocus
---------
.. image:: images/menu_autofocus.png
The autofocus menu has two options: :guilabel:`Perform Autofocus`, which autofocuses the sample using the current autofocus settings, and :guilabel:`Autofocus Settings`, which launches the :ref:`Autofocus Settings <ui_autofocus>` popup.
-------------------
.. _ui_features_menu:
Features
--------
.. image:: images/menu_features.png
This menu provides access to acquisition feature lists. An explanation of features, feature lists, and the use and operation of this menu is provided under :ref:`Reconfigurable Acquisitions Using Features <user_guide_features>`.
-------------------
.. _ui_plugins_menu:
Plugins
-------
.. image:: images/menu_plugins.png
This menu provides an access point for :ref:`plugins <plugin>` that feature a popup GUI.
-------------------
.. _ui_window_menu:
Window
------
.. image:: images/menu_window.png
This menu is split into two parts by a horizontal divider and provides some GUI controls.
The top part allows the user to switch between the main :ref:`Settings Notebooks <ui_settings_notebooks>`.
The bottom part provides an option to move the camera display to a popup window, and :guilabel:`Help` brings the user to the online documentation for **navigate**.
-------------------
.. _ui_acquisition_bar:
Acquisition Bar
===============
Left-to-right, the acquisition bar provides:
* An :guilabel:`Acquire` button, which starts acquisition.
* A drop-down menu providing a selection of acquisition modes.
* A progress bar indicating how far the program has made it through an acquisition. The top bar indicates progress on the current z-stack, whereas the bottom indicates progress for the entire acquisition.
* An approximate estimate of how much time is left in the acquisition.
* An emergency :guilabel:`Stop Stage` button, which instantly halts all stage movement.
* An :guilabel:`Exit Button`, which quits the software.
-------------------
.. _ui_settings_notebooks:
Settings Notebooks
==================
The settings notebooks are a series of tabs that control microscope settings, including laser power, camera settings, stage positions, and many others.
-------------------
.. _ui_channels_notebook:
Channels
--------
.. image:: images/settings_channels.png
The :guilabel:`Channels` Settings Notebook is a tab (optionally, a popup if right-clicked on) split into five sections: :guilabel:`Channel Settings`, :guilabel:`Stack Acquisition Settings (µm)`, :guilabel:`Timepoint Settings`, :guilabel:`Multi-Position Acquisition`, and :guilabel:`Quick Launch Buttons`.
-------------------
.. _ui_channel_settings:
Channel Settings
^^^^^^^^^^^^^^^^
This is used to set up acquisition color channels. A channel is considered to be a combination of an illuminating laser wavelength and a detection filter. Each channel has its own power, exposure time, interval, and defocus. The checkbox on the left indicates if a channel should be used (is selected) during acquisition. An acquisition may loop through the channels in sequence.
* :guilabel:`Laser` is the name of the laser, taken from the :ref:`configuration file <configuration_file>`, and usually expressed in nanometers.
* :guilabel:`Power` is the power of the laser between 0 and 100 percent.
* :guilabel:`Filter` is the name of the filter selected in the detection path filter wheel. Filter names are stored in the configuration file.
* :guilabel:`Exp. Time (ms)` is the exposure time of the camera in milliseconds.
* :guilabel:`Interval` indicates how often this channel should be used in an acquisition. For example, in two-color imaging, CH1 may image a process twice as fast as what is labeled in CH2. Setting the CH2 interval to 2 allows a user to image the processes in both channels at a similar rate. This will be implemented in future releases of the software.
* :guilabel:`Defocus` indicates the defocus between two channels in micrometers. The defocus values are always relative to the focus of the first channel imaged. This setting is useful for compensating for chromatic aberration.
-------------------
.. _ui_stack_settings:
Stack Acquisition Settings
^^^^^^^^^^^^^^^^^^^^^^^^^^
These are the settings used for a standard Z-Stack Acquisition.
:guilabel:`Pos` indicates z-positions. :guilabel:`Foc` indicates focus positions. The z-stack can optionally ramp through ``focus`` along with ``Z``.
:guilabel:`Start` and :guilabel:`End` are always expressed relative to the center of the z-stack. :guilabel:`Abs Z Start` and :guilabel:`Abs Z Stop` provide true stage positions at the start and end of the z-stack.
The buttons :guilabel:`Set Start Pos/Foc` and :guilabel:`Set End Pos/Foc` grab the current ``Z`` and ``focus`` positions from the stage and enter them into the corresponding start and end (stop) GUI boxes.
The :guilabel:`Step Size` is expressed in microns and can be modified by the user. Upon modification, :guilabel:`# slices` will automatically update.
:guilabel:`Laser Cycling Settings` provide the options "Per Stack" and "Per Z". In "Per Stack" mode, the software will move through all positions before changing to another color channel. In "Per Z" mode, the software will acquire all color channels selected before moving to the next position in the z-stack.
-------------------
.. _ui_timepoint_settings:
Timepoint Settings
^^^^^^^^^^^^^^^^^^
These are used for acquiring data over multiple timepoints and for toggling the option to save data.
* :guilabel:`Save Data` tells the software to save acquired data to disk when checked. If this is selected, a :ref:`saving popup window <ui_file_save_dialog>` will appear when :guilabel:`Acquire` is pressed, unless the user is in "Continuous Scan" mode, which is designed for live previews only.
* :guilabel:`Timepoints` indicates how many time points this acquisition should acquire.
* :guilabel:`Stack Acq Time` provides an estimate of how long a single z-stack will take to acquire.
* :guilabel:`Stack Pause (s)` indicates how much waiting time the software should introduce in between acquisition steps (e.g. in between taking z-stacks).
* :guilabel:`Time Interval (hh:mm:ss)` provides an estimate of how long each time point takes to acquire. This is (stack acquisition + stack pause) x number of channels to image.
* :guilabel:`Experiment Duration (hh:mm:ss)` provides an estimate of how long the full acquisition will take.
.. Note::
The :guilabel:`Stack Acq Time` and :guilabel:`Experiment Duration (hh:mm:ss)` do not account for stage movement time. Thus, for stages with serial communication protocols, or stages with slow movement, these estimates will be an underestimate. Future releases will account for stage movement time to provide a more accurate estimate.
-------------------
.. _ui_multiposition_settings:
Multi-Position Acquisition
^^^^^^^^^^^^^^^^^^^^^^^^^^
This contains settings to set up acquisition over multiple positions in the sample, e.g. tiling.
* :guilabel:`Enable` indicates that the software should move through the positions listed in the :ref:`Multiposition Settings Notebook <ui_multiposition>` during the acquisition.
* :guilabel:`Launch Tiling Wizard` launches the :ref:`Tiling Wizard <ui_multiposition_tiling_wizard>`.
-------------------
.. _ui_quick_launch_buttons:
Quick Launch Buttons
^^^^^^^^^^^^^^^^^^^^
This provides access to the :ref:`Waveform Parameters <ui_waveform_parameters>` and :ref:`Autofocus Settings <ui_autofocus>` popups.
-------------------
.. _ui_camera_settings:
Camera Settings
---------------
.. image:: images/settings_camera.png
The :guilabel:`Camera Settings` Notebook is a tab (optionally, a popup) that controls the camera. It is split into three sections: :guilabel:`Camera Modes`, :guilabel:`Framerate Info`, and :guilabel:`Region of Interest Settings`.
-------------------
.. _ui_camera_modes:
Camera Modes
^^^^^^^^^^^^
The :guilabel:`Camera Modes` section is designed for switching between normal mode of operation, where the camera exposes all pixels semi-simultaneously, and light-sheet mode (a.k.a rolling shutter mode), where the camera exposes only a few pixels at a time, and progressively images from the top to the bottom of the camera chip or vice versa.
* :guilabel:`Sensor Mode` is used to switch between "Normal" and "Light-Sheet" modes.
* :guilabel:`Readout Direction` indicates if the rolling shutter should move from the bottom to the top of the camera chip or vice versa.
* :guilabel:`Number of Pixels` sets the rolling shutter width of the camera.
-------------------
.. _ui_framerate_info:
Framerate Info
^^^^^^^^^^^^^^
This displays information concerning the speed of acquisition and optionally allows the user to average these values over multiple images.
* :guilabel:`Exposure Time (ms)` displays the set camera exposure time.
* :guilabel:`Readout Time (ms)` displays how long it takes to read a frame from the camera. This includes exposure time.
* :guilabel:`Framerate (Hz)` displays how long it takes to acquire an image. This is based on an internal "wait ticket" approach, where the software times how long it waits for a frame to come in after receiving the previous frame. This frequency includes not only camera readout time, but, e.g. how long the software had to wait for the stage to finish moving before taking the next image in a z-stack. It is the most accurate time estimate in the software.
* :guilabel:`Images to Average` tells the camera to average frames. This will be implemented in future releases of the software.
-------------------
.. _ui_region_of_interest:
Region of Interest Settings
^^^^^^^^^^^^^^^^^^^^^^^^^^^
These allow the user to set the size of the region of interest in pixels. The camera can also be told to bin pixels. The corresponding field of view is displayed by calculating the number of pixels multiplied by the camera's effective pixel size, which is set in the :ref:`Mechanical Zoom <mechanical_zoom>` section of the configuration file.
:guilabel:`Default FOVs` includes buttons to quickly change the FOV to preset values.
:guilabel:`ROI center` indicates about what point the pixels crop on the camera.
-------------------
.. _stage_control_notebook:
Stage Control
-------------
.. image:: images/settings_stage.png
The :guilabel:`Stage Control` Settings Notebook is a tab (optionally, a popup) that controls the stage positions. It is split into six parts: :guilabel:`Stage Positions`, :guilabel:`X Y Movement`, :guilabel:`Z Movement`, :guilabel:`Focus Movement`, :guilabel:`Theta Movement`, and includes an emergency :guilabel:`STOP` button, as well as a button to :guilabel:`Enable Joystick`/:guilabel:`Disable Joystick`.
.. Note::
* The joystick button will only appear if the ``configuration.yaml`` file specifies which axes are controlled by the joystick. For example:
.. code-block:: yaml
stage:
hardware:
-
name: stage
type: PI
axes: [x, y, z, theta, f]
axes_mapping: [1, 2, 3, 4, 5]
joystick_axes: [x, y, z]
* Any stage axes that are loaded as a `synthetic_stage` will have disabled buttons.
By default, the stage is expected to have ``X``, ``Y``, ``Z``, ``Focus`` and ``Theta`` (rotation) axes. If a stage does not have one of these axes, the user can choose to not use that control. See the :ref:`stage subsection <configure_stages>` for more information.
-------------------
.. _ui_stage_positions:
Stage Positions
^^^^^^^^^^^^^^^
The entry boxes report the current position of each stage axis. If a user changes a value in an entry box, the stage axis will move to that value (provided it is within the stage bounds if stage limits are enabled, see :any:`here <stage_control_menu>`).
.. Warning::
If the value in the entry box is changed, the stage will move to that value. Such actions may result in the stage crashing into the sample or the objective lens. As such, we highly recommend that you keep the stage limits enabled.
-------------------
XY Movement
^^^^^^^^^^^
This includes the movement buttons for the ``X`` and ``Y`` axes. The left and right buttons control ``X``, while the up and down buttons control ``Y.`` The entry box in the middle of the buttons indicates the step size along these axes in microns. It can be changed by the user.
-------------------
Z Movement
^^^^^^^^^^
This controls the movement of the ``Z`` stage. The entry box indicates the step size along this axis and it can be changed by the user.
-------------------
Focus Movement
^^^^^^^^^^^^^^
This controls the movement of the ``Focus`` stage. The entry box indicates the step size along this axis and it can be changed by the user.
-------------------
Theta Movement
^^^^^^^^^^^^^^
This controls the movement of the ``Theta`` stage (i.e., sample rotation). The entry box indicates the step size along this axis and it can be changed by the user.
-------------------
Buttons
^^^^^^^
The :guilabel:`STOP` button halts all stage axes and updates the stage positions to wherever the stage stopped.
The :guilabel:`Enable Joystick` button disables control over the axes associated with the joystick (see the :ref:`stage subsection <configure_stages>`).
.. note::
It is not necessary to press this button to use a joystick. The joystick can be used along with the software controls. However, if a user is running the acquisition in "Continuous Scan" mode and uses the joystick without pressing :guilabel:`Enable Joystick`, the stage positions may not update unless :guilabel:`STOP` is also pressed. In "Continuous Scan" mode, if a user tries to move with the joystick and then the software stage controls without first pressing :guilabel:`STOP`, it is likely the stage will update to the software's position of choice and undo the joystick movement.
.. tip::
For a large monitor, it is often helpful to convert the :guilabel:`Stage Control Settings Notebook` to a popup. Right click on the tab and press :guilabel:`Popout Tab`.
.. image:: images/popout_right_click.png
|
Once this is done, it should be possible to move the stage controls next to the main **navigate** window.
.. image:: images/popout_stage.png
-------------------
.. _ui_multiposition:
Multi-Position
--------------
.. image:: images/settings_multiposition.png
The :guilabel:`Multiposition` Settings Notebook is a tab (optionally, a popup) that helps the user set up and visualize a multi-position acquisition for tiling a large sample. It is split into two parts: buttons and the multi-position table.
-------------------
Multi-Position Buttons
^^^^^^^^^^^^^^^^^^^^^^
* :guilabel:`Launch Tiling Wizard` launches the :ref:`Tiling Wizard <ui_multiposition_tiling_wizard>`
* :guilabel:`Eliminate Empty Positions` is not implemented and does nothing.
* :guilabel:`Save Positions To Disk` saves the multi-position table to a file.
* :guilabel:`Load Positions From Disk` loads a multi-position file into the table.
-------------------
.. _ui_multiposition_table:
Multi-Position Table
^^^^^^^^^^^^^^^^^^^^
The multi-position table lists stage positions that are included in a multi-position acquisition.
* :kbd:`Double-clicking` on the integer to the left of a row moves the stage to that position.
* :kbd:`Double-clicking` on a table cell allows the user to edit the stage position in that cell.
* :kbd:`Right-clicking` on the integer to the left of a row yields a popup with four options:
.. image:: images/multiposition_right_click.png
* :guilabel:`Insert New Position` adds an empty row to the table.
* :guilabel:`Add Current Position` adds a row containing the current stage position to the table.
* :guilabel:`Add New Position(s)` yields a popup that asks the user how many new rows to add and then inserts that number of empty rows upon confirmation.
* :guilabel:`Delete Position(s)` deletes the selected positions. Selection is indicated by a blue highlight of the integer to the left of a row.
-------------------
Display Notebooks
==================
The display notebooks provide visual feedback of the images taken on the camera and of the galvo and remote focus waveforms sent to the DAQ.
-------------------
Camera View
-----------
.. image:: images/display_camera.png
The :guilabel:`Camera View` Notebook is a tab (optionally, a popup) that is split into two parts. The left part displays the latest image acquired by the camera. The right part modifies this display and is split into :guilabel:`LUT`, :guilabel:`Image Metrics`, and :guilabel:`Image Display`.
:kbd:`Left-clicking` on the image toggles crosshairs that indicate the center of the field of view.
-------------------
.. _ui_lut:
LUT
^^^
The :guilabel:`LUT` section of the camera view allows the user to change the lookup table the image uses to display. The options are :guilabel:`Gray`, :guilabel:`Gradient`, and :guilabel:`Rainbow`.
:guilabel:`Flip XY` transposes the image in the display. This can produce intuitive results in the display when clicking on the ``X`` or ``Y`` stage movements buttons (i.e. with :guilabel:`Flip XY` enabled, the sample moves along the direction expected when a stage movement button is clicked).
:guilabel:`Autoscale` toggles automatic image histogram scaling on and off. When :guilabel:`Autoscale` is enabled, the image automatically scales intensity between the minimum and maximum pixel value in the image produced by the camera. When :guilabel:`Autoscale` is disabled, the image is scaled between :guilabel:`Min Counts` and :guilabel:`Max Counts`.
-------------------
Image Metrics
^^^^^^^^^^^^^
:guilabel:`Frames to Avg` is unimplemented, but should average this many frames coming from the camera and display the average in the viewer. It will be implemented in future releases of the software.
:guilabel:`Image Max Counts` displays the maximum pixel count in the image.
:guilabel:`Channel` indicates which color channel is displayed. It indexes into the selected channels in the :ref:`Channel Settings <ui_channel_settings>` (i.e. ``0`` is the first selected channel).
-------------------
Image Display
^^^^^^^^^^^^^
This toggles between a live mode and maximum projections in multiple dimensions. This is useful for visual inspection of the data as it is being acquired, and will be implemented in future releases of the software.
-------------------
.. _ui_waveform_settings:
Waveform Settings
-----------------
.. image:: images/display_waveform.png
:guilabel:`Waveform Settings` is a tab (optionally, a popup) split into two sections: a waveform display section at the top and a :guilabel:`Settings` section at the bottom.
-------------------
Waveform Display
^^^^^^^^^^^^^^^^
The waveform display shows the waveforms sent to the remote focus devices (top) and the galvos (bottom). Each channel and each device gets its own color, which is then displayed in the legend. The dotted black line indicates when the camera is acquiring in relation to the waveforms. This can be considered identical to what is sent to the DAQ.
-------------------
Settings
^^^^^^^^
:guilabel:`Sample Rate` changes the frequency of the samples sent to the DAQ. It is not recommended that a user change this.
:guilabel:`Waveform Template` changes the :ref:`waveform template <configure_waveform_templates>` used to generate the waveforms.
-------------------
Additional GUIs
===============
This section includes popups and other non-main sections of the GUI.
-------------------
.. _ui_file_save_dialog:
File Saving Dialog
------------------
.. image:: images/save_dialog.png
The file saving dialog pops up if an :ref:`acquisition mode <ui_acquisition_bar>` other than "Continuous Scan" is selected and :ref:`Save Data <ui_timepoint_settings>` is checked.
* :guilabel:`Root Directory` indicates the local directory to which the software will save the data.
* :guilabel:`User` is the name of the user acquiring the data.
* :guilabel:`Tissue Type` is the type of tissue being imaged.
* :guilabel:`Cell Type` is the cell type being imaged.
* :guilabel:`Label` indicates the dyes used in the acquisition.
* :guilabel:`Solvent` indicates the immersion solvent of the tissue/cell.
* :guilabel:`File Type` indicates what type of file to save to.
* :guilabel:`Notes` is for any additional information the user wants to store with the file.
.. _ui_waveform_parameters:
Waveform Parameters
-------------------
.. image:: images/waveform_parameters.png
This is used to update the waveforms shown in :ref:`Waveform Settings <ui_waveform_settings>`.
* For each laser, the :guilabel:`Amplitude` and :guilabel:`Offset` correspond to the amplitude and offset of the waveform sent to the remote focus device.
* For each galvo, the :guilabel:`Amplitude` and :guilabel:`Offset` correspond to the amplitude and offset of the waveform sent to the galvo, by default a triangle wave.
* The :guilabel:`Galvo 0 Frequency (Hz)` sets the frequency of the waveform sent to the galvo. :guilabel:`Estimate Frequency` estimates the frequency needed for a sawtooth wave to sweep over the camera region of interest without aliasing with the light-sheet for a given rolling shutter size and speed (e.g., in a digitally scanned light-sheet format).
* Additional galvos from the :ref:`configuration file <configuration_file>` file are incrementally added here (e.g., :guilabel:`Galvo 1 Frequency (Hz)`, ...).
* :guilabel:`Percent Delay` introduces a delay before the remote focus waveform starts.
* :guilabel:`Percent Smoothing` smooths the remote focus waveform.
* :guilabel:`Settle Duration (ms)` introduces a delay after the remote focus sawtooth ends.
-------------------
.. _ui_configure_microscopes:
Configure Microscopes
---------------------
.. image:: images/configure_microscopes.png
The :guilabel:`Configure Microscopes` window allows a user with multiple microscopes defined in their :ref:`configuration file <configuration_file>` to select which microscope is primary and launch both microscopes simultaneously. The primary microscope will have control over any hardware shared between both microscopes. This window also provides a GUI interface to look at what hardware is in use.
-------------------
.. _ui_multiposition_tiling_wizard:
Multi-Position Tiling Wizard
----------------------------
.. image:: images/tiling_wizard.png
The tiling wizard helps the user set up a tiled acquisition of a sample large enough that it cannot be imaged in a single field of view.
* :guilabel:`Set <axis> Start` indicates the starting position of an axis.
* :guilabel:`Set <axis> End` indicates the end position of an axis.
* :guilabel:`<axis> Distance` indicates difference between the start and end position.
* :guilabel:`<axis> FOV Dist` indicates the field of view along that axis. The Distance between start and end will be split into tiles of this size along this axis.
* :guilabel:`Num. Tiles` indicates how many tiles exist along this axis. It is roughly (End - Start)/FOV dist.
* :guilabel:`% Overlap` indicates the percent of the tile that should overlap along each axis. It is a percent of the FOV Dist.
* :guilabel:`Populate Multi-Position Table` puts all of the tiles in the :ref:`multi-position table <ui_multiposition_table>`.
For an example of how to use the tiling wizard, see :ref:`Tiling a sample larger than the field of view <acquire_mesospimbt_tiling>`.
-------------------
.. _ui_autofocus:
Autofocus Settings
------------------
.. image:: images/autofocus_settings.png
The :guilabel:`Autofocus Settings` panel controls parameters of the autofocus :ref:`feature <user_guide_features>`.
* :guilabel:`Device Type` indicates if the autofocus routine should be applied to a stage or to a remote focus device.
* :guilabel:`Device Reference` indicates the stage axis, or the DAQ analog output for the remote focus device, to use.
* The :guilabel:`Coarse` and :guilabel:`Fine` rows allow users to select a range and step size, both in microns (or volts, if using the remote focus device), over which the autofocus routine should search for an optimal focus value. If coarse and fine are selected, the coarse search will be performed first and the fine search will be performed about the coarse position with the highest value.
* :guilabel:`Inverse Power Tent Fit` will attempt to find a more accurate position for the optimal focus based on fitting a power tent to the search values. It will only use the fit if its :math:`R^2` value is higher than ``0.9``.
* :guilabel:`Autofocus` runs the autofocus with the set parameters.
Once the settings have been updated here, any run autofocus operation will use the new settings.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More