2014-11-12 2 views
1

Я хочу сгенерировать список случайных чисел, прежде чем сравнивать их со списком диапазонов из одного файла. Если число лежит в одном из диапазонов, я хочу извлечь подстроку из строки в другом файле и распечатать все. Я хочу получить точно 749 случайных подстрок в выходном файле. Я объединил различные фрагменты кода, и он выводит правильные данные, но не правильное количество подстрок. Я считаю, что число, к которому я применил 749, встречается до окончательного правила, чтобы проверить, находится ли он в диапазонах. Я мог бы, очевидно, использовать более крупный счет, а затем вручную выбрать первый 749, однако анализ диапазона, кажется, сортирует их численно, и поэтому я не буду брать по-настоящему случайные образцы.Возьмите случайные подстроки из генома после анализа случайных позиций

Редактировать: Я попытался изменить код для размещения случайных чисел в диапазонах от каждой строки в файле 1, однако я получаю огромные выходные строки (152000) одной и той же подстроки, код внизу.

Если это поможет я положил некоторые данные пример файла ниже:

File1:

517 1878 forward 
2156 3289 forward 
3670 3915 forward 
3912 5024 forward 
5037 6968 forward 
7005 9674 forward 

Файл2:

>gi|385195117|emb|HE681097.1| Staphylococcus aureus subsp. aureus HO 5096 0412 complete genome 
CGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATACCGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATACCGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATAC 

Код:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 
use autodie; 

chdir '/Users/edwardtickle/Documents'; 

open my $fh, '<', 'CC22rangesCDS.txt'; 

my @file1; 
while (<$fh>) { 
push @file1, [ split ]; 
} 

my $size  = 21; 
my $count  = 749; 
my $min_length = ($count - 1) * (2 * $size - 1) + $size; 

open my $out, '>', 'randomnumberoutput.txt'; 

open $fh, '<', 'EMRSA-15.fasta'; 

while (my $line = <$fh>) { 
next unless $line =~ /^([ATCG]+)/; 

my $genome = $1; 

if ($min_length > length $genome) { 
    warn "Line $., Genome too small: Must be $min_length, not ", length($genome), "\n"; 
    next; 
} 

my @pos = (0 .. length($genome) - 1 - ($size - 1)); 

for (1 .. $count) { 
    my $index = int rand @pos; 
    my $pos = $pos[$index]; 

    my $min = $index - ($size - 1); 
    $min = 0 if $min < 0; 
    splice @pos, $min, $size + $index - $min; 

    for my $file1 (@file1) { 

    my $substring = substr ($genome, $pos, $size); 

    if ($pos >= $file1->[0] and $pos <= $file1->[1]) { 

    print $out "$substring\n"; 
      } 
     } 
    } 
    } 

Ун работы код:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 
use autodie; 

chdir '/Users/edwardtickle/Documents'; 

open my $fh, '<', 'CC22rangesCDS.txt'; 

my @file1; 
while (<$fh>) { 
push @file1, [ split ]; 
} 

my $size  = 21; 
my $count  = 749; 

open my $out, '>', 'randomtestingoutput.txt'; 

open $fh, '<', 'EMRSA-15.fasta'; 

while (my $line = <$fh>) { 
next unless $line =~ /^([ATCG]+)/; 

my $genome = $1; 

for my $file1 (@file1) { 

my $range = ($file1->[1] - $file1->[0]); 
my $minimum = $file1->[0]; 

my $position = int(rand($range)) + $minimum; 

for (1 .. $count) { 

    my $substring = substr ($genome, $position, $size); 

    print $out "$substring\n"; 
      } 
     } 
    } 

Я действительно борюсь с этим, поэтому любая помощь будет оценена!

ответ

0

В первой строке упоминается, что вы хотите генерировать случайные числа. Вы всегда можете генерировать случайные числа в требуемом диапазоне, а не генерировать числа без ограничений и отбрасывать те, которые находятся вне вашего диапазона.

Функция rand() позволяет указать верхний и нижний пределы.

Что-то вроде этого:

#!/usr/bin/perl 
    use strict; 
    use warnings; 

    my $range = 100; 

    my $random_number = int(rand($range)); 

    print $random_number . "\n"; 

См функция рандов() ручной here

+0

Я попытался с помощью руководство, чтобы установить диапазоны в зависимости от множества диапазонов из file1 и я поставил код в мой первоначальный пост, он по-прежнему не работает должным образом. Приветствую вас за помощь. –

Смежные вопросы