Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.16 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. from collections import Counter
  4. import os
  5.  
  6. """
  7. De functie opent de opgegeven filenaam, wat als een parameter meegegeven wordt,
  8. en keert alle zinnen als een lijst terug. Ze zijn gesprlitst op een enter.
  9. De functie gebruikt de volgende parameters:
  10. * of_file bestand van interesse dat geopend moet worden.
  11. """
  12.  
  13.  
  14. def OpenFile(of_file):
  15. with open(of_file, 'r') as f:
  16. return f.readlines()
  17.  
  18.  
  19. """
  20. De functie kijkt of de opgegeven waarde (if_kans) in de lijst (if_lijst)
  21. voorkomt. Als datwaar is dat wordt de waarde "true teruggegeven, zoniet dat
  22. wordt de waarde "False" teruggegeven.
  23. De functie gebruikt de volgende parameters (op volgorde):
  24. * if_kans mogelijke combinatie van tekens.
  25. * if_lijst lijst waar er in gezocht moet worden.
  26.  
  27. """
  28.  
  29.  
  30. ##TODO:
  31. # deze functie is best wel bullshit
  32.  
  33.  
  34. def IndexFind(if_kans, if_lijst):
  35. try:
  36. if_lijst.index(if_kans)
  37. return True
  38. except ValueError:
  39. return False
  40.  
  41.  
  42. """
  43. De functie doorloopt de lijst, twogdeellijst (dat teruggeleverd wordt door
  44. de functie OpenFile) en zorgt ervoor dat elke mogelijke combinatie maar 1 maal
  45. voorkomt. Dit is nodig omdat er soms bij de blastresultaten meerdere malen voor
  46. kan komen dat een bepaalde beste hit voor kan komen. Alle mogelijke combinaties
  47. worden dan als een lijst teruggekeerd.
  48. De functie gebruikt de volgende parameters (op volgorde):
  49. * br_naam1 organisme naam van het eerste deel
  50. * br_naam2 organisme naam van het tweede deel
  51. * br_pos1 positie
  52. * br_pos2 positie
  53. de posities kunnen alleen of 0 of 1 zijn. Als br_pos1 een 1 heeft, dan moet
  54. br_pos2 de 0 hebben!
  55. De functie keert het volgende terug:
  56. * singles.keys() lijst van alle mogelijke combinaties
  57. """
  58.  
  59.  
  60. def BlastResults(br_naam1, br_naam2, br_pos1, tbr_pos2):
  61. singles = {}
  62. twogdeellijst = OpenFile(br_naam1 + br_naam2)
  63. for zin in twogdeellijst:
  64. singles[(zin.split()[br_pos1] + " " + zin.split()[br_pos2])] = 0
  65. return singles.keys()
  66.  
  67.  
  68. """
  69. De functie zorgt ervoor dat in de file genaamd Twogs nieuwe twogcombinaties
  70. bijgevoegd kunnen worden. De combinatie worden erkregen door een in een lege
  71. lijst de mogelijke combinaties toe te voegen. De combinaties worden verkregen
  72. door de functie Blastresult. als de lijst gevuld wordt, zullen het aantal
  73. mogelijke combinaties geteld worden. Als de combinatie >= 2 dan wordt de
  74. combinatie in de twoglijst gevuld.
  75. Hierna wordt de file afgesloten.
  76. De functie gebruikt de volgende parameters (op volgorde):
  77. * snt_naam1 organisme naam van het eerste deel
  78. * snt_naam1 organisme naam van het tweede deel
  79. """
  80.  
  81.  
  82. def SchrijfNaarTwog(snt_naam1, snc_naam2):
  83. snt_twogfile = open("Twogs", "a")
  84. snt_lijst = []
  85. snt_lijst.extend(BlastResults(snt_naam1, snc_naam2, 0, 1))
  86. snt_lijst.extend(BlastResults(snc_naam2, snt_naam1, 1, 0))
  87. tellijst = Counter(snt_lijst)
  88. for keys in tellijst:
  89. if tellijst[keys] >= 2:
  90. snt_twogfile.write("%s\n" % (keys))
  91. snt_twogfile.close()
  92.  
  93.  
  94. """
  95. De functie zorgt ervoor dat in de file genaamd cogs.txt nieuwe eiwitten met hun
  96. cognummerscogs toegevoegd kunnen worden
  97. Hierna wordt de file afgesloten.
  98. De functie gebruikt de volgende parameters:
  99. * vtav_lijst Lijst van alle mogelijke eiwitten en hun cognummers.
  100. """
  101.  
  102. #TODO:
  103. #Als je bij open() de "a" verandert in "w", krijg je geen dubbele waardes als /
  104. # je het script meerdere keren runt. Ook duurt het runnen van het progje dan /
  105. # minder lang
  106.  
  107.  
  108. def VoegToeAanCog(vtav_lijst):
  109. cogfile = open("cogs.txt", "a")
  110. for zin in vtav_lijst:
  111. cogfile.write(zin)
  112. cogfile.close()
  113.  
  114.  
  115. """
  116. de functie schrijft naar de file Twogs. Hij nneemt alle posities in de lijst
  117. en schrijft ze naar de file. Daarna wordt de file afgesloten.
  118. De functie gebruikt de volgende parameters :
  119. * ntf_twogs lijst van twogs
  120. """
  121.  
  122.  
  123. def NewTwogFile(ntf_twogs):
  124. outfile = open("Twogs", "w")
  125. for x in ntf_twogs:
  126. outfile.write("%s\n" % (x))
  127. outfile.close()
  128.  
  129.  
  130. """
  131. De functies zorgt ervoor dat van de twogslijst alle mogelijke combinaties
  132. verwijderd worden.
  133. De functie gebruikt de volgende parameters (op volgorde):
  134. * tr_twoglijst lijst van mogelijke twogs die verwijderd moeten worden.
  135. * tr_twogs lijst van alle twog combinatie.
  136. """
  137.  
  138.  
  139. def TwogRemove(tr_twoglijst, tr_twogs):
  140. for b in tr_twoglijst:
  141. tr_twogs.remove(b)
  142.  
  143.  
  144. """
  145. De functie zorgt ervoor dat er in een lijst gezocht wordt.
  146. De functie gebruikt de volgende parameters (op volgorde):
  147. * zil_waarde waarde wat aanwezig moet zijn in de lijst.
  148. * zil_lijst lijst wat gezocht moet worden.
  149. * zil_switch de mogelijkheid om een bepaalde lijst te doorzoeken.
  150. De functie keert het volgende terug:
  151. * de lijsten van interresse
  152. """
  153.  
  154.  
  155. def ZoekInLijst(zil_waarde, zil_lijst, zil_switch):
  156. if zil_switch == 0:
  157. return [x for x in zil_lijst if zil_waarde in x]
  158. elif zil_switch == 1:
  159. return [x.split()[0] for x in zil_lijst if zil_waarde in x]
  160. elif zil_switch == 2:
  161. return [x.split()[1] for x in zil_lijst if zil_waarde in x]
  162.  
  163.  
  164. """
  165. De functie update een bestaande cog. Als er een eiwit gevonden wordt dat bij
  166. een bepaalde cogs hoort, wordt in de twoglijst naar alle mogelijke combinaties
  167. gezocht en worden ze (alle combinaties die bij de desbetreffende cog hoort)
  168. verwijderd uit de twoglijst. Tevens wordt dan ook de eiwit uit de protlijst
  169. verwijderd.
  170. De functie heeft 3 verschillende parameters nodig (op volgorde):
  171. * cogs coglijst
  172. * twogs twoglijst
  173. * prots protlijst
  174. """
  175.  
  176. #TODO:
  177. #Kan, maar is beetje bullshit want is letterlijkwaar 3 regels en een for-loopje
  178.  
  179.  
  180. def CogUpdate(cogs, twogs, prots):
  181. cu_in_lijst_toevoegen = []
  182. for x in list(set([y.split()[0] for y in cogs])):
  183. cu_gevondencog = ZoekInLijst(x, cogs, 2)
  184. cu_lijstje = []
  185. nogteverwijderen = []
  186. for y in cu_gevondencog:
  187. cu_lijstje.extend(ZoekInLijst(y, twogs, 2))
  188. nogteverwijderen.extend(ZoekInLijst(y, twogs, 0))
  189. if len(Counter(cu_lijstje)) != 0:
  190. max_prot = KeyWithMaxVal(dict(Counter(cu_lijstje)))
  191. cu_in_lijst_toevoegen.append("%s\t%s\n" % (x, max_prot))
  192. prots.remove(max_prot)
  193. nogteverwijderen.extend(ZoekInLijst(max_prot, twogs, 0))
  194. newlijst = list(set(nogteverwijderen))
  195. TwogRemove(newlijst, twogs)
  196. VoegToeAanCog(cu_in_lijst_toevoegen)
  197.  
  198.  
  199. """
  200. De functie doorzoekt de twoglijst en vindt alle mogelijke combinaties van de
  201. eiwitten in de kleine lijst (prot_in_twogs). De combinaties worden allemaal
  202. opgeslagen in de lokale variabel genaamd:
  203. vt_lijst
  204. De functie heeft 3 parameters:
  205. * prot het eiwit van interresse
  206. * twogs de twoglijst
  207. * prot_in_twogs de lijst van de nodige eiwitten
  208. De functie keert het volgende terug:
  209. * vt_lijst lijst van interresse
  210. """
  211.  
  212. #TODO:
  213. #IndexFind is best wel bullshit. Alsje gewoon if_lijst.index(if_kans) bij de if- heb je hetzelfde uitkomst.
  214.  
  215.  
  216. def VerbrogenTwogs(prot, twogs, prot_in_twogs):
  217. vt_lijst = []
  218. for x in prot_in_twogs:
  219. for y in prot_in_twogs:
  220. if IndexFind("%s %s" % (x, y), twogs):
  221. vt_lijst.append("%s %s" % (x, y))
  222. vt_lijst.append("%s %s" % (x, prot))
  223. vt_lijst.append("%s %s" % (y, prot))
  224. return vt_lijst
  225.  
  226.  
  227. """
  228. De functie maakt een nieuwe cog aan. De functie zorgt ervoor dat als eerste
  229. het hoogste bekende cognummer opgehaald wordt door de functie
  230. "VindHoogsteCogNummer".
  231. De functie doorloopt de eiwttenlijst en zoekt in de twoglijst naar alle
  232. mogelijke combinatie behorend bij het eiwit. Waarna de functie "VerbrogenTwogs"
  233. aangeroepen wordt. het resultaat wordt in de variabele posible_found_twogs
  234. gezet. als deze variabele niet leeg is dan worden alle eiwitten in een nieuwe
  235. variabele lijst (newcog) gestopt. Hier wordt per eiwit in de lijst dezelfde
  236. cognummer toegekend. Alle mogelijke combinatie van twogs dat nog aanwezig is
  237. in de twoglijst wordt ook meteen verwijderd.
  238. Als laatste wordt de lijst met de nieuwe cognummer aan de cogfile toegevoegd.
  239. Dit gebeurt door middel van de functie "VoegToeAanCog".
  240. De functie heeft 3 verschillende parameters nodig (op volgorde):
  241. * ncf_cogs coglijst
  242. * ncf_twogs twoglijst
  243. * ncf_prots protlijst
  244. """
  245.  
  246. #TODO:
  247. #vindhoogtecognummer kan, maar is beetje bs want 1 try en 3 excepts, dus kan \
  248. # makkelijker.
  249.  
  250.  
  251. def NewCogFind(ncf_cogs, ncf_twogs, ncf_prots):
  252. coglijst_hoogste_waarde = list(set([y.split()[0] for y in ncf_cogs]))
  253. werkgetal = VindHoogsteCogNummer(coglijst_hoogste_waarde)
  254. ncf_list = []
  255. for prot in ncf_prots:
  256. prot_in_twogs = ZoekInLijst(prot, ncf_twogs, 1)
  257. posible_found_twogs = VerbrogenTwogs(prot, ncf_twogs, prot_in_twogs)
  258. if posible_found_twogs != []:
  259. newcog = list(set(" ".join(posible_found_twogs).split()))
  260. werkgetal += 1
  261. for incog in newcog:
  262. cogzin = "%s\t%s\n" % (
  263. ("0000000000%s" % (werkgetal))[-8:], incog)
  264. ncf_list.append(cogzin)
  265. TwogRemove(ZoekInLijst(incog, ncf_twogs, 0), ncf_twogs)
  266. VoegToeAanCog(ncf_list)
  267.  
  268.  
  269. """
  270. de functie keert het hoogste cognummer. Bestaat het nummer niet dan zal de
  271. waarde 0 teruggegeven worden.
  272. De functie gebruikt de volgende parameters :
  273. * vhcn_lijst lijst waar er in gezocht moet worden.
  274. De functie keert een getal terug
  275.  
  276. """
  277. #TODO:
  278. #beetje bullshit, zie vorige functie
  279.  
  280. def VindHoogsteCogNummer(vhcn_lijst):
  281. try:
  282. return int(max(vhcn_lijst)[0])
  283. except IOError:
  284. return 0
  285. except IndexError:
  286. return 0
  287. except ValueError:
  288. return 0
  289.  
  290.  
  291. """
  292. de functie keert de key van een dictionary waarbij de waarde de maximale waarde
  293. heeft.
  294. De functie gebruikt de volgende parameters :
  295. * kwmv_dict dictionairy waar erin gezocht wordt
  296. De functie keert key terug waarbij de value een hoogste maximale waarde heeft
  297.  
  298. """
  299.  
  300.  
  301. def KeyWithMaxVal(kwmv_dict):
  302. values = list(kwmv_dict.values())
  303. keys = list(kwmv_dict.keys())
  304. return keys[values.index(max(values))]
  305.  
  306.  
  307. """
  308. De functie doorzoekt:
  309. de protlijst, van de fastafile worden alleen de regels
  310. waar een ">" in voorkomt gepakt.
  311. de twoglijst
  312. de coglijst
  313. De functie gebruikt de volgende parameters :
  314. * onf_org organismenaam
  315. de functie keert (op volgorde) de volgende 3 lijsten terug:
  316. * protlijst
  317. * twoglijst
  318. * coglijst
  319. """
  320.  
  321.  
  322. def OpenNeededFiles(onf_org):
  323. protlijst = [y[1:-1] for y in OpenFile("%s.fa" % (onf_org)) if ">" in y]
  324. twoglijst = [y[:-1] for y in OpenFile("Twogs")]
  325. coglijst = [y[:-1] for y in OpenFile("cogs.txt")]
  326. return protlijst, twoglijst, coglijst
  327.  
  328.  
  329. """
  330. De functie doorzoekt in de cogs en in de twogs of de bestaande cogs geupdate
  331. moeten worden of dat er nieuwe cogs moeten onstaan. tevens zorgt het ervoor
  332. dat de twogfile geheel vernieuwe wordt.
  333. De functie gebruikt de volgende parameters (op volgorde):
  334. * sfc_cogs coglijst
  335. * sfc_twogs twoglijst
  336. * sfc_prots protlijst
  337. """
  338.  
  339.  
  340. def SearchForCog(sfc_cogs, sfc_twogs, sfc_prots):
  341. CogUpdate(sfc_cogs, sfc_twogs, sfc_prots)
  342. NewCogFind(sfc_cogs, sfc_twogs, sfc_prots)
  343. NewTwogFile(sfc_twogs)
  344.  
  345.  
  346. """
  347. de functie zorgt ervoor dat de cogs gemaakt worden van de bijgeleverde files.
  348. Voor elk nieuwe organisme wordt de naam van het organisme geprint
  349. Let op: bestaande files zoals de twogs en de cogs.txt zullen verwijderd worden!
  350. """
  351.  
  352. #TODO:
  353. #ik zou del gebruiken enz, niet os.system
  354.  
  355.  
  356. def Voorbeeld():
  357. os.system("rm Twogs cogs.txt")
  358. os.system("touch Twogs cogs.txt")
  359. orgslijst = [y[:-1] for y in OpenFile("orglijst") if "\n" in y]
  360. for x in range(len(orgslijst)):
  361. org1 = orgslijst[x]
  362. for y in range(len(orgslijst)):
  363. org2 = orgslijst[y]
  364. if x > y:
  365. SchrijfNaarTwog(org1, org2)
  366. print
  367. org1
  368. prots, twogs, cogs = OpenNeededFiles(org1)
  369. if x >= 2:
  370. SearchForCog(cogs, twogs, prots)
  371.  
  372.  
  373. if __name__ == '__main__':
  374. Voorbeeld()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement