Differences between revisions 48 and 49
Revision 48 as of 2006-09-08 11:04:07
Size: 11861
Editor: 203
Comment:
Revision 49 as of 2011-08-03 11:00:55
Size: 11861
Editor: localhost
Comment: converted to 1.6 markup
No differences found!

[../2006-03]

(->)

2006 / February
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
-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-
BioXP
-->
-->
-->
BioXP
-26- -27- -28-


2006-02-28

final : DNA FASTA file을 입력 받아서 출력으로 peptides의 질량 리스트를 구하라.

표준입출력을 사용하는 명령행 프로그램이어야 한다. 
./est2pmass -option < input.fasta > output.txt
입력은 복수개의 레코드로 이루어진 FASTA format 으로 구성된 DNA 서열파일 
출력은 펩타이드 조각들의 질량 (반올림하여 소수점 두째자리까지 표시) 
>seqnence1 : 1234.12, 2345.34, 3456.45, 4532.20
>sequence2 : 1237.89, 4326.43

   1 def main():
   2     try:
   3         gc = int(sys.argv[2])
   4         re = int(sys.argv[8])
   5     except:
   6         gc = 1
   7         re = 1
   8     g = FastaGenerator(sys.stdin)
   9     for record in g:
  10         dna = DNA.parseFasta(record)
  11         protein = dna.getProtein()
  12         masses = protein.getMassesOfPeptide(re)
  13         title = dna.title.split('|')
  14         sys.stdout.write('>' + title[4] + ' : ' + ', '.join("%.2f"%mass for mass in masses)  +'\n')
  • sys.stdout.write 대신 나는 print를 사용했었다. 결과 출력하는데 별차이 없어 보이지만 sys.stdout.write를 쓰는 것이 정석이랄까... 참고) print문은 마지막에 \n한 효과가 있다...
  • 11번째줄 : DNA()의 속성중에 sequence를 받아서 protein sequence로 출력해 주는 method가 있다. 그렇기 때문에 구지 protein = Protein()해줄 필요가 없다. getMassesOfPeptide는 protein sequence를 받으면 restriction enzyme에 의해 peptide list가 생기고, peptide 하나하나 mass를 구하고, 그 mass의 list를 돌려준다.
  • 14번째줄 : mass 데이타를 str으로 출력해야 하는데 masses는 리스트로 되어 있다. 여기서 넘 시간을 끌었다. 어찌보면 넘 간단한 수식인데 책에서만 보고 직접 해 보질 않아서인지 생각이 잘 나지 않았다. 이제는 확실히 알았으니 담에는 절대 틀리지 말아야지...
  • 주의사항) class와 객체, 그리고 그 녀석들이 어떤 속성을 가지고 있는지 파악하는게 가장 중요한 거 같다... 역시 전체적인 흐름을 파악하는것이라고 할 수 있겠다...

총정리 시간

  • 지금까지 짠 코드들의 흐름을 파악하고, 새롭게 처음부터 다시 짜보자...

    --> 절대 짰던 코드는 보지 말고, TDD를 사용해서 차근차근 짜 보자...


2006-02-27

protease에 의해 잘린 peptide의 mass 측정

  • 우선 peptide sequence 하나에 대해 질량을 구하는 함수를 만든다.

   1 def getPeptidesBy(self, kw=1):
   2         peptide = []
   3         RE = self.RestrictionEnzymes[kw]
   4         resite = RE.re
   5         repos = RE.rpos
   6         for aminoacid in self.sequence:
   7             if repos == 'C':
   8                 peptide.append(aminoacid)
   9             if aminoacid in resite:
  10                 if peptide:
  11                     yield ''.join(peptide)
  12                 peptide = []
  13             if repos == 'N':
  14                 peptide.append(aminoacid)
  15         if peptide:
  16             yield ''.join(peptide)
  17 
  18 
  19 def calculateMass(self, peptide):
  20         mass = 0
  21         for aminoacid in peptide:
  22             mass += self.AminoAcidMass[aminoacid]
  23         return mass - 18.02*(len(peptide)-1)
  24 
  25 
  26 def getMassesOfPeptide(self):
  27         masses = []
  28         for peptide in self.peptidelist:
  29             mass = self.calculateMass(peptide)
  30             masses.append(mass)
  31         return masses
  • 테스트시 값이 실수인 경우에는 assertAlmostEqual을 사용해서 테스트를 한다. (결과값이 리스트인 경우에는 안된다.)
  • class protein()의 self.sequence는 단백질 서열(amino acid)이다. 처음에 protein이라는 class를 만들었을 때 정의해 주었다. 그걸 중간에 형식을 바꾸게 되면 나중에 다른 함수에서 사용하게 되었을 때 곤란한 경우가 생긴다. 난 위에 세 개의 함수를 테스트 할 때 self.sequence의 형식을 다 다르게 해주었다. 그냥 self.sequence는 놔두고 필요한 sequence는 함수에서 받아서 썼어야 했는데......
  • 코드 10, 15번째 줄에서 많이 해맺었다. restriction enzyme이 마지막에 오게 되면 마지막 sequence와 함께 공문자열을 출력하게 된다. 해결방법이 넘 간단하다 ㅠ.ㅠ


