Files
resonance-engine/analysis/hadron_regge_analysis.py
T
2026-06-04 15:34:29 +07:00

115 lines
5.0 KiB
Python

#!/usr/bin/env python3
"""Hadron Regge Trajectory Analysis - Does the lattice reproduce M^2 proportional to J?"""
import csv,math,sys
from collections import defaultdict
def load(fn):
data=[]
with open(fn,'r') as f:
for row in csv.DictReader(f):
d={}
for k,v in row.items():
k=k.strip().lower()
try: d[k]=float(v)
except: d[k]=v
if d.get('omega',0)>0: data.append(d)
return data
def linreg(x,y):
n=len(x)
if n<3: return 0,0,0
sx=sum(x);sy=sum(y);sxx=sum(xi*xi for xi in x);sxy=sum(xi*yi for xi,yi in zip(x,y))
denom=n*sxx-sx*sx
if denom==0: return 0,0,0
slope=(n*sxy-sx*sy)/denom;intercept=(sy-slope*sx)/n
ss_res=sum((yi-(slope*xi+intercept))**2 for xi,yi in zip(x,y))
ss_tot=sum((yi-sy/n)**2 for yi in y)
r2=1-ss_res/ss_tot if ss_tot>0 else 0
return slope,intercept,r2
def main():
fn=sys.argv[1] if len(sys.argv)>1 else None
if not fn: print("Usage: python hadron_regge_analysis.py sweep.csv");return
data=load(fn)
print("="*70+"\n HADRON REGGE TRAJECTORY ANALYSIS\n"+"="*70)
print(f" Source: {fn}\n Points: {len(data)}")
# Real hadron data
rho=[('rho(770)',0.770,1),('a2(1320)',1.320,2),('rho3(1690)',1.690,3),('a4(2040)',2.040,4),('rho5(2350)',2.350,5)]
nuc=[('N(938)',0.938,0.5),('N(1520)',1.520,1.5),('N(1680)',1.680,2.5),('N(2190)',2.190,3.5),('N(2600)',2.600,4.5)]
print(f"\n--- REAL HADRON REGGE TRAJECTORIES ---")
rho_j=[j for _,_,j in rho]; rho_m2=[m**2 for _,m,_ in rho]
sl_r,_,r2_r=linreg(rho_j,rho_m2)
print(f" rho-meson family: R2={r2_r:.6f}, slope={sl_r:.4f}, alpha'={1/sl_r:.4f}")
nuc_j=[j for _,_,j in nuc]; nuc_m2=[m**2 for _,m,_ in nuc]
sl_n,_,r2_n=linreg(nuc_j,nuc_m2)
print(f" Nucleon family: R2={r2_n:.6f}, slope={sl_n:.4f}, alpha'={1/sl_n:.4f}")
# Group lattice data
by_khra=defaultdict(list); by_gixx=defaultdict(list); by_omega=defaultdict(list)
for d in data:
by_khra[round(d['khra_amp'],4)].append(d)
by_gixx[round(d['gixx_amp'],4)].append(d)
by_omega[round(d['omega'],2)].append(d)
print(f"\n--- LATTICE REGGE TESTS ---")
results={}
# khra as mass proxy
kv=sorted(by_khra.keys()); km2=[k**2 for k in kv]
ka=[sum(d['asymmetry'] for d in by_khra[k])/len(by_khra[k]) for k in kv]
kvor=[sum(d['vorticity_mean'] for d in by_khra[k])/len(by_khra[k]) for k in kv]
sl,_,r2=linreg(ka,km2); results['khra_asym']=r2
print(f"\n khra_amp^2 vs asymmetry:")
print(f" khra values: {kv}")
print(f" khra^2: {[f'{k:.6f}' for k in km2]}")
print(f" mean asym: {[f'{a:.4f}' for a in ka]}")
print(f" R2 = {r2:.6f} {'*** REGGE ***' if r2>0.99 else ''}")
sl2,_,r2v=linreg(kvor,km2); results['khra_vort']=r2v
print(f" khra_amp^2 vs vorticity: R2 = {r2v:.6f}")
# gixx as mass proxy
gv=sorted(by_gixx.keys()); gm2=[g**2 for g in gv]
ga=[sum(d['asymmetry'] for d in by_gixx[g])/len(by_gixx[g]) for g in gv]
gvor=[sum(d['vorticity_mean'] for d in by_gixx[g])/len(by_gixx[g]) for g in gv]
sl3,_,r2g=linreg(ga,gm2); results['gixx_asym']=r2g
print(f"\n gixx_amp^2 vs asymmetry:")
print(f" gixx values: {gv}")
print(f" gixx^2: {[f'{g:.8f}' for g in gm2]}")
print(f" mean asym: {[f'{a:.4f}' for a in ga]}")
print(f" R2 = {r2g:.6f} {'*** REGGE ***' if r2g>0.99 else ''}")
sl4,_,r2gv=linreg(gvor,gm2); results['gixx_vort']=r2gv
print(f" gixx_amp^2 vs vorticity: R2 = {r2gv:.6f}")
# omega control
ov=sorted(by_omega.keys()); om2=[o**2 for o in ov]
oa=[sum(d['asymmetry'] for d in by_omega[o])/len(by_omega[o]) for o in ov]
sl5,_,r2o=linreg(oa,om2); results['omega_asym']=r2o
print(f"\n omega^2 vs asymmetry (control): R2 = {r2o:.6f} {'(fails as expected)' if r2o<0.8 else ''}")
# Comparison table
print(f"\n--- COMPARISON ---")
print(f" {'System':>20} {'R2':>10} {'Match?':>10}")
print(f" {'rho-meson':>20} {r2_r:>10.6f} {'reference':>10}")
print(f" {'Nucleon':>20} {r2_n:>10.6f} {'reference':>10}")
print(f" {'Lattice khra':>20} {results['khra_asym']:>10.6f} {'*** YES' if results['khra_asym']>0.99 else 'no':>10}")
print(f" {'Lattice gixx':>20} {results['gixx_asym']:>10.6f} {'*** YES' if results['gixx_asym']>0.99 else 'no':>10}")
print(f" {'Lattice omega':>20} {results['omega_asym']:>10.6f} {'(control)':>10}")
# Verdict
print(f"\n--- VERDICT ---")
tests=[
("khra^2 vs asym: R2>0.99",results['khra_asym']>0.99),
("gixx^2 vs asym: R2>0.99",results['gixx_asym']>0.99),
("omega control fails (R2<0.8)",results['omega_asym']<0.80),
("Asym > vorticity as J proxy",results['khra_asym']>results['khra_vort']),
("Matches real hadron R2",results['khra_asym']>0.99 and r2_r>0.99),
]
passed=sum(1 for _,v in tests if v)
for name,v in tests: print(f" {name:<45} {'PASS' if v else 'FAIL'}")
print(f"\n PASSED: {passed}/5")
if passed>=4: print(" STRONG EVIDENCE: Lattice reproduces hadron Regge trajectories")
if __name__=='__main__': main()