Commit Graph

10 Commits

Author SHA1 Message Date
ca4101dcb0 feat: improve optical report with embedded Plotly and 4x PNG export
- Embed Plotly.js inline for offline viewing (fixes CDN loading issues)
- Add 4x resolution PNG export for all charts via toImageButtonOptions
- Add SAT3_Trajectory_V7 study (TPE warm-start from V5, 86 trials, WS=277.37)
- Include V7 optimization report and configuration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 19:29:34 -05:00
5f5d55d107 fix(report): trajectory plots full-width instead of side-by-side
- Remove two-col grid wrapper from trajectory section
- Each plot now gets full container width
- Trajectory plot height 450→500, width 1100 for better readability
2026-01-30 00:06:10 +00:00
27d9dbee5b fix(psd): auto-scale x-axis to data range, improve plot layout
- X-axis now auto-ranges from data (was going to 10^21)
- Band annotations clamped to actual data extent
- Legend moved to upper-right (was overlapping data)
- Thicker lines (2.5px), larger axis labels
- dtick=1 for clean log-scale tick marks
2026-01-30 00:03:38 +00:00
12afd0c54f fix(psd): add angle labels to PSD band decomposition cards 2026-01-29 23:58:14 +00:00
a1000052cb fix(psd): correct normalization using Parseval band summation
- Band RMS now uses direct Parseval: sqrt(sum(|FFT|²) / N⁴ / hann_power)
- Previous approach had dimensional mismatch (cycles/apt vs cycles/mm)
- Results now match Zernike filtered RMS within ~10%:
  40° vs 20°: PSD=6.18nm vs Zernike=7.70nm
  60° vs 20°: PSD=15.83nm vs Zernike=17.69nm
  90° Abs: PSD=27.01nm vs Zernike=22.33nm
- PSD plot curve uses separate normalization (shape, not absolute)
- Refactored compute_surface_psd to return dict with freqs, psd, bands
2026-01-29 23:49:03 +00:00
eeacfbe41a feat(report): replace LSF/MSF with Tony Hull PSD analysis
- Remove compute_spatial_freq_metrics() and _spatial_freq_html()
- Add compute_surface_psd(): 2D FFT + Hann window + radial averaging
- Add compute_psd_band_rms(): gravity/support/HF band decomposition
- Add make_psd_plot(): interactive log-log PSD plot with band annotations
- Add _psd_summary_html(): band RMS cards with % breakdown
- New section in report: Power Spectral Density Analysis
- Zernike details now show only coefficient bar charts (cleaner)
- Methodology: Tony Hull JWST approach for WFE spatial frequency analysis
2026-01-29 22:15:42 +00:00
487ecf67dc feat(report): wider surface maps + spatial frequency band metrics
- CSS .plot-grid: minmax(650px) → minmax(1100px) for full-width surface maps
- Add compute_spatial_freq_metrics(): LSF/MSF band RMS, per-radial-order breakdown
- Add styled metrics cards in Zernike Coefficient Details (section 6)
  showing LSF (J4-J15), MSF (J16-J50), ratio, and per-order RMS n=2..9
2026-01-29 20:46:58 +00:00
faab234d05 fix: update Plotly.js CDN to 3.3.1 (match Python lib 6.5.2 bdata format), show 50 modes 2026-01-29 20:32:55 +00:00
c6427f3c6e fix: replace deprecated titlefont with title.font for Plotly compat 2026-01-29 20:20:01 +00:00
34b52f9543 Add comprehensive optical performance report generator
New tool: tools/generate_optical_report.py
- CDR-ready single HTML report from OP2 results
- Executive summary with pass/fail vs targets
- Per-angle WFE analysis with 3D surface plots
- Zernike trajectory analysis (mode-specific RMS)
- Axial vs lateral sensitivity matrix
- Manufacturing correction metrics
- Collapsible Zernike coefficient bar charts
- Optional study DB integration for design params
- Annular aperture support (default M1 inner R=135.75mm)
- Dark theme, interactive Plotly charts, print-friendly
2026-01-29 18:28:10 +00:00