Instrument control system
Purpose
The ICS is the web-based control and monitoring layer for the spectrograph. It keeps acquisition logic separate from the scientific reduction packages and provides interchangeable hardware backends for development and deployment.
Installation and launch
The distribution is named classi-ics, requires Python 3.11 or newer,
and installs the ics Python package. From a sibling checkout, install and
launch it with:
python -m pip install -e ./ics
cp ics/config.example.ini config.ini
classi-ics
Application modules therefore use imports such as ics.web and
ics.devices; src is the source directory, not the import namespace.
Backend selection
The science camera and camera-lens controller use INDI. The default INDI device
names are FLI Aurora and Pinefeat CEF; the observer interface can select
different devices discovered on the configured INDI server without restarting
the ICS.
The [backends] section of config.ini selects mock or alpaca
implementations for tcs and guide_camera. The Alpaca clients communicate
with the ACE Alpaca bridge on the telescope-control-system (TCS) computer; the
ICS host therefore does not install the vendor ACE Connector package or store
its credentials. [alpaca] configures the bridge host and port, telescope and
camera device numbers, and guide-camera exposure timeout. The connection uses
ordinary HTTP.
The Alpaca acquisition-camera backend starts an exposure, polls ImageReady,
retrieves ImageArray, converts the Alpaca X-major array to NumPy/FITS
(y, x) order, and writes
previews/latest_guide_preview.fits beneath the configured data root.
Warning
The bridge advertises one Focuser (the telescope focus mechanism) and does not
advertise the native X/Y guide stage. The ICS supports only stage = mock
and rejects stage = alpaca during backend creation. The stage should
remain on the mock backend until a verified network mapping is implemented
on both sides.
The factory layer builds the concrete backend objects from these settings, which keeps the rest of the application independent of the vendor interface.
Web application
The Flask application exposes acquisition/status endpoints and the observer UI. Completed science FITS files can be served to the UI for direct JS9 display. The loader requests the full detector dimensions with no JS9 display binning, preventing the browser from cropping or resampling the preview. This keeps the preview faithful to the detector data and permits normal FITS inspection tools in the browser.
Configuration
Copy the repository’s
config.example.ini
to config.ini and adjust it for the deployment. classi-ics reads
config.ini from the current working directory by default;
create_app(config_path) accepts an alternate path for embedded or test
deployments. Relative data_root paths are resolved relative to the
configuration file rather than the process working directory.
The file groups settings into [server], [instrument], [js9],
[indi], [backends], and [alpaca] sections. It is the authoritative
inventory of supported options and defaults. Instrument geometry and component
names configured there are written into acquired FITS headers, so they must
match the hardware actually in use.
Production credentials and secret keys should not be committed.
FITS metadata
The exposure form records the observer, target, image type, exposure request, binning, and optional comment. After acquisition, the ICS preserves the camera-reported exposure time and supplements the raw header with provenance, instrument configuration, detector state, target and telescope coordinates, guide/stage state, timing, and file metadata. See Data products for the keyword conventions, including the distinction between requested and actual exposure time.