Releases

Releases are named after Megalithic sites in the UK running through letters of the alphabet and roughly south to north, trying to stick with more memorable names. For a very minor release, we sometimes don't change the letter.

For fun I've added Google Maps and NLS references to each site and a little bit of info. You can look them up on the Megalithic Portal for more.

Production releases

1.0.0 2026-09-16 LITTLE DENNIS

The big one: PCOT has been migrated from PySide2 (Qt5) to PySide6 (Qt6), which is why this is the first major version bump. Most of the migration is invisible to users - it's the same UI - but there's a long tail of small Qt6-shaped fixes alongside it, and a couple of unrelated fixes that were sitting on dev at the same time.

Important: Python/Pyside version change

This major version change (PySide2 to PySide6) also requires a more recent Python version (3.11), so you will need to rebuild any existing Conda environment completely.

Follow these instructions while inside the PCOT directory:

  • git pull to pull the latest version (if you haven't done so already)
  • conda deactivate to deactivate any existing environment
  • conda env remove -n pcot to delete the old environment
  • conda create -n pcot python=3.11 poetry to create a new environment with Poetry and the right Python version
  • conda activate pcot to switch to the new environment
  • poetry install to install PCOT

Aside from pulling the update and deleting the old environment, this is very similar to the install process given in the README on the main site.

You may find you get a lot of errors when you run poetry install. What they look like very much depends on your system. This can be caused by Python picking up bits of your system's Python installation instead of your Anaconda "sandbox." To fix this, make sure conda doesn't look at your system install at all:

conda env config vars set PYTHONNOUSERSITE=1 -n pcot
conda deactivate
conda activate pcot

and try running poetry install again.

Changes

  • Migrated to PySide6/Qt6 throughout the application (was PySide2/Qt5).
  • Dark mode support (follows the OS theme).
  • Windows now uses the Fusion style rather than the OS-native one, for consistency.
  • Workaround for a GNOME/Wayland dialog decoration bug, and a config-editor checkbox crash, both found during the migration.
  • Canvas cursor hotspot and mouse-to-image mapping precision fixed at HiDPI scale factors.
  • Canvas mouse-wheel zoom now actually zooms to the cursor position rather than drifting towards the centre of the view, and middle-button panning now tracks the cursor properly instead of moving at half speed.
  • Fixes to circle ROI shift/ctrl-drag behaviour, the palette collapse/expand-all button, PDF export, and a DQDelegate crash - all regressions found during the Qt6 migration.
  • Multifile loader: left-justified bit-depth handling, and preset handling consolidated into a single implementation (fixes a bug where presets could be double-applied).
  • RGB and Multifile inputs now show the raw DN (digital number) range found in each loaded file, before scaling; the Multifile file list is now a resizable/reorderable table.
  • New pix() datumfunc to get a pixel value directly.
  • Fixed Value.out to correctly use config.data.sigfigs (was a mutable default argument bug).
  • Fixed a crash on undo/redo in documents containing macros.
  • crop node no longer leaves a redundant full-image rectangular ROI behind after cropping.
  • PDS4 directory scan now skips invalid files instead of aborting the whole scan.
  • Pan/zoom with keyboard in canvas
  • clamp() datumfunc now takes optional min/max arguments (was fixed to 0-1).
  • Canvas right-click menu can store and load a view's centre/zoom, to sync the view between canvases.
  • expr node: subtracting an ROI from an image (A - B) now "cuts a hole", producing an image whose ROI is everything outside the given ROI (e.g. to exclude a calibration target from an operation).
  • expr node: a$N now selects band index N directly when N is under 20, rather than always being interpreted as a wavelength; the old a$_N index syntax is kept for compatibility.
  • New .all property on images, giving an ROI covering the entire image.
  • Input methods (Multifile, RGB, ENVI, PDS4, PARC) no longer read files or pop up warning dialogs for inactive/unvisited tabs; missing source files/directories are now shown as a quiet in-tab marker and banner instead, cached data is preserved rather than silently discarded, and a "Retry missing inputs" button lets you re-check without reopening the document.
  • RGB/ENVI input file tree panel is now resizable via a splitter.
  • New global --ignore-version command line option to bypass PCOT file version checks.
  • New eval() datumfunc for evaluating an expression string against an image passed in as a.
  • reflectance node: fit table and plots now show each filter's CWL; dubious fits (negative or very small gradient, line far from the origin) are flagged in a new warnings table; the controls panel can be hidden/shown to give the plot more room; icons are now dark-mode-aware; per-patch plot annotations now show the sample count used for each point.
  • New (early/experimental) spectral parameter node: applies a named, pre-defined expression (e.g. a band ratio or index) from a spectral parameter group to an image, selected via group/parameter dropdowns. Ships with builtin AUPE LWAC, AUPE RWAC and PanCam parameter groups.
  • mean()/sum()/sd()/min()/max() on a band with no unmasked pixels (e.g. entirely excluded by ROI or bad-pixel DQ) now correctly return NODATA rather than leaking a numpy masked constant; these functions also now correctly propagate DQ bits from their input into their result.
  • Canvas RGB channel selectors now have a link button to lock the three channel combos together, so changing one changes all three.
  • Calibration target locator nodes pct and colorchecker have been improved, giving the user the option of using the actual patch shape (Shape mode) (which can be scaled) or a flood fill from the centre (the previous mode of operation) with a variable fill tolerance. The rectangular patches of the ColorChecker are now fully supported.
  • Calibration target locator nodes have new "White Fill" and "Red Fill" ROI draw modes; single-band reflectance plots now always show the fit title.
  • Macros that shadow a built-in node type's name are now ignored with a warning, rather than silently causing confusing behaviour.
  • reflectance node's filter-to-plot combo now shows each filter's wavelength, e.g. "C01L (640nm)".
  • spectrum node: new wavelength annotation modes (none/line/line+FWHM) draw a marker line and rotated wavelength label at each plotted point, with an optional pale band showing the filter's FWHM; the node's controls panel has been reorganised into tabs (Plot/Layout/Display) to reduce clutter.
  • Plot widgets (histogram, reflectance, spectrum) now have a right-click copy/save context menu; the redundant Save buttons have been removed from those tabs.
  • Canvas can now copy the current view to the clipboard, including ROIs, annotations and DQ overlays.
  • Multifile/camera filter position matching is now more forgiving: positions like "L01" and "L1" (with or without leading zeroes) are now treated as equivalent.
  • gencam: flat field data can now be marked leftjustified (bits shifted to fill the container) when building camera archives; simulated filter responses now support a super-Gaussian order parameter for more realistic filter shapes.
  • Input loading now falls back to the last good input data if a reload fails on save, and no longer resets the canvas RGB mapping on save/reload.
  • Canvas now has save/load view buttons next to the reset-view button, for quick access to the store/load view location feature previously only available from the right-click menu.
  • expr node's expression parser has been rewritten as a Pratt parser (was shunting-yard) - no change to expression syntax, but should be easier to extend.
  • Command-line subcommands (gencam, genrefl, lscams, lsrefls, config, etc.) now use Click instead of a homebrew argparse dispatcher; -h works as a short form of --help again.
  • getflats: bands with no flatfield data in the camera file are now substituted with a unity flatfield instead of raising an error, so images can still be processed with partial calibration data.
  • Canvas's missing-filter-data warning now lists the actual source files responsible, rather than just showing a bare warning label.
  • Batch parameter files: new Jinja2 loadlist() function to load a list of strings (comments, blank lines and surrounding whitespace stripped) from a file for use in templates; documentation of the Jinja2 templating system has been expanded, including a more complex example.
  • New (early/placeholder) colourcorrect node and colourcorrect() datum function, performing non-linearity correction, white balance and chromatic adaptation to convert a camera's native RGB to sRGB. Currently supports AUPE (daylight) and HRC (tungsten) cameras/illuminants, selected via separate camera+scene and illuminant parameters; more cameras and illuminants will follow.

Site

  • Google maps
  • NLS Map
  • A promontory fort (cliff castle), probably Iron Age, on a headland at St Anthony-in-Meneage on the Lizard - the earthworks cutting off the headland show up well on LIDAR, though on the ground it's mostly reduced to crop marks and a bank on the sloping southern side.

Beta releases

0.13.0-beta 2026-07-03 KENWYN FOUR BURROWS

Quite a lot in this one. We don't have HRC colour correction yet, but it's being worked on - it's a difficult problem (more accurately, getting it into PCOT without pulling in a library that's 20 times bigger than PCOT itself is difficult).

  • Favourites and macros - save nodes with particular settings and also collections of nodes which work like a single node. Both favourites and macros can be saved to archives which can be loaded on startup.
  • PCOT now also has Malvar-He-Cutler and Menon (DDFAPD) demosaicing algorithms.
  • Demosaicing now uses the "classical" Bayer pattern names (e.g. RGGB) and not the rather weird OpenCV names.
  • PCA node does both principal component analysis and decorrelation stretches, and does so on all bands (not just the RGB representation).
  • decorrstretch node deprecated - use PCA instead
  • Search box for palette!
  • Settings dialog should make life easier for changing settings quickly.
  • Unconnected expr inputs give a null datum rather than raising an exception.
  • reflectance node supports angle data (filter angle and \phi, \theta for target).
  • Raw loader crops overlong data and warns.
  • GUPPY, the Guide to Uncertainty in PCOT Python - how to write code that propagates uncertainty.
  • TabData is now TabGeneric, and if you use TaggedAggregate parameters in your node it will incorporate an editor for those parameters.

  • Refactoring of the func_wrapper and stats_wrapper mechanisms for processing uncertainty.

  • genimg datumfunc to quickly create images.
  • Fixes to the gen node to make the pattern mode actually visible in the table columns.
  • Better checking on "headless" setups (i.e. working on a server with no windowing system).
  • New config subcommand for viewing/editing configuration from the command line.
  • Better infinity/NaN handling when raising values to fractional powers (i.e. complex results).
  • A lot of work on the system underlying the settings dialog: the AggregateEditorDialog; this can also be used for node and macro params.
  • Comparison operators < and >, and ifelse and isnone datumfuncs.
  • Icon on canvas reset button.
  • Log window can clear all text.

