# quasars/orange-spectroscopy architecture

> Architecture diagram of the GitHub repository quasars/orange-spectroscopy, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/quasars/orange-spectroscopy
- Repository: https://github.com/quasars/orange-spectroscopy

## Overview

Orange Spectroscopy is an Orange3 add-on for spectral-data analysis. The principal workflow is to load instrument or general-format files into Orange spectral tables, apply spectral preprocessing, then inspect or analyze spectra and hyperspectral maps in Orange widgets. Separate widget branches provide operations such as integration, FFT, peak fitting, and PLS modeling. Reader registration and shared table-construction utilities form an internal data layer. The README establishes the add-on’s role; edges are limited to imports and relationships shown in the supplied excerpts or index, so some widget-to-analysis connections remain unverified.

Main entry points: [`orangecontrib/spectroscopy/preprocess`](https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/preprocess) (Preprocessing methods), [`orangecontrib/spectroscopy/widgets/owhyper.py`](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owhyper.py) (Hyperspectral viewer), [`orangecontrib/spectroscopy/widgets/owspectra.py`](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owspectra.py) (Spectra viewer), [`orangecontrib/spectroscopy/io`](https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/io) (File readers)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Data ingestion"]
  node_file_readers["File readers"]
  node_reader_registration["Reader registration<br/>[__init__.py]"]
  node_tile_loading["Tile loading<br/>[owtilefile.py]"]
end

subgraph group_processing["Spectral processing"]
  node_preprocess_core["Preprocessing methods"]
  node_baseline["Baseline correction<br/>[baseline.py]"]
  node_emsc["EMSC correction<br/>[emsc.py]"]
  node_integration["Integration methods<br/>[integrate.py]"]
  node_transform["Spectral transforms<br/>[transform.py]"]
  node_preprocess_widget["Preprocessing widget<br/>[owpreprocess.py]"]
end

subgraph group_analysis["Analysis widgets"]
  node_spectra_view["Spectra viewer<br/>[owspectra.py]"]
  node_hyper_view["Hyperspectral viewer<br/>[owhyper.py]"]
  node_spatial_widgets["Spatial analysis"]
  node_peak_fit["Peak fitting<br/>[peakfit_compute.py]"]
  node_fft_widget["FFT analysis<br/>[owfft.py]"]
  node_pls_widget["PLS modeling<br/>[owpls.py]"]
end

subgraph group_support["Shared runtime"]
  node_spectral_tables["Spectral tables<br/>[util.py]"]
  node_data_compat["Data compatibility<br/>[data.py]"]
  node_pls_model["PLS model<br/>[pls.py]"]
  node_gui_helpers["Widget helpers<br/>[gui.py]"]
  node_geometry["Line geometry<br/>[line_geometry.py]"]
end

node_analyst(("Orange user"))

node_analyst -.->|"loads spectra"| node_file_readers
node_reader_registration -->|"registers readers"| node_file_readers
node_data_compat -->|"imports readers"| node_file_readers
node_file_readers -.->|"builds tables"| node_spectral_tables
node_tile_loading -.->|"loads tiles"| node_spectral_tables
node_spectral_tables -.->|"supplies spectral data"| node_spectra_view
node_analyst -.->|"configures processing"| node_preprocess_widget
node_preprocess_widget -.->|"applies methods"| node_preprocess_core
node_preprocess_core -->|"includes correction"| node_emsc
node_preprocess_core -->|"includes transforms"| node_transform
node_preprocess_core -->|"includes integration"| node_integration
node_analyst -.->|"inspects spectra"| node_spectra_view
node_analyst -.->|"inspects maps"| node_hyper_view
node_hyper_view -->|"reshapes data"| node_spectral_tables
node_hyper_view -->|"uses controls"| node_gui_helpers
node_hyper_view -->|"uses geometry"| node_geometry
node_spectra_view -->|"uses controls"| node_gui_helpers
node_spectra_view -->|"uses geometry"| node_geometry
node_analyst -.->|"analyzes maps"| node_spatial_widgets
node_analyst -.->|"fits peaks"| node_peak_fit
node_analyst -.->|"analyzes transforms"| node_fft_widget
node_analyst -.->|"builds models"| node_pls_widget
node_pls_widget -.->|"uses model"| node_pls_model

