Narrowband Palette Composer¶
Purpose and expected result¶
Narrowband Palette Composer prepares selected Ha, OIII, SII, and optional OSC stills, calculates 12 fixed palette formulas, and presents them as a synchronized grid or a large single preview. Per-role intensity controls multiply prepared Ha/OIII/SII values before mapping, clipping, and final global peak normalization.
The expected Apply result is one new 32-bit float RGB still named from the
selected OIII, then Ha, then SII source and palette—for example,
OIII - SHO Narrowband Palette. OSC-only input falls back to
<palette> Narrowband Palette. Sources remain unchanged.
This is preset formula exploration, not a physical spectral model. Role names are user assertions: the process does not read filter identities, passbands, exposures, WCS, registration, or PSFs, and it does not provide a custom matrix editor.
At a glance¶
| Item | Current behavior |
|---|---|
| Menu path | Process > Color Spaces > Narrowband Palette Composer |
| Enabled when | Always available as a top-level process; it can open without an active image or any open images |
| Inputs | OIII plus Ha or SII after optional OSC synthesis; all selectors accept open grayscale or RGB stills and may reuse the same view |
| Outputs | One new float RGB still for the selected palette; no source replacement, auxiliary channels, snapshot, report, preset file, or direct disk output |
| Recommended image state | Registered/cropped linear masters with gradients corrected; leave Input autostretch on for linear data unless you intentionally prepared display-ready inputs |
| Preview support | Automatic Palette Grid and Single Preview, built on a worker under an operation of their own once the inputs are chosen - the latest request wins and nothing older is shown; all 12 palettes at full resolution as 8-bit display conversions; no standard viewer/histogram/autostretch toolbar |
| Sequence support | Not supported by any source selector; no target sequence is needed to open the top-level window |
| Mask support | Not supported; the process explicitly disables ordinary target masking |
| External dependencies | No runtime tool, Python environment, model, catalog, or network service; SetiAstro lineage is recorded under References and provenance |
Before you start¶
- Register and crop sources to one geometry whenever possible. Match sizes to reference only resizes width/height; it does not align stars, preserve aspect ratio, inspect WCS, or match PSFs.
- Select semantic roles carefully. RGB images in Ha/OIII/SII use red only. OSC1 synthesizes Ha from red and OIII from the green/blue mean; OSC2 synthesizes SII from red and OIII from the green/blue mean.
- Decide whether input pixels are linear. Input autostretch applies a fixed
unlinked AfterNight stretch with shadows clipping
-2.8and target median0.25, derived from the exact median and median absolute deviation of every sample; neither value is exposed in this window. - Expect every palette to receive a global peak normalization. Even with Input autostretch off and intensities at 100%, Apply does not preserve the absolute scale of the masters.
- Remove unused selections rather than treating them as passive metadata. Every selected direct/OSC source participates in synthesis and in the metadata built for the output.
Procedure¶
- Open the registered Ha, OIII, SII, and optional OSC stills, then choose Process > Color Spaces > Narrowband Palette Composer. No active target is required.
- Select OIII plus Ha or SII. Alternatively, select OSC1/OSC2 sources that synthesize those roles. Watch Status and the warning text for RGB channel extraction, mono OSC broadcast, or resize notes.
- Leave Input autostretch checked for linear masters. Turn it off for data already stretched or when you explicitly want only formula/clipping/global- normalization behavior.
- Prefer same-size sources. If they differ, leave Match sizes to reference checked only when simple resampling is acceptable; full UI output uses Ha as dimension reference, then OIII, then SII.
- In Palette Grid, select a tile to choose Apply's palette. Use the wheel and drag to inspect the same location/zoom across all formulas, or switch to Single Preview and choose from its bottom gallery.
- Adjust Ha, OIII, and SII intensity from
100%one role at a time. The grid rebuilds all 12 formula outputs after each committed slider/spin change. - Inspect clipped highlights, noisy weak roles, and star alignment at the same zoom. The previews are normalized 8-bit displays of the float palette result, not a separate display STF.
- Select Apply and wait for the named RGB view. Apply runs in a background worker but exposes no progress dialog or user Cancel action.
Complete parameter and action reference¶
| UI label/action | Type and unit | Runtime default | Persisted-default exception | Valid values, step, or constraints | Effect of increasing, decreasing, or selecting | Dependencies and enable/visibility rules | Quality, artifact, runtime, memory, or disk trade-off | Scope: preview/apply, channel, mask, still/sequence | Persistence |
|---|---|---|---|---|---|---|---|---|---|
| Ha | Image selector, semantic role | No image | None; top-level process has no active-target auto-selection | Open grayscale/RGB still or No image; duplicates allowed | Supplies explicit Ha; RGB uses red; OSC1 contribution averages 50/50 with it | Readiness also needs OIII; if absent, prepared SII substitutes in Ha formula positions | Wrong role/misregistration creates false color; source preparation/cache costs full image | Grid/Apply; Ha role; still only; no mask | Window lifetime; tracks create/close/rename; Reset/success retains selection |
| OIII | Image selector, semantic role | No image | None | Open grayscale/RGB still or No image | Supplies required explicit OIII; RGB uses red; OSC contributions blend into it | OIII must exist after direct/OSC synthesis | Central to every formula; weak/noisy OIII can dominate cyan/blue after normalization | Grid/Apply; OIII role | Window lifetime; Reset/success retains selection |
| SII | Image selector, semantic role | No image | None | Open grayscale/RGB still or No image | Supplies explicit SII; RGB uses red; OSC2 contribution averages 50/50 with it | Readiness also needs OIII; if absent, prepared Ha substitutes in SII formula positions | Substitution makes SII-labelled formula positions reuse Ha, not an inferred sulfur signal | Grid/Apply; SII role | Window lifetime; Reset/success retains selection |
| OSC1 | Image selector, helper role | No image | None | Open RGB/mono still or No image | Synthesizes Ha=R and OIII=(G+B)/2; mono is broadcast to RGB first |
May satisfy both readiness sides by itself | Mixing OSC with explicit roles uses fixed 50/50 blends and can transfer broadband stars/gradients | Grid/Apply; Ha/OIII synthesis | Window lifetime; Reset/success retains selection |
| OSC2 | Image selector, helper role | No image | None | Open RGB/mono still or No image | Synthesizes SII=R and OIII=(G+B)/2; mono is broadcast first |
May satisfy both readiness sides by itself | If OSC1 and OSC2 both feed OIII, sequential averaging weights the later OSC2 contribution more | Grid/Apply; SII/OIII synthesis | Window lifetime; Reset/success retains selection |
| Input autostretch | Checkbox, fixed unlinked STF | Checked | Hidden defaults: target median 0.25, shadows clipping -2.8 |
Checked/unchecked | Checked stretches each prepared direct mono role independently and each OSC RGB channel independently before OSC extraction/mixing | Source/preparation change triggers a full grid rebuild | Makes linear signal visible but permanently changes palette pixels; unsuitable for already-stretched data; statistics/stretch cost per source | Grid/Apply before synthesis; no mask | Window lifetime; Reset/success checks it |
| Match sizes to reference | Checkbox | Checked | None | Checked/unchecked | Checked resizes prepared roles to Ha dimensions, then OIII, then SII; unchecked rejects remaining mismatches | OSC synthetic contribution may still be resized to an existing explicit channel before this policy is evaluated | Resampling changes sampling/PSF and can distort aspect ratio; unchecked is safer for detecting bad geometry | Grid/Apply; all prepared roles | Window lifetime; Reset/success checks it |
| Mode | Combo box | Palette Grid | None | Palette Grid, Single Preview | Changes presentation only; selected palette remains synchronized | Both modes always receive all 12 built frames | No engine rebuild; Single Preview devotes more screen area to one result | Preview display only | Window lifetime; Reset/success returns Palette Grid |
| Palette Grid tiles | Twelve selectable preview cards | SHO selected | None | SHO, HOO, HSO, HOS, OSS, OHH, OSH, OHS, HSS, Realistic1, Realistic2, Foraxx | Clicking a tile selects Apply palette and begins possible pan | Frames appear only after readiness/build; descriptions appear as hover tooltips | All frames are full-resolution 8-bit display copies of 12 float RGB results | Preview selection; Apply uses selected id | Selection shared with Single Preview; Reset/success selects SHO |
| Palette Grid mouse wheel | Shared zoom gesture | 1x, centered |
None | 1.15^wheel_steps, clamped 1x..32x |
Zooms the same source crop across every tile | Requires built frames | High zoom helps registration/clipping checks; no pixel recomputation | Preview display only | Resets when frames rebuild or double-clicked |
| Palette Grid left-drag | Shared pan gesture and selection | Centered | None | Drag any tile after selecting it | Moves shared normalized view center for every tile | Panning acts only above 1x |
Enables formula comparison at identical coordinates | Preview display only | Until rebuild/double-click |
| Palette Grid double-click | Reset gesture | — | None | Left double-click | Resets shared zoom to 1x and center to image midpoint |
Grid visible | Display-only | Preview display only | Immediate |
| Single Preview gallery | Twelve selectable thumbnails | SHO selected | None | Same 12 palettes | Chooses large preview and Apply palette; tooltip shows formula description | Single Preview mode; selection synchronized with grid | Gallery thumbnails use same built frames; no further engine run | Preview selection | Shared/window; Reset/success selects SHO |
| Single Preview main image | Large 8-bit presentation | Selected full-frame palette | None | Current selected palette | Displays a larger aspect-fitted view | Single Preview mode and built frames | Display conversion may downsample to fit; float Apply output is unchanged | Preview display only | Replaced on grid rebuild |
| Single Preview mouse wheel | Zoom gesture | 1x, centered |
None | Pointer over main image; 1.15^steps, 1x..32x |
Zooms selected main image | Does not zoom gallery | Display-only inspection | Preview display only | Until rebuild/double-click |
| Single Preview left-drag | Pan gesture | Centered | None | Drag main image | Pans selected preview at zoom > 1x |
Main image only | Display-only inspection | Preview display only | Until rebuild/double-click |
| Single Preview double-click | Reset gesture | — | None | Double-click main image | Resets zoom/center | Main image only | Display-only | Preview display only | Immediate |
| Ha | Linked slider + spin box, percent | 100% |
This is the intensity row, distinct from Ha source selector | 0..200%; step 1; slider page 10; slider tracking off |
Multiplies prepared/substituted Ha before selected formula | Spin updates immediately; slider commits value changes without continuous tracking | High values clip before normalization; 0 removes Ha-role contribution, including substituted SII in Ha positions |
All 12 grid formulas and Apply; semantic Ha factor | Window lifetime; Reset/success returns 100% |
| OIII | Linked slider + spin box, percent | 100% |
Intensity row | 0..200%; step 1; slider page 10; tracking off |
Multiplies required prepared OIII before mapping | Same synchronization as Ha | High values often drive cyan/blue clipping and global scale; 0 can collapse OIII-dependent output |
All palettes/Apply; OIII factor | Window lifetime; Reset/success returns 100% |
| SII | Linked slider + spin box, percent | 100% |
Intensity row | 0..200%; step 1; slider page 10; tracking off |
Multiplies prepared/substituted SII before mapping | Same synchronization as Ha | High values clip SII positions; with SII missing, this scales substituted Ha in SII positions | All palettes/Apply; semantic SII factor | Window lifetime; Reset/success returns 100% |
| Status | Read-only text | “Select OIII plus Ha or SII…” | None | Readiness/updating/ready messages | Reports missing roles, grid update, or selected-palette Apply readiness | Changes with selection/build state | Diagnostic only; not a progress percentage | Window state | Recomputed; not saved |
| Warning details | Read-only wrapped text | Empty | None | Preparation warnings or caught build error | Reports RGB-red extraction, mono OSC broadcast, synthesis resize, final reference resize, or grid failure | Cleared on invalid readiness/new request; successful grid uses first result's preparation warnings | Warnings can explain silent-looking role/resample changes; Apply itself has no report | Grid/preparation diagnostics | Recomputed; not saved |
| Busy spinner | Activity indicator | Inactive | None | Automatic during grid rebuild | Signals the worker's preparation and 12-palette build | The window stays responsive; a change during a build starts the next build, with the latest values, when this one lands | Does not provide percentage or cancellation | Preview-grid update only | Per rebuild |
| Apply | Button/action | Disabled until required synthesized roles exist | None | One action; disabled during worker execution | Captures current selected formula, settings, source names, and final output name, then creates a new RGB still in background | The selectors, preparation controls, preview selection, intensities, Apply, Reset, and Close are disabled until completion; the captured attachment/lock reference is OIII, then Ha, SII, OSC1, OSC2 | Full-resolution prepare/map/normalize cost; no overwrite or direct disk use | Apply; still sources; no mask/sequence | Successful Apply retains selectors but resets options, mode, palette, intensities |
| Reset | Button/action | Enabled while idle | None | One action | Restores Input autostretch/Match sizes on, Grid mode, SHO, and all intensities to 100% | Does not clear source selectors or preview view center directly; disabled during Apply; emitted changes can rebuild grid | May trigger expensive rebuilds | Configuration | Immediate; no saved process instance |
| Close | Button/action | Enabled while idle | None | One action | Closes top-level process | Button is disabled during Apply; a window-close request still waits on the execution lock | Wait for the current calculation to finish | Dialog only | Ends window-local state/cache |
| Mask / snapshot / progress / Cancel | Absent facilities | Not available | None | — | No target mask blend, standard Switch image/Preview area/Take snapshot, Apply progress, or user cancellation | Custom preview and top-level process intentionally omit these controls | Protect/localize inputs upstream; wait for builds/runs to finish | All operations | None |
How the algorithm works¶
Input preparation and channel synthesis¶
Every selected source converts to normalized 32-bit float. Direct Ha/OIII/SII mono is retained; direct RGB uses red and posts a warning. OSC RGB is retained; mono OSC broadcasts its one value into R/G/B and posts a warning.
When Input autostretch is checked, AfterNight calculates MAD statistics and
applies its unlinked automatic stretch with shadows clipping -2.8 and target
background 0.25. Direct RGB narrowband is reduced to red before this mono
stretch. OSC is stretched per RGB channel before synthesis.
Prepared OSC roles are:
If an explicit role already exists, its synthetic addition is a fixed
0.5 explicit + 0.5 synthetic blend. OSC1 is processed before OSC2, so with an
explicit OIII and both helpers the final OIII weights are 0.25 explicit +
0.25 OSC1 + 0.50 OSC2. A synthetic contribution with different dimensions is
resized to the existing explicit role even when Match sizes to reference is
off; a warning records this synthesis-specific resize.
After synthesis, OIII is mandatory and at least one of Ha/SII must exist. For formula mapping only, absent Ha uses prepared SII and absent SII uses prepared Ha. Their intensity controls remain semantic: Ha intensity scales the substitute used in Ha positions; SII intensity scales the substitute used in SII positions.
If final prepared dimensions differ and matching is on, full UI preview/Apply uses Ha dimensions, otherwise OIII, otherwise SII. Downsampling in either dimension selects area interpolation; pure enlargement selects bilinear. This can resize the other dimension and does not preserve aspect ratio automatically.
Palette formulas¶
Let H, O, and S be the prepared Ha, OIII, and SII samples after their
respective intensity factors. Substitution has already occurred. Each row below
produces raw (R,G,B) before clipping and final peak normalization.
| Palette | Red | Green | Blue | Notes |
|---|---|---|---|---|
| SHO | S |
H |
O |
Sulfur–hydrogen–oxygen direct assignment |
| HOO | H |
O |
O |
OIII supplies green and blue |
| HSO | H |
S |
O |
Direct assignment |
| HOS | H |
O |
S |
Direct assignment |
| OSS | O |
S |
S |
SII supplies green and blue |
| OHH | O |
H |
H |
Ha supplies green and blue |
| OSH | O |
S |
H |
Direct assignment |
| OHS | O |
H |
S |
Direct assignment |
| HSS | H |
S |
S |
SII supplies green and blue |
| Realistic1 | 0.5H + 0.5S |
0.3H + 0.7O |
0.1H + 0.9O |
Fixed SetiAstro weighted blend |
| Realistic2 | 0.7H + 0.3S |
0.3S + 0.7O |
O |
Fixed SetiAstro weighted blend |
| Foraxx, Ha present and SII absent | H |
U H + (1-U)O |
O |
Two-channel branch, U=(HO)^(1-HO) |
| Foraxx, otherwise | T S + (1-T)H |
U H + (1-U)O |
O |
T=C^(1-C), C=clip(O,10^-6,1); U=(HO)^(1-HO) |
The Foraxx branch decision uses actual prepared availability after OSC synthesis, before missing-role substitution. Thus OSC1 can count as Ha and OSC2 as SII.
Clipping and global normalization¶
Every raw mapped component is independently converted with this policy before normalization:
- non-finite value →
0; - value below
0→0; - value above
1→1; - otherwise unchanged.
The engine then finds one maximum M across every pixel and all three channels.
If M>0, every component is divided by M and clamped again. Consequently,
each nonblack result has at least one sample at 1. Intensities change relative
role contributions, but clipping occurs first: once a raw component reaches 1,
raising it further cannot increase the normalization maximum. When every
intensity is zero, output remains black because M=0 skips division.
Parameter interactions and starting points¶
| Combination | Start with | What it controls | Risk or diagnostic |
|---|---|---|---|
| Input autostretch + linear sources | On | Fixed per-source/per-channel display preparation | Turning it on for stretched data applies another nonlinear transform |
| Direct roles + OSC helpers | One source path first | Fixed synthesis and 50/50 averaging | Both OSC helpers make OIII averaging order-dependent; metadata exposures are not weighted by synthesis coefficients |
| Missing Ha/SII + intensity | 100% | Substituted formula positions | Label remains Ha/SII even though the same other role supplies both positions |
| Match sizes + mixed geometry | Prefer pre-registration | Pixel dimensions only | Area/bilinear resize cannot repair translation, rotation, distortion, crop origin, or PSF |
| Palette + intensity | Select formula, then tune one role | Matrix input values | Global normalization can hide overall scale changes; inspect relative channels and clipping |
| Intensity above 100% + clipping | Raise slowly | Pre-matrix role strength | Values clip to 1 before peak normalization, flattening highlights and reducing further response |
| Palette Grid + Single Preview | Either | Presentation and selection | Same 12 frames; switching modes does not recalculate or change Apply formula |
| Grid spin edits + full resolution | Coarse adjustments | Rebuild frequency | Each committed change remaps/normalizes 12 full RGB images on a worker; the latest change wins |
Inputs, outputs, and metadata¶
- Selectors accept valid mono/RGB stills of mixed pixel types and dimensions.
Invalid/unsupported images, missing synthesized requirements, disabled resize
with remaining mismatches, invalid hidden stretch options, and invalid
intensity factors are rejected. UI intensity values are finite
0..2. - Apply always creates one float RGB still. Naming prefers the selected OIII
view, then Ha, then SII. OSC names are not used as stems, so OSC-only output is
simply
<palette> Narrowband Palette. The final name is captured with the pixel parameters before the background worker starts. - The result's metadata is built from every selected source in role order Ha, OIII, SII, OSC1, OSC2. Its exposure is the sum of the exposures they state, recorded once. The object, instrument, telescope, observer, filter, sensor temperature, gain, binning, and exposure start are kept when every selected source states the same value and dropped otherwise, so a filter is kept only when every source shares it.
- The result keeps the header cards every selected source states identically, but no exposure, processing-state or identity card of a source; a card the sources state differently, or only some state, is dropped. It keeps the first selected source's plate solution with its world coordinate (WCS) cards only when the result keeps that source's size. When it does not - the first source was resized to the reference's size, or the reference was synthesized from a one-shot-colour source of another size - the result carries no solution, because that solution would label another pixel grid.
- The output is always marked nonlinear with operation provenance
narrowband-palette-composer, including when Input autostretch is off. - Apply records “Created
<palette>Narrowband Palette Composer image,” then asynchronously resets preparation, presentation, palette, and intensities. Source selections remain. - Palette Grid preparation warnings are visible only in the open process. Apply does not create a report or attach synthesis coefficients to output metadata.
Preview and execution behavior¶
Every source, preparation, or intensity change rebuilds the prepared Ha/OIII/SII channels and all 12 palettes. The grid is not built from reduced-resolution thumbnails: each float result is full resolution and is converted to an 8-bit QImage for the grid and single preview; Apply independently rebuilds the selected float result.
Grid generation runs on the thread pool, as one operation that prepares the channels and maps all formulas. The window shows a busy spinner and stays responsive; a change made during a build starts the next build, with the latest values, when that one lands, and only the latest grid is shown. Closing the window stops a build; there is no Cancel action. Apply is asynchronous but also has no progress object, so the engine's cooperative cancellation path is not exposed to the user.
Because this top-level window uses custom preview widgets, it has no target selector, display autostretch, histogram, Switch image, Preview area, Take snapshot, or mask blending. Selecting the first usable source chooses an internal attachment/lock reference in priority order OIII, Ha, SII, OSC1, OSC2; this is distinct from the Ha-first resize reference and OIII-first output name.
Performance¶
Preparation scales with pixels across all selected direct and OSC sources. Autostretch adds MAD statistics and a full transform per direct mono role or per OSC RGB channel. Synthesis, channel extraction, averaging, and resizing add more float mono buffers. Each palette performs a per-pixel matrix/Foraxx map, clipping, a serial global-maximum scan, and a parallel normalization pass.
The grid maps 12 palettes in parallel with oneTBB and keeps 12 full-resolution float RGB outputs at once before creating display QImages for both presentations. Every rebuild prepares the channels again and allocates the 12 outputs. Apply builds another selected output in a background thread. Peak memory therefore scales roughly with source pixels plus prepared mono channels, 12 float RGB palette images, and 8-bit preview frames. Close unused images, avoid unnecessary OSC/direct duplicates, and commit coarse intensity changes instead of stepping through many spin values. No approved dataset was timed.
Worked example¶
- Evidence mode: Source- and focused-test-derived; not executed on project-owned astronomical data.
- Prepared samples: Ha
H=0.20, OIIIO=0.40, SIIS=0.80; Input autostretch off; intensities all100%. - SHO matrix: Raw RGB is
(S,H,O)=(0.80,0.20,0.40). - Clipping checkpoint: All components are finite and within
[0,1], so none changes. - Normalization checkpoint: Global maximum is
M=0.80; division gives(1.00,0.25,0.50). - Interpretation: These exact values reproduce the focused SHO engine regression. They show why even sub-unit inputs are rescaled; they do not claim that this single-pixel ratio is suitable for a real palette.
Warnings and limitations¶
Every preview change builds 12 full-resolution palettes
The grid is built on a worker while the window stays responsive. Every change prepares the channels again and rebuilds mapping, clipping, normalization, float outputs, and display frames for every formula. There is no preview Cancel.
Peak normalization follows clipping
Components above 1 are clipped before the shared maximum is measured. This prevents a strong outlier from setting a maximum above 1, but it also makes intensity response saturate and can flatten highlights.
Resize is not registration
Match sizes changes dimensions only and can alter aspect ratio. It does not align stars, preserve WCS, model distortion, or match focus/PSF. Prepare registered geometry upstream.
Apply has no progress or Cancel
Apply runs in the background. Source selectors, preparation controls, preview selection, intensities, Apply, Reset, and Close are disabled after parameters and the output name are captured. They are restored when the worker finishes; there is still no progress percentage or Cancel action.
Troubleshooting¶
| Symptom | Likely cause | Fix |
|---|---|---|
| Window opens with empty selectors | This top-level process does not auto-select an active view | Choose sources explicitly; open supported mono/RGB stills if lists are empty |
| Apply is disabled | Synthesized inputs lack OIII or lack both Ha and SII | Select OIII plus Ha/SII, or use OSC1/OSC2 to synthesize the roles |
| Warning says RGB source uses red | RGB was selected in a direct narrowband role | Use a mono extracted master if red-only behavior is unintended |
| OSC contribution looks wrong | OSC1/OSC2 semantic role is wrong, mono was broadcast, or explicit/OSC data were averaged | Verify role and input color format; remove helpers while diagnosing |
| OIII seems biased toward OSC2 | Explicit OIII, OSC1, and OSC2 are averaged sequentially | Use one helper or precombine externally with deliberate weights |
| Build fails with Match sizes off | Prepared channel dimensions differ after synthesis | Register/crop to exact dimensions, or enable matching only if simple resize is acceptable |
| Image is stretched/distorted but stars still do not align | Match sizes resampled dimensions without registration | Register and crop sources upstream; do not use resize as alignment |
| Preview looks much brighter than source | Input autostretch and mandatory peak normalization both change levels | Turn off Input autostretch if sources are already stretched; remember peak normalization always remains |
| Raising intensity stops changing highlights | Formula components already clipped to 1 before global normalization | Lower the dominant role and rebalance other roles |
| Missing SII palette resembles Ha | Engine substitutes Ha into SII formula positions | Supply real SII or choose an HOO-style formula intentionally |
| Palette selection changes but grid does not rebuild | Selection only chooses an already-built formula | This is expected; intensity/source/preparation changes trigger rebuild |
| The grid takes a while to update after a spin/selector change | All 12 full-resolution palettes are rebuilt on a worker | Wait for the spinner to clear; make coarse changes and reduce source dimensions upstream for experiments |
| Selectors, previews, intensities, or dialog buttons are disabled | A non-cancellable Apply is running | Let Apply finish before making another change |
| Output name lacks OSC source | Naming uses only OIII, Ha, then SII selector names | Rename the output after Apply if OSC-only naming needs context |
Related workflow steps¶
- Narrowband Imaging — calibration, registration, gradients, normalization, palette choice, and later stretching.
- Image Registration — align source geometry before palette resampling/composition.
- Linear Match — prepare gross channel scale relationships before fixed formulas when appropriate.
- Channel Composition — direct user-chosen channel assignment without palette grid, OSC synthesis, or mandatory peak normalize.
- NB Color Mapper — per-layer HSV mapping, modifiers, and screen mixing instead of fixed matrices.
- NBRGB Combination — add continuum-corrected narrowband structure to broadband RGB.
- Image Viewer — inspect the created float RGB still with normal display tools after Apply.
- Glossary — SHO, HOO, palette, linear/nonlinear, autostretch, clipping, and normalization terminology.
References and provenance¶
- AfterNight source and focused tests.
docs/dev/NARROWBAND_PALETTE_COMPOSER_PROVENANCE.mdrecords the reviewed SetiAstro SASPro source snapshot and hashes, Franklin Marek attribution, and GPL-3.0 license. AfterNight implements the behavior with native C++ engine and Qt controls; Python runtime objects, PyQt widgets, icons, and the upstream SASPro UI assets are not included.- The same attribution and port boundary are exposed in About > Licenses.