Site

  • Google maps
  • NLS map
  • Barrow Cemetery in Cornwall, which straddles the old A30 just west of Chybucca. Three of the barrows lie to the south, and one to the north.

0.12.0-beta 2026-03-04 JOANEY HOW

I've had to go quite a long way north to get a name I liked; this one's in Somerset. There is a minor backward compatibility issue (camera data) but I'll still make it a minor bump; most things will still work.

  • Separation of camera and reflectance data
  • reflectance node now calculates known reflectance from filter reponses and patch reflectances
  • measured filter and reflectance spectra supported (rather than simulated)
  • transmission angles and patch incident stereo angles supported
  • canvas spectrum widget has a variable area
  • DATA type (e.g. from spectrum node) is now TABLE
  • Better indexing operator for bands in expr allows e.g. a[640,540] or a[R,G]
  • decorr stretch much improved: outputs eigenvals and SDs, permits variable stretch, variable clipping of outliers (i.e. contrast stretch)
  • archives hold metadata: type, author, date and a history if files are overwritten
  • gamma correction on canvas
  • multifile cache handling improvements
  • many bug fixes

Site

Alpha releases

0.11.0-alpha 2025-10-24 IGNIOC STONE

Fenton, where are you?

  • Some UI changes and fixes
  • Various internal fixes to do with object deepcopy
  • Basic debayering in the RGB input method (just bilinear, edge-aware and variable number of gradients)
  • Separate plots in reflectance node to help check the line-fitting visually
  • Graph updates to show progress as it runs
  • Ctrl-click on a node to force recalculation
  • gradient node is now colourmap

