2014-06-05 1 views
2

일련의 돌연변이 DNA 가닥에 대한 사전을 만들고 각 돌연변이는 원래 염기와 돌연변이 된 염기를 보여줍니다.랜덤 DNA 돌연변이 발생 장치

정교하게 말하면, 내가하고 싶은 것은 특정 DNA 가닥을 입력하고 돌연변이 빈도가 0.66 % 인 무작위로 생성 된 가닥을 100 개 만들어내는 발전기를 만드는 것입니다 (이것은 각 기본, 각 염기는 다른 염기로 변이 될 수있다). 그런 다음, 내가하고 싶은 것은 일련의 사전을 작성하는 것입니다. 여기서 각 사전은 임의로 생성 된 특정 가닥에서 발생한 돌연변이를 자세히 설명합니다. 열쇠가 원래 기본이되고 값이 새로운 변형 된 기본이되게하고 싶습니다. 이 작업을 수행하는 간단한 방법이 있습니까?

#yields a strand with an A-T mutation frequency of 0.066% 
def mutate(string, mutation, threshold): 
    dna = list(string) 
    for index, char in enumerate(dna): 
     if char in mutation: 
      if random.random() < threshold: 
       dna[index] = mutation[char] 

    return ''.join(dna) 

dna = "ATGTCGTACGTTTGACGTAGAG" 
print("DNA first:", dna) 
newDNA = mutate(dna, {"A": "T"}, 0.0066) 
print("DNA now:", newDNA) 

을하지만은이 코드를 사용하여 한 가닥을 얻을 수 있고, 그것은 단지 T에 초점을 맞추고 ->은 돌연변이 : 지금까지, 나는 다음과 같습니다 루프 실험했습니다. 나는 또한이 사전을 어떻게 묶을 지 잘 모르겠습니다. 누군가 나에게 이것을하는 더 좋은 방법을 보여줄 수 있습니까? 감사.

+0

사전에 포함 할 내용을 조금 더 자세하게 설명 할 수 있습니까? 돌연변이가 발생한 색인 목록을 유지하는 것처럼 보이지만 더 많이 원하는 것처럼 보입니다. – Blckknght

+0

나는 사전에 키가 원래베이스가되도록하고 값은 변형 된베이스가되도록하고 싶습니다. 예를 들어, "ATGT"와 같이 보이는 원본 가닥이 있고 다음과 같은 변형 된 가닥이있는 경우 : "AGTT",이 가닥의 사전을 {T : G, G : T} – user3670902

+0

모든 상황을 처리 할 수 ​​있는지 잘 모르겠습니다. 동일한베이스를 여러 번 다른 값으로 변경할 수 있습니다. 어떻게 처리해야합니까? 내가 생각하기에 사전이 아닌'from, to' 튜플의 목록을 제공하기는 쉽습니다. – Blckknght

답변

2

문제의 두 부분이있는 것 같습니다. 첫 번째는 DNA 서열을 여러 번 돌연변이시키고 자하는 것이고, 두 번째는 어떤 종류의 데이터 구조에서 돌연변이에 대한 추가 정보를 수집하고자한다는 것입니다. 나는 그것들을 각각 처리 할 것이다.

동일한 소스 문자열에서 100 개의 임의 결과를 생성하는 것은 매우 쉽습니다. 경우, 물론

results = [mutate(original_string) for _ in range(100)] 

: 당신은 (발전기 기능에, 예를 들어) 명시 적 루프와 함께 할 수 있지만, 당신은 쉽게 이상 단일 돌연변이 기능을 실행하기 위해 지능형리스트를 사용할 수 있습니다 이상 mutate 함수를 더 복잡하게 만들면이 간단한 코드가 적합하지 않을 수 있습니다. 단순한 문자열이 아닌 좀 더 정교한 데이터 구조를 반환하는 경우 원하는 형식으로 데이터를 결합하기 위해 추가 처리가 필요할 수 있습니다.

