00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include "Scaffold_AMOS.hh"
00011
using namespace AMOS;
00012
using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Scaffold_t::NCODE =
M_SCAFFOLD;
00019
00020
00021
00022 Size_t Scaffold_t::getSpan ( )
const
00023
{
00024
Pos_t hi,lo;
00025
00026
if ( contigs_m . empty( ) )
00027 {
00028 hi = 0;
00029 lo = 0;
00030 }
00031
else
00032 {
00033 hi = -(
MAX_POS);
00034 lo =
MAX_POS;
00035 }
00036
00037 vector<Tile_t>::const_iterator ti;
00038
for ( ti = contigs_m . begin( ); ti != contigs_m . end( ); ++ ti )
00039 {
00040
if ( ti -> offset < lo )
00041 lo = ti -> offset;
00042
if ( ti -> offset + ti -> range . getLength( ) > hi )
00043 hi = ti -> offset + ti -> range . getLength( );
00044 }
00045
00046
return hi - lo;
00047 }
00048
00049
00050
00051 void Scaffold_t::readMessage (
const Message_t & msg)
00052 {
00053
Universal_t::readMessage (msg);
00054
00055
try {
00056 vector<Message_t>::const_iterator i;
00057
00058
if ( msg . exists (
F_EDGE) )
00059 {
00060
ID_t iid;
00061 istringstream ss;
00062
00063 ss . str (msg . getField (
F_EDGE));
00064
00065
while ( ss )
00066 {
00067 ss >> iid;
00068
if ( ! ss . fail( ) )
00069 edges_m . push_back (iid);
00070 }
00071
00072
if ( !ss . eof( ) )
00073
AMOS_THROW_ARGUMENT (
"Invalid contig edge link list format");
00074 ss .
clear( );
00075 }
00076
00077
for ( i = msg . getSubMessages( ) . begin( );
00078 i != msg . getSubMessages( ) . end( ); i ++ )
00079 {
00080
if ( i -> getMessageCode( ) ==
M_TILE )
00081 {
00082 contigs_m . push_back (
Tile_t( ));
00083 contigs_m . back( ) .
readMessage (*i);
00084 }
00085 }
00086 }
00087
catch (
ArgumentException_t) {
00088
00089
clear( );
00090
throw;
00091 }
00092 }
00093
00094
00095
00096 void Scaffold_t::readRecord (istream & fix, istream & var)
00097 {
00098
Universal_t::readRecord (fix, var);
00099
00100
Size_t csize, esize;
00101
readLE (fix, &csize);
00102
readLE (fix, &esize);
00103
00104 contigs_m . resize (csize);
00105
for (
Pos_t i = 0; i < csize; i ++ )
00106 contigs_m [i] .
readRecord (var);
00107
00108 edges_m . resize (esize);
00109
for (
Pos_t i = 0; i < esize; i ++ )
00110
readLE (var, &(edges_m [i]));
00111 }
00112
00113
00114
00115
00116 void Scaffold_t::writeMessage (
Message_t & msg)
const
00117
{
00118
Universal_t::writeMessage (msg);
00119
00120
try {
00121 ostringstream ss;
00122
Pos_t begin = msg . getSubMessages( ) . size( );
00123 msg . getSubMessages( ) . resize (begin + contigs_m . size( ));
00124
00125 msg . setMessageCode (Scaffold_t::NCODE);
00126
00127
if ( !edges_m . empty( ) )
00128 {
00129 string s;
00130 vector<ID_t>::const_iterator evi;
00131
00132
for ( evi = edges_m . begin( ); evi != edges_m . end( ); evi ++ )
00133 {
00134 ss << *evi << endl;
00135 s . append (ss . str( ));
00136 ss . str (
NULL_STRING);
00137 }
00138 msg . setField (
F_EDGE, s);
00139 }
00140
00141
if ( !contigs_m . empty( ) )
00142 {
00143 vector<Tile_t>::const_iterator tvi;
00144
for ( tvi = contigs_m . begin( ); tvi != contigs_m . end( ); ++ tvi )
00145 tvi ->
writeMessage (msg . getSubMessages( ) [begin ++]);
00146 }
00147 }
00148
catch (
ArgumentException_t) {
00149
00150 msg .
clear( );
00151
throw;
00152 }
00153 }
00154
00155
00156
00157 void Scaffold_t::writeRecord (ostream & fix, ostream & var)
const
00158
{
00159
Universal_t::writeRecord (fix, var);
00160
00161
Size_t csize = contigs_m . size( );
00162
Size_t esize = edges_m . size( );
00163
writeLE (fix, &csize);
00164
writeLE (fix, &esize);
00165
00166
for (
Pos_t i = 0; i < csize; i ++ )
00167 contigs_m [i] .
writeRecord (var);
00168
00169
for (
Pos_t i = 0; i < esize; i ++ )
00170
writeLE (var, &(edges_m [i]));
00171 }