Size: 11861
Comment:
|
← Revision 49 as of 2011-08-03 11:00:55 ⇥
Size: 11861
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과 유사하나 실행 상태를 보존한 상태에서 복귀한다.
- 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에 쓰고, BioMolecule은 NucleicAcid를 상속 받는다.
- 문제점 해결) 내 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
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()이라고 쓰면 된다.
새로운 문제
이 테스트 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] |
(->) |