2006-02-17

protease로 절단한 부위 리턴하기

  • protease마다 절단 부위만 다르고, 동작하는 함수는 흡사하기 때문데 함수를 하나로 통일해서 작업하자...
  • 유의사항) C-term, N-term 어디서 시작하는지 유의할 것.
  • tip) generator를 활용하자...
    • yield는 발생자를 위해서 파이썬 2.2에 새롭게 도입된 예약어이다. 어떤 함수이든 yield를 가지고 있다면 발생자이다. 파이썬 컴파일러가 이 키워드를 검출하면 이 함수를 발생자로 만들기 위해 별도로 처리한다. yield는 return과 유사하나 실행 상태를 보존한 상태에서 복귀한다.

   1 def digest(aProtein, ReSites, RsPos='C'):
   2         peptide=[]
   3         for aminoacid in aProtein:
   4                 if RsPos=='C':
   5                         peptide.append(aminoacid)
   6                 if aminoacid in ReSites:
   7                         yield ''.join(peptide)
   8                         peptide = []
   9                 if RsPos=='N':
  10                         peptide.append(aminoacid)
  11         else:
  12                 yield ''.join(peptide)
  • tip) for문에 else는 for문이 다 돌고 나면 마지막에 돌고, for문에서 error가 나면 else도 수행하지 않는다.


2006-02-16

오늘은 회사 홈페이지 몇 군데를 수정했다.

  • product/transcriptomics --> 149,139,259,154

  • product/proteomics --> 275,140,350,152

  • product/metabolomics --> 365,140,458,153

포토샵 팁) gif파일 수정하기

  • 우선 gif파일을 열고, image -> mode -> RGB color를 선택, background layer를 더블클릭해서 자물쇠를 없애면 그때부터 작업할 수 있다. 스포이드로 색깔을 찍어서 확인할 수 있고, T 를 누르면 글자를 생성.작업할 수 있고 마쳤으면 위에 꺽쇠를 누르면 된다. 오른쪽 layer표시에 주의해서 작업하자...


2006-02-15

RNA translate

  • 자세히 보면 DNA서열로 translate한 코드와 유사하다. (단, U가 T로 바뀌는 것만 제외하면...)
  • tip) 같은 부분은 부모 class로 빼고, 다른 부분만 적어 준다.
  • 주의사항) U가 T로 바뀌면 self.sequence가 바뀌기 때문에 translate 돌려주고 다시 self.sequence는 원래 sequence로 바꿔준다.

DNA서열로 만든 protein서열을 fasta로 돌려주기

  • 이미 NucleicAcid라는 class를 만들어서 DNA와 RNA에 관련된 일을 하는 코드들을 묶어 두었다.

  • protein서열은 NucleicAcid class에는 적합하지 않다고 판단, BioMolecule이라는 NucleicAcid의 상위 클래스를 만들어서 protein에 관한 일을 하는 코드들은 직접 Biomolecule에 쓰고, BioMoleculeNucleicAcid를 상속 받는다.

  • 문제점 해결) 내 sequence 가지고 이미 만들어진 getFasta라는 함수를 쓰면 되기 때문에 test코드에 있는 title만 유념해서 getFasta를 상속받아서 쓰면 된다.
  • tip) 클래스 이름이나 함수 이름을 지을 때, 그리고 그 함수와 클래스의 관계를 잘 파악해서 상속 받는 개념을 잘 이해해 두자...

