Current task: —

E-016-herglotz-fine-structure.py

Experiments: E-016 · script updated 08-18-2026

E-016-herglotz-fine-structure.csv — 130.1 KB, updated 08-18-2026

page 1 of 8 · 500/page · 3519 rows next →
# seriesayrho
2 F - 0.500000 6.3713110109e-01
3 F - 0.550000 5.7930752798e-01
4 F - 0.600000 5.3112965737e-01
5 F - 0.650000 4.9037154136e-01
6 F - 0.700000 4.5544321587e-01
7 F - 0.750000 4.2517870604e-01
8 F - 0.800000 3.9870352957e-01
9 F - 0.850000 3.7534896368e-01
10 F - 0.900000 3.5459488962e-01
11 F - 0.950000 3.3603068644e-01
12 F - 1.000000 3.1932785647e-01
13 F - 1.050000 3.0422047221e-01
14 F - 1.100000 2.9049095584e-01
15 F - 1.150000 2.7795956840e-01
16 F - 1.200000 2.6647652675e-01
17 F - 1.250000 2.5591601235e-01
18 F - 1.300000 2.4617156274e-01
19 F - 1.350000 2.3715248708e-01
20 F - 1.400000 2.2878104978e-01
21 F - 1.450000 2.2099023685e-01
22 F - 1.500000 2.1372196898e-01
23 F - 1.550000 2.0692566047e-01
24 F - 1.600000 2.0055704835e-01
25 F - 1.650000 1.9457723439e-01
26 F - 1.700000 1.8895189622e-01
27 F - 1.750000 1.8365063359e-01
28 F - 1.800000 1.7864642365e-01
29 F - 1.850000 1.7391516459e-01
30 F - 1.900000 1.6943529123e-01
31 F - 1.950000 1.6518744990e-01
32 F - 2.000000 1.6115422194e-01
33 F - 2.050000 1.5731988775e-01
34 F - 2.100000 1.5367022455e-01
35 F - 2.150000 1.5019233231e-01
36 F - 2.200000 1.4687448346e-01
37 F - 2.250000 1.4370599260e-01
38 F - 2.300000 1.4067710328e-01
39 F - 2.350000 1.3777888911e-01
40 F - 2.400000 1.3500316734e-01
41 F - 2.450000 1.3234242301e-01
42 F - 2.500000 1.2978974213e-01
43 F - 2.550000 1.2733875278e-01
44 F - 2.600000 1.2498357300e-01
45 F - 2.650000 1.2271876460e-01
46 F - 2.700000 1.2053929200e-01
47 F - 2.750000 1.1844048574e-01
48 F - 2.800000 1.1641800970e-01
49 F - 2.850000 1.1446783191e-01
50 F - 2.900000 1.1258619834e-01
51 F - 2.950000 1.1076960934e-01
52 F - 3.000000 1.0901479845e-01
53 F - 3.050000 1.0731871328e-01
54 F - 3.100000 1.0567849827e-01
55 F - 3.150000 1.0409147906e-01
56 F - 3.200000 1.0255514834e-01
57 F - 3.250000 1.0106715301e-01
58 F - 3.300000 9.9625282515e-02
59 F - 3.350000 9.8227458170e-02
60 F - 3.400000 9.6871723512e-02
61 F - 3.450000 9.5556235428e-02
62 F - 3.500000 9.4279256065e-02
63 F - 3.550000 9.3039145423e-02
64 F - 3.600000 9.1834354562e-02
65 F - 3.650000 9.0663419373e-02
66 F - 3.700000 8.9524954845e-02
67 F - 3.750000 8.8417649799e-02
68 F - 3.800000 8.7340262036e-02
69 F - 3.850000 8.6291613858e-02
70 F - 3.900000 8.5270587938e-02
71 F - 3.950000 8.4276123505e-02
72 F - 4.000000 8.3307212809e-02
73 F - 4.050000 8.2362897856e-02
74 F - 4.100000 8.1442267373e-02
75 F - 4.150000 8.0544454001e-02
76 F - 4.200000 7.9668631681e-02
77 F - 4.250000 7.8814013228e-02
78 F - 4.300000 7.7979848078e-02
79 F - 4.350000 7.7165420181e-02
80 F - 4.400000 7.6370046045e-02
81 F - 4.450000 7.5593072911e-02
82 F - 4.500000 7.4833877047e-02
83 F - 4.550000 7.4091862158e-02
84 F - 4.600000 7.3366457892e-02
85 F - 4.650000 7.2657118453e-02
86 F - 4.700000 7.1963321298e-02
87 F - 4.750000 7.1284565910e-02
88 F - 4.800000 7.0620372658e-02
89 F - 4.850000 6.9970281720e-02
90 F - 4.900000 6.9333852079e-02
91 F - 4.950000 6.8710660567e-02
92 F - 5.000000 6.8100300984e-02
93 F - 5.050000 6.7502383253e-02
94 F - 5.100000 6.6916532635e-02
95 F - 5.150000 6.6342388986e-02
96 F - 5.200000 6.5779606056e-02
97 F - 5.250000 6.5227850830e-02
98 F - 5.300000 6.4686802906e-02
99 F - 5.350000 6.4156153905e-02
100 F - 5.400000 6.3635606918e-02
101 F - 5.450000 6.3124875982e-02
102 F - 5.500000 6.2623685580e-02
103 F - 5.550000 6.2131770176e-02
104 F - 5.600000 6.1648873770e-02
105 F - 5.650000 6.1174749474e-02
106 F - 5.700000 6.0709159120e-02
107 F - 5.750000 6.0251872874e-02
108 F - 5.800000 5.9802668886e-02
109 F - 5.850000 5.9361332942e-02
110 F - 5.900000 5.8927658149e-02
111 F - 5.950000 5.8501444623e-02
112 F - 6.000000 5.8082499200e-02
113 F - 6.050000 5.7670635159e-02
114 F - 6.100000 5.7265671958e-02
115 F - 6.150000 5.6867434987e-02
116 F - 6.200000 5.6475755323e-02
117 F - 6.250000 5.6090469510e-02
118 F - 6.300000 5.5711419339e-02
119 F - 6.350000 5.5338451643e-02
120 F - 6.400000 5.4971418100e-02
121 F - 6.450000 5.4610175046e-02
122 F - 6.500000 5.4254583299e-02
123 F - 6.550000 5.3904507984e-02
124 F - 6.600000 5.3559818373e-02
125 F - 6.650000 5.3220387728e-02
126 F - 6.700000 5.2886093156e-02
127 F - 6.750000 5.2556815462e-02
128 F - 6.800000 5.2232439017e-02
129 F - 6.850000 5.1912851626e-02
130 F - 6.900000 5.1597944405e-02
131 F - 6.950000 5.1287611662e-02
132 F - 7.000000 5.0981750783e-02
133 F - 7.050000 5.0680262125e-02
134 F - 7.100000 5.0383048905e-02
135 F - 7.150000 5.0090017109e-02
136 F - 7.200000 4.9801075391e-02
137 F - 7.250000 4.9516134980e-02
138 F - 7.300000 4.9235109595e-02
139 F - 7.350000 4.8957915360e-02
140 F - 7.400000 4.8684470718e-02
141 F - 7.450000 4.8414696362e-02
142 F - 7.500000 4.8148515151e-02
143 F - 7.550000 4.7885852044e-02
144 F - 7.600000 4.7626634028e-02
145 F - 7.650000 4.7370790053e-02
146 F - 7.700000 4.7118250970e-02
147 F - 7.750000 4.6868949463e-02
148 F - 7.800000 4.6622819997e-02
149 F - 7.850000 4.6379798760e-02
150 F - 7.900000 4.6139823603e-02
151 F - 7.950000 4.5902833996e-02
152 F - 8.000000 4.5668770970e-02
153 F - 8.050000 4.5437577070e-02
154 F - 8.100000 4.5209196311e-02
155 F - 8.150000 4.4983574131e-02
156 F - 8.200000 4.4760657346e-02
157 F - 8.250000 4.4540394109e-02
158 F - 8.300000 4.4322733870e-02
159 F - 8.350000 4.4107627337e-02
160 F - 8.400000 4.3895026437e-02
161 F - 8.450000 4.3684884280e-02
162 F - 8.500000 4.3477155125e-02
163 F - 8.550000 4.3271794346e-02
164 F - 8.600000 4.3068758398e-02
165 F - 8.650000 4.2868004785e-02
166 F - 8.700000 4.2669492034e-02
167 F - 8.750000 4.2473179658e-02
168 F - 8.800000 4.2279028136e-02
169 F - 8.850000 4.2086998877e-02
170 F - 8.900000 4.1897054201e-02
171 F - 8.950000 4.1709157308e-02
172 F - 9.000000 4.1523272256e-02
173 F - 9.050000 4.1339363937e-02
174 F - 9.100000 4.1157398050e-02
175 F - 9.150000 4.0977341084e-02
176 F - 9.200000 4.0799160293e-02
177 F - 9.250000 4.0622823675e-02
178 F - 9.300000 4.0448299953e-02
179 F - 9.350000 4.0275558553e-02
180 F - 9.400000 4.0104569588e-02
181 F - 9.450000 3.9935303837e-02
182 F - 9.500000 3.9767732727e-02
183 F - 9.550000 3.9601828320e-02
184 F - 9.600000 3.9437563289e-02
185 F - 9.650000 3.9274910906e-02
186 F - 9.700000 3.9113845028e-02
187 F - 9.750000 3.8954340078e-02
188 F - 9.800000 3.8796371031e-02
189 F - 9.850000 3.8639913401e-02
190 F - 9.900000 3.8484943225e-02
191 F - 9.950000 3.8331437052e-02
192 F - 10.000000 3.8179371928e-02
193 F - 10.050000 3.8028725384e-02
194 F - 10.100000 3.7879475422e-02
195 F - 10.150000 3.7731600507e-02
196 F - 10.200000 3.7585079551e-02
197 F - 10.250000 3.7439891903e-02
198 F - 10.300000 3.7296017340e-02
199 F - 10.350000 3.7153436054e-02
200 F - 10.400000 3.7012128643e-02
201 F - 10.450000 3.6872076099e-02
202 F - 10.500000 3.6733259803e-02
203 F - 10.550000 3.6595661508e-02
204 F - 10.600000 3.6459263337e-02
205 F - 10.650000 3.6324047770e-02
206 F - 10.700000 3.6189997636e-02
207 F - 10.750000 3.6057096106e-02
208 F - 10.800000 3.5925326683e-02
209 F - 10.850000 3.5794673194e-02
210 F - 10.900000 3.5665119784e-02
211 F - 10.950000 3.5536650907e-02
212 F - 11.000000 3.5409251319e-02
213 F - 11.050000 3.5282906071e-02
214 F - 11.100000 3.5157600502e-02
215 F - 11.150000 3.5033320231e-02
216 F - 11.200000 3.4910051154e-02
217 F - 11.250000 3.4787779432e-02
218 F - 11.300000 3.4666491492e-02
219 F - 11.350000 3.4546174012e-02
220 F - 11.400000 3.4426813924e-02
221 F - 11.450000 3.4308398403e-02
222 F - 11.500000 3.4190914862e-02
223 F - 11.550000 3.4074350948e-02
224 F - 11.600000 3.3958694535e-02
225 F - 11.650000 3.3843933722e-02
226 F - 11.700000 3.3730056822e-02
227 F - 11.750000 3.3617052365e-02
228 F - 11.800000 3.3504909086e-02
229 F - 11.850000 3.3393615924e-02
230 F - 11.900000 3.3283162019e-02
231 F - 11.950000 3.3173536702e-02
232 F - 12.000000 3.3064729498e-02
233 F - 12.050000 3.2956730115e-02
234 F - 12.100000 3.2849528444e-02
235 F - 12.150000 3.2743114554e-02
236 F - 12.200000 3.2637478688e-02
237 F - 12.250000 3.2532611261e-02
238 F - 12.300000 3.2428502850e-02
239 F - 12.350000 3.2325144201e-02
240 F - 12.400000 3.2222526214e-02
241 F - 12.450000 3.2120639949e-02
242 F - 12.500000 3.2019476618e-02
243 F - 12.550000 3.1919027580e-02
244 F - 12.600000 3.1819284344e-02
245 F - 12.650000 3.1720238560e-02
246 F - 12.700000 3.1621882019e-02
247 F - 12.750000 3.1524206648e-02
248 F - 12.800000 3.1427204511e-02
249 F - 12.850000 3.1330867802e-02
250 F - 12.900000 3.1235188843e-02
251 F - 12.950000 3.1140160084e-02
252 F - 13.000000 3.1045774098e-02
253 F - 13.050000 3.0952023580e-02
254 F - 13.100000 3.0858901341e-02
255 F - 13.150000 3.0766400310e-02
256 F - 13.200000 3.0674513531e-02
257 F - 13.250000 3.0583234157e-02
258 F - 13.300000 3.0492555451e-02
259 F - 13.350000 3.0402470786e-02
260 F - 13.400000 3.0312973635e-02
261 F - 13.450000 3.0224057577e-02
262 F - 13.500000 3.0135716291e-02
263 F - 13.550000 3.0047943555e-02
264 F - 13.600000 2.9960733243e-02
265 F - 13.650000 2.9874079326e-02
266 F - 13.700000 2.9787975864e-02
267 F - 13.750000 2.9702417013e-02
268 F - 13.800000 2.9617397016e-02
269 F - 13.850000 2.9532910202e-02
270 F - 13.900000 2.9448950989e-02
271 F - 13.950000 2.9365513879e-02
272 F - 14.000000 2.9282593454e-02
273 F - 14.050000 2.9200184380e-02
274 F - 14.100000 2.9118281402e-02
275 F - 14.150000 2.9036879341e-02
276 F - 14.200000 2.8955973098e-02
277 F - 14.250000 2.8875557645e-02
278 F - 14.300000 2.8795628031e-02
279 F - 14.350000 2.8716179377e-02
280 F - 14.400000 2.8637206873e-02
281 F - 14.450000 2.8558705779e-02
282 F - 14.500000 2.8480671426e-02
283 F - 14.550000 2.8403099208e-02
284 F - 14.600000 2.8325984588e-02
285 F - 14.650000 2.8249323093e-02
286 F - 14.700000 2.8173110312e-02
287 F - 14.750000 2.8097341897e-02
288 F - 14.800000 2.8022013562e-02
289 F - 14.850000 2.7947121079e-02
290 F - 14.900000 2.7872660282e-02
291 F - 14.950000 2.7798627059e-02
292 F - 15.000000 2.7725017358e-02
293 F - 15.050000 2.7651827182e-02
294 F - 15.100000 2.7579052587e-02
295 F - 15.150000 2.7506689684e-02
296 F - 15.200000 2.7434734639e-02
297 F - 15.250000 2.7363183667e-02
298 F - 15.300000 2.7292033034e-02
299 F - 15.350000 2.7221279058e-02
300 F - 15.400000 2.7150918105e-02
301 F - 15.450000 2.7080946590e-02
302 F - 15.500000 2.7011360975e-02
303 F - 15.550000 2.6942157769e-02
304 F - 15.600000 2.6873333526e-02
305 F - 15.650000 2.6804884847e-02
306 F - 15.700000 2.6736808376e-02
307 F - 15.750000 2.6669100801e-02
308 F - 15.800000 2.6601758852e-02
309 F - 15.850000 2.6534779303e-02
310 F - 15.900000 2.6468158966e-02
311 F - 15.950000 2.6401894698e-02
312 F - 16.000000 2.6335983393e-02
313 F - 16.050000 2.6270421985e-02
314 F - 16.100000 2.6205207448e-02
315 F - 16.150000 2.6140336792e-02
316 F - 16.200000 2.6075807065e-02
317 F - 16.250000 2.6011615354e-02
318 F - 16.300000 2.5947758778e-02
319 F - 16.350000 2.5884234496e-02
320 F - 16.400000 2.5821039699e-02
321 F - 16.450000 2.5758171613e-02
322 F - 16.500000 2.5695627500e-02
323 F - 16.550000 2.5633404652e-02
324 F - 16.600000 2.5571500396e-02
325 F - 16.650000 2.5509912092e-02
326 F - 16.700000 2.5448637129e-02
327 F - 16.750000 2.5387672929e-02
328 F - 16.800000 2.5327016945e-02
329 F - 16.850000 2.5266666659e-02
330 F - 16.900000 2.5206619585e-02
331 F - 16.950000 2.5146873264e-02
332 F - 17.000000 2.5087425268e-02
333 F - 17.050000 2.5028273194e-02
334 F - 17.100000 2.4969414671e-02
335 F - 17.150000 2.4910847353e-02
336 F - 17.200000 2.4852568923e-02
337 F - 17.250000 2.4794577088e-02
338 F - 17.300000 2.4736869584e-02
339 F - 17.350000 2.4679444171e-02
340 F - 17.400000 2.4622298636e-02
341 F - 17.450000 2.4565430790e-02
342 F - 17.500000 2.4508838469e-02
343 F - 17.550000 2.4452519534e-02
344 F - 17.600000 2.4396471869e-02
345 F - 17.650000 2.4340693382e-02
346 F - 17.700000 2.4285182005e-02
347 F - 17.750000 2.4229935691e-02
348 F - 17.800000 2.4174952418e-02
349 F - 17.850000 2.4120230186e-02
350 F - 17.900000 2.4065767014e-02
351 F - 17.950000 2.4011560946e-02
352 F - 18.000000 2.3957610046e-02
353 F - 18.050000 2.3903912399e-02
354 F - 18.100000 2.3850466110e-02
355 F - 18.150000 2.3797269306e-02
356 F - 18.200000 2.3744320133e-02
357 F - 18.250000 2.3691616756e-02
358 F - 18.300000 2.3639157362e-02
359 F - 18.350000 2.3586940155e-02
360 F - 18.400000 2.3534963359e-02
361 F - 18.450000 2.3483225217e-02
362 F - 18.500000 2.3431723988e-02
363 F - 18.550000 2.3380457953e-02
364 F - 18.600000 2.3329425408e-02
365 F - 18.650000 2.3278624668e-02
366 F - 18.700000 2.3228054065e-02
367 F - 18.750000 2.3177711948e-02
368 F - 18.800000 2.3127596684e-02
369 F - 18.850000 2.3077706656e-02
370 F - 18.900000 2.3028040263e-02
371 F - 18.950000 2.2978595921e-02
372 F - 19.000000 2.2929372061e-02
373 F - 19.050000 2.2880367132e-02
374 F - 19.100000 2.2831579596e-02
375 F - 19.150000 2.2783007932e-02
376 F - 19.200000 2.2734650634e-02
377 F - 19.250000 2.2686506211e-02
378 F - 19.300000 2.2638573186e-02
379 F - 19.350000 2.2590850098e-02
380 F - 19.400000 2.2543335500e-02
381 F - 19.450000 2.2496027957e-02
382 F - 19.500000 2.2448926052e-02
383 F - 19.550000 2.2402028378e-02
384 F - 19.600000 2.2355333545e-02
385 F - 19.650000 2.2308840173e-02
386 F - 19.700000 2.2262546899e-02
387 F - 19.750000 2.2216452371e-02
388 F - 19.800000 2.2170555249e-02
389 F - 19.850000 2.2124854208e-02
390 F - 19.900000 2.2079347935e-02
391 F - 19.950000 2.2034035129e-02
392 F - 20.000000 2.1988914501e-02
393 W_thpi 4.0 0.500000 1.7309833845e+00
394 W_thpi 4.0 0.550000 1.6516192939e+00
395 W_thpi 4.0 0.600000 1.5895296883e+00
396 W_thpi 4.0 0.650000 1.5402982059e+00
397 W_thpi 4.0 0.700000 1.5008020246e+00
398 W_thpi 4.0 0.750000 1.4687826327e+00
399 W_thpi 4.0 0.800000 1.4425760972e+00
400 W_thpi 4.0 0.850000 1.4209374839e+00
401 W_thpi 4.0 0.900000 1.4029231023e+00
402 W_thpi 4.0 0.950000 1.3878095094e+00
403 W_thpi 4.0 1.000000 1.3750365897e+00
404 W_thpi 4.0 1.050000 1.3641668217e+00
405 W_thpi 4.0 1.100000 1.3548556731e+00
406 W_thpi 4.0 1.150000 1.3468297992e+00
407 W_thpi 4.0 1.200000 1.3398708048e+00
408 W_thpi 4.0 1.250000 1.3338030289e+00
409 W_thpi 4.0 1.300000 1.3284842776e+00
410 W_thpi 4.0 1.350000 1.3237987363e+00
411 W_thpi 4.0 1.400000 1.3196515131e+00
412 W_thpi 4.0 1.450000 1.3159644084e+00
413 W_thpi 4.0 1.500000 1.3126726173e+00
414 W_thpi 4.0 1.550000 1.3097221424e+00
415 W_thpi 4.0 1.600000 1.3070677543e+00
416 W_thpi 4.0 1.650000 1.3046713742e+00
417 W_thpi 4.0 1.700000 1.3025007854e+00
418 W_thpi 4.0 1.750000 1.3005286009e+00
419 W_thpi 4.0 1.800000 1.2987314328e+00
420 W_thpi 4.0 1.850000 1.2970892200e+00
421 W_thpi 4.0 1.900000 1.2955846825e+00
422 W_thpi 4.0 1.950000 1.2942028751e+00
423 W_thpi 4.0 2.000000 1.2929308216e+00
424 W_thpi 4.0 2.050000 1.2917572136e+00
425 W_thpi 4.0 2.100000 1.2906721609e+00
426 W_thpi 4.0 2.150000 1.2896669842e+00
427 W_thpi 4.0 2.200000 1.2887340417e+00
428 W_thpi 4.0 2.250000 1.2878665847e+00
429 W_thpi 4.0 2.300000 1.2870586348e+00
430 W_thpi 4.0 2.350000 1.2863048814e+00
431 W_thpi 4.0 2.400000 1.2856005938e+00
432 W_thpi 4.0 2.450000 1.2849415472e+00
433 W_thpi 4.0 2.500000 1.2843239589e+00
434 W_thpi 4.0 2.550000 1.2837444343e+00
435 W_thpi 4.0 2.600000 1.2831999195e+00
436 W_thpi 4.0 2.650000 1.2826876616e+00
437 W_thpi 4.0 2.700000 1.2822051735e+00
438 W_thpi 4.0 2.750000 1.2817502037e+00
439 W_thpi 4.0 2.800000 1.2813207101e+00
440 W_thpi 4.0 2.850000 1.2809148369e+00
441 W_thpi 4.0 2.900000 1.2805308946e+00
442 W_thpi 4.0 2.950000 1.2801673424e+00
443 W_thpi 4.0 3.000000 1.2798227730e+00
444 W_thpi 4.0 3.050000 1.2794958986e+00
445 W_thpi 4.0 3.100000 1.2791855389e+00
446 W_thpi 4.0 3.150000 1.2788906110e+00
447 W_thpi 4.0 3.200000 1.2786101193e+00
448 W_thpi 4.0 3.250000 1.2783431474e+00
449 W_thpi 4.0 3.300000 1.2780888508e+00
450 W_thpi 4.0 3.350000 1.2778464502e+00
451 W_thpi 4.0 3.400000 1.2776152252e+00
452 W_thpi 4.0 3.450000 1.2773945095e+00
453 W_thpi 4.0 3.500000 1.2771836858e+00
454 W_thpi 4.0 3.550000 1.2769821815e+00
455 W_thpi 4.0 3.600000 1.2767894652e+00
456 W_thpi 4.0 3.650000 1.2766050427e+00
457 W_thpi 4.0 3.700000 1.2764284544e+00
458 W_thpi 4.0 3.750000 1.2762592722e+00
459 W_thpi 4.0 3.800000 1.2760970967e+00
460 W_thpi 4.0 3.850000 1.2759415553e+00
461 W_thpi 4.0 3.900000 1.2757923001e+00
462 W_thpi 4.0 3.950000 1.2756490056e+00
463 W_thpi 4.0 4.000000 1.2755113671e+00
464 W_thpi 4.0 4.050000 1.2753790994e+00
465 W_thpi 4.0 4.100000 1.2752519350e+00
466 W_thpi 4.0 4.150000 1.2751296228e+00
467 W_thpi 4.0 4.200000 1.2750119273e+00
468 W_thpi 4.0 4.250000 1.2748986268e+00
469 W_thpi 4.0 4.300000 1.2747895132e+00
470 W_thpi 4.0 4.350000 1.2746843902e+00
471 W_thpi 4.0 4.400000 1.2745830733e+00
472 W_thpi 4.0 4.450000 1.2744853882e+00
473 W_thpi 4.0 4.500000 1.2743911709e+00
474 W_thpi 4.0 4.550000 1.2743002661e+00
475 W_thpi 4.0 4.600000 1.2742125276e+00
476 W_thpi 4.0 4.650000 1.2741278168e+00
477 W_thpi 4.0 4.700000 1.2740460030e+00
478 W_thpi 4.0 4.750000 1.2739669622e+00
479 W_thpi 4.0 4.800000 1.2738905770e+00
480 W_thpi 4.0 4.850000 1.2738167364e+00
481 W_thpi 4.0 4.900000 1.2737453350e+00
482 W_thpi 4.0 4.950000 1.2736762726e+00
483 W_thpi 4.0 5.000000 1.2736094545e+00
484 W_thpi 4.0 5.050000 1.2735447904e+00
485 W_thpi 4.0 5.100000 1.2734821948e+00
486 W_thpi 4.0 5.150000 1.2734215862e+00
487 W_thpi 4.0 5.200000 1.2733628871e+00
488 W_thpi 4.0 5.250000 1.2733060239e+00
489 W_thpi 4.0 5.300000 1.2732509262e+00
490 W_thpi 4.0 5.350000 1.2731975272e+00
491 W_thpi 4.0 5.400000 1.2731457632e+00
492 W_thpi 4.0 5.450000 1.2730955734e+00
493 W_thpi 4.0 5.500000 1.2730468998e+00
494 W_thpi 4.0 5.550000 1.2729996870e+00
495 W_thpi 4.0 5.600000 1.2729538821e+00
496 W_thpi 4.0 5.650000 1.2729094348e+00
497 W_thpi 4.0 5.700000 1.2728662966e+00
498 W_thpi 4.0 5.750000 1.2728244214e+00
499 W_thpi 4.0 5.800000 1.2727837652e+00
500 W_thpi 4.0 5.850000 1.2727442856e+00
501 W_thpi 4.0 5.900000 1.2727059423e+00