click node_file_readers "https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/io"
click node_reader_registration "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/io/__init__.py"
click node_tile_loading "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owtilefile.py"
click node_spectral_tables "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/io/util.py"
click node_data_compat "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/data.py"
click node_preprocess_core "https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/preprocess"
click node_baseline "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/als/baseline.py"
click node_emsc "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/emsc.py"
click node_integration "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/integrate.py"
click node_transform "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/transform.py"
click node_preprocess_widget "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owpreprocess.py"
click node_spectra_view "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owspectra.py"
click node_hyper_view "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owhyper.py"
click node_spatial_widgets "https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/widgets"
click node_peak_fit "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/peakfit_compute.py"
click node_fft_widget "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owfft.py"
click node_pls_widget "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owpls.py"
click node_pls_model "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/models/pls.py"
click node_gui_helpers "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/gui.py"
click node_geometry "https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/line_geometry.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_file_readers,node_reader_registration,node_tile_loading,node_analyst toneBlue
class node_preprocess_core,node_baseline,node_emsc,node_integration,node_transform,node_preprocess_widget toneAmber
class node_spectra_view,node_hyper_view,node_spatial_widgets,node_peak_fit,node_fft_widget,node_pls_widget toneMint
class node_spectral_tables,node_data_compat,node_pls_model,node_gui_helpers,node_geometry toneRose
```

## Components

### Data ingestion

- [File readers](https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/io): `orangecontrib/spectroscopy/io`
- [Reader registration](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/io/__init__.py): `orangecontrib/spectroscopy/io/__init__.py`
- [Tile loading](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owtilefile.py): `orangecontrib/spectroscopy/widgets/owtilefile.py`

### Spectral processing

- [Preprocessing methods](https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/preprocess): `orangecontrib/spectroscopy/preprocess`
- [Baseline correction](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/als/baseline.py): `orangecontrib/spectroscopy/preprocess/als/baseline.py`
- [EMSC correction](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/emsc.py): `orangecontrib/spectroscopy/preprocess/emsc.py`
- [Integration methods](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/integrate.py): `orangecontrib/spectroscopy/preprocess/integrate.py`
- [Spectral transforms](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/preprocess/transform.py): `orangecontrib/spectroscopy/preprocess/transform.py`
- [Preprocessing widget](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owpreprocess.py): `orangecontrib/spectroscopy/widgets/owpreprocess.py`

### Analysis widgets

- [Spectra viewer](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owspectra.py): `orangecontrib/spectroscopy/widgets/owspectra.py`
- [Hyperspectral viewer](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owhyper.py): `orangecontrib/spectroscopy/widgets/owhyper.py`
- [Spatial analysis](https://github.com/quasars/orange-spectroscopy/tree/master/orangecontrib/spectroscopy/widgets): `orangecontrib/spectroscopy/widgets`
- [Peak fitting](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/peakfit_compute.py): `orangecontrib/spectroscopy/widgets/peakfit_compute.py`
- [FFT analysis](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owfft.py): `orangecontrib/spectroscopy/widgets/owfft.py`
- [PLS modeling](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/owpls.py): `orangecontrib/spectroscopy/widgets/owpls.py`

### Shared runtime

- [Spectral tables](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/io/util.py): `orangecontrib/spectroscopy/io/util.py`
- [Data compatibility](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/data.py): `orangecontrib/spectroscopy/data.py`
- [PLS model](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/models/pls.py): `orangecontrib/spectroscopy/models/pls.py`
- [Widget helpers](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/gui.py): `orangecontrib/spectroscopy/widgets/gui.py`
- [Line geometry](https://github.com/quasars/orange-spectroscopy/blob/master/orangecontrib/spectroscopy/widgets/line_geometry.py): `orangecontrib/spectroscopy/widgets/line_geometry.py`

### Other components

- **Orange user**

## Connections

- Orange user → File readers: loads spectra
- Reader registration → File readers: registers readers (evidence: `orangecontrib/spectroscopy/io/__init__.py`)
- Data compatibility → File readers: imports readers (evidence: `orangecontrib/spectroscopy/data.py`)
- File readers → Spectral tables: builds tables (evidence: `orangecontrib/spectroscopy/io/neaspec.py`)
- Tile loading → Spectral tables: loads tiles
- Spectral tables → Spectra viewer: supplies spectral data
- Orange user → Preprocessing widget: configures processing
- Preprocessing widget → Preprocessing methods: applies methods
- Preprocessing methods → EMSC correction: includes correction (evidence: `orangecontrib/spectroscopy/preprocess/__init__.py`)
- Preprocessing methods → Spectral transforms: includes transforms (evidence: `orangecontrib/spectroscopy/preprocess/__init__.py`)
- Preprocessing methods → Integration methods: includes integration (evidence: `orangecontrib/spectroscopy/preprocess/__init__.py`)
- Orange user → Spectra viewer: inspects spectra
- Orange user → Hyperspectral viewer: inspects maps
- Hyperspectral viewer → Spectral tables: reshapes data (evidence: `orangecontrib/spectroscopy/widgets/owhyper.py`)
- Hyperspectral viewer → Widget helpers: uses controls (evidence: `orangecontrib/spectroscopy/widgets/owhyper.py`)
- Hyperspectral viewer → Line geometry: uses geometry (evidence: `orangecontrib/spectroscopy/widgets/owhyper.py`)
- Spectra viewer → Widget helpers: uses controls (evidence: `orangecontrib/spectroscopy/widgets/owspectra.py`)
- Spectra viewer → Line geometry: uses geometry (evidence: `orangecontrib/spectroscopy/widgets/owspectra.py`)
- Orange user → Spatial analysis: analyzes maps
- Orange user → Peak fitting: fits peaks
- Orange user → FFT analysis: analyzes transforms
- Orange user → PLS modeling: builds models
- PLS modeling → PLS model: uses model
