Metadata-Version: 2.1
Name: automatic-spectral-acquisition
Version: 0.1.3
Summary: Python interface for the automatic data acquisition of spectral data.
Author: HugoG16
Author-email: hugo.c.gomes@tecnico.ulisboa.pt
Requires-Python: >=3.12,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Requires-Dist: PyVISA (>=1.14.1,<2.0.0)
Requires-Dist: matplotlib (>=3.9.2,<4.0.0)
Requires-Dist: numpy (>=2.0.1,<3.0.0)
Requires-Dist: pydot (>=3.0.1,<4.0.0)
Requires-Dist: pyinputplus (>=0.2.12,<0.3.0)
Requires-Dist: pyserial (>=3.5,<4.0)
Requires-Dist: python-statemachine (>=2.3.4,<3.0.0)
Requires-Dist: rich (>=13.7.1,<14.0.0)
Requires-Dist: typer (>=0.12.4,<0.13.0)
Project-URL: Repository, https://github.com/HugoG16/automatic-spectral-acquisition
Description-Content-Type: text/markdown

# Automatic spectral acquisition

Python command line interface for the automatic data acquisition of spectral data. Connects to an Arduino running a custom program and to an oscilloscope. 


## Setup

An Arduino running the code on `arduino_code.ino` is connected to a stepper motor controller (using a DVR8825 breakout board driver). The stepper motor is connected to a manual monochromator with a timing belt and two gears.
For the detection, a PMT is connected to an oscilloscope.
Both of these components can then be controlled using this CLI.
<p align="center">
<img src="https://github.com/HugoG16/automatic-spectral-acquisition/blob/main/images/setup_schematic.png?raw=true)" width=60%>
</p>

The diagram for the stepper motor controller is shown next. 

<p align="center">
<img src="https://github.com/HugoG16/automatic-spectral-acquisition/blob/main/images/circuit_diagram.png?raw=true)" width=60%>
</p>


## Installation

Install using
```
pip install automatic-spectral-acquisition
```

## Calibration process

An initial calibration is necessary for setting the `DEFAULT_POSITION` (default=0) and `CALIBRATION_POSITIONS` in `automatic_spectral_acquisition\constants.py`. This calibration has to be done manually for now, and requires the user to choose a set of points that will be used for further calibrations:
 1. Define a default position and a default wavelength. Ideally `DEFAULT_POSITION=0` and a wavelength in the middle of the available range, e.g., 650 nm.
 2. Select a set of wavelengths (e.g.: [350, 500, 650, 800, 950] nm)
 3. Manually set the monochromator to the default wavelength and start the Arduino code.
 3. Find the associated position by trial and error. Use these values to populate `CALIBRATION_POSITIONS`.

As long as the following measurements conclude successfully, redefining these constants won't be necessary. Even if there is some problem and the motor doesn't return to the default position, if `DEFAULT_POSITION=0`, the monochromator can be manually set to the default wavelength associated with the default position to return to normal functionality.

After that, the calibration process can be performed using, e.g., `spectral config calibrate`. The motor will be moved to the set positions and the user will be asked to input the current wavelength value. 

At the end of a measurement, the motor will return to the default position to guarantee the correct behaviour of further measurements.

The calibration parameters are saved to a file and can be reused for every measurement. However, it is recommended to recalibrate the system every session.


## How to use

To call the program, use the command `spectral`.
To get help using the CLI, use the command `spectral --help` or `spectral <subcommand> --help`.

To create a configuration file use
```
spectal config create
```
You will be asked to select the serial ports for the Arduino and oscilloscope, as well as, to calibrate the stepper motor.

If a configuration file already exists, you can choose to just re-calibrate the stepper motor using
```
spectral config calibrate
```

You can see the current configuration using
```
spectral config show
```
Or delete it using
```
spectral config delete
```

To record a spectrum use
```
spectral spectrum <start> <end> <step> [options]
``` 
- `<start>` is the wavelength of the start of the spectrum 
- `<end>` is the wavelength of the end of the spectrum 
- `<step>` is the space between measurements

`[options]` can contain:
- `-n <number of measurements>` is used to select how many measurements are taken and averaged for each wavelength
- `-f <name of output file>` is used to change the name of the output file
- `-p` if this options is present, the spectrum will be plotted at the end of acquisition

You can also take a single measurement using
```
spectral single <wavelength> [options]
``` 

`[options]` can contain:
- `-n <number of measurements>` is used to select how many measurements are taken and averaged for each wavelength
- `-f <name of output file>` is used to change the name of the output file
- `-p` if this options is present, the values measured will be printed on the terminal

