Sleipnir
tools/Dat2Dab/Dat2Dab.cpp
00001 /*****************************************************************************
00002 * This file is provided under the Creative Commons Attribution 3.0 license.
00003 *
00004 * You are free to share, copy, distribute, transmit, or adapt this work
00005 * PROVIDED THAT you attribute the work to the authors listed below.
00006 * For more information, please see the following web page:
00007 * http://creativecommons.org/licenses/by/3.0/
00008 *
00009 * This file is a component of the Sleipnir library for functional genomics,
00010 * authored by:
00011 * Curtis Huttenhower (chuttenh@princeton.edu)
00012 * Mark Schroeder
00013 * Maria D. Chikina
00014 * Olga G. Troyanskaya (ogt@princeton.edu, primary contact)
00015 *
00016 * If you use this library, the included executable tools, or any related
00017 * code in your work, please cite the following publication:
00018 * Curtis Huttenhower, Mark Schroeder, Maria D. Chikina, and
00019 * Olga G. Troyanskaya.
00020 * "The Sleipnir library for computational functional genomics"
00021 *****************************************************************************/
00022 #include "stdafx.h"
00023 #include "cmdline.h"
00024 #include <cmath>
00025 
00026 #include "statistics.h"
00027 #include "datapair.h"
00028 
00029 int main( int iArgs, char** aszArgs ) {
00030     gengetopt_args_info sArgs;
00031     CGenome             Genome;
00032     CGenes              Genes( Genome );
00033     ifstream            ifsm;
00034     CDat                Dat;
00035     size_t              i, j, k;
00036     bool                fModified;
00037 
00038     if( cmdline_parser( iArgs, aszArgs, &sArgs ) ) {
00039         cmdline_parser_print_help( );
00040         return 1; }
00041 
00042     CMeta Meta( sArgs.verbosity_arg, sArgs.random_arg );
00043     
00044     if( sArgs.genes_arg ) {
00045         ifsm.open( sArgs.genes_arg );
00046         if( !Genes.Open( ifsm ) ) {
00047             cerr << "Could not open: " << sArgs.genes_arg << endl;
00048             return 1; }
00049         ifsm.close( ); }
00050 
00051     fModified = sArgs.normalize_flag || sArgs.subsample_arg;
00052     if( sArgs.input_arg ) {
00053       if( !Dat.Open( sArgs.input_arg, sArgs.memmap_flag && !fModified,
00054              sArgs.skip_arg, !!sArgs.zscore_flag, !!sArgs.duplicates_flag ) ) {
00055         cerr << "Could not open: " << sArgs.input_arg << endl;
00056         return 1; } }   
00057     else if( !Dat.Open( cin, CDat::EFormatText, (float)HUGE_VAL, !!sArgs.duplicates_flag ) ) {
00058         cerr << "Could not open input" << endl;
00059         return 1; }
00060 
00061     if( sArgs.genelist_flag ) {
00062         for( i = 0; i < Dat.GetGenes( ); ++i )
00063             cout << Dat.GetGene( i ) << endl;
00064         return 0; }
00065 
00066     if( sArgs.remap_arg ) {
00067         static const size_t c_iBuffer   = 1024;
00068         char                                acBuffer[ c_iBuffer ];
00069         vector<string>                      vecstrTokens;
00070         map<string,string>                  mapNames;
00071         map<string,string>::const_iterator  iterName;
00072 
00073         ifsm.clear( );
00074         ifsm.open( sArgs.remap_arg );
00075         if( !ifsm.is_open( ) ) {
00076             cerr << "Could not open: " << sArgs.remap_arg << endl;
00077             return 1; }
00078         while( !ifsm.eof( ) ) {
00079             ifsm.getline( acBuffer, c_iBuffer - 1 );
00080             acBuffer[ c_iBuffer - 1 ] = 0;
00081             vecstrTokens.clear( );
00082             CMeta::Tokenize( acBuffer, vecstrTokens );
00083             if( vecstrTokens.empty( ) )
00084                 continue;
00085             if( vecstrTokens.size( ) < 2 ) {
00086                 cerr << "Illegal remap line (" << vecstrTokens.size( ) << "): " << acBuffer << endl;
00087                 return 1; }
00088             if( vecstrTokens[ 0 ] == vecstrTokens[ 1 ] )
00089                 continue;
00090             if( ( iterName = mapNames.find( vecstrTokens[ 0 ] ) ) == mapNames.end( ) )
00091                 mapNames[ vecstrTokens[ 0 ] ] = vecstrTokens[ 1 ];
00092             else if( iterName->second != vecstrTokens[ 1 ] ) {
00093                 cerr << "Ambiguous mapping: " << vecstrTokens[ 0 ] << " to " << iterName->second <<
00094                     ", " << vecstrTokens[ 1 ] << endl;
00095                 return 1; } }
00096 
00097         for( i = 0; i < Dat.GetGenes( ); ++i )
00098             if( ( iterName = mapNames.find( Dat.GetGene( i ) ) ) != mapNames.end( ) ) {
00099                 if( Dat.GetGene( iterName->second ) != -1 ) {
00100                     cerr << "Duplicate mapping: " << Dat.GetGene( i ) << " to " <<
00101                         iterName->second << endl;
00102                     return 1; }
00103                 Dat.SetGene( i, iterName->second ); } }
00104     
00105     // should I set all non-missing values to defualt value?
00106     if( sArgs.dval_given ){
00107       for( i = 0; i < Dat.GetGenes( ); ++i )
00108         for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ){
00109           if( CMeta::IsNaN( Dat.Get( i, j ) ) )
00110         continue;
00111           Dat.Set( i, j, sArgs.dval_arg );
00112         } 
00113     }
00114     // should I add random noise from standard Normal?
00115     if( sArgs.noise_flag ){
00116       float d;
00117       for( i = 0; i < Dat.GetGenes( ); ++i )
00118         for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j )
00119           if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) ){
00120         Dat.Set( i, j, d + CStatistics::SampleNormalStandard() );         
00121           } 
00122     }      
00123     if( sArgs.randomize_flag )
00124         Dat.Randomize( );
00125     if( sArgs.rank_flag )
00126         Dat.Rank( );
00127     if( sArgs.normalize_flag || sArgs.zscore_flag )
00128         Dat.Normalize( sArgs.zscore_flag ? CDat::ENormalizeZScore : CDat::ENormalizeMinMax );
00129     
00130     if( sArgs.normalizeNPone_flag )
00131       Dat.Normalize( CDat::ENormalizeMinMaxNPone );
00132 
00133     if( sArgs.zero_flag || sArgs.dmissing_given ) {
00134         for( i = 0; i < Dat.GetGenes( ); ++i ) {
00135             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00136                 if( CMeta::IsNaN( Dat.Get( i, j ) ) ){
00137                     if ( sArgs.zero_flag ){
00138                         Dat.Set( i, j, 0 );
00139                     }
00140                     else{
00141                         Dat.Set( i, j, sArgs.dmissing_arg );
00142                     }
00143                 }
00144             }
00145         }
00146     }
00147     
00148     if( sArgs.NegExp_flag ){
00149         float d;
00150         for( i = 0; i < Dat.GetGenes( ); ++i ) {
00151             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00152                 if( CMeta::IsNaN( d=Dat.Get( i, j ) ) )
00153                     continue;
00154                 Dat.Set( i, j, exp(-d) );
00155             }
00156         }
00157     }
00158 
00159     if( sArgs.abs_flag ){
00160         float d;
00161         for( i = 0; i < Dat.GetGenes( ); ++i ) {
00162             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00163                 if( CMeta::IsNaN( d=Dat.Get( i, j ) ) )
00164                     continue;
00165                 Dat.Set( i, j, abs(d) );
00166             }
00167         }
00168     }
00169 
00170     if( sArgs.flip_flag )
00171         Dat.Invert( );
00172 
00173     if( sArgs.normalizeDeg_flag ) {
00174         size_t              iCutoff;
00175         float               d;
00176         vector<size_t>      veciCounts;
00177         vector<float>       vecdTotals;
00178 
00179         veciCounts.resize( Dat.GetGenes( ) );
00180         fill( veciCounts.begin( ), veciCounts.end( ), 0 );
00181         vecdTotals.resize( Dat.GetGenes( ) );
00182         fill( vecdTotals.begin( ), vecdTotals.end( ), 0.0f );
00183 
00184         for( iCutoff = i = 0; i < Dat.GetGenes( ); ++i ) {
00185             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00186                 if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) ) {
00187                     if( !sArgs.cutoff_given || ( d >= sArgs.cutoff_arg ) ) {
00188                         // d = abs (d);
00189                         iCutoff++;
00190                         veciCounts[ i ]++;
00191                         veciCounts[ j ]++;
00192                         vecdTotals[ i ] += d;
00193                         vecdTotals[ j ] += d;
00194                         d *= d;
00195                     }
00196                 }
00197             }
00198         }
00199 
00200         for( i = 0; i < Dat.GetGenes( ); ++i ) {
00201             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00202                 if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) ) {
00203                     if( !sArgs.cutoff_given || ( d >= sArgs.cutoff_arg ) ) {
00204                         d = d * veciCounts[ i ] / sqrt( vecdTotals[ i ] * vecdTotals[ j ] );
00205                         Dat.Set( i, j, d );
00206                     }
00207                 }
00208             }
00209         }
00210     }
00211 
00212     if( sArgs.normalizeLoc_flag ) {
00213         size_t              iCutoff;
00214         float               d, zi, zj;
00215         vector<size_t>      veciCounts;
00216         vector<float>       vecdTotals, vecdAvgs, vecdSquares;
00217 
00218         veciCounts.resize( Dat.GetGenes( ) );
00219         fill( veciCounts.begin( ), veciCounts.end( ), 0 );
00220         vecdTotals.resize( Dat.GetGenes( ) );
00221         fill( vecdTotals.begin( ), vecdTotals.end( ), 0.0f );
00222         vecdAvgs.resize( Dat.GetGenes( ) );
00223         fill( vecdAvgs.begin( ), vecdAvgs.end( ), 0.0f );
00224         vecdSquares.resize( Dat.GetGenes( ) );
00225         fill( vecdSquares.begin( ), vecdSquares.end( ), 0.0f );
00226 
00227         for( iCutoff = i = 0; i < Dat.GetGenes( ); ++i ) {
00228             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00229                 if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) ) {
00230                     if( !sArgs.cutoff_given || ( d >= sArgs.cutoff_arg ) ) {
00231                         // d = abs (d);
00232                         iCutoff++;
00233                         veciCounts[ i ]++;
00234                         veciCounts[ j ]++;
00235                         vecdTotals[ i ] += d;
00236                         vecdTotals[ j ] += d;
00237 
00238                         d *= d;
00239                         vecdSquares[ i ] += d;
00240                         vecdSquares[ j ] += d;
00241                     }
00242                 }
00243             }
00244         }
00245 
00246         for( i = 0; i < vecdSquares.size( ); ++i ) {
00247             d = vecdTotals[ i ] / veciCounts[ i ];
00248             vecdAvgs[ i ] = d;
00249             vecdSquares[ i ] = sqrt( ( vecdSquares[ i ] / veciCounts[ i ] ) - ( d * d ) );
00250         }
00251 
00252          for( i = 0; i < Dat.GetGenes( ); ++i ) {
00253             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ) {
00254                 if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) ) {
00255                     if( !sArgs.cutoff_given || ( d >= sArgs.cutoff_arg ) ) {
00256                         if( vecdSquares[ i ] == 0 ) { zi = 0; }
00257                         else { zi = (d - vecdAvgs[ i ]) / vecdSquares[ i ]; }
00258 
00259                         if( vecdSquares[ j ] == 0 ) { zj = 0; }
00260                         else { zj = (d - vecdAvgs[ j ]) / vecdSquares[ j ]; }
00261                         
00262                         d = ( zi + zj ) / sqrt(2);
00263                         Dat.Set( i, j, d );
00264                     }
00265                 }
00266             }
00267         }
00268     }
00269 
00270     if( Genes.GetGenes( ) )
00271         Dat.FilterGenes( Genes, CDat::EFilterInclude );
00272     if( sArgs.genex_arg )
00273         Dat.FilterGenes( sArgs.genex_arg, CDat::EFilterExclude );
00274     if( sArgs.genee_arg )
00275         Dat.FilterGenes( sArgs.genee_arg, CDat::EFilterEdge );
00276     if( sArgs.gexedges_arg )
00277         Dat.FilterGenes( sArgs.gexedges_arg, CDat::EFilterExEdge );
00278     
00279 
00280     if( sArgs.ccoeff_flag ) {
00281       float sxy, sxxyy, sgxy;
00282       for( i = 0; i < Dat.GetGenes( ); ++i ){
00283         sxy = 0.0;
00284         sxxyy = 0.0;
00285         sgxy = 0.0;
00286         for( j = 0; j < Dat.GetGenes( ); ++j ){
00287           if( i == j )
00288         continue;  
00289           
00290           sxy = sxy + Dat.Get(i, j);
00291           sxxyy = sxxyy + (Dat.Get(i, j)*Dat.Get(i, j));
00292           
00293           for( k = j+1; k < Dat.GetGenes( ); ++k ){
00294         if( i == k || j == k)
00295           continue;     
00296         sgxy = sgxy + Dat.Get(i, j)*Dat.Get(i, k)*Dat.Get(j, k);
00297           }
00298         }
00299         cout << Dat.GetGene( i ) << '\t' <<  sgxy/( sxy*sxy - sxxyy )  << endl;
00300       }
00301       
00302       return 0;
00303     }
00304     
00305     if( sArgs.mar_flag ){
00306       float sxy, sxxyy;
00307       
00308       for( i = 0; i < Dat.GetGenes( ); ++i ){
00309         sxy = 0;
00310         sxxyy = 0;
00311         
00312         for( j = 0; j < Dat.GetGenes( ); ++j ){
00313           if( i == j )
00314         continue;  
00315           
00316           sxxyy = sxxyy + (Dat.Get(i, j)*Dat.Get(i, j));
00317           sxy = sxy + Dat.Get(i, j);
00318         }
00319         cout << Dat.GetGene( i ) << '\t' << sxxyy/sxy << endl;
00320       }   
00321       return 0;
00322     }
00323         
00324     if( sArgs.hubbiness_flag ) {
00325       float sume;
00326       for( i = 0; i < Dat.GetGenes( ); ++i ){
00327         sume = 0.0;
00328         for( j = 0; j < Dat.GetGenes( ); ++j ){
00329           if( i == j )
00330         continue;         
00331           sume = sume + Dat.Get(i, j);
00332         }
00333         
00334         cout << Dat.GetGene( i ) << '\t' << sume/(Dat.GetGenes( )-1) << endl;
00335       }
00336       
00337       return 0;
00338     }
00339     
00340     if( sArgs.paircount_flag ) {
00341         size_t          iTotal, iCutoff;
00342         float           d, dAve, dStd;
00343         vector<size_t>  veciCounts;
00344         vector<float>   vecdTotals, vecdSquares;
00345 
00346         dAve = dStd = 0;
00347         veciCounts.resize( Dat.GetGenes( ) );
00348         fill( veciCounts.begin( ), veciCounts.end( ), 0 );
00349         vecdTotals.resize( Dat.GetGenes( ) );
00350         fill( vecdTotals.begin( ), vecdTotals.end( ), 0.0f );
00351         vecdSquares.resize( Dat.GetGenes( ) );
00352         fill( vecdSquares.begin( ), vecdSquares.end( ), 0.0f );
00353         for( iTotal = iCutoff = i = 0; i < Dat.GetGenes( ); ++i )
00354             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j )
00355                 if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) ) {
00356                     if( !sArgs.cutoff_given || ( d >= sArgs.cutoff_arg ) ) {
00357                         // d = abs (d);
00358                         dAve += d;
00359                         iCutoff++;
00360                         veciCounts[ i ]++;
00361                         veciCounts[ j ]++;
00362                         vecdTotals[ i ] += d;
00363                         vecdTotals[ j ] += d;
00364                         d *= d;
00365                         dStd += d;
00366                         vecdSquares[ i ] += d;
00367                         vecdSquares[ j ] += d; }
00368                     iTotal++; }
00369         dAve /= iCutoff;
00370         dStd = sqrt( ( dStd / iCutoff ) - ( dAve * dAve ) );
00371         for( i = 0; i < vecdSquares.size( ); ++i ) {
00372             d = vecdTotals[ i ] / iCutoff;
00373             vecdSquares[ i ] = sqrt( ( vecdSquares[ i ] / iCutoff ) - ( d * d ) ); }
00374 
00375         cout << iTotal << endl;
00376         if( sArgs.cutoff_given )
00377             cout << iCutoff << endl;
00378         cout << dAve << '\t' << dStd << endl;
00379         for( i = 0; i < Dat.GetGenes( ); ++i )
00380             cout << Dat.GetGene( i ) << '\t' << vecdTotals[ i ] << '\t' << veciCounts[ i ] << '\t' <<
00381                 vecdSquares[ i ] << endl;
00382         return 0; }
00383 
00384     if( sArgs.cutoff_given )
00385         for( i = 0; i < Dat.GetGenes( ); ++i )
00386             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j )
00387                 if( Dat.Get( i, j ) < sArgs.cutoff_arg )
00388                     Dat.Set( i, j, CMeta::GetNaN( ) );
00389 
00390     if( sArgs.subsample_arg < 1 )
00391         for( i = 0; i < Dat.GetGenes( ); ++i )
00392             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j )
00393                 if( !CMeta::IsNaN( Dat.Get( i, j ) ) &&
00394                     ( ( (float)rand( ) / RAND_MAX ) > sArgs.subsample_arg ) )
00395                     Dat.Set( i, j, CMeta::GetNaN( ) );
00396 
00397     if( sArgs.edges_arg ) {
00398         CDat            DatLk1;
00399         vector<size_t>  veciGenesOne;
00400         size_t          iOne, iTwo;
00401 
00402         if( !DatLk1.Open( sArgs.edges_arg ) ) {
00403             cerr << "Could not open: " << sArgs.edges_arg << endl;
00404             return 1; }
00405         veciGenesOne.resize( Dat.GetGenes( ) );
00406         for( i = 0; i < veciGenesOne.size( ); ++i )
00407             veciGenesOne[ i ] = DatLk1.GetGene( Dat.GetGene( i ) );
00408         for( i = 0; i < Dat.GetGenes( ); ++i ) {
00409             if( ( iOne = veciGenesOne[ i ] ) == -1 ) {
00410                 for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j )
00411                     Dat.Set( i, j, CMeta::GetNaN( ) );
00412                 continue; }
00413             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j )
00414                 if( ( ( iTwo = veciGenesOne[ j ] ) == -1 ) ||
00415                     CMeta::IsNaN( DatLk1.Get( iOne, iTwo ) ) )
00416                     Dat.Set( i, j, CMeta::GetNaN( ) ); } }
00417     
00418     if( sArgs.exedges_arg ) {
00419         CDat            DatLk1;
00420         vector<size_t>  veciGenesOne;
00421         size_t          iOne, iTwo;
00422 
00423         if( !DatLk1.Open( sArgs.exedges_arg ) ) {
00424             cerr << "Could not open: " << sArgs.exedges_arg << endl;
00425             return 1; }
00426         
00427         veciGenesOne.resize( Dat.GetGenes( ) );
00428         
00429         for( i = 0; i < veciGenesOne.size( ); ++i )
00430             veciGenesOne[ i ] = DatLk1.GetGene( Dat.GetGene( i ) );
00431         
00432         for( i = 0; i < Dat.GetGenes( ); ++i ) {
00433           if( ( iOne = veciGenesOne[ i ] ) == -1 ) 
00434               continue;
00435             for( j = ( i + 1 ); j < Dat.GetGenes( ); ++j ){
00436               if( (( iTwo = veciGenesOne[ j ] ) == -1 ) ||
00437                   CMeta::IsNaN( DatLk1.Get( iOne, iTwo )))
00438                 continue;
00439               Dat.Set( i, j, CMeta::GetNaN( ) ); 
00440             }           
00441         } 
00442     }
00443 
00444     if( sArgs.lookups1_arg ) {
00445         CGenes          GenesLk1( Genome );
00446         vector<size_t>  veciGenesOne;
00447         size_t          iOne, iTwo;
00448         float           d;
00449 
00450         ifsm.clear( );
00451         ifsm.open( sArgs.lookups1_arg );
00452         if( !GenesLk1.Open( ifsm ) ) {
00453             cerr << "Could not open: " << sArgs.lookups1_arg << endl;
00454             return 1; }
00455         ifsm.close( );
00456         veciGenesOne.resize( GenesLk1.GetGenes( ) );
00457         for( i = 0; i < veciGenesOne.size( ); ++i )
00458             veciGenesOne[ i ] = Dat.GetGene( GenesLk1.GetGene( i ).GetName( ) );
00459         if( sArgs.lookups2_arg ) {
00460             CGenes          GenesLk2( Genome );
00461             vector<size_t>  veciGenesTwo;
00462 
00463             ifsm.clear( );
00464             ifsm.open( sArgs.lookups2_arg );
00465             if( !GenesLk2.Open( ifsm ) ) {
00466                 cerr << "Could not open: " << sArgs.lookups2_arg << endl;
00467                 return 1; }
00468             ifsm.close( );
00469             veciGenesTwo.resize( GenesLk2.GetGenes( ) );
00470             for( i = 0; i < veciGenesTwo.size( ); ++i )
00471                 veciGenesTwo[ i ] = Dat.GetGene( GenesLk2.GetGene( i ).GetName( ) );
00472             for( i = 0; i < veciGenesOne.size( ); ++i ) {
00473                 if( ( iOne = veciGenesOne[ i ] ) == -1 )
00474                     continue;
00475                 for( j = 0; j < veciGenesTwo.size( ); ++j )
00476                     if( ( ( iTwo = veciGenesTwo[ j ] ) != -1 ) && !CMeta::IsNaN( d = Dat.Get( iOne, iTwo ) ) )
00477                         cout << Dat.GetGene( iOne ) << '\t' << Dat.GetGene( iTwo ) << '\t' << d << endl; } }
00478         else if( sArgs.lookup1_arg ) {
00479             if( ( iOne = Dat.GetGene( sArgs.lookup1_arg ) ) != -1 )
00480                 for( i = 0; i < veciGenesOne.size( ); ++i )
00481                     if( ( ( iTwo = veciGenesOne[ i ] ) != -1 ) &&
00482                         !CMeta::IsNaN( d = Dat.Get( iOne, iTwo ) ) )
00483                         cout << Dat.GetGene( iOne ) << '\t' << Dat.GetGene( iTwo ) << '\t' << d << endl; }
00484         else
00485             for( i = 0; i < veciGenesOne.size( ); ++i )
00486                 if( ( iOne = veciGenesOne[ i ] ) != -1 )
00487                     for( j = ( i + 1 ); j < veciGenesOne.size( ); ++j )
00488                         if( ( ( iTwo = veciGenesOne[ j ] ) != -1 ) &&
00489                             !CMeta::IsNaN( d = Dat.Get( iOne, iTwo ) ) )
00490                             cout << Dat.GetGene( iOne ) << '\t' << Dat.GetGene( iTwo ) << '\t' << d << endl;
00491         return 0; }
00492     else if( sArgs.lookup1_arg ) {
00493         if( ( i = Dat.GetGene( sArgs.lookup1_arg ) ) == -1 ) {
00494             cerr << "Unknown gene: " << sArgs.lookup1_arg << endl;
00495             return 1; }
00496         if( sArgs.lookup2_arg ) {
00497             if( ( j = Dat.GetGene( sArgs.lookup2_arg ) ) == -1 ) {
00498                 cerr << "Unknown gene: " << sArgs.lookup2_arg << endl;
00499                 return 1; }
00500             cout << Dat.GetGene( i ) << '\t' << Dat.GetGene( j ) << '\t' << Dat.Get( i, j ) << endl; }
00501         else
00502             for( j = 0; j < Dat.GetGenes( ); ++j ) {
00503                 float   d;
00504 
00505                 if( ( i != j ) && !CMeta::IsNaN( d = Dat.Get( i, j ) ) )
00506                     cout << Dat.GetGene( i ) << '\t' << Dat.GetGene( j ) << '\t' << d << endl; } }
00507     else if( sArgs.table_flag ) {
00508         for( i = 1; i < Dat.GetGenes( ); ++i )
00509             cout << '\t' << Dat.GetGene( i );
00510         cout << endl;
00511         for( i = 0; ( i + 1 ) < Dat.GetGenes( ); ++i ) {
00512             cout << Dat.GetGene( i );
00513             for( j = 0; j < i; ++j )
00514                 cout << '\t';
00515             for( ++j; j < Dat.GetGenes( ); ++j ) {
00516                 float   d;
00517 
00518                 cout << '\t';
00519                 if( !CMeta::IsNaN( d = Dat.Get( i, j ) ) )
00520                     cout << d; }
00521             cout << endl; } }   
00522     else if( sArgs.output_arg ) {
00523         CDataPair datOut;
00524         datOut.Open( Dat );
00525         if( sArgs.quant_arg ) {
00526             datOut.OpenQuants( sArgs.quant_arg );
00527             datOut.Quantize();
00528         }
00529         datOut.Save( sArgs.output_arg );  
00530     }
00531     else {
00532         Dat.Save( cout, CDat::EFormatText );
00533         cout.flush( ); }
00534 
00535     return 0; }