v4.0.0
4.0.0 (2026-06-06)
It has been a long time since the last release, and this is a big one. There have been very significant performance and UI improvements, bugfixes, a migration to Angular 20 finally, and lots and lots of new features. Details below, but we hope you enjoy Phoenix v4.0.0
New Features
- Angular 20 upgrade — migrated from Angular 19 to Angular 20 using the new application builder, with full compatibility fixes for tests and tooling (#806, #906)
- Eta-phi energy map panel — new visualization panel showing energy distributions in eta/phi space (#876)
- Event dataset browser — new browser panel with physics-aware filtering for navigating event datasets (#868)
- Track kinematics panel — new panel displaying track kinematic variables with config-driven column selection, accessible from the More Information menu (#848)
- EventAutoloader — live event streaming from directories or remote endpoints (#857)
- Notification service — new
NotificationServicewith four severity levels (info, success, warning, error) (#895) - Cut state serialization — cut configuration is now serialized to JSON and restored via Load State (#882)
- Configurable UI components — UI menu items are now configurable via
UIMenuConfig(#814) - EffectsState enum — new
EffectsStateenum andsetHoverColor()for cleaner effects management (#889) - URL deep linking — full view state (camera, selections, cuts) shareable via URL (#804)
- PHYSLITE ROOT file loader — new loader for ATLAS Open Data PHYSLITE ROOT files (#836)
- Tiled screenshot rendering — screenshots can now be rendered at very large resolutions via tiling (#738)
- Screenshot mode consolidated — screenshot mode merged into the Make Picture menu
- Per-collection track extension to radius — tracks can now be extended to a configurable radius per collection (#757)
- Per-track line width —
TracksMeshnow supports per-track configurable line widths (#748) - More Information menu — new top-level menu item consolidating info panels and related tools (#916)
- URL event loading with auto-refresh — events can be loaded from URLs with automatic refresh
- NgZone animation loop isolation — animation loop moved outside Angular's NgZone for improved rendering performance (#877)
- Multi-object selection — overhauled selection system supporting simultaneous selection of multiple objects (#721)
- EDM4hep loader improvements:
- New LHCb geometry — updated to dd4hep format and 2025 detector geometry (#727)
- GLTF menu hierarchy — fixed support for collection hierarchy in the Phoenix menu when loading from GLTF files (#725)
- Jet origin — jet collections now carry origin information (#709)
Bug Fixes
- Fixed WebGL crash when rendering large numbers of CaloCells — now uses
InstancedMesh(#849) - Fixed event icon colour not updating when switching between light and dark themes (#905)
- Fixed collection cuts being lost on event switch (#872)
- Fixed JSON parse errors in IO options dialog now showing user-facing feedback (#879)
- Fixed duplicate three.js instance bundled alongside jsroot (#817)
- Fixed JiveXML crash on missing XML tags during vertex parsing (#780)
- Fixed labels appearing during animations before event objects are fully loaded (#741)
- Fixed
RendererManager.removeControls()renamed toremoveRenderer()(#853) - Fixed renderer swap operating on class state rather than local parameters (#811)
- Fixed
tween.jsupgraded to v25 with explicit group management to prevent animation conflicts (#813) - Fixed screenshot stretch/crop aspect ratio handling
- Fixed FileReader error handling in IO options dialog (#767)
- Fixed collection-info table display (#706)
- Fixed
substr()calls replaced withsubstring()to remove deprecated API usage (#810) - Fixed EDM4hep JSON loader imports and loading of event data files (#715)
- Fixed distinct icons for collections info panel vs other panels (#870)
- Fixed accessibility: added descriptive
alttext to images (#765) - Fixed multiple WebGL and GPU memory leaks (#782, #783, #785, #786, #787, #788, #846):
- Dispose intermediate geometries after GLTF merge
- Dispose renderers and revoke blob URLs on cleanup
- Clear selections and GPU resources on event switch
- Prevent selection outline accumulation across events
- Fixed event listener accumulation on repeated
init()calls (#778, #781) - Fixed cycle-events interval not cleared on component destroy (#771)
- Fixed Jest and Cypress TypeScript type isolation (#736)
- Replaced
cypress-plugin-snapshotswith@frsource/cypress-plugin-visual-regression-diff(#734) - Various CI/Docker build and deployment fixes (#737, #860, #871)
Contributors
Many, many thanks to all the contributors, new and old.
- @edward-moyse (Edward Moyse)
- @apausa (Pablo Apausa)
- @deveshbervar (Devesh Bervar)
- @remo-lab / @rx18-eng
- @GaneshPatil7517 (Ganesh Patil)
- @DhanashreePetare (Dhanashree Petare)
- @kjvbrt (Juraj Smiesko)
- @AlphaAbdo (Abdelkader Kantaoui)
- @goyalpalak18 (Palak Goyal)
- @Shivansh1205 (Shivansh Bhageria)
- @sponce (Sebastien Ponce)
- @XPE-7 (Richang)
- @Pratz2005 (Pratham Mehra)
- @eduardo-rodrigues (Eduardo Rodrigues)
- @WHOIM1205
- @lavjeetrai (Lavjeet Kumar Rai)
- @LALANI-DEVARSHI (Devarshi Lalani)
- @atharrva01 (Atharva Borode)
- @Sanchit2662
- @codeMaestro78
- @SHARANcanCODE
- @Rajveer173 (Rajveer Kharade)
- @Mayank77maruti (Mayank Mohapatra)
- @matiasmantinan (Matias Mantinan)
- @joy-vardhan-yalla (Joy Vardhan Yalla)
- @deepsharan (Deep Sharan)
- @Aman-Cool