Конвертирование tab faa

Биоинформатика

Простейший конвертер на Perl.

Часто при работе возникает следующая задача: последовательности хранятся в tab-delimited файле, при этом может быть несколько колонок с дополнительной информацией. Вместо этого последовательности нужно сохранить в обычный формат FASTA, например, чтобы передать в программу выравнивания. Иногда требуется сделать обратное преобразование.

 

Ниже приведен простейший Perl-скрипт, который преобразует tab-delimited файл в FASTA и обратно. При конвертировании tab->faa нужно указать индексы колонок (начинаются c 1), при конвертировании faa->tab ничего указывать не нужно.

#convert FASTA to TAB files and vice versa
use Getopt::Long;  
use Bio::SeqIO;

sub help {
  print " convert FASTA to TAB files and vice versa\n";
  print " Usage:\n";
  print "  -f  FASTA file name\n";
  print "  -a  fasta -> tab mode\n";
  print "  -t  tab -> fasta mode\n";
  print "  -ic index of ID column (1-based)\n";
  print "  -sc index of sequence column (1-based)\n";
}
 

#--------------------- main part --------------------------------
# GLOBAL VARIABLES
  $FNAME=undef;  # file to convert
  $FAA2TAB=undef;
  $TAB2FAA=undef;
  $ID_COL=undef;  # 1-based index of identifier in table
  $SEQ_COL=undef; # index of column with sequence
  
  GetOptions ('f=s'  => \$FNAME,
              'a'    => \$FAA2TAB,
              'ic=i' => \$ID_COL,
              'sc=i' => \$SEQ_COL,
              't'    => \$TAB2FAA,  
             'help|?|h' => \$help );
  if($help) { help(); exit;}
 
  if(!($FNAME)) { die "please specify -f FNAME"; }
  if((!($FAA2TAB))&&(!($TAB2FAA)))  { die "please specify regime: tab2faa(-t) or faa2tab(-a)"; }
 
  $ID_COL=$ID_COL-1;
  $SEQ_COL=$SEQ_COL-1;
  
  if ($TAB2FAA) {
    if($ID_COL<0)  { die "please specify -ic ID_COL   (1-based)"; }
    if($SEQ_COL<0) { die "please specify -sc SEQ_COL  (1-based)"; }
   
    open (INFILE, $FNAME) or print("Error opening file");
    while () {
      $str=$_; chomp($str);
      my @line=split(/\t/,$str);
      print '>'.$line[$ID_COL]."\n";
      print $line[$SEQ_COL]."\n";
    }
    close(INFILE);
  }
 
  if ($FAA2TAB) {
    my $FastaFile = Bio::SeqIO->new( -file => $FNAME, -format => 'fasta');
    while (my $faaseq = $FastaFile->next_seq) {
      my $seq=uc($faaseq->seq);  #uppercase
      print $faaseq->primary_seq->display_id."\t".$seq."\n";
     
    }
  }