00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Overlap_AMOS.hh"
00011 using namespace AMOS;
00012 using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Overlap_t::NCODE = M_OVERLAP;
00019
00020
00021
00022 void Overlap_t::flip ( )
00023 {
00024 OverlapAdjacency_t oa = getAdjacency( );
00025 if ( oa == NORMAL )
00026 setAdjacency (ANTINORMAL);
00027 else if ( oa == ANTINORMAL )
00028 setAdjacency (NORMAL);
00029
00030 Size_t tHang = aHang_m;
00031 aHang_m = bHang_m;
00032 bHang_m = tHang;
00033
00034 reads_m = std::make_pair (reads_m . second, reads_m . first);
00035 }
00036
00037
00038
00039 OverlapAdjacency_t Overlap_t::getAdjacency ( ) const
00040 {
00041 if ( flags_m . nibble & ADJACENCY_BIT )
00042 {
00043 switch (flags_m . nibble & ADJACENCY_BITS)
00044 {
00045 case NORMAL_BITS : return NORMAL;
00046 case ANTINORMAL_BITS : return ANTINORMAL;
00047 case INNIE_BITS : return INNIE;
00048 case OUTIE_BITS : return OUTIE;
00049 }
00050 }
00051 return NULL_ADJACENCY;
00052 }
00053
00054
00055
00056 void Overlap_t::readMessage (const Message_t & msg)
00057 {
00058 Universal_t::readMessage (msg);
00059
00060 try {
00061 istringstream ss;
00062
00063 if ( msg . exists (F_READS) )
00064 {
00065 ss . str (msg . getField (F_READS));
00066 ss >> reads_m . first;
00067 ss . ignore( );
00068 ss >> reads_m . second;
00069 if ( !ss )
00070 AMOS_THROW_ARGUMENT ("Invalid nodes format");
00071 ss . clear( );
00072 }
00073
00074 if ( msg . exists (F_ADJACENCY) )
00075 {
00076 ss . str (msg . getField (F_ADJACENCY));
00077 setAdjacency (ss . get( ));
00078 ss . clear( );
00079 }
00080
00081 if ( msg . exists (F_AHANG) )
00082 {
00083 ss . str (msg . getField (F_AHANG));
00084 ss >> aHang_m;
00085 if ( !ss )
00086 AMOS_THROW_ARGUMENT ("Invalid aHang format");
00087 ss . clear( );
00088 }
00089
00090 if ( msg . exists (F_BHANG) )
00091 {
00092 ss . str (msg . getField (F_BHANG));
00093 ss >> bHang_m;
00094 if ( !ss )
00095 AMOS_THROW_ARGUMENT ("Invalid bHang format");
00096 ss . clear( );
00097 }
00098
00099 if ( msg . exists (F_SCORE) )
00100 {
00101 ss . str (msg . getField (F_SCORE));
00102 ss >> score_m;
00103 if ( !ss )
00104 AMOS_THROW_ARGUMENT ("Invalid score format");
00105 ss . clear( );
00106 }
00107
00108 if ( msg . exists (F_FLAG) )
00109 {
00110 char fA, fB, fC;
00111 ss . str (msg . getField (F_FLAG));
00112 ss >> fA >> fB >> fC;
00113 setFlagA ( fA == '1' );
00114 setFlagB ( fB == '1' );
00115 setFlagC ( fC == '1' );
00116 if ( !ss )
00117 AMOS_THROW_ARGUMENT ("Invalid flag format");
00118 ss . clear( );
00119 }
00120 }
00121 catch (ArgumentException_t) {
00122
00123 clear( );
00124 throw;
00125 }
00126 }
00127
00128
00129
00130 void Overlap_t::readRecord (istream & fix, istream & var)
00131 {
00132 Universal_t::readRecord (fix, var);
00133
00134 readLE (fix, &aHang_m);
00135 readLE (fix, &bHang_m);
00136 readLE (fix, &(reads_m . first));
00137 readLE (fix, &(reads_m . second));
00138 readLE (fix, &score_m);
00139 }
00140
00141
00142
00143 void Overlap_t::readRecordFix (istream & fix)
00144 {
00145 Universal_t::readRecordFix (fix);
00146
00147 readLE (fix, &aHang_m);
00148 readLE (fix, &bHang_m);
00149 readLE (fix, &(reads_m . first));
00150 readLE (fix, &(reads_m . second));
00151 readLE (fix, &score_m);
00152 }
00153
00154
00155
00156 void Overlap_t::setAdjacency (OverlapAdjacency_t adj)
00157 {
00158 uint8_t bits = flags_m . nibble;
00159 flags_m . nibble &= ~ADJACENCY_BITS;
00160 flags_m . nibble |= ADJACENCY_BIT;
00161
00162 switch (adj)
00163 {
00164 case NORMAL : flags_m . nibble |= NORMAL_BITS; break;
00165 case ANTINORMAL : flags_m . nibble |= ANTINORMAL_BITS; break;
00166 case INNIE : flags_m . nibble |= INNIE_BITS; break;
00167 case OUTIE : flags_m . nibble |= OUTIE_BITS; break;
00168 case NULL_ADJACENCY:
00169 flags_m . nibble &= ~ADJACENCY_BIT;
00170 break;
00171 default:
00172 flags_m . nibble = bits;
00173 AMOS_THROW_ARGUMENT ((string)"Invalid adjacency " + adj);
00174 }
00175 }
00176
00177
00178
00179 void Overlap_t::writeMessage (Message_t & msg) const
00180 {
00181 Universal_t::writeMessage (msg);
00182
00183 try {
00184 ostringstream ss;
00185
00186 msg . setMessageCode (Overlap_t::NCODE);
00187
00188 if ( reads_m . first != NULL_ID || reads_m . second != NULL_ID )
00189 {
00190 ss << reads_m . first << ',' << reads_m . second;
00191 msg . setField (F_READS, ss . str( ));
00192 ss . str (NULL_STRING);
00193 }
00194
00195 if ( getAdjacency( ) != NULL_ADJACENCY )
00196 {
00197 ss << getAdjacency( );
00198 msg . setField (F_ADJACENCY, ss . str( ));
00199 ss . str (NULL_STRING);
00200 }
00201
00202 ss << aHang_m;
00203 msg . setField (F_AHANG, ss . str( ));
00204 ss . str (NULL_STRING);
00205
00206 ss << bHang_m;
00207 msg . setField (F_BHANG, ss . str( ));
00208 ss . str (NULL_STRING);
00209
00210 ss << score_m;
00211 msg . setField (F_SCORE, ss . str( ));
00212 ss . str (NULL_STRING);
00213
00214 if ( isFlagA( ) || isFlagB( ) || isFlagC( ) )
00215 {
00216 ss << isFlagA( ) << isFlagB( ) << isFlagC( );
00217 msg . setField (F_FLAG, ss . str( ));
00218 ss . str (NULL_STRING);
00219 }
00220 }
00221 catch (ArgumentException_t) {
00222
00223 msg . clear( );
00224 throw;
00225 }
00226 }
00227
00228
00229
00230 void Overlap_t::writeRecord (ostream & fix, ostream & var) const
00231 {
00232 Universal_t::writeRecord (fix, var);
00233
00234 writeLE (fix, &aHang_m);
00235 writeLE (fix, &bHang_m);
00236 writeLE (fix, &(reads_m . first));
00237 writeLE (fix, &(reads_m . second));
00238 writeLE (fix, &score_m);
00239 }