Differences between revisions 3 and 82 (spanning 79 versions)
Revision 3 as of 2006-02-28 09:19:48
Size: 8727
Editor: 211
Comment:
Revision 82 as of 2006-09-08 11:03:53
Size: 8377
Editor: 203
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
|| [../2006-03] || (->) || ## page was renamed from parkpro77/2006-03
|| (<-) || [../2006-02] || [../2006-04] || (->) ||
Line 3: Line 4:
OPTION="firstWeekDay" VALUE="Monday"
2006-02-20="BioXP"
2006-02-21="-->"
2006-02-22="-->"
2
006-02-23="-->"
2006-02-24="BioXP"
OPTION="firstWeekDay" VALUE="Sunday"
2006-03-01="공휴일"
2006-03-26="리눅스시험2시"
2006-03-30="1000일^^"
Line 12: Line 10:
== 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-28 ==
Line 33: Line 12:
빌게이츠의 인생충고 10가지...
Line 34: Line 14:
def calculateMass(self, peptide):
        mass = 0
        for aminoacid in peptide:
            mass += self.AminoAcidMass[aminoacid]
        return mass - 18.02*(len(peptide)-1)
 1. 인생이란 원래 공평하지 못하다. 그런 현실에 대하여 불평할 생각하지 말고 받아들여라.
Line 40: Line 16:
 2. 세상은 네 자신이 어떻게 생각하든 상관하지 않는다. 세상이 너희들한테 기대하는 것은 네가 스스로 만족한다고 느끼기 전에 무엇인가를 성취해서 보여 줄 것을 기다리고 있다.
Line 41: Line 18:
def getMassesOfPeptide(self):
        masses = []
        for peptide in self.peptidelist:
            mass = self.calculateMass(peptide)
            masses.append(mass)
        return masses
}}}
 3. 대학 교육을 받지 않은 상태에서 연봉이 4만 달러가 될 것이라고는 상상도 하지 말라.
Line 49: Line 20:
 * 테스트시 값이 실수인 경우에는 assertAlmostEqual을 사용해서 테스트를 한다. (결과값이 리스트인 경우에는 안된다.)  4. 학교 선생님이 까다롭다고 생각되거든 사회 나와서 직장 상사의 진짜 까다로운 맛을 한 번 느껴 봐라.

 5. 햄버거 가게에서 일하는 것을 수치스럽게 생각하지 마라. 너희 할아버지는 그 일을 기회라고 생각하였다.

 6. 네 인생을 네가 망치고 있으면서 부모 탓을 하지 마라. 불평만 일삼을 것이 아니라 잘못한 것에서 교훈을 얻어라.

 7. 학교는 승자나 패자를 뚜렷이 가리지 않을지 모른다. 어떤 학교에서는 낙제 제도를 아예 없애고 쉽게 가르치고 있다는 것을 잘 안다. 그러나 사회 현실은 이와 다르다는 것을 명심하라.

 8. 인생은 학기처럼 구분되어 있지도 않고 여름 방학이란 것은 아예 있지도 않다. 네가 스스로 알아서 하지 않으면 직장에서는 가르쳐 주지 않는다.

 9. TV는 현실이 아니다. 현실에서는 커피를 마셨으면 일을 시작하는 것이 옳다.

 10. 공부 밖에는 할 줄 모르는 '바보'한테 잘 보여라. 사회 나온 다음에는 아마 그 '바보' 밑에서 일하게 될지 모른다.

----
== 2006-03-27 ==

강의 : 이화여대 이상혁 교수님

세번째 강의...

분자생물학에 대한 개괄적인 내용이었다. central dogma...and informatics적인 central dogma

----
== 2006-03-23 ==
Django tutorial 1 번역중...

Django 실습
 * python manage.py runserver -> Django 서버가 돌아간다.
 * python manage.py runserver 0.0.0.0:8000 -> 원격지에서 확인하고 싶으면...
 * sqlite3 test.db -> sqlite3는 파일 하나로 db를 만든다.
 * vi settings.py
 
 -> DATABASE_ENGINE에 sqlite3

 -> DATABASE_NAME에 만든 데이타베이스 이름, 단 sqlite3는 db 파일경로
 * python manage.py init ->
 * apt-cache search pysqlite2 ->
 * apt-get install python2.4-pysqlite2 ->

----
== 2006-03-20 ==
이번주 일요일에 리눅스마스타 1급1차 시험보는 장소

