diff --git a/.gitignore b/.gitignore
index 4dfd571..3d083b1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,8 +4,7 @@ __pycache__
/**/.ipynb_checkpoints
**/*.ipynb_checkpoints/
mesoSPIM/legacy/*
-tmp/*
-/tmp/*
+
*.log
mesoSPIM/src/devices/zoom/dynamixel/*
mesoSPIM/PI_GCS2_DLL_x64.dll
@@ -23,6 +22,12 @@ mesoSPIM/src/devices/stages/galil/gclib/__init__\.py
mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE - H45\.csv
+mesoSPIM/config/*.py
+!mesoSPIM/config/demo_config.py
+
+mesoSPIM/config/etl_parameters/*.*
+!mesoSPIM/config/etl_parameters/ETL-parameters.csv
+
mesoSPIM/src/devices/stages/galil/gclib/gclib\.py
mesoSPIM/src/devices/stages/galil/gclib\.py
@@ -34,15 +39,31 @@ mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE - H45\.csv
mesoSPIM/src/mesoSPIM_DemoSerial\.py
-
-mesoSPIM/src/devices/stages/galil/gclib/gclib\.py
-
-mesoSPIM/src/devices/stages/galil/gclib\.py
-
-mesoSPIM/src/devices/stages/galil/gclib/__init__\.py
-
-mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE - H45\.csv
-
-*.log
-
-mesoSPIM/src/devices/zoom/dynamixel\.zip
\ No newline at end of file
+
+
+mesoSPIM/src/devices/stages/galil/gclib/gclib\.py
+
+
+
+mesoSPIM/src/devices/stages/galil/gclib\.py
+
+
+
+mesoSPIM/src/devices/stages/galil/gclib/__init__\.py
+
+
+
+mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE - H45\.csv
+
+
+
+*.log
+
+
+
+mesoSPIM/src/devices/zoom/dynamixel\.zip
+
+mesoSPIM/acq/
+
+mesoSPIM/tmp/
+!mesoSPIM/tmp/readme.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..e789b6f
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,38 @@
+## Version [0.1.3] - March 13, 2020
+* :warning: **Depending on your microscope configuration, this release breaks backward compatibility with previous configuration files. If necessary, update your configuration file using `demo_config.py` as an example.**
+* :warning: **There are new startup parameters in the config file - make sure to update your config files accordingly**. For example, `average_frame_rate` has been added.
+* :warning: **This release removes unnecessary configuration files from the public repository - make sure to back up your mesoSPIM & ETL configuration files beforehand. In addition, old example acquisition tables (in `mesoSPIM-control\mesoSPIM\acquisitions\`) are removed as well.**
+* :gem: **New: Support for more cameras**: **Photometrics** cameras are now supported if `PyVCAM` and the PVCAM-SDK are installed. Only the Iris 15 has been tested so far. In addition, the **Hamamatsu Orca Fusion** is now supported.
+* :gem: **New: Multicolor tiling wizard**: The Tiling wizard can now support up to 3 color channels with different ETL parameters and focus tracking settings.
+* :gem: **New: Full demo mode - addresses #16**: `mesoSPIM-control` can now be run without any microscope hardware by using the `demo_config.py` configuration file.
+* :gem: **New: Snap function** -- Single pictures can now be taken by clicking the snap button. The filename is autogenerated from the current time. Files are saved as `.tif` which requires `tifffile` as an additional library.
+* :gem: **New: Acquisition time prediction** -- `mesoSPIM-control` now measures the average framerate every 100 frames to predict the acquisition time. To have a correct initial estimate
+in the `Acquisition Manager`, please update the `average_frame_rate` with the measured values
+from your microscope (are now logged in the metadata files after an acquisition).
+* :gem: **New: Focus tracking** -- Different start and end focus positions can now be specified in the Acquisition Manager. When moving the sample to acquire the stack, the microscope changes focus according to a linear interpolation between these values. At z_start, the microscope moves the detection path
+to f_start and at z_end, the detection path focus is at z_end. This allows imaging a liquid-filled sample cuvette without an immersion cuvette. The `Mark current focus` button changes both values at once.
+* :gem: **New: Improved acquisition previews** -- An additional checkbox allows to switch off Z axis movements when previewing acquisitions. This way, the field-of-view does not move outside of the sample which is especially helpful when updating ETL value for individual tiles/stacks in large acquisition tables. :warning: When previewing an acquistion requires a rotation, z movements still occur for safety reasons.
+* :gem: **New: Image Processing Wizard**: `mesoSPIM-control` now has an Image Processing Wizard (accessible via a button in the `Acquisition Manager`). Currently, this allows maximum projections to be generated automatically after acquisitions.
+* :sparkles: **Improvement:** `Acquisition Manager`: Naming of buttons has been improved, in addition, **tooltips** have been added to improve usability.
+* :sparkles: **Improvement:** Removed unnecessary microscope and ETL configuration files cluttering the repository. Changed `.gitignore` correspondingly - future changes to configuration files. This addresses issue #16.
+* :sparkles: **Improvement:** The software now provides more verbose warnings when acquisitions cannot be started due to missing folders, duplicated filenames and already existing files.
+* :sparkles: **Improvement:** Better warnings if no row is selected while clicking Mark buttons.
+* :sparkles: **New:** Added a `CHANGELOG.md` file
+* :bug: **Bugfix:** Manually entering a value in a field in the Acquisition Manager table would change values in other rows as well if the row had been copied before.
+* :bug: **Bugfix:** Mark buttons and dropdown menus in the Acquisition Manager table slowed down the GUI when a lot of rows (>25) were present. As a fix, only the selected row shows the menu.
+* :bug: **Bugfix #26:** Fixed: First row is selected by mark buttons by default if only a single row exists in the Acquisition Manager Table
+* :bug: **Bugfix #27:** Fixed: Entering text into boxes is a bit buggy
+* :bug: **Bugfix #30:** Fixed: Zooming drop down menu often fails to update after a zoom
+* :bug: **Bugfix #31:** Fixed: `demo_config.py` now contains subsampling settings
+* :bug: **Bugfix #34:** Fixed: Last frame in a stack is blank due to an off-by-one error
+* :bug: **Bugfix #35:** Fixed: Software crashes when one folder (to save data in) in the acquisition list does not exist
+
+---
+
+## Version [0.1.2] - August 19th, 2019
+* **New:** Logging is now supported. Logfiles go in the `log` folder.
+* **New:** Improved support for a specific mesoSPIM configuration using sample & focusing stages by Steinmayer Mechantronik and in combination with PI stages for sample rotation and z-movement.
+* **Fix:** Reduced the output to the command line
+* **Fix:** To decrease laggyness of the GUI in live mode and during acquisitions, display subsampling is now available. This way, less image data has to be rendered by the GUI.
+* **Fix:** Fixed a variety of multithreading bugs.
+* **Fix:** Galvo amplitude and frequency in the startup part of the configuration file are now used to set startup parameters properly
\ No newline at end of file
diff --git a/README.md b/README.md
index 91cf017..0f97938 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,25 @@
# mesoSPIM-control
-Code and documentation for the mesoSPIM light-sheet microscope software.
-The documentation of the microscope hardware information can be found [here](https://github.com/mesoSPIM/mesoSPIM-hardware-documentation).
+Image acquisition software for [mesoSPIM](http://mesospim.org/) light-sheet microscopes. A mesoSPIM (mesoscale selective plane illumination microscope) is optimized for fast imaging of large (many cm³) cleared tissue samples at near-isotropic resolution. Currently, more than 10 mesoSPIM setups are operational [around the world](http://mesospim.org/setups/).
+
+Parts lists, drawings, and instructions for building a mesoSPIM can be found in the [mesoSPIM wiki](https://github.com/mesoSPIM/mesoSPIM-hardware-documentation).
## Overview
-The Swiss mesoSPIM is a versatile light-sheet microscope for imaging
+The mesoSPIM is a versatile light-sheet microscope for imaging
cleared tissue samples. It is compatible with all major clearing approaches - including CLARITY - and optimized for quickly creating large-field-of-view overview datasets of whole mouse brains.
## Installation
+### :warning: Warning
+If you are updating `mesoSPIM-control` from a previous version: Please have a close look at the [Changelog](CHANGELOG.md) to avoid overwriting your configuration files.
+
### Prerequisites
* Windows 7 or Windows 10
* Python >3.6
#### Device drivers
* [Hamamatsu DCAM API](https://dcam-api.com/) when using Hamamatsu Orca Flash 4.0 V2 or V3 sCMOS cameras. To test camera functionality, [HCImage](https://dcam-api.com/hamamatsu-software/) can be used.
-* [Software for Physik Instrumente stages](https://www.physikinstrumente.com/en/products/motion-control-software/) if a PI stage is used. To test the stages, PI MicroMove can be used.
+* [PVCAM and PVCAM-SDK](https://www.photometrics.com/support/software/) when using Photometrics cameras (under development). In addition, the `PyVCAM` Python package is necessary ([Link](https://github.com/Photometrics/PyVCAM)).
+* [Software for Physik Instrumente stages](https://www.physikinstrumente.com/en/products/motion-control-software/) if a PI stage is used. To test the stages, PI MicroMove can be used.
* [Software for Steinmeyer Mechatronics / Feinmess stages using Galil drivers](http://www.galilmc.com/downloads/api) if such a stage is used. To test the stages, GalilTools can be used.
* [Robotis DynamixelSDK](https://github.com/ROBOTIS-GIT/DynamixelSDK/releases) for Dynamixel Zoom servos. Make sure you download version 3.5.4 of the SDK.
@@ -28,7 +33,7 @@ mesoSPIM-control is usually running with [Anaconda](https://www.anaconda.com/dow
* scipy
* ctypes
* importlib
-* PyQt5
+* PyQt5 (if there are problems with PyQt5 such as `ModuleNotFoundError: No module named 'PyQt5.QtWinExtras` after starting `mesoSPIM-control`, try reinstalling PyQt5 by: `python -m pip install --user -I PyQt5` and `python -m pip install --user -I PyQt5-sip`)
In addition (for Anaconda), the following packages need to be installed:
* nidaqmx (`python -m pip install nidaqmx`)
@@ -36,7 +41,9 @@ In addition (for Anaconda), the following packages need to be installed:
* serial (`python -m pip install pyserial`)
* pyqtgraph (`python -m pip install pyqtgraph`)
* pywinusb (`python -m pip install pywinusb`)
-* PIPython (part of the Physik Instrumente software collection. Unzip it, `cd` to the directory with the Anaconda terminal as an admin user, then install with `python setup.py install`. Test install with test installation with `import pipython`)
+* PIPython (part of the Physik Instrumente software collection. Unzip it, `cd` to the directory with the Anaconda terminal as an admin user, then install with `python setup.py install`. Test install with test installation with `import pipython`). You can also download PIPython [here](https://github.com/royerlab/pipython)
+* tifffile (`python -m pip install tifffile`)
+* ([PyVCAM when using Photometrics cameras](https://github.com/Photometrics/PyVCAM)
#### Preparing python bindings for device drivers
* For PI stages, copy `C:\ProgramData\PI\GCSTranslator\PI_GCS2_DLL_x64.dll` in the main mesoSPIM folder: `PI_GCS2_DLL_x64.dll`
diff --git a/mesoSPIM/acquisitions/H45_first_true_test_acq b/mesoSPIM/acquisitions/H45_first_true_test_acq
deleted file mode 100644
index 07da9aa..0000000
Binary files a/mesoSPIM/acquisitions/H45_first_true_test_acq and /dev/null differ
diff --git a/mesoSPIM/acquisitions/H45_second_true_test_acq b/mesoSPIM/acquisitions/H45_second_true_test_acq
deleted file mode 100644
index d62cb01..0000000
Binary files a/mesoSPIM/acquisitions/H45_second_true_test_acq and /dev/null differ
diff --git a/mesoSPIM/acquisitions/H45_test_acq_PI_stages.acq b/mesoSPIM/acquisitions/H45_test_acq_PI_stages.acq
deleted file mode 100644
index 2516992..0000000
Binary files a/mesoSPIM/acquisitions/H45_test_acq_PI_stages.acq and /dev/null differ
diff --git a/mesoSPIM/acquisitions/test1_DemoH45.acq b/mesoSPIM/acquisitions/test1_DemoH45.acq
deleted file mode 100644
index 4e9c4c1..0000000
Binary files a/mesoSPIM/acquisitions/test1_DemoH45.acq and /dev/null differ
diff --git a/mesoSPIM/acquisitions/test_acq1.acq b/mesoSPIM/acquisitions/test_acq1.acq
deleted file mode 100644
index cbedfe4..0000000
Binary files a/mesoSPIM/acquisitions/test_acq1.acq and /dev/null differ
diff --git a/mesoSPIM/acquisitions/test_single_stack_save.acq b/mesoSPIM/acquisitions/test_single_stack_save.acq
deleted file mode 100644
index 5329e19..0000000
Binary files a/mesoSPIM/acquisitions/test_single_stack_save.acq and /dev/null differ
diff --git a/mesoSPIM/config/config_EMU_demo.py b/mesoSPIM/config/config_EMU_demo.py
deleted file mode 100644
index 93126e9..0000000
--- a/mesoSPIM/config/config_EMU_demo.py
+++ /dev/null
@@ -1,223 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'Demo' # FarmSimulator
-
-laser = 'Demo' # NI
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '515 nm': 'PXI6733/port0/line4',
- '561 nm': 'PXI6733/port0/line5',
- '594 nm': 'PXI6733/port0/line6',
- '647 nm': 'PXI6733/port0/line7'}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '515 nm' : 2,
- '561 nm' : 3,
- '594 nm' : 4,
- '647 nm' : 5,
- 'Empty 0' : 6,
- 'Empty 1' : 7
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'Demo' # NI
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'Demo' # 'HamamatsuOrcaFlash'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'DemoStage', # 'PI' or 'DemoStage'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 32000,
- 'x_min' : -32000,
- 'y_max' : 99000,
- 'y_min' : -99000,
- 'z_max' : 41000,
- 'z_min' : -41000,
- 'f_max' : 99000,
- 'f_min' : -99000,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 40000,
- 'z_rot_position': 22000,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'DemoFilterWheel',
- 'COMport' : 'COM10'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0,
- '405-488-647-Tripleblock' : 1,
- '405-488-561-640-Quadrupleblock' : 2,
- '464 482-35' : 3,
- '508 520-35' : 4,
- '515LP' : 5,
- '529 542-27' : 6,
- '561LP' : 7,
- '594LP' : 8,
- '417 447-60' : 9}
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'DemoZoom',
- 'servo_id' : 4,
- 'COMport' : 'COM38',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_H45_demo.py b/mesoSPIM/config/config_H45_demo.py
deleted file mode 100644
index b3b6dc4..0000000
--- a/mesoSPIM/config/config_H45_demo.py
+++ /dev/null
@@ -1,232 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'Demo' # FarmSimulator
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '515 nm': 'PXI6733/port0/line4',
- '561 nm': 'PXI6733/port0/line5',
- '594 nm': 'PXI6733/port0/line6',
- '647 nm': 'PXI6733/port0/line7'}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '515 nm' : 2,
- '561 nm' : 3,
- '594 nm' : 4,
- '647 nm' : 5,
- 'Empty 0' : 6,
- 'Empty 1' : 7
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'subsampling' : [1,2,4],
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'DemoStage', # 'PI' or 'DemoStage'
- 'startfocus' : 95000,
- 'y_load_position': -40000,
- 'y_unload_position': -90000,
- 'x_max' : 51000,
- 'x_min' : -46000,
- 'y_max' : 0,
- 'y_min' : -160000,
- 'z_max' : 2000,
- 'z_min' : -97000,
- 'f_max' : 99000,
- 'f_min' : -1000,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 0,
- 'y_rot_position': -58000,
- 'z_rot_position': -35000,
- }
-
-xyz_galil_parameters = {'COMport' : 'COM48',
- 'x_encodercounts_per_um' : 2,
- 'y_encodercounts_per_um' : 2,
- 'z_encodercounts_per_um' : 2}
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','M-061.PD'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM53'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0, # Every config should contain this
- '405-488-647-Tripleblock' : 1,
- '405-488-561-640-Quadrupleblock' : 2,
- '464 482-35' : 3,
- '508 520-35' : 4,
- '515LP' : 5,
- '529 542-27' : 6,
- '561LP' : 7,
- '594LP' : 8,
- '417 447-60' : 9}
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 4,
- 'COMport' : 'COM38',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 2.5,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 2.5,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-'camera_display_live_subsampling': 1,
-'camera_display_snap_subsampling': 1,
-'camera_display_acquisition_subsampling': 2,
-}
diff --git a/mesoSPIM/config/config_H45_legacy.py b/mesoSPIM/config/config_H45_legacy.py
deleted file mode 100644
index 91612a8..0000000
--- a/mesoSPIM/config/config_H45_legacy.py
+++ /dev/null
@@ -1,223 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '515 nm': 'PXI6733/port0/line4',
- '561 nm': 'PXI6733/port0/line5',
- '594 nm': 'PXI6733/port0/line6',
- '647 nm': 'PXI6733/port0/line7'}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '515 nm' : 2,
- '561 nm' : 3,
- '594 nm' : 4,
- '647 nm' : 5,
- 'Empty 0' : 6,
- 'Empty 1' : 7
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'PI', # 'PI' or 'Debug'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 10000,
- 'x_max' : 44000,
- 'x_min' : 1000,
- 'y_max' : 99000,
- 'y_min' : 0,
- 'z_max' : 44400,
- 'z_min' : 600,
- 'f_max' : 99000,
- 'f_min' : 0,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 40000,
- 'z_rot_position': 22000,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM53'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0, # Every config should contain this
- '405-488-647-Tripleblock' : 1,
- '405-488-561-640-Quadrupleblock' : 2,
- '464 482-35' : 3,
- '508 520-35' : 4,
- '515LP' : 5,
- '529 542-27' : 6,
- '561LP' : 7,
- '594LP' : 8,
- '417 447-60' : 9}
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 4,
- 'COMport' : 'COM38',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_H45_legacy_demo.py b/mesoSPIM/config/config_H45_legacy_demo.py
deleted file mode 100644
index 5691f80..0000000
--- a/mesoSPIM/config/config_H45_legacy_demo.py
+++ /dev/null
@@ -1,223 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '515 nm': 'PXI6733/port0/line4',
- '561 nm': 'PXI6733/port0/line5',
- '594 nm': 'PXI6733/port0/line6',
- '647 nm': 'PXI6733/port0/line7'}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '515 nm' : 2,
- '561 nm' : 3,
- '594 nm' : 4,
- '647 nm' : 5,
- 'Empty 0' : 6,
- 'Empty 1' : 7
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'DemoStage', # 'PI' or 'DemoStage'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 32000,
- 'x_min' : -32000,
- 'y_max' : 99000,
- 'y_min' : -99000,
- 'z_max' : 41000,
- 'z_min' : -41000,
- 'f_max' : 99000,
- 'f_min' : -99000,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 30000,
- 'z_rot_position': 22000,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM53'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0,
- '405-488-647-Tripleblock' : 1,
- '405-488-561-640-Quadrupleblock' : 2,
- '464 482-35' : 3,
- '508 520-35' : 4,
- '515LP' : 5,
- '529 542-27' : 6,
- '561LP' : 7,
- '594LP' : 8,
- '417 447-60' : 9}
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 4,
- 'COMport' : 'COM38',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_J90.py b/mesoSPIM/config/config_J90.py
deleted file mode 100644
index 5e6864b..0000000
--- a/mesoSPIM/config/config_J90.py
+++ /dev/null
@@ -1,227 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6229_1 is responsible for the shutters, ETL waveforms and galvo waveforms
-PXI6229_2 is responsible for the laser(s)
-'''
-
-
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI_6229_1/port0/line1',
- 'camera_trigger_source' : '/PXI_6229_1/PFI0',
- 'camera_trigger_out_line' : '/PXI_6229_1/ctr0',
- 'galvo_etl_task_line' : 'PXI_6229_1/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI_6229_1/PFI0',
- 'laser_task_line' : 'PXI_6229_2/ao0:3',
- 'laser_task_trigger_source' : '/PXI_6229_1/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines'''
-laserdict = {'488 nm': 'PXI_6229_2/port0/line3',
- '515 nm': 'PXI_6229_2/port0/line4',}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'488 nm' : 0,
- '515 nm' : 1,
- 'Empty 0' : 2,
- 'Empty 1' : 3,}
-
-'''
-Assignment of the galvos and ETLs to the 6229 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI_6229_1/port0/line0',
- 'shutter_right' : 'PXI_6229_1/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'GalilStage', # 'PI' or 'DemoStage' or 'GalilStage'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 200000,
- 'x_min' : -200000,
- 'y_max' : 200000,
- 'y_min' : -200000,
- 'z_max' : 200000,
- 'z_min' : -200000,
- 'f_max' : 200000,
- 'f_min' : -200000,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 40000,
- 'z_rot_position': 22000,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'),
- }
-
-xyz_galil_parameters = {'COMport' : 'COM9',
- 'x_encodercounts_per_um' : 2,
- 'y_encodercounts_per_um' : 2,
- 'z_encodercounts_per_um' : 2}
-
-f_galil_parameters = {'COMport' : 'COM8',
- 'x_encodercounts_per_um' : 0,
- 'y_encodercounts_per_um' : 0,
- 'z_encodercounts_per_um' : 2}
-
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'DemoFilterWheel', #DemoFilterWheel
- 'COMport' : 'COM10'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0,
- '405-488-647-Tripleblock' : 1,
- '405-488-561-640-Quadrupleblock' : 2,
- '464 482-35' : 3,
- '508 520-35' : 4,
- '515LP' : 5,
- '529 542-27' : 6,
- '561LP' : 7,
- '594LP' : 8,
- '417 447-60' : 9}
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'DemoZoom', #DemoZoom
- 'servo_id' : 4,
- 'COMport' : 'COM38',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_J90_demo.py b/mesoSPIM/config/config_J90_demo.py
deleted file mode 100644
index 20a02c4..0000000
--- a/mesoSPIM/config/config_J90_demo.py
+++ /dev/null
@@ -1,227 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6229_1 is responsible for the shutters, ETL waveforms and galvo waveforms
-PXI6229_2 is responsible for the laser(s)
-'''
-
-
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI_6229_1/port0/line1',
- 'camera_trigger_source' : '/PXI_6229_1/PFI0',
- 'camera_trigger_out_line' : '/PXI_6229_1/ctr0',
- 'galvo_etl_task_line' : 'PXI_6229_1/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI_6229_1/PFI0',
- 'laser_task_line' : 'PXI_6229_2/ao0:3',
- 'laser_task_trigger_source' : '/PXI_6229_1/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines'''
-laserdict = {'488 nm': 'PXI_6229_2/port0/line3',
- '515 nm': 'PXI_6229_2/port0/line4',}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'488 nm' : 0,
- '515 nm' : 1,
- 'Empty 0' : 2,
- 'Empty 1' : 3,}
-
-'''
-Assignment of the galvos and ETLs to the 6229 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI_6229_1/port0/line0',
- 'shutter_right' : 'PXI_6229_1/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'DemoStage', # 'PI' or 'DemoStage' or 'GalilStage'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 200000,
- 'x_min' : -200000,
- 'y_max' : 200000,
- 'y_min' : -200000,
- 'z_max' : 200000,
- 'z_min' : -200000,
- 'f_max' : 200000,
- 'f_min' : -200000,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 40000,
- 'z_rot_position': 22000,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'),
- }
-
-xyz_galil_parameters = {'COMport' : 'COM9',
- 'x_encodercounts_per_um' : 2,
- 'y_encodercounts_per_um' : 2,
- 'z_encodercounts_per_um' : 2}
-
-f_galil_parameters = {'COMport' : 'COM8',
- 'x_encodercounts_per_um' : 0,
- 'y_encodercounts_per_um' : 0,
- 'z_encodercounts_per_um' : 2}
-
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'DemoFilterWheel', #DemoFilterWheel
- 'COMport' : 'COM10'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0,
- '405-488-647-Tripleblock' : 1,
- '405-488-561-640-Quadrupleblock' : 2,
- '464 482-35' : 3,
- '508 520-35' : 4,
- '515LP' : 5,
- '529 542-27' : 6,
- '561LP' : 7,
- '594LP' : 8,
- '417 447-60' : 9}
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'DemoZoom', #DemoZoom
- 'servo_id' : 4,
- 'COMport' : 'COM38',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_USZ.py b/mesoSPIM/config/config_USZ.py
deleted file mode 100644
index 06e88ff..0000000
--- a/mesoSPIM/config/config_USZ.py
+++ /dev/null
@@ -1,227 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '515 nm': 'PXI6733/port0/line4',
- '561 nm': 'PXI6733/port0/line5',
- '594 nm': 'PXI6733/port0/line6',
- '647 nm': 'PXI6733/port0/line7'}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '515 nm' : 2,
- '561 nm' : 3,
- '594 nm' : 4,
- '647 nm' : 5,
- 'Empty 0' : 6,
- 'Empty 1' : 7
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'PI', # 'PI' or 'Debug'
- 'startfocus' : 41000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 35000,
- 'x_min' : 8500,
- 'y_max' : 99000,
- 'y_min' : 30000,
- 'z_max' : 41000,
- 'z_min' : 1000,
- 'f_max' : 99000,
- 'f_min' : 0,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 23597,
- 'y_rot_position': 85955,
- 'z_rot_position': 15316,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015798'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM10'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : (0,0),
- '405-488-647-Tripleblock' : (1,0),
- '405-488-561-640-Quadrupleblock' : (2,0),
- '435 460-50' : (3,0),
- '498 509-22' : (4,0),
- '508 530-43' : (5,0),
- '515LP' : (7,0),
- '520 535-30' : (6,0),
- '553 565-24' : (8,0),
- '561LP' : (9,0),
- '565 585-40' : (0,1),
- '594LP' : (0,2),
- '633LP' : (0,3),
- }
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 3,
- 'COMport' : 'COM19',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters - Daniel-USZ_08172018.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_USZ_demo.py b/mesoSPIM/config/config_USZ_demo.py
deleted file mode 100644
index a24321a..0000000
--- a/mesoSPIM/config/config_USZ_demo.py
+++ /dev/null
@@ -1,227 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'Demo' # Demo
-
-laser = 'Demo' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '515 nm': 'PXI6733/port0/line4',
- '561 nm': 'PXI6733/port0/line5',
- '594 nm': 'PXI6733/port0/line6',
- '647 nm': 'PXI6733/port0/line7'}
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '515 nm' : 2,
- '561 nm' : 3,
- '594 nm' : 4,
- '647 nm' : 5,
- 'Empty 0' : 6,
- 'Empty 1' : 7
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'Demo' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'DemoStage', # 'PI' or 'Debug'
- 'startfocus' : 41000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 35000,
- 'x_min' : 8500,
- 'y_max' : 99000,
- 'y_min' : 30000,
- 'z_max' : 41000,
- 'z_min' : 1000,
- 'f_max' : 99000,
- 'f_min' : 0,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 23597,
- 'y_rot_position': 85955,
- 'z_rot_position': 15316,
- }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015798'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM10'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : (0,0),
- '405-488-647-Tripleblock' : (1,0),
- '405-488-561-640-Quadrupleblock' : (2,0),
- '435 460-50' : (3,0),
- '498 509-22' : (4,0),
- '508 530-43' : (5,0),
- '515LP' : (7,0),
- '520 535-30' : (6,0),
- '553 565-24' : (8,0),
- '561LP' : (9,0),
- '565 585-40' : (0,1),
- '594LP' : (0,2),
- '633LP' : (0,3),
- }
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 3,
- 'COMport' : 'COM19',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters - Daniel-USZ_08172018.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_ZMB.py b/mesoSPIM/config/config_ZMB.py
deleted file mode 100644
index a1c8cc1..0000000
--- a/mesoSPIM/config/config_ZMB.py
+++ /dev/null
@@ -1,221 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '561 nm': 'PXI6733/port0/line4',
- '647 nm': 'PXI6733/port0/line5',
- }
-
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '561 nm' : 2,
- '647 nm' : 3,
- 'Empty 0' : 4,
- 'Empty 1' : 5,
- 'Empty 2' : 6,
- 'Empty 3' : 7,
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'PI', # 'PI' or 'DemoStage'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 30000,
- 'x_min' : 8500,
- 'y_max' : 99000,
- 'y_min' : 0,
- 'z_max' : 41000,
- 'z_min' : 1000,
- 'f_max' : 99000,
- 'f_min' : 0,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 40000,
- 'z_rot_position': 22000,
- }
-
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015797'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM22'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0,
- '405-488-561-640-Quadrupleblock' : 1,
- '508 520-35' : 2,
- '515LP' : 3,
- '561LP' : 4,
- '594LP' : 5,
- }
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 1,
- 'COMport' : 'COM24',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_ZMB_demo.py b/mesoSPIM/config/config_ZMB_demo.py
deleted file mode 100644
index 01eff5f..0000000
--- a/mesoSPIM/config/config_ZMB_demo.py
+++ /dev/null
@@ -1,239 +0,0 @@
-import numpy as np
-
-'''
-Basic hardware configuration
-'''
-
-'''
-PXI6733 is responsible for the lasers
-PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
-'''
-
-acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
- 'camera_trigger_source' : '/PXI6259/PFI0',
- 'camera_trigger_out_line' : '/PXI6259/ctr0',
- 'galvo_etl_task_line' : 'PXI6259/ao0:3',
- 'galvo_etl_task_trigger_source' : '/PXI6259/PFI0',
- 'laser_task_line' : 'PXI6733/ao0:7',
- 'laser_task_trigger_source' : '/PXI6259/PFI0'}
-
-sidepanel = 'FarmSimulator' # Demo
-
-laser = 'NI' # Demo
-
-'''The laserdict contains the digital enable lines for the SOLE-6'''
-laserdict = {'405 nm': 'PXI6733/port0/line2',
- '488 nm': 'PXI6733/port0/line3',
- '561 nm': 'PXI6733/port0/line4',
- '647 nm': 'PXI6733/port0/line5',
- }
-
-
-'''
-Assignment of the analog outputs of the Laser card to the channels
-The Empty slots are placeholders.
-'''
-laser_designation = {'405 nm' : 0,
- '488 nm' : 1,
- '561 nm' : 2,
- '647 nm' : 3,
- 'Empty 0' : 4,
- 'Empty 1' : 5,
- 'Empty 2' : 6,
- 'Empty 3' : 7,
- }
-
-'''
-Assignment of the galvos and ETLs to the 6259 AO channels.
-'''
-galvo_etl_designation = {'Galvo-L' : 0,
- 'Galvo-R' : 1,
- 'ETL-L' : 2,
- 'ETL-R' : 3,
- }
-
-'''
-Shutter configuration
-'''
-
-shutter = 'NI' # Demo
-shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
- 'shutter_right' : 'PXI6259/port2/line0'}
-
-''' A bit of a hack: Shutteroptions for the GUI '''
-shutteroptions = ('Left','Right','Both')
-
-'''
-Camera configuration
-'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
-
-camera_parameters = {'x_pixels' : 2048,
- 'y_pixels' : 2048,
- 'x_pixel_size_in_microns' : 6.5,
- 'y_pixel_size_in_microns' : 6.5,
- 'camera_id' : 0,
- 'sensor_mode' : 12, # 12 for progressive
- 'defect_correct_mode': 2,
- 'binning' : '1x1',
- 'readout_speed' : 1,
- 'trigger_active' : 1,
- 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
- 'trigger_polarity' : 2, # positive pulse
- 'trigger_source' : 2, # external
- }
-
-'''
-Stage configuration
-'''
-stage_parameters = {'stage_type' : 'DemoStage', # 'PI' or 'DemoStage'
- 'startfocus' : 95000,
- 'y_load_position': 75000,
- 'y_unload_position': 40000,
- 'x_max' : 32000,
- 'x_min' : -32000,
- 'y_max' : 99000,
- 'y_min' : -99000,
- 'z_max' : 41000,
- 'z_min' : -41000,
- 'f_max' : 99000,
- 'f_min' : -99000,
- 'theta_max' : 999,
- 'theta_min' : -999,
- 'x_rot_position': 22000,
- 'y_rot_position': 40000,
- 'z_rot_position': 22000,
- }
-
-# pi_parameters = {'controllername' : 'C-884',
-# 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
-# 'refmode' : ('FRF',),
-# 'serialnum' : ('118015797'),
-# 'startfocus' : 46900,
-# 'y_load_position': 75000,
-# 'y_unload_position': 40000,
-# 'x_max' : 30000,
-# 'x_min' : 8500,
-# 'y_max' : 99000,
-# 'y_min' : 0,
-# 'z_max' : 41000,
-# 'z_min' : 1000,
-# 'f_max' : 99000,
-# 'f_min' : 0,
-# 'theta_max' : 999,
-# 'theta_min' : -999,
-# }
-
-pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015797'),
- }
-
-'''
-Filterwheel configuration
-'''
-
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
- 'COMport' : 'COM22'}
-
-# Ludl marking 10 = position 0
-filterdict = {'Empty-Alignment' : 0,
- '405-488-561-640-Quadrupleblock' : 1,
- '508 520-35' : 2,
- '515LP' : 3,
- '561LP' : 4,
- '594LP' : 5,
- }
-
-'''
-Zoom configuration
-'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
- 'servo_id' : 1,
- 'COMport' : 'COM24',
- 'baudrate' : 1000000}
-
-zoomdict = {'0.63x' : 3423,
- '0.8x' : 3071,
- '1x' : 2707,
- '1.25x' : 2389,
- '1.6x' : 2047,
- '2x' : 1706,
- '2.5x' : 1354,
- '3.2x' : 967,
- '4x' : 637,
- '5x' : 318,
- '6.3x' : 0}
-'''
-Pixelsize in micron
-'''
-pixelsize = {'0.63x' : 10.52,
- '0.8x' : 8.23,
- '1x' : 6.55,
- '1.25x' : 5.26,
- '1.6x' : 4.08,
- '2x' : 3.26,
- '2.5x' : 2.6,
- '3.2x' : 2.03,
- '4x' : 1.60,
- '5x' : 1.27,
- '6.3x' : 1.03}
-
-'''
-Initial acquisition parameters
-
-This gets set up into the first microscope state
-'''
-
-startup = {
-'state' : 'init', # 'init', 'idle' , 'live', 'snap', 'running_script'
-'samplerate' : 100000,
-'sweeptime' : 0.2,
-'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
-'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
-'filepath' : '/tmp/file.raw',
-'folder' : '/tmp/',
-'file_prefix' : '',
-'start_number' : 1,
-'file_suffix' : '000001',
-'zoom' : '1x',
-'pixelsize' : 6.55,
-'laser' : '488 nm',
-'max_laser_voltage':10,
-'intensity' : 10,
-'shutterstate':False, # Is the shutter open or not?
-'shutterconfig':'Right', # Can be "Left", "Right","Both","Interleaved"
-'laser_interleaving':False,
-'filter' : '405-488-561-640-Quadrupleblock',
-'etl_l_delay_%' : 7.5,
-'etl_l_ramp_rising_%' : 85,
-'etl_l_ramp_falling_%' : 2.5,
-'etl_l_amplitude' : 0.7,
-'etl_l_offset' : 2.3,
-'etl_r_delay_%' : 2.5,
-'etl_r_ramp_rising_%' : 5,
-'etl_r_ramp_falling_%' : 85,
-'etl_r_amplitude' : 0.65,
-'etl_r_offset' : 2.36,
-'galvo_l_frequency' : 99.9,
-'galvo_l_amplitude' : 6,
-'galvo_l_offset' : 0,
-'galvo_l_duty_cycle' : 50,
-'galvo_l_phase' : np.pi/2,
-'galvo_r_frequency' : 99.9,
-'galvo_r_amplitude' : 6,
-'galvo_r_offset' : 0,
-'galvo_r_duty_cycle' : 50,
-'galvo_r_phase' : np.pi/2,
-'laser_l_delay_%' : 10,
-'laser_l_pulse_%' : 87,
-'laser_l_max_amplitude_%' : 100,
-'laser_r_delay_%' : 10,
-'laser_r_pulse_%' : 87,
-'laser_r_max_amplitude_%' : 100,
-'camera_delay_%' : 10,
-'camera_pulse_%' : 1,
-'camera_exposure_time':0.02,
-'camera_line_interval':0.000075,
-}
diff --git a/mesoSPIM/config/config_H45.py b/mesoSPIM/config/demo_config.py
similarity index 50%
rename from mesoSPIM/config/config_H45.py
rename to mesoSPIM/config/demo_config.py
index 7ab4c51..5b218fa 100644
--- a/mesoSPIM/config/config_H45.py
+++ b/mesoSPIM/config/demo_config.py
@@ -1,12 +1,29 @@
import numpy as np
'''
-Basic hardware configuration
+mesoSPIM configuration file.
+
+Use this file as a starting point to set up all mesoSPIM hardware by replacing the 'Demo' designations
+with real hardware one-by-one. Make sure to rename your new configuration file to a different filename
+(The extension has to be .py).
+'''
+
'''
+Waveform output for Galvos, ETLs etc.
+'''
+
+waveformgeneration = 'DemoWaveFormGeneration' # 'DemoWaveFormGeneration' or 'NI'
'''
-PXI6733 is responsible for the lasers
+Card designations need to be the same as in NI MAX, if necessary, use NI MAX
+to rename your cards correctly.
+
+A standard mesoSPIM configuration uses two cards:
+
+PXI6733 is responsible for the lasers (analog intensity control)
PXI6259 is responsible for the shutters, ETL waveforms and galvo waveforms
+
+
'''
acquisition_hardware = {'master_trigger_out_line' : 'PXI6259/port0/line1',
@@ -17,11 +34,20 @@
'laser_task_line' : 'PXI6733/ao0:7',
'laser_task_trigger_source' : '/PXI6259/PFI0'}
-sidepanel = 'Demo' # FarmSimulator
+'''
+Human interface device (Joystick)
+'''
+sidepanel = 'Demo' #'Demo' or 'FarmSimulator'
-laser = 'NI' # Demo
+'''
+Digital laser enable lines
+'''
+
+laser = 'Demo' # 'Demo' or 'NI'
+
+''' The laserdict keys are the laser designation that will be shown
+in the user interface '''
-'''The laserdict contains the digital enable lines for the SOLE-6'''
laserdict = {'405 nm': 'PXI6733/port0/line2',
'488 nm': 'PXI6733/port0/line3',
'515 nm': 'PXI6733/port0/line4',
@@ -33,6 +59,7 @@
Assignment of the analog outputs of the Laser card to the channels
The Empty slots are placeholders.
'''
+
laser_designation = {'405 nm' : 0,
'488 nm' : 1,
'515 nm' : 2,
@@ -46,6 +73,7 @@
'''
Assignment of the galvos and ETLs to the 6259 AO channels.
'''
+
galvo_etl_designation = {'Galvo-L' : 0,
'Galvo-R' : 1,
'ETL-L' : 2,
@@ -56,7 +84,7 @@
Shutter configuration
'''
-shutter = 'NI' # Demo
+shutter = 'Demo' # 'Demo' or 'NI'
shutterdict = {'shutter_left' : 'PXI6259/port0/line0',
'shutter_right' : 'PXI6259/port2/line0'}
@@ -66,7 +94,18 @@
'''
Camera configuration
'''
-camera = 'HamamatsuOrcaFlash' # 'Demo'
+
+'''
+For a DemoCamera, only the following options are necessary
+(x_pixels and y_pixels can be chosen arbitrarily):
+
+camera_parameters = {'x_pixels' : 1024,
+ 'y_pixels' : 1024,
+ 'x_pixel_size_in_microns' : 6.5,
+ 'y_pixel_size_in_microns' : 6.5,
+ 'subsampling' : [1,2,4]}
+
+For a Hamamatsu Orca Flash 4.0 V2 or V3, the following parameters are necessary:
camera_parameters = {'x_pixels' : 2048,
'y_pixels' : 2048,
@@ -84,16 +123,78 @@
'trigger_source' : 2, # external
}
+For a Hamamatsu Orca Fusion, the following parameters are necessary:
+
+camera_parameters = {'x_pixels' : 2304,
+ 'y_pixels' : 2304,
+ 'x_pixel_size_in_microns' : 6.5,
+ 'y_pixel_size_in_microns' : 6.5,
+ 'subsampling' : [1,2,4],
+ 'camera_id' : 0,
+ 'sensor_mode' : 12, # 12 for progressive
+ 'defect_correct_mode': 2,
+ 'binning' : '1x1',
+ 'readout_speed' : 1,
+ 'trigger_active' : 1,
+ 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
+ 'trigger_polarity' : 2, # positive pulse
+ 'trigger_source' : 2, # external
+ }
+
+For a Photometrics Iris 15, the following parameters are necessary:
+
+camera_parameters = {'x_pixels' : 5056,
+ 'y_pixels' : 2960,
+ 'x_pixel_size_in_microns' : 6.5,
+ 'y_pixel_size_in_microns' : 6.5,
+ 'subsampling' : [1,2,4],
+ 'speed_table_index': 0,
+ 'exp_mode' : 'Ext Trig Edge Rising', # Lots of options in PyVCAM --> see constants.py
+ 'binning' : '1x1',
+ 'scan_mode' : 1, # Scan mode options: {'Auto': 0, 'Line Delay': 1, 'Scan Width': 2}
+ 'scan_direction' : 1, # Scan direction options: {'Down': 0, 'Up': 1, 'Down/Up Alternate': 2}
+ 'scan_line_delay' : 6, # 10.26 us x factor, a factor = 6 equals 71.82 us
+ }
+
+'''
+camera = 'DemoCamera' # 'DemoCamera' or 'HamamatsuOrca' or 'PhotometricsIris15'
+
+camera_parameters = {'x_pixels' : 1024,
+ 'y_pixels' : 1024,
+ 'x_pixel_size_in_microns' : 6.5,
+ 'y_pixel_size_in_microns' : 6.5,
+ 'subsampling' : [1,2,4],
+ 'camera_id' : 0,
+ 'sensor_mode' : 12, # 12 for progressive
+ 'defect_correct_mode': 2,
+ 'binning' : '1x1',
+ 'readout_speed' : 1,
+ 'trigger_active' : 1,
+ 'trigger_mode' : 1, # it is unclear if this is the external lightsheeet mode - how to check this?
+ 'trigger_polarity' : 2, # positive pulse
+ 'trigger_source' : 2, # external
+ }
+
+binning_dict = {'1x1': (1,1), '2x2':(2,2), '4x4':(4,4)}
+
'''
Stage configuration
'''
-stage_parameters = {'stage_type' : 'PI_rotz_and_Galil_xyf', # 'PI' or 'Debug'
+
+'''
+The stage_parameter dictionary defines the general stage configuration, initial positions,
+and safety limits. The rotation position defines a XYZ position (in absolute coordinates)
+where sample rotation is safe. Additional hardware dictionaries (e.g. pi_parameters)
+define the stage configuration details.
+'''
+
+stage_parameters = {'stage_type' : 'DemoStage', # 'DemoStage' or 'PI' or other configs found in mesoSPIM_serial.py
'startfocus' : -10000,
'y_load_position': -86000,
'y_unload_position': -120000,
'x_max' : 51000,
'x_min' : -46000,
- 'y_max' : 0,
+ 'y_max' : 160000,
'y_min' : -160000,
'z_max' : 99000,
'z_min' : -99000,
@@ -106,39 +207,45 @@
'z_rot_position': 66000,
}
-'''Sample XYZ controller'''
-xyf_galil_parameters = {'port' : '192.168.1.43',#'or COM48'
- 'x_encodercounts_per_um' : 2,
- 'y_encodercounts_per_um' : 2,
- 'f_encodercounts_per_um' : 2
- }
+'''
+Depending on the stage hardware, further dictionaries define further details of the stage configuration
+
+For a standard mesoSPIM V4 with PI stages, the following pi_parameters are necessary (replace the
+serialnumber with the one of your controller):
-'''PI Rotation + z controller'''
pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-061.PD','M-406.4PD'),
- 'refmode' : ('FRF',),
- 'serialnum' : ('118015799'), #0185500834
- 'velocity': {0: 22.5, 1: 2}, # in mm/s or °/s
- }
+ 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE'),
+ 'refmode' : ('FRF',),
+ 'serialnum' : ('118015797'),
+ }
+
+For a standard mesoSPIM V5 with PI stages, the following pi_parameters are necessary (replace the
+serialnumber with the one of your controller):
-'''
pi_parameters = {'controllername' : 'C-884',
- 'stages' : ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','M-061.PD'),
+ 'stages' : ('L-509.20DG10','L-509.40DG10','L-509.20DG10','M-060.DG','M-406.4PD','NOSTAGE'),
'refmode' : ('FRF',),
'serialnum' : ('118015799'),
- }
'''
-
-
'''
Filterwheel configuration
'''
-filterwheel_parameters = {'filterwheel_type' : 'Ludl',
+'''
+For a DemoFilterWheel, no COMport needs to be specified, for a Ludl Filterwheel,
+a valid COMport is necessary.
+'''
+filterwheel_parameters = {'filterwheel_type' : 'DemoFilterWheel', # 'DemoFilterWheel' or 'Ludl'
'COMport' : 'COM53'}
# Ludl marking 10 = position 0
+
+'''
+
+A Ludl double filter wheel can be
+'''
+
filterdict = {'Empty-Alignment' : 0, # Every config should contain this
'405-488-647-Tripleblock' : 1,
'405-488-561-640-Quadrupleblock' : 2,
@@ -153,11 +260,21 @@
'''
Zoom configuration
'''
-zoom_parameters = {'zoom_type' : 'Dynamixel',
+
+'''
+For the DemoZoom, servo_id, COMport and baudrate do not matter. For a Dynamixel zoom,
+these values have to be there
+'''
+zoom_parameters = {'zoom_type' : 'DemoZoom', # 'DemoZoom' or 'Dynamixel'
'servo_id' : 4,
'COMport' : 'COM38',
'baudrate' : 1000000}
+'''
+The keys in the zoomdict define what zoom positions are displayed in the selection box
+(combobox) in the user interface.
+'''
+
zoomdict = {'0.63x' : 3423,
'0.8x' : 3071,
'1x' : 2707,
@@ -187,7 +304,13 @@
'''
Initial acquisition parameters
-This gets set up into the first microscope state
+Used as initial values after startup
+
+When setting up a new mesoSPIM, make sure that:
+* 'max_laser_voltage' is correct (5 V for Toptica MLEs, 10 V for Omicron SOLE)
+* 'galvo_l_amplitude' and 'galvo_r_amplitude' (in V) are correct (not above the max input allowed by your galvos)
+* all the filepaths exist
+* the initial filter exists in the filter dictionary above
'''
startup = {
@@ -198,8 +321,8 @@
'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
'filepath' : '/tmp/file.raw',
'folder' : '/tmp/',
+'snap_folder' : '/tmp/',
'file_prefix' : '',
-'start_number' : 1,
'file_suffix' : '000001',
'zoom' : '1x',
'pixelsize' : 6.55,
@@ -240,7 +363,10 @@
'camera_pulse_%' : 1,
'camera_exposure_time':0.02,
'camera_line_interval':0.000075,
-'camera_display_live_subsampling': 1,
-'camera_display_snap_subsampling': 1,
+'camera_display_live_subsampling': 1,
+'camera_display_snap_subsampling': 1,
'camera_display_acquisition_subsampling': 2,
+'camera_binning':'1x1',
+'camera_sensor_mode':'ASLM',
+'average_frame_rate': 4.969,
}
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Evy-ZMB.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Evy-ZMB.csv
deleted file mode 100644
index a2cc162..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Evy-ZMB.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.5839999999999974;0.8040000000000002
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.583;0.36600000000000005
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.389999999999999;0.202;2.558;0.162
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.285;1.089;2.510000000000008;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.394;0.584;2.556999999999999;0.472
-1x;561 nm;2x;2.394;0.5040000000000001;2.589;0.2959999999999997
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.216;2.5840000000000014;0.15799999999999997
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.417000000000007;0.43199999999999994;2.6109999999999927;0.3659999999999999
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Evy.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Evy.csv
deleted file mode 100644
index 3f595d5..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Evy.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.67;0.79;2.67;0.78
-1x;405 nm;0.8x;2.67;0.79;2.67;0.78
-1x;405 nm;1x;2.67;0.79;2.67;0.78
-1x;405 nm;1.25x;2.67;0.79;2.67;0.78
-1x;405 nm;1.6x;2.67;0.79;2.67;0.78
-1x;405 nm;2x;2.67;0.79;2.67;0.78
-1x;405 nm;2.5x;2.67;0.79;2.67;0.78
-1x;405 nm;3.2x;2.67;0.79;2.67;0.78
-1x;405 nm;4x;2.67;0.25;2.67;0.25
-1x;405 nm;5x;2.67;0.25;2.67;0.25
-1x;405 nm;6.3x;2.67;0.25;2.67;0.25
-1x;488 nm;0.63x;2.5;1.7;2.5;1.7
-1x;488 nm;0.8x;2.47;1.05;2.51;0.95
-1x;488 nm;1x;2.748;0.822;2.6020000000000003;0.0
-1x;488 nm;1.25x;2.48;0.7;2.51;0.6
-1x;488 nm;1.6x;2.46;0.57;2.51;0.49
-1x;488 nm;2x;2.465;0.45;2.509;0.39
-1x;488 nm;2.5x;2.465;0.35;2.6050000000000004;0.75
-1x;488 nm;3.2x;2.465;0.25;2.51;0.23
-1x;488 nm;4x;2.465;0.22;2.51;0.18
-1x;488 nm;5x;2.47;0.165;2.509;0.14
-1x;488 nm;6.3x;2.47;0.13;2.509;0.12
-1x;515 nm;0.63x;2.386000000000006;1.2780000000000002;2.434000000000007;1.4340000000000004
-1x;515 nm;0.8x;2.46;0.87;2.5;0.75
-1x;515 nm;1x;2.46;0.87;2.5;0.75
-1x;515 nm;1.25x;2.46;0.7;2.5;0.6
-1x;515 nm;1.6x;2.46;0.7;2.5;0.6
-1x;515 nm;2x;2.46;0.7;2.5;0.6
-1x;515 nm;2.5x;2.46;0.7;2.5;0.6
-1x;515 nm;3.2x;2.46;0.7;2.5;0.6
-1x;515 nm;4x;2.458;0.22;2.505;0.18
-1x;515 nm;5x;2.458;0.22;2.505;0.18
-1x;515 nm;6.3x;2.458;0.22;2.505;0.18
-1x;561 nm;0.63x;2.47;0.87;2.509;0.75
-1x;561 nm;0.8x;2.47;0.87;2.509;0.75
-1x;561 nm;1x;2.3560000000000048;0.8560000000000001;2.5549999999999997;0.9520000000000002
-1x;561 nm;1.25x;2.410000000000002;0.6119999999999999;2.569000000000001;0.7180000000000001
-1x;561 nm;1.6x;2.47;0.65;2.509;0.6
-1x;561 nm;2x;2.47;0.65;2.509;0.6
-1x;561 nm;2.5x;2.47;0.65;2.509;0.6
-1x;561 nm;3.2x;2.47;0.65;2.509;0.6
-1x;561 nm;4x;2.403000000000001;0.22800000000000015;2.43;0.0
-1x;561 nm;5x;2.475;0.22;2.518;0.18
-1x;561 nm;6.3x;2.475;0.22;2.518;0.18
-1x;594 nm;0.63x;2.478;0.87;2.515;0.75
-1x;594 nm;0.8x;2.478;0.87;2.515;0.75
-1x;594 nm;1x;2.478;0.87;2.515;0.75
-1x;594 nm;1.25x;2.478;0.65;2.515;0.6
-1x;594 nm;1.6x;2.478;0.65;2.515;0.6
-1x;594 nm;2x;2.478;0.65;2.515;0.6
-1x;594 nm;2.5x;2.478;0.65;2.515;0.6
-1x;594 nm;3.2x;2.478;0.65;2.515;0.6
-1x;594 nm;4x;2.475;0.22;2.518;0.18
-1x;594 nm;5x;2.475;0.22;2.518;0.18
-1x;594 nm;6.3x;2.475;0.22;2.518;0.18
-1x;647 nm;0.63x;2.495;0.87;2.535;0.75
-1x;647 nm;0.8x;2.495;0.87;2.535;0.75
-1x;647 nm;1x;2.495;0.87;2.535;0.75
-1x;647 nm;1.25x;2.4290000000000007;0.6;2.595000000000001;0.63
-1x;647 nm;1.6x;2.495;0.69;2.535;0.6
-1x;647 nm;2x;2.495;0.69;2.535;0.6
-1x;647 nm;2.5x;2.495;0.69;2.535;0.6
-1x;647 nm;3.2x;2.495;0.69;2.535;0.6
-1x;647 nm;4x;2.435;0.20600000000000002;2.535;0.19
-1x;647 nm;5x;2.495;0.2;2.535;0.19
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - 4x.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - 4x.csv
deleted file mode 100644
index e4a0410..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - 4x.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.336000000000007;1.3;2.5560000000000027;1.24
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.394;0.888;2.5660000000000016;0.11799999999999994
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.583;0.36600000000000005
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.3420000000000054;0.158;2.558;0.162
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.361;1.086;2.579000000000002;1.107999999999997
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.3800000000000012;0.504;2.5990000000000024;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.216;2.611999999999997;0.158
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.3930000000000025;0.432;2.6189999999999993;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - 50x50.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - 50x50.csv
deleted file mode 100644
index 1958e33..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - 50x50.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.709000000000003;0.7819999999999996;2.720000000000001;0.7249999999999999
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.555999999999995;0.657;3.053;0.546
-1x;405 nm;1.6x;2.6919999999999953;0.3689999999999999;2.797999999999998;0.3809999999999999
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.708999999999996;0.13299999999999995;3.056;0.16999999999999998
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.5259999999999994;0.798;2.65;0.65
-1x;488 nm;1x;2.611999999999998;0.792;2.6480000000000024;0.556
-1x;488 nm;1.25x;2.6419999999999946;0.5539999999999999;2.6080000000000028;0.4039999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.5639999999999956;0.16599999999999993;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.6069999999999953;0.17099999999999999;2.694;0.11200000000000002
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.7120000000000006;0.07899999999999999
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.600999999999994;0.523;2.596;0.56
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.5689999999999995;0.16200000000000003
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.641999999999996;0.6;2.6609999999999983;0.75
-1x;561 nm;1x;2.6339999999999932;0.5820000000000001;2.6090000000000027;0.616
-1x;561 nm;1.25x;2.5940000000000003;0.632;2.691;0.42700000000000005
-1x;561 nm;1.6x;2.5819999999999963;0.47999999999999987;2.6650000000000014;0.3639999999999999
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.629999999999998;0.179;2.654;0.141
-1x;561 nm;5x;2.566;0.14399999999999996;2.719;0.07600000000000004
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.659;0.53
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.671;0.13
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.739;1.52;2.9010000000000002;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.587;0.97;2.6710000000000003;0.704
-1x;647 nm;1.25x;2.647;0.532;2.9669999999999996;0.539
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.6139999999999994;0.166;2.609;0.242
-1x;647 nm;4x;2.405000000000008;0.26400000000000007;2.974;0.158
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - 80x80.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - 80x80.csv
deleted file mode 100644
index 9c90789..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - 80x80.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.709000000000003;0.7819999999999996;2.720000000000001;0.7249999999999999
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.555999999999995;0.657;2.7629999999999977;0.49
-1x;405 nm;1.6x;2.6919999999999953;0.3689999999999999;2.797999999999998;0.3809999999999999
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.708999999999996;0.13299999999999995;2.664;0.1429999999999999
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.476;1.24
-1x;488 nm;0.8x;2.5259999999999994;0.798;2.65;0.65
-1x;488 nm;1x;2.7439999999999998;0.524;2.898;0.582
-1x;488 nm;1.25x;2.6419999999999946;0.5539999999999999;2.6080000000000028;0.4039999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.5639999999999956;0.16599999999999993;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.6069999999999953;0.17099999999999999;2.694;0.11200000000000002
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.7120000000000006;0.07899999999999999
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.600999999999994;0.523;2.596;0.56
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.5689999999999995;0.16200000000000003
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.641999999999996;0.6;2.6609999999999983;0.75
-1x;561 nm;1x;2.644;0.984;2.4389999999999996;0.966
-1x;561 nm;1.25x;2.5940000000000003;0.632;2.691;0.42700000000000005
-1x;561 nm;1.6x;2.5819999999999963;0.47999999999999987;2.6650000000000014;0.3639999999999999
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.629999999999998;0.179;2.654;0.141
-1x;561 nm;5x;2.566;0.14399999999999996;2.719;0.07600000000000004
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.659;0.53
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.671;0.13
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.739;1.52;2.9010000000000002;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.6670000000000007;0.76;2.895;0.75
-1x;647 nm;1.25x;2.647;0.532;2.677;0.5369999999999999
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.6139999999999994;0.166;2.609;0.242
-1x;647 nm;4x;2.625;0.182;2.5780000000000003;0.11000000000000001
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - MVPLAPO2x.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - MVPLAPO2x.csv
deleted file mode 100644
index c52c008..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45 - MVPLAPO2x.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.569999999999999;0.78;2.72;0.594
-1x;488 nm;1.25x;2.5479999999999983;0.5819999999999999;2.732;0.4099999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.5639999999999956;0.16599999999999993;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.605;0.14200000000000002;2.5679999999999996;0.10000000000000002
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.736999999999995;0.616
-1x;561 nm;1.25x;2.570000000000001;0.586;2.746999999999998;0.3809999999999999
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.552999999999998;0.19900000000000007;2.7400000000000007;0.135
-1x;561 nm;5x;2.566;0.14399999999999996;2.719;0.07600000000000004
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.5569999999999986;0.7800000000000002;2.6889999999999996;0.5940000000000001
-1x;647 nm;1.25x;2.5819999999999985;0.5419999999999999;2.744000000000002;0.5369999999999999
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.6139999999999994;0.166;2.609;0.242
-1x;647 nm;4x;2.615999999999999;0.22600000000000003;2.7019999999999995;0.13699999999999998
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45.csv
deleted file mode 100644
index 935b6b6..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - BABB - H45.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.709000000000003;0.7819999999999996;2.720000000000001;0.7249999999999999
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.555999999999995;0.657;2.7629999999999977;0.49
-1x;405 nm;1.6x;2.6919999999999953;0.3689999999999999;2.797999999999998;0.3809999999999999
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.708999999999996;0.13299999999999995;2.664;0.1429999999999999
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.5259999999999994;0.798;2.65;0.65
-1x;488 nm;1x;2.611999999999998;0.792;2.7020000000000004;0.556
-1x;488 nm;1.25x;2.6419999999999946;0.5539999999999999;2.6080000000000028;0.4039999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.5639999999999956;0.16599999999999993;2.7830000000000004;0.205
-1x;488 nm;4x;2.6069999999999953;0.17099999999999999;2.694;0.11200000000000002
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.7120000000000006;0.07899999999999999
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.600999999999994;0.523;2.596;0.56
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.5689999999999995;0.16200000000000003
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.641999999999996;0.6;2.6609999999999983;0.75
-1x;561 nm;1x;2.22;0.582;2.7249999999999996;0.642
-1x;561 nm;1.25x;2.5940000000000003;0.632;2.691;0.42700000000000005
-1x;561 nm;1.6x;2.5819999999999963;0.47999999999999987;2.6650000000000014;0.3639999999999999
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.629999999999998;0.179;2.654;0.141
-1x;561 nm;5x;2.566;0.14399999999999996;2.719;0.07600000000000004
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.659;0.53
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.671;0.13
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.587;0.97;2.6710000000000003;0.704
-1x;647 nm;1.25x;2.647;0.532;2.677;0.5369999999999999
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.6139999999999994;0.166;2.609;0.242
-1x;647 nm;4x;2.405000000000008;0.26400000000000007;2.634;0.13
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - CUBIC-Rplus - H45 - 30x30.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - CUBIC-Rplus - H45 - 30x30.csv
deleted file mode 100644
index 3113d5e..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - CUBIC-Rplus - H45 - 30x30.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.709000000000003;0.7819999999999996;2.720000000000001;0.7249999999999999
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.555999999999995;0.657;2.7629999999999977;0.49
-1x;405 nm;1.6x;2.6919999999999953;0.3689999999999999;2.797999999999998;0.3809999999999999
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.708999999999996;0.13299999999999995;2.664;0.1429999999999999
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.5259999999999994;0.798;2.65;0.65
-1x;488 nm;1x;2.611999999999998;0.792;2.6480000000000024;0.556
-1x;488 nm;1.25x;2.6000000000000005;0.612;2.47;0.628
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.5639999999999956;0.16599999999999993;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.6069999999999953;0.17099999999999999;2.4859999999999998;0.15
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.7120000000000006;0.07899999999999999
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.600999999999994;0.523;2.596;0.56
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.5689999999999995;0.16200000000000003
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.641999999999996;0.6;2.6609999999999983;0.75
-1x;561 nm;1x;2.6339999999999932;0.5820000000000001;2.6090000000000027;0.616
-1x;561 nm;1.25x;2.5940000000000003;0.632;2.4770000000000003;0.439
-1x;561 nm;1.6x;2.5819999999999963;0.47999999999999987;2.6650000000000014;0.3639999999999999
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.629999999999998;0.179;2.434;0.0
-1x;561 nm;5x;2.566;0.14399999999999996;2.719;0.07600000000000004
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.659;0.53
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.671;0.13
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.587;0.97;2.6710000000000003;0.704
-1x;647 nm;1.25x;2.6090000000000004;0.6;2.5009999999999994;0.537
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.6139999999999994;0.166;2.609;0.242
-1x;647 nm;4x;2.6069999999999953;0.17099999999999999;2.5219999999999994;0.164
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - CUBIC.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - CUBIC.csv
deleted file mode 100644
index 0e044af..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - CUBIC.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.3419999999999987;1.3;2.4160000000000017;1.24
-1x;488 nm;0.8x;2.444;1.16;2.594;0.86
-1x;488 nm;1x;2.768;0.888;2.5839999999999974;0.8040000000000002
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.388;0.524;2.631999999999997;0.561
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.583;0.36600000000000005
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.764;0.158;2.6439999999999997;0.144
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.361;1.086;2.5469999999999984;1.108
-1x;561 nm;0.8x;2.826;0.946;2.6169999999999978;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.394;0.584;2.556999999999999;0.472
-1x;561 nm;2x;2.394;0.5040000000000001;2.589;0.2959999999999997
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.793;0.136;2.557999999999999;0.17
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5469999999999997;1.224
-1x;647 nm;0.8x;2.407000000000002;1.16;2.6489999999999996;0.862
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.417000000000007;0.43199999999999994;2.6109999999999927;0.3659999999999999
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE.csv
deleted file mode 100644
index 365ce2c..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - DBE.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.8409999999999953;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.6379999999999972;0.6839999999999998
-1x;488 nm;1.25x;2.396;0.692;2.7240000000000006;0.486
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.583;0.366
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.5279999999999987;0.202;2.663999999999995;0.122
-1x;488 nm;5x;2.538;0.16400000000000003;2.7169999999999996;0.133
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.5169999999999924;0.15699999999999992;2.612;0.158
-1x;561 nm;5x;2.526;0.144;2.7459999999999933;0.0
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.594;0.497;2.740000000000001;0.5630000000000001
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.5549999999999984;0.0;2.609;0.242
-1x;647 nm;4x;2.546;0.186;2.7649999999999975;0.242
-1x;647 nm;5x;2.554999999999996;0.12899999999999998;2.742000000000002;0.107
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - ECI.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - ECI.csv
deleted file mode 100644
index 2bf9942..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian - ECI.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.8409999999999953;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.6379999999999972;0.6839999999999998
-1x;488 nm;1.25x;2.396;0.692;2.7240000000000006;0.486
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.583;0.366
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.5279999999999987;0.202;2.663999999999995;0.122
-1x;488 nm;5x;2.538;0.16400000000000003;2.7169999999999996;0.133
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.4939999999999976;1.064;2.5970000000000004;0.9280000000000002
-1x;561 nm;1x;2.399999999999999;0.744;1.571;0.594
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.8989999999999996;0.17099999999999999;1.5;0.151
-1x;561 nm;5x;2.526;0.144;2.7459999999999933;0.0
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.7809999999999993;1.224
-1x;647 nm;0.8x;2.541000000000001;0.966;2.6389999999999962;0.8299999999999998
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.594;0.497;2.740000000000001;0.5630000000000001
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;1.596;0.245
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.5549999999999984;0.0;2.609;0.242
-1x;647 nm;4x;2.546;0.186;1.618;0.149
-1x;647 nm;5x;2.554999999999996;0.12899999999999998;2.742000000000002;0.107
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian.csv
deleted file mode 100644
index 253ce44..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Fabian.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.148;1.146;2.382;1.054
-1x;488 nm;0.8x;2.4160000000000004;1.052;2.4000000000000004;0.846
-1x;488 nm;1x;2.3419999999999996;0.842;2.514;0.597
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.4000000000000004;0.422;2.5780000000000003;0.458
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.524;0.386
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.3420000000000054;0.158;2.426;0.137
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.6289999999999982;0.09299999999999999
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.361;1.086;2.579000000000002;1.107999999999997
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.3899999999999997;0.786
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.3320000000000003;0.515;2.5929999999999995;0.472
-1x;561 nm;2x;2.3800000000000012;0.504;2.5990000000000024;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.216;2.408000000000001;0.126
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.4;0.78
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.3930000000000025;0.432;2.6189999999999993;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.4349999999999996;0.164
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Ladan-2.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Ladan-2.csv
deleted file mode 100644
index 3baf780..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Ladan-2.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.844;1.51;2.6;1.5
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.596;0.988
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.6159999999999997;0.0
-1x;488 nm;1.25x;2.8440000000000003;0.692;2.5999999999999996;0.626
-1x;488 nm;1.6x;2.8440000000000003;0.524;2.614;0.449
-1x;488 nm;2x;2.7489999999999997;0.461;2.6170000000000004;0.804
-1x;488 nm;2.5x;2.8350000000000004;0.399;2.551;0.0
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.389999999999999;0.202;2.558;0.162
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.630999999999997;1.214
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.596999999999999;0.451
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.285;1.089;2.510000000000008;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.396;0.688;2.6250000000000013;0.586
-1x;561 nm;1.6x;2.394;0.584;2.556999999999999;0.472
-1x;561 nm;2x;2.394;0.5040000000000001;2.589;0.2959999999999997
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.216;2.5840000000000014;0.15799999999999997
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.594;1.2
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.409;0.648;2.652000000000001;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.643;0.43
-1x;647 nm;2x;2.417000000000007;0.43199999999999994;2.6109999999999927;0.3659999999999999
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Ladan.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Ladan.csv
deleted file mode 100644
index 085c81c..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Ladan.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.67;0.79;2.67;0.78
-1x;405 nm;0.8x;2.67;0.79;2.67;0.78
-1x;405 nm;1x;2.67;0.79;2.67;0.78
-1x;405 nm;1.25x;2.67;0.79;2.67;0.78
-1x;405 nm;1.6x;2.67;0.79;2.67;0.78
-1x;405 nm;2x;2.67;0.79;2.67;0.78
-1x;405 nm;2.5x;2.67;0.79;2.67;0.78
-1x;405 nm;3.2x;2.67;0.79;2.67;0.78
-1x;405 nm;4x;2.67;0.25;2.67;0.25
-1x;405 nm;5x;2.67;0.25;2.67;0.25
-1x;405 nm;6.3x;2.67;0.25;2.67;0.25
-1x;488 nm;0.63x;2.5;1.7;2.5;1.7
-1x;488 nm;0.8x;2.364;1.05;2.5379999999999967;0.95
-1x;488 nm;1x;2.47;0.87;2.55;0.75
-1x;488 nm;1.25x;2.48;0.7;2.51;0.6
-1x;488 nm;1.6x;2.46;0.57;2.51;0.49
-1x;488 nm;2x;2.465;0.45;2.509;0.39
-1x;488 nm;2.5x;2.465;0.35;2.509;0.31
-1x;488 nm;3.2x;2.465;0.25;2.51;0.23
-1x;488 nm;4x;2.465;0.22;2.51;0.18
-1x;488 nm;5x;2.47;0.165;2.509;0.14
-1x;488 nm;6.3x;2.47;0.13;2.509;0.12
-1x;515 nm;0.63x;2.46;0.87;2.5;0.75
-1x;515 nm;0.8x;2.46;0.87;2.5600000000000027;0.75
-1x;515 nm;1x;2.46;0.87;2.5;0.75
-1x;515 nm;1.25x;2.46;0.7;2.5;0.6
-1x;515 nm;1.6x;2.3380000000000125;0.7;2.5;0.6
-1x;515 nm;2x;2.46;0.7;2.5;0.6
-1x;515 nm;2.5x;2.46;0.7;2.5;0.6
-1x;515 nm;3.2x;2.324000000000013;0.7;2.5;0.6
-1x;515 nm;4x;2.458;0.22;2.59499999999999;0.18
-1x;515 nm;5x;2.458;0.22;2.505;0.18
-1x;515 nm;6.3x;2.458;0.22;2.505;0.18
-1x;561 nm;0.63x;2.47;0.87;2.509;0.75
-1x;561 nm;0.8x;2.47;0.87;2.509;0.75
-1x;561 nm;1x;2.47;0.87;2.509;0.75
-1x;561 nm;1.25x;2.47;0.65;2.509;0.6
-1x;561 nm;1.6x;2.47;0.65;2.509;0.6
-1x;561 nm;2x;2.47;0.65;2.509;0.6
-1x;561 nm;2.5x;2.47;0.65;2.509;0.6
-1x;561 nm;3.2x;2.47;0.65;2.509;0.6
-1x;561 nm;4x;2.475;0.22;2.518;0.18
-1x;561 nm;5x;2.475;0.22;2.518;0.18
-1x;561 nm;6.3x;2.475;0.22;2.518;0.18
-1x;594 nm;0.63x;2.478;0.87;2.515;0.75
-1x;594 nm;0.8x;2.478;0.87;2.515;0.75
-1x;594 nm;1x;2.478;0.87;2.515;0.75
-1x;594 nm;1.25x;2.478;0.65;2.515;0.6
-1x;594 nm;1.6x;2.478;0.65;2.515;0.6
-1x;594 nm;2x;2.478;0.65;2.515;0.6
-1x;594 nm;2.5x;2.478;0.65;2.515;0.6
-1x;594 nm;3.2x;2.478;0.65;2.515;0.6
-1x;594 nm;4x;2.475;0.22;2.518;0.18
-1x;594 nm;5x;2.475;0.22;2.518;0.18
-1x;594 nm;6.3x;2.475;0.22;2.518;0.18
-1x;647 nm;0.63x;2.495;0.87;2.535;0.75
-1x;647 nm;0.8x;2.495;0.87;2.580999999999995;0.75
-1x;647 nm;1x;2.495;0.87;2.535;0.75
-1x;647 nm;1.25x;2.495;0.69;2.535;0.6
-1x;647 nm;1.6x;2.3530000000000157;0.69;2.535;0.6
-1x;647 nm;2x;2.495;0.69;2.535;0.6
-1x;647 nm;2.5x;2.495;0.69;2.535;0.6
-1x;647 nm;3.2x;2.495;0.69;2.535;0.6
-1x;647 nm;4x;2.495;0.2;2.6129999999999916;0.19
-1x;647 nm;5x;2.495;0.2;2.535;0.19
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Olivia.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Olivia.csv
deleted file mode 100644
index 26f1261..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Olivia.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.67;0.79;2.67;0.78
-1x;405 nm;0.8x;2.67;0.79;2.67;0.78
-1x;405 nm;1x;2.67;0.79;2.67;0.78
-1x;405 nm;1.25x;2.67;0.79;2.67;0.78
-1x;405 nm;1.6x;2.67;0.79;2.67;0.78
-1x;405 nm;2x;2.67;0.79;2.67;0.78
-1x;405 nm;2.5x;2.67;0.79;2.67;0.78
-1x;405 nm;3.2x;2.67;0.79;2.67;0.78
-1x;405 nm;4x;2.67;0.25;2.67;0.25
-1x;405 nm;5x;2.67;0.25;2.67;0.25
-1x;405 nm;6.3x;2.67;0.25;2.67;0.25
-1x;488 nm;0.63x;2.5;1.7;2.5;1.7
-1x;488 nm;0.8x;2.374000000000009;0.942;2.567999999999994;0.9359999999999999
-1x;488 nm;1x;2.394000000000006;0.87;2.6260000000000003;0.75
-1x;488 nm;1.25x;2.48;0.7;2.51;0.6
-1x;488 nm;1.6x;2.46;0.57;2.51;0.49
-1x;488 nm;2x;2.465;0.45;2.5569999999999946;0.39
-1x;488 nm;2.5x;2.465;0.35;2.509;0.31
-1x;488 nm;3.2x;2.465;0.25;2.5700000000000016;0.23
-1x;488 nm;4x;2.3790000000000076;0.22;2.51;0.18
-1x;488 nm;5x;2.47;0.165;2.509;0.14
-1x;488 nm;6.3x;2.47;0.13;2.509;0.12
-1x;515 nm;0.63x;2.46;0.87;2.5;0.75
-1x;515 nm;0.8x;2.46;0.87;2.5;0.75
-1x;515 nm;1x;2.46;0.87;2.5;0.75
-1x;515 nm;1.25x;2.46;0.7;2.5;0.6
-1x;515 nm;1.6x;2.46;0.7;2.5;0.6
-1x;515 nm;2x;2.46;0.7;2.5;0.6
-1x;515 nm;2.5x;2.46;0.7;2.5;0.6
-1x;515 nm;3.2x;2.46;0.7;2.5;0.6
-1x;515 nm;4x;2.458;0.22;2.505;0.18
-1x;515 nm;5x;2.458;0.22;2.505;0.18
-1x;515 nm;6.3x;2.458;0.22;2.505;0.18
-1x;561 nm;0.63x;2.47;0.87;2.509;0.75
-1x;561 nm;0.8x;2.47;0.87;2.509;0.75
-1x;561 nm;1x;2.47;0.87;2.6590000000000003;0.75
-1x;561 nm;1.25x;2.47;0.65;2.509;0.6
-1x;561 nm;1.6x;2.47;0.65;2.509;0.6
-1x;561 nm;2x;2.47;0.65;2.509;0.6
-1x;561 nm;2.5x;2.47;0.65;2.509;0.6
-1x;561 nm;3.2x;2.47;0.65;2.509;0.6
-1x;561 nm;4x;2.475;0.22;2.518;0.18
-1x;561 nm;5x;2.475;0.22;2.518;0.18
-1x;561 nm;6.3x;2.475;0.22;2.518;0.18
-1x;594 nm;0.63x;2.478;0.87;2.515;0.75
-1x;594 nm;0.8x;2.392;1.044;2.579;0.95
-1x;594 nm;1x;2.478;0.87;2.5870000000000015;0.75
-1x;594 nm;1.25x;2.478;0.65;2.515;0.6
-1x;594 nm;1.6x;2.478;0.65;2.515;0.6
-1x;594 nm;2x;2.4480000000000035;0.376;2.573;0.384
-1x;594 nm;2.5x;2.478;0.65;2.515;0.6
-1x;594 nm;3.2x;2.478;0.65;2.573000000000002;0.23
-1x;594 nm;4x;2.475;0.22;2.518;0.18
-1x;594 nm;5x;2.475;0.22;2.518;0.18
-1x;594 nm;6.3x;2.475;0.22;2.518;0.18
-1x;647 nm;0.63x;2.495;0.87;2.535;0.75
-1x;647 nm;0.8x;2.495;0.87;2.535;0.75
-1x;647 nm;1x;2.495;0.87;2.535;0.75
-1x;647 nm;1.25x;2.495;0.69;2.535;0.6
-1x;647 nm;1.6x;2.495;0.69;2.535;0.6
-1x;647 nm;2x;2.495;0.69;2.535;0.6
-1x;647 nm;2.5x;2.495;0.69;2.535;0.6
-1x;647 nm;3.2x;2.495;0.69;2.535;0.6
-1x;647 nm;4x;2.495;0.2;2.535;0.19
-1x;647 nm;5x;2.495;0.2;2.535;0.19
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp - DBE - H45.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp - DBE - H45.csv
deleted file mode 100644
index 34dae4c..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp - DBE - H45.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.5360000000000076;0.8420000000000001;2.6860000000000004;0.568
-1x;488 nm;1.25x;2.5479999999999983;0.5819999999999999;2.732;0.4099999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.5279999999999987;0.202;2.75;0.1430000000000001
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.7519999999999962;0.111
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;1.6;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.688;0.6920000000000001;2.713;0.5699999999999998
-1x;561 nm;1.25x;2.570000000000001;0.586;1.546;0.493
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.5219999999999865;0.388;1.547;0.448
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;1.568;0.182
-1x;561 nm;4x;2.552999999999998;0.19900000000000007;2.7400000000000007;0.135
-1x;561 nm;5x;2.566;0.14399999999999996;2.6510000000000007;0.12800000000000006
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;1.563;0.53
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.735;1.018
-1x;647 nm;1x;2.619;0.744;2.669;0.7240000000000002
-1x;647 nm;1.25x;2.5819999999999985;0.5419999999999999;1.562;0.535
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.5549999999999984;0.0;1.557;0.254
-1x;647 nm;4x;2.615999999999999;0.22600000000000003;2.763999999999999;0.173
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp - MASH.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp - MASH.csv
deleted file mode 100644
index 96dad24..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp - MASH.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.5360000000000076;0.8420000000000001;2.6860000000000004;0.568
-1x;488 nm;1.25x;2.5479999999999983;0.5819999999999999;2.732;0.4099999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.5279999999999987;0.202;2.75;0.1430000000000001
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.7519999999999962;0.111
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;3.0000000000000004;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.688;0.6920000000000001;2.713;0.5699999999999998
-1x;561 nm;1.25x;2.570000000000001;0.586;1.546;0.493
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.5219999999999865;0.388;1.547;0.448
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;1.568;0.182
-1x;561 nm;4x;2.552999999999998;0.19900000000000007;2.7400000000000007;0.135
-1x;561 nm;5x;2.566;0.14399999999999996;2.6510000000000007;0.12800000000000006
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;1.563;0.53
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;3.005;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.735;1.018
-1x;647 nm;1x;2.619;0.744;2.669;0.7240000000000002
-1x;647 nm;1.25x;2.5819999999999985;0.5419999999999999;1.562;0.535
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.5549999999999984;0.0;1.557;0.254
-1x;647 nm;4x;2.615999999999999;0.22600000000000003;2.763999999999999;0.173
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.753999999999995;0.11799999999999994
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp.csv
deleted file mode 100644
index 4dd4ce2..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Philipp.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.6260000000000003;1.24
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.396;0.888;2.584;0.804
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.583;0.36600000000000005
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.389999999999999;0.202;2.558;0.162
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.407000000000001;1.088999999999999;2.585999999999999;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3860000000000015;0.688;2.641;0.6
-1x;561 nm;1.6x;2.394;0.5840000000000001;2.593;0.472
-1x;561 nm;2x;2.394;0.5040000000000001;2.589;0.2959999999999997
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.21600000000000003;2.594;0.15599999999999997
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.6100000000000003;0.20199999999999999
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.435000000000005;1.344;2.5929999999999938;1.2240000000000004
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.417000000000007;0.43199999999999994;2.6109999999999927;0.3659999999999999
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.419;0.2;2.613;0.208
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Rahel.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Rahel.csv
deleted file mode 100644
index 2026a54..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Rahel.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.67;0.79;2.67;0.78
-1x;405 nm;0.8x;2.67;0.79;2.67;0.78
-1x;405 nm;1x;2.67;0.79;2.67;0.78
-1x;405 nm;1.25x;2.67;0.79;2.67;0.78
-1x;405 nm;1.6x;2.67;0.79;2.67;0.78
-1x;405 nm;2x;2.67;0.79;2.67;0.78
-1x;405 nm;2.5x;2.67;0.79;2.67;0.78
-1x;405 nm;3.2x;2.67;0.79;2.67;0.78
-1x;405 nm;4x;2.67;0.25;2.67;0.25
-1x;405 nm;5x;2.67;0.25;2.67;0.25
-1x;405 nm;6.3x;2.67;0.25;2.67;0.25
-1x;488 nm;0.63x;2.5;1.7;2.5;1.7
-1x;488 nm;0.8x;2.7559999999999993;0.942;2.625;0.936
-1x;488 nm;1x;2.394;0.87;2.5040000000000022;0.75
-1x;488 nm;1.25x;2.48;0.7;2.51;0.6
-1x;488 nm;1.6x;2.46;0.57;2.51;0.49
-1x;488 nm;2x;2.3740000000000037;0.376;2.571;0.384
-1x;488 nm;2.5x;2.465;0.35;2.509;0.31
-1x;488 nm;3.2x;2.8299999999999996;0.238;2.6379999999999995;0.23
-1x;488 nm;4x;2.465;0.22;2.51;0.18
-1x;488 nm;5x;2.47;0.165;2.509;0.14
-1x;488 nm;6.3x;2.47;0.13;2.509;0.12
-1x;515 nm;0.63x;2.46;0.87;2.5;0.75
-1x;515 nm;0.8x;2.46;0.87;2.5;0.75
-1x;515 nm;1x;2.46;0.87;2.5;0.75
-1x;515 nm;1.25x;2.46;0.7;2.5;0.6
-1x;515 nm;1.6x;2.46;0.7;2.5;0.6
-1x;515 nm;2x;2.46;0.7;2.5;0.6
-1x;515 nm;2.5x;2.46;0.7;2.5;0.6
-1x;515 nm;3.2x;2.46;0.7;2.5;0.6
-1x;515 nm;4x;2.458;0.22;2.505;0.18
-1x;515 nm;5x;2.458;0.22;2.505;0.18
-1x;515 nm;6.3x;2.458;0.22;2.505;0.18
-1x;561 nm;0.63x;2.47;0.87;2.509;0.75
-1x;561 nm;0.8x;2.73;0.87;2.517;0.75
-1x;561 nm;1x;2.47;0.87;2.509;0.75
-1x;561 nm;1.25x;2.47;0.65;2.509;0.6
-1x;561 nm;1.6x;2.47;0.65;2.509;0.6
-1x;561 nm;2x;2.47;0.65;2.509;0.6
-1x;561 nm;2.5x;2.47;0.65;2.509;0.6
-1x;561 nm;3.2x;2.764;0.238;2.5260000000000002;0.184
-1x;561 nm;4x;2.475;0.22;2.518;0.18
-1x;561 nm;5x;2.475;0.22;2.518;0.18
-1x;561 nm;6.3x;2.475;0.22;2.518;0.18
-1x;594 nm;0.63x;2.478;0.87;2.515;0.75
-1x;594 nm;0.8x;2.392;1.121;2.579;0.78
-1x;594 nm;1x;2.478;0.87;2.5870000000000015;0.75
-1x;594 nm;1.25x;2.478;0.65;2.515;0.6
-1x;594 nm;1.6x;2.478;0.65;2.515;0.6
-1x;594 nm;2x;2.478;0.238;2.5850000000000004;0.31
-1x;594 nm;2.5x;2.478;0.65;2.515;0.6
-1x;594 nm;3.2x;2.478;0.238;2.581;0.23
-1x;594 nm;4x;2.475;0.22;2.518;0.18
-1x;594 nm;5x;2.475;0.22;2.518;0.18
-1x;594 nm;6.3x;2.475;0.22;2.518;0.18
-1x;647 nm;0.63x;2.495;0.87;2.535;0.75
-1x;647 nm;0.8x;2.495;0.87;2.535;0.75
-1x;647 nm;1x;2.495;0.87;2.535;0.75
-1x;647 nm;1.25x;2.495;0.69;2.535;0.6
-1x;647 nm;1.6x;2.495;0.69;2.535;0.6
-1x;647 nm;2x;2.495;0.69;2.535;0.6
-1x;647 nm;2.5x;2.495;0.69;2.535;0.6
-1x;647 nm;3.2x;2.495;0.69;2.535;0.6
-1x;647 nm;4x;2.495;0.2;2.535;0.19
-1x;647 nm;5x;2.495;0.2;2.535;0.19
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Ruslan.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Ruslan.csv
deleted file mode 100644
index f6fe18e..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Ruslan.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.67;0.79;2.67;0.78
-1x;405 nm;0.8x;2.67;0.79;2.67;0.78
-1x;405 nm;1x;2.67;0.79;2.67;0.78
-1x;405 nm;1.25x;2.67;0.79;2.67;0.78
-1x;405 nm;1.6x;2.67;0.79;2.67;0.78
-1x;405 nm;2x;2.67;0.79;2.67;0.78
-1x;405 nm;2.5x;2.67;0.79;2.67;0.78
-1x;405 nm;3.2x;2.67;0.79;2.67;0.78
-1x;405 nm;4x;2.67;0.25;2.67;0.25
-1x;405 nm;5x;2.67;0.25;2.67;0.25
-1x;405 nm;6.3x;2.67;0.25;2.67;0.25
-1x;488 nm;0.63x;2.5;1.7;2.5;1.7
-1x;488 nm;0.8x;2.47;1.05;2.51;0.95
-1x;488 nm;1x;2.47;0.87;2.55;0.75
-1x;488 nm;1.25x;2.48;0.7;2.51;0.6
-1x;488 nm;1.6x;2.46;0.57;2.51;0.49
-1x;488 nm;2x;2.465;0.45;2.509;0.39
-1x;488 nm;2.5x;2.465;0.35;2.509;0.31
-1x;488 nm;3.2x;2.465;0.25;2.51;0.23
-1x;488 nm;4x;2.465;0.22;2.51;0.18
-1x;488 nm;5x;2.47;0.165;2.509;0.14
-1x;488 nm;6.3x;2.47;0.13;2.509;0.12
-1x;515 nm;0.63x;2.46;0.87;2.5;0.75
-1x;515 nm;0.8x;2.46;0.87;2.5;0.75
-1x;515 nm;1x;2.46;0.87;2.5;0.75
-1x;515 nm;1.25x;2.46;0.7;2.5;0.6
-1x;515 nm;1.6x;2.46;0.7;2.5;0.6
-1x;515 nm;2x;2.46;0.7;2.5;0.6
-1x;515 nm;2.5x;2.46;0.7;2.5;0.6
-1x;515 nm;3.2x;2.46;0.7;2.5;0.6
-1x;515 nm;4x;2.458;0.22;2.505;0.18
-1x;515 nm;5x;2.458;0.22;2.505;0.18
-1x;515 nm;6.3x;2.458;0.22;2.505;0.18
-1x;561 nm;0.63x;2.47;0.87;2.509;0.75
-1x;561 nm;0.8x;2.47;0.87;2.509;0.75
-1x;561 nm;1x;2.47;0.87;2.509;0.75
-1x;561 nm;1.25x;2.47;0.65;2.509;0.6
-1x;561 nm;1.6x;2.47;0.65;2.509;0.6
-1x;561 nm;2x;2.47;0.65;2.509;0.6
-1x;561 nm;2.5x;2.47;0.65;2.509;0.6
-1x;561 nm;3.2x;2.47;0.65;2.509;0.6
-1x;561 nm;4x;2.475;0.22;2.518;0.18
-1x;561 nm;5x;2.475;0.22;2.518;0.18
-1x;561 nm;6.3x;2.475;0.22;2.518;0.18
-1x;594 nm;0.63x;2.478;0.87;2.515;0.75
-1x;594 nm;0.8x;2.478;0.87;2.515;0.75
-1x;594 nm;1x;2.4220000000000064;0.87;2.515;0.75
-1x;594 nm;1.25x;2.478;0.65;2.515;0.6
-1x;594 nm;1.6x;2.478;0.65;2.515;0.6
-1x;594 nm;2x;2.478;0.65;2.515;0.6
-1x;594 nm;2.5x;2.478;0.65;2.515;0.6
-1x;594 nm;3.2x;2.478;0.65;2.515;0.6
-1x;594 nm;4x;2.4190000000000054;0.2200000000000001;2.518;0.18
-1x;594 nm;5x;2.475;0.22;2.518;0.18
-1x;594 nm;6.3x;2.475;0.22;2.518;0.18
-1x;647 nm;0.63x;2.495;0.87;2.535;0.75
-1x;647 nm;0.8x;2.495;0.87;2.535;0.75
-1x;647 nm;1x;2.409000000000011;0.87;2.588999999999995;0.702
-1x;647 nm;1.25x;2.4190000000000076;0.65;2.535;0.6
-1x;647 nm;1.6x;2.495;0.69;2.535;0.6
-1x;647 nm;2x;2.495;0.69;2.535;0.6
-1x;647 nm;2.5x;2.495;0.69;2.535;0.6
-1x;647 nm;3.2x;2.495;0.69;2.535;0.6
-1x;647 nm;4x;2.495;0.2;2.535;0.19
-1x;647 nm;5x;2.495;0.2;2.535;0.19
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Template.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Template.csv
deleted file mode 100644
index 247f509..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Template.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.67;0.79;2.67;0.78
-1x;405 nm;0.8x;2.67;0.79;2.67;0.78
-1x;405 nm;1x;2.67;0.79;2.67;0.78
-1x;405 nm;1.25x;2.67;0.79;2.67;0.78
-1x;405 nm;1.6x;2.67;0.79;2.67;0.78
-1x;405 nm;2x;2.67;0.79;2.67;0.78
-1x;405 nm;2.5x;2.67;0.79;2.67;0.78
-1x;405 nm;3.2x;2.67;0.79;2.67;0.78
-1x;405 nm;4x;2.67;0.25;2.67;0.25
-1x;405 nm;5x;2.67;0.25;2.67;0.25
-1x;405 nm;6.3x;2.67;0.25;2.67;0.25
-1x;488 nm;0.63x;2.5;1.7;2.5;1.7
-1x;488 nm;0.8x;2.2840000000000145;0.976;2.51;0.95
-1x;488 nm;1x;2.47;0.87;2.55;0.75
-1x;488 nm;1.25x;2.48;0.7;2.51;0.6
-1x;488 nm;1.6x;2.46;0.57;2.51;0.49
-1x;488 nm;2x;2.465;0.45;2.509;0.39
-1x;488 nm;2.5x;2.465;0.35;2.509;0.31
-1x;488 nm;3.2x;2.465;0.25;2.51;0.23
-1x;488 nm;4x;2.3070000000000177;0.14500000000000002;2.51;0.18
-1x;488 nm;5x;2.47;0.165;2.509;0.14
-1x;488 nm;6.3x;2.47;0.13;2.509;0.12
-1x;515 nm;0.63x;2.46;0.87;2.5;0.75
-1x;515 nm;0.8x;2.46;0.87;2.5;0.75
-1x;515 nm;1x;2.46;0.87;2.5;0.75
-1x;515 nm;1.25x;2.46;0.7;2.5;0.6
-1x;515 nm;1.6x;2.46;0.7;2.5;0.6
-1x;515 nm;2x;2.46;0.7;2.5;0.6
-1x;515 nm;2.5x;2.46;0.7;2.5;0.6
-1x;515 nm;3.2x;2.46;0.7;2.5;0.6
-1x;515 nm;4x;2.458;0.22;2.505;0.18
-1x;515 nm;5x;2.458;0.22;2.505;0.18
-1x;515 nm;6.3x;2.458;0.22;2.505;0.18
-1x;561 nm;0.63x;2.47;0.87;2.509;0.75
-1x;561 nm;0.8x;2.47;0.87;2.6089999999999915;0.75
-1x;561 nm;1x;2.47;0.87;2.509;0.75
-1x;561 nm;1.25x;2.47;0.65;2.509;0.6
-1x;561 nm;1.6x;2.47;0.65;2.509;0.6
-1x;561 nm;2x;2.47;0.65;2.509;0.6
-1x;561 nm;2.5x;2.47;0.65;2.509;0.6
-1x;561 nm;3.2x;2.47;0.65;2.509;0.6
-1x;561 nm;4x;2.475;0.22;2.518;0.18
-1x;561 nm;5x;2.475;0.22;2.518;0.18
-1x;561 nm;6.3x;2.475;0.22;2.518;0.18
-1x;594 nm;0.63x;2.478;0.87;2.515;0.75
-1x;594 nm;0.8x;2.478;0.87;2.515;0.75
-1x;594 nm;1x;2.478;0.87;2.515;0.75
-1x;594 nm;1.25x;2.478;0.65;2.515;0.6
-1x;594 nm;1.6x;2.478;0.65;2.515;0.6
-1x;594 nm;2x;2.478;0.65;2.515;0.6
-1x;594 nm;2.5x;2.478;0.65;2.515;0.6
-1x;594 nm;3.2x;2.478;0.65;2.515;0.6
-1x;594 nm;4x;2.475;0.22;2.518;0.18
-1x;594 nm;5x;2.475;0.22;2.518;0.18
-1x;594 nm;6.3x;2.475;0.22;2.518;0.18
-1x;647 nm;0.63x;2.495;0.87;2.535;0.75
-1x;647 nm;0.8x;2.495;0.87;2.535;0.75
-1x;647 nm;1x;2.495;0.87;2.535;0.75
-1x;647 nm;1.25x;2.495;0.69;2.535;0.6
-1x;647 nm;1.6x;2.495;0.69;2.535;0.6
-1x;647 nm;2x;2.495;0.69;2.535;0.6
-1x;647 nm;2.5x;2.495;0.69;2.535;0.6
-1x;647 nm;3.2x;2.495;0.69;2.535;0.6
-1x;647 nm;4x;2.495;0.2;2.535;0.19
-1x;647 nm;5x;2.495;0.2;2.535;0.19
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters - Wyss - Startup.csv b/mesoSPIM/config/etl_parameters/ETL-parameters - Wyss - Startup.csv
deleted file mode 100644
index 120e371..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters - Wyss - Startup.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.5839999999999974;0.8040000000000002
-1x;488 nm;1.25x;2.589999999999979;0.692;2.0800000000000516;0.626
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.583;0.36600000000000005
-1x;488 nm;2.5x;2.3010000000000095;0.399;2.587;0.27
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.389999999999999;0.202;2.558;0.162
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.285;1.089;2.510000000000008;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.394;0.584;2.556999999999999;0.472
-1x;561 nm;2x;2.394;0.5040000000000001;2.589;0.2959999999999997
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.216;2.5840000000000014;0.15799999999999997
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.417000000000007;0.43199999999999994;2.6109999999999927;0.3659999999999999
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters -DanielG - DBE - H45.csv b/mesoSPIM/config/etl_parameters/ETL-parameters -DanielG - DBE - H45.csv
deleted file mode 100644
index 6f2c07f..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters -DanielG - DBE - H45.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.4000000000000012;1.5100000000000002;2.579999999999995;1.2399999999999993
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.5360000000000076;0.8420000000000001;2.7200000000000015;0.568
-1x;488 nm;1.25x;2.5479999999999983;0.5819999999999999;2.732;0.4099999999999999
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.4860000000000055;0.388;2.7410000000000014;0.242
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.5279999999999987;0.202;2.75;0.1430000000000001
-1x;488 nm;5x;2.557;0.145;2.753;0.05499999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.714;0.153
-1x;515 nm;0.63x;2.3970000000000007;0.9629999999999999;2.580999999999999;0.9540000000000004
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388000000000008;0.21900000000000006;2.602999999999989;0.13699999999999996
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.3609999999999935;1.086;2.51;1.06
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.688;0.6920000000000001;2.713;0.5699999999999998
-1x;561 nm;1.25x;2.570000000000001;0.586;2.746999999999998;0.3809999999999999
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.5219999999999865;0.388;2.599;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.552999999999998;0.19900000000000007;2.7400000000000007;0.135
-1x;561 nm;5x;2.566;0.14399999999999996;2.6510000000000007;0.12800000000000006
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.716;0.128
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.735;1.018
-1x;647 nm;1x;2.619;0.744;2.669;0.7240000000000002
-1x;647 nm;1.25x;2.5819999999999985;0.5419999999999999;2.6400000000000023;0.529
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.562999999999981;0.374;2.619;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.5549999999999984;0.0;2.609;0.242
-1x;647 nm;4x;2.615999999999999;0.22600000000000003;2.763999999999999;0.173
-1x;647 nm;5x;2.557;0.145;2.7619999999999996;0.10099999999999999
-1x;647 nm;6.3x;2.495;0.2;2.738;0.13999999999999999
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters-test.csv b/mesoSPIM/config/etl_parameters/ETL-parameters-test.csv
deleted file mode 100644
index 3c7f728..0000000
--- a/mesoSPIM/config/etl_parameters/ETL-parameters-test.csv
+++ /dev/null
@@ -1,67 +0,0 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.486999999999993;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.336000000000007;1.3;2.5560000000000027;1.24
-1x;488 nm;0.8x;2.4000000000000017;1.1600000000000001;2.5699999999999985;0.988
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.5839999999999974;0.008
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.5880000000000014;0.44899999999999995
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.583;0.36600000000000005
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.389999999999997;0.25700000000000006;2.5910000000000006;0.20499999999999996
-1x;488 nm;4x;2.3420000000000054;0.158;2.558;0.162
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.301000000000002;0.9589999999999999;2.581;0.954
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.5840000000000005;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388;0.219;2.596999999999998;0.17100000000000004
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.361;1.086;2.579000000000002;1.107999999999997
-1x;561 nm;0.8x;2.4040000000000026;0.9460000000000002;2.580999999999999;0.704
-1x;561 nm;1x;2.399999999999999;0.744;2.586999999999997;0.5939999999999999
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.3800000000000012;0.504;2.5990000000000024;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.39;0.2760000000000001;2.593;0.26800000000000007
-1x;561 nm;4x;2.389;0.216;2.611999999999997;0.158
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.4080000000000017;1.2600000000000002;2.583999999999999;0.8499999999999996
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.5849999999999986;0.7799999999999998
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.6019999999999994;0.30999999999999994
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.3930000000000025;0.432;2.6189999999999993;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.495;0.2;2.535;0.19
diff --git a/mesoSPIM/config/etl_parameters/ETL-parameters.csv b/mesoSPIM/config/etl_parameters/ETL-parameters.csv
index 819b8cb..35e9dea 100644
--- a/mesoSPIM/config/etl_parameters/ETL-parameters.csv
+++ b/mesoSPIM/config/etl_parameters/ETL-parameters.csv
@@ -1,67 +1,134 @@
-Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
-1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
-1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
-1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
-1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
-1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
-1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
-1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
-1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
-1x;405 nm;4x;2.512999999999999;0.197;2.67;0.25
-1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
-1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
-1x;488 nm;0.63x;2.336000000000007;1.3;2.5560000000000027;1.24
-1x;488 nm;0.8x;2.334000000000004;0.942;2.5919999999999996;0.936
-1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.4920000000000018;0.804
-1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
-1x;488 nm;1.6x;2.3880000000000026;0.524;2.547999999999999;0.449
-1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.5450000000000004;0.366
-1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
-1x;488 nm;3.2x;2.3499999999999965;0.251;2.5459999999999994;0.23
-1x;488 nm;4x;2.398000000000001;0.158;2.7359999999999944;0.09600000000000002
-1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
-1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
-1x;515 nm;0.63x;2.422999999999997;1.123;2.4930000000000025;1.1460000000000001
-1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
-1x;515 nm;1x;2.3919999999999986;0.782;2.4500000000000024;0.702
-1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
-1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
-1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
-1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
-1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
-1x;515 nm;4x;2.388;0.219;2.596999999999998;0.17100000000000004
-1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
-1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
-1x;561 nm;0.63x;2.361;1.086;2.579000000000002;1.107999999999997
-1x;561 nm;0.8x;2.3620000000000014;0.87;2.547;0.75
-1x;561 nm;1x;2.399999999999999;0.744;2.7329999999999974;0.594
-1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
-1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
-1x;561 nm;2x;2.3800000000000012;0.504;2.5990000000000024;0.296
-1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
-1x;561 nm;3.2x;2.4259999999999997;0.243;2.626;0.184
-1x;561 nm;4x;2.410999999999999;0.216;2.611999999999997;0.158
-1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
-1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
-1x;594 nm;0.63x;2.307999999999999;1.314;2.492000000000001;1.14
-1x;594 nm;0.8x;2.4180000000000015;1.12;2.537;0.78
-1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
-1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
-1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
-1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.5519999999999996;0.31
-1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
-1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
-1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
-1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
-1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
-1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
-1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
-1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
-1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
-1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
-1x;647 nm;2x;2.3930000000000025;0.432;2.6189999999999993;0.366
-1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
-1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
-1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
-1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
-1x;647 nm;6.3x;2.481;0.07400000000000001;2.7779999999999996;0.092
+Objective;Wavelength;Zoom;ETL-Left-Offset;ETL-Left-Amp;ETL-Right-Offset;ETL-Right-Amp
+
+1x;405 nm;0.63x;2.4900000000000038;0.6950000000000021;2.655999999999999;1.2649999999999966
+
+1x;405 nm;0.8x;2.4950000000000037;0.7649999999999995;2.6500000000000004;0.725
+
+1x;405 nm;1x;2.4900000000000038;0.61;2.6550000000000002;0.5949999999999999
+
+1x;405 nm;1.25x;2.418000000000004;0.6830000000000002;2.6609999999999996;0.5439999999999998
+
+1x;405 nm;1.6x;2.465999999999994;0.43899999999999995;2.687999999999999;0.42499999999999993
+
+1x;405 nm;2x;2.498999999999993;0.2859999999999996;2.6669999999999994;0.312
+
+1x;405 nm;2.5x;2.4839999999999955;0.2900000000000001;2.667;0.20799999999999985
+
+1x;405 nm;3.2x;2.4809999999999928;0.243;2.67;0.21900000000000014
+
+1x;405 nm;4x;2.512999999999999;0.197;2.67;0.25
+
+1x;405 nm;5x;2.486999999999993;0.17800000000000007;2.6850000000000005;0.2
+
+1x;405 nm;6.3x;2.67;0.25;2.677999999999998;0.058999999999999886
+
+1x;488 nm;0.63x;2.336000000000007;1.3;2.5560000000000027;1.24
+
+1x;488 nm;0.8x;2.334000000000004;0.942;2.5919999999999996;0.936
+
+1x;488 nm;1x;2.3939999999999975;0.8880000000000002;2.4920000000000018;0.804
+
+1x;488 nm;1.25x;2.3960000000000017;0.692;2.5759999999999974;0.6260000000000001
+
+1x;488 nm;1.6x;2.3880000000000026;0.524;2.547999999999999;0.449
+
+1x;488 nm;2x;2.397000000000001;0.4610000000000001;2.5450000000000004;0.366
+
+1x;488 nm;2.5x;2.386999999999998;0.3990000000000001;2.5870000000000006;0.26999999999999996
+
+1x;488 nm;3.2x;2.3499999999999965;0.251;2.5459999999999994;0.23
+
+1x;488 nm;4x;2.398000000000001;0.158;2.7359999999999944;0.09600000000000002
+
+1x;488 nm;5x;2.3949999999999987;0.21100000000000008;2.593000000000001;0.13299999999999998
+
+1x;488 nm;6.3x;2.3919999999999972;0.14100000000000001;2.590000000000002;0.11099999999999996
+
+1x;515 nm;0.63x;2.422999999999997;1.123;2.4930000000000025;1.1460000000000001
+
+1x;515 nm;0.8x;2.3970000000000007;0.81;2.571999999999999;0.8360000000000001
+
+1x;515 nm;1x;2.3919999999999986;0.782;2.4500000000000024;0.702
+
+1x;515 nm;1.25x;2.396999999999999;0.7190000000000001;2.5840000000000014;0.5319999999999998
+
+1x;515 nm;1.6x;2.3340000000000067;0.41400000000000003;2.58899999999999;0.45099999999999996
+
+1x;515 nm;2x;2.3899999999999992;0.388;2.584;0.392
+
+1x;515 nm;2.5x;2.3920000000000075;0.317;2.59199999999999;0.26199999999999996
+
+1x;515 nm;3.2x;2.3910000000000076;0.20499999999999974;2.58999999999999;0.174
+
+1x;515 nm;4x;2.388;0.219;2.596999999999998;0.17100000000000004
+
+1x;515 nm;5x;2.3920000000000075;0.16799999999999998;2.59499999999999;0.12599999999999997
+
+1x;515 nm;6.3x;2.389000000000008;0.12300000000000003;2.59299999999999;0.09399999999999992
+
+1x;561 nm;0.63x;2.361;1.086;2.579000000000002;1.107999999999997
+
+1x;561 nm;0.8x;2.3620000000000014;0.87;2.547;0.75
+
+1x;561 nm;1x;2.399999999999999;0.744;2.7329999999999974;0.594
+
+1x;561 nm;1.25x;2.3959999999999995;0.688;2.5409999999999955;0.586
+
+1x;561 nm;1.6x;2.3800000000000017;0.584;2.628999999999992;0.472
+
+1x;561 nm;2x;2.3800000000000012;0.504;2.5990000000000024;0.296
+
+1x;561 nm;2.5x;2.39;0.37600000000000017;2.593;0.324
+
+1x;561 nm;3.2x;2.4259999999999997;0.243;2.626;0.184
+
+1x;561 nm;4x;2.410999999999999;0.216;2.611999999999997;0.158
+
+1x;561 nm;5x;2.387;0.13599999999999995;2.598;0.18600000000000003
+
+1x;561 nm;6.3x;2.391;0.10400000000000001;2.5939999999999994;0.12800000000000003
+
+1x;594 nm;0.63x;2.307999999999999;1.314;2.492000000000001;1.14
+
+1x;594 nm;0.8x;2.4180000000000015;1.12;2.537;0.78
+
+1x;594 nm;1x;2.4180000000000015;0.9000000000000004;2.5949999999999984;0.8300000000000001
+
+1x;594 nm;1.25x;2.403000000000002;0.6150000000000002;2.5949999999999984;0.5299999999999999
+
+1x;594 nm;1.6x;2.4080000000000017;0.44000000000000006;2.5999999999999983;0.35999999999999976
+
+1x;594 nm;2x;2.403000000000002;0.37000000000000005;2.5519999999999996;0.31
+
+1x;594 nm;2.5x;2.398000000000002;0.3900000000000002;2.5999999999999983;0.24499999999999966
+
+1x;594 nm;3.2x;2.4040000000000084;0.23799999999999957;2.6029999999999998;0.21500000000000002
+
+1x;594 nm;4x;2.405000000000008;0.26400000000000007;2.6060000000000008;0.1419999999999999
+
+1x;594 nm;5x;2.4010000000000065;0.14399999999999996;2.6039999999999934;0.12999999999999998
+
+1x;594 nm;6.3x;2.401000000000008;0.13800000000000004;2.5999999999999908;0.09199999999999992
+
+1x;647 nm;0.63x;2.379000000000006;1.344;2.5710000000000024;1.224
+
+1x;647 nm;0.8x;2.423000000000008;0.9560000000000002;2.6049999999999938;1.018
+
+1x;647 nm;1x;2.495;0.87;2.602999999999993;0.7479999999999999
+
+1x;647 nm;1.25x;2.423000000000008;0.6479999999999999;2.6029999999999927;0.582
+
+1x;647 nm;1.6x;2.4210000000000083;0.5359999999999999;2.6129999999999955;0.4299999999999998
+
+1x;647 nm;2x;2.3930000000000025;0.432;2.6189999999999993;0.366
+
+1x;647 nm;2.5x;2.417000000000007;0.3799999999999999;2.606999999999996;0.27999999999999997
+
+1x;647 nm;3.2x;2.415000000000008;0.23199999999999998;2.608999999999992;0.24199999999999977
+
+1x;647 nm;4x;2.4190000000000085;0.2;2.6129999999999924;0.20800000000000002
+
+1x;647 nm;5x;2.415000000000002;0.14500000000000002;2.6099999999999923;0.12499999999999994
+
+1x;647 nm;6.3x;2.481;0.07400000000000001;2.7779999999999996;0.092
+
diff --git a/mesoSPIM/gui/mesoSPIM_AcquisitionManagerWindow.ui b/mesoSPIM/gui/mesoSPIM_AcquisitionManagerWindow.ui
index bc56cfe..e882dc7 100644
--- a/mesoSPIM/gui/mesoSPIM_AcquisitionManagerWindow.ui
+++ b/mesoSPIM/gui/mesoSPIM_AcquisitionManagerWindow.ui
@@ -10,7 +10,7 @@
0
0
2108
- 367
+ 376
@@ -54,42 +54,48 @@
-
-
-
-
+
-
+
- 15
+ 14
+
+ Deletes all rows in the table
+
- Mark Current Rotation
+ Delete all Rows
- -
-
-
- true
-
+
-
+
- 15
+ 14
+
+ Deletes selected row
+
- Tiling Wizard
+ Delete Row
- -
-
+
-
+
- 15
+ 14
+
+ Duplicates a row in the table
+
- Delete
+ Duplicate Row
@@ -97,11 +103,14 @@
- 15
+ 14
+
+ Moves selected row up
+
- Move Up
+ Move Row Up
@@ -109,173 +118,287 @@
- 15
+ 14
+
+ Adds another row to the table
+
- Add
+ Add Row
- -
-
+
-
+
- 15
+ 14
+
+ Saves the table
+
- Copy
+ Save Table
- -
-
+
-
+
14
+
+ Copies current sample rotation angle into the selected row.
+
- Delete all
+ Mark Current Rotation
- -
-
+
-
+
14
+
+ Copies current ETL values into the selected row.
+
- Set Folders
+ Mark Current ETL values
- -
-
+
-
+
+
+ true
+
14
+
+ Preview acquisition: The microscope will move the to the starting location and set up everything (filters, lasers, ...).
+
- Filename Wizard
+ Preview Selected Row
- -
+
-
+
+
+
+ 14
+
+
+
+ Generates Image Processing Options for the entire table.
+
+
+ Image Processing Wizard
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ Generates start/end focus positions for the table.
+
+
+ Focus Tracking Wizard
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ Moves selected row down
+
+
+ Move Row Down
+
+
+
+ -
- 15
+ 14
+
+ Copies current laser, intensity, zoom & filter settings into the selected row.
+
Mark Current State
- -
-
+
-
+
- 15
+ 14
+
+ Copies the current focus into the selected row (Sets both start & end focus).
+
- Mark Current ETL values
+ Mark Current Focus
- -
-
-
- true
+
-
+
+
+
+ 14
+
+
+
+ Copies the current X & Y position into the selected row.
+
+
+ Mark Current XY
+
+
+ -
+
- 15
+ 14
+
+ Loads a saved table.
+
- Preview Selection
+ Load Table
- -
-
+
-
+
- false
+ true
- 15
+ 14
+
+ Generates a tiling acquisition through a series of steps.
+
- Update ETL after Zoom / Laser change
+ Tiling Wizard
- -
-
+
-
+
- 15
+ 14
+
+ Generates filenames for the entire table.
+
- Mark Current XY
+ Filename Wizard
- -
-
+
-
+
- 15
+ 14
+
+ If enabled, the sample will be moved to the z-starting location if "Preview Selected Row" is clicked.
+
- Mark Current Focus
+ Preview: Move to Z start
+
+
+ true
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
- 15
+ 14
-
- Move Down
+
+ false
+
+
+ Predicted acquisition time in hh:mm:ss.
+
+
+ true
- -
-
+
-
+
- 15
+ 14
+
+ Predicted acquisition time in hh:mm:ss.
+
- Save
+ Predicted time (HH:MM:SS):
- -
-
+
-
+
- 15
+ 14
+
+ Sets all the save folders for the entire table.
+
- Load
+ Set Folders
diff --git a/mesoSPIM/gui/mesoSPIM_MainWindow.ui b/mesoSPIM/gui/mesoSPIM_MainWindow.ui
index c5907f4..07e0c75 100644
--- a/mesoSPIM/gui/mesoSPIM_MainWindow.ui
+++ b/mesoSPIM/gui/mesoSPIM_MainWindow.ui
@@ -57,13 +57,73 @@
- -
-
-
- true
+
-
+
+
+
+ 15
+
+
+
+ Acquisition Progress
+
+
+
+ -
+
+
+
+ 15
+
+
+
+ Qt::LeftToRight
+
+
+ false
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ %p%
+
+
+
+ -
+
+
+
+ 15
+
+
+
+ Total Progress
+
+
+
+ -
+
+
+
+ 15
+
+
+
+ 0
+
+
+ Qt::AlignCenter
+
+
+ -
+
-
+
0
0
@@ -71,1476 +131,1405 @@
0
- 750
+ 0
-
-
- 14
-
-
-
- 0
+
+
-
-
- Movement
-
-
-
- true
-
-
-
- 10
- 10
- 541
- 531
-
-
-
-
- 16
-
-
-
- Sample Translation
-
-
- false
-
-
+
+
-
+
+
+
+ 14
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+ X
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ X
+
+
+ 9897
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ Y
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ X
+
+
+ 9897
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ Z
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ X
+
+
+ 1557
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+ -
+
+
+
+ 14
+
+
+
+ Angle
+
+
+
+ -
+
true
-
-
- 10
- 30
- 371
- 401
-
+
+
+ 14
+
-
- XY
-
-
-
- true
-
-
-
- 130
- 30
- 111
- 111
-
-
-
-
- 50
- false
- false
-
-
-
-
-
-
-
- up-blue.pngup-blue.png
-
-
-
- 80
- 80
-
-
-
- false
-
-
- true
-
-
-
-
- true
-
-
-
- 250
- 150
- 111
- 111
-
-
-
-
- 50
- false
-
-
-
-
-
-
-
- right-blue.pngright-blue.png
-
-
-
- 80
- 80
-
-
-
- true
-
-
-
-
- true
-
-
-
- 10
- 150
- 111
- 111
-
-
-
-
- 50
- false
-
-
-
-
-
-
-
- left-blue.pngleft-blue.png
-
-
-
- 80
- 80
-
-
-
- true
-
-
-
-
- true
-
-
-
- 130
- 270
- 111
- 111
-
-
-
-
- 50
- false
-
-
-
-
-
-
-
- down-blue.pngdown-blue.png
-
-
-
- 80
- 80
-
-
-
- true
-
-
-
-
- true
-
-
-
- 130
- 150
- 111
- 111
-
-
-
-
- 16
- 50
- false
- false
-
-
-
- ZERO
- XY
-
-
- true
-
-
-
-
-
- true
-
-
-
- 400
- 30
- 131
- 401
-
-
-
- Z
-
-
-
- true
-
-
-
- 10
- 30
- 111
- 111
-
-
-
-
- 50
- false
- false
-
-
-
-
-
-
-
- up-blue.pngup-blue.png
-
-
-
- 80
- 80
-
-
-
- true
-
-
-
-
- true
-
-
-
- 10
- 270
- 111
- 111
-
-
-
-
- 50
- false
- false
-
-
-
-
-
-
-
- down-blue.pngdown-blue.png
-
-
-
- 80
- 80
-
-
-
- true
-
-
-
-
- true
-
-
-
- 10
- 150
- 111
- 111
-
-
-
-
- 16
- 50
- false
- false
-
-
-
- ZERO
- Z
-
-
- true
-
-
-
-
-
- true
-
-
-
- 160
- 440
- 91
- 81
-
-
-
-
- 50
- false
-
+
+ X
- LOAD
-
-
-
-
- true
-
-
-
- 10
- 430
- 141
- 31
-
-
-
-
- 14
-
+ 180
-
- Increment
+
+ Qt::AlignCenter
-
-
-
+
true
-
-
- 10
- 470
- 141
- 41
-
-
-
- µm
-
-
- 500
-
-
- 100
-
-
-
- true
-
-
-
- 260
- 440
- 111
- 81
-
-
+
+ -
+
- 50
- false
+ 14
- UNLOAD
+ Focus
-
-
-
- true
-
-
-
- 560
- 10
- 171
- 531
-
-
-
-
- 16
-
-
-
- Focus
-
-
-
- true
-
-
-
- 30
- 60
- 111
- 111
-
-
+
+ -
+
- 50
- false
- false
+ 14
+
+ X
+
-
+ 659
-
-
- up-green.pngup-green.png
+
+ Qt::AlignCenter
-
+
+ true
+
+
+
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 150
+
+
+
+
+ 16
+
+
+
+ Controls
+
+
+
+ true
+
+
+
+ 10
+ 30
+ 471
+ 51
+
+
+
+
+ 14
+
+
+
+
+
+ true
+
+
+
+ 10
+ 90
+ 261
+ 51
+
+
+
+
+ 14
+
+
+
+
+
+ true
+
+
+
+ 700
+ 30
+ 191
+ 51
+
+
+
+
+ 14
+
+
+
+
+
+ true
+
+
+
+ 490
+ 30
+ 201
+ 51
+
+
+
+
+ 14
+
+
+
+
+
+
+ 280
+ 90
+ 611
+ 51
+
+
+
+ false
+
+
+ 100
+
+
+ 1
+
+
+ false
+
+
+ Qt::Horizontal
+
+
+ false
+
+
+ false
+
+
+ QSlider::TicksBothSides
+
+
+ 10
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 120
+
+
+
+
+
+
+
-
+
+
- 80
- 80
+ 0
+ 91
-
- true
-
-
-
-
- true
-
-
-
- 30
- 180
- 111
- 111
-
-
- 16
+ 14
50
false
false
- ZERO
- F
-
-
- true
+ Live
-
+
+ -
+
true
-
-
- 30
- 300
- 111
- 111
-
-
-
-
- 50
- false
- false
-
-
-
-
-
-
-
- down-green.pngdown-green.png
-
-
+
- 80
- 80
+ 0
+ 91
-
- true
-
-
-
-
- true
-
-
-
- 20
- 470
- 141
- 41
-
-
-
- µm
-
-
- 1000
-
-
- 100
-
-
-
-
- true
-
-
-
- 20
- 430
- 141
- 31
-
-
14
-
-
-
- Increment
-
-
-
-
-
- true
-
-
-
- 10
- 550
- 541
- 151
-
-
-
-
- 16
-
-
-
- Rotation
-
-
-
- true
-
-
-
- 20
- 30
- 111
- 111
-
-
-
-
50
false
false
-
-
-
-
- left-red.pngleft-red.png
-
-
-
- 80
- 80
-
-
-
- true
+ Snap
-
+
+ -
+
true
-
-
- 260
- 30
- 111
- 111
-
-
-
-
- 50
- false
- false
-
-
-
-
-
-
-
- right-red.pngright-red.png
-
-
+
- 80
- 80
+ 0
+ 91
-
- true
-
-
-
-
- true
-
-
-
- 400
- 30
- 141
- 31
-
-
-
-
- 14
-
-
-
- Increment
-
-
-
-
- true
-
-
-
- 400
- 70
- 121
- 41
-
-
-
- °
-
-
- -181.000000000000000
-
-
- 181.000000000000000
+
+
+ 14
+ 50
+ false
+ false
+
-
- 0.010000000000000
+
+ Run
+ Selected Acquisition
-
+
+ -
+
true
-
-
- 140
- 30
- 111
- 111
-
+
+
+ 0
+ 91
+
+ 14
50
false
false
- ZERO
- ROT
+ Run
+ Acquisition List
-
- true
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 91
+
+
+
+
+ 14
+ 75
+ false
+ true
+
+
+
+ STOP
-
-
-
- true
-
-
-
- 560
- 560
- 171
- 141
-
-
-
-
- 18
- 50
- false
-
-
-
- STOP
-MOVEMENT
-
-
-
-
- true
-
-
-
- 740
- 560
- 151
- 141
-
-
-
-
- 18
- 50
- false
-
-
-
- Mark
-Rotation
-Position
-
-
- false
-
-
- false
-
-
-
+
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 750
+
+
+
+
+ 14
+
+
+
+ 0
+
+
+
+ Movement
+
+
true
- 740
- 410
- 151
- 141
+ 10
+ 10
+ 541
+ 531
- 18
- 50
- false
+ 16
-
- Go to
-Rotation
-Position
-
-
- false
+
+ Sample Translation
-
+
false
-
-
-
-
- ETL
-
-
-
-
- 10
- 10
- 371
- 631
-
-
-
- Tunable lenses
-
-
-
-
- 10
- 80
- 131
- 31
-
-
-
- Offset
+
+
+ true
-
-
10
- 160
- 141
- 31
+ 30
+ 371
+ 401
-
- Amplitude
+
+ XY
+
+
+ true
+
+
+
+ 130
+ 30
+ 111
+ 111
+
+
+
+
+ 50
+ false
+ false
+
+
+
+
+
+
+
+ up-blue.pngup-blue.png
+
+
+
+ 80
+ 80
+
+
+
+ false
+
+
+ true
+
+
+
+
+ true
+
+
+
+ 250
+ 150
+ 111
+ 111
+
+
+
+
+ 50
+ false
+
+
+
+
+
+
+
+ right-blue.pngright-blue.png
+
+
+
+ 80
+ 80
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ 10
+ 150
+ 111
+ 111
+
+
+
+
+ 50
+ false
+
+
+
+
+
+
+
+ left-blue.pngleft-blue.png
+
+
+
+ 80
+ 80
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ 130
+ 270
+ 111
+ 111
+
+
+
+
+ 50
+ false
+
+
+
+
+
+
+
+ down-blue.pngdown-blue.png
+
+
+
+ 80
+ 80
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ 130
+ 150
+ 111
+ 111
+
+
+
+
+ 16
+ 50
+ false
+ false
+
+
+
+ ZERO
+ XY
+
+
+ true
+
+
-
+
true
- 140
- 80
- 101
- 31
+ 400
+ 30
+ 131
+ 401
-
- V
-
-
- 3
-
-
- 5.000000000000000
-
-
- 0.002000000000000
-
-
- 2.520000000000000
+
+ Z
+
+
+ true
+
+
+
+ 10
+ 30
+ 111
+ 111
+
+
+
+
+ 50
+ false
+ false
+
+
+
+
+
+
+
+ up-blue.pngup-blue.png
+
+
+
+ 80
+ 80
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ 10
+ 270
+ 111
+ 111
+
+
+
+
+ 50
+ false
+ false
+
+
+
+
+
+
+
+ down-blue.pngdown-blue.png
+
+
+
+ 80
+ 80
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+ 10
+ 150
+ 111
+ 111
+
+
+
+
+ 16
+ 50
+ false
+ false
+
+
+
+ ZERO
+ Z
+
+
+ true
+
+
-
+
+
+ true
+
- 140
- 40
+ 160
+ 440
91
- 31
+ 81
+
+
+ 50
+ false
+
+
- Left
+ LOAD
-
+
+
+ true
+
- 250
- 40
- 91
+ 10
+ 430
+ 141
31
+
+
+ 14
+
+
- Right
+ Increment
-
+
true
- 260
- 80
- 101
- 31
+ 10
+ 470
+ 141
+ 41
- V
-
-
- 3
+ µm
- 5.000000000000000
-
-
- 0.002000000000000
+ 500
- 2.560000000000000
+ 100
-
+
true
- 140
- 160
- 101
- 31
+ 260
+ 440
+ 111
+ 81
-
- V
-
-
- 3
-
-
- 2.000000000000000
-
-
- 0.002000000000000
+
+
+ 50
+ false
+
-
- 0.180000000000000
+
+ UNLOAD
-
+
+
+
+ true
+
+
+
+ 560
+ 10
+ 171
+ 531
+
+
+
+
+ 16
+
+
+
+ Focus
+
+
true
- 260
- 160
- 101
- 31
+ 30
+ 60
+ 111
+ 111
-
- V
+
+
+ 50
+ false
+ false
+
-
- 3
+
+
-
- 2.000000000000000
+
+
+ up-green.pngup-green.png
-
- 0.002000000000000
+
+
+ 80
+ 80
+
-
- 0.170000000000000
+
+ true
-
+
+
+ true
+
- 10
- 310
- 351
- 51
+ 30
+ 180
+ 111
+ 111
- 14
+ 16
50
false
false
- Choose ETL config file
+ ZERO
+ F
+
+
+ true
-
+
true
- 10
- 370
- 351
- 51
+ 30
+ 300
+ 111
+ 111
- 14
50
false
false
- Save current parameters to csv
+
-
-
-
-
- 10
- 220
- 141
- 31
-
+
+
+ down-green.pngdown-green.png
-
- Increment
+
+
+ 80
+ 80
+
+
+
+ true
-
+
true
- 140
- 220
- 101
- 31
+ 20
+ 470
+ 141
+ 41
- V
-
-
- 3
+ µm
- 0.010000000000000
-
-
- 0.001000000000000
+ 1000
- 0.010000000000000
-
-
-
-
-
- 10
- 480
- 341
- 131
-
-
-
- false
-
-
- true
+ 100
-
-
-
- 20
- 430
- 121
- 41
-
-
-
- Config File:
+
+
+ true
-
-
- 260
- 120
- 101
+ 20
+ 430
+ 141
31
14
- 50
- false
- false
- AmpR=0
-
-
- true
+ Increment
-
-
-
- 150
- 130
- 101
- 31
-
-
-
-
- 14
- 50
- false
- false
-
-
-
- AmpL=0
-
-
- true
-
-
-
-
-
- Scripting
-
-
+
true
10
- 10
- 251
- 41
+ 550
+ 541
+ 151
- 50
- false
+ 16
-
- New Scripting Editor
-
-
-
-
-
- Log
-
-
-
-
- Parameters
-
-
-
-
- 10
- 10
- 431
- 181
-
-
- Sweep
+ Rotation
-
+
true
- 280
- 40
- 141
- 31
+ 20
+ 30
+ 111
+ 111
-
- ms
+
+
+ 50
+ false
+ false
+
-
- 100.000000000000000
+
+
-
- 1000.000000000000000
+
+
+ left-red.pngleft-red.png
-
- 1.000000000000000
+
+
+ 80
+ 80
+
-
- 200.000000000000000
+
+ true
-
+
+
+ true
+
- 10
- 40
- 161
- 31
+ 260
+ 30
+ 111
+ 111
+
+
+ 50
+ false
+ false
+
+
- Sweeptime
+
-
-
-
-
- 10
- 90
- 141
- 31
-
+
+
+ right-red.pngright-red.png
-
- Exposure
+
+
+ 80
+ 80
+
+
+
+ true
-
+
+
+ true
+
- 10
- 140
- 161
+ 400
+ 30
+ 141
31
+
+
+ 14
+
+
- Line Interval
+ Increment
-
+
true
- 280
- 90
- 141
- 31
+ 400
+ 70
+ 121
+ 41
- ms
+ °
- 3.000000000000000
+ -181.000000000000000
- 1000.000000000000000
+ 181.000000000000000
- 1.000000000000000
-
-
- 20.000000000000000
+ 0.010000000000000
-
+
true
- 280
- 140
- 141
- 31
+ 140
+ 30
+ 111
+ 111
-
- µs
-
-
- 3.000000000000000
-
-
- 1000.000000000000000
+
+
+ 50
+ false
+ false
+
-
- 1.000000000000000
+
+ ZERO
+ ROT
-
- 75.000000000000000
+
+ true
-
+
+
+ true
+
+
+
+ 560
+ 560
+ 171
+ 141
+
+
+
+
+ 18
+ 50
+ false
+
+
+
+ STOP
+MOVEMENT
+
+
+
+
+ true
+
+
+
+ 740
+ 560
+ 151
+ 141
+
+
+
+
+ 18
+ 50
+ false
+
+
+
+ Mark
+Rotation
+Position
+
+
+ false
+
+
+ false
+
+
+
+
+ true
+
+
+
+ 740
+ 410
+ 151
+ 141
+
+
+
+
+ 18
+ 50
+ false
+
+
+
+ Go to
+Rotation
+Position
+
+
+ false
+
+
+ false
+
+
+
+
+
+ ETL
+
+
10
- 430
- 431
- 111
+ 10
+ 371
+ 631
- Camera parameters
+ Tunable lenses
-
+
10
- 30
+ 80
131
31
- Delay
+ Offset
-
+
10
- 70
- 131
+ 160
+ 141
31
- Pulse
+ Amplitude
-
+
true
- 310
- 30
- 111
+ 140
+ 80
+ 101
31
- %
-
-
- 100.000000000000000
-
-
- 0.100000000000000
-
-
- 10.000000000000000
-
-
-
-
- true
-
-
-
- 310
- 70
- 111
- 31
-
+ V
-
- %
+
+ 3
- 100.000000000000000
+ 5.000000000000000
- 0.100000000000000
+ 0.002000000000000
- 80.000000000000000
+ 2.520000000000000
-
-
-
-
- 10
- 200
- 431
- 221
-
-
-
- Laser pulse
-
-
+
- 190
- 20
+ 140
+ 40
91
31
@@ -1549,11 +1538,11 @@ Position
Left
-
+
- 310
- 20
+ 250
+ 40
91
31
@@ -1562,473 +1551,511 @@ Position
Right
-
+
+
+ true
+
- 10
- 60
- 131
+ 260
+ 80
+ 101
31
-
- Delay
+
+ V
+
+
+ 3
+
+
+ 5.000000000000000
+
+
+ 0.002000000000000
+
+
+ 2.560000000000000
-
+
true
- 190
- 60
- 111
+ 140
+ 160
+ 101
31
- %
+ V
+
+
+ 3
- 100.000000000000000
+ 2.000000000000000
- 0.100000000000000
+ 0.002000000000000
- 10.000000000000000
+ 0.180000000000000
-
+
true
- 310
- 60
- 111
+ 260
+ 160
+ 101
31
- %
+ V
+
+
+ 3
- 100.000000000000000
+ 2.000000000000000
- 0.100000000000000
+ 0.002000000000000
- 10.000000000000000
+ 0.170000000000000
-
+
10
- 110
- 161
- 31
+ 310
+ 351
+ 51
+
+
+ 14
+ 50
+ false
+ false
+
+
- Pulselength
+ Choose ETL config file
-
+
true
- 190
- 110
- 111
+ 10
+ 370
+ 351
+ 51
+
+
+
+
+ 14
+ 50
+ false
+ false
+
+
+
+ Save current parameters to csv
+
+
+
+
+
+ 10
+ 220
+ 141
31
-
- %
-
-
- 100.000000000000000
-
-
- 0.100000000000000
-
-
- 80.000000000000000
+
+ Increment
-
+
true
- 310
- 110
- 111
+ 140
+ 220
+ 101
31
- %
+ V
+
+
+ 3
- 100.000000000000000
+ 0.010000000000000
- 0.100000000000000
+ 0.001000000000000
- 80.000000000000000
+ 0.010000000000000
-
+
10
- 160
- 181
- 31
+ 480
+ 341
+ 131
-
- Max Amplitude
+
+ false
-
-
-
+
true
+
+
- 190
- 160
- 111
- 31
+ 20
+ 430
+ 121
+ 41
-
- %
-
-
- 100.000000000000000
-
-
- 0.100000000000000
-
-
- 80.000000000000000
+
+ Config File:
-
-
- true
-
+
- 310
- 160
- 111
+ 260
+ 120
+ 101
31
-
- %
-
-
- 100.000000000000000
+
+
+ 14
+ 50
+ false
+ false
+
-
- 0.100000000000000
+
+ AmpR=0
-
- 80.000000000000000
+
+ true
-
+
+
+
+ 150
+ 130
+ 101
+ 31
+
+
+
+
+ 14
+ 50
+ false
+ false
+
+
+
+ AmpL=0
+
+
+ true
+
+
+
+
+
+ Scripting
+
+
true
- 450
- 320
+ 10
+ 10
+ 251
+ 41
+
+
+
+
+ 50
+ false
+
+
+
+ New Scripting Editor
+
+
+
+
+
+ Log
+
+
+
+
+ Parameters
+
+
+
+
+ 10
+ 10
431
- 221
+ 91
- Galvo (Shadow reduction)
+ Sweep
-
-
-
- 10
- 30
- 131
- 31
-
-
-
- Frequency
-
-
-
+
true
- 240
- 30
- 131
+ 280
+ 40
+ 141
31
- Hz
+ ms
-
- 3
+
+ 10.000000000000000
- 400.000000000000000
+ 1000.000000000000000
- 0.001000000000000
+ 1.000000000000000
- 2.520000000000000
-
-
-
-
-
- 190
- 60
- 91
- 31
-
-
-
- Left
-
-
-
-
-
- 310
- 60
- 91
- 31
-
-
-
- Right
+ 200.000000000000000
-
+
10
- 100
- 131
+ 40
+ 161
31
- Offset
+ Sweeptime
-
+
+
+
+
+ 10
+ 110
+ 431
+ 191
+
+
+
+ Camera parameters
+
+
10
- 140
- 141
+ 40
+ 131
31
- Amplitude
+ Delay
-
-
- true
-
+
- 240
- 140
+ 200
+ 40
131
31
-
- V
-
-
- 10.000000000000000
-
-
- 0.010000000000000
-
-
- 0.180000000000000
+
+ Pulselength
-
+
true
- 310
- 100
+ 70
+ 40
111
31
- V
-
-
- -5.000000000000000
+ %
- 5.000000000000000
+ 100.000000000000000
- 0.010000000000000
+ 0.100000000000000
- 2.560000000000000
+ 10.000000000000000
-
+
true
- 190
- 100
+ 310
+ 40
111
31
- V
-
-
- -5.000000000000000
+ %
- 5.000000000000000
+ 100.000000000000000
- 0.010000000000000
+ 0.100000000000000
- 2.520000000000000
+ 80.000000000000000
-
+
10
- 180
- 131
+ 90
+ 141
31
- Phase
+ Exposure
-
+
true
- 190
- 180
- 111
+ 280
+ 90
+ 141
31
+
+ ms
+
+
+ 3.000000000000000
+
- 360.000000000000000
+ 1000.000000000000000
- 0.010000000000000
+ 1.000000000000000
- 2.520000000000000
+ 20.000000000000000
-
-
- true
-
+
- 310
- 180
- 111
+ 280
+ 130
+ 141
31
-
- 360.000000000000000
-
-
- 0.010000000000000
+
+
+
+
+ 10
+ 130
+ 141
+ 31
+
-
- 2.520000000000000
+
+ Binning
-
-
- true
-
+
450
- 10
+ 500
431
- 301
+ 201
- Tunable lenses
+ Laser pulse
-
-
-
- 190
- 80
- 221
- 41
-
-
-
- For offset & amplitude see
-ETL tab
-
-
-
+
190
@@ -2041,7 +2068,7 @@ ETL tab
Left
-
+
310
@@ -2054,11 +2081,11 @@ ETL tab
Right
-
+
10
- 160
+ 60
131
31
@@ -2067,40 +2094,39 @@ ETL tab
Delay
-
+
+
+ true
+
- 10
- 210
- 161
+ 190
+ 60
+ 111
31
-
- Ramp rising
+
+ %
-
-
-
-
- 10
- 260
- 161
- 31
-
+
+ 100.000000000000000
-
- Ramp falling
+
+ 0.100000000000000
+
+
+ 10.000000000000000
-
+
true
310
- 160
+ 60
111
31
@@ -2118,14 +2144,27 @@ ETL tab
10.000000000000000
-
+
+
+
+ 10
+ 110
+ 161
+ 31
+
+
+
+ Pulselength
+
+
+
true
190
- 160
+ 110
111
31
@@ -2140,17 +2179,17 @@ ETL tab
0.100000000000000
- 10.000000000000000
+ 80.000000000000000
-
+
true
310
- 210
+ 110
111
31
@@ -2165,17 +2204,30 @@ ETL tab
0.100000000000000
- 10.000000000000000
+ 80.000000000000000
-
+
+
+
+ 10
+ 160
+ 181
+ 31
+
+
+
+ Max Amplitude
+
+
+
true
190
- 210
+ 160
111
31
@@ -2190,17 +2242,17 @@ ETL tab
0.100000000000000
- 10.000000000000000
+ 80.000000000000000
-
+
true
310
- 260
+ 160
111
31
@@ -2215,640 +2267,522 @@ ETL tab
0.100000000000000
- 10.000000000000000
+ 80.000000000000000
-
+
+
+
+ true
+
+
+
+ 450
+ 270
+ 431
+ 221
+
+
+
+ Galvo (Shadow reduction)
+
+
+
+
+ 10
+ 30
+ 131
+ 31
+
+
+
+ Frequency
+
+
+
true
- 190
- 260
- 111
+ 240
+ 30
+ 131
31
- %
+ Hz
+
+
+ 3
- 100.000000000000000
+ 400.000000000000000
- 0.100000000000000
+ 0.001000000000000
- 10.000000000000000
+ 2.520000000000000
-
-
-
-
- 10
- 550
- 431
- 151
-
-
-
- Display Subsampling
-
-
+
- 310
- 30
- 111
+ 190
+ 60
+ 91
31
+
+ Left
+
-
+
- 10
- 30
- 191
+ 310
+ 60
+ 91
31
- During Live display:
+ Right
-
+
10
- 70
- 221
+ 100
+ 131
31
- When Snapping Images:
+ Offset
-
+
10
- 110
- 201
+ 140
+ 141
31
- During Acquisitions:
+ Amplitude
-
+
+
+ true
+
- 310
- 70
- 111
+ 240
+ 140
+ 131
31
+
+ V
+
+
+ 10.000000000000000
+
+
+ 0.010000000000000
+
+
+ 0.180000000000000
+
-
+
+
+ true
+
310
- 110
+ 100
111
31
-
- -1
+
+ V
+
+
+ -5.000000000000000
+
+
+ 5.000000000000000
+
+
+ 0.010000000000000
+
+
+ 2.560000000000000
-
-
-
-
- Alignment
-
-
-
-
- 10
- 10
- 361
- 71
-
-
-
-
- 14
- 50
- false
- false
-
-
-
- Run Visual Mode (No ETL Sweep)
-
-
-
-
-
- 10
- 90
- 361
- 71
-
-
-
-
- 14
- 50
- false
- false
-
-
-
- Run Lightsheet Switching Mode
-
-
-
-
-
- -
-
-
-
- 15
-
-
-
- Acquisition Progress
-
-
-
- -
-
-
-
- 15
-
-
-
- Qt::LeftToRight
-
-
- false
-
-
- 0
-
-
- Qt::AlignCenter
-
-
- %p%
-
-
-
- -
-
-
-
- 15
-
-
-
- Total Progress
-
-
-
- -
-
-
-
- 15
-
-
-
- 0
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
-
-
-
-
-
-
-
-
- 14
-
+
+
+ true
+
+
+
+ 190
+ 100
+ 111
+ 31
+
-
- QFrame::NoFrame
+
+ V
-
- QFrame::Plain
+
+ -5.000000000000000
-
- 0
+
+ 5.000000000000000
+
+
+ 0.010000000000000
+
+
+ 2.520000000000000
+
+
+
+
+
+ 10
+ 180
+ 131
+ 31
+
- X
+ Phase
-
- -
-
-
-
- 14
-
+
+
+ true
-
- X
+
+
+ 190
+ 180
+ 111
+ 31
+
-
- 9897
+
+ 360.000000000000000
-
- Qt::AlignCenter
+
+ 0.010000000000000
-
+
+ 2.520000000000000
+
+
+
+
true
+
+
+ 310
+ 180
+ 111
+ 31
+
+
+
+ 360.000000000000000
+
+
+ 0.010000000000000
+
+
+ 2.520000000000000
+
-
- -
-
-
-
- 14
-
+
+
+
+ true
+
+
+
+ 450
+ 10
+ 431
+ 251
+
+
+
+ Tunable lenses
+
+
+
+
+ 190
+ 60
+ 221
+ 41
+
- Y
+ For offset & amplitude see
+ETL tab
-
- -
-
-
-
- 14
-
-
-
- X
+
+
+
+ 190
+ 20
+ 91
+ 31
+
- 9897
+ Left
-
- Qt::AlignCenter
+
+
+
+
+ 310
+ 20
+ 91
+ 31
+
-
- true
+
+ Right
-
- -
-
-
-
- 14
-
+
+
+
+ 10
+ 110
+ 131
+ 31
+
- Z
+ Delay
-
- -
-
-
-
- 14
-
-
-
- X
+
+
+
+ 10
+ 160
+ 161
+ 31
+
- 1557
+ Ramp rising
-
- Qt::AlignCenter
+
+
+
+
+ 10
+ 210
+ 161
+ 31
+
-
+
+ Ramp falling
+
+
+
+
true
+
+
+ 310
+ 110
+ 111
+ 31
+
+
+
+ %
+
+
+ 100.000000000000000
+
+
+ 0.100000000000000
+
+
+ 10.000000000000000
+
-
- -
-
-
-
- 14
-
+
+
+ true
+
+
+
+ 190
+ 110
+ 111
+ 31
+
+
+
+ %
+
+
+ 100.000000000000000
+
+
+ 0.100000000000000
-
- Angle
+
+ 10.000000000000000
-
- -
-
+
true
-
-
- 14
-
-
-
- X
-
-
- 180
+
+
+ 310
+ 160
+ 111
+ 31
+
-
- Qt::AlignCenter
+
+ %
-
- true
+
+ 100.000000000000000
-
-
- -
-
-
-
- 14
-
+
+ 0.100000000000000
-
- Focus
+
+ 10.000000000000000
-
- -
-
-
-
- 14
-
-
-
- X
-
-
- 659
+
+
+ true
-
- Qt::AlignCenter
+
+
+ 190
+ 160
+ 111
+ 31
+
-
- true
+
+ %
-
-
-
-
-
- -
-
-
- true
-
-
-
- 0
- 0
-
-
-
-
- 0
- 150
-
-
-
-
- 16
-
-
-
- Controls
-
-
-
- true
-
-
-
- 10
- 30
- 471
- 51
-
-
-
-
- 14
-
-
-
-
-
- true
-
-
-
- 10
- 90
- 261
- 51
-
-
-
-
- 14
-
-
-
-
-
- true
-
-
-
- 700
- 30
- 191
- 51
-
-
-
-
- 14
-
-
-
-
-
- true
-
-
-
- 490
- 30
- 201
- 51
-
-
-
-
- 14
-
-
-
-
-
-
- 280
- 90
- 611
- 51
-
-
-
- false
-
-
- 100
-
-
- 1
-
-
- false
-
-
- Qt::Horizontal
-
-
- false
-
-
- false
-
-
- QSlider::TicksBothSides
-
-
- 10
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 120
-
-
-
-
-
-
-
-
-
-
-
- 0
- 91
-
+
+ 100.000000000000000
-
-
- 14
- 50
- false
- false
-
+
+ 0.100000000000000
-
- Live
+
+ 10.000000000000000
-
- -
-
+
- false
+ true
-
-
- 0
- 91
-
+
+
+ 310
+ 210
+ 111
+ 31
+
-
-
- 14
- 50
- false
- false
-
+
+ %
-
- Snap
+
+ 100.000000000000000
+
+
+ 0.100000000000000
+
+
+ 10.000000000000000
-
- -
-
+
true
-
-
- 0
- 91
-
+
+
+ 190
+ 210
+ 111
+ 31
+
+
+
+ %
+
+
+ 100.000000000000000
+
+
+ 0.100000000000000
+
+
+ 10.000000000000000
+
+
+
+
+
+
+ 10
+ 310
+ 431
+ 121
+
+
+
+ Snap Directory
+
+
+
+
+ 10
+ 30
+ 81
+ 81
+
@@ -2859,61 +2793,160 @@ ETL tab
- Run
- Selected Acquisition
+ Choose
+ folder
-
- -
-
-
+
+
+
+ 100
+ 30
+ 321
+ 81
+
+
+
+ false
+
+
true
-
-
- 0
- 91
-
+
+
+
+
+
+ 10
+ 440
+ 431
+ 151
+
+
+
+ Display Subsampling
+
+
+
+
+ 310
+ 30
+ 111
+ 31
+
-
-
- 14
- 50
- false
- false
-
+
+
+
+
+ 10
+ 30
+ 191
+ 31
+
- Run
- Acquisition List
+ During Live display:
-
- -
-
-
- false
+
+
+
+ 10
+ 70
+ 221
+ 31
+
-
-
- 0
- 91
-
+
+ When Snapping Images:
-
-
- 14
- 75
- false
- true
-
+
+
+
+
+ 10
+ 110
+ 201
+ 31
+
- STOP
+ During Acquisitions:
-
-
+
+
+
+ 310
+ 70
+ 111
+ 31
+
+
+
+
+
+
+ 310
+ 110
+ 111
+ 31
+
+
+
+ -1
+
+
+
+
+
+
+ Alignment
+
+
+
+
+ 10
+ 10
+ 361
+ 71
+
+
+
+
+ 14
+ 50
+ false
+ false
+
+
+
+ Run Visual Mode (No ETL Sweep)
+
+
+
+
+
+ 10
+ 90
+ 361
+ 71
+
+
+
+
+ 14
+ 50
+ false
+ false
+
+
+
+ Run Lightsheet Switching Mode
+
+
+
diff --git a/mesoSPIM/mesoSPIM_Control.py b/mesoSPIM/mesoSPIM_Control.py
index 11ed42e..533b7c1 100644
--- a/mesoSPIM/mesoSPIM_Control.py
+++ b/mesoSPIM/mesoSPIM_Control.py
@@ -56,12 +56,12 @@ def stage_referencing_check(cfg):
'''
Due to problems with some PI stages loosing reference information
after restarting the mesoSPIM software, some stage configurations require
- a reference movement to be carried out before starting the rest of the softwareself.
+ a reference movement to be carried out before starting the rest of the software.
As reference movements can damage the instrument, this function warns users
about this problem by message boxes and asks them to reach a safe state.
'''
- if cfg.stage_parameters['stage_type'] == 'PI_rotz_and_Galil_xyf':
+ if cfg.stage_parameters['stage_type'] == 'PI_rotzf_and_Galil_xy' or cfg.stage_parameters['stage_type'] == 'PI_rotz_and_Galil_xyf':
warning = QtWidgets.QMessageBox.warning(None,'Sample z reference movement necessary!',
'Please move the XYZ stage to position where a reference z movement (to the midpoint of the movement range) is safe!',
QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Ok)
@@ -85,6 +85,7 @@ def main():
stage_referencing_check(cfg)
ex = mesoSPIM_MainWindow(cfg)
ex.show()
+ ex.display_icons()
sys.exit(app.exec_())
diff --git a/mesoSPIM/scripts/timelapse b/mesoSPIM/scripts/timelapse
new file mode 100644
index 0000000..e1aa13f
--- /dev/null
+++ b/mesoSPIM/scripts/timelapse
@@ -0,0 +1,5 @@
+for i in range(1000):
+ self.snap()
+ print('Image Number: '+str(i))
+ time.sleep(0.25)
+
\ No newline at end of file
diff --git a/mesoSPIM/src/devices/joysticks/logitech.py b/mesoSPIM/src/devices/joysticks/logitech.py
index 4430f27..293552a 100644
--- a/mesoSPIM/src/devices/joysticks/logitech.py
+++ b/mesoSPIM/src/devices/joysticks/logitech.py
@@ -9,8 +9,6 @@
'''
from PyQt5 import QtCore
-import pywinusb.hid as hid
-
class FarmSimulatorSidePanel(QtCore.QObject):
'''
@@ -41,6 +39,9 @@ class FarmSimulatorSidePanel(QtCore.QObject):
def __init__(self):
super().__init__()
+
+ import pywinusb.hid as hid
+
self.hid_filter = hid.HidDeviceFilter(vendor_id = 0x0738, product_id = 0x2218)
self.hid_device = self.hid_filter.get_devices()
self.joystick = self.hid_device[0]
diff --git a/mesoSPIM/src/mesoSPIM_AcquisitionManagerWindow.py b/mesoSPIM/src/mesoSPIM_AcquisitionManagerWindow.py
index 6de1521..40873ce 100644
--- a/mesoSPIM/src/mesoSPIM_AcquisitionManagerWindow.py
+++ b/mesoSPIM/src/mesoSPIM_AcquisitionManagerWindow.py
@@ -4,6 +4,7 @@
'''
import os
import sys
+import time
import logging
logger = logging.getLogger(__name__)
@@ -32,7 +33,14 @@
from .utils.widgets import MarkPositionWidget
from .utils.acquisition_wizards import TilingWizard
+from .utils.multicolor_acquisition_wizard import MulticolorTilingWizard
from .utils.filename_wizard import FilenameWizard
+from .utils.focus_tracking_wizard import FocusTrackingWizard
+from .utils.image_processing_wizard import ImageProcessingWizard
+
+from .utils.utility_functions import convert_seconds_to_string
+
+from .utils.bigdataviewer_xml_creator import mesoSPIM_XMLexporter
class MyStyle(QtWidgets.QProxyStyle):
def drawPrimitive(self, element, option, painter, widget=None):
@@ -52,6 +60,7 @@ class mesoSPIM_AcquisitionManagerWindow(QtWidgets.QWidget):
model_changed = QtCore.pyqtSignal(AcquisitionModel)
sig_warning = QtCore.pyqtSignal(str)
+ sig_move_absolute = QtCore.pyqtSignal(dict)
def __init__(self, parent=None):
super().__init__()
@@ -77,6 +86,7 @@ def __init__(self, parent=None):
self.table.setModel(self.model)
self.model.dataChanged.connect(self.set_state)
+ self.model.dataChanged.connect(self.update_acquisition_time_prediction)
''' Table selection behavior '''
self.table.setSelectionBehavior(self.table.SelectRows)
@@ -96,8 +106,6 @@ def __init__(self, parent=None):
self.selection_model = self.table.selectionModel()
self.selection_mapper = QtWidgets.QDataWidgetMapper()
- self.update_persistent_editors()
-
self.AddButton.clicked.connect(self.add_row)
self.DeleteButton.clicked.connect(self.delete_row)
self.CopyButton.clicked.connect(self.copy_row)
@@ -113,14 +121,25 @@ def __init__(self, parent=None):
self.PreviewSelectionButton.clicked.connect(self.preview_acquisition)
self.TilingWizardButton.clicked.connect(self.run_tiling_wizard)
+ self.FilenameWizardButton.clicked.connect(self.generate_filenames)
+ self.FocusTrackingWizardButton.clicked.connect(self.run_focus_tracking_wizard)
+ self.ImageProcessingWizardButton.clicked.connect(self.run_image_processing_wizard)
self.DeleteAllButton.clicked.connect(self.delete_all_rows)
# self.SetRotationPointButton.clicked.connect(lambda bool: self.set_rotation_point() if bool is True else self.delete_rotation_point())
self.SetFoldersButton.clicked.connect(self.set_folder_names)
- self.FilenameWizardButton.clicked.connect(self.generate_filenames)
+
logger.info('Thread ID at Startup: '+str(int(QtCore.QThread.currentThreadId())))
+ self.selection_model.selectionChanged.connect(self.selected_row_changed)
+
+ ''' Display initial time prediction '''
+ self.update_acquisition_time_prediction()
+
+ '''XML writing testcode'''
+ # self.GenerateXMLButton.clicked.connect(self.generate_xml)
+
def enable(self):
self.setEnabled(True)
@@ -168,11 +187,21 @@ def start_selected(self):
if row is not None:
self.sig_start_selected.emit(row)
else:
- print('No row selected!')
+ self.display_no_row_selected_warning()
+
+ def selected_row_changed(self, new_selection, old_selection):
+ if new_selection.indexes() != []:
+ new_row = new_selection.indexes()[0].row()
+ for column in self.persistent_editor_column_indices:
+ self.table.openPersistentEditor(self.model.index(new_row, column))
+
+ if old_selection.indexes() != []:
+ old_row = old_selection.indexes()[0].row()
+ for column in self.persistent_editor_column_indices:
+ self.table.closePersistentEditor(self.model.index(old_row, column))
def add_row(self):
self.model.insertRows(self.model.rowCount(),1)
- self.update_persistent_editors()
def delete_row(self):
''' Deletes the selected row '''
@@ -181,10 +210,9 @@ def delete_row(self):
if row is not None:
self.model.removeRows(row,1)
else:
- print('No row selected!')
+ self.display_no_row_selected_warning()
else:
- self.display_status_message("Can't delete last row!", 2)
- self.update_persistent_editors()
+ self.display_warning("Can't delete last row!")
def delete_all_rows(self):
'''
@@ -197,15 +225,13 @@ def delete_all_rows(self):
if reply == QtWidgets.QMessageBox.Yes:
self.model.deleteTable()
- self.update_persistent_editors()
def copy_row(self):
row = self.get_first_selected_row()
if row is not None:
self.model.copyRow(row)
- self.update_persistent_editors()
else:
- print('No row selected!')
+ self.display_no_row_selected_warning()
def move_selected_row_up(self):
row = self.get_first_selected_row()
@@ -213,9 +239,8 @@ def move_selected_row_up(self):
if row > 0:
self.model.moveRow(QtCore.QModelIndex(),row,QtCore.QModelIndex(),row-1)
self.set_selected_row(row-1)
- self.update_persistent_editors()
else:
- print('No row selected!')
+ self.display_no_row_selected_warning()
def move_selected_row_down(self):
row = self.get_first_selected_row()
@@ -223,9 +248,8 @@ def move_selected_row_down(self):
if row < self.model.rowCount():
self.model.moveRow(QtCore.QModelIndex(),row,QtCore.QModelIndex(),row+1)
self.set_selected_row(row+1)
- self.update_persistent_editors()
else:
- print('No row selected!')
+ self.display_no_row_selected_warning()
def set_item_delegates(self):
''' Several columns should have certain delegates
@@ -241,7 +265,8 @@ def set_item_delegates(self):
'z_end' : 'MarkZPositionDelegate(self)',
'z_step' : 'ZstepSpinBoxDelegate(self)',
'rot' : 'RotationSpinBoxDelegate(self)',
- 'f_pos' : 'MarkFocusPositionDelegate(self)',
+ 'f_start' : 'MarkFocusPositionDelegate(self)',
+ 'f_end' : 'MarkFocusPositionDelegate(self)',
'filter' : 'ComboDelegate(self,[key for key in self.cfg.filterdict.keys()])',
'intensity' : 'SliderWithValueDelegate(self)',
'laser' : 'ComboDelegate(self,[key for key in self.cfg.laserdict.keys()])',
@@ -271,18 +296,15 @@ def set_item_delegates(self):
self.persistent_editor_column_indices.append(column_index)
exec(string_to_execute)
- def update_persistent_editors(self):
- '''
- Go through all the rows and all necessary columns and
- open persistent editors.
- '''
-
- for row in range(0, self.model.rowCount()):
- for column in self.persistent_editor_column_indices:
- self.table.openPersistentEditor(self.model.index(row, column))
+ def update_acquisition_time_prediction(self):
+ framerate = self.state['current_framerate']
+ total_time = self.state['acq_list'].get_acquisition_time(framerate)
+ self.state['predicted_acq_list_time'] = total_time
+ self.state['remaining_acq_list_time'] = total_time
+ time_string = convert_seconds_to_string(total_time)
+ self.AcquisitionTimeEdit.setText(time_string)
def set_state(self):
- # print('Acq Manager: State Updated')
self.state['acq_list'] = self.model.get_acquisition_list()
def enable_gui(self):
@@ -308,13 +330,19 @@ def load_table(self):
if path:
try:
self.model.loadModel(path)
- self.update_persistent_editors()
self.set_state()
+ self.update_acquisition_time_prediction()
except:
self.sig_warning.emit('Table cannot be loaded - incompatible file format (Probably created by a previous version of the mesoSPIM software)!')
def run_tiling_wizard(self):
- wizard = TilingWizard(self)
+ wizard = MulticolorTilingWizard(self)
+
+ def run_focus_tracking_wizard(self):
+ wizard = FocusTrackingWizard(self)
+
+ def run_image_processing_wizard(self):
+ wizard = ImageProcessingWizard(self)
def mark_current_xy_position(self):
row = self.get_first_selected_row()
@@ -323,7 +351,11 @@ def mark_current_xy_position(self):
self.model.setDataFromState(row, 'x_pos')
self.model.setDataFromState(row, 'y_pos')
else:
- print('No row selected!')
+ if self.model.rowCount() == 1:
+ self.set_selected_row(0)
+ self.mark_current_xy_position()
+ else:
+ self.display_no_row_selected_warning()
def mark_current_state(self):
row = self.get_first_selected_row()
@@ -335,7 +367,11 @@ def mark_current_state(self):
self.model.setDataFromState(row, 'intensity')
self.model.setDataFromState(row, 'shutterconfig')
else:
- print('No row selected!')
+ if self.model.rowCount() == 1:
+ self.set_selected_row(0)
+ self.mark_current_state()
+ else:
+ self.display_no_row_selected_warning()
def mark_current_etl_parameters(self):
row = self.get_first_selected_row()
@@ -346,28 +382,65 @@ def mark_current_etl_parameters(self):
self.model.setDataFromState(row, 'etl_r_offset')
self.model.setDataFromState(row, 'etl_r_amplitude')
else:
- print('No row selected!')
+ if self.model.rowCount() == 1:
+ self.set_selected_row(0)
+ self.mark_current_etl_parameters()
+ else:
+ self.display_no_row_selected_warning()
def mark_current_focus(self):
+ ''' Marks both foci start focus '''
row = self.get_first_selected_row()
if row is not None:
- self.model.setDataFromState(row, 'f_pos')
-
+ f_pos = self.state['position']['f_pos']
+ ''' Set f_start and f_end to the same values '''
+ column_index0 = self.model._table[0].keys().index('f_start')
+ index0 = self.model.createIndex(row, column_index0)
+ column_index1 = self.model._table[0].keys().index('f_end')
+ index1 = self.model.createIndex(row, column_index1)
+
+ self.model.setData(index0, f_pos)
+ self.model.setData(index1, f_pos)
+
+ else:
+ if self.model.rowCount() == 1:
+ self.set_selected_row(0)
+ self.mark_current_focus()
+ else:
+ self.display_no_row_selected_warning()
+
def mark_current_rotation(self):
row = self.get_first_selected_row()
if row is not None:
self.model.setDataFromState(row, 'rot')
+ else:
+ if self.model.rowCount() == 1:
+ self.set_selected_row(0)
+ self.mark_current_rotation()
+ else:
+ self.display_no_row_selected_warning()
+
def preview_acquisition(self):
row = self.get_first_selected_row()
# print('selected row:', row)
if row is not None:
self.state['selected_row'] = row
- self.parent.sig_state_request.emit({'state':'preview_acquisition'})
+ # Check if the z position should be updated
+ if self.PreviewZCheckBox.checkState():
+ # print('Checkbox checked')
+ self.parent.sig_state_request.emit({'state':'preview_acquisition_with_z_update'})
+ else:
+ # print('Checkbox not checked')
+ self.parent.sig_state_request.emit({'state':'preview_acquisition_without_z_update'})
else:
- print('No row selected!')
+ if self.model.rowCount() == 1:
+ self.set_selected_row(0)
+ self.preview_acquisition()
+ else:
+ self.display_no_row_selected_warning()
def set_folder_names(self):
path = QtWidgets.QFileDialog.getExistingDirectory(self.parent, 'Select Folder')
@@ -380,21 +453,23 @@ def set_folder_names(self):
def generate_filenames(self):
wizard = FilenameWizard(self)
- # def set_rotation_point(self):
- # '''
- # Take current position and turn it into an rotation point
- # '''
- # pos_dict = self.state['position']
+ def display_no_row_selected_warning(self):
+ self.display_warning('No row selected!')
+
+ def display_warning(self, string):
+ warning = QtWidgets.QMessageBox.warning(None,'mesoSPIM Warning',
+ string, QtWidgets.QMessageBox.Ok)
- # rotation_point_dict = {'x_abs' : pos_dict['x_pos'],
- # 'y_abs' : pos_dict['y_pos'],
- # 'z_abs' : pos_dict['z_pos'],
- # }
+ def generate_xml(self):
+ print('generating BDV XML')
- # self.model._table.set_rotation_point(rotation_point_dict)
+ timestr = time.strftime("%Y%m%d-%H%M%S")
+ filename = timestr + '.xml'
+
+ path = self.state['acq_list'][0]['folder']+'/'+filename
+
+ xml_exporter = mesoSPIM_XMLexporter(self)
+ xml_exporter.generate_xml_from_acqlist(self.state['acq_list'],path)
- # print(rotation_point_dict)
- # def delete_rotation_point(self):
- # self.model._table.delete_rotation_point()
diff --git a/mesoSPIM/src/mesoSPIM_Camera.py b/mesoSPIM/src/mesoSPIM_Camera.py
index 6f02039..49c1a48 100644
--- a/mesoSPIM/src/mesoSPIM_Camera.py
+++ b/mesoSPIM/src/mesoSPIM_Camera.py
@@ -5,29 +5,27 @@
import time
import numpy as np
+import tifffile
+
import logging
logger = logging.getLogger(__name__)
from PyQt5 import QtCore, QtWidgets, QtGui
-
-from .devices.cameras.Demo_Camera import Demo_Camera
-
+'''
try:
from .devices.cameras.hamamatsu import hamamatsu_camera as cam
except:
- pass
-
+ logger.info('Error: Hamamatsu camera could not be imported')
+'''
from .mesoSPIM_State import mesoSPIM_StateSingleton
from .utils.acquisitions import AcquisitionList, Acquisition
-class mesoSPIM_HamamatsuCamera(QtCore.QObject):
- # sig_camera_status = QtCore.pyqtSignal(str)
+class mesoSPIM_Camera(QtCore.QObject):
+ '''Top-level class for all cameras'''
sig_camera_frame = QtCore.pyqtSignal(np.ndarray)
sig_finished = QtCore.pyqtSignal()
-
sig_update_gui_from_state = QtCore.pyqtSignal(bool)
-
- sig_state_updated = QtCore.pyqtSignal()
+ sig_status_message = QtCore.pyqtSignal(str)
def __init__(self, parent = None):
super().__init__()
@@ -44,11 +42,18 @@ def __init__(self, parent = None):
self.x_pixel_size_in_microns = self.cfg.camera_parameters['x_pixel_size_in_microns']
self.y_pixel_size_in_microns = self.cfg.camera_parameters['y_pixel_size_in_microns']
+ self.binning_string = self.cfg.camera_parameters['binning'] # Should return a string in the form '2x4'
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+
+ self.x_pixels = int(self.x_pixels / self.x_binning)
+ self.y_pixels = int(self.y_pixels / self.y_binning)
+
self.camera_line_interval = self.cfg.startup['camera_line_interval']
self.camera_exposure_time = self.cfg.startup['camera_exposure_time']
self.camera_display_live_subsampling = self.cfg.startup['camera_display_live_subsampling']
- self.camera_display_snap_subsampling = self.cfg.startup['camera_display_snap_subsampling']
+ self.camera_display_snap_subsampling = self.cfg.startup['camera_display_snap_subsampling']
self.camera_display_acquisition_subsampling = self.cfg.startup['camera_display_acquisition_subsampling']
''' Wiring signals '''
@@ -61,43 +66,24 @@ def __init__(self, parent = None):
self.parent.sig_prepare_live.connect(self.prepare_live, type = 3)
self.parent.sig_get_live_image.connect(self.get_live_image)
+ self.parent.sig_get_snap_image.connect(self.snap_image)
self.parent.sig_end_live.connect(self.end_live, type=3)
- # self.sig_camera_status.connect(lambda status: print(status))
-
- ''' Hamamatsu-specific code '''
- self.camera_id = self.cfg.camera_parameters['camera_id']
-
- if self.cfg.camera == 'HamamatsuOrcaFlash':
- self.hcam = cam.HamamatsuCameraMR(camera_id=self.camera_id)
- ''' Debbuging information '''
- logger.info(f'Hamamatsu Camera model: {self.hcam.getModelInfo(self.camera_id)}')
- #print("camera 0 model:", self.hcam.getModelInfo(self.camera_id))
-
- ''' Ideally, the Hamamatsu Camera properties should be set in this order '''
- ''' mesoSPIM mode parameters '''
- self.hcam.setPropertyValue("sensor_mode", self.cfg.camera_parameters['sensor_mode'])
-
- ''' mesoSPIM mode parameters: OLD '''
- # self.hcam.setPropertyValue("sensor_mode", 12) # 12 for progressive
-
- self.hcam.setPropertyValue("defect_correct_mode", self.cfg.camera_parameters['defect_correct_mode'])
- self.hcam.setPropertyValue("exposure_time", self.camera_exposure_time)
- self.hcam.setPropertyValue("binning", self.cfg.camera_parameters['binning'])
- self.hcam.setPropertyValue("readout_speed", self.cfg.camera_parameters['readout_speed'])
+ ''' Set up the camera '''
+ if self.cfg.camera == 'HamamatsuOrca':
+ self.camera = mesoSPIM_HamamatsuCamera(self)
+ elif self.cfg.camera == 'PhotometricsIris15':
+ self.camera = mesoSPIM_PhotometricsCamera(self)
+ elif self.cfg.camera == 'DemoCamera':
+ self.camera = mesoSPIM_DemoCamera(self)
- self.hcam.setPropertyValue("trigger_active", self.cfg.camera_parameters['trigger_active'])
- self.hcam.setPropertyValue("trigger_mode", self.cfg.camera_parameters['trigger_mode']) # it is unclear if this is the external lightsheeet mode - how to check this?
- self.hcam.setPropertyValue("trigger_polarity", self.cfg.camera_parameters['trigger_polarity']) # positive pulse
- self.hcam.setPropertyValue("trigger_source", self.cfg.camera_parameters['trigger_source']) # external
- self.hcam.setPropertyValue("internal_line_interval",self.camera_line_interval)
- elif self.cfg.camera == 'Demo':
- self.hcam = Demo_Camera()
-
- logger.info('Thread ID at Startup: '+str(int(QtCore.QThread.currentThreadId())))
+ self.camera.open_camera()
def __del__(self):
- self.hcam.shutdown()
+ try:
+ self.camera.close_camera()
+ except Exception as error:
+ logger.info('Error while closing the camera:', str(error))
@QtCore.pyqtSlot(dict)
def state_request_handler(self, dict):
@@ -112,25 +98,15 @@ def state_request_handler(self, dict):
'state',
'camera_display_live_subsampling',
'camera_display_snap_subsampling',
- 'camera_display_acquisition_subsampling'):
+ 'camera_display_acquisition_subsampling',
+ 'camera_binning'):
exec('self.set_'+key+'(value)')
# Log Thread ID during Live: just debugging code
elif key == 'state':
if value == 'live':
logger.info('Thread ID during live: '+str(int(QtCore.QThread.currentThreadId())))
- def set_state(self, requested_state):
- pass
-
- # if requested_state == ('live' or 'run_selected_acquisition' or 'run_acquisition_list'):
- # self.live()
- # elif requested_state == 'idle':
- # self.stop()
-
- def open(self):
- pass
-
- def close(self):
+ def set_state(self, value):
pass
@QtCore.pyqtSlot()
@@ -145,8 +121,8 @@ def set_camera_exposure_time(self, time):
Args:
time (float): exposure time to set
'''
+ self.camera.set_exposure_time(time)
self.camera_exposure_time = time
- self.hcam.setPropertyValue("exposure_time", time)
self.sig_update_gui_from_state.emit(True)
self.state['camera_exposure_time'] = time
self.sig_update_gui_from_state.emit(False)
@@ -158,8 +134,8 @@ def set_camera_line_interval(self, time):
Args:
time (float): interval time to set
'''
+ self.camera.set_line_interval(time)
self.camera_line_interval = time
- self.hcam.setPropertyValue("internal_line_interval",self.camera_line_interval)
self.sig_update_gui_from_state.emit(True)
self.state['camera_line_interval'] = time
self.sig_update_gui_from_state.emit(False)
@@ -168,11 +144,14 @@ def set_camera_display_live_subsampling(self, factor):
self.camera_display_live_subsampling = factor
def set_camera_display_snap_subsampling(self, factor):
- self.camera_display_snap_subsampling = factor
+ self.camera_display_snap_subsampling = factor
def set_camera_display_acquisition_subsampling(self, factor):
self.camera_display_acquisition_subsampling = factor
-
+
+ def set_camera_binning(self, value):
+ self.camera.set_binning(value)
+
@QtCore.pyqtSlot(Acquisition)
def prepare_image_series(self, acq):
'''
@@ -184,25 +163,25 @@ def prepare_image_series(self, acq):
''' TODO: Needs cam delay, sweeptime, QTimer, line delay, exp_time '''
- self.path = acq['folder']+'/'+acq['filename']
-
+ self.folder = acq['folder']
+ self.filename = acq['filename']
+ self.path = self.folder+'/'+self.filename
+
logger.info(f'Camera: Save path: {self.path}')
self.z_start = acq['z_start']
self.z_end = acq['z_end']
self.z_stepsize = acq['z_step']
self.max_frame = acq.get_image_count()
- self.fsize = 2048*2048
+ self.processing_options_string = acq['processing']
+
+ self.fsize = self.x_pixels*self.y_pixels
self.xy_stack = np.memmap(self.path, mode = "write", dtype = np.uint16, shape = self.fsize * self.max_frame)
- # self.xy_stack_tif = tf.memmap(tif_filename, shape=(self.max_frame, 2048, 2048), dtype = np.uint16)
- # self.xz_stack = np.memmap(self.path[:-4]+'xz.raw', mode = "write", dtype = np.uint16, shape = 2048 * self.max_frame * 2048)
- # self.yz_stack = np.memmap(self.path[:-4]+'yz.raw', mode = "write", dtype = np.uint16, shape = 2048 * self.max_frame * 2048)
- self.hcam.startAcquisition()
+ self.camera.initialize_image_series()
self.cur_image = 0
logger.info(f'Camera: Finished Preparing Image Series')
- #print('Cam: Finished Preparing Image Series')
self.start_time = time.time()
@QtCore.pyqtSlot()
@@ -210,78 +189,63 @@ def add_images_to_series(self):
if self.cur_image == 0:
logger.info('Thread ID during add images: '+str(int(QtCore.QThread.currentThreadId())))
- # QtWidgets.QApplication.processEvents(QtCore.QEventLoop.AllEvents, 1)
if self.stopflag is False:
- # print('Camera: Adding images started')
- if self.cur_image + 1 < self.max_frame:
- [frames, dims] = self.hcam.getFrames()
-
- # for aframe in frames:
-
- # image = aframe.getData()
- # self.xy_stack[self.cur_image*self.fsize:(self.cur_image+1)*self.fsize] = image
-
- # image = np.reshape(image, (-1, 2048))
- # # image = np.rot90(image)
- # self.sig_camera_frame.emit(image)
- # # ''' Creating a 512x512 subimage '''
- # # if self.cur_image % 20 == 0:
- # # subimage = image[0:2048:4,0:2048:4]
- # # self.sig_camera_frame.emit(subimage)
- # # image = image.flatten()
- # print('Done with image: #', self.cur_image)
- # self.cur_image += 1
- num_frames = len(frames)
- for aframe in frames:
-
- image = aframe.getData()
-
- image = np.reshape(image, (-1, 2048))
+ if self.cur_image < self.max_frame:
+ # logger.info('self.cur_image + 1: '+str(self.cur_image + 1))
+ images = self.camera.get_images_in_series()
+ for image in images:
image = np.rot90(image)
-
- # if (num_frames == 1) and (self.cur_image % 2 == 0):
- # subimage = image[0:2048:4,0:2048:4]
- # self.sig_camera_frame.emit(subimage)
-
- self.sig_camera_frame.emit(image[0:2048:self.camera_display_acquisition_subsampling,0:2048:self.camera_display_acquisition_subsampling])
+ self.sig_camera_frame.emit(image[0:self.x_pixels:self.camera_display_acquisition_subsampling,0:self.y_pixels:self.camera_display_acquisition_subsampling])
image = image.flatten()
self.xy_stack[self.cur_image*self.fsize:(self.cur_image+1)*self.fsize] = image
-
- #print('Done with image: #', self.cur_image)
self.cur_image += 1
- #print('Camera: Adding images ended')
- else:
- pass
- #print('Camera: Acquisition stop requested...')
-
@QtCore.pyqtSlot()
def end_image_series(self):
+ if self.stopflag is False:
+ if self.processing_options_string != '':
+ if self.processing_options_string == 'MAX':
+ self.sig_status_message.emit('Doing Max Projection')
+ logger.info('Camera: Started Max Projection of '+str(self.max_frame)+' Images')
+ stackview = self.xy_stack.view()
+ stackview.shape = (self.max_frame, self.x_pixels, self.y_pixels)
+ max_proj = np.max(stackview, axis=0)
+ filename = 'MAX_' +self.filename + '.tif'
+ path = self.folder+'/'+filename
+ tifffile.imsave(path, max_proj, photometric='minisblack')
+ logger.info('Camera: Saved Max Projection')
+ self.sig_status_message.emit('Done with image processing')
+
try:
- self.hcam.stopAcquisition()
+ self.camera.close_image_series()
del self.xy_stack
- #print('Acq finished')
- #print("Saved", self.cur_image + 1, "frames")
except:
pass
- #print('Camera: Error when finishing acquisition.')
self.end_time = time.time()
framerate = (self.cur_image + 1)/(self.end_time - self.start_time)
logger.info(f'Camera: Framerate: {framerate}')
- #print('Framerate: ', framerate)
self.sig_finished.emit()
@QtCore.pyqtSlot()
def snap_image(self):
- pass
+ image = self.camera.get_image()
+ image = np.rot90(image)
+
+ timestr = time.strftime("%Y%m%d-%H%M%S")
+ filename = timestr + '.tif'
+
+ path = self.state['snap_folder']+'/'+filename
+
+ self.sig_camera_frame.emit(image[0:self.x_pixels:self.camera_display_snap_subsampling,0:self.y_pixels:self.camera_display_snap_subsampling])
+
+ tifffile.imsave(path, image, photometric='minisblack')
@QtCore.pyqtSlot()
def prepare_live(self):
- self.hcam.setACQMode(mode = "run_till_abort")
- self.hcam.startAcquisition()
+ self.camera.initialize_live_mode()
- self.live_image_count = 0
+ self.live_image_count = 0
self.start_time = time.time()
logger.info('Camera: Preparing Live Mode')
@@ -289,25 +253,353 @@ def prepare_live(self):
@QtCore.pyqtSlot()
def get_live_image(self):
- [frames, _] = self.hcam.getFrames()
+ images = self.camera.get_live_image()
- for aframe in frames:
- image = aframe.getData()
- image = np.reshape(image, (-1, 2048))
+ for image in images:
image = np.rot90(image)
- self.sig_camera_frame.emit(image[0:2048:self.camera_display_live_subsampling,0:2048:self.camera_display_live_subsampling])
+ self.sig_camera_frame.emit(image[0:self.x_pixels:self.camera_display_live_subsampling,0:self.y_pixels:self.camera_display_live_subsampling])
self.live_image_count += 1
#self.sig_camera_status.emit(str(self.live_image_count))
@QtCore.pyqtSlot()
- def end_live(self):
- self.hcam.stopAcquisition()
+ def end_live(self):
+ self.camera.close_live_mode()
self.end_time = time.time()
framerate = (self.live_image_count + 1)/(self.end_time - self.start_time)
logger.info(f'Camera: Finished Live Mode: Framerate: {framerate}')
+
+class mesoSPIM_GenericCamera(QtCore.QObject):
+ ''' Generic mesoSPIM camera class meant for subclassing.'''
+
+ def __init__(self, parent = None):
+ super().__init__()
+ self.parent = parent
+ self.cfg = parent.cfg
+
+ self.state = mesoSPIM_StateSingleton()
+
+ self.stopflag = False
+
+ self.x_pixels = self.cfg.camera_parameters['x_pixels']
+ self.y_pixels = self.cfg.camera_parameters['y_pixels']
+ self.x_pixel_size_in_microns = self.cfg.camera_parameters['x_pixel_size_in_microns']
+ self.y_pixel_size_in_microns = self.cfg.camera_parameters['y_pixel_size_in_microns']
+
+ self.binning_string = self.cfg.camera_parameters['binning'] # Should return a string in the form '2x4'
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+
+ self.x_pixels = int(self.x_pixels / self.x_binning)
+ self.y_pixels = int(self.y_pixels / self.y_binning)
+
+ self.camera_line_interval = self.cfg.startup['camera_line_interval']
+ self.camera_exposure_time = self.cfg.startup['camera_exposure_time']
+
+ def open_camera(self):
+ pass
+
+ def close_camera(self):
+ pass
+
+ def set_exposure_time(self, time):
+ self.camera_exposure_time = time
+
+ def set_line_interval(self, time):
+ pass
+
+ def set_binning(self, binning_string):
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+ self.x_pixels = int(self.x_pixels / self.x_binning)
+ self.y_pixels = int(self.y_pixels / self.y_binning)
+
+ def initialize_image_series(self):
+ pass
+
+ def get_images_in_series(self):
+ '''Should return a single numpy array'''
+ pass
+
+ def close_image_series(self):
+ pass
+
+ def get_image(self):
+ '''Should return a single numpy array'''
+ pass
+
+ def initialize_live_mode(self):
+ pass
+
+ def get_live_image(self):
+ pass
+
+ def close_live_mode(self):
+ pass
+
+class mesoSPIM_DemoCamera(mesoSPIM_GenericCamera):
+
+ def __init__(self, parent = None):
+ super().__init__(parent)
+
+ self.line = np.linspace(0,6*np.pi,self.x_pixels)
+ self.line = 400*np.sin(self.line)+1200
+
+ self.count = 0
+
+ def open_camera(self):
+ logger.info('Initialized Demo Camera')
+
+ def close_camera(self):
+ logger.info('Closed Demo Camera')
+
+ def set_binning(self, binning_string):
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+ self.x_pixels = int(self.x_pixels / self.x_binning)
+ self.y_pixels = int(self.y_pixels / self.y_binning)
+ self.line = np.linspace(0,6*np.pi,self.x_pixels)
+ self.line = 400*np.sin(self.line)+1200
+
+ def _create_random_image(self):
+ data = np.array([np.roll(self.line, 4*i+self.count) for i in range(0, self.y_pixels)], dtype='uint16')
+ data = data + (np.random.normal(size=(self.x_pixels, self.y_pixels))*100)
+ data = np.around(data).astype('uint16')
+ self.count += 20
+ return data
+
+ # return np.random.randint(low=0, high=2**16, size=(self.x_pixels,self.y_pixels), dtype='l')
+
+ def get_images_in_series(self):
+ return [self._create_random_image()]
+
+ def get_image(self):
+ return self._create_random_image()
+
+ def get_live_image(self):
+ return [self._create_random_image()]
+
+class mesoSPIM_HamamatsuCamera(mesoSPIM_GenericCamera):
+ def __init__(self, parent = None):
+ super().__init__(parent)
+ logger.info('Thread ID at Startup: '+str(int(QtCore.QThread.currentThreadId())))
+
+ def open_camera(self):
+ ''' Hamamatsu-specific code '''
+ self.camera_id = self.cfg.camera_parameters['camera_id']
+
+ from .devices.cameras.hamamatsu import hamamatsu_camera as cam
+ # if self.cfg.camera == 'HamamatsuOrca':
+ self.hcam = cam.HamamatsuCameraMR(camera_id=self.camera_id)
+ ''' Debbuging information '''
+ logger.info(f'Initialized Hamamatsu camera model: {self.hcam.getModelInfo(self.camera_id)}')
+
+ ''' Ideally, the Hamamatsu Camera properties should be set in this order '''
+ ''' mesoSPIM mode parameters '''
+ self.hcam.setPropertyValue("sensor_mode", self.cfg.camera_parameters['sensor_mode'])
+
+ self.hcam.setPropertyValue("defect_correct_mode", self.cfg.camera_parameters['defect_correct_mode'])
+ self.hcam.setPropertyValue("exposure_time", self.camera_exposure_time)
+ self.hcam.setPropertyValue("binning", self.cfg.camera_parameters['binning'])
+ self.hcam.setPropertyValue("readout_speed", self.cfg.camera_parameters['readout_speed'])
+
+ self.hcam.setPropertyValue("trigger_active", self.cfg.camera_parameters['trigger_active'])
+ self.hcam.setPropertyValue("trigger_mode", self.cfg.camera_parameters['trigger_mode']) # it is unclear if this is the external lightsheeet mode - how to check this?
+ self.hcam.setPropertyValue("trigger_polarity", self.cfg.camera_parameters['trigger_polarity']) # positive pulse
+ self.hcam.setPropertyValue("trigger_source", self.cfg.camera_parameters['trigger_source']) # external
+ self.hcam.setPropertyValue("internal_line_interval",self.camera_line_interval)
+
+ def close_camera(self):
+ self.hcam.shutdown()
+
+ def set_camera_sensor_mode(self, mode):
+ if mode == 'Area':
+ self.hcam.setPropertyValue("sensor_mode", 1)
+ elif mode == 'ASLM':
+ self.hcam.setPropertyValue("sensor_mode", 12)
+ else:
+ print('Camera mode not supported')
+
+ def set_exposure_time(self, time):
+ self.hcam.setPropertyValue("exposure_time", time)
+
+ def set_line_interval(self, time):
+ self.hcam.setPropertyValue("internal_line_interval",self.camera_line_interval)
+
+ def set_binning(self, binningstring):
+ self.hcam.setPropertyValue("binning", binningstring)
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+ self.x_pixels = int(self.x_pixels / self.x_binning)
+ self.y_pixels = int(self.y_pixels / self.y_binning)
+
+ def initialize_image_series(self):
+ self.hcam.startAcquisition()
+
+ def get_images_in_series(self):
+ [frames, _] = self.hcam.getFrames()
+ images = [np.reshape(aframe.getData(), (-1,self.x_pixels)) for aframe in frames]
+ return images
+
+ def close_image_series(self):
+ self.hcam.stopAcquisition()
+
+ def get_image(self):
+ [frames, _] = self.hcam.getFrames()
+ images = [np.reshape(aframe.getData(), (-1,self.x_pixels)) for aframe in frames]
+ return images[0]
+
+ def initialize_live_mode(self):
+ self.hcam.setACQMode(mode = "run_till_abort")
+ self.hcam.startAcquisition()
+
+ def get_live_image(self):
+ [frames, _] = self.hcam.getFrames()
+ images = [np.reshape(aframe.getData(), (-1,self.x_pixels)) for aframe in frames]
+ return images
+
+ def close_live_mode(self):
+ self.hcam.stopAcquisition()
+
+class mesoSPIM_PhotometricsCamera(mesoSPIM_GenericCamera):
+ def __init__(self, parent = None):
+ super().__init__(parent)
+ logger.info('Thread ID at Startup: '+str(int(QtCore.QThread.currentThreadId())))
+
+ def open_camera(self):
+ from pyvcam import pvc
+ from pyvcam import constants as const
+ from pyvcam.camera import Camera
+
+ self.const = const
+ self.pvc = pvc
+
+ pvc.init_pvcam()
+ self.pvcam = [cam for cam in Camera.detect_camera()][0]
+
+ self.pvcam.open()
+ self.pvcam.speed_table_index = self.cfg.camera_parameters['speed_table_index']
+ self.pvcam.exp_mode = self.cfg.camera_parameters['exp_mode']
+
+ logger.info('Camera Vendor Name: '+str(self.pvcam.get_param(param_id = self.const.PARAM_VENDOR_NAME)))
+ logger.info('Camera Product Name: '+str(self.pvcam.get_param(param_id = self.const.PARAM_PRODUCT_NAME)))
+ logger.info('Camera Chip Name: '+str(self.pvcam.get_param(param_id = self.const.PARAM_CHIP_NAME)))
+ logger.info('Camera System Name: '+str(self.pvcam.get_param(param_id = self.const.PARAM_SYSTEM_NAME)))
+
+ # Exposure mode options: {'Internal Trigger': 1792, 'Edge Trigger': 2304, 'Trigger first': 2048}
+ # self.pvcam.set_param(param_id = self.const.PARAM_EXPOSURE_MODE, value = 2304)
+
+ # Exposure out mode options: {'First Row': 0, 'All Rows': 1, 'Any Row': 2, 'Rolling Shutter': 3, 'Line Output': 4}
+ # self.pvcam.set_param(param_id = self.const.PARAM_EXPOSE_OUT_MODE, value = 3)
+
+ ''' Setting ASLM parameters '''
+ # Scan mode options: {'Auto': 0, 'Line Delay': 1, 'Scan Width': 2}
+ self.pvcam.set_param(param_id = self.const.PARAM_SCAN_MODE, value = self.cfg.camera_parameters['scan_mode'])
+ # Scan direction options: {'Down': 0, 'Up': 1, 'Down/Up Alternate': 2}
+ self.pvcam.set_param(param_id = self.const.PARAM_SCAN_DIRECTION, value = self.cfg.camera_parameters['scan_direction'])
+ # 10.26 us x factor
+ # factor = 6 equals 71.82 us
+ self.pvcam.set_param(param_id = self.const.PARAM_SCAN_LINE_DELAY, value = self.cfg.camera_parameters['scan_line_delay'])
+ self.pvcam.set_param(param_id = self.const.PARAM_READOUT_PORT, value = 1)
+ ''' Setting Binning parameters: '''
+ '''
+ self.binning_string = self.cfg.camera_parameters['binning'] # Should return a string in the form '2x4'
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+ '''
+ self.pvcam.binning = (self.x_binning, self.y_binning)
+
+ #self.pvcam.set_param(param_id = self.const.PARAM_BINNING_PAR, value = self.y_binning)
+ #self.pvcam.set_param(param_id = self.const.PARAM_BINNING_SER, value = self.x_binning)
+
+ # print('Readout port: ', self.pvcam.readout_port)
+ """
+ self.report_pvcam_parameter('PMODE',self.const.PARAM_PMODE)
+ self.report_pvcam_parameter('GAIN_INDEX',self.const.PARAM_GAIN_INDEX)
+ self.report_pvcam_parameter('GAIN_NAME',self.const.PARAM_GAIN_NAME)
+ self.report_pvcam_parameter('READOUT PORT',self.const.PARAM_READOUT_PORT)
+ self.report_pvcam_parameter('READOUT TIME',self.const.PARAM_READOUT_TIME)
+ self.report_pvcam_parameter('IMAGE FORMAT', self.const.PARAM_IMAGE_FORMAT)
+ self.report_pvcam_parameter('SPEED TABLE INDEX', self.const.PARAM_SPDTAB_INDEX)
+ self.report_pvcam_parameter('BIT DEPTH', self.const.PARAM_BIT_DEPTH)
+
+
+ logger.info('P Mode: '+str(self.pvcam.get_param(param_id = self.const.PARAM_PMODE)))
+ logger.info('P Mode options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_PMODE)))
+ logger.info('Bit depth: '+str(self.pvcam.get_param(param_id = self.const.PARAM_BIT_DEPTH)))
+ logger.info('Exposure time resolution: '+str(self.pvcam.get_param(param_id = self.const.PARAM_EXP_RES)))
+ logger.info('Exposure time resolution options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_EXP_RES)))
+ logger.info('Exposure mode: '+str(self.pvcam.get_param(param_id = self.const.PARAM_EXPOSURE_MODE)))
+ logger.info('Exposure mode options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_EXPOSURE_MODE)))
+ logger.info('Exposure out mode: '+str(self.pvcam.get_param(param_id = self.const.PARAM_EXPOSE_OUT_MODE)))
+ logger.info('Exposure out mode options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_EXPOSE_OUT_MODE)))
+ logger.info('Scan mode: '+str(self.pvcam.get_param(param_id = self.const.PARAM_SCAN_MODE)))
+ logger.info('Scan mode options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_SCAN_MODE)))
+ logger.info('Scan direction: '+str(self.pvcam.get_param(param_id = self.const.PARAM_SCAN_DIRECTION)))
+ logger.info('Scan direction options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_SCAN_DIRECTION)))
+ logger.info('Line delay: '+str(self.pvcam.get_param(param_id = self.const.PARAM_SCAN_LINE_DELAY)))
+ logger.info('Line time: '+str(self.pvcam.get_param(param_id = self.const.PARAM_SCAN_LINE_TIME)))
+ logger.info('Binning SER: '+str(self.pvcam.get_param(param_id = self.const.PARAM_BINNING_SER)))
+ logger.info('Binning SER options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_BINNING_SER)))
+ logger.info('Binning PAR: '+str(self.pvcam.get_param(param_id = self.const.PARAM_BINNING_PAR)))
+ logger.info('Binning PAR options: '+str(self.pvcam.read_enum(param_id = self.const.PARAM_BINNING_PAR)))
+ """
+
+ def report_pvcam_parameter(self, description, parameter):
+ try:
+ logger.info(description+' '+str(self.pvcam.get_param(param_id = parameter)))
+ print(description+' '+str(self.pvcam.get_param(param_id = parameter)))
+ except:
+ pass
+
+ try:
+ logger.info(description+' '+str(self.pvcam.read_enum(param_id = parameter)))
+ print(description+' '+str(str(self.pvcam.read_enum(param_id = parameter))))
+ except:
+ pass
+
+ def close_camera(self):
+ self.pvcam.close()
+ self.pvc.uninit_pvcam()
+
+ def set_exposure_time(self, time):
+ self.camera_exposure_time = time
+
+ def set_line_interval(self, time):
+ print('Setting line interval is not implemented, set the interval in the config file')
+
+ def set_binning(self, binningstring):
+ self.x_binning = int(self.binning_string[0])
+ self.y_binning = int(self.binning_string[2])
+ self.x_pixels = int(self.x_pixels / self.x_binning)
+ self.y_pixels = int(self.y_pixels / self.y_binning)
+ self.pvcam.binning = (self.x_binning, self.y_binning)
+
+ def get_image(self):
+ return self.pvcam.get_live_frame()
+
+ def initialize_image_series(self):
+ ''' The Photometrics cameras expect integer exposure times, otherwise they default to the minimum value '''
+ exp_time_ms = int(self.camera_exposure_time * 1000)
+ self.pvcam.start_live(exp_time_ms)
+
+ def get_images_in_series(self):
+ return [self.pvcam.get_live_frame()]
+
+ def close_image_series(self):
+ self.pvcam.stop_live()
+
+ def initialize_live_mode(self):
+ ''' The Photometrics cameras expect integer exposure times, otherwise they default to the minimum value '''
+ exp_time_ms = int(self.camera_exposure_time * 1000)
+ # logger.info('Initializing live mode with exp time: '+str(exp_time_ms))
+ self.pvcam.start_live(exp_time_ms)
+
+ def get_live_image(self):
+ return [self.pvcam.get_live_frame()]
+
+ def close_live_mode(self):
+ self.pvcam.stop_live()
-# class mesoSPIM_DemoCamera(mesoSPIM_Camera):
-# def __init__(self, config, parent = None):
-# super().__init__(config, parent)
+
\ No newline at end of file
diff --git a/mesoSPIM/src/mesoSPIM_CameraWindow.py b/mesoSPIM/src/mesoSPIM_CameraWindow.py
index 105dd66..b20fff8 100644
--- a/mesoSPIM/src/mesoSPIM_CameraWindow.py
+++ b/mesoSPIM/src/mesoSPIM_CameraWindow.py
@@ -44,6 +44,13 @@ def __init__(self, parent=None):
''' This is flipped to account for image rotation '''
self.y_image_width = self.cfg.camera_parameters['x_pixels']
self.x_image_width = self.cfg.camera_parameters['y_pixels']
+ ''' Debugging info
+
+ logger.info('x_image_width: '+str(self.x_image_width))
+ logger.info('y_image_width: '+str(self.y_image_width))
+ logger.info('x_image_width/2: '+str(self.x_image_width/2))
+ logger.info('y_image_width/2: '+str(self.y_image_width/2))
+ '''
''' Initialize crosshairs '''
self.crosspen = pg.mkPen({'color': "r", 'width': 1})
@@ -78,12 +85,19 @@ def draw_crosshairs(self):
def set_image(self, image):
self.graphicsView.setImage(image, autoLevels=False, autoHistogramRange=False, autoRange=False)
if image.shape[0] != self.y_image_width or image.shape[1] != self.x_image_width:
- self.x_image_width = image.shape[0]
- self.y_image_width = image.shape[1]
+ self.x_image_width = image.shape[1]
+ self.y_image_width = image.shape[0]
self.vLine.setPos(self.x_image_width/2) # Stating a single value works for orthogonal lines
self.hLine.setPos(self.y_image_width/2) # Stating a single value works for orthogonal lines
self.graphicsView.addItem(self.vLine, ignoreBounds=True)
self.graphicsView.addItem(self.hLine, ignoreBounds=True)
+ ''' Debugging info
+
+ logger.info('x_image_width: '+str(self.x_image_width))
+ logger.info('y_image_width: '+str(self.y_image_width))
+ logger.info('x_image_width/2: '+str(self.x_image_width/2))
+ logger.info('y_image_width/2: '+str(self.y_image_width/2))
+ '''
else:
self.draw_crosshairs()
diff --git a/mesoSPIM/src/mesoSPIM_Core.py b/mesoSPIM/src/mesoSPIM_Core.py
index 6fa2f0a..64eeafa 100644
--- a/mesoSPIM/src/mesoSPIM_Core.py
+++ b/mesoSPIM/src/mesoSPIM_Core.py
@@ -27,17 +27,17 @@
from .devices.shutters.Demo_Shutter import Demo_Shutter
from .devices.shutters.NI_Shutter import NI_Shutter
-from .mesoSPIM_Camera import mesoSPIM_HamamatsuCamera
+from .mesoSPIM_Camera import mesoSPIM_Camera
from .devices.lasers.Demo_LaserEnabler import Demo_LaserEnabler
from .devices.lasers.mesoSPIM_LaserEnabler import mesoSPIM_LaserEnabler
from .mesoSPIM_Serial import mesoSPIM_Serial
# from .mesoSPIM_DemoSerial import mesoSPIM_Serial
-from .mesoSPIM_WaveFormGenerator import mesoSPIM_WaveFormGenerator
+from .mesoSPIM_WaveFormGenerator import mesoSPIM_WaveFormGenerator, mesoSPIM_DemoWaveFormGenerator
from .utils.acquisitions import AcquisitionList, Acquisition
-
+from .utils.utility_functions import convert_seconds_to_string
from .utils.demo_threads import mesoSPIM_DemoThread
class mesoSPIM_Core(QtCore.QObject):
@@ -57,7 +57,7 @@ class mesoSPIM_Core(QtCore.QObject):
sig_status_message = QtCore.pyqtSignal(str)
sig_warning = QtCore.pyqtSignal(str)
-
+
sig_progress = QtCore.pyqtSignal(dict)
''' Camera-related signals '''
@@ -68,6 +68,7 @@ class mesoSPIM_Core(QtCore.QObject):
sig_prepare_live = QtCore.pyqtSignal()
sig_get_live_image = QtCore.pyqtSignal()
+ sig_get_snap_image = QtCore.pyqtSignal()
sig_end_live = QtCore.pyqtSignal()
''' Movement-related signals: '''
@@ -121,29 +122,32 @@ def __init__(self, config, parent):
''' Set the Camera thread up '''
self.camera_thread = QtCore.QThread()
- self.camera_worker = mesoSPIM_HamamatsuCamera(self)
+ #self.camera_worker = mesoSPIM_HamamatsuCamera(self)
+ self.camera_worker = mesoSPIM_Camera(self)
#logger.info('Camera worker thread affinity before moveToThread? Answer:'+str(id(self.camera_worker.thread())))
self.camera_worker.moveToThread(self.camera_thread)
self.camera_worker.sig_update_gui_from_state.connect(self.sig_update_gui_from_state.emit)
+ self.camera_worker.sig_status_message.connect(self.send_status_message_to_gui)
#logger.info('Camera worker thread affinity after moveToThread? Answer:'+str(id(self.camera_worker.thread())))
''' Set the serial thread up '''
self.serial_thread = QtCore.QThread()
self.serial_worker = mesoSPIM_Serial(self)
self.serial_worker.moveToThread(self.serial_thread)
-
+
#self.serial_worker.sig_position.connect(lambda dict: self.sig_position.emit(dict))
self.serial_worker.sig_position.connect(self.sig_position.emit)
-
+
# ''' Setting another demo thread up '''
# self.demo_thread = QtCore.QThread()
# self.demo_worker = mesoSPIM_DemoThread()
# self.sig_state_request.connect(self.demo_worker.report_thread_id)
# self.demo_worker.moveToThread(self.demo_thread)
# self.demo_thread.start()
- ''' HICKUP DEBUGGING '''
- self.z_start_measured = 0.0
- self.z_end_measured = 0.0
- self.hickup_delta_z = 0.0
+
+ # ''' HICKUP DEBUGGING '''
+ # self.z_start_measured = 0.0
+ # self.z_end_measured = 0.0
+ # self.hickup_delta_z = 0.0
''' Start the threads '''
self.camera_thread.start()
@@ -159,7 +163,11 @@ def __init__(self, config, parent):
#logger.info(f'Core: Serial Thread priority: {self.serial_thread.priority()}')
''' Setting waveform generation up '''
- self.waveformer = mesoSPIM_WaveFormGenerator(self)
+ if self.cfg.waveformgeneration == 'NI':
+ self.waveformer = mesoSPIM_WaveFormGenerator(self)
+ elif self.cfg.waveformgeneration == 'DemoWaveFormGeneration':
+ self.waveformer = mesoSPIM_DemoWaveFormGenerator(self)
+
self.waveformer.sig_update_gui_from_state.connect(self.sig_update_gui_from_state.emit)
self.sig_state_request.connect(self.waveformer.state_request_handler)
self.sig_state_request_and_wait_until_done.connect(self.waveformer.state_request_handler)
@@ -188,6 +196,10 @@ def __init__(self, config, parent):
self.laserenabler = Demo_LaserEnabler(self.cfg.laserdict)
self.state['state']='idle'
+ self.state['current_framerate'] = self.cfg.startup['average_frame_rate']
+ self.state['snap_folder'] = self.cfg.startup['snap_folder']
+
+ self.start_time = 0
self.stopflag = False
@@ -262,9 +274,12 @@ def state_request_handler(self, dict):
'camera_pulse_%',
'camera_display_live_subsampling',
'camera_display_snap_subsampling',
- 'camera_display_acquisition_subsampling'):
+ 'camera_display_acquisition_subsampling',
+ 'camera_sensor_mode',
+ 'camera_binning',
+ ):
self.sig_state_request.emit({key : value})
-
+
def set_state(self, state):
if state == 'live':
self.state['state']='live'
@@ -272,7 +287,12 @@ def set_state(self, state):
logger.info('Thread ID during live: '+str(int(QtCore.QThread.currentThreadId())))
#logger.info('Core internal thread affinity in live: '+str(id(self.thread())))
self.live()
-
+
+ if state == 'snap':
+ self.state['state']='snap'
+ self.sig_state_request.emit({'state':'snap'})
+ self.snap()
+
elif state == 'run_selected_acquisition':
self.state['state']= 'run_selected_acquisition'
self.sig_state_request.emit({'state':'run_selected_acquisition'})
@@ -283,9 +303,13 @@ def set_state(self, state):
self.sig_state_request.emit({'state':'run_acquisition_list'})
self.start(row = None)
- elif state == 'preview_acquisition':
+ elif state == 'preview_acquisition_with_z_update':
+ self.state['state'] = 'preview_acquisition'
+ self.preview_acquisition(z_update=True)
+
+ elif state == 'preview_acquisition_without_z_update':
self.state['state'] = 'preview_acquisition'
- self.preview_acquisition()
+ self.preview_acquisition(z_update=False)
elif state == 'idle':
# print('Core: Stopping requested')
@@ -315,7 +339,9 @@ def send_progress(self,
cur_image,
images_in_acq,
total_image_count,
- image_counter):
+ image_counter,
+ time_passed_string,
+ remaining_time_string):
dict = {'current_acq':cur_acq,
'total_acqs' :tot_acqs,
@@ -323,6 +349,8 @@ def send_progress(self,
'images_in_acq': images_in_acq,
'total_image_count':total_image_count,
'image_counter':image_counter,
+ 'time_passed_string': time_passed_string,
+ 'remaining_time_string': remaining_time_string,
}
self.sig_progress.emit(dict)
@@ -334,19 +362,27 @@ def set_filter(self, filter, wait_until_done=False):
self.sig_state_request.emit({'filter' : filter})
@QtCore.pyqtSlot(dict)
- def set_zoom(self, zoom, wait_until_done=False):
+ def set_zoom(self, zoom, wait_until_done=False, update_etl=True):
if wait_until_done:
self.sig_state_request_and_wait_until_done.emit({'zoom' : zoom})
+ if update_etl:
+ self.sig_state_request_and_wait_until_done.emit({'set_etls_according_to_zoom' : zoom})
else:
self.sig_state_request.emit({'zoom' : zoom})
+ if update_etl:
+ self.sig_state_request.emit({'set_etls_according_to_zoom' : zoom})
@QtCore.pyqtSlot(str)
- def set_laser(self, laser, wait_until_done=False):
+ def set_laser(self, laser, wait_until_done=False, update_etl=True):
self.laserenabler.enable(laser)
if wait_until_done:
self.sig_state_request_and_wait_until_done.emit({'laser' : laser})
- else:
+ if update_etl:
+ self.sig_state_request_and_wait_until_done.emit({'set_etls_according_to_laser' : laser})
+ else:
self.sig_state_request.emit({'laser':laser})
+ if update_etl:
+ self.sig_state_request.emit({'set_etls_according_to_laser' : laser})
@QtCore.pyqtSlot(str)
def set_intensity(self, intensity, wait_until_done=False):
@@ -396,7 +432,7 @@ def stop_movement(self):
@QtCore.pyqtSlot(str)
def set_shutterconfig(self, shutterconfig):
self.state['shutterconfig'] = shutterconfig
-
+
@QtCore.pyqtSlot()
def open_shutters(self):
shutterconfig = self.state['shutterconfig']
@@ -415,7 +451,7 @@ def open_shutters(self):
self.shutter_left.open()
self.state['shutterstate'] = True
-
+
@QtCore.pyqtSlot()
def close_shutters(self):
self.shutter_left.close()
@@ -426,10 +462,21 @@ def close_shutters(self):
Sub-Imaging modes
'''
def snap(self):
+ self.sig_prepare_live.emit()
self.open_shutters()
self.snap_image()
+ self.sig_get_snap_image.emit()
self.close_shutters()
+
+ ''' Doubled code'''
+ timestr = time.strftime("%Y%m%d-%H%M%S")
+ filename = timestr + '.tif'
+
+ self.write_snap_metadata(filename)
+
+ self.sig_end_live.emit()
self.sig_finished.emit()
+ QtWidgets.QApplication.processEvents()
def snap_image(self):
'''Snaps a single image after updating the waveforms.
@@ -464,7 +511,7 @@ def close_image_series(self):
'''
Execution code for major imaging modes starts here
'''
-
+
def live(self):
self.stopflag = False
self.sig_prepare_live.emit()
@@ -491,26 +538,21 @@ def start(self, row=None):
acq_list = self.state['acq_list']
else:
acq_list = self.state['acq_list']
- # if acq_list.has_rotation() == True:
- # self.sig_warning.emit('Acquisition list contains rotation - stopping.')
- # self.sig_finished.emit()
- # else:
- ''' Pick the selected row and assign the rotation point of the whole list to it'''
acquisition = self.state['acq_list'][row]
- # rotation_position = self.state['acq_list'].get_rotation_point()
acq_list = AcquisitionList([acquisition])
- # acq_list.set_rotation_point(rotation_position)
-
- # if acq_list.has_rotation() == True:
- # if acq_list.get_rotation_point_status() is False:
- # self.sig_warning.emit('Acquisition list contains rotation - stopping')
- # self.sig_finished.emit()
+
+ nonexisting_folders_list = acq_list.check_for_nonexisting_folders()
+ filename_list = acq_list.check_for_existing_filenames()
+ duplicates_list = acq_list.check_for_duplicated_filenames()
- if acq_list.check_for_existing_filenames() == True:
- self.sig_warning.emit('One or more files in the acquisition list already exist - stopping.')
+ if nonexisting_folders_list != []:
+ self.sig_warning.emit('The following folders do not exist - stopping! \n'+self.list_to_string_with_carriage_return(nonexisting_folders_list))
self.sig_finished.emit()
- elif acq_list.check_for_duplicated_filenames() == True:
- self.sig_warning.emit('One or more filenames in the acquisition list is duplicated - stopping.')
+ elif filename_list != []:
+ self.sig_warning.emit('The following files already exist - stopping! \n'+self.list_to_string_with_carriage_return(filename_list))
+ self.sig_finished.emit()
+ elif duplicates_list != []:
+ self.sig_warning.emit('The following filenames are duplicated - stopping! \n' +self.list_to_string_with_carriage_return(duplicates_list))
self.sig_finished.emit()
else:
self.sig_update_gui_from_state.emit(True)
@@ -527,7 +569,8 @@ def prepare_acquisition_list(self, acq_list):
self.acquisition_count = 0
self.total_acquisition_count = len(acq_list)
self.total_image_count = acq_list.get_image_count()
- # self.acquisition_list_rotation_position = acq_list.get_rotation_point()
+ self.start_time = time.time()
+
def run_acquisition_list(self, acq_list):
for acq in acq_list:
@@ -538,28 +581,33 @@ def run_acquisition_list(self, acq_list):
def close_acquisition_list(self, acq_list):
self.sig_status_message.emit('Closing Acquisition List')
-
+
if not self.stopflag:
current_rotation = self.state['position']['theta_pos']
startpoint = acq_list.get_startpoint()
target_rotation = startpoint['theta_abs']
- # rotation_position = acq_list.get_rotation_point()
if current_rotation > target_rotation+0.1 or current_rotation < target_rotation-0.1:
''' Go to rotation position '''
self.sig_go_to_rotation_position_and_wait_until_done.emit()
- # self.move_absolute(rotation_position, wait_until_done=True)
self.move_absolute({'theta_abs':target_rotation}, wait_until_done=True)
self.move_absolute(acq_list.get_startpoint())
self.set_filter(acq_list[0]['filter'])
- self.set_laser(acq_list[0]['laser'])
- self.set_zoom(acq_list[0]['zoom'])
+ self.set_laser(acq_list[0]['laser'], wait_until_done=False, update_etl=False)
+ self.set_zoom(acq_list[0]['zoom'], wait_until_done=False, update_etl=False)
+ ''' This is for the GUI to update properly, otherwise ETL values for previous laser might be displayed '''
+ QtWidgets.QApplication.processEvents(QtCore.QEventLoop.AllEvents, 1)
+
+ self.sig_state_request.emit({'etl_l_amplitude' : acq_list[0]['etl_l_amplitude']})
+ self.sig_state_request.emit({'etl_r_amplitude' : acq_list[0]['etl_r_amplitude']})
+ self.sig_state_request.emit({'etl_l_offset' : acq_list[0]['etl_l_offset']})
+ self.sig_state_request.emit({'etl_r_offset' : acq_list[0]['etl_r_offset']})
self.set_intensity(acq_list[0]['intensity'])
time.sleep(0.1) # tiny sleep period to allow Main Window indicators to catch up
self.sig_finished.emit()
- def preview_acquisition(self):
+ def preview_acquisition(self, z_update=True):
self.stopflag = False
row = self.state['selected_row']
@@ -570,14 +618,26 @@ def preview_acquisition(self):
else:
self.sig_update_gui_from_state.emit(True)
acq = self.state['acq_list'][row]
-
+
''' Rotation handling goes here '''
current_rotation = self.state['position']['theta_pos']
startpoint = acq.get_startpoint()
target_rotation = startpoint['theta_abs']
- ''' Check if sample has to be rotated, allow some tolerance '''
+ ''' Create a flag when rotation is required: '''
if current_rotation > target_rotation+0.1 or current_rotation < target_rotation-0.1:
+ rotationflag = True
+ else:
+ rotationflag = False
+
+ ''' Remove z-coordinate from dict so that z is not updated during preview: '''
+ if z_update is False:
+ ''' If a rotation is necessary, z will be updated '''
+ if rotationflag == False:
+ del startpoint['z_abs']
+
+ ''' Check if sample has to be rotated, allow some tolerance '''
+ if rotationflag:
self.sig_status_message.emit('Going to rotation position')
self.sig_go_to_rotation_position_and_wait_until_done.emit()
self.sig_status_message.emit('Rotating sample')
@@ -592,38 +652,42 @@ def preview_acquisition(self):
self.sig_status_message.emit('Setting Shutter')
self.set_shutterconfig(acq['shutterconfig'])
self.sig_status_message.emit('Setting Zoom & Laser')
- self.set_zoom(acq['zoom'], wait_until_done=False)
+ self.set_zoom(acq['zoom'], wait_until_done=False, update_etl=False)
self.set_intensity(acq['intensity'], wait_until_done=True)
- self.set_laser(acq['laser'], wait_until_done=True)
+ self.set_laser(acq['laser'], wait_until_done=True, update_etl=False)
+ ''' This is for the GUI to update properly, otherwise ETL values for previous laser might be displayed '''
+ QtWidgets.QApplication.processEvents(QtCore.QEventLoop.AllEvents, 1)
self.sig_state_request.emit({'etl_l_amplitude' : acq['etl_l_amplitude']})
self.sig_state_request.emit({'etl_r_amplitude' : acq['etl_r_amplitude']})
self.sig_state_request.emit({'etl_l_offset' : acq['etl_l_offset']})
self.sig_state_request.emit({'etl_r_offset' : acq['etl_r_offset']})
- self.sig_update_gui_from_state.emit(False)
self.sig_status_message.emit('Ready for preview...')
-
+ self.sig_update_gui_from_state.emit(False)
+
self.state['state'] = 'idle'
-
+
def prepare_acquisition(self, acq):
'''
Housekeeping: Prepare the acquisition
'''
logger.info(f'Core: Running Acquisition #{self.acquisition_count} with Filename: {acq["filename"]}')
-
+
self.sig_status_message.emit('Going to start position')
''' Rotation handling goes here:
If target rotation different than current rotation:
- go to target position
- rotate to target angle
- -
-
+ -
+
'''
current_rotation = self.state['position']['theta_pos']
startpoint = acq.get_startpoint()
target_rotation = startpoint['theta_abs']
+ self.acq_start_time = time.time()
+ self.acq_start_time_string = time.strftime("%Y%m%d-%H%M%S")
''' Check if sample has to be rotated, allow some tolerance '''
if current_rotation > target_rotation+0.1 or current_rotation < target_rotation-0.1:
@@ -636,28 +700,36 @@ def prepare_acquisition(self, acq):
self.set_shutterconfig(acq['shutterconfig'])
self.set_filter(acq['filter'], wait_until_done=True)
self.sig_status_message.emit('Setting Zoom')
- self.set_zoom(acq['zoom'], wait_until_done=True)
+ self.set_zoom(acq['zoom'], wait_until_done=False, update_etl=False)
self.set_intensity(acq['intensity'], wait_until_done=True)
- self.set_laser(acq['laser'], wait_until_done=True)
+ self.set_laser(acq['laser'], wait_until_done=True, update_etl=False)
+ ''' This is for the GUI to update properly, otherwise ETL values for previous laser might be displayed '''
+ QtWidgets.QApplication.processEvents(QtCore.QEventLoop.AllEvents, 1)
self.sig_state_request.emit({'etl_l_amplitude' : acq['etl_l_amplitude']})
self.sig_state_request.emit({'etl_r_amplitude' : acq['etl_r_amplitude']})
self.sig_state_request.emit({'etl_l_offset' : acq['etl_l_offset']})
self.sig_state_request.emit({'etl_r_offset' : acq['etl_r_offset']})
+ self.f_step_generator = acq.get_focus_stepsize_generator()
+
self.sig_status_message.emit('Preparing camera: Allocating memory')
self.sig_prepare_image_series.emit(acq)
self.prepare_image_series()
-
- ''' HICKUP DEBUGGING: Measure z position '''
- self.z_start_measured = self.state['position']['z_pos']
+
+ # ''' HICKUP DEBUGGING: Measure z position '''
+ # self.z_start_measured = self.state['position']['z_pos']
self.write_metadata(acq)
-
+
def run_acquisition(self, acq):
steps = acq.get_image_count()
self.sig_status_message.emit('Running Acquisition')
self.open_shutters()
+
+ self.image_acq_start_time = time.time()
+ self.image_acq_start_time_string = time.strftime("%Y%m%d-%H%M%S")
+
for i in range(steps):
if self.stopflag is True:
self.close_image_series()
@@ -671,24 +743,59 @@ def run_acquisition(self, acq):
# self.sig_add_images_to_image_series_and_wait_until_done.emit()
# self.move_relative(acq.get_delta_z_dict(), wait_until_done=True)
- self.move_relative(acq.get_delta_z_dict())
+ move_dict = acq.get_delta_dict()
+ ''' Get the current correct f_step'''
+ f_step = self.f_step_generator.__next__()
+ if f_step != 0:
+ # print('F step: ', f_step)
+ move_dict.update({'f_rel':f_step})
+
+ self.move_relative(move_dict)
QtWidgets.QApplication.processEvents(QtCore.QEventLoop.AllEvents, 1)
self.image_count += 1
+ ''' Keep track of passed time and predict remaining time '''
+ time_passed = time.time() - self.start_time
+ time_remaining = self.state['predicted_acq_list_time'] - time_passed
+
+ ''' If the time to set up everything is longer than the predicted
+ acq time, the remaining time turns negative - here a different
+ calcuation should be employed here: '''
+ if time_remaining < 0:
+ time_passed = time.time() - self.image_acq_start_time
+ time_remaining = self.state['predicted_acq_list_time'] - time_passed
+
+ self.state['remaining_acq_list_time'] = time_remaining
+ framerate = self.image_count / time_passed
+
+ ''' Every 100 images, update the predicted acquisition time '''
+ if self.image_count % 100 == 0:
+ framerate = self.image_count / time_passed
+ self.state['predicted_acq_list_time'] = self.total_image_count / framerate
+
+
self.send_progress(self.acquisition_count,
self.total_acquisition_count,
i,
steps,
self.total_image_count,
- self.image_count)
+ self.image_count,
+ convert_seconds_to_string(time_passed),
+ convert_seconds_to_string(time_remaining))
+
+ self.image_acq_end_time = time.time()
+ self.image_acq_end_time_string = time.strftime("%Y%m%d-%H%M%S")
+
self.close_shutters()
-
+
def close_acquisition(self, acq):
- ''' HICKUP DEBUGGING '''
- self.z_end_measured = self.state['position']['z_pos']
- self.collect_troubleshooting_data(acq)
- self.append_troubleshooting_info_to_metadata(acq)
+
+ # ''' HICKUP DEBUGGING '''
+ # self.z_end_measured = self.state['position']['z_pos']
+ # self.f_end_measured = self.state['position']['f_pos']
+ # self.collect_troubleshooting_data(acq)
+ # self.append_troubleshooting_info_to_metadata(acq)
self.sig_status_message.emit('Closing Acquisition: Saving data & freeing up memory')
@@ -697,8 +804,12 @@ def close_acquisition(self, acq):
self.close_image_series()
self.sig_end_image_series.emit()
+ self.acq_end_time = time.time()
+ self.acq_end_time_string = time.strftime("%Y%m%d-%H%M%S")
+
+ self.append_timing_info_to_metadata(acq)
self.acquisition_count += 1
-
+
@QtCore.pyqtSlot(str)
def execute_script(self, script):
self.sig_update_gui_from_state.emit(True)
@@ -741,7 +852,7 @@ def visual_mode(self):
self.sig_state_request.emit({'etl_l_amplitude' : 0})
self.sig_state_request.emit({'etl_r_amplitude' : 0})
time.sleep(0.05)
-
+
self.sig_prepare_live.emit()
self.stopflag = False
@@ -805,7 +916,8 @@ def write_metadata(self, acq):
self.write_line(file, 'POSITION')
self.write_line(file, 'x_pos', acq['x_pos'])
self.write_line(file, 'y_pos', acq['y_pos'])
- self.write_line(file, 'f_pos', acq['f_pos'])
+ self.write_line(file, 'f_start', acq['f_start'])
+ self.write_line(file, 'f_end', acq['f_end'])
self.write_line(file, 'z_start', acq['z_start'])
self.write_line(file, 'z_end', acq['z_end'])
self.write_line(file, 'z_stepsize', acq['z_step'])
@@ -833,19 +945,86 @@ def write_metadata(self, acq):
self.write_line(file, 'camera_line_interval', self.state['camera_line_interval'])
self.write_line(file, 'x_pixels',self.cfg.camera_parameters['x_pixels'])
self.write_line(file, 'y_pixels',self.cfg.camera_parameters['y_pixels'])
-
+
def execute_galil_program(self):
- '''Little helper method to execute the program loaded onto the Galil stage:
+ '''Little helper method to execute the program loaded onto the Galil stage:
allows hand controller to operate'''
self.sig_state_request.emit({'stage_program' : 'execute'})
- ''' HICKUP DEBUGGING '''
-
- def collect_troubleshooting_data(self, acq):
- self.hickup_delta_z = self.z_end_measured - acq['z_end']
- print('HICKUP Difference: ', self.hickup_delta_z)
-
- def append_troubleshooting_info_to_metadata(self, acq):
+ def write_snap_metadata(self, filename):
+ path = self.state['snap_folder']+'/'+filename
+
+ metadata_path = os.path.dirname(path)+'/'+os.path.basename(path)+'_meta.txt'
+
+ with open(metadata_path,'w') as file:
+ self.write_line(file, 'CFG')
+ self.write_line(file, 'Laser', self.state['laser'])
+ self.write_line(file, 'Intensity (%)', self.state['intensity'])
+ self.write_line(file, 'Zoom', self.state['zoom'])
+ self.write_line(file, 'Pixelsize in um', self.state['pixelsize'])
+ self.write_line(file, 'Filter', self.state['filter'])
+ self.write_line(file, 'Shutter', self.state['shutterconfig'])
+ self.write_line(file)
+ self.write_line(file, 'POSITION')
+ self.write_line(file, 'x_pos', self.state['position']['x_pos'])
+ self.write_line(file, 'y_pos', self.state['position']['y_pos'])
+ self.write_line(file, 'z_pos', self.state['position']['z_pos'])
+ self.write_line(file, 'f_pos', self.state['position']['f_pos'])
+ self.write_line(file)
+
+ ''' Attention: change to true ETL values ASAP '''
+ self.write_line(file,'ETL PARAMETERS')
+ self.write_line(file, 'ETL CFG File', self.state['ETL_cfg_file'])
+ self.write_line(file,'etl_l_offset', self.state['etl_l_offset'])
+ self.write_line(file,'etl_l_amplitude', self.state['etl_l_amplitude'])
+ self.write_line(file,'etl_r_offset', self.state['etl_r_offset'])
+ self.write_line(file,'etl_r_amplitude', self.state['etl_r_amplitude'])
+ self.write_line(file)
+ self.write_line(file, 'GALVO PARAMETERS')
+ self.write_line(file, 'galvo_l_frequency',self.state['galvo_l_frequency'])
+ self.write_line(file, 'galvo_l_amplitude',self.state['galvo_l_amplitude'])
+ self.write_line(file, 'galvo_l_offset', self.state['galvo_l_offset'])
+ self.write_line(file, 'galvo_r_amplitude', self.state['galvo_r_amplitude'])
+ self.write_line(file, 'galvo_r_offset', self.state['galvo_r_offset'])
+ self.write_line(file)
+ self.write_line(file, 'CAMERA PARAMETERS')
+ self.write_line(file, 'camera_type', self.cfg.camera)
+ self.write_line(file, 'camera_exposure', self.state['camera_exposure_time'])
+ self.write_line(file, 'camera_line_interval', self.state['camera_line_interval'])
+ self.write_line(file, 'x_pixels',self.cfg.camera_parameters['x_pixels'])
+ self.write_line(file, 'y_pixels',self.cfg.camera_parameters['y_pixels'])
+
+ # ''' HICKUP DEBUGGING '''
+
+ # def collect_troubleshooting_data(self, acq):
+ # self.hickup_delta_z = self.z_end_measured - acq['z_end']
+ # self.hickup_delta_f = self.f_end_measured - acq['f_end']
+ # # print('HICKUP Difference: ', self.hickup_delta_z)
+
+ # def append_troubleshooting_info_to_metadata(self, acq):
+ # '''
+ # Appends a metadata.txt file
+
+ # Path contains the file to be written
+ # '''
+ # path = acq['folder']+'/'+acq['filename']
+
+ # metadata_path = os.path.dirname(path)+'/'+os.path.basename(path)+'_meta.txt'
+
+ # with open(metadata_path,'a') as file:
+ # ''' Adding troubleshooting information '''
+ # self.write_line(file)
+ # self.write_line(file, 'TROUBLESHOOTING INFORMATION')
+ # self.write_line(file, 'Z_pos: delta_z end to start after acq', str(self.hickup_delta_z) )
+ # self.write_line(file, 'z_start expected', acq['z_start'])
+ # self.write_line(file, 'z_start measured', str(self.z_start_measured))
+ # self.write_line(file, 'z_end expected', acq['z_end'])
+ # self.write_line(file, 'z_end measured', str(self.z_end_measured))
+ # self.write_line(file, 'F_pos: delta_f end to start after acq', str(self.hickup_delta_f) )
+ # self.write_line(file, 'f_end expected', acq['f_end'])
+ # self.write_line(file, 'f_end measured', str(self.f_end_measured))
+
+ def append_timing_info_to_metadata(self, acq):
'''
Appends a metadata.txt file
@@ -858,9 +1037,19 @@ def append_troubleshooting_info_to_metadata(self, acq):
with open(metadata_path,'a') as file:
''' Adding troubleshooting information '''
self.write_line(file)
- self.write_line(file, 'TROUBLESHOOTING INFORMATION')
- self.write_line(file, 'delta_z end to start after acq', str(self.hickup_delta_z) )
- self.write_line(file, 'z_start expected', acq['z_start'])
- self.write_line(file, 'z_start measured', str(self.z_start_measured))
- self.write_line(file, 'z_end expected', acq['z_end'])
- self.write_line(file, 'z_end measured', str(self.z_end_measured))
+ self.write_line(file, 'TIMING INFORMATION')
+ self.write_line(file, 'Started stack', self.acq_start_time_string )
+ self.write_line(file, 'Started taking images', self.image_acq_start_time_string )
+ self.write_line(file, 'Stopped taking images', self.image_acq_end_time_string )
+ self.write_line(file, 'Stopped stack', self.acq_end_time_string )
+ self.write_line(file, 'Frame rate:', str(acq.get_image_count()/(self.image_acq_end_time-self.image_acq_start_time)))
+
+ @QtCore.pyqtSlot(str)
+ def send_status_message_to_gui(self, string):
+ self.sig_status_message.emit(string)
+
+ def list_to_string_with_carriage_return(self, input_list):
+ mystring = ''
+ for i in input_list:
+ mystring = mystring + ' \n ' + i
+ return mystring
\ No newline at end of file
diff --git a/mesoSPIM/src/mesoSPIM_MainWindow.py b/mesoSPIM/src/mesoSPIM_MainWindow.py
index cbd0382..943f360 100644
--- a/mesoSPIM/src/mesoSPIM_MainWindow.py
+++ b/mesoSPIM/src/mesoSPIM_MainWindow.py
@@ -13,6 +13,10 @@
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.uic import loadUi
+''' Disabled taskbar button progress display due to problems with Anaconda default'''
+# if sys.platform == 'win32':
+# from PyQt5.QtWinExtras import QWinTaskbarButton
+
from .mesoSPIM_CameraWindow import mesoSPIM_CameraWindow
from .mesoSPIM_AcquisitionManagerWindow import mesoSPIM_AcquisitionManagerWindow
from .mesoSPIM_ScriptWindow import mesoSPIM_ScriptWindow
@@ -85,6 +89,7 @@ def __init__(self, config=None):
self.acquisition_manager_window = mesoSPIM_AcquisitionManagerWindow(self)
self.acquisition_manager_window.show()
self.acquisition_manager_window.sig_warning.connect(self.display_warning)
+ self.acquisition_manager_window.sig_move_absolute.connect(self.sig_move_absolute.emit)
'''
Setting up the threads
@@ -151,6 +156,7 @@ def __init__(self, config=None):
''' Setting up the joystick '''
self.joystick = mesoSPIM_JoystickHandler(self)
+ self.enable_gui_updates_from_state(False)
def __del__(self):
'''Cleans the threads up after deletion, waits until the threads
@@ -164,6 +170,15 @@ def __del__(self):
except:
pass
+ def display_icons(self):
+ pass
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button = QWinTaskbarButton(self)
+ self.win_taskbar_button.setWindow(self.windowHandle())
+ self.win_taskbar_button.progress().setVisible(False)
+ '''
+
def get_state_parameter(self, state_parameter):
return self.state[state_parameter]
@@ -244,16 +259,25 @@ def update_progressbars(self,dict):
images_in_acq = dict['images_in_acq']
tot_images = dict['total_image_count']
image_count = dict['image_counter']
+ time_passed_string = dict['time_passed_string']
+ remaining_time_string = dict['remaining_time_string']
self.AcquisitionProgressBar.setValue(int((cur_image+1)/images_in_acq*100))
self.TotalProgressBar.setValue(int((image_count+1)/tot_images*100))
- self.AcquisitionProgressBar.setFormat('%p% (Image '+ str(cur_image+1) +\
- '/' + str(images_in_acq) + ')')
- self.TotalProgressBar.setFormat('%p% (Acquisition '+ str(cur_acq+1) +\
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setValue(int((image_count+1)/tot_images*100))
+ '''
+
+ self.AcquisitionProgressBar.setFormat('%p% Image '+ str(cur_image+1) +\
+ '/' + str(images_in_acq) + ' ')
+ self.TotalProgressBar.setFormat('%p% Acq: '+ str(cur_acq+1) +\
'/' + str(tot_acqs) +\
- ')' + ' (Image '+ str(image_count) +\
- '/' + str(tot_images) + ')')
+ ' ' + ' Image: '+ str(image_count) +\
+ '/' + str(tot_images) + ' ' +\
+ 'Time: ' + time_passed_string + \
+ ' Remaining: ' + remaining_time_string)
def create_script_window(self):
'''
@@ -315,8 +339,8 @@ def initialize_and_connect_widgets(self):
self.ChooseETLcfgButton.clicked.connect(self.choose_etl_config)
self.SaveETLParametersButton.clicked.connect(self.save_etl_config)
- # self.ChooseSnapFolderButton.clicked.connect(self.choose_snap_folder)
- # self.SnapFolderIndicator.setText(self.state['snap_folder'])
+ self.ChooseSnapFolderButton.clicked.connect(self.choose_snap_folder)
+ self.SnapFolderIndicator.setText(self.state['snap_folder'])
self.ETLconfigIndicator.setText(self.state['ETL_cfg_file'])
@@ -328,9 +352,9 @@ def initialize_and_connect_widgets(self):
(self.LaserComboBox, 'laser',1),
(self.LaserIntensitySlider, 'intensity',1),
(self.CameraExposureTimeSpinBox, 'camera_exposure_time',1000),
- (self.CameraLineIntervalSpinBox,'camera_line_interval',1000000),
- # (self.CameraTriggerDelaySpinBox,'camera_delay_%',1),
- # (self.CameraTriggerPulseLengthSpinBox, 'camera_pulse_%',1),
+ #(self.CameraLineIntervalSpinBox,'camera_line_interval',1000000),
+ (self.CameraTriggerDelaySpinBox,'camera_delay_%',1),
+ (self.CameraTriggerPulseLengthSpinBox, 'camera_pulse_%',1),
(self.SweeptimeSpinBox,'sweeptime',1000),
(self.LeftLaserPulseDelaySpinBox,'laser_l_delay_%',1),
(self.RightLaserPulseDelaySpinBox,'laser_r_delay_%',1),
@@ -370,11 +394,12 @@ def initialize_and_connect_widgets(self):
self.connect_combobox_to_state_parameter(self.ZoomComboBox,self.cfg.zoomdict.keys(),'zoom')
self.connect_combobox_to_state_parameter(self.ShutterComboBox,self.cfg.shutteroptions,'shutterconfig')
self.connect_combobox_to_state_parameter(self.LaserComboBox,self.cfg.laserdict.keys(),'laser')
+ # self.connect_combobox_to_state_parameter(self.CameraSensorModeComboBox,['ASLM','Area'],'camera_sensor_mode')
self.connect_combobox_to_state_parameter(self.LiveSubSamplingComboBox,subsampling_list,'camera_display_live_subsampling', int_conversion = True)
self.connect_combobox_to_state_parameter(self.SnapSubSamplingComboBox,subsampling_list,'camera_display_snap_subsampling', int_conversion = True)
self.connect_combobox_to_state_parameter(self.AcquisitionSubSamplingComboBox,subsampling_list,'camera_display_acquisition_subsampling', int_conversion = True)
# self.connect_combobox_to_state_parameter(self.CameraSensorModeComboBox,['ASLM','Area'],'camera_sensor_mode')
-
+ self.connect_combobox_to_state_parameter(self.BinningComboBox, self.cfg.binning_dict.keys(),'camera_binning')
self.LaserIntensitySlider.valueChanged.connect(lambda currentValue: self.sig_state_request.emit({'intensity': currentValue}))
self.LaserIntensitySlider.setValue(self.cfg.startup['intensity'])
@@ -444,7 +469,8 @@ def update_widget_from_state(self, widget, state_parameter_string, conversion_fa
widget.setCurrentText(self.state[state_parameter_string])
elif isinstance(widget, (QtWidgets.QSlider,QtWidgets.QDoubleSpinBox,QtWidgets.QSpinBox)):
widget.setValue(self.state[state_parameter_string]*conversion_factor)
-
+
+ @QtCore.pyqtSlot()
def update_gui_from_state(self):
'''
Updates the GUI controls after a state_change
@@ -473,13 +499,21 @@ def run_live(self):
def run_selected_acquisition(self):
row = self.acquisition_manager_window.get_first_selected_row()
- # print('selected row:', row)
- self.state['selected_row'] = row
- self.sig_state_request.emit({'state':'run_selected_acquisition'})
- self.enable_mode_control_buttons(False)
- self.enable_gui_updates_from_state(True)
- self.enable_stop_button(True)
- self.enable_gui(False)
+
+ if row == None:
+ self.display_warning('No row selected - stopping!')
+ else:
+ # print('selected row:', row)
+ self.state['selected_row'] = row
+ self.sig_state_request.emit({'state':'run_selected_acquisition'})
+ self.enable_mode_control_buttons(False)
+ self.enable_gui_updates_from_state(True)
+ self.enable_stop_button(True)
+ self.enable_gui(False)
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setVisible(True)
+ '''
def run_acquisition_list(self):
self.state['selected_row'] = -1
@@ -488,18 +522,30 @@ def run_acquisition_list(self):
self.enable_gui_updates_from_state(True)
self.enable_stop_button(True)
self.enable_gui(False)
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setVisible(True)
+ '''
def run_lightsheet_alignment_mode(self):
self.sig_state_request.emit({'state':'lightsheet_alignment_mode'})
self.set_progressbars_to_busy()
self.enable_mode_control_buttons(False)
self.enable_stop_button(True)
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setVisible(False)
+ '''
def run_visual_mode(self):
self.sig_state_request.emit({'state':'visual_mode'})
self.set_progressbars_to_busy()
self.enable_mode_control_buttons(False)
self.enable_stop_button(True)
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setVisible(False)
+ '''
@QtCore.pyqtSlot(bool)
def enable_gui_updates_from_state(self, boolean):
@@ -515,7 +561,7 @@ def enable_gui(self, boolean):
def enable_mode_control_buttons(self, boolean):
self.LiveButton.setEnabled(boolean)
- #self.SnapButton.setEnabled(boolean)
+ self.SnapButton.setEnabled(boolean)
self.RunSelectedAcquisitionButton.setEnabled(boolean)
self.RunAcquisitionListButton.setEnabled(boolean)
self.VisualModeButton.setEnabled(boolean)
@@ -534,12 +580,21 @@ def set_progressbars_to_busy(self):
self.AcquisitionProgressBar.setMaximum(0)
self.TotalProgressBar.setMinimum(0)
self.TotalProgressBar.setMaximum(0)
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setVisible(False)
+ '''
def set_progressbars_to_standard(self):
self.AcquisitionProgressBar.setMinimum(0)
self.AcquisitionProgressBar.setMaximum(100)
self.TotalProgressBar.setMinimum(0)
self.TotalProgressBar.setMaximum(100)
+ ''' Disabled taskbar button progress display due to problems with Anaconda default
+ if sys.platform == 'win32':
+ self.win_taskbar_button.progress().setValue(0)
+ self.win_taskbar_button.progress().setVisible(False)
+ '''
def update_etl_increments(self):
increment = self.ETLIncrementSpinBox.value()
@@ -593,12 +648,15 @@ def display_warning(self, string):
def choose_snap_folder(self):
pass
- # path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Open csv File', self.state['snap_folder'])
+ path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Open csv File', self.state['snap_folder'])
- # if path:
- # self.state['snap_folder'] = path
- # self.SnapFolderIndicator.setText(path)
+ if path:
+ self.state['snap_folder'] = path
+ self.SnapFolderIndicator.setText(path)
+
+ print('Chosen Snap Folder:', path)
- # logger.info(f'Main Window: Chosen Snap Folder: {path}')
+ #self.sig_state_request.emit({'ETL_cfg_file' : path})
+
diff --git a/mesoSPIM/src/mesoSPIM_Serial.py b/mesoSPIM/src/mesoSPIM_Serial.py
index c8c22a1..4ba2ad5 100644
--- a/mesoSPIM/src/mesoSPIM_Serial.py
+++ b/mesoSPIM/src/mesoSPIM_Serial.py
@@ -21,7 +21,7 @@
from .devices.filter_wheels.ludlcontrol import LudlFilterwheel
from .devices.filter_wheels.mesoSPIM_FilterWheel import mesoSPIM_DemoFilterWheel
from .devices.zoom.mesoSPIM_Zoom import DynamixelZoom, DemoZoom
-from .mesoSPIM_Stages import mesoSPIM_PIstage, mesoSPIM_DemoStage, mesoSPIM_GalilStages, mesoSPIM_PI_f_rot_and_Galil_xyz_Stages, mesoSPIM_PI_rot_and_Galil_xyzf_Stages, mesoSPIM_PI_rotz_and_Galil_xyf_Stages
+from .mesoSPIM_Stages import mesoSPIM_PIstage, mesoSPIM_DemoStage, mesoSPIM_GalilStages, mesoSPIM_PI_f_rot_and_Galil_xyz_Stages, mesoSPIM_PI_rot_and_Galil_xyzf_Stages, mesoSPIM_PI_rotz_and_Galil_xyf_Stages, mesoSPIM_PI_rotzf_and_Galil_xy_Stages
# from .mesoSPIM_State import mesoSPIM_State
class mesoSPIM_Serial(QtCore.QObject):
@@ -79,6 +79,9 @@ def __init__(self, parent):
elif self.cfg.stage_parameters['stage_type'] == 'PI_rotz_and_Galil_xyf':
self.stage = mesoSPIM_PI_rotz_and_Galil_xyf_Stages(self)
self.stage.sig_position.connect(lambda dict: self.sig_position.emit({'position': dict}))
+ elif self.cfg.stage_parameters['stage_type'] == 'PI_rotzf_and_Galil_xy':
+ self.stage = mesoSPIM_PI_rotzf_and_Galil_xy_Stages(self)
+ self.stage.sig_position.connect(lambda dict: self.sig_position.emit({'position': dict}))
elif self.cfg.stage_parameters['stage_type'] == 'DemoStage':
self.stage = mesoSPIM_DemoStage(self)
try:
@@ -161,7 +164,7 @@ def go_to_rotation_position(self, wait_until_done=False):
@QtCore.pyqtSlot(str)
def set_filter(self, filter, wait_until_done=False):
- logger.info('Thread ID during set filter: '+str(int(QtCore.QThread.currentThreadId())))
+ # logger.info('Thread ID during set filter: '+str(int(QtCore.QThread.currentThreadId())))
if wait_until_done:
self.filterwheel.set_filter(filter, wait_until_done=True)
else:
@@ -170,13 +173,15 @@ def set_filter(self, filter, wait_until_done=False):
@QtCore.pyqtSlot(str)
def set_zoom(self, zoom, wait_until_done=False):
- logger.info('Thread ID during set zoom: '+str(int(QtCore.QThread.currentThreadId())))
+ # logger.info('Thread ID during set zoom: '+str(int(QtCore.QThread.currentThreadId())))
+ ''' Here, the state parameters are set before sending the value to the zoom --
+ this is to avoid laggy update loops with the GUI.'''
+ self.state['zoom'] = zoom
+ self.state['pixelsize'] = self.cfg.pixelsize[zoom]
if wait_until_done:
self.zoom.set_zoom(zoom, wait_until_done=True)
else:
self.zoom.set_zoom(zoom, wait_until_done=False)
- self.state['zoom'] = zoom
- self.state['pixelsize'] = self.cfg.pixelsize[zoom]
def execute_stage_program(self):
self.stage.execute_program()
\ No newline at end of file
diff --git a/mesoSPIM/src/mesoSPIM_Stages.py b/mesoSPIM/src/mesoSPIM_Stages.py
index cea0ac5..b518024 100644
--- a/mesoSPIM/src/mesoSPIM_Stages.py
+++ b/mesoSPIM/src/mesoSPIM_Stages.py
@@ -1282,7 +1282,10 @@ def __init__(self, parent = None):
'''
pitools.startup(self.pidevice, stages=self.pi_stages)
- #self.pidevice.FRF(1)
+ ''' Setting PI velocities '''
+ self.pidevice.VEL(self.cfg.pi_parameters['velocity'])
+
+ ''' Reference movements '''
print('M-406 Emergency referencing hack: Waiting for referencing move')
logger.info('M-406 Emergency referencing hack: Waiting for referencing move')
self.pidevice.FRF(2)
@@ -1292,7 +1295,6 @@ def __init__(self, parent = None):
''' Stage 5 close to good focus'''
self.startfocus = self.cfg.stage_parameters['startfocus']
self.xyf_stage.move_absolute({3: self.startfocus})
- #self.pidevice.MOV(5,self.startfocus/1000)
def __del__(self):
try:
@@ -1471,4 +1473,553 @@ def block_till_controller_is_ready(self):
def execute_program(self):
'''Executes program stored on the Galil controller'''
- self.xyf_stage.execute_program()
\ No newline at end of file
+ self.xyf_stage.execute_program()
+
+### Up for deletion --> also in mesoSPIM serial
+class mesoSPIM_PI_rot_and_Galil_xyzf_Stages(mesoSPIM_Stage):
+ '''
+ Expects following microscope configuration:
+
+ Sample XYZ movement: Galil controller with 3 axes
+ F movement: Second Galil controller with a single axis
+ Rotation: PI C-863 mercury controller
+
+ It is expected that the parent class has the following signals:
+ sig_move_relative = pyqtSignal(dict)
+ sig_move_relative_and_wait_until_done = pyqtSignal(dict)
+ sig_move_absolute = pyqtSignal(dict)
+ sig_move_absolute_and_wait_until_done = pyqtSignal(dict)
+ sig_zero = pyqtSignal(list)
+ sig_unzero = pyqtSignal(list)
+ sig_stop_movement = pyqtSignal()
+ sig_mark_rotation_position = pyqtSignal()
+
+ Also contains a QTimer that regularily sends position updates, e.g
+ during the execution of movements.
+
+ '''
+
+ def __init__(self, parent = None):
+ super().__init__(parent)
+
+ #self.state = mesoSPIM_StateSingleton()
+
+ self.pos_timer = QtCore.QTimer(self)
+ self.pos_timer.timeout.connect(self.report_position)
+ self.pos_timer.start(50)
+ '''
+ Galil-specific code
+ '''
+ from src.devices.stages.galil.galilcontrol import StageControlGalil
+
+ self.x_encodercounts_per_um = self.cfg.xyz_galil_parameters['x_encodercounts_per_um']
+ self.y_encodercounts_per_um = self.cfg.xyz_galil_parameters['y_encodercounts_per_um']
+ self.z_encodercounts_per_um = self.cfg.xyz_galil_parameters['z_encodercounts_per_um']
+ self.f_encodercounts_per_um = self.cfg.f_galil_parameters['f_encodercounts_per_um']
+
+ ''' Setting up the Galil stages: XYZ '''
+ self.xyz_stage = StageControlGalil(self.cfg.xyz_galil_parameters['port'],[self.x_encodercounts_per_um,
+ self.y_encodercounts_per_um,self.z_encodercounts_per_um])
+
+ ''' Setting up the Galil stages: F with two dummy axes.'''
+ self.f_stage = StageControlGalil(self.cfg.f_galil_parameters['port'],[self.x_encodercounts_per_um,
+ self.y_encodercounts_per_um,self.f_encodercounts_per_um])
+ '''
+ self.f_stage = StageControlGalil(COMport = self.cfg.f_galil_parameters['COMport'],
+ x_encodercounts_per_um = 0,
+ y_encodercounts_per_um = 0,
+ z_encodercounts_per_um = self.f_encodercounts_per_um)
+ '''
+
+ '''
+ print('Galil: ', self.xyz_stage.read_position('x'))
+ print('Galil: ', self.xyz_stage.read_position('y'))
+ print('Galil: ', self.xyz_stage.read_position('z'))
+ '''
+
+ ''' PI-specific code '''
+ from pipython import GCSDevice, pitools
+
+ self.pitools = pitools
+
+ ''' Setting up the PI stages '''
+ self.pi = self.cfg.pi_parameters
+
+ self.controllername = self.cfg.pi_parameters['controllername']
+ self.pi_stages = self.cfg.pi_parameters['stages']
+ # ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE')
+ self.refmode = self.cfg.pi_parameters['refmode']
+ # self.serialnum = ('118015439') # Wyss Geneva
+ self.serialnum = self.cfg.pi_parameters['serialnum'] # UZH Irchel H45
+
+ self.pidevice = GCSDevice(self.controllername)
+ self.pidevice.ConnectUSB(serialnum=self.serialnum)
+
+ ''' PI startup '''
+
+ ''' with refmode enabled: pretty dangerous
+ pitools.startup(self.pidevice, stages=self.pi_stages, refmode=self.refmode)
+ '''
+ pitools.startup(self.pidevice, stages=self.pi_stages)
+
+ ''' Setting PI velocities '''
+ self.pidevice.VEL(self.cfg.pi_parameters['velocity'])
+
+ self.pidevice.FRF(1)
+ print('M-061 Emergency referencing hack: Waiting for referencing move')
+ logger.info('M-061 Emergency referencing hack: Waiting for referencing move')
+ self.block_till_controller_is_ready()
+ print('M-061 Emergency referencing hack done')
+ logger.info('M-061 Emergency referencing hack done')
+
+ ''' Stage 5 close to good focus'''
+ self.startfocus = self.cfg.stage_parameters['startfocus']
+ self.f_stage.move_absolute({3: self.startfocus})
+ #self.pidevice.MOV(5,self.startfocus/1000)
+
+ def __del__(self):
+ try:
+ '''Close the Galil connection'''
+ self.xyz_stage.close()
+ self.f_stage.close_stage()
+ logger.info('Galil stages disconnected')
+ except:
+ logger.info('Error while disconnecting the Galil stages')
+
+ def report_position(self):
+ positions = self.pidevice.qPOS(self.pidevice.axes)
+
+ '''
+ Ugly workaround to deal with non-responding stage
+ position reports: Do not update positions in
+ exceptional circumstances.
+ '''
+ try:
+ self.x_pos, self.y_pos, self.z_pos = self.xyz_stage.read_position()
+ _ , _ , self.f_pos = self.f_stage.read_position()
+ except:
+ logger.info('Error while unpacking Galil stage position values')
+
+ self.create_position_dict()
+
+ self.theta_pos = positions['1']
+
+ self.int_x_pos = self.x_pos + self.int_x_pos_offset
+ self.int_y_pos = self.y_pos + self.int_y_pos_offset
+ self.int_z_pos = self.z_pos + self.int_z_pos_offset
+ self.int_f_pos = self.f_pos + self.int_f_pos_offset
+ self.int_theta_pos = self.theta_pos + self.int_theta_pos_offset
+
+ self.create_internal_position_dict()
+
+ self.sig_position.emit(self.int_position_dict)
+ #print(self.int_position_dict)
+
+ def move_relative(self, dict, wait_until_done=False):
+ ''' Galil move relative method
+
+ Lots of implementation details in here, should be replaced by a facade
+ '''
+ xyz_motion_dict = {}
+
+ if 'x_rel' in dict:
+ x_rel = dict['x_rel']
+ if self.x_min < self.x_pos + x_rel and self.x_max > self.x_pos + x_rel:
+ xyz_motion_dict.update({1:int(x_rel)})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: X Motion limit would be reached!',1000)
+
+ if 'y_rel' in dict:
+ y_rel = dict['y_rel']
+ if self.y_min < self.y_pos + y_rel and self.y_max > self.y_pos + y_rel:
+ xyz_motion_dict.update({2:int(y_rel)})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: Y Motion limit would be reached!',1000)
+
+ if 'z_rel' in dict:
+ z_rel = dict['z_rel']
+ if self.z_min < self.z_pos + z_rel and self.z_max > self.z_pos + z_rel:
+ xyz_motion_dict.update({3:int(z_rel)})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: z Motion limit would be reached!',1000)
+
+ if xyz_motion_dict != {}:
+ self.xyz_stage.move_relative(xyz_motion_dict)
+
+ if 'theta_rel' in dict:
+ theta_rel = dict['theta_rel']
+ if self.theta_min < self.theta_pos + theta_rel and self.theta_max > self.theta_pos + theta_rel:
+ self.pidevice.MVR({1 : theta_rel})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: theta Motion limit would be reached!',1000)
+
+ if 'f_rel' in dict:
+ f_rel = dict['f_rel']
+ if self.f_min < self.f_pos + f_rel and self.f_max > self.f_pos + f_rel:
+ self.f_stage.move_relative({3:int(f_rel)})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: f Motion limit would be reached!',1000)
+
+ if wait_until_done == True:
+ self.f_stage.wait_until_done('Z')
+ self.xyz_stage.wait_until_done('XYZ')
+ self.pitools.waitontarget(self.pidevice)
+
+
+ def move_absolute(self, dict, wait_until_done=False):
+ '''
+ Galil move absolute method
+
+ Lots of implementation details in here, should be replaced by a facade
+
+ '''
+ xyz_motion_dict = {}
+
+ if 'x_abs' or 'y_abs' or 'z_abs' in dict:
+ if 'x_abs' in dict:
+ x_abs = dict['x_abs']
+ x_abs = x_abs - self.int_x_pos_offset
+ xyz_motion_dict.update({1:x_abs})
+
+ if 'y_abs' in dict:
+ y_abs = dict['y_abs']
+ y_abs = y_abs - self.int_y_pos_offset
+ xyz_motion_dict.update({2:y_abs})
+
+ if 'z_abs' in dict:
+ z_abs = dict['z_abs']
+ z_abs = z_abs - self.int_z_pos_offset
+ xyz_motion_dict.update({3:z_abs})
+
+ if xyz_motion_dict != {}:
+ self.xyz_stage.move_absolute(xyz_motion_dict)
+
+ if wait_until_done == True:
+ self.xyz_stage.wait_until_done('XYZ')
+
+ if 'f_abs' in dict:
+ f_abs = dict['f_abs']
+ f_abs = f_abs - self.int_f_pos_offset
+ if self.f_min < f_abs and self.f_max > f_abs:
+ ''' Conversion to mm and command emission'''
+ self.f_stage.move_absolute({3:int(f_abs)})
+ else:
+ self.sig_status_message.emit('Absolute movement stopped: F Motion limit would be reached!',1000)
+
+ if 'theta_abs' in dict:
+ theta_abs = dict['theta_abs']
+ theta_abs = theta_abs - self.int_theta_pos_offset
+ if self.theta_min < theta_abs and self.theta_max > theta_abs:
+ ''' No Conversion to mm !!!! and command emission'''
+ self.pidevice.MOV({1 : theta_abs})
+ else:
+ self.sig_status_message.emit('Absolute movement stopped: Theta Motion limit would be reached!',1000)
+
+ if wait_until_done == True:
+ self.pitools.waitontarget(self.pidevice)
+
+ def stop(self):
+ self.f_stage.stop(restart_programs=True)
+ self.xyz_stage.stop(restart_programs=True)
+ self.pidevice.STP(noraise=True)
+
+ def load_sample(self):
+ self.move_absolute({'y_abs':self.cfg.stage_parameters['y_load_position']})
+
+ def unload_sample(self):
+ self.move_absolute({'y_abs':self.cfg.stage_parameters['y_unload_position']})
+
+ def go_to_rotation_position(self, wait_until_done=False):
+ self.move_absolute({'x_abs':self.x_rot_position, 'y_abs':self.y_rot_position, 'z_abs':self.z_rot_position})
+ if wait_until_done == True:
+ self.xyz_stage.wait_until_done('XYZ')
+
+ def block_till_controller_is_ready(self):
+ '''
+ Blocks further execution (especially during referencing moves)
+ till the PI controller returns ready
+ '''
+ blockflag = True
+ while blockflag:
+ if self.pidevice.IsControllerReady():
+ blockflag = False
+ else:
+ time.sleep(0.1)
+
+ def execute_program(self):
+ '''Executes program stored on the Galil controller'''
+ self.f_stage.execute_program()
+ self.xyz_stage.execute_program()
+
+class mesoSPIM_PI_rotzf_and_Galil_xy_Stages(mesoSPIM_Stage):
+ '''
+ Expects following microscope configuration:
+
+ Sample XY movement: Galil controller with 2 axes
+ Z-Movement, F-Movement and Rotation: PI C-884 mercury controller
+
+ It is expected that the parent class has the following signals:
+ sig_move_relative = pyqtSignal(dict)
+ sig_move_relative_and_wait_until_done = pyqtSignal(dict)
+ sig_move_absolute = pyqtSignal(dict)
+ sig_move_absolute_and_wait_until_done = pyqtSignal(dict)
+ sig_zero = pyqtSignal(list)
+ sig_unzero = pyqtSignal(list)
+ sig_stop_movement = pyqtSignal()
+ sig_mark_rotation_position = pyqtSignal()
+
+ Also contains a QTimer that regularily sends position updates, e.g
+ during the execution of movements.
+
+ '''
+
+ def __init__(self, parent = None):
+ super().__init__(parent)
+
+ self.pos_timer = QtCore.QTimer(self)
+ self.pos_timer.timeout.connect(self.report_position)
+ self.pos_timer.start(50)
+ '''
+ Galil-specific code
+ '''
+ from src.devices.stages.galil.galilcontrol import StageControlGalil
+
+ self.x_encodercounts_per_um = self.cfg.xy_galil_parameters['x_encodercounts_per_um']
+ self.y_encodercounts_per_um = self.cfg.xy_galil_parameters['y_encodercounts_per_um']
+
+ ''' Setting up the Galil stages: XYZ '''
+ self.xy_stage = StageControlGalil(self.cfg.xy_galil_parameters['port'],[self.x_encodercounts_per_um,
+ self.y_encodercounts_per_um])
+
+ ''' PI-specific code '''
+ from pipython import GCSDevice, pitools
+
+ self.pitools = pitools
+
+ ''' Setting up the PI stages '''
+ self.pi = self.cfg.pi_parameters
+
+ self.controllername = self.cfg.pi_parameters['controllername']
+ self.pi_stages = self.cfg.pi_parameters['stages']
+ # ('M-112K033','L-406.40DG10','M-112K033','M-116.DG','M-406.4PD','NOSTAGE')
+ self.refmode = self.cfg.pi_parameters['refmode']
+ # self.serialnum = ('118015439') # Wyss Geneva
+ self.serialnum = self.cfg.pi_parameters['serialnum'] # UZH Irchel H45
+
+ self.pidevice = GCSDevice(self.controllername)
+ self.pidevice.ConnectUSB(serialnum=self.serialnum)
+
+ ''' PI startup '''
+
+ ''' with refmode enabled: pretty dangerous
+ pitools.startup(self.pidevice, stages=self.pi_stages, refmode=self.refmode)
+ '''
+ pitools.startup(self.pidevice, stages=self.pi_stages)
+
+ ''' Setting PI velocities '''
+ self.pidevice.VEL(self.cfg.pi_parameters['velocity'])
+
+ print('M-406 Emergency referencing hack: Waiting for referencing move')
+ logger.info('M-406 Emergency referencing hack: Waiting for referencing move')
+ self.pidevice.FRF(2)
+ print('M-406 Emergency referencing hack done')
+ logger.info('M-406 Emergency referencing hack done')
+
+ print('M-605.2DD Emergency referencing hack: Waiting for referencing move')
+ logger.info('M-605.2DD Emergency referencing hack: Waiting for referencing move')
+ self.pidevice.FRF(3)
+ print('M-605.2DD Emergency referencing hack done')
+ logger.info('M-605.2DD Emergency referencing hack done')
+
+ self.block_till_controller_is_ready()
+
+ ''' Stage 3 close to good focus'''
+ self.startfocus = self.cfg.stage_parameters['startfocus']
+ self.pidevice.MOV(3,self.startfocus/1000)
+
+ def __del__(self):
+ try:
+ '''Close the Galil connection'''
+ self.xy_stage.close()
+ logger.info('Galil stages disconnected')
+ except:
+ logger.info('Error while disconnecting the Galil stages')
+
+ def report_position(self):
+ positions = self.pidevice.qPOS(self.pidevice.axes)
+
+ '''
+ Ugly workaround to deal with non-responding stage
+ position reports: Do not update positions in
+ exceptional circumstances.
+ '''
+ try:
+ self.x_pos, self.y_pos = self.xy_stage.read_position()
+ except:
+ logger.info('Error while unpacking Galil stage position values')
+
+
+ self.f_pos = round(positions['3']*1000,2)
+ self.z_pos = round(positions['2']*1000,2)
+ self.theta_pos = positions['1']
+
+ self.create_position_dict()
+
+ self.int_x_pos = self.x_pos + self.int_x_pos_offset
+ self.int_y_pos = self.y_pos + self.int_y_pos_offset
+ self.int_z_pos = self.z_pos + self.int_z_pos_offset
+ self.int_f_pos = self.f_pos + self.int_f_pos_offset
+ self.int_theta_pos = self.theta_pos + self.int_theta_pos_offset
+
+ self.create_internal_position_dict()
+
+ self.sig_position.emit(self.int_position_dict)
+ #print(self.int_position_dict)
+
+ def move_relative(self, dict, wait_until_done=False):
+ ''' Galil move relative method
+
+ Lots of implementation details in here, should be replaced by a facade
+ '''
+ xy_motion_dict = {}
+
+ if 'x_rel' in dict:
+ x_rel = dict['x_rel']
+ if self.x_min < self.x_pos + x_rel and self.x_max > self.x_pos + x_rel:
+ xy_motion_dict.update({1:int(x_rel)})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: X Motion limit would be reached!',1000)
+
+ if 'y_rel' in dict:
+ y_rel = dict['y_rel']
+ if self.y_min < self.y_pos + y_rel and self.y_max > self.y_pos + y_rel:
+ xy_motion_dict.update({2:int(y_rel)})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: Y Motion limit would be reached!',1000)
+
+ if 'z_rel' in dict:
+ z_rel = dict['z_rel']
+ if self.z_min < self.z_pos + z_rel and self.z_max > self.z_pos + z_rel:
+ z_rel = z_rel/1000
+ self.pidevice.MVR({2 : z_rel})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: z Motion limit would be reached!',1000)
+
+ if 'theta_rel' in dict:
+ theta_rel = dict['theta_rel']
+ if self.theta_min < self.theta_pos + theta_rel and self.theta_max > self.theta_pos + theta_rel:
+ self.pidevice.MVR({1 : theta_rel})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: theta Motion limit would be reached!',1000)
+
+ if 'f_rel' in dict:
+ f_rel = dict['f_rel']
+ if self.f_min < self.f_pos + f_rel and self.f_max > self.f_pos + f_rel:
+ f_rel = f_rel/1000
+ self.pidevice.MVR({3 : f_rel})
+ else:
+ self.sig_status_message.emit('Relative movement stopped: f Motion limit would be reached!',1000)
+
+ if xy_motion_dict != {}:
+ self.xy_stage.move_relative(xy_motion_dict)
+
+ if wait_until_done == True:
+ self.xy_stage.wait_until_done('XY')
+ self.pitools.waitontarget(self.pidevice)
+
+
+ def move_absolute(self, dict, wait_until_done=False):
+ '''
+ Galil move absolute method
+
+ Lots of implementation details in here, should be replaced by a facade
+
+ '''
+ xy_motion_dict = {}
+
+ if 'x_abs' or 'y_abs'in dict:
+ if 'x_abs' in dict:
+ x_abs = dict['x_abs']
+ x_abs = x_abs - self.int_x_pos_offset
+ xy_motion_dict.update({1:x_abs})
+
+ if 'y_abs' in dict:
+ y_abs = dict['y_abs']
+ y_abs = y_abs - self.int_y_pos_offset
+ xy_motion_dict.update({2:y_abs})
+
+ if xy_motion_dict != {}:
+ self.xy_stage.move_absolute(xy_motion_dict)
+
+ if wait_until_done == True:
+ self.xy_stage.wait_until_done('XYZ')
+
+ if 'f_abs' in dict:
+ f_abs = dict['f_abs']
+ f_abs = f_abs - self.int_f_pos_offset
+ if self.f_min < f_abs and self.f_max > f_abs:
+ ''' Conversion to mm and command emission'''
+ f_abs= f_abs/1000
+ self.pidevice.MOV({3 : f_abs})
+ else:
+ self.sig_status_message.emit('Absolute movement stopped: F Motion limit would be reached!',1000)
+
+ if 'z_abs' in dict:
+ z_abs = dict['z_abs']
+ z_abs = z_abs - self.int_z_pos_offset
+ if self.z_min < z_abs and self.z_max > z_abs:
+ ''' Conversion to mm and command emission'''
+ z_abs= z_abs/1000
+ self.pidevice.MOV({2 : z_abs})
+ else:
+ self.sig_status_message.emit('Absolute movement stopped: Z Motion limit would be reached!',1000)
+
+ if 'theta_abs' in dict:
+ theta_abs = dict['theta_abs']
+ theta_abs = theta_abs - self.int_theta_pos_offset
+ if self.theta_min < theta_abs and self.theta_max > theta_abs:
+ ''' No Conversion to mm !!!! and command emission'''
+ self.pidevice.MOV({1 : theta_abs})
+ else:
+ self.sig_status_message.emit('Absolute movement stopped: Theta Motion limit would be reached!',1000)
+
+ if wait_until_done == True:
+ self.xy_stage.wait_until_done('XY')
+ self.pitools.waitontarget(self.pidevice)
+
+ def stop(self):
+ self.xy_stage.stop(restart_programs=True)
+ self.pidevice.STP(noraise=True)
+
+ def load_sample(self):
+ self.xy_stage.move_absolute({2:self.cfg.stage_parameters['y_load_position']})
+
+ def unload_sample(self):
+ self.xy_stage.move_absolute({2:self.cfg.stage_parameters['y_unload_position']})
+
+ def go_to_rotation_position(self, wait_until_done=False):
+ ''' This has to be done in absolute coordinates of the stages to avoid problems with the
+ internal position offset (when the stage is zeroed). '''
+ xy_motion_dict = {1:self.x_rot_position, 2: self.y_rot_position}
+ self.xy_stage.move_absolute(xy_motion_dict)
+ self.pidevice.MOV({2 : self.z_rot_position/1000})
+
+ if wait_until_done == True:
+ self.xy_stage.wait_until_done('XY')
+ self.pitools.waitontarget(self.pidevice)
+
+ def block_till_controller_is_ready(self):
+ '''
+ Blocks further execution (especially during referencing moves)
+ till the PI controller returns ready
+ '''
+ blockflag = True
+ while blockflag:
+ if self.pidevice.IsControllerReady():
+ blockflag = False
+ else:
+ time.sleep(0.1)
+
+ def execute_program(self):
+ '''Executes program stored on the Galil controller'''
+ self.xy_stage.execute_program()
\ No newline at end of file
diff --git a/mesoSPIM/src/mesoSPIM_State.py b/mesoSPIM/src/mesoSPIM_State.py
index 9043571..279d312 100644
--- a/mesoSPIM/src/mesoSPIM_State.py
+++ b/mesoSPIM/src/mesoSPIM_State.py
@@ -47,9 +47,9 @@ def __init__(self):
'position' : {'x_pos':0,'y_pos':0,'z_pos':0,'f_pos':0,'theta_pos':0},
'ETL_cfg_file' : 'config/etl_parameters/ETL-parameters.csv',
'filename' : 'file.raw',
- 'folder' : '/tmp/',
+ 'folder' : 'tmp',
+ 'snap_folder' : 'tmp',
'file_prefix' : '',
- 'start_number' : 1,
'file_suffix' : '000001',
'zoom' : '1x',
'pixelsize' : 6.55,
@@ -93,6 +93,11 @@ def __init__(self):
'camera_display_live_subsampling': 1,
'camera_display_snap_subsampling': 1,
'camera_display_acquisition_subsampling': 2,
+ 'camera_binning':'1x1',
+ 'camera_sensor_mode':'ASLM',
+ 'current_framerate':3.8,
+ 'predicted_acq_list_time':1,
+ 'remaining_acq_list_time':1,
}
def __len__(self):
diff --git a/mesoSPIM/src/mesoSPIM_WaveFormGenerator.py b/mesoSPIM/src/mesoSPIM_WaveFormGenerator.py
index 6b286da..b19f23f 100644
--- a/mesoSPIM/src/mesoSPIM_WaveFormGenerator.py
+++ b/mesoSPIM/src/mesoSPIM_WaveFormGenerator.py
@@ -1,9 +1,10 @@
'''
-mesoSPIM Waveform Generator - Creates and allows control of waveform generation.
+mesoSPIM Waveform Generator - Creates and allows control of waveform generation.
'''
import os
import numpy as np
import csv
+import time
import logging
logger = logging.getLogger(__name__)
@@ -23,7 +24,7 @@
class mesoSPIM_WaveFormGenerator(QtCore.QObject):
'''This class contains the microscope state
- Any access to this global state should only be done via signals sent by
+ Any access to this global state should only be done via signals sent by
the responsible class for actually causing that state change in hardware.
'''
@@ -41,7 +42,7 @@ def __init__(self, parent):
cfg_file = self.cfg.startup['ETL_cfg_file']
self.state['ETL_cfg_file'] = cfg_file
self.update_etl_parameters_from_csv(cfg_file, self.state['laser'], self.state['zoom'])
-
+
logger.info('Thread ID at Startup: '+str(int(QtCore.QThread.currentThreadId())))
self.state['galvo_l_amplitude'] = self.cfg.startup['galvo_l_amplitude']
@@ -56,7 +57,7 @@ def state_request_handler(self, dict):
for key, value in zip(dict.keys(),dict.values()):
# print('Waveform Generator: State request: Key: ', key, ' Value: ', value)
'''
- The request handling is done
+ The request handling is done
'''
if key in ('samplerate',
'sweeptime',
@@ -90,33 +91,36 @@ def state_request_handler(self, dict):
'camera_delay_%',
'camera_pulse_%'):
''' Notify GUI about the change '''
- self.sig_update_gui_from_state.emit(True)
+ #self.sig_update_gui_from_state.emit(True)
self.state[key] = value
- self.sig_update_gui_from_state.emit(False)
+ #self.sig_update_gui_from_state.emit(False)
self.create_waveforms()
# print('Waveform change')
elif key in ('ETL_cfg_file'):
self.state[key] = value
self.update_etl_parameters_from_csv(value, self.state['laser'], self.state['zoom'])
# print('ETL CFG File changed')
- elif key in ('zoom'):
+ elif key in ('set_etls_according_to_zoom'):
self.update_etl_parameters_from_zoom(value)
#print('zoom change')
- elif key in ('laser'):
- self.state[key] = value
+ elif key in ('set_etls_according_to_laser'):
+ self.state['laser'] = value
self.create_waveforms()
self.update_etl_parameters_from_laser(value)
#print('laser change')
+ elif key in ('laser'):
+ self.state['laser'] = value
+ self.create_waveforms()
# Log Thread ID during Live: just debugging code
elif key == 'state':
if value == 'live':
logger.info('Thread ID during live: '+str(int(QtCore.QThread.currentThreadId())))
-
+
def calculate_samples(self):
samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
self.samples = int(samplerate*sweeptime)
-
+
def create_waveforms(self):
self.calculate_samples()
self.create_etl_waveforms()
@@ -155,11 +159,11 @@ def create_galvo_waveforms(self):
samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
galvo_l_frequency, galvo_l_amplitude, galvo_l_offset, galvo_l_duty_cycle, galvo_l_phase =\
- self.state.get_parameter_list(['galvo_l_frequency', 'galvo_l_amplitude', 'galvo_l_offset',
+ self.state.get_parameter_list(['galvo_l_frequency', 'galvo_l_amplitude', 'galvo_l_offset',
'galvo_l_duty_cycle', 'galvo_l_phase'])
galvo_r_frequency, galvo_r_amplitude, galvo_r_offset, galvo_r_duty_cycle, galvo_r_phase =\
- self.state.get_parameter_list(['galvo_r_frequency', 'galvo_r_amplitude', 'galvo_r_offset',
+ self.state.get_parameter_list(['galvo_r_frequency', 'galvo_r_amplitude', 'galvo_r_offset',
'galvo_r_duty_cycle', 'galvo_r_phase'])
'''Create Galvo waveforms:'''
@@ -197,7 +201,7 @@ def create_laser_waveforms(self):
''' Conversion from % to V of the intensity:'''
laser_voltage = max_laser_voltage * intensity / 100
-
+
self.laser_template_waveform = single_pulse(samplerate = samplerate,
sweeptime = sweeptime,
delay = laser_l_delay,
@@ -226,13 +230,13 @@ def update_etl_parameters_from_zoom(self, zoom):
''' Little helper method: Because the mesoSPIM core is not handling
the serial Zoom connection. '''
laser = self.state['laser']
- etl_cfg_file = self.state['ETL_cfg_file']
+ etl_cfg_file = self.state['ETL_cfg_file']
self.update_etl_parameters_from_csv(etl_cfg_file, laser, zoom)
def update_etl_parameters_from_laser(self, laser):
''' Little helper method: Because laser changes need an ETL parameter update '''
zoom = self.state['zoom']
- etl_cfg_file = self.state['ETL_cfg_file']
+ etl_cfg_file = self.state['ETL_cfg_file']
self.update_etl_parameters_from_csv(etl_cfg_file, laser, zoom)
def update_etl_parameters_from_csv(self, cfg_path, laser, zoom):
@@ -252,6 +256,7 @@ def update_etl_parameters_from_csv(self, cfg_path, laser, zoom):
'''
# print('Updating ETL parameters from file:', cfg_path)
+ self.sig_update_gui_from_state.emit(True)
with open(cfg_path) as file:
reader = csv.DictReader(file,delimiter=';')
#print('opened csv')
@@ -265,7 +270,7 @@ def update_etl_parameters_from_csv(self, cfg_path, laser, zoom):
# print(self.etl_l['amplitude'])
'''
-
+
''' updating internal state '''
etl_l_offset = float(row['ETL-Left-Offset'])
etl_l_amplitude = float(row['ETL-Left-Amp'])
@@ -278,13 +283,13 @@ def update_etl_parameters_from_csv(self, cfg_path, laser, zoom):
'etl_r_amplitude' : etl_r_amplitude}
''' Now the GUI needs to be updated '''
- self.sig_update_gui_from_state.emit(True)
+ # print('Parameters set from csv')
self.state.set_parameters(parameter_dict)
- self.sig_update_gui_from_state.emit(False)
'''Update waveforms with the new parameters'''
self.create_waveforms()
+ self.sig_update_gui_from_state.emit(False)
@QtCore.pyqtSlot()
def save_etl_parameters_to_csv(self):
@@ -305,9 +310,9 @@ def save_etl_parameters_to_csv(self):
'''
etl_cfg_file, laser, zoom, etl_l_offset, etl_l_amplitude, etl_r_offset, etl_r_amplitude = \
- self.state.get_parameter_list(['ETL_cfg_file', 'laser', 'zoom',
+ self.state.get_parameter_list(['ETL_cfg_file', 'laser', 'zoom',
'etl_l_offset', 'etl_l_amplitude', 'etl_r_offset','etl_r_amplitude'])
-
+
'''Temporary filepath'''
tmp_etl_cfg_file = etl_cfg_file+'_tmp'
@@ -403,8 +408,8 @@ def create_tasks(self):
self.laser_task.timing.cfg_samp_clk_timing(rate=samplerate,
sample_mode=AcquisitionType.FINITE,
samps_per_chan=samples)
- self.laser_task.triggers.start_trigger.cfg_dig_edge_start_trig(ah['laser_task_trigger_source'])
-
+ self.laser_task.triggers.start_trigger.cfg_dig_edge_start_trig(ah['laser_task_trigger_source'])
+
def write_waveforms_to_tasks(self):
'''Write the waveforms to the slave tasks'''
self.galvo_etl_task.write(self.galvo_and_etl_waveforms)
@@ -451,4 +456,376 @@ def close_tasks(self):
self.galvo_etl_task.close()
self.laser_task.close()
self.camera_trigger_task.close()
- self.master_trigger_task.close()
\ No newline at end of file
+ self.master_trigger_task.close()
+
+class mesoSPIM_DemoWaveFormGenerator(QtCore.QObject):
+ '''This class contains the microscope state
+
+ Any access to this global state should only be done via signals sent by
+ the responsible class for actually causing that state change in hardware.
+
+ '''
+ sig_update_gui_from_state = QtCore.pyqtSignal(bool)
+
+ def __init__(self, parent):
+ super().__init__()
+
+ self.cfg = parent.cfg
+ self.parent = parent
+
+ self.state = mesoSPIM_StateSingleton()
+ self.parent.sig_save_etl_config.connect(self.save_etl_parameters_to_csv)
+
+ cfg_file = self.cfg.startup['ETL_cfg_file']
+ self.state['ETL_cfg_file'] = cfg_file
+ self.update_etl_parameters_from_csv(cfg_file, self.state['laser'], self.state['zoom'])
+
+ logger.info('Thread ID at Startup: '+str(int(QtCore.QThread.currentThreadId())))
+
+ self.state['galvo_l_amplitude'] = self.cfg.startup['galvo_l_amplitude']
+ self.state['galvo_r_amplitude'] = self.cfg.startup['galvo_r_amplitude']
+ self.state['galvo_l_frequency'] = self.cfg.startup['galvo_l_frequency']
+ self.state['galvo_r_frequency'] = self.cfg.startup['galvo_r_frequency']
+ self.state['galvo_l_offset'] = self.cfg.startup['galvo_l_offset']
+ self.state['galvo_r_offset'] = self.cfg.startup['galvo_r_offset']
+
+ @QtCore.pyqtSlot(dict)
+ def state_request_handler(self, dict):
+ for key, value in zip(dict.keys(),dict.values()):
+ # print('Waveform Generator: State request: Key: ', key, ' Value: ', value)
+ '''
+ The request handling is done
+ '''
+ if key in ('samplerate',
+ 'sweeptime',
+ 'intensity',
+ 'etl_l_delay_%',
+ 'etl_l_ramp_rising_%',
+ 'etl_l_ramp_falling_%',
+ 'etl_l_amplitude',
+ 'etl_l_offset',
+ 'etl_r_delay_%',
+ 'etl_r_ramp_rising_%',
+ 'etl_r_ramp_falling_%',
+ 'etl_r_amplitude',
+ 'etl_r_offset',
+ 'galvo_l_frequency',
+ 'galvo_l_amplitude',
+ 'galvo_l_offset',
+ 'galvo_l_duty_cycle',
+ 'galvo_l_phase',
+ 'galvo_r_frequency',
+ 'galvo_r_amplitude',
+ 'galvo_r_offset',
+ 'galvo_r_duty_cycle',
+ 'galvo_r_phase',
+ 'laser_l_delay_%',
+ 'laser_l_pulse_%',
+ 'laser_l_max_amplitude',
+ 'laser_r_delay_%',
+ 'laser_r_pulse_%',
+ 'laser_r_max_amplitude',
+ 'camera_delay_%',
+ 'camera_pulse_%'):
+ ''' Notify GUI about the change '''
+ #self.sig_update_gui_from_state.emit(True)
+ self.state[key] = value
+ #self.sig_update_gui_from_state.emit(False)
+ self.create_waveforms()
+ # print('Waveform change')
+ elif key in ('ETL_cfg_file'):
+ self.state[key] = value
+ self.update_etl_parameters_from_csv(value, self.state['laser'], self.state['zoom'])
+ # print('ETL CFG File changed')
+ elif key in ('zoom'):
+ self.update_etl_parameters_from_zoom(value)
+ #print('zoom change')
+ elif key in ('laser'):
+ self.state[key] = value
+ self.create_waveforms()
+ self.update_etl_parameters_from_laser(value)
+ #print('laser change')
+
+ # Log Thread ID during Live: just debugging code
+ elif key == 'state':
+ if value == 'live':
+ logger.info('Thread ID during live: '+str(int(QtCore.QThread.currentThreadId())))
+
+ def calculate_samples(self):
+ samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
+ self.samples = int(samplerate*sweeptime)
+
+ def create_waveforms(self):
+ self.calculate_samples()
+ self.create_etl_waveforms()
+ self.create_galvo_waveforms()
+ '''Bundle everything'''
+ self.bundle_galvo_and_etl_waveforms()
+ self.create_laser_waveforms()
+
+ def create_etl_waveforms(self):
+ samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
+ etl_l_delay, etl_l_ramp_rising, etl_l_ramp_falling, etl_l_amplitude, etl_l_offset =\
+ self.state.get_parameter_list(['etl_l_delay_%','etl_l_ramp_rising_%','etl_l_ramp_falling_%',
+ 'etl_l_amplitude','etl_l_offset'])
+ etl_r_delay, etl_r_ramp_rising, etl_r_ramp_falling, etl_r_amplitude, etl_r_offset =\
+ self.state.get_parameter_list(['etl_r_delay_%','etl_r_ramp_rising_%','etl_r_ramp_falling_%',
+ 'etl_r_amplitude','etl_r_offset'])
+
+
+ self.etl_l_waveform = tunable_lens_ramp(samplerate = samplerate,
+ sweeptime = sweeptime,
+ delay = etl_l_delay,
+ rise = etl_l_ramp_rising,
+ fall = etl_l_ramp_falling,
+ amplitude = etl_l_amplitude,
+ offset = etl_l_offset)
+
+ self.etl_r_waveform = tunable_lens_ramp(samplerate = samplerate,
+ sweeptime = sweeptime,
+ delay = etl_r_delay,
+ rise = etl_r_ramp_rising,
+ fall = etl_r_ramp_falling,
+ amplitude = etl_r_amplitude,
+ offset = etl_r_offset)
+
+ def create_galvo_waveforms(self):
+ samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
+
+ galvo_l_frequency, galvo_l_amplitude, galvo_l_offset, galvo_l_duty_cycle, galvo_l_phase =\
+ self.state.get_parameter_list(['galvo_l_frequency', 'galvo_l_amplitude', 'galvo_l_offset',
+ 'galvo_l_duty_cycle', 'galvo_l_phase'])
+
+ galvo_r_frequency, galvo_r_amplitude, galvo_r_offset, galvo_r_duty_cycle, galvo_r_phase =\
+ self.state.get_parameter_list(['galvo_r_frequency', 'galvo_r_amplitude', 'galvo_r_offset',
+ 'galvo_r_duty_cycle', 'galvo_r_phase'])
+
+ '''Create Galvo waveforms:'''
+ self.galvo_l_waveform = sawtooth(samplerate = samplerate,
+ sweeptime = sweeptime,
+ frequency = galvo_l_frequency,
+ amplitude = galvo_l_amplitude,
+ offset = galvo_l_offset,
+ dutycycle = galvo_l_duty_cycle,
+ phase = galvo_l_phase)
+
+ ''' Attention: Right Galvo gets the left frequency for now '''
+
+ self.galvo_r_waveform = sawtooth(samplerate = samplerate,
+ sweeptime = sweeptime,
+ frequency = galvo_l_frequency,
+ amplitude = galvo_r_amplitude,
+ offset = galvo_r_offset,
+ dutycycle = galvo_r_duty_cycle,
+ phase = galvo_r_phase)
+
+ def create_laser_waveforms(self):
+ samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
+
+ laser_l_delay, laser_l_pulse, max_laser_voltage, intensity = \
+ self.state.get_parameter_list(['laser_l_delay_%','laser_l_pulse_%',
+ 'max_laser_voltage','intensity'])
+
+ '''Create zero waveforms for the lasers'''
+ self.zero_waveform = np.zeros((self.samples))
+
+ '''Update the laser intensity waveform'''
+ '''This could be improved: create a list with as many zero arrays as analog out lines for ETL and Lasers'''
+ self.laser_waveform_list = [self.zero_waveform for i in self.cfg.laser_designation]
+
+ ''' Conversion from % to V of the intensity:'''
+ laser_voltage = max_laser_voltage * intensity / 100
+
+ self.laser_template_waveform = single_pulse(samplerate = samplerate,
+ sweeptime = sweeptime,
+ delay = laser_l_delay,
+ pulsewidth = laser_l_pulse,
+ amplitude = laser_voltage,
+ offset = 0)
+
+ '''The key: replace the waveform in the waveform list with this new template'''
+ current_laser_index = self.cfg.laser_designation[self.state['laser']]
+ self.laser_waveform_list[current_laser_index] = self.laser_template_waveform
+ self.laser_waveforms = np.stack(self.laser_waveform_list)
+
+ def bundle_galvo_and_etl_waveforms(self):
+ ''' Stacks the Galvo and ETL waveforms into a numpy array adequate for
+ the NI cards.
+
+ In here, the assignment of output channels of the Galvo / ETL card to the
+ corresponding output channel is hardcoded: This could be improved.
+ '''
+ self.galvo_and_etl_waveforms = np.stack((self.galvo_l_waveform,
+ self.galvo_r_waveform,
+ self.etl_l_waveform,
+ self.etl_r_waveform))
+
+ def update_etl_parameters_from_zoom(self, zoom):
+ ''' Little helper method: Because the mesoSPIM core is not handling
+ the serial Zoom connection. '''
+ laser = self.state['laser']
+ etl_cfg_file = self.state['ETL_cfg_file']
+ self.update_etl_parameters_from_csv(etl_cfg_file, laser, zoom)
+
+ def update_etl_parameters_from_laser(self, laser):
+ ''' Little helper method: Because laser changes need an ETL parameter update '''
+ zoom = self.state['zoom']
+ etl_cfg_file = self.state['ETL_cfg_file']
+ self.update_etl_parameters_from_csv(etl_cfg_file, laser, zoom)
+
+ def update_etl_parameters_from_csv(self, cfg_path, laser, zoom):
+ ''' Updates the internal ETL left/right offsets and amplitudes from the
+ values in the ETL csv files
+
+ The .csv file needs to contain the follwing columns:
+
+ Wavelength
+ Zoom
+ ETL-Left-Offset
+ ETL-Left-Amp
+ ETL-Right-Offset
+ ETL-Right-Amp
+
+
+ '''
+ # print('Updating ETL parameters from file:', cfg_path)
+
+ with open(cfg_path) as file:
+ reader = csv.DictReader(file,delimiter=';')
+ #print('opened csv')
+ for row in reader:
+ if row['Wavelength'] == laser and row['Zoom'] == zoom:
+
+ ''' Some diagnostic tracing statements
+
+ # print(row)
+ # print('updating parameters')
+ # print(self.etl_l['amplitude'])
+
+ '''
+
+ ''' updating internal state '''
+ etl_l_offset = float(row['ETL-Left-Offset'])
+ etl_l_amplitude = float(row['ETL-Left-Amp'])
+ etl_r_offset = float(row['ETL-Right-Offset'])
+ etl_r_amplitude = float(row['ETL-Right-Amp'])
+
+ parameter_dict = {'etl_l_offset': etl_l_offset,
+ 'etl_l_amplitude' : etl_l_amplitude,
+ 'etl_r_offset' : etl_r_offset,
+ 'etl_r_amplitude' : etl_r_amplitude}
+
+ ''' Now the GUI needs to be updated '''
+ self.sig_update_gui_from_state.emit(True)
+ self.state.set_parameters(parameter_dict)
+ self.sig_update_gui_from_state.emit(False)
+
+ '''Update waveforms with the new parameters'''
+
+ self.create_waveforms()
+
+ @QtCore.pyqtSlot()
+ def save_etl_parameters_to_csv(self):
+ ''' Saves the current ETL left/right offsets and amplitudes from the
+ values to the ETL csv files
+
+ The .csv file needs to contain the following columns:
+
+ Wavelength
+ Zoom
+ ETL-Left-Offset
+ ETL-Left-Amp
+ ETL-Right-Offset
+ ETL-Right-Amp
+
+ Creates a temporary cfg file with the ending _tmp
+
+ '''
+
+ etl_cfg_file, laser, zoom, etl_l_offset, etl_l_amplitude, etl_r_offset, etl_r_amplitude = \
+ self.state.get_parameter_list(['ETL_cfg_file', 'laser', 'zoom',
+ 'etl_l_offset', 'etl_l_amplitude', 'etl_r_offset','etl_r_amplitude'])
+
+ '''Temporary filepath'''
+ tmp_etl_cfg_file = etl_cfg_file+'_tmp'
+
+ # print('saving current ETL parameters')
+
+ with open(etl_cfg_file,'r') as input_file, open(tmp_etl_cfg_file,'w') as outputfile:
+ reader = csv.DictReader(input_file,delimiter=';')
+ #print('created reader')
+ fieldnames = ['Objective',
+ 'Wavelength',
+ 'Zoom',
+ 'ETL-Left-Offset',
+ 'ETL-Left-Amp',
+ 'ETL-Right-Offset',
+ 'ETL-Right-Amp']
+
+ writer = csv.DictWriter(outputfile,fieldnames=fieldnames,dialect='excel',delimiter=';')
+ #print('created writer')
+
+ writer.writeheader()
+
+ for row in reader:
+ if row['Wavelength'] == laser and row['Zoom'] == zoom:
+
+ writer.writerow({'Objective' : '1x',
+ 'Wavelength' : laser,
+ 'Zoom' : zoom,
+ 'ETL-Left-Offset' : etl_l_offset,
+ 'ETL-Left-Amp' : etl_l_amplitude,
+ 'ETL-Right-Offset' : etl_r_offset,
+ 'ETL-Right-Amp' : etl_r_amplitude,
+ })
+
+ else:
+ writer.writerow(row)
+
+ writer.writerows(reader)
+
+ os.remove(etl_cfg_file)
+ os.rename(tmp_etl_cfg_file, etl_cfg_file)
+
+ def create_tasks(self):
+
+ self.calculate_samples()
+ samplerate, sweeptime = self.state.get_parameter_list(['samplerate','sweeptime'])
+ samples = self.samples
+ camera_pulse_percent, camera_delay_percent = self.state.get_parameter_list(['camera_pulse_%','camera_delay_%'])
+
+ self.camera_high_time = camera_pulse_percent*0.01*sweeptime
+ self.camera_delay = camera_delay_percent*0.01*sweeptime
+
+ def write_waveforms_to_tasks(self):
+ '''Write the waveforms to the slave tasks'''
+ pass
+
+ def start_tasks(self):
+ '''Starts the tasks for camera triggering and analog outputs
+
+ If the tasks are configured to be triggered, they won't output any
+ signals until run_tasks() is called.
+ '''
+ pass
+
+ def run_tasks(self):
+ '''Runs the tasks for triggering, analog and counter outputs
+
+ Firstly, the master trigger triggers all other task via a shared trigger
+ line (PFI line as given in the config file).
+
+ For this to work, all analog output and counter tasks have to be started so
+ that they are waiting for the trigger signal.
+ '''
+ time.sleep(self.state['sweeptime'])
+
+ def stop_tasks(self):
+ pass
+
+ def close_tasks(self):
+ '''Closes the tasks for triggering, analog and counter outputs.
+
+ Tasks should only be closed are they are stopped.
+ '''
+ pass
diff --git a/mesoSPIM/src/utils/acquisition_builder.py b/mesoSPIM/src/utils/acquisition_builder.py
index 97c593c..10652cd 100644
--- a/mesoSPIM/src/utils/acquisition_builder.py
+++ b/mesoSPIM/src/utils/acquisition_builder.py
@@ -57,28 +57,28 @@ def __init__(self, dict):
'''
Core loop: Create an acquisition list for all x & y values
'''
-
+ tilecount = 0
for i in range(0,self.dict['x_image_count']):
self.x_pos = round(self.x_start + i * self.x_offset,2)
for j in range(0,self.dict['y_image_count']):
self.y_pos = round(self.y_start + j * self.y_offset,2)
-
acq = Acquisition( x_pos=self.x_pos,
y_pos=self.y_pos,
z_start=self.dict['z_start'],
z_end=self.dict['z_end'],
z_step=self.dict['z_step'],
theta_pos=self.dict['theta_pos'],
- f_pos=round(self.dict['f_pos'],2),
+ f_start=round(self.dict['f_start'],2),
+ f_end=round(self.dict['f_end'],2),
laser=self.dict['laser'],
intensity=self.dict['intensity'],
filter=self.dict['filter'],
zoom=self.dict['zoom'],
shutterconfig=self.dict['shutterconfig'],
folder=self.dict['folder'],
- filename='tiling_file_'+str(i)+'_'+str(j)+'.raw',
+ filename='tiling_file_'+str(tilecount)+'.raw',
etl_l_offset=self.dict['etl_l_offset'],
etl_l_amplitude=self.dict['etl_l_amplitude'],
etl_r_offset=self.dict['etl_r_offset'],
@@ -89,6 +89,7 @@ def __init__(self, dict):
acq['planes']=acq.get_image_count()
self.acq_prelist.append(acq)
+ tilecount += 1
def get_acquisition_list(self):
return AcquisitionList(self.acq_prelist)
diff --git a/mesoSPIM/src/utils/acquisition_wizards.py b/mesoSPIM/src/utils/acquisition_wizards.py
index b5f6ba8..d4c3da4 100644
--- a/mesoSPIM/src/utils/acquisition_wizards.py
+++ b/mesoSPIM/src/utils/acquisition_wizards.py
@@ -40,6 +40,8 @@ def __init__(self, parent=None):
self.z_start = 0
self.z_end = 0
self.z_step = 1
+ self.f_start = 0
+ self.f_end = 0
self.x_offset = 0
self.y_offset = 0
self.zoom = '1x'
@@ -91,7 +93,7 @@ def done(self, r):
# self.print_dict()
self.update_model(self.parent.model, self.acq_list)
''' Update state with this new list '''
- self.parent.update_persistent_editors()
+ # self.parent.update_persistent_editors()
self.wizard_done.emit()
else:
print('Wizard provided return code: ', r)
@@ -148,7 +150,8 @@ def get_dict(self):
'z_end' : self.z_end,
'z_step' : self.z_step,
'theta_pos' : self.theta_pos,
- 'f_pos' : self.f_pos,
+ 'f_start' : self.f_start,
+ 'f_end' : self.f_end,
'x_offset' : self.x_offset,
'y_offset' : self.y_offset,
'x_fov' : self.x_fov,
@@ -290,17 +293,23 @@ def __init__(self, parent=None):
self.ZStepSpinBox.setMaximum(1000)
self.ZStepSpinBox.valueChanged.connect(self.update_z_step)
- self.FocusButton = QtWidgets.QPushButton(self)
- self.FocusButton.setText('Set Focus')
- self.FocusButton.setCheckable(True)
- self.FocusButton.toggled.connect(self.update_focus_position)
+ self.StartFocusButton = QtWidgets.QPushButton(self)
+ self.StartFocusButton.setText('Set start focus')
+ self.StartFocusButton.setCheckable(True)
+ self.StartFocusButton.toggled.connect(self.update_start_focus_position)
+
+ self.EndFocusButton = QtWidgets.QPushButton(self)
+ self.EndFocusButton.setText('Set end focus')
+ self.EndFocusButton.setCheckable(True)
+ self.EndFocusButton.toggled.connect(self.update_end_focus_position)
self.layout = QtWidgets.QGridLayout()
self.layout.addWidget(self.ZStartButton, 0, 0)
self.layout.addWidget(self.ZEndButton, 0, 1)
self.layout.addWidget(self.ZSpinBoxLabel, 2, 0)
self.layout.addWidget(self.ZStepSpinBox, 2, 1)
- self.layout.addWidget(self.FocusButton, 3, 0)
+ self.layout.addWidget(self.StartFocusButton, 3, 0)
+ self.layout.addWidget(self.EndFocusButton, 4, 0)
self.setLayout(self.layout)
self.registerField('z_start_position*',
@@ -311,8 +320,12 @@ def __init__(self, parent=None):
self.ZEndButton,
)
- self.registerField('focus_position*',
- self.FocusButton,
+ self.registerField('start_focus_position*',
+ self.StartFocusButton,
+ )
+
+ self.registerField('end_focus_position*',
+ self.EndFocusButton,
)
def update_z_start_position(self):
@@ -324,8 +337,11 @@ def update_z_end_position(self):
def update_z_step(self):
self.parent.z_step = self.ZStepSpinBox.value()
- def update_focus_position(self):
- self.parent.f_pos = self.parent.state['position']['f_pos']
+ def update_start_focus_position(self):
+ self.parent.f_start = self.parent.state['position']['f_pos']
+
+ def update_end_focus_position(self):
+ self.parent.f_end = self.parent.state['position']['f_pos']
class OtherAcquisitionParametersPage(QtWidgets.QWizardPage):
'''
@@ -360,12 +376,19 @@ def __init__(self, parent=None):
self.shutterComboBox = QtWidgets.QComboBox(self)
self.shutterComboBox.addItems(self.parent.cfg.shutteroptions)
- self.xyOffsetSpinBoxLabel = QtWidgets.QLabel('XY Offset')
- self.xyOffsetSpinBox = QtWidgets.QSpinBox(self)
- self.xyOffsetSpinBox.setSuffix(' μm')
- self.xyOffsetSpinBox.setMinimum(1)
- self.xyOffsetSpinBox.setMaximum(20000)
- self.xyOffsetSpinBox.setValue(500)
+ self.xOffsetSpinBoxLabel = QtWidgets.QLabel('X Offset')
+ self.xOffsetSpinBox = QtWidgets.QSpinBox(self)
+ self.xOffsetSpinBox.setSuffix(' μm')
+ self.xOffsetSpinBox.setMinimum(1)
+ self.xOffsetSpinBox.setMaximum(20000)
+ self.xOffsetSpinBox.setValue(500)
+
+ self.yOffsetSpinBoxLabel = QtWidgets.QLabel('Y Offset')
+ self.yOffsetSpinBox = QtWidgets.QSpinBox(self)
+ self.yOffsetSpinBox.setSuffix(' μm')
+ self.yOffsetSpinBox.setMinimum(1)
+ self.yOffsetSpinBox.setMaximum(20000)
+ self.yOffsetSpinBox.setValue(500)
self.ETLCheckBoxLabel = QtWidgets.QLabel('ETL')
self.ETLCheckBox = QtWidgets.QCheckBox('Copy current ETL parameters', self)
@@ -382,10 +405,12 @@ def __init__(self, parent=None):
self.layout.addWidget(self.filterComboBox, 3, 1)
self.layout.addWidget(self.shutterLabel, 4, 0)
self.layout.addWidget(self.shutterComboBox, 4, 1)
- self.layout.addWidget(self.xyOffsetSpinBoxLabel, 5, 0)
- self.layout.addWidget(self.xyOffsetSpinBox, 5, 1)
- self.layout.addWidget(self.ETLCheckBoxLabel, 6, 0)
- self.layout.addWidget(self.ETLCheckBox, 6, 1)
+ self.layout.addWidget(self.xOffsetSpinBoxLabel, 5, 0)
+ self.layout.addWidget(self.xOffsetSpinBox, 5, 1)
+ self.layout.addWidget(self.yOffsetSpinBoxLabel, 6, 0)
+ self.layout.addWidget(self.yOffsetSpinBox, 6, 1)
+ self.layout.addWidget(self.ETLCheckBoxLabel, 7, 0)
+ self.layout.addWidget(self.ETLCheckBox, 7, 1)
self.registerField('ETLCheckBox', self.ETLCheckBox)
@@ -406,8 +431,8 @@ def update_other_acquisition_parameters(self):
self.parent.zoom = self.zoomComboBox.currentText()
# self.parent.x_fov = self.parent.cfg.fov_options[self.zoomComboBox.currentIndex()]
# self.parent.y_fov = self.parent.cfg.fov_options[self.zoomComboBox.currentIndex()]
- self.parent.x_offset = self.xyOffsetSpinBox.value()
- self.parent.y_offset = self.xyOffsetSpinBox.value()
+ self.parent.x_offset = self.xOffsetSpinBox.value()
+ self.parent.y_offset = self.yOffsetSpinBox.value()
self.parent.laser = self.laserComboBox.currentText()
self.parent.intensity = self.intensitySlider.value()
self.parent.filter = self.filterComboBox.currentText()
@@ -490,8 +515,6 @@ def __init__(self, parent=None):
def initializePage(self):
''' Here, the acquisition list is created for further checking'''
self.parent.update_acquisition_list()
- # self.acqTime.setText(str(round(self.parent.acquisition_time,2))+' s')
- # self.acqTime.setText('Not implemented yet')
self.xFOVs.setText(str(self.parent.x_image_count))
self.yFOVs.setText(str(self.parent.y_image_count))
@@ -503,15 +526,6 @@ def __init__(self, parent=None):
self.setTitle("Finished!")
self.setSubTitle("Attention: This will overwrite the Acquisition Table. Click 'Finished' to continue. To rename the files, use the filename wizard.")
- # self.appendToTableCheckBox = QtWidgets.QCheckBox('Append to existing table?', self)
-
- # self.registerField('appendToTable', self.appendToTableCheckBox)
-
- # self.layout = QtWidgets.QGridLayout()
- # self.layout.addWidget(self.appendToTableCheckBox, 0, 0)
- # self.setLayout(self.layout)
-
-
def validatePage(self):
print('Update parent table')
return True
diff --git a/mesoSPIM/src/utils/acquisitions.py b/mesoSPIM/src/utils/acquisitions.py
index 9a0a6bf..fbca722 100644
--- a/mesoSPIM/src/utils/acquisitions.py
+++ b/mesoSPIM/src/utils/acquisitions.py
@@ -48,18 +48,20 @@ def __init__(self,
z_step=10,
planes=10,
theta_pos=0,
- f_pos=0,
+ f_start=0,
+ f_end=0,
laser = '488 nm',
intensity=0,
filter= 'Empty-Alignment',
zoom= '1x',
shutterconfig='Left',
- folder='E:/tmp',
+ folder='tmp',
filename='one.raw',
etl_l_offset = 0,
etl_l_amplitude =0,
etl_r_offset = 0,
- etl_r_amplitude = 0):
+ etl_r_amplitude = 0,
+ processing = ''):
super().__init__()
@@ -70,7 +72,8 @@ def __init__(self,
self['z_step']=z_step
self['planes']=planes
self['rot']=theta_pos
- self['f_pos']=f_pos
+ self['f_start']=f_start
+ self['f_end']=f_end
self['laser']=laser
self['intensity']=intensity
self['filter']=filter
@@ -82,6 +85,7 @@ def __init__(self,
self['etl_l_amplitude']=etl_l_amplitude
self['etl_r_offset']=etl_r_offset
self['etl_r_amplitude']=etl_r_amplitude
+ self['processing']=processing
def __setitem__(self, key, value):
@@ -103,21 +107,21 @@ def get_image_count(self):
'''
Method to return the number of planes in the acquisition
'''
- image_count = abs(int((self['z_end'] - self['z_start'])/self['z_step']))
+ return abs(int((self['z_end'] - self['z_start'])/self['z_step']))
- return image_count
-
- def get_acquisition_time(self):
+ def get_acquisition_time(self, framerate):
'''
- Method to return the time the acquisition will take
+ Method to return the time the acquisition will take at a certain
+ framerate.
+
+ Args:
+ float: framerate Framerate of the microscope
Returns:
float: Acquisition time in seconds
-
- TODO: What if sweeptime changes?
'''
- sweeptime = 0.2
- return sweeptime * self.get_image_count()
+
+ return self.get_image_count()/framerate
def get_delta_z_dict(self):
''' Returns relative movement dict for z-steps '''
@@ -128,6 +132,24 @@ def get_delta_z_dict(self):
return {'z_rel' : z_rel}
+ def get_delta_dict(self):
+ ''' Returns relative movement dict for z-steps and f-steps'''
+
+ ''' Calculate z-step '''
+ if self['z_end'] > self['z_start']:
+ z_rel = abs(self['z_step'])
+ else:
+ z_rel = -abs(self['z_step'])
+
+ ''' Calculate f-step
+ image_count = self.get_image_count()
+ f_rel = abs((self['f_end'] - self['f_start'])/image_count)
+ if self['f_end'] < self['f_start']:
+ f_rel = -f_rel
+ '''
+
+ return {'z_rel' : z_rel}
+
def get_startpoint(self):
'''
Provides a dictionary with the startpoint coordinates
@@ -136,7 +158,7 @@ def get_startpoint(self):
'y_abs': self['y_pos'],
'z_abs': self['z_start'],
'theta_abs': self['rot'],
- 'f_abs': self['f_pos'],
+ 'f_abs': self['f_start'],
}
def get_endpoint(self):
@@ -144,16 +166,47 @@ def get_endpoint(self):
'y_abs': self['y_pos'],
'z_abs': self['z_end'],
'theta_abs': self['rot'],
- 'f_abs': self['f_pos'],
+ 'f_abs': self['f_end'],
}
- def get_midpoint(self):
- return {'x_abs': self['x_pos'],
- 'y_abs': self['y_pos'],
- 'z_abs': int((self['z_end']-self['z_start'])/2),
- 'theta_abs': self['rot'],
- 'f_abs': self['f_pos'],
- }
+ def get_focus_stepsize_generator(self):
+ ''''
+ Provides a generator object to correct rounding errors for focus tracking acquisitions.
+
+ The focus stage has to travel a shorter distance than the sample z-stage, ideally only
+ a fraction of the z-step size. However, due to the limited minimum step size of the focus stage,
+ rounding errors can accumulate over thousands of steps.
+
+ Therefore, the generator tracks the rounding error and applies correcting steps here and there
+ to minimize the error.
+
+ This assumes a minimum step size of around 0.1 micron that the focus stage is capable of.
+
+ This method contains lots of round functions to keep residual rounding errors at bay.
+ '''
+ steps = self.get_image_count()
+ f_step = abs((self['f_end'] - self['f_start'])/steps)
+ if self['f_end'] < self['f_start']:
+ f_step = -f_step
+
+ standard_f_step = round(f_step , 1) # Minimum step size: 0.1 micron
+ focus_error = 0
+ expected_focus = 0
+ focus = 0
+ for i in range(steps):
+ if abs(focus_error) < 0.1:
+ focus += standard_f_step
+ yield standard_f_step
+ else:
+ if focus_error < 0:
+ focus += standard_f_step - 0.1
+ yield round(standard_f_step - 0.1,1)
+ else:
+ focus += standard_f_step + 0.1
+ yield round(standard_f_step + 0.1,1)
+ focus = round(focus, 5)
+ expected_focus += f_step
+ focus_error = round(expected_focus - focus, 5)
class AcquisitionList(list):
'''
@@ -185,8 +238,8 @@ def __init__(self, *args):
self.append(Acquisition())
# '''
- # In addition to the list of acquisition objects, the AcquisitionList also
- # contains a rotation point that is save to rotate the sample to the target
+ # In addition to the list of acquisition objects, the AcquisitionList also
+ # contains a rotation point that is save to rotate the sample to the target
# value.
# '''
# self.rotation_point = {'x_abs' : None, 'y_abs' : None, 'z_abs' : None}
@@ -200,14 +253,14 @@ def get_keylist(self):
'''
return self[0].get_keylist()
- def get_acquisition_time(self):
+ def get_acquisition_time(self, framerate):
'''
Returns total time in seconds of a list of acquisitions
'''
time = 0
for i in range(len(self)):
- time += self[i].get_acquisition_time()
+ time += self[i].get_acquisition_time(framerate)
return time
@@ -234,7 +287,7 @@ def get_startpoint(self):
# ''' Returns True if an rotation point was set, otherwise False '''
# if self.rotation_point['x_abs'] == None :
# return False
- # else:
+ # else:
# return True
# def get_rotation_point(self):
@@ -259,16 +312,18 @@ def has_rotation(self):
return False
def check_for_existing_filenames(self):
+ ''' Returns a list of existing filenames '''
+ filename_list = []
for i in range(len(self)):
filename = self[i]['folder']+'/'+self[i]['filename']
file_exists = os.path.isfile(filename)
if file_exists:
- print('Attention: Existing file: ', filename)
- return True
- else:
- return False
+ filename_list.append(filename)
+ return filename_list
+
def check_for_duplicated_filenames(self):
+ ''' Returns a list of duplicated filenames '''
duplicates = []
filenames = []
@@ -279,11 +334,19 @@ def check_for_duplicated_filenames(self):
duplicates = self.get_duplicates_in_list(filenames)
- if len(duplicates)==0:
- return False
- else:
- print('Attention: Duplicated filename: ', duplicates)
- return True
+ return duplicates
+
+ def check_for_nonexisting_folders(self):
+ ''' Returns a list of nonexisting folders '''
+
+ nonexisting_folders = []
+
+ for i in range(len(self)):
+ folder = self[i]['folder']
+ if not os.path.isdir(folder):
+ nonexisting_folders.append(folder)
+
+ return nonexisting_folders
def get_duplicates_in_list(self, list):
duplicates = []
@@ -292,4 +355,4 @@ def get_duplicates_in_list(self, list):
count = list.count(each)
if count > 1:
duplicates.append(each)
- return duplicates
\ No newline at end of file
+ return duplicates
diff --git a/mesoSPIM/src/utils/bigdataviewer_xml_creator.py b/mesoSPIM/src/utils/bigdataviewer_xml_creator.py
new file mode 100644
index 0000000..f94bd54
--- /dev/null
+++ b/mesoSPIM/src/utils/bigdataviewer_xml_creator.py
@@ -0,0 +1,401 @@
+'''
+Classes to create XMLs for Bigstitcher out of mesoSPIM-Datasets.
+'''
+import os.path
+
+from ..mesoSPIM_State import mesoSPIM_StateSingleton
+
+from lxml import etree
+
+class mesoSPIM_XMLexporter:
+ '''
+ Class to take a mesoSPIM acquisitionlist object and turn it into a Bigdataviewer/
+ Bigstitcher XML file.
+
+ TODO:
+ * a single stack goes into a single view setup
+ * everything has to be converted to string...
+ * have the correct image loader: tif
+ * 399 494 1256
+ * if the coordinates match and the channels (laser or filter) are different: same tile, but different channels
+ * angle can be taken directly from acqlist
+ * every acq is a viewSetup
+ * acqs with matching X,Y,and Z_start, Z_end and angle positions positions are the same tile
+ * create a tile list?
+ * assign channels by order of appearance
+ * different lasers are definitely different channels
+ * same lasers: check if filters are different --> if yes then channels
+ * case:
+ * angles not supported
+ '''
+
+ def __init__(self, parent=None):
+ self.parent = parent
+ self.state = mesoSPIM_StateSingleton()
+ self.cfg = parent.cfg
+
+ self.xmlwriter = mesoSPIM_BDVXMLwriter()
+
+ self.xy_pixelsize = 1
+ self.z_size = 1
+ self.length_unit = 'micron'
+
+ def generate_xml_from_acqlist(self, acqlist, path):
+ channeldict = self.generate_channeldict(acqlist)
+ tiledict = self.generate_tiledict(acqlist)
+ illuminationdict = self.generate_illuminationdict(acqlist)
+
+ num_channels = len(channeldict)
+ num_tiles = len(tiledict)
+ num_illuminations = len(illuminationdict)
+
+ if num_channels > 1:
+ layout_channels = 1
+ else:
+ layout_channels = 0
+
+ if num_tiles > 1:
+ layout_tiles = 1
+ else:
+ layout_tiles = 0
+
+ if num_illuminations > 1:
+ layout_illuminations = 1
+ else:
+ layout_illuminations = 0
+
+ channellist = [c for c in range(num_channels)]
+ illuminationlist = [i for i in range(num_illuminations)]
+ tilelist = [t for t in range(num_tiles)]
+ anglelist = [0]
+
+ self.xmlwriter.setLayout(filepattern='tiling_file_t{x}_c{c}.raw.tif',
+ timepoints=0,
+ channels=layout_channels,
+ illuminations=layout_illuminations,
+ angles = 0,
+ tiles = layout_tiles,
+ imglibcontainer="ArrayImgFactory") #or CellImgFactory
+
+ id = 0
+ for acq in acqlist:
+ channelstring = self.generate_channelstring(acq)
+ illuminationstring = self.generate_illuminationstring(acq)
+ tilestring = self.generate_tilestring(acq)
+ calibrationstring = self.create_calibration_string(acq)
+
+ self.xmlwriter.addviewsetup(id=str(id),
+ name=str(acq['filename']),
+ size=self.create_size_string(acq),
+ vosize_unit = 'micron',
+ vosize = self.create_voxelsize_string(acq),
+ illumination = illuminationdict[illuminationstring],
+ channel = channeldict[channelstring],
+ tile = tiledict[tilestring],
+ angle = self.create_angle_string(acq))
+
+ self.xmlwriter.addCalibrationRegistration(tp='0', view=str(id), calibrationstring=calibrationstring)
+ id += 1
+
+ self.xmlwriter.addAttributes(illuminations=illuminationlist,
+ channels=channellist,
+ tiles=tilelist,
+ angles=anglelist)
+
+ self.xmlwriter.addTimepoints('')
+
+ self.xmlwriter.write(path)
+
+ def generate_channeldict(self, acqlist):
+ '''
+ Takes the acqlist and returns a dictionary of channels
+ Channels are defined as:
+ * different lasers in different acqs are definitely different channels
+ * same lasers: check if filters are different --> if yes then channels
+ '''
+ channeldict = {}
+ c = 0
+
+ for acq in acqlist:
+ channelstring = self.generate_channelstring(acq)
+ if not channelstring in channeldict:
+ channeldict.update({channelstring:str(c)})
+ c+=1
+
+ return channeldict
+
+
+ def generate_tiledict(self, acqlist):
+ '''
+ Takes the acqlist and returns an assignment of
+
+ Idea: Take an ACQ and create a hash/hashable datatype (e.g. string)
+ out of:
+ * X_pos
+ * Y_pos
+ * Z_start
+ * Z_end
+ * Angle
+
+ Use this tilehash as keys for a dictionary
+ Later on, you can use it to assign tiles
+ '''
+ tiledict = {}
+ t=0
+
+ for acq in acqlist:
+ tilestring = self.generate_tilestring(acq)
+ if not tilestring in tiledict:
+ tiledict.update({tilestring:str(t)})
+ t+=1
+
+ return tiledict
+
+ def generate_illuminationdict(self, acqlist):
+ illuminationdict = {}
+ i = 0
+
+ for acq in acqlist:
+ illuminationstring = self.generate_illuminationstring(acq)
+ if not illuminationstring in illuminationdict:
+ illuminationdict.update({illuminationstring: str(i)})
+ i+=1
+
+ return illuminationdict
+
+ def generate_channelstring(self, acq):
+ return str(acq['laser']) + ' ' + str(acq['filter'])
+
+ def generate_tilestring(self, acq):
+ return str(acq['x_pos'])+' '+str(acq['y_pos'])+' '+str(acq['z_start'])+' '+str(acq['rot'])
+
+ def generate_illuminationstring(self, acq):
+ return str(acq['shutterconfig'])
+
+ def write(self, path):
+ self.xmlwriter.write(path)
+
+ def create_size_string(self, acq):
+ ''' Creates the necessary XYZ #pixels string'''
+
+ binning_string = self.cfg.camera_parameters['binning']
+ x_binning = int(binning_string[0])
+ y_binning = int(binning_string[2])
+
+ y_pixels = int(self.cfg.camera_parameters['y_pixels'] / y_binning)
+ x_pixels = int(self.cfg.camera_parameters['x_pixels'] / x_binning)
+
+ z_pixels = acq['planes']
+
+ ''' X and Y flipped due to image rotation '''
+ return str(y_pixels) + ' ' + str(x_pixels) + ' ' + str(z_pixels)
+
+ def update_pixelsizes(self, acq):
+ self.xy_pixelsize = self.convert_zoom_to_pixelsize(acq['zoom'])
+ self.z_pixelsize = acq['z_step']
+
+ def create_voxelsize_string(self, acq):
+ ''' Assumes square pixels'''
+ self.update_pixelsizes(acq)
+ return str(self.xy_pixelsize) + ' ' + str(self.xy_pixelsize) + ' ' + str(self.z_pixelsize)
+
+ def convert_zoom_to_pixelsize(self, zoom):
+ ''' Don't forget the binning!'''
+ return self.cfg.pixelsize[zoom]
+
+ def create_angle_string(self, acq):
+ return str(int(acq['rot']))
+
+ def create_calibration_string(self, acq):
+ '''
+ XY pixelsize: 15
+ Z:pixelsize: 8
+ 15/8 = 1.875
+
+ Result:
+ 1.875 0.0 0.0 0.0 0.0 1.875 0.0 0.0 0.0 0.0 1.0 0.0
+
+ if
+ XY pixelsize: 8
+ Z:pixelsize: 15
+ 15/8 = 1.875
+
+ Result:
+ 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.875 0.0
+ '''
+ self.update_pixelsizes(acq)
+
+ if self.xy_pixelsize > self.z_pixelsize:
+ factor = self.xy_pixelsize/self.z_pixelsize
+ calibration_string = str(factor) + ' 0.0 0.0 0.0 0.0 ' + str(factor) + ' 0.0 0.0 0.0 0.0 1.0 0.0'
+ elif self.xy_pixelsize < self.z_pixelsize:
+ factor = self.z_pixelsize/self.xy_pixelsize
+ calibration_string = '1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 '+ str(factor) +' 0.0'
+ else:
+ calibration_string = '1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0'
+
+ return calibration_string
+
+class mesoSPIM_BDVXMLwriter:
+ '''
+ mesoSPIM bigdataviewer-XML-writer
+
+ Based on the code posted by https://github.com/Xqua here:
+ https://github.com/bigdataviewer/bigdataviewer-core/issues/5
+ '''
+
+ def __init__(self):
+
+ self.xml = etree.Element('SpimData', version="0.2")
+ self.doc = etree.ElementTree(self.xml)
+
+ self.BasePath = etree.SubElement(self.xml, 'BasePath', type="relative")
+ self.BasePath.text = "."
+
+ self.SequenceDescription = etree.SubElement(self.xml, 'SequenceDescription')
+ self.ImageLoader = etree.SubElement(self.SequenceDescription, 'ImageLoader', format="spimreconstruction.stack.ij")
+
+ self.ImageDirectory = etree.SubElement(self.ImageLoader, 'imagedirectory', type="relative")
+
+
+
+ self.ViewSetups = etree.SubElement(self.SequenceDescription, 'ViewSetups')
+ self.ViewRegistrations = etree.SubElement(self.xml, 'ViewRegistrations')
+
+ etree.SubElement(self.xml, "ViewInterestPoints")
+ etree.SubElement(self.xml, "BoundingBoxes")
+ etree.SubElement(self.xml, "PointSpreadFunctions")
+ etree.SubElement(self.xml, "StitchingResults")
+ etree.SubElement(self.xml, "IntensityAdjustments")
+
+ def write(self, path):
+ out = str(etree.tostring(self.xml, pretty_print=True, encoding=str))
+ # out = str(etree.tostring(self.xml, pretty_print=True, encoding='UTF-8'))
+
+
+ with open(path, 'w') as file:
+ file.write(out)
+
+ def addFile(self, path):
+ image = etree.SubElement(self.ImageLoader, 'hdf5', type="relative")
+ image.text = path
+
+ def addviewsetup(self, id, name, size, vosize_unit, vosize, illumination, channel, tile, angle):
+ V = etree.SubElement(self.ViewSetups, 'ViewSetup')
+
+ Id = etree.SubElement(V, 'id')
+ Id.text = str(id)
+ Name = etree.SubElement(V, 'name')
+ Name.text = str(name)
+ Size = etree.SubElement(V, 'size')
+ Size.text = str(size)
+
+ VoxelSize = etree.SubElement(V, 'voxelSize')
+ Unit = etree.SubElement(VoxelSize, 'unit')
+ Unit.text = str(vosize_unit)
+ Size = etree.SubElement(VoxelSize, 'size')
+ Size.text = str(vosize)
+
+ Attributes = etree.SubElement(V, 'attributes')
+ Ilum = etree.SubElement(Attributes, 'illumination')
+ Ilum.text = str(illumination)
+ Chan = etree.SubElement(Attributes, 'channel')
+ Chan.text = str(channel)
+ Tile = etree.SubElement(Attributes, 'tile')
+ Tile.text = str(tile)
+ Ang = etree.SubElement(Attributes, 'angle')
+ Ang.text = str(angle)
+
+ def setLayout(self, filepattern="tiling_file_{x}_c{c}.raw.tif", timepoints=0, channels=0, illuminations=0, angles=0, tiles=1,imglibcontainer="ArrayImgFactory"):
+ '''
+ Layout entries according to:
+ https://scijava.org/javadoc.scijava.org/Fiji/spim/fiji/spimdata/imgloaders/LegacyStackImgLoader.html
+
+ layoutTP - - 0 == one, 1 == one per file, 2 == all in one file
+ layoutChannels - - 0 == one, 1 == one per file, 2 == all in one file
+ layoutIllum - - 0 == one, 1 == one per file, 2 == all in one file
+ layoutAngles - - 0 == one, 1 == one per file, 2 == all in one file
+ '''
+ self.FilePattern = etree.SubElement(self.ImageLoader,'filePattern')
+ self.FilePattern.text = filepattern
+ self.LayoutTimepoints = etree.SubElement(self.ImageLoader, 'layoutTimepoints')
+ self.LayoutTimepoints.text = str(timepoints)
+ self.LayoutChannels = etree.SubElement(self.ImageLoader, 'layoutChannels')
+ self.LayoutChannels.text = str(channels)
+ self.LayoutIlluminations = etree.SubElement(self.ImageLoader, 'layoutIlluminations')
+ self.LayoutIlluminations.text = str(illuminations)
+ self.LayoutAngles = etree.SubElement(self.ImageLoader, 'layoutAngles')
+ self.LayoutAngles.text = str(angles)
+ self.LayoutTiles = etree.SubElement(self.ImageLoader, 'layoutTiles')
+ self.LayoutTiles.text = str(tiles)
+
+ self.Imglib2container = etree.SubElement(self.ImageLoader, 'imglib2container')
+ self.Imglib2container.text = imglibcontainer
+
+ def setViewSize(self, Id, size):
+ trigger = False
+ for child in self.ViewSetups:
+ for el in child:
+ if el.tag == 'id':
+ if el.text == Id:
+ trigger = True
+ if el.tag == 'size' and trigger:
+ el.text = ' '.join(size)
+ trigger = False
+ return True
+ return False
+
+ def addAttributes(self, illuminations, channels, tiles, angles):
+ illum = etree.SubElement(self.ViewSetups, 'Attributes', name="illumination")
+ chan = etree.SubElement(self.ViewSetups, 'Attributes', name="channel")
+ til = etree.SubElement(self.ViewSetups, 'Attributes', name="tile")
+ ang = etree.SubElement(self.ViewSetups, 'Attributes', name="angle")
+
+ for illumination in illuminations:
+ I = etree.SubElement(illum, 'Illumination')
+ Id = etree.SubElement(I, 'id')
+ Id.text = str(illumination)
+ Name = etree.SubElement(I, 'name')
+ Name.text = str(illumination)
+
+ for channel in channels:
+ I = etree.SubElement(chan, 'Channel')
+ Id = etree.SubElement(I, 'id')
+ Id.text = str(channel)
+ Name = etree.SubElement(I, 'name')
+ Name.text = str(channel)
+
+ for tile in tiles:
+ I = etree.SubElement(til, 'Tile')
+ Id = etree.SubElement(I, 'id')
+ Id.text = str(tile)
+ Name = etree.SubElement(I, 'name')
+ Name.text = str(tile)
+
+ for angle in angles:
+ I = etree.SubElement(ang, 'Angle')
+ Id = etree.SubElement(I, 'id')
+ Id.text = str(angle)
+ Name = etree.SubElement(I, 'name')
+ Name.text = str(angle)
+
+ def addTimepoints(self, timepoints):
+ TP = etree.SubElement(self.SequenceDescription, 'Timepoints', type="pattern")
+ I = etree.SubElement(TP, 'integerpattern')
+ I.text = ', '.join(timepoints)
+
+ def addRegistration(self, tp, view):
+ V = etree.SubElement(self.ViewRegistrations, 'ViewRegistration', timepoint=tp, setup=view)
+ VT = etree.SubElement(V, 'ViewTransform', type="affine")
+ name = etree.SubElement(VT, 'Name')
+ name.text = "calibration"
+ affine = etree.SubElement(VT, 'affine')
+ affine.text = '1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0'
+
+ def addCalibrationRegistration(self, tp, view, calibrationstring):
+ V = etree.SubElement(self.ViewRegistrations, 'ViewRegistration', timepoint=str(tp), setup=str(view))
+ VT = etree.SubElement(V, 'ViewTransform', type="affine")
+ name = etree.SubElement(VT, 'Name')
+ name.text = "calibration"
+ affine = etree.SubElement(VT, 'affine')
+ affine.text = calibrationstring
\ No newline at end of file
diff --git a/mesoSPIM/src/utils/delegates.py b/mesoSPIM/src/utils/delegates.py
index ce18e52..3e2daa7 100644
--- a/mesoSPIM/src/utils/delegates.py
+++ b/mesoSPIM/src/utils/delegates.py
@@ -216,7 +216,7 @@ def setModelData(self, editor, model, index):
'''
if self.sender() is None:
- print(self.sender())
+ # print(self.sender())
self.set_model_data_from_lineedit(editor, model, index)
else:
self.set_model_data_from_button(editor, model, index)
diff --git a/mesoSPIM/src/utils/focus_tracking_wizard.py b/mesoSPIM/src/utils/focus_tracking_wizard.py
new file mode 100644
index 0000000..d7ffcd9
--- /dev/null
+++ b/mesoSPIM/src/utils/focus_tracking_wizard.py
@@ -0,0 +1,247 @@
+'''
+Contains Focus Tracking Wizard Class: autogenerates start end end foci from reference / anchor positions
+
+'''
+
+from PyQt5 import QtWidgets, QtGui, QtCore
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtCore import pyqtProperty
+
+from ..mesoSPIM_State import mesoSPIM_StateSingleton
+
+class FocusTrackingWizard(QtWidgets.QWizard):
+ '''
+ Wizard to run
+
+ The parent is the Window class of the microscope
+ '''
+ wizard_done = QtCore.pyqtSignal()
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ ''' By an instance variable, callbacks to window signals can be handed
+ through '''
+ self.parent = parent
+ self.cfg = parent.cfg
+ self.state = mesoSPIM_StateSingleton()
+
+ self.f_1 = 0
+ self.f_2 = 0
+ self.z_1 = 0
+ self.z_2 = 0
+
+ self.setWindowTitle('Foucs Tracking Wizard')
+
+ self.addPage(FocusTrackingWizardWelcomePage(self))
+ self.addPage(FocusTrackingWizardSetReferencePointsPage(self))
+ self.addPage(FocusTrackingWizardCheckResultsPage(self))
+
+ self.show()
+
+ def done(self, r):
+ ''' Reimplementation of the done function
+
+ if r == 0: canceled
+ if r == 1: finished properly
+ '''
+ if r == 0:
+ print("Wizard was canceled")
+ if r == 1:
+ print('Wizard was closed properly')
+ # print('Laser selected: ', self.field('Laser'))
+ self.update_focus_positions_in_model()
+ else:
+ print('Wizard provided return code: ', r)
+
+ super().done(r)
+
+ def calculate_f_pos(self, z_1, z_2, f_1, f_2, z):
+ if z_2 == z_1:
+ ''' Avoid division by zero '''
+ return 0
+ else:
+ return (f_2-f_1)/(z_2-z_1)*(z-z_1)+f_1
+
+ def convert_string_to_list(self, inputstring):
+ outputlist = []
+ for substring in inputstring.split(','):
+ newlist = substring.split('-')
+ if len(newlist) == 1:
+ output_values = [int(newlist[0])]
+ else:
+ output_values = [i for i in range(int(newlist[0]), int(newlist[1])+1, 1)]
+ outputlist.extend(output_values)
+ return outputlist
+
+
+ def update_focus_positions_in_model(self):
+ row_count = self.parent.model.rowCount()
+ z_start_column = self.parent.model.getColumnByName('Z_start')
+ z_end_column = self.parent.model.getColumnByName('Z_end')
+ f_start_column = self.parent.model.getColumnByName('F_start')
+ f_end_column = self.parent.model.getColumnByName('F_end')
+ filter_column = self.parent.model.getColumnByName('Filter')
+ laser_column = self.parent.model.getColumnByName('Laser')
+
+ if self.field('RowEnabled'):
+ row_list = self.convert_string_to_list(self.field('RowString'))
+
+ for row in range(0, row_count):
+ z_start = self.parent.model.getZStartPosition(row)
+ z_end = self.parent.model.getZEndPosition(row)
+
+ f_start = self.calculate_f_pos(self.z_1, self.z_2, self.f_1, self.f_2, z_start)
+ f_end = self.calculate_f_pos(self.z_1, self.z_2, self.f_1, self.f_2, z_end)
+
+ f_start_index = self.parent.model.createIndex(row, f_start_column)
+ f_end_index = self.parent.model.createIndex(row, f_end_column)
+
+ if self.field('LaserEnabled'):
+ print('Laser is enabled')
+ if self.field('Laser') == 'All laser lines':
+ print('All laser lines')
+ self.parent.model.setData(f_start_index, f_start)
+ self.parent.model.setData(f_end_index, f_end)
+ else:
+ print('Laserfield: ', self.field('Laser'))
+ print('Laser in row: ', self.parent.model.getLaser(row))
+ if self.field('Laser') == self.parent.model.getLaser(row):
+ self.parent.model.setData(f_start_index, f_start)
+ self.parent.model.setData(f_end_index, f_end)
+
+ elif self.field('FilterEnabled'):
+ if self.field('Filter') == 'All filters':
+ self.parent.model.setData(f_start_index, f_start)
+ self.parent.model.setData(f_end_index, f_end)
+ else:
+ if self.field('Filter') == self.parent.model.getFilter(row):
+ self.parent.model.setData(f_start_index, f_start)
+ self.parent.model.setData(f_end_index, f_end)
+
+ elif self.field('RowEnabled'):
+ if row in row_list:
+ self.parent.model.setData(f_start_index, f_start)
+ self.parent.model.setData(f_end_index, f_end)
+
+
+class FocusTrackingWizardWelcomePage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Welcome to the focus tracking wizard!")
+ self.setSubTitle("This wizard allows you to set the correct focus start and end points by focusing manually at two reference points inside the sample. ATTENTION: In the last step, you can apply the focus range to selected channels and lasers!")
+
+class FocusTrackingWizardSetReferencePointsPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Reference point definition")
+ self.setSubTitle("Between z_start and z_end, focus the microscope at two different z-positions inside the sample.")
+
+ self.button0 = QtWidgets.QPushButton(self)
+ self.button0.setText('Set first reference point')
+ self.button0.setCheckable(True)
+ self.button0.toggled.connect(self.get_first_reference_point)
+
+ self.button1 = QtWidgets.QPushButton(self)
+ self.button1.setText('Set second reference point')
+ self.button1.setCheckable(True)
+ self.button1.toggled.connect(self.get_second_reference_point)
+
+ self.registerField('set_first_refpoint*',
+ self.button0,
+ )
+ self.registerField('set_second_refpoint*',
+ self.button1,
+ )
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.button0, 0, 0)
+ self.layout.addWidget(self.button1, 0, 1)
+ self.setLayout(self.layout)
+
+ def get_first_reference_point(self):
+ self.parent.f_1 = self.parent.state['position']['f_pos']
+ self.parent.z_1 = self.parent.state['position']['z_pos']
+
+ def get_second_reference_point(self):
+ self.parent.f_2 = self.parent.state['position']['f_pos']
+ self.parent.z_2 = self.parent.state['position']['z_pos']
+
+ def validatePage(self):
+ '''Further validation operations can be introduced here'''
+ return super().validatePage()
+
+class FocusTrackingWizardCheckResultsPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle('To which acquisitions should the focus settings be applied?')
+
+ self.laserCheckBox = QtWidgets.QCheckBox('Rows with laser set to: ', self)
+ self.laserComboBox = QtWidgets.QComboBox(self)
+ self.laserComboBox.addItem('All laser lines')
+ self.laserComboBox.addItems(self.parent.cfg.laserdict.keys())
+
+ self.filterCheckBox = QtWidgets.QCheckBox('Rows with filter set to:', self)
+ self.filterComboBox = QtWidgets.QComboBox(self)
+ self.filterComboBox.addItem('All filters')
+ self.filterComboBox.addItems(self.parent.cfg.filterdict.keys())
+
+ self.rowCheckBox = QtWidgets.QCheckBox('Specific rows (e.g. 0-2,5-7,10,13):',self)
+ self.rowLineEdit = QtWidgets.QLineEdit(self)
+
+ self.registerField('LaserEnabled',self.laserCheckBox)
+ self.registerField('FilterEnabled', self.filterCheckBox)
+ self.registerField('RowEnabled', self.rowCheckBox)
+ self.registerField('Laser',self.laserComboBox, 'currentText', self.laserComboBox.currentTextChanged)
+ self.registerField('Filter', self.filterComboBox, 'currentText', self.filterComboBox.currentTextChanged)
+ self.registerField('RowString', self.rowLineEdit)
+
+ self.laserCheckBox.clicked.connect(lambda boolean: self.laserComboBox.setEnabled(boolean))
+ self.laserCheckBox.clicked.connect(lambda boolean: self.filterCheckBox.setChecked(not boolean))
+ self.laserCheckBox.clicked.connect(lambda boolean: self.filterComboBox.setEnabled(not boolean))
+ self.laserCheckBox.clicked.connect(lambda boolean: self.rowLineEdit.setEnabled(not boolean))
+ self.laserCheckBox.clicked.connect(lambda boolean: self.rowCheckBox.setChecked(not boolean))
+
+ self.filterCheckBox.clicked.connect(lambda boolean: self.filterComboBox.setEnabled(boolean))
+ self.filterCheckBox.clicked.connect(lambda boolean: self.laserCheckBox.setChecked(not boolean))
+ self.filterCheckBox.clicked.connect(lambda boolean: self.laserComboBox.setEnabled(not boolean))
+ self.filterCheckBox.clicked.connect(lambda boolean: self.rowLineEdit.setEnabled(not boolean))
+ self.filterCheckBox.clicked.connect(lambda boolean: self.rowCheckBox.setChecked(not boolean))
+
+ self.rowCheckBox.clicked.connect(lambda boolean: self.rowLineEdit.setEnabled(boolean))
+ self.rowCheckBox.clicked.connect(lambda boolean: self.laserComboBox.setEnabled(not boolean))
+ self.rowCheckBox.clicked.connect(lambda boolean: self.filterComboBox.setEnabled(not boolean))
+ self.rowCheckBox.clicked.connect(lambda boolean: self.laserCheckBox.setChecked(not boolean))
+ self.rowCheckBox.clicked.connect(lambda boolean: self.filterCheckBox.setChecked(not boolean))
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.laserCheckBox, 0, 0)
+ self.layout.addWidget(self.laserComboBox, 0, 1)
+ self.layout.addWidget(self.filterCheckBox, 1, 0)
+ self.layout.addWidget(self.filterComboBox, 1, 1)
+ self.layout.addWidget(self.rowCheckBox, 2, 0)
+ self.layout.addWidget(self.rowLineEdit, 2, 1)
+ self.setLayout(self.layout)
+
+ def initializePage(self):
+ self.laserComboBox.setCurrentText(self.parent.state['laser'])
+ self.filterComboBox.setCurrentText(self.parent.state['filter'])
+
+ self.laserCheckBox.setChecked(True)
+ self.filterComboBox.setEnabled(False)
+ self.rowLineEdit.setEnabled(False)
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mesoSPIM/src/utils/image_processing_wizard.py b/mesoSPIM/src/utils/image_processing_wizard.py
new file mode 100644
index 0000000..800ab28
--- /dev/null
+++ b/mesoSPIM/src/utils/image_processing_wizard.py
@@ -0,0 +1,104 @@
+'''
+Contains Image Processing Wizard Class: Sets online processing options
+
+'''
+
+from PyQt5 import QtWidgets, QtGui, QtCore
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtCore import pyqtProperty
+
+from ..mesoSPIM_State import mesoSPIM_StateSingleton
+
+class ImageProcessingWizard(QtWidgets.QWizard):
+ '''
+ Wizard to run
+
+ The parent is the Window class of the microscope
+ '''
+ wizard_done = QtCore.pyqtSignal()
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ ''' By an instance variable, callbacks to window signals can be handed
+ through '''
+ self.parent = parent
+ self.cfg = parent.cfg
+ self.state = mesoSPIM_StateSingleton()
+
+ self.setWindowTitle('Image Processing Wizard')
+
+ self.addPage(ImageProcessingWizardWelcomePage(self))
+ self.addPage(ImageProcessingWizardSetOptionsPage(self))
+ self.addPage(ImageProcessingWizardCheckResultsPage(self))
+
+ self.show()
+
+ def done(self, r):
+ ''' Reimplementation of the done function
+
+ if r == 0: canceled
+ if r == 1: finished properly
+ '''
+ if r == 0:
+ print("Wizard was canceled")
+ if r == 1:
+ print('Wizard was closed properly')
+ # print('Laser selected: ', self.field('Laser'))
+ self.set_processing_options()
+ else:
+ print('Wizard provided return code: ', r)
+
+ super().done(r)
+
+ def set_processing_options(self):
+ row_count = self.parent.model.rowCount()
+ processing_column = self.parent.model.getColumnByName('Processing')
+
+ for row in range(0, row_count):
+ index = self.parent.model.createIndex(row, processing_column)
+ if self.field('maxProjEnabled'):
+ self.parent.model.setData(index, 'MAX')
+ else:
+ self.parent.model.setData(index, '')
+
+class ImageProcessingWizardWelcomePage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Welcome to the image processing wizard!")
+ self.setSubTitle("This wizard allows you to set image processing flags!")
+
+class ImageProcessingWizardSetOptionsPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Select processing options")
+ #self.setSubTitle("Select the processing options:")
+
+ self.maxProjectionCheckBox = QtWidgets.QCheckBox('Post-stack MAX projection (adds time)', self)
+
+ self.registerField('maxProjEnabled',self.maxProjectionCheckBox)
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.maxProjectionCheckBox, 0, 0)
+ self.setLayout(self.layout)
+
+ def validatePage(self):
+ '''Further validation operations can be introduced here'''
+ return super().validatePage()
+
+class ImageProcessingWizardCheckResultsPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle('Options have been set')
+
+
+
+
+
\ No newline at end of file
diff --git a/mesoSPIM/src/utils/models.py b/mesoSPIM/src/utils/models.py
index 1ad56c2..918746d 100644
--- a/mesoSPIM/src/utils/models.py
+++ b/mesoSPIM/src/utils/models.py
@@ -44,7 +44,14 @@ def flags(self, index):
'''
# What does | actually mean?
- return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled
+ '''
+ Attention: Here, it is hardcoded that column 5 (# Planes is not editable) If acquistions.py changes, this will
+ require a change here as well
+ '''
+ if index.column() == self._headers.index('Planes'):
+ return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled
+ else:
+ return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled
def headerData(self, section, orientation, role):
'''
@@ -262,6 +269,15 @@ def getName(self, row):
def getFilenameColumn(self):
return self._headers.index('Filename')
+ def getStartFocusColumn(self):
+ return self._headers.index('F_start')
+
+ def getEndFocusColumn(self):
+ return self._headers.index('F_end')
+
+ def getColumnByName(self, name):
+ return self._headers.index(name)
+
def getTime(self, row):
return int(self._table[row].get_acquisition_time())
@@ -286,6 +302,12 @@ def getXPosition(self, row):
def getYPosition(self, row):
return self._table[row]['y_pos']
+ def getZStartPosition(self, row):
+ return self._table[row]['z_start']
+
+ def getZEndPosition(self, row):
+ return self._table[row]['z_end']
+
def getRotationPosition(self, row):
return self._table[row]['rot']
diff --git a/mesoSPIM/src/utils/multicolor_acquisition_builder.py b/mesoSPIM/src/utils/multicolor_acquisition_builder.py
new file mode 100644
index 0000000..e79a721
--- /dev/null
+++ b/mesoSPIM/src/utils/multicolor_acquisition_builder.py
@@ -0,0 +1,104 @@
+''' Classes that define acquisition builders:
+
+Take a dict with information and return an acquisition list
+'''
+from .acquisitions import Acquisition, AcquisitionList
+
+class AcquisitionListBuilder():
+ '''
+ Generic Acquisition List Builder as parent class?
+
+ TODO: Write this class
+ '''
+ pass
+
+class MulticolorTilingAcquisitionListBuilder():
+ '''
+ TODO: Filename generation
+
+ self.dict['x_start']
+ self.dict['x_end']
+ self.dict['y_start']
+ self.dict['y_end']
+ self.dict['z_start']
+ self.dict['z_end']
+ self.dict['z_step']
+ self.dict['theta_pos']
+ self.dict['f_pos']
+ self.dict['x_offset'] # Offset always larger than 0
+ self.dict['y_offset'] # Offset always larger than 0
+ self.dict['x_image_count']
+ self.dict['y_image_count']
+ '''
+
+ def __init__(self, dict):
+ self.acq_prelist = []
+
+ self.dict = dict
+
+ self.x_start = self.dict['x_start']
+ self.y_start = self.dict['y_start']
+ self.x_end = self.dict['x_end']
+ self.y_end = self.dict['y_end']
+
+ '''
+ Reverse direction of the offset if pos_end < pos_start
+ '''
+ if self.x_start < self.x_end:
+ self.x_offset = self.dict['x_offset']
+ else:
+ self.x_offset = -self.dict['x_offset']
+
+ if self.y_start < self.y_end:
+ self.y_offset = self.dict['y_offset']
+ else:
+ self.y_offset = -self.dict['y_offset']
+
+ '''
+ Core loop: Create an acquisition list for all x & y & channel values
+ '''
+ tilecount = 0
+
+ for i in range(0,self.dict['x_image_count']):
+ self.x_pos = round(self.x_start + i * self.x_offset,2)
+
+ for j in range(0,self.dict['y_image_count']):
+ self.y_pos = round(self.y_start + j * self.y_offset,2)
+
+ channelcount = 0
+ for c in range(0, len(self.dict['channels'])):
+ ''' Get a single channeldict out of the list of dicts '''
+ channeldict = self.dict['channels'][c]
+
+ acq = Acquisition( x_pos=self.x_pos,
+ y_pos=self.y_pos,
+ z_start=self.dict['z_start'],
+ z_end=self.dict['z_end'],
+ z_step=self.dict['z_step'],
+ theta_pos=self.dict['theta_pos'],
+ f_start=round(channeldict['f_start'],2),
+ f_end=round(channeldict['f_end'],2),
+ laser=channeldict['laser'],
+ intensity=channeldict['intensity'],
+ filter=channeldict['filter'],
+ zoom=self.dict['zoom'],
+ shutterconfig=self.dict['shutterconfig'],
+ folder=self.dict['folder'],
+ filename='tiling_file_t'+str(tilecount)+'_c'+str(channelcount)+'.raw',
+ etl_l_offset=channeldict['etl_l_offset'],
+ etl_l_amplitude=channeldict['etl_l_amplitude'],
+ etl_r_offset=channeldict['etl_r_offset'],
+ etl_r_amplitude=channeldict['etl_r_amplitude'],
+ )
+ ''' Update number of planes as this is not done by the acquisition
+ object itself '''
+ acq['planes']=acq.get_image_count()
+
+ self.acq_prelist.append(acq)
+
+ channelcount +=1
+
+ tilecount += 1
+
+ def get_acquisition_list(self):
+ return AcquisitionList(self.acq_prelist)
diff --git a/mesoSPIM/src/utils/multicolor_acquisition_wizard.py b/mesoSPIM/src/utils/multicolor_acquisition_wizard.py
new file mode 100644
index 0000000..3089077
--- /dev/null
+++ b/mesoSPIM/src/utils/multicolor_acquisition_wizard.py
@@ -0,0 +1,564 @@
+'''
+Contains Multicolor Acquisition Wizard Classes:
+
+Widgets that take user input and create acquisition lists
+
+'''
+import numpy as np
+import pprint
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtCore import pyqtProperty
+
+from .multicolor_acquisition_builder import MulticolorTilingAcquisitionListBuilder
+
+from ..mesoSPIM_State import mesoSPIM_StateSingleton
+
+class MulticolorTilingWizard(QtWidgets.QWizard):
+ '''
+ Wizard to run
+
+ The parent is the Window class of the microscope
+ '''
+ wizard_done = QtCore.pyqtSignal()
+
+ num_of_pages = 10
+ (welcome, zeroing, boundingbox, generalparameters, checktiling, channel1,
+ channel2, channel3, folderpage, finished) = range(num_of_pages)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ ''' By an instance variable, callbacks to window signals can be handed
+ through '''
+ self.parent = parent
+ self.cfg = parent.cfg
+ self.state = mesoSPIM_StateSingleton()
+
+ ''' Instance variables '''
+ self.x_start = 0
+ self.x_end = 0
+ self.y_start = 0
+ self.y_end = 0
+ self.z_start = 0
+ self.z_end = 0
+ self.z_step = 1
+ self.x_offset = 0
+ self.y_offset = 0
+ self.zoom = '1x'
+ self.x_fov = 1
+ self.y_fov = 1
+ self.channels = []
+ self.channelcount = 0
+ self.shutterconfig = ''
+ self.theta_pos = 0
+ self.x_image_count = 1
+ self.y_image_count = 1
+ self.folder = ''
+ self.delta_x = 0.0
+ self.delta_y = 0.0
+
+ self.setWindowTitle('Tiling Wizard')
+
+ self.setPage(0, TilingWelcomePage(self))
+ self.setPage(1, ZeroingXYStagePage(self))
+ self.setPage(2, DefineBoundingBoxPage(self))
+ self.setPage(3, DefineGeneralParametersPage(self))
+ self.setPage(4, CheckTilingPage(self))
+ self.setPage(5, FirstChannelPage(self))
+ self.setPage(6, SecondChannelPage(self))
+ self.setPage(7, ThirdChannelPage(self))
+ self.setPage(8, DefineFolderPage(self))
+ self.setPage(9, FinishedTilingPage(self))
+
+ self.show()
+
+ def done(self, r):
+ ''' Reimplementation of the done function
+
+ if r == 0: canceled
+ if r == 1: finished properly
+ '''
+ if r == 0:
+ print("Wizard was canceled")
+ if r == 1:
+ print('Wizard was closed properly')
+ # self.print_dict()
+ self.update_acquisition_list()
+ self.update_model(self.parent.model, self.acq_list)
+ ''' Update state with this new list '''
+ # self.parent.update_persistent_editors()
+ self.wizard_done.emit()
+ else:
+ print('Wizard provided return code: ', r)
+
+ super().done(r)
+
+ def update_model(self, model, table):
+ model.setTable(table)
+ self.state['acq_list']=self.acq_list
+
+ def update_image_counts(self):
+ '''
+ TODO: This needs some FOV information
+ '''
+ self.delta_x = abs(self.x_end - self.x_start)
+ self.delta_y = abs(self.y_end - self.y_start)
+
+ ''' Using the ceiling function to always create at least 1 image '''
+ self.x_image_count = int(np.ceil(self.delta_x/self.x_offset))
+ self.y_image_count = int(np.ceil(self.delta_y/self.y_offset))
+
+ ''' Create at least 1 image even if delta_x or delta_y is 0 '''
+ if self.x_image_count == 0:
+ self.x_image_count = 1
+ if self.y_image_count == 0:
+ self.y_image_count = 1
+
+ ''' The first FOV is centered on the starting location -
+ therefore, add another image count to fully contain the end position
+ if necessary
+ '''
+ if self.delta_x % self.x_offset > self.x_offset/2:
+ self.x_image_count = self.x_image_count + 1
+
+ if self.delta_y % self.y_offset > self.y_offset/2:
+ self.y_image_count = self.y_image_count + 1
+
+
+ def update_fov(self):
+ pass
+ # zoom = self.zoom
+ # index = self.parent.cfg.zoom_options.index(zoom)
+ # self.x_fov = self.parent.cfg.zoom_options[index]
+ # self.y_fov = self.parent.cfg.zoom_options[index]
+
+ def get_dict(self):
+ return {'x_start' : self.x_start,
+ 'x_end' : self.x_end,
+ 'y_start' : self.y_start,
+ 'y_end' : self.y_end,
+ 'z_start' : self.z_start,
+ 'z_end' : self.z_end,
+ 'z_step' : self.z_step,
+ 'theta_pos' : self.theta_pos,
+ 'x_offset' : self.x_offset,
+ 'y_offset' : self.y_offset,
+ 'x_fov' : self.x_fov,
+ 'y_fov' : self.y_fov,
+ 'x_image_count' : self.x_image_count,
+ 'y_image_count' : self.y_image_count,
+ 'zoom' : self.zoom,
+ 'shutterconfig' : self.shutterconfig,
+ 'folder' : self.folder,
+ 'channels' : self.channels,
+ }
+
+ def update_acquisition_list(self):
+ self.update_image_counts()
+ self.update_fov()
+
+ ''' Use the current rotation angle '''
+ self.theta_pos = self.state['position']['theta_pos']
+
+ dict = self.get_dict()
+ self.acq_list = MulticolorTilingAcquisitionListBuilder(dict).get_acquisition_list()
+
+ def print_dict(self):
+ pprint.pprint(self.get_dict())
+
+
+class TilingWelcomePage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.setTitle("Welcome to the tiling wizard")
+ self.setSubTitle("This wizard will guide you through the steps of creating a tiling acquisition.")
+
+class ZeroingXYStagePage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Zero stage positions")
+ self.setSubTitle("To aid in relative positioning, it is recommended to zero the XY stages.")
+
+class DefineBoundingBoxPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Define the bounding box of the tiling acquisition")
+ self.setSubTitle("Move XY stages to the starting corner position")
+
+ self.button0 = QtWidgets.QPushButton(self)
+ self.button0.setText('Set XY Start Corner')
+ self.button0.setCheckable(True)
+ self.button0.toggled.connect(self.get_xy_start_position)
+
+ self.button1 = QtWidgets.QPushButton(self)
+ self.button1.setText('Set XY End Corner')
+ self.button1.setCheckable(True)
+ self.button1.toggled.connect(self.get_xy_end_position)
+
+ self.ZStartButton = QtWidgets.QPushButton(self)
+ self.ZStartButton.setText('Set Z start')
+ self.ZStartButton.setCheckable(True)
+ self.ZStartButton.toggled.connect(self.update_z_start_position)
+
+ self.ZEndButton = QtWidgets.QPushButton(self)
+ self.ZEndButton.setText('Set Z end')
+ self.ZEndButton.setCheckable(True)
+ self.ZEndButton.toggled.connect(self.update_z_end_position)
+
+ self.ZSpinBoxLabel = QtWidgets.QLabel('Z stepsize')
+
+ self.ZStepSpinBox = QtWidgets.QSpinBox(self)
+ self.ZStepSpinBox.setValue(1)
+ self.ZStepSpinBox.setMinimum(1)
+ self.ZStepSpinBox.setMaximum(1000)
+ self.ZStepSpinBox.valueChanged.connect(self.update_z_step)
+
+ self.registerField('xy_start_position*',
+ self.button0,
+ )
+ self.registerField('xy_end_position*',
+ self.button1,
+ )
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.button0, 0, 0)
+ self.layout.addWidget(self.button1, 1, 1)
+ self.layout.addWidget(self.ZStartButton, 2, 0)
+ self.layout.addWidget(self.ZEndButton, 2, 1)
+ self.layout.addWidget(self.ZSpinBoxLabel, 3, 0)
+ self.layout.addWidget(self.ZStepSpinBox, 3, 1)
+ self.setLayout(self.layout)
+
+ def get_xy_start_position(self):
+ self.parent.x_start = self.parent.state['position']['x_pos']
+ self.parent.y_start = self.parent.state['position']['y_pos']
+
+ def get_xy_end_position(self):
+ self.parent.x_end = self.parent.state['position']['x_pos']
+ self.parent.y_end = self.parent.state['position']['y_pos']
+
+ def update_z_start_position(self):
+ self.parent.z_start = self.parent.state['position']['z_pos']
+
+ def update_z_end_position(self):
+ self.parent.z_end = self.parent.state['position']['z_pos']
+
+ def update_z_step(self):
+ self.parent.z_step = self.ZStepSpinBox.value()
+
+class DefineGeneralParametersPage(QtWidgets.QWizardPage):
+
+ def __init__(self, parent):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Define other parameters")
+
+ self.zoomLabel = QtWidgets.QLabel('Zoom')
+ self.zoomComboBox = QtWidgets.QComboBox(self)
+ self.zoomComboBox.addItems(self.parent.cfg.zoomdict.keys())
+
+ self.xOffsetSpinBoxLabel = QtWidgets.QLabel('X Offset')
+ self.xOffsetSpinBox = QtWidgets.QSpinBox(self)
+ self.xOffsetSpinBox.setSuffix(' μm')
+ self.xOffsetSpinBox.setMinimum(1)
+ self.xOffsetSpinBox.setMaximum(30000)
+ self.xOffsetSpinBox.setValue(500)
+
+ self.yOffsetSpinBoxLabel = QtWidgets.QLabel('Y Offset')
+ self.yOffsetSpinBox = QtWidgets.QSpinBox(self)
+ self.yOffsetSpinBox.setSuffix(' μm')
+ self.yOffsetSpinBox.setMinimum(1)
+ self.yOffsetSpinBox.setMaximum(30000)
+ self.yOffsetSpinBox.setValue(500)
+
+ self.shutterLabel = QtWidgets.QLabel('Shutter')
+ self.shutterComboBox = QtWidgets.QComboBox(self)
+ self.shutterComboBox.addItems(self.parent.cfg.shutteroptions)
+
+ self.channelLabel = QtWidgets.QLabel('# Channels')
+ self.channelSpinBox = QtWidgets.QSpinBox(self)
+ self.channelSpinBox.setMinimum(1)
+ self.channelSpinBox.setMaximum(3)
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.zoomLabel, 0, 0)
+ self.layout.addWidget(self.zoomComboBox, 0, 1)
+ self.layout.addWidget(self.shutterLabel, 1, 0)
+ self.layout.addWidget(self.shutterComboBox, 1, 1)
+ self.layout.addWidget(self.xOffsetSpinBoxLabel, 2, 0)
+ self.layout.addWidget(self.xOffsetSpinBox, 2, 1)
+ self.layout.addWidget(self.yOffsetSpinBoxLabel, 3, 0)
+ self.layout.addWidget(self.yOffsetSpinBox, 3, 1)
+ self.layout.addWidget(self.channelLabel, 4, 0)
+ self.layout.addWidget(self.channelSpinBox, 4, 1)
+ self.setLayout(self.layout)
+
+ def validatePage(self):
+ ''' The done function should update all the parent parameters '''
+ self.update_other_acquisition_parameters()
+ return True
+
+ def update_other_acquisition_parameters(self):
+ ''' Here, all the Tiling parameters are filled in the parent (TilingWizard)
+
+ This method should be called when the "Next" Button is pressed
+ '''
+ self.parent.zoom = self.zoomComboBox.currentText()
+ self.parent.x_offset = self.xOffsetSpinBox.value()
+ self.parent.y_offset = self.yOffsetSpinBox.value()
+ self.parent.shutterconfig = self.shutterComboBox.currentText()
+ self.parent.channelcount = self.channelSpinBox.value()
+
+ def initializePage(self):
+ self.update_page_from_state()
+
+ def update_page_from_state(self):
+ self.zoomComboBox.setCurrentText(self.parent.state['zoom'])
+ self.shutterComboBox.setCurrentText(self.parent.state['shutterconfig'])
+
+class CheckTilingPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Check Tiling Page")
+ self.setSubTitle("Here are your parameters")
+
+ self.xFOVLabel = QtWidgets.QLabel('X FOVs:')
+ self.xFOVs = QtWidgets.QLineEdit(self)
+ self.xFOVs.setReadOnly(True)
+
+ self.yFOVLabel = QtWidgets.QLabel('Y FOVs:')
+ self.yFOVs = QtWidgets.QLineEdit(self)
+ self.yFOVs.setReadOnly(True)
+
+ self.Button = QtWidgets.QPushButton('Values are ok?')
+ self.Button.setCheckable(True)
+ self.Button.setChecked(False)
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.xFOVLabel, 1, 0)
+ self.layout.addWidget(self.xFOVs, 1, 1)
+ self.layout.addWidget(self.yFOVLabel, 2, 0)
+ self.layout.addWidget(self.yFOVs, 2, 1)
+ self.layout.addWidget(self.Button, 3, 1)
+ self.setLayout(self.layout)
+
+ self.registerField('finalCheck*',self.Button)
+
+ def initializePage(self):
+ ''' Here, the acquisition list is created for further checking'''
+ self.parent.update_image_counts()
+ self.xFOVs.setText(str(self.parent.x_image_count))
+ self.yFOVs.setText(str(self.parent.y_image_count))
+
+class GenericChannelPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None, channel_id=0):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.channel_id = channel_id
+ self.id_string = str(self.channel_id+1)
+ self.setTitle("Configure channel #"+self.id_string)
+
+ self.f_start = 0
+ self.f_end = 0
+
+ self.copyCurrentStateLabel = QtWidgets.QLabel('Copy state:')
+
+ self.copyCurrentStateButton = QtWidgets.QPushButton(self)
+ self.copyCurrentStateButton.setText('Copy current laser, intensity and filter')
+ self.copyCurrentStateButton.clicked.connect(self.update_page_from_state)
+
+ self.laserLabel = QtWidgets.QLabel('Laser')
+ self.laserComboBox = QtWidgets.QComboBox(self)
+ self.laserComboBox.addItems(self.parent.cfg.laserdict.keys())
+
+ self.intensityLabel = QtWidgets.QLabel('Intensity')
+ self.intensitySlider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.intensitySlider.setMinimum(0)
+ self.intensitySlider.setMaximum(100)
+
+ self.filterLabel = QtWidgets.QLabel('Filter')
+ self.filterComboBox = QtWidgets.QComboBox(self)
+ self.filterComboBox.addItems(self.parent.cfg.filterdict.keys())
+
+ self.ETLCheckBoxLabel = QtWidgets.QLabel('ETL')
+ self.ETLCheckBox = QtWidgets.QCheckBox('Copy current ETL parameters', self)
+ self.ETLCheckBox.setChecked(True)
+
+ self.StartFocusLabel = QtWidgets.QLabel('Start focus')
+ self.StartFocusButton = QtWidgets.QPushButton(self)
+ self.StartFocusButton.setText('Set start focus')
+ self.StartFocusButton.setCheckable(True)
+ self.StartFocusButton.toggled.connect(self.update_start_focus_position)
+
+ self.EndFocusLabel = QtWidgets.QLabel('End focus')
+ self.EndFocusButton = QtWidgets.QPushButton(self)
+ self.EndFocusButton.setText('Set end focus')
+ self.EndFocusButton.setCheckable(True)
+ self.EndFocusButton.toggled.connect(self.update_end_focus_position)
+
+ self.GoToZStartButton = QtWidgets.QPushButton(self)
+ self.GoToZStartButton.setText('Go to Z start')
+ self.GoToZStartButton.clicked.connect(lambda: self.go_to_z_position(self.parent.z_start))
+
+ self.GoToZEndButton = QtWidgets.QPushButton(self)
+ self.GoToZEndButton.setText('Go to Z end')
+ self.GoToZEndButton.clicked.connect(lambda: self.go_to_z_position(self.parent.z_end))
+
+ self.registerField('start_focus_position'+str(self.channel_id)+'*',
+ self.StartFocusButton,
+ )
+
+ self.registerField('end_focus_position'+str(self.channel_id)+'*',
+ self.EndFocusButton,
+ )
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.copyCurrentStateLabel, 0, 0, 1, 1)
+ self.layout.addWidget(self.copyCurrentStateButton, 0, 1, 1, 2)
+ self.layout.addWidget(self.laserLabel, 1, 0, 1, 1)
+ self.layout.addWidget(self.laserComboBox, 1, 1, 1, 2)
+ self.layout.addWidget(self.intensityLabel, 2, 0, 1, 1)
+ self.layout.addWidget(self.intensitySlider, 2, 1, 1, 2)
+ self.layout.addWidget(self.filterLabel, 3, 0, 1, 1)
+ self.layout.addWidget(self.filterComboBox, 3, 1, 1, 2)
+ self.layout.addWidget(self.ETLCheckBoxLabel, 4, 0, 1, 1)
+ self.layout.addWidget(self.ETLCheckBox, 4, 1, 1, 2)
+ self.layout.addWidget(self.StartFocusLabel, 5, 0, 1, 1)
+ self.layout.addWidget(self.StartFocusButton, 5, 1, 1, 1)
+ self.layout.addWidget(self.GoToZStartButton, 5, 2, 1, 1)
+ self.layout.addWidget(self.EndFocusLabel, 6, 0, 1, 1)
+ self.layout.addWidget(self.EndFocusButton, 6, 1, 1, 1)
+ self.layout.addWidget(self.GoToZEndButton, 6, 2, 1, 1)
+ self.setLayout(self.layout)
+
+ def initializePage(self):
+ self.update_page_from_state()
+
+ def update_page_from_state(self):
+ self.laserComboBox.setCurrentText(self.parent.state['laser'])
+ self.intensitySlider.setValue(self.parent.state['intensity'])
+ self.filterComboBox.setCurrentText(self.parent.state['filter'])
+
+ def update_start_focus_position(self):
+ self.f_start = self.parent.state['position']['f_pos']
+
+ def update_end_focus_position(self):
+ self.f_end = self.parent.state['position']['f_pos']
+
+ def go_to_z_position(self, z):
+ self.parent.parent.parent.sig_move_absolute.emit({'z_abs':z})
+ #try:
+ #except:
+ # print('Move absolute is not possible!')
+
+ def validatePage(self):
+ selectedIntensity = self.intensitySlider.value()
+ selectedLaser = self.laserComboBox.currentText()
+ selectedFilter = self.filterComboBox.currentText()
+ f_start = self.f_start
+ f_end = self.f_end
+
+ if self.ETLCheckBox.isChecked():
+ etl_l_offset = self.parent.state['etl_l_offset']
+ etl_l_amplitude = self.parent.state['etl_l_amplitude']
+ etl_r_offset = self.parent.state['etl_r_offset']
+ etl_r_amplitude = self.parent.state['etl_r_amplitude']
+ else:
+ etl_l_offset = 0
+ etl_l_amplitude = 0
+ etl_r_offset = 0
+ etl_r_amplitude = 0
+
+ self.parent.channels.append({'laser':selectedLaser,
+ 'intensity':selectedIntensity,
+ 'filter':selectedFilter,
+ 'f_start':f_start,
+ 'f_end':f_end,
+ 'etl_l_offset':etl_l_offset,
+ 'etl_l_amplitude':etl_l_amplitude,
+ 'etl_r_offset':etl_r_offset,
+ 'etl_r_amplitude':etl_r_amplitude})
+
+ return True
+
+class FirstChannelPage(GenericChannelPage):
+ def __init__(self, parent=None):
+ super().__init__(parent, 0)
+
+ def nextId(self):
+ if self.parent.channelcount == 1:
+ return self.parent.folderpage
+ else:
+ return self.parent.channel2
+
+class SecondChannelPage(GenericChannelPage):
+ def __init__(self, parent=None):
+ super().__init__(parent, 1)
+
+ def nextId(self):
+ if self.parent.channelcount == 2:
+ return self.parent.folderpage
+ else:
+ return self.parent.channel3
+
+class ThirdChannelPage(GenericChannelPage):
+ def __init__(self, parent=None):
+ super().__init__(parent, 2)
+
+ def nextId(self):
+ return self.parent.folderpage
+
+class DefineFolderPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Select folder")
+ self.setSubTitle("Please select the folder in which the data should be saved.")
+
+ self.Button = QtWidgets.QPushButton('Select Folder')
+ self.Button.setCheckable(True)
+ self.Button.setChecked(False)
+ self.Button.toggled.connect(self.choose_folder)
+
+ self.TextEdit = QtWidgets.QLineEdit(self)
+
+ self.layout = QtWidgets.QGridLayout()
+ self.layout.addWidget(self.Button, 0, 0)
+ self.layout.addWidget(self.TextEdit, 1, 0)
+ self.setLayout(self.layout)
+
+ def choose_folder(self):
+ ''' File dialog for choosing the save folder '''
+
+ path = QtWidgets.QFileDialog.getExistingDirectory(self.parent, 'Select Folder')
+ if path:
+ self.parent.folder = path
+ self.TextEdit.setText(path)
+
+class FinishedTilingPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.parent = parent
+
+ self.setTitle("Finished!")
+ self.setSubTitle("Attention: This will overwrite the Acquisition Table. Click 'Finished' to continue. To rename the files, use the filename wizard.")
+
+ def validatePage(self):
+ return True
+
+if __name__ == '__main__':
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ wizard = MyWizard()
+ sys.exit(app.exec_())
diff --git a/mesoSPIM/src/utils/utility_functions.py b/mesoSPIM/src/utils/utility_functions.py
new file mode 100644
index 0000000..04f3fa6
--- /dev/null
+++ b/mesoSPIM/src/utils/utility_functions.py
@@ -0,0 +1,18 @@
+'''
+Contains a variety of mesoSPIM utility functions
+'''
+
+import numpy as np
+
+def convert_seconds_to_string(delta_t):
+ '''
+ Converts an input value in seconds into a string in the format hh:mm:ss
+
+ Interestingly, a variant using np.divmod is around 4-5x slower in initial tests.
+ '''
+ if delta_t <= 0:
+ return '--:--:--'
+ else:
+ hours, remainder = divmod(delta_t, 3600)
+ minutes, seconds = divmod(remainder, 60)
+ return f"{int(hours):02}:{int(minutes):02}:{int(seconds):02}"
diff --git a/mesoSPIM/tmp/readme.txt b/mesoSPIM/tmp/readme.txt
new file mode 100644
index 0000000..75f30a2
--- /dev/null
+++ b/mesoSPIM/tmp/readme.txt
@@ -0,0 +1 @@
+The tmp folder is the default location to save data.
\ No newline at end of file