Current task: —

E-022-spectral-measure.py

Experiments: E-022 · script updated 08-19-2026

E-022-spectral-measure.csv — 153.1 KB, updated 08-19-2026

← prev page 7 of 8 · 500/page · 3815 rows next →
# akz_kw_k
3002 12 331 86.823139299568 4.2140675104e-02
3003 12 332 87.090701585546 4.3429888731e-02
3004 12 333 87.420081740543 1.0109573697e+00
3005 12 334 87.559501372310 6.7517496083e-02
3006 12 335 87.853741124171 4.3855379319e-02
3007 12 336 88.123635160426 4.3363751454e-02
3008 12 337 88.393541478326 4.3715277445e-02
3009 12 338 88.703759392075 9.2506600461e-02
3010 12 339 88.816242582357 9.8459902791e-01
3011 12 340 89.153954940160 4.3951104436e-02
3012 12 341 89.423031484350 4.2280805155e-02
3013 12 342 89.687237422757 4.2164144497e-02
3014 12 343 89.950173950117 4.2733173490e-02
3015 12 344 90.214880226947 4.1930898594e-02
3016 12 345 90.476831966616 4.2171758838e-02
3017 12 346 90.741191099704 4.1953297904e-02
3018 12 347 91.003346838168 4.1818964969e-02
3019 12 348 91.266439065908 4.3089047476e-02
3020 12 349 91.530423235523 4.2120443808e-02
3021 12 350 91.794630845186 4.2391429559e-02
3022 12 351 92.062426979810 4.3012125933e-02
3023 12 352 92.355626037395 6.5940882159e-02
3024 12 353 92.497014127160 1.0125805510e+00
3025 12 354 92.822581894913 4.3641814598e-02
3026 12 355 93.090817353011 4.2457048101e-02
3027 12 356 93.355680101012 4.2276687247e-02
3028 12 357 93.619249213204 4.1807323149e-02
3029 12 358 93.883985448209 4.2497336054e-02
3030 12 359 94.145719848625 4.1834926878e-02
3031 12 360 94.412471561173 4.3060097926e-02
3032 12 361 94.652150195305 1.0414109332e+00
3033 12 362 94.934500593571 4.2362520619e-02
3034 12 363 95.200022395022 4.2536374296e-02
3035 12 364 95.470650125224 4.4426230831e-02
3036 12 365 95.789525322895 1.3824931231e-01
3037 12 366 95.880534596935 9.3864176339e-01
3038 12 367 96.223516584175 4.3836005038e-02
3039 12 368 96.492866940371 4.2362980502e-02
3040 12 369 96.757326878538 4.2337252214e-02
3041 12 370 97.021507436049 4.1871622423e-02
3042 12 371 97.285104176025 4.2206802901e-02
3043 12 372 97.545171575926 4.2867827713e-02
3044 12 373 97.810527566672 4.1832779387e-02
3045 12 374 98.073491739068 4.2082702625e-02
3046 12 375 98.336877720916 4.2268430131e-02
3047 12 376 98.600231303961 4.3516024527e-02
3048 12 377 98.832372197080 1.0404851387e+00
3049 12 378 99.118178026203 4.2029271983e-02
3050 12 379 99.383944916250 4.2278869738e-02
3051 12 380 99.646380904092 4.1917254194e-02
3052 12 381 99.910189075734 4.3290004904e-02
3053 12 382 100.172140318594 4.2185814488e-02
3054 12 383 100.434860336703 4.3818876143e-02
3055 12 384 100.701052122939 4.2563549387e-02
3056 12 385 100.971134676867 4.3658034735e-02
3057 12 386 101.309772398322 9.7009786224e-01
3058 12 387 101.413648639176 1.0658891535e-01
3059 12 388 101.727576185757 4.3620026552e-02
3060 12 389 101.996280975846 4.2939773590e-02
3061 12 390 102.261796735669 4.2053060475e-02
3062 12 391 102.525497919533 4.2442186715e-02
3063 12 392 102.790908888062 4.2184532915e-02
3064 12 393 103.056754199018 4.3104050329e-02
3065 12 394 103.322898261323 4.4835546805e-02
3066 12 395 103.647936870918 1.4697043052e-01
3067 12 396 103.735850464417 9.2946576423e-01
3068 12 397 104.080725076004 4.4177967081e-02
3069 12 398 104.350873282885 4.3866811060e-02
3070 12 399 104.614287655375 4.2505334921e-02
3071 12 400 104.879480956550 4.2445472511e-02
3072 12 401 105.145231976626 4.2455850149e-02
3073 12 402 105.444746028658 1.0381882371e+00
3074 12 403 105.658415794233 4.4181469543e-02
3075 12 404 105.924642913748 4.3609391317e-02
3076 12 405 106.189758204359 4.2394081471e-02
3077 12 406 106.456025631231 4.2668605984e-02
3078 12 407 106.722953207662 4.4405234838e-02
3079 12 408 107.001463331815 5.2485210143e-02
3080 12 409 107.172182388812 1.0273542570e+00
3081 12 410 107.489081376548 4.3224216815e-02
3082 12 411 107.756376623518 4.2686333820e-02
3083 12 412 108.021712508839 4.2138150338e-02
3084 12 413 108.281808066565 4.3684508227e-02
3085 12 414 108.546104695668 4.1910894825e-02
3086 12 415 108.809501750446 4.2355520830e-02
3087 12 416 109.071129744767 4.2197690514e-02
3088 12 417 109.336812228265 4.2066793566e-02
3089 12 418 109.599506123898 4.2106818841e-02
3090 12 419 109.863512452589 4.2277460825e-02
3091 12 420 110.125750979452 4.4013923665e-02
3092 12 421 110.390808198797 4.3307130271e-02
3093 12 422 110.664356426974 4.5492248808e-02
3094 12 423 111.010967988464 7.5478493216e-01
3095 12 424 111.075289884194 3.2195600423e-01
3096 12 425 111.420300113984 4.5007298090e-02
3097 12 426 111.708797446884 5.4343320140e-02
3098 12 427 111.878405950429 1.0264751525e+00
3099 12 428 112.198321341904 4.3445675952e-02
3100 12 429 112.466608908016 4.2757515825e-02
3101 12 430 112.732711866276 4.3055133364e-02
3102 12 431 112.990522538314 4.2543164302e-02
3103 12 432 113.255041873463 4.2891702605e-02
3104 12 433 113.518070770035 4.2087642432e-02
3105 12 434 113.782967708936 4.2504489741e-02
3106 12 435 114.046347360442 4.1953465437e-02
3107 12 436 114.319714215613 1.0416513617e+00
3108 12 437 114.572979678826 4.3900987308e-02
3109 12 438 114.830798549463 4.2513887051e-02
3110 12 439 115.094614301704 4.2015394560e-02
3111 12 440 115.360684737231 4.2721780854e-02
3112 12 441 115.625744566681 4.4772482896e-02
3113 12 442 115.890702080969 4.3958727727e-02
3114 12 443 116.221290044452 1.0087010960e+00
3115 12 444 116.357222720003 6.9579915819e-02
3116 12 445 116.656559598283 4.4921863329e-02
3117 12 446 116.918788372330 4.3335308104e-02
3118 12 447 117.182254886283 4.2533885044e-02
3119 12 448 117.446763344024 4.1648847299e-02
3120 12 449 117.709127950803 4.2652728842e-02
3121 12 450 117.975570658713 4.4098653772e-02
3122 12 451 118.234599646673 4.3141476241e-02
3123 12 452 118.498214362909 4.2657625303e-02
3124 12 453 118.789472265912 1.0397198046e+00
3125 12 454 119.017055506327 4.3178969423e-02
3126 12 455 119.282787308213 4.2332021850e-02
3127 12 456 119.541637919718 4.5174317775e-02
3128 12 457 119.807168616737 4.2494368014e-02
3129 12 458 120.068135965219 4.2095358513e-02
3130 12 459 120.330169191173 4.1795724114e-02
3131 12 460 120.592506331058 4.2274840137e-02
3132 12 461 120.856471227148 4.1758851234e-02
3133 12 462 121.116718053275 4.2322100608e-02
3134 12 463 121.370560596385 1.0415355367e+00
3135 12 464 121.642314276775 4.2560126629e-02
3136 12 465 121.900393610070 4.4658527556e-02
3137 12 466 122.167418260972 4.2506785482e-02
3138 12 467 122.428023316252 4.2604286564e-02
3139 12 468 122.691520214850 4.2420726339e-02
3140 12 469 122.946934347194 1.0455003292e+00
3141 12 470 123.216103505339 4.2457027350e-02
3142 12 471 123.478871597234 4.1449463532e-02
3143 12 472 123.743217441767 4.5037541287e-02
3144 12 473 123.999642396326 4.2407420674e-02
3145 12 474 124.257029724921 1.0415667120e+00
3146 12 475 124.525487522856 4.3299281834e-02
3147 12 476 124.786923138784 4.1767712784e-02
3148 12 477 125.050386794542 4.1874904578e-02
3149 12 478 125.311385440334 4.2606935451e-02
3150 12 479 125.575859899888 4.1701205930e-02
3151 12 480 125.839246759542 4.2700303196e-02
3152 12 481 126.095318037630 4.6413119097e-02
3153 12 482 126.363402092937 4.1885420301e-02
3154 12 483 126.631653046967 4.5981685358e-02
3155 12 484 126.889659779539 4.3118844846e-02
3156 12 485 127.160350927459 4.4075754065e-02
3157 12 486 127.505648254499 9.1703511518e-01
3158 12 487 127.590145517126 1.6052602075e-01
3159 12 488 127.920226921638 4.6706813816e-02
3160 12 489 128.179845394763 4.3630144223e-02
3161 12 490 128.447835975986 4.3489636304e-02
3162 12 491 128.713692497093 4.2431687688e-02
3163 12 492 128.979064916492 4.2875117354e-02
3164 12 493 129.246718228197 4.3389653277e-02
3165 12 494 129.573890267366 1.0157839106e+00
3166 12 495 129.721399874317 6.8203315308e-02
3167 12 496 130.010242126677 4.3581165804e-02
3168 12 497 130.278867238550 4.2383013259e-02
3169 12 498 130.543142307456 4.3297215254e-02
3170 12 499 130.806984266074 4.2393950380e-02
3171 12 500 131.086897443860 1.0414481131e+00
3172 12 501 131.328624629474 4.2560475928e-02
3173 12 502 131.593884903692 4.2440942679e-02
3174 12 503 131.860500556436 4.7366459258e-02
3175 12 504 132.117214983634 4.2347759828e-02
3176 12 505 132.380968769721 4.2179837126e-02
3177 12 506 132.645153990947 4.2835768999e-02
3178 12 507 132.914632658494 4.6790523999e-02
3179 12 508 133.175941998080 4.4091884224e-02
3180 12 509 133.494046576908 1.0254156803e+00
3181 12 510 133.661213680695 5.4208811970e-02
3182 12 511 133.944508225829 4.3313077860e-02
3183 12 512 134.213376469926 4.4333974164e-02
3184 12 513 134.465732848866 4.6222375360e-02
3185 12 514 134.755405414802 1.0411631722e+00
3186 12 515 134.994909375054 4.8090799406e-02
3187 12 516 135.256563592173 4.3703026507e-02
3188 12 517 135.520372384796 4.2068439886e-02
3189 12 518 135.783099878098 4.2329860140e-02
3190 12 519 136.044329936328 4.3124048050e-02
3191 12 520 136.309197951228 4.2329233216e-02
3192 12 521 136.572358056631 4.2317057934e-02
3193 12 522 136.841013250474 4.6438624505e-02
3194 12 523 137.091135579635 4.3109865880e-02
3195 12 524 137.354728041378 4.2293645025e-02
3196 12 525 137.620734214348 4.3027530722e-02
3197 12 526 137.882925519249 4.3223945860e-02
3198 12 527 138.117134382447 1.0408845496e+00
3199 12 528 138.404842901264 4.2871083932e-02
3200 12 529 138.666562752156 4.8538144165e-02
3201 12 530 138.928221446001 4.3203183757e-02
3202 12 531 139.192953645986 4.1986613443e-02
3203 12 532 139.452327017577 4.2452226248e-02
3204 12 533 139.735543403859 1.0422732562e+00
3205 12 534 139.973060937045 4.9971900951e-02
3206 12 535 140.243389515123 4.2728478999e-02
3207 12 536 140.510267606561 4.2868168520e-02
3208 12 537 140.777729841631 4.3600923417e-02
3209 12 538 141.115880165399 9.7433131357e-01
3210 12 539 141.221836808908 1.0354376551e-01
3211 12 540 141.533212598578 4.4655987081e-02
3212 12 541 141.798479975295 5.0017584047e-02
3213 12 542 142.069227990350 4.2696365640e-02
3214 12 543 142.331009515607 4.2254609365e-02
3215 12 544 142.596762686326 4.4036348029e-02
3216 12 545 142.847538898858 4.8095031777e-02
3217 12 546 143.111992669558 1.0433876169e+00
3218 12 547 143.379341057097 4.1558210675e-02
3219 12 548 143.642017730637 4.2955173082e-02
3220 12 549 143.905337893415 4.2073297440e-02
3221 12 550 144.167590199129 4.2574185527e-02
3222 12 551 144.436103590782 4.9754753921e-02
3223 12 552 144.690645901842 4.3895433458e-02
3224 12 553 144.951949046361 4.1279130381e-02
3225 12 554 145.217801836844 4.3597016372e-02
3226 12 555 145.480308238236 5.0425878555e-02
3227 12 556 145.744869353558 4.2783082785e-02
3228 12 557 146.001195895144 1.0433111547e+00
3229 12 558 146.266776016572 4.2347938758e-02
3230 12 559 146.526265557414 5.0772998490e-02
3231 12 560 146.794196215397 4.4647432169e-02
3232 12 561 147.065912040503 4.3585026007e-02
3233 12 562 147.411733476676 9.1856139434e-01
3234 12 563 147.497430446166 1.6037852493e-01
3235 12 564 147.822235727592 4.4136755704e-02
3236 12 565 148.091487442600 4.3088034831e-02
3237 12 566 148.355851600051 4.2926016960e-02
3238 12 567 148.623398852185 4.2232632801e-02
3239 12 568 148.886206137292 4.3987212527e-02
3240 12 569 149.147814412728 4.3045286691e-02
3241 12 570 149.409200331695 5.2501990450e-02
3242 12 571 149.686202268174 4.4733902780e-02
3243 12 572 150.037011295907 8.1469442059e-01
3244 12 573 150.110527733663 2.6947889432e-01
3245 12 574 150.432757629176 4.6465568791e-02
3246 12 575 150.713924850876 4.6318351756e-02
3247 12 576 150.927262209652 1.0392621603e+00
3248 12 577 151.229306058172 4.3753433246e-02
3249 12 578 151.504316518380 5.1435330673e-02
3250 12 579 151.755635658984 4.3406820887e-02
3251 12 580 152.019677497349 4.3619460552e-02
3252 12 581 152.286917657086 4.3488482414e-02
3253 12 582 152.556186595329 4.5063505366e-02
3254 12 583 152.804675084211 5.1775582453e-02
3255 12 584 153.026558088956 1.0386125672e+00
3256 12 585 153.327142810344 4.3867054440e-02
3257 12 586 153.593898326452 4.2336789404e-02
3258 12 587 153.856213854492 4.3978109181e-02
3259 12 588 154.120654617969 4.4405622194e-02
3260 12 589 154.396650762868 5.0205120661e-02
3261 12 590 154.636727925728 4.5785592217e-02
3262 12 591 154.903844951245 4.2736411806e-02
3263 12 592 155.173781962288 4.3668872122e-02
3264 12 593 155.448520362082 5.2056399297e-02
3265 12 594 155.697753878196 4.5295009260e-02
3266 12 595 156.014731528088 1.0764716691e-01
3267 12 596 156.120897140379 9.7310770565e-01
3268 12 597 156.464029335222 4.4212521832e-02
3269 12 598 156.731947346799 4.3378934089e-02
3270 12 599 156.999948240122 4.3416758221e-02
3271 12 600 157.273492903656 4.5575940882e-02
3272 12 601 157.592048008507 1.0271308706e+00
3273 12 602 157.741259448593 6.5911110531e-02
3274 12 603 158.036226893978 4.4807267152e-02
3275 12 604 158.301485435661 4.3334952639e-02
3276 12 605 158.568586446863 4.4230137068e-02
3277 12 606 158.848233962302 1.0513649512e+00
3278 12 607 159.085276068788 4.6255488301e-02
3279 12 608 159.348104079540 4.2650361306e-02
3280 12 609 159.613515164015 4.2560999937e-02
3281 12 610 159.876345861561 4.3110989426e-02
3282 12 611 160.139977414470 4.2125837562e-02
3283 12 612 160.403352319579 4.4130100465e-02
3284 12 613 160.669313834312 4.2304324124e-02
3285 12 614 160.915687480713 5.5240651329e-02
3286 12 615 161.188861327350 1.0433529514e+00
3287 12 616 161.451876277485 4.2711613129e-02
3288 12 617 161.722489630210 5.8652471914e-02
3289 12 618 161.978183079752 4.2972794061e-02
3290 12 619 162.242326823552 4.3666057941e-02
3291 12 620 162.514684107043 4.9416064052e-02
3292 12 621 162.748470838879 5.0975718662e-02
3293 12 622 163.030345396179 1.0424169157e+00
3294 12 623 163.286510259899 4.3848537036e-02
3295 12 624 163.548599882959 4.2095337895e-02
3296 12 625 163.814148827383 4.3462415562e-02
3297 12 626 164.081923880406 4.6380344323e-02
3298 12 627 164.320479281269 5.4879687719e-02
3299 12 628 164.597888160058 4.5841853232e-02
3300 12 629 164.866515748368 4.3836412609e-02
3301 12 630 165.135712072886 4.4264663255e-02
3302 12 631 165.459726732213 1.5173406141e-01
3303 12 632 165.547665135002 9.2674047061e-01
3304 12 633 165.894436028583 4.5797458982e-02
3305 12 634 166.176364923958 5.6584659994e-02
3306 12 635 166.413258815998 4.6399361630e-02
3307 12 636 166.685445466355 4.3533466441e-02
3308 12 637 166.951765279785 4.4445617432e-02
3309 12 638 167.185848109156 1.0428406398e+00
3310 12 639 167.472039702129 4.2611181859e-02
3311 12 640 167.738004018710 4.3909770616e-02
3312 12 641 167.999504435411 4.3123198181e-02
3313 12 642 168.254398251163 6.0219547055e-02
3314 12 643 168.527753607235 4.3601652536e-02
3315 12 644 168.796689360494 6.1876812264e-02
3316 12 645 169.092400727409 1.0395041665e+00
3317 12 646 169.303960876358 4.6400822995e-02
3318 12 647 169.581112477294 4.5140500823e-02
3319 12 648 169.907444322047 1.0195197841e+00
3320 12 649 170.061011055857 6.2256230656e-02
3321 12 650 170.364911726901 6.1722480739e-02
3322 12 651 170.609499662945 4.5108662989e-02
3323 12 652 170.873261747528 4.3677984559e-02
3324 12 653 171.141448501351 4.3584303270e-02
3325 12 654 171.403292969932 4.4911935533e-02
3326 12 655 171.667681860876 4.3176918700e-02
3327 12 656 171.946982347218 6.1210202477e-02
3328 12 657 172.190988559957 4.4811282027e-02
3329 12 658 172.456348737892 4.3236920482e-02
3330 12 659 172.720881557593 4.3674796191e-02
3331 12 660 172.991685923624 4.4743127460e-02
3332 12 661 173.296984674968 9.7027966875e-02
3333 12 662 173.417525221845 1.0058011577e+00
3334 12 663 173.751624924310 4.5985811552e-02
3335 12 664 174.018928241856 4.3748302625e-02
3336 12 665 174.302042843696 6.6750684843e-02
3337 12 666 174.560657549414 4.9811878653e-02
3338 12 667 174.756982765845 1.0344451549e+00
3339 12 668 175.062577592642 4.5756558861e-02
3340 12 669 175.328373387268 4.3112661587e-02
3341 12 670 175.594491824809 4.4261637674e-02
3342 12 671 175.861335352060 4.3820913234e-02
3343 12 672 176.128920749240 4.3742793546e-02
3344 12 673 176.438720291784 1.0373310003e+00
3345 12 674 176.632784225877 4.8740896531e-02
3346 12 675 176.907847226043 6.6920480784e-02
3347 12 676 177.171240216749 4.4749025512e-02
3348 12 677 177.437331471892 4.3951218881e-02
3349 12 678 177.700577710438 4.5461656325e-02
3350 12 679 177.977109902210 4.7773783917e-02
3351 12 680 178.262129562514 1.2106413357e-01
3352 12 681 178.385511939461 9.8000494443e-01
3353 12 682 178.731690295719 4.6562802814e-02
3354 12 683 179.014562458859 4.8253892932e-02
3355 12 684 179.241363080988 6.3027204424e-02
3356 12 685 179.534202732577 4.5622376470e-02
3357 12 686 179.880366876989 4.5077117920e-01
3358 12 687 179.941579826523 6.3149669811e-01
3359 12 688 180.296535322653 4.5501455568e-02
3360 12 689 180.564516473349 4.4686614410e-02
3361 12 690 180.847199037295 7.1679412107e-02
3362 12 691 181.097149780429 4.5088645605e-02
3363 12 692 181.381087366470 6.1549534477e-02
3364 12 693 181.604716635224 5.0916418341e-02
3365 12 694 181.878044045770 4.7477724111e-02
3366 12 695 182.203256783830 1.0278529161e+00
3367 12 696 182.372885821429 5.5135825366e-02
3368 12 697 182.656693910818 4.4416170600e-02
3369 12 698 182.919990859059 4.6585727134e-02
3370 12 699 183.190351325685 4.4712588744e-02
3371 12 700 183.451614396436 4.3156380983e-02
3372 12 701 183.720281800418 4.3962327423e-02
3373 12 702 183.991254825746 7.4393826715e-02
3374 12 703 184.251453974188 4.3272862793e-02
3375 12 704 184.516727234830 4.8727646342e-02
3376 12 705 184.865275408821 9.5843712973e-01
3377 12 706 184.968165280661 1.2356062182e-01
3378 12 707 185.312859340826 6.3097804645e-02
3379 12 708 185.593167364325 1.0312307536e+00
3380 12 709 185.759185962741 6.5606562926e-02
3381 12 710 186.057425082573 4.6255652147e-02
3382 12 711 186.326555528196 4.5122213597e-02
3383 12 712 186.609673244275 7.6787255692e-02
3384 12 713 186.859023410798 4.7153125067e-02
3385 12 714 187.214814522209 8.5398580629e-01
3386 12 715 187.288859323669 2.2587601684e-01
3387 12 716 187.622196550275 4.4653107337e-02
3388 12 717 187.892974814121 4.4898964193e-02
3389 12 718 188.161093320067 4.4473165417e-02
3390 12 719 188.414808079363 7.9697235483e-02
3391 12 720 188.688573437810 4.5347134235e-02
3392 12 721 188.954630984989 4.3709934335e-02
3393 12 722 189.230849431377 5.1913230814e-02
3394 12 723 189.419070252373 1.0338689195e+00
3395 12 724 189.716716710675 7.8773998701e-02
3396 12 725 189.996941857160 4.7716715367e-02
3397 12 726 190.264701221638 4.4630791783e-02
3398 12 727 190.531760453076 4.6439811255e-02
3399 12 728 190.767309669733 7.7466234349e-02
3400 12 729 191.049695101139 4.6817472939e-02
3401 12 730 191.317138379060 4.4603387209e-02
3402 12 731 191.589233071401 4.5818060692e-02
3403 12 732 191.894968167331 8.5575825213e-02
3404 12 733 192.035747976027 1.0244473157e+00
3405 12 734 192.328306432736 5.3946288012e-02
3406 12 735 192.603315301550 4.7573648330e-02
3407 12 736 192.885460779824 5.0020663743e-02
3408 12 737 193.082519490570 1.0354460057e+00
3409 12 738 193.393444555677 4.8639113689e-02
3410 12 739 193.662054189060 4.5346415883e-02
3411 12 740 193.921318437279 4.5726371043e-02
3412 12 741 194.187078737616 4.6564745060e-02
3413 12 742 194.441038467724 8.1899445251e-02
3414 12 743 194.713369342699 4.5011258916e-02
3415 12 744 194.980281277473 4.5148488798e-02
3416 12 745 195.264332414063 1.0429236373e+00
3417 12 746 195.502804961176 4.5451708951e-02
3418 12 747 195.768733454704 4.4179173957e-02
3419 12 748 196.054576682943 5.8434556246e-02
3420 12 749 196.255030509158 7.2164467494e-02
3421 12 750 196.550046784478 4.8397411420e-02
3422 12 751 196.872954765551 1.0307714631e+00
3423 12 752 197.036745103538 9.7138808822e-02
3424 12 753 197.328211705165 4.5381248660e-02
3425 12 754 197.606216897487 5.0085798514e-02
3426 12 755 197.916537530141 1.1526647263e-01
3427 12 756 198.022751497749 1.0110612648e+00
3428 12 757 198.361193255326 4.6493541740e-02
3429 12 758 198.631805935994 4.7144386699e-02
3430 12 759 198.894705401917 4.6345511798e-02
3431 12 760 199.166622140873 4.3118779081e-02
3432 12 761 199.429388820424 4.5573407212e-02
3433 12 762 199.689699663840 4.5430827201e-02
3434 12 763 199.957449404799 4.6848382797e-02
3435 12 764 200.203379409225 9.3703752729e-02
3436 12 765 200.476632773137 4.3530895386e-02
3437 12 766 200.748162606258 4.6564574041e-02
3438 12 767 201.045100118498 8.0465215632e-02
3439 12 768 201.263222007108 1.0560425003e+00
3440 12 769 201.523171128238 4.6473199066e-02
3441 12 770 201.786938531826 4.7243359408e-02
3442 12 771 202.054189307180 4.6283516660e-02
3443 12 772 202.359902087330 7.2217795707e-02
3444 12 773 202.499428552907 1.0153990165e+00
3445 12 774 202.831434836628 4.6311765853e-02
3446 12 775 203.122967882296 5.9411245069e-02
3447 12 776 203.320046940235 8.2238073554e-02
3448 12 777 203.608102909759 4.5657013599e-02
3449 12 778 203.880109478187 4.7738448763e-02
3450 12 779 204.187456829305 1.0391606677e+00
3451 12 780 204.401579893953 5.1140433242e-02
3452 12 781 204.636530848535 9.8743892423e-02
3453 12 782 204.926702690818 4.6663853522e-02
3454 12 783 205.202493893280 5.0650008318e-02
3455 12 784 205.397462921662 1.0366261850e+00
3456 12 785 205.708831218201 4.6113798669e-02
3457 12 786 205.976962307450 4.5800865758e-02
3458 12 787 206.245680567020 1.0398826061e-01
3459 12 788 206.502266489981 4.7004106126e-02
3460 12 789 206.768932626035 4.4740377922e-02
3461 12 790 207.033832628052 4.6985682393e-02
3462 12 791 207.308646694103 4.6197085358e-02
3463 12 792 207.614467898596 9.2156840617e-02
3464 12 793 207.893373516283 9.4240656988e-01
3465 12 794 207.994972574761 1.5313713003e-01
3466 12 795 208.355287937119 7.6203044683e-02
3467 12 796 208.545070090734 7.7738182251e-02
3468 12 797 208.846367182409 4.8280351082e-02
3469 12 798 209.109018920104 4.8069461271e-02
3470 12 799 209.392095651509 5.4505446189e-02
3471 12 800 209.579841651504 1.0349380376e+00
3472 12 801 209.912898681820 1.1123564880e-01
3473 12 802 210.152458720873 4.6809808398e-02
3474 12 803 210.424312491288 4.6438781175e-02
3475 12 804 210.687488194931 4.4371835547e-02
3476 12 805 210.952586365369 4.5510693479e-02
3477 12 806 211.212363363288 5.0612289239e-02
3478 12 807 211.490278813889 4.9353137693e-02
3479 12 808 211.693233445404 1.0392679750e+00
3480 12 809 211.998135009116 4.7726994376e-02
3481 12 810 212.266942469666 4.7078706870e-02
3482 12 811 212.540630934525 4.6308318592e-02
3483 12 812 212.824243566286 1.0928674057e-01
3484 12 813 213.042316230106 5.4359500034e-02
3485 12 814 213.342790179185 1.1052570926e+00
3486 12 815 213.555088112371 5.3486148376e-02
3487 12 816 213.824199887415 4.6929487707e-02
3488 12 817 214.098494958655 4.9794604479e-02
3489 12 818 214.388598228017 5.9912075597e-02
3490 12 819 214.551575595075 1.0261360806e+00
3491 12 820 214.891013986506 5.6260643019e-02
3492 12 821 215.091646425279 1.0779449494e-01
3493 12 822 215.396059654301 4.7813230338e-02
3494 12 823 215.665081359444 4.7481611525e-02
3495 12 824 215.933041473193 5.2094189722e-02
3496 12 825 216.172273659307 1.0550185861e+00
3497 12 826 216.397230088713 1.1080393080e-01
3498 12 827 216.700838089638 4.6742772874e-02
3499 12 828 216.966377667102 4.6351722916e-02
3500 12 829 217.231266449695 4.6682029717e-02
3501 12 830 217.503961016001 4.8367208605e-02

