Session model#

Both GUIs are thin views over a shared in-memory controller: McfSession. Scripts can use the same object without opening a window.

Pieces#

Object

Role

PanelState

One image layer: data, header/McfHeader, stretch, limits, color, label, smooth

ComposeState

Combined-figure settings: mode, blend, background, gamma, ticks, legend, overlays, …

McfSession

panels[] + compose; render, align, save, export

import multicolorfits as mcf

s = mcf.McfSession()                 # default 4 empty panels
s = mcf.McfSession(n_panels=3)

s.load_files(['a.fits', 'b.fits'], colors=['#f00', '#0ff'], labels=['A', 'B'])
s.panels[0].stretch = 'asinh'
s.panels[0].apply_zscale()
s.compose.combine_mode = 'lab'
s.compose.combine_blend = 'screen'

rgb = s.render_combined()

Dynamic panel count#

Defaults match the GUI (4 tabs). Grow or shrink in scripts or via + Add panel / Remove in either GUI (bounds: 1–16):

from multicolorfits import MAX_PANELS, MIN_PANELS  # 16, 1

idx = s.add_panel(color='#88FF88', label='extra')
s.remove_panel(idx)
s.set_n_panels(6)

load_files grows the list when given more paths than current slots. load_state restores the saved slot count (clamped to MAX_PANELS).

Figure chrome — legend and combo swatch#

Publication figures usually need to say which color is which band, and whether overlap hues are honest for the current combine mode:

s.compose.show_legend = True          # channel → color key
s.compose.show_combo_swatch = True    # overlapping circles using the same mixer
s.compose.show_band_labels = True     # optional text on the image

The combo swatch calls the same combine_colorized_layers path as the main image, so Lab / RYB / RGB overlaps in the legend match the figure.

Channel legend and combo swatch on a combined figure Channel legend and combo swatch (dark chrome)

Real-data example with legend + swatch: NGC 602 — three bands, one decision.

Fast preview vs full resolution#

Interactive edits on large FITS should not recompute a full float64 WCS figure on every slider move:

preview = s.render_combined(preview=True)   # float32, longest side ≤ 1024 by default
final = s.render_combined()                 # export / Plot Full Resolution path

Both GUIs keep Fast preview on by default for the combined view; click Plot Full Resolution when you want ticks, overlays, and the arrays used by Save Image / Export Script. See Browser GUI walkthrough.

Palettes and color vision#

print(mcf.list_palettes())
s.apply_palette('pob')                 # purple / orange / blue, etc.
print(s.colorblind_report())           # flag clashes for common CVD types
# or design from scratch:
colors = mcf.suggest_colors(4)

The GUI Colors tab applies curated palettes and shows a live color-vision status. Side-by-side looks on one target: Crab Nebula — palette & compositing gallery.

Persistence#

s.save_state('session.json')     # paths + settings (not pixels)
s.load_state('session.json')
print(s.export_script())         # standalone recreation script

Launch with state:

mcf.gui(state='session.json')
mcf.gui_qt(files=['a.fits', 'b.fits'], colors=['#f00', '#0ff'])

Alignment when grids differ: WCS, headers, and alignment. Tutorials: Session JSON and export script, Save and export.