Commits

Anonymous committed 7db53b5

Update documentation for v2.1

Comments (0)

Files changed (13)

 
 // CCoalesce
 
+/*!
+ * \brief
+ * Explicitly sets the expression profile used to seed the first module.
+ * 
+ * \param PCL
+ * PCL from which expression profile to be seeded is read.
+ * 
+ * Forces the first module to be seeded with the given expression profile rather than a randomly chosen
+ * significantly correlated gene pair.
+ * 
+ * \remarks
+ * Only the first gene from the given PCL is used.  The PCL must contain the same number of conditions as
+ * the main PCL clustered by COALESCE.
+ */
 void CCoalesce::SetSeed( const CPCL& PCL ) {
 	size_t	i;
 
 
 		return m_fNormalize; }
 
+	/*!
+	 * \brief
+	 * Removes any currently set seed expression profile.
+	 * 
+	 * \see
+	 * SetSeed
+	 */
 	void ClearSeed( ) {
 
 		m_vecdSeed.clear( ); }

src/coalescecluster.cpp

  * \param setpriiSeeds
  * Set of previously failed seed pairs to be excluded for cluster initialization.
  * 
+ * \param vecdSeed
+ * If non-empty, expression vector to be used as a cluster seed.
+ * 
  * \param iPairs
  * Maximum number of gene pairs to be sampled for seed pair discovery.
  * 
  * \param dPValue
  * P-value threshhold for significant correlation.
  * 
+ * \param dProbability
+ * Prior probability of gene inclusion.
+ * 
  * \param iThreads
  * Maximum number of simultaneous threads for gene pair sampling.
  * 
 		else
 			m_vecstrGenes[ iGene ] = strGene; }
 
