2017-09-14 2 views
-2

Comment puis-je le découper au hasard en fragments de 150 pb en python? Je veux le découper 1000 fois et regrouper tous les fragments de chaque fois ensemble. Ceci simule le séquençage d'Illumina.J'ai un génome bactérien, comment puis-je le découper au hasard en fragments d'ADN de 150 pb en python?

Voici l'exemple:

seq = 'ATGGAAAAAGAGTATACGATTGGATTAGATATTGGGACAAATTCGGTTGGATGGGCAGTGTTGACGGATG' 
len(seq)=70 

Je veux couper cette chaîne au hasard dans 5 petites chaînes avec une longueur fixe 10 sans déconner les commandes originales des lettres. Résultat attendu:

seq1= ['ATGGAAAAAG', 'AGTATACGAT', 'TGGATTAGAT', .......] 

Il est comme ceci:

seq1= seq[0:10] + seq[10:20] + seq[20:30] + seq[30:40] + seq[40:50] 

Mais je veux que ce soit au hasard au lieu de côté de l'autre.

Pour seq [n: n + 10], n est le point de départ du découpage. J'ai besoin qu'il soit aléatoire, ce qui signifie que je choisis au hasard un point de départ et que je sors une tranche d'ADN de 10 pb à ce point de départ. Je continue ensuite à trancher l'ADN à des points de départ aléatoires.

Et puis je dois faire le même découpage en tranches encore et encore pour un total de 10 fois:

seq2=['', '', '', .....] 
seq3=['', '', '', .....] 
seq4=['', '', '', .....] 
seq5=['', '', '', .....] 
seq6=['', '', '', .....] 
seq7=['', '', '', .....] 
seq8=['', '', '', .....] 
seq9=['', '', '', .....] 
seq10=['', '', '', .....] 

Et puis la piscine seq1 - seq10 ensemble.

Merci.

+1

Veuillez publier un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) afin que nous puissions vous aider. –

+1

Essayez https://bioinformatics.stackexchange.com/ – quantik

Répondre

0

Je voudrais juste choisir un point de départ aléatoire, et créer une sous-chaîne à partir de là. Votre point de départ exclut les 150 derniers caractères, en raison de la longueur de l'échantillon.

Je ferais alors une liste pour faciliter la manipulation plus tard.

(Je crée une chaîne d'ADN aléatoire ci-dessous pour les tests.)

from random import randint, choice 

#just for testing we will assign seq randomly. 
seq = ''.join(choice(['A', 'C', 'G', 'T']) for pony in range(1000)) 

sample_length = 150 
number_of_samples = 1000 

samples = [] 

for pony in range(number_of_samples): 
    sample_start = randint(0, len(seq) - sample_length) 
    samples += [seq[sample_start:sample_start+sample_length]] 

print(samples[0]) 
print(samples[1]) 

Si vous devez faire plusieurs fois, vous pouvez toujours mettre ci-dessus en fonction puis faire quelque chose comme:

samples_list = [do_func() for pony in range(10)] 
+0

Que diable se passe-t-il ici? Comment pouvez-vous commencer quelque part au hasard dans l'ADN et s'attendre à des résultats raisonnables? – roganjosh

+0

Aucune idée. Je suppose que c'est juste pour des échantillons aléatoires. Bien que cela pourrait produire des échantillons qui se chevauchent. – Paul

+0

L'OP voulait des échantillons aléatoires, et l'exemple donné semble être des index de départ aléatoires. 'seq1 = ['ATGGAAAAAG', 'TACGATTGGA', 'GTTGGATGGG', .......]' – Paul

0
#calculate how much extra space there is 
extra_length = total_length-string_count*string_length 
#choose how to allocate extra space 
gaps = np.random.choice(extra_length,string_count) 
gaps.sort() 
gaps = np.diff(gaps) 
#we now have a list of random numbers that add up to extra_length 
start = 0 
end = start+string_length 
seq1 = [seq[start:end]] 
for string_index in range(string_count-1): 
    #each string skips a random distance determined by our gaps variable 
    start = end+gaps[string_index] 
    end = start+string_length 
    seq1.append(seq[start:start+string_length]) 
+0

Merci beaucoup pour votre réponse. J'ai la réponse de Paul qui marche plutôt bien. – stevex