Site

  • Google maps
  • NLS map
  • An ancient stone cross, on which is written VITALI FILI TORRICI, in the village of St. Clement, near Truro.

0.10.0-alpha 2025-06-12 HALWYN ROUND

I still miss Fenton Saurus.

  • New system for storing camera data in PARC files
  • Subcommand system with special commands (lscams, gencam etc.)
  • Reflectance correction (given data from the camera and a calib target)
  • Various objects no longer require Documents for deserialisation
  • Colorchecker (i.e. Macbeth) calibration target locator
  • Some new nodes and functions (roicull, getflags, reflectance..)
  • Small changes to canvas DQ viewing
  • Staying at Python 3.9 for now

Site

0.9.0-alpha 2025-02-17 GODOLPHIN HILL

I'll miss Fenton Saurus, that was a great name.

  • New system for node parameters - the TaggedAggregate system. All nodes updated to this where it makes sense.
  • Batch runner (pcotbatch) first draft, which allows a graph to be run from the command line with inputs and nodes able to be modified with a text file, and outputs able to be captured and saved.
  • Complete rewrite of manual register node
  • "PARC" input and output file format - allows multispectral images with uncertainty to be stored (and other data types too)
  • Various bits of refactoring
  • Issue fixes
  • Yet more tests
  • Nodes are now created by left-click dragging from the palette
  • Nodes which have been renamed from their defaults have their name text shown in bold
  • Forced to downgrade minimum Python version to 3.9 temporarily

