Re-design jpred.pl input options: no -seq for a file with 1 FASTA record only.
[jabaws.git] / binaries / src / jpred / jpred.pl
index 99d7fdc..bd23814 100755 (executable)
@@ -6,14 +6,15 @@ jpred - Secondary structure prediction program
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
-./jpred.pl -in <FILE1> [-outfile <FILE2>] [-logfile <FILE3>] [-output <FILEPREFIX>] [-dbname <DBNAME>] [-dbpath <PATH>] [-ncpu NNN] [-psi <psiblast output>] [-seq] [-pred-nohits] [-no-final] [-jabaws] [-verbose] [-debug] [-help] [-man]
+./jpred.pl -in <FILE1> [-outfile <FILE2>] [-logfile <FILE3>] [-output <FILEPREFIX>] [-dbname <DBNAME>] [-dbpath <PATH>] [-ncpu NNN] [-psi <psiblast output>] [-pred-nohits] [-no-final] [-jabaws] [-verbose] [-debug] [-help] [-man]
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
-This is a program for predicting the secondary structure of a multiple sequence alignment (by default) or a protein sequence 
-(with the -seq option). The input file can be stored in 3 formats: FASTA, MSF, or BLC. 
-For the single sequence the program does all the PSI-BLAST searching, preparing PSSM and HMM profiles and predicting the 
-secondary structure with Jnet. For the multiple sequence alignment only the HMM profile, created from the alignment, is used in Jnet.
+This is a program for predicting the secondary structure of a multiple sequence alignment or a protein sequence. 
+The input file can be stored in 3 formats: FASTA, MSF, or BLC. 
+For the single sequence the program does all the PSI-BLAST searching, preparing PSSM and HMM profiles and 
+predicting the secondary structure with Jnet. For the multiple sequence alignment only the HMM profile, 
+created from the alignment, is used in Jnet.
 
 =head1 OPTIONS
 
 
 =head1 OPTIONS
 
@@ -23,10 +24,6 @@ secondary structure with Jnet. For the multiple sequence alignment only the HMM
 
 The path to the sequence file (in FASTA, MSF, or BLC format)
 
 
 The path to the sequence file (in FASTA, MSF, or BLC format)
 
-=item -seq
-
-The input file is a FASTA file with one sequence only.
-
 =item -output <FILEPREFIX>
 
 A prefix to the filenames created by Jpred, defaults to the value set by -sequence/-in.
 =item -output <FILEPREFIX>
 
 A prefix to the filenames created by Jpred, defaults to the value set by -sequence/-in.
@@ -211,7 +208,6 @@ GetOptions(
   "ncpu=s"      => \$ncpu,
   "pred-nohits" => \$predNoHits,
   "no-final"    => \$nofinal,
   "ncpu=s"      => \$ncpu,
   "pred-nohits" => \$predNoHits,
   "no-final"    => \$nofinal,
-  "seq"         => \$seqgoal,
   "jabaws"      => \$jabaws,
 
   "help"    => \$help,
   "jabaws"      => \$jabaws,
 
   "help"    => \$help,
@@ -222,8 +218,6 @@ GetOptions(
 pod2usage(1) if $help;
 pod2usage( verbose => 2 ) if $man;
 
 pod2usage(1) if $help;
 pod2usage( verbose => 2 ) if $man;
 
-$goal = "seq" if ( defined $seqgoal );
-
 #####################################################################################################
 # Key to database information and information for accessing them
 my $database = {
 #####################################################################################################
 # Key to database information and information for accessing them
 my $database = {
@@ -327,25 +321,23 @@ print $LOG "JPRED: checking platiform... $platform\n" if $LOG;
 
 #####################################################################################################
 # check input file format
 
 #####################################################################################################
 # check input file format
-if ( 'seq' eq $goal ) {
-  $format = "seq";
-  if ( 1 != check_FASTA_format($infile) ) {
-    die "\nERROR! jpred requires 1 sequence in the FASTA file if the option -seq used. exit\n";
-  }
-} else {
-  my $nseq = check_FASTA_format($infile);
-  if ( 0 < $nseq ) {
-    $format = "fasta";
-    if ( 1 == $nseq ) {
-      die "\nERROR! jpred requires alignment with more than 1 sequence\n       if you provide only one sequence use the -seq option.\n";
-    }
-  } elsif ( 0 < check_MSF_format($infile) ) {
-    $format = "msf";
-  } elsif ( 0 < check_BLC_format($infile) ) {
-    $format = "blc";
+my $nseq = check_FASTA_format($infile);
+if ( 0 < $nseq ) {
+  $format = "fasta";
+  if ( 1 == $nseq ) {
+    # one FASTA record
+    $goal = 'seq';
   } else {
   } else {
-    die "ERROR! unknown input file format for multiple sequence alignment (can be FASTA, MSF, or BLC). exit...\n";
+    unless ( 0 < check_FASTA_alignment($infile)) {
+      die "\nERROR! jpred requires either FASTA alignment or 1 sequence in the FASTA, MSF, or BLC formats\n";
+    }
   }
   }
+} elsif ( 0 < check_MSF_format($infile) ) {
+  $format = "msf";
+} elsif ( 0 < check_BLC_format($infile) ) {
+  $format = "blc";
+} else {
+  die "ERROR! unknown input file format for multiple sequence alignment (can be FASTA, MSF, or BLC). exit...\n";
 }
 $infastafile = $infile . ".fasta" if ( 'msf' eq $format or 'blc' eq $format );
 
 }
 $infastafile = $infile . ".fasta" if ( 'msf' eq $format or 'blc' eq $format );
 
@@ -645,6 +637,38 @@ sub check_FASTA_format {
   return $nseq;
 }
 #####################################################################################################
   return $nseq;
 }
 #####################################################################################################
+sub check_FASTA_alignment {
+  my $infile = shift;
+
+  open( my $IN, "<", $infile ) or die "ERROR! unable to open '$infile': ${!}\n";
+  my $check_first_line = 1;
+  my $nseq             = 0;
+  my $seqlen = -1;
+  local $/ = "\n>";
+  while (<$IN>) {
+    if ($check_first_line) {
+      return 0 unless (/^>/);
+      $check_first_line = 0;
+    }
+    s/^>//g;
+    s/>$//g;
+
+    my ( $id, @seqs ) = split /\n/, $_;
+    return 0 unless ( defined $id or @seqs );
+    my $seq = join( "", @seqs );
+    return 0 unless ( $seq =~ /[a-zA-Z\.-]/ );
+    if (-1 == $seqlen) {
+      $seqlen = length ($seq);
+    } else {
+      return 0 if ($seqlen != length ($seq) );
+    }
+    ++$nseq;
+  }
+  close($IN);
+
+  return $nseq;
+}
+#####################################################################################################
 sub check_MSF_format {
   my $infile = shift;
   $? = 0;
 sub check_MSF_format {
   my $infile = shift;
   $? = 0;