E-016-herglotz-fine-structure.json — 3.0 KB, updated 08-18-2026

JSON sidecar (click to expand)
{
  "experiment": "E-016",
  "task": "Q-S3c: Herglotz fine structure of W at theta=pi vs F",
  "description": "Poisson-smoothed zero density -(1/pi) Im W'/W(iy) at theta=pi (and theta=0 control) vs rho_F; analytic Galerkin z-derivative; zero-Poisson reconstruction cross-check",
  "script": "research/numerics/scripts/E-016-herglotz-fine-structure.py",
  "parameters": {
    "a_sweep": [
      4.0,
      6.0,
      8.0,
      10.0
    ],
    "h": 0.01,
    "lambda": -1.0,
    "y_grid": [
      0.5,
      20.0,
      391
    ],
    "z_max_zeros": 300.0
  },
  "checks": {
    "V1_plateau_density": true,
    "V2_rhoF_finitediff": true,
    "V3_poisson_reconstruction": false,
    "V4_vmirror_symmetry": true
  },
  "key_values": {
    "xi_flint_crosscheck_rel": 8.821833278620677e-17,
    "rhoF_finitediff_max_rel": 1.3322584092623682e-08,
    "metrics": {
      "4.0": {
        "n_zeros": 381,
        "z1": 1.1260734006983593,
        "plateau": 1.2713747663068067,
        "density_a_over_pi": 1.2732395447351628,
        "plateau_rel_dev": 0.0014645935527740487,
        "v3_rel": 0.32451368257591473,
        "kappa_shift": -0.21982980149584136,
        "d_pi": 1.2200734562385358,
        "d_zero": 1.2165204320831793
      },
      "6.0": {
        "n_zeros": 572,
        "z1": 0.7499016225074712,
        "plateau": 1.9083309455490012,
        "density_a_over_pi": 1.909859317102744,
        "plateau_rel_dev": 0.00080025347419903,
        "v3_rel": 0.2938167612479611,
        "kappa_shift": -0.39086861455767985,
        "d_pi": 1.855357135046592,
        "d_zero": 1.8529753375094085
      },
      "8.0": {
        "n_zeros": 763,
        "z1": 0.5621012628096893,
        "plateau": 2.5451204974114527,
        "density_a_over_pi": 2.5464790894703255,
        "plateau_rel_dev": 0.0005335178539225225,
        "v3_rel": 0.2792472337188209,
        "kappa_shift": -0.5618837715660804,
        "d_pi": 2.4914430957151077,
        "d_zero": 2.489482228965594
      },
      "10.0": {
        "n_zeros": 954,
        "z1": 0.44959700551214055,
        "plateau": 3.1817851862991344,
        "density_a_over_pi": 3.183098861837907,
        "plateau_rel_dev": 0.00041270334218086014,
        "v3_rel": 0.27086948306792724,
        "kappa_shift": -0.7328752211905654,
        "d_pi": 3.127620084707738,
        "d_zero": 3.126136732274815
      }
    },
    "vmirror_sym_err": 3.797860165317667e-14
  },
  "caveats": [
    "Galerkin discretization h=0.01 (E-010 h-convergence: z1 rel drift 4e-4 between h=0.01 and 0.005 at a=4)",
    "Poisson smoothing at height y averages over scale ~y: lattice oscillations at spacing pi/a are suppressed ~e^{-2ay}; the sensitive region is y <~ few (low zeros resolve individually)",
    "theta=pi vs theta=0 comparison is the sharp test of the H4 read-off (D-023): if theta=pi is correct, d_pi should lie systematically below d_zero as a grows"
  ],
  "elapsed_seconds": 32.7,
  "timestamp_utc": "2026-08-18T10:57:35.113504+00:00",
  "row_count": 3520
}

