flits 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. {flits-1.2.0/flits.egg-info → flits-1.2.2}/PKG-INFO +25 -29
  2. {flits-1.2.0 → flits-1.2.2}/README.md +23 -27
  3. {flits-1.2.0 → flits-1.2.2}/docs/analysis/dm-optimization.md +7 -0
  4. {flits-1.2.0 → flits-1.2.2}/docs/analysis/measurements.md +7 -0
  5. {flits-1.2.0 → flits-1.2.2}/docs/analysis/rm-synthesis.md +1 -1
  6. {flits-1.2.0 → flits-1.2.2}/docs/analysis/temporal-spectral.md +6 -0
  7. flits-1.2.2/docs/assets/guided-workflow/dm-sweep.png +0 -0
  8. flits-1.2.2/docs/assets/guided-workflow/export-panel.png +0 -0
  9. flits-1.2.2/docs/assets/guided-workflow/load-session.png +0 -0
  10. flits-1.2.2/docs/assets/guided-workflow/measurement-summary.png +0 -0
  11. flits-1.2.2/docs/assets/guided-workflow/prepared-viewer.png +0 -0
  12. flits-1.2.2/docs/assets/guided-workflow/session-panel.png +0 -0
  13. flits-1.2.2/docs/assets/guided-workflow/temporal-acf.png +0 -0
  14. flits-1.2.2/docs/assets/session-state.svg +42 -0
  15. flits-1.2.2/docs/developer/joss-submission.md +79 -0
  16. {flits-1.2.0 → flits-1.2.2}/docs/developer/testing.md +4 -3
  17. flits-1.2.2/docs/examples/gbt-reference-requirements.txt +50 -0
  18. flits-1.2.2/docs/examples/gbt-reference-session.json +4988 -0
  19. flits-1.2.2/docs/examples/gbt-reference-summary.json +27 -0
  20. {flits-1.2.0 → flits-1.2.2}/docs/getting-started.md +9 -0
  21. flits-1.2.2/docs/guided-workflow.md +156 -0
  22. {flits-1.2.0 → flits-1.2.2}/docs/index.md +23 -32
  23. {flits-1.2.0 → flits-1.2.2}/docs/installation.md +4 -4
  24. {flits-1.2.0 → flits-1.2.2}/docs/references.md +1 -1
  25. {flits-1.2.0 → flits-1.2.2}/docs/user-guide/exports-and-snapshots.md +11 -0
  26. {flits-1.2.0 → flits-1.2.2}/docs/user-guide/headless-replay.md +8 -5
  27. {flits-1.2.0 → flits-1.2.2}/docs/user-guide/session-workflow.md +12 -0
  28. {flits-1.2.0 → flits-1.2.2}/flits/__init__.py +1 -1
  29. {flits-1.2.0 → flits-1.2.2}/flits/cli.py +1 -1
  30. {flits-1.2.0 → flits-1.2.2/flits.egg-info}/PKG-INFO +25 -29
  31. {flits-1.2.0 → flits-1.2.2}/flits.egg-info/SOURCES.txt +9 -1
  32. {flits-1.2.0 → flits-1.2.2}/pyproject.toml +1 -1
  33. {flits-1.2.0 → flits-1.2.2}/requirements.txt +4 -4
  34. flits-1.2.0/docs/assets/guided-workflow/dm-sweep.png +0 -0
  35. flits-1.2.0/docs/assets/guided-workflow/measurement-summary.png +0 -0
  36. flits-1.2.0/docs/assets/guided-workflow/prepared-viewer.png +0 -0
  37. flits-1.2.0/docs/assets/guided-workflow/session-reproducibility.png +0 -0
  38. flits-1.2.0/docs/guided-workflow.md +0 -127
  39. {flits-1.2.0 → flits-1.2.2}/LICENSE +0 -0
  40. {flits-1.2.0 → flits-1.2.2}/MANIFEST.in +0 -0
  41. {flits-1.2.0 → flits-1.2.2}/docs/analysis/drift.md +0 -0
  42. {flits-1.2.0 → flits-1.2.2}/docs/analysis/localization.md +0 -0
  43. {flits-1.2.0 → flits-1.2.2}/docs/analysis/model-fitting.md +0 -0
  44. {flits-1.2.0 → flits-1.2.2}/docs/analysis/temporal-multiscale.md +0 -0
  45. {flits-1.2.0 → flits-1.2.2}/docs/assets/javascripts/mathjax.js +0 -0
  46. {flits-1.2.0 → flits-1.2.2}/docs/assets/rm-synthesis/rmtools-reference-example.png +0 -0
  47. {flits-1.2.0 → flits-1.2.2}/docs/developer/api-reference.md +0 -0
  48. {flits-1.2.0 → flits-1.2.2}/docs/developer/custom-readers.md +0 -0
  49. {flits-1.2.0 → flits-1.2.2}/docs/developer/publishing.md +0 -0
  50. {flits-1.2.0 → flits-1.2.2}/docs/examples/rmtools-LICENSE.txt +0 -0
  51. {flits-1.2.0 → flits-1.2.2}/docs/examples/rmtools-reference-input.json +0 -0
  52. {flits-1.2.0 → flits-1.2.2}/docs/examples/rmtools-reference-summary.json +0 -0
  53. {flits-1.2.0 → flits-1.2.2}/docs/user-guide/supported-formats.md +0 -0
  54. {flits-1.2.0 → flits-1.2.2}/flits/__main__.py +0 -0
  55. {flits-1.2.0 → flits-1.2.2}/flits/analysis/__init__.py +0 -0
  56. {flits-1.2.0 → flits-1.2.2}/flits/analysis/dm_optimization/__init__.py +0 -0
  57. {flits-1.2.0 → flits-1.2.2}/flits/analysis/dm_optimization/core.py +0 -0
  58. {flits-1.2.0 → flits-1.2.2}/flits/analysis/drift/__init__.py +0 -0
  59. {flits-1.2.0 → flits-1.2.2}/flits/analysis/drift/core.py +0 -0
  60. {flits-1.2.0 → flits-1.2.2}/flits/analysis/fitting/__init__.py +0 -0
  61. {flits-1.2.0 → flits-1.2.2}/flits/analysis/fitting/fitburst_adapter.py +0 -0
  62. {flits-1.2.0 → flits-1.2.2}/flits/analysis/localization.py +0 -0
  63. {flits-1.2.0 → flits-1.2.2}/flits/analysis/morphology/__init__.py +0 -0
  64. {flits-1.2.0 → flits-1.2.2}/flits/analysis/morphology/widths.py +0 -0
  65. {flits-1.2.0 → flits-1.2.2}/flits/analysis/polarization/__init__.py +0 -0
  66. {flits-1.2.0 → flits-1.2.2}/flits/analysis/polarization/rm_synthesis.py +0 -0
  67. {flits-1.2.0 → flits-1.2.2}/flits/analysis/polarization/workflow.py +0 -0
  68. {flits-1.2.0 → flits-1.2.2}/flits/analysis/spectral/__init__.py +0 -0
  69. {flits-1.2.0 → flits-1.2.2}/flits/analysis/spectral/core.py +0 -0
  70. {flits-1.2.0 → flits-1.2.2}/flits/analysis/temporal/__init__.py +0 -0
  71. {flits-1.2.0 → flits-1.2.2}/flits/analysis/temporal/core.py +0 -0
  72. {flits-1.2.0 → flits-1.2.2}/flits/analysis/temporal/multiscale.py +0 -0
  73. {flits-1.2.0 → flits-1.2.2}/flits/exports.py +0 -0
  74. {flits-1.2.0 → flits-1.2.2}/flits/io/__init__.py +0 -0
  75. {flits-1.2.0 → flits-1.2.2}/flits/io/chime.py +0 -0
  76. {flits-1.2.0 → flits-1.2.2}/flits/io/chime_hdf5_reader.py +0 -0
  77. {flits-1.2.0 → flits-1.2.2}/flits/io/errors.py +0 -0
  78. {flits-1.2.0 → flits-1.2.2}/flits/io/filterbank.py +0 -0
  79. {flits-1.2.0 → flits-1.2.2}/flits/io/psrfits.py +0 -0
  80. {flits-1.2.0 → flits-1.2.2}/flits/io/reader.py +0 -0
  81. {flits-1.2.0 → flits-1.2.2}/flits/io/sigproc.py +0 -0
  82. {flits-1.2.0 → flits-1.2.2}/flits/io/validation.py +0 -0
  83. {flits-1.2.0 → flits-1.2.2}/flits/io/your_reader.py +0 -0
  84. {flits-1.2.0 → flits-1.2.2}/flits/measurements.py +0 -0
  85. {flits-1.2.0 → flits-1.2.2}/flits/models.py +0 -0
  86. {flits-1.2.0 → flits-1.2.2}/flits/session.py +0 -0
  87. {flits-1.2.0 → flits-1.2.2}/flits/settings.py +0 -0
  88. {flits-1.2.0 → flits-1.2.2}/flits/signal.py +0 -0
  89. {flits-1.2.0 → flits-1.2.2}/flits/stokes.py +0 -0
  90. {flits-1.2.0 → flits-1.2.2}/flits/timing.py +0 -0
  91. {flits-1.2.0 → flits-1.2.2}/flits/web/__init__.py +0 -0
  92. {flits-1.2.0 → flits-1.2.2}/flits/web/app.py +0 -0
  93. {flits-1.2.0 → flits-1.2.2}/flits/web_static/app.js +0 -0
  94. {flits-1.2.0 → flits-1.2.2}/flits/web_static/index.html +0 -0
  95. {flits-1.2.0 → flits-1.2.2}/flits/web_static/styles.css +0 -0
  96. {flits-1.2.0 → flits-1.2.2}/flits/web_static/vendor/plotly-2.35.2.LICENSE.txt +0 -0
  97. {flits-1.2.0 → flits-1.2.2}/flits/web_static/vendor/plotly-2.35.2.min.js +0 -0
  98. {flits-1.2.0 → flits-1.2.2}/flits.egg-info/dependency_links.txt +0 -0
  99. {flits-1.2.0 → flits-1.2.2}/flits.egg-info/entry_points.txt +0 -0
  100. {flits-1.2.0 → flits-1.2.2}/flits.egg-info/requires.txt +0 -0
  101. {flits-1.2.0 → flits-1.2.2}/flits.egg-info/top_level.txt +0 -0
  102. {flits-1.2.0 → flits-1.2.2}/requirements-dev.txt +0 -0
  103. {flits-1.2.0 → flits-1.2.2}/requirements-full.txt +0 -0
  104. {flits-1.2.0 → flits-1.2.2}/setup.cfg +0 -0
  105. {flits-1.2.0 → flits-1.2.2}/tests/test_calibration.py +0 -0
  106. {flits-1.2.0 → flits-1.2.2}/tests/test_cli_replay.py +0 -0
  107. {flits-1.2.0 → flits-1.2.2}/tests/test_dedispersion.py +0 -0
  108. {flits-1.2.0 → flits-1.2.2}/tests/test_detection.py +0 -0
  109. {flits-1.2.0 → flits-1.2.2}/tests/test_dm_optimization.py +0 -0
  110. {flits-1.2.0 → flits-1.2.2}/tests/test_drift_analysis.py +0 -0
  111. {flits-1.2.0 → flits-1.2.2}/tests/test_exports.py +0 -0
  112. {flits-1.2.0 → flits-1.2.2}/tests/test_frequency_order.py +0 -0
  113. {flits-1.2.0 → flits-1.2.2}/tests/test_frontend_e2e.py +0 -0
  114. {flits-1.2.0 → flits-1.2.2}/tests/test_frontend_ui_safety.py +0 -0
  115. {flits-1.2.0 → flits-1.2.2}/tests/test_frontend_uncertainty_metadata.py +0 -0
  116. {flits-1.2.0 → flits-1.2.2}/tests/test_frontend_viewer_styles.py +0 -0
  117. {flits-1.2.0 → flits-1.2.2}/tests/test_io_plugin.py +0 -0
  118. {flits-1.2.0 → flits-1.2.2}/tests/test_io_readers.py +0 -0
  119. {flits-1.2.0 → flits-1.2.2}/tests/test_localization.py +0 -0
  120. {flits-1.2.0 → flits-1.2.2}/tests/test_measurements.py +0 -0
  121. {flits-1.2.0 → flits-1.2.2}/tests/test_model_fitting.py +0 -0
  122. {flits-1.2.0 → flits-1.2.2}/tests/test_polarization_real_data.py +0 -0
  123. {flits-1.2.0 → flits-1.2.2}/tests/test_polarization_reproducibility.py +0 -0
  124. {flits-1.2.0 → flits-1.2.2}/tests/test_polarization_workflow.py +0 -0
  125. {flits-1.2.0 → flits-1.2.2}/tests/test_preprocessing.py +0 -0
  126. {flits-1.2.0 → flits-1.2.2}/tests/test_preset_detection.py +0 -0
  127. {flits-1.2.0 → flits-1.2.2}/tests/test_rm_synthesis.py +0 -0
  128. {flits-1.2.0 → flits-1.2.2}/tests/test_session_io_smoke.py +0 -0
  129. {flits-1.2.0 → flits-1.2.2}/tests/test_session_polarization.py +0 -0
  130. {flits-1.2.0 → flits-1.2.2}/tests/test_session_smoke.py +0 -0
  131. {flits-1.2.0 → flits-1.2.2}/tests/test_session_snapshots.py +0 -0
  132. {flits-1.2.0 → flits-1.2.2}/tests/test_spectral_analysis.py +0 -0
  133. {flits-1.2.0 → flits-1.2.2}/tests/test_stokes_basis.py +0 -0
  134. {flits-1.2.0 → flits-1.2.2}/tests/test_stokes_reader.py +0 -0
  135. {flits-1.2.0 → flits-1.2.2}/tests/test_temporal_multiscale.py +0 -0
  136. {flits-1.2.0 → flits-1.2.2}/tests/test_timing.py +0 -0
  137. {flits-1.2.0 → flits-1.2.2}/tests/test_web_api.py +0 -0
  138. {flits-1.2.0 → flits-1.2.2}/tests/test_web_http.py +0 -0
  139. {flits-1.2.0 → flits-1.2.2}/tests/test_width_analysis.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flits
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Browser-based FRB burst analysis software (SIGPROC, PSRFITS, CHIME/FRB HDF5)
5
5
  Author: Dirk Kuiper
