//******************************************************************************
//
// File: FindProteinSeq.java
// Package: edu.rit.compbio.seq
// Unit: Class edu.rit.compbio.seq.FindProteinSeq
//
// This Java source file is copyright (C) 2008 by Alan Kaminsky. All rights
// reserved. For further information, contact the author, Alan Kaminsky, at
// ark@cs.rit.edu.
//
// This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
// software; you can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// PJ is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// A copy of the GNU General Public License is provided in the file gpl.txt. You
// may also obtain a copy of the GNU General Public License on the World Wide
// Web at http://www.gnu.org/licenses/gpl.html.
//
//******************************************************************************
package edu.rit.compbio.seq;
import edu.rit.pj.Comm;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Class FindProteinSeq is a sequential program that finds matches for a protein
* in a protein sequence database. The query sequence is stored in a file in
* FASTA format; for further information, see class {@linkplain
* ProteinSequence}. The protein sequence database is stored in two files, a
* database file in FASTA format and an index file; for further information, see
* class {@linkplain ProteinDatabase}. The program uses the Smith-Waterman
* algorithm to compute a local alignment between the query sequence and each
* subject sequence in the database. The program uses the BLOSUM-62 protein
* substitution matrix. The program uses affine gap penalties with a gap
* existence penalty of −11 and a gap extension penalty of −1. The
* program prints on the standard output the resulting alignments from highest
* to lowest score. The program only prints alignments with an E-value
* below the given threshold; if not specified, the default is 10.
*
* The program does all the alignments sequentially, in a single thread. The
* program uses class {@linkplain ProteinLocalAlignmentSeq} to do the
* alignments.
*
* Usage: java edu.rit.compbio.seq.FindProteinSeq queryfile
* databasefile indexfile [ expect ]
*
queryfile = Query sequence file
*
databasefile = Protein sequence database file
*
indexfile = Protein sequence index file
*
expect = E-value threshold (default: 10)
*
* @author Alan Kaminsky
* @version 01-Jul-2008
*/
public class FindProteinSeq
{
// Prevent construction.
private FindProteinSeq()
{
}
// Global variables.
// Command line arguments.
static File queryfile;
static File databasefile;
static File indexfile;
static double expect;
// Main program.
/**
* Main program.
*/
public static void main
(String[] args)
throws Exception
{
// Start timing.
long t1 = System.currentTimeMillis();
Comm.init (args);
// Parse command line arguments.
if (3 > args.length || args.length > 4) usage();
queryfile = new File (args[0]);
databasefile = new File (args[1]);
indexfile = new File (args[2]);
expect = 10.0;
if (args.length == 4) expect = Double.parseDouble (args[3]);
// Set up query sequence.
ProteinSequence query = new ProteinSequence (queryfile);
// Set up protein sequence database.
ProteinDatabase database =
new ProteinDatabase (databasefile, indexfile);
// Set up object to compute alignment statistics.
AlignmentStats stats =
new DefaultAlignmentStats (database.getDatabaseLength());
// Set up list to hold alignments.
List alignments = new ArrayList();
// Set up object to perform alignments.
ProteinLocalAlignment aligner = new ProteinLocalAlignmentSeq();
aligner.setQuerySequence (query, 0);
long t2 = System.currentTimeMillis();
// Align query sequence against every subject sequence.
for (long id = 0; id < database.getProteinCount(); ++ id)
{
ProteinSequence subject = database.getProteinSequence (id);
aligner.setSubjectSequence (subject, id);
Alignment a = aligner.align();
if (stats.eValue (a) <= expect)
{
alignments.add (a);
}
}
long t3 = System.currentTimeMillis();
// Sort alignments into descending order of score.
Collections.sort (alignments);
// Set up alignment printer.
AlignmentPrinter printer = new AlignmentPrinter (System.out, stats);
// Print query sequence.
System.out.println ("Query Description:");
System.out.println (query.description());
System.out.println ("Length = "+query.length());
System.out.println();
// Print summary of each alignment.
System.out.println (" Bit E-");
System.out.println ("Subject Description Score Value");
for (Alignment a : alignments)
{
printer.printSummary
(a, database.getProteinSequence (a.getSubjectId()));
}
System.out.println();
// Print details of each alignment.
for (Alignment a : alignments)
{
printer.printDetails
(a, query, database.getProteinSequence (a.getSubjectId()));
}
// Print various information about the alignment procedure.
System.out.println ("Query file: "+queryfile);
System.out.println ("Database file: "+databasefile);
System.out.println ("Database index file: "+indexfile);
System.out.println ("Number of sequences: "+database.getProteinCount());
System.out.println ("Number of matches: "+alignments.size());
System.out.println ("Query length: "+query.length());
System.out.println ("Database length: "+database.getDatabaseLength());
stats.print (System.out);
System.out.println();
// All done.
database.close();
long t4 = System.currentTimeMillis();
System.out.println ((t2-t1)+" msec pre");
System.out.println ((t3-t2)+" msec calc");
System.out.println ((t4-t3)+" msec post");
System.out.println ((t4-t1)+" msec total");
}
// Hidden operations.
/**
* Print a usage message and exit.
*/
private static void usage()
{
System.err.println ("Usage: java edu.rit.compbio.seq.FindProteinSeq []");
System.err.println (" = Query sequence file");
System.err.println (" = Protein sequence database file");
System.err.println (" = Protein sequence index file");
System.err.println (" = E-value threshold (default: 10)");
System.exit (1);
}
}
Ads help maintain this website.