feherje200605.py
1    # 'objektumterv' létrehozása --------------------------------
2    class mol:
3        def __init__(self,lst):
4            self.b=lst[0]
5            self.C=lst[1]
6            self.H=lst[2]
7            self.O=lst[3]
8            self.N=lst[4]
9            self.S=lst[5]
10           self.m=self.C*12+self.H*1+self.O*16+self.N*14+self.S*32     # 2. feladat
11   
12       def darab(self):    # objektum saját metódusa: egy szótárt ad, az egyes atomok darabszámával
13           return {'C':self.C,'H':self.H,'O':self.O,'N':self.N,'S':self.S}
14       
15   # ----------------------------------------------------------------------------------
16   
17   aminosav=dict()     # szótár: kulcs az aminosav azonosítója (pl.: Gly)
18                       # a kulcshoz egy lista tartozik, melyben a maradék 6 adat szerepel
19   # ez a szótár kifejezetten a 2. feldathoz kell. Később nem kell...
20   print('1. feladat - adatok beolvasása...')
21   fbe=open('aminosav.txt','r')
22   # minden aminosav 7 adattal rendelkezik
23   count=1             # számoljuk, hogy hány sort olvastunk be,
24                       # és ha megvan a 7 elem, akkor összerakjuk
25                       # a szótárt...
26   for sor in fbe:     
27       if count==1:
28           kulcs=sor.strip()   # az első sorok (hetesével) a kulcsok
29           count+=1
30           lst=[]  # kulcshoz tartozó lista
31       else:
32           if count<7:
33               lst.append(sor.strip())     # építjük a listát a többi adatból...  
34               count+=1
35           else:
36               lst.append(sor.strip())     # ha megvan minden (7 adat beolvasva), 
37               lst[1:]=map(int,lst[1:])    # akkor amit kell azt int-re konvertáljuk
38               aminosav[kulcs]=lst         # szótárbejegyzés
39               count=1
40   fbe.close()
41   # --------------------------------------------------------------------
42   
43   print('----------------------------------------------------')
44   print('2. feladat - megoldva...')
45   print('----------------------------------------------------')
46   # ---------------------------------------------------------------------
47   
48   print('----------------------------------------------------')
49   print('3. feladat')
50   print('----------------------------------------------------')
51   fki=open('eredmeny.txt','w')
52   print('3. feladat',file=fki)
53   # RENDEZZÜK A SZÓTÁRUNKAT(!) molekulatömeg szerint
54   # ehhez a mol CLASS-t használjuk
55   # rendezés kulcsa: item egy komplett szótárbejegyzés
56   # 0 indexű eleme a kulcs, 1 indexű eleme a kulcshoz tartozó lista
57   # ezt a listát 'mol' objektumként kezeljük, aminek 'm' mezője a molekulatömeg
58   # lásd mol CLASS megvalósítását...
59   new=dict(sorted(aminosav.items(),key=lambda item:mol(item[1]).m))    
60   for kulcs,amino in new.items():     # szótár 'bejárása' kulcs és érték szerint egyaránt
61       a=mol(amino)                    # listából 'mol' objektum, így 'a' egy objektum lesz
62       print(f'{kulcs} {a.m}')
63       print(f'{kulcs} {a.m}',file=fki)
64   # eddig volt szükségünk az aminosav szótárra
65   # most egy más kulcsú szótár kell, egy olyan, ahol a kulcs az aminosav betűje
66   # adatai közé pedig bekerül a hárombetűs azonosító
67   # ezt intézi az alábbi ciklus:
68   uj_aminosav=dict()
69   for kulcs,lista in aminosav.items():
70       temp=lista                      # régi kulcshoz tartozó régi bejegyzés (ez, mint tudjuk egy lista)
71       uj_kulcs=temp[0]                # új kulcsunk a lista első eleme, a betűjel
72       temp.pop(0)                     # töröljük a listából a betűjelet
73       temp.insert(0,kulcs)            # és beszúrjuk a helyére a régi kulcsot (pl. Gly)
74       uj_aminosav[uj_kulcs]=temp      # új szótárunkba egy új bejegyzés (kulcs-lista 'páros')
75     
76   fbe=open('BSA.txt','r')             # a fájl tartalmát egy listába olvassuk be...
77   bsa=[]
78   for sor in fbe:
79       sor=sor.strip()
80       bsa.append(sor)
81   fbe.close()
82   # --------------------------------------------------------------------
83   
84   print('----------------------------------------------------')
85   print('4. feladat')
86   print('----------------------------------------------------')
87   print('4. feladat',file=fki)
88   # kilép H2O (ezt ne felejtsuk majd el)
89   # újabb szótár: kulcs az atom, szótárbejegyzés pedig az adott atom összesített száma
90   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
91   for amin in bsa:        # veszünk a listából egy aminosavat
92       m=mol(uj_aminosav[amin])  # 'm' néven csinálunk belőle egy 'mol' objektumot
93       # az objektumnak van egy saját metódusa, 'darab' néven, ami egy szótárt ad :) (megint egy...)
94       for k,v in m.darab().items():   # a 'darab' adta szótár bejárása kulcs és érték szerint...
95           atomok[k]+=v                # a 'darab' és 'atomok' szótárak azonos kulcsú értékének összesítése
96   # le kell vonni a kapcsolódásokkor kilépő vízmolekulákban szereplő H és O darabszámait    
97   kapcsolodasok=len(bsa)-1                # ennyi kapcsolódás van
98   atomok['H']-=2*kapcsolodasok            # 2-szeresen levonjuk a H-t
99   atomok['O']-=kapcsolodasok              # 1-szeresen az O darabszámát
100  for atom,tomeg in atomok.items():
101      print(atom,tomeg,end=' ')
102      print(atom,tomeg,end=' ',file=fki)
103  print()
104  print(file=fki)
105  # --------------------------------------------------------------------
106  
107  print('----------------------------------------------------')
108  print('5. feladat')
109  print('----------------------------------------------------')
110  print('5. feladat',file=fki)
111  # Tirozin (Y), Fenilalanin (W) és a Triptofán (F) után hasít
112  hasitas={'Y','W','F'}       # ilyen karakterek felbukkanását vizsgáljuk...
113  info=[0,0,0]                # információk: leghosszabb lánc hossza, kezdete, vége
114  kezd=1                      # kezdés az elejétől
115  for pozicio,amin in enumerate(bsa,start=1):     # bsa lista bejárása
116      if amin in hasitas:                         # aktuális karakter benne van a halmazban, akkor
117          vege=pozicio                            # ezen a poticion van hasítás
118          if vege-kezd+1>info[0]:                 # maximumkeresés
119              info[0]=vege-kezd+1                 # info-ba a megfelelő adatok
120              info[1]=kezd
121              info[2]=vege
122          kezd=pozicio+1                          # következő lánc kezdete
123  print(f'Leghosszabb lánc hossza: {info[0]}')
124  print(f'Kezdete: {info[1]}\nVége: {info[2]}')
125  print(f'Leghosszabb lánc hossza: {info[0]}',file=fki)
126  print(f'Kezdete: {info[1]}\nVége: {info[2]}',file=fki)
127  # --------------------------------------------------------------------
128  
129  print('----------------------------------------------------') 
130  print('6. feladat')
131  print('----------------------------------------------------')
132  print('6. feladat',file=fki)
133  # Arginin (R) után hasít, de csak akkor,
134  # ha Alinin (A) vagy Valin (V) követi
135  hasitas={'RA','RV'}                             # ilyen karakterpárokat keresünk
136  for i in range(len(bsa)-1):                     # index alapján megyünk a listán végig
137      if bsa[i]+bsa[i+1] in hasitas:              # hogy tudjunk a következő elemre hivatkozni (i+1)
138          vizsgal=bsa[:i+1]                       # részlista 'leválasztása' vizsgálatra
139          break                                   # csak az első lehasított lánc kell
140  
141  print('A hasítás során keletkező első fehérjelánc részletben')
142  print(f'{vizsgal.count("C")} Cisztein (C) található')
143  print('A hasítás során keletkező első fehérjelánc részletben',file=fki)
144  print(f'{vizsgal.count("C")} Cisztein (C) található',file=fki)  # lista adott értékű elemeinek számlálása (cout) 
145  
146  fki.close()
147