E-022-spectral-measure.json — 4.3 KB, updated 08-19-2026

JSON sidecar (click to expand)
{
  "experiment": "E-022",
  "task": "2.10 (D-035 D2): spectral-measure convergence",
  "script": "research/numerics/scripts/E-022-spectral-measure.py",
  "parameters": {
    "a_list": [
      4.0,
      6.0,
      8.0,
      10.0,
      12.0
    ],
    "h": 0.01,
    "lam": -1.0,
    "z_max": 300.0,
    "z_metric": 280.0,
    "sigma_bump": 8.0,
    "n_grid": 40000
  },
  "checks": {
    "V0_schur_vs_solve_v": true,
    "V1_weights_positive": true,
    "V2_refinement": true,
    "V3_lattice_and_z1law": true
  },
  "key_values": {
    "4": {
      "n_zeros": 381,
      "z1": 1.1260734006983593,
      "z1_times_a": 4.504293602793437,
      "lattice_expected": 381.9718634205488,
      "mass_total_Zmetric": 184.02432245308052,
      "O1_cumulative_Linf": 0.030472775278319375,
      "O1_cumulative_L2": 0.015369322417422383,
      "O2_logw_slope": 0.004773175983096674,
      "O2_logw_R2": 0.17155831473911887,
      "O2_logw_std_resid": 0.8476672146023767,
      "O3_weak_metric": 0.010527875427328966,
      "O5_mass_near_gamma": 1.6069393990772483,
      "O5_mass_near_random": 1.239913792291073,
      "O5_ratio": 1.2960089718076262,
      "elapsed_s": 2.9
    },
    "6": {
      "n_zeros": 572,
      "z1": 0.7499016225074712,
      "z1_times_a": 4.499409735044827,
      "lattice_expected": 572.9577951308232,
      "mass_total_Zmetric": 184.01489106241632,
      "O1_cumulative_Linf": 0.02723380344436621,
      "O1_cumulative_L2": 0.015298102993183555,
      "O2_logw_slope": 0.004573680792971365,
      "O2_logw_R2": 0.13177706690264612,
      "O2_logw_std_resid": 0.9483241546589634,
      "O3_weak_metric": 0.010569164981132785,
      "O5_mass_near_gamma": 1.6173747450375149,
      "O5_mass_near_random": 1.257329769139859,
      "O5_ratio": 1.2863568371120038,
      "elapsed_s": 4.8
    },
    "8": {
      "n_zeros": 763,
      "z1": 0.5621012628096893,
      "z1_times_a": 4.4968101024775144,
      "lattice_expected": 763.9437268410976,
      "mass_total_Zmetric": 184.13312237431055,
      "O1_cumulative_Linf": 0.027258094320286474,
      "O1_cumulative_L2": 0.015486596743652112,
      "O2_logw_slope": 0.004185396789595135,
      "O2_logw_R2": 0.10532818940743971,
      "O2_logw_std_resid": 0.986518773772079,
      "O3_weak_metric": 0.010568959142405882,
      "O5_mass_near_gamma": 1.6196075350475192,
      "O5_mass_near_random": 1.2561234028070363,
      "O5_ratio": 1.2893697636937673,
      "elapsed_s": 8.2
    },
    "10": {
      "n_zeros": 954,
      "z1": 0.44959701245436284,
      "z1_times_a": 4.4959701245436285,
      "lattice_expected": 954.9296585513721,
      "mass_total_Zmetric": 184.1239991524169,
      "O1_cumulative_Linf": 0.024844169503423608,
      "O1_cumulative_L2": 0.015446208652370818,
      "O2_logw_slope": 0.0038097364559334847,
      "O2_logw_R2": 0.08653440341105123,
      "O2_logw_std_resid": 1.0006504172097648,
      "O3_weak_metric": 0.010581710686957842,
      "O5_mass_near_gamma": 1.6290317856739722,
      "O5_mass_near_random": 1.2562149964535079,
      "O5_ratio": 1.2967778527345915,
      "elapsed_s": 13.4
    },
    "12": {
      "n_zeros": 1145,
      "z1": 0.3746087478472408,
      "z1_times_a": 4.495304974166889,
      "lattice_expected": 1145.9155902616465,
      "mass_total_Zmetric": 184.10483484645468,
      "O1_cumulative_Linf": 0.028584131798192303,
      "O1_cumulative_L2": 0.015417413187446537,
      "O2_logw_slope": 0.003682406300531162,
      "O2_logw_R2": 0.08233450272296328,
      "O2_logw_std_resid": 0.9935774298804366,
      "O3_weak_metric": 0.010592268896428007,
      "O5_mass_near_gamma": 1.6165573705799765,
      "O5_mass_near_random": 1.2532365071394718,
      "O5_ratio": 1.2899060643148588,
      "elapsed_s": 20.9
    },
    "O4_trend": {
      "a": [
        4.0,
        6.0,
        8.0,
        10.0,
        12.0
      ],
      "d_a": [
        0.010527875427328966,
        0.010569164981132785,
        0.010568959142405882,
        0.010581710686957842,
        0.010592268896428007
      ],
      "monotone_decreasing": false
    },
    "V0_max_dev": 3.560323900663321e-14,
    "V2_rel": 0.0011243096862693027
  },
  "elapsed_seconds": 743.1,
  "timestamp_utc": "2026-08-19T17:19:38.162052+00:00"
}

