00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Read_AMOS.hh"
00011 using namespace AMOS;
00012 using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Read_t::NCODE = M_READ;
00019
00020
00021
00022 void Read_t::clear ( )
00023 {
00024 Sequence_t::clear( );
00025 clear_m . clear( );
00026 frag_m = NULL_ID;
00027 qclear_m . clear( );
00028 type_m = NULL_READ;
00029 vclear_m . clear( );
00030 bcp_m . clear( );
00031 pos_m = 0;
00032 }
00033
00034
00035
00036 void Read_t::readMessage (const Message_t & msg)
00037 {
00038 Sequence_t::readMessage (msg);
00039
00040 try {
00041 int16_t bcp;
00042 istringstream ss;
00043
00044 if ( msg . exists (F_FRAGMENT) )
00045 {
00046 ss . str (msg . getField (F_FRAGMENT));
00047 ss >> frag_m;
00048 if ( !ss )
00049 AMOS_THROW_ARGUMENT ("Invalid fragment link format");
00050 ss . clear( );
00051 }
00052
00053 if ( msg . exists (F_TYPE) )
00054 {
00055 ss . str (msg . getField (F_TYPE));
00056 setType (ss . get( ));
00057 ss . clear( );
00058 }
00059
00060 if ( msg . exists (F_CLEAR) )
00061 {
00062 ss . str (msg . getField (F_CLEAR));
00063 ss >> clear_m . begin;
00064 ss . ignore( );
00065 ss >> clear_m . end;
00066 if ( !ss )
00067 AMOS_THROW_ARGUMENT ("Invalid clear range format");
00068 ss . clear( );
00069 }
00070
00071 if ( msg . exists (F_VECTORCLEAR) )
00072 {
00073 ss . str (msg . getField (F_VECTORCLEAR));
00074 ss >> vclear_m . begin;
00075 ss . ignore( );
00076 ss >> vclear_m . end;
00077 if ( !ss )
00078 AMOS_THROW_ARGUMENT ("Invalid vector clear range format");
00079 ss . clear( );
00080 }
00081
00082 if ( msg . exists (F_QUALITYCLEAR) )
00083 {
00084 ss . str (msg . getField (F_QUALITYCLEAR));
00085 ss >> qclear_m . begin;
00086 ss . ignore( );
00087 ss >> qclear_m . end;
00088 if ( !ss )
00089 AMOS_THROW_ARGUMENT ("Invalid quality clear range format");
00090 ss . clear( );
00091 }
00092
00093 if ( msg . exists (F_BASEPOSITION) )
00094 {
00095 ss . str (msg . getField (F_BASEPOSITION));
00096
00097 while ( ss )
00098 {
00099 ss >> bcp;
00100 if ( ! ss . fail( ) )
00101 bcp_m . push_back (bcp);
00102 }
00103
00104 if ( !ss . eof( ) )
00105 AMOS_THROW_ARGUMENT ("Invalid base call position format");
00106 ss . clear( );
00107 }
00108
00109 if ( msg . exists (F_POSITION) )
00110 {
00111 ss . str (msg . getField (F_POSITION));
00112 ss >> pos_m;
00113 if ( !ss )
00114 AMOS_THROW_ARGUMENT ("Invalid fragment position format");
00115 ss . clear( );
00116 }
00117 }
00118 catch (ArgumentException_t) {
00119
00120 clear( );
00121 throw;
00122 }
00123 }
00124
00125
00126
00127 void Read_t::readRecord (istream & fix, istream & var)
00128 {
00129 Size_t size;
00130 Sequence_t::readRecord (fix, var);
00131
00132 readLE (fix, &(clear_m . begin));
00133 readLE (fix, &(clear_m . end));
00134 readLE (fix, &frag_m);
00135 readLE (fix, &(qclear_m . begin));
00136 readLE (fix, &(qclear_m . end));
00137 type_m = fix . get( );
00138 readLE (fix, &(vclear_m . begin));
00139 readLE (fix, &(vclear_m . end));
00140 readLE (fix, &pos_m);
00141 readLE (fix, &size);
00142
00143 bcp_m . resize (size);
00144 for ( Pos_t i = 0; i < size; i ++ )
00145 readLE (var, &(bcp_m [i]));
00146 }
00147
00148
00149 void Read_t::readRecordFix (istream & fix)
00150 {
00151 Size_t size;
00152 Sequence_t::readRecordFix (fix);
00153
00154 readLE (fix, &(clear_m . begin));
00155 readLE (fix, &(clear_m . end));
00156 readLE (fix, &frag_m);
00157 readLE (fix, &(qclear_m . begin));
00158 readLE (fix, &(qclear_m . end));
00159 type_m = fix . get( );
00160 readLE (fix, &(vclear_m . begin));
00161 readLE (fix, &(vclear_m . end));
00162 readLE (fix, &pos_m);
00163 readLE (fix, &size);
00164
00165 bcp_m.clear();
00166 }
00167
00168
00169
00170 void Read_t::setType (ReadType_t type)
00171 {
00172 switch (type)
00173 {
00174 case NULL_READ:
00175 case OTHER:
00176 case END:
00177 case CONTIG:
00178 case BAC:
00179 case WALK:
00180 case TRANSPOSON:
00181 type_m = type;
00182 break;
00183 default:
00184 AMOS_THROW_ARGUMENT ((string)"Invalid read type " + type);
00185 }
00186 }
00187
00188
00189
00190 void Read_t::writeMessage (Message_t & msg) const
00191 {
00192 Sequence_t::writeMessage (msg);
00193
00194 try {
00195 vector<int16_t>::const_iterator vi;
00196 ostringstream ss;
00197
00198 msg . setMessageCode (Read_t::NCODE);
00199
00200 if ( frag_m != NULL_ID )
00201 {
00202 ss << frag_m;
00203 msg . setField (F_FRAGMENT, ss . str( ));
00204 ss . str (NULL_STRING);
00205 }
00206
00207 if ( type_m != NULL_READ )
00208 {
00209 ss << type_m;
00210 msg . setField (F_TYPE, ss . str( ));
00211 ss . str (NULL_STRING);
00212 }
00213
00214 if ( clear_m . getLength( ) != 0 )
00215 {
00216 ss << clear_m . begin << ',' << clear_m . end;
00217 msg . setField (F_CLEAR, ss . str( ));
00218 ss . str (NULL_STRING);
00219 }
00220
00221 if ( vclear_m . getLength( ) != 0 )
00222 {
00223 ss << vclear_m . begin << ',' << vclear_m . end;
00224 msg . setField (F_VECTORCLEAR, ss . str( ));
00225 ss . str (NULL_STRING);
00226 }
00227
00228 if ( qclear_m . getLength( ) != 0 )
00229 {
00230 ss << qclear_m . begin << ',' << qclear_m . end;
00231 msg . setField (F_QUALITYCLEAR, ss . str( ));
00232 ss . str (NULL_STRING);
00233 }
00234
00235 if ( !bcp_m . empty( ) )
00236 {
00237 for ( vi = bcp_m . begin( ); vi != bcp_m . end( ); vi ++ )
00238 ss << *vi << '\n';
00239 msg . setField (F_BASEPOSITION, ss . str( ));
00240 ss . str (NULL_STRING);
00241 }
00242
00243 if ( pos_m != 0 )
00244 {
00245 ss << pos_m;
00246 msg . setField (F_POSITION, ss . str( ));
00247 ss . str (NULL_STRING);
00248 }
00249 }
00250 catch (ArgumentException_t) {
00251
00252 msg . clear( );
00253 throw;
00254 }
00255 }
00256
00257
00258
00259 void Read_t::writeRecord (ostream & fix, ostream & var) const
00260 {
00261 Size_t size = bcp_m . size( );
00262 Sequence_t::writeRecord (fix, var);
00263
00264 writeLE (fix, &(clear_m . begin));
00265 writeLE (fix, &(clear_m . end));
00266 writeLE (fix, &frag_m);
00267 writeLE (fix, &(qclear_m . begin));
00268 writeLE (fix, &(qclear_m . end));
00269 fix . put (type_m);
00270 writeLE (fix, &(vclear_m . begin));
00271 writeLE (fix, &(vclear_m . end));
00272 writeLE (fix, &pos_m);
00273 writeLE (fix, &size);
00274
00275 for ( Pos_t i = 0; i < size; i ++ )
00276 writeLE (var, &(bcp_m [i]));
00277 }
00278
00279
00280
00281
00282 ostream & AMOS::operator<< (ostream & out, Read_t & read)
00283 {
00284 string s;
00285
00286 out << "#iid:" << read.getIID( ) << endl;
00287 out << "#comment:" << endl;
00288 out << read.getComment( ) << endl;
00289 out << "#clear:" << read.getClearRange( ).begin << ","
00290 << read.getClearRange( ).end << endl;
00291 out << "#sequence:" << endl;
00292 WrapString (out, read.getSeqString( ), 70);
00293 out << "#quality:" << endl;
00294 WrapString (out, read.getQualString( ), 70);
00295
00296 return out;
00297 }