Source code

Python script (click to expand)
"""E-016 — Q-S3c: Herglotz (Poisson) fine structure of W at theta=pi vs F.

Theory (D-023 §4, item 3): for entire W with ALL REAL zeros z_j,
  -Im(W'/W)(iy) = -Im(kappa) + sum_j y/(y^2 + z_j^2)
is (pi times) the Poisson-smoothed zero density at height y. Individual
zeros within |z_j| <~ y leave distinguishable fingerprints, so this
diagnostic detects sub-lattice-scale zero redistribution BEFORE the
density collapses (Cor 1.6 requires the a->inf zeros to become the
gamma_j / xi'-zeros of F = z^2 xi(1/2-iz)/xi'(1/2-iz)).

For F on the imaginary axis (z = iy, s = 1/2+y real):
  rho_F(y) := -(1/pi) Im F'/F(iy)
           = (1/pi)[ 2/y + xi'/xi(1/2+y) - xi''/xi'(1/2+y) ].
Equivalently rho_F(y) = (1/pi) d/dy log|F(iy)|  (finite-diff check V2).

Diagnostics per a in {4,6,8,10} (h=0.01, lambda=-1, theta=pi; theta=0
control):
  D1. rho_W(y; a, pi) on y in [0.5, 20] via the ANALYTIC z-derivative of
      the Galerkin Fourier representation (no finite differences):
        V(z)  = hat(z) sum c_j e^{i z x_j}
        V'(z) = hat'(z) sum c_j e^{i z x_j} + hat(z) sum (i x_j) c_j e^{i z x_j}
        W(z)  = (z-i) Vp + e^{i theta} (z+i) Vm   (and z-derivative).
  D2. rho_F(y) analytic; cross-checked vs finite differences of
      log|F(iy)| (V2).
  D3. Zero-Poisson reconstruction: zeros of W(.,pi) located on the real
      axis (|W|-minima polished); rho from the Poisson sum must match D1
      up to the additive constant -Im(kappa)/pi (mean-matched over the
      window) — validates the derivative machinery (V3).
  D4. Metrics vs a: plateau value vs a/pi (density law); L2 distance
      d(a,theta) = ||rho_W - rho_F|| on [1,20] (theta=pi vs theta=0 —
      does theta=pi actually sharpen the approach?); oscillation
      envelope of rho_W at small y.

Checks:
  V1. plateau: |mean rho_W(y in [10,20]) - a/pi| / (a/pi) < 0.05.
  V2. rho_F analytic vs finite-diff of log|F|: max rel dev < 1e-6.
  V3. Poisson reconstruction from located zeros matches D1 (mean-matched
      L2 / rms < 0.02).
  V4. mirror symmetry v-(x) = v+(-x) rel err < 1e-6 (machinery regression).

Outputs: research/numerics/data/E-016-herglotz-fine-structure.csv (+ .json)
"""
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
from numpy.polynomial.legendre import leggauss