Source code

Python script (click to expand)
"""E-022 — task 2.10 (D-035 deliverable D2): spectral-measure
convergence of Suzuki's D_{a,pi} toward the gamma-target measure.

For each a in {4,6,8,10,12} (theta=pi, all zeros real, E-016 F1):
  - locate zeros z_k of W(a,pi;z) on (0, Z_MAX] (E-016/E-019 route:
    grid sign-changes of g(z) = z Im V+ - Re V+ + brentq);
  - compute the Clark/de Branges spectral weights
        w_k = 1 / K_a(z_k, z_k),
    K_a(z,z) = Re(b_z^H v),  v solves the BORDERED (mean-zero, L^2_0)
    Galerkin system  T v + mu e = b_z,  e.v = 0,
    T = Q - lam M (lam = -1),  b_z = h sinc^2(zh/2pi) e^{-i z x}
    (exact hat-basis quadrature), via Schur reduction on shared
    u1 = T^{-1} e: v = T^{-1}(b_z - mu e), mu = (e.u0)/(e.u1).
    Toeplitz solves (scipy solve_toeplitz); V0 validates the Schur
    solve against E16.solve_v (bordered dense) for b[+1].

Target measure: unit atoms at the Riemann zeros gamma_k (mpmath
zetazero, dps 30, float64 sufficient for statistics).

Observables:
  O1. normalized cumulative mass M_a(x)/M_a(Z') vs N_gamma(x)/N(Z'),
      Z' = 280 (Linfty + L2 discrepancy).
  O2. weight profile: linear fit log w_k vs z_k (slope, spread R^2).
  O3. weak metric: Gaussian bumps f_j (30 log-spaced centers in
      [15,250], sigma=8): d_a = max_j |mu~_a(f_j) - nu~(f_j)|,
      normalized by total mass in (0, Z'].
  O4. d_a vs a  -> convergence-rate estimate (headline).
  O5. gamma-concentration: mean mu_a-mass within +/-1 of each gamma
      vs within +/-1 of random points (does the WEIGHT carry gamma
      information even though positions don't lock? — E-019 B2 found
      chance-level POSITION proximity).

Checks:
  V0. Schur-Toeplitz bordered solve vs E16.solve_v (b[+1]): < 1e-8.
  V1. all weights > 0.
  V2. refinement a=4, h=0.005: weight rel dev on first 50 zeros < 5e-3.
  V3. z1*a in [4.3, 4.7] (stiff law, E-019) and count = maximal
      lattice (a*Z_MAX/pi +/- 2) at every a.
  V4. total mass M_a(Z') recorded vs a (scaling documented).

Outputs: research/numerics/data/E-022-spectral-measure.csv (+ .json)
LONG RUN: detached + log file (per STATE.md protocol).
"""
import importlib.util
import json
import sys
import time
from datetime import datetime, timezone
from pathlib import Path