attachment:linux.jpg

----
== 2006-03-16 ==
Introduction to Bioinformatics 2

강의 : 이화여대 이상혁 교수님

두번째 강의...
Line 53: Line 76:
== 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-14 ==
Introduction to Bioinformatics 1
Line 81: Line 79:
포토샵 팁) 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로 바꿔준다.
강의 : 이화여대 이상혁 교수님
Line 91: Line 81:
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으로 절단하는 코드와 유사하다...
첫 주 강의 시작...
 
Line 123: Line 85:
== 2006-02-14 ==
error 메시지를 자세히 보면서 풀면 잘 해낼 수 있다...^^
 * 문제점 해결) 일단 RNA의 class를 만든다. 그 다음 title과 sequence를 print로 찍어보면, 다음에 무엇을 해야할 지 알 수 있을 것이다.
== 2006-03-06 ==
EightQueenProblem
 * 고전적 퍼즐게임. 체스판위의 Queen은 장기의 차처럼 전후좌우 이동이 가능하며, 대각선으로도 가능하다. 총 8*8 크기의 체스판위에 Queen 8개를 올려놓고 이들이 서로 공격하지 않도록 자리배치하는 문제.
----
== 2006-03-03 ==
어제에 이어서...
Line 127: Line 92:
RNA 서열 fasta 포맷 형식으로 출력하기...
 * 문제점 해결) RNA class에 DNA class에서 사용했던 parseFasta()를 사용
1. classmethod : single fasta file을 title과 sequence 부분으로 나눠줄때 사용했다.
 * 일반 메쏘드가 첫 인수(self)로 인스턴스 객체를 받는 것에 비해서 클래스 메쏘드는 첫 인수로 클래스 객체를 받는다. 메쏘드를 클래스 메쏘드로 변환하기 위해서 classmethod()를 호출해야 한다. 클래스 메쏘드 호출시 첫 번째 인수로 자동으로 해당 클래스 객체가 전달된다.
{{{#! python
@classmethod
    def FastaParsing(klass, aStr):
        fasta = klass()
        lines = aStr.splitlines()
        fasta.title = lines[0][1:]
        fasta.sequence = ''.join(lines[1:])
        return fasta
}}}
 * 이 함수는 DNA 클래스 안에 있다. DNA 클래스 밖으로 뺐더니 TypeError: 'classmethod' object is not callable 에러가 발생했다.
Line 130: Line 105:
상속
 * DNA나 RNA는 서로 비슷하고 하는 일도 비슷한 것이 있다...이 때, 하는 일이 비슷한 함수를 부모 class에 묶어서 두는 것을 상속이라 한다.
2. TypeError: unbound method FastaParsing() must be called with DNA instance as first argument (got str instance instead)
 * FastaParsing()을 classmethod를 사용하지 않고 했더니 이와 같은 에러 메세지가 발생했다.
Line 133: Line 108:
새로운 문제
 * 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
3. Unbound Class Method : 클래스 객체를 이용하여 메쏘드를 호출하는 것. 예) MyClass.set(c, 'egg'))

4. 질량 리스트를 질량이 작은 순으로 출력하기
 * ', '.join('%.2f'%mass for mass in sorted(masses))
