File size: 5,345 Bytes
a74f603
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""Export matched experimental data and ESMFold structures; never substitute sequences."""
import csv
import hashlib
import json
import shutil
from pathlib import Path

ROOT=Path(__file__).resolve().parents[1]
AUDIT=ROOT.parent/'Ouroboros_Showcase_Research/wetlab_20260927'
PUBLIC=ROOT/'public'
AA=dict(zip('ALA ARG ASN ASP CYS GLN GLU GLY HIS ILE LEU LYS MET PHE PRO SER THR TRP TYR VAL UNK'.split(),'ARNDCQEGHILKMFPSTWYVX'))

def digest(path):return hashlib.sha256(path.read_bytes()).hexdigest()
def save(path,data):path.write_text(json.dumps(data,ensure_ascii=False,indent=2)+'\n')

def main():
    import xlrd
    original=AUDIT/'PETde实验情况20260927.xls'
    sheet=xlrd.open_workbook(original,use_mmap=False).sheet_by_index(0)
    sequences=json.loads((AUDIT/'sequence_mapping.json').read_text())
    generation=json.loads((AUDIT/'de2_generation.json').read_text())
    manifest=json.loads((AUDIT/'fold_results/manifest.json').read_text())
    ids=['de2','rcsb_5XG0_IsPETase','rcsb_4EB0_LCC','rcsb_7EOA_BhrPETase']
    assert len(manifest)==len(ids)
    names={'rcsb_5XG0_IsPETase':('IsPETase','Y1','5XG0'),'rcsb_4EB0_LCC':('LCC','Y2','4EB0'),'rcsb_7EOA_BhrPETase':('BhrPETase','Y3','7EOA')}
    cases=[]
    for index,fid in enumerate(ids):
        row=next(r for r in sequences if r['id']==fid)
        fold=next(r for r in manifest if r['sequence_id']==f'{index:04d}')
        seq=row['sequence'];assert hashlib.sha256(seq.encode()).hexdigest()==fold['source_pred_seq_sha256']
        pdb=AUDIT/'fold_results'/fold['pdb_file']
        atoms=[line for line in pdb.read_text().splitlines() if line.startswith('ATOM') and line[12:16].strip()=='CA']
        assert ''.join(AA[s[17:20]] for s in atoms)==seq
        residues=[dict(index=int(s[22:26]),chain=s[21].strip(),code=AA[s[17:20]],confidence=float(s[60:66])) for s in atoms]
        design=fid=='de2'
        name,sample,pdb_id=('de2','de2',None) if design else names[fid]
        if design:assert generation['sequence'].replace(' ','')==seq
        provenance=(f"Exact sequence match: submitted de2 FASTA → group_02.part_1530 → petase_lora_2891 → lora_petase_3epoch/test/test_result.json, prediction index {generation['predictionIndex0']} (zero-based). Original prompt recovered from the same generation record." if design else f"Supplied wild-type reference FASTA: {fid}.fasta, labeled {pdb_id}. Matched by name to assay sample {sample}. This view is a new ESMFold prediction of the supplied sequence.")
        case=dict(id=name,assetId='wetlab-'+fid,title=name,kind='design' if design else 'wildtype',modelLabel='LoRA-generated' if design else 'WT reference',assaySample=sample,cohort='PETase wet-lab report · 2026-09-27',rank=1 if design else 0,cohortSize=4,sequence=seq,length=len(seq),residues=residues,prompt=generation['prompt'] if design else '',plddt=sum(r['confidence'] for r in residues)/len(residues),pae=fold['mean_pae'],pdbUrl=f'/structures/wetlab-{fid}.pdb',fastaUrl=f'/structures/wetlab-{fid}.fasta',selection='Selected by highest reported TPA + MHET among the four measured designs.' if design else f'Wild-type reference {name}, assay sample {sample}.',structureStatus='ESMFold-v1 prediction of submitted FASTA',experimentalStatus='Reported TPA and MHET concentrations are available in the 2026-09-27 workbook. Assay conditions and replication are awaiting confirmation.',provenance=provenance,pdbSha256=digest(pdb),sequenceSha256=row['sha256'],foldJob='ouroboros-wetlab-de2-1009b',foldMethod='ESMFold-v1',residueConfidenceDefinition='Mean of CA B factors in the exported ESMFold PDB')
        shutil.copyfile(pdb,PUBLIC/'structures'/f'wetlab-{fid}.pdb')
        cases.append(case)
    audit=json.loads((AUDIT/'assay_audit.json').read_text())
    for row in audit['rows']:
        i=row['sourceRow']-1
        assert sheet.cell_value(i,1)==row['id']
        for col,key in [(3,'tpa'),(4,'mhet'),(5,'total')]:assert sheet.cell_value(i,col)==row[key]
        assert abs(row['tpa']+row['mhet']-row['total'])<1e-7
    for row in sequences:shutil.copyfile(AUDIT/(row['id']+'.fasta'),PUBLIC/'structures'/('wetlab-'+row['id']+'.fasta'))
    audit['generation']={k:v for k,v in generation.items() if k not in ['referenceSequence','sequence']}
    audit['structurePrediction']={'method':'ESMFold-v1','job':'ouroboros-wetlab-de2-1009b','manifestSha256':digest(AUDIT/'fold_results/manifest.json'),'date':'2026-10-09','experimentalStructure':False}
    save(PUBLIC/'data/wetlab.json',audit)
    save(PUBLIC/'data/petase-wetlab-structures.json',cases)
    save(PUBLIC/'data/petase.json',[c for c in cases if c['id'] in ['de2','IsPETase']])
    provenance=json.loads((PUBLIC/'data/provenance.json').read_text())
    provenance['petase']='de2 from the LoRA 3-epoch generation archive; featured by reported wet-lab product concentration. Three provided WT reference sequences are included. Earlier confidence-ranked candidates remain in petase-archive.json.'
    provenance['wetlab']={'report':audit['source'],'sequenceMatches':[{'id':r['id'],'sha256':r['sha256'],'generationMatches':r.get('exactMatches',[])} for r in sequences],'structurePrediction':audit['structurePrediction']}
    save(PUBLIC/'data/provenance.json',provenance)
    print(json.dumps([{'id':r['id'],'length':r['length'],'plddt':r['plddt']} for r in cases],indent=2))

if __name__=='__main__':main()