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