amino acid sequence에서 trysine으로 절단한 부위 리턴하기

   1 def getTrypticDigests(self):
   2         result = []
   3         changelist = self.sequence
   4         for each in changelist:
   5             self.sequence = changelist
   6             Arg = self.sequence.find('R')+1
   7             Lys = self.sequence.find('K')+1
   8             if each == 'R':
   9                 result.append(self.sequence[:Arg])
  10                 changelist = self.sequence[Arg:]
  11             elif each == 'K':
  12                 result.append(self.sequence[:Lys])
  13                 changelist = self.sequence[Lys:]
  14         if changelist != '':
  15             result.append(changelist)
  16         return result
  • 문제점 발견) 마지막 sequence가 R이나 K가 아니면 그 뒤에 sequence는 return이 되지 않는다.
  • 문제점 해결) return하기전에 sequence를 result에 추가하고, 추가할게 없는 result는 공문자열을 생성하는데, 그걸 if문으로 삭제했다.

amino acid sequence에서 chymotrypsin으로 절단한 부위 리턴하기

  • trysine으로 절단하는 코드와 유사하다...


2006-02-14

error 메시지를 자세히 보면서 풀면 잘 해낼 수 있다...

  • 문제점 해결) 일단 RNA의 class를 만든다. 그 다음 title과 sequence를 print로 찍어보면, 다음에 무엇을 해야할 지 알 수 있을 것이다.

RNA 서열 fasta 포맷 형식으로 출력하기...

  • 문제점 해결) RNA class에 DNA class에서 사용했던 parseFasta()를 사용

상속

  • DNA나 RNA는 서로 비슷하고 하는 일도 비슷한 것이 있다...이 때, 하는 일이 비슷한 함수를 부모 class에 묶어서 두는 것을 상속이라 한다.

새로운 문제

  • reversetranscription 하는 test code

   1 class RNA(NucleicAcid):
   2     def getcDNA(self):
   3         dna = DNA()
   4         dna.title = 'cDNA of ' + self.title
   5         dna.sequence = self.sequence.replace('U', 'T')
   6         return dna
  • tip) 함수를 만들었을 때, 중간중간 테스트 하다보면 AttributeError: 'NoneType' object has no attribute 'title' 이라는 에러코드가 뜬다. 이게 뜨는 이유는 함수에 return 값이 없기 때문이다...


2006-02-13

-1을 제외한 가장 작은 수를 구하는 함수를 만들어서 start codon을 구해서 code 작성.

  • 문제점 발견 : stop codon을 for문을 이용해서 하나씩 seq에 대입해서 code를 작성했더니, stop codon에서 멈추지 않고 끝까지 translation했다.
  • 이유 : 아마도 for문을 벗어나도 result문이 있기 때문인 것 같다.
  • 문제점 해결 : 일단 start codon code는 그대로 가고, start codon 이후의 seq에서 stop codon의 -1을 제외한 가장 작은 수를 구해서 stop codon이 있으면 stop codon을 3으로 나눈 수에 1을 더한 만큼 for문을 돌려서 translation했다.
  • tip) -1을 제외한 가장 작은 수 구하는 함수를 만들어 놓고, 다른 함수에서 쓰려고 한다. 이 때, 이 함수 역시 DNA()라는 class안에 있기 때문에 self.mymin()이라고 쓰면 된다.

새로운 문제

   1 def testGetRna(self):
   2     rna = self.dna.getRna()
   3     self.assertEquals('RNA of test', rna.title)
   4     self.assertEquals('AGUC', rna.sequence)

이 테스트 code를 통과하는 함수를 만들어라...


2006-02-10

계속해서 translation code 작성 중... - start codon이 여러개일때 가장 먼저 나오는 start codon을 찾아야 한다.

  • tip) 논리 연산을 이용해 차례대로 하나씩 비교해서 작은 수를 변수에 저장한다. 그런데, -1이 나오면 제외시켜야 한다.
  • 문제점 발견) [0]부분에 -1이 있으면 return 값이 -1이 나온다.
  • 문제점 해결) 배열을 sorted(배열, reverse=1)로 정렬한 다음 진행한다.


2006-02-08

translation code 작성

  • genetic code는 17개 정도로 종마다 다르다.
  • 이걸 함수 하나에 작성해야 한다.
  • tip) class를 써서 종마다 다른 부분(ProComp, icodon, tcodon)을 작성. 함수에는 translation하는 code를 작성하는데, 다른 부분은 class에서 따온다.


[../2006-03]

(->)


CategoryWebLogYong

parkpro/2006-02 (last edited 2011-08-03 11:00:55 by localhost)

web biohackers.net