REPO = Path(__file__).resolve().parents[3]
DATA = REPO / "research" / "numerics" / "data"
CSV = DATA / "E-016-herglotz-fine-structure.csv"
JSON = DATA / "E-016-herglotz-fine-structure.json"

T_MAXG = 20.0            # sieve to e^20 covers 2a <= 20 (a <= 10)
T_LERCH = 0.05
GL_N = 8
A_SWEEP = [4.0, 6.0, 8.0, 10.0]
H_MAIN = 0.01
LAM_SHIFT = -1.0
Y_GRID = np.linspace(0.5, 20.0, 391)
Y_PLATEAU = (10.0, 20.0)
Z_MAX_ZERO = 300.0
N_GRID = 40000


# ---------------------------------------------------------- g (as E-014)
def mangoldt_sieve_fast(n_max: int) -> np.ndarray:
    is_comp = np.zeros(n_max + 1, dtype=bool)
    for p in range(2, int(n_max ** 0.5) + 1):
        if not is_comp[p]:
            is_comp[p * p::p] = True
    lam_log = np.zeros(n_max + 1)
    primes = np.flatnonzero(~is_comp[2:]) + 2
    lp = np.log(primes)
    pk = primes.copy()
    while pk.size and pk[0] <= n_max:
        lam_log[pk] = lp
        pk = pk * primes[: pk.size]
        keep = pk <= n_max
        pk = pk[keep]
        lp = lp[keep]
    return lam_log