import mpmath as mp
import numpy as np
import scipy.linalg
import scipy.optimize

REPO = Path(__file__).resolve().parents[3]
DATA = REPO / "research" / "numerics" / "data"
CSV = DATA / "E-022-spectral-measure.csv"
JSON = DATA / "E-022-spectral-measure.json"

_spec = importlib.util.spec_from_file_location(
    "E16", Path(__file__).with_name("E-016-herglotz-fine-structure.py"))
E16 = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(E16)                     # runs the e^20 sieve

sys.path.insert(0, str(Path(__file__).parent))
from prime_backend_v2 import PrimeBackendV2       # noqa: E402

H_MAIN = E16.H_MAIN          # 0.01
LAM = E16.LAM_SHIFT          # -1.0
A_LIST = [4.0, 6.0, 8.0, 10.0, 12.0]
Z_MAX = 300.0
Z_METRIC = 280.0
N_GRID = 40000
SIGMA_BUMP = 8.0
mp.mp.dps = 40

XN, XW = E16.XN, E16.XW
hat_FT = E16.hat_FT


def collect_t_points(a, h):
    """Copy of E-019's collector (E-016 S_full/quad segment structure)."""
    n_elem = int(round(2 * a / h))
    pts = []

    def add_quad(lo, hi, peak):
        n_lo = int(np.ceil(np.exp(lo)))
        n_hi = int(np.floor(np.exp(hi)))
        if n_hi - n_lo > 64:
            for aa, bb in ((lo, peak), (peak, hi)):
                if bb - aa > 0:
                    mid, half = 0.5 * (aa + bb), 0.5 * (bb - aa)
                    pts.extend(mid + half * XN)
            return
        segs = sorted({lo, peak, hi} |
                      {float(np.log(n))
                       for n in range(max(n_lo, 2), n_hi + 1)
                       if lo < np.log(n) < hi})
        for p0, p1 in zip(segs, segs[1:]):
            if p1 - p0 > 0:
                mid, half = 0.5 * (p0 + p1), 0.5 * (p1 - p0)
                pts.extend(mid + half * XN)

    for k in range(n_elem):
        if k == 0:
            add_quad(0.0, h, 0.0)
        else:
            add_quad((k - 1) * h, (k + 1) * h, k * h)
    return np.array(pts)


