00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include "Fragment_AMOS.hh"
00011
using namespace AMOS;
00012
using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Fragment_t::NCODE =
M_FRAGMENT;
00019 const FragmentType_t Fragment_t::NULL_FRAGMENT = 0;
00020 const FragmentType_t Fragment_t::OTHER =
'X';
00021 const FragmentType_t Fragment_t::BAC =
'B';
00022 const FragmentType_t Fragment_t::INSERT =
'I';
00023 const FragmentType_t Fragment_t::TRANSPOSON =
'T';
00024 const FragmentType_t Fragment_t::WALK =
'W';
00025
00026
00027
00028 void Fragment_t::clear ( )
00029 {
00030
Universal_t::clear( );
00031 size_m = 0;
00032 library_m = source_m . first = reads_m . first = reads_m . second =
NULL_ID;
00033 source_m . second =
NULL_NCODE;
00034 type_m =
NULL_FRAGMENT;
00035 }
00036
00037
00038
00039 void Fragment_t::readMessage (
const Message_t & msg)
00040 {
00041
Universal_t::readMessage (msg);
00042
00043
try {
00044 istringstream ss;
00045
00046
if ( msg . exists (
F_LIBRARY) )
00047 {
00048 ss . str (msg . getField (
F_LIBRARY));
00049 ss >> library_m;
00050
if ( !ss )
00051
AMOS_THROW_ARGUMENT (
"Invalid library link format");
00052 ss .
clear( );
00053 }
00054
00055
if ( msg . exists (
F_SIZE) )
00056 {
00057 ss . str (msg . getField (
F_SIZE));
00058 ss >> size_m;
00059
if ( !ss )
00060
AMOS_THROW_ARGUMENT (
"Invalid size format");
00061 ss .
clear( );
00062 }
00063
00064
if ( msg . exists (
F_SOURCE) )
00065 {
00066 string str;
00067
00068 ss . str (msg . getField (
F_SOURCE));
00069 ss >> source_m . first;
00070 ss . ignore ( );
00071 ss >> str;
00072
if ( !ss || str . length( ) !=
NCODE_SIZE )
00073
AMOS_THROW_ARGUMENT (
"Invalid source format");
00074 ss .
clear( );
00075 source_m . second =
Encode (str);
00076 }
00077
00078
if ( msg . exists (
F_READS) )
00079 {
00080 ss . str (msg . getField (
F_READS));
00081 ss >> reads_m . first;
00082 ss . ignore( );
00083 ss >> reads_m . second;
00084
if ( !ss )
00085
AMOS_THROW_ARGUMENT (
"Invalid nodes format");
00086 ss .
clear( );
00087 }
00088
00089
if ( msg . exists (
F_TYPE) )
00090 {
00091 ss . str (msg . getField (
F_TYPE));
00092
setType (ss . get( ));
00093 ss .
clear( );
00094 }
00095 }
00096
catch (
ArgumentException_t) {
00097
00098
clear( );
00099
throw;
00100 }
00101 }
00102
00103
00104
00105 void Fragment_t::readRecord (istream & fix, istream & var)
00106 {
00107
Universal_t::readRecord (fix, var);
00108
00109
readLE (fix, &library_m);
00110
readLE (fix, &size_m);
00111
readLE (fix, &(source_m . first));
00112
readLE (fix, &(source_m . second));
00113
readLE (fix, &(reads_m . first));
00114
readLE (fix, &(reads_m . second));
00115 type_m = fix . get( );
00116 }
00117
00118
00119
00120 void Fragment_t::setType (
FragmentType_t type)
00121 {
00122
switch (type)
00123 {
00124
case NULL_FRAGMENT:
00125
case OTHER:
00126
case BAC:
00127
case INSERT:
00128
case TRANSPOSON:
00129
case WALK:
00130 type_m = type;
00131
break;
00132
default:
00133
AMOS_THROW_ARGUMENT ((string)
"Invalid fragment type " + type);
00134 }
00135 }
00136
00137
00138
00139 void Fragment_t::writeMessage (
Message_t & msg)
const
00140
{
00141
Universal_t::writeMessage (msg);
00142
00143
try {
00144 ostringstream ss;
00145
00146 msg . setMessageCode (Fragment_t::NCODE);
00147
00148
if ( library_m !=
NULL_ID )
00149 {
00150 ss << library_m;
00151 msg . setField (
F_LIBRARY, ss . str( ));
00152 ss . str (
NULL_STRING);
00153 }
00154
00155
if ( size_m != 0 )
00156 {
00157 ss << size_m;
00158 msg . setField (
F_SIZE, ss . str( ));
00159 ss .str (
NULL_STRING);
00160 }
00161
00162
if ( source_m . first !=
NULL_ID || source_m . second !=
NULL_NCODE )
00163 {
00164 ss << source_m . first <<
',' <<
Decode (source_m . second);
00165 msg . setField (
F_SOURCE, ss . str( ));
00166 ss . str (
NULL_STRING);
00167 }
00168
00169
if ( reads_m . first !=
NULL_ID || reads_m . second !=
NULL_ID )
00170 {
00171 ss << reads_m . first <<
',' << reads_m . second;
00172 msg . setField (
F_READS, ss . str( ));
00173 ss . str (
NULL_STRING);
00174 }
00175
00176
if ( type_m !=
NULL_FRAGMENT )
00177 {
00178 ss << type_m;
00179 msg . setField (
F_TYPE, ss . str( ));
00180 ss . str (
NULL_STRING);
00181 }
00182 }
00183
catch (
ArgumentException_t) {
00184
00185 msg .
clear( );
00186
throw;
00187 }
00188 }
00189
00190
00191
00192 void Fragment_t::writeRecord (ostream & fix, ostream & var)
const
00193
{
00194
Universal_t::writeRecord (fix, var);
00195
00196
writeLE (fix, &library_m);
00197
writeLE (fix, &size_m);
00198
writeLE (fix, &(source_m . first));
00199
writeLE (fix, &(source_m . second));
00200
writeLE (fix, &(reads_m . first));
00201
writeLE (fix, &(reads_m . second));
00202 fix . put (type_m);
00203 }