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 4 of 8 · 500/page · 3815 rows next →
# akz_kw_k
1502 8 548 215.519438005645 7.4819259860e-02
1503 8 549 215.998521269027 1.6796568140e-01
1504 8 550 216.197339570390 1.0285920564e+00
1505 8 551 216.628410596375 8.2608601037e-02
1506 8 552 217.055779081282 7.2016135758e-02
1507 8 553 217.466121823386 7.2366534562e-02
1508 8 554 217.830792007644 1.5075920625e-01
1509 8 555 218.251501486521 6.9540390643e-02
1510 8 556 218.651257005395 7.2252516564e-02
1511 8 557 219.067136016909 1.0720123686e+00
1512 8 558 219.410245478541 1.4944447850e-01
1513 8 559 219.826222169775 7.2955371455e-02
1514 8 560 220.233143727638 7.7291228417e-02
1515 8 561 220.709208136859 1.1354075344e+00
1516 8 562 220.979815590099 8.5000675411e-02
1517 8 563 221.429233528207 1.0739189689e+00
1518 8 564 221.804194806429 7.2525568912e-02
1519 8 565 222.210282669069 7.5949075462e-02
1520 8 566 222.610437349514 7.2273236950e-02
1521 8 567 223.054332812679 1.1700014081e-01
1522 8 568 223.337665261553 1.1070106894e-01
1523 8 569 223.856755725812 1.8102214540e-01
1524 8 570 224.032952487434 1.0467902679e+00
1525 8 571 224.537599854164 7.4787989324e-02
1526 8 572 224.979677937507 1.0756454901e+00
1527 8 573 225.387059978633 1.5132734043e-01
1528 8 574 225.698177213945 9.1094523540e-02
1529 8 575 226.115734480503 7.1947100072e-02
1530 8 576 226.493279039392 1.7146380961e-01
1531 8 577 226.924094357228 7.8848188354e-02
1532 8 578 227.411193132923 1.0424832930e+00
1533 8 579 227.658864816882 9.5707249771e-02
1534 8 580 228.121181889077 9.8161799879e-02
1535 8 581 228.414127037056 1.5347214639e-01
1536 8 582 228.873010620937 7.7874227824e-02
1537 8 583 229.330749762101 1.0629200733e+00
1538 8 584 229.637144997092 7.9453429011e-02
1539 8 585 230.049253437660 7.2131108445e-02
1540 8 586 230.420527017936 1.8648412330e-01
1541 8 587 230.841789689684 7.5154525682e-02
1542 8 588 231.249482061235 1.0738475967e+00
1543 8 589 231.646643148997 7.8629823342e-02
1544 8 590 231.985936020874 1.1844833357e+00
1545 8 591 232.428849885436 7.8625313096e-02
1546 8 592 232.770580871908 1.8927222326e-01
1547 8 593 233.209935211737 7.5741238541e-02
1548 8 594 233.685544820584 1.0550900134e+00
1549 8 595 233.963720401686 8.7027738326e-02
1550 8 596 234.391362774294 7.5052516343e-02
1551 8 597 234.844321771081 1.9151506074e-01
1552 8 598 235.158641757409 8.5497266875e-02
1553 8 599 235.587927357451 7.8937553751e-02
1554 8 600 236.038845040284 2.0642803848e-01
1555 8 601 236.501306800935 9.7438933425e-01
1556 8 602 236.732386725681 2.6190168221e-01
1557 8 603 237.074789016683 1.1435875539e-01
1558 8 604 237.573475622243 1.3449302011e-01
1559 8 605 237.786084833445 1.0106865700e+00
1560 8 606 238.278561047106 8.1345902571e-02
1561 8 607 238.694430049083 7.4992666567e-02
1562 8 608 239.113441210388 8.1785395225e-02
1563 8 609 239.538842714324 1.1929240446e+00
1564 8 610 239.832884649625 9.2638692368e-02
1565 8 611 240.270356428241 8.2764676116e-02
1566 8 612 240.672673096406 8.0360160972e-02
1567 8 613 241.055831499512 1.2187632094e+00
1568 8 614 241.461234318336 7.8569047932e-02
1569 8 615 241.884191606202 8.1276391057e-02
1570 8 616 242.360447761440 1.8258158686e-01
1571 8 617 242.716562498056 4.3285702142e-01
1572 8 618 242.869862176673 7.5444469981e-01
1573 8 619 243.380282178304 2.4005505182e-01
1574 8 620 243.860724321003 1.2884958258e-01
1575 8 621 244.086031232638 1.0255993987e+00
1576 8 622 244.607602339059 9.1719145192e-02
1577 8 623 244.914788572798 2.2958848998e-01
1578 8 624 245.382389130391 8.1700661116e-02
1579 8 625 245.782645642734 8.0361018097e-02
1580 8 626 246.188531932064 8.2024563158e-02
1581 8 627 246.662733760448 1.4097454054e-01
1582 8 628 246.998166478366 4.2723894619e-01
1583 8 629 247.177588901179 8.2070407123e-01
1584 8 630 247.720841497750 9.1749638898e-02
1585 8 631 248.105360688487 1.0851376464e+00
1586 8 632 248.473764491748 2.5830876291e-01
1587 8 633 248.935992133634 8.3858292710e-02
1588 8 634 249.441203258889 2.7518700530e-01
1589 8 635 249.614931522052 9.2844460202e-01
1590 8 636 249.976773171726 2.0424126246e-01
1591 8 637 250.468285396376 8.4637088899e-02
1592 8 638 250.993656996282 9.7511163181e-01
1593 8 639 251.169975630124 1.8047008450e-01
1594 8 640 251.646341939225 8.4158879988e-02
1595 8 641 252.012065269929 2.8103758641e-01
1596 8 642 252.482996317918 2.9073427120e-01
1597 8 643 252.941849919382 2.3358740166e-01
1598 8 644 253.097255314198 9.1267456046e-01
1599 8 645 253.609993674676 8.3785382115e-02
1600 8 646 254.020018945611 8.6573900136e-02
1601 8 647 254.441134199457 2.9472026976e-01
1602 8 648 254.818171989585 8.2602782758e-02
1603 8 649 255.287157665204 1.2668839291e+00
1604 8 650 255.539363838891 1.1003778945e-01
1605 8 651 255.965053588898 8.8834001286e-02
1606 8 652 256.380864366097 1.0813047691e+00
1607 8 653 256.792199772446 8.7350756938e-02
1608 8 654 257.177653728775 8.4200543622e-02
1609 8 655 257.595132026390 8.5050914633e-02
1610 8 656 258.032537888785 1.1331866081e-01
1611 8 657 258.333538361097 3.2377258971e-01
1612 8 658 258.626295825033 1.0366784910e+00
1613 8 659 259.187895935653 1.5505008034e-01
1614 8 660 259.425470080646 2.4934835640e-01
1615 8 661 259.877315631395 1.0857163152e+00
1616 8 662 260.320461910212 3.4117383938e-01
1617 8 663 260.794383620119 1.0570510959e+00
1618 8 664 261.066511514433 1.0155329529e-01
1619 8 665 261.490278967942 9.3032442186e-02
1620 8 666 261.966006157636 1.6747762874e-01
1621 8 667 262.185788590089 2.5461274840e-01
1622 8 668 262.652898779702 9.0586522493e-02
1623 8 669 263.072777005535 8.7143949436e-02
1624 8 670 263.565058008875 1.3166638796e+00
1625 8 671 263.807930532674 1.2316717210e-01
1626 8 672 264.231976763719 9.1153114854e-02
1627 8 673 264.655301257770 9.1438536968e-02
1628 8 674 265.003041796130 3.6945616775e-01
1629 8 675 265.539181341911 1.0041226113e+00
1630 8 676 265.739818534226 1.5396961623e-01
1631 8 677 266.204985282170 8.8043422166e-02
1632 8 678 266.613012199997 1.0939009269e+00
1633 8 679 267.024349024648 3.9384636466e-01
1634 8 680 267.418986708388 8.9978230151e-02
1635 8 681 267.906336588948 1.0306663016e+00
1636 8 682 268.134762507355 1.3587955387e-01
1637 8 683 268.574387510583 4.0372081148e-01
1638 8 684 268.992221203641 8.6967647894e-02
1639 8 685 269.401666406293 9.0547492403e-02
1640 8 686 269.937268202021 9.2183326410e-01
1641 8 687 270.144750665732 3.3209445514e-01
1642 8 688 270.445878484320 3.2728579357e-01
1643 8 689 271.036260811175 2.5123464262e-01
1644 8 690 271.335338034507 5.0850788172e-01
1645 8 691 271.540109846586 8.3890386955e-01
1646 8 692 272.153792768748 1.9561520571e-01
1647 8 693 272.376582002409 3.2448735883e-01
1648 8 694 272.874621492750 1.0050917043e-01
1649 8 695 273.390600165385 5.4242238898e-01
1650 8 696 273.518600774517 6.2194520980e-01
1651 8 697 274.029535814051 1.0173877661e-01
1652 8 698 274.436661153590 9.3692049946e-02
1653 8 699 274.831669962484 4.6443268519e-01
1654 8 700 275.257567671765 9.7989847688e-02
1655 8 701 275.591955026128 1.0827857788e+00
1656 8 702 276.037820337157 1.0049951071e-01
1657 8 703 276.448324896451 1.4780110693e+00
1658 8 704 276.839543177425 9.0083712196e-02
1659 8 705 277.263987734195 1.0193923395e-01
1660 8 706 277.728394734872 1.8227802526e-01
1661 8 707 277.987545459668 4.7349151386e-01
1662 8 708 278.274869419005 1.0061649875e+00
1663 8 709 278.897386244532 3.1515593943e-01
1664 8 710 279.192596636148 1.1931861232e+00
1665 8 711 279.462970844273 1.7048570351e-01
1666 8 712 279.933780157760 1.0858974755e-01
1667 8 713 280.347595433932 1.0232035468e-01
1668 8 714 280.771818497687 1.0901939299e-01
1669 8 715 281.067555302147 5.0270869156e-01
1670 8 716 281.545401007099 9.9223956165e-02
1671 8 717 281.964572332617 5.4722818451e-01
1672 8 718 282.446688982252 1.0311932720e+00
1673 8 719 282.685347405516 1.6385585330e-01
1674 8 720 283.200061099849 1.0838629845e+00
1675 8 721 283.584554700986 4.2782043800e-01
1676 8 722 283.802292971193 2.3739333676e-01
1677 8 723 284.283830186533 1.0810840404e-01
1678 8 724 284.795677369867 8.4125569600e-01
1679 8 725 284.945954568348 3.4078788352e-01
1680 8 726 285.443880140144 1.0828341609e-01
1681 8 727 285.854663375779 1.0158698859e-01
1682 8 728 286.264307881181 5.9530653182e-01
1683 8 729 286.666040025807 1.1103044088e+00
1684 8 730 287.143924761542 2.3714044478e-01
1685 8 731 287.335284543191 4.5173650095e-01
1686 8 732 287.903710264304 1.1047937400e+00
1687 8 733 288.275218272512 1.9303089025e-01
1688 8 734 288.503730278884 5.2830717676e-01
1689 8 735 289.018658577239 1.1095458413e-01
1690 8 736 289.542254287561 9.3470241348e-01
1691 8 737 289.761849665532 3.7145858361e-01
1692 8 738 290.031268193826 5.2327566421e-01
1693 8 739 290.550378845167 1.3077028352e-01
1694 8 740 290.984674250505 1.1103485654e-01
1695 8 741 291.452682782136 6.4109578719e-01
1696 8 742 291.824538558680 1.0601416415e+00
1697 8 743 292.066341321339 1.5982939668e-01
1698 8 744 292.525074209805 1.1104608808e-01
1699 8 745 292.940312143548 1.2180390248e-01
1700 8 746 293.419217559478 2.7610694011e-01
1701 8 747 293.590788659276 9.2753992562e-01
1702 8 748 294.108905065276 7.2362381329e-01
1703 8 749 294.628868533622 6.1128479331e-01
1704 8 750 294.934542039250 1.1344728353e+00
1705 8 751 295.196302565413 1.7929179960e-01
1706 8 752 295.580713959150 1.1018486589e+00
1707 8 753 296.046657761774 1.1041054097e-01
1708 8 754 296.457572218950 1.1983400103e-01
1709 8 755 296.846689191279 7.5120011997e-01
1710 8 756 297.259412220995 1.1792116952e-01
1711 8 757 297.676226722475 1.1760796968e-01
1712 8 758 297.989419870425 1.1049270248e+00
1713 8 759 298.374463879042 7.8211375959e-01
1714 8 760 298.834156543150 1.1583418706e-01
1715 8 761 299.278226029716 8.0258982786e-01
1716 8 762 299.705619059322 3.1901711444e-01
1717 8 763 299.879119098114 9.0428112655e-01
1718 10 1 0.449597012454 5.2506261698e-02
1719 10 2 0.772965644536 5.0866804300e-02
1720 10 3 1.091034173357 5.0449282430e-02
1721 10 4 1.407422595250 5.0281560805e-02
1722 10 5 1.723059923241 5.0197354453e-02
1723 10 6 2.038296152421 5.0149441223e-02
1724 10 7 2.353293797899 5.0119484360e-02
1725 10 8 2.668136668550 5.0099315281e-02
1726 10 9 2.982874620706 5.0085606827e-02
1727 10 10 3.297539306629 5.0075820414e-02
1728 10 11 3.612150533568 5.0068026816e-02
1729 10 12 3.926719050588 5.0062855967e-02
1730 10 13 4.241258859685 5.0057839462e-02
1731 10 14 4.555770271997 5.0054909951e-02
1732 10 15 4.870266956166 5.0051938907e-02
1733 10 16 5.184743926725 5.0049916082e-02
1734 10 17 5.499217754045 5.0049316730e-02
1735 10 18 5.813672723440 5.0045787476e-02
1736 10 19 6.128130722356 5.0048439727e-02
1737 10 20 6.442580746933 5.0044738380e-02
1738 10 21 6.757026398119 5.0045621122e-02
1739 10 22 7.071469487992 5.0045820799e-02
1740 10 23 7.385915628205 5.0044289602e-02
1741 10 24 7.700361894635 5.0048180983e-02
1742 10 25 8.014817800354 5.0045383907e-02
1743 10 26 8.329270706932 5.0047991628e-02
1744 10 27 8.643730784398 5.0049394896e-02
1745 10 28 8.958210167162 5.0049302403e-02
1746 10 29 9.272677793516 5.0053210615e-02
1747 10 30 9.587189337072 5.0055136103e-02
1748 10 31 9.901697284953 5.0058458055e-02
1749 10 32 10.216242402206 5.0064212800e-02
1750 10 33 10.530820877757 5.0067662999e-02
1751 10 34 10.845423437448 5.0076980565e-02
1752 10 35 11.160095110477 5.0083526069e-02
1753 10 36 11.474830314300 5.0102648431e-02
1754 10 37 11.789670307488 5.0114328558e-02
1755 10 38 12.104658214313 5.0150811464e-02
1756 10 39 12.419865934342 5.0188479178e-02
1757 10 40 12.735457669574 5.0274400520e-02
1758 10 41 13.051776508228 5.0434579043e-02
1759 10 42 13.369680599556 5.0823734576e-02
1760 10 43 13.692588040255 5.2379507260e-02
1761 10 44 14.107844566319 7.1133849421e-01
1762 10 45 14.187236581166 3.7928793494e-01
1763 10 46 14.594380644212 5.2373506719e-02
1764 10 47 14.917269174935 5.0818283761e-02
1765 10 48 15.235177361279 5.0448276173e-02
1766 10 49 15.551572881573 5.0275553109e-02
1767 10 50 15.867181363302 5.0200989890e-02
1768 10 51 16.182478153840 5.0162165919e-02
1769 10 52 16.497564745894 5.0135742671e-02
1770 10 53 16.812518459530 5.0118717599e-02
1771 10 54 17.127366654990 5.0104811881e-02
1772 10 55 17.442200436767 5.0107344212e-02
1773 10 56 17.757000055849 5.0102984772e-02
1774 10 57 18.071841124673 5.0109804819e-02
1775 10 58 18.386674895445 5.0109702949e-02
1776 10 59 18.701560927737 5.0124607323e-02
1777 10 60 19.016623174141 5.0164158187e-02
1778 10 61 19.331884080512 5.0190450407e-02
1779 10 62 19.647413079929 5.0251888282e-02
1780 10 63 19.963546822065 5.0406579782e-02
1781 10 64 20.281224922894 5.0763109007e-02
1782 10 65 20.603322672653 5.2152824949e-02
1783 10 66 21.010020174195 9.5819874396e-01
1784 10 67 21.132148773136 1.3347679823e-01
1785 10 68 21.509670778274 5.2072663584e-02
1786 10 69 21.831531622704 5.0736138567e-02
1787 10 70 22.149083222207 5.0407890022e-02
1788 10 71 22.465250935488 5.0249984471e-02
1789 10 72 22.780802147152 5.0202710220e-02
1790 10 73 23.096025705323 5.0138442854e-02
1791 10 74 23.411028652367 5.0132819602e-02
1792 10 75 23.725937800638 5.0116002070e-02
1793 10 76 24.040881421286 5.0130007719e-02
1794 10 77 24.355864552853 5.0150812579e-02
1795 10 78 24.671384485942 5.0327704962e-02
1796 10 79 25.009552873648 1.0488892533e+00
1797 10 80 25.296256126660 5.0571229122e-02
1798 10 81 25.612224111689 5.0169597274e-02
1799 10 82 25.927222186828 5.0112967297e-02
1800 10 83 26.242000885120 5.0091150839e-02
1801 10 84 26.556719499117 5.0097724814e-02
1802 10 85 26.871433406249 5.0068394761e-02
1803 10 86 27.186050692441 5.0110808585e-02
1804 10 87 27.500912779795 5.0077949287e-02
1805 10 88 27.815526520927 5.0110863649e-02
1806 10 89 28.130458396170 5.0106065715e-02
1807 10 90 28.445352695844 5.0147163110e-02
1808 10 91 28.760453372101 5.0168129164e-02
1809 10 92 29.075899672747 5.0235516523e-02
1810 10 93 29.391600643746 5.0303124519e-02
1811 10 94 29.708679501626 5.0650613851e-02
1812 10 95 30.029192866662 5.1710116889e-02
1813 10 96 30.418374650855 1.0214885163e+00
1814 10 97 30.598548359773 7.2457853328e-02
1815 10 98 30.945940323980 5.1528772999e-02
1816 10 99 31.266119061219 5.0634181256e-02
1817 10 100 31.583535259280 5.0460844956e-02
1818 10 101 31.900580866452 5.0490896942e-02
1819 10 102 32.218275814596 5.0692797910e-02
1820 10 103 32.539182599937 5.1788418122e-02
1821 10 104 32.928556844863 1.0214368840e+00
1822 10 105 33.108625744731 7.2493456650e-02
1823 10 106 33.455813285791 5.1466086016e-02
1824 10 107 33.775682448909 5.0585218503e-02
1825 10 108 34.092547851700 5.0348246477e-02
1826 10 109 34.408466980624 5.0206792028e-02
1827 10 110 34.723685378355 5.0199547651e-02
1828 10 111 35.038992924407 5.0112870320e-02
1829 10 112 35.353833727618 5.0160200008e-02
1830 10 113 35.668877595699 5.0099634697e-02
1831 10 114 35.983685812943 5.0145033658e-02
1832 10 115 36.298399018350 5.0068131926e-02
1833 10 116 36.613424990774 5.0185321954e-02
1834 10 117 36.928343153303 5.0141029531e-02
1835 10 118 37.244277025832 5.0454077997e-02
1836 10 119 37.584739326501 1.0486263541e+00
1837 10 120 37.868470534547 5.0744485632e-02
1838 10 121 38.184840663789 5.0180012516e-02
1839 10 122 38.500071529531 5.0195741237e-02
1840 10 123 38.815322095078 5.0164782806e-02
1841 10 124 39.130628840189 5.0221132048e-02
1842 10 125 39.446162189377 5.0230377557e-02
1843 10 126 39.762136290973 5.0356138236e-02
1844 10 127 40.079105683674 5.0608943066e-02
1845 10 128 40.399163801020 5.1532942746e-02
1846 10 129 40.747518889775 7.3754379152e-02
1847 10 130 40.925384596705 1.0201150240e+00
1848 10 131 41.315593322492 5.1823800079e-02
1849 10 132 41.636981257491 5.0794592840e-02
1850 10 133 41.954841543903 5.0494431424e-02
1851 10 134 42.272293390138 5.0613215429e-02
1852 10 135 42.590488695407 5.0795116508e-02
1853 10 136 42.912976097893 5.2213834153e-02
1854 10 137 43.316710210700 9.8046738210e-01
1855 10 138 43.451871498129 1.1172270071e-01
1856 10 139 43.822096237959 5.2000642613e-02
1857 10 140 44.143970321953 5.0815675043e-02
1858 10 141 44.461630856444 5.0367209883e-02
1859 10 142 44.777700883777 5.0335820617e-02
1860 10 143 45.093545396192 5.0206162704e-02
1861 10 144 45.408651052557 5.0220622881e-02
1862 10 145 45.724268114234 5.0175291429e-02
1863 10 146 46.039302636862 5.0197872106e-02
1864 10 147 46.354827069636 5.0261372457e-02
1865 10 148 46.669995531693 5.0126886503e-02
1866 10 149 46.985473875768 5.0355041060e-02
1867 10 150 47.302206957396 5.0461574804e-02
1868 10 151 47.621618385694 5.1513456538e-02
1869 10 152 48.000313682201 1.0339693465e+00
1870 10 153 48.209148328880 6.1394579748e-02
1871 10 154 48.543993863408 5.1033354924e-02
1872 10 155 48.862882091091 5.0619507783e-02
1873 10 156 49.179923071016 5.0464217555e-02
1874 10 157 49.497875027357 5.1132348830e-02
1875 10 158 49.775548289491 1.0480760350e+00
1876 10 159 50.120307010175 5.0501780742e-02
1877 10 160 50.436465125085 5.0189469635e-02
1878 10 161 50.751496564513 5.0178652946e-02
1879 10 162 51.066715615572 5.0089339766e-02
1880 10 163 51.380995292969 5.0174628047e-02
1881 10 164 51.696027211892 5.0114813332e-02
1882 10 165 52.010674430047 5.0099431730e-02
1883 10 166 52.325645664950 5.0165919037e-02
1884 10 167 52.640422713926 5.0175649282e-02
1885 10 168 52.969548604149 1.0496891625e+00
1886 10 169 53.267834353692 5.0245877320e-02
1887 10 170 53.582908166918 5.0178457562e-02
1888 10 171 53.897483207836 5.0063258304e-02
1889 10 172 54.212610088268 5.0211596887e-02
1890 10 173 54.527179677251 5.0052348196e-02
1891 10 174 54.841535356814 5.0153445656e-02
1892 10 175 55.156450315699 5.0117131609e-02
1893 10 176 55.471109913083 5.0083967356e-02
1894 10 177 55.786011506561 5.0276017302e-02
1895 10 178 56.101911439198 5.0529621932e-02
1896 10 179 56.444663078336 1.0482694400e+00
1897 10 180 56.724942132930 5.1007443346e-02
1898 10 181 57.041823609574 5.0165365923e-02
1899 10 182 57.357366200200 5.0278914792e-02
1900 10 183 57.672546161340 5.0165224935e-02
1901 10 184 57.988136094089 5.0291538021e-02
1902 10 185 58.303788674008 5.0526911715e-02
1903 10 186 58.621979677997 5.0732651281e-02
1904 10 187 58.942804822206 5.1890096093e-02
1905 10 188 59.339006325934 1.0068471079e+00
1906 10 189 59.497423289308 8.6267830312e-02
1907 10 190 59.854970397850 5.1817790556e-02
1908 10 191 60.175907956391 5.0666451078e-02
1909 10 192 60.493908805402 5.0737331120e-02
1910 10 193 60.830635532850 1.0493491203e+00
1911 10 194 61.121907794122 5.0627546501e-02
1912 10 195 61.438156855062 5.0304084169e-02
1913 10 196 61.753456814497 5.0221288620e-02
1914 10 197 62.068565945332 5.0281355590e-02
1915 10 198 62.383568953977 5.0027043301e-02
1916 10 199 62.698310757824 5.0268378601e-02
1917 10 200 63.013507413120 5.0076839038e-02
1918 10 201 63.328942119165 5.0349918979e-02
1919 10 202 63.644557278586 5.0220523019e-02
1920 10 203 63.959966484701 5.0466275623e-02
1921 10 204 64.276399909457 5.0816380505e-02
1922 10 205 64.597327131190 5.1647989952e-02
1923 10 206 64.948561683169 7.7450981222e-02
1924 10 207 65.119630729910 1.0161358341e+00
1925 10 208 65.511986619040 5.1847156010e-02
1926 10 209 65.832516857965 5.0918823921e-02
1927 10 210 66.150107672628 5.0284276925e-02
1928 10 211 66.465756716013 5.0486047533e-02
1929 10 212 66.781993652797 5.0187837524e-02
1930 10 213 67.080618402389 1.0500027236e+00
1931 10 214 67.410824755341 5.0078872439e-02
1932 10 215 67.725807939968 5.0360410711e-02
1933 10 216 68.041544027079 5.0399978731e-02
1934 10 217 68.357104403430 5.0392473101e-02
1935 10 218 68.672958871820 5.0372513205e-02
1936 10 219 68.990396136782 5.0971485787e-02
1937 10 220 69.317371877641 5.6047999970e-02
1938 10 221 69.550101068195 1.0406930190e+00
1939 10 222 69.918998611658 5.1155903487e-02
1940 10 223 70.237513216123 5.0535084383e-02
1941 10 224 70.554226614538 5.0267589458e-02
1942 10 225 70.868577985191 5.0555507043e-02
1943 10 226 71.185340758414 5.0430091461e-02
1944 10 227 71.502354568032 5.1053521898e-02
1945 10 228 71.827133260729 5.4153782370e-02
1946 10 229 72.070345148736 1.0432394146e+00
1947 10 230 72.434887744183 5.1237231210e-02
1948 10 231 72.751432665622 5.0358830690e-02
1949 10 232 73.067803173234 5.0516456838e-02
1950 10 233 73.383660326587 5.0187188211e-02
1951 10 234 73.698977150585 5.0244556800e-02
1952 10 235 74.014539376291 5.0485550478e-02
1953 10 236 74.330703225988 5.0262454660e-02
1954 10 237 74.646303669063 5.0785781973e-02
1955 10 238 74.964285456449 5.0715190715e-02
1956 10 239 75.286928589061 5.2392722546e-02
1957 10 240 75.693057545006 9.6346340781e-01
1958 10 241 75.817940886233 1.2850311419e-01
1959 10 242 76.194614824737 5.2417057901e-02
1960 10 243 76.515612516635 5.0674372961e-02
1961 10 244 76.832883450338 5.0649955043e-02
1962 10 245 77.145049849126 1.0503376784e+00
1963 10 246 77.464834975213 5.0706486959e-02
1964 10 247 77.780411032695 5.0105436604e-02
1965 10 248 78.095164348406 5.0328835996e-02
1966 10 249 78.410346652727 5.0137207649e-02
1967 10 250 78.726104762558 5.0593827599e-02
1968 10 251 79.041040206330 5.0437128645e-02
1969 10 252 79.338228466436 1.0496329927e+00
1970 10 253 79.668677507057 5.0199168536e-02
1971 10 254 79.984105498188 5.0577417598e-02
1972 10 255 80.300038040505 5.0305669384e-02
1973 10 256 80.612981079355 5.0288529557e-02
1974 10 257 80.928860036363 5.0383043678e-02
1975 10 258 81.244777638259 5.0784637116e-02
1976 10 259 81.559500402643 5.0206081995e-02
1977 10 260 81.875696737095 5.0485778270e-02
1978 10 261 82.193036183798 5.0801259975e-02
1979 10 262 82.515310298165 5.2096117084e-02
1980 10 263 82.903570676807 1.0193289807e+00
1981 10 264 83.079954368167 7.4786625341e-02
1982 10 265 83.429508649644 5.1767236547e-02
1983 10 266 83.749635445188 5.0875356087e-02
1984 10 267 84.067417865505 5.1117057529e-02
1985 10 268 84.385047096887 5.0860807111e-02
1986 10 269 84.733595689114 1.0479046720e+00
1987 10 270 85.006663888785 5.1165586155e-02
1988 10 271 85.325513035640 5.0698755194e-02
1989 10 272 85.642298704269 5.0335977408e-02
1990 10 273 85.957506744894 5.0511858065e-02
1991 10 274 86.274283480965 5.0535565886e-02
1992 10 275 86.590430313513 5.1321290852e-02
1993 10 276 86.912594867537 5.1751405254e-02
1994 10 277 87.266419336586 8.0976055945e-02
1995 10 278 87.432805512326 1.0127069546e+00
1996 10 279 87.825607597105 5.2667564181e-02
1997 10 280 88.147444877620 5.1432888874e-02
1998 10 281 88.465536907537 5.0691283666e-02
1999 10 282 88.807677796853 1.0491343650e+00
2000 10 283 89.093784409853 5.1162957427e-02
2001 10 284 89.410551618829 5.0297774306e-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())