----
== 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 예외를 발생한다. 파일 객체가 라인 단위의 반복자를 지원한다.
{{{#! 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 143: Line 138:
 * tip) 함수를 만들었을 때, 중간중간 테스트 하다보면 AttributeError: 'NoneType' object has no attribute 'title' 이라는 에러코드가 뜬다. 이게 뜨는 이유는 함수에 return 값이 없기 때문이다...  * 의문) : lines = [aFile.next()]에서 내 생각엔 aFile.next()를 쓰지 않아도 될거 같은데 없으면 AssertionError: '>title1\nATGC\nATGC\n' != " 가 발생한다. ???
Line 145: Line 140:
----
== 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 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문이 실패할 때 발생한다.
Line 153: Line 168:
새로운 문제
{{{#!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에서 따온다.
4. lines.splitlines() : 문자열을 라인단위로 분리한다. 결과는 리스트
Line 178: Line 172:
|| [../2006-03] || (->) || == 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] || (->) ||

(<-)

[../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-
리눅스시험2시
1000일^^


2006-03-28

빌게이츠의 인생충고 10가지...

  1. 인생이란 원래 공평하지 못하다. 그런 현실에 대하여 불평할 생각하지 말고 받아들여라.
  2. 세상은 네 자신이 어떻게 생각하든 상관하지 않는다. 세상이 너희들한테 기대하는 것은 네가 스스로 만족한다고 느끼기 전에 무엇인가를 성취해서 보여 줄 것을 기다리고 있다.
  3. 대학 교육을 받지 않은 상태에서 연봉이 4만 달러가 될 것이라고는 상상도 하지 말라.
  4. 학교 선생님이 까다롭다고 생각되거든 사회 나와서 직장 상사의 진짜 까다로운 맛을 한 번 느껴 봐라.
  5. 햄버거 가게에서 일하는 것을 수치스럽게 생각하지 마라. 너희 할아버지는 그 일을 기회라고 생각하였다.
  6. 네 인생을 네가 망치고 있으면서 부모 탓을 하지 마라. 불평만 일삼을 것이 아니라 잘못한 것에서 교훈을 얻어라.
  7. 학교는 승자나 패자를 뚜렷이 가리지 않을지 모른다. 어떤 학교에서는 낙제 제도를 아예 없애고 쉽게 가르치고 있다는 것을 잘 안다. 그러나 사회 현실은 이와 다르다는 것을 명심하라.
  8. 인생은 학기처럼 구분되어 있지도 않고 여름 방학이란 것은 아예 있지도 않다. 네가 스스로 알아서 하지 않으면 직장에서는 가르쳐 주지 않는다.
  9. TV는 현실이 아니다. 현실에서는 커피를 마셨으면 일을 시작하는 것이 옳다.
  10. 공부 밖에는 할 줄 모르는 '바보'한테 잘 보여라. 사회 나온 다음에는 아마 그 '바보' 밑에서 일하게 될지 모른다.


2006-03-27

강의 : 이화여대 이상혁 교수님

세번째 강의...

분자생물학에 대한 개괄적인 내용이었다. central dogma...and informatics적인 central dogma


2006-03-23

Django tutorial 1 번역중...

Django 실습

  • python manage.py runserver -> Django 서버가 돌아간다.

  • python manage.py runserver 0.0.0.0:8000 -> 원격지에서 확인하고 싶으면...

  • sqlite3 test.db -> sqlite3는 파일 하나로 db를 만든다.

  • vi settings.py

    -> DATABASE_ENGINE에 sqlite3

    -> DATABASE_NAME에 만든 데이타베이스 이름, 단 sqlite3는 db 파일경로

  • python manage.py init ->

  • apt-cache search pysqlite2 ->

  • apt-get install python2.4-pysqlite2 ->


2006-03-20

이번주 일요일에 리눅스마스타 1급1차 시험보는 장소

attachment:linux.jpg


2006-03-16

Introduction to Bioinformatics 2

강의 : 이화여대 이상혁 교수님

두번째 강의...


2006-03-14

Introduction to Bioinformatics 1

강의 : 이화여대 이상혁 교수님

첫 주 강의 시작...


2006-03-06

EightQueenProblem

  • 고전적 퍼즐게임. 체스판위의 Queen은 장기의 차처럼 전후좌우 이동이 가능하며, 대각선으로도 가능하다. 총 8*8 크기의 체스판위에 Queen 8개를 올려놓고 이들이 서로 공격하지 않도록 자리배치하는 문제.


2006-03-03

어제에 이어서...

1. classmethod : single fasta file을 title과 sequence 부분으로 나눠줄때 사용했다.

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

@classmethod
    def FastaParsing(klass, aStr):
        fasta = klass()
        lines = aStr.splitlines()
        fasta.title = lines[0][1:]
        fasta.sequence = ''.join(lines[1:])
        return fasta
  • 이 함수는 DNA 클래스 안에 있다. DNA 클래스 밖으로 뺐더니 TypeError: 'classmethod' object is not callable 에러가 발생했다.

2. TypeError: unbound method FastaParsing() must be called with DNA instance as first argument (got str instance instead)

  • FastaParsing()을 classmethod를 사용하지 않고 했더니 이와 같은 에러 메세지가 발생했다.

3. Unbound Class Method : 클래스 객체를 이용하여 메쏘드를 호출하는 것. 예) MyClass.set(c, 'egg'))

4. 질량 리스트를 질량이 작은 순으로 출력하기

  • ', '.join('%.2f'%mass for mass in sorted(masses))


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