def locate_zeros(cp, x, h, z_max=Z_MAX, n_grid=N_GRID):
    zg = np.linspace(1e-3, z_max, n_grid)
    Vpr, _ = E16.V_and_dV(zg, cp, x, h)
    g = zg * Vpr.imag - Vpr.real

    def g_direct(zz):
        V = hat_FT(np.array([zz]), h)[0] * complex(
            np.exp(1j * zz * x) @ cp)
        return zz * V.imag - V.real

    idx = np.flatnonzero(np.sign(g[:-1]) * np.sign(g[1:]) < 0)
    zeros = []
    for i in idx:
        try:
            zeros.append(scipy.optimize.brentq(g_direct, zg[i], zg[i + 1],
                                               xtol=1e-13, rtol=1e-13))
        except ValueError:
            pass
    return np.array(zeros)


class ToeplitzBordered:
    """Schur-reduced bordered solve for T = toeplitz(tc), constraint
    e.v = 0 (e = ones):  v = u0 - mu u1, mu = sum(u0)/sum(u1)."""

    def __init__(self, tc):
        self.tc = tc
        n = len(tc)
        self.u1 = scipy.linalg.solve_toeplitz((tc, tc), np.ones(n))
        self.s1 = float(self.u1.sum())

    def solve(self, b):
        u0 = scipy.linalg.solve_toeplitz((self.tc, self.tc), b)
        return u0 - (u0.sum() / self.s1) * self.u1


