# sequenties.py — synthetisch minigen, geen werkelijk plantenconstruct
from itertools import product
bases="UCAG"
# NCBI standaardcode, rijen: eerste, tweede, derde base in deze volgorde.
letters="FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG"
codons=["".join(c) for c in product(bases, repeat=3)]
code=dict(zip(codons,letters))
assert len(code)==64 and sum(a=="*" for a in code.values())==3
comp=str.maketrans("ACGT","TGCA")
def revcomp(s):
    if set(s)-set("ACGT"): raise ValueError("alleen A/C/G/T")
    return s.translate(comp)[::-1]
def vertaal(dna,frame=0):
    rna=dna.replace("T","U")
    eiwit=[]
    stop=None
    for i in range(frame,len(rna)-2,3):
        aa=code[rna[i:i+3]]
        if aa=="*":
            stop=i+1 # eerste nucleotide van stopcodon, tellen vanaf 1
            break
        eiwit.append(aa)
    return "".join(eiwit),stop,(len(rna)-frame)%3

origineel="ATGGCTTTTGAACCGTAA"
varianten={
 "origineel":origineel,
 "synoniem":origineel[:5]+"C"+origineel[6:],
 "missense":origineel[:7]+"C"+origineel[8:],
 "nonsense":origineel[:9]+"T"+origineel[10:],
 "deletie 1 base":origineel[:4]+origineel[5:],
 "deletie 1 codon":origineel[:6]+origineel[9:],
}
print("coderend 5'->3':",origineel)
print("matrijs 5'->3': ",revcomp(origineel))
for naam,s in varianten.items():
    print(naam, s, vertaal(s))
for frame in range(3):
    print("frame",frame,vertaal(origineel,frame))
# Alle mogelijke enkele substituties binnen de 15 coderende basen.
telling={"synoniem":0,"missense":0,"nonsense":0}
ref=vertaal(origineel)[0]
for i in range(15):
    for base in "ACGT":
        if base==origineel[i]: continue
        prot,stop,rest=vertaal(origineel[:i]+base+origineel[i+1:])
        soort="nonsense" if stop is not None and stop<16 else "synoniem" if prot==ref else "missense"
        telling[soort]+=1
print("45 synthetische substituties:",telling)
print("Deze telling is geen natuurlijke mutatiekans of functionele schadefrequentie.")
