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