Site

0.8.0-alpha 2024-07-25 FENTON SAURUS

Yes, really: Fenton Saurus

  • More unit tests
  • colour connector "swatch" generator script
  • started work on dark/flat field generator
  • Datum archives - a file format (.PARC) for saving Datum objects, with an associated input method and exporters. Required because we have no other way of saving images with uncertainty and DQ.
  • DatumStore class wraps Archive objects so we can store Datum (this is used for the datum archives)
  • expr uses a DataWidget, as does TabData.
  • 1D vectors supported as a Datum.NUMBER type. Modifications made to datumfuncs and operators permit this. Notably, the semantics of mean, sd, sum, min and
  • square bracket parsing in expressions generates vector-creation and vector-index instructions max have changed to operate band-wise and generate a vector when performed on images.
  • Multiband extraction, e.g. a$[640,550,440].
  • .bands property generates a vector of wavelengths, so we can do a$b.bands, to get the bands in a that are also in b, in the same order as in b.
  • .u property
  • properties graph tests and QoL work for test building
  • precedence adjustments in expressions
  • getSelection in document can help get selected nodes in plugins
  • serialiseFields does a deepcopy - fixes undo bugs
  • fixes to roiexpr; it no longer keeps UI data in the node so undo works better
  • Cookbook in progress, but not part of the main repository to allow it to be updated more frequently
  • First release for Zenodo

Site

  • Google maps
  • NLS map
  • I can find very few references to this holy well in Lelant (near Hayle), no accurate maps - and that's a shame because it's an absolutely top-notch name. Honestly, I'm not making this one up. Fenton is probably cognate with Welsh ffynnon (and English fountain for that matter).

0.7.0-alpha 2024-05-03 EAST PENTIRE

  • Very many more unit tests
  • Bug fixes
  • Complete rewrite of spectrum system, using the SpectrumSet object
  • Multidot now does painted regions and floodfill
  • Joseph's PCT detector outputs image with ROIs
  • Dump removed and sink enhanced
  • TabData shows sources
  • Inputs decoupled from Sources - Sources now use composition, not inheritance
  • Comment box for nodes removed (it was never used)
  • Direct multifile loading
  • Direct PDS4 loading - required refactoring of entire PDS4 layer
  • Direct ENVI loading
  • Raw file loading from mono images supporting lots of formats
  • Loader presets for multifile
  • Operator overloading on Datum objects
  • The "datumfunc" system replacing hand-registration of functions
  • flip and rotate functions (datumfuncs)
  • String datum objects and strings usable in expr
  • Docs on library usage
  • Changes to nodes so that slow nodes can be disabled and very slow nodes start disabled. This functionality existed before, but was "ad-hoc"
  • Document.changed() is now Document.run() and forces disabled nodes to run
  • Most nodes now store data in their outputs rather than a "node.out" which is then written to an output
  • Changes to multidot - doc improvements, UX and bug fixes

