# Prerequsites
1. git https://git-scm.com/
2. uv https://docs.astral.sh/uv/

# Install 
1. Clone repo (git clone)
2. uv sync 
3. uv run pre-commit install 


Style:
use params to check anything from user such as experiment config files, machine config files, recipes, etc.
use attrs to format data such as imaging, regions of interests, or pumping parameters, etc. 

use typing -> self documenting code?
inherit abstract base classes for instruments, protocols, configs


Instruments:
inherit instrument abstract basae class
mix in communication protocol
async all commands that communicate with insrument
format async commands with _


Systems:
inherit system abstract basae class
Flowcells -> Pumps, Valves, Temperature Controller
Microscope -> Stages, Cameras, Lasers, any optics such as Shutters/Filters
Sequencer -> Flowcells & Microscopes
Async high level commands for pumping, imaging, synchronizing
format async commands with _
wrapper around async commands that add a task to the queue
System queues are FIFO, tasks have ids, and queues can be edited and paused
Tasks in queues can be reordered and deleted but not modified

User Interfaces
Hardware Settings
hardware settings that can't be or shouldn't be changes easily should go in machine_settings.yaml

Experiment & Software Settings
experiment/software settings that need to be changed easily should go default_config.toml
experiment settings should mimic ROI stage, focusing, imaging, and exposing parameters
reagents specified in seperate toml section [method.reagent] {reagent_name: port}
reagents should follow reagents parameters, with default flow rates, pause, etc from [method.fluidics]

Recipes
recipes follow simple yaml flow style and then formatted into more structured and annotated yaml

ROIs
Can fully define stage and image parameters in recipe specific.
If only image parameters in recipe, all ROIs defined for flowcell will be imaged with these parameters
default image parameters can be defined in experiment config
