Differences between revisions 3 and 46 (spanning 43 versions)
Revision 3 as of 2006-02-28 09:19:48
Size: 8727
Editor: 211
Comment:
Revision 46 as of 2006-03-03 09:20:22
Size: 4194
Editor: 211
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
|| [../2006-03] || (->) || || (<-) || [../2006-02] || [../2006-04] || (->) ||
Line 3: Line 3:
OPTION="firstWeekDay" VALUE="Monday"
2006-02-20="BioXP"
2006-02-21="-->"
2006-02-22="-->"
2006-02-23="-->"
2006-02-24="BioXP"
OPTION="firstWeekDay" VALUE="Sunday"
2006-03-01="공휴일"
2006-03-26="리눅스마스타1급1차시험일"
Line 12: Line 8:
== 2006-02-27 ==
protease에 의해 잘린 peptide의 mass 측정
 * 우선 peptide sequence 하나에 대해 질량을 구하는 함수를 만든다.
{{{#!python
def getPeptidesBy(self, kw=1):
        peptide = []
        RE = self.RestrictionEnzymes[kw]
        resite = RE.re
        repos = RE.rpos
        for aminoacid in self.sequence:
            if repos == 'C':
                peptide.append(aminoacid)
            if aminoacid in resite:
                if peptide:
                    yield ''.join(peptide)
                peptide = []
            if repos == 'N':
                peptide.append(aminoacid)
        if peptide:
            yield ''.join(peptide)
== 2006-03-03 ==
어제에 이어서...
Line 33: Line 11:
1. classmethod : 일반 메쏘드가 첫 인수(self)로 인스턴스 객체를 받는 것에 비해서 클래스 메쏘드는 첫 인수로 클래스 객체를 받는다. 메쏘드를 클래스 메쏘드로 변환하기 위해서 classmethod()를 호출해야 한다. 클래스 메쏘드 호출시 첫 번째 인수로 자동으로 해당 클래스 객체가 전달된다.
----
== 2006-03-02 ==
어제에 이어서...
Line 34: Line 16:
def calculateMass(self, peptide):
        mass = 0
        for aminoacid in peptide:
            mass += self.AminoAcidMass[aminoacid]
        return mass - 18.02*(len(peptide)-1)
1. enumerate() : peptide list들의 질량 list값들을 unittest에서 test할때 사용했다. 하나의 int값을 test할때는 assertAlmostEqual을 사용
 * for문을 이용할 때 요소의 값뿐만 아니라 인덱스 값도 함께 필요할 때 사용한다. (인덱스, 요소값)튜플 자료를 반복적으로 넘겨준다.
Line 40: Line 19:
 * 문제점 발견) Protein() 안에 있는 RestrictionEnzymes를 깔끔하게 하기 위해서 밖으로 뺐더니 NameError: name 'Trypsine' is not defined 가 발생했다.
 
 * 문제점 해결) class Trypsin 보다 위에 있었기 때문에 에러가 발생했다. 아래에 두면 OK. 왜냐하면 이 녀석이 Trypsine을 호출할 때 위에서부터 검색하기 때문이다.
Line 41: Line 23:
def getMassesOfPeptide(self):
        masses = []
        for peptide in self.peptidelist:
            mass = self.calculateMass(peptide)
            masses.append(mass)
        return masses
2. StringIO() : print 출력을 문자열로 저장하는 방법은 StringIO 표준 모듈을 이용하는 것이 간편하다. StringIO 모듈의 StringIO 클래스는 문자열을 파일 객체처럼 입.출력한다.

3. FastaGenerator() : multi fasta file을 받아서 record 단위로 출력해 주는 함수이다.
 * next() : 순차적으로 자료를 넘기고 더 이상 자료를 넘겨줄 수 없는 경우에는 StopIteration 예외를 발생한다. 파일 객체가 라인 단위의 반복자를 지원한다.
{{{#! python
def FastaGenerator(aFile):
    lines = [aFile.next()]
    for line in aFile:
        if line.startswith('>'):
            yield ''.join(lines)
            lines = []
        lines.append(line)
    else:
        yield ''.join(lines)
Line 48: Line 38:
 * 의문) : lines = [aFile.next()]에서 내 생각엔 aFile.next()를 쓰지 않아도 될거 같은데 없으면 AssertionError: '>title1\nATGC\nATGC\n' != " 가 발생한다. ???
Line 49: Line 40:
 * 테스트시 값이 실수인 경우에는 assertAlmostEqual을 사용해서 테스트를 한다. (결과값이 리스트인 경우에는 안된다.) {{{#! python
 def testFastaGenerator(self):
        input = StringIO('''\
>title1
ATGC
ATGC
>title2
TACG
TACG
''')
        g = FastaGenerator(input)
        expect = '''\
>title1
ATGC
ATGC
'''
        self.assertEquals(expect, g.next())
        expect1 = '''\
>title2
TACG
TACG
'''
        self.assertEquals(expect1, g.next())
}}}
 * 의문 : g.next()로 하지 않고, FastaGenerator(input)을 직접 사용했더니 AssertionError: '>title2\nTACG\nTACG\n' != 'TACG\nTACG\n' 에러가 발생했다. 왜 그럴까?
 
 -> AssertionError는 assert문이 실패할 때 발생한다.

4. lines.splitlines() : 문자열을 라인단위로 분리한다. 결과는 리스트
Line 53: Line 72:
== 2006-02-17 ==
protease로 절단한 부위 리턴하기
 * protease마다 절단 부위만 다르고, 동작하는 함수는 흡사하기 때문데 함수를 하나로 통일해서 작업하자...
 * 유의사항) C-term, N-term 어디서 시작하는지 유의할 것.
 * tip) generator를 활용하자...
       yield는 발생자를 위해서 파이썬 2.2에 새롭게 도입된 예약어이다. 어떤 함수이든 yield를 가지고 있다면 발생자이다. 파이썬 컴파일러가 이 키워드를 검출하면 이 함수를 발생자로 만들기 위해 별도로 처리한다. yield는 return과 유사하나 실행 상태를 보존한 상태에서 복귀한다.
{{{#!python
def digest(aProtein, ReSites, RsPos='C'):
 peptide=[]
 for aminoacid in aProtein:
  if RsPos=='C':
   peptide.append(aminoacid)
  if aminoacid in ReSites:
   yield ''.join(peptide)
   peptide = []
  if RsPos=='N':
   peptide.append(aminoacid)
 else:
  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
== 2006-03-01 ==
오늘의 문제 : 입력으로 multi FASTA format으로 구성된 DNA 서열을 받고, 출력으로 peptide 조각들의 질량을 돌려준다.
 * 1단계 : CRC card를 작성해 보자.
 * 2단계 : unittest로 코드 작성
1. map -> start codon의 인덱스를 찾기 위해서 사용했다. 여러개 있을 수도 있기 때문에 사용
 * map함수의 첫번째 인수는 함수이고, 두번째 인수는 리스트이다. 두번째 인수의 모든 아이템들은 첫 인수인 함수에 적용되고 결과로 리스트를 리턴한다.
 * startcodon = map(sequence.find, StartCodon)
주의) 내가 받는 값의 type을 잘 살펴보자...
Line 81: Line 81:
포토샵 팁) 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로 바꿔준다.
2. yield : protein sequence를 받아서 restriction enzyme으로 자를 때 사용했다.
 * 일반 함수와 발생자의 큰 차이점은 일반 함수는 한번 함수가 호출되면 종료할 때까지 모든 일을 마친 결과를 넘겨야 하는 반면에, 발생자는 정보를 생성하는 중간에 결과를 넘길 수 있다.
Line 91: Line 84:
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으로 절단한 부위 리턴하기
{{{#!python
def getTrypticDigests(self):
        result = []
        changelist = self.sequence
        for each in changelist:
            self.sequence = changelist
            Arg = self.sequence.find('R')+1
            Lys = self.sequence.find('K')+1
            if each == 'R':
                result.append(self.sequence[:Arg])
                changelist = self.sequence[Arg:]
            elif each == 'K':
                result.append(self.sequence[:Lys])
                changelist = self.sequence[Lys:]
        if changelist != '':
            result.append(changelist)
        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
{{{#!python
class RNA(NucleicAcid):
    def getcDNA(self):
        dna = DNA()
        dna.title = 'cDNA of ' + self.title
        dna.sequence = self.sequence.replace('U', 'T')
        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()이라고 쓰면 된다.

새로운 문제
{{{#!python
def testGetRna(self):
    rna = self.dna.getRna()
    self.assertEquals('RNA of test', rna.title)
    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에서 따온다.
Line 178: Line 87:
|| [../2006-03] || (->) || || (<-) || [../2006-02] || [../2006-04] || (->) ||

(<-)

[../2006-02]

[../2006-04]

(->)

2006 / March
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-
-26- -27- -28- -29- -30- -31-
리눅스마스타1급1차시험일


2006-03-03

어제에 이어서...

1. classmethod : 일반 메쏘드가 첫 인수(self)로 인스턴스 객체를 받는 것에 비해서 클래스 메쏘드는 첫 인수로 클래스 객체를 받는다. 메쏘드를 클래스 메쏘드로 변환하기 위해서 classmethod()를 호출해야 한다. 클래스 메쏘드 호출시 첫 번째 인수로 자동으로 해당 클래스 객체가 전달된다.


2006-03-02

어제에 이어서...

1. enumerate() : peptide list들의 질량 list값들을 unittest에서 test할때 사용했다. 하나의 int값을 test할때는 assertAlmostEqual을 사용

  • for문을 이용할 때 요소의 값뿐만 아니라 인덱스 값도 함께 필요할 때 사용한다. (인덱스, 요소값)튜플 자료를 반복적으로 넘겨준다.
  • 문제점 발견) Protein() 안에 있는 RestrictionEnzymes를 깔끔하게 하기 위해서 밖으로 뺐더니 NameError: name 'Trypsine' is not defined 가 발생했다.

  • 문제점 해결) class Trypsin 보다 위에 있었기 때문에 에러가 발생했다. 아래에 두면 OK. 왜냐하면 이 녀석이 Trypsine을 호출할 때 위에서부터 검색하기 때문이다.

2. StringIO() : print 출력을 문자열로 저장하는 방법은 StringIO 표준 모듈을 이용하는 것이 간편하다. StringIO 모듈의 StringIO 클래스는 문자열을 파일 객체처럼 입.출력한다.

3. FastaGenerator() : multi fasta file을 받아서 record 단위로 출력해 주는 함수이다.

  • next() : 순차적으로 자료를 넘기고 더 이상 자료를 넘겨줄 수 없는 경우에는 StopIteration 예외를 발생한다. 파일 객체가 라인 단위의 반복자를 지원한다.

def FastaGenerator(aFile):
    lines = [aFile.next()]
    for line in aFile:
        if line.startswith('>'):
            yield ''.join(lines)
            lines = []
        lines.append(line)
    else:
        yield ''.join(lines)
  • 의문) : lines = [aFile.next()]에서 내 생각엔 aFile.next()를 쓰지 않아도 될거 같은데 없으면 AssertionError: '>title1\nATGC\nATGC\n' != " 가 발생한다. ???

 def testFastaGenerator(self):
        input = StringIO('''\
>title1
ATGC
ATGC
>title2
TACG
TACG
''')
        g = FastaGenerator(input)
        expect = '''\
>title1
ATGC
ATGC
'''
        self.assertEquals(expect, g.next())
        expect1 = '''\
>title2
TACG
TACG
'''
        self.assertEquals(expect1, g.next())
  • 의문 : g.next()로 하지 않고, FastaGenerator(input)을 직접 사용했더니 AssertionError: '>title2\nTACG\nTACG\n' != 'TACG\nTACG\n' 에러가 발생했다. 왜 그럴까?

    -> AssertionError는 assert문이 실패할 때 발생한다.

4. lines.splitlines() : 문자열을 라인단위로 분리한다. 결과는 리스트


2006-03-01

오늘의 문제 : 입력으로 multi FASTA format으로 구성된 DNA 서열을 받고, 출력으로 peptide 조각들의 질량을 돌려준다.

  • 1단계 : CRC card를 작성해 보자.
  • 2단계 : unittest로 코드 작성

1. map -> start codon의 인덱스를 찾기 위해서 사용했다. 여러개 있을 수도 있기 때문에 사용

  • map함수의 첫번째 인수는 함수이고, 두번째 인수는 리스트이다. 두번째 인수의 모든 아이템들은 첫 인수인 함수에 적용되고 결과로 리스트를 리턴한다.
  • startcodon = map(sequence.find, StartCodon)

주의) 내가 받는 값의 type을 잘 살펴보자...

2. yield : protein sequence를 받아서 restriction enzyme으로 자를 때 사용했다.

  • 일반 함수와 발생자의 큰 차이점은 일반 함수는 한번 함수가 호출되면 종료할 때까지 모든 일을 마친 결과를 넘겨야 하는 반면에, 발생자는 정보를 생성하는 중간에 결과를 넘길 수 있다.


(<-)

[../2006-02]

[../2006-04]

(->)


CategoryWebLogYong

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

web biohackers.net