
# 'objektumterv' létrehozása --------------------------------
class mol:
    def __init__(self,lst):
        self.b=lst[0]
        self.C=lst[1]
        self.H=lst[2]
        self.O=lst[3]
        self.N=lst[4]
        self.S=lst[5]
        self.m=self.C*12+self.H*1+self.O*16+self.N*14+self.S*32     # 2. feladat
   
    def darab(self):    # objektum saját metódusa: egy szótárt ad, az egyes atomok darabszámával
        return {'C':self.C,'H':self.H,'O':self.O,'N':self.N,'S':self.S}
# ----------------------------------------------------------------------------------
  
aminosav=dict()     # szótár: kulcs az aminosav azonosítója (pl.: Gly)
# a kulcshoz egy lista tartozik, melyben a maradék 6 adat szerepel
# ez a szótár kifejezetten a 2. feldathoz kell. Később nem kell...
print('1. feladat - adatok beolvasása...')
fbe=open('aminosav.txt','r')
# minden aminosav 7 adattal rendelkezik
count=1             # számoljuk, hogy hány sort olvastunk be,
                    # és ha megvan a 7 elem, akkor összerakjuk
                    # a szótárt...
for sor in fbe:     
    if count==1:
        kulcs=sor.strip()   # az első sorok (hetesével) a kulcsok
        count+=1
        lst=[]  # kulcshoz tartozó lista
    else:
        if count<7:
            lst.append(sor.strip())     # építjük a listát a többi adatból...  
            count+=1
        else:
            lst.append(sor.strip())     # ha megvan minden (7 adat beolvasva), 
            lst[1:]=map(int,lst[1:])    # akkor amit kell azt int-re konvertáljuk
            aminosav[kulcs]=lst         # szótárbejegyzés
            count=1
fbe.close()
# --------------------------------------------------------------------
 
print('----------------------------------------------------')
print('2. feladat - megoldva...')
print('----------------------------------------------------')
# ---------------------------------------------------------------------
   
print('----------------------------------------------------')
print('3. feladat')
print('----------------------------------------------------')
fki=open('eredmeny.txt','w')
print('3. feladat',file=fki)
# RENDEZZÜK A SZÓTÁRUNKAT(!) molekulatömeg szerint
# ehhez a mol CLASS-t használjuk
# rendezés kulcsa: item egy komplett szótárbejegyzés
# 0 indexű eleme a kulcs, 1 indexű eleme a kulcshoz tartozó lista
# ezt a listát 'mol' objektumként kezeljük, aminek 'm' mezője a molekulatömeg
# lásd mol CLASS megvalósítását...
new=dict(sorted(aminosav.items(),key=lambda item:mol(item[1]).m))    
for kulcs,amino in new.items():     # szótár 'bejárása' kulcs és érték szerint egyaránt
    a=mol(amino)                    # listából 'mol' objektum, így 'a' egy objektum lesz
    print(f'{kulcs} {a.m}')
    print(f'{kulcs} {a.m}',file=fki)
# eddig volt szükségünk az aminosav szótárra
# most egy más kulcsú szótár kell, egy olyan, ahol a kulcs az aminosav betűje
# adatai közé pedig bekerül a hárombetűs azonosító
# ezt intézi az alábbi ciklus:
uj_aminosav=dict()
for kulcs,lista in aminosav.items():
    temp=lista                      # régi kulcshoz tartozó régi bejegyzés (ez, mint tudjuk egy lista)
    uj_kulcs=temp[0]                # új kulcsunk a lista első eleme, a betűjel
    temp.pop(0)                     # töröljük a listából a betűjelet
    temp.insert(0,kulcs)            # és beszúrjuk a helyére a régi kulcsot (pl. Gly)
    uj_aminosav[uj_kulcs]=temp      # új szótárunkba egy új bejegyzés (kulcs-lista 'páros')
     
fbe=open('BSA.txt','r')             # a fájl tartalmát egy listába olvassuk be...
bsa=[]
for sor in fbe:
    sor=sor.strip()
    bsa.append(sor)
