00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include "Link_AMOS.hh"
00011
using namespace AMOS;
00012
using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Link_t::NCODE =
M_LINK;
00019 const LinkType_t Link_t::NULL_LINK = 0;
00020 const LinkType_t Link_t::OTHER =
'X';
00021 const LinkType_t Link_t::MATEPAIR =
'M';
00022 const LinkType_t Link_t::OVERLAP =
'O';
00023 const LinkType_t Link_t::PHYSICAL =
'P';
00024 const LinkType_t Link_t::ALIGNMENT =
'A';
00025 const LinkType_t Link_t::SYNTENY =
'S';
00026 const LinkAdjacency_t Link_t::NULL_ADJACENCY = 0;
00027 const LinkAdjacency_t Link_t::NORMAL =
'N';
00028 const LinkAdjacency_t Link_t::ANTINORMAL =
'A';
00029 const LinkAdjacency_t Link_t::INNIE =
'I';
00030 const LinkAdjacency_t Link_t::OUTIE =
'O';
00031
00032
00033
00034 void Link_t::clear ( )
00035 {
00036
Universal_t::clear( );
00037 nods_m . first = nods_m . second = source_m . first =
NULL_ID;
00038 source_m . second =
NULL_NCODE;
00039 nodtype_m =
NULL_NCODE;
00040 sd_m = size_m = 0;
00041 type_m =
NULL_LINK;
00042 }
00043
00044
00045
00046 void Link_t::flip ( )
00047 {
00048
LinkAdjacency_t la =
getAdjacency( );
00049
if ( la ==
NORMAL )
00050
setAdjacency (
ANTINORMAL);
00051
else if ( la ==
ANTINORMAL )
00052
setAdjacency (
NORMAL);
00053
00054 nods_m = std::make_pair (nods_m . second, nods_m . first);
00055 }
00056
00057
00058
00059 LinkAdjacency_t Link_t::getAdjacency ( )
const
00060
{
00061
if ( flags_m . nibble &
ADJACENCY_BIT )
00062 {
00063
switch (flags_m . nibble &
ADJACENCY_BITS)
00064 {
00065
case NORMAL_BITS :
return NORMAL;
00066
case ANTINORMAL_BITS :
return ANTINORMAL;
00067
case INNIE_BITS :
return INNIE;
00068
case OUTIE_BITS :
return OUTIE;
00069 }
00070 }
00071
return NULL_ADJACENCY;
00072 }
00073
00074
00075
00076 void Link_t::readMessage (
const Message_t & msg)
00077 {
00078
Universal_t::readMessage (msg);
00079
00080
try {
00081
00082 istringstream ss;
00083
00084
if ( msg . exists (
F_NODES) )
00085 {
00086 ss . str (msg . getField (
F_NODES));
00087 ss >> nods_m . first;
00088 ss . ignore( );
00089 ss >> nods_m . second;
00090
if ( !ss )
00091
AMOS_THROW_ARGUMENT (
"Invalid nodes format");
00092 ss .
clear( );
00093 }
00094
00095
if ( msg . exists (
F_OBJECT) )
00096 {
00097 string str;
00098
00099 ss . str (msg . getField (
F_OBJECT));
00100 ss >> str;
00101
if ( !ss || str . length( ) !=
NCODE_SIZE )
00102
AMOS_THROW_ARGUMENT (
"Invalid object type format");
00103 ss .
clear( );
00104 nodtype_m =
Encode (str);
00105 }
00106
00107
if ( msg . exists (
F_ADJACENCY) )
00108 {
00109 ss . str (msg . getField (
F_ADJACENCY));
00110
setAdjacency (ss . get( ));
00111 ss .
clear( );
00112 }
00113
00114
if ( msg . exists (
F_SD) )
00115 {
00116 ss . str (msg . getField (
F_SD));
00117 ss >> sd_m;
00118
if ( !ss )
00119
AMOS_THROW_ARGUMENT (
"Invalid standard deviation format");
00120 ss .
clear( );
00121 }
00122
00123
if ( msg . exists (
F_SIZE) )
00124 {
00125 ss . str (msg . getField (
F_SIZE));
00126 ss >> size_m;
00127
if ( !ss )
00128
AMOS_THROW_ARGUMENT (
"Invalid size format");
00129 ss .
clear( );
00130 }
00131
00132
if ( msg . exists (
F_TYPE) )
00133 {
00134 ss . str (msg . getField (
F_TYPE));
00135
setType (ss . get( ));
00136 ss .
clear( );
00137 }
00138
00139
if ( msg . exists (
F_SOURCE) )
00140 {
00141 string str;
00142
00143 ss . str (msg . getField (
F_SOURCE));
00144 ss >> source_m . first;
00145 ss . ignore( );
00146 ss >> str;
00147
if ( !ss || str . length( ) !=
NCODE_SIZE )
00148
AMOS_THROW_ARGUMENT (
"Invalid source format");
00149 ss .
clear( );
00150 source_m . second =
Encode (str);
00151 }
00152 }
00153
catch (
ArgumentException_t) {
00154
00155
clear( );
00156
throw;
00157 }
00158 }
00159
00160
00161
00162 void Link_t::readRecord (istream & fix, istream & var)
00163 {
00164
Universal_t::readRecord (fix, var);
00165
00166
readLE (fix, &(nods_m . first));
00167
readLE (fix, &(nods_m . second));
00168
readLE (fix, &nodtype_m);
00169
readLE (fix, &sd_m);
00170
readLE (fix, &size_m);
00171
readLE (fix, &(source_m . first));
00172
readLE (fix, &(source_m . second));
00173 fix . get (type_m);
00174 }
00175
00176
00177
00178 void Link_t::setAdjacency (
LinkAdjacency_t adj)
00179 {
00180 uint8_t bits = flags_m . nibble;
00181 flags_m . nibble &= ~
ADJACENCY_BITS;
00182 flags_m . nibble |=
ADJACENCY_BIT;
00183
00184
switch (adj)
00185 {
00186
case NORMAL : flags_m . nibble |=
NORMAL_BITS;
break;
00187
case ANTINORMAL : flags_m . nibble |=
ANTINORMAL_BITS;
break;
00188
case INNIE : flags_m . nibble |=
INNIE_BITS;
break;
00189
case OUTIE : flags_m . nibble |=
OUTIE_BITS;
break;
00190
case NULL_ADJACENCY:
00191 flags_m . nibble &= ~
ADJACENCY_BIT;
00192
break;
00193
default:
00194 flags_m . nibble = bits;
00195
AMOS_THROW_ARGUMENT ((string)
"Invalid adjacency " + adj);
00196 }
00197 }
00198
00199
00200
00201 void Link_t::setType (
LinkType_t type)
00202 {
00203
switch (type)
00204 {
00205
case NULL_LINK:
00206
case OTHER:
00207
case MATEPAIR:
00208
case OVERLAP:
00209
case PHYSICAL:
00210
case ALIGNMENT:
00211
case SYNTENY:
00212 type_m = type;
00213
break;
00214
default:
00215
AMOS_THROW_ARGUMENT ((string)
"Invalid contig link type " + type);
00216 }
00217 type_m = type;
00218 }
00219
00220
00221
00222 void Link_t::writeMessage (
Message_t & msg)
const
00223
{
00224
Universal_t::writeMessage (msg);
00225
00226
try {
00227 ostringstream ss;
00228
00229 msg . setMessageCode (Link_t::NCODE);
00230
00231
if ( nods_m . first !=
NULL_ID || nods_m . second !=
NULL_ID )
00232 {
00233 ss << nods_m . first <<
',' << nods_m . second;
00234 msg . setField (
F_NODES, ss . str( ));
00235 ss . str (
NULL_STRING);
00236 }
00237
00238
if ( nodtype_m !=
NULL_NCODE )
00239 {
00240 msg . setField (
F_OBJECT,
Decode (nodtype_m));
00241 ss . str (
NULL_STRING);
00242 }
00243
00244
if (
getAdjacency( ) !=
NULL_ADJACENCY )
00245 {
00246 ss <<
getAdjacency( );
00247 msg . setField (
F_ADJACENCY, ss . str( ));
00248 ss . str (
NULL_STRING);
00249 }
00250
00251 ss << sd_m;
00252 msg . setField (
F_SD, ss . str( ));
00253 ss . str (
NULL_STRING);
00254
00255 ss << size_m;
00256 msg . setField (
F_SIZE, ss . str( ));
00257 ss . str (
NULL_STRING);
00258
00259
if ( type_m !=
NULL_LINK )
00260 {
00261 ss << type_m;
00262 msg . setField (
F_TYPE, ss . str( ));
00263 ss . str (
NULL_STRING);
00264 }
00265
00266
if ( source_m . first !=
NULL_ID || source_m . second !=
NULL_NCODE )
00267 {
00268 ss << source_m . first <<
',' <<
Decode (source_m . second);
00269 msg . setField (
F_SOURCE, ss . str( ));
00270 ss . str (
NULL_STRING);
00271 }
00272 }
00273
catch (
ArgumentException_t) {
00274
00275 msg .
clear( );
00276
throw;
00277 }
00278 }
00279
00280
00281
00282 void Link_t::writeRecord (ostream & fix, ostream & var)
const
00283
{
00284
Universal_t::writeRecord (fix, var);
00285
00286
writeLE (fix, &(nods_m . first));
00287
writeLE (fix, &(nods_m . second));
00288
writeLE (fix, &nodtype_m);
00289
writeLE (fix, &sd_m);
00290
writeLE (fix, &size_m);
00291
writeLE (fix, &(source_m . first));
00292
writeLE (fix, &(source_m . second));
00293 fix . put (type_m);
00294 }