diff --git a/results/protein_fold_analysis.txt b/results/protein_fold_analysis.txt new file mode 100644 index 0000000..e3a5c37 --- /dev/null +++ b/results/protein_fold_analysis.txt @@ -0,0 +1,202 @@ +====================================================================== + PROTEIN FOLDING FRACTAL ECHO ANALYZER +====================================================================== + Source: D:\Resonance_Engine\sweep_results\em_direct_sweep_20260327_080716.csv + Points: 375 + Coherence: 0.737800 to 0.852700 + Mean=0.750005 Std=0.026647 + +====================================================================== + TEST 1: BASIN COUNTING (Ramachandran has 4-5 basins) +====================================================================== + om=0.5: 9 distinct, 1 basins + om=0.6: 10 distinct, 1 basins + om=0.7: 5 distinct, 1 basins + om=0.8: 7 distinct, 2 basins + om=0.9: 5 distinct, 1 basins + om=1.0: 6 distinct, 2 basins + om=1.1: 6 distinct, 1 basins + om=1.2: 6 distinct, 1 basins + om=1.3: 7 distinct, 1 basins + om=1.4: 7 distinct, 2 basins + om=1.5: 8 distinct, 2 basins + om=1.6: 7 distinct, 2 basins + om=1.7: 8 distinct, 2 basins + om=1.8: 7 distinct, 2 basins + om=1.9: 3 distinct, 1 basins + + Slices with 3-6 basins: 0/15 + +====================================================================== + TEST 2: FORBIDDEN FRACTION (Ramachandran ~35% allowed) +====================================================================== + Top 35% threshold: 0.739500 + Allowed fraction: 44.3% + Ramachandran target: 35% + Difference: 9.3% + PASS + +====================================================================== + TEST 3: FUNNEL TOPOLOGY (proteins have positive skewness) +====================================================================== + 0.7378-0.7493: 318 ######################################## + 0.7493-0.7608: 0 + 0.7608-0.7723: 0 + 0.7723-0.7838: 0 + 0.7838-0.7953: 24 ### + 0.7953-0.8067: 3 + 0.8067-0.8182: 1 + 0.8182-0.8297: 26 ### + 0.8297-0.8412: 0 + 0.8412-0.8527: 3 + + Skewness: +2.1874 + >>> FUNNEL DETECTED + +====================================================================== + TEST 4: AMINO ACID CLASS MAPPING (5 classes expected) +====================================================================== + om=0.5: range=0.002100 -> beta_branched + om=0.6: range=0.001800 -> pre_proline + om=0.7: range=0.001300 -> pre_proline + om=0.8: range=0.001500 -> pre_proline + om=0.9: range=0.002200 -> beta_branched + om=1.0: range=0.001700 -> pre_proline + om=1.1: range=0.001400 -> pre_proline + om=1.2: range=0.001100 -> pre_proline + om=1.3: range=0.001700 -> pre_proline + om=1.4: range=0.001800 -> pre_proline + om=1.5: range=0.002000 -> beta_branched + om=1.6: range=0.001700 -> pre_proline + om=1.7: range=0.114900 -> glycine + om=1.8: range=0.018900 -> general + om=1.9: range=0.011800 -> general + + Classes found: 4/5 = ['beta_branched', 'general', 'glycine', 'pre_proline'] + +====================================================================== + TEST 5: LEVINTHAL COMPRESSION +====================================================================== + Combinations: 375 + Distinct modes: 39 + Compression: 9.6:1 + +====================================================================== + TEST 6: HIERARCHICAL STRUCTURE +====================================================================== + CATH: 4 classes -> 41 arch -> 1393 topo + Lattice: 15 classes -> 39 topo + +====================================================================== + VERDICT +====================================================================== + Basin count (3-6) FAIL + Forbidden fraction (25-45%) PASS + Funnel topology PASS + Amino acid classes (3+/5) PASS + Levinthal compression (>2:1) PASS + Hierarchical structure PASS + + PASSED: 5/6 + STRONG EVIDENCE: Fractal echo extends to protein folding +====================================================================== + PROTEIN FOLDING FRACTAL ECHO ANALYZER +====================================================================== + Source: D:\Resonance_Engine\sweep_results\em_direct_sweep_20260327_145447.csv + Points: 375 + Coherence: 0.737000 to 0.739300 + Mean=0.738280 Std=0.000571 + +====================================================================== + TEST 1: BASIN COUNTING (Ramachandran has 4-5 basins) +====================================================================== + om=0.5: 6 distinct, 2 basins + om=0.6: 3 distinct, 1 basins + om=0.7: 8 distinct, 2 basins + om=0.8: 8 distinct, 2 basins + om=0.9: 8 distinct, 1 basins + om=1.0: 3 distinct, 1 basins + om=1.1: 10 distinct, 2 basins + om=1.2: 5 distinct, 2 basins + om=1.3: 10 distinct, 1 basins + om=1.4: 4 distinct, 1 basins + om=1.5: 11 distinct, 3 basins <<< + om=1.6: 8 distinct, 1 basins + om=1.7: 11 distinct, 1 basins + om=1.8: 8 distinct, 2 basins + om=1.9: 2 distinct, 1 basins + + Slices with 3-6 basins: 1/15 + +====================================================================== + TEST 2: FORBIDDEN FRACTION (Ramachandran ~35% allowed) +====================================================================== + Top 35% threshold: 0.738500 + Allowed fraction: 40.0% + Ramachandran target: 35% + Difference: 5.0% + PASS + +====================================================================== + TEST 3: FUNNEL TOPOLOGY (proteins have positive skewness) +====================================================================== + 0.7370-0.7372: 15 ######### + 0.7372-0.7375: 8 #### + 0.7375-0.7377: 33 #################### + 0.7377-0.7379: 53 ################################ + 0.7379-0.7381: 66 ######################################## + 0.7381-0.7384: 37 ###################### + 0.7384-0.7386: 50 ############################## + 0.7386-0.7388: 33 #################### + 0.7388-0.7391: 31 ################## + 0.7391-0.7393: 49 ############################# + + Skewness: -0.0718 + >>> FLAT LANDSCAPE + +====================================================================== + TEST 4: AMINO ACID CLASS MAPPING (5 classes expected) +====================================================================== + om=0.5: range=0.000700 -> pre_proline + om=0.6: range=0.001500 -> pre_proline + om=0.7: range=0.001800 -> pre_proline + om=0.8: range=0.000900 -> pre_proline + om=0.9: range=0.001100 -> pre_proline + om=1.0: range=0.000500 -> pre_proline + om=1.1: range=0.001800 -> pre_proline + om=1.2: range=0.000900 -> pre_proline + om=1.3: range=0.001400 -> pre_proline + om=1.4: range=0.001400 -> pre_proline + om=1.5: range=0.002300 -> beta_branched + om=1.6: range=0.001900 -> pre_proline + om=1.7: range=0.002000 -> beta_branched + om=1.8: range=0.001800 -> pre_proline + om=1.9: range=0.000200 -> proline + + Classes found: 3/5 = ['beta_branched', 'pre_proline', 'proline'] + +====================================================================== + TEST 5: LEVINTHAL COMPRESSION +====================================================================== + Combinations: 375 + Distinct modes: 23 + Compression: 16.3:1 + +====================================================================== + TEST 6: HIERARCHICAL STRUCTURE +====================================================================== + CATH: 4 classes -> 41 arch -> 1393 topo + Lattice: 15 classes -> 23 topo + +====================================================================== + VERDICT +====================================================================== + Basin count (3-6) FAIL + Forbidden fraction (25-45%) PASS + Funnel topology FAIL + Amino acid classes (3+/5) PASS + Levinthal compression (>2:1) PASS + Hierarchical structure PASS + + PASSED: 4/6 + STRONG EVIDENCE: Fractal echo extends to protein folding diff --git a/scripts/protein_fold_echo.py b/scripts/protein_fold_echo.py new file mode 100644 index 0000000..29cb417 --- /dev/null +++ b/scripts/protein_fold_echo.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +"""Protein Folding Fractal Echo - compares lattice coherence to Ramachandran landscape""" +import sys,csv,math +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 main(): + fn=sys.argv[1] if len(sys.argv)>1 else None + if not fn: + print("Usage: python protein_fold_echo.py sweep.csv") + return + data=load(fn) + n=len(data) + cohs=[d['coherence'] for d in data] + mn,mx=min(cohs),max(cohs) + mean=sum(cohs)/n + std=(sum((c-mean)**2 for c in cohs)/n)**0.5 + med=sorted(cohs)[n//2] + skew=sum((c-mean)**3 for c in cohs)/(n*std**3) if std>0 else 0 + + print("="*70) + print(" PROTEIN FOLDING FRACTAL ECHO ANALYZER") + print("="*70) + print(f" Source: {fn}") + print(f" Points: {n}") + print(f" Coherence: {mn:.6f} to {mx:.6f}") + print(f" Mean={mean:.6f} Std={std:.6f}") + + by_om=defaultdict(list) + for d in data: + by_om[round(d['omega'],2)].append(d) + + results={} + + # TEST 1: Basin Counting (Ramachandran has 4-5 basins) + print(f"\n{'='*70}") + print(" TEST 1: BASIN COUNTING (Ramachandran has 4-5 basins)") + print("="*70) + basin_matches=0 + for om in sorted(by_om.keys()): + pts=by_om[om] + cs=sorted(set(round(p['coherence'],4) for p in pts)) + if len(cs)<2: + basins=1 + else: + gaps=[cs[i+1]-cs[i] for i in range(len(cs)-1)] + mg=sum(gaps)/len(gaps) if gaps else 0 + basins=sum(1 for g in gaps if g>mg*2)+1 + match="<<<" if 3<=basins<=6 else "" + if 3<=basins<=6: + basin_matches+=1 + print(f" om={om:.1f}: {len(cs):>3} distinct, {basins:>2} basins {match}") + print(f"\n Slices with 3-6 basins: {basin_matches}/{len(by_om)}") + results['basin']=basin_matches>=3 + + # TEST 2: Forbidden Fraction (Ramachandran ~35% allowed) + print(f"\n{'='*70}") + print(" TEST 2: FORBIDDEN FRACTION (Ramachandran ~35% allowed)") + print("="*70) + top35=sorted(cohs)[int(n*0.65)] + allowed=sum(1 for c in cohs if c>=top35)/n + diff=abs(allowed-0.35) + print(f" Top 35% threshold: {top35:.6f}") + print(f" Allowed fraction: {allowed:.1%}") + print(f" Ramachandran target: 35%") + print(f" Difference: {diff:.1%}") + print(f" {'PASS' if diff<0.15 else 'FAIL'}") + results['forbidden']=diff<0.15 + + # TEST 3: Funnel Topology (proteins have positive skewness) + print(f"\n{'='*70}") + print(" TEST 3: FUNNEL TOPOLOGY (proteins have positive skewness)") + print("="*70) + cr=mx-mn + if cr>0: + nb=10 + bw=cr/nb + bins=[0]*nb + for c in cohs: + b=min(int((c-mn)/bw),nb-1) + bins[b]+=1 + for i in range(nb): + lo=mn+i*bw + hi=lo+bw + bar='#'*(bins[i]*40//max(max(bins),1)) + print(f" {lo:.4f}-{hi:.4f}: {bins[i]:>5} {bar}") + print(f"\n Skewness: {skew:+.4f}") + if skew>0.3: + print(" >>> FUNNEL DETECTED") + elif skew<-0.3: + print(" >>> INVERTED FUNNEL") + else: + print(" >>> FLAT LANDSCAPE") + results['funnel']=abs(skew)>0.3 + + # TEST 4: Amino Acid Classes (5 Ramachandran classes) + print(f"\n{'='*70}") + print(" TEST 4: AMINO ACID CLASS MAPPING (5 classes expected)") + print("="*70) + classes=set() + for om in sorted(by_om.keys()): + pts=by_om[om] + cr2=max(p['coherence'] for p in pts)-min(p['coherence'] for p in pts) + if cr2<0.0005: + cls='proline' + elif cr2<0.002: + cls='pre_proline' + elif cr2<0.005: + cls='beta_branched' + elif cr2<0.02: + cls='general' + else: + cls='glycine' + classes.add(cls) + print(f" om={om:.1f}: range={cr2:.6f} -> {cls}") + print(f"\n Classes found: {len(classes)}/5 = {sorted(classes)}") + results['classes']=len(classes)>=3 + + # TEST 5: Levinthal Compression + print(f"\n{'='*70}") + print(" TEST 5: LEVINTHAL COMPRESSION") + print("="*70) + distinct=len(set(round(c,4) for c in cohs)) + comp=n/max(1,distinct) + print(f" Combinations: {n}") + print(f" Distinct modes: {distinct}") + print(f" Compression: {comp:.1f}:1") + results['levinthal']=comp>2 + + # TEST 6: Hierarchy + print(f"\n{'='*70}") + print(" TEST 6: HIERARCHICAL STRUCTURE") + print("="*70) + n_class=len(by_om) + n_topo=distinct + print(f" CATH: 4 classes -> 41 arch -> 1393 topo") + print(f" Lattice: {n_class} classes -> {n_topo} topo") + results['hierarchy']=n_topo>10 + + # VERDICT + print(f"\n{'='*70}") + print(" VERDICT") + print("="*70) + tests=[ + ('Basin count (3-6)',results.get('basin',False)), + ('Forbidden fraction (25-45%)',results.get('forbidden',False)), + ('Funnel topology',results.get('funnel',False)), + ('Amino acid classes (3+/5)',results.get('classes',False)), + ('Levinthal compression (>2:1)',results.get('levinthal',False)), + ('Hierarchical structure',results.get('hierarchy',False)) + ] + passed=sum(1 for _,v in tests if v) + for name,v in tests: + print(f" {name:<35} {'PASS' if v else 'FAIL':>6}") + print(f"\n PASSED: {passed}/6") + if passed>=4: + print(" STRONG EVIDENCE: Fractal echo extends to protein folding") + elif passed>=3: + print(" MODERATE EVIDENCE: Partial structural similarity") + else: + print(" WEAK EVIDENCE: Limited similarity") + +if __name__=='__main__': + main()