App-SimulateReads
view release on metacpan or search on metacpan
lib/App/SimulateReads/Simulator.pm view on Meta::CPAN
if (/^>/) {
my @fields = split /\|/;
$id = $fields[0];
$id =~ s/^>//;
$id =~ s/^\s+|\s+$//g;
# It is necessary to catch gene -> transcript relation
# # TODO: Make a hash tarit for indexed fasta
if (defined $fields[1]) {
my $pid = $fields[1];
$pid =~ s/^\s+|\s+$//g;
$fasta_rtree{$id} = $pid;
}
} else {
die "Error reading fasta file '$fasta': Not defined id"
unless defined $id;
$indexed_fasta{$id}{seq} .= $_;
}
}
for (keys %indexed_fasta) {
$indexed_fasta{$_}{size} = length $indexed_fasta{$_}{seq};
}
unless (%indexed_fasta) {
die "Error parsing '$fasta'. Maybe the file is empty\n";
}
$fh->close
or die "Cannot close file $fasta: $!\n";
$self->_set_fasta_rtree(%fasta_rtree) if %fasta_rtree;
return \%indexed_fasta;
}
sub _build_fasta {
my $self = shift;
my $fasta = $self->fasta_file;
log_msg ":: Indexing fasta file '$fasta' ...";
my $indexed_fasta = $self->_index_fasta;
# Validate genome about the read size required
log_msg ":: Validating fasta file '$fasta' ...";
# Entries to remove
my @blacklist;
for my $id (keys %$indexed_fasta) {
my $index_size = $indexed_fasta->{$id}{size};
given (ref $self->fastq) {
when ('App::SimulateReads::Fastq::SingleEnd') {
my $read_size = $self->fastq->read_size;
if ($index_size < $read_size) {
log_msg ":: Parsing fasta file '$fasta': Seqid sequence length (>$id => $index_size) lesser than required read size ($read_size)\n" .
" -> I'm going to include '>$id' in the blacklist\n";
delete $indexed_fasta->{$id};
push @blacklist => $id;
}
}
when ('App::SimulateReads::Fastq::PairedEnd') {
my $fragment_mean = $self->fastq->fragment_mean;
if ($index_size < $fragment_mean) {
log_msg ":: Parsing fasta file '$fasta': Seqid sequence length (>$id => $index_size) lesser than required fragment mean ($fragment_mean)\n" .
" -> I'm going to include '>$id' in the blacklist\n";
delete $indexed_fasta->{$id};
push @blacklist => $id;
}
}
default {
die "Unknown option '$_' for sequencing type\n";
}
}
}
unless (%$indexed_fasta) {
die sprintf "Fasta file '%s' has no valid entry\n" => $self->fasta_file;
}
# Remove no valid entries from id -> pid relation
$self->_delete_fasta_rtree(@blacklist) if @blacklist;
# Reverse fasta_rtree to pid -> \@ids
unless ($self->_has_no_fasta_rtree) {
# Build parent -> child ids relation
my %fasta_tree;
for my $pair ($self->_fasta_rtree_pairs) {
my ($id, $pid) = (@$pair);
push @{ $fasta_tree{$pid} } => $id;
}
# Need to sort ids to ensure that raffle will
# be reproducible
while (my ($pid, $ids) = each %fasta_tree) {
my @sorted_ids = sort @$ids;
$fasta_tree{$pid} = \@sorted_ids;
}
$self->_set_fasta_tree(%fasta_tree);
}
return $indexed_fasta;
}
sub _retrieve_expression_matrix {
my $self = shift;
my $expression = App::SimulateReads::DB::Handle::Expression->new;
return $expression->retrievedb($self->expression_matrix);
}
sub _build_seqid_raffle {
my $self = shift;
my $seqid_sub;
given ($self->seqid_weight) {
when ('same') {
my @seqids = keys %{ $self->_fasta };
my $seqids_size = scalar @seqids;
$seqid_sub = sub { $seqids[int(rand($seqids_size))] };
}
when ('count') {
# Catch expression-matrix entry from database
my $indexed_file = $self->_retrieve_expression_matrix;
( run in 0.597 second using v1.01-cache-2.11-cpan-b16cb0d3907 )