이러한 데이터 구조를 작성하는 방법에 대해서는 이미 코드를 작성하는 것이 좋습니다. 데이터에 얼마나 정확하게 액세스 할 것인지 결정한 다음 올바른 유형의 컨테이너로 안내 할 수 있어야합니다.

예를 들어 문자열에 일어나는 모든 돌연변이에 대한 간단한 기록 만 갖고 싶다면 돌연변이 전후의 기본 튜플을 포함하는 기본 목록을 제안 할 수 있습니다. 반면에 주어진베이스가 무엇에 대해 변이되는지를 효율적으로 찾을 수 있기를 원한다면 목록을 값으로 갖는 사전이 더 적절할 수 있습니다. 원한다면 돌연변이 된 염기의 색인을 포함시킬 수도 있습니다.

bases = "ACGT" 

def mutate(orig_string, mutation_rate=0.0066): 
    result = [] 
    mutations = [] 
    for base in orig_string: 
     if random.random() < mutation_rate: 
      new_base = bases[bases.index(base) - random.randint(1, 3)] # negatives are OK 
      result.append(new_base) 
      mutations.append((base, new_base)) 
     else: 
      result.append(base) 
    return "".join(result), mutations 

이 코드의 가장 까다로운 비트가 나는의 교체를 따기 해요 방법은 다음과 같습니다

여기에 모든 돌연변이를 기록 튜플의 목록과 함께 돌연변이 문자열을 반환하는 함수에 잠깐 시도이다 현재의베이스. 표현 bases[bases.index(base) - random.randint(1, 3)]은 모두 한 번에 수행합니다. 다른 비트를 분해 할 수 있습니다. bases.index(base)은 코드 상단에있는 전역 bases 문자열의 이전 기본 인덱스를 제공합니다. 그런 다음이 인덱스 (random.randint(1, 3))에서 임의의 오프셋을 뺍니다. 새 인덱스는 음수 일 수 있지만 괜찮 으면 bases 문자열 (bases[...])으로 다시 인덱스 할 때 음수 인덱스는 왼쪽이 아닌 오른쪽에서 계산됩니다.하나 이상의 돌연변이를 얻을 매우 가능성이있어 "ATGT"처럼 짧은 문자열에 대한

string = "ATGT" 
results = [mutate(string) for _ in range(100)] 
for result_string, mutations in results: 
    if mutations: # skip writing out unmutated strings 
     print(result_string, mutations) 

을, 심지어 사람은 매우 드문 : 여기

당신이 그것을 사용할 수있는 방법입니다. 위의 루프는 각 실행에서 2와 4 개의 결과를 인쇄하는 경향이 있습니다 (즉, 길이의 4 분의 95 이상이 4 개의 문자열이 전혀 변경되지 않았습니다). 긴 문자열은 돌연변이가 더 자주 발생하므로 하나의 문자열에 여러 개의 돌연변이가 표시됩니다.

+0

도움을 주셔서 감사합니다. 그러나 일단 코드를 테스트하기 시작하면 오류가 발생하는 것 같습니다. 제 생각에는 문제가 있다고 생각합니다. 위에서 보여준 코드에 약간의 수정을가했습니다. (사용하고자하는 문자열을 입력했습니다.) 편집 한 내용을 보여주었습니다. 내가 뭘 잘못했는지 알아? – user3670902

+0

@ user3670902 편집을 롤백했습니다. 당신은 질문을 크게 변경해서는 안됩니다. 게시 한 코드는 매우 혼란스럽고 들여 쓰기 문제가있었습니다. 클래스 정의에서 "느슨한"코드를 사용해서는 안되며, 정의 메소드 내부에 있어야합니다. – jonrsharpe

+0

죄송합니다 jonrsharpe,하지만 내 편집을 게시하기로되어 있습니까? 들여 쓰기 문제를 알지 못했기 때문에 게시했습니다. 내 편집 내용을 올바르게 게시하려면 어떻게해야합니까? – user3670902