def weights_for(a, h, zeros, x):
    """K_k and w_k for the given zero list (build(a,h) cached)."""
    _, _, Q, M, _b = E16.build(a, h)
    n = Q.shape[0]
    mc = np.zeros(n)
    mc[0] = 2 * h / 3
    if n > 1:
        mc[1] = h / 6
    tc = Q[:, 0] - LAM * mc
    solver = ToeplitzBordered(tc)
    Ks = np.empty(len(zeros))
    for i, z in enumerate(zeros):
        bz = hat_FT(np.array([z]), h)[0] * np.exp(-1j * z * x)
        v = solver.solve(bz)
        Ks[i] = float(np.real(np.conj(bz) @ v))
    return Ks


def main() -> int:
    if JSON.exists() and "--force" not in sys.argv:
        print(f"cached: {JSON} (use --force to recompute)")
        return 0
    t0 = time.time()

    # ---- backend v2 (e^24) ------------------------------------------
    print("collecting quadrature t-points ...", flush=True)
    tq = np.concatenate([collect_t_points(a, H_MAIN) for a in A_LIST]
                        + [collect_t_points(4.0, 0.005)])
    print(f"  {tq.size} points; building/loading backend ...", flush=True)
    CACHE = DATA / "E-022-backend-cache.npz"
    be = PrimeBackendV2(tq)
    if CACHE.exists() and "--force" not in sys.argv:
        be.load_cache(CACHE)
        print("  backend loaded from cache", flush=True)
    else:
        be.build(verbose=True)
        be.save_cache(CACHE)
    E16._BUILD.clear()
    E16.prime_sum_vec = be.prime_sum

    # ---- gamma target ------------------------------------------------
    print("target: first 200 Riemann zeros (zetazero) ...", flush=True)
    mp.mp.dps = 30
    gam = np.array([float(mp.zetazero(k).imag) for k in range(1, 201)])
    gam = gam[gam <= Z_METRIC]

    # ---- main sweep --------------------------------------------------
    rows = []
    report = {"per_a": {}}
    v0_max = 0.0
    v1_ok = True
    v3_ok = True
    zc = np.linspace(10.0, Z_METRIC, 800)
    centers = np.geomspace(15.0, 250.0, 30)

    for a in A_LIST:
        ta = time.time()
        x, h, Q, M, b = E16.build(a, H_MAIN)
        n = len(x)
        # V0: Schur-Toeplitz vs E16.solve_v on b[+1]
        mc = np.zeros(n)
        mc[0] = 2 * h / 3
        mc[1] = h / 6
        tc = Q[:, 0] - LAM * mc
        solver = ToeplitzBordered(tc)
        cp_ref, _T = E16.solve_v(Q, M, b[+1.0], LAM, n)
        cp_schur = solver.solve(b[+1.0])
        dev = float(np.max(np.abs(cp_ref - cp_schur))
                    / max(1.0, float(np.max(np.abs(cp_ref)))))
        v0_max = max(v0_max, dev)

        cp, _ = E16.solve_v(Q, M, b[+1.0], LAM, n)
        cm, _ = E16.solve_v(Q, M, b[-1.0], LAM, n)
        zeros = locate_zeros(cp, x, h)

        Ks = weights_for(a, H_MAIN, zeros, x)
        ws = 1.0 / Ks
        if np.any(Ks <= 0):
            v1_ok = False

        z1 = float(zeros[0])
        lat = a * Z_MAX / np.pi
        if not (4.3 < z1 * a < 4.7) or abs(len(zeros) - lat) > 2:
            v3_ok = False

        # --- metrics (zeros in (0, Z_METRIC])
        zm = zeros[zeros <= Z_METRIC]
        wm = ws[zeros <= Z_METRIC]
        Mtot = float(wm.sum())
        # O1: cumulative shape vs unit-weight gamma measure
        Ma = np.array([wm[zm <= t].sum() for t in zc]) / Mtot
        Ng = np.array([np.sum(gam <= t) for t in zc]) / len(gam)
        o1_linf = float(np.max(np.abs(Ma - Ng)))
        o1_l2 = float(np.sqrt(np.mean((Ma - Ng) ** 2)))
        # O2: weight profile
        A_ = np.vstack([zm, np.ones_like(zm)]).T
        slope, intercept = np.linalg.lstsq(A_, np.log(wm), rcond=None)[0]
        pred = slope * zm + intercept
        ss_res = float(np.sum((np.log(wm) - pred) ** 2))
        ss_tot = float(np.sum((np.log(wm) - np.log(wm).mean()) ** 2))
        r2 = 1.0 - ss_res / max(ss_tot, 1e-300)
        # O3: Gaussian-bump weak metric
        def bump(z, c):
            return np.exp(-0.5 * ((z - c) / SIGMA_BUMP) ** 2)
        mu_f = np.array([np.dot(wm, bump(zm, c)) for c in centers]) / Mtot
        nu_f = np.array([bump(gam, c).sum() for c in centers]) / len(gam)
        o3 = float(np.max(np.abs(mu_f - nu_f)))
        # O5: gamma-concentration of mass
        mass_near_g = float(np.mean([wm[np.abs(zm - g) <= 1.0].sum()
                                     for g in gam]))
        rng = np.random.default_rng(7)
        rpts = rng.uniform(15.0, 250.0, len(gam))
        mass_near_r = float(np.mean([wm[np.abs(zm - r) <= 1.0].sum()
                                     for r in rpts]))

        for k, (zz, ww) in enumerate(zip(zeros, ws), 1):
            rows.append((a, k, zz, ww))
        report["per_a"][f"{a:g}"] = {
            "n_zeros": int(len(zeros)), "z1": z1, "z1_times_a": z1 * a,
            "lattice_expected": lat,
            "mass_total_Zmetric": Mtot,
            "O1_cumulative_Linf": o1_linf, "O1_cumulative_L2": o1_l2,
            "O2_logw_slope": float(slope), "O2_logw_R2": r2,
            "O2_logw_std_resid": float(np.sqrt(ss_res / max(len(zm) - 2, 1))),
            "O3_weak_metric": o3,
            "O5_mass_near_gamma": mass_near_g,
            "O5_mass_near_random": mass_near_r,
            "O5_ratio": mass_near_g / max(mass_near_r, 1e-300),
            "elapsed_s": round(time.time() - ta, 1),
        }
        print(f"a={a:g}: {len(zeros)} zeros, z1a={z1 * a:.3f}, "
              f"mass={Mtot:.3e}, O3={o3:.4f}, "
              f"O5={mass_near_g:.3e}/{mass_near_r:.3e} "
              f"({report['per_a'][f'{a:g}']['elapsed_s']}s)", flush=True)

    # ---- V2: refinement at a=4, h=0.005 ------------------------------
    print("V2: refinement a=4 h=0.005 (first 50 zeros) ...", flush=True)
    x5, h5, Q5, M5, b5 = E16.build(4.0, 0.005)
    cp5, _ = E16.solve_v(Q5, M5, b5[+1.0], LAM, len(x5))
    zeros5 = locate_zeros(cp5, x5, h5)
    K5 = weights_for(4.0, 0.005, zeros5[:50], x5)
    x01, _, _, _, _ = E16.build(4.0, H_MAIN)
    K4 = weights_for(4.0, H_MAIN, zeros5[:50], x01)  # same z's, h=0.01
    v2_rel = float(np.max(np.abs(K5 - K4) / np.abs(K5)))
    print(f"  V2 max rel dev K(h=0.005) vs K(h=0.01): {v2_rel:.2e}",
          flush=True)

    # ---- O4: convergence trend --------------------------------------
    avals = np.array(A_LIST)
    dvals = np.array([report["per_a"][f"{a:g}"]["O3_weak_metric"]
                      for a in A_LIST])
    o4 = {"a": list(avals), "d_a": list(dvals),
          "monotone_decreasing": bool(np.all(np.diff(dvals) < 0))}

    checks = {
        "V0_schur_vs_solve_v": bool(v0_max < 1e-8),
        "V1_weights_positive": bool(v1_ok),
        "V2_refinement": bool(v2_rel < 5e-3),
        "V3_lattice_and_z1law": bool(v3_ok),
    }
    print("checks:", checks, flush=True)

    import csv as csvmod
    with open(CSV, "w", newline="") as f:
        w = csvmod.writer(f)
        w.writerow(["a", "k", "z_k", "w_k"])
        for a, k, zz, ww in rows:
            w.writerow([f"{a:g}", k, f"{zz:.12f}", f"{ww:.10e}"])

    meta = {
        "experiment": "E-022",
        "task": "2.10 (D-035 D2): spectral-measure convergence",
        "script": "research/numerics/scripts/E-022-spectral-measure.py",
        "parameters": {"a_list": A_LIST, "h": H_MAIN, "lam": LAM,
                       "z_max": Z_MAX, "z_metric": Z_METRIC,
                       "sigma_bump": SIGMA_BUMP, "n_grid": N_GRID},
        "checks": checks,
        "key_values": {**report["per_a"], "O4_trend": o4,
                       "V0_max_dev": v0_max, "V2_rel": v2_rel},
        "elapsed_seconds": round(time.time() - t0, 1),
        "timestamp_utc": datetime.now(timezone.utc).isoformat(),
    }
    JSON.write_text(json.dumps(meta, indent=2))
    print(f"wrote {CSV.name}, {JSON.name}; elapsed "
          f"{meta['elapsed_seconds']}s", flush=True)
    return 0 if all(checks.values()) else 1


if __name__ == "__main__":
    sys.exit(main())