fbe.close()
# --------------------------------------------------------------------
  
print('----------------------------------------------------')
print('4. feladat')
print('----------------------------------------------------')
print('4. feladat',file=fki)
# kilép H2O (ezt ne felejtsuk majd el)
# újabb szótár: kulcs az atom, szótárbejegyzés pedig az adott atom összesített száma
atomok={'C':0,'H':0,'O':0,'N':0,'S':0}  # az egyes atomok, mint kulcsok és a számlálók nullára állítva
for amin in bsa:        # veszünk a listából egy aminosavat
    m=mol(uj_aminosav[amin])  # 'm' néven csinálunk belőle egy 'mol' objektumot
    # az objektumnak van egy saját metódusa, 'darab' néven, ami egy szótárt ad :) (megint egy...)
    for k,v in m.darab().items():   # a 'darab' adta szótár bejárása kulcs és érték szerint...
        atomok[k]+=v                # a 'darab' és 'atomok' szótárak azonos kulcsú értékének összesítése
# le kell vonni a kapcsolódásokkor kilépő vízmolekulákban szereplő H és O darabszámait    
kapcsolodasok=len(bsa)-1                # ennyi kapcsolódás van
atomok['H']-=2*kapcsolodasok            # 2-szeresen levonjuk a H-t
atomok['O']-=kapcsolodasok              # 1-szeresen az O darabszámát
for atom,tomeg in atomok.items():
    print(atom,tomeg,end=' ')
    print(atom,tomeg,end=' ',file=fki)
print()
print(file=fki)
# --------------------------------------------------------------------
  
print('----------------------------------------------------')
print('5. feladat')
print('----------------------------------------------------')
print('5. feladat',file=fki)
# Tirozin (Y), Fenilalanin (W) és a Triptofán (F) után hasít
hasitas={'Y','W','F'}       # ilyen karakterek felbukkanását vizsgáljuk...
info=[0,0,0]                # információk: leghosszabb lánc hossza, kezdete, vége
kezd=1                      # kezdés az elejétől
for pozicio,amin in enumerate(bsa,start=1):     # bsa lista bejárása
    if amin in hasitas:                         # aktuális karakter benne van a halmazban, akkor
        vege=pozicio                            # ezen a poticion van hasítás
        if vege-kezd+1>info[0]:                 # maximumkeresés
            info[0]=vege-kezd+1                 # info-ba a megfelelő adatok
            info[1]=kezd
            info[2]=vege
        kezd=pozicio+1                          # következő lánc kezdete
print(f'Leghosszabb lánc hossza: {info[0]}')
print(f'Kezdete: {info[1]}\nVége: {info[2]}')
print(f'Leghosszabb lánc hossza: {info[0]}',file=fki)
print(f'Kezdete: {info[1]}\nVége: {info[2]}',file=fki)
# --------------------------------------------------------------------
  
print('----------------------------------------------------') 
print('6. feladat')
print('----------------------------------------------------')
print('6. feladat',file=fki)
# Arginin (R) után hasít, de csak akkor,
# ha Alinin (A) vagy Valin (V) követi
hasitas={'RA','RV'}                             # ilyen karakterpárokat keresünk
for i in range(len(bsa)-1):                     # index alapján megyünk a listán végig
    if bsa[i]+bsa[i+1] in hasitas:              # hogy tudjunk a következő elemre hivatkozni (i+1)
        vizsgal=bsa[:i+1]                       # részlista 'leválasztása' vizsgálatra
        break                                   # csak az első lehasított lánc kell
  
print('A hasítás során keletkező első fehérjelánc részletben')
print(f'{vizsgal.count("C")} Cisztein (C) található')
print('A hasítás során keletkező első fehérjelánc részletben',file=fki)
print(f'{vizsgal.count("C")} Cisztein (C) található',file=fki)  # lista adott értékű elemeinek számlálása (cout) 
  
fki.close()
