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