print("sieving von Mangoldt to e^20 ...", flush=True)
t_sv = time.time()
N_MAXG = int(np.exp(T_MAXG)) + 2
LAM_LOG = mangoldt_sieve_fast(N_MAXG)
NS = np.arange(2, N_MAXG + 1, dtype=np.float64)
LAM = LAM_LOG[2:] / np.sqrt(NS)
LOG_NS = np.log(NS)
C1 = np.cumsum(LAM)
C0 = np.cumsum(LAM * LOG_NS)
del LAM, LOG_NS, NS
print(f"  sieve done: {time.time()-t_sv:.0f}s", flush=True)

mp.mp.dps = 30
DIG_COEFF = float(-(mp.digamma(mp.mpf(1) / 4) - mp.log(mp.pi)) / 2)
PHI1 = float(mp.lerchphi(1, 2, mp.mpf(1) / 4))
KK = np.arange(0, 400)
DENOM = (KK + 0.25) ** 2


def prime_sum_vec(t):
    m = np.floor(np.exp(t) + 1e-9).astype(np.int64) - 1
    out = np.zeros_like(t)
    pos = m > 0
    idx = m[pos] - 1
    out[pos] = C1[idx] * t[pos] - C0[idx]
    return out


def lerch_comb(t):
    out = np.empty_like(t)
    fast = t > T_LERCH
    if fast.any():
        z = np.exp(-2.0 * t[fast])
        phi = (np.power.outer(z, KK) / DENOM).sum(axis=1)
        out[fast] = -0.25 * (PHI1 - np.exp(-t[fast] / 2) * phi)
    if (~fast).any():
        for i in np.flatnonzero(~fast):
            ti = mp.mpf(float(t[i]))
            out[i] = float(-0.25 * (mp.lerchphi(1, 2, mp.mpf(1) / 4)
                                    - mp.exp(-ti / 2)
                                    * mp.lerchphi(mp.exp(-2 * ti), 2,
                                                  mp.mpf(1) / 4)))
    return out