6
6
  License-Expression: GPL-3.0-only
7
7
  Project-URL: Homepage, https://github.com/DirkKuiper/flits
8
- Project-URL: Documentation, https://github.com/DirkKuiper/flits#readme
8
+ Project-URL: Documentation, https://dirkkuiper.github.io/flits/
9
9
  Project-URL: Issues, https://github.com/DirkKuiper/flits/issues
10
10
  Project-URL: Releases, https://github.com/DirkKuiper/flits/releases
11
11
  Project-URL: Repository, https://github.com/DirkKuiper/flits
@@ -64,36 +64,32 @@ including public catalog waterfalls and beamformed `BBData`
64
64
  `tiedbeam_power` files. The I/O layer is pluggable — third parties can
65
65
  register custom formats via `importlib` entry points without forking.
66
66
 
67
- Every interactive decision is recorded in a JSON session snapshot, and
68
- `flits replay` re-runs that snapshot headlessly to reproduce the exported
69
- measurements without a browser.
67
+ The selected analysis state is recorded in a JSON session snapshot. Given
68
+ the snapshot and original data, `flits replay` restores the selections and
69
+ recomputes supported measurements without a browser.
70
+
71
+ ![FLITS aligned viewer showing a GBT burst with its time profile, dynamic spectrum, frequency profile, and selected event, off-pulse, and spectral windows.](docs/assets/guided-workflow/prepared-viewer.png)
72
+
73
+ The [guided GBT workflow](https://dirkkuiper.github.io/flits/guided-workflow/)
74
+ walks through the selections and results shown in the interface.
70
75
 
71
76
  ## Why FLITS exists
72
77
 
73
- Turning a detected burst into a number you can defend takes several steps —
74
- tune the DM, mask interference, place the event and off-pulse windows, choose a
75
- spectral extent, then measure — and every one of them is a judgement call that
76
- moves the answer.
77
-
78
- The tools that do these steps well do them separately. Search pipelines stop at
79
- detection; format libraries read data without offering a workflow; and the
80
- strong single-purpose tools each expect their own input conventions. So a burst
81
- campaign accumulates per-instrument glue scripts, and the decisions that
82
- produced the numbers survive only in someone's notebook.
83
-
84
- That gets harder for repeating sources, where the same population is observed by
85
- many telescopes. FLITS was built for a repeater campaign spanning GBT at L and P
86
- band, Nançay, Westerbork, Onsala, Stockert and CHIME — three file formats,
87
- sampling times differing by more than an order of magnitude, and instruments
88
- with different bandwidths, polarization conventions and SEFDs.
89
-
90
- FLITS makes the session, rather than the script, the unit of analysis. One
91
- interface covers every supported instrument, the reader layer absorbs the format
92
- differences, telescope presets carry the instrument-specific calibration, and
93
- the snapshot makes the analysis inspectable and replayable afterwards.
94
- Measurements state their own uncertainty basis: FLITS separates a formal 1-sigma
95
- uncertainty from a statistical-only one, and will not mark a fluence publishable
96
- when the SEFD systematic it needs was never supplied.
78
+ Measuring a detected burst involves selecting an event window and noise
79
+ reference, masking interference, choosing a frequency range, and refining the
80
+ dispersion measure (DM). These choices affect the resulting measurements and
81
+ must be preserved to interpret and reproduce them.
82
+
83
+ FLITS was built for a repeater campaign spanning GBT at L and P band, Nançay,
84
+ Westerbork, Onsala, Stockert, and CHIME. A common reader interface and configurable
85
+ telescope presets support analysis across their formats and calibration
86
+ conventions. The session retains the selected state so collaborators can
87
+ reopen it and recompute supported measurements from the original data.
88
+
89
+ FLITS builds on specialist search, data-processing, and analysis packages. It
90
+ connects measurements through a shared session model with explicit calibration
91
+ and uncertainty metadata. Flux and fluence estimates without a supplied SEFD
92
+ uncertainty are flagged as having an incomplete uncertainty budget.
97
93
 
98
94
  FLITS is not a search pipeline — it starts from a burst you already have.
99
95
 
@@ -17,36 +17,32 @@ including public catalog waterfalls and beamformed `BBData`
17
17
  `tiedbeam_power` files. The I/O layer is pluggable — third parties can
18
18
  register custom formats via `importlib` entry points without forking.
19
19
 
20
- Every interactive decision is recorded in a JSON session snapshot, and
21
- `flits replay` re-runs that snapshot headlessly to reproduce the exported
22
- measurements without a browser.
20
+ The selected analysis state is recorded in a JSON session snapshot. Given
21
+ the snapshot and original data, `flits replay` restores the selections and
22
+ recomputes supported measurements without a browser.
23
+
24
+ ![FLITS aligned viewer showing a GBT burst with its time profile, dynamic spectrum, frequency profile, and selected event, off-pulse, and spectral windows.](docs/assets/guided-workflow/prepared-viewer.png)
25
+
26
+ The [guided GBT workflow](https://dirkkuiper.github.io/flits/guided-workflow/)
27
+ walks through the selections and results shown in the interface.
23
28
 
24
29
  ## Why FLITS exists
25
30
 
26
- Turning a detected burst into a number you can defend takes several steps —
27
- tune the DM, mask interference, place the event and off-pulse windows, choose a
28
- spectral extent, then measure — and every one of them is a judgement call that
29
- moves the answer.
30
-
31
- The tools that do these steps well do them separately. Search pipelines stop at
32
- detection; format libraries read data without offering a workflow; and the
33
- strong single-purpose tools each expect their own input conventions. So a burst
34
- campaign accumulates per-instrument glue scripts, and the decisions that
35
- produced the numbers survive only in someone's notebook.
36
-
37
- That gets harder for repeating sources, where the same population is observed by
38
- many telescopes. FLITS was built for a repeater campaign spanning GBT at L and P
39
- band, Nançay, Westerbork, Onsala, Stockert and CHIME — three file formats,
40
- sampling times differing by more than an order of magnitude, and instruments
41
- with different bandwidths, polarization conventions and SEFDs.
42
-
43
- FLITS makes the session, rather than the script, the unit of analysis. One
44
- interface covers every supported instrument, the reader layer absorbs the format
45
- differences, telescope presets carry the instrument-specific calibration, and
46
- the snapshot makes the analysis inspectable and replayable afterwards.
47
- Measurements state their own uncertainty basis: FLITS separates a formal 1-sigma
48
- uncertainty from a statistical-only one, and will not mark a fluence publishable
49
- when the SEFD systematic it needs was never supplied.
31
+ Measuring a detected burst involves selecting an event window and noise
32
+ reference, masking interference, choosing a frequency range, and refining the
33
+ dispersion measure (DM). These choices affect the resulting measurements and
34
+ must be preserved to interpret and reproduce them.
35
+
36
+ FLITS was built for a repeater campaign spanning GBT at L and P band, Nançay,
37
+ Westerbork, Onsala, Stockert, and CHIME. A common reader interface and configurable
38
+ telescope presets support analysis across their formats and calibration
39
+ conventions. The session retains the selected state so collaborators can
40
+ reopen it and recompute supported measurements from the original data.
41
+
42
+ FLITS builds on specialist search, data-processing, and analysis packages. It
43
+ connects measurements through a shared session model with explicit calibration
44
+ and uncertainty metadata. Flux and fluence estimates without a supplied SEFD
45
+ uncertainty are flagged as having an incomplete uncertainty budget.
50
46
 
51
47
  FLITS is not a search pipeline — it starts from a burst you already have.
52
48
 
@@ -105,6 +105,13 @@ That state is what the session snapshot records.
105
105
 
106
106
  ## Reading the result
107
107
 
108
+ ![DMphase score curve and residual arrival time plots from the guided GBT example.](../assets/guided-workflow/dm-sweep.png)
109
+
110
+ *The DMphase curve peaks near a residual DM of 5.5 on the sampled grid; the
111
+ weighted fit reports about 5.41. The lower plot compares sub-band arrival-time
112
+ residuals at the applied and fitted DMs. See the [GBT guided workflow](../guided-workflow.md)
113
+ for the inputs and interpretation limits of this example.*
114
+
108
115
  | Output | What to look at |
109
116
  | --- | --- |
110
117
  | Score curve | Should have a clear single maximum. Multiple comparable peaks mean the metric cannot distinguish them. |
@@ -2,6 +2,13 @@
2
2
 
3
3
  FLITS reports measurements from the current prepared session state.
4
4
 
5
+ ![Prepare tab showing selected windows, headline measurements, signal metrics, and uncertainty flags for the GBT tutorial burst.](../assets/guided-workflow/measurement-summary.png)
6
+
7
+ *The Prepare tab groups selection readiness, headline measurements, timing
8
+ details, and uncertainty flags. These values come from the [GBT guided
9
+ workflow](../guided-workflow.md); its absolute TOA fields are not part of the
10
+ validated reference calculation.*
11
+
5
12
  ## Core outputs
6
13
 
7
14
  The measurement workflow can report:
@@ -83,7 +83,7 @@ print(result.linear_fraction, result.circular_fraction)
83
83
  `result.rm_synthesis` holds the full RM-synthesis payload documented below.
84
84
  The result also records the basis and what established it, the exact event and
85
85
  off-pulse windows, the channels that survived, and the integrated Stokes I, Q, U
86
- and V spectra — which is what makes it reproducible from the snapshot alone.
86
+ and V spectra — which supports replay from the snapshot and original data.
87
87
 
88
88
  ### Reading the cube directly
89
89
 
@@ -53,6 +53,12 @@ is built to remove exactly this S/N dependence.
53
53
 
54
54
  ## ACF widths are not durations
55
55
 
56
+ ![Temporal and spectral autocorrelation functions for the guided GBT burst, with a dashed half-maximum reference line.](../assets/guided-workflow/temporal-acf.png)
57
+
58
+ *The dashed line marks normalized ACF = 0.5. Its intersections with the curves
59
+ give self-similarity widths in time and frequency for the [GBT example](../guided-workflow.md),
60
+ not the manually selected event duration.*
61
+
56
62
  An ACF width is a self-similarity scale. It is a good way to compare coherence
57
63
  structure between bursts or between time and frequency, but it is not
58
64
  interchangeable with the full burst duration, and the two can differ by a large
@@ -0,0 +1,42 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1040" height="270" viewBox="0 0 1040 270" role="img" aria-labelledby="title description">
2
+ <title id="title">How one FLITS session carries selections into analysis and export</title>
3
+ <desc id="description">A source file and applied DM lead to prepared crop, event, off-pulse, spectral, and mask selections. Those shared selections feed measurements and specialist analysis tabs. Results and selections can then be saved as a session snapshot or exported as products.</desc>
4
+ <defs>
5
+ <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
6
+ <path d="M1 1 L9 5 L1 9" fill="none" stroke="#5c358a" stroke-width="2"/>
7
+ </marker>
8
+ </defs>
9
+ <rect width="1040" height="270" rx="18" fill="#faf8fd"/>
10
+ <g font-family="Arial, Helvetica, sans-serif" fill="#252132">
11
+ <rect x="24" y="56" width="182" height="160" rx="14" fill="#fff" stroke="#d9cfe9" stroke-width="2"/>
12
+ <text x="44" y="94" font-size="22" font-weight="700">Load</text>
13
+ <text x="44" y="127" font-size="16">Source file</text>
14
+ <text x="44" y="152" font-size="16">Applied DM</text>
15
+ <text x="44" y="177" font-size="16">Preset / calibration</text>
16
+
17
+ <rect x="244" y="32" width="245" height="208" rx="14" fill="#f1e9fa" stroke="#9e7ac4" stroke-width="2"/>
18
+ <text x="264" y="70" font-size="22" font-weight="700">Prepare</text>
19
+ <text x="264" y="104" font-size="16">Crop + event window</text>
20
+ <text x="264" y="129" font-size="16">Off-pulse windows</text>
21
+ <text x="264" y="154" font-size="16">Spectral window</text>
22
+ <text x="264" y="179" font-size="16">Channel mask</text>
23
+ <text x="264" y="211" font-size="13" fill="#5c358a">Shared session state</text>
24
+
25
+ <rect x="528" y="56" width="232" height="160" rx="14" fill="#fff" stroke="#d9cfe9" stroke-width="2"/>
26
+ <text x="548" y="94" font-size="22" font-weight="700">Analyze</text>
27
+ <text x="548" y="127" font-size="16">Compute measurements</text>
28
+ <text x="548" y="152" font-size="16">DM / Temporal / Drift</text>
29
+ <text x="548" y="177" font-size="16">Fitting / Polarization</text>
30
+
31
+ <rect x="799" y="56" width="217" height="160" rx="14" fill="#fff" stroke="#d9cfe9" stroke-width="2"/>
32
+ <text x="819" y="94" font-size="22" font-weight="700">Keep results</text>
33
+ <text x="819" y="127" font-size="16">Save session snapshot</text>
34
+ <text x="819" y="152" font-size="16">Download JSON</text>
35
+ <text x="819" y="177" font-size="16">Build export bundle</text>
36
+ </g>
37
+ <g fill="none" stroke="#5c358a" stroke-width="2.5" marker-end="url(#arrow)">
38
+ <path d="M207 136 H236"/>
39
+ <path d="M490 136 H519"/>
40
+ <path d="M761 136 H790"/>
41
+ </g>
42
+ </svg>
@@ -0,0 +1,79 @@
1
+ # JOSS manuscript preparation
2
+
3
+ The manuscript is `paper/paper.md`, with references in `paper/paper.bib` and
4
+ software citation metadata in `CITATION.cff`. The JOSS Paper workflow validates
5
+ these files and builds an official JOSS draft PDF on relevant pull requests.
6
+
7
+ ## Validate the manuscript
8
+
9
+ From the repository root, in a Python environment:
10
+
11
+ ```bash
12
+ python -m pip install -r paper/requirements.txt
13
+ python paper/check.py
14
+ cffconvert --validate
15
+ ```
16
+
17
+ The checker verifies section coverage, word count, citation keys, ORCID
18
+ checksums, matching title and author identifiers, and unfinished author markers.
19
+ For the final reference audit, also run:
20
+
21
+ ```bash
22
+ python paper/check.py --check-dois
23
+ ```
24
+
25
+ This requires `curl` and network access. It checks DOI resolution and compares
26
+ bibliographic titles, volumes, issues, and pages with Crossref. A resolving DOI
27
+ can still point to the wrong article. Author lists, attribution, and references
28
+ without DOIs also need human review.
29
+
30
+ ## Build the official proof
31
+
32
+ Download the `paper` artifact from the JOSS Paper workflow, or build locally
33
+ with [Inara](https://github.com/openjournals/inara) and Docker:
34
+
35
+ ```bash
36
+ docker run --rm --volume "$PWD/paper:/data" \
37
+ --user "$(id -u):$(id -g)" --env JOURNAL=joss openjournals/inara
38
+ ```
39
+
40
+ Inspect `paper/paper.pdf`, including every reference page. The draft watermark
41
+ and placeholder DOI, publication details, and submission date are supplied by
42
+ the journal template and are replaced during the publication process.
43
+
44
+ ## Check the supporting materials
45
+
46
+ Run the [software checks](testing.md), the
47
+ [GBT reference workflow](../guided-workflow.md), and the
48
+ [RM-synthesis reference example](../analysis/rm-synthesis.md). The Reference
49
+ Workflows action checks the GBT measurements and portable replay on Linux,
50
+ using both the published package and the current checkout with pinned
51
+ dependencies. The example data remain a separate downloadable release asset;
52
+ the reference snapshot and expected results are in `docs/examples/`.
53
+
54
+ Before submission, the authors should review the final proof and agree on
55
+ authorship, affiliations, contribution credit, funding acknowledgements,
56
+ conflicts of interest, and the AI disclosure. Confirm that its statements about
57
+ human review and scientific decisions accurately describe the work. The
58
+ disclosure names the known assistants and explicitly records the absence of a
59
+ systematic historical model/version record; it does not invent missing details.
60
+
61
+ The submission form should identify any related science or methods papers,
62
+ including manuscripts in preparation or under review. Retain factual evidence
63
+ of the research uses described in the paper, such as a project report or
64
+ analysis record, in case the editors request it. Confirm credit for any
65
+ additional contributors before submission.
66
+
67
+ ## Submission and the final archive
68
+
69
+ Follow the current [JOSS submission requirements](https://joss.readthedocs.io/en/latest/submitting.html)
70
+ and [paper guidance](https://joss.readthedocs.io/en/latest/paper.html). The
71
+ manuscript and software must be available together in the public repository;
72
+ a submission branch is allowed. Use the branch containing the final reviewed
73
+ manuscript if it has not yet been merged.
74
+
75
+ After review, archive the exact final tagged software release with Zenodo or
76
+ figshare and provide its version and archival DOI. A final archive DOI is not
77
+ required for the initial submission. Preserve the example data, provenance,
78
+ and sharing terms in a suitable archive as well; a GitHub release asset alone
79
+ does not establish that a separate archival deposit exists.
@@ -59,11 +59,12 @@ They need Playwright and a browser binary:
59
59
  ```bash
60
60
  python -m pip install pytest-playwright
61
61
  python -m playwright install chromium
62
- python -m pytest tests/test_frontend_e2e.py -q
62
+ python -m pytest tests/test_frontend_e2e.py -q -m e2e
63
63
  ```
64
64
 
65
- Without Playwright installed they skip, so the ordinary `pytest` run is
66
- unaffected. CI runs them in a dedicated job. To skip them explicitly:
65
+ The default test configuration excludes browser and local-observatory-data
66
+ tests. Select `-m e2e` explicitly for the browser run above. Without Playwright
67
+ installed the browser module skips. CI runs them in a dedicated job. To skip them explicitly:
67
68
 
68
69
  ```bash
69
70
  python -m pytest -m "not e2e"
@@ -0,0 +1,50 @@
1
+ annotated-doc==0.0.5
2
+ annotated-types==0.8.0
3
+ anyio==4.15.1
4
+ astropy==8.0.1
5
+ astropy-iers-data==0.2026.9.21.0.56.25
6
+ click==8.5.0
7
+ cloudpickle==3.1.2
8
+ contourpy==1.4.0
9
+ cycler==0.12.1
10
+ fastapi==0.139.2
11
+ flits==1.2.0
12
+ fonttools==4.65.0
13
+ h11==0.16.0
14
+ h5py==3.16.0
15
+ idna==3.20
16
+ ImageIO==2.37.4
17
+ jess==0.3.1
18
+ joblib==1.6.0
19
+ kiwisolver==1.5.1
20
+ lazy-loader==0.5
21
+ llvmlite==0.49.0
22
+ markdown-it-py==4.2.0
23
+ matplotlib==3.11.1
24
+ mdurl==0.1.2
25
+ narwhals==2.26.0
26
+ networkx==3.6.1
27
+ numba==0.67.0
28
+ numpy==2.4.6
29
+ packaging==26.3
30
+ pandas==3.0.6
31
+ pillow==12.3.0
32
+ pydantic==2.13.4
33
+ pydantic_core==2.46.4
34
+ pyerfa==2.0.1.5
35
+ Pygments==2.21.0
36
+ pyparsing==3.3.3
37
+ python-dateutil==2.9.0.post0
38
+ PyYAML==6.0.3
39
+ rich==15.0.0
40
+ scikit-image==0.26.0
41
+ scikit-learn==1.9.1
42
+ scipy==1.17.1
43
+ six==1.17.0
44
+ starlette==1.6.0
45
+ threadpoolctl==3.7.0
46
+ tifffile==2026.9.20
47
+ typing-inspection==0.4.4
48
+ typing_extensions==4.16.0
49
+ uvicorn==0.51.0
50
+ your==0.6.7