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 void Scaffold_t::readRecordFix (istream & fix)
00116 {
00117 Universal_t::readRecordFix (fix);
00118
00119 Size_t csize, esize;
00120 readLE (fix, &csize);
00121 readLE (fix, &esize);
00122
00123 contigs_m . clear();
00124 edges_m . clear();
00125
00126 contigs_m . resize (csize);
00127 edges_m . resize (esize);
00128 }
00129
00130
00131
00132 void Scaffold_t::writeMessage (Message_t & msg) const
00133 {
00134 Universal_t::writeMessage (msg);
00135
00136 try {
00137 ostringstream ss;
00138 Pos_t begin = msg . getSubMessages( ) . size( );
00139 msg . getSubMessages( ) . resize (begin + contigs_m . size( ));
00140
00141 msg . setMessageCode (Scaffold_t::NCODE);
00142
00143 if ( !edges_m . empty( ) )
00144 {
00145 string s;
00146 vector<ID_t>::const_iterator evi;
00147
00148 for ( evi = edges_m . begin( ); evi != edges_m . end( ); evi ++ )
00149 {
00150 ss << *evi << endl;
00151 s . append (ss . str( ));
00152 ss . str (NULL_STRING);
00153 }
00154 msg . setField (F_EDGE, s);
00155 }
00156
00157 if ( !contigs_m . empty( ) )
00158 {
00159 vector<Tile_t>::const_iterator tvi;
00160 for ( tvi = contigs_m . begin( ); tvi != contigs_m . end( ); ++ tvi )
00161 tvi -> writeMessage (msg . getSubMessages( ) [begin ++]);
00162 }
00163 }
00164 catch (ArgumentException_t) {
00165
00166 msg . clear( );
00167 throw;
00168 }
00169 }
00170
00171
00172
00173 void Scaffold_t::writeRecord (ostream & fix, ostream & var) const
00174 {
00175 Universal_t::writeRecord (fix, var);
00176
00177 Size_t csize = contigs_m . size( );
00178 Size_t esize = edges_m . size( );
00179 writeLE (fix, &csize);
00180 writeLE (fix, &esize);
00181
00182 for ( Pos_t i = 0; i < csize; i ++ )
00183 contigs_m [i] . writeRecord (var);
00184
00185 for ( Pos_t i = 0; i < esize; i ++ )
00186 writeLE (var, &(edges_m [i]));
00187 }