def g_float(t):
    t = np.asarray(t, dtype=float)
    g = -4.0 * (np.exp(t / 2) + np.exp(-t / 2) - 2.0)
    g += prime_sum_vec(t)
    g += DIG_COEFF * t
    g += lerch_comb(t)
    g[t == 0.0] = 0.0
    return g


A_CONST = 0.5 * (np.log(2 * np.pi) + np.euler_gamma - 1.0)


def sigma_vec(t):
    t = np.asarray(t, dtype=float)
    with np.errstate(divide="ignore", invalid="ignore"):
        return np.where(t > 0, 0.5 * t * np.log(t) + A_CONST * t, 0.0)


def F_sing(t):
    if t <= 0:
        return 0.0
    return (A_CONST * t**3 / 6.0 + t**3 * np.log(t) / 12.0
            - 5.0 * t**3 / 72.0)


def S_sing(k, h):
    return (F_sing((k + 1) * h) - 2.0 * F_sing(k * h)
            + F_sing(abs(k - 1) * h))


XN, XW = leggauss(GL_N)


def S_full(k, h):
    def quad_plain(lo, hi, peak):
        tot = 0.0
        for a, b in ((lo, peak), (peak, hi)):
            if b - a <= 0:
                continue
            mid, half = 0.5 * (a + b), 0.5 * (b - a)
            xs = mid + half * XN
            rho = g_float(xs) - sigma_vec(xs)
            tot += half * float(np.dot(XW, (h - np.abs(xs - peak)) * rho))
        return tot

    def 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:
            return quad_plain(lo, hi, peak)
        pts = 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})
        tot = 0.0
        for p0, p1 in zip(pts, pts[1:]):
            if p1 - p0 <= 0:
                continue
            mid, half = 0.5 * (p0 + p1), 0.5 * (p1 - p0)
            xs = mid + half * XN
            rho = g_float(xs) - sigma_vec(xs)
            tot += half * float(np.dot(XW, (h - np.abs(xs - peak)) * rho))
        return tot

    if k == 0:
        return S_sing(0, h) + 2.0 * quad(0.0, h, 0.0)
    return S_sing(k, h) + quad((k - 1) * h, (k + 1) * h, k * h)


