#__perl__ # there is a problem where the contigs are not being copied correctly from the GFF3 files. This script will take a fasta contigs file, and a genome directory, and do a very simple error check, and then copy the data across # # this should be run as a complement to seed2gff during the install in the unlikely case that you have some sequences that don't have features on them. This is almost exclusively a problem for the 454 metagenomes, so I haven't consituted a wide-eyed fix that could involve altering the gff3 spec. use raelib; use strict; my $usage="$0 [-orgdir organism-dir] "; my $orgdir; my $rae = new raelib; while (@ARGV) { my $arg = $ARGV[0]; if ($arg =~ /^-(.*)/) { my $flag = $1; shift; if ($flag eq 'orgdir') { $orgdir = shift; } else { die $usage; } } else { last; } } my ($faf, $gid)=@ARGV; die $usage unless ($faf && $gid); # first open the fasta file and get a list of all ids my $fasta=$rae->read_fasta($faf); # figure out the contigs for the genome id # we're not going to use the database in case it's a new genome and we haven't loaded the data yet my $cf; if ($orgdir) { $cf = "$orgdir/contigs"; } else { $cf=$FIG_Config::organisms."/$gid/contigs"; } my $cfa=$rae->read_fasta($cf); my @contigs=keys %$cfa; my $ncontigs=scalar(@contigs); my $nfasta=scalar(keys %$fasta); # make sure that the contigs for the genome id are a subset of the contigs in the fasta file my @notfoundcontigs; map {push @notfoundcontigs, $_ if ($_ && !$fasta->{$_})} @contigs; if (@notfoundcontigs) { print STDERR "There was a problem, because the following ", scalar(@notfoundcontigs), " contigs out of $ncontigs total were not found in the fasta file that you have provided. We can not overwrite these data, and you'll have to do it manually: ", join (", ", @contigs), "; and : ", join (", ", @notfoundcontigs), "\n"; exit(-1); } # now check that we have less contigs in the current contigs than in the fasta file. If there is more there is an error since they should have been found above. If there is the same number there is no point copying the data across. if ($ncontigs > $nfasta) { die "There are more contigs in the contigs file than in the fasta file, but we didn't find them missing. Huh?"; } elsif ($ncontigs == $nfasta) { warn "There are the same number of contigs in the genome contigs file and in the fasta file, so there is no point copying\n"; exit 0; } # if we get here we want to copy the data open(OUT, ">$cf") || die "Can't write to $cf"; map {print OUT ">$_\n", $fasta->{$_}, "\n"} sort keys %$fasta; close OUT; print STDERR "There were $ncontigs contigs in the genome, and $nfasta sequences in the fasta file, so we rewrote them\n"; print STDERR "Wrote the sequences to the contigs file. You will probably have to reload everything for it all to work, eh?\n";