+	/*!
+	 * \brief
+	 * Randomizes the CDat's values by iterated swapping.
+	 */
 	void Randomize( ) {
 		size_t	i, j, iOne, iTwo;
 		float	dOne, dTwo;
 
 namespace Sleipnir {
 
-string CFile::OpenToken( istream& istm ) {
+std::string CFile::OpenToken( std::istream& istm ) {
 	string	strRet;
 	char	c;
 
-/*****************************************************************************
-* This file is provided under the Creative Commons Attribution 3.0 license.
-*
-* You are free to share, copy, distribute, transmit, or adapt this work
-* PROVIDED THAT you attribute the work to the authors listed below.
-* For more information, please see the following web page:
-* http://creativecommons.org/licenses/by/3.0/
-*
-* This file is a component of the Sleipnir library for functional genomics,
-* authored by:
-* Curtis Huttenhower (chuttenh@princeton.edu)
-* Mark Schroeder
-* Maria D. Chikina
-* Olga G. Troyanskaya (ogt@princeton.edu, primary contact)
-*
-* If you use this library, the included executable tools, or any related
-* code in your work, please cite the following publication:
-* Curtis Huttenhower, Mark Schroeder, Maria D. Chikina, and
-* Olga G. Troyanskaya.
-* "The Sleipnir library for computational functional genomics"
-*****************************************************************************/
-#ifndef FILE_H
-#define FILE_H
-
-#ifdef _MSC_VER
-#define	FOR_EACH_DIRECTORY_FILE(strDir, strFile)											\
-	HANDLE			hSearch;																\
-	WIN32_FIND_DATA	sEntry;																	\
-	bool			fOk;																	\
-	for( fOk = ( ( hSearch = FindFirstFile( ( (strDir) + "/*" ).c_str( ), &sEntry ) )		\
-		!= INVALID_HANDLE_VALUE ); fOk; fOk = !!FindNextFile( hSearch, &sEntry ) ) {		\
-		if( sEntry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )							\
-			continue;																		\
-		(strFile) = sEntry.cFileName;
-#else // _MSC_VER
-#include <dirent.h>
-#include <sys/stat.h>
-
-#define	FOR_EACH_DIRECTORY_FILE(strDir, strFile)											\
-	DIR*			pDir;																	\
-	struct dirent*	psEntry;																\
-	struct stat		sStat;																	\
-	pDir = opendir( (strDir).c_str( ) );													\
-	while( pDir && ( psEntry = readdir( pDir ) ) ) {										\
-		stat( ( (strDir) + '/' + psEntry->d_name ).c_str( ), &sStat );						\
-		if( S_ISDIR( sStat.st_mode ) )														\
-			continue;																		\
-		(strFile) = psEntry->d_name;
-#endif // _MSC_VER
-
-#include <iostream>
-#include <string>
-
-#include "filei.h"
-
-namespace Sleipnir {
-
-/*!
- * \brief
- * Parent class for types dealing with files, usually for text input.
- * 
- * \remarks
- * There's not often a reason to use CFile directly; it's mainly used internally by Sleipnir classes that
- * have to read tab-delimited text files.
- */
-class CFile : protected CFileImpl {
-public:
-	static std::string OpenToken( std::istream& istm );
-
-	static size_t GetBufferSize( ) {
-
-		return c_iBufferSize; }
-
-	static bool IsNewline( char c ) {
-
-		return ( ( c == '\n' ) || ( c == '\r' ) ); }
-
+/*****************************************************************************
+* This file is provided under the Creative Commons Attribution 3.0 license.
+*
+* You are free to share, copy, distribute, transmit, or adapt this work
+* PROVIDED THAT you attribute the work to the authors listed below.
+* For more information, please see the following web page:
+* http://creativecommons.org/licenses/by/3.0/
+*
+* This file is a component of the Sleipnir library for functional genomics,
+* authored by:
+* Curtis Huttenhower (chuttenh@princeton.edu)
+* Mark Schroeder
+* Maria D. Chikina
+* Olga G. Troyanskaya (ogt@princeton.edu, primary contact)
+*
+* If you use this library, the included executable tools, or any related
+* code in your work, please cite the following publication:
+* Curtis Huttenhower, Mark Schroeder, Maria D. Chikina, and
+* Olga G. Troyanskaya.
+* "The Sleipnir library for computational functional genomics"
+*****************************************************************************/
+#ifndef FILE_H
+#define FILE_H
+
+#ifdef _MSC_VER
+#define	FOR_EACH_DIRECTORY_FILE(strDir, strFile)											\
+	HANDLE			hSearch;																\
+	WIN32_FIND_DATA	sEntry;																	\
+	bool			fOk;																	\
+	for( fOk = ( ( hSearch = FindFirstFile( ( (strDir) + "/*" ).c_str( ), &sEntry ) )		\
+		!= INVALID_HANDLE_VALUE ); fOk; fOk = !!FindNextFile( hSearch, &sEntry ) ) {		\
+		if( sEntry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )							\
+			continue;																		\
+		(strFile) = sEntry.cFileName;
+#else // _MSC_VER
+#include <dirent.h>
+#include <sys/stat.h>
+
+#define	FOR_EACH_DIRECTORY_FILE(strDir, strFile)											\
+	DIR*			pDir;																	\
+	struct dirent*	psEntry;																\
+	struct stat		sStat;																	\
+	pDir = opendir( (strDir).c_str( ) );													\
+	while( pDir && ( psEntry = readdir( pDir ) ) ) {										\
+		stat( ( (strDir) + '/' + psEntry->d_name ).c_str( ), &sStat );						\
+		if( S_ISDIR( sStat.st_mode ) )														\
+			continue;																		\
+		(strFile) = psEntry->d_name;
+#endif // _MSC_VER
+
+#include <iostream>
+#include <string>
+
+#include "filei.h"
+
+namespace Sleipnir {
+
+/*!
+ * \brief
+ * Parent class for types dealing with files, usually for text input.
+ * 
+ * \remarks
+ * There's not often a reason to use CFile directly; it's mainly used internally by Sleipnir classes that
+ * have to read tab-delimited text files.
+ */
+class CFile : protected CFileImpl {
+public:
+	static std::string OpenToken( std::istream& istm );
+
+	static size_t GetBufferSize( ) {
+
+		return c_iBufferSize; }
+
+	static bool IsNewline( char c ) {
+
+		return ( ( c == '\n' ) || ( c == '\r' ) ); }
+
 	/*!
 	 * \brief
-	 * Return the next tab-delimited token from the given string.
+	 * Return the next tab-delimited token from the given string.
 	 * 
 	 * \param szInput
-	 * String from which the token is read.
+	 * String from which the token is read.
 	 * 
 	 * \param ppcEnd
-	 * If non-null, outputs a pointer to the end of the token in the given string.
+	 * If non-null, outputs a pointer to the end of the token in the given string.
 	 * 
 	 * \returns
-	 * String containing all characters up to (but excluding) the next tab or newline.
+	 * String containing all characters up to (but excluding) the next tab or newline.
 	 */
-	static std::string OpenToken( const char* szInput, const char** ppcEnd = NULL ) {
-		const char*	pcStart;
-		const char*	pcEnd;
-		char		c;
-
-		do
-			c = *(szInput++);
-		while( c && ( c != -1 ) && ( c != '\t' ) && isspace( c ) );
-		pcStart = szInput - 1;
-		for( ; c && ( c != -1 ) && ( c != '\t' ) && !IsNewline( c ); c = *(szInput++) );
-		pcEnd = szInput;
-		if( ppcEnd )
-			*ppcEnd = pcEnd - ( ( !c || IsNewline( c ) ) ? 1 : 0 );
-
-		return std::string( pcStart, pcEnd - pcStart - 1 ); }
-};
-
-}
-
-#endif // FILE_H
+	static std::string OpenToken( const char* szInput, const char** ppcEnd = NULL ) {
+		const char*	pcStart;
+		const char*	pcEnd;
+		char		c;
+
+		do
+			c = *(szInput++);
+		while( c && ( c != -1 ) && ( c != '\t' ) && isspace( c ) );
+		pcStart = szInput - 1;
+		for( ; c && ( c != -1 ) && ( c != '\t' ) && !IsNewline( c ); c = *(szInput++) );
+		pcEnd = szInput;
+		if( ppcEnd )
+			*ppcEnd = pcEnd - ( ( !c || IsNewline( c ) ) ? 1 : 0 );
+
+		return std::string( pcStart, pcEnd - pcStart - 1 ); }
+};
+
+}
+
+#endif // FILE_H
 
 	return false; }
 
-bool CGenes::Open( const char* szFile, CGenome& Genome, vector<string>& vecstrGenes, vector<CGenes*>& vecpGenes ) {
+/*!
+ * \brief
+ * Simultaneously construct multiple new gene sets loaded from the given file, one per line, with tab-delimited genes.
+ * 
+ * \param szFile
+ * File from which gene sets are loaded.
+ * 
+ * \param Genome
+ * Genome containing all genes which might become members of these gene sets.
+ * 
+ * \param vecstrNames
+ * Human-readable identifiers for the loaded gene sets.
+ * 
+ * \param vecpGenes
+ * Vector to which loaded gene sets are appended.
+ * 
+ * \returns
+ * True on success, false otherwise.
+ * 
+ * Opens multiple gene sets from the given tab-delimited text file.  Each line should contain a single tab-delimited gene
+ * set, and the first token on each line should be a human-readable identifier for that line's gene set.
+ * 
+ * \see
+ * Open
+ */
+bool CGenes::Open( const char* szFile, CGenome& Genome, std::vector<std::string>& vecstrNames, std::vector<CGenes*>& vecpGenes ) {
 	ifstream		ifsm;
 	vector<char>	veccBuffer;
 	istream*		pistm;
  */
 class CGenes : CGenesImpl {
 public:
-	static bool Open( const char* szFile, CGenome& Genome, std::vector<std::string>& vecstrGenes, std::vector<CGenes*>& vecpGenes );
+	static bool Open( const char* szFile, CGenome& Genome, std::vector<std::string>& vecstrNames, std::vector<CGenes*>& vecpGenes );
 
 	CGenes( CGenome& Genome );
 
 		return ( ( ( iterGene = m_mapGenes.find( strGene ) ) == m_mapGenes.end( ) ) ? -1 :
 			iterGene->second ); }
 
+	/*!
+	 * \brief
+	 * Adds a new gene with the given ID to the gene set.
+	 * 
+	 * \param strGene
+	 * Gene ID to be added.
+	 * 
+	 * \returns
+	 * True if gene was added, false if it was already included.
+	 * 
+	 * \see
+	 * Open | GetGene
+	 */
 	bool AddGene( const std::string& strGene ) {
 
 		if( GetGene( strGene ) != -1 )
  * \param eMap
  * Way in which returned value should be centered (implementation-specific).
  * 
+ * \param fFrequencyWeight
+ * If true, weight each condition by the frequency with which it is nonzero over all genes.
+ * 
  * \returns
  * 0 on successes, a nonzero value on failure.
  * 
 		Dat.Open( *this, pMeasure, false );
 	Impute( iNeighbors, dMinimumPresent, Dat ); }
 
+/*!
+ * \brief
+ * Resolves probesets by averaging agreeing probes and discarding conflicting ones.
+ * 
+ * \param iSample
+ * Number of random samples to generate for probeset null distribution.
+ * 
+ * \param iBins
+ * Number of bins for probeset distribution histogram.
+ * 
+ * \param dBinSize
+ * Size of bins for probeset distribution histogram in z-score units.
+ * 
+ * \remarks
+ * Performance can vary wildly depending on characteristics of the input PCL's probesets; use with caution.
+ */
 void CPCL::MedianMultiples( size_t iSample, size_t iBins, float dBinSize ) {
 	size_t					i, j, k, iBin, iOne, iCutoff;
 	CMeasureEuclidean		Euclidean;
 
 		return IncompleteBeta( 0.5 * iDegFree, 0.5, iDegFree / ( iDegFree + ( dT * dT ) ) ); }
 
+	/*!
+	 * \brief
+	 * Return the p-value of a t-test between the given array statistics and zero.
+	 * 
+	 * \param dMean
+	 * Sample mean.
+	 * 
+	 * \param dVariance
+	 * Sample variance.
+	 * 
+	 * \param iN
+	 * Sample size.
+	 * 
+	 * \returns
+	 * P-value of T = sqrt( iN ) * dMean / sqrt( dVariance )
+	 * 
+	 * \see
+	 * TTestStudent | TTestWelch
+	 */
 	static double TTest( double dMean, double dVariance, size_t iN ) {
 		size_t	iDegFree;
 		double	dT;
  * \section sec_history Version History
  * 
  * - <a href="sleipnir-2.1.tar.gz">2.1</a>, *** <br>
- * Update #includes for gcc 4.3 compatibility - thanks to Casey Greene!
+ * Update includes for gcc 4.3 compatibility - thanks to Casey Greene!
  * Add \c half2relative.rb and \c half2weights.rb scripts to \ref MIer - thanks to Arjun Krishnan!
  * Fix mutual info command line option in \ref Distancer - thanks to Arjun Krishnan!
+ * Add MedianMultiples PCL probe resolution procedure - thanks to Matt Hibbs!
+ * Features added to \ref Distancer and \ref Combiner
+ * Added \ref Clinician tool for testing clinical correlates with expression values
+ * Added \ref Filterer tool for selective data removal from DABs
+ * Updated \ref COALESCE algorithm to published version
+ * Several minor bug fixes and other added features
  * 
  * - <a href="sleipnir-2.0.tar.gz">2.0</a>, 06-19-09 <br>
  * Added \ref COALESCE and \ref Synthesizer as described in Huttenhower et al. 2009. <br>

tools/Clinician/stdafx.cpp

 #include "stdafx.h"
 
 /*!
- * \page PCLPlotter PCLPlotter
+ * \page Clinician Clinician
  * 
- * PCLPlotter produces summary statistics from a PCL file and is optimized to show the mean expression values
- * for subsets (biclusters) of genes and conditions.  It can also provide accompanying bicluster statistics
- * for associated FASTA files containing gene sequences.
+ * Clinician performs multiple correlation tests of a clinical (or any non-expression) variable against
+ * genomewide expression values.  This can be used to determine transcript correlates of a molecular or
+ * clinical phenotype, and HEFalMp/bioPIXIE queries can be used as a pre-screen to mitigate the effects
+ * of multiple hypothesis testing.
  * 
  * \section sec_usage Usage
  * 
  * PCLPlotter -i <data.pcl>
  * \endcode
  * 
- * Produce a summary of the mean and standard deviation expression for each condition in \c data.pcl.  If a
- * bicluster is present, member genes should be marked with an initial \c * in their NAME (not ID) column, and
- * member conditions should be marked with an initial \c *.
+ * Produce a list of clinical correlates in the specially formatted \c data.pcl, which should have exactly
+ * one non-data column after the initial ID column (in place of the standard NAME/GWEIGHT columns).  This
+ * column should contain 0 for standard expression values and 1 for clinical variables with which they are
+ * to be correlated.
  * 
  * \code
- * PCLPlotter -i <cluster.pcl> -b <genome.pcl>
+ * PCLPlotter -i <data.pcl> -I <network.dab>
  * \endcode
  * 
- * Produce a summary of the mean and standard deviation expression for each condition in \c cluster.pcl and
- * \c genome.pcl, which must contain the same conditions.  Genes in \c cluster.pcl are considered to be
- * members of the bicluster, and member conditions should be marked with an initial \c *.
- * 
- * \code
- * PCLPlotter -i <data.pcl> -g <genes.txt>
- * \endcode
- * 
- * Produce a summary of the mean and standard deviation expression for each condition in \c data.pcl.
- * Genes in \c genes.txt are considered to be members of the bicluster, and member conditions should be marked
- * with an initial \c *.
- * 
- * \code
- * PCLPlotter -i <data.pcl> -f <data.fasta>
- * \endcode
- * 
- * Produce a summary of the mean and standard deviation expression for each condition in \c data.pcl, as well
- * as an HMM summarizing sequence characteristics.  If a bicluster is present, member genes should be marked
- * with an initial \c * in their NAME (not ID) column, and member conditions should be marked with an initial
- * \c *.
+ * Produce a list of clinical correlates in the specially formatted \c data.pcl, formatted as described
+ * above, but pre-screen the correlates using the interaction network \c network.dab.  For each clinical
+ * variable, a small number of top correlates will be pre-selected and used as a HEFalMp/bioPIXIE query into
+ * the given interaction network.  Only the nearest neighbors from this query will be tested for significant
+ * clinical correlation, reducing the number of necessary multiple hypothesis tests.
  * 
  * \subsection ssec_usage_detailed Detailed Usage
  * 
- * \include PCLPlotter/PCLPlotter.ggo
+ * \include Clinician/Clinician.ggo
  * 
  * <table><tr>
  *	<th>Flag</th>
  *	<td>-i</td>
  *	<td>stdin</td>
  *	<td>PCL file</td>
- *	<td>Input PCL file from which bicluster summary information is extracted.  In the absence of \c -b or \c -g
- *		options, genes and conditions in the bicluster should be marked with a \c * at the beginning of their
- *		NAME and label, respectively.</td>
+ *	<td>Input PCL file from which expression and clinical variables are read.  Must be formatted with exactly
+ *		one, rather than the standard two, non-ID columns.  Rows containing a 0 in this column will be treated
+ *		as gene expression, rows containing a 1 will be treated as clinical correlates.</td>
  * </tr><tr>
- *	<td>-f</td>
+ *	<td>-I</td>
  *	<td>None</td>
- *	<td>FASTA file</td>
- *	<td>If given, input FASTA sequence file from which cluster sequence summary information is extracted.</td>
+ *	<td>DAT/DAB file</td>
+ *	<td>If given, input DAT/DAB file used to pre-screen potential clinical correlates.</td>
  * </tr><tr>
- *	<td>-b</td>
- *	<td>None</td>
- *	<td>PCL file</td>
- *	<td>If given, input PCL file from which non-bicluster summary information is extracted; all genes in \c -i
- *		are considered to be in the bicluster, and conditions should be marked with a \c *.  PCL files for \c -i
- *		and \c -b should contain exactly the same conditions.</td>
+ *	<td>-n</td>
+ *	<td>100</td>
+ *	<td>Integer</td>
+ *	<td>If given, number of top correlates used during pre-screening as a HEFalMp/bioPIXIE query.</td>
  * </tr><tr>
- *	<td>-g</td>
- *	<td>None</td>
- *	<td>Text gene list</td>
- *	<td>If given, input text file from which biclustered genes are read; other genes in \c -i are considered to
- *		be out of the bicluster.</td>
+ *	<td>-N</td>
+ *	<td>1000</td>
+ *	<td>Integer</td>
+ *	<td>If given, number of neighbors retrieved from a HEFalMp/bioPIXIE query to reduce multiple hypothesis
+ *		testing.</td>
  * </tr><tr>
- *	<td>-m</td>
- *	<td>None</td>
- *	<td>Text motif list</td>
- *	<td>If given, input text file from which known motifs are read.  In conjunction with \c -f, frequencies
- *		of each motif in gene sequences in and out of the bicluster will be provided.</td>
- * </tr><tr>
- *	<td>-M</td>
- *	<td>7</td>
- *	<td>Integer (base pairs)</td>
- *	<td>Default number of base pairs per motif; largely unrelated to the contents of \c -m.</td>
- * </tr><tr>
- *	<td>-k</td>
- *	<td>0</td>
- *	<td>Integer</td>
- *	<td>Degree of HMM used to provide summary statistics of sequences given in \c -f.</td>
+ *	<td>-a</td>
+ *	<td>On</td>
+ *	<td>Flag</td>
+ *	<td>If given, perform a HEFalMp rather than bioPIXIE query.</td>
  * </tr><tr>
  *	<td>-s</td>
- *	<td>2</td>
+ *	<td>1</td>
  *	<td>Integer</td>
  *	<td>Number of columns to skip between the initial ID column and the first experimental (data) column
  *		in the input PCL.</td>
+ * </tr><tr>
+ *	<td>-m</td>
+ *	<td>off</td>
+ *	<td>Flag</td>
+ *	<td>If given, memory map the input files when possible.  DAT and PCL inputs cannot be memmapped.</td>
  * </tr></table>
  */

tools/Filterer/stdafx.cpp

 #include "stdafx.h"
 
 /*!
- * \page Dat2Dab Dat2Dab
+ * \page Filterer Filterer
  * 
- * Dat2Dab converts tab-delimited text DAT files into binary DAB files and vice versa.  It can also convert
- * PCL and DAS files (see Sleipnir::CDat), perform a variety of normalizations or filters during the
- * conversion process, or lookup individual genes' or gene pairs' values from DAB files.
+ * Filterer removes values within a given range or ranges from a DAT/DAB file.  These ranges can be
+ * specified using a rudimentary query language allowing inclusions, exclusions, intersections,
+ * and unions.
  * 
  * \section sec_usage Usage
  * 
  * \subsection ssec_usage_basic Basic Usage
  * 
  * \code
- * Dat2Dab -i <data.dab> -o <data.dat>
+ * Filterer -i <input.dab> -o <output.dab> i0=1
  * \endcode
  * 
- * Convert the input binary DAB file \c data.dab into the output tab-delimited text DAT file \c data.dat.
+ * Include in \c output.dab only the gene pair values from \c input.dab that are between 0 and 1.
  * 
  * \code
- * Dat2Dab -o <data.dab> -n -f -d < <data.dat>
+ * Filterer -i <input.dab> -o <output.dab> x0=1
  * \endcode
  * 
- * Read a text DAT file \c data.dat from standard input, allowing duplicates, normalize all scores to the
- * range [0,1], then invert them and save the results to the binary DAB file \c data.dab.
+ * Include in \c output.dab only the gene pair values from \c input.dab that are not between 0 and 1.
  * 
  * \code
- * Dat2Dab -i <data.dab> -m -l <gene1> -L <gene2>
+ * Filterer -i <input.dab> -o <output.dab> i0=1 i3=
  * \endcode
  * 
- * Open the binary DAB file \c data.dab using memory mapping and output the score for the gene pair \c gene1
- * and \c gene2.
+ * Include in \c output.dab only the gene pair values from \c input.dab that are between 0 and 1 or
+ * at least 3.
+ * 
+ * \code
+ * Filterer -i <input.dab> -o <output.dab> x0=1 i=-0.5
+ * \endcode
+ * 
+ * Include in \c output.dab only the gene pair values from \c input.dab that are at least -0.5 and
+ * not between 0 and 1.
+ * 
+ * \code
+ * Filterer -i <input.dab> -o <output.dab> i=-2 i-1= x-2.5=-0.5
+ * \endcode
+ * 
+ * Include in \c output.dab only the gene pair values from \c input.dab that are at most -2 or at
+ * least -1 and are not between -2.5 and -0.5.
  * 
  * \subsection ssec_usage_detailed Detailed Usage
  * 
  *	<td>-i</td>
  *	<td>stdin</td>
  *	<td>DAT/DAB file</td>
- *	<td>Input DAT, DAB, DAS, or PCL file.</td>
+ *	<td>Input DAT/DAB file.</td>
  * </tr><tr>
  *	<td>-o</td>
  *	<td>stdout</td>
  *	<td>DAT/DAB file</td>
- *	<td>Output DAT, DAB, or DAS file.</td>
- * </tr><tr>
- *	<td>-f</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, output one minus the input's values.</td>
- * </tr><tr>
- *	<td>-n</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, normalize input edges to the range [0,1] before processing.</td>
- * </tr><tr>
- *	<td>-z</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, normalize input edges to z-scores (subtract mean, divide by standard deviation) before
- *		processing.</td>
- * </tr><tr>
- *	<td>-r</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, transform input values to integer ranks before processing.</td>
- * </tr><tr>
- *	<td>-g</td>
- *	<td>None</td>
- *	<td>Text gene list</td>
- *	<td>If given, use only gene pairs for which both genes are in the list.  For details, see
- *		Sleipnir::CDat::FilterGenes.</td>
- * </tr><tr>
- *	<td>-c</td>
- *	<td>None</td>
- *	<td>Double</td>
- *	<td>If given, remove all input edges below the given cutoff (after optional normalization).</td>
- * </tr><tr>
- *	<td>-e</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, replace all missing values with zeros.</td>
- * </tr><tr>
- *	<td>-d</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, allow (with a warning) duplicate pairs in text-based input.</td>
- * </tr><tr>
- *	<td>-G</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If on, only print list of genes that would be included in the normal output file.</td>
- * </tr><tr>
- *	<td>-l</td>
- *	<td>None</td>
- *	<td>String</td>
- *	<td>If given, lookup all values for pairs involving the requested gene.</td>
- * </tr><tr>
- *	<td>-L</td>
- *	<td>None</td>
- *	<td>String</td>
- *	<td>If given with \c -l, lookup all values for the requested gene pair.</td>
- * </tr><tr>
- *	<td>-t</td>
- *	<td>None</td>
- *	<td>Gene text file</td>
- *	<td>If given with \c -l, lookup all pairs between \c -l and the given gene set.  If given alone,
- *		lookup all pairs between genes in the given set.  If given with \c -T, lookup all pairs spanning the
- *		two gene sets.</td>
- * </tr><tr>
- *	<td>-T</td>
- *	<td>None</td>
- *	<td>Gene text file</td>
- *	<td>Must be given with \c -t; looks up all gene pairs spanning the two gene sets (i.e. one gene in the set
- *		\c -t, one in the set \c -T).</td>
- * </tr><tr>
- *	<td>-E</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If set, produce no output other than a list of genes that would be in at least one of the normally
- *		output pairs.</td>
- * </tr><tr>
- *	<td>-p</td>
- *	<td>None</td>
- *	<td>Gene pair text file</td>
- *	<td>Tab-delimited text file containing two columns, both gene IDs.  If given, replace each gene ID
- *		from the first column with the corresponding ID in the second column.</td>
- * </tr><tr>
- *	<td>-b</td>
- *	<td>off</td>
- *	<td>Flag</td>
- *	<td>If given, produce output in a tab-delimited half matrix table.  Not recommended for DAT/DABs with
- *		more than a few dozen genes!</td>
- * </tr><tr>
- *	<td>-s</td>
- *	<td>2</td>
- *	<td>Integer</td>
- *	<td>Number of columns to skip between the initial ID column and the first experimental (data) column
- *		in the input PCL.</td>
+ *	<td>Output (filtered) DAT/DAB file.</td>
  * </tr><tr>
  *	<td>-m</td>
  *	<td>off</td>