def stiffness_first_col(n_elem, h):
    n_q = n_elem - 1
    s = np.array([S_full(k, h) for k in range(n_elem)])
    q = np.empty(n_q)
    q[0] = (2.0 * s[0] - 2.0 * s[1]) / h**2
    for k in range(1, n_q):
        q[k] = (2.0 * s[k] - s[k + 1] - s[k - 1]) / h**2
    return q


_BUILD = {}


def build(a, h):
    if (a, h) in _BUILD:
        return _BUILD[(a, h)]
    n_elem = int(round(2 * a / h))
    n = n_elem - 1
    q = stiffness_first_col(n_elem, h)
    Q = scipy.linalg.toeplitz(q)
    M = scipy.linalg.toeplitz(np.r_[2 * h / 3, h / 6,
                                    np.zeros(max(n - 2, 0))])
    ii = np.arange(1, n_elem)
    x = -a + ii * h
    xg, wg = leggauss(8)
    b = {}
    for sgn in (+1.0, -1.0):
        mid1 = x - h / 2
        xs1 = mid1[:, None] + (h / 2) * xg[None, :]
        phi1 = (xs1 - (x - h)[:, None]) / h
        mid2 = x + h / 2
        xs2 = mid2[:, None] + (h / 2) * xg[None, :]
        phi2 = ((x + h)[:, None] - xs2) / h
        b[sgn] = ((h / 2) * (np.exp(sgn * xs1) * phi1) @ wg
                  + (h / 2) * (np.exp(sgn * xs2) * phi2) @ wg)
    _BUILD[(a, h)] = (x, h, Q, M, b)
    return _BUILD[(a, h)]


def solve_v(Q, M, b_s, lam, n):
    T = Q - lam * M
    e = np.ones(n)
    B = np.zeros((n + 1, n + 1))
    B[:n, :n] = T
    B[:n, n] = e
    B[n, :n] = e
    sol = scipy.linalg.solve(B, np.r_[b_s, 0.0], assume_a="sym")
    return sol[:n], T


# ------------------------------------------- V(z), V'(z), W(z), W'(z)
def hat_FT(z, h):
    return h * np.sinc(z * h / (2 * np.pi)) ** 2


def hat_FT_d(z, h):
    """d/dz [h sinc(zh/2pi)^2], sinc(x)=sin(pi x)/(pi x)."""
    u = z * h / 2.0
    s = np.sinc(z * h / (2 * np.pi))          # sin(u)/u
    with np.errstate(divide="ignore", invalid="ignore"):
        ds = np.where(np.abs(u) > 1e-8,
                      (u * np.cos(u) - np.sin(u)) / u**2,
                      -u / 3.0)
    return h**2 * s * ds                      # d/dz[h s^2] = h^2 s ds/du


def V_and_dV(z, c, x, h):
    E = np.exp(1j * np.outer(z, x))
    S1 = E @ c
    S2 = (1j * x * E) @ c
    return hat_FT(z, h) * S1, hat_FT_d(z, h) * S1 + hat_FT(z, h) * S2


def W_and_dW(z, Vp, dVp, Vm, dVm, theta):
    eit = np.exp(1j * theta)
    W = (z - 1j) * Vp + eit * (z + 1j) * Vm
    dW = Vp + (z - 1j) * dVp + eit * (Vm + (z + 1j) * dVm)
    return W, dW


# --------------------------------------------------------------- F side
def xi_real(s):
    s = mp.mpf(s)
    if s == 1:                       # xi(1) = 1/2 (removable: zeta pole
        return mp.mpf(0.5)           # cancels the (s-1) factor)
    return 0.5 * s * (s - 1) * mp.pi ** (-s / 2) * mp.gamma(s / 2) * mp.zeta(s)


mp.mp.dps = 40


def rho_F_analytic(y):
    """rho_F(y) = (1/pi)[2/y + xi'/xi(1/2+y) - xi''/xi'(1/2+y)]."""
    s = mp.mpf(0.5) + mp.mpf(y)
    f = lambda t: xi_real(t)
    x0 = xi_real(s)
    x1 = mp.diff(f, s)
    x2 = mp.diff(f, s, 2)
    return float((2.0 / mp.mpf(y) + x1 / x0 - x2 / x1) / mp.pi)