Site

0.6.1-alpha 2023-10-04 DYNAS COVE (minor release)

  • Multifile input can accept BMP files
  • Better multifile documentation
  • Filter specifications are no longer hardwired and are loaded from CSVs
  • PANCAM and AUPE filters are default filter sets loaded in
  • Others can be specified in a config file (and can override PANCAM and AUPE)
  • Filter set no longer required by PDS4 input

Site

0.6.0-alpha 2023-09-11 DRIFT STONES

  • uncertainty and error bit propagation in expr and all nodes
  • Testing quality and propagation rules (see Principles)
  • Test graphs for nodes and other high-level functionality
  • Test nodes for those graphs
  • Tabular output on spectrum and histogram nodes
  • Gen node for test patterns
  • Refactoring of Datum
  • Utility nodes - e.g. roidq for generating an ROI from DQ bits
  • Output enhancements
    • Gradient node can export to PDF
    • Annotations (e.g. text labels) are now drawn on the painter at high res, and have been refactored hugely
    • Annotations use thickness zero by default (the Qt "cosmetic" thickness)
  • PCT detector node
  • ROI negation and refactoring of operators
  • roiexpr node for composing ROIs using expressions
  • Crude band depth node (needs work)
  • A lot of bug fixes and regression fixes

Site

0.5.0-alpha 2023-03-08 CARLENNO ROUND

  • Data quality and bit viewing on canvas
  • Palette and canvas interface with collapsable sections
  • Annotations (ROIs, legends) are now drawn onto the canvas rather than the image
  • Export to PDF, SVG and PNG with those hi-res annotations
  • gradient is much simpler, can overlay onto the image and can draw a legend

Site

0.4.0-alpha 2022-11-30 CAER BRAN

  • Annotation system entirely rewritten
  • PDF/PNG/SVG exporter
  • Gradient legend annotation
  • Doc updates

Site

0.3.0-alpha 2022-10-27 BEACON HUT

  • Open source!
  • PDS4 importer with proctools
  • Ad-hoc Spectrum viewer in canvas
  • Significant rewrite of expression execution code, permitting custom types to have operations defined on them
  • Direct input method for library use
  • Improved default RGB mapping in canvas
  • Testing
    • Basics testing
    • Testing of the operating principles (see Principles)
      • Source rules
      • ROI rules
  • rect node can now be edited numerically
  • circle node can add circular ROIs, which can be edited numerically.

Site

  • Google maps
  • NLS map
  • A chambered cairn, or it could possibly be a hut, between Helston and Falmouth.

0.2.0-alpha 2022-04-21 ANJARDEN SPRING

  • "pixel scanning" on canvases, shows spectrum of pixel when active
  • custom cursor, pixel under cursor highlighted at high zooms
  • text toggle button (currently unused)
  • fixes to example plugin
  • added macos.spec for pyinstaller
  • archive system shows progress when loading each archive element
  • Issue 1 fix (multiple tab closes when main window reinitialised)
  • dynamic type determination for expr output
  • can connect incompatible node outputs to inputs; indicated as red arrows
  • infinite recursion in ROI nodes fix
  • splash screen for Windows/Linux pyinstaller startup (not yet supported on MacOS pyinstaller)
  • custom Datum and connection brush types now easy
  • expr resizing regression fix
  • multiple input buttons after load/resize fix
  • status bar repaints on ui.msg, so it's updated in load and perform
  • context menu on editable text caused a crash (bug in Qt). Workaround.
  • comment boxes

Site

0.1.0-alpha 2022-03-02 ALSIA WELL

  • Initial alpha release outside Aberystwyth

Site