euler314 commited on
Commit
fdb9863
·
verified ·
1 Parent(s): 2c8fbd7

Document matched daily wind/intensity benchmark and honest radius coverage

Browse files
.gitattributes CHANGED
@@ -185,3 +185,11 @@ evaluation/release_data/mangkhut_video.npz filter=lfs diff=lfs merge=lfs -text
185
  docs/trackformer_1_2_meranti.mp4 filter=lfs diff=lfs merge=lfs -text
186
  evaluation/trackformer_1_2_meranti_video_poster.png filter=lfs diff=lfs merge=lfs -text
187
  evaluation/release_data/meranti_video.npz filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
185
  docs/trackformer_1_2_meranti.mp4 filter=lfs diff=lfs merge=lfs -text
186
  evaluation/trackformer_1_2_meranti_video_poster.png filter=lfs diff=lfs merge=lfs -text
187
  evaluation/release_data/meranti_video.npz filter=lfs diff=lfs merge=lfs -text
188
+ evaluation/intensity/intensity_error_bars.png filter=lfs diff=lfs merge=lfs -text
189
+ evaluation/intensity/intensity_leads_and_trends.png filter=lfs diff=lfs merge=lfs -text
190
+ evaluation/intensity/native_radius_error_bars.png filter=lfs diff=lfs merge=lfs -text
191
+ evaluation/storm_structure/four_storm_wind_candidate.png filter=lfs diff=lfs merge=lfs -text
192
+ evaluation/storm_structure/fung_wong_wind_radius.png filter=lfs diff=lfs merge=lfs -text
193
+ evaluation/storm_structure/mangkhut_wind_radius.png filter=lfs diff=lfs merge=lfs -text
194
+ evaluation/storm_structure/meranti_wind_radius.png filter=lfs diff=lfs merge=lfs -text
195
+ evaluation/storm_structure/soudelor_wind_radius.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -71,7 +71,7 @@ One typhoon on one UTC day is one case. Each issue forecasts **+6 to +120 h**. W
71
 
72
  Mean track error is **41.0% lower** for 1.2 on this cohort. Direction, shape and geographic alignment remain separate measures, not a combined score. A shape score near one does not guarantee overlapping routes at matching times. The 1.2 forecasts are means of **50 distinct causal input perturbations**, not 50 independently trained networks. Forecast pipelines differ, so this is not an architecture ablation.
73
 
74
- **Pressure coverage:** 1.2 central-pressure MAE is **12.62 hPa over 40 storms with valid labels**; basin-area-weighted MSLP MAE is **2.72 hPa over 270 storms**. There is no matched 1.1 pressure output in this run. Basin-wide error does not establish core-field accuracy.
75
 
76
  **Limits:** the frozen cohort includes 40 recent storms and 230 historical storms from 1980–1999. It excludes this checkpoint's fitting/validation years, but has not been certified untouched across prior experiments. Historical hindcasts use retrospective analyses and a model trained on later years. Complete five-day labels are required, excluding short remaining lifetimes. No operational or no-overfitting claim follows.
77
 
@@ -79,6 +79,89 @@ Mean track error is **41.0% lower** for 1.2 on this cohort. Direction, shape and
79
 
80
  **Reading route similarity:** direction error compares headings of common moving six-hour steps. Centred shape similarity removes translation and scale but preserves orientation; it does not establish geographic overlap. Path similarity also responds to displacement. Predicted and observed routes should align at the same valid times, so these metrics must be read alongside position error and unshifted route overlays.
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  ## Fung-wong pressure forecast — MP4
83
 
84
  <video controls playsinline preload="metadata" width="100%" poster="https://huggingface.co/euler314/typhoon-predict/resolve/main/evaluation/trackformer_1_2_fung_wong_video_poster.png" src="https://huggingface.co/euler314/typhoon-predict/resolve/main/docs/trackformer_1_2_fung_wong.mp4"></video>
 
71
 
72
  Mean track error is **41.0% lower** for 1.2 on this cohort. Direction, shape and geographic alignment remain separate measures, not a combined score. A shape score near one does not guarantee overlapping routes at matching times. The 1.2 forecasts are means of **50 distinct causal input perturbations**, not 50 independently trained networks. Forecast pipelines differ, so this is not an architecture ablation.
73
 
74
+ **Pressure coverage in the original track run:** 1.2 central-pressure MAE is **12.62 hPa over 40 storms with valid labels**; basin-area-weighted MSLP MAE is **2.72 hPa over 270 storms**. That original run did not save matched 1.1 intensity outputs. The new matched comparison below uses its own common masks; its scores are not interchangeable with this pressure-only score. Basin-wide error does not establish core-field accuracy.
75
 
76
  **Limits:** the frozen cohort includes 40 recent storms and 230 historical storms from 1980–1999. It excludes this checkpoint's fitting/validation years, but has not been certified untouched across prior experiments. Historical hindcasts use retrospective analyses and a model trained on later years. Complete five-day labels are required, excluding short remaining lifetimes. No operational or no-overfitting claim follows.
77
 
 
79
 
80
  **Reading route similarity:** direction error compares headings of common moving six-hour steps. Centred shape similarity removes translation and scale but preserves orientation; it does not establish geographic overlap. Path similarity also responds to displacement. Predicted and observed routes should align at the same valid times, so these metrics must be read alongside position error and unshifted route overlays.
81
 
82
+ ## Matched wind, intensity and radius benchmark
83
+
84
+ **The same method as the track benchmark:** one forecast per typhoon-day; average valid +6, +12, …, +120 h errors within that daily issue; average daily scores within each typhoon; then average typhoons with **equal storm weight**. Per-lead charts use the same daily → storm hierarchy. Missing measurements stay missing, not zero error; curve comparisons keep the same valid times and do not shift or stretch either timeline.
85
+
86
+ The full frozen **270-storm / 1,473-day** plan was checked. The original 1.1 intensity pipeline can run on **134 daily starts from 40 storms** with the required valid current wind and pressure. The other **1,339 starts are explicitly unavailable** to this matched native comparison, not silently filled from later observations or dropped for poor predictions. This is not a 270-storm intensity result. All 134 real **50-member 1.2** replays completed on the Mac GPU; their means reproduce the original saved pressure forecasts exactly (maximum difference **0.0 hPa**), and every member and source hash passed verification. 1.1 retains its frozen primary, structure and gated temporal experts and original calibration; it is not falsely called a 50-member model.
87
+
88
+ | Equal-storm metric · lower is better | 1.1 | 1.2 · mean of 50 | Valid coverage |
89
+ | --- | ---: | ---: | --- |
90
+ | Wind MAE against USA 1-minute reference | 16.98 kt | 25.03 kt | 40 storms / 134 days |
91
+ | USA central-pressure MAE | 12.84 hPa | 12.55 hPa | 40 storms / 134 days |
92
+ | JMA central-pressure MAE | 13.53 hPa | 12.84 hPa | 40 storms / 134 days |
93
+ | Wind time-curve shape error | 0.271 | 0.385 | 40 storms / 131 days |
94
+ | USA pressure time-curve shape error | 0.276 | 0.336 | 40 storms / 131 days |
95
+ | JMA pressure time-curve shape error | 0.293 | 0.288 | 40 storms / 134 days |
96
+ | Wind six-hour trend-direction mismatch | 56.1% | 60.8% | 40 storms / 134 days |
97
+
98
+ ![Wind and intensity magnitude errors and time-curve shape errors, with whole-storm uncertainty bars](evaluation/intensity/intensity_error_bars.png)
99
+
100
+ ![Intensity MAE by forecast lead and six-hour trend-direction mismatch](evaluation/intensity/intensity_leads_and_trends.png)
101
+
102
+ **Tradeoffs, not an overall win:** 1.2 has slightly lower mean pressure error, but its auxiliary wind is worse on magnitude and curve alignment. USA pressure at +120 h is also worse (**15.55 vs 13.52 hPa**), whereas JMA pressure at +120 h is better (**12.44 vs 15.95 hPa**). Agencies and forecast leads matter. The wind score is a diagnostic of 1.2's auxiliary scalar against a native one-minute reference, **not validation of a resolved or calibrated surface-wind product**; JMA's ten-minute wind is neither converted nor mixed into that score.
103
+
104
+ The time-curve shape error is **(1 − centred cosine similarity) / 2**, lower is better, at exact common UTC leads. It removes mean and amplitude, so it must be read with MAE; it does not prove intensity levels align. It requires at least six valid points and non-flat curves in both forecasts and truth. Trend-direction mismatch compares increasing / flat / decreasing changes over **adjacent valid six-hour steps**; no gap is bridged. The [full report](evaluation/intensity/intensity_final.json) also includes six-hour tendency MAE, all per-storm scores, coverage and paired differences. Error bars are 2,000 fixed-seed **whole-storm** bootstrap replicates, not independent resampling of overlapping days. These are development diagnostics, not a newly certified untouched holdout or an architecture ablation; the curve protocol is a versioned post-hoc descriptive addition, not a preregistered hypothesis test.
105
+
106
+ ### Radius errors — matched definitions, not a fabricated 1.2 head
107
+
108
+ Native 1.1 RMW and **NE / SE / SW / NW maximum-extent R34/R50/R64** predictions are compared only with the same native USA definitions in IBTrACS. Observation radii in nautical miles are multiplied by **1.852** to obtain kilometres; no diameters, eye size, outer-isobar radius or JMA R30 are substituted. Valid reported zero wind-radius extents remain zero; missing reports and non-positive RMW remain unavailable. Radius lead/component errors are averaged within the daily issue, then daily → storm → equal storm, like track.
109
+
110
+ | Native radius MAE | 1.1 | Native 1.2 | Valid coverage |
111
+ | --- | ---: | --- | --- |
112
+ | RMW | 22.20 km | N/A — no radius head | 40 storms / 134 days |
113
+ | R34 quadrants | 60.93 km | N/A — no radius head | 35 storms / 124 days |
114
+ | R50 quadrants | 36.39 km | N/A — no radius head | 16 storms / 59 days |
115
+ | R64 quadrants | 26.78 km | N/A — no radius head | 12 storms / 45 days |
116
+
117
+ ![Native radius errors and time-curve shape errors: 1.1 scored against matching USA reports, 1.2 explicitly unavailable](evaluation/intensity/native_radius_error_bars.png)
118
+
119
+ **N/A is not zero error or a model win.** The separate pressure-scaled radius candidate below is not inserted into these native model bars: its surface-wind height and averaging period are not validated, so its strict definition guard rejects an official-equivalent skill claim. USA RMW is not universally best-tracked. [Native field definitions](https://www.ncei.noaa.gov/sites/default/files/2025-09/IBTrACS_v04r01_column_documentation.pdf) · [Protocol and reproduction](docs/intensity_benchmark.md) · [Verification receipt](evaluation/intensity/verification.json).
120
+
121
+ ### Four-storm wind, pressure and radius timelines
122
+
123
+ The plots retain native **USA one-minute** and **JMA ten-minute** winds as separate curves, plus observed pressure, RMW and each radius quadrant. A separate experimental algorithm uses the exact issue-time structure and each of **50 actual model pressure members**, then averages diagnosed member values—not a diagnosis of the mean map. Dashed RMW is **issue-time persistence**, not a forecast of changing eyewall size. Reference gaps remain gaps; the radius candidate is visibly labeled experimental.
124
+
125
+ ![Four selected storms: native wind references, auxiliary neural wind and separate pressure-scaled experimental wind](evaluation/storm_structure/four_storm_wind_candidate.png)
126
+
127
+ <details>
128
+ <summary>Fung-wong · issue 7 November 2025, 00 UTC</summary>
129
+
130
+ ![Fung-wong exact-time wind, pressure and quadrant-radius comparisons](evaluation/storm_structure/fung_wong_wind_radius.png)
131
+
132
+ [Definitions, member proof and source hashes](evaluation/storm_structure/fung_wong_structure.json). This is a separately saved fresh replay; its pressure output is **not substituted into the older Fung-wong MP4**.
133
+
134
+ </details>
135
+
136
+ <details>
137
+ <summary>Soudelor · issue 5 August 2015, 00 UTC</summary>
138
+
139
+ ![Soudelor wind, pressure and radius comparisons](evaluation/storm_structure/soudelor_wind_radius.png)
140
+
141
+ [Definitions and member proof](evaluation/storm_structure/soudelor_structure.json).
142
+
143
+ </details>
144
+
145
+ <details>
146
+ <summary>Mangkhut · issue 11 September 2018, 00 UTC</summary>
147
+
148
+ ![Mangkhut wind, pressure and radius comparisons](evaluation/storm_structure/mangkhut_wind_radius.png)
149
+
150
+ [Definitions and member proof](evaluation/storm_structure/mangkhut_structure.json).
151
+
152
+ </details>
153
+
154
+ <details>
155
+ <summary>Meranti · issue 10 September 2016, 00 UTC</summary>
156
+
157
+ ![Meranti wind, pressure and radius comparisons](evaluation/storm_structure/meranti_wind_radius.png)
158
+
159
+ [Definitions and member proof](evaluation/storm_structure/meranti_structure.json).
160
+
161
+ </details>
162
+
163
+ [Experimental algorithm and limitations](release_tools/STORM_STRUCTURE_DIAGNOSTICS.md) · [Audit index](evaluation/storm_structure/index.json) · [History wind/intensity/radius graphs](https://trackformer-weatherlab.rudin-euler-8253.chatgpt.site/history). These selected examples are illustrations, not typical-skill or untouched-test claims. The History tab shows available observations for every browsable storm; forecasts and radius estimates are never invented to fill missing inputs.
164
+
165
  ## Fung-wong pressure forecast — MP4
166
 
167
  <video controls playsinline preload="metadata" width="100%" poster="https://huggingface.co/euler314/typhoon-predict/resolve/main/evaluation/trackformer_1_2_fung_wong_video_poster.png" src="https://huggingface.co/euler314/typhoon-predict/resolve/main/docs/trackformer_1_2_fung_wong.mp4"></video>
docs/intensity_benchmark.md ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Matched daily intensity benchmark
2
+
3
+ Completed GPU inference and verified aggregation on 1 October 2026 (Taipei).
4
+ The released weights, original forecasts and original calibration are unchanged.
5
+
6
+ ## Same hierarchy as track
7
+
8
+ The plan is the frozen 270-storm / 1,473-daily-issue track cohort. One storm on
9
+ one UTC day is one case, at its earliest eligible issue. Forecast errors at
10
+ valid +6, +12, …, +120 h leads are averaged per daily issue, then across its
11
+ storm's daily issues, then across storms with equal weights. Long-lived storms
12
+ do not gain extra final weight. Per-lead errors use the same daily → storm
13
+ averaging. Both models use exactly the same native observation mask for each
14
+ wind/pressure comparison. Wind and each agency's pressure are separate metrics;
15
+ there is no arbitrary weighted combined rank.
16
+
17
+ Native 1.1 intensity needs valid issue-time current wind and pressure. Its
18
+ frozen input archive provides them for 134 daily issues / 40 storms, not the
19
+ other 1,339 daily starts. These missing starts are reported, never repaired
20
+ with future observations or relabeled as zero error. Thus the result shares
21
+ the **method and planned cohort** of track, but does not claim the same valid
22
+ intensity coverage. Missing future observations also remain unavailable.
23
+
24
+ ## Model identity and inference
25
+
26
+ 1.2 is the released checkpoint SHA-256
27
+ `f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0`.
28
+ Every original pressure forecast file is rehashed. To recover previously
29
+ unsaved auxiliary wind, the MPS runner replays the identical 50 input members
30
+ with seeds `2043 + source_row * 100 + member_id`, nine exact causal analyses,
31
+ original detail masks and original issue inputs. Every replay has 50 distinct
32
+ input hashes, finite 50 × 20 wind and pressure outputs and verified means.
33
+ The maximum pressure difference from original forecasts is **0.0 hPa**.
34
+ No weights, preprocessing or coefficients are fitted here.
35
+
36
+ 1.1 uses the original public intensity pipeline: frozen primary and structure
37
+ experts, validation-fit anchor/calibration coefficients, and the frozen
38
+ same-storm −12/−24 h temporal branch where its current-wind gate permits.
39
+ Expert count/activation is preserved in each case receipt; this is not a
40
+ 50-member 1.1 ensemble. Issue states and causal weather only enter inference;
41
+ future labels are loaded separately for scoring. The two systems' input
42
+ pipelines differ: this is not an architecture-controlled ablation.
43
+
44
+ ## Native observation definitions
45
+
46
+ - Central pressure: exact storm SID and valid UTC; native `USA_PRES` and
47
+ `TOKYO_PRES` are scored separately, in hPa, on a common mask for each agency.
48
+ - Wind: `USA_WIND` nominal one-minute reference. The 1.2 scalar is an auxiliary
49
+ output, not a certified ten-metre sustained surface-wind product. JMA
50
+ `TOKYO_WIND` is ten-minute and is never converted or pooled in this score.
51
+ - Native 1.1 radius: `USA_RMW` and `USA_R34/R50/R64_NE/SE/SW/NW`, nautical miles
52
+ multiplied by 1.852 to kilometres. They are radii, not diameters. RMW must be
53
+ positive. A reported zero wind-radius extent remains valid; blanks remain
54
+ unavailable. JMA R30 longest/shortest, eye size and ROCI are not substitutes.
55
+ - Native 1.2 radius: **not available**, because it has no radius head. The
56
+ experimental pressure-scaled candidate is separate; its strict definition
57
+ guard prevents scoring it as calibrated official surface-wind radii.
58
+
59
+ Radius errors are averaged within the daily issue over valid leads for each
60
+ component, then equally across available quadrant components, then across
61
+ days within storm and equally across storms. Coverage differs by threshold;
62
+ all counts are printed. Observational RMW has reporting/provisional limitations.
63
+
64
+ ## Curve comparison, analogous to route direction and shape
65
+
66
+ Magnitude MAE is retained alongside time-curve diagnostics, without optimizing
67
+ time lag, warping time, shifting observations or adjusting forecasts to truth.
68
+ These are separate, versioned post-hoc descriptive metrics, not a preregistered
69
+ untouched-holdout hypothesis test.
70
+
71
+ 1. Curve-shape error = `(1 - centred cosine similarity) / 2`, lower is better.
72
+ Subtract each curve's common-lead mean, normalize its scalar magnitude and
73
+ keep original time order and sign. At least six common valid points and
74
+ non-flat truth and both forecasts are required. A flat/unavailable curve
75
+ does not receive a perfect score. This measure ignores level and amplitude,
76
+ so it does not replace MAE or demonstrate matching absolute intensity.
77
+ 2. Trend-direction mismatch = fraction of adjacent six-hour changes whose
78
+ signs differ (increasing / flat / decreasing). Deadband is exactly zero;
79
+ flat-versus-changing is a mismatch. Missing leads break adjacency, never
80
+ form twelve-hour changes disguised as six-hour steps.
81
+ 3. Six-hour tendency MAE = mean absolute error of those adjacent changes in
82
+ kt/6 h, hPa/6 h or km/6 h. It remains separate from shape error.
83
+
84
+ All daily curve scores use the same valid model/reference masks before the
85
+ storm aggregation. Uncertainty uses 2,000 whole-storm bootstrap replicates
86
+ with seed 4712, not overlapping issue resampling. Paired 1.2-minus-1.1
87
+ differences and their intervals are included in the full JSON report.
88
+
89
+ ## Results and honest boundaries
90
+
91
+ USA pressure MAE: 1.1 **12.84** vs 1.2 **12.55 hPa**. JMA pressure MAE:
92
+ **13.53** vs **12.84 hPa**. Auxiliary wind diagnostic MAE: **16.98** vs
93
+ **25.03 kt**. Wind curve-shape error: **0.271** vs **0.385**. Thus wind is
94
+ worse for 1.2 despite the slight mean-pressure improvement. At +120 h USA
95
+ pressure is worse for 1.2, whereas JMA pressure is better; no all-lead/agency
96
+ win is claimed. Radius 1.1 errors are reported, but native 1.2 is N/A.
97
+
98
+ The old 1980–1999 cohort overlaps original 1.1 fitting, and 1.2 hindcasts are
99
+ retrospective predictions by a model trained on later years. Some recent
100
+ storms have been inspected in development. Complete five-day route labels
101
+ were required by the inherited cohort. This is not untouched generalization,
102
+ an operational comparison or proof of no overfitting. Scientific safety and
103
+ wind/radius definition limitations apply to all illustrated examples.
104
+
105
+ ## Files and reproduction
106
+
107
+ [Verified aggregate and per-storm metrics](../evaluation/intensity/intensity_final.json)
108
+ · [Chart verification receipt](../evaluation/intensity/verification.json)
109
+ · [GPU runner](../release_tools/benchmark_intensity_v12_v11.py)
110
+ · [Independent verifier and plotter](../release_tools/plot_intensity_benchmark.py).
111
+
112
+ ```sh
113
+ MPLCONFIGDIR=/Volumes/D/typhoon_predict/.cache/matplotlib \
114
+ /Volumes/D/typhoon_predict/.venv/bin/python -B \
115
+ release_tools/benchmark_intensity_v12_v11.py \
116
+ --project /Volumes/D/typhoon_predict \
117
+ --output /Volumes/D/typhoon_predict/output/intensity-v12-v11-20261001 --chunk 10
118
+
119
+ MPLCONFIGDIR=/Volumes/D/typhoon_predict/.cache/matplotlib \
120
+ /Volumes/D/typhoon_predict/.venv/bin/python -B \
121
+ release_tools/plot_intensity_benchmark.py \
122
+ --source /Volumes/D/typhoon_predict/output/intensity-v12-v11-20261001 \
123
+ --project /Volumes/D/typhoon_predict \
124
+ --output /Volumes/D/typhoon_predict/remote_typhoon_predict_repo/evaluation/intensity
125
+ ```
126
+
127
+ The runner locks one process and resumes immutable completed cases. It never
128
+ silently restarts training. Large original forecasts/raw members remain on D;
129
+ public reports include exact source hashes and complete verified aggregates.
evaluation/intensity/intensity_error_bars.png ADDED

Git LFS Details

  • SHA256: ee676ceb75f7cf6b065bd2f8c371c8e182302a28536a92343089aa9fa6b83339
  • Pointer size: 131 Bytes
  • Size of remote file: 230 kB
evaluation/intensity/intensity_final.json ADDED
The diff for this file is too large to render. See raw diff
 
evaluation/intensity/intensity_leads_and_trends.png ADDED

Git LFS Details

  • SHA256: 6d449eba8d892e9de4eba37548f75c93bc4283965965d19e6e919cad5583d82f
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
evaluation/intensity/native_radius_error_bars.png ADDED

Git LFS Details

  • SHA256: 42aeb24e37d2917ae69f8eefc256fc86e7c2fc5df43d7b1b6e8fa86c68e536c3
  • Pointer size: 131 Bytes
  • Size of remote file: 255 kB
evaluation/intensity/verification.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "status": "complete_verified",
3
+ "summary_sha256": "d5481b42d72d328ff08b0a9e6204bef2d087bbd418c61bf4827e06a82a051632",
4
+ "images": {
5
+ "intensity_error_bars.png": "ee676ceb75f7cf6b065bd2f8c371c8e182302a28536a92343089aa9fa6b83339",
6
+ "intensity_leads_and_trends.png": "6d449eba8d892e9de4eba37548f75c93bc4283965965d19e6e919cad5583d82f",
7
+ "native_radius_error_bars.png": "42aeb24e37d2917ae69f8eefc256fc86e7c2fc5df43d7b1b6e8fa86c68e536c3"
8
+ },
9
+ "aggregation": "Paired common lead mask -> daily issue mean -> mean of days per storm -> equal storm weights, same as track. Radius quadrants are averaged within the daily issue; no pooling long-lived storms or quadrant counts across storms.",
10
+ "native_1_2_radius_status": "unavailable, not zero"
11
+ }
evaluation/storm_structure/four_storm_wind_candidate.png ADDED

Git LFS Details

  • SHA256: 7b12c38d0885b8c2af050e08ae0d6d94c18167de43d075c20764ca3fd2c0c857
  • Pointer size: 131 Bytes
  • Size of remote file: 400 kB
evaluation/storm_structure/fung_wong_structure.json ADDED
@@ -0,0 +1,2759 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "frozen Trackformer 1.2 pressure + separate experimental structure candidate",
3
+ "method": "pressure-scaled-issue-structure-experimental-v1",
4
+ "storm_id": "2025308N09144",
5
+ "issue_time_utc": "2025-11-07T00:00:00Z",
6
+ "actual_members": 50,
7
+ "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
8
+ "source_file_sha256": {
9
+ "weather-history.npz": "250b2d18d25c9580a044acd8afc5e34e570ab9c569d78e9a744be63068fb5ca5",
10
+ "model-inputs.npz": "378768086980de46d267f5dc4b988dfc5fc317b31612a52f1937fd52a5526a14",
11
+ "ensemble-members.npz": "7de034b2ed5678e0990f4b73551d32aa5c3b12b94c5f6107c54110736a92410e",
12
+ "fung_wong_video.npz": "4c0f817cfa5f0921eed88fb6e31bbdf25796b3e0617d89ba6eb23d46b8b780bc",
13
+ "fung_wong_video.json": "dbaffa0fc377efa210473a3a20a49575bf6071bebda601f7b1c60487f40e58a4",
14
+ "fung_wong_coastlines.json": "2af08a831beff87de1847e3c5e34faf29aabcd3965d81ffc18fedc6f18a4076d"
15
+ },
16
+ "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
17
+ "future_labels_used_for_diagnostics": false,
18
+ "initial": {
19
+ "method": "pressure-scaled-issue-structure-experimental-v1",
20
+ "storm_id": "2025308N09144",
21
+ "issue_time_utc": "2025-11-07T00:00:00Z",
22
+ "input_wind_kt": 54.0,
23
+ "input_model_pressure_hpa": 985.0,
24
+ "ambient_pressure_hpa": 1007.5,
25
+ "pressure_deficit_hpa": 22.5,
26
+ "rmw_persistence_km": 129.64000000000001,
27
+ "native_quadrant_radii_km": {
28
+ "r34_NE": 333.36,
29
+ "r34_SE": 250.02,
30
+ "r34_SW": 203.72,
31
+ "r34_NW": 333.36,
32
+ "r50_NE": null,
33
+ "r50_SE": null,
34
+ "r50_SW": null,
35
+ "r50_NW": null,
36
+ "r64_NE": null,
37
+ "r64_SE": null,
38
+ "r64_SW": null,
39
+ "r64_NW": null
40
+ },
41
+ "holland_inspired_tail_b": 1.6753066521912985,
42
+ "source_agency": "tcvitals",
43
+ "source_track_type": "US-PROVISIONAL",
44
+ "usa_reference_center": [
45
+ 11.4,
46
+ 137.9
47
+ ],
48
+ "model_origin": [
49
+ 11.4,
50
+ 138.0
51
+ ],
52
+ "definitions": {
53
+ "units": "km",
54
+ "quantity_kind": "radius_not_diameter",
55
+ "thresholds_kt": [
56
+ 34,
57
+ 50,
58
+ 64
59
+ ],
60
+ "quadrant_order": [
61
+ "NE",
62
+ "SE",
63
+ "SW",
64
+ "NW"
65
+ ],
66
+ "quadrant_statistic": "maximum_extent_within_quadrant",
67
+ "target_wind_averaging_seconds": 60,
68
+ "validated_wind_averaging_seconds": null,
69
+ "validated_surface_height_m": null,
70
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
71
+ "official_scoring_allowed": false
72
+ },
73
+ "mixed_agency_initialization": "USA 1-minute wind/radii; model TOKYO pressure. No conversion between wind periods.",
74
+ "calibration": "none; initialization is issue assimilation, not future-target fitting"
75
+ },
76
+ "initial_ambient": {
77
+ "cells": 27,
78
+ "candidate_cells": 27,
79
+ "quadrant_cells": {
80
+ "NE": 6,
81
+ "SE": 5,
82
+ "SW": 8,
83
+ "NW": 8
84
+ },
85
+ "annulus_km": [
86
+ 600,
87
+ 1000
88
+ ],
89
+ "statistic": "median_available_physical_cells",
90
+ "value_hpa": 1007.5,
91
+ "status": "available"
92
+ },
93
+ "definitions": {
94
+ "units": "km",
95
+ "quantity_kind": "radius_not_diameter",
96
+ "thresholds_kt": [
97
+ 34,
98
+ 50,
99
+ 64
100
+ ],
101
+ "quadrant_order": [
102
+ "NE",
103
+ "SE",
104
+ "SW",
105
+ "NW"
106
+ ],
107
+ "quadrant_statistic": "maximum_extent_within_quadrant",
108
+ "target_wind_averaging_seconds": 60,
109
+ "validated_wind_averaging_seconds": null,
110
+ "validated_surface_height_m": null,
111
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
112
+ "official_scoring_allowed": false
113
+ },
114
+ "points": [
115
+ {
116
+ "lead_hours": 6,
117
+ "valid_time_utc": "2025-11-07T06:00:00Z",
118
+ "summary": {
119
+ "method": "pressure-scaled-issue-structure-experimental-v1",
120
+ "members": 50,
121
+ "definitions": {
122
+ "units": "km",
123
+ "quantity_kind": "radius_not_diameter",
124
+ "thresholds_kt": [
125
+ 34,
126
+ 50,
127
+ 64
128
+ ],
129
+ "quadrant_order": [
130
+ "NE",
131
+ "SE",
132
+ "SW",
133
+ "NW"
134
+ ],
135
+ "quadrant_statistic": "maximum_extent_within_quadrant",
136
+ "target_wind_averaging_seconds": 60,
137
+ "validated_wind_averaging_seconds": null,
138
+ "validated_surface_height_m": null,
139
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
140
+ "official_scoring_allowed": false
141
+ },
142
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
143
+ "estimates": {
144
+ "wind_estimate_kt": {
145
+ "mean": 58.29895511641622,
146
+ "p10": 58.13678327404085,
147
+ "p90": 58.49727524050671,
148
+ "valid_members": 50,
149
+ "total_members": 50
150
+ },
151
+ "rmw_persistence_km": {
152
+ "mean": 129.64000000000001,
153
+ "p10": 129.64000000000001,
154
+ "p90": 129.64000000000001,
155
+ "valid_members": 50,
156
+ "total_members": 50
157
+ },
158
+ "r34_NE_estimate_km": {
159
+ "mean": 365.28203163920944,
160
+ "p10": 364.06906717791804,
161
+ "p90": 366.765716748434,
162
+ "valid_members": 50,
163
+ "total_members": 50
164
+ },
165
+ "r34_SE_estimate_km": {
166
+ "mean": 273.9615237294071,
167
+ "p10": 273.0518003834385,
168
+ "p90": 275.07428756132555,
169
+ "valid_members": 50,
170
+ "total_members": 50
171
+ },
172
+ "r34_SW_estimate_km": {
173
+ "mean": 223.22790822396132,
174
+ "p10": 222.48665216428324,
175
+ "p90": 224.13460467959854,
176
+ "valid_members": 50,
177
+ "total_members": 50
178
+ },
179
+ "r34_NW_estimate_km": {
180
+ "mean": 365.28203163920944,
181
+ "p10": 364.06906717791804,
182
+ "p90": 366.765716748434,
183
+ "valid_members": 50,
184
+ "total_members": 50
185
+ },
186
+ "r50_NE_estimate_km": {
187
+ "mean": 177.37529703680804,
188
+ "p10": 176.36836684538997,
189
+ "p90": 178.60823359146974,
190
+ "valid_members": 50,
191
+ "total_members": 50
192
+ },
193
+ "r50_SE_estimate_km": {
194
+ "mean": 161.22026345810883,
195
+ "p10": 160.58367334632248,
196
+ "p90": 161.99914752230862,
197
+ "valid_members": 50,
198
+ "total_members": 50
199
+ },
200
+ "r50_SW_estimate_km": {
201
+ "mean": 150.62468562154947,
202
+ "p10": 150.21532045037358,
203
+ "p90": 151.12528474481869,
204
+ "valid_members": 50,
205
+ "total_members": 50
206
+ },
207
+ "r50_NW_estimate_km": {
208
+ "mean": 177.37529703680804,
209
+ "p10": 176.36836684538997,
210
+ "p90": 178.60823359146974,
211
+ "valid_members": 50,
212
+ "total_members": 50
213
+ },
214
+ "r64_NE_estimate_km": {
215
+ "mean": 0.0,
216
+ "p10": 0.0,
217
+ "p90": 0.0,
218
+ "valid_members": 50,
219
+ "total_members": 50
220
+ },
221
+ "r64_SE_estimate_km": {
222
+ "mean": 0.0,
223
+ "p10": 0.0,
224
+ "p90": 0.0,
225
+ "valid_members": 50,
226
+ "total_members": 50
227
+ },
228
+ "r64_SW_estimate_km": {
229
+ "mean": 0.0,
230
+ "p10": 0.0,
231
+ "p90": 0.0,
232
+ "valid_members": 50,
233
+ "total_members": 50
234
+ },
235
+ "r64_NW_estimate_km": {
236
+ "mean": 0.0,
237
+ "p10": 0.0,
238
+ "p90": 0.0,
239
+ "valid_members": 50,
240
+ "total_members": 50
241
+ }
242
+ },
243
+ "official_scoring_allowed": false
244
+ }
245
+ },
246
+ {
247
+ "lead_hours": 12,
248
+ "valid_time_utc": "2025-11-07T12:00:00Z",
249
+ "summary": {
250
+ "method": "pressure-scaled-issue-structure-experimental-v1",
251
+ "members": 50,
252
+ "definitions": {
253
+ "units": "km",
254
+ "quantity_kind": "radius_not_diameter",
255
+ "thresholds_kt": [
256
+ 34,
257
+ 50,
258
+ 64
259
+ ],
260
+ "quadrant_order": [
261
+ "NE",
262
+ "SE",
263
+ "SW",
264
+ "NW"
265
+ ],
266
+ "quadrant_statistic": "maximum_extent_within_quadrant",
267
+ "target_wind_averaging_seconds": 60,
268
+ "validated_wind_averaging_seconds": null,
269
+ "validated_surface_height_m": null,
270
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
271
+ "official_scoring_allowed": false
272
+ },
273
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
274
+ "estimates": {
275
+ "wind_estimate_kt": {
276
+ "mean": 65.91152631301651,
277
+ "p10": 65.69310552599093,
278
+ "p90": 66.16623021477851,
279
+ "valid_members": 50,
280
+ "total_members": 50
281
+ },
282
+ "rmw_persistence_km": {
283
+ "mean": 129.64000000000001,
284
+ "p10": 129.64000000000001,
285
+ "p90": 129.64000000000001,
286
+ "valid_members": 50,
287
+ "total_members": 50
288
+ },
289
+ "r34_NE_estimate_km": {
290
+ "mean": 422.9209986593443,
291
+ "p10": 421.248055349425,
292
+ "p90": 424.872418464571,
293
+ "valid_members": 50,
294
+ "total_members": 50
295
+ },
296
+ "r34_SE_estimate_km": {
297
+ "mean": 317.1907489945083,
298
+ "p10": 315.93604151206875,
299
+ "p90": 318.6543138484283,
300
+ "valid_members": 50,
301
+ "total_members": 50
302
+ },
303
+ "r34_SW_estimate_km": {
304
+ "mean": 258.45172140293266,
305
+ "p10": 257.4293671579819,
306
+ "p90": 259.6442557283489,
307
+ "valid_members": 50,
308
+ "total_members": 50
309
+ },
310
+ "r34_NW_estimate_km": {
311
+ "mean": 422.9209986593443,
312
+ "p10": 421.248055349425,
313
+ "p90": 424.872418464571,
314
+ "valid_members": 50,
315
+ "total_members": 50
316
+ },
317
+ "r50_NE_estimate_km": {
318
+ "mean": 227.88140357212748,
319
+ "p10": 226.3405956822997,
320
+ "p90": 229.6810089270964,
321
+ "valid_members": 50,
322
+ "total_members": 50
323
+ },
324
+ "r50_SE_estimate_km": {
325
+ "mean": 191.90658887117024,
326
+ "p10": 191.0039499944963,
327
+ "p90": 192.95984144918862,
328
+ "valid_members": 50,
329
+ "total_members": 50
330
+ },
331
+ "r50_SW_estimate_km": {
332
+ "mean": 169.81304636672832,
333
+ "p10": 169.26324530705412,
334
+ "p90": 170.45415560248136,
335
+ "valid_members": 50,
336
+ "total_members": 50
337
+ },
338
+ "r50_NW_estimate_km": {
339
+ "mean": 227.88140357212748,
340
+ "p10": 226.3405956822997,
341
+ "p90": 229.6810089270964,
342
+ "valid_members": 50,
343
+ "total_members": 50
344
+ },
345
+ "r64_NE_estimate_km": {
346
+ "mean": 137.66898069573475,
347
+ "p10": 136.73813926543173,
348
+ "p90": 138.7561682897622,
349
+ "valid_members": 50,
350
+ "total_members": 50
351
+ },
352
+ "r64_SE_estimate_km": {
353
+ "mean": 135.17162420500455,
354
+ "p10": 134.5358400782151,
355
+ "p90": 135.91349483334665,
356
+ "valid_members": 50,
357
+ "total_members": 50
358
+ },
359
+ "r64_SW_estimate_km": {
360
+ "mean": 133.4216977184061,
361
+ "p10": 132.98972036237495,
362
+ "p90": 133.92541568641423,
363
+ "valid_members": 50,
364
+ "total_members": 50
365
+ },
366
+ "r64_NW_estimate_km": {
367
+ "mean": 137.66898069573475,
368
+ "p10": 136.73813926543173,
369
+ "p90": 138.7561682897622,
370
+ "valid_members": 50,
371
+ "total_members": 50
372
+ }
373
+ },
374
+ "official_scoring_allowed": false
375
+ }
376
+ },
377
+ {
378
+ "lead_hours": 18,
379
+ "valid_time_utc": "2025-11-07T18:00:00Z",
380
+ "summary": {
381
+ "method": "pressure-scaled-issue-structure-experimental-v1",
382
+ "members": 50,
383
+ "definitions": {
384
+ "units": "km",
385
+ "quantity_kind": "radius_not_diameter",
386
+ "thresholds_kt": [
387
+ 34,
388
+ 50,
389
+ 64
390
+ ],
391
+ "quadrant_order": [
392
+ "NE",
393
+ "SE",
394
+ "SW",
395
+ "NW"
396
+ ],
397
+ "quadrant_statistic": "maximum_extent_within_quadrant",
398
+ "target_wind_averaging_seconds": 60,
399
+ "validated_wind_averaging_seconds": null,
400
+ "validated_surface_height_m": null,
401
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
402
+ "official_scoring_allowed": false
403
+ },
404
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
405
+ "estimates": {
406
+ "wind_estimate_kt": {
407
+ "mean": 72.20652799857518,
408
+ "p10": 71.93823858594855,
409
+ "p90": 72.49705094779313,
410
+ "valid_members": 50,
411
+ "total_members": 50
412
+ },
413
+ "rmw_persistence_km": {
414
+ "mean": 129.64000000000001,
415
+ "p10": 129.64000000000001,
416
+ "p90": 129.64000000000001,
417
+ "valid_members": 50,
418
+ "total_members": 50
419
+ },
420
+ "r34_NE_estimate_km": {
421
+ "mean": 471.5766611953137,
422
+ "p10": 469.4851206250899,
423
+ "p90": 473.84214597261393,
424
+ "valid_members": 50,
425
+ "total_members": 50
426
+ },
427
+ "r34_SE_estimate_km": {
428
+ "mean": 353.68249589648536,
429
+ "p10": 352.1138404688174,
430
+ "p90": 355.38160947946045,
431
+ "valid_members": 50,
432
+ "total_members": 50
433
+ },
434
+ "r34_SW_estimate_km": {
435
+ "mean": 288.18573739713617,
436
+ "p10": 286.9075737153327,
437
+ "p90": 289.5702003165974,
438
+ "valid_members": 50,
439
+ "total_members": 50
440
+ },
441
+ "r34_NW_estimate_km": {
442
+ "mean": 471.5766611953137,
443
+ "p10": 469.4851206250899,
444
+ "p90": 473.84214597261393,
445
+ "valid_members": 50,
446
+ "total_members": 50
447
+ },
448
+ "r50_NE_estimate_km": {
449
+ "mean": 274.527233330425,
450
+ "p10": 272.44607010307465,
451
+ "p90": 276.7841564336302,
452
+ "valid_members": 50,
453
+ "total_members": 50
454
+ },
455
+ "r50_SE_estimate_km": {
456
+ "mean": 218.43946593165973,
457
+ "p10": 217.28748739680898,
458
+ "p90": 219.68764439836445,
459
+ "valid_members": 50,
460
+ "total_members": 50
461
+ },
462
+ "r50_SW_estimate_km": {
463
+ "mean": 185.64153717799636,
464
+ "p10": 184.96762323917144,
465
+ "p90": 186.37127583604192,
466
+ "valid_members": 50,
467
+ "total_members": 50
468
+ },
469
+ "r50_NW_estimate_km": {
470
+ "mean": 274.527233330425,
471
+ "p10": 272.44607010307465,
472
+ "p90": 276.7841564336302,
473
+ "valid_members": 50,
474
+ "total_members": 50
475
+ },
476
+ "r64_NE_estimate_km": {
477
+ "mean": 165.84891875065833,
478
+ "p10": 164.59163484912193,
479
+ "p90": 167.21238368573623,
480
+ "valid_members": 50,
481
+ "total_members": 50
482
+ },
483
+ "r64_SE_estimate_km": {
484
+ "mean": 153.8603628678846,
485
+ "p10": 153.04895347063035,
486
+ "p90": 154.739531799158,
487
+ "valid_members": 50,
488
+ "total_members": 50
489
+ },
490
+ "r64_SW_estimate_km": {
491
+ "mean": 145.85810447009234,
492
+ "p10": 145.32861192662816,
493
+ "p90": 146.43145835973942,
494
+ "valid_members": 50,
495
+ "total_members": 50
496
+ },
497
+ "r64_NW_estimate_km": {
498
+ "mean": 165.84891875065833,
499
+ "p10": 164.59163484912193,
500
+ "p90": 167.21238368573623,
501
+ "valid_members": 50,
502
+ "total_members": 50
503
+ }
504
+ },
505
+ "official_scoring_allowed": false
506
+ }
507
+ },
508
+ {
509
+ "lead_hours": 24,
510
+ "valid_time_utc": "2025-11-08T00:00:00Z",
511
+ "summary": {
512
+ "method": "pressure-scaled-issue-structure-experimental-v1",
513
+ "members": 50,
514
+ "definitions": {
515
+ "units": "km",
516
+ "quantity_kind": "radius_not_diameter",
517
+ "thresholds_kt": [
518
+ 34,
519
+ 50,
520
+ 64
521
+ ],
522
+ "quadrant_order": [
523
+ "NE",
524
+ "SE",
525
+ "SW",
526
+ "NW"
527
+ ],
528
+ "quadrant_statistic": "maximum_extent_within_quadrant",
529
+ "target_wind_averaging_seconds": 60,
530
+ "validated_wind_averaging_seconds": null,
531
+ "validated_surface_height_m": null,
532
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
533
+ "official_scoring_allowed": false
534
+ },
535
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
536
+ "estimates": {
537
+ "wind_estimate_kt": {
538
+ "mean": 78.59834435033284,
539
+ "p10": 78.19446257058435,
540
+ "p90": 78.891589814318,
541
+ "valid_members": 50,
542
+ "total_members": 50
543
+ },
544
+ "rmw_persistence_km": {
545
+ "mean": 129.64000000000001,
546
+ "p10": 129.64000000000001,
547
+ "p90": 129.64000000000001,
548
+ "valid_members": 50,
549
+ "total_members": 50
550
+ },
551
+ "r34_NE_estimate_km": {
552
+ "mean": 521.8296611183611,
553
+ "p10": 518.6294096532661,
554
+ "p90": 524.1540416224916,
555
+ "valid_members": 50,
556
+ "total_members": 50
557
+ },
558
+ "r34_SE_estimate_km": {
559
+ "mean": 391.37224583877077,
560
+ "p10": 388.9720572399496,
561
+ "p90": 393.1155312168687,
562
+ "valid_members": 50,
563
+ "total_members": 50
564
+ },
565
+ "r34_SW_estimate_km": {
566
+ "mean": 318.8959040167762,
567
+ "p10": 316.9401947881071,
568
+ "p90": 320.3163587693004,
569
+ "valid_members": 50,
570
+ "total_members": 50
571
+ },
572
+ "r34_NW_estimate_km": {
573
+ "mean": 521.8296611183611,
574
+ "p10": 518.6294096532661,
575
+ "p90": 524.1540416224916,
576
+ "valid_members": 50,
577
+ "total_members": 50
578
+ },
579
+ "r50_NE_estimate_km": {
580
+ "mean": 326.4301651059268,
581
+ "p10": 323.010877539006,
582
+ "p90": 328.91728589318154,
583
+ "valid_members": 50,
584
+ "total_members": 50
585
+ },
586
+ "r50_SE_estimate_km": {
587
+ "mean": 246.3929169613056,
588
+ "p10": 244.59653599094926,
589
+ "p90": 247.69816100922756,
590
+ "valid_members": 50,
591
+ "total_members": 50
592
+ },
593
+ "r50_SW_estimate_km": {
594
+ "mean": 201.6809998077354,
595
+ "p10": 200.6684493930203,
596
+ "p90": 202.41615048365756,
597
+ "valid_members": 50,
598
+ "total_members": 50
599
+ },
600
+ "r50_NW_estimate_km": {
601
+ "mean": 326.4301651059268,
602
+ "p10": 323.010877539006,
603
+ "p90": 328.91728589318154,
604
+ "valid_members": 50,
605
+ "total_members": 50
606
+ },
607
+ "r64_NE_estimate_km": {
608
+ "mean": 197.20480650914314,
609
+ "p10": 195.1391274907382,
610
+ "p90": 198.7073397491588,
611
+ "valid_members": 50,
612
+ "total_members": 50
613
+ },
614
+ "r64_SE_estimate_km": {
615
+ "mean": 173.54969922698615,
616
+ "p10": 172.28439752534925,
617
+ "p90": 174.46906296003624,
618
+ "valid_members": 50,
619
+ "total_members": 50
620
+ },
621
+ "r64_SW_estimate_km": {
622
+ "mean": 158.4602712666831,
623
+ "p10": 157.66471286733017,
624
+ "p90": 159.03787736561927,
625
+ "valid_members": 50,
626
+ "total_members": 50
627
+ },
628
+ "r64_NW_estimate_km": {
629
+ "mean": 197.20480650914314,
630
+ "p10": 195.1391274907382,
631
+ "p90": 198.7073397491588,
632
+ "valid_members": 50,
633
+ "total_members": 50
634
+ }
635
+ },
636
+ "official_scoring_allowed": false
637
+ }
638
+ },
639
+ {
640
+ "lead_hours": 30,
641
+ "valid_time_utc": "2025-11-08T06:00:00Z",
642
+ "summary": {
643
+ "method": "pressure-scaled-issue-structure-experimental-v1",
644
+ "members": 50,
645
+ "definitions": {
646
+ "units": "km",
647
+ "quantity_kind": "radius_not_diameter",
648
+ "thresholds_kt": [
649
+ 34,
650
+ 50,
651
+ 64
652
+ ],
653
+ "quadrant_order": [
654
+ "NE",
655
+ "SE",
656
+ "SW",
657
+ "NW"
658
+ ],
659
+ "quadrant_statistic": "maximum_extent_within_quadrant",
660
+ "target_wind_averaging_seconds": 60,
661
+ "validated_wind_averaging_seconds": null,
662
+ "validated_surface_height_m": null,
663
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
664
+ "official_scoring_allowed": false
665
+ },
666
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
667
+ "estimates": {
668
+ "wind_estimate_kt": {
669
+ "mean": 85.53099923071761,
670
+ "p10": 85.19476445826572,
671
+ "p90": 85.91688909008496,
672
+ "valid_members": 50,
673
+ "total_members": 50
674
+ },
675
+ "rmw_persistence_km": {
676
+ "mean": 129.64000000000001,
677
+ "p10": 129.64000000000001,
678
+ "p90": 129.64000000000001,
679
+ "valid_members": 50,
680
+ "total_members": 50
681
+ },
682
+ "r34_NE_estimate_km": {
683
+ "mean": 577.2365220678757,
684
+ "p10": 574.5277139215056,
685
+ "p90": 580.346101338436,
686
+ "valid_members": 50,
687
+ "total_members": 50
688
+ },
689
+ "r34_SE_estimate_km": {
690
+ "mean": 432.9273915509068,
691
+ "p10": 430.8957854411292,
692
+ "p90": 435.2595760038271,
693
+ "valid_members": 50,
694
+ "total_members": 50
695
+ },
696
+ "r34_SW_estimate_km": {
697
+ "mean": 352.755652374813,
698
+ "p10": 351.1002696186979,
699
+ "p90": 354.6559508179331,
700
+ "valid_members": 50,
701
+ "total_members": 50
702
+ },
703
+ "r34_NW_estimate_km": {
704
+ "mean": 577.2365220678757,
705
+ "p10": 574.5277139215056,
706
+ "p90": 580.346101338436,
707
+ "valid_members": 50,
708
+ "total_members": 50
709
+ },
710
+ "r50_NE_estimate_km": {
711
+ "mean": 364.2512492457528,
712
+ "p10": 362.5419208966946,
713
+ "p90": 366.213474591219,
714
+ "valid_members": 50,
715
+ "total_members": 50
716
+ },
717
+ "r50_SE_estimate_km": {
718
+ "mean": 273.1884369343146,
719
+ "p10": 271.90644067252094,
720
+ "p90": 274.66010594341424,
721
+ "valid_members": 50,
722
+ "total_members": 50
723
+ },
724
+ "r50_SW_estimate_km": {
725
+ "mean": 222.59798565018227,
726
+ "p10": 221.55339610353556,
727
+ "p90": 223.79712336130046,
728
+ "valid_members": 50,
729
+ "total_members": 50
730
+ },
731
+ "r50_NW_estimate_km": {
732
+ "mean": 364.2512492457528,
733
+ "p10": 362.5419208966946,
734
+ "p90": 366.213474591219,
735
+ "valid_members": 50,
736
+ "total_members": 50
737
+ },
738
+ "r64_NE_estimate_km": {
739
+ "mean": 234.34893195798008,
740
+ "p10": 232.4688596471192,
741
+ "p90": 236.50939376641912,
742
+ "valid_members": 50,
743
+ "total_members": 50
744
+ },
745
+ "r64_SE_estimate_km": {
746
+ "mean": 195.67747359274378,
747
+ "p10": 194.58556561557623,
748
+ "p90": 196.93127576074465,
749
+ "valid_members": 50,
750
+ "total_members": 50
751
+ },
752
+ "r64_SW_estimate_km": {
753
+ "mean": 172.10217494727632,
754
+ "p10": 171.44116886029747,
755
+ "p90": 172.86077701019983,
756
+ "valid_members": 50,
757
+ "total_members": 50
758
+ },
759
+ "r64_NW_estimate_km": {
760
+ "mean": 234.34893195798008,
761
+ "p10": 232.4688596471192,
762
+ "p90": 236.50939376641912,
763
+ "valid_members": 50,
764
+ "total_members": 50
765
+ }
766
+ },
767
+ "official_scoring_allowed": false
768
+ }
769
+ },
770
+ {
771
+ "lead_hours": 36,
772
+ "valid_time_utc": "2025-11-08T12:00:00Z",
773
+ "summary": {
774
+ "method": "pressure-scaled-issue-structure-experimental-v1",
775
+ "members": 50,
776
+ "definitions": {
777
+ "units": "km",
778
+ "quantity_kind": "radius_not_diameter",
779
+ "thresholds_kt": [
780
+ 34,
781
+ 50,
782
+ 64
783
+ ],
784
+ "quadrant_order": [
785
+ "NE",
786
+ "SE",
787
+ "SW",
788
+ "NW"
789
+ ],
790
+ "quadrant_statistic": "maximum_extent_within_quadrant",
791
+ "target_wind_averaging_seconds": 60,
792
+ "validated_wind_averaging_seconds": null,
793
+ "validated_surface_height_m": null,
794
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
795
+ "official_scoring_allowed": false
796
+ },
797
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
798
+ "estimates": {
799
+ "wind_estimate_kt": {
800
+ "mean": 90.87537340587393,
801
+ "p10": 90.5925845087895,
802
+ "p90": 91.24783604409735,
803
+ "valid_members": 50,
804
+ "total_members": 50
805
+ },
806
+ "rmw_persistence_km": {
807
+ "mean": 129.64000000000001,
808
+ "p10": 129.64000000000001,
809
+ "p90": 129.64000000000001,
810
+ "valid_members": 50,
811
+ "total_members": 50
812
+ },
813
+ "r34_NE_estimate_km": {
814
+ "mean": 620.5515840016498,
815
+ "p10": 618.2463492989524,
816
+ "p90": 623.5885014201808,
817
+ "valid_members": 50,
818
+ "total_members": 50
819
+ },
820
+ "r34_SE_estimate_km": {
821
+ "mean": 465.41368800123723,
822
+ "p10": 463.68476197421427,
823
+ "p90": 467.69137606513556,
824
+ "valid_members": 50,
825
+ "total_members": 50
826
+ },
827
+ "r34_SW_estimate_km": {
828
+ "mean": 379.22596800100814,
829
+ "p10": 377.81721346047084,
830
+ "p90": 381.08186197899937,
831
+ "valid_members": 50,
832
+ "total_members": 50
833
+ },
834
+ "r34_NW_estimate_km": {
835
+ "mean": 620.5515840016498,
836
+ "p10": 618.2463492989524,
837
+ "p90": 623.5885014201808,
838
+ "valid_members": 50,
839
+ "total_members": 50
840
+ },
841
+ "r50_NE_estimate_km": {
842
+ "mean": 391.5841791927583,
843
+ "p10": 390.1295161765408,
844
+ "p90": 393.5005530209307,
845
+ "valid_members": 50,
846
+ "total_members": 50
847
+ },
848
+ "r50_SE_estimate_km": {
849
+ "mean": 293.68813439456875,
850
+ "p10": 292.5971371324056,
851
+ "p90": 295.125414765698,
852
+ "valid_members": 50,
853
+ "total_members": 50
854
+ },
855
+ "r50_SW_estimate_km": {
856
+ "mean": 239.3014428400189,
857
+ "p10": 238.412482107886,
858
+ "p90": 240.47256017945764,
859
+ "valid_members": 50,
860
+ "total_members": 50
861
+ },
862
+ "r50_NW_estimate_km": {
863
+ "mean": 391.5841791927583,
864
+ "p10": 390.1295161765408,
865
+ "p90": 393.5005530209307,
866
+ "valid_members": 50,
867
+ "total_members": 50
868
+ },
869
+ "r64_NE_estimate_km": {
870
+ "mean": 265.21599086357804,
871
+ "p10": 263.5314038253491,
872
+ "p90": 267.4374447337736,
873
+ "valid_members": 50,
874
+ "total_members": 50
875
+ },
876
+ "r64_SE_estimate_km": {
877
+ "mean": 213.26038396595035,
878
+ "p10": 212.31830650703242,
879
+ "p90": 214.50180188101365,
880
+ "valid_members": 50,
881
+ "total_members": 50
882
+ },
883
+ "r64_SW_estimate_km": {
884
+ "mean": 182.60124343068566,
885
+ "p10": 182.04608360428628,
886
+ "p90": 183.3324276761821,
887
+ "valid_members": 50,
888
+ "total_members": 50
889
+ },
890
+ "r64_NW_estimate_km": {
891
+ "mean": 265.21599086357804,
892
+ "p10": 263.5314038253491,
893
+ "p90": 267.4374447337736,
894
+ "valid_members": 50,
895
+ "total_members": 50
896
+ }
897
+ },
898
+ "official_scoring_allowed": false
899
+ }
900
+ },
901
+ {
902
+ "lead_hours": 42,
903
+ "valid_time_utc": "2025-11-08T18:00:00Z",
904
+ "summary": {
905
+ "method": "pressure-scaled-issue-structure-experimental-v1",
906
+ "members": 50,
907
+ "definitions": {
908
+ "units": "km",
909
+ "quantity_kind": "radius_not_diameter",
910
+ "thresholds_kt": [
911
+ 34,
912
+ 50,
913
+ 64
914
+ ],
915
+ "quadrant_order": [
916
+ "NE",
917
+ "SE",
918
+ "SW",
919
+ "NW"
920
+ ],
921
+ "quadrant_statistic": "maximum_extent_within_quadrant",
922
+ "target_wind_averaging_seconds": 60,
923
+ "validated_wind_averaging_seconds": null,
924
+ "validated_surface_height_m": null,
925
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
926
+ "official_scoring_allowed": false
927
+ },
928
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
929
+ "estimates": {
930
+ "wind_estimate_kt": {
931
+ "mean": 92.97236938499864,
932
+ "p10": 92.69003268933565,
933
+ "p90": 93.31799128539345,
934
+ "valid_members": 50,
935
+ "total_members": 50
936
+ },
937
+ "rmw_persistence_km": {
938
+ "mean": 129.64000000000001,
939
+ "p10": 129.64000000000001,
940
+ "p90": 129.64000000000001,
941
+ "valid_members": 50,
942
+ "total_members": 50
943
+ },
944
+ "r34_NE_estimate_km": {
945
+ "mean": 637.6842958098,
946
+ "p10": 635.3726324020806,
947
+ "p90": 640.5148051455062,
948
+ "valid_members": 50,
949
+ "total_members": 50
950
+ },
951
+ "r34_SE_estimate_km": {
952
+ "mean": 478.26322185735006,
953
+ "p10": 476.52947430156047,
954
+ "p90": 480.38610385912966,
955
+ "valid_members": 50,
956
+ "total_members": 50
957
+ },
958
+ "r34_SW_estimate_km": {
959
+ "mean": 389.6959585504334,
960
+ "p10": 388.28327535682706,
961
+ "p90": 391.42571425558714,
962
+ "valid_members": 50,
963
+ "total_members": 50
964
+ },
965
+ "r34_NW_estimate_km": {
966
+ "mean": 637.6842958098,
967
+ "p10": 635.3726324020806,
968
+ "p90": 640.5148051455062,
969
+ "valid_members": 50,
970
+ "total_members": 50
971
+ },
972
+ "r50_NE_estimate_km": {
973
+ "mean": 402.3953656657313,
974
+ "p10": 400.93664596954676,
975
+ "p90": 404.18149062857896,
976
+ "valid_members": 50,
977
+ "total_members": 50
978
+ },
979
+ "r50_SE_estimate_km": {
980
+ "mean": 301.79652424929844,
981
+ "p10": 300.70248447716006,
982
+ "p90": 303.1361179714342,
983
+ "valid_members": 50,
984
+ "total_members": 50
985
+ },
986
+ "r50_SW_estimate_km": {
987
+ "mean": 245.9082790179469,
988
+ "p10": 245.0168392036119,
989
+ "p90": 246.99979982857602,
990
+ "valid_members": 50,
991
+ "total_members": 50
992
+ },
993
+ "r50_NW_estimate_km": {
994
+ "mean": 402.3953656657313,
995
+ "p10": 400.93664596954676,
996
+ "p90": 404.18149062857896,
997
+ "valid_members": 50,
998
+ "total_members": 50
999
+ },
1000
+ "r64_NE_estimate_km": {
1001
+ "mean": 277.8598899993099,
1002
+ "p10": 276.13789094135956,
1003
+ "p90": 279.9706383464344,
1004
+ "valid_members": 50,
1005
+ "total_members": 50
1006
+ },
1007
+ "r64_SE_estimate_km": {
1008
+ "mean": 220.2803604029042,
1009
+ "p10": 219.33081532962666,
1010
+ "p90": 221.44335889368026,
1011
+ "valid_members": 50,
1012
+ "total_members": 50
1013
+ },
1014
+ "r64_SW_estimate_km": {
1015
+ "mean": 186.71688510006382,
1016
+ "p10": 186.16290133535202,
1017
+ "p90": 187.39502356128398,
1018
+ "valid_members": 50,
1019
+ "total_members": 50
1020
+ },
1021
+ "r64_NW_estimate_km": {
1022
+ "mean": 277.8598899993099,
1023
+ "p10": 276.13789094135956,
1024
+ "p90": 279.9706383464344,
1025
+ "valid_members": 50,
1026
+ "total_members": 50
1027
+ }
1028
+ },
1029
+ "official_scoring_allowed": false
1030
+ }
1031
+ },
1032
+ {
1033
+ "lead_hours": 48,
1034
+ "valid_time_utc": "2025-11-09T00:00:00Z",
1035
+ "summary": {
1036
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1037
+ "members": 50,
1038
+ "definitions": {
1039
+ "units": "km",
1040
+ "quantity_kind": "radius_not_diameter",
1041
+ "thresholds_kt": [
1042
+ 34,
1043
+ 50,
1044
+ 64
1045
+ ],
1046
+ "quadrant_order": [
1047
+ "NE",
1048
+ "SE",
1049
+ "SW",
1050
+ "NW"
1051
+ ],
1052
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1053
+ "target_wind_averaging_seconds": 60,
1054
+ "validated_wind_averaging_seconds": null,
1055
+ "validated_surface_height_m": null,
1056
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1057
+ "official_scoring_allowed": false
1058
+ },
1059
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1060
+ "estimates": {
1061
+ "wind_estimate_kt": {
1062
+ "mean": 93.36899641557478,
1063
+ "p10": 93.05264591799197,
1064
+ "p90": 93.69093041766232,
1065
+ "valid_members": 50,
1066
+ "total_members": 50
1067
+ },
1068
+ "rmw_persistence_km": {
1069
+ "mean": 129.64000000000001,
1070
+ "p10": 129.64000000000001,
1071
+ "p90": 129.64000000000001,
1072
+ "valid_members": 50,
1073
+ "total_members": 50
1074
+ },
1075
+ "r34_NE_estimate_km": {
1076
+ "mean": 640.9334756128734,
1077
+ "p10": 638.3411494491348,
1078
+ "p90": 643.5718762731789,
1079
+ "valid_members": 50,
1080
+ "total_members": 50
1081
+ },
1082
+ "r34_SE_estimate_km": {
1083
+ "mean": 480.700106709655,
1084
+ "p10": 478.7558620868512,
1085
+ "p90": 482.6789072048841,
1086
+ "valid_members": 50,
1087
+ "total_members": 50
1088
+ },
1089
+ "r34_SW_estimate_km": {
1090
+ "mean": 391.6815684300893,
1091
+ "p10": 390.09736910780464,
1092
+ "p90": 393.29392438916483,
1093
+ "valid_members": 50,
1094
+ "total_members": 50
1095
+ },
1096
+ "r34_NW_estimate_km": {
1097
+ "mean": 640.9334756128734,
1098
+ "p10": 638.3411494491348,
1099
+ "p90": 643.5718762731789,
1100
+ "valid_members": 50,
1101
+ "total_members": 50
1102
+ },
1103
+ "r50_NE_estimate_km": {
1104
+ "mean": 404.4456825757801,
1105
+ "p10": 402.8098573854205,
1106
+ "p90": 406.1105819710649,
1107
+ "valid_members": 50,
1108
+ "total_members": 50
1109
+ },
1110
+ "r50_SE_estimate_km": {
1111
+ "mean": 303.3342619318351,
1112
+ "p10": 302.1073930390654,
1113
+ "p90": 304.5829364782987,
1114
+ "valid_members": 50,
1115
+ "total_members": 50
1116
+ },
1117
+ "r50_SW_estimate_km": {
1118
+ "mean": 247.16125046297674,
1119
+ "p10": 246.16157951331255,
1120
+ "p90": 248.1786889823174,
1121
+ "valid_members": 50,
1122
+ "total_members": 50
1123
+ },
1124
+ "r50_NW_estimate_km": {
1125
+ "mean": 404.4456825757801,
1126
+ "p10": 402.8098573854205,
1127
+ "p90": 406.1105819710649,
1128
+ "valid_members": 50,
1129
+ "total_members": 50
1130
+ },
1131
+ "r64_NE_estimate_km": {
1132
+ "mean": 280.28598236105717,
1133
+ "p10": 278.34782250924883,
1134
+ "p90": 282.2596360270442,
1135
+ "valid_members": 50,
1136
+ "total_members": 50
1137
+ },
1138
+ "r64_SE_estimate_km": {
1139
+ "mean": 221.61584150517828,
1140
+ "p10": 220.54997039778755,
1141
+ "p90": 222.70081027654226,
1142
+ "valid_members": 50,
1143
+ "total_members": 50
1144
+ },
1145
+ "r64_SW_estimate_km": {
1146
+ "mean": 187.4950725817098,
1147
+ "p10": 186.87441071753156,
1148
+ "p90": 188.12667985532187,
1149
+ "valid_members": 50,
1150
+ "total_members": 50
1151
+ },
1152
+ "r64_NW_estimate_km": {
1153
+ "mean": 280.28598236105717,
1154
+ "p10": 278.34782250924883,
1155
+ "p90": 282.2596360270442,
1156
+ "valid_members": 50,
1157
+ "total_members": 50
1158
+ }
1159
+ },
1160
+ "official_scoring_allowed": false
1161
+ }
1162
+ },
1163
+ {
1164
+ "lead_hours": 54,
1165
+ "valid_time_utc": "2025-11-09T06:00:00Z",
1166
+ "summary": {
1167
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1168
+ "members": 50,
1169
+ "definitions": {
1170
+ "units": "km",
1171
+ "quantity_kind": "radius_not_diameter",
1172
+ "thresholds_kt": [
1173
+ 34,
1174
+ 50,
1175
+ 64
1176
+ ],
1177
+ "quadrant_order": [
1178
+ "NE",
1179
+ "SE",
1180
+ "SW",
1181
+ "NW"
1182
+ ],
1183
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1184
+ "target_wind_averaging_seconds": 60,
1185
+ "validated_wind_averaging_seconds": null,
1186
+ "validated_surface_height_m": null,
1187
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1188
+ "official_scoring_allowed": false
1189
+ },
1190
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1191
+ "estimates": {
1192
+ "wind_estimate_kt": {
1193
+ "mean": 93.64139872036087,
1194
+ "p10": 93.18438568016924,
1195
+ "p90": 94.32567584759735,
1196
+ "valid_members": 50,
1197
+ "total_members": 50
1198
+ },
1199
+ "rmw_persistence_km": {
1200
+ "mean": 129.64000000000001,
1201
+ "p10": 129.64000000000001,
1202
+ "p90": 129.64000000000001,
1203
+ "valid_members": 50,
1204
+ "total_members": 50
1205
+ },
1206
+ "r34_NE_estimate_km": {
1207
+ "mean": 643.1674819318824,
1208
+ "p10": 639.4201871056054,
1209
+ "p90": 648.7804641318286,
1210
+ "valid_members": 50,
1211
+ "total_members": 50
1212
+ },
1213
+ "r34_SE_estimate_km": {
1214
+ "mean": 482.37561144891174,
1215
+ "p10": 479.5651403292041,
1216
+ "p90": 486.58534809887135,
1217
+ "valid_members": 50,
1218
+ "total_members": 50
1219
+ },
1220
+ "r34_SW_estimate_km": {
1221
+ "mean": 393.0467945139281,
1222
+ "p10": 390.7567810089811,
1223
+ "p90": 396.4769503027841,
1224
+ "valid_members": 50,
1225
+ "total_members": 50
1226
+ },
1227
+ "r34_NW_estimate_km": {
1228
+ "mean": 643.1674819318824,
1229
+ "p10": 639.4201871056054,
1230
+ "p90": 648.7804641318286,
1231
+ "valid_members": 50,
1232
+ "total_members": 50
1233
+ },
1234
+ "r50_NE_estimate_km": {
1235
+ "mean": 405.85539863048643,
1236
+ "p10": 403.4907581935408,
1237
+ "p90": 409.3973362940984,
1238
+ "valid_members": 50,
1239
+ "total_members": 50
1240
+ },
1241
+ "r50_SE_estimate_km": {
1242
+ "mean": 304.3915489728648,
1243
+ "p10": 302.6180686451556,
1244
+ "p90": 307.0480022205738,
1245
+ "valid_members": 50,
1246
+ "total_members": 50
1247
+ },
1248
+ "r50_SW_estimate_km": {
1249
+ "mean": 248.0227436075195,
1250
+ "p10": 246.57768556271935,
1251
+ "p90": 250.18726106861567,
1252
+ "valid_members": 50,
1253
+ "total_members": 50
1254
+ },
1255
+ "r50_NW_estimate_km": {
1256
+ "mean": 405.85539863048643,
1257
+ "p10": 403.4907581935408,
1258
+ "p90": 409.3973362940984,
1259
+ "valid_members": 50,
1260
+ "total_members": 50
1261
+ },
1262
+ "r64_NE_estimate_km": {
1263
+ "mean": 281.96219038128265,
1264
+ "p10": 279.15293147260724,
1265
+ "p90": 286.177423967,
1266
+ "valid_members": 50,
1267
+ "total_members": 50
1268
+ },
1269
+ "r64_SE_estimate_km": {
1270
+ "mean": 222.53525409035908,
1271
+ "p10": 220.99339198192695,
1272
+ "p90": 224.84584062284807,
1273
+ "valid_members": 50,
1274
+ "total_members": 50
1275
+ },
1276
+ "r64_SW_estimate_km": {
1277
+ "mean": 188.02945911254454,
1278
+ "p10": 187.13289093163607,
1279
+ "p90": 189.3718107656762,
1280
+ "valid_members": 50,
1281
+ "total_members": 50
1282
+ },
1283
+ "r64_NW_estimate_km": {
1284
+ "mean": 281.96219038128265,
1285
+ "p10": 279.15293147260724,
1286
+ "p90": 286.177423967,
1287
+ "valid_members": 50,
1288
+ "total_members": 50
1289
+ }
1290
+ },
1291
+ "official_scoring_allowed": false
1292
+ }
1293
+ },
1294
+ {
1295
+ "lead_hours": 60,
1296
+ "valid_time_utc": "2025-11-09T12:00:00Z",
1297
+ "summary": {
1298
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1299
+ "members": 50,
1300
+ "definitions": {
1301
+ "units": "km",
1302
+ "quantity_kind": "radius_not_diameter",
1303
+ "thresholds_kt": [
1304
+ 34,
1305
+ 50,
1306
+ 64
1307
+ ],
1308
+ "quadrant_order": [
1309
+ "NE",
1310
+ "SE",
1311
+ "SW",
1312
+ "NW"
1313
+ ],
1314
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1315
+ "target_wind_averaging_seconds": 60,
1316
+ "validated_wind_averaging_seconds": null,
1317
+ "validated_surface_height_m": null,
1318
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1319
+ "official_scoring_allowed": false
1320
+ },
1321
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1322
+ "estimates": {
1323
+ "wind_estimate_kt": {
1324
+ "mean": 92.84393860068786,
1325
+ "p10": 91.96729475142993,
1326
+ "p90": 93.53142871436502,
1327
+ "valid_members": 50,
1328
+ "total_members": 50
1329
+ },
1330
+ "rmw_persistence_km": {
1331
+ "mean": 129.64000000000001,
1332
+ "p10": 129.64000000000001,
1333
+ "p90": 129.64000000000001,
1334
+ "valid_members": 50,
1335
+ "total_members": 50
1336
+ },
1337
+ "r34_NE_estimate_km": {
1338
+ "mean": 636.6351916695111,
1339
+ "p10": 629.4626953632833,
1340
+ "p90": 642.2641161329248,
1341
+ "valid_members": 50,
1342
+ "total_members": 50
1343
+ },
1344
+ "r34_SE_estimate_km": {
1345
+ "mean": 477.4763937521333,
1346
+ "p10": 472.09702152246246,
1347
+ "p90": 481.69808709969357,
1348
+ "valid_members": 50,
1349
+ "total_members": 50
1350
+ },
1351
+ "r34_SW_estimate_km": {
1352
+ "mean": 389.0548393535901,
1353
+ "p10": 384.67164716645084,
1354
+ "p90": 392.49473763678736,
1355
+ "valid_members": 50,
1356
+ "total_members": 50
1357
+ },
1358
+ "r34_NW_estimate_km": {
1359
+ "mean": 636.6351916695111,
1360
+ "p10": 629.4626953632833,
1361
+ "p90": 642.2641161329248,
1362
+ "valid_members": 50,
1363
+ "total_members": 50
1364
+ },
1365
+ "r50_NE_estimate_km": {
1366
+ "mean": 401.73335368436847,
1367
+ "p10": 397.2073220840208,
1368
+ "p90": 405.2853513306077,
1369
+ "valid_members": 50,
1370
+ "total_members": 50
1371
+ },
1372
+ "r50_SE_estimate_km": {
1373
+ "mean": 301.30001526327635,
1374
+ "p10": 297.9054915630156,
1375
+ "p90": 303.9640134979558,
1376
+ "valid_members": 50,
1377
+ "total_members": 50
1378
+ },
1379
+ "r50_SW_estimate_km": {
1380
+ "mean": 245.5037161404474,
1381
+ "p10": 242.73780794023492,
1382
+ "p90": 247.6743813687047,
1383
+ "valid_members": 50,
1384
+ "total_members": 50
1385
+ },
1386
+ "r50_NW_estimate_km": {
1387
+ "mean": 401.73335368436847,
1388
+ "p10": 397.2073220840208,
1389
+ "p90": 405.2853513306077,
1390
+ "valid_members": 50,
1391
+ "total_members": 50
1392
+ },
1393
+ "r64_NE_estimate_km": {
1394
+ "mean": 277.0863194016694,
1395
+ "p10": 271.7600239417335,
1396
+ "p90": 281.279505242497,
1397
+ "valid_members": 50,
1398
+ "total_members": 50
1399
+ },
1400
+ "r64_SE_estimate_km": {
1401
+ "mean": 219.85059341999494,
1402
+ "p10": 216.9068481967324,
1403
+ "p90": 222.16275776440816,
1404
+ "valid_members": 50,
1405
+ "total_members": 50
1406
+ },
1407
+ "r64_SW_estimate_km": {
1408
+ "mean": 186.46481675194494,
1409
+ "p10": 184.74457409004103,
1410
+ "p90": 187.81376715715888,
1411
+ "valid_members": 50,
1412
+ "total_members": 50
1413
+ },
1414
+ "r64_NW_estimate_km": {
1415
+ "mean": 277.0863194016694,
1416
+ "p10": 271.7600239417335,
1417
+ "p90": 281.279505242497,
1418
+ "valid_members": 50,
1419
+ "total_members": 50
1420
+ }
1421
+ },
1422
+ "official_scoring_allowed": false
1423
+ }
1424
+ },
1425
+ {
1426
+ "lead_hours": 66,
1427
+ "valid_time_utc": "2025-11-09T18:00:00Z",
1428
+ "summary": {
1429
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1430
+ "members": 50,
1431
+ "definitions": {
1432
+ "units": "km",
1433
+ "quantity_kind": "radius_not_diameter",
1434
+ "thresholds_kt": [
1435
+ 34,
1436
+ 50,
1437
+ 64
1438
+ ],
1439
+ "quadrant_order": [
1440
+ "NE",
1441
+ "SE",
1442
+ "SW",
1443
+ "NW"
1444
+ ],
1445
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1446
+ "target_wind_averaging_seconds": 60,
1447
+ "validated_wind_averaging_seconds": null,
1448
+ "validated_surface_height_m": null,
1449
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1450
+ "official_scoring_allowed": false
1451
+ },
1452
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1453
+ "estimates": {
1454
+ "wind_estimate_kt": {
1455
+ "mean": 87.56221929884634,
1456
+ "p10": 86.81133699053461,
1457
+ "p90": 88.4154026376338,
1458
+ "valid_members": 50,
1459
+ "total_members": 50
1460
+ },
1461
+ "rmw_persistence_km": {
1462
+ "mean": 129.64000000000001,
1463
+ "p10": 129.64000000000001,
1464
+ "p90": 129.64000000000001,
1465
+ "valid_members": 50,
1466
+ "total_members": 50
1467
+ },
1468
+ "r34_NE_estimate_km": {
1469
+ "mean": 593.6428573980036,
1470
+ "p10": 587.5660770733103,
1471
+ "p90": 600.5501500380674,
1472
+ "valid_members": 50,
1473
+ "total_members": 50
1474
+ },
1475
+ "r34_SE_estimate_km": {
1476
+ "mean": 445.2321430485026,
1477
+ "p10": 440.6745578049828,
1478
+ "p90": 450.4126125285505,
1479
+ "valid_members": 50,
1480
+ "total_members": 50
1481
+ },
1482
+ "r34_SW_estimate_km": {
1483
+ "mean": 362.7817461876688,
1484
+ "p10": 359.0681582114674,
1485
+ "p90": 367.00286946770785,
1486
+ "valid_members": 50,
1487
+ "total_members": 50
1488
+ },
1489
+ "r34_NW_estimate_km": {
1490
+ "mean": 593.6428573980036,
1491
+ "p10": 587.5660770733103,
1492
+ "p90": 600.5501500380674,
1493
+ "valid_members": 50,
1494
+ "total_members": 50
1495
+ },
1496
+ "r50_NE_estimate_km": {
1497
+ "mean": 374.6040732807522,
1498
+ "p10": 370.76946694515175,
1499
+ "p90": 378.9627544744439,
1500
+ "valid_members": 50,
1501
+ "total_members": 50
1502
+ },
1503
+ "r50_SE_estimate_km": {
1504
+ "mean": 280.9530549605641,
1505
+ "p10": 278.0771002088638,
1506
+ "p90": 284.2220658558329,
1507
+ "valid_members": 50,
1508
+ "total_members": 50
1509
+ },
1510
+ "r50_SW_estimate_km": {
1511
+ "mean": 228.92471144934854,
1512
+ "p10": 226.58134091092606,
1513
+ "p90": 231.5883499566046,
1514
+ "valid_members": 50,
1515
+ "total_members": 50
1516
+ },
1517
+ "r50_NW_estimate_km": {
1518
+ "mean": 374.6040732807522,
1519
+ "p10": 370.76946694515175,
1520
+ "p90": 378.9627544744439,
1521
+ "valid_members": 50,
1522
+ "total_members": 50
1523
+ },
1524
+ "r64_NE_estimate_km": {
1525
+ "mean": 245.86533306962133,
1526
+ "p10": 241.56331911101566,
1527
+ "p90": 250.763406021542,
1528
+ "valid_members": 50,
1529
+ "total_members": 50
1530
+ },
1531
+ "r64_SE_estimate_km": {
1532
+ "mean": 202.31070317038512,
1533
+ "p10": 199.8482221599322,
1534
+ "p90": 205.11096352078226,
1535
+ "valid_members": 50,
1536
+ "total_members": 50
1537
+ },
1538
+ "r64_SW_estimate_km": {
1539
+ "mean": 176.09414363791404,
1540
+ "p10": 174.61877193910917,
1541
+ "p90": 177.7704466247317,
1542
+ "valid_members": 50,
1543
+ "total_members": 50
1544
+ },
1545
+ "r64_NW_estimate_km": {
1546
+ "mean": 245.86533306962133,
1547
+ "p10": 241.56331911101566,
1548
+ "p90": 250.763406021542,
1549
+ "valid_members": 50,
1550
+ "total_members": 50
1551
+ }
1552
+ },
1553
+ "official_scoring_allowed": false
1554
+ }
1555
+ },
1556
+ {
1557
+ "lead_hours": 72,
1558
+ "valid_time_utc": "2025-11-10T00:00:00Z",
1559
+ "summary": {
1560
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1561
+ "members": 50,
1562
+ "definitions": {
1563
+ "units": "km",
1564
+ "quantity_kind": "radius_not_diameter",
1565
+ "thresholds_kt": [
1566
+ 34,
1567
+ 50,
1568
+ 64
1569
+ ],
1570
+ "quadrant_order": [
1571
+ "NE",
1572
+ "SE",
1573
+ "SW",
1574
+ "NW"
1575
+ ],
1576
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1577
+ "target_wind_averaging_seconds": 60,
1578
+ "validated_wind_averaging_seconds": null,
1579
+ "validated_surface_height_m": null,
1580
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1581
+ "official_scoring_allowed": false
1582
+ },
1583
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1584
+ "estimates": {
1585
+ "wind_estimate_kt": {
1586
+ "mean": 84.90869448458487,
1587
+ "p10": 84.13079318536259,
1588
+ "p90": 85.6966751788521,
1589
+ "valid_members": 50,
1590
+ "total_members": 50
1591
+ },
1592
+ "rmw_persistence_km": {
1593
+ "mean": 129.64000000000001,
1594
+ "p10": 129.64000000000001,
1595
+ "p90": 129.64000000000001,
1596
+ "valid_members": 50,
1597
+ "total_members": 50
1598
+ },
1599
+ "r34_NE_estimate_km": {
1600
+ "mean": 572.2286034743172,
1601
+ "p10": 565.9723974397982,
1602
+ "p90": 578.5707503898955,
1603
+ "valid_members": 50,
1604
+ "total_members": 50
1605
+ },
1606
+ "r34_SE_estimate_km": {
1607
+ "mean": 429.17145260573795,
1608
+ "p10": 424.47929807984866,
1609
+ "p90": 433.9280627924216,
1610
+ "valid_members": 50,
1611
+ "total_members": 50
1612
+ },
1613
+ "r34_SW_estimate_km": {
1614
+ "mean": 349.6952576787494,
1615
+ "p10": 345.87202065765445,
1616
+ "p90": 353.5710141271583,
1617
+ "valid_members": 50,
1618
+ "total_members": 50
1619
+ },
1620
+ "r34_NW_estimate_km": {
1621
+ "mean": 572.2286034743172,
1622
+ "p10": 565.9723974397982,
1623
+ "p90": 578.5707503898955,
1624
+ "valid_members": 50,
1625
+ "total_members": 50
1626
+ },
1627
+ "r50_NE_estimate_km": {
1628
+ "mean": 361.0911224448879,
1629
+ "p10": 357.1432938226643,
1630
+ "p90": 365.09318199687834,
1631
+ "valid_members": 50,
1632
+ "total_members": 50
1633
+ },
1634
+ "r50_SE_estimate_km": {
1635
+ "mean": 270.8183418336659,
1636
+ "p10": 267.8574703669982,
1637
+ "p90": 273.81988649765873,
1638
+ "valid_members": 50,
1639
+ "total_members": 50
1640
+ },
1641
+ "r50_SW_estimate_km": {
1642
+ "mean": 220.66679704965372,
1643
+ "p10": 218.25423511385037,
1644
+ "p90": 223.1125001092034,
1645
+ "valid_members": 50,
1646
+ "total_members": 50
1647
+ },
1648
+ "r50_NW_estimate_km": {
1649
+ "mean": 361.0911224448879,
1650
+ "p10": 357.1432938226643,
1651
+ "p90": 365.09318199687834,
1652
+ "valid_members": 50,
1653
+ "total_members": 50
1654
+ },
1655
+ "r64_NE_estimate_km": {
1656
+ "mean": 230.88991600652946,
1657
+ "p10": 226.5803458325688,
1658
+ "p90": 235.27342242409208,
1659
+ "valid_members": 50,
1660
+ "total_members": 50
1661
+ },
1662
+ "r64_SE_estimate_km": {
1663
+ "mean": 193.66140892154752,
1664
+ "p10": 191.1446236418278,
1665
+ "p90": 196.21505649854913,
1666
+ "valid_members": 50,
1667
+ "total_members": 50
1668
+ },
1669
+ "r64_SW_estimate_km": {
1670
+ "mean": 170.87862105697408,
1671
+ "p10": 169.3490268645973,
1672
+ "p90": 172.42789301737835,
1673
+ "valid_members": 50,
1674
+ "total_members": 50
1675
+ },
1676
+ "r64_NW_estimate_km": {
1677
+ "mean": 230.88991600652946,
1678
+ "p10": 226.5803458325688,
1679
+ "p90": 235.27342242409208,
1680
+ "valid_members": 50,
1681
+ "total_members": 50
1682
+ }
1683
+ },
1684
+ "official_scoring_allowed": false
1685
+ }
1686
+ },
1687
+ {
1688
+ "lead_hours": 78,
1689
+ "valid_time_utc": "2025-11-10T06:00:00Z",
1690
+ "summary": {
1691
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1692
+ "members": 50,
1693
+ "definitions": {
1694
+ "units": "km",
1695
+ "quantity_kind": "radius_not_diameter",
1696
+ "thresholds_kt": [
1697
+ 34,
1698
+ 50,
1699
+ 64
1700
+ ],
1701
+ "quadrant_order": [
1702
+ "NE",
1703
+ "SE",
1704
+ "SW",
1705
+ "NW"
1706
+ ],
1707
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1708
+ "target_wind_averaging_seconds": 60,
1709
+ "validated_wind_averaging_seconds": null,
1710
+ "validated_surface_height_m": null,
1711
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1712
+ "official_scoring_allowed": false
1713
+ },
1714
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1715
+ "estimates": {
1716
+ "wind_estimate_kt": {
1717
+ "mean": 80.16757894365486,
1718
+ "p10": 78.31183823649297,
1719
+ "p90": 82.47491296711937,
1720
+ "valid_members": 50,
1721
+ "total_members": 50
1722
+ },
1723
+ "rmw_persistence_km": {
1724
+ "mean": 129.64000000000001,
1725
+ "p10": 129.64000000000001,
1726
+ "p90": 129.64000000000001,
1727
+ "valid_members": 50,
1728
+ "total_members": 50
1729
+ },
1730
+ "r34_NE_estimate_km": {
1731
+ "mean": 534.314170232212,
1732
+ "p10": 519.558929327634,
1733
+ "p90": 552.6993384057706,
1734
+ "valid_members": 50,
1735
+ "total_members": 50
1736
+ },
1737
+ "r34_SE_estimate_km": {
1738
+ "mean": 400.7356276741589,
1739
+ "p10": 389.66919699572543,
1740
+ "p90": 414.52450380432794,
1741
+ "valid_members": 50,
1742
+ "total_members": 50
1743
+ },
1744
+ "r34_SW_estimate_km": {
1745
+ "mean": 326.52532625301836,
1746
+ "p10": 317.50823458910963,
1747
+ "p90": 337.76070680352643,
1748
+ "valid_members": 50,
1749
+ "total_members": 50
1750
+ },
1751
+ "r34_NW_estimate_km": {
1752
+ "mean": 534.314170232212,
1753
+ "p10": 519.558929327634,
1754
+ "p90": 552.6993384057706,
1755
+ "valid_members": 50,
1756
+ "total_members": 50
1757
+ },
1758
+ "r50_NE_estimate_km": {
1759
+ "mean": 336.07384294405847,
1760
+ "p10": 324.00152273783283,
1761
+ "p90": 348.76764857219155,
1762
+ "valid_members": 50,
1763
+ "total_members": 50
1764
+ },
1765
+ "r50_SE_estimate_km": {
1766
+ "mean": 252.65522054515702,
1767
+ "p10": 245.117949407615,
1768
+ "p90": 261.57573642914366,
1769
+ "valid_members": 50,
1770
+ "total_members": 50
1771
+ },
1772
+ "r50_SW_estimate_km": {
1773
+ "mean": 206.21816064711584,
1774
+ "p10": 200.96273568868332,
1775
+ "p90": 213.1357852385615,
1776
+ "valid_members": 50,
1777
+ "total_members": 50
1778
+ },
1779
+ "r50_NW_estimate_km": {
1780
+ "mean": 336.07384294405847,
1781
+ "p10": 324.00152273783283,
1782
+ "p90": 348.76764857219155,
1783
+ "valid_members": 50,
1784
+ "total_members": 50
1785
+ },
1786
+ "r64_NE_estimate_km": {
1787
+ "mean": 205.40739879709938,
1788
+ "p10": 195.73760157688923,
1789
+ "p90": 217.56924063208982,
1790
+ "valid_members": 50,
1791
+ "total_members": 50
1792
+ },
1793
+ "r64_SE_estimate_km": {
1794
+ "mean": 178.50909258406085,
1795
+ "p10": 172.6516610926273,
1796
+ "p90": 185.82570954618234,
1797
+ "valid_members": 50,
1798
+ "total_members": 50
1799
+ },
1800
+ "r64_SW_estimate_km": {
1801
+ "mean": 161.54983929961972,
1802
+ "p10": 157.8959328944288,
1803
+ "p90": 166.0917697463952,
1804
+ "valid_members": 50,
1805
+ "total_members": 50
1806
+ },
1807
+ "r64_NW_estimate_km": {
1808
+ "mean": 205.40739879709938,
1809
+ "p10": 195.73760157688923,
1810
+ "p90": 217.56924063208982,
1811
+ "valid_members": 50,
1812
+ "total_members": 50
1813
+ }
1814
+ },
1815
+ "official_scoring_allowed": false
1816
+ }
1817
+ },
1818
+ {
1819
+ "lead_hours": 84,
1820
+ "valid_time_utc": "2025-11-10T12:00:00Z",
1821
+ "summary": {
1822
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1823
+ "members": 50,
1824
+ "definitions": {
1825
+ "units": "km",
1826
+ "quantity_kind": "radius_not_diameter",
1827
+ "thresholds_kt": [
1828
+ 34,
1829
+ 50,
1830
+ 64
1831
+ ],
1832
+ "quadrant_order": [
1833
+ "NE",
1834
+ "SE",
1835
+ "SW",
1836
+ "NW"
1837
+ ],
1838
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1839
+ "target_wind_averaging_seconds": 60,
1840
+ "validated_wind_averaging_seconds": null,
1841
+ "validated_surface_height_m": null,
1842
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1843
+ "official_scoring_allowed": false
1844
+ },
1845
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1846
+ "estimates": {
1847
+ "wind_estimate_kt": {
1848
+ "mean": 75.26151588941809,
1849
+ "p10": 74.22229787608822,
1850
+ "p90": 76.62962626947994,
1851
+ "valid_members": 50,
1852
+ "total_members": 50
1853
+ },
1854
+ "rmw_persistence_km": {
1855
+ "mean": 129.64000000000001,
1856
+ "p10": 129.64000000000001,
1857
+ "p90": 129.64000000000001,
1858
+ "valid_members": 50,
1859
+ "total_members": 50
1860
+ },
1861
+ "r34_NE_estimate_km": {
1862
+ "mean": 495.4993108616473,
1863
+ "p10": 487.3347082414546,
1864
+ "p90": 506.26315804971966,
1865
+ "valid_members": 50,
1866
+ "total_members": 50
1867
+ },
1868
+ "r34_SE_estimate_km": {
1869
+ "mean": 371.6244831462355,
1870
+ "p10": 365.501031181091,
1871
+ "p90": 379.6973685372897,
1872
+ "valid_members": 50,
1873
+ "total_members": 50
1874
+ },
1875
+ "r34_SW_estimate_km": {
1876
+ "mean": 302.80513441545116,
1877
+ "p10": 297.81565503644447,
1878
+ "p90": 309.3830410303842,
1879
+ "valid_members": 50,
1880
+ "total_members": 50
1881
+ },
1882
+ "r34_NW_estimate_km": {
1883
+ "mean": 495.4993108616473,
1884
+ "p10": 487.3347082414546,
1885
+ "p90": 506.26315804971966,
1886
+ "valid_members": 50,
1887
+ "total_members": 50
1888
+ },
1889
+ "r50_NE_estimate_km": {
1890
+ "mean": 298.80244630395333,
1891
+ "p10": 290.39797799665786,
1892
+ "p90": 309.9516373128352,
1893
+ "valid_members": 50,
1894
+ "total_members": 50
1895
+ },
1896
+ "r50_SE_estimate_km": {
1897
+ "mean": 231.6843843159507,
1898
+ "p10": 227.14667081282474,
1899
+ "p90": 237.67662871402922,
1900
+ "valid_members": 50,
1901
+ "total_members": 50
1902
+ },
1903
+ "r50_SW_estimate_km": {
1904
+ "mean": 193.31128000016443,
1905
+ "p10": 190.7032756149062,
1906
+ "p90": 196.74408749538281,
1907
+ "valid_members": 50,
1908
+ "total_members": 50
1909
+ },
1910
+ "r50_NW_estimate_km": {
1911
+ "mean": 298.80244630395333,
1912
+ "p10": 290.39797799665786,
1913
+ "p90": 309.9516373128352,
1914
+ "valid_members": 50,
1915
+ "total_members": 50
1916
+ },
1917
+ "r64_NE_estimate_km": {
1918
+ "mean": 180.51419539829735,
1919
+ "p10": 175.43684127014987,
1920
+ "p90": 187.24970666738162,
1921
+ "valid_members": 50,
1922
+ "total_members": 50
1923
+ },
1924
+ "r64_SE_estimate_km": {
1925
+ "mean": 163.18957423576117,
1926
+ "p10": 159.99338327638623,
1927
+ "p90": 167.4102808445653,
1928
+ "valid_members": 50,
1929
+ "total_members": 50
1930
+ },
1931
+ "r64_SW_estimate_km": {
1932
+ "mean": 151.88420276048683,
1933
+ "p10": 149.83510005499298,
1934
+ "p90": 154.58135126439723,
1935
+ "valid_members": 50,
1936
+ "total_members": 50
1937
+ },
1938
+ "r64_NW_estimate_km": {
1939
+ "mean": 180.51419539829735,
1940
+ "p10": 175.43684127014987,
1941
+ "p90": 187.24970666738162,
1942
+ "valid_members": 50,
1943
+ "total_members": 50
1944
+ }
1945
+ },
1946
+ "official_scoring_allowed": false
1947
+ }
1948
+ },
1949
+ {
1950
+ "lead_hours": 90,
1951
+ "valid_time_utc": "2025-11-10T18:00:00Z",
1952
+ "summary": {
1953
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1954
+ "members": 50,
1955
+ "definitions": {
1956
+ "units": "km",
1957
+ "quantity_kind": "radius_not_diameter",
1958
+ "thresholds_kt": [
1959
+ 34,
1960
+ 50,
1961
+ 64
1962
+ ],
1963
+ "quadrant_order": [
1964
+ "NE",
1965
+ "SE",
1966
+ "SW",
1967
+ "NW"
1968
+ ],
1969
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1970
+ "target_wind_averaging_seconds": 60,
1971
+ "validated_wind_averaging_seconds": null,
1972
+ "validated_surface_height_m": null,
1973
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1974
+ "official_scoring_allowed": false
1975
+ },
1976
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1977
+ "estimates": {
1978
+ "wind_estimate_kt": {
1979
+ "mean": 68.74172724462285,
1980
+ "p10": 67.97198027533359,
1981
+ "p90": 69.63705131406948,
1982
+ "valid_members": 50,
1983
+ "total_members": 50
1984
+ },
1985
+ "rmw_persistence_km": {
1986
+ "mean": 129.64000000000001,
1987
+ "p10": 129.64000000000001,
1988
+ "p90": 129.64000000000001,
1989
+ "valid_members": 50,
1990
+ "total_members": 50
1991
+ },
1992
+ "r34_NE_estimate_km": {
1993
+ "mean": 444.69390784206547,
1994
+ "p10": 438.7513350626871,
1995
+ "p90": 451.61244559992406,
1996
+ "valid_members": 50,
1997
+ "total_members": 50
1998
+ },
1999
+ "r34_SE_estimate_km": {
2000
+ "mean": 333.5204308815491,
2001
+ "p10": 329.0635012970153,
2002
+ "p90": 338.709334199943,
2003
+ "valid_members": 50,
2004
+ "total_members": 50
2005
+ },
2006
+ "r34_SW_estimate_km": {
2007
+ "mean": 271.75738812570665,
2008
+ "p10": 268.1258158716421,
2009
+ "p90": 275.9853834221758,
2010
+ "valid_members": 50,
2011
+ "total_members": 50
2012
+ },
2013
+ "r34_NW_estimate_km": {
2014
+ "mean": 444.69390784206547,
2015
+ "p10": 438.7513350626871,
2016
+ "p90": 451.61244559992406,
2017
+ "valid_members": 50,
2018
+ "total_members": 50
2019
+ },
2020
+ "r50_NE_estimate_km": {
2021
+ "mean": 248.32622311904169,
2022
+ "p10": 242.660014881888,
2023
+ "p90": 254.95014276927967,
2024
+ "valid_members": 50,
2025
+ "total_members": 50
2026
+ },
2027
+ "r50_SE_estimate_km": {
2028
+ "mean": 203.71472760344247,
2029
+ "p10": 200.47866920717067,
2030
+ "p90": 207.48637538783845,
2031
+ "valid_members": 50,
2032
+ "total_members": 50
2033
+ },
2034
+ "r50_SW_estimate_km": {
2035
+ "mean": 176.93341093147725,
2036
+ "p10": 174.99765069405996,
2037
+ "p90": 179.18472188416888,
2038
+ "valid_members": 50,
2039
+ "total_members": 50
2040
+ },
2041
+ "r50_NW_estimate_km": {
2042
+ "mean": 248.32622311904169,
2043
+ "p10": 242.660014881888,
2044
+ "p90": 254.95014276927967,
2045
+ "valid_members": 50,
2046
+ "total_members": 50
2047
+ },
2048
+ "r64_NE_estimate_km": {
2049
+ "mean": 150.0202187669934,
2050
+ "p10": 146.597117538938,
2051
+ "p90": 154.02189793942352,
2052
+ "valid_members": 50,
2053
+ "total_members": 50
2054
+ },
2055
+ "r64_SE_estimate_km": {
2056
+ "mean": 143.4888232166068,
2057
+ "p10": 141.20946807815477,
2058
+ "p90": 146.14542693169997,
2059
+ "valid_members": 50,
2060
+ "total_members": 50
2061
+ },
2062
+ "r64_SW_estimate_km": {
2063
+ "mean": 139.01615084747334,
2064
+ "p10": 137.4952287347269,
2065
+ "p90": 140.78500039011368,
2066
+ "valid_members": 50,
2067
+ "total_members": 50
2068
+ },
2069
+ "r64_NW_estimate_km": {
2070
+ "mean": 150.0202187669934,
2071
+ "p10": 146.597117538938,
2072
+ "p90": 154.02189793942352,
2073
+ "valid_members": 50,
2074
+ "total_members": 50
2075
+ }
2076
+ },
2077
+ "official_scoring_allowed": false
2078
+ }
2079
+ },
2080
+ {
2081
+ "lead_hours": 96,
2082
+ "valid_time_utc": "2025-11-11T00:00:00Z",
2083
+ "summary": {
2084
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2085
+ "members": 50,
2086
+ "definitions": {
2087
+ "units": "km",
2088
+ "quantity_kind": "radius_not_diameter",
2089
+ "thresholds_kt": [
2090
+ 34,
2091
+ 50,
2092
+ 64
2093
+ ],
2094
+ "quadrant_order": [
2095
+ "NE",
2096
+ "SE",
2097
+ "SW",
2098
+ "NW"
2099
+ ],
2100
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2101
+ "target_wind_averaging_seconds": 60,
2102
+ "validated_wind_averaging_seconds": null,
2103
+ "validated_surface_height_m": null,
2104
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2105
+ "official_scoring_allowed": false
2106
+ },
2107
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2108
+ "estimates": {
2109
+ "wind_estimate_kt": {
2110
+ "mean": 67.23888608368719,
2111
+ "p10": 66.57343635184192,
2112
+ "p90": 67.84967722430757,
2113
+ "valid_members": 50,
2114
+ "total_members": 50
2115
+ },
2116
+ "rmw_persistence_km": {
2117
+ "mean": 129.64000000000001,
2118
+ "p10": 129.64000000000001,
2119
+ "p90": 129.64000000000001,
2120
+ "valid_members": 50,
2121
+ "total_members": 50
2122
+ },
2123
+ "r34_NE_estimate_km": {
2124
+ "mean": 433.11048607117766,
2125
+ "p10": 427.9958410394541,
2126
+ "p90": 437.80900000451095,
2127
+ "valid_members": 50,
2128
+ "total_members": 50
2129
+ },
2130
+ "r34_SE_estimate_km": {
2131
+ "mean": 324.8328645533833,
2132
+ "p10": 320.99688077959064,
2133
+ "p90": 328.3567500033832,
2134
+ "valid_members": 50,
2135
+ "total_members": 50
2136
+ },
2137
+ "r34_SW_estimate_km": {
2138
+ "mean": 264.67863037683077,
2139
+ "p10": 261.55301396855526,
2140
+ "p90": 267.54994444720114,
2141
+ "valid_members": 50,
2142
+ "total_members": 50
2143
+ },
2144
+ "r34_NW_estimate_km": {
2145
+ "mean": 433.11048607117766,
2146
+ "p10": 427.9958410394541,
2147
+ "p90": 437.80900000451095,
2148
+ "valid_members": 50,
2149
+ "total_members": 50
2150
+ },
2151
+ "r50_NE_estimate_km": {
2152
+ "mean": 237.3590644104423,
2153
+ "p10": 232.57601793171716,
2154
+ "p90": 241.76925570791533,
2155
+ "valid_members": 50,
2156
+ "total_members": 50
2157
+ },
2158
+ "r50_SE_estimate_km": {
2159
+ "mean": 197.4187798308213,
2160
+ "p10": 194.64793614148442,
2161
+ "p90": 199.96669765196532,
2162
+ "valid_members": 50,
2163
+ "total_members": 50
2164
+ },
2165
+ "r50_SW_estimate_km": {
2166
+ "mean": 173.15333859024082,
2167
+ "p10": 171.47898427487976,
2168
+ "p90": 174.69001078135818,
2169
+ "valid_members": 50,
2170
+ "total_members": 50
2171
+ },
2172
+ "r50_NW_estimate_km": {
2173
+ "mean": 237.3590644104423,
2174
+ "p10": 232.57601793171716,
2175
+ "p90": 241.76925570791533,
2176
+ "valid_members": 50,
2177
+ "total_members": 50
2178
+ },
2179
+ "r64_NE_estimate_km": {
2180
+ "mean": 143.39467786337445,
2181
+ "p10": 140.50511722777827,
2182
+ "p90": 146.0589871535538,
2183
+ "valid_members": 50,
2184
+ "total_members": 50
2185
+ },
2186
+ "r64_SE_estimate_km": {
2187
+ "mean": 139.05419962530118,
2188
+ "p10": 137.1025238433024,
2189
+ "p90": 140.84885499513902,
2190
+ "valid_members": 50,
2191
+ "total_members": 50
2192
+ },
2193
+ "r64_SW_estimate_km": {
2194
+ "mean": 136.04615719823997,
2195
+ "p10": 134.73062108298083,
2196
+ "p90": 137.2535168031833,
2197
+ "valid_members": 50,
2198
+ "total_members": 50
2199
+ },
2200
+ "r64_NW_estimate_km": {
2201
+ "mean": 143.39467786337445,
2202
+ "p10": 140.50511722777827,
2203
+ "p90": 146.0589871535538,
2204
+ "valid_members": 50,
2205
+ "total_members": 50
2206
+ }
2207
+ },
2208
+ "official_scoring_allowed": false
2209
+ }
2210
+ },
2211
+ {
2212
+ "lead_hours": 102,
2213
+ "valid_time_utc": "2025-11-11T06:00:00Z",
2214
+ "summary": {
2215
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2216
+ "members": 50,
2217
+ "definitions": {
2218
+ "units": "km",
2219
+ "quantity_kind": "radius_not_diameter",
2220
+ "thresholds_kt": [
2221
+ 34,
2222
+ 50,
2223
+ 64
2224
+ ],
2225
+ "quadrant_order": [
2226
+ "NE",
2227
+ "SE",
2228
+ "SW",
2229
+ "NW"
2230
+ ],
2231
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2232
+ "target_wind_averaging_seconds": 60,
2233
+ "validated_wind_averaging_seconds": null,
2234
+ "validated_surface_height_m": null,
2235
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2236
+ "official_scoring_allowed": false
2237
+ },
2238
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2239
+ "estimates": {
2240
+ "wind_estimate_kt": {
2241
+ "mean": 65.98444280978514,
2242
+ "p10": 65.1163299346196,
2243
+ "p90": 67.00874351506835,
2244
+ "valid_members": 50,
2245
+ "total_members": 50
2246
+ },
2247
+ "rmw_persistence_km": {
2248
+ "mean": 129.64000000000001,
2249
+ "p10": 129.64000000000001,
2250
+ "p90": 129.64000000000001,
2251
+ "valid_members": 50,
2252
+ "total_members": 50
2253
+ },
2254
+ "r34_NE_estimate_km": {
2255
+ "mean": 423.4843832348685,
2256
+ "p10": 416.8365143216428,
2257
+ "p90": 431.33890785000506,
2258
+ "valid_members": 50,
2259
+ "total_members": 50
2260
+ },
2261
+ "r34_SE_estimate_km": {
2262
+ "mean": 317.6132874261514,
2263
+ "p10": 312.6273857412321,
2264
+ "p90": 323.5041808875038,
2265
+ "valid_members": 50,
2266
+ "total_members": 50
2267
+ },
2268
+ "r34_SW_estimate_km": {
2269
+ "mean": 258.7960119768641,
2270
+ "p10": 254.7334254187817,
2271
+ "p90": 263.59599924166974,
2272
+ "valid_members": 50,
2273
+ "total_members": 50
2274
+ },
2275
+ "r34_NW_estimate_km": {
2276
+ "mean": 423.4843832348685,
2277
+ "p10": 416.8365143216428,
2278
+ "p90": 431.33890785000506,
2279
+ "valid_members": 50,
2280
+ "total_members": 50
2281
+ },
2282
+ "r50_NE_estimate_km": {
2283
+ "mean": 228.42007670591818,
2284
+ "p10": 222.30212318763054,
2285
+ "p90": 235.69128161968345,
2286
+ "valid_members": 50,
2287
+ "total_members": 50
2288
+ },
2289
+ "r50_SE_estimate_km": {
2290
+ "mean": 192.21364701441428,
2291
+ "p10": 188.62755024173208,
2292
+ "p90": 196.45732569856628,
2293
+ "valid_members": 50,
2294
+ "total_members": 50
2295
+ },
2296
+ "r50_SW_estimate_km": {
2297
+ "mean": 169.9963983253235,
2298
+ "p10": 167.81116671293665,
2299
+ "p90": 172.57437623414174,
2300
+ "valid_members": 50,
2301
+ "total_members": 50
2302
+ },
2303
+ "r50_NW_estimate_km": {
2304
+ "mean": 228.42007670591818,
2305
+ "p10": 222.30212318763054,
2306
+ "p90": 235.69128161968345,
2307
+ "valid_members": 50,
2308
+ "total_members": 50
2309
+ },
2310
+ "r64_NE_estimate_km": {
2311
+ "mean": 137.99440690469552,
2312
+ "p10": 134.29839480540224,
2313
+ "p90": 142.38712764985738,
2314
+ "valid_members": 50,
2315
+ "total_members": 50
2316
+ },
2317
+ "r64_SE_estimate_km": {
2318
+ "mean": 135.38790415762008,
2319
+ "p10": 132.86199544249413,
2320
+ "p90": 138.3769882933715,
2321
+ "valid_members": 50,
2322
+ "total_members": 50
2323
+ },
2324
+ "r64_SW_estimate_km": {
2325
+ "mean": 133.56575690654964,
2326
+ "p10": 131.84882574094925,
2327
+ "p90": 135.59126788249813,
2328
+ "valid_members": 50,
2329
+ "total_members": 50
2330
+ },
2331
+ "r64_NW_estimate_km": {
2332
+ "mean": 137.99440690469552,
2333
+ "p10": 134.29839480540224,
2334
+ "p90": 142.38712764985738,
2335
+ "valid_members": 50,
2336
+ "total_members": 50
2337
+ }
2338
+ },
2339
+ "official_scoring_allowed": false
2340
+ }
2341
+ },
2342
+ {
2343
+ "lead_hours": 108,
2344
+ "valid_time_utc": "2025-11-11T12:00:00Z",
2345
+ "summary": {
2346
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2347
+ "members": 50,
2348
+ "definitions": {
2349
+ "units": "km",
2350
+ "quantity_kind": "radius_not_diameter",
2351
+ "thresholds_kt": [
2352
+ 34,
2353
+ 50,
2354
+ 64
2355
+ ],
2356
+ "quadrant_order": [
2357
+ "NE",
2358
+ "SE",
2359
+ "SW",
2360
+ "NW"
2361
+ ],
2362
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2363
+ "target_wind_averaging_seconds": 60,
2364
+ "validated_wind_averaging_seconds": null,
2365
+ "validated_surface_height_m": null,
2366
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2367
+ "official_scoring_allowed": false
2368
+ },
2369
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2370
+ "estimates": {
2371
+ "wind_estimate_kt": {
2372
+ "mean": 63.40748039592663,
2373
+ "p10": 62.64458505448116,
2374
+ "p90": 64.1836530365077,
2375
+ "valid_members": 50,
2376
+ "total_members": 50
2377
+ },
2378
+ "rmw_persistence_km": {
2379
+ "mean": 129.64000000000001,
2380
+ "p10": 129.64000000000001,
2381
+ "p90": 129.64000000000001,
2382
+ "valid_members": 50,
2383
+ "total_members": 50
2384
+ },
2385
+ "r34_NE_estimate_km": {
2386
+ "mean": 403.81558176044217,
2387
+ "p10": 398.01745763907405,
2388
+ "p90": 409.7188555562515,
2389
+ "valid_members": 50,
2390
+ "total_members": 50
2391
+ },
2392
+ "r34_SE_estimate_km": {
2393
+ "mean": 302.8616863203316,
2394
+ "p10": 298.5130932293055,
2395
+ "p90": 307.2891416671887,
2396
+ "valid_members": 50,
2397
+ "total_members": 50
2398
+ },
2399
+ "r34_SW_estimate_km": {
2400
+ "mean": 246.77618885360351,
2401
+ "p10": 243.23289077943414,
2402
+ "p90": 250.38374506215374,
2403
+ "valid_members": 50,
2404
+ "total_members": 50
2405
+ },
2406
+ "r34_NW_estimate_km": {
2407
+ "mean": 403.81558176044217,
2408
+ "p10": 398.01745763907405,
2409
+ "p90": 409.7188555562515,
2410
+ "valid_members": 50,
2411
+ "total_members": 50
2412
+ },
2413
+ "r50_NE_estimate_km": {
2414
+ "mean": 210.57768248188142,
2415
+ "p10": 205.4153570799172,
2416
+ "p90": 215.8501808195275,
2417
+ "valid_members": 50,
2418
+ "total_members": 50
2419
+ },
2420
+ "r50_SE_estimate_km": {
2421
+ "mean": 181.6443260769586,
2422
+ "p10": 178.5440539879459,
2423
+ "p90": 184.80346690354554,
2424
+ "valid_members": 50,
2425
+ "total_members": 50
2426
+ },
2427
+ "r50_SW_estimate_km": {
2428
+ "mean": 163.50706638213052,
2429
+ "p10": 161.58496701427333,
2430
+ "p90": 165.46245094669337,
2431
+ "valid_members": 50,
2432
+ "total_members": 50
2433
+ },
2434
+ "r50_NW_estimate_km": {
2435
+ "mean": 210.57768248188142,
2436
+ "p10": 205.4153570799172,
2437
+ "p90": 215.8501808195275,
2438
+ "valid_members": 50,
2439
+ "total_members": 50
2440
+ },
2441
+ "r64_NE_estimate_km": {
2442
+ "mean": 28.759122663436948,
2443
+ "p10": 0.0,
2444
+ "p90": 130.4006115049617,
2445
+ "valid_members": 50,
2446
+ "total_members": 50
2447
+ },
2448
+ "r64_SE_estimate_km": {
2449
+ "mean": 28.686175908521808,
2450
+ "p10": 0.0,
2451
+ "p90": 130.1684581389627,
2452
+ "valid_members": 50,
2453
+ "total_members": 50
2454
+ },
2455
+ "r64_SW_estimate_km": {
2456
+ "mean": 28.634436170811686,
2457
+ "p10": 0.0,
2458
+ "p90": 130.00344547309027,
2459
+ "valid_members": 50,
2460
+ "total_members": 50
2461
+ },
2462
+ "r64_NW_estimate_km": {
2463
+ "mean": 28.759122663436948,
2464
+ "p10": 0.0,
2465
+ "p90": 130.4006115049617,
2466
+ "valid_members": 50,
2467
+ "total_members": 50
2468
+ }
2469
+ },
2470
+ "official_scoring_allowed": false
2471
+ }
2472
+ },
2473
+ {
2474
+ "lead_hours": 114,
2475
+ "valid_time_utc": "2025-11-11T18:00:00Z",
2476
+ "summary": {
2477
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2478
+ "members": 50,
2479
+ "definitions": {
2480
+ "units": "km",
2481
+ "quantity_kind": "radius_not_diameter",
2482
+ "thresholds_kt": [
2483
+ 34,
2484
+ 50,
2485
+ 64
2486
+ ],
2487
+ "quadrant_order": [
2488
+ "NE",
2489
+ "SE",
2490
+ "SW",
2491
+ "NW"
2492
+ ],
2493
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2494
+ "target_wind_averaging_seconds": 60,
2495
+ "validated_wind_averaging_seconds": null,
2496
+ "validated_surface_height_m": null,
2497
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2498
+ "official_scoring_allowed": false
2499
+ },
2500
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2501
+ "estimates": {
2502
+ "wind_estimate_kt": {
2503
+ "mean": 59.73267108716112,
2504
+ "p10": 59.01174108362763,
2505
+ "p90": 60.574011441705316,
2506
+ "valid_members": 50,
2507
+ "total_members": 50
2508
+ },
2509
+ "rmw_persistence_km": {
2510
+ "mean": 129.64000000000001,
2511
+ "p10": 129.64000000000001,
2512
+ "p90": 129.64000000000001,
2513
+ "valid_members": 50,
2514
+ "total_members": 50
2515
+ },
2516
+ "r34_NE_estimate_km": {
2517
+ "mean": 376.03627446731474,
2518
+ "p10": 370.6197430728262,
2519
+ "p90": 382.3629551397615,
2520
+ "valid_members": 50,
2521
+ "total_members": 50
2522
+ },
2523
+ "r34_SE_estimate_km": {
2524
+ "mean": 282.02720585048604,
2525
+ "p10": 277.9648073046196,
2526
+ "p90": 286.7722163548211,
2527
+ "valid_members": 50,
2528
+ "total_members": 50
2529
+ },
2530
+ "r34_SW_estimate_km": {
2531
+ "mean": 229.79994550780347,
2532
+ "p10": 226.48984298894933,
2533
+ "p90": 233.66625036318754,
2534
+ "valid_members": 50,
2535
+ "total_members": 50
2536
+ },
2537
+ "r34_NW_estimate_km": {
2538
+ "mean": 376.03627446731474,
2539
+ "p10": 370.6197430728262,
2540
+ "p90": 382.3629551397615,
2541
+ "valid_members": 50,
2542
+ "total_members": 50
2543
+ },
2544
+ "r50_NE_estimate_km": {
2545
+ "mean": 186.4157999798129,
2546
+ "p10": 181.82978521382594,
2547
+ "p90": 191.79273666934725,
2548
+ "valid_members": 50,
2549
+ "total_members": 50
2550
+ },
2551
+ "r50_SE_estimate_km": {
2552
+ "mean": 166.88322587745023,
2553
+ "p10": 164.02554892698654,
2554
+ "p90": 170.22445325280526,
2555
+ "valid_members": 50,
2556
+ "total_members": 50
2557
+ },
2558
+ "r50_SW_estimate_km": {
2559
+ "mean": 154.24253983780523,
2560
+ "p10": 152.42369116519922,
2561
+ "p90": 156.36495613591572,
2562
+ "valid_members": 50,
2563
+ "total_members": 50
2564
+ },
2565
+ "r50_NW_estimate_km": {
2566
+ "mean": 186.4157999798129,
2567
+ "p10": 181.82978521382594,
2568
+ "p90": 191.79273666934725,
2569
+ "valid_members": 50,
2570
+ "total_members": 50
2571
+ },
2572
+ "r64_NE_estimate_km": {
2573
+ "mean": 0.0,
2574
+ "p10": 0.0,
2575
+ "p90": 0.0,
2576
+ "valid_members": 50,
2577
+ "total_members": 50
2578
+ },
2579
+ "r64_SE_estimate_km": {
2580
+ "mean": 0.0,
2581
+ "p10": 0.0,
2582
+ "p90": 0.0,
2583
+ "valid_members": 50,
2584
+ "total_members": 50
2585
+ },
2586
+ "r64_SW_estimate_km": {
2587
+ "mean": 0.0,
2588
+ "p10": 0.0,
2589
+ "p90": 0.0,
2590
+ "valid_members": 50,
2591
+ "total_members": 50
2592
+ },
2593
+ "r64_NW_estimate_km": {
2594
+ "mean": 0.0,
2595
+ "p10": 0.0,
2596
+ "p90": 0.0,
2597
+ "valid_members": 50,
2598
+ "total_members": 50
2599
+ }
2600
+ },
2601
+ "official_scoring_allowed": false
2602
+ }
2603
+ },
2604
+ {
2605
+ "lead_hours": 120,
2606
+ "valid_time_utc": "2025-11-12T00:00:00Z",
2607
+ "summary": {
2608
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2609
+ "members": 50,
2610
+ "definitions": {
2611
+ "units": "km",
2612
+ "quantity_kind": "radius_not_diameter",
2613
+ "thresholds_kt": [
2614
+ 34,
2615
+ 50,
2616
+ 64
2617
+ ],
2618
+ "quadrant_order": [
2619
+ "NE",
2620
+ "SE",
2621
+ "SW",
2622
+ "NW"
2623
+ ],
2624
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2625
+ "target_wind_averaging_seconds": 60,
2626
+ "validated_wind_averaging_seconds": null,
2627
+ "validated_surface_height_m": null,
2628
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2629
+ "official_scoring_allowed": false
2630
+ },
2631
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2632
+ "estimates": {
2633
+ "wind_estimate_kt": {
2634
+ "mean": 57.02301014236325,
2635
+ "p10": 55.856324247617735,
2636
+ "p90": 58.282119630579686,
2637
+ "valid_members": 50,
2638
+ "total_members": 50
2639
+ },
2640
+ "rmw_persistence_km": {
2641
+ "mean": 129.64000000000001,
2642
+ "p10": 129.64000000000001,
2643
+ "p90": 129.64000000000001,
2644
+ "valid_members": 50,
2645
+ "total_members": 50
2646
+ },
2647
+ "r34_NE_estimate_km": {
2648
+ "mean": 355.771255745026,
2649
+ "p10": 347.0858991064369,
2650
+ "p90": 365.1559895455744,
2651
+ "valid_members": 50,
2652
+ "total_members": 50
2653
+ },
2654
+ "r34_SE_estimate_km": {
2655
+ "mean": 266.82844180876947,
2656
+ "p10": 260.3144243298277,
2657
+ "p90": 273.8669921591808,
2658
+ "valid_members": 50,
2659
+ "total_members": 50
2660
+ },
2661
+ "r34_SW_estimate_km": {
2662
+ "mean": 217.41576739973812,
2663
+ "p10": 212.10804945393366,
2664
+ "p90": 223.15088250007324,
2665
+ "valid_members": 50,
2666
+ "total_members": 50
2667
+ },
2668
+ "r34_NW_estimate_km": {
2669
+ "mean": 355.771255745026,
2670
+ "p10": 347.0858991064369,
2671
+ "p90": 365.1559895455744,
2672
+ "valid_members": 50,
2673
+ "total_members": 50
2674
+ },
2675
+ "r50_NE_estimate_km": {
2676
+ "mean": 169.59706117779604,
2677
+ "p10": 162.5330616529634,
2678
+ "p90": 177.27022545832568,
2679
+ "valid_members": 50,
2680
+ "total_members": 50
2681
+ },
2682
+ "r50_SE_estimate_km": {
2683
+ "mean": 156.24867042639428,
2684
+ "p10": 151.71524526138288,
2685
+ "p90": 161.15403982052362,
2686
+ "valid_members": 50,
2687
+ "total_members": 50
2688
+ },
2689
+ "r50_SW_estimate_km": {
2690
+ "mean": 147.40254750153957,
2691
+ "p10": 144.4558776948937,
2692
+ "p90": 150.58219319452962,
2693
+ "valid_members": 50,
2694
+ "total_members": 50
2695
+ },
2696
+ "r50_NW_estimate_km": {
2697
+ "mean": 169.59706117779604,
2698
+ "p10": 162.5330616529634,
2699
+ "p90": 177.27022545832568,
2700
+ "valid_members": 50,
2701
+ "total_members": 50
2702
+ },
2703
+ "r64_NE_estimate_km": {
2704
+ "mean": 0.0,
2705
+ "p10": 0.0,
2706
+ "p90": 0.0,
2707
+ "valid_members": 50,
2708
+ "total_members": 50
2709
+ },
2710
+ "r64_SE_estimate_km": {
2711
+ "mean": 0.0,
2712
+ "p10": 0.0,
2713
+ "p90": 0.0,
2714
+ "valid_members": 50,
2715
+ "total_members": 50
2716
+ },
2717
+ "r64_SW_estimate_km": {
2718
+ "mean": 0.0,
2719
+ "p10": 0.0,
2720
+ "p90": 0.0,
2721
+ "valid_members": 50,
2722
+ "total_members": 50
2723
+ },
2724
+ "r64_NW_estimate_km": {
2725
+ "mean": 0.0,
2726
+ "p10": 0.0,
2727
+ "p90": 0.0,
2728
+ "valid_members": 50,
2729
+ "total_members": 50
2730
+ }
2731
+ },
2732
+ "official_scoring_allowed": false
2733
+ }
2734
+ }
2735
+ ],
2736
+ "official_wind_or_radius_skill_score": null,
2737
+ "physical_50_member_means_verified": true,
2738
+ "observed_plus_zero_alignment_verified": true,
2739
+ "coverage": {
2740
+ "wind_estimate_kt": 20,
2741
+ "rmw_persistence_km": 20,
2742
+ "r34_NE_estimate_km": 20,
2743
+ "r34_SE_estimate_km": 20,
2744
+ "r34_SW_estimate_km": 20,
2745
+ "r34_NW_estimate_km": 20,
2746
+ "r50_NE_estimate_km": 20,
2747
+ "r50_SE_estimate_km": 20,
2748
+ "r50_SW_estimate_km": 20,
2749
+ "r50_NW_estimate_km": 20,
2750
+ "r64_NE_estimate_km": 20,
2751
+ "r64_SE_estimate_km": 20,
2752
+ "r64_SW_estimate_km": 20,
2753
+ "r64_NW_estimate_km": 20
2754
+ },
2755
+ "warning": "Retrospective development examples, not untouched tests. RMW is persistence; no validated wind-period calibration.",
2756
+ "chart": "fung_wong_wind_radius.png",
2757
+ "source_receipt_sha256": "a93ff4c922fb44a0fa1a01178fb052a4bd88a67057a04eb8caca2322632e5730",
2758
+ "source_reference": "Original immutable /Volumes/D member archive; original files unchanged."
2759
+ }
evaluation/storm_structure/fung_wong_wind_radius.png ADDED

Git LFS Details

  • SHA256: 928a9cee4083e75e6a6fdea6c93ed036912d14252708c77e2853c25bb8206066
  • Pointer size: 131 Bytes
  • Size of remote file: 511 kB
evaluation/storm_structure/index.json ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "audited-structure-examples-v1",
3
+ "cases": [
4
+ {
5
+ "slug": "fung_wong",
6
+ "name": "Fung-Wong",
7
+ "storm_id": "2025308N09144",
8
+ "issue_time_utc": "2025-11-07T00:00:00Z",
9
+ "members": 50,
10
+ "image": "fung_wong_wind_radius.png",
11
+ "image_sha256": "928a9cee4083e75e6a6fdea6c93ed036912d14252708c77e2853c25bb8206066",
12
+ "receipt": "fung_wong_structure.json",
13
+ "receipt_sha256": "c396486b37c044d95dfdc2794fbbcaf77923486eea9eb7096e805718d96e34ff",
14
+ "coverage": {
15
+ "wind_estimate_kt": 20,
16
+ "rmw_persistence_km": 20,
17
+ "r34_NE_estimate_km": 20,
18
+ "r34_SE_estimate_km": 20,
19
+ "r34_SW_estimate_km": 20,
20
+ "r34_NW_estimate_km": 20,
21
+ "r50_NE_estimate_km": 20,
22
+ "r50_SE_estimate_km": 20,
23
+ "r50_SW_estimate_km": 20,
24
+ "r50_NW_estimate_km": 20,
25
+ "r64_NE_estimate_km": 20,
26
+ "r64_SE_estimate_km": 20,
27
+ "r64_SW_estimate_km": 20,
28
+ "r64_NW_estimate_km": 20
29
+ },
30
+ "rmw_method": "issue-time persistence, not a future RMW forecast"
31
+ },
32
+ {
33
+ "slug": "soudelor",
34
+ "name": "Soudelor",
35
+ "storm_id": "2015211N13162",
36
+ "issue_time_utc": "2015-08-05T00:00:00Z",
37
+ "members": 50,
38
+ "image": "soudelor_wind_radius.png",
39
+ "image_sha256": "debcd3d202eaa29630b6801426cbef5e0335fdd5fc343878b506aa30ce5d7079",
40
+ "receipt": "soudelor_structure.json",
41
+ "receipt_sha256": "5c5460bc1d890d32180bc3443b6579b31ed78a77b4030c0f9e1a7ee6893a4933",
42
+ "coverage": {
43
+ "wind_estimate_kt": 20,
44
+ "rmw_persistence_km": 20,
45
+ "r34_NE_estimate_km": 20,
46
+ "r34_SE_estimate_km": 20,
47
+ "r34_SW_estimate_km": 20,
48
+ "r34_NW_estimate_km": 20,
49
+ "r50_NE_estimate_km": 20,
50
+ "r50_SE_estimate_km": 20,
51
+ "r50_SW_estimate_km": 20,
52
+ "r50_NW_estimate_km": 20,
53
+ "r64_NE_estimate_km": 20,
54
+ "r64_SE_estimate_km": 20,
55
+ "r64_SW_estimate_km": 20,
56
+ "r64_NW_estimate_km": 20
57
+ },
58
+ "rmw_method": "issue-time persistence, not a future RMW forecast"
59
+ },
60
+ {
61
+ "slug": "mangkhut",
62
+ "name": "Mangkhut",
63
+ "storm_id": "2018250N12170",
64
+ "issue_time_utc": "2018-09-11T00:00:00Z",
65
+ "members": 50,
66
+ "image": "mangkhut_wind_radius.png",
67
+ "image_sha256": "191402447880b4d87d1d13f8a38f3dfbcff4b769852c36c354b6e34419a86805",
68
+ "receipt": "mangkhut_structure.json",
69
+ "receipt_sha256": "2fddc849ace4e3f75f1303e2ea9f9c6f9860024bb0bc25e47098406fb71e019f",
70
+ "coverage": {
71
+ "wind_estimate_kt": 20,
72
+ "rmw_persistence_km": 20,
73
+ "r34_NE_estimate_km": 20,
74
+ "r34_SE_estimate_km": 20,
75
+ "r34_SW_estimate_km": 20,
76
+ "r34_NW_estimate_km": 20,
77
+ "r50_NE_estimate_km": 20,
78
+ "r50_SE_estimate_km": 20,
79
+ "r50_SW_estimate_km": 20,
80
+ "r50_NW_estimate_km": 20,
81
+ "r64_NE_estimate_km": 20,
82
+ "r64_SE_estimate_km": 20,
83
+ "r64_SW_estimate_km": 20,
84
+ "r64_NW_estimate_km": 20
85
+ },
86
+ "rmw_method": "issue-time persistence, not a future RMW forecast"
87
+ },
88
+ {
89
+ "slug": "meranti",
90
+ "name": "Meranti",
91
+ "storm_id": "2016253N13144",
92
+ "issue_time_utc": "2016-09-10T00:00:00Z",
93
+ "members": 50,
94
+ "image": "meranti_wind_radius.png",
95
+ "image_sha256": "416d62f25f01cd3f86e4840b2f0f5bd8e9dbe9964431fe6d87ab15b277457757",
96
+ "receipt": "meranti_structure.json",
97
+ "receipt_sha256": "7d04c28f19c6e98b6c731c2167f1c12afa3c0dccc6b056ecbccc15e44ba3f956",
98
+ "coverage": {
99
+ "wind_estimate_kt": 20,
100
+ "rmw_persistence_km": 20,
101
+ "r34_NE_estimate_km": 20,
102
+ "r34_SE_estimate_km": 20,
103
+ "r34_SW_estimate_km": 20,
104
+ "r34_NW_estimate_km": 20,
105
+ "r50_NE_estimate_km": 20,
106
+ "r50_SE_estimate_km": 20,
107
+ "r50_SW_estimate_km": 20,
108
+ "r50_NW_estimate_km": 20,
109
+ "r64_NE_estimate_km": 20,
110
+ "r64_SE_estimate_km": 20,
111
+ "r64_SW_estimate_km": 20,
112
+ "r64_NW_estimate_km": 20
113
+ },
114
+ "rmw_method": "issue-time persistence, not a future RMW forecast"
115
+ }
116
+ ],
117
+ "source_verification_sha256": "be6ed82657475abc57b778c55167be869cbf03e877a861802671851667eb30e9",
118
+ "overview": "four_storm_wind_candidate.png",
119
+ "overview_sha256": "7b12c38d0885b8c2af050e08ae0d6d94c18167de43d075c20764ca3fd2c0c857",
120
+ "experimental": true,
121
+ "native_radius_skill_claim": false,
122
+ "forecast_weights_changed": false,
123
+ "note": "50 actual member pressure diagnostics. Fung-Wong is a separate fresh replay, not the old MP4 output. RMW is persistence; USA and JMA wind periods stay separate; no radius-skill score."
124
+ }
evaluation/storm_structure/mangkhut_structure.json ADDED
@@ -0,0 +1,2759 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "frozen Trackformer 1.2 pressure + separate experimental structure candidate",
3
+ "method": "pressure-scaled-issue-structure-experimental-v1",
4
+ "storm_id": "2018250N12170",
5
+ "issue_time_utc": "2018-09-11T00:00:00Z",
6
+ "actual_members": 50,
7
+ "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
8
+ "source_file_sha256": {
9
+ "weather-history.npz": "ae33a5f42b3342a41e6567c8bea6f12f8a1175ef62e2dd845a5efc6a2f73b358",
10
+ "model-inputs.npz": "7a180f3ec9f216b5cb8e9e5e1fdebb60bff779586d42054e10477edd23fdfccd",
11
+ "ensemble-members.npz": "5ba1e2325867bc71c48b9f94b8afa02925261e07c175d9c360a71b8334a9f43d",
12
+ "mangkhut_video.npz": "f06c857dc0e7edaa67a2e7262324fa0a9ebad684ce5a8ffa1610c27717c35b71",
13
+ "mangkhut_video.json": "b800cce1e058f134e1796f4e853819233e2daaaa6c5b221317dbcc088887fb8d",
14
+ "mangkhut_coastlines.json": "2af08a831beff87de1847e3c5e34faf29aabcd3965d81ffc18fedc6f18a4076d"
15
+ },
16
+ "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
17
+ "future_labels_used_for_diagnostics": false,
18
+ "initial": {
19
+ "method": "pressure-scaled-issue-structure-experimental-v1",
20
+ "storm_id": "2018250N12170",
21
+ "issue_time_utc": "2018-09-11T00:00:00Z",
22
+ "input_wind_kt": 125.0,
23
+ "input_model_pressure_hpa": 935.0,
24
+ "ambient_pressure_hpa": 1010.5,
25
+ "pressure_deficit_hpa": 75.5,
26
+ "rmw_persistence_km": 9.26,
27
+ "native_quadrant_radii_km": {
28
+ "r34_NE": 333.36,
29
+ "r34_SE": 259.28000000000003,
30
+ "r34_SW": 259.28000000000003,
31
+ "r34_NW": 333.36,
32
+ "r50_NE": 190.756,
33
+ "r50_SE": 144.45600000000002,
34
+ "r50_SW": 144.45600000000002,
35
+ "r50_NW": 190.756,
36
+ "r64_NE": 103.712,
37
+ "r64_SE": 77.784,
38
+ "r64_SW": 77.784,
39
+ "r64_NW": 103.712
40
+ },
41
+ "holland_inspired_tail_b": 2.5,
42
+ "source_agency": "jtwc_wp",
43
+ "source_track_type": "main",
44
+ "usa_reference_center": [
45
+ 13.9,
46
+ 141.2
47
+ ],
48
+ "model_origin": [
49
+ 14.0,
50
+ 141.2
51
+ ],
52
+ "definitions": {
53
+ "units": "km",
54
+ "quantity_kind": "radius_not_diameter",
55
+ "thresholds_kt": [
56
+ 34,
57
+ 50,
58
+ 64
59
+ ],
60
+ "quadrant_order": [
61
+ "NE",
62
+ "SE",
63
+ "SW",
64
+ "NW"
65
+ ],
66
+ "quadrant_statistic": "maximum_extent_within_quadrant",
67
+ "target_wind_averaging_seconds": 60,
68
+ "validated_wind_averaging_seconds": null,
69
+ "validated_surface_height_m": null,
70
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
71
+ "official_scoring_allowed": false
72
+ },
73
+ "mixed_agency_initialization": "USA 1-minute wind/radii; model TOKYO pressure. No conversion between wind periods.",
74
+ "calibration": "none; initialization is issue assimilation, not future-target fitting"
75
+ },
76
+ "initial_ambient": {
77
+ "cells": 27,
78
+ "candidate_cells": 27,
79
+ "quadrant_cells": {
80
+ "NE": 7,
81
+ "SE": 7,
82
+ "SW": 6,
83
+ "NW": 7
84
+ },
85
+ "annulus_km": [
86
+ 600,
87
+ 1000
88
+ ],
89
+ "statistic": "median_available_physical_cells",
90
+ "value_hpa": 1010.5,
91
+ "status": "available"
92
+ },
93
+ "definitions": {
94
+ "units": "km",
95
+ "quantity_kind": "radius_not_diameter",
96
+ "thresholds_kt": [
97
+ 34,
98
+ 50,
99
+ 64
100
+ ],
101
+ "quadrant_order": [
102
+ "NE",
103
+ "SE",
104
+ "SW",
105
+ "NW"
106
+ ],
107
+ "quadrant_statistic": "maximum_extent_within_quadrant",
108
+ "target_wind_averaging_seconds": 60,
109
+ "validated_wind_averaging_seconds": null,
110
+ "validated_surface_height_m": null,
111
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
112
+ "official_scoring_allowed": false
113
+ },
114
+ "points": [
115
+ {
116
+ "lead_hours": 6,
117
+ "valid_time_utc": "2018-09-11T06:00:00Z",
118
+ "summary": {
119
+ "method": "pressure-scaled-issue-structure-experimental-v1",
120
+ "members": 50,
121
+ "definitions": {
122
+ "units": "km",
123
+ "quantity_kind": "radius_not_diameter",
124
+ "thresholds_kt": [
125
+ 34,
126
+ 50,
127
+ 64
128
+ ],
129
+ "quadrant_order": [
130
+ "NE",
131
+ "SE",
132
+ "SW",
133
+ "NW"
134
+ ],
135
+ "quadrant_statistic": "maximum_extent_within_quadrant",
136
+ "target_wind_averaging_seconds": 60,
137
+ "validated_wind_averaging_seconds": null,
138
+ "validated_surface_height_m": null,
139
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
140
+ "official_scoring_allowed": false
141
+ },
142
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
143
+ "estimates": {
144
+ "wind_estimate_kt": {
145
+ "mean": 124.93147449854058,
146
+ "p10": 124.64421904823267,
147
+ "p90": 125.18760498059177,
148
+ "valid_members": 50,
149
+ "total_members": 50
150
+ },
151
+ "rmw_persistence_km": {
152
+ "mean": 9.259999999999998,
153
+ "p10": 9.26,
154
+ "p90": 9.26,
155
+ "valid_members": 50,
156
+ "total_members": 50
157
+ },
158
+ "r34_NE_estimate_km": {
159
+ "mean": 332.99723465971636,
160
+ "p10": 331.98749636900965,
161
+ "p90": 333.76019572775755,
162
+ "valid_members": 50,
163
+ "total_members": 50
164
+ },
165
+ "r34_SE_estimate_km": {
166
+ "mean": 258.97985822232215,
167
+ "p10": 258.16153793139944,
168
+ "p90": 259.5912633438115,
169
+ "valid_members": 50,
170
+ "total_members": 50
171
+ },
172
+ "r34_SW_estimate_km": {
173
+ "mean": 258.97985822232215,
174
+ "p10": 258.16153793139944,
175
+ "p90": 259.5912633438115,
176
+ "valid_members": 50,
177
+ "total_members": 50
178
+ },
179
+ "r34_NW_estimate_km": {
180
+ "mean": 332.99723465971636,
181
+ "p10": 331.98749636900965,
182
+ "p90": 333.76019572775755,
183
+ "valid_members": 50,
184
+ "total_members": 50
185
+ },
186
+ "r50_NE_estimate_km": {
187
+ "mean": 190.4099100496317,
188
+ "p10": 189.41854824243848,
189
+ "p90": 191.1705366706753,
190
+ "valid_members": 50,
191
+ "total_members": 50
192
+ },
193
+ "r50_SE_estimate_km": {
194
+ "mean": 144.1928345597886,
195
+ "p10": 143.42717100740416,
196
+ "p90": 144.78495616397396,
197
+ "valid_members": 50,
198
+ "total_members": 50
199
+ },
200
+ "r50_SW_estimate_km": {
201
+ "mean": 144.1928345597886,
202
+ "p10": 143.42717100740416,
203
+ "p90": 144.78495616397396,
204
+ "valid_members": 50,
205
+ "total_members": 50
206
+ },
207
+ "r50_NW_estimate_km": {
208
+ "mean": 190.4099100496317,
209
+ "p10": 189.41854824243848,
210
+ "p90": 191.1705366706753,
211
+ "valid_members": 50,
212
+ "total_members": 50
213
+ },
214
+ "r64_NE_estimate_km": {
215
+ "mean": 103.45424372408735,
216
+ "p10": 102.65063554307419,
217
+ "p90": 104.09666166615972,
218
+ "valid_members": 50,
219
+ "total_members": 50
220
+ },
221
+ "r64_SE_estimate_km": {
222
+ "mean": 77.62540812134208,
223
+ "p10": 77.08233658009449,
224
+ "p90": 78.07707910569935,
225
+ "valid_members": 50,
226
+ "total_members": 50
227
+ },
228
+ "r64_SW_estimate_km": {
229
+ "mean": 77.62540812134208,
230
+ "p10": 77.08233658009449,
231
+ "p90": 78.07707910569935,
232
+ "valid_members": 50,
233
+ "total_members": 50
234
+ },
235
+ "r64_NW_estimate_km": {
236
+ "mean": 103.45424372408735,
237
+ "p10": 102.65063554307419,
238
+ "p90": 104.09666166615972,
239
+ "valid_members": 50,
240
+ "total_members": 50
241
+ }
242
+ },
243
+ "official_scoring_allowed": false
244
+ }
245
+ },
246
+ {
247
+ "lead_hours": 12,
248
+ "valid_time_utc": "2018-09-11T12:00:00Z",
249
+ "summary": {
250
+ "method": "pressure-scaled-issue-structure-experimental-v1",
251
+ "members": 50,
252
+ "definitions": {
253
+ "units": "km",
254
+ "quantity_kind": "radius_not_diameter",
255
+ "thresholds_kt": [
256
+ 34,
257
+ 50,
258
+ 64
259
+ ],
260
+ "quadrant_order": [
261
+ "NE",
262
+ "SE",
263
+ "SW",
264
+ "NW"
265
+ ],
266
+ "quadrant_statistic": "maximum_extent_within_quadrant",
267
+ "target_wind_averaging_seconds": 60,
268
+ "validated_wind_averaging_seconds": null,
269
+ "validated_surface_height_m": null,
270
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
271
+ "official_scoring_allowed": false
272
+ },
273
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
274
+ "estimates": {
275
+ "wind_estimate_kt": {
276
+ "mean": 128.73783903728472,
277
+ "p10": 128.40750626074995,
278
+ "p90": 129.0816245135852,
279
+ "valid_members": 50,
280
+ "total_members": 50
281
+ },
282
+ "rmw_persistence_km": {
283
+ "mean": 9.259999999999998,
284
+ "p10": 9.26,
285
+ "p90": 9.26,
286
+ "valid_members": 50,
287
+ "total_members": 50
288
+ },
289
+ "r34_NE_estimate_km": {
290
+ "mean": 341.3110082936861,
291
+ "p10": 340.6103232715561,
292
+ "p90": 342.04009218596826,
293
+ "valid_members": 50,
294
+ "total_members": 50
295
+ },
296
+ "r34_SE_estimate_km": {
297
+ "mean": 265.4641175617558,
298
+ "p10": 264.9191403223215,
299
+ "p90": 266.03118281130867,
300
+ "valid_members": 50,
301
+ "total_members": 50
302
+ },
303
+ "r34_SW_estimate_km": {
304
+ "mean": 265.4641175617558,
305
+ "p10": 264.9191403223215,
306
+ "p90": 266.03118281130867,
307
+ "valid_members": 50,
308
+ "total_members": 50
309
+ },
310
+ "r34_NW_estimate_km": {
311
+ "mean": 341.3110082936861,
312
+ "p10": 340.6103232715561,
313
+ "p90": 342.04009218596826,
314
+ "valid_members": 50,
315
+ "total_members": 50
316
+ },
317
+ "r50_NE_estimate_km": {
318
+ "mean": 199.0676606492576,
319
+ "p10": 198.3284518323189,
320
+ "p90": 199.83729534128398,
321
+ "valid_members": 50,
322
+ "total_members": 50
323
+ },
324
+ "r50_SE_estimate_km": {
325
+ "mean": 151.0582022323462,
326
+ "p10": 150.4704518666519,
327
+ "p90": 151.67018404485447,
328
+ "valid_members": 50,
329
+ "total_members": 50
330
+ },
331
+ "r50_SW_estimate_km": {
332
+ "mean": 151.0582022323462,
333
+ "p10": 150.4704518666519,
334
+ "p90": 151.67018404485447,
335
+ "valid_members": 50,
336
+ "total_members": 50
337
+ },
338
+ "r50_NW_estimate_km": {
339
+ "mean": 199.0676606492576,
340
+ "p10": 198.3284518323189,
341
+ "p90": 199.83729534128398,
342
+ "valid_members": 50,
343
+ "total_members": 50
344
+ },
345
+ "r64_NE_estimate_km": {
346
+ "mean": 111.53728519967342,
347
+ "p10": 110.83124848274016,
348
+ "p90": 112.27308434334473,
349
+ "valid_members": 50,
350
+ "total_members": 50
351
+ },
352
+ "r64_SE_estimate_km": {
353
+ "mean": 83.74951783054074,
354
+ "p10": 83.21098262958783,
355
+ "p90": 84.31077509538117,
356
+ "valid_members": 50,
357
+ "total_members": 50
358
+ },
359
+ "r64_SW_estimate_km": {
360
+ "mean": 83.74951783054074,
361
+ "p10": 83.21098262958783,
362
+ "p90": 84.31077509538117,
363
+ "valid_members": 50,
364
+ "total_members": 50
365
+ },
366
+ "r64_NW_estimate_km": {
367
+ "mean": 111.53728519967342,
368
+ "p10": 110.83124848274016,
369
+ "p90": 112.27308434334473,
370
+ "valid_members": 50,
371
+ "total_members": 50
372
+ }
373
+ },
374
+ "official_scoring_allowed": false
375
+ }
376
+ },
377
+ {
378
+ "lead_hours": 18,
379
+ "valid_time_utc": "2018-09-11T18:00:00Z",
380
+ "summary": {
381
+ "method": "pressure-scaled-issue-structure-experimental-v1",
382
+ "members": 50,
383
+ "definitions": {
384
+ "units": "km",
385
+ "quantity_kind": "radius_not_diameter",
386
+ "thresholds_kt": [
387
+ 34,
388
+ 50,
389
+ 64
390
+ ],
391
+ "quadrant_order": [
392
+ "NE",
393
+ "SE",
394
+ "SW",
395
+ "NW"
396
+ ],
397
+ "quadrant_statistic": "maximum_extent_within_quadrant",
398
+ "target_wind_averaging_seconds": 60,
399
+ "validated_wind_averaging_seconds": null,
400
+ "validated_surface_height_m": null,
401
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
402
+ "official_scoring_allowed": false
403
+ },
404
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
405
+ "estimates": {
406
+ "wind_estimate_kt": {
407
+ "mean": 132.15334713434663,
408
+ "p10": 131.82348067606188,
409
+ "p90": 132.60378438940833,
410
+ "valid_members": 50,
411
+ "total_members": 50
412
+ },
413
+ "rmw_persistence_km": {
414
+ "mean": 9.259999999999998,
415
+ "p10": 9.26,
416
+ "p90": 9.26,
417
+ "valid_members": 50,
418
+ "total_members": 50
419
+ },
420
+ "r34_NE_estimate_km": {
421
+ "mean": 348.53611871398965,
422
+ "p10": 347.8401332495696,
423
+ "p90": 349.486345017306,
424
+ "valid_members": 50,
425
+ "total_members": 50
426
+ },
427
+ "r34_SE_estimate_km": {
428
+ "mean": 271.0836478886586,
429
+ "p10": 270.5423258607764,
430
+ "p90": 271.822712791238,
431
+ "valid_members": 50,
432
+ "total_members": 50
433
+ },
434
+ "r34_SW_estimate_km": {
435
+ "mean": 271.0836478886586,
436
+ "p10": 270.5423258607764,
437
+ "p90": 271.822712791238,
438
+ "valid_members": 50,
439
+ "total_members": 50
440
+ },
441
+ "r34_NW_estimate_km": {
442
+ "mean": 348.53611871398965,
443
+ "p10": 347.8401332495696,
444
+ "p90": 349.486345017306,
445
+ "valid_members": 50,
446
+ "total_members": 50
447
+ },
448
+ "r50_NE_estimate_km": {
449
+ "mean": 206.75753124301048,
450
+ "p10": 206.01053248170447,
451
+ "p90": 207.7779324221413,
452
+ "valid_members": 50,
453
+ "total_members": 50
454
+ },
455
+ "r50_SE_estimate_km": {
456
+ "mean": 157.17825414478838,
457
+ "p10": 156.58321549476682,
458
+ "p90": 157.99112249839226,
459
+ "valid_members": 50,
460
+ "total_members": 50
461
+ },
462
+ "r50_SW_estimate_km": {
463
+ "mean": 157.17825414478838,
464
+ "p10": 156.58321549476682,
465
+ "p90": 157.99112249839226,
466
+ "valid_members": 50,
467
+ "total_members": 50
468
+ },
469
+ "r50_NW_estimate_km": {
470
+ "mean": 206.75753124301048,
471
+ "p10": 206.01053248170447,
472
+ "p90": 207.7779324221413,
473
+ "valid_members": 50,
474
+ "total_members": 50
475
+ },
476
+ "r64_NE_estimate_km": {
477
+ "mean": 118.98532585243049,
478
+ "p10": 118.25221517932258,
479
+ "p90": 119.98757087944666,
480
+ "valid_members": 50,
481
+ "total_members": 50
482
+ },
483
+ "r64_SE_estimate_km": {
484
+ "mean": 89.43361893214677,
485
+ "p10": 88.87385066252693,
486
+ "p90": 90.19890918283993,
487
+ "valid_members": 50,
488
+ "total_members": 50
489
+ },
490
+ "r64_SW_estimate_km": {
491
+ "mean": 89.43361893214677,
492
+ "p10": 88.87385066252693,
493
+ "p90": 90.19890918283993,
494
+ "valid_members": 50,
495
+ "total_members": 50
496
+ },
497
+ "r64_NW_estimate_km": {
498
+ "mean": 118.98532585243049,
499
+ "p10": 118.25221517932258,
500
+ "p90": 119.98757087944666,
501
+ "valid_members": 50,
502
+ "total_members": 50
503
+ }
504
+ },
505
+ "official_scoring_allowed": false
506
+ }
507
+ },
508
+ {
509
+ "lead_hours": 24,
510
+ "valid_time_utc": "2018-09-12T00:00:00Z",
511
+ "summary": {
512
+ "method": "pressure-scaled-issue-structure-experimental-v1",
513
+ "members": 50,
514
+ "definitions": {
515
+ "units": "km",
516
+ "quantity_kind": "radius_not_diameter",
517
+ "thresholds_kt": [
518
+ 34,
519
+ 50,
520
+ 64
521
+ ],
522
+ "quadrant_order": [
523
+ "NE",
524
+ "SE",
525
+ "SW",
526
+ "NW"
527
+ ],
528
+ "quadrant_statistic": "maximum_extent_within_quadrant",
529
+ "target_wind_averaging_seconds": 60,
530
+ "validated_wind_averaging_seconds": null,
531
+ "validated_surface_height_m": null,
532
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
533
+ "official_scoring_allowed": false
534
+ },
535
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
536
+ "estimates": {
537
+ "wind_estimate_kt": {
538
+ "mean": 137.21487789234433,
539
+ "p10": 136.80203254846117,
540
+ "p90": 137.6779815789494,
541
+ "valid_members": 50,
542
+ "total_members": 50
543
+ },
544
+ "rmw_persistence_km": {
545
+ "mean": 9.259999999999998,
546
+ "p10": 9.26,
547
+ "p90": 9.26,
548
+ "valid_members": 50,
549
+ "total_members": 50
550
+ },
551
+ "r34_NE_estimate_km": {
552
+ "mean": 359.17507187577553,
553
+ "p10": 358.310485114441,
554
+ "p90": 360.1447329188505,
555
+ "valid_members": 50,
556
+ "total_members": 50
557
+ },
558
+ "r34_SE_estimate_km": {
559
+ "mean": 279.35838923671434,
560
+ "p10": 278.6859328667875,
561
+ "p90": 280.11257004799484,
562
+ "valid_members": 50,
563
+ "total_members": 50
564
+ },
565
+ "r34_SW_estimate_km": {
566
+ "mean": 279.35838923671434,
567
+ "p10": 278.6859328667875,
568
+ "p90": 280.11257004799484,
569
+ "valid_members": 50,
570
+ "total_members": 50
571
+ },
572
+ "r34_NW_estimate_km": {
573
+ "mean": 359.17507187577553,
574
+ "p10": 358.310485114441,
575
+ "p90": 360.1447329188505,
576
+ "valid_members": 50,
577
+ "total_members": 50
578
+ },
579
+ "r50_NE_estimate_km": {
580
+ "mean": 218.3173629319886,
581
+ "p10": 217.36671505642187,
582
+ "p90": 219.3841759893994,
583
+ "valid_members": 50,
584
+ "total_members": 50
585
+ },
586
+ "r50_SE_estimate_km": {
587
+ "mean": 166.3986268544886,
588
+ "p10": 165.63940787812362,
589
+ "p90": 167.25067317787136,
590
+ "valid_members": 50,
591
+ "total_members": 50
592
+ },
593
+ "r50_SW_estimate_km": {
594
+ "mean": 166.3986268544886,
595
+ "p10": 165.63940787812362,
596
+ "p90": 167.25067317787136,
597
+ "valid_members": 50,
598
+ "total_members": 50
599
+ },
600
+ "r50_NW_estimate_km": {
601
+ "mean": 218.3173629319886,
602
+ "p10": 217.36671505642187,
603
+ "p90": 219.3841759893994,
604
+ "valid_members": 50,
605
+ "total_members": 50
606
+ },
607
+ "r64_NE_estimate_km": {
608
+ "mean": 130.55327153511286,
609
+ "p10": 129.5840684315638,
610
+ "p90": 131.64192338431465,
611
+ "valid_members": 50,
612
+ "total_members": 50
613
+ },
614
+ "r64_SE_estimate_km": {
615
+ "mean": 98.2729655915208,
616
+ "p10": 97.5318469268281,
617
+ "p90": 99.10545269060076,
618
+ "valid_members": 50,
619
+ "total_members": 50
620
+ },
621
+ "r64_SW_estimate_km": {
622
+ "mean": 98.2729655915208,
623
+ "p10": 97.5318469268281,
624
+ "p90": 99.10545269060076,
625
+ "valid_members": 50,
626
+ "total_members": 50
627
+ },
628
+ "r64_NW_estimate_km": {
629
+ "mean": 130.55327153511286,
630
+ "p10": 129.5840684315638,
631
+ "p90": 131.64192338431465,
632
+ "valid_members": 50,
633
+ "total_members": 50
634
+ }
635
+ },
636
+ "official_scoring_allowed": false
637
+ }
638
+ },
639
+ {
640
+ "lead_hours": 30,
641
+ "valid_time_utc": "2018-09-12T06:00:00Z",
642
+ "summary": {
643
+ "method": "pressure-scaled-issue-structure-experimental-v1",
644
+ "members": 50,
645
+ "definitions": {
646
+ "units": "km",
647
+ "quantity_kind": "radius_not_diameter",
648
+ "thresholds_kt": [
649
+ 34,
650
+ 50,
651
+ 64
652
+ ],
653
+ "quadrant_order": [
654
+ "NE",
655
+ "SE",
656
+ "SW",
657
+ "NW"
658
+ ],
659
+ "quadrant_statistic": "maximum_extent_within_quadrant",
660
+ "target_wind_averaging_seconds": 60,
661
+ "validated_wind_averaging_seconds": null,
662
+ "validated_surface_height_m": null,
663
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
664
+ "official_scoring_allowed": false
665
+ },
666
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
667
+ "estimates": {
668
+ "wind_estimate_kt": {
669
+ "mean": 141.43899894083185,
670
+ "p10": 141.04286464699516,
671
+ "p90": 141.8516422262894,
672
+ "valid_members": 50,
673
+ "total_members": 50
674
+ },
675
+ "rmw_persistence_km": {
676
+ "mean": 9.259999999999998,
677
+ "p10": 9.26,
678
+ "p90": 9.26,
679
+ "valid_members": 50,
680
+ "total_members": 50
681
+ },
682
+ "r34_NE_estimate_km": {
683
+ "mean": 367.9938768887078,
684
+ "p10": 367.1693086382632,
685
+ "p90": 368.8527013040615,
686
+ "valid_members": 50,
687
+ "total_members": 50
688
+ },
689
+ "r34_SE_estimate_km": {
690
+ "mean": 286.21745980232834,
691
+ "p10": 285.5761289408714,
692
+ "p90": 286.88543434760345,
693
+ "valid_members": 50,
694
+ "total_members": 50
695
+ },
696
+ "r34_SW_estimate_km": {
697
+ "mean": 286.21745980232834,
698
+ "p10": 285.5761289408714,
699
+ "p90": 286.88543434760345,
700
+ "valid_members": 50,
701
+ "total_members": 50
702
+ },
703
+ "r34_NW_estimate_km": {
704
+ "mean": 367.9938768887078,
705
+ "p10": 367.1693086382632,
706
+ "p90": 368.8527013040615,
707
+ "valid_members": 50,
708
+ "total_members": 50
709
+ },
710
+ "r50_NE_estimate_km": {
711
+ "mean": 228.112016277862,
712
+ "p10": 227.18737256590182,
713
+ "p90": 229.07546539778238,
714
+ "valid_members": 50,
715
+ "total_members": 50
716
+ },
717
+ "r50_SE_estimate_km": {
718
+ "mean": 174.22939736344492,
719
+ "p10": 173.48939209742443,
720
+ "p90": 175.0004926538841,
721
+ "valid_members": 50,
722
+ "total_members": 50
723
+ },
724
+ "r50_SW_estimate_km": {
725
+ "mean": 174.22939736344492,
726
+ "p10": 173.48939209742443,
727
+ "p90": 175.0004926538841,
728
+ "valid_members": 50,
729
+ "total_members": 50
730
+ },
731
+ "r50_NW_estimate_km": {
732
+ "mean": 228.112016277862,
733
+ "p10": 227.18737256590182,
734
+ "p90": 229.07546539778238,
735
+ "valid_members": 50,
736
+ "total_members": 50
737
+ },
738
+ "r64_NE_estimate_km": {
739
+ "mean": 140.6994543537905,
740
+ "p10": 139.7270828516435,
741
+ "p90": 141.71328339734353,
742
+ "valid_members": 50,
743
+ "total_members": 50
744
+ },
745
+ "r64_SE_estimate_km": {
746
+ "mean": 106.03617959562942,
747
+ "p10": 105.29175412337868,
748
+ "p90": 106.8123630566402,
749
+ "valid_members": 50,
750
+ "total_members": 50
751
+ },
752
+ "r64_SW_estimate_km": {
753
+ "mean": 106.03617959562942,
754
+ "p10": 105.29175412337868,
755
+ "p90": 106.8123630566402,
756
+ "valid_members": 50,
757
+ "total_members": 50
758
+ },
759
+ "r64_NW_estimate_km": {
760
+ "mean": 140.6994543537905,
761
+ "p10": 139.7270828516435,
762
+ "p90": 141.71328339734353,
763
+ "valid_members": 50,
764
+ "total_members": 50
765
+ }
766
+ },
767
+ "official_scoring_allowed": false
768
+ }
769
+ },
770
+ {
771
+ "lead_hours": 36,
772
+ "valid_time_utc": "2018-09-12T12:00:00Z",
773
+ "summary": {
774
+ "method": "pressure-scaled-issue-structure-experimental-v1",
775
+ "members": 50,
776
+ "definitions": {
777
+ "units": "km",
778
+ "quantity_kind": "radius_not_diameter",
779
+ "thresholds_kt": [
780
+ 34,
781
+ 50,
782
+ 64
783
+ ],
784
+ "quadrant_order": [
785
+ "NE",
786
+ "SE",
787
+ "SW",
788
+ "NW"
789
+ ],
790
+ "quadrant_statistic": "maximum_extent_within_quadrant",
791
+ "target_wind_averaging_seconds": 60,
792
+ "validated_wind_averaging_seconds": null,
793
+ "validated_surface_height_m": null,
794
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
795
+ "official_scoring_allowed": false
796
+ },
797
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
798
+ "estimates": {
799
+ "wind_estimate_kt": {
800
+ "mean": 145.91003164190727,
801
+ "p10": 145.4290224729581,
802
+ "p90": 146.40363220321663,
803
+ "valid_members": 50,
804
+ "total_members": 50
805
+ },
806
+ "rmw_persistence_km": {
807
+ "mean": 9.259999999999998,
808
+ "p10": 9.26,
809
+ "p90": 9.26,
810
+ "valid_members": 50,
811
+ "total_members": 50
812
+ },
813
+ "r34_NE_estimate_km": {
814
+ "mean": 377.27090149052026,
815
+ "p10": 376.2758495763074,
816
+ "p90": 378.29182680845025,
817
+ "valid_members": 50,
818
+ "total_members": 50
819
+ },
820
+ "r34_SE_estimate_km": {
821
+ "mean": 293.4329233815157,
822
+ "p10": 292.6589941149058,
823
+ "p90": 294.2269764065724,
824
+ "valid_members": 50,
825
+ "total_members": 50
826
+ },
827
+ "r34_SW_estimate_km": {
828
+ "mean": 293.4329233815157,
829
+ "p10": 292.6589941149058,
830
+ "p90": 294.2269764065724,
831
+ "valid_members": 50,
832
+ "total_members": 50
833
+ },
834
+ "r34_NW_estimate_km": {
835
+ "mean": 377.27090149052026,
836
+ "p10": 376.2758495763074,
837
+ "p90": 378.29182680845025,
838
+ "valid_members": 50,
839
+ "total_members": 50
840
+ },
841
+ "r50_NE_estimate_km": {
842
+ "mean": 238.62291796234786,
843
+ "p10": 237.48448477926712,
844
+ "p90": 239.79159784548992,
845
+ "valid_members": 50,
846
+ "total_members": 50
847
+ },
848
+ "r50_SE_estimate_km": {
849
+ "mean": 182.65072943467752,
850
+ "p10": 181.737668176001,
851
+ "p90": 183.58810492316053,
852
+ "valid_members": 50,
853
+ "total_members": 50
854
+ },
855
+ "r50_SW_estimate_km": {
856
+ "mean": 182.65072943467752,
857
+ "p10": 181.737668176001,
858
+ "p90": 183.58810492316053,
859
+ "valid_members": 50,
860
+ "total_members": 50
861
+ },
862
+ "r50_NW_estimate_km": {
863
+ "mean": 238.62291796234786,
864
+ "p10": 237.48448477926712,
865
+ "p90": 239.79159784548992,
866
+ "valid_members": 50,
867
+ "total_members": 50
868
+ },
869
+ "r64_NE_estimate_km": {
870
+ "mean": 151.93514486209494,
871
+ "p10": 150.69946008119337,
872
+ "p90": 153.20476608692678,
873
+ "valid_members": 50,
874
+ "total_members": 50
875
+ },
876
+ "r64_SE_estimate_km": {
877
+ "mean": 114.64337708774629,
878
+ "p10": 113.69621682193761,
879
+ "p90": 115.6165823780084,
880
+ "valid_members": 50,
881
+ "total_members": 50
882
+ },
883
+ "r64_SW_estimate_km": {
884
+ "mean": 114.64337708774629,
885
+ "p10": 113.69621682193761,
886
+ "p90": 115.6165823780084,
887
+ "valid_members": 50,
888
+ "total_members": 50
889
+ },
890
+ "r64_NW_estimate_km": {
891
+ "mean": 151.93514486209494,
892
+ "p10": 150.69946008119337,
893
+ "p90": 153.20476608692678,
894
+ "valid_members": 50,
895
+ "total_members": 50
896
+ }
897
+ },
898
+ "official_scoring_allowed": false
899
+ }
900
+ },
901
+ {
902
+ "lead_hours": 42,
903
+ "valid_time_utc": "2018-09-12T18:00:00Z",
904
+ "summary": {
905
+ "method": "pressure-scaled-issue-structure-experimental-v1",
906
+ "members": 50,
907
+ "definitions": {
908
+ "units": "km",
909
+ "quantity_kind": "radius_not_diameter",
910
+ "thresholds_kt": [
911
+ 34,
912
+ 50,
913
+ 64
914
+ ],
915
+ "quadrant_order": [
916
+ "NE",
917
+ "SE",
918
+ "SW",
919
+ "NW"
920
+ ],
921
+ "quadrant_statistic": "maximum_extent_within_quadrant",
922
+ "target_wind_averaging_seconds": 60,
923
+ "validated_wind_averaging_seconds": null,
924
+ "validated_surface_height_m": null,
925
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
926
+ "official_scoring_allowed": false
927
+ },
928
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
929
+ "estimates": {
930
+ "wind_estimate_kt": {
931
+ "mean": 147.44424269524322,
932
+ "p10": 146.86403131520933,
933
+ "p90": 147.9971794328685,
934
+ "valid_members": 50,
935
+ "total_members": 50
936
+ },
937
+ "rmw_persistence_km": {
938
+ "mean": 9.259999999999998,
939
+ "p10": 9.26,
940
+ "p90": 9.26,
941
+ "valid_members": 50,
942
+ "total_members": 50
943
+ },
944
+ "r34_NE_estimate_km": {
945
+ "mean": 380.4410205719955,
946
+ "p10": 379.243225171309,
947
+ "p90": 381.58230504343413,
948
+ "valid_members": 50,
949
+ "total_members": 50
950
+ },
951
+ "r34_SE_estimate_km": {
952
+ "mean": 295.8985715559965,
953
+ "p10": 294.96695291101815,
954
+ "p90": 296.78623725600437,
955
+ "valid_members": 50,
956
+ "total_members": 50
957
+ },
958
+ "r34_SW_estimate_km": {
959
+ "mean": 295.8985715559965,
960
+ "p10": 294.96695291101815,
961
+ "p90": 296.78623725600437,
962
+ "valid_members": 50,
963
+ "total_members": 50
964
+ },
965
+ "r34_NW_estimate_km": {
966
+ "mean": 380.4410205719955,
967
+ "p10": 379.243225171309,
968
+ "p90": 381.58230504343413,
969
+ "valid_members": 50,
970
+ "total_members": 50
971
+ },
972
+ "r50_NE_estimate_km": {
973
+ "mean": 242.26343568135474,
974
+ "p10": 240.88386191402117,
975
+ "p90": 243.5786872439063,
976
+ "valid_members": 50,
977
+ "total_members": 50
978
+ },
979
+ "r50_SE_estimate_km": {
980
+ "mean": 185.5717159935343,
981
+ "p10": 184.4644613759511,
982
+ "p90": 186.6274110192217,
983
+ "valid_members": 50,
984
+ "total_members": 50
985
+ },
986
+ "r50_SW_estimate_km": {
987
+ "mean": 185.5717159935343,
988
+ "p10": 184.4644613759511,
989
+ "p90": 186.6274110192217,
990
+ "valid_members": 50,
991
+ "total_members": 50
992
+ },
993
+ "r50_NW_estimate_km": {
994
+ "mean": 242.26343568135474,
995
+ "p10": 240.88386191402117,
996
+ "p90": 243.5786872439063,
997
+ "valid_members": 50,
998
+ "total_members": 50
999
+ },
1000
+ "r64_NE_estimate_km": {
1001
+ "mean": 155.9101043445628,
1002
+ "p10": 154.39682563067723,
1003
+ "p90": 157.35415749436348,
1004
+ "valid_members": 50,
1005
+ "total_members": 50
1006
+ },
1007
+ "r64_SE_estimate_km": {
1008
+ "mean": 117.69090086777754,
1009
+ "p10": 116.53049474411512,
1010
+ "p90": 118.79826298033286,
1011
+ "valid_members": 50,
1012
+ "total_members": 50
1013
+ },
1014
+ "r64_SW_estimate_km": {
1015
+ "mean": 117.69090086777754,
1016
+ "p10": 116.53049474411512,
1017
+ "p90": 118.79826298033286,
1018
+ "valid_members": 50,
1019
+ "total_members": 50
1020
+ },
1021
+ "r64_NW_estimate_km": {
1022
+ "mean": 155.9101043445628,
1023
+ "p10": 154.39682563067723,
1024
+ "p90": 157.35415749436348,
1025
+ "valid_members": 50,
1026
+ "total_members": 50
1027
+ }
1028
+ },
1029
+ "official_scoring_allowed": false
1030
+ }
1031
+ },
1032
+ {
1033
+ "lead_hours": 48,
1034
+ "valid_time_utc": "2018-09-13T00:00:00Z",
1035
+ "summary": {
1036
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1037
+ "members": 50,
1038
+ "definitions": {
1039
+ "units": "km",
1040
+ "quantity_kind": "radius_not_diameter",
1041
+ "thresholds_kt": [
1042
+ 34,
1043
+ 50,
1044
+ 64
1045
+ ],
1046
+ "quadrant_order": [
1047
+ "NE",
1048
+ "SE",
1049
+ "SW",
1050
+ "NW"
1051
+ ],
1052
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1053
+ "target_wind_averaging_seconds": 60,
1054
+ "validated_wind_averaging_seconds": null,
1055
+ "validated_surface_height_m": null,
1056
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1057
+ "official_scoring_allowed": false
1058
+ },
1059
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1060
+ "estimates": {
1061
+ "wind_estimate_kt": {
1062
+ "mean": 145.5623561260469,
1063
+ "p10": 144.74786025594707,
1064
+ "p90": 146.25124291638286,
1065
+ "valid_members": 50,
1066
+ "total_members": 50
1067
+ },
1068
+ "rmw_persistence_km": {
1069
+ "mean": 9.259999999999998,
1070
+ "p10": 9.26,
1071
+ "p90": 9.26,
1072
+ "valid_members": 50,
1073
+ "total_members": 50
1074
+ },
1075
+ "r34_NE_estimate_km": {
1076
+ "mean": 376.5513389646339,
1077
+ "p10": 374.86526364754,
1078
+ "p90": 377.9767871473718,
1079
+ "valid_members": 50,
1080
+ "total_members": 50
1081
+ },
1082
+ "r34_SE_estimate_km": {
1083
+ "mean": 292.87326363915975,
1084
+ "p10": 291.5618717258645,
1085
+ "p90": 293.98194555906696,
1086
+ "valid_members": 50,
1087
+ "total_members": 50
1088
+ },
1089
+ "r34_SW_estimate_km": {
1090
+ "mean": 292.87326363915975,
1091
+ "p10": 291.5618717258645,
1092
+ "p90": 293.98194555906696,
1093
+ "valid_members": 50,
1094
+ "total_members": 50
1095
+ },
1096
+ "r34_NW_estimate_km": {
1097
+ "mean": 376.5513389646339,
1098
+ "p10": 374.86526364754,
1099
+ "p90": 377.9767871473718,
1100
+ "valid_members": 50,
1101
+ "total_members": 50
1102
+ },
1103
+ "r50_NE_estimate_km": {
1104
+ "mean": 237.8009083112406,
1105
+ "p10": 235.87612538383632,
1106
+ "p90": 239.4304055930547,
1107
+ "valid_members": 50,
1108
+ "total_members": 50
1109
+ },
1110
+ "r50_SE_estimate_km": {
1111
+ "mean": 181.99155628096148,
1112
+ "p10": 180.44818003040962,
1113
+ "p90": 183.29835172492378,
1114
+ "valid_members": 50,
1115
+ "total_members": 50
1116
+ },
1117
+ "r50_SW_estimate_km": {
1118
+ "mean": 181.99155628096148,
1119
+ "p10": 180.44818003040962,
1120
+ "p90": 183.29835172492378,
1121
+ "valid_members": 50,
1122
+ "total_members": 50
1123
+ },
1124
+ "r50_NW_estimate_km": {
1125
+ "mean": 237.8009083112406,
1126
+ "p10": 235.87612538383632,
1127
+ "p90": 239.4304055930547,
1128
+ "valid_members": 50,
1129
+ "total_members": 50
1130
+ },
1131
+ "r64_NE_estimate_km": {
1132
+ "mean": 151.04502115028217,
1133
+ "p10": 148.96305318856744,
1134
+ "p90": 152.81142007057016,
1135
+ "valid_members": 50,
1136
+ "total_members": 50
1137
+ },
1138
+ "r64_SE_estimate_km": {
1139
+ "mean": 113.96115326604706,
1140
+ "p10": 112.3655237926283,
1141
+ "p90": 115.31504194565944,
1142
+ "valid_members": 50,
1143
+ "total_members": 50
1144
+ },
1145
+ "r64_SW_estimate_km": {
1146
+ "mean": 113.96115326604706,
1147
+ "p10": 112.3655237926283,
1148
+ "p90": 115.31504194565944,
1149
+ "valid_members": 50,
1150
+ "total_members": 50
1151
+ },
1152
+ "r64_NW_estimate_km": {
1153
+ "mean": 151.04502115028217,
1154
+ "p10": 148.96305318856744,
1155
+ "p90": 152.81142007057016,
1156
+ "valid_members": 50,
1157
+ "total_members": 50
1158
+ }
1159
+ },
1160
+ "official_scoring_allowed": false
1161
+ }
1162
+ },
1163
+ {
1164
+ "lead_hours": 54,
1165
+ "valid_time_utc": "2018-09-13T06:00:00Z",
1166
+ "summary": {
1167
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1168
+ "members": 50,
1169
+ "definitions": {
1170
+ "units": "km",
1171
+ "quantity_kind": "radius_not_diameter",
1172
+ "thresholds_kt": [
1173
+ 34,
1174
+ 50,
1175
+ 64
1176
+ ],
1177
+ "quadrant_order": [
1178
+ "NE",
1179
+ "SE",
1180
+ "SW",
1181
+ "NW"
1182
+ ],
1183
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1184
+ "target_wind_averaging_seconds": 60,
1185
+ "validated_wind_averaging_seconds": null,
1186
+ "validated_surface_height_m": null,
1187
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1188
+ "official_scoring_allowed": false
1189
+ },
1190
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1191
+ "estimates": {
1192
+ "wind_estimate_kt": {
1193
+ "mean": 144.40687543434834,
1194
+ "p10": 143.6493088012756,
1195
+ "p90": 145.09643133723452,
1196
+ "valid_members": 50,
1197
+ "total_members": 50
1198
+ },
1199
+ "rmw_persistence_km": {
1200
+ "mean": 9.259999999999998,
1201
+ "p10": 9.26,
1202
+ "p90": 9.26,
1203
+ "valid_members": 50,
1204
+ "total_members": 50
1205
+ },
1206
+ "r34_NE_estimate_km": {
1207
+ "mean": 374.15820317097314,
1208
+ "p10": 372.58752439623834,
1209
+ "p90": 375.58726807674844,
1210
+ "valid_members": 50,
1211
+ "total_members": 50
1212
+ },
1213
+ "r34_SE_estimate_km": {
1214
+ "mean": 291.01193579964576,
1215
+ "p10": 289.7902967526299,
1216
+ "p90": 292.12343072635997,
1217
+ "valid_members": 50,
1218
+ "total_members": 50
1219
+ },
1220
+ "r34_SW_estimate_km": {
1221
+ "mean": 291.01193579964576,
1222
+ "p10": 289.7902967526299,
1223
+ "p90": 292.12343072635997,
1224
+ "valid_members": 50,
1225
+ "total_members": 50
1226
+ },
1227
+ "r34_NW_estimate_km": {
1228
+ "mean": 374.15820317097314,
1229
+ "p10": 372.58752439623834,
1230
+ "p90": 375.58726807674844,
1231
+ "valid_members": 50,
1232
+ "total_members": 50
1233
+ },
1234
+ "r50_NE_estimate_km": {
1235
+ "mean": 235.07336370403848,
1236
+ "p10": 233.28935969473136,
1237
+ "p90": 236.69874902431843,
1238
+ "valid_members": 50,
1239
+ "total_members": 50
1240
+ },
1241
+ "r50_SE_estimate_km": {
1242
+ "mean": 179.80486657321165,
1243
+ "p10": 178.3751466245668,
1244
+ "p90": 181.10765901713006,
1245
+ "valid_members": 50,
1246
+ "total_members": 50
1247
+ },
1248
+ "r50_SW_estimate_km": {
1249
+ "mean": 179.80486657321165,
1250
+ "p10": 178.3751466245668,
1251
+ "p90": 181.10765901713006,
1252
+ "valid_members": 50,
1253
+ "total_members": 50
1254
+ },
1255
+ "r50_NW_estimate_km": {
1256
+ "mean": 235.07336370403848,
1257
+ "p10": 233.28935969473136,
1258
+ "p90": 236.69874902431843,
1259
+ "valid_members": 50,
1260
+ "total_members": 50
1261
+ },
1262
+ "r64_NE_estimate_km": {
1263
+ "mean": 148.10219535235476,
1264
+ "p10": 146.1878321490364,
1265
+ "p90": 149.8501293658255,
1266
+ "valid_members": 50,
1267
+ "total_members": 50
1268
+ },
1269
+ "r64_SE_estimate_km": {
1270
+ "mean": 111.7059768118357,
1271
+ "p10": 110.23924885058163,
1272
+ "p90": 113.04530285914176,
1273
+ "valid_members": 50,
1274
+ "total_members": 50
1275
+ },
1276
+ "r64_SW_estimate_km": {
1277
+ "mean": 111.7059768118357,
1278
+ "p10": 110.23924885058163,
1279
+ "p90": 113.04530285914176,
1280
+ "valid_members": 50,
1281
+ "total_members": 50
1282
+ },
1283
+ "r64_NW_estimate_km": {
1284
+ "mean": 148.10219535235476,
1285
+ "p10": 146.1878321490364,
1286
+ "p90": 149.8501293658255,
1287
+ "valid_members": 50,
1288
+ "total_members": 50
1289
+ }
1290
+ },
1291
+ "official_scoring_allowed": false
1292
+ }
1293
+ },
1294
+ {
1295
+ "lead_hours": 60,
1296
+ "valid_time_utc": "2018-09-13T12:00:00Z",
1297
+ "summary": {
1298
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1299
+ "members": 50,
1300
+ "definitions": {
1301
+ "units": "km",
1302
+ "quantity_kind": "radius_not_diameter",
1303
+ "thresholds_kt": [
1304
+ 34,
1305
+ 50,
1306
+ 64
1307
+ ],
1308
+ "quadrant_order": [
1309
+ "NE",
1310
+ "SE",
1311
+ "SW",
1312
+ "NW"
1313
+ ],
1314
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1315
+ "target_wind_averaging_seconds": 60,
1316
+ "validated_wind_averaging_seconds": null,
1317
+ "validated_surface_height_m": null,
1318
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1319
+ "official_scoring_allowed": false
1320
+ },
1321
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1322
+ "estimates": {
1323
+ "wind_estimate_kt": {
1324
+ "mean": 146.01699189642278,
1325
+ "p10": 145.37789957646814,
1326
+ "p90": 146.55230452591934,
1327
+ "valid_members": 50,
1328
+ "total_members": 50
1329
+ },
1330
+ "rmw_persistence_km": {
1331
+ "mean": 9.259999999999998,
1332
+ "p10": 9.26,
1333
+ "p90": 9.26,
1334
+ "valid_members": 50,
1335
+ "total_members": 50
1336
+ },
1337
+ "r34_NE_estimate_km": {
1338
+ "mean": 377.49205783470313,
1339
+ "p10": 376.17002713489654,
1340
+ "p90": 378.59911864422077,
1341
+ "valid_members": 50,
1342
+ "total_members": 50
1343
+ },
1344
+ "r34_SE_estimate_km": {
1345
+ "mean": 293.60493387143583,
1346
+ "p10": 292.57668777158625,
1347
+ "p90": 294.4659811677273,
1348
+ "valid_members": 50,
1349
+ "total_members": 50
1350
+ },
1351
+ "r34_SW_estimate_km": {
1352
+ "mean": 293.60493387143583,
1353
+ "p10": 292.57668777158625,
1354
+ "p90": 294.4659811677273,
1355
+ "valid_members": 50,
1356
+ "total_members": 50
1357
+ },
1358
+ "r34_NW_estimate_km": {
1359
+ "mean": 377.49205783470313,
1360
+ "p10": 376.17002713489654,
1361
+ "p90": 378.59911864422077,
1362
+ "valid_members": 50,
1363
+ "total_members": 50
1364
+ },
1365
+ "r50_NE_estimate_km": {
1366
+ "mean": 238.87634804607686,
1367
+ "p10": 237.36365735399173,
1368
+ "p90": 240.1441434009815,
1369
+ "valid_members": 50,
1370
+ "total_members": 50
1371
+ },
1372
+ "r50_SE_estimate_km": {
1373
+ "mean": 182.85402364633873,
1374
+ "p10": 181.64078142896696,
1375
+ "p90": 183.87094189707216,
1376
+ "valid_members": 50,
1377
+ "total_members": 50
1378
+ },
1379
+ "r50_SW_estimate_km": {
1380
+ "mean": 182.85402364633873,
1381
+ "p10": 181.64078142896696,
1382
+ "p90": 183.87094189707216,
1383
+ "valid_members": 50,
1384
+ "total_members": 50
1385
+ },
1386
+ "r50_NW_estimate_km": {
1387
+ "mean": 238.87634804607686,
1388
+ "p10": 237.36365735399173,
1389
+ "p90": 240.1441434009815,
1390
+ "valid_members": 50,
1391
+ "total_members": 50
1392
+ },
1393
+ "r64_NE_estimate_km": {
1394
+ "mean": 152.21092007918037,
1395
+ "p10": 150.56872682226046,
1396
+ "p90": 153.58910161683315,
1397
+ "valid_members": 50,
1398
+ "total_members": 50
1399
+ },
1400
+ "r64_SE_estimate_km": {
1401
+ "mean": 114.85478099085476,
1402
+ "p10": 113.59602115274441,
1403
+ "p90": 115.91122727540295,
1404
+ "valid_members": 50,
1405
+ "total_members": 50
1406
+ },
1407
+ "r64_SW_estimate_km": {
1408
+ "mean": 114.85478099085476,
1409
+ "p10": 113.59602115274441,
1410
+ "p90": 115.91122727540295,
1411
+ "valid_members": 50,
1412
+ "total_members": 50
1413
+ },
1414
+ "r64_NW_estimate_km": {
1415
+ "mean": 152.21092007918037,
1416
+ "p10": 150.56872682226046,
1417
+ "p90": 153.58910161683315,
1418
+ "valid_members": 50,
1419
+ "total_members": 50
1420
+ }
1421
+ },
1422
+ "official_scoring_allowed": false
1423
+ }
1424
+ },
1425
+ {
1426
+ "lead_hours": 66,
1427
+ "valid_time_utc": "2018-09-13T18:00:00Z",
1428
+ "summary": {
1429
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1430
+ "members": 50,
1431
+ "definitions": {
1432
+ "units": "km",
1433
+ "quantity_kind": "radius_not_diameter",
1434
+ "thresholds_kt": [
1435
+ 34,
1436
+ 50,
1437
+ 64
1438
+ ],
1439
+ "quadrant_order": [
1440
+ "NE",
1441
+ "SE",
1442
+ "SW",
1443
+ "NW"
1444
+ ],
1445
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1446
+ "target_wind_averaging_seconds": 60,
1447
+ "validated_wind_averaging_seconds": null,
1448
+ "validated_surface_height_m": null,
1449
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1450
+ "official_scoring_allowed": false
1451
+ },
1452
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1453
+ "estimates": {
1454
+ "wind_estimate_kt": {
1455
+ "mean": 144.84858215433505,
1456
+ "p10": 144.21128638462065,
1457
+ "p90": 145.4806411809471,
1458
+ "valid_members": 50,
1459
+ "total_members": 50
1460
+ },
1461
+ "rmw_persistence_km": {
1462
+ "mean": 9.259999999999998,
1463
+ "p10": 9.26,
1464
+ "p90": 9.26,
1465
+ "valid_members": 50,
1466
+ "total_members": 50
1467
+ },
1468
+ "r34_NE_estimate_km": {
1469
+ "mean": 375.0735904976269,
1470
+ "p10": 373.75316377783196,
1471
+ "p90": 376.3826896013987,
1472
+ "valid_members": 50,
1473
+ "total_members": 50
1474
+ },
1475
+ "r34_SE_estimate_km": {
1476
+ "mean": 291.72390372037654,
1477
+ "p10": 290.696905160536,
1478
+ "p90": 292.742091912199,
1479
+ "valid_members": 50,
1480
+ "total_members": 50
1481
+ },
1482
+ "r34_SW_estimate_km": {
1483
+ "mean": 291.72390372037654,
1484
+ "p10": 290.696905160536,
1485
+ "p90": 292.742091912199,
1486
+ "valid_members": 50,
1487
+ "total_members": 50
1488
+ },
1489
+ "r34_NW_estimate_km": {
1490
+ "mean": 375.0735904976269,
1491
+ "p10": 373.75316377783196,
1492
+ "p90": 376.3826896013987,
1493
+ "valid_members": 50,
1494
+ "total_members": 50
1495
+ },
1496
+ "r50_NE_estimate_km": {
1497
+ "mean": 236.1145951468856,
1498
+ "p10": 234.61154972232487,
1499
+ "p90": 237.60650633664807,
1500
+ "valid_members": 50,
1501
+ "total_members": 50
1502
+ },
1503
+ "r50_SE_estimate_km": {
1504
+ "mean": 180.63945108666587,
1505
+ "p10": 179.43461272839514,
1506
+ "p90": 181.83551521764733,
1507
+ "valid_members": 50,
1508
+ "total_members": 50
1509
+ },
1510
+ "r50_SW_estimate_km": {
1511
+ "mean": 180.63945108666587,
1512
+ "p10": 179.43461272839514,
1513
+ "p90": 181.83551521764733,
1514
+ "valid_members": 50,
1515
+ "total_members": 50
1516
+ },
1517
+ "r50_NW_estimate_km": {
1518
+ "mean": 236.1145951468856,
1519
+ "p10": 234.61154972232487,
1520
+ "p90": 237.60650633664807,
1521
+ "valid_members": 50,
1522
+ "total_members": 50
1523
+ },
1524
+ "r64_NE_estimate_km": {
1525
+ "mean": 149.2220942801579,
1526
+ "p10": 147.60365066595048,
1527
+ "p90": 150.8315404394418,
1528
+ "valid_members": 50,
1529
+ "total_members": 50
1530
+ },
1531
+ "r64_SE_estimate_km": {
1532
+ "mean": 112.5640860769311,
1533
+ "p10": 111.32391904336518,
1534
+ "p90": 113.7974465437291,
1535
+ "valid_members": 50,
1536
+ "total_members": 50
1537
+ },
1538
+ "r64_SW_estimate_km": {
1539
+ "mean": 112.5640860769311,
1540
+ "p10": 111.32391904336518,
1541
+ "p90": 113.7974465437291,
1542
+ "valid_members": 50,
1543
+ "total_members": 50
1544
+ },
1545
+ "r64_NW_estimate_km": {
1546
+ "mean": 149.2220942801579,
1547
+ "p10": 147.60365066595048,
1548
+ "p90": 150.8315404394418,
1549
+ "valid_members": 50,
1550
+ "total_members": 50
1551
+ }
1552
+ },
1553
+ "official_scoring_allowed": false
1554
+ }
1555
+ },
1556
+ {
1557
+ "lead_hours": 72,
1558
+ "valid_time_utc": "2018-09-14T00:00:00Z",
1559
+ "summary": {
1560
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1561
+ "members": 50,
1562
+ "definitions": {
1563
+ "units": "km",
1564
+ "quantity_kind": "radius_not_diameter",
1565
+ "thresholds_kt": [
1566
+ 34,
1567
+ 50,
1568
+ 64
1569
+ ],
1570
+ "quadrant_order": [
1571
+ "NE",
1572
+ "SE",
1573
+ "SW",
1574
+ "NW"
1575
+ ],
1576
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1577
+ "target_wind_averaging_seconds": 60,
1578
+ "validated_wind_averaging_seconds": null,
1579
+ "validated_surface_height_m": null,
1580
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1581
+ "official_scoring_allowed": false
1582
+ },
1583
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1584
+ "estimates": {
1585
+ "wind_estimate_kt": {
1586
+ "mean": 143.18112357071124,
1587
+ "p10": 142.42784868259352,
1588
+ "p90": 144.12513358615647,
1589
+ "valid_members": 50,
1590
+ "total_members": 50
1591
+ },
1592
+ "rmw_persistence_km": {
1593
+ "mean": 9.259999999999998,
1594
+ "p10": 9.26,
1595
+ "p90": 9.26,
1596
+ "valid_members": 50,
1597
+ "total_members": 50
1598
+ },
1599
+ "r34_NE_estimate_km": {
1600
+ "mean": 371.61509200527945,
1601
+ "p10": 370.0508518589042,
1602
+ "p90": 373.57452608280954,
1603
+ "valid_members": 50,
1604
+ "total_members": 50
1605
+ },
1606
+ "r34_SE_estimate_km": {
1607
+ "mean": 289.0339604485508,
1608
+ "p10": 287.8173292235922,
1609
+ "p90": 290.55796473107415,
1610
+ "valid_members": 50,
1611
+ "total_members": 50
1612
+ },
1613
+ "r34_SW_estimate_km": {
1614
+ "mean": 289.0339604485508,
1615
+ "p10": 287.8173292235922,
1616
+ "p90": 290.55796473107415,
1617
+ "valid_members": 50,
1618
+ "total_members": 50
1619
+ },
1620
+ "r34_NW_estimate_km": {
1621
+ "mean": 371.61509200527945,
1622
+ "p10": 370.0508518589042,
1623
+ "p90": 373.57452608280954,
1624
+ "valid_members": 50,
1625
+ "total_members": 50
1626
+ },
1627
+ "r50_NE_estimate_km": {
1628
+ "mean": 232.19121897808338,
1629
+ "p10": 230.4235549891168,
1630
+ "p90": 234.40870637318633,
1631
+ "valid_members": 50,
1632
+ "total_members": 50
1633
+ },
1634
+ "r50_SE_estimate_km": {
1635
+ "mean": 177.49562882657037,
1636
+ "p10": 176.07977538507214,
1637
+ "p90": 179.27205675510885,
1638
+ "valid_members": 50,
1639
+ "total_members": 50
1640
+ },
1641
+ "r50_SW_estimate_km": {
1642
+ "mean": 177.49562882657037,
1643
+ "p10": 176.07977538507214,
1644
+ "p90": 179.27205675510885,
1645
+ "valid_members": 50,
1646
+ "total_members": 50
1647
+ },
1648
+ "r50_NW_estimate_km": {
1649
+ "mean": 232.19121897808338,
1650
+ "p10": 230.4235549891168,
1651
+ "p90": 234.40870637318633,
1652
+ "valid_members": 50,
1653
+ "total_members": 50
1654
+ },
1655
+ "r64_NE_estimate_km": {
1656
+ "mean": 145.02014720517826,
1657
+ "p10": 143.13848952962286,
1658
+ "p90": 147.3860820184394,
1659
+ "valid_members": 50,
1660
+ "total_members": 50
1661
+ },
1662
+ "r64_SE_estimate_km": {
1663
+ "mean": 109.3449163306136,
1664
+ "p10": 107.9036899957915,
1665
+ "p90": 111.15722730042825,
1666
+ "valid_members": 50,
1667
+ "total_members": 50
1668
+ },
1669
+ "r64_SW_estimate_km": {
1670
+ "mean": 109.3449163306136,
1671
+ "p10": 107.9036899957915,
1672
+ "p90": 111.15722730042825,
1673
+ "valid_members": 50,
1674
+ "total_members": 50
1675
+ },
1676
+ "r64_NW_estimate_km": {
1677
+ "mean": 145.02014720517826,
1678
+ "p10": 143.13848952962286,
1679
+ "p90": 147.3860820184394,
1680
+ "valid_members": 50,
1681
+ "total_members": 50
1682
+ }
1683
+ },
1684
+ "official_scoring_allowed": false
1685
+ }
1686
+ },
1687
+ {
1688
+ "lead_hours": 78,
1689
+ "valid_time_utc": "2018-09-14T06:00:00Z",
1690
+ "summary": {
1691
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1692
+ "members": 50,
1693
+ "definitions": {
1694
+ "units": "km",
1695
+ "quantity_kind": "radius_not_diameter",
1696
+ "thresholds_kt": [
1697
+ 34,
1698
+ 50,
1699
+ 64
1700
+ ],
1701
+ "quadrant_order": [
1702
+ "NE",
1703
+ "SE",
1704
+ "SW",
1705
+ "NW"
1706
+ ],
1707
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1708
+ "target_wind_averaging_seconds": 60,
1709
+ "validated_wind_averaging_seconds": null,
1710
+ "validated_surface_height_m": null,
1711
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1712
+ "official_scoring_allowed": false
1713
+ },
1714
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1715
+ "estimates": {
1716
+ "wind_estimate_kt": {
1717
+ "mean": 138.89302374951697,
1718
+ "p10": 138.19314784765237,
1719
+ "p90": 139.7769645791015,
1720
+ "valid_members": 50,
1721
+ "total_members": 50
1722
+ },
1723
+ "rmw_persistence_km": {
1724
+ "mean": 9.259999999999998,
1725
+ "p10": 9.26,
1726
+ "p90": 9.26,
1727
+ "valid_members": 50,
1728
+ "total_members": 50
1729
+ },
1730
+ "r34_NE_estimate_km": {
1731
+ "mean": 362.6845868085104,
1732
+ "p10": 361.2224075194414,
1733
+ "p90": 364.5305753616423,
1734
+ "valid_members": 50,
1735
+ "total_members": 50
1736
+ },
1737
+ "r34_SE_estimate_km": {
1738
+ "mean": 282.08801196217485,
1739
+ "p10": 280.95076140400994,
1740
+ "p90": 283.52378083683294,
1741
+ "valid_members": 50,
1742
+ "total_members": 50
1743
+ },
1744
+ "r34_SW_estimate_km": {
1745
+ "mean": 282.08801196217485,
1746
+ "p10": 280.95076140400994,
1747
+ "p90": 283.52378083683294,
1748
+ "valid_members": 50,
1749
+ "total_members": 50
1750
+ },
1751
+ "r34_NW_estimate_km": {
1752
+ "mean": 362.6845868085104,
1753
+ "p10": 361.2224075194414,
1754
+ "p90": 364.5305753616423,
1755
+ "valid_members": 50,
1756
+ "total_members": 50
1757
+ },
1758
+ "r50_NE_estimate_km": {
1759
+ "mean": 222.19363592254348,
1760
+ "p10": 220.57337792604122,
1761
+ "p90": 224.24184804150448,
1762
+ "valid_members": 50,
1763
+ "total_members": 50
1764
+ },
1765
+ "r50_SE_estimate_km": {
1766
+ "mean": 169.4958407587657,
1767
+ "p10": 168.20077350131754,
1768
+ "p90": 171.13319706801113,
1769
+ "valid_members": 50,
1770
+ "total_members": 50
1771
+ },
1772
+ "r50_SW_estimate_km": {
1773
+ "mean": 169.4958407587657,
1774
+ "p10": 168.20077350131754,
1775
+ "p90": 171.13319706801113,
1776
+ "valid_members": 50,
1777
+ "total_members": 50
1778
+ },
1779
+ "r50_NW_estimate_km": {
1780
+ "mean": 222.19363592254348,
1781
+ "p10": 220.57337792604122,
1782
+ "p90": 224.24184804150448,
1783
+ "valid_members": 50,
1784
+ "total_members": 50
1785
+ },
1786
+ "r64_NE_estimate_km": {
1787
+ "mean": 134.5334564852949,
1788
+ "p10": 132.8612081203948,
1789
+ "p90": 136.65170709216787,
1790
+ "valid_members": 50,
1791
+ "total_members": 50
1792
+ },
1793
+ "r64_SE_estimate_km": {
1794
+ "mean": 101.3173186298388,
1795
+ "p10": 100.03800274989015,
1796
+ "p90": 102.93796506226097,
1797
+ "valid_members": 50,
1798
+ "total_members": 50
1799
+ },
1800
+ "r64_SW_estimate_km": {
1801
+ "mean": 101.3173186298388,
1802
+ "p10": 100.03800274989015,
1803
+ "p90": 102.93796506226097,
1804
+ "valid_members": 50,
1805
+ "total_members": 50
1806
+ },
1807
+ "r64_NW_estimate_km": {
1808
+ "mean": 134.5334564852949,
1809
+ "p10": 132.8612081203948,
1810
+ "p90": 136.65170709216787,
1811
+ "valid_members": 50,
1812
+ "total_members": 50
1813
+ }
1814
+ },
1815
+ "official_scoring_allowed": false
1816
+ }
1817
+ },
1818
+ {
1819
+ "lead_hours": 84,
1820
+ "valid_time_utc": "2018-09-14T12:00:00Z",
1821
+ "summary": {
1822
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1823
+ "members": 50,
1824
+ "definitions": {
1825
+ "units": "km",
1826
+ "quantity_kind": "radius_not_diameter",
1827
+ "thresholds_kt": [
1828
+ 34,
1829
+ 50,
1830
+ 64
1831
+ ],
1832
+ "quadrant_order": [
1833
+ "NE",
1834
+ "SE",
1835
+ "SW",
1836
+ "NW"
1837
+ ],
1838
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1839
+ "target_wind_averaging_seconds": 60,
1840
+ "validated_wind_averaging_seconds": null,
1841
+ "validated_surface_height_m": null,
1842
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1843
+ "official_scoring_allowed": false
1844
+ },
1845
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1846
+ "estimates": {
1847
+ "wind_estimate_kt": {
1848
+ "mean": 140.1819895636485,
1849
+ "p10": 139.54813529908427,
1850
+ "p90": 141.01806534472283,
1851
+ "valid_members": 50,
1852
+ "total_members": 50
1853
+ },
1854
+ "rmw_persistence_km": {
1855
+ "mean": 9.259999999999998,
1856
+ "p10": 9.26,
1857
+ "p90": 9.26,
1858
+ "valid_members": 50,
1859
+ "total_members": 50
1860
+ },
1861
+ "r34_NE_estimate_km": {
1862
+ "mean": 365.374902169482,
1863
+ "p10": 364.05307772710586,
1864
+ "p90": 367.11766134104914,
1865
+ "valid_members": 50,
1866
+ "total_members": 50
1867
+ },
1868
+ "r34_SE_estimate_km": {
1869
+ "mean": 284.18047946515276,
1870
+ "p10": 283.152393787749,
1871
+ "p90": 285.535958820816,
1872
+ "valid_members": 50,
1873
+ "total_members": 50
1874
+ },
1875
+ "r34_SW_estimate_km": {
1876
+ "mean": 284.18047946515276,
1877
+ "p10": 283.152393787749,
1878
+ "p90": 285.535958820816,
1879
+ "valid_members": 50,
1880
+ "total_members": 50
1881
+ },
1882
+ "r34_NW_estimate_km": {
1883
+ "mean": 365.374902169482,
1884
+ "p10": 364.05307772710586,
1885
+ "p90": 367.11766134104914,
1886
+ "valid_members": 50,
1887
+ "total_members": 50
1888
+ },
1889
+ "r50_NE_estimate_km": {
1890
+ "mean": 225.18411035247692,
1891
+ "p10": 223.71067344332593,
1892
+ "p90": 227.12955362110668,
1893
+ "valid_members": 50,
1894
+ "total_members": 50
1895
+ },
1896
+ "r50_SE_estimate_km": {
1897
+ "mean": 171.88691539241708,
1898
+ "p10": 170.70845500079633,
1899
+ "p90": 173.44312705660988,
1900
+ "valid_members": 50,
1901
+ "total_members": 50
1902
+ },
1903
+ "r50_SW_estimate_km": {
1904
+ "mean": 171.88691539241708,
1905
+ "p10": 170.70845500079633,
1906
+ "p90": 173.44312705660988,
1907
+ "valid_members": 50,
1908
+ "total_members": 50
1909
+ },
1910
+ "r50_NW_estimate_km": {
1911
+ "mean": 225.18411035247692,
1912
+ "p10": 223.71067344332593,
1913
+ "p90": 227.12955362110668,
1914
+ "valid_members": 50,
1915
+ "total_members": 50
1916
+ },
1917
+ "r64_NE_estimate_km": {
1918
+ "mean": 137.6351291394203,
1919
+ "p10": 136.10013390269503,
1920
+ "p90": 139.66643952357123,
1921
+ "valid_members": 50,
1922
+ "total_members": 50
1923
+ },
1924
+ "r64_SE_estimate_km": {
1925
+ "mean": 103.69063204707167,
1926
+ "p10": 102.51589785824899,
1927
+ "p90": 105.24533166735065,
1928
+ "valid_members": 50,
1929
+ "total_members": 50
1930
+ },
1931
+ "r64_SW_estimate_km": {
1932
+ "mean": 103.69063204707167,
1933
+ "p10": 102.51589785824899,
1934
+ "p90": 105.24533166735065,
1935
+ "valid_members": 50,
1936
+ "total_members": 50
1937
+ },
1938
+ "r64_NW_estimate_km": {
1939
+ "mean": 137.6351291394203,
1940
+ "p10": 136.10013390269503,
1941
+ "p90": 139.66643952357123,
1942
+ "valid_members": 50,
1943
+ "total_members": 50
1944
+ }
1945
+ },
1946
+ "official_scoring_allowed": false
1947
+ }
1948
+ },
1949
+ {
1950
+ "lead_hours": 90,
1951
+ "valid_time_utc": "2018-09-14T18:00:00Z",
1952
+ "summary": {
1953
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1954
+ "members": 50,
1955
+ "definitions": {
1956
+ "units": "km",
1957
+ "quantity_kind": "radius_not_diameter",
1958
+ "thresholds_kt": [
1959
+ 34,
1960
+ 50,
1961
+ 64
1962
+ ],
1963
+ "quadrant_order": [
1964
+ "NE",
1965
+ "SE",
1966
+ "SW",
1967
+ "NW"
1968
+ ],
1969
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1970
+ "target_wind_averaging_seconds": 60,
1971
+ "validated_wind_averaging_seconds": null,
1972
+ "validated_surface_height_m": null,
1973
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1974
+ "official_scoring_allowed": false
1975
+ },
1976
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1977
+ "estimates": {
1978
+ "wind_estimate_kt": {
1979
+ "mean": 136.006388505269,
1980
+ "p10": 134.98218055795516,
1981
+ "p90": 137.19167937096498,
1982
+ "valid_members": 50,
1983
+ "total_members": 50
1984
+ },
1985
+ "rmw_persistence_km": {
1986
+ "mean": 9.259999999999998,
1987
+ "p10": 9.26,
1988
+ "p90": 9.26,
1989
+ "valid_members": 50,
1990
+ "total_members": 50
1991
+ },
1992
+ "r34_NE_estimate_km": {
1993
+ "mean": 356.64119588787077,
1994
+ "p10": 354.4921551276431,
1995
+ "p90": 359.126696789439,
1996
+ "valid_members": 50,
1997
+ "total_members": 50
1998
+ },
1999
+ "r34_SE_estimate_km": {
2000
+ "mean": 277.38759680167726,
2001
+ "p10": 275.71612065483356,
2002
+ "p90": 279.32076416956363,
2003
+ "valid_members": 50,
2004
+ "total_members": 50
2005
+ },
2006
+ "r34_SW_estimate_km": {
2007
+ "mean": 277.38759680167726,
2008
+ "p10": 275.71612065483356,
2009
+ "p90": 279.32076416956363,
2010
+ "valid_members": 50,
2011
+ "total_members": 50
2012
+ },
2013
+ "r34_NW_estimate_km": {
2014
+ "mean": 356.64119588787077,
2015
+ "p10": 354.4921551276431,
2016
+ "p90": 359.126696789439,
2017
+ "valid_members": 50,
2018
+ "total_members": 50
2019
+ },
2020
+ "r50_NE_estimate_km": {
2021
+ "mean": 215.5420629505122,
2022
+ "p10": 213.19376647817322,
2023
+ "p90": 218.26343350300976,
2024
+ "valid_members": 50,
2025
+ "total_members": 50
2026
+ },
2027
+ "r50_SE_estimate_km": {
2028
+ "mean": 164.18309946648478,
2029
+ "p10": 162.30891880772393,
2030
+ "p90": 166.35549387306145,
2031
+ "valid_members": 50,
2032
+ "total_members": 50
2033
+ },
2034
+ "r50_SW_estimate_km": {
2035
+ "mean": 164.18309946648478,
2036
+ "p10": 162.30891880772393,
2037
+ "p90": 166.35549387306145,
2038
+ "valid_members": 50,
2039
+ "total_members": 50
2040
+ },
2041
+ "r50_NW_estimate_km": {
2042
+ "mean": 215.5420629505122,
2043
+ "p10": 213.19376647817322,
2044
+ "p90": 218.26343350300976,
2045
+ "valid_members": 50,
2046
+ "total_members": 50
2047
+ },
2048
+ "r64_NE_estimate_km": {
2049
+ "mean": 127.74103389547207,
2050
+ "p10": 125.37024242960045,
2051
+ "p90": 130.49710034154515,
2052
+ "valid_members": 50,
2053
+ "total_members": 50
2054
+ },
2055
+ "r64_SE_estimate_km": {
2056
+ "mean": 96.12303995444135,
2057
+ "p10": 94.3108512865693,
2058
+ "p90": 98.22997840275679,
2059
+ "valid_members": 50,
2060
+ "total_members": 50
2061
+ },
2062
+ "r64_SW_estimate_km": {
2063
+ "mean": 96.12303995444135,
2064
+ "p10": 94.3108512865693,
2065
+ "p90": 98.22997840275679,
2066
+ "valid_members": 50,
2067
+ "total_members": 50
2068
+ },
2069
+ "r64_NW_estimate_km": {
2070
+ "mean": 127.74103389547207,
2071
+ "p10": 125.37024242960045,
2072
+ "p90": 130.49710034154515,
2073
+ "valid_members": 50,
2074
+ "total_members": 50
2075
+ }
2076
+ },
2077
+ "official_scoring_allowed": false
2078
+ }
2079
+ },
2080
+ {
2081
+ "lead_hours": 96,
2082
+ "valid_time_utc": "2018-09-15T00:00:00Z",
2083
+ "summary": {
2084
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2085
+ "members": 50,
2086
+ "definitions": {
2087
+ "units": "km",
2088
+ "quantity_kind": "radius_not_diameter",
2089
+ "thresholds_kt": [
2090
+ 34,
2091
+ 50,
2092
+ 64
2093
+ ],
2094
+ "quadrant_order": [
2095
+ "NE",
2096
+ "SE",
2097
+ "SW",
2098
+ "NW"
2099
+ ],
2100
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2101
+ "target_wind_averaging_seconds": 60,
2102
+ "validated_wind_averaging_seconds": null,
2103
+ "validated_surface_height_m": null,
2104
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2105
+ "official_scoring_allowed": false
2106
+ },
2107
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2108
+ "estimates": {
2109
+ "wind_estimate_kt": {
2110
+ "mean": 126.4546894172494,
2111
+ "p10": 124.94431537243608,
2112
+ "p90": 127.61186032319253,
2113
+ "valid_members": 50,
2114
+ "total_members": 50
2115
+ },
2116
+ "rmw_persistence_km": {
2117
+ "mean": 9.259999999999998,
2118
+ "p10": 9.26,
2119
+ "p90": 9.26,
2120
+ "valid_members": 50,
2121
+ "total_members": 50
2122
+ },
2123
+ "r34_NE_estimate_km": {
2124
+ "mean": 336.41686069454704,
2125
+ "p10": 333.1450693792065,
2126
+ "p90": 338.9208665569504,
2127
+ "valid_members": 50,
2128
+ "total_members": 50
2129
+ },
2130
+ "r34_SE_estimate_km": {
2131
+ "mean": 261.65416621635273,
2132
+ "p10": 259.10483716117835,
2133
+ "p90": 263.6051184331837,
2134
+ "valid_members": 50,
2135
+ "total_members": 50
2136
+ },
2137
+ "r34_SW_estimate_km": {
2138
+ "mean": 261.65416621635273,
2139
+ "p10": 259.10483716117835,
2140
+ "p90": 263.6051184331837,
2141
+ "valid_members": 50,
2142
+ "total_members": 50
2143
+ },
2144
+ "r34_NW_estimate_km": {
2145
+ "mean": 336.41686069454704,
2146
+ "p10": 333.1450693792065,
2147
+ "p90": 338.9208665569504,
2148
+ "valid_members": 50,
2149
+ "total_members": 50
2150
+ },
2151
+ "r50_NE_estimate_km": {
2152
+ "mean": 193.94624571599027,
2153
+ "p10": 190.54630286856556,
2154
+ "p90": 196.55215686887982,
2155
+ "valid_members": 50,
2156
+ "total_members": 50
2157
+ },
2158
+ "r50_SE_estimate_km": {
2159
+ "mean": 146.99134566662946,
2160
+ "p10": 144.29468384884376,
2161
+ "p90": 149.05862001910646,
2162
+ "valid_members": 50,
2163
+ "total_members": 50
2164
+ },
2165
+ "r50_SW_estimate_km": {
2166
+ "mean": 146.99134566662946,
2167
+ "p10": 144.29468384884376,
2168
+ "p90": 149.05862001910646,
2169
+ "valid_members": 50,
2170
+ "total_members": 50
2171
+ },
2172
+ "r50_NW_estimate_km": {
2173
+ "mean": 193.94624571599027,
2174
+ "p10": 190.54630286856556,
2175
+ "p90": 196.55215686887982,
2176
+ "valid_members": 50,
2177
+ "total_members": 50
2178
+ },
2179
+ "r64_NE_estimate_km": {
2180
+ "mean": 106.7113568312794,
2181
+ "p10": 103.54536354516256,
2182
+ "p90": 109.14373408017758,
2183
+ "valid_members": 50,
2184
+ "total_members": 50
2185
+ },
2186
+ "r64_SE_estimate_km": {
2187
+ "mean": 80.0771778299542,
2188
+ "p10": 77.6738938431246,
2189
+ "p90": 81.92408180017411,
2190
+ "valid_members": 50,
2191
+ "total_members": 50
2192
+ },
2193
+ "r64_SW_estimate_km": {
2194
+ "mean": 80.0771778299542,
2195
+ "p10": 77.6738938431246,
2196
+ "p90": 81.92408180017411,
2197
+ "valid_members": 50,
2198
+ "total_members": 50
2199
+ },
2200
+ "r64_NW_estimate_km": {
2201
+ "mean": 106.7113568312794,
2202
+ "p10": 103.54536354516256,
2203
+ "p90": 109.14373408017758,
2204
+ "valid_members": 50,
2205
+ "total_members": 50
2206
+ }
2207
+ },
2208
+ "official_scoring_allowed": false
2209
+ }
2210
+ },
2211
+ {
2212
+ "lead_hours": 102,
2213
+ "valid_time_utc": "2018-09-15T06:00:00Z",
2214
+ "summary": {
2215
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2216
+ "members": 50,
2217
+ "definitions": {
2218
+ "units": "km",
2219
+ "quantity_kind": "radius_not_diameter",
2220
+ "thresholds_kt": [
2221
+ 34,
2222
+ 50,
2223
+ 64
2224
+ ],
2225
+ "quadrant_order": [
2226
+ "NE",
2227
+ "SE",
2228
+ "SW",
2229
+ "NW"
2230
+ ],
2231
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2232
+ "target_wind_averaging_seconds": 60,
2233
+ "validated_wind_averaging_seconds": null,
2234
+ "validated_surface_height_m": null,
2235
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2236
+ "official_scoring_allowed": false
2237
+ },
2238
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2239
+ "estimates": {
2240
+ "wind_estimate_kt": {
2241
+ "mean": 118.8086331817603,
2242
+ "p10": 116.93712463959777,
2243
+ "p90": 120.62592906373634,
2244
+ "valid_members": 50,
2245
+ "total_members": 50
2246
+ },
2247
+ "rmw_persistence_km": {
2248
+ "mean": 9.259999999999998,
2249
+ "p10": 9.26,
2250
+ "p90": 9.26,
2251
+ "valid_members": 50,
2252
+ "total_members": 50
2253
+ },
2254
+ "r34_NE_estimate_km": {
2255
+ "mean": 309.742653439734,
2256
+ "p10": 302.69047581015025,
2257
+ "p90": 316.60856776060825,
2258
+ "valid_members": 50,
2259
+ "total_members": 50
2260
+ },
2261
+ "r34_SE_estimate_km": {
2262
+ "mean": 240.06745630832037,
2263
+ "p10": 234.34143116089268,
2264
+ "p90": 245.6445093888817,
2265
+ "valid_members": 50,
2266
+ "total_members": 50
2267
+ },
2268
+ "r34_SW_estimate_km": {
2269
+ "mean": 240.06745630832037,
2270
+ "p10": 234.34143116089268,
2271
+ "p90": 245.6445093888817,
2272
+ "valid_members": 50,
2273
+ "total_members": 50
2274
+ },
2275
+ "r34_NW_estimate_km": {
2276
+ "mean": 309.742653439734,
2277
+ "p10": 302.69047581015025,
2278
+ "p90": 316.60856776060825,
2279
+ "valid_members": 50,
2280
+ "total_members": 50
2281
+ },
2282
+ "r50_NE_estimate_km": {
2283
+ "mean": 168.3204284618051,
2284
+ "p10": 161.80651611752205,
2285
+ "p90": 174.7002927925099,
2286
+ "valid_members": 50,
2287
+ "total_members": 50
2288
+ },
2289
+ "r50_SE_estimate_km": {
2290
+ "mean": 127.21427018676805,
2291
+ "p10": 122.21373245534961,
2292
+ "p90": 132.11302166054068,
2293
+ "valid_members": 50,
2294
+ "total_members": 50
2295
+ },
2296
+ "r50_SW_estimate_km": {
2297
+ "mean": 127.21427018676805,
2298
+ "p10": 122.21373245534961,
2299
+ "p90": 132.11302166054068,
2300
+ "valid_members": 50,
2301
+ "total_members": 50
2302
+ },
2303
+ "r50_NW_estimate_km": {
2304
+ "mean": 168.3204284618051,
2305
+ "p10": 161.80651611752205,
2306
+ "p90": 174.7002927925099,
2307
+ "valid_members": 50,
2308
+ "total_members": 50
2309
+ },
2310
+ "r64_NE_estimate_km": {
2311
+ "mean": 86.40099717266295,
2312
+ "p10": 81.53117899913262,
2313
+ "p90": 91.2023411524697,
2314
+ "valid_members": 50,
2315
+ "total_members": 50
2316
+ },
2317
+ "r64_SE_estimate_km": {
2318
+ "mean": 66.21845951863703,
2319
+ "p10": 62.925873924171846,
2320
+ "p90": 69.45666067897245,
2321
+ "valid_members": 50,
2322
+ "total_members": 50
2323
+ },
2324
+ "r64_SW_estimate_km": {
2325
+ "mean": 66.21845951863703,
2326
+ "p10": 62.925873924171846,
2327
+ "p90": 69.45666067897245,
2328
+ "valid_members": 50,
2329
+ "total_members": 50
2330
+ },
2331
+ "r64_NW_estimate_km": {
2332
+ "mean": 86.40099717266295,
2333
+ "p10": 81.53117899913262,
2334
+ "p90": 91.2023411524697,
2335
+ "valid_members": 50,
2336
+ "total_members": 50
2337
+ }
2338
+ },
2339
+ "official_scoring_allowed": false
2340
+ }
2341
+ },
2342
+ {
2343
+ "lead_hours": 108,
2344
+ "valid_time_utc": "2018-09-15T12:00:00Z",
2345
+ "summary": {
2346
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2347
+ "members": 50,
2348
+ "definitions": {
2349
+ "units": "km",
2350
+ "quantity_kind": "radius_not_diameter",
2351
+ "thresholds_kt": [
2352
+ 34,
2353
+ 50,
2354
+ 64
2355
+ ],
2356
+ "quadrant_order": [
2357
+ "NE",
2358
+ "SE",
2359
+ "SW",
2360
+ "NW"
2361
+ ],
2362
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2363
+ "target_wind_averaging_seconds": 60,
2364
+ "validated_wind_averaging_seconds": null,
2365
+ "validated_surface_height_m": null,
2366
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2367
+ "official_scoring_allowed": false
2368
+ },
2369
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2370
+ "estimates": {
2371
+ "wind_estimate_kt": {
2372
+ "mean": 113.34503828043299,
2373
+ "p10": 111.61947559879869,
2374
+ "p90": 115.16497988059564,
2375
+ "valid_members": 50,
2376
+ "total_members": 50
2377
+ },
2378
+ "rmw_persistence_km": {
2379
+ "mean": 9.259999999999998,
2380
+ "p10": 9.26,
2381
+ "p90": 9.26,
2382
+ "valid_members": 50,
2383
+ "total_members": 50
2384
+ },
2385
+ "r34_NE_estimate_km": {
2386
+ "mean": 289.3365314587083,
2387
+ "p10": 282.97119615175694,
2388
+ "p90": 296.0733558821145,
2389
+ "valid_members": 50,
2390
+ "total_members": 50
2391
+ },
2392
+ "r34_SE_estimate_km": {
2393
+ "mean": 223.52132094264707,
2394
+ "p10": 218.36996979097034,
2395
+ "p90": 228.97623760481397,
2396
+ "valid_members": 50,
2397
+ "total_members": 50
2398
+ },
2399
+ "r34_SW_estimate_km": {
2400
+ "mean": 223.52132094264707,
2401
+ "p10": 218.36996979097034,
2402
+ "p90": 228.97623760481397,
2403
+ "valid_members": 50,
2404
+ "total_members": 50
2405
+ },
2406
+ "r34_NW_estimate_km": {
2407
+ "mean": 289.3365314587083,
2408
+ "p10": 282.97119615175694,
2409
+ "p90": 296.0733558821145,
2410
+ "valid_members": 50,
2411
+ "total_members": 50
2412
+ },
2413
+ "r50_NE_estimate_km": {
2414
+ "mean": 149.84600041814278,
2415
+ "p10": 144.24519042090148,
2416
+ "p90": 155.82067563117116,
2417
+ "valid_members": 50,
2418
+ "total_members": 50
2419
+ },
2420
+ "r50_SE_estimate_km": {
2421
+ "mean": 113.04282614818229,
2422
+ "p10": 108.75124627720021,
2423
+ "p90": 117.62226054273275,
2424
+ "valid_members": 50,
2425
+ "total_members": 50
2426
+ },
2427
+ "r50_SW_estimate_km": {
2428
+ "mean": 113.04282614818229,
2429
+ "p10": 108.75124627720021,
2430
+ "p90": 117.62226054273275,
2431
+ "valid_members": 50,
2432
+ "total_members": 50
2433
+ },
2434
+ "r50_NW_estimate_km": {
2435
+ "mean": 149.84600041814278,
2436
+ "p10": 144.24519042090148,
2437
+ "p90": 155.82067563117116,
2438
+ "valid_members": 50,
2439
+ "total_members": 50
2440
+ },
2441
+ "r64_NE_estimate_km": {
2442
+ "mean": 72.89144242177701,
2443
+ "p10": 68.92533295430151,
2444
+ "p90": 77.15961146065469,
2445
+ "valid_members": 50,
2446
+ "total_members": 50
2447
+ },
2448
+ "r64_SE_estimate_km": {
2449
+ "mean": 57.00828652835057,
2450
+ "p10": 54.271338721455656,
2451
+ "p90": 59.94396526863343,
2452
+ "valid_members": 50,
2453
+ "total_members": 50
2454
+ },
2455
+ "r64_SW_estimate_km": {
2456
+ "mean": 57.00828652835057,
2457
+ "p10": 54.271338721455656,
2458
+ "p90": 59.94396526863343,
2459
+ "valid_members": 50,
2460
+ "total_members": 50
2461
+ },
2462
+ "r64_NW_estimate_km": {
2463
+ "mean": 72.89144242177701,
2464
+ "p10": 68.92533295430151,
2465
+ "p90": 77.15961146065469,
2466
+ "valid_members": 50,
2467
+ "total_members": 50
2468
+ }
2469
+ },
2470
+ "official_scoring_allowed": false
2471
+ }
2472
+ },
2473
+ {
2474
+ "lead_hours": 114,
2475
+ "valid_time_utc": "2018-09-15T18:00:00Z",
2476
+ "summary": {
2477
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2478
+ "members": 50,
2479
+ "definitions": {
2480
+ "units": "km",
2481
+ "quantity_kind": "radius_not_diameter",
2482
+ "thresholds_kt": [
2483
+ 34,
2484
+ 50,
2485
+ 64
2486
+ ],
2487
+ "quadrant_order": [
2488
+ "NE",
2489
+ "SE",
2490
+ "SW",
2491
+ "NW"
2492
+ ],
2493
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2494
+ "target_wind_averaging_seconds": 60,
2495
+ "validated_wind_averaging_seconds": null,
2496
+ "validated_surface_height_m": null,
2497
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2498
+ "official_scoring_allowed": false
2499
+ },
2500
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2501
+ "estimates": {
2502
+ "wind_estimate_kt": {
2503
+ "mean": 109.4508154087569,
2504
+ "p10": 108.34942621789983,
2505
+ "p90": 110.7593518937912,
2506
+ "valid_members": 50,
2507
+ "total_members": 50
2508
+ },
2509
+ "rmw_persistence_km": {
2510
+ "mean": 9.259999999999998,
2511
+ "p10": 9.26,
2512
+ "p90": 9.26,
2513
+ "valid_members": 50,
2514
+ "total_members": 50
2515
+ },
2516
+ "r34_NE_estimate_km": {
2517
+ "mean": 275.05354786213667,
2518
+ "p10": 271.0508422937638,
2519
+ "p90": 279.8204275680663,
2520
+ "valid_members": 50,
2521
+ "total_members": 50
2522
+ },
2523
+ "r34_SE_estimate_km": {
2524
+ "mean": 211.9725968913786,
2525
+ "p10": 208.74075067599665,
2526
+ "p90": 215.822869202166,
2527
+ "valid_members": 50,
2528
+ "total_members": 50
2529
+ },
2530
+ "r34_SW_estimate_km": {
2531
+ "mean": 211.9725968913786,
2532
+ "p10": 208.74075067599665,
2533
+ "p90": 215.822869202166,
2534
+ "valid_members": 50,
2535
+ "total_members": 50
2536
+ },
2537
+ "r34_NW_estimate_km": {
2538
+ "mean": 275.05354786213667,
2539
+ "p10": 271.0508422937638,
2540
+ "p90": 279.8204275680663,
2541
+ "valid_members": 50,
2542
+ "total_members": 50
2543
+ },
2544
+ "r50_NE_estimate_km": {
2545
+ "mean": 137.440926726457,
2546
+ "p10": 134.03695104959334,
2547
+ "p90": 141.5168705255095,
2548
+ "valid_members": 50,
2549
+ "total_members": 50
2550
+ },
2551
+ "r50_SE_estimate_km": {
2552
+ "mean": 103.5422437370745,
2553
+ "p10": 100.9373788393766,
2554
+ "p90": 106.66197654128496,
2555
+ "valid_members": 50,
2556
+ "total_members": 50
2557
+ },
2558
+ "r50_SW_estimate_km": {
2559
+ "mean": 103.5422437370745,
2560
+ "p10": 100.9373788393766,
2561
+ "p90": 106.66197654128496,
2562
+ "valid_members": 50,
2563
+ "total_members": 50
2564
+ },
2565
+ "r50_NW_estimate_km": {
2566
+ "mean": 137.440926726457,
2567
+ "p10": 134.03695104959334,
2568
+ "p90": 141.5168705255095,
2569
+ "valid_members": 50,
2570
+ "total_members": 50
2571
+ },
2572
+ "r64_NE_estimate_km": {
2573
+ "mean": 64.23245627293389,
2574
+ "p10": 61.912128542202325,
2575
+ "p90": 67.0277347273069,
2576
+ "valid_members": 50,
2577
+ "total_members": 50
2578
+ },
2579
+ "r64_SE_estimate_km": {
2580
+ "mean": 51.00049573745365,
2581
+ "p10": 49.376102205610444,
2582
+ "p90": 52.95292277682732,
2583
+ "valid_members": 50,
2584
+ "total_members": 50
2585
+ },
2586
+ "r64_SW_estimate_km": {
2587
+ "mean": 51.00049573745365,
2588
+ "p10": 49.376102205610444,
2589
+ "p90": 52.95292277682732,
2590
+ "valid_members": 50,
2591
+ "total_members": 50
2592
+ },
2593
+ "r64_NW_estimate_km": {
2594
+ "mean": 64.23245627293389,
2595
+ "p10": 61.912128542202325,
2596
+ "p90": 67.0277347273069,
2597
+ "valid_members": 50,
2598
+ "total_members": 50
2599
+ }
2600
+ },
2601
+ "official_scoring_allowed": false
2602
+ }
2603
+ },
2604
+ {
2605
+ "lead_hours": 120,
2606
+ "valid_time_utc": "2018-09-16T00:00:00Z",
2607
+ "summary": {
2608
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2609
+ "members": 50,
2610
+ "definitions": {
2611
+ "units": "km",
2612
+ "quantity_kind": "radius_not_diameter",
2613
+ "thresholds_kt": [
2614
+ 34,
2615
+ 50,
2616
+ 64
2617
+ ],
2618
+ "quadrant_order": [
2619
+ "NE",
2620
+ "SE",
2621
+ "SW",
2622
+ "NW"
2623
+ ],
2624
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2625
+ "target_wind_averaging_seconds": 60,
2626
+ "validated_wind_averaging_seconds": null,
2627
+ "validated_surface_height_m": null,
2628
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2629
+ "official_scoring_allowed": false
2630
+ },
2631
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2632
+ "estimates": {
2633
+ "wind_estimate_kt": {
2634
+ "mean": 104.85431516582503,
2635
+ "p10": 103.29189868308315,
2636
+ "p90": 107.19399012825095,
2637
+ "valid_members": 50,
2638
+ "total_members": 50
2639
+ },
2640
+ "rmw_persistence_km": {
2641
+ "mean": 9.259999999999998,
2642
+ "p10": 9.26,
2643
+ "p90": 9.26,
2644
+ "valid_members": 50,
2645
+ "total_members": 50
2646
+ },
2647
+ "r34_NE_estimate_km": {
2648
+ "mean": 258.5012595368126,
2649
+ "p10": 252.93047167597734,
2650
+ "p90": 266.87701195776447,
2651
+ "valid_members": 50,
2652
+ "total_members": 50
2653
+ },
2654
+ "r34_SE_estimate_km": {
2655
+ "mean": 198.62692125030287,
2656
+ "p10": 194.14224864388166,
2657
+ "p90": 205.37388688511803,
2658
+ "valid_members": 50,
2659
+ "total_members": 50
2660
+ },
2661
+ "r34_SW_estimate_km": {
2662
+ "mean": 198.62692125030287,
2663
+ "p10": 194.14224864388166,
2664
+ "p90": 205.37388688511803,
2665
+ "valid_members": 50,
2666
+ "total_members": 50
2667
+ },
2668
+ "r34_NW_estimate_km": {
2669
+ "mean": 258.5012595368126,
2670
+ "p10": 252.93047167597734,
2671
+ "p90": 266.87701195776447,
2672
+ "valid_members": 50,
2673
+ "total_members": 50
2674
+ },
2675
+ "r50_NE_estimate_km": {
2676
+ "mean": 123.65370860079048,
2677
+ "p10": 119.11799448943927,
2678
+ "p90": 130.53612026181253,
2679
+ "valid_members": 50,
2680
+ "total_members": 50
2681
+ },
2682
+ "r50_SE_estimate_km": {
2683
+ "mean": 93.00002850463217,
2684
+ "p10": 89.53489172738873,
2685
+ "p90": 98.25981535519881,
2686
+ "valid_members": 50,
2687
+ "total_members": 50
2688
+ },
2689
+ "r50_SW_estimate_km": {
2690
+ "mean": 93.00002850463217,
2691
+ "p10": 89.53489172738873,
2692
+ "p90": 98.25981535519881,
2693
+ "valid_members": 50,
2694
+ "total_members": 50
2695
+ },
2696
+ "r50_NW_estimate_km": {
2697
+ "mean": 123.65370860079048,
2698
+ "p10": 119.11799448943927,
2699
+ "p90": 130.53612026181253,
2700
+ "valid_members": 50,
2701
+ "total_members": 50
2702
+ },
2703
+ "r64_NE_estimate_km": {
2704
+ "mean": 55.04720672340676,
2705
+ "p10": 52.10190683532612,
2706
+ "p90": 59.56237514628805,
2707
+ "valid_members": 50,
2708
+ "total_members": 50
2709
+ },
2710
+ "r64_SE_estimate_km": {
2711
+ "mean": 44.514642404941334,
2712
+ "p10": 42.41468482395419,
2713
+ "p90": 47.72149384506823,
2714
+ "valid_members": 50,
2715
+ "total_members": 50
2716
+ },
2717
+ "r64_SW_estimate_km": {
2718
+ "mean": 44.514642404941334,
2719
+ "p10": 42.41468482395419,
2720
+ "p90": 47.72149384506823,
2721
+ "valid_members": 50,
2722
+ "total_members": 50
2723
+ },
2724
+ "r64_NW_estimate_km": {
2725
+ "mean": 55.04720672340676,
2726
+ "p10": 52.10190683532612,
2727
+ "p90": 59.56237514628805,
2728
+ "valid_members": 50,
2729
+ "total_members": 50
2730
+ }
2731
+ },
2732
+ "official_scoring_allowed": false
2733
+ }
2734
+ }
2735
+ ],
2736
+ "official_wind_or_radius_skill_score": null,
2737
+ "physical_50_member_means_verified": true,
2738
+ "observed_plus_zero_alignment_verified": true,
2739
+ "coverage": {
2740
+ "wind_estimate_kt": 20,
2741
+ "rmw_persistence_km": 20,
2742
+ "r34_NE_estimate_km": 20,
2743
+ "r34_SE_estimate_km": 20,
2744
+ "r34_SW_estimate_km": 20,
2745
+ "r34_NW_estimate_km": 20,
2746
+ "r50_NE_estimate_km": 20,
2747
+ "r50_SE_estimate_km": 20,
2748
+ "r50_SW_estimate_km": 20,
2749
+ "r50_NW_estimate_km": 20,
2750
+ "r64_NE_estimate_km": 20,
2751
+ "r64_SE_estimate_km": 20,
2752
+ "r64_SW_estimate_km": 20,
2753
+ "r64_NW_estimate_km": 20
2754
+ },
2755
+ "warning": "Retrospective development examples, not untouched tests. RMW is persistence; no validated wind-period calibration.",
2756
+ "chart": "mangkhut_wind_radius.png",
2757
+ "source_receipt_sha256": "a0042456e27a892b2af1344af143514f08224a9eba9291841f03c994e86f8be8",
2758
+ "source_reference": "Original immutable /Volumes/D member archive; original files unchanged."
2759
+ }
evaluation/storm_structure/mangkhut_wind_radius.png ADDED

Git LFS Details

  • SHA256: 191402447880b4d87d1d13f8a38f3dfbcff4b769852c36c354b6e34419a86805
  • Pointer size: 131 Bytes
  • Size of remote file: 477 kB
evaluation/storm_structure/meranti_structure.json ADDED
@@ -0,0 +1,2759 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "frozen Trackformer 1.2 pressure + separate experimental structure candidate",
3
+ "method": "pressure-scaled-issue-structure-experimental-v1",
4
+ "storm_id": "2016253N13144",
5
+ "issue_time_utc": "2016-09-10T00:00:00Z",
6
+ "actual_members": 50,
7
+ "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
8
+ "source_file_sha256": {
9
+ "weather-history.npz": "262bdd148cbfcc5a9e2d03809d5a8ae4f51cedaba00607d66b59e8cb44860d21",
10
+ "model-inputs.npz": "5a65f65e765edd48adfa45938d4d452fbec001f7e567afe1b930b5d44e14f9e6",
11
+ "ensemble-members.npz": "d04b729f31733e63f937ad6a523e8a034cc9e93c6b2775dc1d18ceeb2ad9987b",
12
+ "meranti_video.npz": "565343166656155e8f227372cce2947536afe83593820c89790606e5ac909baf",
13
+ "meranti_video.json": "0f4a9461318bef6fc116776c2ba0a1b6f900db449e5619977b8c8041114c31db",
14
+ "meranti_coastlines.json": "2af08a831beff87de1847e3c5e34faf29aabcd3965d81ffc18fedc6f18a4076d"
15
+ },
16
+ "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
17
+ "future_labels_used_for_diagnostics": false,
18
+ "initial": {
19
+ "method": "pressure-scaled-issue-structure-experimental-v1",
20
+ "storm_id": "2016253N13144",
21
+ "issue_time_utc": "2016-09-10T00:00:00Z",
22
+ "input_wind_kt": 35.0,
23
+ "input_model_pressure_hpa": 1004.0,
24
+ "ambient_pressure_hpa": 1010.0,
25
+ "pressure_deficit_hpa": 6.0,
26
+ "rmw_persistence_km": 74.08,
27
+ "native_quadrant_radii_km": {
28
+ "r34_NE": 92.60000000000001,
29
+ "r34_SE": 129.64000000000001,
30
+ "r34_SW": 74.08,
31
+ "r34_NW": 74.08,
32
+ "r50_NE": null,
33
+ "r50_SE": null,
34
+ "r50_SW": null,
35
+ "r50_NW": null,
36
+ "r64_NE": null,
37
+ "r64_SE": null,
38
+ "r64_SW": null,
39
+ "r64_NW": null
40
+ },
41
+ "holland_inspired_tail_b": 2.5,
42
+ "source_agency": "jtwc_wp",
43
+ "source_track_type": "main",
44
+ "usa_reference_center": [
45
+ 14.8,
46
+ 139.7
47
+ ],
48
+ "model_origin": [
49
+ 14.5,
50
+ 140.0
51
+ ],
52
+ "definitions": {
53
+ "units": "km",
54
+ "quantity_kind": "radius_not_diameter",
55
+ "thresholds_kt": [
56
+ 34,
57
+ 50,
58
+ 64
59
+ ],
60
+ "quadrant_order": [
61
+ "NE",
62
+ "SE",
63
+ "SW",
64
+ "NW"
65
+ ],
66
+ "quadrant_statistic": "maximum_extent_within_quadrant",
67
+ "target_wind_averaging_seconds": 60,
68
+ "validated_wind_averaging_seconds": null,
69
+ "validated_surface_height_m": null,
70
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
71
+ "official_scoring_allowed": false
72
+ },
73
+ "mixed_agency_initialization": "USA 1-minute wind/radii; model TOKYO pressure. No conversion between wind periods.",
74
+ "calibration": "none; initialization is issue assimilation, not future-target fitting"
75
+ },
76
+ "initial_ambient": {
77
+ "cells": 25,
78
+ "candidate_cells": 25,
79
+ "quadrant_cells": {
80
+ "NE": 8,
81
+ "SE": 6,
82
+ "SW": 5,
83
+ "NW": 6
84
+ },
85
+ "annulus_km": [
86
+ 600,
87
+ 1000
88
+ ],
89
+ "statistic": "median_available_physical_cells",
90
+ "value_hpa": 1010.0,
91
+ "status": "available"
92
+ },
93
+ "definitions": {
94
+ "units": "km",
95
+ "quantity_kind": "radius_not_diameter",
96
+ "thresholds_kt": [
97
+ 34,
98
+ 50,
99
+ 64
100
+ ],
101
+ "quadrant_order": [
102
+ "NE",
103
+ "SE",
104
+ "SW",
105
+ "NW"
106
+ ],
107
+ "quadrant_statistic": "maximum_extent_within_quadrant",
108
+ "target_wind_averaging_seconds": 60,
109
+ "validated_wind_averaging_seconds": null,
110
+ "validated_surface_height_m": null,
111
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
112
+ "official_scoring_allowed": false
113
+ },
114
+ "points": [
115
+ {
116
+ "lead_hours": 6,
117
+ "valid_time_utc": "2016-09-10T06:00:00Z",
118
+ "summary": {
119
+ "method": "pressure-scaled-issue-structure-experimental-v1",
120
+ "members": 50,
121
+ "definitions": {
122
+ "units": "km",
123
+ "quantity_kind": "radius_not_diameter",
124
+ "thresholds_kt": [
125
+ 34,
126
+ 50,
127
+ 64
128
+ ],
129
+ "quadrant_order": [
130
+ "NE",
131
+ "SE",
132
+ "SW",
133
+ "NW"
134
+ ],
135
+ "quadrant_statistic": "maximum_extent_within_quadrant",
136
+ "target_wind_averaging_seconds": 60,
137
+ "validated_wind_averaging_seconds": null,
138
+ "validated_surface_height_m": null,
139
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
140
+ "official_scoring_allowed": false
141
+ },
142
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
143
+ "estimates": {
144
+ "wind_estimate_kt": {
145
+ "mean": 40.56985957083135,
146
+ "p10": 40.06417720968895,
147
+ "p90": 41.008438972160846,
148
+ "valid_members": 50,
149
+ "total_members": 50
150
+ },
151
+ "rmw_persistence_km": {
152
+ "mean": 74.07999999999998,
153
+ "p10": 74.08,
154
+ "p90": 74.08,
155
+ "valid_members": 50,
156
+ "total_members": 50
157
+ },
158
+ "r34_NE_estimate_km": {
159
+ "mean": 104.2117422412441,
160
+ "p10": 103.17192499008739,
161
+ "p90": 105.11268776529992,
162
+ "valid_members": 50,
163
+ "total_members": 50
164
+ },
165
+ "r34_SE_estimate_km": {
166
+ "mean": 145.89643913774177,
167
+ "p10": 144.44069498612237,
168
+ "p90": 147.1577628714199,
169
+ "valid_members": 50,
170
+ "total_members": 50
171
+ },
172
+ "r34_SW_estimate_km": {
173
+ "mean": 85.3253238787195,
174
+ "p10": 84.47395394840743,
175
+ "p90": 86.06298997069582,
176
+ "valid_members": 50,
177
+ "total_members": 50
178
+ },
179
+ "r34_NW_estimate_km": {
180
+ "mean": 85.3253238787195,
181
+ "p10": 84.47395394840743,
182
+ "p90": 86.06298997069582,
183
+ "valid_members": 50,
184
+ "total_members": 50
185
+ },
186
+ "r50_NE_estimate_km": {
187
+ "mean": 0.0,
188
+ "p10": 0.0,
189
+ "p90": 0.0,
190
+ "valid_members": 50,
191
+ "total_members": 50
192
+ },
193
+ "r50_SE_estimate_km": {
194
+ "mean": 0.0,
195
+ "p10": 0.0,
196
+ "p90": 0.0,
197
+ "valid_members": 50,
198
+ "total_members": 50
199
+ },
200
+ "r50_SW_estimate_km": {
201
+ "mean": 0.0,
202
+ "p10": 0.0,
203
+ "p90": 0.0,
204
+ "valid_members": 50,
205
+ "total_members": 50
206
+ },
207
+ "r50_NW_estimate_km": {
208
+ "mean": 0.0,
209
+ "p10": 0.0,
210
+ "p90": 0.0,
211
+ "valid_members": 50,
212
+ "total_members": 50
213
+ },
214
+ "r64_NE_estimate_km": {
215
+ "mean": 0.0,
216
+ "p10": 0.0,
217
+ "p90": 0.0,
218
+ "valid_members": 50,
219
+ "total_members": 50
220
+ },
221
+ "r64_SE_estimate_km": {
222
+ "mean": 0.0,
223
+ "p10": 0.0,
224
+ "p90": 0.0,
225
+ "valid_members": 50,
226
+ "total_members": 50
227
+ },
228
+ "r64_SW_estimate_km": {
229
+ "mean": 0.0,
230
+ "p10": 0.0,
231
+ "p90": 0.0,
232
+ "valid_members": 50,
233
+ "total_members": 50
234
+ },
235
+ "r64_NW_estimate_km": {
236
+ "mean": 0.0,
237
+ "p10": 0.0,
238
+ "p90": 0.0,
239
+ "valid_members": 50,
240
+ "total_members": 50
241
+ }
242
+ },
243
+ "official_scoring_allowed": false
244
+ }
245
+ },
246
+ {
247
+ "lead_hours": 12,
248
+ "valid_time_utc": "2016-09-10T12:00:00Z",
249
+ "summary": {
250
+ "method": "pressure-scaled-issue-structure-experimental-v1",
251
+ "members": 50,
252
+ "definitions": {
253
+ "units": "km",
254
+ "quantity_kind": "radius_not_diameter",
255
+ "thresholds_kt": [
256
+ 34,
257
+ 50,
258
+ 64
259
+ ],
260
+ "quadrant_order": [
261
+ "NE",
262
+ "SE",
263
+ "SW",
264
+ "NW"
265
+ ],
266
+ "quadrant_statistic": "maximum_extent_within_quadrant",
267
+ "target_wind_averaging_seconds": 60,
268
+ "validated_wind_averaging_seconds": null,
269
+ "validated_surface_height_m": null,
270
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
271
+ "official_scoring_allowed": false
272
+ },
273
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
274
+ "estimates": {
275
+ "wind_estimate_kt": {
276
+ "mean": 47.23898297424208,
277
+ "p10": 46.65684287836224,
278
+ "p90": 47.96574913706004,
279
+ "valid_members": 50,
280
+ "total_members": 50
281
+ },
282
+ "rmw_persistence_km": {
283
+ "mean": 74.07999999999998,
284
+ "p10": 74.08,
285
+ "p90": 74.08,
286
+ "valid_members": 50,
287
+ "total_members": 50
288
+ },
289
+ "r34_NE_estimate_km": {
290
+ "mean": 117.70447755413704,
291
+ "p10": 116.54370191318907,
292
+ "p90": 119.15205488226775,
293
+ "valid_members": 50,
294
+ "total_members": 50
295
+ },
296
+ "r34_SE_estimate_km": {
297
+ "mean": 164.78626857579184,
298
+ "p10": 163.1611826784647,
299
+ "p90": 166.81287683517485,
300
+ "valid_members": 50,
301
+ "total_members": 50
302
+ },
303
+ "r34_SW_estimate_km": {
304
+ "mean": 96.37275467511954,
305
+ "p10": 95.42234778829165,
306
+ "p90": 97.55798583723094,
307
+ "valid_members": 50,
308
+ "total_members": 50
309
+ },
310
+ "r34_NW_estimate_km": {
311
+ "mean": 96.37275467511954,
312
+ "p10": 95.42234778829165,
313
+ "p90": 97.55798583723094,
314
+ "valid_members": 50,
315
+ "total_members": 50
316
+ },
317
+ "r50_NE_estimate_km": {
318
+ "mean": 0.0,
319
+ "p10": 0.0,
320
+ "p90": 0.0,
321
+ "valid_members": 50,
322
+ "total_members": 50
323
+ },
324
+ "r50_SE_estimate_km": {
325
+ "mean": 0.0,
326
+ "p10": 0.0,
327
+ "p90": 0.0,
328
+ "valid_members": 50,
329
+ "total_members": 50
330
+ },
331
+ "r50_SW_estimate_km": {
332
+ "mean": 0.0,
333
+ "p10": 0.0,
334
+ "p90": 0.0,
335
+ "valid_members": 50,
336
+ "total_members": 50
337
+ },
338
+ "r50_NW_estimate_km": {
339
+ "mean": 0.0,
340
+ "p10": 0.0,
341
+ "p90": 0.0,
342
+ "valid_members": 50,
343
+ "total_members": 50
344
+ },
345
+ "r64_NE_estimate_km": {
346
+ "mean": 0.0,
347
+ "p10": 0.0,
348
+ "p90": 0.0,
349
+ "valid_members": 50,
350
+ "total_members": 50
351
+ },
352
+ "r64_SE_estimate_km": {
353
+ "mean": 0.0,
354
+ "p10": 0.0,
355
+ "p90": 0.0,
356
+ "valid_members": 50,
357
+ "total_members": 50
358
+ },
359
+ "r64_SW_estimate_km": {
360
+ "mean": 0.0,
361
+ "p10": 0.0,
362
+ "p90": 0.0,
363
+ "valid_members": 50,
364
+ "total_members": 50
365
+ },
366
+ "r64_NW_estimate_km": {
367
+ "mean": 0.0,
368
+ "p10": 0.0,
369
+ "p90": 0.0,
370
+ "valid_members": 50,
371
+ "total_members": 50
372
+ }
373
+ },
374
+ "official_scoring_allowed": false
375
+ }
376
+ },
377
+ {
378
+ "lead_hours": 18,
379
+ "valid_time_utc": "2016-09-10T18:00:00Z",
380
+ "summary": {
381
+ "method": "pressure-scaled-issue-structure-experimental-v1",
382
+ "members": 50,
383
+ "definitions": {
384
+ "units": "km",
385
+ "quantity_kind": "radius_not_diameter",
386
+ "thresholds_kt": [
387
+ 34,
388
+ 50,
389
+ 64
390
+ ],
391
+ "quadrant_order": [
392
+ "NE",
393
+ "SE",
394
+ "SW",
395
+ "NW"
396
+ ],
397
+ "quadrant_statistic": "maximum_extent_within_quadrant",
398
+ "target_wind_averaging_seconds": 60,
399
+ "validated_wind_averaging_seconds": null,
400
+ "validated_surface_height_m": null,
401
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
402
+ "official_scoring_allowed": false
403
+ },
404
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
405
+ "estimates": {
406
+ "wind_estimate_kt": {
407
+ "mean": 53.30336902718364,
408
+ "p10": 52.71521497661506,
409
+ "p90": 54.05718749558815,
410
+ "valid_members": 50,
411
+ "total_members": 50
412
+ },
413
+ "rmw_persistence_km": {
414
+ "mean": 74.07999999999998,
415
+ "p10": 74.08,
416
+ "p90": 74.08,
417
+ "valid_members": 50,
418
+ "total_members": 50
419
+ },
420
+ "r34_NE_estimate_km": {
421
+ "mean": 129.64544208390555,
422
+ "p10": 128.5006527364064,
423
+ "p90": 131.11105339135824,
424
+ "valid_members": 50,
425
+ "total_members": 50
426
+ },
427
+ "r34_SE_estimate_km": {
428
+ "mean": 181.5036189174677,
429
+ "p10": 179.90091383096896,
430
+ "p90": 183.55547474790154,
431
+ "valid_members": 50,
432
+ "total_members": 50
433
+ },
434
+ "r34_SW_estimate_km": {
435
+ "mean": 106.1496439585573,
436
+ "p10": 105.21232615014615,
437
+ "p90": 107.34964078040512,
438
+ "valid_members": 50,
439
+ "total_members": 50
440
+ },
441
+ "r34_NW_estimate_km": {
442
+ "mean": 106.1496439585573,
443
+ "p10": 105.21232615014615,
444
+ "p90": 107.34964078040512,
445
+ "valid_members": 50,
446
+ "total_members": 50
447
+ },
448
+ "r50_NE_estimate_km": {
449
+ "mean": 95.22793857551062,
450
+ "p10": 94.38706111839961,
451
+ "p90": 96.30446808027604,
452
+ "valid_members": 50,
453
+ "total_members": 50
454
+ },
455
+ "r50_SE_estimate_km": {
456
+ "mean": 133.31911400571482,
457
+ "p10": 132.14188556575948,
458
+ "p90": 134.82625531238645,
459
+ "valid_members": 50,
460
+ "total_members": 50
461
+ },
462
+ "r50_SW_estimate_km": {
463
+ "mean": 77.96966566827494,
464
+ "p10": 77.28118143581467,
465
+ "p90": 78.85109444667948,
466
+ "valid_members": 50,
467
+ "total_members": 50
468
+ },
469
+ "r50_NW_estimate_km": {
470
+ "mean": 77.96966566827494,
471
+ "p10": 77.28118143581467,
472
+ "p90": 78.85109444667948,
473
+ "valid_members": 50,
474
+ "total_members": 50
475
+ },
476
+ "r64_NE_estimate_km": {
477
+ "mean": 0.0,
478
+ "p10": 0.0,
479
+ "p90": 0.0,
480
+ "valid_members": 50,
481
+ "total_members": 50
482
+ },
483
+ "r64_SE_estimate_km": {
484
+ "mean": 0.0,
485
+ "p10": 0.0,
486
+ "p90": 0.0,
487
+ "valid_members": 50,
488
+ "total_members": 50
489
+ },
490
+ "r64_SW_estimate_km": {
491
+ "mean": 0.0,
492
+ "p10": 0.0,
493
+ "p90": 0.0,
494
+ "valid_members": 50,
495
+ "total_members": 50
496
+ },
497
+ "r64_NW_estimate_km": {
498
+ "mean": 0.0,
499
+ "p10": 0.0,
500
+ "p90": 0.0,
501
+ "valid_members": 50,
502
+ "total_members": 50
503
+ }
504
+ },
505
+ "official_scoring_allowed": false
506
+ }
507
+ },
508
+ {
509
+ "lead_hours": 24,
510
+ "valid_time_utc": "2016-09-11T00:00:00Z",
511
+ "summary": {
512
+ "method": "pressure-scaled-issue-structure-experimental-v1",
513
+ "members": 50,
514
+ "definitions": {
515
+ "units": "km",
516
+ "quantity_kind": "radius_not_diameter",
517
+ "thresholds_kt": [
518
+ 34,
519
+ 50,
520
+ 64
521
+ ],
522
+ "quadrant_order": [
523
+ "NE",
524
+ "SE",
525
+ "SW",
526
+ "NW"
527
+ ],
528
+ "quadrant_statistic": "maximum_extent_within_quadrant",
529
+ "target_wind_averaging_seconds": 60,
530
+ "validated_wind_averaging_seconds": null,
531
+ "validated_surface_height_m": null,
532
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
533
+ "official_scoring_allowed": false
534
+ },
535
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
536
+ "estimates": {
537
+ "wind_estimate_kt": {
538
+ "mean": 64.22690247912742,
539
+ "p10": 63.405659288111714,
540
+ "p90": 65.07899140776867,
541
+ "valid_members": 50,
542
+ "total_members": 50
543
+ },
544
+ "rmw_persistence_km": {
545
+ "mean": 74.07999999999998,
546
+ "p10": 74.08,
547
+ "p90": 74.08,
548
+ "valid_members": 50,
549
+ "total_members": 50
550
+ },
551
+ "r34_NE_estimate_km": {
552
+ "mean": 150.49660865752196,
553
+ "p10": 148.9563318135483,
554
+ "p90": 152.09299149728477,
555
+ "valid_members": 50,
556
+ "total_members": 50
557
+ },
558
+ "r34_SE_estimate_km": {
559
+ "mean": 210.6952521205308,
560
+ "p10": 208.53886453896763,
561
+ "p90": 212.93018809619872,
562
+ "valid_members": 50,
563
+ "total_members": 50
564
+ },
565
+ "r34_SW_estimate_km": {
566
+ "mean": 123.22192874028912,
567
+ "p10": 121.96079810617398,
568
+ "p90": 124.52899721364668,
569
+ "valid_members": 50,
570
+ "total_members": 50
571
+ },
572
+ "r34_NW_estimate_km": {
573
+ "mean": 123.22192874028912,
574
+ "p10": 121.96079810617398,
575
+ "p90": 124.52899721364668,
576
+ "valid_members": 50,
577
+ "total_members": 50
578
+ },
579
+ "r50_NE_estimate_km": {
580
+ "mean": 110.54366103966797,
581
+ "p10": 109.41228776244719,
582
+ "p90": 111.71624562547662,
583
+ "valid_members": 50,
584
+ "total_members": 50
585
+ },
586
+ "r50_SE_estimate_km": {
587
+ "mean": 154.7611254555352,
588
+ "p10": 153.17720286742608,
589
+ "p90": 156.40274387566726,
590
+ "valid_members": 50,
591
+ "total_members": 50
592
+ },
593
+ "r50_SW_estimate_km": {
594
+ "mean": 90.50970147984017,
595
+ "p10": 89.58336833128654,
596
+ "p90": 91.46977716236455,
597
+ "valid_members": 50,
598
+ "total_members": 50
599
+ },
600
+ "r50_NW_estimate_km": {
601
+ "mean": 90.50970147984017,
602
+ "p10": 89.58336833128654,
603
+ "p90": 91.46977716236455,
604
+ "valid_members": 50,
605
+ "total_members": 50
606
+ },
607
+ "r64_NE_estimate_km": {
608
+ "mean": 51.08514087095777,
609
+ "p10": 0.0,
610
+ "p90": 84.25473270580885,
611
+ "valid_members": 50,
612
+ "total_members": 50
613
+ },
614
+ "r64_SE_estimate_km": {
615
+ "mean": 57.41547302705215,
616
+ "p10": 0.0,
617
+ "p90": 102.29972001221482,
618
+ "valid_members": 50,
619
+ "total_members": 50
620
+ },
621
+ "r64_SW_estimate_km": {
622
+ "mean": 47.77543865174226,
623
+ "p10": 0.0,
624
+ "p90": 75.07747280611476,
625
+ "valid_members": 50,
626
+ "total_members": 50
627
+ },
628
+ "r64_NW_estimate_km": {
629
+ "mean": 47.77543865174226,
630
+ "p10": 0.0,
631
+ "p90": 75.07747280611476,
632
+ "valid_members": 50,
633
+ "total_members": 50
634
+ }
635
+ },
636
+ "official_scoring_allowed": false
637
+ }
638
+ },
639
+ {
640
+ "lead_hours": 30,
641
+ "valid_time_utc": "2016-09-11T06:00:00Z",
642
+ "summary": {
643
+ "method": "pressure-scaled-issue-structure-experimental-v1",
644
+ "members": 50,
645
+ "definitions": {
646
+ "units": "km",
647
+ "quantity_kind": "radius_not_diameter",
648
+ "thresholds_kt": [
649
+ 34,
650
+ 50,
651
+ 64
652
+ ],
653
+ "quadrant_order": [
654
+ "NE",
655
+ "SE",
656
+ "SW",
657
+ "NW"
658
+ ],
659
+ "quadrant_statistic": "maximum_extent_within_quadrant",
660
+ "target_wind_averaging_seconds": 60,
661
+ "validated_wind_averaging_seconds": null,
662
+ "validated_surface_height_m": null,
663
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
664
+ "official_scoring_allowed": false
665
+ },
666
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
667
+ "estimates": {
668
+ "wind_estimate_kt": {
669
+ "mean": 74.09823506793701,
670
+ "p10": 73.02406677608307,
671
+ "p90": 75.09541627143719,
672
+ "valid_members": 50,
673
+ "total_members": 50
674
+ },
675
+ "rmw_persistence_km": {
676
+ "mean": 74.07999999999998,
677
+ "p10": 74.08,
678
+ "p90": 74.08,
679
+ "valid_members": 50,
680
+ "total_members": 50
681
+ },
682
+ "r34_NE_estimate_km": {
683
+ "mean": 168.73275508871728,
684
+ "p10": 166.77438890426006,
685
+ "p90": 170.54826047092413,
686
+ "valid_members": 50,
687
+ "total_members": 50
688
+ },
689
+ "r34_SE_estimate_km": {
690
+ "mean": 236.22585712420417,
691
+ "p10": 233.4841444659641,
692
+ "p90": 238.7675646592938,
693
+ "valid_members": 50,
694
+ "total_members": 50
695
+ },
696
+ "r34_SW_estimate_km": {
697
+ "mean": 138.15311659951746,
698
+ "p10": 136.5496674548412,
699
+ "p90": 139.6395957755565,
700
+ "valid_members": 50,
701
+ "total_members": 50
702
+ },
703
+ "r34_NW_estimate_km": {
704
+ "mean": 138.15311659951746,
705
+ "p10": 136.5496674548412,
706
+ "p90": 139.6395957755565,
707
+ "valid_members": 50,
708
+ "total_members": 50
709
+ },
710
+ "r50_NE_estimate_km": {
711
+ "mean": 123.93858340863159,
712
+ "p10": 122.50011267087012,
713
+ "p90": 125.27211918313583,
714
+ "valid_members": 50,
715
+ "total_members": 50
716
+ },
717
+ "r50_SE_estimate_km": {
718
+ "mean": 173.51401677208426,
719
+ "p10": 171.5001577392182,
720
+ "p90": 175.38096685639016,
721
+ "valid_members": 50,
722
+ "total_members": 50
723
+ },
724
+ "r50_SW_estimate_km": {
725
+ "mean": 101.47704608882214,
726
+ "p10": 100.2992711188439,
727
+ "p90": 102.5689035841131,
728
+ "valid_members": 50,
729
+ "total_members": 50
730
+ },
731
+ "r50_NW_estimate_km": {
732
+ "mean": 101.47704608882214,
733
+ "p10": 100.2992711188439,
734
+ "p90": 102.5689035841131,
735
+ "valid_members": 50,
736
+ "total_members": 50
737
+ },
738
+ "r64_NE_estimate_km": {
739
+ "mean": 101.72754230037073,
740
+ "p10": 100.54685999144833,
741
+ "p90": 102.82209504721527,
742
+ "valid_members": 50,
743
+ "total_members": 50
744
+ },
745
+ "r64_SE_estimate_km": {
746
+ "mean": 142.41855922051903,
747
+ "p10": 140.76560398802766,
748
+ "p90": 143.95093306610138,
749
+ "valid_members": 50,
750
+ "total_members": 50
751
+ },
752
+ "r64_SW_estimate_km": {
753
+ "mean": 83.29133845657933,
754
+ "p10": 82.32463261096105,
755
+ "p90": 84.1875241034007,
756
+ "valid_members": 50,
757
+ "total_members": 50
758
+ },
759
+ "r64_NW_estimate_km": {
760
+ "mean": 83.29133845657933,
761
+ "p10": 82.32463261096105,
762
+ "p90": 84.1875241034007,
763
+ "valid_members": 50,
764
+ "total_members": 50
765
+ }
766
+ },
767
+ "official_scoring_allowed": false
768
+ }
769
+ },
770
+ {
771
+ "lead_hours": 36,
772
+ "valid_time_utc": "2016-09-11T12:00:00Z",
773
+ "summary": {
774
+ "method": "pressure-scaled-issue-structure-experimental-v1",
775
+ "members": 50,
776
+ "definitions": {
777
+ "units": "km",
778
+ "quantity_kind": "radius_not_diameter",
779
+ "thresholds_kt": [
780
+ 34,
781
+ 50,
782
+ 64
783
+ ],
784
+ "quadrant_order": [
785
+ "NE",
786
+ "SE",
787
+ "SW",
788
+ "NW"
789
+ ],
790
+ "quadrant_statistic": "maximum_extent_within_quadrant",
791
+ "target_wind_averaging_seconds": 60,
792
+ "validated_wind_averaging_seconds": null,
793
+ "validated_surface_height_m": null,
794
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
795
+ "official_scoring_allowed": false
796
+ },
797
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
798
+ "estimates": {
799
+ "wind_estimate_kt": {
800
+ "mean": 88.39234665333719,
801
+ "p10": 87.2923608506073,
802
+ "p90": 89.29278211652155,
803
+ "valid_members": 50,
804
+ "total_members": 50
805
+ },
806
+ "rmw_persistence_km": {
807
+ "mean": 74.07999999999998,
808
+ "p10": 74.08,
809
+ "p90": 74.08,
810
+ "valid_members": 50,
811
+ "total_members": 50
812
+ },
813
+ "r34_NE_estimate_km": {
814
+ "mean": 194.30579319657184,
815
+ "p10": 192.37008740229865,
816
+ "p90": 195.88881019701876,
817
+ "valid_members": 50,
818
+ "total_members": 50
819
+ },
820
+ "r34_SE_estimate_km": {
821
+ "mean": 272.0281104752005,
822
+ "p10": 269.3181223632181,
823
+ "p90": 274.24433427582625,
824
+ "valid_members": 50,
825
+ "total_members": 50
826
+ },
827
+ "r34_SW_estimate_km": {
828
+ "mean": 159.0915225045282,
829
+ "p10": 157.50662698049098,
830
+ "p90": 160.38764744557346,
831
+ "valid_members": 50,
832
+ "total_members": 50
833
+ },
834
+ "r34_NW_estimate_km": {
835
+ "mean": 159.0915225045282,
836
+ "p10": 157.50662698049098,
837
+ "p90": 160.38764744557346,
838
+ "valid_members": 50,
839
+ "total_members": 50
840
+ },
841
+ "r50_NE_estimate_km": {
842
+ "mean": 142.72264294038035,
843
+ "p10": 141.30081684673328,
844
+ "p90": 143.88540997067048,
845
+ "valid_members": 50,
846
+ "total_members": 50
847
+ },
848
+ "r50_SE_estimate_km": {
849
+ "mean": 199.8117001165325,
850
+ "p10": 197.8211435854266,
851
+ "p90": 201.43957395893864,
852
+ "valid_members": 50,
853
+ "total_members": 50
854
+ },
855
+ "r50_SW_estimate_km": {
856
+ "mean": 116.85684810377478,
857
+ "p10": 115.69270124920239,
858
+ "p90": 117.80888547807875,
859
+ "valid_members": 50,
860
+ "total_members": 50
861
+ },
862
+ "r50_NW_estimate_km": {
863
+ "mean": 116.85684810377478,
864
+ "p10": 115.69270124920239,
865
+ "p90": 117.80888547807875,
866
+ "valid_members": 50,
867
+ "total_members": 50
868
+ },
869
+ "r64_NE_estimate_km": {
870
+ "mean": 117.14530937528127,
871
+ "p10": 115.97828882278412,
872
+ "p90": 118.0996968550003,
873
+ "valid_members": 50,
874
+ "total_members": 50
875
+ },
876
+ "r64_SE_estimate_km": {
877
+ "mean": 164.00343312539374,
878
+ "p10": 162.36960435189778,
879
+ "p90": 165.33957559700042,
880
+ "valid_members": 50,
881
+ "total_members": 50
882
+ },
883
+ "r64_SW_estimate_km": {
884
+ "mean": 95.91492521235999,
885
+ "p10": 94.95940518675266,
886
+ "p90": 96.69634791062282,
887
+ "valid_members": 50,
888
+ "total_members": 50
889
+ },
890
+ "r64_NW_estimate_km": {
891
+ "mean": 95.91492521235999,
892
+ "p10": 94.95940518675266,
893
+ "p90": 96.69634791062282,
894
+ "valid_members": 50,
895
+ "total_members": 50
896
+ }
897
+ },
898
+ "official_scoring_allowed": false
899
+ }
900
+ },
901
+ {
902
+ "lead_hours": 42,
903
+ "valid_time_utc": "2016-09-11T18:00:00Z",
904
+ "summary": {
905
+ "method": "pressure-scaled-issue-structure-experimental-v1",
906
+ "members": 50,
907
+ "definitions": {
908
+ "units": "km",
909
+ "quantity_kind": "radius_not_diameter",
910
+ "thresholds_kt": [
911
+ 34,
912
+ 50,
913
+ 64
914
+ ],
915
+ "quadrant_order": [
916
+ "NE",
917
+ "SE",
918
+ "SW",
919
+ "NW"
920
+ ],
921
+ "quadrant_statistic": "maximum_extent_within_quadrant",
922
+ "target_wind_averaging_seconds": 60,
923
+ "validated_wind_averaging_seconds": null,
924
+ "validated_surface_height_m": null,
925
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
926
+ "official_scoring_allowed": false
927
+ },
928
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
929
+ "estimates": {
930
+ "wind_estimate_kt": {
931
+ "mean": 101.69655681596605,
932
+ "p10": 100.80263146095031,
933
+ "p90": 102.7042133510193,
934
+ "valid_members": 50,
935
+ "total_members": 50
936
+ },
937
+ "rmw_persistence_km": {
938
+ "mean": 74.07999999999998,
939
+ "p10": 74.08,
940
+ "p90": 74.08,
941
+ "valid_members": 50,
942
+ "total_members": 50
943
+ },
944
+ "r34_NE_estimate_km": {
945
+ "mean": 217.37009600556513,
946
+ "p10": 215.8410460218834,
947
+ "p90": 219.0923227335286,
948
+ "valid_members": 50,
949
+ "total_members": 50
950
+ },
951
+ "r34_SE_estimate_km": {
952
+ "mean": 304.31813440779115,
953
+ "p10": 302.1774644306368,
954
+ "p90": 306.7292518269401,
955
+ "valid_members": 50,
956
+ "total_members": 50
957
+ },
958
+ "r34_SW_estimate_km": {
959
+ "mean": 177.97585420160783,
960
+ "p10": 176.72391577050115,
961
+ "p90": 179.38595972518584,
962
+ "valid_members": 50,
963
+ "total_members": 50
964
+ },
965
+ "r34_NW_estimate_km": {
966
+ "mean": 177.97585420160783,
967
+ "p10": 176.72391577050115,
968
+ "p90": 179.38595972518584,
969
+ "valid_members": 50,
970
+ "total_members": 50
971
+ },
972
+ "r50_NE_estimate_km": {
973
+ "mean": 159.66397135021614,
974
+ "p10": 158.54084449296275,
975
+ "p90": 160.92899153470876,
976
+ "valid_members": 50,
977
+ "total_members": 50
978
+ },
979
+ "r50_SE_estimate_km": {
980
+ "mean": 223.52955989030258,
981
+ "p10": 221.95718229014784,
982
+ "p90": 225.30058814859225,
983
+ "valid_members": 50,
984
+ "total_members": 50
985
+ },
986
+ "r50_SW_estimate_km": {
987
+ "mean": 130.72787935626727,
988
+ "p10": 129.808298119153,
989
+ "p90": 131.76363842365797,
990
+ "valid_members": 50,
991
+ "total_members": 50
992
+ },
993
+ "r50_NW_estimate_km": {
994
+ "mean": 130.72787935626727,
995
+ "p10": 129.808298119153,
996
+ "p90": 131.76363842365797,
997
+ "valid_members": 50,
998
+ "total_members": 50
999
+ },
1000
+ "r64_NE_estimate_km": {
1001
+ "mean": 131.05058128527162,
1002
+ "p10": 130.1287300607564,
1003
+ "p90": 132.08889712517848,
1004
+ "valid_members": 50,
1005
+ "total_members": 50
1006
+ },
1007
+ "r64_SE_estimate_km": {
1008
+ "mean": 183.47081379938027,
1009
+ "p10": 182.18022208505897,
1010
+ "p90": 184.92445597524986,
1011
+ "valid_members": 50,
1012
+ "total_members": 50
1013
+ },
1014
+ "r64_SW_estimate_km": {
1015
+ "mean": 107.3001281062429,
1016
+ "p10": 106.54534507884019,
1017
+ "p90": 108.15026872785694,
1018
+ "valid_members": 50,
1019
+ "total_members": 50
1020
+ },
1021
+ "r64_NW_estimate_km": {
1022
+ "mean": 107.3001281062429,
1023
+ "p10": 106.54534507884019,
1024
+ "p90": 108.15026872785694,
1025
+ "valid_members": 50,
1026
+ "total_members": 50
1027
+ }
1028
+ },
1029
+ "official_scoring_allowed": false
1030
+ }
1031
+ },
1032
+ {
1033
+ "lead_hours": 48,
1034
+ "valid_time_utc": "2016-09-12T00:00:00Z",
1035
+ "summary": {
1036
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1037
+ "members": 50,
1038
+ "definitions": {
1039
+ "units": "km",
1040
+ "quantity_kind": "radius_not_diameter",
1041
+ "thresholds_kt": [
1042
+ 34,
1043
+ 50,
1044
+ 64
1045
+ ],
1046
+ "quadrant_order": [
1047
+ "NE",
1048
+ "SE",
1049
+ "SW",
1050
+ "NW"
1051
+ ],
1052
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1053
+ "target_wind_averaging_seconds": 60,
1054
+ "validated_wind_averaging_seconds": null,
1055
+ "validated_surface_height_m": null,
1056
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1057
+ "official_scoring_allowed": false
1058
+ },
1059
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1060
+ "estimates": {
1061
+ "wind_estimate_kt": {
1062
+ "mean": 115.6814847493877,
1063
+ "p10": 114.90031971347966,
1064
+ "p90": 116.38885034164306,
1065
+ "valid_members": 50,
1066
+ "total_members": 50
1067
+ },
1068
+ "rmw_persistence_km": {
1069
+ "mean": 74.07999999999998,
1070
+ "p10": 74.08,
1071
+ "p90": 74.08,
1072
+ "valid_members": 50,
1073
+ "total_members": 50
1074
+ },
1075
+ "r34_NE_estimate_km": {
1076
+ "mean": 240.972046491686,
1077
+ "p10": 239.6699255083736,
1078
+ "p90": 242.15065766220837,
1079
+ "valid_members": 50,
1080
+ "total_members": 50
1081
+ },
1082
+ "r34_SE_estimate_km": {
1083
+ "mean": 337.36086508836047,
1084
+ "p10": 335.5378957117231,
1085
+ "p90": 339.01092072709173,
1086
+ "valid_members": 50,
1087
+ "total_members": 50
1088
+ },
1089
+ "r34_SW_estimate_km": {
1090
+ "mean": 197.30039504591912,
1091
+ "p10": 196.234259001737,
1092
+ "p90": 198.2654051080203,
1093
+ "valid_members": 50,
1094
+ "total_members": 50
1095
+ },
1096
+ "r34_NW_estimate_km": {
1097
+ "mean": 197.30039504591912,
1098
+ "p10": 196.234259001737,
1099
+ "p90": 198.2654051080203,
1100
+ "valid_members": 50,
1101
+ "total_members": 50
1102
+ },
1103
+ "r50_NE_estimate_km": {
1104
+ "mean": 177.0002159186905,
1105
+ "p10": 176.0437742958797,
1106
+ "p90": 177.86593638172283,
1107
+ "valid_members": 50,
1108
+ "total_members": 50
1109
+ },
1110
+ "r50_SE_estimate_km": {
1111
+ "mean": 247.8003022861667,
1112
+ "p10": 246.46128401423155,
1113
+ "p90": 249.012310934412,
1114
+ "valid_members": 50,
1115
+ "total_members": 50
1116
+ },
1117
+ "r50_SW_estimate_km": {
1118
+ "mean": 144.92225564086536,
1119
+ "p10": 144.13915107431373,
1120
+ "p90": 145.63108055164815,
1121
+ "valid_members": 50,
1122
+ "total_members": 50
1123
+ },
1124
+ "r50_NW_estimate_km": {
1125
+ "mean": 144.92225564086536,
1126
+ "p10": 144.13915107431373,
1127
+ "p90": 145.63108055164815,
1128
+ "valid_members": 50,
1129
+ "total_members": 50
1130
+ },
1131
+ "r64_NE_estimate_km": {
1132
+ "mean": 145.27999640497217,
1133
+ "p10": 144.49495874384664,
1134
+ "p90": 145.99057105090833,
1135
+ "valid_members": 50,
1136
+ "total_members": 50
1137
+ },
1138
+ "r64_SE_estimate_km": {
1139
+ "mean": 203.39199496696102,
1140
+ "p10": 202.29294224138528,
1141
+ "p90": 204.38679947127164,
1142
+ "valid_members": 50,
1143
+ "total_members": 50
1144
+ },
1145
+ "r64_SW_estimate_km": {
1146
+ "mean": 118.95072934926363,
1147
+ "p10": 118.30796499995006,
1148
+ "p90": 119.53252570445895,
1149
+ "valid_members": 50,
1150
+ "total_members": 50
1151
+ },
1152
+ "r64_NW_estimate_km": {
1153
+ "mean": 118.95072934926363,
1154
+ "p10": 118.30796499995006,
1155
+ "p90": 119.53252570445895,
1156
+ "valid_members": 50,
1157
+ "total_members": 50
1158
+ }
1159
+ },
1160
+ "official_scoring_allowed": false
1161
+ }
1162
+ },
1163
+ {
1164
+ "lead_hours": 54,
1165
+ "valid_time_utc": "2016-09-12T06:00:00Z",
1166
+ "summary": {
1167
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1168
+ "members": 50,
1169
+ "definitions": {
1170
+ "units": "km",
1171
+ "quantity_kind": "radius_not_diameter",
1172
+ "thresholds_kt": [
1173
+ 34,
1174
+ 50,
1175
+ 64
1176
+ ],
1177
+ "quadrant_order": [
1178
+ "NE",
1179
+ "SE",
1180
+ "SW",
1181
+ "NW"
1182
+ ],
1183
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1184
+ "target_wind_averaging_seconds": 60,
1185
+ "validated_wind_averaging_seconds": null,
1186
+ "validated_surface_height_m": null,
1187
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1188
+ "official_scoring_allowed": false
1189
+ },
1190
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1191
+ "estimates": {
1192
+ "wind_estimate_kt": {
1193
+ "mean": 125.77837246127169,
1194
+ "p10": 125.05592272248738,
1195
+ "p90": 126.46900229313772,
1196
+ "valid_members": 50,
1197
+ "total_members": 50
1198
+ },
1199
+ "rmw_persistence_km": {
1200
+ "mean": 74.07999999999998,
1201
+ "p10": 74.08,
1202
+ "p90": 74.08,
1203
+ "valid_members": 50,
1204
+ "total_members": 50
1205
+ },
1206
+ "r34_NE_estimate_km": {
1207
+ "mean": 257.65621700827035,
1208
+ "p10": 256.47200156655316,
1209
+ "p90": 258.7878151535587,
1210
+ "valid_members": 50,
1211
+ "total_members": 50
1212
+ },
1213
+ "r34_SE_estimate_km": {
1214
+ "mean": 360.7187038115785,
1215
+ "p10": 359.06080219317437,
1216
+ "p90": 362.3029412149822,
1217
+ "valid_members": 50,
1218
+ "total_members": 50
1219
+ },
1220
+ "r34_SW_estimate_km": {
1221
+ "mean": 210.96087343692258,
1222
+ "p10": 209.99127477238065,
1223
+ "p90": 211.88739070043565,
1224
+ "valid_members": 50,
1225
+ "total_members": 50
1226
+ },
1227
+ "r34_NW_estimate_km": {
1228
+ "mean": 210.96087343692258,
1229
+ "p10": 209.99127477238065,
1230
+ "p90": 211.88739070043565,
1231
+ "valid_members": 50,
1232
+ "total_members": 50
1233
+ },
1234
+ "r50_NE_estimate_km": {
1235
+ "mean": 189.25517173972415,
1236
+ "p10": 188.38533479419516,
1237
+ "p90": 190.08635991679816,
1238
+ "valid_members": 50,
1239
+ "total_members": 50
1240
+ },
1241
+ "r50_SE_estimate_km": {
1242
+ "mean": 264.9572404356138,
1243
+ "p10": 263.73946871187326,
1244
+ "p90": 266.1209038835175,
1245
+ "valid_members": 50,
1246
+ "total_members": 50
1247
+ },
1248
+ "r50_SW_estimate_km": {
1249
+ "mean": 154.95623119928615,
1250
+ "p10": 154.24403584104027,
1251
+ "p90": 155.63678215148911,
1252
+ "valid_members": 50,
1253
+ "total_members": 50
1254
+ },
1255
+ "r50_NW_estimate_km": {
1256
+ "mean": 154.95623119928615,
1257
+ "p10": 154.24403584104027,
1258
+ "p90": 155.63678215148911,
1259
+ "valid_members": 50,
1260
+ "total_members": 50
1261
+ },
1262
+ "r64_NE_estimate_km": {
1263
+ "mean": 155.33874084424858,
1264
+ "p10": 154.62478743089562,
1265
+ "p90": 156.0209717373038,
1266
+ "valid_members": 50,
1267
+ "total_members": 50
1268
+ },
1269
+ "r64_SE_estimate_km": {
1270
+ "mean": 217.474237181948,
1271
+ "p10": 216.4747024032539,
1272
+ "p90": 218.42936043222534,
1273
+ "valid_members": 50,
1274
+ "total_members": 50
1275
+ },
1276
+ "r64_SW_estimate_km": {
1277
+ "mean": 127.18651553454488,
1278
+ "p10": 126.60195274998233,
1279
+ "p90": 127.74510490900568,
1280
+ "valid_members": 50,
1281
+ "total_members": 50
1282
+ },
1283
+ "r64_NW_estimate_km": {
1284
+ "mean": 127.18651553454488,
1285
+ "p10": 126.60195274998233,
1286
+ "p90": 127.74510490900568,
1287
+ "valid_members": 50,
1288
+ "total_members": 50
1289
+ }
1290
+ },
1291
+ "official_scoring_allowed": false
1292
+ }
1293
+ },
1294
+ {
1295
+ "lead_hours": 60,
1296
+ "valid_time_utc": "2016-09-12T12:00:00Z",
1297
+ "summary": {
1298
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1299
+ "members": 50,
1300
+ "definitions": {
1301
+ "units": "km",
1302
+ "quantity_kind": "radius_not_diameter",
1303
+ "thresholds_kt": [
1304
+ 34,
1305
+ 50,
1306
+ 64
1307
+ ],
1308
+ "quadrant_order": [
1309
+ "NE",
1310
+ "SE",
1311
+ "SW",
1312
+ "NW"
1313
+ ],
1314
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1315
+ "target_wind_averaging_seconds": 60,
1316
+ "validated_wind_averaging_seconds": null,
1317
+ "validated_surface_height_m": null,
1318
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1319
+ "official_scoring_allowed": false
1320
+ },
1321
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1322
+ "estimates": {
1323
+ "wind_estimate_kt": {
1324
+ "mean": 132.41123620261155,
1325
+ "p10": 131.95006069945484,
1326
+ "p90": 133.00101121103611,
1327
+ "valid_members": 50,
1328
+ "total_members": 50
1329
+ },
1330
+ "rmw_persistence_km": {
1331
+ "mean": 74.07999999999998,
1332
+ "p10": 74.08,
1333
+ "p90": 74.08,
1334
+ "valid_members": 50,
1335
+ "total_members": 50
1336
+ },
1337
+ "r34_NE_estimate_km": {
1338
+ "mean": 268.4702112420642,
1339
+ "p10": 267.72210164865334,
1340
+ "p90": 269.4266216053616,
1341
+ "valid_members": 50,
1342
+ "total_members": 50
1343
+ },
1344
+ "r34_SE_estimate_km": {
1345
+ "mean": 375.85829573888986,
1346
+ "p10": 374.81094230811465,
1347
+ "p90": 377.1972702475063,
1348
+ "valid_members": 50,
1349
+ "total_members": 50
1350
+ },
1351
+ "r34_SW_estimate_km": {
1352
+ "mean": 219.81503459550925,
1353
+ "p10": 219.20250579614617,
1354
+ "p90": 220.5981135677464,
1355
+ "valid_members": 50,
1356
+ "total_members": 50
1357
+ },
1358
+ "r34_NW_estimate_km": {
1359
+ "mean": 219.81503459550925,
1360
+ "p10": 219.20250579614617,
1361
+ "p90": 220.5981135677464,
1362
+ "valid_members": 50,
1363
+ "total_members": 50
1364
+ },
1365
+ "r50_NE_estimate_km": {
1366
+ "mean": 197.1983308828367,
1367
+ "p10": 196.6488249899649,
1368
+ "p90": 197.90083909188064,
1369
+ "valid_members": 50,
1370
+ "total_members": 50
1371
+ },
1372
+ "r50_SE_estimate_km": {
1373
+ "mean": 276.0776632359714,
1374
+ "p10": 275.30835498595087,
1375
+ "p90": 277.0611747286329,
1376
+ "valid_members": 50,
1377
+ "total_members": 50
1378
+ },
1379
+ "r50_SW_estimate_km": {
1380
+ "mean": 161.4598421353488,
1381
+ "p10": 161.00992385095802,
1382
+ "p90": 162.03503394363244,
1383
+ "valid_members": 50,
1384
+ "total_members": 50
1385
+ },
1386
+ "r50_NW_estimate_km": {
1387
+ "mean": 161.4598421353488,
1388
+ "p10": 161.00992385095802,
1389
+ "p90": 162.03503394363244,
1390
+ "valid_members": 50,
1391
+ "total_members": 50
1392
+ },
1393
+ "r64_NE_estimate_km": {
1394
+ "mean": 161.8584059518077,
1395
+ "p10": 161.40737704358534,
1396
+ "p90": 162.43501762176888,
1397
+ "valid_members": 50,
1398
+ "total_members": 50
1399
+ },
1400
+ "r64_SE_estimate_km": {
1401
+ "mean": 226.60176833253078,
1402
+ "p10": 225.97032786101946,
1403
+ "p90": 227.40902467047644,
1404
+ "valid_members": 50,
1405
+ "total_members": 50
1406
+ },
1407
+ "r64_SW_estimate_km": {
1408
+ "mean": 132.52461395723014,
1409
+ "p10": 132.15532555608578,
1410
+ "p90": 132.99672560639337,
1411
+ "valid_members": 50,
1412
+ "total_members": 50
1413
+ },
1414
+ "r64_NW_estimate_km": {
1415
+ "mean": 132.52461395723014,
1416
+ "p10": 132.15532555608578,
1417
+ "p90": 132.99672560639337,
1418
+ "valid_members": 50,
1419
+ "total_members": 50
1420
+ }
1421
+ },
1422
+ "official_scoring_allowed": false
1423
+ }
1424
+ },
1425
+ {
1426
+ "lead_hours": 66,
1427
+ "valid_time_utc": "2016-09-12T18:00:00Z",
1428
+ "summary": {
1429
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1430
+ "members": 50,
1431
+ "definitions": {
1432
+ "units": "km",
1433
+ "quantity_kind": "radius_not_diameter",
1434
+ "thresholds_kt": [
1435
+ 34,
1436
+ 50,
1437
+ 64
1438
+ ],
1439
+ "quadrant_order": [
1440
+ "NE",
1441
+ "SE",
1442
+ "SW",
1443
+ "NW"
1444
+ ],
1445
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1446
+ "target_wind_averaging_seconds": 60,
1447
+ "validated_wind_averaging_seconds": null,
1448
+ "validated_surface_height_m": null,
1449
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1450
+ "official_scoring_allowed": false
1451
+ },
1452
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1453
+ "estimates": {
1454
+ "wind_estimate_kt": {
1455
+ "mean": 134.86092565295118,
1456
+ "p10": 134.31239569713082,
1457
+ "p90": 135.3805367651739,
1458
+ "valid_members": 50,
1459
+ "total_members": 50
1460
+ },
1461
+ "rmw_persistence_km": {
1462
+ "mean": 74.07999999999998,
1463
+ "p10": 74.08,
1464
+ "p90": 74.08,
1465
+ "valid_members": 50,
1466
+ "total_members": 50
1467
+ },
1468
+ "r34_NE_estimate_km": {
1469
+ "mean": 272.4364105365859,
1470
+ "p10": 271.54976260604997,
1471
+ "p90": 273.2760277276711,
1472
+ "valid_members": 50,
1473
+ "total_members": 50
1474
+ },
1475
+ "r34_SE_estimate_km": {
1476
+ "mean": 381.41097475122035,
1477
+ "p10": 380.16966764847,
1478
+ "p90": 382.5864388187395,
1479
+ "valid_members": 50,
1480
+ "total_members": 50
1481
+ },
1482
+ "r34_SW_estimate_km": {
1483
+ "mean": 223.06243486053117,
1484
+ "p10": 222.33647519214523,
1485
+ "p90": 223.7498872264808,
1486
+ "valid_members": 50,
1487
+ "total_members": 50
1488
+ },
1489
+ "r34_NW_estimate_km": {
1490
+ "mean": 223.06243486053117,
1491
+ "p10": 222.33647519214523,
1492
+ "p90": 223.7498872264808,
1493
+ "valid_members": 50,
1494
+ "total_members": 50
1495
+ },
1496
+ "r50_NE_estimate_km": {
1497
+ "mean": 200.1116070977654,
1498
+ "p10": 199.46034120434092,
1499
+ "p90": 200.72832769367994,
1500
+ "valid_members": 50,
1501
+ "total_members": 50
1502
+ },
1503
+ "r50_SE_estimate_km": {
1504
+ "mean": 280.1562499368715,
1505
+ "p10": 279.2444776860773,
1506
+ "p90": 281.0196587711519,
1507
+ "valid_members": 50,
1508
+ "total_members": 50
1509
+ },
1510
+ "r50_SW_estimate_km": {
1511
+ "mean": 163.84514182654405,
1512
+ "p10": 163.3119056278922,
1513
+ "p90": 164.35009341316345,
1514
+ "valid_members": 50,
1515
+ "total_members": 50
1516
+ },
1517
+ "r50_NW_estimate_km": {
1518
+ "mean": 163.84514182654405,
1519
+ "p10": 163.3119056278922,
1520
+ "p90": 164.35009341316345,
1521
+ "valid_members": 50,
1522
+ "total_members": 50
1523
+ },
1524
+ "r64_NE_estimate_km": {
1525
+ "mean": 164.2495937581884,
1526
+ "p10": 163.71504126533245,
1527
+ "p90": 164.75579181841283,
1528
+ "valid_members": 50,
1529
+ "total_members": 50
1530
+ },
1531
+ "r64_SE_estimate_km": {
1532
+ "mean": 229.9494312614638,
1533
+ "p10": 229.2010577714654,
1534
+ "p90": 230.65810854577796,
1535
+ "valid_members": 50,
1536
+ "total_members": 50
1537
+ },
1538
+ "r64_SW_estimate_km": {
1539
+ "mean": 134.48244394496768,
1540
+ "p10": 134.04476903806966,
1541
+ "p90": 134.89690312688444,
1542
+ "valid_members": 50,
1543
+ "total_members": 50
1544
+ },
1545
+ "r64_NW_estimate_km": {
1546
+ "mean": 134.48244394496768,
1547
+ "p10": 134.04476903806966,
1548
+ "p90": 134.89690312688444,
1549
+ "valid_members": 50,
1550
+ "total_members": 50
1551
+ }
1552
+ },
1553
+ "official_scoring_allowed": false
1554
+ }
1555
+ },
1556
+ {
1557
+ "lead_hours": 72,
1558
+ "valid_time_utc": "2016-09-13T00:00:00Z",
1559
+ "summary": {
1560
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1561
+ "members": 50,
1562
+ "definitions": {
1563
+ "units": "km",
1564
+ "quantity_kind": "radius_not_diameter",
1565
+ "thresholds_kt": [
1566
+ 34,
1567
+ 50,
1568
+ 64
1569
+ ],
1570
+ "quadrant_order": [
1571
+ "NE",
1572
+ "SE",
1573
+ "SW",
1574
+ "NW"
1575
+ ],
1576
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1577
+ "target_wind_averaging_seconds": 60,
1578
+ "validated_wind_averaging_seconds": null,
1579
+ "validated_surface_height_m": null,
1580
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1581
+ "official_scoring_allowed": false
1582
+ },
1583
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1584
+ "estimates": {
1585
+ "wind_estimate_kt": {
1586
+ "mean": 136.77460049203538,
1587
+ "p10": 136.25304926558675,
1588
+ "p90": 137.31942326080207,
1589
+ "valid_members": 50,
1590
+ "total_members": 50
1591
+ },
1592
+ "rmw_persistence_km": {
1593
+ "mean": 74.07999999999998,
1594
+ "p10": 74.08,
1595
+ "p90": 74.08,
1596
+ "valid_members": 50,
1597
+ "total_members": 50
1598
+ },
1599
+ "r34_NE_estimate_km": {
1600
+ "mean": 275.5247334215917,
1601
+ "p10": 274.68410903753903,
1602
+ "p90": 276.4026023248854,
1603
+ "valid_members": 50,
1604
+ "total_members": 50
1605
+ },
1606
+ "r34_SE_estimate_km": {
1607
+ "mean": 385.73462679022833,
1608
+ "p10": 384.55775265255465,
1609
+ "p90": 386.96364325483955,
1610
+ "valid_members": 50,
1611
+ "total_members": 50
1612
+ },
1613
+ "r34_SW_estimate_km": {
1614
+ "mean": 225.591057304969,
1615
+ "p10": 224.9027802808348,
1616
+ "p90": 226.3098289796925,
1617
+ "valid_members": 50,
1618
+ "total_members": 50
1619
+ },
1620
+ "r34_NW_estimate_km": {
1621
+ "mean": 225.591057304969,
1622
+ "p10": 224.9027802808348,
1623
+ "p90": 226.3098289796925,
1624
+ "valid_members": 50,
1625
+ "total_members": 50
1626
+ },
1627
+ "r50_NE_estimate_km": {
1628
+ "mean": 202.38006032888111,
1629
+ "p10": 201.76259992361804,
1630
+ "p90": 203.02487779917908,
1631
+ "valid_members": 50,
1632
+ "total_members": 50
1633
+ },
1634
+ "r50_SE_estimate_km": {
1635
+ "mean": 283.33208446043363,
1636
+ "p10": 282.46763989306527,
1637
+ "p90": 284.2348289188507,
1638
+ "valid_members": 50,
1639
+ "total_members": 50
1640
+ },
1641
+ "r50_SW_estimate_km": {
1642
+ "mean": 165.70248057250424,
1643
+ "p10": 165.1969232530671,
1644
+ "p90": 166.23043700344527,
1645
+ "valid_members": 50,
1646
+ "total_members": 50
1647
+ },
1648
+ "r50_NW_estimate_km": {
1649
+ "mean": 165.70248057250424,
1650
+ "p10": 165.1969232530671,
1651
+ "p90": 166.23043700344527,
1652
+ "valid_members": 50,
1653
+ "total_members": 50
1654
+ },
1655
+ "r64_NE_estimate_km": {
1656
+ "mean": 166.11151734709944,
1657
+ "p10": 165.6047120588051,
1658
+ "p90": 166.64077703913162,
1659
+ "valid_members": 50,
1660
+ "total_members": 50
1661
+ },
1662
+ "r64_SE_estimate_km": {
1663
+ "mean": 232.55612428593923,
1664
+ "p10": 231.84659688232713,
1665
+ "p90": 233.29708785478425,
1666
+ "valid_members": 50,
1667
+ "total_members": 50
1668
+ },
1669
+ "r64_SW_estimate_km": {
1670
+ "mean": 136.0069289007367,
1671
+ "p10": 135.59197253941747,
1672
+ "p90": 136.44027022741807,
1673
+ "valid_members": 50,
1674
+ "total_members": 50
1675
+ },
1676
+ "r64_NW_estimate_km": {
1677
+ "mean": 136.0069289007367,
1678
+ "p10": 135.59197253941747,
1679
+ "p90": 136.44027022741807,
1680
+ "valid_members": 50,
1681
+ "total_members": 50
1682
+ }
1683
+ },
1684
+ "official_scoring_allowed": false
1685
+ }
1686
+ },
1687
+ {
1688
+ "lead_hours": 78,
1689
+ "valid_time_utc": "2016-09-13T06:00:00Z",
1690
+ "summary": {
1691
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1692
+ "members": 50,
1693
+ "definitions": {
1694
+ "units": "km",
1695
+ "quantity_kind": "radius_not_diameter",
1696
+ "thresholds_kt": [
1697
+ 34,
1698
+ 50,
1699
+ 64
1700
+ ],
1701
+ "quadrant_order": [
1702
+ "NE",
1703
+ "SE",
1704
+ "SW",
1705
+ "NW"
1706
+ ],
1707
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1708
+ "target_wind_averaging_seconds": 60,
1709
+ "validated_wind_averaging_seconds": null,
1710
+ "validated_surface_height_m": null,
1711
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1712
+ "official_scoring_allowed": false
1713
+ },
1714
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1715
+ "estimates": {
1716
+ "wind_estimate_kt": {
1717
+ "mean": 137.85199679195318,
1718
+ "p10": 137.18429268465422,
1719
+ "p90": 138.610019989084,
1720
+ "valid_members": 50,
1721
+ "total_members": 50
1722
+ },
1723
+ "rmw_persistence_km": {
1724
+ "mean": 74.07999999999998,
1725
+ "p10": 74.08,
1726
+ "p90": 74.08,
1727
+ "valid_members": 50,
1728
+ "total_members": 50
1729
+ },
1730
+ "r34_NE_estimate_km": {
1731
+ "mean": 277.2595593377229,
1732
+ "p10": 276.1849832784492,
1733
+ "p90": 278.4788712902815,
1734
+ "valid_members": 50,
1735
+ "total_members": 50
1736
+ },
1737
+ "r34_SE_estimate_km": {
1738
+ "mean": 388.163383072812,
1739
+ "p10": 386.65897658982885,
1740
+ "p90": 389.8704198063941,
1741
+ "valid_members": 50,
1742
+ "total_members": 50
1743
+ },
1744
+ "r34_SW_estimate_km": {
1745
+ "mean": 227.01147865081333,
1746
+ "p10": 226.13164929264374,
1747
+ "p90": 228.00981324366964,
1748
+ "valid_members": 50,
1749
+ "total_members": 50
1750
+ },
1751
+ "r34_NW_estimate_km": {
1752
+ "mean": 227.01147865081333,
1753
+ "p10": 226.13164929264374,
1754
+ "p90": 228.00981324366964,
1755
+ "valid_members": 50,
1756
+ "total_members": 50
1757
+ },
1758
+ "r50_NE_estimate_km": {
1759
+ "mean": 203.65433494374673,
1760
+ "p10": 202.86503096728296,
1761
+ "p90": 204.54995118644885,
1762
+ "valid_members": 50,
1763
+ "total_members": 50
1764
+ },
1765
+ "r50_SE_estimate_km": {
1766
+ "mean": 285.1160689212454,
1767
+ "p10": 284.01104335419615,
1768
+ "p90": 286.3699316610283,
1769
+ "valid_members": 50,
1770
+ "total_members": 50
1771
+ },
1772
+ "r50_SW_estimate_km": {
1773
+ "mean": 166.7458168788116,
1774
+ "p10": 166.09955940357793,
1775
+ "p90": 167.47911952145137,
1776
+ "valid_members": 50,
1777
+ "total_members": 50
1778
+ },
1779
+ "r50_NW_estimate_km": {
1780
+ "mean": 166.7458168788116,
1781
+ "p10": 166.09955940357793,
1782
+ "p90": 167.47911952145137,
1783
+ "valid_members": 50,
1784
+ "total_members": 50
1785
+ },
1786
+ "r64_NE_estimate_km": {
1787
+ "mean": 167.1574291303464,
1788
+ "p10": 166.50957636775,
1789
+ "p90": 167.89254193145035,
1790
+ "valid_members": 50,
1791
+ "total_members": 50
1792
+ },
1793
+ "r64_SE_estimate_km": {
1794
+ "mean": 234.02040078248493,
1795
+ "p10": 233.11340691484997,
1796
+ "p90": 235.0495587040305,
1797
+ "valid_members": 50,
1798
+ "total_members": 50
1799
+ },
1800
+ "r64_SW_estimate_km": {
1801
+ "mean": 136.86328884381803,
1802
+ "p10": 136.33284721022267,
1803
+ "p90": 137.46517627504804,
1804
+ "valid_members": 50,
1805
+ "total_members": 50
1806
+ },
1807
+ "r64_NW_estimate_km": {
1808
+ "mean": 136.86328884381803,
1809
+ "p10": 136.33284721022267,
1810
+ "p90": 137.46517627504804,
1811
+ "valid_members": 50,
1812
+ "total_members": 50
1813
+ }
1814
+ },
1815
+ "official_scoring_allowed": false
1816
+ }
1817
+ },
1818
+ {
1819
+ "lead_hours": 84,
1820
+ "valid_time_utc": "2016-09-13T12:00:00Z",
1821
+ "summary": {
1822
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1823
+ "members": 50,
1824
+ "definitions": {
1825
+ "units": "km",
1826
+ "quantity_kind": "radius_not_diameter",
1827
+ "thresholds_kt": [
1828
+ 34,
1829
+ 50,
1830
+ 64
1831
+ ],
1832
+ "quadrant_order": [
1833
+ "NE",
1834
+ "SE",
1835
+ "SW",
1836
+ "NW"
1837
+ ],
1838
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1839
+ "target_wind_averaging_seconds": 60,
1840
+ "validated_wind_averaging_seconds": null,
1841
+ "validated_surface_height_m": null,
1842
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1843
+ "official_scoring_allowed": false
1844
+ },
1845
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1846
+ "estimates": {
1847
+ "wind_estimate_kt": {
1848
+ "mean": 138.34053797766865,
1849
+ "p10": 137.7744602852329,
1850
+ "p90": 138.9515431616716,
1851
+ "valid_members": 50,
1852
+ "total_members": 50
1853
+ },
1854
+ "rmw_persistence_km": {
1855
+ "mean": 74.07999999999998,
1856
+ "p10": 74.08,
1857
+ "p90": 74.08,
1858
+ "valid_members": 50,
1859
+ "total_members": 50
1860
+ },
1861
+ "r34_NE_estimate_km": {
1862
+ "mean": 278.0453930674618,
1863
+ "p10": 277.1350946942645,
1864
+ "p90": 279.02765199824546,
1865
+ "valid_members": 50,
1866
+ "total_members": 50
1867
+ },
1868
+ "r34_SE_estimate_km": {
1869
+ "mean": 389.26355029444653,
1870
+ "p10": 387.98913257197034,
1871
+ "p90": 390.63871279754363,
1872
+ "valid_members": 50,
1873
+ "total_members": 50
1874
+ },
1875
+ "r34_SW_estimate_km": {
1876
+ "mean": 227.6548947962758,
1877
+ "p10": 226.90957088316512,
1878
+ "p90": 228.45913776927847,
1879
+ "valid_members": 50,
1880
+ "total_members": 50
1881
+ },
1882
+ "r34_NW_estimate_km": {
1883
+ "mean": 227.6548947962758,
1884
+ "p10": 226.90957088316512,
1885
+ "p90": 228.45913776927847,
1886
+ "valid_members": 50,
1887
+ "total_members": 50
1888
+ },
1889
+ "r50_NE_estimate_km": {
1890
+ "mean": 204.231550192839,
1891
+ "p10": 203.56291243608612,
1892
+ "p90": 204.95304484488688,
1893
+ "valid_members": 50,
1894
+ "total_members": 50
1895
+ },
1896
+ "r50_SE_estimate_km": {
1897
+ "mean": 285.9241702699746,
1898
+ "p10": 284.9880774105206,
1899
+ "p90": 286.93426278284164,
1900
+ "valid_members": 50,
1901
+ "total_members": 50
1902
+ },
1903
+ "r50_SW_estimate_km": {
1904
+ "mean": 167.21842271973998,
1905
+ "p10": 166.67096298127396,
1906
+ "p90": 167.80916003531274,
1907
+ "valid_members": 50,
1908
+ "total_members": 50
1909
+ },
1910
+ "r50_NW_estimate_km": {
1911
+ "mean": 167.21842271973998,
1912
+ "p10": 166.67096298127396,
1913
+ "p90": 167.80916003531274,
1914
+ "valid_members": 50,
1915
+ "total_members": 50
1916
+ },
1917
+ "r64_NE_estimate_km": {
1918
+ "mean": 167.63120159936724,
1919
+ "p10": 167.08239045587175,
1920
+ "p90": 168.2233971507211,
1921
+ "valid_members": 50,
1922
+ "total_members": 50
1923
+ },
1924
+ "r64_SE_estimate_km": {
1925
+ "mean": 234.68368223911412,
1926
+ "p10": 233.91534663822046,
1927
+ "p90": 235.51275601100954,
1928
+ "valid_members": 50,
1929
+ "total_members": 50
1930
+ },
1931
+ "r64_SW_estimate_km": {
1932
+ "mean": 137.25119896310613,
1933
+ "p10": 136.80184951783346,
1934
+ "p90": 137.73607020824696,
1935
+ "valid_members": 50,
1936
+ "total_members": 50
1937
+ },
1938
+ "r64_NW_estimate_km": {
1939
+ "mean": 137.25119896310613,
1940
+ "p10": 136.80184951783346,
1941
+ "p90": 137.73607020824696,
1942
+ "valid_members": 50,
1943
+ "total_members": 50
1944
+ }
1945
+ },
1946
+ "official_scoring_allowed": false
1947
+ }
1948
+ },
1949
+ {
1950
+ "lead_hours": 90,
1951
+ "valid_time_utc": "2016-09-13T18:00:00Z",
1952
+ "summary": {
1953
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1954
+ "members": 50,
1955
+ "definitions": {
1956
+ "units": "km",
1957
+ "quantity_kind": "radius_not_diameter",
1958
+ "thresholds_kt": [
1959
+ 34,
1960
+ 50,
1961
+ 64
1962
+ ],
1963
+ "quadrant_order": [
1964
+ "NE",
1965
+ "SE",
1966
+ "SW",
1967
+ "NW"
1968
+ ],
1969
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1970
+ "target_wind_averaging_seconds": 60,
1971
+ "validated_wind_averaging_seconds": null,
1972
+ "validated_surface_height_m": null,
1973
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1974
+ "official_scoring_allowed": false
1975
+ },
1976
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1977
+ "estimates": {
1978
+ "wind_estimate_kt": {
1979
+ "mean": 138.52971953348208,
1980
+ "p10": 138.05722808258594,
1981
+ "p90": 139.0240414699473,
1982
+ "valid_members": 50,
1983
+ "total_members": 50
1984
+ },
1985
+ "rmw_persistence_km": {
1986
+ "mean": 74.07999999999998,
1987
+ "p10": 74.08,
1988
+ "p90": 74.08,
1989
+ "valid_members": 50,
1990
+ "total_members": 50
1991
+ },
1992
+ "r34_NE_estimate_km": {
1993
+ "mean": 278.3495997255907,
1994
+ "p10": 277.5900343875255,
1995
+ "p90": 279.144116529807,
1996
+ "valid_members": 50,
1997
+ "total_members": 50
1998
+ },
1999
+ "r34_SE_estimate_km": {
2000
+ "mean": 389.689439615827,
2001
+ "p10": 388.6260481425358,
2002
+ "p90": 390.80176314172974,
2003
+ "valid_members": 50,
2004
+ "total_members": 50
2005
+ },
2006
+ "r34_SW_estimate_km": {
2007
+ "mean": 227.9039697188582,
2008
+ "p10": 227.28206131311038,
2009
+ "p90": 228.55449529485236,
2010
+ "valid_members": 50,
2011
+ "total_members": 50
2012
+ },
2013
+ "r34_NW_estimate_km": {
2014
+ "mean": 227.9039697188582,
2015
+ "p10": 227.28206131311038,
2016
+ "p90": 228.55449529485236,
2017
+ "valid_members": 50,
2018
+ "total_members": 50
2019
+ },
2020
+ "r50_NE_estimate_km": {
2021
+ "mean": 204.45499787051216,
2022
+ "p10": 203.8970774361745,
2023
+ "p90": 205.03859106293734,
2024
+ "valid_members": 50,
2025
+ "total_members": 50
2026
+ },
2027
+ "r50_SE_estimate_km": {
2028
+ "mean": 286.23699701871703,
2029
+ "p10": 285.4559084106443,
2030
+ "p90": 287.0540274881123,
2031
+ "valid_members": 50,
2032
+ "total_members": 50
2033
+ },
2034
+ "r50_SW_estimate_km": {
2035
+ "mean": 167.40137470823353,
2036
+ "p10": 166.94456685976465,
2037
+ "p90": 167.87920261021623,
2038
+ "valid_members": 50,
2039
+ "total_members": 50
2040
+ },
2041
+ "r50_NW_estimate_km": {
2042
+ "mean": 167.40137470823353,
2043
+ "p10": 166.94456685976465,
2044
+ "p90": 167.87920261021623,
2045
+ "valid_members": 50,
2046
+ "total_members": 50
2047
+ },
2048
+ "r64_NE_estimate_km": {
2049
+ "mean": 167.81460520506664,
2050
+ "p10": 167.35666972586884,
2051
+ "p90": 168.29361262580585,
2052
+ "valid_members": 50,
2053
+ "total_members": 50
2054
+ },
2055
+ "r64_SE_estimate_km": {
2056
+ "mean": 234.94044728709335,
2057
+ "p10": 234.2993376162164,
2058
+ "p90": 235.6110576761282,
2059
+ "valid_members": 50,
2060
+ "total_members": 50
2061
+ },
2062
+ "r64_SW_estimate_km": {
2063
+ "mean": 137.40136411455904,
2064
+ "p10": 137.02642082853612,
2065
+ "p90": 137.79356044902076,
2066
+ "valid_members": 50,
2067
+ "total_members": 50
2068
+ },
2069
+ "r64_NW_estimate_km": {
2070
+ "mean": 137.40136411455904,
2071
+ "p10": 137.02642082853612,
2072
+ "p90": 137.79356044902076,
2073
+ "valid_members": 50,
2074
+ "total_members": 50
2075
+ }
2076
+ },
2077
+ "official_scoring_allowed": false
2078
+ }
2079
+ },
2080
+ {
2081
+ "lead_hours": 96,
2082
+ "valid_time_utc": "2016-09-14T00:00:00Z",
2083
+ "summary": {
2084
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2085
+ "members": 50,
2086
+ "definitions": {
2087
+ "units": "km",
2088
+ "quantity_kind": "radius_not_diameter",
2089
+ "thresholds_kt": [
2090
+ 34,
2091
+ 50,
2092
+ 64
2093
+ ],
2094
+ "quadrant_order": [
2095
+ "NE",
2096
+ "SE",
2097
+ "SW",
2098
+ "NW"
2099
+ ],
2100
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2101
+ "target_wind_averaging_seconds": 60,
2102
+ "validated_wind_averaging_seconds": null,
2103
+ "validated_surface_height_m": null,
2104
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2105
+ "official_scoring_allowed": false
2106
+ },
2107
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2108
+ "estimates": {
2109
+ "wind_estimate_kt": {
2110
+ "mean": 136.83564387769877,
2111
+ "p10": 136.3164945870481,
2112
+ "p90": 137.4316600765802,
2113
+ "valid_members": 50,
2114
+ "total_members": 50
2115
+ },
2116
+ "rmw_persistence_km": {
2117
+ "mean": 74.07999999999998,
2118
+ "p10": 74.08,
2119
+ "p90": 74.08,
2120
+ "valid_members": 50,
2121
+ "total_members": 50
2122
+ },
2123
+ "r34_NE_estimate_km": {
2124
+ "mean": 275.6230565935687,
2125
+ "p10": 274.786427429154,
2126
+ "p90": 276.58331867860943,
2127
+ "valid_members": 50,
2128
+ "total_members": 50
2129
+ },
2130
+ "r34_SE_estimate_km": {
2131
+ "mean": 385.8722792309963,
2132
+ "p10": 384.7009984008156,
2133
+ "p90": 387.2166461500532,
2134
+ "valid_members": 50,
2135
+ "total_members": 50
2136
+ },
2137
+ "r34_SW_estimate_km": {
2138
+ "mean": 225.67156125119712,
2139
+ "p10": 224.98655538827984,
2140
+ "p90": 226.4577938930512,
2141
+ "valid_members": 50,
2142
+ "total_members": 50
2143
+ },
2144
+ "r34_NW_estimate_km": {
2145
+ "mean": 225.67156125119712,
2146
+ "p10": 224.98655538827984,
2147
+ "p90": 226.4577938930512,
2148
+ "valid_members": 50,
2149
+ "total_members": 50
2150
+ },
2151
+ "r50_NE_estimate_km": {
2152
+ "mean": 202.45228124795918,
2153
+ "p10": 201.83775543510566,
2154
+ "p90": 203.15761864648852,
2155
+ "valid_members": 50,
2156
+ "total_members": 50
2157
+ },
2158
+ "r50_SE_estimate_km": {
2159
+ "mean": 283.4331937471429,
2160
+ "p10": 282.57285760914795,
2161
+ "p90": 284.4206661050839,
2162
+ "valid_members": 50,
2163
+ "total_members": 50
2164
+ },
2165
+ "r50_SW_estimate_km": {
2166
+ "mean": 165.76161280826412,
2167
+ "p10": 165.2584582415534,
2168
+ "p90": 166.3391210686477,
2169
+ "valid_members": 50,
2170
+ "total_members": 50
2171
+ },
2172
+ "r50_NW_estimate_km": {
2173
+ "mean": 165.76161280826412,
2174
+ "p10": 165.2584582415534,
2175
+ "p90": 166.3391210686477,
2176
+ "valid_members": 50,
2177
+ "total_members": 50
2178
+ },
2179
+ "r64_NE_estimate_km": {
2180
+ "mean": 166.17079555085508,
2181
+ "p10": 165.66639894648517,
2182
+ "p90": 166.74972939108102,
2183
+ "valid_members": 50,
2184
+ "total_members": 50
2185
+ },
2186
+ "r64_SE_estimate_km": {
2187
+ "mean": 232.63911377119712,
2188
+ "p10": 231.93295852507924,
2189
+ "p90": 233.44962114751345,
2190
+ "valid_members": 50,
2191
+ "total_members": 50
2192
+ },
2193
+ "r64_SW_estimate_km": {
2194
+ "mean": 136.05546404491164,
2195
+ "p10": 135.6424798388559,
2196
+ "p90": 136.5294770146524,
2197
+ "valid_members": 50,
2198
+ "total_members": 50
2199
+ },
2200
+ "r64_NW_estimate_km": {
2201
+ "mean": 136.05546404491164,
2202
+ "p10": 135.6424798388559,
2203
+ "p90": 136.5294770146524,
2204
+ "valid_members": 50,
2205
+ "total_members": 50
2206
+ }
2207
+ },
2208
+ "official_scoring_allowed": false
2209
+ }
2210
+ },
2211
+ {
2212
+ "lead_hours": 102,
2213
+ "valid_time_utc": "2016-09-14T06:00:00Z",
2214
+ "summary": {
2215
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2216
+ "members": 50,
2217
+ "definitions": {
2218
+ "units": "km",
2219
+ "quantity_kind": "radius_not_diameter",
2220
+ "thresholds_kt": [
2221
+ 34,
2222
+ 50,
2223
+ 64
2224
+ ],
2225
+ "quadrant_order": [
2226
+ "NE",
2227
+ "SE",
2228
+ "SW",
2229
+ "NW"
2230
+ ],
2231
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2232
+ "target_wind_averaging_seconds": 60,
2233
+ "validated_wind_averaging_seconds": null,
2234
+ "validated_surface_height_m": null,
2235
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2236
+ "official_scoring_allowed": false
2237
+ },
2238
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2239
+ "estimates": {
2240
+ "wind_estimate_kt": {
2241
+ "mean": 131.96239925323422,
2242
+ "p10": 130.77006477023485,
2243
+ "p90": 133.09775815264578,
2244
+ "valid_members": 50,
2245
+ "total_members": 50
2246
+ },
2247
+ "rmw_persistence_km": {
2248
+ "mean": 74.07999999999998,
2249
+ "p10": 74.08,
2250
+ "p90": 74.08,
2251
+ "valid_members": 50,
2252
+ "total_members": 50
2253
+ },
2254
+ "r34_NE_estimate_km": {
2255
+ "mean": 267.74094327566036,
2256
+ "p10": 265.80504631133,
2257
+ "p90": 269.58339710460456,
2258
+ "valid_members": 50,
2259
+ "total_members": 50
2260
+ },
2261
+ "r34_SE_estimate_km": {
2262
+ "mean": 374.8373205859245,
2263
+ "p10": 372.127064835862,
2264
+ "p90": 377.4167559464465,
2265
+ "valid_members": 50,
2266
+ "total_members": 50
2267
+ },
2268
+ "r34_SW_estimate_km": {
2269
+ "mean": 219.2179327326142,
2270
+ "p10": 217.63288068449728,
2271
+ "p90": 220.7264764562411,
2272
+ "valid_members": 50,
2273
+ "total_members": 50
2274
+ },
2275
+ "r34_NW_estimate_km": {
2276
+ "mean": 219.2179327326142,
2277
+ "p10": 217.63288068449728,
2278
+ "p90": 220.7264764562411,
2279
+ "valid_members": 50,
2280
+ "total_members": 50
2281
+ },
2282
+ "r50_NE_estimate_km": {
2283
+ "mean": 196.66266465351532,
2284
+ "p10": 195.24069814050466,
2285
+ "p90": 198.0159947608504,
2286
+ "valid_members": 50,
2287
+ "total_members": 50
2288
+ },
2289
+ "r50_SE_estimate_km": {
2290
+ "mean": 275.3277305149214,
2291
+ "p10": 273.3369773967066,
2292
+ "p90": 277.22239266519057,
2293
+ "valid_members": 50,
2294
+ "total_members": 50
2295
+ },
2296
+ "r50_SW_estimate_km": {
2297
+ "mean": 161.02125533577362,
2298
+ "p10": 159.85699351020648,
2299
+ "p90": 162.12931981334344,
2300
+ "valid_members": 50,
2301
+ "total_members": 50
2302
+ },
2303
+ "r50_NW_estimate_km": {
2304
+ "mean": 161.02125533577362,
2305
+ "p10": 159.85699351020648,
2306
+ "p90": 162.12931981334344,
2307
+ "valid_members": 50,
2308
+ "total_members": 50
2309
+ },
2310
+ "r64_NE_estimate_km": {
2311
+ "mean": 161.418736500185,
2312
+ "p10": 160.25160069288705,
2313
+ "p90": 162.52953623626385,
2314
+ "valid_members": 50,
2315
+ "total_members": 50
2316
+ },
2317
+ "r64_SE_estimate_km": {
2318
+ "mean": 225.98623110025892,
2319
+ "p10": 224.35224097004186,
2320
+ "p90": 227.5413507307694,
2321
+ "valid_members": 50,
2322
+ "total_members": 50
2323
+ },
2324
+ "r64_SW_estimate_km": {
2325
+ "mean": 132.16462632481498,
2326
+ "p10": 131.20901193217182,
2327
+ "p90": 133.07411449963038,
2328
+ "valid_members": 50,
2329
+ "total_members": 50
2330
+ },
2331
+ "r64_NW_estimate_km": {
2332
+ "mean": 132.16462632481498,
2333
+ "p10": 131.20901193217182,
2334
+ "p90": 133.07411449963038,
2335
+ "valid_members": 50,
2336
+ "total_members": 50
2337
+ }
2338
+ },
2339
+ "official_scoring_allowed": false
2340
+ }
2341
+ },
2342
+ {
2343
+ "lead_hours": 108,
2344
+ "valid_time_utc": "2016-09-14T12:00:00Z",
2345
+ "summary": {
2346
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2347
+ "members": 50,
2348
+ "definitions": {
2349
+ "units": "km",
2350
+ "quantity_kind": "radius_not_diameter",
2351
+ "thresholds_kt": [
2352
+ 34,
2353
+ 50,
2354
+ 64
2355
+ ],
2356
+ "quadrant_order": [
2357
+ "NE",
2358
+ "SE",
2359
+ "SW",
2360
+ "NW"
2361
+ ],
2362
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2363
+ "target_wind_averaging_seconds": 60,
2364
+ "validated_wind_averaging_seconds": null,
2365
+ "validated_surface_height_m": null,
2366
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2367
+ "official_scoring_allowed": false
2368
+ },
2369
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2370
+ "estimates": {
2371
+ "wind_estimate_kt": {
2372
+ "mean": 126.6884093382334,
2373
+ "p10": 125.22393406438523,
2374
+ "p90": 127.97972972237541,
2375
+ "valid_members": 50,
2376
+ "total_members": 50
2377
+ },
2378
+ "rmw_persistence_km": {
2379
+ "mean": 74.07999999999998,
2380
+ "p10": 74.08,
2381
+ "p90": 74.08,
2382
+ "valid_members": 50,
2383
+ "total_members": 50
2384
+ },
2385
+ "r34_NE_estimate_km": {
2386
+ "mean": 259.1452057441568,
2387
+ "p10": 256.7476197477907,
2388
+ "p90": 261.2579386893063,
2389
+ "valid_members": 50,
2390
+ "total_members": 50
2391
+ },
2392
+ "r34_SE_estimate_km": {
2393
+ "mean": 362.8032880418195,
2394
+ "p10": 359.4466676469069,
2395
+ "p90": 365.76111416502886,
2396
+ "valid_members": 50,
2397
+ "total_members": 50
2398
+ },
2399
+ "r34_SW_estimate_km": {
2400
+ "mean": 212.18001096796172,
2401
+ "p10": 210.2169423418424,
2402
+ "p90": 213.90985080114297,
2403
+ "valid_members": 50,
2404
+ "total_members": 50
2405
+ },
2406
+ "r34_NW_estimate_km": {
2407
+ "mean": 212.18001096796172,
2408
+ "p10": 210.2169423418424,
2409
+ "p90": 213.90985080114297,
2410
+ "valid_members": 50,
2411
+ "total_members": 50
2412
+ },
2413
+ "r50_NE_estimate_km": {
2414
+ "mean": 190.34887257178926,
2415
+ "p10": 188.58778349436773,
2416
+ "p90": 191.90072969760283,
2417
+ "valid_members": 50,
2418
+ "total_members": 50
2419
+ },
2420
+ "r50_SE_estimate_km": {
2421
+ "mean": 266.48842160050503,
2422
+ "p10": 264.02289689211483,
2423
+ "p90": 268.661021576644,
2424
+ "valid_members": 50,
2425
+ "total_members": 50
2426
+ },
2427
+ "r50_SW_estimate_km": {
2428
+ "mean": 155.8517193248599,
2429
+ "p10": 154.4097945217757,
2430
+ "p90": 157.12233153252276,
2431
+ "valid_members": 50,
2432
+ "total_members": 50
2433
+ },
2434
+ "r50_NW_estimate_km": {
2435
+ "mean": 155.8517193248599,
2436
+ "p10": 154.4097945217757,
2437
+ "p90": 157.12233153252276,
2438
+ "valid_members": 50,
2439
+ "total_members": 50
2440
+ },
2441
+ "r64_NE_estimate_km": {
2442
+ "mean": 156.2364394833482,
2443
+ "p10": 154.79095528713583,
2444
+ "p90": 157.51018819878925,
2445
+ "valid_members": 50,
2446
+ "total_members": 50
2447
+ },
2448
+ "r64_SE_estimate_km": {
2449
+ "mean": 218.73101527668746,
2450
+ "p10": 216.70733740199017,
2451
+ "p90": 220.51426347830497,
2452
+ "valid_members": 50,
2453
+ "total_members": 50
2454
+ },
2455
+ "r64_SW_estimate_km": {
2456
+ "mean": 127.92152317839891,
2457
+ "p10": 126.73800580741135,
2458
+ "p90": 128.9644288946618,
2459
+ "valid_members": 50,
2460
+ "total_members": 50
2461
+ },
2462
+ "r64_NW_estimate_km": {
2463
+ "mean": 127.92152317839891,
2464
+ "p10": 126.73800580741135,
2465
+ "p90": 128.9644288946618,
2466
+ "valid_members": 50,
2467
+ "total_members": 50
2468
+ }
2469
+ },
2470
+ "official_scoring_allowed": false
2471
+ }
2472
+ },
2473
+ {
2474
+ "lead_hours": 114,
2475
+ "valid_time_utc": "2016-09-14T18:00:00Z",
2476
+ "summary": {
2477
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2478
+ "members": 50,
2479
+ "definitions": {
2480
+ "units": "km",
2481
+ "quantity_kind": "radius_not_diameter",
2482
+ "thresholds_kt": [
2483
+ 34,
2484
+ 50,
2485
+ 64
2486
+ ],
2487
+ "quadrant_order": [
2488
+ "NE",
2489
+ "SE",
2490
+ "SW",
2491
+ "NW"
2492
+ ],
2493
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2494
+ "target_wind_averaging_seconds": 60,
2495
+ "validated_wind_averaging_seconds": null,
2496
+ "validated_surface_height_m": null,
2497
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2498
+ "official_scoring_allowed": false
2499
+ },
2500
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2501
+ "estimates": {
2502
+ "wind_estimate_kt": {
2503
+ "mean": 121.60913903678743,
2504
+ "p10": 120.0978859422581,
2505
+ "p90": 123.44701439155739,
2506
+ "valid_members": 50,
2507
+ "total_members": 50
2508
+ },
2509
+ "rmw_persistence_km": {
2510
+ "mean": 74.07999999999998,
2511
+ "p10": 74.08,
2512
+ "p90": 74.08,
2513
+ "valid_members": 50,
2514
+ "total_members": 50
2515
+ },
2516
+ "r34_NE_estimate_km": {
2517
+ "mean": 250.7986728865807,
2518
+ "p10": 248.30463683168853,
2519
+ "p90": 253.82887321837694,
2520
+ "valid_members": 50,
2521
+ "total_members": 50
2522
+ },
2523
+ "r34_SE_estimate_km": {
2524
+ "mean": 351.118142041213,
2525
+ "p10": 347.62649156436396,
2526
+ "p90": 355.36042250572774,
2527
+ "valid_members": 50,
2528
+ "total_members": 50
2529
+ },
2530
+ "r34_SW_estimate_km": {
2531
+ "mean": 205.34613021689992,
2532
+ "p10": 203.30409129141827,
2533
+ "p90": 207.82716372778182,
2534
+ "valid_members": 50,
2535
+ "total_members": 50
2536
+ },
2537
+ "r34_NW_estimate_km": {
2538
+ "mean": 205.34613021689992,
2539
+ "p10": 203.30409129141827,
2540
+ "p90": 207.82716372778182,
2541
+ "valid_members": 50,
2542
+ "total_members": 50
2543
+ },
2544
+ "r50_NE_estimate_km": {
2545
+ "mean": 184.2181277842839,
2546
+ "p10": 182.38619363817895,
2547
+ "p90": 186.44388849310252,
2548
+ "valid_members": 50,
2549
+ "total_members": 50
2550
+ },
2551
+ "r50_SE_estimate_km": {
2552
+ "mean": 257.9053788979975,
2553
+ "p10": 255.34067109345054,
2554
+ "p90": 261.02144389034356,
2555
+ "valid_members": 50,
2556
+ "total_members": 50
2557
+ },
2558
+ "r50_SW_estimate_km": {
2559
+ "mean": 150.8320567286747,
2560
+ "p10": 149.332126193217,
2561
+ "p90": 152.6544401690824,
2562
+ "valid_members": 50,
2563
+ "total_members": 50
2564
+ },
2565
+ "r50_NW_estimate_km": {
2566
+ "mean": 150.8320567286747,
2567
+ "p10": 149.332126193217,
2568
+ "p90": 152.6544401690824,
2569
+ "valid_members": 50,
2570
+ "total_members": 50
2571
+ },
2572
+ "r64_NE_estimate_km": {
2573
+ "mean": 151.2043858439462,
2574
+ "p10": 149.70075272813952,
2575
+ "p90": 153.03126784009044,
2576
+ "valid_members": 50,
2577
+ "total_members": 50
2578
+ },
2579
+ "r64_SE_estimate_km": {
2580
+ "mean": 211.68614018152468,
2581
+ "p10": 209.58105381939535,
2582
+ "p90": 214.24377497612662,
2583
+ "valid_members": 50,
2584
+ "total_members": 50
2585
+ },
2586
+ "r64_SW_estimate_km": {
2587
+ "mean": 123.80143462289702,
2588
+ "p10": 122.57030673038015,
2589
+ "p90": 125.2972286155582,
2590
+ "valid_members": 50,
2591
+ "total_members": 50
2592
+ },
2593
+ "r64_NW_estimate_km": {
2594
+ "mean": 123.80143462289702,
2595
+ "p10": 122.57030673038015,
2596
+ "p90": 125.2972286155582,
2597
+ "valid_members": 50,
2598
+ "total_members": 50
2599
+ }
2600
+ },
2601
+ "official_scoring_allowed": false
2602
+ }
2603
+ },
2604
+ {
2605
+ "lead_hours": 120,
2606
+ "valid_time_utc": "2016-09-15T00:00:00Z",
2607
+ "summary": {
2608
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2609
+ "members": 50,
2610
+ "definitions": {
2611
+ "units": "km",
2612
+ "quantity_kind": "radius_not_diameter",
2613
+ "thresholds_kt": [
2614
+ 34,
2615
+ 50,
2616
+ 64
2617
+ ],
2618
+ "quadrant_order": [
2619
+ "NE",
2620
+ "SE",
2621
+ "SW",
2622
+ "NW"
2623
+ ],
2624
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2625
+ "target_wind_averaging_seconds": 60,
2626
+ "validated_wind_averaging_seconds": null,
2627
+ "validated_surface_height_m": null,
2628
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2629
+ "official_scoring_allowed": false
2630
+ },
2631
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2632
+ "estimates": {
2633
+ "wind_estimate_kt": {
2634
+ "mean": 116.7002794250999,
2635
+ "p10": 115.26871619878807,
2636
+ "p90": 118.29916713289887,
2637
+ "valid_members": 50,
2638
+ "total_members": 50
2639
+ },
2640
+ "rmw_persistence_km": {
2641
+ "mean": 74.07999999999998,
2642
+ "p10": 74.08,
2643
+ "p90": 74.08,
2644
+ "valid_members": 50,
2645
+ "total_members": 50
2646
+ },
2647
+ "r34_NE_estimate_km": {
2648
+ "mean": 242.66619550562635,
2649
+ "p10": 240.28447341703372,
2650
+ "p90": 245.3250458082348,
2651
+ "valid_members": 50,
2652
+ "total_members": 50
2653
+ },
2654
+ "r34_SE_estimate_km": {
2655
+ "mean": 339.73267370787687,
2656
+ "p10": 336.39826278384726,
2657
+ "p90": 343.45506413152873,
2658
+ "valid_members": 50,
2659
+ "total_members": 50
2660
+ },
2661
+ "r34_SW_estimate_km": {
2662
+ "mean": 198.6875114130809,
2663
+ "p10": 196.7374316598049,
2664
+ "p90": 200.86449510355513,
2665
+ "valid_members": 50,
2666
+ "total_members": 50
2667
+ },
2668
+ "r34_NW_estimate_km": {
2669
+ "mean": 198.6875114130809,
2670
+ "p10": 196.7374316598049,
2671
+ "p90": 200.86449510355513,
2672
+ "valid_members": 50,
2673
+ "total_members": 50
2674
+ },
2675
+ "r50_NE_estimate_km": {
2676
+ "mean": 178.24461229425194,
2677
+ "p10": 176.49517566839933,
2678
+ "p90": 180.19760677850394,
2679
+ "valid_members": 50,
2680
+ "total_members": 50
2681
+ },
2682
+ "r50_SE_estimate_km": {
2683
+ "mean": 249.54245721195267,
2684
+ "p10": 247.09324593575906,
2685
+ "p90": 252.2766494899055,
2686
+ "valid_members": 50,
2687
+ "total_members": 50
2688
+ },
2689
+ "r50_SW_estimate_km": {
2690
+ "mean": 145.94112857682,
2691
+ "p10": 144.50874443760648,
2692
+ "p90": 147.5401795409272,
2693
+ "valid_members": 50,
2694
+ "total_members": 50
2695
+ },
2696
+ "r50_NW_estimate_km": {
2697
+ "mean": 145.94112857682,
2698
+ "p10": 144.50874443760648,
2699
+ "p90": 147.5401795409272,
2700
+ "valid_members": 50,
2701
+ "total_members": 50
2702
+ },
2703
+ "r64_NE_estimate_km": {
2704
+ "mean": 146.30138443000695,
2705
+ "p10": 144.86546444880568,
2706
+ "p90": 147.90438265336167,
2707
+ "valid_members": 50,
2708
+ "total_members": 50
2709
+ },
2710
+ "r64_SE_estimate_km": {
2711
+ "mean": 204.82193820200973,
2712
+ "p10": 202.81165022832792,
2713
+ "p90": 207.06613571470632,
2714
+ "valid_members": 50,
2715
+ "total_members": 50
2716
+ },
2717
+ "r64_SW_estimate_km": {
2718
+ "mean": 119.7870100040884,
2719
+ "p10": 118.61132351401615,
2720
+ "p90": 121.09949494717786,
2721
+ "valid_members": 50,
2722
+ "total_members": 50
2723
+ },
2724
+ "r64_NW_estimate_km": {
2725
+ "mean": 119.7870100040884,
2726
+ "p10": 118.61132351401615,
2727
+ "p90": 121.09949494717786,
2728
+ "valid_members": 50,
2729
+ "total_members": 50
2730
+ }
2731
+ },
2732
+ "official_scoring_allowed": false
2733
+ }
2734
+ }
2735
+ ],
2736
+ "official_wind_or_radius_skill_score": null,
2737
+ "physical_50_member_means_verified": true,
2738
+ "observed_plus_zero_alignment_verified": true,
2739
+ "coverage": {
2740
+ "wind_estimate_kt": 20,
2741
+ "rmw_persistence_km": 20,
2742
+ "r34_NE_estimate_km": 20,
2743
+ "r34_SE_estimate_km": 20,
2744
+ "r34_SW_estimate_km": 20,
2745
+ "r34_NW_estimate_km": 20,
2746
+ "r50_NE_estimate_km": 20,
2747
+ "r50_SE_estimate_km": 20,
2748
+ "r50_SW_estimate_km": 20,
2749
+ "r50_NW_estimate_km": 20,
2750
+ "r64_NE_estimate_km": 20,
2751
+ "r64_SE_estimate_km": 20,
2752
+ "r64_SW_estimate_km": 20,
2753
+ "r64_NW_estimate_km": 20
2754
+ },
2755
+ "warning": "Retrospective development examples, not untouched tests. RMW is persistence; no validated wind-period calibration.",
2756
+ "chart": "meranti_wind_radius.png",
2757
+ "source_receipt_sha256": "f3e10a343ea146653acaf5b82044feb63b3c494ca49fcda394628e9dd88935c0",
2758
+ "source_reference": "Original immutable /Volumes/D member archive; original files unchanged."
2759
+ }
evaluation/storm_structure/meranti_wind_radius.png ADDED

Git LFS Details

  • SHA256: 416d62f25f01cd3f86e4840b2f0f5bd8e9dbe9964431fe6d87ab15b277457757
  • Pointer size: 131 Bytes
  • Size of remote file: 462 kB
evaluation/storm_structure/soudelor_structure.json ADDED
@@ -0,0 +1,2759 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "frozen Trackformer 1.2 pressure + separate experimental structure candidate",
3
+ "method": "pressure-scaled-issue-structure-experimental-v1",
4
+ "storm_id": "2015211N13162",
5
+ "issue_time_utc": "2015-08-05T00:00:00Z",
6
+ "actual_members": 50,
7
+ "checkpoint_sha256": "f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0",
8
+ "source_file_sha256": {
9
+ "weather-history.npz": "d4088aa71e5f9d9b39f160993c312ab2f59a59dd057c2ba0dc27e307a7ffa1b2",
10
+ "model-inputs.npz": "2cad11d38a54c0ab41c8366793b2bae7febecae89609aeda3e016180df8b1ccd",
11
+ "ensemble-members.npz": "161e2a5d8def6ef6f555031ba6ba1b21f16ccf4390366d0360c5bbd06edcd31c",
12
+ "soudelor_video.npz": "bed5425496abde931d81af06e1ef1438504c82468d5577c6bac5dc131a07e91f",
13
+ "soudelor_video.json": "b5527954d10ba0facd3f3137720910de3c0bae1a055d6896d7cfb54205298ab5",
14
+ "soudelor_coastlines.json": "2af08a831beff87de1847e3c5e34faf29aabcd3965d81ffc18fedc6f18a4076d"
15
+ },
16
+ "observed_csv_sha256": "4348af2679b4be0d53ec630bccda759044663a1f57e2bbd5c1d19428aab562fc",
17
+ "future_labels_used_for_diagnostics": false,
18
+ "initial": {
19
+ "method": "pressure-scaled-issue-structure-experimental-v1",
20
+ "storm_id": "2015211N13162",
21
+ "issue_time_utc": "2015-08-05T00:00:00Z",
22
+ "input_wind_kt": 115.0,
23
+ "input_model_pressure_hpa": 930.0,
24
+ "ambient_pressure_hpa": 1004.5,
25
+ "pressure_deficit_hpa": 74.5,
26
+ "rmw_persistence_km": 22.224,
27
+ "native_quadrant_radii_km": {
28
+ "r34_NE": 268.54,
29
+ "r34_SE": 287.06,
30
+ "r34_SW": 287.06,
31
+ "r34_NW": 231.5,
32
+ "r50_NE": 148.16,
33
+ "r50_SE": 157.42000000000002,
34
+ "r50_SW": 157.42000000000002,
35
+ "r50_NW": 138.9,
36
+ "r64_NE": 74.08,
37
+ "r64_SE": 74.08,
38
+ "r64_SW": 74.08,
39
+ "r64_NW": 64.82000000000001
40
+ },
41
+ "holland_inspired_tail_b": 2.294714814320773,
42
+ "source_agency": "jtwc_wp",
43
+ "source_track_type": "main",
44
+ "usa_reference_center": [
45
+ 19.5,
46
+ 134.9
47
+ ],
48
+ "model_origin": [
49
+ 19.5,
50
+ 134.9
51
+ ],
52
+ "definitions": {
53
+ "units": "km",
54
+ "quantity_kind": "radius_not_diameter",
55
+ "thresholds_kt": [
56
+ 34,
57
+ 50,
58
+ 64
59
+ ],
60
+ "quadrant_order": [
61
+ "NE",
62
+ "SE",
63
+ "SW",
64
+ "NW"
65
+ ],
66
+ "quadrant_statistic": "maximum_extent_within_quadrant",
67
+ "target_wind_averaging_seconds": 60,
68
+ "validated_wind_averaging_seconds": null,
69
+ "validated_surface_height_m": null,
70
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
71
+ "official_scoring_allowed": false
72
+ },
73
+ "mixed_agency_initialization": "USA 1-minute wind/radii; model TOKYO pressure. No conversion between wind periods.",
74
+ "calibration": "none; initialization is issue assimilation, not future-target fitting"
75
+ },
76
+ "initial_ambient": {
77
+ "cells": 27,
78
+ "candidate_cells": 27,
79
+ "quadrant_cells": {
80
+ "NE": 9,
81
+ "SE": 6,
82
+ "SW": 5,
83
+ "NW": 7
84
+ },
85
+ "annulus_km": [
86
+ 600,
87
+ 1000
88
+ ],
89
+ "statistic": "median_available_physical_cells",
90
+ "value_hpa": 1004.5,
91
+ "status": "available"
92
+ },
93
+ "definitions": {
94
+ "units": "km",
95
+ "quantity_kind": "radius_not_diameter",
96
+ "thresholds_kt": [
97
+ 34,
98
+ 50,
99
+ 64
100
+ ],
101
+ "quadrant_order": [
102
+ "NE",
103
+ "SE",
104
+ "SW",
105
+ "NW"
106
+ ],
107
+ "quadrant_statistic": "maximum_extent_within_quadrant",
108
+ "target_wind_averaging_seconds": 60,
109
+ "validated_wind_averaging_seconds": null,
110
+ "validated_surface_height_m": null,
111
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
112
+ "official_scoring_allowed": false
113
+ },
114
+ "points": [
115
+ {
116
+ "lead_hours": 6,
117
+ "valid_time_utc": "2015-08-05T06:00:00Z",
118
+ "summary": {
119
+ "method": "pressure-scaled-issue-structure-experimental-v1",
120
+ "members": 50,
121
+ "definitions": {
122
+ "units": "km",
123
+ "quantity_kind": "radius_not_diameter",
124
+ "thresholds_kt": [
125
+ 34,
126
+ 50,
127
+ 64
128
+ ],
129
+ "quadrant_order": [
130
+ "NE",
131
+ "SE",
132
+ "SW",
133
+ "NW"
134
+ ],
135
+ "quadrant_statistic": "maximum_extent_within_quadrant",
136
+ "target_wind_averaging_seconds": 60,
137
+ "validated_wind_averaging_seconds": null,
138
+ "validated_surface_height_m": null,
139
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
140
+ "official_scoring_allowed": false
141
+ },
142
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
143
+ "estimates": {
144
+ "wind_estimate_kt": {
145
+ "mean": 113.02866671359301,
146
+ "p10": 112.77028204361338,
147
+ "p90": 113.277482029427,
148
+ "valid_members": 50,
149
+ "total_members": 50
150
+ },
151
+ "rmw_persistence_km": {
152
+ "mean": 22.223999999999997,
153
+ "p10": 22.224,
154
+ "p90": 22.224,
155
+ "valid_members": 50,
156
+ "total_members": 50
157
+ },
158
+ "r34_NE_estimate_km": {
159
+ "mean": 261.47487470026556,
160
+ "p10": 260.55340310729184,
161
+ "p90": 262.36268200153563,
162
+ "valid_members": 50,
163
+ "total_members": 50
164
+ },
165
+ "r34_SE_estimate_km": {
166
+ "mean": 279.4316237529158,
167
+ "p10": 278.4368326303303,
168
+ "p90": 280.3900864895806,
169
+ "valid_members": 50,
170
+ "total_members": 50
171
+ },
172
+ "r34_SW_estimate_km": {
173
+ "mean": 279.4316237529158,
174
+ "p10": 278.4368326303303,
175
+ "p90": 280.3900864895806,
176
+ "valid_members": 50,
177
+ "total_members": 50
178
+ },
179
+ "r34_NW_estimate_km": {
180
+ "mean": 226.25853814671638,
181
+ "p10": 225.57356200686513,
182
+ "p90": 226.9183518874688,
183
+ "valid_members": 50,
184
+ "total_members": 50
185
+ },
186
+ "r50_NE_estimate_km": {
187
+ "mean": 141.13973770574205,
188
+ "p10": 140.23464157528548,
189
+ "p90": 142.01283039302464,
190
+ "valid_members": 50,
191
+ "total_members": 50
192
+ },
193
+ "r50_SE_estimate_km": {
194
+ "mean": 149.32580058406242,
195
+ "p10": 148.2845885709422,
196
+ "p90": 150.3304336133633,
197
+ "valid_members": 50,
198
+ "total_members": 50
199
+ },
200
+ "r50_SW_estimate_km": {
201
+ "mean": 149.32580058406242,
202
+ "p10": 148.2845885709422,
203
+ "p90": 150.3304336133633,
204
+ "valid_members": 50,
205
+ "total_members": 50
206
+ },
207
+ "r50_NW_estimate_km": {
208
+ "mean": 131.6808874647217,
209
+ "p10": 130.75253200486964,
210
+ "p90": 132.5766579454746,
211
+ "valid_members": 50,
212
+ "total_members": 50
213
+ },
214
+ "r64_NE_estimate_km": {
215
+ "mean": 71.49496165461281,
216
+ "p10": 71.15937939066391,
217
+ "p90": 71.81844341522724,
218
+ "valid_members": 50,
219
+ "total_members": 50
220
+ },
221
+ "r64_SE_estimate_km": {
222
+ "mean": 71.49496165461281,
223
+ "p10": 71.15937939066391,
224
+ "p90": 71.81844341522724,
225
+ "valid_members": 50,
226
+ "total_members": 50
227
+ },
228
+ "r64_SW_estimate_km": {
229
+ "mean": 71.49496165461281,
230
+ "p10": 71.15937939066391,
231
+ "p90": 71.81844341522724,
232
+ "valid_members": 50,
233
+ "total_members": 50
234
+ },
235
+ "r64_NW_estimate_km": {
236
+ "mean": 62.804976940855546,
237
+ "p10": 62.542847868011926,
238
+ "p90": 63.05759872526072,
239
+ "valid_members": 50,
240
+ "total_members": 50
241
+ }
242
+ },
243
+ "official_scoring_allowed": false
244
+ }
245
+ },
246
+ {
247
+ "lead_hours": 12,
248
+ "valid_time_utc": "2015-08-05T12:00:00Z",
249
+ "summary": {
250
+ "method": "pressure-scaled-issue-structure-experimental-v1",
251
+ "members": 50,
252
+ "definitions": {
253
+ "units": "km",
254
+ "quantity_kind": "radius_not_diameter",
255
+ "thresholds_kt": [
256
+ 34,
257
+ 50,
258
+ 64
259
+ ],
260
+ "quadrant_order": [
261
+ "NE",
262
+ "SE",
263
+ "SW",
264
+ "NW"
265
+ ],
266
+ "quadrant_statistic": "maximum_extent_within_quadrant",
267
+ "target_wind_averaging_seconds": 60,
268
+ "validated_wind_averaging_seconds": null,
269
+ "validated_surface_height_m": null,
270
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
271
+ "official_scoring_allowed": false
272
+ },
273
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
274
+ "estimates": {
275
+ "wind_estimate_kt": {
276
+ "mean": 108.8911242341665,
277
+ "p10": 108.53479451417108,
278
+ "p90": 109.255718431246,
279
+ "valid_members": 50,
280
+ "total_members": 50
281
+ },
282
+ "rmw_persistence_km": {
283
+ "mean": 22.223999999999997,
284
+ "p10": 22.224,
285
+ "p90": 22.224,
286
+ "valid_members": 50,
287
+ "total_members": 50
288
+ },
289
+ "r34_NE_estimate_km": {
290
+ "mean": 246.8626654854666,
291
+ "p10": 245.61748618797833,
292
+ "p90": 248.13780655814276,
293
+ "valid_members": 50,
294
+ "total_members": 50
295
+ },
296
+ "r34_SE_estimate_km": {
297
+ "mean": 263.66121479926386,
298
+ "p10": 262.31775266461227,
299
+ "p90": 265.03703750410614,
300
+ "valid_members": 50,
301
+ "total_members": 50
302
+ },
303
+ "r34_SW_estimate_km": {
304
+ "mean": 263.66121479926386,
305
+ "p10": 262.31775266461227,
306
+ "p90": 265.03703750410614,
307
+ "valid_members": 50,
308
+ "total_members": 50
309
+ },
310
+ "r34_NW_estimate_km": {
311
+ "mean": 215.3539412038378,
312
+ "p10": 214.42074998149667,
313
+ "p90": 216.30926163723723,
314
+ "valid_members": 50,
315
+ "total_members": 50
316
+ },
317
+ "r50_NE_estimate_km": {
318
+ "mean": 127.10895320391761,
319
+ "p10": 125.94264725231443,
320
+ "p90": 128.30569304652803,
321
+ "valid_members": 50,
322
+ "total_members": 50
323
+ },
324
+ "r50_SE_estimate_km": {
325
+ "mean": 133.25544001378847,
326
+ "p10": 131.9260444935722,
327
+ "p90": 134.62004986910748,
328
+ "valid_members": 50,
329
+ "total_members": 50
330
+ },
331
+ "r50_SW_estimate_km": {
332
+ "mean": 133.25544001378847,
333
+ "p10": 131.9260444935722,
334
+ "p90": 134.62004986910748,
335
+ "valid_members": 50,
336
+ "total_members": 50
337
+ },
338
+ "r50_NW_estimate_km": {
339
+ "mean": 117.3610325712651,
340
+ "p10": 116.17723668547605,
341
+ "p90": 118.57625051970706,
342
+ "valid_members": 50,
343
+ "total_members": 50
344
+ },
345
+ "r64_NE_estimate_km": {
346
+ "mean": 66.22220851250287,
347
+ "p10": 65.77737473456607,
348
+ "p90": 66.67811162393242,
349
+ "valid_members": 50,
350
+ "total_members": 50
351
+ },
352
+ "r64_SE_estimate_km": {
353
+ "mean": 66.22220851250287,
354
+ "p10": 65.77737473456607,
355
+ "p90": 66.67811162393242,
356
+ "valid_members": 50,
357
+ "total_members": 50
358
+ },
359
+ "r64_SW_estimate_km": {
360
+ "mean": 66.22220851250287,
361
+ "p10": 65.77737473456607,
362
+ "p90": 66.67811162393242,
363
+ "valid_members": 50,
364
+ "total_members": 50
365
+ },
366
+ "r64_NW_estimate_km": {
367
+ "mean": 58.66946937119013,
368
+ "p10": 58.319017940581254,
369
+ "p90": 59.028513368724376,
370
+ "valid_members": 50,
371
+ "total_members": 50
372
+ }
373
+ },
374
+ "official_scoring_allowed": false
375
+ }
376
+ },
377
+ {
378
+ "lead_hours": 18,
379
+ "valid_time_utc": "2015-08-05T18:00:00Z",
380
+ "summary": {
381
+ "method": "pressure-scaled-issue-structure-experimental-v1",
382
+ "members": 50,
383
+ "definitions": {
384
+ "units": "km",
385
+ "quantity_kind": "radius_not_diameter",
386
+ "thresholds_kt": [
387
+ 34,
388
+ 50,
389
+ 64
390
+ ],
391
+ "quadrant_order": [
392
+ "NE",
393
+ "SE",
394
+ "SW",
395
+ "NW"
396
+ ],
397
+ "quadrant_statistic": "maximum_extent_within_quadrant",
398
+ "target_wind_averaging_seconds": 60,
399
+ "validated_wind_averaging_seconds": null,
400
+ "validated_surface_height_m": null,
401
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
402
+ "official_scoring_allowed": false
403
+ },
404
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
405
+ "estimates": {
406
+ "wind_estimate_kt": {
407
+ "mean": 101.67228308295199,
408
+ "p10": 101.22948400835662,
409
+ "p90": 102.09423499404309,
410
+ "valid_members": 50,
411
+ "total_members": 50
412
+ },
413
+ "rmw_persistence_km": {
414
+ "mean": 22.223999999999997,
415
+ "p10": 22.224,
416
+ "p90": 22.224,
417
+ "valid_members": 50,
418
+ "total_members": 50
419
+ },
420
+ "r34_NE_estimate_km": {
421
+ "mean": 222.08484947945917,
422
+ "p10": 220.59421057325613,
423
+ "p90": 223.50678410435003,
424
+ "valid_members": 50,
425
+ "total_members": 50
426
+ },
427
+ "r34_SE_estimate_km": {
428
+ "mean": 236.94152526588405,
429
+ "p10": 235.3349708509011,
430
+ "p90": 238.47407898073675,
431
+ "valid_members": 50,
432
+ "total_members": 50
433
+ },
434
+ "r34_SW_estimate_km": {
435
+ "mean": 236.94152526588405,
436
+ "p10": 235.3349708509011,
437
+ "p90": 238.47407898073675,
438
+ "valid_members": 50,
439
+ "total_members": 50
440
+ },
441
+ "r34_NW_estimate_km": {
442
+ "mean": 196.65059832865055,
443
+ "p10": 195.51658733178203,
444
+ "p90": 197.73189158353458,
445
+ "valid_members": 50,
446
+ "total_members": 50
447
+ },
448
+ "r50_NE_estimate_km": {
449
+ "mean": 104.84192912395251,
450
+ "p10": 103.56228406346904,
451
+ "p90": 106.06555907504658,
452
+ "valid_members": 50,
453
+ "total_members": 50
454
+ },
455
+ "r50_SE_estimate_km": {
456
+ "mean": 108.07593304439608,
457
+ "p10": 106.64181330722917,
458
+ "p90": 109.4479213722312,
459
+ "valid_members": 50,
460
+ "total_members": 50
461
+ },
462
+ "r50_SW_estimate_km": {
463
+ "mean": 108.07593304439608,
464
+ "p10": 106.64181330722917,
465
+ "p90": 109.4479213722312,
466
+ "valid_members": 50,
467
+ "total_members": 50
468
+ },
469
+ "r50_NW_estimate_km": {
470
+ "mean": 94.96384362703513,
471
+ "p10": 93.68977137156024,
472
+ "p90": 96.18279752913358,
473
+ "valid_members": 50,
474
+ "total_members": 50
475
+ },
476
+ "r64_NE_estimate_km": {
477
+ "mean": 57.518235828903016,
478
+ "p10": 57.00417727176632,
479
+ "p90": 58.00908276039814,
480
+ "valid_members": 50,
481
+ "total_members": 50
482
+ },
483
+ "r64_SE_estimate_km": {
484
+ "mean": 57.518235828903016,
485
+ "p10": 57.00417727176632,
486
+ "p90": 58.00908276039814,
487
+ "valid_members": 50,
488
+ "total_members": 50
489
+ },
490
+ "r64_SW_estimate_km": {
491
+ "mean": 57.518235828903016,
492
+ "p10": 57.00417727176632,
493
+ "p90": 58.00908276039814,
494
+ "valid_members": 50,
495
+ "total_members": 50
496
+ },
497
+ "r64_NW_estimate_km": {
498
+ "mean": 51.76081434670611,
499
+ "p10": 51.349420058346674,
500
+ "p90": 52.15346122377093,
501
+ "valid_members": 50,
502
+ "total_members": 50
503
+ }
504
+ },
505
+ "official_scoring_allowed": false
506
+ }
507
+ },
508
+ {
509
+ "lead_hours": 24,
510
+ "valid_time_utc": "2015-08-06T00:00:00Z",
511
+ "summary": {
512
+ "method": "pressure-scaled-issue-structure-experimental-v1",
513
+ "members": 50,
514
+ "definitions": {
515
+ "units": "km",
516
+ "quantity_kind": "radius_not_diameter",
517
+ "thresholds_kt": [
518
+ 34,
519
+ 50,
520
+ 64
521
+ ],
522
+ "quadrant_order": [
523
+ "NE",
524
+ "SE",
525
+ "SW",
526
+ "NW"
527
+ ],
528
+ "quadrant_statistic": "maximum_extent_within_quadrant",
529
+ "target_wind_averaging_seconds": 60,
530
+ "validated_wind_averaging_seconds": null,
531
+ "validated_surface_height_m": null,
532
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
533
+ "official_scoring_allowed": false
534
+ },
535
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
536
+ "estimates": {
537
+ "wind_estimate_kt": {
538
+ "mean": 97.4172536550789,
539
+ "p10": 96.85480169746745,
540
+ "p90": 97.89064371395327,
541
+ "valid_members": 50,
542
+ "total_members": 50
543
+ },
544
+ "rmw_persistence_km": {
545
+ "mean": 22.223999999999997,
546
+ "p10": 22.224,
547
+ "p90": 22.224,
548
+ "valid_members": 50,
549
+ "total_members": 50
550
+ },
551
+ "r34_NE_estimate_km": {
552
+ "mean": 207.91652069820756,
553
+ "p10": 206.0671336851711,
554
+ "p90": 209.47538555618218,
555
+ "valid_members": 50,
556
+ "total_members": 50
557
+ },
558
+ "r34_SE_estimate_km": {
559
+ "mean": 221.6762698531099,
560
+ "p10": 219.68443145595842,
561
+ "p90": 223.3552808477937,
562
+ "valid_members": 50,
563
+ "total_members": 50
564
+ },
565
+ "r34_SW_estimate_km": {
566
+ "mean": 221.6762698531099,
567
+ "p10": 219.68443145595842,
568
+ "p90": 223.3552808477937,
569
+ "valid_members": 50,
570
+ "total_members": 50
571
+ },
572
+ "r34_NW_estimate_km": {
573
+ "mean": 185.82462721480275,
574
+ "p10": 184.40434443318557,
575
+ "p90": 187.02108085606008,
576
+ "valid_members": 50,
577
+ "total_members": 50
578
+ },
579
+ "r50_NE_estimate_km": {
580
+ "mean": 92.9836136936664,
581
+ "p10": 91.48091561515784,
582
+ "p90": 94.25466623238627,
583
+ "valid_members": 50,
584
+ "total_members": 50
585
+ },
586
+ "r50_SE_estimate_km": {
587
+ "mean": 94.85095005855732,
588
+ "p10": 93.18471544371408,
589
+ "p90": 96.26128134124974,
590
+ "valid_members": 50,
591
+ "total_members": 50
592
+ },
593
+ "r50_SW_estimate_km": {
594
+ "mean": 94.85095005855732,
595
+ "p10": 93.18471544371408,
596
+ "p90": 96.26128134124974,
597
+ "valid_members": 50,
598
+ "total_members": 50
599
+ },
600
+ "r50_NW_estimate_km": {
601
+ "mean": 83.22268532410179,
602
+ "p10": 81.74457958208477,
603
+ "p90": 84.4738975103466,
604
+ "valid_members": 50,
605
+ "total_members": 50
606
+ },
607
+ "r64_NE_estimate_km": {
608
+ "mean": 52.682217501892055,
609
+ "p10": 52.05847566307593,
610
+ "p90": 53.20871598943953,
611
+ "valid_members": 50,
612
+ "total_members": 50
613
+ },
614
+ "r64_SE_estimate_km": {
615
+ "mean": 52.682217501892055,
616
+ "p10": 52.05847566307593,
617
+ "p90": 53.20871598943953,
618
+ "valid_members": 50,
619
+ "total_members": 50
620
+ },
621
+ "r64_SW_estimate_km": {
622
+ "mean": 52.682217501892055,
623
+ "p10": 52.05847566307593,
624
+ "p90": 53.20871598943953,
625
+ "valid_members": 50,
626
+ "total_members": 50
627
+ },
628
+ "r64_NW_estimate_km": {
629
+ "mean": 47.87287380515676,
630
+ "p10": 47.36873766099984,
631
+ "p90": 48.29814708400235,
632
+ "valid_members": 50,
633
+ "total_members": 50
634
+ }
635
+ },
636
+ "official_scoring_allowed": false
637
+ }
638
+ },
639
+ {
640
+ "lead_hours": 30,
641
+ "valid_time_utc": "2015-08-06T06:00:00Z",
642
+ "summary": {
643
+ "method": "pressure-scaled-issue-structure-experimental-v1",
644
+ "members": 50,
645
+ "definitions": {
646
+ "units": "km",
647
+ "quantity_kind": "radius_not_diameter",
648
+ "thresholds_kt": [
649
+ 34,
650
+ 50,
651
+ 64
652
+ ],
653
+ "quadrant_order": [
654
+ "NE",
655
+ "SE",
656
+ "SW",
657
+ "NW"
658
+ ],
659
+ "quadrant_statistic": "maximum_extent_within_quadrant",
660
+ "target_wind_averaging_seconds": 60,
661
+ "validated_wind_averaging_seconds": null,
662
+ "validated_surface_height_m": null,
663
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
664
+ "official_scoring_allowed": false
665
+ },
666
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
667
+ "estimates": {
668
+ "wind_estimate_kt": {
669
+ "mean": 95.98270566159148,
670
+ "p10": 95.34206418170336,
671
+ "p90": 96.49731772743253,
672
+ "valid_members": 50,
673
+ "total_members": 50
674
+ },
675
+ "rmw_persistence_km": {
676
+ "mean": 22.223999999999997,
677
+ "p10": 22.224,
678
+ "p90": 22.224,
679
+ "valid_members": 50,
680
+ "total_members": 50
681
+ },
682
+ "r34_NE_estimate_km": {
683
+ "mean": 203.214788071585,
684
+ "p10": 201.12516337227834,
685
+ "p90": 204.895463674228,
686
+ "valid_members": 50,
687
+ "total_members": 50
688
+ },
689
+ "r34_SE_estimate_km": {
690
+ "mean": 216.61285321880186,
691
+ "p10": 214.3627971686341,
692
+ "p90": 218.42262962257533,
693
+ "valid_members": 50,
694
+ "total_members": 50
695
+ },
696
+ "r34_SW_estimate_km": {
697
+ "mean": 216.61285321880186,
698
+ "p10": 214.3627971686341,
699
+ "p90": 218.42262962257533,
700
+ "valid_members": 50,
701
+ "total_members": 50
702
+ },
703
+ "r34_NW_estimate_km": {
704
+ "mean": 182.20914625354487,
705
+ "p10": 180.5991854136628,
706
+ "p90": 183.5033717238677,
707
+ "valid_members": 50,
708
+ "total_members": 50
709
+ },
710
+ "r50_NE_estimate_km": {
711
+ "mean": 89.19179185963131,
712
+ "p10": 87.52544339156384,
713
+ "p90": 90.53600295355103,
714
+ "valid_members": 50,
715
+ "total_members": 50
716
+ },
717
+ "r50_SE_estimate_km": {
718
+ "mean": 90.65255438273081,
719
+ "p10": 88.81157032939295,
720
+ "p90": 92.13849407920827,
721
+ "valid_members": 50,
722
+ "total_members": 50
723
+ },
724
+ "r50_SW_estimate_km": {
725
+ "mean": 90.65255438273081,
726
+ "p10": 88.81157032939295,
727
+ "p90": 92.13849407920827,
728
+ "valid_members": 50,
729
+ "total_members": 50
730
+ },
731
+ "r50_NW_estimate_km": {
732
+ "mean": 79.49906015880516,
733
+ "p10": 77.86675534498212,
734
+ "p90": 80.81667009251439,
735
+ "valid_members": 50,
736
+ "total_members": 50
737
+ },
738
+ "r64_NE_estimate_km": {
739
+ "mean": 51.10127699643301,
740
+ "p10": 50.40184135577899,
741
+ "p90": 51.66450455468706,
742
+ "valid_members": 50,
743
+ "total_members": 50
744
+ },
745
+ "r64_SE_estimate_km": {
746
+ "mean": 51.10127699643301,
747
+ "p10": 50.40184135577899,
748
+ "p90": 51.66450455468706,
749
+ "valid_members": 50,
750
+ "total_members": 50
751
+ },
752
+ "r64_SW_estimate_km": {
753
+ "mean": 51.10127699643301,
754
+ "p10": 50.40184135577899,
755
+ "p90": 51.66450455468706,
756
+ "valid_members": 50,
757
+ "total_members": 50
758
+ },
759
+ "r64_NW_estimate_km": {
760
+ "mean": 46.59336030584631,
761
+ "p10": 46.0261329448618,
762
+ "p90": 47.049882417829,
763
+ "valid_members": 50,
764
+ "total_members": 50
765
+ }
766
+ },
767
+ "official_scoring_allowed": false
768
+ }
769
+ },
770
+ {
771
+ "lead_hours": 36,
772
+ "valid_time_utc": "2015-08-06T12:00:00Z",
773
+ "summary": {
774
+ "method": "pressure-scaled-issue-structure-experimental-v1",
775
+ "members": 50,
776
+ "definitions": {
777
+ "units": "km",
778
+ "quantity_kind": "radius_not_diameter",
779
+ "thresholds_kt": [
780
+ 34,
781
+ 50,
782
+ 64
783
+ ],
784
+ "quadrant_order": [
785
+ "NE",
786
+ "SE",
787
+ "SW",
788
+ "NW"
789
+ ],
790
+ "quadrant_statistic": "maximum_extent_within_quadrant",
791
+ "target_wind_averaging_seconds": 60,
792
+ "validated_wind_averaging_seconds": null,
793
+ "validated_surface_height_m": null,
794
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
795
+ "official_scoring_allowed": false
796
+ },
797
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
798
+ "estimates": {
799
+ "wind_estimate_kt": {
800
+ "mean": 94.7739882454048,
801
+ "p10": 94.20472468973468,
802
+ "p90": 95.26216093028731,
803
+ "valid_members": 50,
804
+ "total_members": 50
805
+ },
806
+ "rmw_persistence_km": {
807
+ "mean": 22.223999999999997,
808
+ "p10": 22.224,
809
+ "p90": 22.224,
810
+ "valid_members": 50,
811
+ "total_members": 50
812
+ },
813
+ "r34_NE_estimate_km": {
814
+ "mean": 199.28212031604863,
815
+ "p10": 197.43744389002688,
816
+ "p90": 200.86531113336966,
817
+ "valid_members": 50,
818
+ "total_members": 50
819
+ },
820
+ "r34_SE_estimate_km": {
821
+ "mean": 212.3785622995911,
822
+ "p10": 210.39263826067406,
823
+ "p90": 214.08301887731741,
824
+ "valid_members": 50,
825
+ "total_members": 50
826
+ },
827
+ "r34_SW_estimate_km": {
828
+ "mean": 212.3785622995911,
829
+ "p10": 210.39263826067406,
830
+ "p90": 214.08301887731741,
831
+ "valid_members": 50,
832
+ "total_members": 50
833
+ },
834
+ "r34_NW_estimate_km": {
835
+ "mean": 179.17615207937865,
836
+ "p10": 177.7511700415309,
837
+ "p90": 180.39874201174646,
838
+ "valid_members": 50,
839
+ "total_members": 50
840
+ },
841
+ "r50_NE_estimate_km": {
842
+ "mean": 86.07398009148605,
843
+ "p10": 84.62530802112954,
844
+ "p90": 87.31966331101307,
845
+ "valid_members": 50,
846
+ "total_members": 50
847
+ },
848
+ "r50_SE_estimate_km": {
849
+ "mean": 87.21187434004437,
850
+ "p10": 85.61612566974321,
851
+ "p90": 88.58453124382108,
852
+ "valid_members": 50,
853
+ "total_members": 50
854
+ },
855
+ "r50_SW_estimate_km": {
856
+ "mean": 87.21187434004437,
857
+ "p10": 85.61612566974321,
858
+ "p90": 88.58453124382108,
859
+ "valid_members": 50,
860
+ "total_members": 50
861
+ },
862
+ "r50_NW_estimate_km": {
863
+ "mean": 76.44886263222885,
864
+ "p10": 75.03457517902044,
865
+ "p90": 77.66548915326592,
866
+ "valid_members": 50,
867
+ "total_members": 50
868
+ },
869
+ "r64_NE_estimate_km": {
870
+ "mean": 49.78805356448755,
871
+ "p10": 49.17442007744825,
872
+ "p90": 50.315108392776246,
873
+ "valid_members": 50,
874
+ "total_members": 50
875
+ },
876
+ "r64_SE_estimate_km": {
877
+ "mean": 49.78805356448755,
878
+ "p10": 49.17442007744825,
879
+ "p90": 50.315108392776246,
880
+ "valid_members": 50,
881
+ "total_members": 50
882
+ },
883
+ "r64_SW_estimate_km": {
884
+ "mean": 49.78805356448755,
885
+ "p10": 49.17442007744825,
886
+ "p90": 50.315108392776246,
887
+ "valid_members": 50,
888
+ "total_members": 50
889
+ },
890
+ "r64_NW_estimate_km": {
891
+ "mean": 45.527243227879154,
892
+ "p10": 45.028226575605665,
893
+ "p90": 45.955706287370234,
894
+ "valid_members": 50,
895
+ "total_members": 50
896
+ }
897
+ },
898
+ "official_scoring_allowed": false
899
+ }
900
+ },
901
+ {
902
+ "lead_hours": 42,
903
+ "valid_time_utc": "2015-08-06T18:00:00Z",
904
+ "summary": {
905
+ "method": "pressure-scaled-issue-structure-experimental-v1",
906
+ "members": 50,
907
+ "definitions": {
908
+ "units": "km",
909
+ "quantity_kind": "radius_not_diameter",
910
+ "thresholds_kt": [
911
+ 34,
912
+ 50,
913
+ 64
914
+ ],
915
+ "quadrant_order": [
916
+ "NE",
917
+ "SE",
918
+ "SW",
919
+ "NW"
920
+ ],
921
+ "quadrant_statistic": "maximum_extent_within_quadrant",
922
+ "target_wind_averaging_seconds": 60,
923
+ "validated_wind_averaging_seconds": null,
924
+ "validated_surface_height_m": null,
925
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
926
+ "official_scoring_allowed": false
927
+ },
928
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
929
+ "estimates": {
930
+ "wind_estimate_kt": {
931
+ "mean": 96.70079132004756,
932
+ "p10": 96.0907720922027,
933
+ "p90": 97.31973025797151,
934
+ "valid_members": 50,
935
+ "total_members": 50
936
+ },
937
+ "rmw_persistence_km": {
938
+ "mean": 22.223999999999997,
939
+ "p10": 22.224,
940
+ "p90": 22.224,
941
+ "valid_members": 50,
942
+ "total_members": 50
943
+ },
944
+ "r34_NE_estimate_km": {
945
+ "mean": 205.56447529703746,
946
+ "p10": 203.56584988400368,
947
+ "p90": 207.59448291346322,
948
+ "valid_members": 50,
949
+ "total_members": 50
950
+ },
951
+ "r34_SE_estimate_km": {
952
+ "mean": 219.14317177702665,
953
+ "p10": 216.99082326013948,
954
+ "p90": 221.32938376338987,
955
+ "valid_members": 50,
956
+ "total_members": 50
957
+ },
958
+ "r34_SW_estimate_km": {
959
+ "mean": 219.14317177702665,
960
+ "p10": 216.99082326013948,
961
+ "p90": 221.32938376338987,
962
+ "valid_members": 50,
963
+ "total_members": 50
964
+ },
965
+ "r34_NW_estimate_km": {
966
+ "mean": 184.01716456080155,
967
+ "p10": 182.48006455372942,
968
+ "p90": 185.57773350722076,
969
+ "valid_members": 50,
970
+ "total_members": 50
971
+ },
972
+ "r50_NE_estimate_km": {
973
+ "mean": 91.0795259444029,
974
+ "p10": 89.46907692212598,
975
+ "p90": 92.71933664882678,
976
+ "valid_members": 50,
977
+ "total_members": 50
978
+ },
979
+ "r50_SE_estimate_km": {
980
+ "mean": 92.74114728369177,
981
+ "p10": 90.95832621741167,
982
+ "p90": 94.55735021474577,
983
+ "valid_members": 50,
984
+ "total_members": 50
985
+ },
986
+ "r50_SW_estimate_km": {
987
+ "mean": 92.74114728369177,
988
+ "p10": 90.95832621741167,
989
+ "p90": 94.55735021474577,
990
+ "valid_members": 50,
991
+ "total_members": 50
992
+ },
993
+ "r50_NW_estimate_km": {
994
+ "mean": 81.3512771477778,
995
+ "p10": 79.7701019640717,
996
+ "p90": 82.96216602008779,
997
+ "valid_members": 50,
998
+ "total_members": 50
999
+ },
1000
+ "r64_NE_estimate_km": {
1001
+ "mean": 51.89013101331463,
1002
+ "p10": 51.21833168462318,
1003
+ "p90": 52.57316590376724,
1004
+ "valid_members": 50,
1005
+ "total_members": 50
1006
+ },
1007
+ "r64_SE_estimate_km": {
1008
+ "mean": 51.89013101331463,
1009
+ "p10": 51.21833168462318,
1010
+ "p90": 52.57316590376724,
1011
+ "valid_members": 50,
1012
+ "total_members": 50
1013
+ },
1014
+ "r64_SW_estimate_km": {
1015
+ "mean": 51.89013101331463,
1016
+ "p10": 51.21833168462318,
1017
+ "p90": 52.57316590376724,
1018
+ "valid_members": 50,
1019
+ "total_members": 50
1020
+ },
1021
+ "r64_NW_estimate_km": {
1022
+ "mean": 47.2322479577632,
1023
+ "p10": 46.68845231481727,
1024
+ "p90": 47.784890905543854,
1025
+ "valid_members": 50,
1026
+ "total_members": 50
1027
+ }
1028
+ },
1029
+ "official_scoring_allowed": false
1030
+ }
1031
+ },
1032
+ {
1033
+ "lead_hours": 48,
1034
+ "valid_time_utc": "2015-08-07T00:00:00Z",
1035
+ "summary": {
1036
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1037
+ "members": 50,
1038
+ "definitions": {
1039
+ "units": "km",
1040
+ "quantity_kind": "radius_not_diameter",
1041
+ "thresholds_kt": [
1042
+ 34,
1043
+ 50,
1044
+ 64
1045
+ ],
1046
+ "quadrant_order": [
1047
+ "NE",
1048
+ "SE",
1049
+ "SW",
1050
+ "NW"
1051
+ ],
1052
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1053
+ "target_wind_averaging_seconds": 60,
1054
+ "validated_wind_averaging_seconds": null,
1055
+ "validated_surface_height_m": null,
1056
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1057
+ "official_scoring_allowed": false
1058
+ },
1059
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1060
+ "estimates": {
1061
+ "wind_estimate_kt": {
1062
+ "mean": 98.18701486039059,
1063
+ "p10": 97.57117493407472,
1064
+ "p90": 98.77290412964818,
1065
+ "valid_members": 50,
1066
+ "total_members": 50
1067
+ },
1068
+ "rmw_persistence_km": {
1069
+ "mean": 22.223999999999997,
1070
+ "p10": 22.224,
1071
+ "p90": 22.224,
1072
+ "valid_members": 50,
1073
+ "total_members": 50
1074
+ },
1075
+ "r34_NE_estimate_km": {
1076
+ "mean": 210.4568225477419,
1077
+ "p10": 208.422140020876,
1078
+ "p90": 212.39376940558893,
1079
+ "valid_members": 50,
1080
+ "total_members": 50
1081
+ },
1082
+ "r34_SE_estimate_km": {
1083
+ "mean": 224.41253206141408,
1084
+ "p10": 222.22081992196294,
1085
+ "p90": 226.49900374584428,
1086
+ "valid_members": 50,
1087
+ "total_members": 50
1088
+ },
1089
+ "r34_SW_estimate_km": {
1090
+ "mean": 224.41253206141408,
1091
+ "p10": 222.22081992196294,
1092
+ "p90": 226.49900374584428,
1093
+ "valid_members": 50,
1094
+ "total_members": 50
1095
+ },
1096
+ "r34_NW_estimate_km": {
1097
+ "mean": 187.77265557641596,
1098
+ "p10": 186.2130801345605,
1099
+ "p90": 189.2569421541034,
1100
+ "valid_members": 50,
1101
+ "total_members": 50
1102
+ },
1103
+ "r50_NE_estimate_km": {
1104
+ "mean": 95.06544083538321,
1105
+ "p10": 93.3935206568057,
1106
+ "p90": 96.65939083496274,
1107
+ "valid_members": 50,
1108
+ "total_members": 50
1109
+ },
1110
+ "r50_SE_estimate_km": {
1111
+ "mean": 97.16318234608,
1112
+ "p10": 95.3052659191647,
1113
+ "p90": 98.93495943641652,
1114
+ "valid_members": 50,
1115
+ "total_members": 50
1116
+ },
1117
+ "r50_SW_estimate_km": {
1118
+ "mean": 97.16318234608,
1119
+ "p10": 95.3052659191647,
1120
+ "p90": 98.93495943641652,
1121
+ "valid_members": 50,
1122
+ "total_members": 50
1123
+ },
1124
+ "r50_NW_estimate_km": {
1125
+ "mean": 85.27432252077466,
1126
+ "p10": 83.62568132938226,
1127
+ "p90": 86.8465889242204,
1128
+ "valid_members": 50,
1129
+ "total_members": 50
1130
+ },
1131
+ "r64_NE_estimate_km": {
1132
+ "mean": 53.54195256962507,
1133
+ "p10": 52.85259193805116,
1134
+ "p90": 54.19859032589326,
1135
+ "valid_members": 50,
1136
+ "total_members": 50
1137
+ },
1138
+ "r64_SE_estimate_km": {
1139
+ "mean": 53.54195256962507,
1140
+ "p10": 52.85259193805116,
1141
+ "p90": 54.19859032589326,
1142
+ "valid_members": 50,
1143
+ "total_members": 50
1144
+ },
1145
+ "r64_SW_estimate_km": {
1146
+ "mean": 53.54195256962507,
1147
+ "p10": 52.85259193805116,
1148
+ "p90": 54.19859032589326,
1149
+ "valid_members": 50,
1150
+ "total_members": 50
1151
+ },
1152
+ "r64_NW_estimate_km": {
1153
+ "mean": 48.56668173365142,
1154
+ "p10": 48.01063403206128,
1155
+ "p90": 49.09619463884623,
1156
+ "valid_members": 50,
1157
+ "total_members": 50
1158
+ }
1159
+ },
1160
+ "official_scoring_allowed": false
1161
+ }
1162
+ },
1163
+ {
1164
+ "lead_hours": 54,
1165
+ "valid_time_utc": "2015-08-07T06:00:00Z",
1166
+ "summary": {
1167
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1168
+ "members": 50,
1169
+ "definitions": {
1170
+ "units": "km",
1171
+ "quantity_kind": "radius_not_diameter",
1172
+ "thresholds_kt": [
1173
+ 34,
1174
+ 50,
1175
+ 64
1176
+ ],
1177
+ "quadrant_order": [
1178
+ "NE",
1179
+ "SE",
1180
+ "SW",
1181
+ "NW"
1182
+ ],
1183
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1184
+ "target_wind_averaging_seconds": 60,
1185
+ "validated_wind_averaging_seconds": null,
1186
+ "validated_surface_height_m": null,
1187
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1188
+ "official_scoring_allowed": false
1189
+ },
1190
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1191
+ "estimates": {
1192
+ "wind_estimate_kt": {
1193
+ "mean": 100.55911727165068,
1194
+ "p10": 99.91917985211082,
1195
+ "p90": 101.23791922591698,
1196
+ "valid_members": 50,
1197
+ "total_members": 50
1198
+ },
1199
+ "rmw_persistence_km": {
1200
+ "mean": 22.223999999999997,
1201
+ "p10": 22.224,
1202
+ "p90": 22.224,
1203
+ "valid_members": 50,
1204
+ "total_members": 50
1205
+ },
1206
+ "r34_NE_estimate_km": {
1207
+ "mean": 218.34927082838774,
1208
+ "p10": 216.20662395587402,
1209
+ "p90": 220.6225683268315,
1210
+ "valid_members": 50,
1211
+ "total_members": 50
1212
+ },
1213
+ "r34_SE_estimate_km": {
1214
+ "mean": 232.9158269258816,
1215
+ "p10": 230.6069257928789,
1216
+ "p90": 235.36553256257142,
1217
+ "valid_members": 50,
1218
+ "total_members": 50
1219
+ },
1220
+ "r34_SW_estimate_km": {
1221
+ "mean": 232.9158269258816,
1222
+ "p10": 230.6069257928789,
1223
+ "p90": 235.36553256257142,
1224
+ "valid_members": 50,
1225
+ "total_members": 50
1226
+ },
1227
+ "r34_NW_estimate_km": {
1228
+ "mean": 193.80514729698842,
1229
+ "p10": 192.17157168063085,
1230
+ "p90": 195.53817240568623,
1231
+ "valid_members": 50,
1232
+ "total_members": 50
1233
+ },
1234
+ "r50_NE_estimate_km": {
1235
+ "mean": 101.65851036799293,
1236
+ "p10": 99.84224156396418,
1237
+ "p90": 103.58655062396087,
1238
+ "valid_members": 50,
1239
+ "total_members": 50
1240
+ },
1241
+ "r50_SE_estimate_km": {
1242
+ "mean": 104.51327166398154,
1243
+ "p10": 102.48272753640367,
1244
+ "p90": 106.66899245669534,
1245
+ "valid_members": 50,
1246
+ "total_members": 50
1247
+ },
1248
+ "r50_SW_estimate_km": {
1249
+ "mean": 104.51327166398154,
1250
+ "p10": 102.48272753640367,
1251
+ "p90": 106.66899245669534,
1252
+ "valid_members": 50,
1253
+ "total_members": 50
1254
+ },
1255
+ "r50_NW_estimate_km": {
1256
+ "mean": 91.79939289737338,
1257
+ "p10": 89.99606668658531,
1258
+ "p90": 93.71391527414406,
1259
+ "valid_members": 50,
1260
+ "total_members": 50
1261
+ },
1262
+ "r64_NE_estimate_km": {
1263
+ "mean": 56.23381229841979,
1264
+ "p10": 55.49867492533029,
1265
+ "p90": 57.01394409944749,
1266
+ "valid_members": 50,
1267
+ "total_members": 50
1268
+ },
1269
+ "r64_SE_estimate_km": {
1270
+ "mean": 56.23381229841979,
1271
+ "p10": 55.49867492533029,
1272
+ "p90": 57.01394409944749,
1273
+ "valid_members": 50,
1274
+ "total_members": 50
1275
+ },
1276
+ "r64_SW_estimate_km": {
1277
+ "mean": 56.23381229841979,
1278
+ "p10": 55.49867492533029,
1279
+ "p90": 57.01394409944749,
1280
+ "valid_members": 50,
1281
+ "total_members": 50
1282
+ },
1283
+ "r64_NW_estimate_km": {
1284
+ "mean": 50.73154950424848,
1285
+ "p10": 50.14188871510692,
1286
+ "p90": 51.357240793966334,
1287
+ "valid_members": 50,
1288
+ "total_members": 50
1289
+ }
1290
+ },
1291
+ "official_scoring_allowed": false
1292
+ }
1293
+ },
1294
+ {
1295
+ "lead_hours": 60,
1296
+ "valid_time_utc": "2015-08-07T12:00:00Z",
1297
+ "summary": {
1298
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1299
+ "members": 50,
1300
+ "definitions": {
1301
+ "units": "km",
1302
+ "quantity_kind": "radius_not_diameter",
1303
+ "thresholds_kt": [
1304
+ 34,
1305
+ 50,
1306
+ 64
1307
+ ],
1308
+ "quadrant_order": [
1309
+ "NE",
1310
+ "SE",
1311
+ "SW",
1312
+ "NW"
1313
+ ],
1314
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1315
+ "target_wind_averaging_seconds": 60,
1316
+ "validated_wind_averaging_seconds": null,
1317
+ "validated_surface_height_m": null,
1318
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1319
+ "official_scoring_allowed": false
1320
+ },
1321
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1322
+ "estimates": {
1323
+ "wind_estimate_kt": {
1324
+ "mean": 98.62991086829217,
1325
+ "p10": 98.0818516617311,
1326
+ "p90": 99.32937155502148,
1327
+ "valid_members": 50,
1328
+ "total_members": 50
1329
+ },
1330
+ "rmw_persistence_km": {
1331
+ "mean": 22.223999999999997,
1332
+ "p10": 22.224,
1333
+ "p90": 22.224,
1334
+ "valid_members": 50,
1335
+ "total_members": 50
1336
+ },
1337
+ "r34_NE_estimate_km": {
1338
+ "mean": 211.92240515077344,
1339
+ "p10": 210.10666728396373,
1340
+ "p90": 214.24177007003482,
1341
+ "valid_members": 50,
1342
+ "total_members": 50
1343
+ },
1344
+ "r34_SE_estimate_km": {
1345
+ "mean": 225.9912950049071,
1346
+ "p10": 224.03526847801288,
1347
+ "p90": 228.48992362503841,
1348
+ "valid_members": 50,
1349
+ "total_members": 50
1350
+ },
1351
+ "r34_SW_estimate_km": {
1352
+ "mean": 225.9912950049071,
1353
+ "p10": 224.03526847801288,
1354
+ "p90": 228.48992362503841,
1355
+ "valid_members": 50,
1356
+ "total_members": 50
1357
+ },
1358
+ "r34_NW_estimate_km": {
1359
+ "mean": 188.89531227917712,
1360
+ "p10": 187.5050951005098,
1361
+ "p90": 190.67050708610572,
1362
+ "valid_members": 50,
1363
+ "total_members": 50
1364
+ },
1365
+ "r50_NE_estimate_km": {
1366
+ "mean": 96.27416354972604,
1367
+ "p10": 94.77252170815464,
1368
+ "p90": 98.19624316985069,
1369
+ "valid_members": 50,
1370
+ "total_members": 50
1371
+ },
1372
+ "r50_SE_estimate_km": {
1373
+ "mean": 98.50733593617758,
1374
+ "p10": 96.83655689036955,
1375
+ "p90": 100.64675937755072,
1376
+ "valid_members": 50,
1377
+ "total_members": 50
1378
+ },
1379
+ "r50_SW_estimate_km": {
1380
+ "mean": 98.50733593617758,
1381
+ "p10": 96.83655689036955,
1382
+ "p90": 100.64675937755072,
1383
+ "valid_members": 50,
1384
+ "total_members": 50
1385
+ },
1386
+ "r50_NW_estimate_km": {
1387
+ "mean": 86.46718923008831,
1388
+ "p10": 84.98435088966967,
1389
+ "p90": 88.36605988586464,
1390
+ "valid_members": 50,
1391
+ "total_members": 50
1392
+ },
1393
+ "r64_NE_estimate_km": {
1394
+ "mean": 54.03923717218822,
1395
+ "p10": 53.42245173228153,
1396
+ "p90": 54.827751647584364,
1397
+ "valid_members": 50,
1398
+ "total_members": 50
1399
+ },
1400
+ "r64_SE_estimate_km": {
1401
+ "mean": 54.03923717218822,
1402
+ "p10": 53.42245173228153,
1403
+ "p90": 54.827751647584364,
1404
+ "valid_members": 50,
1405
+ "total_members": 50
1406
+ },
1407
+ "r64_SW_estimate_km": {
1408
+ "mean": 54.03923717218822,
1409
+ "p10": 53.42245173228153,
1410
+ "p90": 54.827751647584364,
1411
+ "valid_members": 50,
1412
+ "total_members": 50
1413
+ },
1414
+ "r64_NW_estimate_km": {
1415
+ "mean": 48.96753322494579,
1416
+ "p10": 48.47060156483481,
1417
+ "p90": 49.60258956015066,
1418
+ "valid_members": 50,
1419
+ "total_members": 50
1420
+ }
1421
+ },
1422
+ "official_scoring_allowed": false
1423
+ }
1424
+ },
1425
+ {
1426
+ "lead_hours": 66,
1427
+ "valid_time_utc": "2015-08-07T18:00:00Z",
1428
+ "summary": {
1429
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1430
+ "members": 50,
1431
+ "definitions": {
1432
+ "units": "km",
1433
+ "quantity_kind": "radius_not_diameter",
1434
+ "thresholds_kt": [
1435
+ 34,
1436
+ 50,
1437
+ 64
1438
+ ],
1439
+ "quadrant_order": [
1440
+ "NE",
1441
+ "SE",
1442
+ "SW",
1443
+ "NW"
1444
+ ],
1445
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1446
+ "target_wind_averaging_seconds": 60,
1447
+ "validated_wind_averaging_seconds": null,
1448
+ "validated_surface_height_m": null,
1449
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1450
+ "official_scoring_allowed": false
1451
+ },
1452
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1453
+ "estimates": {
1454
+ "wind_estimate_kt": {
1455
+ "mean": 96.45994485697648,
1456
+ "p10": 95.84430532852195,
1457
+ "p90": 97.1751516276215,
1458
+ "valid_members": 50,
1459
+ "total_members": 50
1460
+ },
1461
+ "rmw_persistence_km": {
1462
+ "mean": 22.223999999999997,
1463
+ "p10": 22.224,
1464
+ "p90": 22.224,
1465
+ "valid_members": 50,
1466
+ "total_members": 50
1467
+ },
1468
+ "r34_NE_estimate_km": {
1469
+ "mean": 204.77577346246636,
1470
+ "p10": 202.76125836402707,
1471
+ "p90": 207.11908740621573,
1472
+ "valid_members": 50,
1473
+ "total_members": 50
1474
+ },
1475
+ "r34_SE_estimate_km": {
1476
+ "mean": 218.29381956943286,
1477
+ "p10": 216.12443804021373,
1478
+ "p90": 220.8173700348143,
1479
+ "valid_members": 50,
1480
+ "total_members": 50
1481
+ },
1482
+ "r34_SW_estimate_km": {
1483
+ "mean": 218.29381956943286,
1484
+ "p10": 216.12443804021373,
1485
+ "p90": 220.8173700348143,
1486
+ "valid_members": 50,
1487
+ "total_members": 50
1488
+ },
1489
+ "r34_NW_estimate_km": {
1490
+ "mean": 183.41047049860126,
1491
+ "p10": 181.8603715010831,
1492
+ "p90": 185.21264450621769,
1493
+ "valid_members": 50,
1494
+ "total_members": 50
1495
+ },
1496
+ "r50_NE_estimate_km": {
1497
+ "mean": 90.44473209488142,
1498
+ "p10": 88.82621511996324,
1499
+ "p90": 92.3330447442863,
1500
+ "valid_members": 50,
1501
+ "total_members": 50
1502
+ },
1503
+ "r50_SE_estimate_km": {
1504
+ "mean": 92.03856296023497,
1505
+ "p10": 90.2478249286074,
1506
+ "p90": 94.12901607874304,
1507
+ "valid_members": 50,
1508
+ "total_members": 50
1509
+ },
1510
+ "r50_SW_estimate_km": {
1511
+ "mean": 92.03856296023497,
1512
+ "p10": 90.2478249286074,
1513
+ "p90": 94.12901607874304,
1514
+ "valid_members": 50,
1515
+ "total_members": 50
1516
+ },
1517
+ "r50_NW_estimate_km": {
1518
+ "mean": 80.72817736556611,
1519
+ "p10": 79.14010480645032,
1520
+ "p90": 82.58219332337472,
1521
+ "valid_members": 50,
1522
+ "total_members": 50
1523
+ },
1524
+ "r64_NE_estimate_km": {
1525
+ "mean": 51.62514730508947,
1526
+ "p10": 50.9488075603307,
1527
+ "p90": 52.41282679966902,
1528
+ "valid_members": 50,
1529
+ "total_members": 50
1530
+ },
1531
+ "r64_SE_estimate_km": {
1532
+ "mean": 51.62514730508947,
1533
+ "p10": 50.9488075603307,
1534
+ "p90": 52.41282679966902,
1535
+ "valid_members": 50,
1536
+ "total_members": 50
1537
+ },
1538
+ "r64_SW_estimate_km": {
1539
+ "mean": 51.62514730508947,
1540
+ "p10": 50.9488075603307,
1541
+ "p90": 52.41282679966902,
1542
+ "valid_members": 50,
1543
+ "total_members": 50
1544
+ },
1545
+ "r64_NW_estimate_km": {
1546
+ "mean": 47.01770962969113,
1547
+ "p10": 46.469950633462425,
1548
+ "p90": 47.655298586818496,
1549
+ "valid_members": 50,
1550
+ "total_members": 50
1551
+ }
1552
+ },
1553
+ "official_scoring_allowed": false
1554
+ }
1555
+ },
1556
+ {
1557
+ "lead_hours": 72,
1558
+ "valid_time_utc": "2015-08-08T00:00:00Z",
1559
+ "summary": {
1560
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1561
+ "members": 50,
1562
+ "definitions": {
1563
+ "units": "km",
1564
+ "quantity_kind": "radius_not_diameter",
1565
+ "thresholds_kt": [
1566
+ 34,
1567
+ 50,
1568
+ 64
1569
+ ],
1570
+ "quadrant_order": [
1571
+ "NE",
1572
+ "SE",
1573
+ "SW",
1574
+ "NW"
1575
+ ],
1576
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1577
+ "target_wind_averaging_seconds": 60,
1578
+ "validated_wind_averaging_seconds": null,
1579
+ "validated_surface_height_m": null,
1580
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1581
+ "official_scoring_allowed": false
1582
+ },
1583
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1584
+ "estimates": {
1585
+ "wind_estimate_kt": {
1586
+ "mean": 92.00046860433484,
1587
+ "p10": 91.34736843916494,
1588
+ "p90": 92.8078753819634,
1589
+ "valid_members": 50,
1590
+ "total_members": 50
1591
+ },
1592
+ "rmw_persistence_km": {
1593
+ "mean": 22.223999999999997,
1594
+ "p10": 22.224,
1595
+ "p90": 22.224,
1596
+ "valid_members": 50,
1597
+ "total_members": 50
1598
+ },
1599
+ "r34_NE_estimate_km": {
1600
+ "mean": 190.3619663016812,
1601
+ "p10": 188.27912626939573,
1602
+ "p90": 192.9411961732603,
1603
+ "valid_members": 50,
1604
+ "total_members": 50
1605
+ },
1606
+ "r34_SE_estimate_km": {
1607
+ "mean": 202.77748003786678,
1608
+ "p10": 200.53619429365787,
1609
+ "p90": 205.55305080744486,
1610
+ "valid_members": 50,
1611
+ "total_members": 50
1612
+ },
1613
+ "r34_SW_estimate_km": {
1614
+ "mean": 202.77748003786678,
1615
+ "p10": 200.53619429365787,
1616
+ "p90": 205.55305080744486,
1617
+ "valid_members": 50,
1618
+ "total_members": 50
1619
+ },
1620
+ "r34_NW_estimate_km": {
1621
+ "mean": 172.26468067265952,
1622
+ "p10": 170.6453855688765,
1623
+ "p90": 174.2685555018564,
1624
+ "valid_members": 50,
1625
+ "total_members": 50
1626
+ },
1627
+ "r50_NE_estimate_km": {
1628
+ "mean": 79.18995745218373,
1629
+ "p10": 77.61407162982557,
1630
+ "p90": 81.14900301071121,
1631
+ "valid_members": 50,
1632
+ "total_members": 50
1633
+ },
1634
+ "r50_SE_estimate_km": {
1635
+ "mean": 79.65445347877662,
1636
+ "p10": 77.93107568717139,
1637
+ "p90": 81.79846648587137,
1638
+ "valid_members": 50,
1639
+ "total_members": 50
1640
+ },
1641
+ "r50_SW_estimate_km": {
1642
+ "mean": 79.65445347877662,
1643
+ "p10": 77.93107568717139,
1644
+ "p90": 81.79846648587137,
1645
+ "valid_members": 50,
1646
+ "total_members": 50
1647
+ },
1648
+ "r50_NW_estimate_km": {
1649
+ "mean": 69.75394802940531,
1650
+ "p10": 68.22806773348098,
1651
+ "p90": 71.6524565334199,
1652
+ "valid_members": 50,
1653
+ "total_members": 50
1654
+ },
1655
+ "r64_NE_estimate_km": {
1656
+ "mean": 46.841696764496646,
1657
+ "p10": 46.15920931188975,
1658
+ "p90": 47.68816561251565,
1659
+ "valid_members": 50,
1660
+ "total_members": 50
1661
+ },
1662
+ "r64_SE_estimate_km": {
1663
+ "mean": 46.841696764496646,
1664
+ "p10": 46.15920931188975,
1665
+ "p90": 47.68816561251565,
1666
+ "valid_members": 50,
1667
+ "total_members": 50
1668
+ },
1669
+ "r64_SW_estimate_km": {
1670
+ "mean": 46.841696764496646,
1671
+ "p10": 46.15920931188975,
1672
+ "p90": 47.68816561251565,
1673
+ "valid_members": 50,
1674
+ "total_members": 50
1675
+ },
1676
+ "r64_NW_estimate_km": {
1677
+ "mean": 43.1236669896308,
1678
+ "p10": 42.56492220322672,
1679
+ "p90": 43.81617754711553,
1680
+ "valid_members": 50,
1681
+ "total_members": 50
1682
+ }
1683
+ },
1684
+ "official_scoring_allowed": false
1685
+ }
1686
+ },
1687
+ {
1688
+ "lead_hours": 78,
1689
+ "valid_time_utc": "2015-08-08T06:00:00Z",
1690
+ "summary": {
1691
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1692
+ "members": 50,
1693
+ "definitions": {
1694
+ "units": "km",
1695
+ "quantity_kind": "radius_not_diameter",
1696
+ "thresholds_kt": [
1697
+ 34,
1698
+ 50,
1699
+ 64
1700
+ ],
1701
+ "quadrant_order": [
1702
+ "NE",
1703
+ "SE",
1704
+ "SW",
1705
+ "NW"
1706
+ ],
1707
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1708
+ "target_wind_averaging_seconds": 60,
1709
+ "validated_wind_averaging_seconds": null,
1710
+ "validated_surface_height_m": null,
1711
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1712
+ "official_scoring_allowed": false
1713
+ },
1714
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1715
+ "estimates": {
1716
+ "wind_estimate_kt": {
1717
+ "mean": 85.38403077166339,
1718
+ "p10": 84.81703916804015,
1719
+ "p90": 86.07590866076339,
1720
+ "valid_members": 50,
1721
+ "total_members": 50
1722
+ },
1723
+ "rmw_persistence_km": {
1724
+ "mean": 22.223999999999997,
1725
+ "p10": 22.224,
1726
+ "p90": 22.224,
1727
+ "valid_members": 50,
1728
+ "total_members": 50
1729
+ },
1730
+ "r34_NE_estimate_km": {
1731
+ "mean": 169.66699866583397,
1732
+ "p10": 167.93009585280555,
1733
+ "p90": 171.78897618295977,
1734
+ "valid_members": 50,
1735
+ "total_members": 50
1736
+ },
1737
+ "r34_SE_estimate_km": {
1738
+ "mean": 180.52070819234265,
1739
+ "p10": 178.6538573579441,
1740
+ "p90": 182.80152154505717,
1741
+ "valid_members": 50,
1742
+ "total_members": 50
1743
+ },
1744
+ "r34_SW_estimate_km": {
1745
+ "mean": 180.52070819234265,
1746
+ "p10": 178.6538573579441,
1747
+ "p90": 182.80152154505717,
1748
+ "valid_members": 50,
1749
+ "total_members": 50
1750
+ },
1751
+ "r34_NW_estimate_km": {
1752
+ "mean": 156.04985442867738,
1753
+ "p10": 154.67752447769962,
1754
+ "p90": 157.72563905321667,
1755
+ "valid_members": 50,
1756
+ "total_members": 50
1757
+ },
1758
+ "r50_NE_estimate_km": {
1759
+ "mean": 66.72579670426644,
1760
+ "p10": 65.81599787345249,
1761
+ "p90": 67.83853962483845,
1762
+ "valid_members": 50,
1763
+ "total_members": 50
1764
+ },
1765
+ "r50_SE_estimate_km": {
1766
+ "mean": 66.72579670426644,
1767
+ "p10": 65.81599787345249,
1768
+ "p90": 67.83853962483845,
1769
+ "valid_members": 50,
1770
+ "total_members": 50
1771
+ },
1772
+ "r50_SW_estimate_km": {
1773
+ "mean": 66.72579670426644,
1774
+ "p10": 65.81599787345249,
1775
+ "p90": 67.83853962483845,
1776
+ "valid_members": 50,
1777
+ "total_members": 50
1778
+ },
1779
+ "r50_NW_estimate_km": {
1780
+ "mean": 59.065578051146424,
1781
+ "p10": 58.34946258143764,
1782
+ "p90": 59.94099954644901,
1783
+ "valid_members": 50,
1784
+ "total_members": 50
1785
+ },
1786
+ "r64_NE_estimate_km": {
1787
+ "mean": 40.18303805285049,
1788
+ "p10": 39.63514678972978,
1789
+ "p90": 40.85314456830446,
1790
+ "valid_members": 50,
1791
+ "total_members": 50
1792
+ },
1793
+ "r64_SE_estimate_km": {
1794
+ "mean": 40.18303805285049,
1795
+ "p10": 39.63514678972978,
1796
+ "p90": 40.85314456830446,
1797
+ "valid_members": 50,
1798
+ "total_members": 50
1799
+ },
1800
+ "r64_SW_estimate_km": {
1801
+ "mean": 40.18303805285049,
1802
+ "p10": 39.63514678972978,
1803
+ "p90": 40.85314456830446,
1804
+ "valid_members": 50,
1805
+ "total_members": 50
1806
+ },
1807
+ "r64_NW_estimate_km": {
1808
+ "mean": 37.628011873365395,
1809
+ "p10": 37.171807053468946,
1810
+ "p90": 38.18570336655489,
1811
+ "valid_members": 50,
1812
+ "total_members": 50
1813
+ }
1814
+ },
1815
+ "official_scoring_allowed": false
1816
+ }
1817
+ },
1818
+ {
1819
+ "lead_hours": 84,
1820
+ "valid_time_utc": "2015-08-08T12:00:00Z",
1821
+ "summary": {
1822
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1823
+ "members": 50,
1824
+ "definitions": {
1825
+ "units": "km",
1826
+ "quantity_kind": "radius_not_diameter",
1827
+ "thresholds_kt": [
1828
+ 34,
1829
+ 50,
1830
+ 64
1831
+ ],
1832
+ "quadrant_order": [
1833
+ "NE",
1834
+ "SE",
1835
+ "SW",
1836
+ "NW"
1837
+ ],
1838
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1839
+ "target_wind_averaging_seconds": 60,
1840
+ "validated_wind_averaging_seconds": null,
1841
+ "validated_surface_height_m": null,
1842
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1843
+ "official_scoring_allowed": false
1844
+ },
1845
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1846
+ "estimates": {
1847
+ "wind_estimate_kt": {
1848
+ "mean": 79.96418570599208,
1849
+ "p10": 79.27065772170639,
1850
+ "p90": 80.64122469373739,
1851
+ "valid_members": 50,
1852
+ "total_members": 50
1853
+ },
1854
+ "rmw_persistence_km": {
1855
+ "mean": 22.223999999999997,
1856
+ "p10": 22.224,
1857
+ "p90": 22.224,
1858
+ "valid_members": 50,
1859
+ "total_members": 50
1860
+ },
1861
+ "r34_NE_estimate_km": {
1862
+ "mean": 153.3482491787544,
1863
+ "p10": 151.29961059055242,
1864
+ "p90": 155.35232806549664,
1865
+ "valid_members": 50,
1866
+ "total_members": 50
1867
+ },
1868
+ "r34_SE_estimate_km": {
1869
+ "mean": 162.98981388471736,
1870
+ "p10": 160.7902276482048,
1871
+ "p90": 165.14168651282623,
1872
+ "valid_members": 50,
1873
+ "total_members": 50
1874
+ },
1875
+ "r34_SW_estimate_km": {
1876
+ "mean": 162.98981388471736,
1877
+ "p10": 160.7902276482048,
1878
+ "p90": 165.14168651282623,
1879
+ "valid_members": 50,
1880
+ "total_members": 50
1881
+ },
1882
+ "r34_NW_estimate_km": {
1883
+ "mean": 143.06691332657044,
1884
+ "p10": 141.42448198186915,
1885
+ "p90": 144.67228543542555,
1886
+ "valid_members": 50,
1887
+ "total_members": 50
1888
+ },
1889
+ "r50_NE_estimate_km": {
1890
+ "mean": 58.31546399993611,
1891
+ "p10": 57.27864330600338,
1892
+ "p90": 59.33171987617627,
1893
+ "valid_members": 50,
1894
+ "total_members": 50
1895
+ },
1896
+ "r50_SE_estimate_km": {
1897
+ "mean": 58.31546399993611,
1898
+ "p10": 57.27864330600338,
1899
+ "p90": 59.33171987617627,
1900
+ "valid_members": 50,
1901
+ "total_members": 50
1902
+ },
1903
+ "r50_SW_estimate_km": {
1904
+ "mean": 58.31546399993611,
1905
+ "p10": 57.27864330600338,
1906
+ "p90": 59.33171987617627,
1907
+ "valid_members": 50,
1908
+ "total_members": 50
1909
+ },
1910
+ "r50_NW_estimate_km": {
1911
+ "mean": 52.39784967234895,
1912
+ "p10": 51.56917975364689,
1913
+ "p90": 53.20937684405014,
1914
+ "valid_members": 50,
1915
+ "total_members": 50
1916
+ },
1917
+ "r64_NE_estimate_km": {
1918
+ "mean": 35.118239492361674,
1919
+ "p10": 34.49385421026554,
1920
+ "p90": 35.730240406002025,
1921
+ "valid_members": 50,
1922
+ "total_members": 50
1923
+ },
1924
+ "r64_SE_estimate_km": {
1925
+ "mean": 35.118239492361674,
1926
+ "p10": 34.49385421026554,
1927
+ "p90": 35.730240406002025,
1928
+ "valid_members": 50,
1929
+ "total_members": 50
1930
+ },
1931
+ "r64_SW_estimate_km": {
1932
+ "mean": 35.118239492361674,
1933
+ "p10": 34.49385421026554,
1934
+ "p90": 35.730240406002025,
1935
+ "valid_members": 50,
1936
+ "total_members": 50
1937
+ },
1938
+ "r64_NW_estimate_km": {
1939
+ "mean": 33.38030329446159,
1940
+ "p10": 32.85239511902613,
1941
+ "p90": 33.89729060009483,
1942
+ "valid_members": 50,
1943
+ "total_members": 50
1944
+ }
1945
+ },
1946
+ "official_scoring_allowed": false
1947
+ }
1948
+ },
1949
+ {
1950
+ "lead_hours": 90,
1951
+ "valid_time_utc": "2015-08-08T18:00:00Z",
1952
+ "summary": {
1953
+ "method": "pressure-scaled-issue-structure-experimental-v1",
1954
+ "members": 50,
1955
+ "definitions": {
1956
+ "units": "km",
1957
+ "quantity_kind": "radius_not_diameter",
1958
+ "thresholds_kt": [
1959
+ 34,
1960
+ 50,
1961
+ 64
1962
+ ],
1963
+ "quadrant_order": [
1964
+ "NE",
1965
+ "SE",
1966
+ "SW",
1967
+ "NW"
1968
+ ],
1969
+ "quadrant_statistic": "maximum_extent_within_quadrant",
1970
+ "target_wind_averaging_seconds": 60,
1971
+ "validated_wind_averaging_seconds": null,
1972
+ "validated_surface_height_m": null,
1973
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
1974
+ "official_scoring_allowed": false
1975
+ },
1976
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
1977
+ "estimates": {
1978
+ "wind_estimate_kt": {
1979
+ "mean": 72.6174667238731,
1980
+ "p10": 71.49620550344962,
1981
+ "p90": 73.62616574176438,
1982
+ "valid_members": 50,
1983
+ "total_members": 50
1984
+ },
1985
+ "rmw_persistence_km": {
1986
+ "mean": 22.223999999999997,
1987
+ "p10": 22.224,
1988
+ "p90": 22.224,
1989
+ "valid_members": 50,
1990
+ "total_members": 50
1991
+ },
1992
+ "r34_NE_estimate_km": {
1993
+ "mean": 120.37668992434651,
1994
+ "p10": 115.19635198621933,
1995
+ "p90": 125.09416770771728,
1996
+ "valid_members": 50,
1997
+ "total_members": 50
1998
+ },
1999
+ "r34_SE_estimate_km": {
2000
+ "mean": 125.60359721508206,
2001
+ "p10": 119.7315642352516,
2002
+ "p90": 130.9598246172494,
2003
+ "valid_members": 50,
2004
+ "total_members": 50
2005
+ },
2006
+ "r34_SW_estimate_km": {
2007
+ "mean": 125.60359721508206,
2008
+ "p10": 119.7315642352516,
2009
+ "p90": 130.9598246172494,
2010
+ "valid_members": 50,
2011
+ "total_members": 50
2012
+ },
2013
+ "r34_NW_estimate_km": {
2014
+ "mean": 110.54991926967524,
2015
+ "p10": 105.32501445138654,
2016
+ "p90": 115.31695162713567,
2017
+ "valid_members": 50,
2018
+ "total_members": 50
2019
+ },
2020
+ "r50_NE_estimate_km": {
2021
+ "mean": 47.844708142069166,
2022
+ "p10": 46.33354756990774,
2023
+ "p90": 49.21387372426795,
2024
+ "valid_members": 50,
2025
+ "total_members": 50
2026
+ },
2027
+ "r50_SE_estimate_km": {
2028
+ "mean": 47.844708142069166,
2029
+ "p10": 46.33354756990774,
2030
+ "p90": 49.21387372426795,
2031
+ "valid_members": 50,
2032
+ "total_members": 50
2033
+ },
2034
+ "r50_SW_estimate_km": {
2035
+ "mean": 47.844708142069166,
2036
+ "p10": 46.33354756990774,
2037
+ "p90": 49.21387372426795,
2038
+ "valid_members": 50,
2039
+ "total_members": 50
2040
+ },
2041
+ "r50_NW_estimate_km": {
2042
+ "mean": 43.94297310986419,
2043
+ "p10": 42.70782519673443,
2044
+ "p90": 45.06034244466918,
2045
+ "valid_members": 50,
2046
+ "total_members": 50
2047
+ },
2048
+ "r64_NE_estimate_km": {
2049
+ "mean": 28.812630539597045,
2050
+ "p10": 27.902592356849553,
2051
+ "p90": 29.637157715105904,
2052
+ "valid_members": 50,
2053
+ "total_members": 50
2054
+ },
2055
+ "r64_SE_estimate_km": {
2056
+ "mean": 28.812630539597045,
2057
+ "p10": 27.902592356849553,
2058
+ "p90": 29.637157715105904,
2059
+ "valid_members": 50,
2060
+ "total_members": 50
2061
+ },
2062
+ "r64_SW_estimate_km": {
2063
+ "mean": 28.812630539597045,
2064
+ "p10": 27.902592356849553,
2065
+ "p90": 29.637157715105904,
2066
+ "valid_members": 50,
2067
+ "total_members": 50
2068
+ },
2069
+ "r64_NW_estimate_km": {
2070
+ "mean": 27.99408333051696,
2071
+ "p10": 27.207226384829163,
2072
+ "p90": 28.705908863834676,
2073
+ "valid_members": 50,
2074
+ "total_members": 50
2075
+ }
2076
+ },
2077
+ "official_scoring_allowed": false
2078
+ }
2079
+ },
2080
+ {
2081
+ "lead_hours": 96,
2082
+ "valid_time_utc": "2015-08-09T00:00:00Z",
2083
+ "summary": {
2084
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2085
+ "members": 50,
2086
+ "definitions": {
2087
+ "units": "km",
2088
+ "quantity_kind": "radius_not_diameter",
2089
+ "thresholds_kt": [
2090
+ 34,
2091
+ 50,
2092
+ 64
2093
+ ],
2094
+ "quadrant_order": [
2095
+ "NE",
2096
+ "SE",
2097
+ "SW",
2098
+ "NW"
2099
+ ],
2100
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2101
+ "target_wind_averaging_seconds": 60,
2102
+ "validated_wind_averaging_seconds": null,
2103
+ "validated_surface_height_m": null,
2104
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2105
+ "official_scoring_allowed": false
2106
+ },
2107
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2108
+ "estimates": {
2109
+ "wind_estimate_kt": {
2110
+ "mean": 64.70444483413542,
2111
+ "p10": 63.29356202543002,
2112
+ "p90": 66.33251881782722,
2113
+ "valid_members": 50,
2114
+ "total_members": 50
2115
+ },
2116
+ "rmw_persistence_km": {
2117
+ "mean": 22.223999999999997,
2118
+ "p10": 22.224,
2119
+ "p90": 22.224,
2120
+ "valid_members": 50,
2121
+ "total_members": 50
2122
+ },
2123
+ "r34_NE_estimate_km": {
2124
+ "mean": 87.10027526425868,
2125
+ "p10": 81.8158330510499,
2126
+ "p90": 93.33082349168137,
2127
+ "valid_members": 50,
2128
+ "total_members": 50
2129
+ },
2130
+ "r34_SE_estimate_km": {
2131
+ "mean": 88.35149639922233,
2132
+ "p10": 82.52968511146705,
2133
+ "p90": 95.23569961503206,
2134
+ "valid_members": 50,
2135
+ "total_members": 50
2136
+ },
2137
+ "r34_SW_estimate_km": {
2138
+ "mean": 88.35149639922233,
2139
+ "p10": 82.52968511146705,
2140
+ "p90": 95.23569961503206,
2141
+ "valid_members": 50,
2142
+ "total_members": 50
2143
+ },
2144
+ "r34_NW_estimate_km": {
2145
+ "mean": 77.46001124922105,
2146
+ "p10": 72.300120235403,
2147
+ "p90": 83.56396390016515,
2148
+ "valid_members": 50,
2149
+ "total_members": 50
2150
+ },
2151
+ "r50_NE_estimate_km": {
2152
+ "mean": 37.754370159592234,
2153
+ "p10": 36.07199626712114,
2154
+ "p90": 39.720248011526294,
2155
+ "valid_members": 50,
2156
+ "total_members": 50
2157
+ },
2158
+ "r50_SE_estimate_km": {
2159
+ "mean": 37.754370159592234,
2160
+ "p10": 36.07199626712114,
2161
+ "p90": 39.720248011526294,
2162
+ "valid_members": 50,
2163
+ "total_members": 50
2164
+ },
2165
+ "r50_SW_estimate_km": {
2166
+ "mean": 37.754370159592234,
2167
+ "p10": 36.07199626712114,
2168
+ "p90": 39.720248011526294,
2169
+ "valid_members": 50,
2170
+ "total_members": 50
2171
+ },
2172
+ "r50_NW_estimate_km": {
2173
+ "mean": 35.597347345809645,
2174
+ "p10": 34.18540276497348,
2175
+ "p90": 37.24275686744874,
2176
+ "valid_members": 50,
2177
+ "total_members": 50
2178
+ },
2179
+ "r64_NE_estimate_km": {
2180
+ "mean": 15.294058015398704,
2181
+ "p10": 0.0,
2182
+ "p90": 23.919987713144337,
2183
+ "valid_members": 50,
2184
+ "total_members": 50
2185
+ },
2186
+ "r64_SE_estimate_km": {
2187
+ "mean": 15.294058015398704,
2188
+ "p10": 0.0,
2189
+ "p90": 23.919987713144337,
2190
+ "valid_members": 50,
2191
+ "total_members": 50
2192
+ },
2193
+ "r64_SW_estimate_km": {
2194
+ "mean": 15.294058015398704,
2195
+ "p10": 0.0,
2196
+ "p90": 23.919987713144337,
2197
+ "valid_members": 50,
2198
+ "total_members": 50
2199
+ },
2200
+ "r64_NW_estimate_km": {
2201
+ "mean": 15.222880636042595,
2202
+ "p10": 0.0,
2203
+ "p90": 23.725678201129913,
2204
+ "valid_members": 50,
2205
+ "total_members": 50
2206
+ }
2207
+ },
2208
+ "official_scoring_allowed": false
2209
+ }
2210
+ },
2211
+ {
2212
+ "lead_hours": 102,
2213
+ "valid_time_utc": "2015-08-09T06:00:00Z",
2214
+ "summary": {
2215
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2216
+ "members": 50,
2217
+ "definitions": {
2218
+ "units": "km",
2219
+ "quantity_kind": "radius_not_diameter",
2220
+ "thresholds_kt": [
2221
+ 34,
2222
+ 50,
2223
+ 64
2224
+ ],
2225
+ "quadrant_order": [
2226
+ "NE",
2227
+ "SE",
2228
+ "SW",
2229
+ "NW"
2230
+ ],
2231
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2232
+ "target_wind_averaging_seconds": 60,
2233
+ "validated_wind_averaging_seconds": null,
2234
+ "validated_surface_height_m": null,
2235
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2236
+ "official_scoring_allowed": false
2237
+ },
2238
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2239
+ "estimates": {
2240
+ "wind_estimate_kt": {
2241
+ "mean": 54.08197358509115,
2242
+ "p10": 52.36953883912631,
2243
+ "p90": 56.197356469802514,
2244
+ "valid_members": 50,
2245
+ "total_members": 50
2246
+ },
2247
+ "rmw_persistence_km": {
2248
+ "mean": 22.223999999999997,
2249
+ "p10": 22.224,
2250
+ "p90": 22.224,
2251
+ "valid_members": 50,
2252
+ "total_members": 50
2253
+ },
2254
+ "r34_NE_estimate_km": {
2255
+ "mean": 57.71481502858911,
2256
+ "p10": 53.979058345131754,
2257
+ "p90": 62.39734183314677,
2258
+ "valid_members": 50,
2259
+ "total_members": 50
2260
+ },
2261
+ "r34_SE_estimate_km": {
2262
+ "mean": 57.71481502858911,
2263
+ "p10": 53.979058345131754,
2264
+ "p90": 62.39734183314677,
2265
+ "valid_members": 50,
2266
+ "total_members": 50
2267
+ },
2268
+ "r34_SW_estimate_km": {
2269
+ "mean": 57.71481502858911,
2270
+ "p10": 53.979058345131754,
2271
+ "p90": 62.39734183314677,
2272
+ "valid_members": 50,
2273
+ "total_members": 50
2274
+ },
2275
+ "r34_NW_estimate_km": {
2276
+ "mean": 51.91002379416582,
2277
+ "p10": 48.91934578499617,
2278
+ "p90": 55.646863686861266,
2279
+ "valid_members": 50,
2280
+ "total_members": 50
2281
+ },
2282
+ "r50_NE_estimate_km": {
2283
+ "mean": 26.133371020094,
2284
+ "p10": 24.44181374140869,
2285
+ "p90": 28.25362749556611,
2286
+ "valid_members": 50,
2287
+ "total_members": 50
2288
+ },
2289
+ "r50_SE_estimate_km": {
2290
+ "mean": 26.133371020094,
2291
+ "p10": 24.44181374140869,
2292
+ "p90": 28.25362749556611,
2293
+ "valid_members": 50,
2294
+ "total_members": 50
2295
+ },
2296
+ "r50_SW_estimate_km": {
2297
+ "mean": 26.133371020094,
2298
+ "p10": 24.44181374140869,
2299
+ "p90": 28.25362749556611,
2300
+ "valid_members": 50,
2301
+ "total_members": 50
2302
+ },
2303
+ "r50_NW_estimate_km": {
2304
+ "mean": 25.66387503924344,
2305
+ "p10": 24.185309222855413,
2306
+ "p90": 27.51133695581021,
2307
+ "valid_members": 50,
2308
+ "total_members": 50
2309
+ },
2310
+ "r64_NE_estimate_km": {
2311
+ "mean": 0.0,
2312
+ "p10": 0.0,
2313
+ "p90": 0.0,
2314
+ "valid_members": 50,
2315
+ "total_members": 50
2316
+ },
2317
+ "r64_SE_estimate_km": {
2318
+ "mean": 0.0,
2319
+ "p10": 0.0,
2320
+ "p90": 0.0,
2321
+ "valid_members": 50,
2322
+ "total_members": 50
2323
+ },
2324
+ "r64_SW_estimate_km": {
2325
+ "mean": 0.0,
2326
+ "p10": 0.0,
2327
+ "p90": 0.0,
2328
+ "valid_members": 50,
2329
+ "total_members": 50
2330
+ },
2331
+ "r64_NW_estimate_km": {
2332
+ "mean": 0.0,
2333
+ "p10": 0.0,
2334
+ "p90": 0.0,
2335
+ "valid_members": 50,
2336
+ "total_members": 50
2337
+ }
2338
+ },
2339
+ "official_scoring_allowed": false
2340
+ }
2341
+ },
2342
+ {
2343
+ "lead_hours": 108,
2344
+ "valid_time_utc": "2015-08-09T12:00:00Z",
2345
+ "summary": {
2346
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2347
+ "members": 50,
2348
+ "definitions": {
2349
+ "units": "km",
2350
+ "quantity_kind": "radius_not_diameter",
2351
+ "thresholds_kt": [
2352
+ 34,
2353
+ 50,
2354
+ 64
2355
+ ],
2356
+ "quadrant_order": [
2357
+ "NE",
2358
+ "SE",
2359
+ "SW",
2360
+ "NW"
2361
+ ],
2362
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2363
+ "target_wind_averaging_seconds": 60,
2364
+ "validated_wind_averaging_seconds": null,
2365
+ "validated_surface_height_m": null,
2366
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2367
+ "official_scoring_allowed": false
2368
+ },
2369
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2370
+ "estimates": {
2371
+ "wind_estimate_kt": {
2372
+ "mean": 43.63975707824105,
2373
+ "p10": 42.117731376028225,
2374
+ "p90": 45.38416307928769,
2375
+ "valid_members": 50,
2376
+ "total_members": 50
2377
+ },
2378
+ "rmw_persistence_km": {
2379
+ "mean": 22.223999999999997,
2380
+ "p10": 22.224,
2381
+ "p90": 22.224,
2382
+ "valid_members": 50,
2383
+ "total_members": 50
2384
+ },
2385
+ "r34_NE_estimate_km": {
2386
+ "mean": 37.15052237512766,
2387
+ "p10": 34.502608553229,
2388
+ "p90": 40.22488814064746,
2389
+ "valid_members": 50,
2390
+ "total_members": 50
2391
+ },
2392
+ "r34_SE_estimate_km": {
2393
+ "mean": 37.15052237512766,
2394
+ "p10": 34.502608553229,
2395
+ "p90": 40.22488814064746,
2396
+ "valid_members": 50,
2397
+ "total_members": 50
2398
+ },
2399
+ "r34_SW_estimate_km": {
2400
+ "mean": 37.15052237512766,
2401
+ "p10": 34.502608553229,
2402
+ "p90": 40.22488814064746,
2403
+ "valid_members": 50,
2404
+ "total_members": 50
2405
+ },
2406
+ "r34_NW_estimate_km": {
2407
+ "mean": 35.08582789452084,
2408
+ "p10": 32.85980566905332,
2409
+ "p90": 37.66314979209932,
2410
+ "valid_members": 50,
2411
+ "total_members": 50
2412
+ },
2413
+ "r50_NE_estimate_km": {
2414
+ "mean": 0.0,
2415
+ "p10": 0.0,
2416
+ "p90": 0.0,
2417
+ "valid_members": 50,
2418
+ "total_members": 50
2419
+ },
2420
+ "r50_SE_estimate_km": {
2421
+ "mean": 0.0,
2422
+ "p10": 0.0,
2423
+ "p90": 0.0,
2424
+ "valid_members": 50,
2425
+ "total_members": 50
2426
+ },
2427
+ "r50_SW_estimate_km": {
2428
+ "mean": 0.0,
2429
+ "p10": 0.0,
2430
+ "p90": 0.0,
2431
+ "valid_members": 50,
2432
+ "total_members": 50
2433
+ },
2434
+ "r50_NW_estimate_km": {
2435
+ "mean": 0.0,
2436
+ "p10": 0.0,
2437
+ "p90": 0.0,
2438
+ "valid_members": 50,
2439
+ "total_members": 50
2440
+ },
2441
+ "r64_NE_estimate_km": {
2442
+ "mean": 0.0,
2443
+ "p10": 0.0,
2444
+ "p90": 0.0,
2445
+ "valid_members": 50,
2446
+ "total_members": 50
2447
+ },
2448
+ "r64_SE_estimate_km": {
2449
+ "mean": 0.0,
2450
+ "p10": 0.0,
2451
+ "p90": 0.0,
2452
+ "valid_members": 50,
2453
+ "total_members": 50
2454
+ },
2455
+ "r64_SW_estimate_km": {
2456
+ "mean": 0.0,
2457
+ "p10": 0.0,
2458
+ "p90": 0.0,
2459
+ "valid_members": 50,
2460
+ "total_members": 50
2461
+ },
2462
+ "r64_NW_estimate_km": {
2463
+ "mean": 0.0,
2464
+ "p10": 0.0,
2465
+ "p90": 0.0,
2466
+ "valid_members": 50,
2467
+ "total_members": 50
2468
+ }
2469
+ },
2470
+ "official_scoring_allowed": false
2471
+ }
2472
+ },
2473
+ {
2474
+ "lead_hours": 114,
2475
+ "valid_time_utc": "2015-08-09T18:00:00Z",
2476
+ "summary": {
2477
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2478
+ "members": 50,
2479
+ "definitions": {
2480
+ "units": "km",
2481
+ "quantity_kind": "radius_not_diameter",
2482
+ "thresholds_kt": [
2483
+ 34,
2484
+ 50,
2485
+ 64
2486
+ ],
2487
+ "quadrant_order": [
2488
+ "NE",
2489
+ "SE",
2490
+ "SW",
2491
+ "NW"
2492
+ ],
2493
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2494
+ "target_wind_averaging_seconds": 60,
2495
+ "validated_wind_averaging_seconds": null,
2496
+ "validated_surface_height_m": null,
2497
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2498
+ "official_scoring_allowed": false
2499
+ },
2500
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2501
+ "estimates": {
2502
+ "wind_estimate_kt": {
2503
+ "mean": 37.78369428158114,
2504
+ "p10": 36.67053460219384,
2505
+ "p90": 38.75127228951492,
2506
+ "valid_members": 50,
2507
+ "total_members": 50
2508
+ },
2509
+ "rmw_persistence_km": {
2510
+ "mean": 22.223999999999997,
2511
+ "p10": 22.224,
2512
+ "p90": 22.224,
2513
+ "valid_members": 50,
2514
+ "total_members": 50
2515
+ },
2516
+ "r34_NE_estimate_km": {
2517
+ "mean": 27.620131820259488,
2518
+ "p10": 25.95885172589214,
2519
+ "p90": 29.07545206201911,
2520
+ "valid_members": 50,
2521
+ "total_members": 50
2522
+ },
2523
+ "r34_SE_estimate_km": {
2524
+ "mean": 27.620131820259488,
2525
+ "p10": 25.95885172589214,
2526
+ "p90": 29.07545206201911,
2527
+ "valid_members": 50,
2528
+ "total_members": 50
2529
+ },
2530
+ "r34_SW_estimate_km": {
2531
+ "mean": 27.620131820259488,
2532
+ "p10": 25.95885172589214,
2533
+ "p90": 29.07545206201911,
2534
+ "valid_members": 50,
2535
+ "total_members": 50
2536
+ },
2537
+ "r34_NW_estimate_km": {
2538
+ "mean": 26.95910743616535,
2539
+ "p10": 25.51544175845661,
2540
+ "p90": 28.221678378578442,
2541
+ "valid_members": 50,
2542
+ "total_members": 50
2543
+ },
2544
+ "r50_NE_estimate_km": {
2545
+ "mean": 0.0,
2546
+ "p10": 0.0,
2547
+ "p90": 0.0,
2548
+ "valid_members": 50,
2549
+ "total_members": 50
2550
+ },
2551
+ "r50_SE_estimate_km": {
2552
+ "mean": 0.0,
2553
+ "p10": 0.0,
2554
+ "p90": 0.0,
2555
+ "valid_members": 50,
2556
+ "total_members": 50
2557
+ },
2558
+ "r50_SW_estimate_km": {
2559
+ "mean": 0.0,
2560
+ "p10": 0.0,
2561
+ "p90": 0.0,
2562
+ "valid_members": 50,
2563
+ "total_members": 50
2564
+ },
2565
+ "r50_NW_estimate_km": {
2566
+ "mean": 0.0,
2567
+ "p10": 0.0,
2568
+ "p90": 0.0,
2569
+ "valid_members": 50,
2570
+ "total_members": 50
2571
+ },
2572
+ "r64_NE_estimate_km": {
2573
+ "mean": 0.0,
2574
+ "p10": 0.0,
2575
+ "p90": 0.0,
2576
+ "valid_members": 50,
2577
+ "total_members": 50
2578
+ },
2579
+ "r64_SE_estimate_km": {
2580
+ "mean": 0.0,
2581
+ "p10": 0.0,
2582
+ "p90": 0.0,
2583
+ "valid_members": 50,
2584
+ "total_members": 50
2585
+ },
2586
+ "r64_SW_estimate_km": {
2587
+ "mean": 0.0,
2588
+ "p10": 0.0,
2589
+ "p90": 0.0,
2590
+ "valid_members": 50,
2591
+ "total_members": 50
2592
+ },
2593
+ "r64_NW_estimate_km": {
2594
+ "mean": 0.0,
2595
+ "p10": 0.0,
2596
+ "p90": 0.0,
2597
+ "valid_members": 50,
2598
+ "total_members": 50
2599
+ }
2600
+ },
2601
+ "official_scoring_allowed": false
2602
+ }
2603
+ },
2604
+ {
2605
+ "lead_hours": 120,
2606
+ "valid_time_utc": "2015-08-10T00:00:00Z",
2607
+ "summary": {
2608
+ "method": "pressure-scaled-issue-structure-experimental-v1",
2609
+ "members": 50,
2610
+ "definitions": {
2611
+ "units": "km",
2612
+ "quantity_kind": "radius_not_diameter",
2613
+ "thresholds_kt": [
2614
+ 34,
2615
+ 50,
2616
+ 64
2617
+ ],
2618
+ "quadrant_order": [
2619
+ "NE",
2620
+ "SE",
2621
+ "SW",
2622
+ "NW"
2623
+ ],
2624
+ "quadrant_statistic": "maximum_extent_within_quadrant",
2625
+ "target_wind_averaging_seconds": 60,
2626
+ "validated_wind_averaging_seconds": null,
2627
+ "validated_surface_height_m": null,
2628
+ "rmw": "issue-time reported RMW carried forward unchanged; persistence baseline",
2629
+ "official_scoring_allowed": false
2630
+ },
2631
+ "aggregation": "diagnose each physical forecast member then equal-weight mean",
2632
+ "estimates": {
2633
+ "wind_estimate_kt": {
2634
+ "mean": 34.3562894347763,
2635
+ "p10": 33.36315146942052,
2636
+ "p90": 35.34654353724137,
2637
+ "valid_members": 50,
2638
+ "total_members": 50
2639
+ },
2640
+ "rmw_persistence_km": {
2641
+ "mean": 22.223999999999997,
2642
+ "p10": 22.224,
2643
+ "p90": 22.224,
2644
+ "valid_members": 50,
2645
+ "total_members": 50
2646
+ },
2647
+ "r34_NE_estimate_km": {
2648
+ "mean": 15.846698861031065,
2649
+ "p10": 0.0,
2650
+ "p90": 24.07000717123992,
2651
+ "valid_members": 50,
2652
+ "total_members": 50
2653
+ },
2654
+ "r34_SE_estimate_km": {
2655
+ "mean": 15.846698861031065,
2656
+ "p10": 0.0,
2657
+ "p90": 24.07000717123992,
2658
+ "valid_members": 50,
2659
+ "total_members": 50
2660
+ },
2661
+ "r34_SW_estimate_km": {
2662
+ "mean": 15.846698861031065,
2663
+ "p10": 0.0,
2664
+ "p90": 24.07000717123992,
2665
+ "valid_members": 50,
2666
+ "total_members": 50
2667
+ },
2668
+ "r34_NW_estimate_km": {
2669
+ "mean": 15.762638718330637,
2670
+ "p10": 0.0,
2671
+ "p90": 23.85792603461197,
2672
+ "valid_members": 50,
2673
+ "total_members": 50
2674
+ },
2675
+ "r50_NE_estimate_km": {
2676
+ "mean": 0.0,
2677
+ "p10": 0.0,
2678
+ "p90": 0.0,
2679
+ "valid_members": 50,
2680
+ "total_members": 50
2681
+ },
2682
+ "r50_SE_estimate_km": {
2683
+ "mean": 0.0,
2684
+ "p10": 0.0,
2685
+ "p90": 0.0,
2686
+ "valid_members": 50,
2687
+ "total_members": 50
2688
+ },
2689
+ "r50_SW_estimate_km": {
2690
+ "mean": 0.0,
2691
+ "p10": 0.0,
2692
+ "p90": 0.0,
2693
+ "valid_members": 50,
2694
+ "total_members": 50
2695
+ },
2696
+ "r50_NW_estimate_km": {
2697
+ "mean": 0.0,
2698
+ "p10": 0.0,
2699
+ "p90": 0.0,
2700
+ "valid_members": 50,
2701
+ "total_members": 50
2702
+ },
2703
+ "r64_NE_estimate_km": {
2704
+ "mean": 0.0,
2705
+ "p10": 0.0,
2706
+ "p90": 0.0,
2707
+ "valid_members": 50,
2708
+ "total_members": 50
2709
+ },
2710
+ "r64_SE_estimate_km": {
2711
+ "mean": 0.0,
2712
+ "p10": 0.0,
2713
+ "p90": 0.0,
2714
+ "valid_members": 50,
2715
+ "total_members": 50
2716
+ },
2717
+ "r64_SW_estimate_km": {
2718
+ "mean": 0.0,
2719
+ "p10": 0.0,
2720
+ "p90": 0.0,
2721
+ "valid_members": 50,
2722
+ "total_members": 50
2723
+ },
2724
+ "r64_NW_estimate_km": {
2725
+ "mean": 0.0,
2726
+ "p10": 0.0,
2727
+ "p90": 0.0,
2728
+ "valid_members": 50,
2729
+ "total_members": 50
2730
+ }
2731
+ },
2732
+ "official_scoring_allowed": false
2733
+ }
2734
+ }
2735
+ ],
2736
+ "official_wind_or_radius_skill_score": null,
2737
+ "physical_50_member_means_verified": true,
2738
+ "observed_plus_zero_alignment_verified": true,
2739
+ "coverage": {
2740
+ "wind_estimate_kt": 20,
2741
+ "rmw_persistence_km": 20,
2742
+ "r34_NE_estimate_km": 20,
2743
+ "r34_SE_estimate_km": 20,
2744
+ "r34_SW_estimate_km": 20,
2745
+ "r34_NW_estimate_km": 20,
2746
+ "r50_NE_estimate_km": 20,
2747
+ "r50_SE_estimate_km": 20,
2748
+ "r50_SW_estimate_km": 20,
2749
+ "r50_NW_estimate_km": 20,
2750
+ "r64_NE_estimate_km": 20,
2751
+ "r64_SE_estimate_km": 20,
2752
+ "r64_SW_estimate_km": 20,
2753
+ "r64_NW_estimate_km": 20
2754
+ },
2755
+ "warning": "Retrospective development examples, not untouched tests. RMW is persistence; no validated wind-period calibration.",
2756
+ "chart": "soudelor_wind_radius.png",
2757
+ "source_receipt_sha256": "b772fb329d021af79b4e1cceb67983e720e58d850a09e886b8a8ddc7b436e38f",
2758
+ "source_reference": "Original immutable /Volumes/D member archive; original files unchanged."
2759
+ }
evaluation/storm_structure/soudelor_wind_radius.png ADDED

Git LFS Details

  • SHA256: debcd3d202eaa29630b6801426cbef5e0335fdd5fc343878b506aa30ce5d7079
  • Pointer size: 131 Bytes
  • Size of remote file: 401 kB
release_tools/STORM_STRUCTURE_DIAGNOSTICS.md ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Any-storm wind and radius plots
2
+
3
+ This is a local diagnostic/plotting extension. It does not change the released
4
+ Trackformer 1.2 weights, existing pressure maps, videos, cloud archive, or Site.
5
+ It is **not** a new validated wind/radius forecast model.
6
+
7
+ ## What works
8
+
9
+ - The renderer accepts any exact SID in the local Western Pacific IBTrACS file.
10
+ The October 1 local snapshot contains 1,910 storms since 1970. This is an
11
+ observational coverage catalogue, **not** a claim that 1,910 forecasts ran.
12
+ - Every storm can produce a chart layout. Pressure, wind, RMW, and quadrant
13
+ plots are drawn where reports exist. An empty panel explains missing data.
14
+ - Forecast plotting uses genuine, hashed physical member archives. All four
15
+ examples now have 20 candidate wind and R34/R50/R64 quadrant outputs through
16
+ +120 h, diagnosed from all 50 members before taking the mean.
17
+ - The historical MPS runner additionally accepts arbitrary `--case SLUG SID
18
+ ISSUE_UTC`. It still requires nine exact six-hour analyses in the existing
19
+ local atlas and the released WP domain. It neither downloads missing weather
20
+ nor changes the independently authorized cloud backfill.
21
+
22
+ ## Candidate assumptions and official definitions
23
+
24
+ IBTrACS `USA_WIND` is a 1-minute reference. USA R34/R50/R64 are maximum extents
25
+ in the NE/SE/SW/NW quadrants, in nautical miles; multiply by 1.852 for **radius**
26
+ in km, never by two. JMA wind is a separate 10-minute reference. JMA R30 cannot
27
+ be relabeled R34, and longest/shortest JMA radii are not USA quadrant radii.
28
+ Blank values remain missing; a native reported zero remains zero. USA RMW is
29
+ not universally reanalyzed best track, especially in WP. Fung-Wong's selected
30
+ 2025 USA reports are provisional TCVitals, not final JTWC observations.
31
+ See the [NOAA IBTrACS column documentation](https://www.ncei.noaa.gov/sites/default/files/2025-09/IBTrACS_v04r01_column_documentation.pdf).
32
+
33
+ The new experimental extension starts with only the **exact issue-time** USA
34
+ wind, RMW and available quadrant isotachs. No future wind/radius is fitted.
35
+ The neural runner itself continues to use its original JMA issue-intensity
36
+ inputs; USA structure is a separate diagnostic input, not a silent neural
37
+ input substitution. Reference and model centers can differ, and both are
38
+ recorded in the initialization receipt.
39
+
40
+ For each forecast member, ambient pressure is the median actual basin cells
41
+ 600–1000 km from that member's predicted center, with at least two available
42
+ cells in each quadrant. This uses coarse pressure for the **ambient value**,
43
+ not to claim a resolved eyewall. Let `D0 = Pambient0 - Pmodel_issue` and
44
+ `Dm = Pambient_member - Pcentral_member`. The candidate uses
45
+
46
+ ```text
47
+ wind_member = USA_wind_issue * sqrt(Dm / D0)
48
+ ```
49
+
50
+ The square-root deficit scaling is motivated by gradient/Holland balance,
51
+ but this extension is **not PaHM/GAHM**. It builds a decreasing outer envelope
52
+ from consistent issue-time quadrant isotachs, interpolates in log-radius and
53
+ log-wind, and extrapolates with a Holland-inspired `V ~ r^(-B/2)` tail. A fixed
54
+ literature-motivated B range 1–2.5 is used, without showcase tuning. Radius
55
+ solutions beyond 1,500 km remain unavailable rather than becoming a grid-edge
56
+ radius. Nonphysical pressure, unresolved backgrounds, out-of-domain tracks and
57
+ inconsistent zero isotachs remain explicit failures.
58
+ The [NOAA PaHM theory](https://noaa-ocs-modeling.github.io/PaHM/html/models.html)
59
+ also explains why gradient wind is not automatically a validated 10-m wind.
60
+
61
+ RMW is currently **issue-time persistence**. The flat dashed RMW curve is not
62
+ a model-measured future RMW, an eye diameter, or proof of radius skill.
63
+ The candidate's nominal threshold/units/quadrant geometry target the native
64
+ USA definition, but its 1-minute surface-wind averaging behavior has not been
65
+ validated. The strict scorer therefore rejects wind/radius skill claims.
66
+ Plots are exploratory reference comparisons, not a fair validated benchmark.
67
+ All four are development examples; no unused generalization holdout is claimed.
68
+
69
+ ## Reusable commands
70
+
71
+ Use the existing Python environment; no installation is needed. All outputs,
72
+ temporary files and Matplotlib caches must stay on `/Volumes/D`.
73
+
74
+ Draw a full observed storm, even without a model-member archive:
75
+
76
+ ```sh
77
+ /Volumes/D/typhoon_predict/.venv/bin/python -B \
78
+ /Volumes/D/typhoon_predict/remote_typhoon_predict_repo/release_tools/plot_storm_wind_radius.py \
79
+ --ibtracs /Volumes/D/typhoon_predict/data/ibtracs/ibtracs.WP.list.v04r01.csv \
80
+ --output /Volumes/D/typhoon_predict/output/nari_observed_plots \
81
+ --observed-storm 2001248N23125
82
+ ```
83
+
84
+ Generate the data-coverage catalogue with `--catalogue-only`. To draw a saved
85
+ model ensemble, pass `--forecast-folder` (repeatable), pointing to one immutable
86
+ folder containing `verification.json`, `*_video.json`, `*_video.npz`,
87
+ `ensemble-members.npz`, `weather-history.npz` and the original input receipt.
88
+
89
+ Create an explicit additional historical ensemble on the Mac GPU only when
90
+ the required nine local analyses and exact issue report exist:
91
+
92
+ ```sh
93
+ /Volumes/D/typhoon_predict/.venv/bin/python -B \
94
+ /Volumes/D/typhoon_predict/remote_typhoon_predict_repo/release_tools/forecast_historical_video50_mac.py \
95
+ --project /Volumes/D/typhoon_predict \
96
+ --output /Volumes/D/typhoon_predict/output/nari_ensemble50 \
97
+ --case nari 2001248N23125 2001-09-08T00:00:00Z --chunk 5
98
+ ```
99
+
100
+ SID/date in a command is an explicit requested issue, not a nearest-date fill.
101
+ If unavailable, choose an actually reported issue after checking the catalogue.
102
+ The runner refuses duplicate issues, unsafe slugs, three-hour dates, changed
103
+ completed slugs and unsupported causal input histories.
104
+
105
+ ## October 1 verification
106
+
107
+ Local results: `/Volumes/D/typhoon_predict/output/all-storm-wind-radius.uSvmWY/plots`.
108
+ Fung-Wong needed a fresh 50-member MPS replay (14.33 seconds inference). Its
109
+ inputs/output differ from the older benchmark video and it is clearly labeled;
110
+ the original video/data were not overwritten. Soudelor, Mangkhut and Meranti
111
+ reuse the exact saved original member archives. All mean routes and common-grid
112
+ pressure fields are rechecked against their saved video arrays. No inference
113
+ or fitting is required for the three archived issues or for observed-only plots.
114
+
115
+ Before promotion: develop a genuine evolving RMW/outer structure model, fit any
116
+ calibration only on declared whole-storm training data, freeze a genuinely unused
117
+ storm cohort, validate surface-wind period/height and quadrant definitions, and
118
+ report errors plus failed/missing coverage for identical leads through +120 h.
release_tools/benchmark_intensity_v12_v11.py ADDED
@@ -0,0 +1,363 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Resumable, frozen daily-cohort intensity comparison; no training or tuning.
2
+
3
+ Reuse verified 1.2 fifty-member pressure forecasts, replay the original 1.1
4
+ intensity experts, then replay the IDENTICAL 1.2 members to recover auxiliary
5
+ wind that the original route benchmark did not save. All outputs stay on D.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ from collections import defaultdict
11
+ from datetime import datetime, timedelta, timezone
12
+ import fcntl
13
+ import hashlib
14
+ import json
15
+ import os
16
+ from pathlib import Path
17
+ import sys
18
+ import time
19
+
20
+ import numpy as np
21
+
22
+ CHECKPOINT = 'f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0'
23
+ LEADS = list(range(6, 121, 6))
24
+ HOUR = 3600 * 10**9
25
+
26
+
27
+ def sha(path):
28
+ with Path(path).open('rb') as stream:
29
+ return hashlib.file_digest(stream, 'sha256').hexdigest()
30
+
31
+
32
+ def write(path, value):
33
+ path = Path(path)
34
+ path.parent.mkdir(parents=True, exist_ok=True)
35
+ temporary = path.with_suffix(path.suffix + '.tmp')
36
+ temporary.write_text(json.dumps(value, indent=2, allow_nan=False) + '\n')
37
+ temporary.replace(path)
38
+
39
+
40
+ def utc():
41
+ return datetime.now(timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')
42
+
43
+
44
+ def initial_available(raw):
45
+ return bool(np.isfinite(raw).all() and 0 <= raw[0] < 250 and 800 < raw[1] < 1100)
46
+
47
+
48
+ def number(row, name, low, high):
49
+ try:
50
+ value = float(row.get(name, ''))
51
+ return value if np.isfinite(value) and low <= value <= high else None
52
+ except (TypeError, ValueError):
53
+ return None
54
+
55
+
56
+ def common_errors(a, b, truth, *, low, high):
57
+ a, b, truth = (np.asarray(v, dtype=float) for v in (a, b, truth))
58
+ valid = np.isfinite(a) & np.isfinite(b) & np.isfinite(truth)
59
+ valid &= (truth >= low) & (truth <= high)
60
+ return {key: [float(v) if ok else None for v, ok in zip(values, valid)]
61
+ for key, values in [('1.1', np.abs(a-truth)), ('1.2', np.abs(b-truth))]}
62
+
63
+
64
+ def aggregate(records, key):
65
+ """Leads -> daily issue -> storm -> equal storm. Never pool storm lengths."""
66
+ grouped = defaultdict(list)
67
+ for record in records:
68
+ if record.get('errors', {}).get(key):
69
+ grouped[record['storm_id']].append(record['errors'][key])
70
+ storms = []
71
+ counts = np.zeros(20, dtype=int)
72
+ total_daily = 0
73
+ for sid, issues in grouped.items():
74
+ values = {}
75
+ for model in ('1.1', '1.2'):
76
+ daily = [np.array([np.nan if v is None else v for v in d[model]]) for d in issues]
77
+ usable = [d for d in daily if np.isfinite(d).any()]
78
+ if not usable:
79
+ values = {}; break
80
+ leads = []
81
+ for i in range(20):
82
+ valid = [d[i] for d in usable if np.isfinite(d[i])]
83
+ leads.append(float(np.mean(valid)) if valid else None)
84
+ values[model] = {'mae': float(np.mean([d[np.isfinite(d)].mean() for d in usable])),
85
+ 'mae_by_lead': leads}
86
+ if values:
87
+ total_daily += sum(any(v is not None for v in d['1.1']) for d in issues)
88
+ counts += np.array([sum(d['1.1'][i] is not None for d in issues) for i in range(20)])
89
+ storms.append({'storm_id': sid, 'models': values})
90
+ result = {'valid_storms': len(storms), 'valid_daily_issues': total_daily,
91
+ 'paired_issue_leads_by_lead': counts.tolist(), 'models': {}, 'storm_scores': storms}
92
+ if not storms:
93
+ return result
94
+ for model in ('1.1', '1.2'):
95
+ result['models'][model] = {'equal_storm_mae': float(np.mean([s['models'][model]['mae'] for s in storms])),
96
+ 'equal_storm_mae_by_lead': [float(np.mean(v)) if (v := [s['models'][model]['mae_by_lead'][i]
97
+ for s in storms if s['models'][model]['mae_by_lead'][i] is not None]) else None for i in range(20)]}
98
+ differences = np.array([s['models']['1.2']['mae']-s['models']['1.1']['mae'] for s in storms])
99
+ random = np.random.default_rng(4712)
100
+ boot = differences[random.integers(0, len(differences), (2000, len(differences)))].mean(1)
101
+ result['paired_storm_delta_1_2_minus_1_1'] = {'mean': float(differences.mean()),
102
+ 'bootstrap_95_percent_interval': np.quantile(boot, [.025, .975]).tolist(),
103
+ 'resampling_unit': 'whole storm; fixed 2000 replicates, seed 4712; development uncertainty only'}
104
+ return result
105
+
106
+
107
+ def summarize(output, plan, phase):
108
+ records = [json.loads(p.read_text()) for p in sorted((output/'cases').glob('*.json'))]
109
+ done = {r['case_index'] for r in records}
110
+ eligible = {c['case_index'] for c in plan['cases'] if c['initial_intensity_available']}
111
+ wind_done = {r['case_index'] for r in records if r.get('v12_auxiliary_wind_kt') is not None}
112
+ report = {'status': 'complete' if len(done) == len(plan['cases']) and wind_done == eligible else 'running_partial',
113
+ 'phase': phase, 'updated_at_utc': utc(), 'protocol_sha256': sha(output/'protocol.json'),
114
+ 'cohort_storms': plan['storm_count'], 'cohort_daily_issues': len(plan['cases']),
115
+ 'processed_pressure_issues': len(done), 'eligible_native_1_1_intensity_issues': len(eligible),
116
+ 'wind_replays_completed': len(wind_done),
117
+ 'missing_current_1_1_inputs': len(plan['cases'])-len(eligible),
118
+ 'member_counts': {'1.2': 50, '1.1': 'frozen 3 primary + 3 structure + 3 temporal experts, not 50'},
119
+ 'aggregation': plan['aggregation'], 'evaluation_label': plan['evaluation_label'],
120
+ 'pressure_USA_hpa': aggregate(records, 'pressure_USA_hpa'),
121
+ 'pressure_JMA_hpa': aggregate(records, 'pressure_JMA_hpa'),
122
+ 'auxiliary_wind_vs_USA_1min_kt': aggregate(records, 'auxiliary_wind_vs_USA_1min_kt'),
123
+ 'wind_note': '1.1 nominal one-minute output versus 1.2 auxiliary scalar against USA_WIND. '
124
+ 'Not a calibrated surface-wind or architecture-ablation claim. JMA 10-minute wind is not converted or pooled.',
125
+ 'radius_note': 'No matched native 1.2 radius head. No radius MAE or radius-skill ranking is claimed.'}
126
+ write(output/'report.json', report)
127
+ return report
128
+
129
+
130
+ def observations(path, storm_ids):
131
+ import csv
132
+ rows = {}
133
+ with path.open() as stream:
134
+ for row in csv.DictReader(stream):
135
+ if row.get('SID') not in storm_ids:
136
+ continue
137
+ key = (row['SID'], row['ISO_TIME'].replace(' ', 'T')+'Z')
138
+ if key in rows:
139
+ raise ValueError('Ambiguous exact observation: '+str(key))
140
+ rows[key] = row
141
+ return rows
142
+
143
+
144
+ def prepare(project, output):
145
+ source = project/'benchmark_daily_storms_1_2'
146
+ cohort = json.loads((source/'cohort.json').read_text())
147
+ with np.load(project/'track_build/track_windows_v13.npz', allow_pickle=False) as z:
148
+ raw = z['track'][:, -1, 4:6]*z['track_std'][4:6]+z['track_mean'][4:6]
149
+ ids, times = z['storm_id'].astype(str), z['base_time'].astype('int64')
150
+ cases = []
151
+ for c in cohort['cases']:
152
+ row = c['source_row']
153
+ if ids[row] != c['storm_id'] or times[row] != c['issue_ns']:
154
+ raise ValueError('Frozen case identity differs from archive')
155
+ cases.append({**c, 'initial_intensity_available': initial_available(raw[row]),
156
+ 'current_input_wind_kt': float(raw[row, 0]), 'current_input_pressure_hpa': float(raw[row, 1])})
157
+ sources = {key: item for key, item in cohort['source_hashes'].items() if key != 'benchmark_code'}
158
+ for key, path in {'cohort': source/'cohort.json', 'ibtracs': project/'data/ibtracs/ibtracs.WP.list.v04r01.csv',
159
+ 'intensity_code': project/'public-release/trackformer_1_1_intensity.py',
160
+ 'temporal_code': project/'public-release/trackformer_1_1_temporal.py',
161
+ 'local_weather_q': project/'cache/dlm4_q.npy', 'runner': Path(__file__).resolve()}.items():
162
+ sources[key] = {'path': str(path), 'sha256': sha(path)}
163
+ for path in sorted((project/'public-release/models/trackformer_1_1').glob('*')):
164
+ if path.is_file():
165
+ sources['v11_'+path.name] = {'path': str(path), 'sha256': sha(path)}
166
+ for key, item in sources.items():
167
+ if sha(item['path']) != item['sha256']:
168
+ raise ValueError('Source changed: '+key)
169
+ if sha(project/'v173/checkpoints/epoch_004.pt') != CHECKPOINT:
170
+ raise ValueError('Wrong release checkpoint')
171
+ plan = {'schema': 'trackformer-intensity-daily-matched-v1', 'created_utc': utc(),
172
+ 'cohort_sha256': sha(source/'cohort.json'), 'storm_count': cohort['storm_count'], 'cases': cases,
173
+ 'source_hashes': sources, 'checkpoint_sha256': CHECKPOINT, 'leads_hours': LEADS,
174
+ 'aggregation': 'Mean paired valid leads per daily issue, daily scores per storm, then equal storm weights; same masks for both models.',
175
+ 'selection': 'Inherited complete frozen 270-storm / 1473-daily-issue cohort; no forecast-error selection. '
176
+ '1.1 native inference requires finite current wind and pressure; excluded inputs are reported, not repaired.',
177
+ 'evaluation_label': 'Development comparison, not an unused holdout: older storms overlap original 1.1 training; '
178
+ 'the later 1.2 fitting period makes earlier hindcasts retrospective. Pipelines differ.',
179
+ 'truth_policy': 'Exact SID and valid UTC; native USA pressure, TOKYO pressure separately. '
180
+ 'USA one-minute wind diagnostic, never mixed with JMA ten-minute wind; blanks remain null.',
181
+ 'v12_policy': 'Verify original saved pressure SHA, replay same seeds 2043+source_row*100+member, '
182
+ 'same nine analyses, detail masks, issue inputs and frozen preprocessing. Require replayed mean pressure match.',
183
+ 'v11_policy': 'Original public frozen nine experts and frozen calibration, including original validation-fit coefficients; no new fit.'}
184
+ write(output/'protocol.json', plan)
185
+ return plan
186
+
187
+
188
+ def run(project, output, chunk, limit):
189
+ import torch
190
+ output.mkdir(parents=True, exist_ok=True)
191
+ if not str(output.resolve()).startswith('/Volumes/D/'):
192
+ raise ValueError('Artifacts must stay on /Volumes/D')
193
+ lock = (output/'run.lock').open('a')
194
+ try:
195
+ fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
196
+ except BlockingIOError:
197
+ raise RuntimeError('This intensity benchmark is already running')
198
+ if not torch.backends.mps.is_available():
199
+ raise RuntimeError('Requested Mac GPU benchmark requires MPS')
200
+ plan = json.loads((output/'protocol.json').read_text()) if (output/'protocol.json').exists() else prepare(project, output)
201
+ for key, item in plan['source_hashes'].items():
202
+ if sha(item['path']) != item['sha256']:
203
+ raise ValueError('Frozen source changed: '+key)
204
+ sys.path.insert(0, str(project/'public-release'))
205
+ from trackformer_1_1_intensity import Trackformer11IntensityEnsemble
206
+ sys.path.insert(0, str(project))
207
+ import benchmark_ensemble50_field as ens
208
+ with np.load(project/'track_build/track_windows_v13.npz', allow_pickle=False) as z:
209
+ track, times, ids, lat, lon = (z[k] for k in ['track', 'base_time', 'storm_id', 'base_lat', 'base_lon'])
210
+ track = track.astype('float32'); raw_track = track*z['track_std']+z['track_mean']
211
+ local_fields = np.load(project/'cache/dlm4_q.npy', mmap_mode='r')
212
+ lookup = {(str(s), int(t)): i for i, (s, t) in enumerate(zip(ids, times))}
213
+ source = project/'benchmark_daily_storms_1_2/cases'
214
+ obs = observations(project/'data/ibtracs/ibtracs.WP.list.v04r01.csv', {c['storm_id'] for c in plan['cases']})
215
+ truth_by_case = {}
216
+ # Labels are not passed to either inference function.
217
+ for c in plan['cases']:
218
+ issue = datetime.fromisoformat(c['issue_time_utc'].replace('Z', '+00:00'))
219
+ rows = [obs.get((c['storm_id'], (issue+timedelta(hours=h)).strftime('%Y-%m-%dT%H:%M:%SZ')), {}) for h in LEADS]
220
+ truth_by_case[c['case_index']] = {'pressure_USA_hpa': [number(r, 'USA_PRES', 800, 1100) for r in rows],
221
+ 'pressure_JMA_hpa': [number(r, 'TOKYO_PRES', 800, 1100) for r in rows],
222
+ 'auxiliary_wind_vs_USA_1min_kt': [number(r, 'USA_WIND', 0, 249) for r in rows]}
223
+ model_root = project/'public-release/models/trackformer_1_1'
224
+ old = Trackformer11IntensityEnsemble(model_root, model_root/'trackformer_1_1_calibration.json', device='mps')
225
+ print(json.dumps({'event': 'started', 'pid': os.getpid(), 'device': 'mps',
226
+ 'cohort': len(plan['cases']), 'eligible': sum(c['initial_intensity_available'] for c in plan['cases'])}), flush=True)
227
+ (output/'cases').mkdir(exist_ok=True)
228
+ for c in plan['cases']:
229
+ index, row = c['case_index'], c['source_row']
230
+ dest = output/'cases'/f'{index:05d}.json'
231
+ if dest.exists():
232
+ continue
233
+ original = json.loads((source/f'{index:05d}.json').read_text())
234
+ archive = source/f'{index:05d}.npz'
235
+ if original['forecast_sha256'] != sha(archive) or original['cohort_sha256'] != plan['cohort_sha256'] or original['members'] != 50:
236
+ raise ValueError('Original fifty-member forecast changed')
237
+ with np.load(archive, allow_pickle=False) as z:
238
+ if int(z['source_row']) != row:
239
+ raise ValueError('Original forecast row mismatch')
240
+ pressure = z['central_pressure_hpa'].tolist()
241
+ result = {**c, 'v12_pressure_hpa': pressure, 'original_forecast_sha256': sha(archive),
242
+ 'truth': truth_by_case[index], 'errors': {}, 'v11': None,
243
+ 'excluded_reason': None if c['initial_intensity_available'] else 'Original 1.1 pipeline lacks valid issue wind/pressure; no future fill.'}
244
+ if c['initial_intensity_available']:
245
+ history = np.zeros((8, 17, 17), dtype='float32'); available = np.zeros(2, dtype='float32'); history_rows = []
246
+ for j, h in enumerate((12, 24)):
247
+ past = lookup.get((str(ids[row]), int(times[row])-h*HOUR))
248
+ history_rows.append(past)
249
+ if past is not None:
250
+ history[j*4:(j+1)*4] = np.clip(local_fields[past].astype('float32')/31.75, -4, 4)
251
+ available[j] = 1
252
+ raw = raw_track[row]
253
+ predicted, provenance = old.predict(track[row], np.clip(local_fields[row].astype('float32')/31.75, -4, 4),
254
+ float(raw[-1, 4]), float(raw[-1, 5]), float(raw[-2, 4]), float(raw[-2, 5]),
255
+ current_structure=np.r_[raw[-1, 6], raw[-1, 8:20]], history_field=history, history_available=available)
256
+ result.update(v11=predicted, v11_provenance=provenance, v11_past_source_rows=history_rows,
257
+ v11_input_sha256=hashlib.sha256(track[row].tobytes()+local_fields[row].tobytes()+history.tobytes()).hexdigest())
258
+ old_pressure = [p['central_pressure_hpa'] for p in predicted]
259
+ for key in ('pressure_USA_hpa', 'pressure_JMA_hpa'):
260
+ result['errors'][key] = common_errors(old_pressure, pressure, result['truth'][key], low=800, high=1100)
261
+ write(dest, result)
262
+ if index % 50 == 0:
263
+ summarize(output, plan, 'original_1_1_native_pressure')
264
+ summarize(output, plan, 'recovering_original_1_2_auxiliary_wind')
265
+ del old
266
+ torch.mps.empty_cache()
267
+ sys.path.insert(0, str(project/'v173'))
268
+ from model import CoreForecaster
269
+ payload = torch.load(project/'v173/checkpoints/epoch_004.pt', map_location='cpu', weights_only=False)
270
+ if (payload['version'], payload['architecture'], payload['epoch']) != ('1.2.73', 'v173-moving-core-multiscale-attention', 4):
271
+ raise ValueError('Wrong release architecture')
272
+ contract = payload['data_contract']
273
+ model = CoreForecaster(contract).to('mps').eval(); model.load_state_dict(payload['model'], strict=True)
274
+ del payload
275
+ with np.load(project/'track_build/basin_all_int8.npz', allow_pickle=False) as z:
276
+ atlas, scale, offset = z['time'], z['scale'], z['offset']
277
+ q = np.load(project/'data/v164_reuse/basin_q_verified.npy', mmap_mode='r')
278
+ slp = np.load(project/'track_build/basin_slp_atlas_float16.npy', mmap_mode='r')
279
+ native = np.load(project/'data/v164_reuse/pressure_hpa.npy', mmap_mode='r')
280
+ patches = {int(r['track_archive_row']): (i, r) for i, r in enumerate(json.loads((project/'data/v164_reuse/plan.json').read_text())['rows'])}
281
+ geography = np.load(project/'data/v164_pressure_geography/geography.npz', allow_pickle=False)
282
+ static = ens.static(geography, np.asarray(contract['global_lat']), np.asarray(contract['global_lon']))
283
+ done = 0
284
+ for c in plan['cases']:
285
+ if not c['initial_intensity_available']:
286
+ continue
287
+ index, row = c['case_index'], c['source_row']; dest = output/'cases'/f'{index:05d}.json'
288
+ result = json.loads(dest.read_text())
289
+ if result.get('v12_auxiliary_wind_kt') is not None:
290
+ continue
291
+ started = time.monotonic(); ai = int(np.searchsorted(atlas, times[row]))
292
+ wanted = int(times[row])+np.arange(-8, 1)*6*HOUR
293
+ if ai < 8 or not np.array_equal(atlas[ai-8:ai+1].astype('int64'), wanted):
294
+ raise ValueError('Nine exact causal analyses required')
295
+ weather = np.concatenate([slp[ai-8:ai+1, None].astype('float32'),
296
+ q[ai-8:ai+1].astype('float32')*scale[None, :, None, None]+offset[None, :, None, None]], axis=1)
297
+ patch = patches.get(row)
298
+ if patch:
299
+ pi, pm = patch
300
+ if int(pm['issue_ns']) != int(times[row]): raise ValueError('Native patch issue mismatch')
301
+ rlat = float(pm['center_lat'])+np.linspace(15, -15, 121, dtype='float32')
302
+ rlon = float(pm['center_lon'])+np.linspace(-15, 15, 121, dtype='float32')
303
+ regional = native[pi, :9].astype('float32'); detail = 1.
304
+ else:
305
+ rlat = round(float(lat[row])*4)/4+np.linspace(15, -15, 121, dtype='float32')
306
+ rlon = round(float(lon[row])*4)/4+np.linspace(-15, 15, 121, dtype='float32')
307
+ regional = np.zeros((9, 121, 121), dtype='float32'); detail = 0.
308
+ previous = lookup.get((str(ids[row]), int(times[row])-6*HOUR))
309
+ motion = np.zeros(2, dtype='float32') if previous is None else np.array([
310
+ ((lon[row]-lon[previous]+180)%360-180)*111.2*np.cos(np.deg2rad(lat[row])),
311
+ (lat[row]-lat[previous])*111.2], dtype='float32')
312
+ base = ens.normalized_inputs(contract, static, [{'global': weather, 'regional': regional,
313
+ 'regional_static': ens.static(geography, rlat, rlon), 'detail': detail,
314
+ 'center': np.array([lat[row], lon[row]], dtype='float32'), 'motion': motion,
315
+ 'intensity': raw_track[row, -1, 4:6].copy(), 'mask': np.ones(2, dtype='float32')}])
316
+ ens.NOISE_SEED_BASE = 2043+row*100
317
+ wind_members, pressure_members, input_hashes = [], [], []
318
+ for first in range(0, 50, chunk):
319
+ inputs = ens.member_inputs(base, list(range(first, min(50, first+chunk))))
320
+ for j in range(len(inputs['center'])):
321
+ input_hashes.append(hashlib.sha256(inputs['global_history'][j].tobytes()+inputs['regional_history'][j].tobytes()).hexdigest())
322
+ tensors = {k: torch.from_numpy(v.astype('float32', copy=False)).to('mps') for k, v in inputs.items()}
323
+ with torch.inference_mode():
324
+ state = model.initial(tensors); outputs = []
325
+ for _ in LEADS:
326
+ state, values = model.step(state); outputs.append(values)
327
+ wind_members.append(torch.stack([v['vmax'] for v in outputs], 1).cpu().numpy())
328
+ pressure_members.append(torch.stack([v['pressure'] for v in outputs], 1).cpu().numpy())
329
+ del state, outputs, tensors
330
+ wind = np.concatenate(wind_members); pressure = np.concatenate(pressure_members)
331
+ if wind.shape != (50, 20) or pressure.shape != (50, 20) or len(set(input_hashes)) != 50 or not np.isfinite(wind).all():
332
+ raise ValueError('Invalid real-member wind replay')
333
+ mean_pressure = pressure.mean(0, dtype='float64')
334
+ delta = float(np.max(np.abs(mean_pressure-np.asarray(result['v12_pressure_hpa']))))
335
+ if delta > 1e-3:
336
+ raise ValueError(f'Original fifty-member mean differs on replay: {delta} hPa; no scoring changed inputs')
337
+ wind_mean = wind.mean(0, dtype='float64')
338
+ result.update(v12_auxiliary_wind_kt=wind_mean.tolist(), pressure_replay_max_difference_hpa=delta,
339
+ v12_causal_analysis_times_ns=wanted.tolist(), v12_distinct_input_members=50,
340
+ v12_member_input_sha256=input_hashes, v12_member_seeds=list(range(ens.NOISE_SEED_BASE, ens.NOISE_SEED_BASE+50)))
341
+ result['errors']['auxiliary_wind_vs_USA_1min_kt'] = common_errors(
342
+ [p['vmax_kt'] for p in result['v11']], wind_mean, result['truth']['auxiliary_wind_vs_USA_1min_kt'], low=0, high=249)
343
+ saved = output/'cases'/f'{index:05d}_wind_members.npz'
344
+ np.savez_compressed(saved, wind_kt=wind, pressure_hpa=pressure)
345
+ result['wind_member_file_sha256'] = sha(saved)
346
+ write(dest, result); report = summarize(output, plan, 'recovering_original_1_2_auxiliary_wind'); done += 1
347
+ print(json.dumps({'event': 'wind_case_complete', 'case': index,
348
+ 'wind_replays_completed': report['wind_replays_completed'], 'pressure_replay_difference_hpa': delta,
349
+ 'seconds': round(time.monotonic()-started, 2)}), flush=True)
350
+ if limit and done >= limit:
351
+ break
352
+ report = summarize(output, plan, 'finished' if not limit else 'bounded_run')
353
+ print(json.dumps({'event': 'run_finished', 'status': report['status']}), flush=True)
354
+
355
+
356
+ if __name__ == '__main__':
357
+ parser = argparse.ArgumentParser(description=__doc__)
358
+ parser.add_argument('--project', type=Path, required=True)
359
+ parser.add_argument('--output', type=Path, required=True)
360
+ parser.add_argument('--chunk', type=int, default=10, choices=range(1, 11))
361
+ parser.add_argument('--limit', type=int, default=0)
362
+ args = parser.parse_args()
363
+ run(args.project.resolve(), args.output.resolve(), args.chunk, args.limit)
release_tools/export_structure_public.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Export already audited plots and small public diagnostic receipts.
2
+
3
+ No inference, fitting, weather download, or modification of source forecasts.
4
+ Raw members remain in their immutable source folders; the public receipts give
5
+ their hashes and complete-member summaries, not fictional resolved radii.
6
+ """
7
+ import argparse
8
+ import hashlib
9
+ import json
10
+ from pathlib import Path
11
+ import shutil
12
+
13
+
14
+ def sha(path):
15
+ with path.open('rb') as stream:
16
+ return hashlib.file_digest(stream, 'sha256').hexdigest()
17
+
18
+
19
+ def main():
20
+ parser = argparse.ArgumentParser(description=__doc__)
21
+ parser.add_argument('--plots', type=Path, required=True)
22
+ parser.add_argument('--output', type=Path, required=True)
23
+ args = parser.parse_args()
24
+ args.output.mkdir(parents=True, exist_ok=True)
25
+ verification = json.loads((args.plots/'verification.json').read_text())
26
+ cases = []
27
+ for slug in ('fung_wong', 'soudelor', 'mangkhut', 'meranti'):
28
+ source = args.plots/f'{slug}_structure.json'
29
+ report = json.loads(source.read_text())
30
+ if report['actual_members'] != 50 or not report['physical_50_member_means_verified'] or not report['observed_plus_zero_alignment_verified']:
31
+ raise ValueError('Requires real audited 50-member source')
32
+ # Retain the immutable member-archive digest even though the large raw
33
+ # members are not redundantly copied into the website package.
34
+ public = {k: v for k, v in report.items() if k not in ('member_diagnostics_by_lead', 'source_forecast_folder')}
35
+ public['source_receipt_sha256'] = sha(source)
36
+ public['source_reference'] = 'Original immutable /Volumes/D member archive; original files unchanged.'
37
+ destination = args.output/f'{slug}_structure.json'
38
+ destination.write_text(json.dumps(public, indent=2, allow_nan=False)+'\n')
39
+ image = args.plots/f'{slug}_wind_radius.png'
40
+ matches = [v for k, v in verification['output_sha256'].items() if Path(k).name == image.name]
41
+ if len(matches) != 1 or sha(image) != matches[0]:
42
+ raise ValueError('Changed audited image')
43
+ shutil.copy2(image, args.output/image.name)
44
+ cases.append({'slug': slug, 'name': slug.replace('_', '-').title(), 'storm_id': report['storm_id'],
45
+ 'issue_time_utc': report['issue_time_utc'], 'members': 50, 'image': image.name,
46
+ 'image_sha256': sha(image), 'receipt': destination.name, 'receipt_sha256': sha(destination),
47
+ 'coverage': report['coverage'], 'rmw_method': 'issue-time persistence, not a future RMW forecast'})
48
+ overview = args.plots/'four_storm_wind_candidate.png'
49
+ overview_matches = [v for k, v in verification['output_sha256'].items() if Path(k).name == overview.name]
50
+ if len(overview_matches) != 1 or sha(overview) != overview_matches[0]:
51
+ raise ValueError('Changed audited overview')
52
+ shutil.copy2(overview, args.output/overview.name)
53
+ index = {'schema': 'audited-structure-examples-v1', 'cases': cases,
54
+ 'source_verification_sha256': sha(args.plots/'verification.json'),
55
+ 'overview': overview.name, 'overview_sha256': sha(overview), 'experimental': True,
56
+ 'native_radius_skill_claim': False, 'forecast_weights_changed': False,
57
+ 'note': '50 actual member pressure diagnostics. Fung-Wong is a separate fresh replay, not the old MP4 output. '
58
+ 'RMW is persistence; USA and JMA wind periods stay separate; no radius-skill score.'}
59
+ (args.output/'index.json').write_text(json.dumps(index, indent=2)+'\n')
60
+ print(json.dumps({'exported_cases': len(cases), 'path': str(args.output), 'actual_members': 50}))
61
+
62
+
63
+ if __name__ == '__main__':
64
+ main()
release_tools/forecast_historical_video50_mac.py CHANGED
@@ -8,6 +8,7 @@ import argparse
8
  import csv
9
  import hashlib
10
  import json
 
11
  from datetime import timedelta
12
  from pathlib import Path
13
 
@@ -19,6 +20,7 @@ from ensemble_forecast import array_hash, run_ensemble, mean_outputs
19
  from build_fung_wong_video import distances
20
 
21
  CASES = {
 
22
  'soudelor': ('SOUDELOR', '2015211N13162', '2015-08-05T00:00:00Z'),
23
  'mangkhut': ('MANGKHUT', '2018250N12170', '2018-09-11T00:00:00Z'),
24
  'meranti': ('MERANTI', '2016253N13144', '2016-09-10T00:00:00Z'),
@@ -77,13 +79,42 @@ def observations(rows, issue):
77
  return np.asarray(route), np.asarray(pressure[1:])
78
 
79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  def main():
81
  ap = argparse.ArgumentParser(description=__doc__)
82
  ap.add_argument('--project', type=Path, required=True)
83
  ap.add_argument('--output', type=Path, required=True)
84
- ap.add_argument('--storm', choices=list(CASES), action='append', required=True)
 
 
85
  ap.add_argument('--chunk', type=int, default=5)
86
  args = ap.parse_args()
 
87
  if not str(args.output.resolve()).startswith('/Volumes/D/'):
88
  raise ValueError('New artifacts must stay on /Volumes/D')
89
  if not torch.backends.mps.is_available():
@@ -113,8 +144,8 @@ def main():
113
  # subsets to the hash-verified original encoded source before inference.
114
  q_mmap = np.load(args.project/'data/v164_reuse/basin_q_verified.npy', mmap_mode='r')
115
  q_original = z['q']
116
- for slug in args.storm:
117
- idx = exact_history_indices(times, CASES[slug][2])
118
  if not np.array_equal(q_mmap[idx], q_original[idx]):
119
  raise ValueError('Decoded weather cache differs from original')
120
  del q_original
@@ -122,28 +153,37 @@ def main():
122
  csvpath = args.project/'data/ibtracs/ibtracs.WP.list.v04r01.csv'
123
  csvhash = sha(csvpath)
124
  with csvpath.open() as stream:
125
- all_rows = [r for r in csv.DictReader(stream) if r['SID'] in {CASES[s][1] for s in args.storm}]
126
  coastpath = args.project/'trackformer-weatherlab-site/public/data/history/coastlines.json'
127
  coastlines = json.loads(coastpath.read_text())
128
  geo = np.load(args.project/'output/automatic-forecast-cache/geography.npz', allow_pickle=False)
129
  torch.set_num_threads(4)
130
  model = auto.CoreForecaster(contract).eval()
131
  model.load_state_dict(torch.load(weights, map_location='cpu', weights_only=True), strict=True)
132
- for slug in args.storm:
133
  dest = args.output/slug
134
  # A finished issue is immutable, even when rerunning the command.
135
  if (dest/'verification.json').exists():
136
  receipt = json.loads((dest/'verification.json').read_text())
 
 
 
 
 
137
  for filename, expected in receipt['files_sha256'].items():
138
  if sha(dest/filename) != expected:
139
  raise ValueError('Completed artifact changed: '+filename)
140
  print(json.dumps({'storm': slug, 'reused_verified_complete': True}), flush=True)
141
  continue
142
  dest.mkdir(parents=True, exist_ok=True)
143
- name, sid, issue = CASES[slug]
144
  rows = {r['ISO_TIME']: r for r in all_rows if r['SID'] == sid}
145
  if len(rows) != sum(r['SID'] == sid for r in all_rows):
146
  raise ValueError('Duplicate storm observation timestamp')
 
 
 
 
147
  row = issue_row(rows, name, sid, issue)
148
  idx = exact_history_indices(times, issue)
149
  weather = np.concatenate((np.asarray(slp[idx], dtype='float32')[:, None],
 
8
  import csv
9
  import hashlib
10
  import json
11
+ import re
12
  from datetime import timedelta
13
  from pathlib import Path
14
 
 
20
  from build_fung_wong_video import distances
21
 
22
  CASES = {
23
+ 'fung_wong': ('FUNG-WONG', '2025308N09144', '2025-11-07T00:00:00Z'),
24
  'soudelor': ('SOUDELOR', '2015211N13162', '2015-08-05T00:00:00Z'),
25
  'mangkhut': ('MANGKHUT', '2018250N12170', '2018-09-11T00:00:00Z'),
26
  'meranti': ('MERANTI', '2016253N13144', '2016-09-10T00:00:00Z'),
 
79
  return np.asarray(route), np.asarray(pressure[1:])
80
 
81
 
82
+ def requested_cases(storms, custom_cases):
83
+ """Accept any explicit WP storm issue, not a preselected four-storm list.
84
+
85
+ Exact archive availability/domain checks remain mandatory in main. This
86
+ does not download missing weather or expand the cloud backfill plan.
87
+ """
88
+ selected = {slug: CASES[slug] for slug in (storms or [])}
89
+ for slug, sid, issue in custom_cases or []:
90
+ if not re.fullmatch(r'[a-z][a-z0-9_-]{0,63}', slug):
91
+ raise ValueError('Use a safe lowercase output slug')
92
+ if not re.fullmatch(r'\d{7}[NS]\d{5}', sid):
93
+ raise ValueError('Use an exact IBTrACS storm SID')
94
+ if not re.fullmatch(r'\d{4}-\d{2}-\d{2}T(?:00|06|12|18):00:00Z', issue):
95
+ raise ValueError('Use an exact six-hour UTC issue YYYY-MM-DDTHH:00:00Z')
96
+ auto.parse(issue) # reject impossible dates, not just syntax
97
+ if slug in selected:
98
+ raise ValueError('Duplicate output slug: '+slug)
99
+ selected[slug] = (slug.upper(), sid, issue)
100
+ if not selected:
101
+ raise ValueError('Choose --storm or provide --case SLUG SID ISSUE_UTC')
102
+ identities = [(sid, issue) for _, sid, issue in selected.values()]
103
+ if len(set(identities)) != len(identities):
104
+ raise ValueError('Do not duplicate a storm issue under a second slug')
105
+ return selected
106
+
107
+
108
  def main():
109
  ap = argparse.ArgumentParser(description=__doc__)
110
  ap.add_argument('--project', type=Path, required=True)
111
  ap.add_argument('--output', type=Path, required=True)
112
+ ap.add_argument('--storm', choices=list(CASES), action='append')
113
+ ap.add_argument('--case', nargs=3, action='append', metavar=('SLUG', 'SID', 'ISSUE_UTC'),
114
+ help='Any explicit WP storm issue with nine exact local analyses')
115
  ap.add_argument('--chunk', type=int, default=5)
116
  args = ap.parse_args()
117
+ cases = requested_cases(args.storm, args.case)
118
  if not str(args.output.resolve()).startswith('/Volumes/D/'):
119
  raise ValueError('New artifacts must stay on /Volumes/D')
120
  if not torch.backends.mps.is_available():
 
144
  # subsets to the hash-verified original encoded source before inference.
145
  q_mmap = np.load(args.project/'data/v164_reuse/basin_q_verified.npy', mmap_mode='r')
146
  q_original = z['q']
147
+ for slug in cases:
148
+ idx = exact_history_indices(times, cases[slug][2])
149
  if not np.array_equal(q_mmap[idx], q_original[idx]):
150
  raise ValueError('Decoded weather cache differs from original')
151
  del q_original
 
153
  csvpath = args.project/'data/ibtracs/ibtracs.WP.list.v04r01.csv'
154
  csvhash = sha(csvpath)
155
  with csvpath.open() as stream:
156
+ all_rows = [r for r in csv.DictReader(stream) if r['SID'] in {cases[s][1] for s in cases}]
157
  coastpath = args.project/'trackformer-weatherlab-site/public/data/history/coastlines.json'
158
  coastlines = json.loads(coastpath.read_text())
159
  geo = np.load(args.project/'output/automatic-forecast-cache/geography.npz', allow_pickle=False)
160
  torch.set_num_threads(4)
161
  model = auto.CoreForecaster(contract).eval()
162
  model.load_state_dict(torch.load(weights, map_location='cpu', weights_only=True), strict=True)
163
+ for slug in cases:
164
  dest = args.output/slug
165
  # A finished issue is immutable, even when rerunning the command.
166
  if (dest/'verification.json').exists():
167
  receipt = json.loads((dest/'verification.json').read_text())
168
+ saved = json.loads((dest/f'{slug}_video.json').read_text())
169
+ _, requested_sid, requested_issue = cases[slug]
170
+ if (saved['storm_id'] != requested_sid or saved['issue_time_utc'] != requested_issue
171
+ or saved['checkpoint_sha256'] != auto.CHECKPOINT or saved['members'] != 50):
172
+ raise ValueError('Completed slug belongs to another immutable storm issue: '+slug)
173
  for filename, expected in receipt['files_sha256'].items():
174
  if sha(dest/filename) != expected:
175
  raise ValueError('Completed artifact changed: '+filename)
176
  print(json.dumps({'storm': slug, 'reused_verified_complete': True}), flush=True)
177
  continue
178
  dest.mkdir(parents=True, exist_ok=True)
179
+ name, sid, issue = cases[slug]
180
  rows = {r['ISO_TIME']: r for r in all_rows if r['SID'] == sid}
181
  if len(rows) != sum(r['SID'] == sid for r in all_rows):
182
  raise ValueError('Duplicate storm observation timestamp')
183
+ stamp = auto.parse(issue).strftime('%Y-%m-%d %H:%M:%S')
184
+ if stamp not in rows:
185
+ raise ValueError('Missing exact issue-time storm report: '+sid+' '+issue)
186
+ name = rows[stamp]['NAME'].strip() or name
187
  row = issue_row(rows, name, sid, issue)
188
  idx = exact_history_indices(times, issue)
189
  weather = np.concatenate((np.asarray(slp[idx], dtype='float32')[:, None],
release_tools/plot_intensity_benchmark.py ADDED
@@ -0,0 +1,346 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Verify and plot daily -> storm -> equal-storm intensity/curve diagnostics.
2
+
3
+ This is a read-only postprocessor for the separately frozen GPU runner. It
4
+ never changes its inputs, weights, member sampling, calibration or cases.
5
+ Native 1.2 has no radius output: absent bars are N/A, never zero error.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ from collections import defaultdict
11
+ from datetime import datetime, timedelta, timezone
12
+ import hashlib
13
+ import json
14
+ from pathlib import Path
15
+
16
+ import numpy as np
17
+
18
+ MODELS = ('1.1', '1.2')
19
+ LEADS = list(range(6, 121, 6))
20
+ QUADRANTS = ('NE', 'SE', 'SW', 'NW')
21
+ CURVE_PROTOCOL = {
22
+ 'version': 'unshifted-six-hour-intensity-curves-v1',
23
+ 'minimum_curve_points': 6,
24
+ 'shape_error': '(1 - centred cosine similarity) / 2; exact common UTC leads; '
25
+ 'remove mean and scalar magnitude, preserve time order and sign; '
26
+ 'no lag optimization, time warping, shift or fit; flat truth or '
27
+ 'either flat model makes both shape scores unavailable.',
28
+ 'trend_error': 'Fraction of adjacent exact six-hour changes with a different '
29
+ 'sign, including flat vs non-flat. Sign deadband = 0 '
30
+ '(strict native changes); no joining across missing leads.',
31
+ 'tendency_mae': 'MAE of predicted minus observed adjacent six-hour changes, '
32
+ 'in kt/6h, hPa/6h or km/6h.',
33
+ 'aggregation': 'Paired common lead mask -> daily issue mean -> mean of days '
34
+ 'per storm -> equal storm weights, same as track. Radius '
35
+ 'quadrants are averaged within the daily issue; no pooling '
36
+ 'long-lived storms or quadrant counts across storms.',
37
+ 'radius': 'Native 1.1 RMW and NE/SE/SW/NW R34/R50/R64 kilometre outputs '
38
+ 'versus exact USA reports in nautical miles * 1.852; radii, not '
39
+ 'diameters. No native 1.2 radius head: do not score experimental '
40
+ 'pressure radii as a calibrated official equivalent. RMW must '
41
+ 'be positive; reported zero wind-radius extents are valid.',
42
+ 'uncertainty': 'Whole-storm bootstrap, fixed 2000 replicates, seed 4712; '
43
+ 'development uncertainty, not untouched-holdout certification.',
44
+ }
45
+
46
+
47
+ def sha(path):
48
+ with Path(path).open('rb') as stream:
49
+ return hashlib.file_digest(stream, 'sha256').hexdigest()
50
+
51
+
52
+ def write(path, value):
53
+ path = Path(path)
54
+ path.parent.mkdir(parents=True, exist_ok=True)
55
+ temporary = path.with_suffix(path.suffix + '.tmp')
56
+ temporary.write_text(json.dumps(value, indent=2, allow_nan=False) + '\n')
57
+ temporary.replace(path)
58
+
59
+
60
+ def numeric(values):
61
+ return np.array([np.nan if v is None else float(v) for v in values], dtype=float)
62
+
63
+
64
+ def curve_scores(predictions, truth, *, low, high):
65
+ """Return per-issue scores with exactly the same mask for both models."""
66
+ truth = numeric(truth)
67
+ predicted = {m: numeric(v) for m, v in predictions.items()}
68
+ if not predicted or any(v.shape != truth.shape for v in predicted.values()):
69
+ raise ValueError('Curve lengths differ')
70
+ valid = np.isfinite(truth) & (truth >= low) & (truth <= high)
71
+ for values in predicted.values():
72
+ valid &= np.isfinite(values)
73
+ adjacent = valid[:-1] & valid[1:]
74
+ output = {m: {'mae': None, 'shape_error': None, 'trend_error': None,
75
+ 'tendency_mae': None} for m in predicted}
76
+ if not valid.any():
77
+ return output, {'valid_leads': 0, 'valid_adjacent_steps': 0}
78
+ centred_truth = truth[valid] - truth[valid].mean()
79
+ centred = {m: v[valid] - v[valid].mean() for m, v in predicted.items()}
80
+ shape_ok = valid.sum() >= CURVE_PROTOCOL['minimum_curve_points']
81
+ shape_ok &= np.linalg.norm(centred_truth) > 1e-6
82
+ shape_ok &= all(np.linalg.norm(v) > 1e-6 for v in centred.values())
83
+ truth_change = np.diff(truth)[adjacent]
84
+ for model, values in predicted.items():
85
+ output[model]['mae'] = float(np.abs(values[valid] - truth[valid]).mean())
86
+ if shape_ok:
87
+ cosine = float(np.dot(centred[model], centred_truth) /
88
+ (np.linalg.norm(centred[model]) * np.linalg.norm(centred_truth)))
89
+ output[model]['shape_error'] = float((1 - np.clip(cosine, -1, 1)) / 2)
90
+ if adjacent.any():
91
+ change = np.diff(values)[adjacent]
92
+ output[model]['trend_error'] = float((np.sign(change) != np.sign(truth_change)).mean())
93
+ output[model]['tendency_mae'] = float(np.abs(change - truth_change).mean())
94
+ return output, {'valid_leads': int(valid.sum()), 'valid_adjacent_steps': int(adjacent.sum()),
95
+ 'shape_available': bool(shape_ok)}
96
+
97
+
98
+ def aggregate_daily(records, models=MODELS):
99
+ grouped = defaultdict(list)
100
+ for record in records:
101
+ grouped[record['storm_id']].append(record)
102
+ result = {}
103
+ for key in ('mae', 'shape_error', 'trend_error', 'tendency_mae'):
104
+ storms = []
105
+ count = 0
106
+ for sid, days in grouped.items():
107
+ paired = [r for r in days if all(r['models'][m].get(key) is not None for m in models)]
108
+ if paired:
109
+ count += len(paired)
110
+ storms.append({'storm_id': sid, 'daily_issues': len(paired),
111
+ 'models': {m: float(np.mean([r['models'][m][key] for r in paired])) for m in models}})
112
+ scores = {}
113
+ for model in models:
114
+ values = np.array([s['models'][model] for s in storms])
115
+ if len(values):
116
+ rng = np.random.default_rng(4712)
117
+ boot = values[rng.integers(0, len(values), (2000, len(values)))].mean(1)
118
+ scores[model] = {'equal_storm_mean': float(values.mean()),
119
+ 'bootstrap_95_percent_interval': np.quantile(boot, [.025, .975]).tolist()}
120
+ result[key] = {'valid_storms': len(storms), 'valid_daily_issues': count,
121
+ 'models': scores, 'storm_scores': storms}
122
+ if len(models) == 2 and storms:
123
+ delta = np.array([s['models']['1.2'] - s['models']['1.1'] for s in storms])
124
+ rng = np.random.default_rng(4712)
125
+ boot = delta[rng.integers(0, len(delta), (2000, len(delta)))].mean(1)
126
+ result[key]['paired_delta_1_2_minus_1_1'] = {'mean': float(delta.mean()),
127
+ 'bootstrap_95_percent_interval': np.quantile(boot, [.025, .975]).tolist()}
128
+ return result
129
+
130
+
131
+ def observation_number(row, name, low, high):
132
+ try:
133
+ v = float(row.get(name, ''))
134
+ return v if np.isfinite(v) and low <= v <= high else None
135
+ except (ValueError, TypeError):
136
+ return None
137
+
138
+
139
+ def summarize_radius(records, observations):
140
+ by_type = defaultdict(list)
141
+ for record in records:
142
+ if record.get('v11') is None:
143
+ continue
144
+ issue = datetime.fromisoformat(record['issue_time_utc'].replace('Z', '+00:00'))
145
+ rows = [observations.get((record['storm_id'],
146
+ (issue + timedelta(hours=h)).strftime('%Y-%m-%dT%H:%M:%SZ')), {}) for h in LEADS]
147
+ for target in ('RMW', 'R34', 'R50', 'R64'):
148
+ daily = []
149
+ components = ['RMW'] if target == 'RMW' else list(QUADRANTS)
150
+ for component in components:
151
+ column = 'USA_RMW' if target == 'RMW' else f'USA_{target}_{component}'
152
+ obs = [observation_number(r, column, 0.001 if target == 'RMW' else 0, 1000) for r in rows]
153
+ obs = [None if v is None else v*1.852 for v in obs]
154
+ component_index = None if target == 'RMW' else (('R34', 'R50', 'R64').index(target)*4 + QUADRANTS.index(component))
155
+ values = [p['rmw_km'] if component_index is None else p['wind_radii_km'][component_index] for p in record['v11']]
156
+ scored, coverage = curve_scores({'1.1': values}, obs, low=0, high=1852)
157
+ daily.append(scored['1.1'])
158
+ # Equal component weight inside one issue. Missing components remain
159
+ # absent; a zero observed extent is included in its lead error.
160
+ combined = {key: float(np.mean(v)) if (v := [d[key] for d in daily if d[key] is not None]) else None
161
+ for key in ('mae', 'shape_error', 'trend_error', 'tendency_mae')}
162
+ by_type[target].append({'storm_id': record['storm_id'], 'case_index': record['case_index'],
163
+ 'models': {'1.1': combined}})
164
+ return {target: aggregate_daily(days, ('1.1',)) for target, days in by_type.items()}
165
+
166
+
167
+ def verify_and_summarize(source, project):
168
+ from benchmark_intensity_v12_v11 import observations
169
+ plan = json.loads((source/'protocol.json').read_text())
170
+ report = json.loads((source/'report.json').read_text())
171
+ if report['status'] != 'complete':
172
+ raise ValueError('Do not publish partial wind replay scores as final')
173
+ if report['protocol_sha256'] != sha(source/'protocol.json'):
174
+ raise ValueError('Protocol hash mismatch')
175
+ for name, item in plan['source_hashes'].items():
176
+ if sha(item['path']) != item['sha256']:
177
+ raise ValueError('Source changed: '+name)
178
+ records = [json.loads(p.read_text()) for p in sorted((source/'cases').glob('*.json'))]
179
+ if len(records) != len(plan['cases']) or {r['case_index'] for r in records} != {c['case_index'] for c in plan['cases']}:
180
+ raise ValueError('Frozen case coverage differs')
181
+ verified_wind, maximum_delta = 0, 0.
182
+ for record in records:
183
+ original = project/'benchmark_daily_storms_1_2/cases'/f"{record['case_index']:05d}.npz"
184
+ if sha(original) != record['original_forecast_sha256']:
185
+ raise ValueError('Original forecast mutated')
186
+ if not record['initial_intensity_available']:
187
+ if record['v11'] is not None or record.get('v12_auxiliary_wind_kt') is not None:
188
+ raise ValueError('Excluded issue unexpectedly has intensity outputs')
189
+ continue
190
+ members_path = source/'cases'/f"{record['case_index']:05d}_wind_members.npz"
191
+ if sha(members_path) != record['wind_member_file_sha256'] or record['v12_distinct_input_members'] != 50:
192
+ raise ValueError('Member proof mismatch')
193
+ if len(set(record['v12_member_input_sha256'])) != 50:
194
+ raise ValueError('Duplicate input members')
195
+ wanted = record['issue_ns'] + np.arange(-8, 1, dtype=np.int64)*6*3600*10**9
196
+ if not np.array_equal(wanted, record['v12_causal_analysis_times_ns']):
197
+ raise ValueError('Noncausal analysis history')
198
+ with np.load(members_path, allow_pickle=False) as z:
199
+ if z['wind_kt'].shape != (50, 20) or z['pressure_hpa'].shape != (50, 20):
200
+ raise ValueError('Member lead shape mismatch')
201
+ if not np.isfinite(z['wind_kt']).all() or not np.isfinite(z['pressure_hpa']).all():
202
+ raise ValueError('Nonfinite member output')
203
+ if not np.allclose(z['wind_kt'].mean(0, dtype='float64'), record['v12_auxiliary_wind_kt'], rtol=0, atol=1e-8):
204
+ raise ValueError('Wind mean mismatch')
205
+ delta = float(np.max(np.abs(z['pressure_hpa'].mean(0, dtype='float64') - record['v12_pressure_hpa'])))
206
+ if delta > 1e-3:
207
+ raise ValueError('Original pressure replay differs')
208
+ maximum_delta = max(maximum_delta, delta)
209
+ verified_wind += 1
210
+ metrics = {}
211
+ specifications = [
212
+ ('pressure_USA_hpa', 'USA central pressure', 'hPa', 800, 1100),
213
+ ('pressure_JMA_hpa', 'JMA central pressure', 'hPa', 800, 1100),
214
+ ('auxiliary_wind_vs_USA_1min_kt', 'Wind against USA 1-minute reference', 'kt', 0, 249),
215
+ ]
216
+ for key, label, unit, low, high in specifications:
217
+ days = []
218
+ for record in records:
219
+ if record['v11'] is None:
220
+ continue
221
+ forecast = {'1.1': [p['vmax_kt' if unit == 'kt' else 'central_pressure_hpa'] for p in record['v11']],
222
+ '1.2': record['v12_auxiliary_wind_kt' if unit == 'kt' else 'v12_pressure_hpa']}
223
+ scores, coverage = curve_scores(forecast, record['truth'][key], low=low, high=high)
224
+ days.append({'storm_id': record['storm_id'], 'case_index': record['case_index'],
225
+ 'models': scores, 'coverage': coverage})
226
+ metrics[key] = {'label': label, 'unit': unit, **aggregate_daily(days)}
227
+ # The independent postprocessor must reproduce the runner's MAE.
228
+ for model in MODELS:
229
+ actual = metrics[key]['mae']['models'][model]['equal_storm_mean']
230
+ expected = report[key]['models'][model]['equal_storm_mae']
231
+ if not np.isclose(actual, expected, rtol=0, atol=1e-9):
232
+ raise ValueError('Equal-storm aggregation differs from frozen runner')
233
+ obs = observations(project/'data/ibtracs/ibtracs.WP.list.v04r01.csv', {r['storm_id'] for r in records})
234
+ return {'status': 'complete_verified', 'created_at_utc': datetime.now(timezone.utc).isoformat(),
235
+ 'cohort_storms': plan['storm_count'], 'cohort_daily_issues': len(plan['cases']),
236
+ 'eligible_intensity_daily_issues': verified_wind,
237
+ 'excluded_missing_current_intensity': len(records)-verified_wind,
238
+ 'protocol_sha256': sha(source/'protocol.json'), 'runner_report_sha256': sha(source/'report.json'),
239
+ 'postprocessor_sha256': sha(__file__), 'curve_protocol': CURVE_PROTOCOL,
240
+ 'source_hashes': {k: v['sha256'] for k, v in plan['source_hashes'].items()},
241
+ 'verification': {'all_frozen_original_forecasts_sha256_valid': True,
242
+ 'actual_distinct_input_members_per_replay': 50, 'verified_member_replays': verified_wind,
243
+ 'maximum_original_pressure_difference_hpa': maximum_delta,
244
+ 'all_wind_means_from_members_verified': True},
245
+ 'metrics': metrics, 'native_1_1_radius_USA_km': summarize_radius(records, obs),
246
+ 'native_1_2_radius': {'status': 'unavailable', 'reason': 'No native radius head; not zero error.'},
247
+ 'limits': [plan['evaluation_label'], report['wind_note'], report['radius_note'],
248
+ 'Temporal shape ignores level and amplitude. Read it with MAE and unshifted timelines.',
249
+ 'Curve metric protocol is a separately versioned post-hoc descriptive addition, '
250
+ 'not a preregistered untouched-test hypothesis. No selection or fitting on forecast errors.']}
251
+
252
+
253
+ def plot(report, runner, output):
254
+ import matplotlib
255
+ matplotlib.use('Agg')
256
+ import matplotlib.pyplot as plt
257
+ plt.rcParams.update({'font.family': 'DejaVu Sans', 'font.size': 10,
258
+ 'axes.spines.top': False, 'axes.spines.right': False})
259
+ colors = ['#65758b', '#007d78']
260
+ metrics = report['metrics']
261
+ keys = list(metrics)
262
+ titles = ['USA pressure', 'JMA pressure', 'Wind / USA 1-minute']
263
+ fig, axes = plt.subplots(2, 3, figsize=(14, 8.8))
264
+ for j, (key, title) in enumerate(zip(keys, titles)):
265
+ for i, score in enumerate(('mae', 'shape_error')):
266
+ ax = axes[i, j]
267
+ result = metrics[key][score]
268
+ values = [result['models'][m]['equal_storm_mean'] for m in MODELS]
269
+ intervals = [result['models'][m]['bootstrap_95_percent_interval'] for m in MODELS]
270
+ error = np.array([[max(0, v-p[0]) for v, p in zip(values, intervals)],
271
+ [max(0, p[1]-v) for v, p in zip(values, intervals)]])
272
+ bars = ax.bar(['1.1', '1.2 · mean of 50'], values, yerr=error, capsize=5, width=.55, color=colors)
273
+ ax.bar_label(bars, labels=[f'{v:.2f}' if i == 0 else f'{v:.3f}' for v in values], padding=25, fontweight='bold')
274
+ ax.set_title(title + ('\nMagnitude error ↓' if i == 0 else '\nTime-curve shape error ↓'), loc='left', fontweight='bold', fontsize=11)
275
+ ax.set_ylabel(metrics[key]['unit'] if i == 0 else '(1 − centred cosine) / 2')
276
+ ax.set_ylim(0, max(max(p[1] for p in intervals)*1.42, .05))
277
+ ax.grid(axis='y', alpha=.16); ax.set_axisbelow(True)
278
+ ax.text(.02, .95, f"{result['valid_storms']} storms · {result['valid_daily_issues']} days", transform=ax.transAxes, va='top', color='#526174', fontsize=9)
279
+ fig.suptitle('Intensity comparison | same daily → storm → equal-storm method as track', x=.06, ha='left', fontsize=16, fontweight='bold')
280
+ fig.text(.06, .927, f"Frozen 270-storm / 1,473-day plan · {report['eligible_intensity_daily_issues']} starts usable by native 1.1 intensity · +6 to +120 h", color='#526174')
281
+ fig.text(.06, .018, 'Development comparison, not untouched test; different pipelines. Error bars: whole-storm bootstrap 95%.\nWind is an auxiliary scalar diagnostic, not certified surface wind. Shape removes level/scale but never shifts time.', color='#526174', fontsize=9)
282
+ fig.subplots_adjust(top=.84, bottom=.13, left=.06, right=.98, hspace=.43, wspace=.33)
283
+ fig.savefig(output/'intensity_error_bars.png', dpi=175, facecolor='white'); plt.close(fig)
284
+
285
+ fig, axes = plt.subplots(2, 3, figsize=(14, 8.8))
286
+ for j, (key, title) in enumerate(zip(keys, titles)):
287
+ ax = axes[0, j]
288
+ for model, color in zip(MODELS, colors):
289
+ ax.plot(LEADS, runner[key]['models'][model]['equal_storm_mae_by_lead'], label=model, color=color, lw=2.4)
290
+ ax.set_title(title + '\nPer-lead MAE ↓', loc='left', fontweight='bold', fontsize=11)
291
+ ax.set_ylabel(metrics[key]['unit']); ax.set_xlabel('Forecast lead · h'); ax.legend(frameon=False)
292
+ ax.set_xticks([6, 24, 48, 72, 96, 120]); ax.grid(alpha=.18)
293
+ ax = axes[1, j]; result = metrics[key]['trend_error']
294
+ vals = [100*result['models'][m]['equal_storm_mean'] for m in MODELS]
295
+ bars = ax.bar(['1.1', '1.2 · mean of 50'], vals, width=.55, color=colors)
296
+ ax.bar_label(bars, labels=[f'{v:.1f}%' for v in vals], padding=6, fontweight='bold')
297
+ ax.set_ylim(0, 100); ax.set_ylabel('% adjacent changes with different sign')
298
+ ax.set_title(title + '\nTrend-direction mismatch ↓', loc='left', fontweight='bold', fontsize=11)
299
+ ax.grid(axis='y', alpha=.16); ax.set_axisbelow(True)
300
+ ax.text(.02, .95, f"{result['valid_storms']} storms · {result['valid_daily_issues']} days", transform=ax.transAxes, va='top', fontsize=9, color='#526174')
301
+ fig.suptitle('Intensity lead errors & six-hour change direction', x=.06, ha='left', fontsize=17, fontweight='bold')
302
+ fig.text(.06, .927, 'No time shifting, nearest labels or wind-period conversion · same common valid masks for both systems', color='#526174')
303
+ fig.text(.06, .024, 'Changes are scored only across adjacent valid six-hour leads; flat vs changing counts as a mismatch.\nUSA and JMA pressure references remain separate; USA 1-minute and JMA 10-minute winds are not pooled.', color='#526174', fontsize=9)
304
+ fig.subplots_adjust(top=.84, bottom=.12, left=.06, right=.98, hspace=.49, wspace=.35)
305
+ fig.savefig(output/'intensity_leads_and_trends.png', dpi=175, facecolor='white'); plt.close(fig)
306
+
307
+ fig, axes = plt.subplots(2, 4, figsize=(15, 8.5))
308
+ for j, (target, result) in enumerate(report['native_1_1_radius_USA_km'].items()):
309
+ for i, score in enumerate(('mae', 'shape_error')):
310
+ ax = axes[i, j]; r = result[score]
311
+ value = r['models'].get('1.1', {}).get('equal_storm_mean')
312
+ if value is not None:
313
+ bars = ax.bar([0], [value], color=colors[0], width=.55)
314
+ ax.bar_label(bars, labels=[f'{value:.1f}' if i == 0 else f'{value:.3f}'], padding=6, fontweight='bold')
315
+ ax.set_xlim(-.6, 1.6); ax.set_xticks([0, 1], ['1.1', '1.2'])
316
+ ax.set_ylim(0, max((value or 0)*1.45, .08))
317
+ ax.text(1, .28, 'N/A\nNo radius head', transform=ax.get_xaxis_transform(), ha='center', color='#a24537', fontsize=10, fontweight='bold')
318
+ ax.set_title(target + (' · radius MAE ↓' if i == 0 else ' · curve shape error ↓'), loc='left', fontsize=11, fontweight='bold')
319
+ ax.set_ylabel('km' if i == 0 else '(1 − centred cosine) / 2')
320
+ ax.grid(axis='y', alpha=.16); ax.set_axisbelow(True)
321
+ ax.text(.03, .97, f"{r['valid_storms']} storms\n{r['valid_daily_issues']} days", transform=ax.transAxes, va='top', fontsize=9, color='#526174')
322
+ fig.suptitle('Radius error | native 1.1 vs matching USA definitions; 1.2 unavailable', x=.06, ha='left', fontsize=15, fontweight='bold')
323
+ fig.text(.06, .92, 'RMW; R34 / R50 / R64 NE–SE–SW–NW maximum quadrant extents · nmi × 1.852 = km · radii, not diameters', color='#526174', fontsize=10)
324
+ fig.text(.06, .018, 'Same daily → storm → equal-storm hierarchy as track, using valid reports. Native 1.2 N/A is NOT zero error.\nSeparate pressure-scaled experimental radius examples are not substituted into this official-definition score.', color='#526174', fontsize=9)
325
+ fig.subplots_adjust(top=.83, bottom=.13, left=.06, right=.98, hspace=.42, wspace=.44)
326
+ fig.savefig(output/'native_radius_error_bars.png', dpi=175, facecolor='white'); plt.close(fig)
327
+
328
+
329
+ if __name__ == '__main__':
330
+ parser = argparse.ArgumentParser(description=__doc__)
331
+ parser.add_argument('--source', type=Path, required=True)
332
+ parser.add_argument('--project', type=Path, required=True)
333
+ parser.add_argument('--output', type=Path, required=True)
334
+ args = parser.parse_args()
335
+ if not str(args.output.resolve()).startswith('/Volumes/D/'):
336
+ raise ValueError('Artifacts must stay on D')
337
+ args.output.mkdir(parents=True, exist_ok=True)
338
+ summary = verify_and_summarize(args.source, args.project)
339
+ write(args.output/'intensity_final.json', summary)
340
+ plot(summary, json.loads((args.source/'report.json').read_text()), args.output)
341
+ receipt = {'status': 'complete_verified', 'summary_sha256': sha(args.output/'intensity_final.json'),
342
+ 'images': {p.name: sha(p) for p in sorted(args.output.glob('*.png'))},
343
+ 'aggregation': CURVE_PROTOCOL['aggregation'], 'native_1_2_radius_status': 'unavailable, not zero'}
344
+ write(args.output/'verification.json', receipt)
345
+ print(json.dumps({'status': summary['status'], 'verified_replays': summary['verification']['verified_member_replays'],
346
+ 'output': str(args.output), 'receipt': receipt}, indent=2))
release_tools/plot_storm_wind_radius.py ADDED
@@ -0,0 +1,360 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Draw any IBTrACS WP storm; optionally diagnose genuine saved 1.2 members.
2
+
3
+ This is a local renderer, not a website deployment or an archive-wide inference
4
+ job. Observational charts need no model forecast. Model charts require hashed
5
+ member archives and exact issue-time inputs, never a mean-field substitution.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import csv
11
+ import hashlib
12
+ import html
13
+ import json
14
+ import os
15
+ from datetime import datetime, timedelta, timezone
16
+ from pathlib import Path
17
+
18
+ import numpy as np
19
+
20
+ from storm_structure_diagnostics import (
21
+ initialize, ambient_pressure, diagnose, summarize, number, radius_km,
22
+ QUADRANTS, THRESHOLDS, METRICS, DEFINITIONS, VERSION, REFERENCES,
23
+ )
24
+
25
+ ROOT = Path(__file__).resolve().parents[1]
26
+ CHECKPOINT = 'f194a23d3f91ea76ad776dfad942fabd669eeae8b3fd665815463095367e9ee0'
27
+ BLUE, RED, BLACK = '#2166b0', '#c33c47', '#203247'
28
+ QC = {'NE':'#2166b0', 'SE':'#cc6831', 'SW':'#008475', 'NW':'#9753a7'}
29
+
30
+
31
+ def sha(path):
32
+ with Path(path).open('rb') as stream:
33
+ return hashlib.file_digest(stream,'sha256').hexdigest()
34
+
35
+
36
+ def utc(value):
37
+ return value.astimezone(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
38
+
39
+
40
+ def write_json(path, value):
41
+ path.write_text(json.dumps(value, indent=2, allow_nan=False)+'\n')
42
+
43
+
44
+ def read_catalogue(path, selected):
45
+ """Stream all storms into a coverage index; retain only requested rows."""
46
+ catalogue, rows = {}, {sid:{} for sid in selected}
47
+ with path.open() as stream:
48
+ for row in csv.DictReader(stream):
49
+ sid = row['SID']
50
+ if sid in ('', ' ') or not sid[:4].isdigit() or int(sid[:4]) < 1970:
51
+ continue
52
+ stamp = row['ISO_TIME']
53
+ if not stamp or stamp == ' ':
54
+ continue
55
+ if sid not in catalogue:
56
+ catalogue[sid] = dict(storm_id=sid, name=row['NAME'].strip(),
57
+ year=int(row['SEASON']), first_utc=stamp, last_utc=stamp,
58
+ reports=0, usa_wind_reports=0, jma_wind_reports=0, rmw_reports=0,
59
+ r34_full_quadrant_reports=0, r50_full_quadrant_reports=0,
60
+ r64_full_quadrant_reports=0, source_agencies=set(),
61
+ chart_supported=True, model_forecast_not_implied=True)
62
+ item = catalogue[sid]
63
+ item['first_utc'],item['last_utc'] = min(item['first_utc'],stamp), max(item['last_utc'],stamp)
64
+ item['reports'] += 1
65
+ item['usa_wind_reports'] += number(row,'USA_WIND',0,250) is not None
66
+ item['jma_wind_reports'] += number(row,'TOKYO_WIND',0,250) is not None
67
+ item['rmw_reports'] += radius_km(row,'USA_RMW',rmw=True) is not None
68
+ item['source_agencies'].add(row['USA_AGENCY'].strip() or 'missing')
69
+ for t in THRESHOLDS:
70
+ item[f'r{t}_full_quadrant_reports'] += all(radius_km(row,f'USA_R{t}_{q}') is not None for q in QUADRANTS)
71
+ if sid in rows:
72
+ if stamp in rows[sid]:
73
+ raise ValueError('Duplicate selected storm UTC report: '+sid+' '+stamp)
74
+ rows[sid][stamp] = row
75
+ for item in catalogue.values():
76
+ item['source_agencies'] = sorted(item['source_agencies'])
77
+ return sorted(catalogue.values(), key=lambda item:item['first_utc'], reverse=True), rows
78
+
79
+
80
+ def observation_series(rows, times):
81
+ records = [rows.get(t.strftime('%Y-%m-%d %H:%M:%S'),{}) for t in times]
82
+ values = dict(
83
+ pressure=np.array([number(r,'TOKYO_PRES',800,1100) for r in records],dtype=float),
84
+ wind_usa=np.array([number(r,'USA_WIND',0,250) for r in records],dtype=float),
85
+ wind_jma=np.array([number(r,'TOKYO_WIND',0,250) for r in records],dtype=float),
86
+ rmw=np.array([radius_km(r,'USA_RMW',rmw=True) for r in records],dtype=float))
87
+ for t in THRESHOLDS:
88
+ for q in QUADRANTS:
89
+ values[f'r{t}_{q}'] = np.array([radius_km(r,f'USA_R{t}_{q}') for r in records],dtype=float)
90
+ return values
91
+
92
+
93
+ def load_forecast(folder, rows, contract, csv_hash):
94
+ receipt_path = folder/'verification.json'
95
+ receipt = json.loads(receipt_path.read_text())
96
+ if receipt['checkpoint_sha256'] != CHECKPOINT or receipt['members'] != 50:
97
+ raise ValueError('Requires verified released 1.2, actual 50 members')
98
+ for filename, expected in receipt['files_sha256'].items():
99
+ if Path(filename).name != filename or sha(folder/filename) != expected:
100
+ raise ValueError('Immutable forecast file hash mismatch: '+filename)
101
+ candidates = list(folder.glob('*_video.json'))
102
+ if len(candidates) != 1:
103
+ raise ValueError('Expected one exact forecast issue per folder')
104
+ metadata = json.loads(candidates[0].read_text())
105
+ if metadata['observed_csv_sha256'] != csv_hash:
106
+ raise ValueError('IBTrACS file differs from the forecast receipt')
107
+ sid, issue_text = metadata['storm_id'],metadata['issue_time_utc']
108
+ issue = datetime.fromisoformat(issue_text.replace('Z','+00:00'))
109
+ current = rows[sid].get(issue.strftime('%Y-%m-%d %H:%M:%S'))
110
+ if current is None:
111
+ raise ValueError('No exact issue-time initialization report')
112
+ with np.load(folder/'ensemble-members.npz',allow_pickle=False) as z:
113
+ members={k:z[k] for k in z.files}
114
+ with np.load(folder/'weather-history.npz',allow_pickle=False) as z:
115
+ weather,history_times=z['physical_weather'],z['time_ns']
116
+ wanted=np.datetime64(issue_text.replace('Z',''),'ns').astype('int64')+np.arange(-8,1)*6*3600*10**9
117
+ if weather.shape!=(9,8,25,33) or not np.array_equal(history_times,wanted):
118
+ raise ValueError('Nine exact causal analyses required')
119
+ if members['center'].shape!=(50,20,2) or members['basin'].shape!=(50,20,25,33):
120
+ raise ValueError('Wrong actual physical member shapes')
121
+ if members['pressure'].shape!=(50,20) or len(set(members['seeds'].tolist()))!=50:
122
+ raise ValueError('Twenty outputs from fifty distinct seeds required')
123
+ if len(set(metadata['ensemble_policy']['input_sha256']))!=50:
124
+ raise ValueError('Repeated input members are not an ensemble')
125
+ if (len(set(metadata['ensemble_policy']['route_sha256']))!=50
126
+ or len(set(metadata['ensemble_policy']['basin_field_sha256']))!=50):
127
+ raise ValueError('Repeated routes/fields are not fifty physical members')
128
+ lat,lon=contract['global_lat'],contract['global_lon']
129
+ origin=np.array([float(current['LAT']),float(current['LON'])])
130
+ issue_pressure=number(current,'TOKYO_PRES',800,1100)
131
+ recorded=metadata['source_inputs']['issue_observation']
132
+ if recorded['pressure_hpa']!=issue_pressure or not np.allclose([recorded['lat'],recorded['lon']],origin,atol=1e-5,rtol=0):
133
+ raise ValueError('Changed issue-time model inputs')
134
+ with np.load(candidates[0].with_suffix('.npz'),allow_pickle=False) as video:
135
+ if not np.allclose(video['forecast_lat_lon'][0],origin,atol=1e-5,rtol=0):
136
+ raise ValueError('Saved forecast +0 does not match the observed issue origin')
137
+ for member_key,video_key in (('pressure','central_pressure_hpa'),
138
+ ('basin','basin_pressure_hpa'),
139
+ ('regional','regional_pressure_hpa')):
140
+ actual=members[member_key].mean(0,dtype=np.float64).astype('float32')
141
+ if not np.array_equal(actual,video[video_key]):
142
+ raise ValueError('Saved physical fifty-member mean mismatch: '+video_key)
143
+ if not np.array_equal(members['center'].mean(0,dtype=np.float64).astype('float32'),video['forecast_lat_lon'][1:]):
144
+ raise ValueError('Saved member-mean route mismatch')
145
+ initial_ambient=ambient_pressure(weather[-1,0],lat,lon,origin)
146
+ initial=initialize(current,issue_text,initial_ambient['value_hpa'])
147
+ points,raw=[],[]
148
+ for index in range(20):
149
+ diagnostics=[]
150
+ for member in range(50):
151
+ ambient=ambient_pressure(members['basin'][member,index],lat,lon,members['center'][member,index])
152
+ diagnostics.append(diagnose(initial,float(members['pressure'][member,index]),ambient,
153
+ track_valid=bool(members['track_valid'][member,index])))
154
+ summary=summarize(diagnostics,expected_members=50)
155
+ points.append(dict(lead_hours=(index+1)*6,valid_time_utc=utc(issue+timedelta(hours=(index+1)*6)),summary=summary))
156
+ raw.append(diagnostics)
157
+ times=[issue+timedelta(hours=6*i) for i in range(21)]
158
+ obs=observation_series(rows[sid],times)
159
+ case=dict(slug=candidates[0].stem.removesuffix('_video'), name=metadata['storm'],
160
+ sid=sid,issue=issue_text,x=np.arange(0,121,6),obs=obs,
161
+ source_agencies=sorted({r['USA_AGENCY'].strip() or 'missing' for r in rows[sid].values()}),
162
+ model_pressure=np.r_[issue_pressure,members['pressure'].mean(0,dtype=np.float64)],
163
+ auxiliary_wind=np.r_[np.nan,members['vmax'].mean(0,dtype=np.float64)],
164
+ initial=initial,points=points,model={},bands={},metadata=metadata,
165
+ source_folder=str(folder))
166
+ for key in METRICS:
167
+ anchor=initial['input_wind_kt'] if key=='wind_estimate_kt' else (
168
+ initial['rmw_persistence_km'] if key=='rmw_persistence_km' else None)
169
+ # Do NOT hide that estimated absent isotachs at +0 are parametric. Native
170
+ # issue reports appear in the solid official curves, not model anchors.
171
+ case['model'][key]=np.array([anchor]+[p['summary']['estimates'][key]['mean'] for p in points],dtype=float)
172
+ case['bands'][key]=np.array([[np.nan]+[p['summary']['estimates'][key][q] for p in points] for q in ('p10','p90')],dtype=float)
173
+ digest={filename:sha(folder/filename) for filename in receipt['files_sha256']}
174
+ report=dict(model='frozen Trackformer 1.2 pressure + separate experimental structure candidate',
175
+ method=VERSION,storm_id=sid,issue_time_utc=issue_text,actual_members=50,
176
+ checkpoint_sha256=CHECKPOINT,source_forecast_folder=str(folder),
177
+ source_file_sha256=digest,observed_csv_sha256=csv_hash,
178
+ future_labels_used_for_diagnostics=False,initial=initial,initial_ambient=initial_ambient,
179
+ definitions=DEFINITIONS,points=points,member_diagnostics_by_lead=raw,
180
+ official_wind_or_radius_skill_score=None,
181
+ physical_50_member_means_verified=True, observed_plus_zero_alignment_verified=True,
182
+ coverage={key:sum(p['summary']['estimates'][key]['mean'] is not None for p in points) for key in METRICS},
183
+ warning='Retrospective development examples, not untouched tests. RMW is persistence; no validated wind-period calibration.')
184
+ return case,report
185
+
186
+
187
+ def plot_environment(output):
188
+ os.environ.setdefault('MPLCONFIGDIR',str(output/'matplotlib-cache'))
189
+ import matplotlib
190
+ matplotlib.use('Agg')
191
+ import matplotlib.pyplot as plt
192
+ plt.rcParams.update({'font.family':'DejaVu Sans','font.size':10,
193
+ 'axes.spines.top':False,'axes.spines.right':False,'axes.facecolor':'#fbfcfe',
194
+ 'grid.color':'#d9e1ea','axes.edgecolor':'#bbc8d5','savefig.facecolor':'white'})
195
+ return plt
196
+
197
+
198
+ def line(ax,x,y,label,color,*,style='-',band=None):
199
+ ax.plot(x,y,linestyle=style,color=color,lw=2,label=label)
200
+ if band is not None:
201
+ ax.fill_between(x,band[0],band[1],color=color,alpha=.12,lw=0)
202
+
203
+
204
+ def decorate(ax,x,ylabel):
205
+ ax.set(xlabel='Hours after initialization' if max(x)<=120 else 'Hours from first report',
206
+ ylabel=ylabel,xlim=(min(x),max(x) if max(x)>min(x) else min(x)+1))
207
+ ax.grid(alpha=.55)
208
+ ax.legend(fontsize=8,loc='best')
209
+ if not any(np.isfinite(line.get_ydata()).any() for line in ax.lines):
210
+ ax.set_yticks([])
211
+ ax.set_ylim(0,1)
212
+ legend=ax.get_legend()
213
+ if legend is not None: legend.remove()
214
+ ax.text(.5,.5,'No reported/supported data — not zero',ha='center',transform=ax.transAxes,color='#697c8e')
215
+
216
+
217
+ def draw_case(case,output,plt,*,observed_only=False):
218
+ fig,axes=plt.subplots(3,2,figsize=(13,11))
219
+ x,obs=case['x'],case['obs']
220
+ for ax in axes.ravel(): ax.set_axisbelow(True)
221
+ line(axes[0,0],x,obs['pressure'],'JMA pressure',BLACK)
222
+ line(axes[0,1],x,obs['wind_usa'],'USA wind · 1 min',BLACK)
223
+ line(axes[0,1],x,obs['wind_jma'],'JMA wind · 10 min','#9aa7b5',style=':')
224
+ line(axes[1,0],x,obs['rmw'],'Reported USA RMW',BLACK)
225
+ if not observed_only:
226
+ line(axes[0,0],x,case['model_pressure'],'1.2 · actual mean of 50',BLUE)
227
+ line(axes[0,1],x,case['model']['wind_estimate_kt'],'Pressure-driven candidate · 50',RED,
228
+ style='--',band=case['bands']['wind_estimate_kt'])
229
+ line(axes[0,1],x,case['auxiliary_wind'],'Old auxiliary wind · uncalibrated','#3a9071',style=':')
230
+ line(axes[1,0],x,case['model']['rmw_persistence_km'],'RMW persistence ONLY',RED,style='--')
231
+ for t,ax in zip(THRESHOLDS,(axes[1,1],axes[2,0],axes[2,1])):
232
+ for q in QUADRANTS:
233
+ line(ax,x,obs[f'r{t}_{q}'],q+' reported',QC[q])
234
+ if not observed_only:
235
+ key=f'r{t}_{q}_estimate_km'
236
+ line(ax,x,case['model'][key],q+' candidate',QC[q],style='--')
237
+ ax.set_title(f'R{t}: quadrant maximum extent · radius, not diameter',fontsize=11)
238
+ decorate(ax,x,'Radius (km)')
239
+ for ax,title,ylabel in ((axes[0,0],'Central pressure','hPa'),
240
+ (axes[0,1],'Maximum sustained wind · periods kept separate','knots'),
241
+ (axes[1,0],'Reported USA RMW' if observed_only else 'RMW · future candidate is persistence','Radius (km)')):
242
+ ax.set_title(title,fontsize=11)
243
+ decorate(ax,x,ylabel)
244
+ kind='Reported observations only' if observed_only else 'Experimental pressure-driven structure — not a validated wind forecast'
245
+ fig.suptitle(f"{case['name']} | {case['issue'][:10]} UTC\n{kind}",fontsize=18,fontweight='bold',y=.995)
246
+ source='Sources: '+', '.join(case['source_agencies'])
247
+ footer=source+' · blank reports stay missing; native USA quadrants converted nm → km.'
248
+ if not observed_only:
249
+ footer+='\nSolid = reported reference; dashed = candidate. RMW is explicitly held constant. Wind/radius skill scores disabled.'
250
+ fig.text(.06,.012,footer,fontsize=9,color='#52677c')
251
+ fig.tight_layout(rect=(.01,.06,.99,.92),h_pad=2.1)
252
+ filename=case['slug']+'_wind_radius.png'
253
+ fig.savefig(output/filename,dpi=160)
254
+ plt.close(fig)
255
+ return filename
256
+
257
+
258
+ def draw_overview(cases,output,plt):
259
+ cols=min(2,len(cases));rows=(len(cases)+cols-1)//cols
260
+ fig,axes=plt.subplots(rows,cols,figsize=(13,4.5*rows),squeeze=False)
261
+ for ax,case in zip(axes.ravel(),cases):
262
+ x=case['x']
263
+ line(ax,x,case['obs']['wind_usa'],'USA reference · 1 min',BLACK)
264
+ line(ax,x,case['obs']['wind_jma'],'JMA reference · 10 min','#9aa7b5',style=':')
265
+ line(ax,x,case['model']['wind_estimate_kt'],'Pressure-driven candidate · 50',RED,
266
+ style='--',band=case['bands']['wind_estimate_kt'])
267
+ line(ax,x,case['auxiliary_wind'],'Old auxiliary · uncalibrated','#3a9071',style=':')
268
+ ax.set_title(case['name']+' · '+case['issue'][:10],loc='left',fontweight='bold')
269
+ decorate(ax,x,'Wind (knots)')
270
+ for ax in axes.ravel()[len(cases):]: ax.set_visible(False)
271
+ fig.suptitle('All four storms draw wind curves',fontsize=21,fontweight='bold',y=.99)
272
+ fig.text(.5,.94,'Separate experimental pressure-driven estimate; actual 50-member diagnostics. No 1-min calibration or skill claim.',
273
+ ha='center',fontsize=10,color='#52677c')
274
+ fig.text(.06,.012,'Fung-Wong: fresh Mac GPU replay, not the older video forecast. Other three: original saved video members.\n'
275
+ 'USA reports may be provisional (Fung-Wong: TCVitals). No future wind/radius observations enter the candidate.',fontsize=9,color='#52677c')
276
+ fig.tight_layout(rect=(.01,.07,.99,.91),h_pad=2)
277
+ fig.savefig(output/'four_storm_wind_candidate.png',dpi=160)
278
+ plt.close(fig)
279
+
280
+
281
+ def observed_case(sid,rows):
282
+ if not rows:
283
+ raise ValueError('No IBTrACS reports for '+sid)
284
+ stamps=sorted(rows)
285
+ times=[datetime.strptime(t,'%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone.utc) for t in stamps]
286
+ name=rows[stamps[0]]['NAME'].strip() or sid
287
+ return dict(slug=sid+'_observed',name=name,sid=sid,issue=utc(times[0]),
288
+ x=np.array([(t-times[0]).total_seconds()/3600 for t in times]),
289
+ obs=observation_series(rows,times),
290
+ source_agencies=sorted({r['USA_AGENCY'].strip() or 'missing' for r in rows.values()}))
291
+
292
+
293
+ def main():
294
+ parser=argparse.ArgumentParser(description=__doc__)
295
+ parser.add_argument('--ibtracs',type=Path,required=True)
296
+ parser.add_argument('--output',type=Path,required=True)
297
+ parser.add_argument('--forecast-folder',type=Path,action='append',default=[])
298
+ parser.add_argument('--observed-storm',action='append',default=[],help='Any exact WP IBTrACS SID; no inference')
299
+ parser.add_argument('--catalogue-only',action='store_true')
300
+ args=parser.parse_args()
301
+ if not str(args.output.resolve()).startswith('/Volumes/D/'):
302
+ raise ValueError('New artifacts/cache must stay on /Volumes/D')
303
+ args.output.mkdir(parents=True,exist_ok=True)
304
+ selected=set(args.observed_storm)
305
+ for folder in args.forecast_folder:
306
+ paths=list(folder.glob('*_video.json'))
307
+ if len(paths)!=1: raise ValueError('Expected one forecast metadata file')
308
+ selected.add(json.loads(paths[0].read_text())['storm_id'])
309
+ catalogue,rows=read_catalogue(args.ibtracs,selected)
310
+ write_json(args.output/'storm_catalogue.json',dict(scope='IBTrACS Western Pacific, 1970 onward',
311
+ observations_only_not_forecast_coverage=True,storms=catalogue))
312
+ csv_hash=sha(args.ibtracs)
313
+ if args.catalogue_only:
314
+ print(json.dumps(dict(storms=len(catalogue),output=str(args.output/'storm_catalogue.json'))))
315
+ return
316
+ contract=json.loads((ROOT/'models/trackformer_1_2_field/manifest.json').read_text())['data_contract']
317
+ manifest=json.loads((ROOT/'models/trackformer_1_2_field/manifest.json').read_text())
318
+ for filename,expected in manifest['source_module_sha256'].items():
319
+ if sha(ROOT/'models/trackformer_1_2_field'/filename)!=expected:
320
+ raise ValueError('Frozen neural model source changed: '+filename)
321
+ plt=plot_environment(args.output)
322
+ cases,images,reports=[],[],[]
323
+ for folder in args.forecast_folder:
324
+ case,report=load_forecast(folder,rows,contract,csv_hash)
325
+ filename=draw_case(case,args.output,plt)
326
+ report['chart']=filename
327
+ write_json(args.output/(case['slug']+'_structure.json'),report)
328
+ cases.append(case);images.append((case['name'],filename));reports.append(report)
329
+ print(json.dumps(dict(storm=case['name'],wind_leads=report['coverage']['wind_estimate_kt'],
330
+ r34_quadrant_leads={q:report['coverage'][f'r34_{q}_estimate_km'] for q in QUADRANTS})),flush=True)
331
+ for sid in args.observed_storm:
332
+ case=observed_case(sid,rows[sid])
333
+ filename=draw_case(case,args.output,plt,observed_only=True)
334
+ images.append((case['name']+' · observations only',filename))
335
+ if cases:
336
+ draw_overview(cases,args.output,plt)
337
+ images.insert(0,('Wind overview','four_storm_wind_candidate.png'))
338
+ panels=''.join(f'<section><h2>{html.escape(name)}</h2><a href="{html.escape(filename)}"><img src="{html.escape(filename)}" alt="{html.escape(name)} plots"></a></section>' for name,filename in images)
339
+ page='''<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
340
+ <title>Storm wind and radius comparisons</title><style>body{font:16px system-ui;background:#edf2f7;color:#203247;max-width:1280px;margin:40px auto;padding:0 20px}section{background:white;margin:24px 0;padding:18px;border-radius:16px}img{width:100%;height:auto}a{color:#2166b0}p{line-height:1.6}</style>
341
+ <h1>Storm wind &amp; radius plots</h1><p>Solid curves are agency reports. Dashed curves are an experimental pressure-driven candidate, not validated wind forecasts. RMW is persistence only. Blank reports remain missing; reported zero is not a missing value.</p>
342
+ <p>Actual 50-member diagnostics, never a diagnostic of a mean pressure map. Released model weights and original videos are unchanged. Fung-Wong is a separately saved fresh replay. USA quadrants are 1-minute targets, JMA winds are 10-minute references; no cross-period conversion or strict radius skill score.</p>'''
343
+ page+=panels+'<p><a href="storm_catalogue.json">All WP storms: data coverage catalogue</a> · <a href="verification.json">Verification receipt</a></p>'
344
+ (args.output/'index.html').write_text(page)
345
+ receipt=dict(method=VERSION,checkpoint_sha256=CHECKPOINT,storm_count=len(cases),
346
+ observed_only_storms=args.observed_storm,wp_catalogue_storms=len(catalogue),
347
+ observed_csv_sha256=csv_hash,actual_member_count=50 if cases else None,
348
+ future_wind_radius_labels_used_for_candidate=False,
349
+ neural_weights_changed=False,original_forecasts_overwritten=False,
350
+ official_wind_radius_scoring_allowed=False,references=list(REFERENCES),
351
+ charts=[filename for _,filename in images],
352
+ coverage={r['storm_id']:r['coverage'] for r in reports})
353
+ receipt['source_code_sha256']={p.name:sha(p) for p in (Path(__file__),ROOT/'release_tools/storm_structure_diagnostics.py')}
354
+ receipt['output_sha256']={p.name:sha(p) for p in args.output.iterdir() if p.is_file() and p.name!='verification.json'}
355
+ write_json(args.output/'verification.json',receipt)
356
+ print(json.dumps(dict(output=str(args.output/'index.html'),catalogue_storms=len(catalogue))),flush=True)
357
+
358
+
359
+ if __name__=='__main__':
360
+ main()
release_tools/storm_structure_diagnostics.py ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Reusable, unvalidated pressure-driven wind/structure candidate.
2
+
3
+ Not a change to released neural weights or pressure fields. The initialization
4
+ uses ONLY the exact issue-time USA 1-minute wind and reported quadrant radii.
5
+ Future pressure deficits come from each genuine forecast member. An initialized
6
+ outer wind envelope is scaled by sqrt(deficit / issue deficit), motivated by
7
+ gradient-wind/Holland balance. RMW is explicitly PERSISTENCE, not a measured or
8
+ learned future RMW. Missing observations are never invented as reference data.
9
+
10
+ Nominal targets match USA radius units, thresholds and quadrant-max geometry,
11
+ but this candidate has no validated 1-minute/10-m wind calibration. Strict
12
+ official wind/radius skill scores MUST remain disabled.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ from datetime import datetime
17
+ import math
18
+
19
+ import numpy as np
20
+
21
+ VERSION = 'pressure-scaled-issue-structure-experimental-v1'
22
+ QUADRANTS = ('NE', 'SE', 'SW', 'NW')
23
+ THRESHOLDS = (34, 50, 64)
24
+ METRICS = ('wind_estimate_kt', 'rmw_persistence_km') + tuple(
25
+ f'r{t}_{q}_estimate_km' for t in THRESHOLDS for q in QUADRANTS)
26
+ MAX_RADIUS_KM = 1500.0
27
+ REFERENCES = (
28
+ 'https://noaa-ocs-modeling.github.io/PaHM/html/models.html',
29
+ 'https://www.ncei.noaa.gov/sites/default/files/2025-09/IBTrACS_v04r01_column_documentation.pdf',
30
+ )
31
+ DEFINITIONS = dict(
32
+ units='km', quantity_kind='radius_not_diameter',
33
+ thresholds_kt=list(THRESHOLDS), quadrant_order=list(QUADRANTS),
34
+ quadrant_statistic='maximum_extent_within_quadrant',
35
+ target_wind_averaging_seconds=60,
36
+ validated_wind_averaging_seconds=None,
37
+ validated_surface_height_m=None,
38
+ rmw='issue-time reported RMW carried forward unchanged; persistence baseline',
39
+ official_scoring_allowed=False,
40
+ )
41
+
42
+
43
+ def number(row, key, low=0.0, high=10000.0):
44
+ try:
45
+ value = float(row.get(key, '').strip())
46
+ except (TypeError, ValueError, AttributeError):
47
+ return None
48
+ return value if math.isfinite(value) and low <= value <= high else None
49
+
50
+
51
+ def radius_km(row, key, *, rmw=False):
52
+ """IBTrACS USA radii are nautical-mile radii, not diameters."""
53
+ value = number(row, key, 0.001 if rmw else 0.0, 999.0)
54
+ return None if value is None else value * 1.852
55
+
56
+
57
+ def ambient_pressure(field, latitude, longitude, center):
58
+ """Use actual coarse-model cells for ambient pressure, not inner-core size.
59
+
60
+ Median available cells 600..1000 km from the predicted center; require
61
+ >=2 physical cells in each quadrant. Record sample count/coverage. Missing
62
+ quadrants, out-of-domain centers and nonphysical values fail closed.
63
+ """
64
+ p = np.asarray(field, dtype=float)
65
+ lat, lon, c = (np.asarray(a, dtype=float) for a in (latitude, longitude, center))
66
+ if p.shape != (len(lat), len(lon)) or c.shape != (2,):
67
+ raise ValueError('Pressure grid/coordinate shape mismatch')
68
+ if not np.isfinite(c).all() or not (0 < c[0] < 60 and 100 < c[1] < 180):
69
+ return dict(value_hpa=None, status='outside_model_domain', cells=0)
70
+ yy, xx = np.meshgrid(lat, lon, indexing='ij')
71
+ a, b = np.deg2rad(yy-c[0]), np.deg2rad(xx-c[1])
72
+ h = np.sin(a/2)**2 + np.cos(np.deg2rad(yy))*np.cos(np.deg2rad(c[0]))*np.sin(b/2)**2
73
+ distance = 2*6371.0088*np.arcsin(np.sqrt(np.clip(h, 0, 1)))
74
+ mask = (600 <= distance) & (distance <= 1000)
75
+ physical = np.isfinite(p) & (800 <= p) & (p <= 1100)
76
+ qmask = ((yy >= c[0]) & (xx >= c[1]), (yy < c[0]) & (xx >= c[1]),
77
+ (yy < c[0]) & (xx < c[1]), (yy >= c[0]) & (xx < c[1]))
78
+ counts = [int((mask & physical & q).sum()) for q in qmask]
79
+ usable = mask & physical
80
+ result = dict(cells=int(usable.sum()), candidate_cells=int(mask.sum()),
81
+ quadrant_cells=dict(zip(QUADRANTS, counts)),
82
+ annulus_km=[600, 1000], statistic='median_available_physical_cells')
83
+ if min(counts) < 2:
84
+ return dict(result, value_hpa=None, status='insufficient_ambient_coverage')
85
+ return dict(result, value_hpa=float(np.median(p[usable])), status='available')
86
+
87
+
88
+ def initialize(row, issue_time_utc, ambient_hpa):
89
+ """Allowlisted fields from ONE exact issue row; no future labels accepted."""
90
+ issue = datetime.fromisoformat(issue_time_utc.replace('Z', '+00:00'))
91
+ if issue.utcoffset() is None or issue.utcoffset().total_seconds() != 0:
92
+ raise ValueError('Issue time must be UTC')
93
+ if row.get('ISO_TIME') != issue.strftime('%Y-%m-%d %H:%M:%S'):
94
+ raise ValueError('Initialization is not the exact issue-time report')
95
+ # Model pressure is initialized from TOKYO_PRES in the released runner.
96
+ # USA wind/radii are a NEW diagnostic input, not silently injected into the
97
+ # neural issue_intensity tensor, and not obtained from future observations.
98
+ wind = number(row, 'USA_WIND', 0.01, 249.0)
99
+ pressure = number(row, 'TOKYO_PRES', 800.0, 1100.0)
100
+ rmw = radius_km(row, 'USA_RMW', rmw=True)
101
+ pn = float(ambient_hpa) if ambient_hpa is not None else None
102
+ if pn is not None and not (math.isfinite(pn) and 800 <= pn <= 1100):
103
+ raise ValueError('Invalid issue ambient pressure')
104
+ radii = {f'r{t}_{q}': radius_km(row, f'USA_R{t}_{q}')
105
+ for t in THRESHOLDS for q in QUADRANTS}
106
+ deficit = pn-pressure if pn is not None and pressure is not None else None
107
+ b = None
108
+ if wind is not None and deficit is not None and deficit > 1:
109
+ # Fixed literature-motivated shape range, not selected on these storms.
110
+ b = float(np.clip(1.15*math.e*(wind*.514444444444/.8)**2/(deficit*100), 1, 2.5))
111
+ return dict(method=VERSION, storm_id=row.get('SID'), issue_time_utc=issue_time_utc,
112
+ input_wind_kt=wind, input_model_pressure_hpa=pressure,
113
+ ambient_pressure_hpa=pn, pressure_deficit_hpa=deficit,
114
+ rmw_persistence_km=rmw, native_quadrant_radii_km=radii,
115
+ holland_inspired_tail_b=b, source_agency=row.get('USA_AGENCY', '').strip(),
116
+ source_track_type=row.get('TRACK_TYPE', '').strip(),
117
+ usa_reference_center=[number(row, 'USA_LAT', -90, 90), number(row, 'USA_LON', -180, 180)],
118
+ model_origin=[number(row, 'LAT', -90, 90), number(row, 'LON', -180, 180)],
119
+ definitions=DEFINITIONS,
120
+ mixed_agency_initialization='USA 1-minute wind/radii; model TOKYO pressure. No conversion between wind periods.',
121
+ calibration='none; initialization is issue assimilation, not future-target fitting')
122
+
123
+
124
+ def envelope(initial, quadrant):
125
+ """Strictly decreasing outer envelope; expose inconsistent issue reports."""
126
+ vmax, rmw = initial['input_wind_kt'], initial['rmw_persistence_km']
127
+ if vmax is None or rmw is None:
128
+ return None, ['missing_issue_wind_or_rmw']
129
+ points = [(float(rmw), float(vmax))]
130
+ candidates, warnings = [], []
131
+ for t in reversed(THRESHOLDS):
132
+ r = initial['native_quadrant_radii_km'][f'r{t}_{quadrant}']
133
+ if r is None:
134
+ continue
135
+ if r == 0:
136
+ # Reported absence is not a blank. A constant-peak quadrant envelope
137
+ # cannot honor an absent lower isotach: fail closed for this quadrant.
138
+ if t <= vmax:
139
+ return None, [f'reported_zero_r{t}_incompatible_with_constant_peak_envelope']
140
+ continue
141
+ if t >= vmax or r <= rmw:
142
+ warnings.append(f'inconsistent_initial_r{t}_{quadrant}_not_assimilated')
143
+ continue
144
+ candidates.append((r, float(t)))
145
+ for radius, value in sorted(candidates):
146
+ if radius <= points[-1][0] or value >= points[-1][1]:
147
+ warnings.append('nonmonotonic_issue_isotach_not_assimilated')
148
+ else:
149
+ points.append((radius, value))
150
+ return points, warnings
151
+
152
+
153
+ def outer_radius(points, initial_b, initial_threshold):
154
+ """Solve the analytic outer envelope; do not fabricate a grid-edge crossing."""
155
+ if initial_threshold <= 0:
156
+ return None
157
+ if initial_threshold > points[0][1]:
158
+ return 0.0 # complete candidate envelope never reaches the threshold
159
+ for (r0, v0), (r1, v1) in zip(points[:-1], points[1:]):
160
+ if v1 <= initial_threshold <= v0:
161
+ fraction = math.log(initial_threshold/v0)/math.log(v1/v0)
162
+ return math.exp(math.log(r0) + fraction*math.log(r1/r0))
163
+ r, v = points[-1]
164
+ # Holland's far-field wind asymptote V~r^(-B/2); this is an explicit
165
+ # parametric extrapolation, not a native resolved wind or pressure field.
166
+ result = r*(v/initial_threshold)**(2/initial_b)
167
+ return float(result) if result <= MAX_RADIUS_KM else None
168
+
169
+
170
+ def diagnose(initial, pressure_hpa, ambient, *, track_valid=True):
171
+ result = {key: None for key in METRICS}
172
+ result.update(method=VERSION, experimental=True, status='unavailable', warnings=[],
173
+ official_scoring_allowed=False, ambient=ambient)
174
+ if not track_valid or ambient['status'] == 'outside_model_domain':
175
+ result['status'] = 'outside_model_domain_or_invalid_track'
176
+ return result
177
+ wind, d0 = initial['input_wind_kt'], initial['pressure_deficit_hpa']
178
+ if wind is None or d0 is None or d0 <= 1:
179
+ result['status'] = 'missing_issue_wind_or_positive_pressure_deficit'
180
+ return result
181
+ if ambient['value_hpa'] is None or not math.isfinite(pressure_hpa) or not 800 <= pressure_hpa <= 1100:
182
+ result['status'] = 'missing_physical_model_pressure'
183
+ return result
184
+ future_deficit = ambient['value_hpa']-pressure_hpa
185
+ if future_deficit <= 0:
186
+ result['status'] = 'model_has_no_positive_vortex_pressure_deficit'
187
+ return result
188
+ scale = math.sqrt(future_deficit/d0)
189
+ predicted_wind = wind*scale
190
+ if not math.isfinite(predicted_wind) or predicted_wind >= 250:
191
+ result['status'] = 'wind_outside_candidate_physical_range'
192
+ return result
193
+ result.update(wind_estimate_kt=float(predicted_wind), status='experimental_issue_anchored_estimate',
194
+ pressure_deficit_hpa=float(future_deficit), pressure_scaling=float(scale),
195
+ rmw_persistence_km=initial['rmw_persistence_km'])
196
+ for quadrant in QUADRANTS:
197
+ points, warnings = envelope(initial, quadrant)
198
+ result['warnings'] += warnings
199
+ if points is None:
200
+ continue # wind remains usable even if structure was not observed
201
+ for threshold in THRESHOLDS:
202
+ radius = outer_radius(points, initial['holland_inspired_tail_b'], threshold/scale)
203
+ result[f'r{threshold}_{quadrant}_estimate_km'] = radius
204
+ if radius is None:
205
+ result['warnings'].append(f'r{threshold}_{quadrant}_beyond_{MAX_RADIUS_KM:g}_km_candidate_range')
206
+ return result
207
+
208
+
209
+ def summarize(members, *, expected_members):
210
+ if len(members) != expected_members or expected_members < 1:
211
+ raise ValueError('Actual member diagnostics do not match the claimed count')
212
+ summary = dict(method=VERSION, members=len(members), definitions=DEFINITIONS,
213
+ aggregation='diagnose each physical forecast member then equal-weight mean',
214
+ estimates={}, official_scoring_allowed=False)
215
+ for key in METRICS:
216
+ values = [m[key] for m in members if m[key] is not None and math.isfinite(m[key])]
217
+ complete = len(values) == expected_members
218
+ summary['estimates'][key] = dict(
219
+ mean=float(np.mean(values)) if complete else None,
220
+ p10=float(np.quantile(values, .1)) if complete else None,
221
+ p90=float(np.quantile(values, .9)) if complete else None,
222
+ valid_members=len(values), total_members=expected_members)
223
+ return summary
224
+
225
+
226
+ def official_radius_mae(*_args, **_kwargs):
227
+ raise ValueError('Strict official scoring blocked: no validated surface-wind averaging-period calibration; RMW is persistence')
release_tools/test_intensity_benchmark.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import unittest
2
+ from benchmark_intensity_v12_v11 import aggregate, common_errors, initial_available
3
+
4
+
5
+ class IntensityProtocolTests(unittest.TestCase):
6
+ def test_initial_missing_pressure_is_not_filled(self):
7
+ self.assertFalse(initial_available([40, 0]))
8
+ self.assertFalse(initial_available([float('nan'), 990]))
9
+ self.assertTrue(initial_available([0, 1000]))
10
+
11
+ def test_common_masks_retain_zero_wind(self):
12
+ result = common_errors([0, 2, 3], [1, float('nan'), 4], [0, 1, None], low=0, high=249)
13
+ self.assertEqual(result, {'1.1': [0., None, None], '1.2': [1., None, None]})
14
+
15
+ def test_equal_storm_not_equal_issue(self):
16
+ rows = []
17
+ for sid, old, new in [('a', 10, 4), ('a', 10, 4), ('b', 20, 12)]:
18
+ rows.append({'storm_id': sid, 'errors': {'p': {'1.1': [old]*20, '1.2': [new]*20}}})
19
+ report = aggregate(rows, 'p')
20
+ self.assertEqual(report['models']['1.1']['equal_storm_mae'], 15)
21
+ self.assertEqual(report['models']['1.2']['equal_storm_mae'], 8)
22
+ self.assertEqual(report['valid_daily_issues'], 3)
23
+
24
+ def test_missing_leads_remain_unavailable(self):
25
+ report = aggregate([{'storm_id': 'a', 'errors': {'p': {'1.1': [1]+[None]*19, '1.2': [2]+[None]*19}}}], 'p')
26
+ self.assertEqual(report['models']['1.1']['equal_storm_mae_by_lead'], [1]+[None]*19)
27
+ self.assertEqual(report['paired_issue_leads_by_lead'], [1]+[0]*19)
28
+
29
+
30
+ if __name__ == '__main__':
31
+ unittest.main()
release_tools/test_intensity_curves.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Score definitions and coverage guards, with no model inference."""
2
+ import unittest
3
+ from plot_intensity_benchmark import aggregate_daily, curve_scores
4
+
5
+
6
+ class CurveTests(unittest.TestCase):
7
+ def test_bias_is_not_shape_accuracy(self):
8
+ scores, coverage = curve_scores({'1.1': [1,2,3,4,5,6], '1.2': [11,12,13,14,15,16]},
9
+ [1,2,3,4,5,6], low=0, high=200)
10
+ self.assertEqual(scores['1.2']['mae'], 10)
11
+ self.assertAlmostEqual(scores['1.2']['shape_error'], 0)
12
+ self.assertEqual(scores['1.2']['trend_error'], 0)
13
+ self.assertEqual(coverage['valid_adjacent_steps'], 5)
14
+
15
+ def test_missing_never_zero_or_jump(self):
16
+ scores, coverage = curve_scores({'1.1': [1,2,3,4,5,6], '1.2': [1,None,3,4,None,6]},
17
+ [1,2,3,4,5,6], low=0, high=200)
18
+ self.assertEqual(coverage['valid_leads'], 4)
19
+ self.assertEqual(coverage['valid_adjacent_steps'], 1)
20
+ self.assertIsNone(scores['1.1']['shape_error'])
21
+ self.assertEqual(scores['1.1']['mae'], scores['1.2']['mae'])
22
+
23
+ def test_flat_not_perfect_shape(self):
24
+ scores, _ = curve_scores({'1.1': [1]*6, '1.2': [1,2,3,4,5,6]}, [1]*6, low=0, high=200)
25
+ self.assertIsNone(scores['1.1']['shape_error'])
26
+ self.assertIsNone(scores['1.2']['shape_error'])
27
+ self.assertEqual(scores['1.1']['trend_error'], 0)
28
+ self.assertEqual(scores['1.2']['trend_error'], 1)
29
+
30
+ def test_opposite_curves(self):
31
+ scores, _ = curve_scores({'1.1': [1,2,3,4,5,6], '1.2': [6,5,4,3,2,1]}, [1,2,3,4,5,6], low=0, high=200)
32
+ self.assertAlmostEqual(scores['1.2']['shape_error'], 1)
33
+ self.assertEqual(scores['1.2']['trend_error'], 1)
34
+
35
+ def test_daily_then_equal_storm(self):
36
+ records = [{'storm_id':'long','models':{'1.1':{'mae':0},'1.2':{'mae':10}}} for _ in range(10)]
37
+ records += [{'storm_id':'short','models':{'1.1':{'mae':100},'1.2':{'mae':100}}}]
38
+ scores = aggregate_daily(records)['mae']
39
+ self.assertEqual(scores['models']['1.1']['equal_storm_mean'], 50)
40
+ self.assertEqual(scores['models']['1.2']['equal_storm_mean'], 55)
41
+ self.assertEqual(scores['valid_daily_issues'], 11)
42
+ self.assertEqual(scores['valid_storms'], 2)
43
+
44
+
45
+ if __name__ == '__main__':
46
+ unittest.main()
release_tools/test_storm_structure_diagnostics.py ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import copy
2
+ import unittest
3
+
4
+ import numpy as np
5
+
6
+ from forecast_historical_video50_mac import requested_cases, exact_history_indices
7
+ from storm_structure_diagnostics import (
8
+ initialize, radius_km, envelope, outer_radius, diagnose, summarize,
9
+ ambient_pressure, official_radius_mae, THRESHOLDS, QUADRANTS, METRICS,
10
+ )
11
+
12
+
13
+ class StormStructureTests(unittest.TestCase):
14
+ def row(self):
15
+ row = dict(SID='2015211N13162', ISO_TIME='2015-08-05 00:00:00',
16
+ USA_WIND='100', TOKYO_PRES='950', USA_RMW='20',
17
+ LAT='20', LON='135', USA_LAT='20', USA_LON='135',
18
+ USA_AGENCY='jtwc_wp', TRACK_TYPE='main')
19
+ for t, r in ((34, 140), (50, 80), (64, 50)):
20
+ for i, q in enumerate(QUADRANTS):
21
+ row[f'USA_R{t}_{q}'] = str(r+i*5)
22
+ return row
23
+
24
+ def initial(self, row=None):
25
+ return initialize(row or self.row(), '2015-08-05T00:00:00Z', 1010)
26
+
27
+ def member(self, cp=950, initial=None):
28
+ return diagnose(initial or self.initial(), cp, {'value_hpa':1010, 'status':'available'})
29
+
30
+ def test_nautical_miles_are_radius_not_diameter(self):
31
+ self.assertAlmostEqual(radius_km({'USA_RMW':'12'}, 'USA_RMW', rmw=True), 22.224)
32
+ self.assertEqual(radius_km({'USA_R34_NE':'0'}, 'USA_R34_NE'), 0)
33
+ self.assertIsNone(radius_km({'USA_R34_NE':''}, 'USA_R34_NE'))
34
+ self.assertIsNone(radius_km({'USA_RMW':'0'}, 'USA_RMW', rmw=True))
35
+
36
+ def test_exact_issue_only_and_no_future_influence(self):
37
+ before = self.initial()
38
+ row = self.row()
39
+ row.update(future_wind='999', future_r34='1', USA_EYE='700', TOKYO_R30_LONG='900')
40
+ self.assertEqual(before, self.initial(row))
41
+ row['ISO_TIME'] = '2015-08-05 06:00:00'
42
+ with self.assertRaises(ValueError):
43
+ self.initial(row)
44
+
45
+ def test_native_quadrant_isotachs_initialized_without_rms_or_period_conversion(self):
46
+ initial = self.initial()
47
+ for q in QUADRANTS:
48
+ points, warnings = envelope(initial, q)
49
+ self.assertEqual(warnings, [])
50
+ for t in THRESHOLDS:
51
+ self.assertAlmostEqual(outer_radius(points, initial['holland_inspired_tail_b'], t),
52
+ initial['native_quadrant_radii_km'][f'r{t}_{q}'])
53
+ result = self.member()
54
+ self.assertNotEqual(result['r34_NE_estimate_km'], result['r34_SW_estimate_km'])
55
+ self.assertEqual(initial['definitions']['target_wind_averaging_seconds'], 60)
56
+ self.assertIsNone(initial['definitions']['validated_wind_averaging_seconds'])
57
+
58
+ def test_pressure_drives_future_and_does_not_change_rmw_persistence(self):
59
+ initial = self.initial()
60
+ before = copy.deepcopy(initial)
61
+ weak, strong = self.member(980, initial), self.member(900, initial)
62
+ self.assertGreater(strong['wind_estimate_kt'], weak['wind_estimate_kt'])
63
+ self.assertGreater(strong['r34_NE_estimate_km'], weak['r34_NE_estimate_km'])
64
+ self.assertEqual(strong['rmw_persistence_km'], weak['rmw_persistence_km'])
65
+ self.assertEqual(initial, before)
66
+
67
+ def test_missing_rmw_does_not_block_wind_or_invent_a_radius(self):
68
+ row = self.row()
69
+ row['USA_RMW'] = ''
70
+ result = self.member(initial=self.initial(row))
71
+ self.assertIsNotNone(result['wind_estimate_kt'])
72
+ self.assertIsNone(result['rmw_persistence_km'])
73
+ self.assertTrue(all(result[f'r{t}_{q}_estimate_km'] is None for t in THRESHOLDS for q in QUADRANTS))
74
+
75
+ def test_below_threshold_is_candidate_zero_not_missing_reference(self):
76
+ result = self.member(1005)
77
+ self.assertLess(result['wind_estimate_kt'], 34)
78
+ self.assertEqual(result['r34_NE_estimate_km'], 0)
79
+ self.assertIsNone(outer_radius([(30, 100)], 1, 1)) # no last-edge substitute
80
+
81
+ def test_missing_zero_or_inconsistent_initial_quadrant_is_visible(self):
82
+ row = self.row()
83
+ row['USA_R34_NE'] = '0'
84
+ result = self.member(initial=self.initial(row))
85
+ self.assertIsNone(result['r34_NE_estimate_km'])
86
+ self.assertIsNotNone(result['r34_SE_estimate_km'])
87
+ self.assertIn('reported_zero', result['warnings'][0])
88
+ row['USA_R34_NE'] = '1'
89
+ points, warnings = envelope(self.initial(row), 'NE')
90
+ self.assertTrue(any('inconsistent' in w for w in warnings))
91
+ self.assertTrue(points)
92
+
93
+ def test_missing_pressure_invalid_tracks_do_not_create_wind(self):
94
+ initial = self.initial()
95
+ for cp, ambient, valid in ((np.nan, {'value_hpa':1010, 'status':'available'}, True),
96
+ (950, {'value_hpa':None, 'status':'insufficient_ambient_coverage'}, True),
97
+ (950, {'value_hpa':1010, 'status':'available'}, False)):
98
+ result = diagnose(initial, cp, ambient, track_valid=valid)
99
+ self.assertTrue(all(result[k] is None for k in METRICS))
100
+
101
+ def test_true_member_mean_noncommutativity_and_partial_members(self):
102
+ a, b = self.member(980), self.member(900)
103
+ result = summarize([a,b], expected_members=2)['estimates']['wind_estimate_kt']
104
+ self.assertAlmostEqual(result['mean'], (a['wind_estimate_kt']+b['wind_estimate_kt'])/2)
105
+ self.assertNotAlmostEqual(result['mean'], self.member(940)['wind_estimate_kt'], places=3)
106
+ broken = dict(a, wind_estimate_kt=None)
107
+ result = summarize([a]*49+[broken], expected_members=50)['estimates']['wind_estimate_kt']
108
+ self.assertIsNone(result['mean'])
109
+ self.assertEqual(result['valid_members'],49)
110
+ with self.assertRaises(ValueError):
111
+ summarize([a,b], expected_members=50)
112
+
113
+ def test_ambient_uses_physical_grid_cells_and_fails_closed_at_domain(self):
114
+ lat, lon = np.linspace(60,0,25), np.linspace(100,180,33)
115
+ p = np.full((25,33),1010.)
116
+ before = p.copy()
117
+ result = ambient_pressure(p,lat,lon,[20,135])
118
+ self.assertEqual(result['value_hpa'],1010)
119
+ self.assertGreaterEqual(min(result['quadrant_cells'].values()),2)
120
+ self.assertIsNone(ambient_pressure(p,lat,lon,[20,181])['value_hpa'])
121
+ self.assertIsNone(ambient_pressure(p*np.nan,lat,lon,[20,135])['value_hpa'])
122
+ np.testing.assert_array_equal(p,before)
123
+
124
+ def test_strict_skill_gate_not_bypassed_by_matching_units_or_targets(self):
125
+ with self.assertRaisesRegex(ValueError,'calibration'):
126
+ official_radius_mae(self.member(),self.row())
127
+
128
+ def test_generic_forecast_case_validation_and_causal_exact_history(self):
129
+ cases=requested_cases(None,[['nari','2001248N22135','2001-09-08T00:00:00Z']])
130
+ self.assertEqual(len(cases),1)
131
+ for slug, sid, issue in (('../bad','2001248N22135','2001-09-08T00:00:00Z'),
132
+ ('nari','wrong','2001-09-08T00:00:00Z'),
133
+ ('nari','2001248N22135','2001-09-08T03:00:00Z')):
134
+ with self.assertRaises(ValueError):
135
+ requested_cases(None,[[slug,sid,issue]])
136
+ hour=3600*10**9
137
+ end=np.datetime64('2001-09-08T00:00:00','ns').astype('int64')
138
+ times=end+np.arange(-8,2)*6*hour
139
+ indices=exact_history_indices(times,'2001-09-08T00:00:00Z')
140
+ self.assertEqual(int(times[indices[-1]]),end)
141
+ with self.assertRaises(ValueError):
142
+ exact_history_indices(np.delete(times,4),'2001-09-08T00:00:00Z')
143
+
144
+
145
+ if __name__=='__main__':
146
+ unittest.main()