def logabs_F_imag(y):
    s = mp.mpf(0.5) + mp.mpf(y)
    xiv = xi_real(s)
    dx = mp.diff(xi_real, s)
    return mp.log(abs(-mp.mpf(y) ** 2 * xiv / dx))


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

    # ---- F side
    print("F side: rho_F analytic + finite-diff cross-check ...", flush=True)
    # flint cross-check of xi_real (mpmath zeta is broken beyond ~16-19
    # digits in this env; E-014 verified 1e-8 at s=2.5,10.5 — extend to
    # the y-range endpoints used here)
    import flint
    flint.ctx.prec = 200
    def xi_flint(s):
        aa = flint.arb(str(s))
        return float(0.5 * aa * (aa - 1) * (aa / 2).gamma()
                     * flint.arb.pi() ** (-aa / 2) * aa.zeta())
    xi_err = float(max(abs(xi_real(s) - xi_flint(s)) / abs(xi_flint(s))
                       for s in (1.5, 10.5, 20.5)))  # s=1: arb zeta pole
                                                     # (xi(1)=1/2 exact)
    print(f"  xi vs flint max rel err: {xi_err:.2e}", flush=True)
    rhoF = np.array([rho_F_analytic(y) for y in Y_GRID])
    dlogF = np.array([
        float((logabs_F_imag(mp.mpf(y) + mp.mpf(1e-4))
               - logabs_F_imag(mp.mpf(y) - mp.mpf(1e-4))) / mp.mpf(2e-4))
        for y in Y_GRID]) / np.pi
    rel = np.abs(rhoF - dlogF) / np.maximum(np.abs(rhoF), 1e-12)
    v2_err = float(rel.max())
    print(f"  V2 finite-diff max rel dev: {v2_err:.2e}", flush=True)

    rows = []
    for y, r in zip(Y_GRID, rhoF):
        rows.append(f"F,{y:.6f},{r:.10e}")

    sym_err = 0.0
    metrics = {}
    for a in A_SWEEP:
        print(f"a={a}: solve v±, Herglotz densities ...", flush=True)
        x, hh, Q, M, b = build(a, H_MAIN)
        n = len(x)
        cp, T = solve_v(Q, M, b[+1.0], LAM_SHIFT, n)
        cm, _ = solve_v(Q, M, b[-1.0], LAM_SHIFT, n)
        np_ = float(cp @ T @ cp)
        nm = float(cm @ T @ cm)
        cm = cm * np.sqrt(np_ / nm)
        sym_err = max(sym_err,
                      float(np.max(np.abs(cm - cp[::-1]))
                            / max(1.0, float(np.max(np.abs(cp))))))

        ziy = 1j * Y_GRID
        Vp, dVp = V_and_dV(ziy, cp, x, hh)
        Vm, dVm = V_and_dV(ziy, cm, x, hh)

        out = {}
        for th, tag in ((np.pi, "pi"), (0.0, "zero")):
            W, dW = W_and_dW(ziy, Vp, dVp, Vm, dVm, th)
            rhoW = -np.imag(dW / W) / np.pi
            out[tag] = rhoW
            for y, r in zip(Y_GRID, rhoW):
                rows.append(f"W_th{tag},{a},{y:.6f},{r:.10e}")

        # ---- zeros of W(., pi) on the real axis (for V3)
        # c = sqrt(np_/nm) = 1 exactly (mirror symmetry), so for real z,
        # Vm = conj(Vp) and W(z) = 2i*g(z) with the REAL gauge
        # g(z) = z Im Vp - Re Vp. Zeros = sign changes of g -> brentq.
        assert abs(np_ / nm - 1.0) < 1e-12, "norm asymmetry breaks gauge"
        zg = np.linspace(1e-3, Z_MAX_ZERO, N_GRID)
        Vpr, _ = V_and_dV(zg, cp, x, hh)
        g = zg * Vpr.imag - Vpr.real

        def g_direct(zz):
            V = hat_FT(np.array([zz]), hh)[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
        zeros = np.array(zeros)

        # V3: Poisson reconstruction (+- symmetric located zeros to
        # Z_MAX_ZERO + Euler-Maclaurin lattice tail beyond, spacing pi/a,
        # phase matched to last located zero; mean-matched vs analytic).
        d_lat = np.pi / a
        z_last = zeros[-1] + d_lat / 2.0
        recon = np.empty_like(Y_GRID)
        for k, y in enumerate(Y_GRID):
            tail = (y / d_lat) * (np.pi / 2.0 - np.arctan(z_last / y))
            recon[k] = (2.0 * (np.sum(y / (y**2 + zeros**2)) + tail)) / np.pi
        rhoW = out["pi"]
        shift = float(np.mean(rhoW - recon))
        rms = float(np.sqrt(np.mean(rhoW**2)))
        v3_rel = float(np.sqrt(np.mean((rhoW - recon - shift)**2)) / rms)

        # D4 metrics
        pm = (Y_GRID >= Y_PLATEAU[0]) & (Y_GRID <= Y_PLATEAU[1])
        plateau = float(np.mean(rhoW[pm]))
        dens = a / np.pi
        sel = Y_GRID >= 1.0
        d_pi = float(np.sqrt(np.mean((out["pi"][sel] - rhoF[sel])**2)))
        d_zero = float(np.sqrt(np.mean((out["zero"][sel] - rhoF[sel])**2)))
        metrics[a] = {
            "n_zeros": len(zeros), "z1": float(zeros[0]) if len(zeros) else None,
            "plateau": plateau, "density_a_over_pi": dens,
            "plateau_rel_dev": abs(plateau - dens) / dens,
            "v3_rel": v3_rel, "kappa_shift": shift,
            "d_pi": d_pi, "d_zero": d_zero,
        }
        print(f"  zeros={len(zeros)} z1={metrics[a]['z1']:.4f} "
              f"plateau={plateau:.4f} (a/pi={dens:.4f}) "
              f"V3 rel={v3_rel:.2e} d_pi={d_pi:.4f} d_zero={d_zero:.4f}",
              flush=True)

    checks = {
        "V1_plateau_density": bool(all(
            metrics[a]["plateau_rel_dev"] < 0.05 for a in A_SWEEP)),
        "V2_rhoF_finitediff": bool(v2_err < 1e-6),
        "V3_poisson_reconstruction": bool(all(
            metrics[a]["v3_rel"] < 0.02 for a in A_SWEEP)),
        "V4_vmirror_symmetry": bool(sym_err < 1e-6),
    }

    with CSV.open("w", encoding="utf-8", newline="") as f:
        f.write("series,a,y,rho\n")
        for r in rows:
            parts = r.split(",")
            if parts[0] == "F":
                f.write(f"F,-,{parts[1]},{parts[2]}\n")
            else:
                f.write(f"{parts[0]},{parts[1]},{parts[2]},{parts[3]}\n")

    meta = {
        "experiment": "E-016",
        "task": "Q-S3c: Herglotz fine structure of W at theta=pi vs F",
        "description": "Poisson-smoothed zero density -(1/pi) Im W'/W(iy) "
                       "at theta=pi (and theta=0 control) vs rho_F; "
                       "analytic Galerkin z-derivative; zero-Poisson "
                       "reconstruction cross-check",
        "script": "research/numerics/scripts/E-016-herglotz-fine-structure.py",
        "parameters": {"a_sweep": A_SWEEP, "h": H_MAIN, "lambda": LAM_SHIFT,
                       "y_grid": [0.5, 20.0, 391], "z_max_zeros": Z_MAX_ZERO},
        "checks": checks,
        "key_values": {
            "xi_flint_crosscheck_rel": xi_err,
            "rhoF_finitediff_max_rel": v2_err,
            "metrics": {str(a): metrics[a] for a in A_SWEEP},
            "vmirror_sym_err": sym_err,
        },
        "caveats": [
            "Galerkin discretization h=0.01 (E-010 h-convergence: z1 rel "
            "drift 4e-4 between h=0.01 and 0.005 at a=4)",
            "Poisson smoothing at height y averages over scale ~y: lattice "
            "oscillations at spacing pi/a are suppressed ~e^{-2ay}; the "
            "sensitive region is y <~ few (low zeros resolve individually)",
            "theta=pi vs theta=0 comparison is the sharp test of the H4 "
            "read-off (D-023): if theta=pi is correct, d_pi should lie "
            "systematically below d_zero as a grows",
        ],
        "elapsed_seconds": round(time.time() - t0, 1),
        "timestamp_utc": datetime.now(timezone.utc).isoformat(),
        "row_count": None,
    }
    meta["row_count"] = sum(1 for _ in CSV.open())
    JSON.write_text(json.dumps(meta, indent=2), encoding="utf-8")
    ok = all(checks.values())
    print(f"wrote {CSV.name}, {JSON.name} — "
          f"{'ALL CHECKS PASS' if ok else 'CHECK FAILURE: ' + str(checks)}")
    return 0 if ok else 1


if __name__ == "__main__":
    raise SystemExit(main())