Sleipnir
|
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; }