00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include "Index_AMOS.hh"
00011
using namespace AMOS;
00012
using namespace std;
00013
00014
00015
00016
00017
00018 const NCode_t Index_t::NCODE =
M_INDEX;
00019
00020
00021
00022 void Index_t::buildContigFeature (
const std::string bankname)
00023 {
00024
clear( );
00025
setType (Contig_t::NCODE, Feature_t::NCODE);
00026
00027
Feature_t fea;
00028 pair<NCode_t, ID_t> src;
00029
BankStream_t fea_bank (Feature_t::NCODE);
00030
00031 fea_bank . open (bankname,
B_READ);
00032
00033
while ( fea_bank >> fea )
00034 {
00035 src = fea . getSource( );
00036
if ( src . first !=
NULL_ID && src . second == Contig_t::NCODE )
00037
insert (src . first, fea .
getIID( ));
00038 }
00039
00040 fea_bank . close( );
00041 }
00042
00043
00044
00045 void Index_t::buildContigScaffold (
const std::string bankname)
00046 {
00047
clear( );
00048
setType (Contig_t::NCODE, Scaffold_t::NCODE);
00049
00050
Scaffold_t scf;
00051 vector<Tile_t>
::const_iterator cur;
00052 vector<Tile_t>
::const_iterator end;
00053
BankStream_t scf_bank (Scaffold_t::NCODE);
00054
00055 scf_bank . open (bankname,
B_READ);
00056
00057
while ( scf_bank >> scf )
00058 {
00059 end = scf . getContigTiling( ) .
end( );
00060
if ( scf .
getIID( ) !=
NULL_ID )
00061
for ( cur = scf . getContigTiling( ) .
begin( ); cur != end; ++ cur )
00062
if ( cur -> source !=
NULL_ID )
00063
insert (cur -> source, scf .
getIID( ));
00064 }
00065
00066 scf_bank . close( );
00067 }
00068
00069
00070
00071 void Index_t::buildReadContig (
const std::string bankname)
00072 {
00073
clear( );
00074
setType (Read_t::NCODE, Contig_t::NCODE);
00075
00076
Contig_t ctg;
00077 vector<Tile_t>
::const_iterator cur;
00078 vector<Tile_t>
::const_iterator end;
00079
BankStream_t ctg_bank (Contig_t::NCODE);
00080
00081 ctg_bank . open (bankname,
B_READ);
00082
00083
while ( ctg_bank >> ctg )
00084 {
00085 end = ctg . getReadTiling( ) .
end( );
00086
if ( ctg .
getIID( ) !=
NULL_ID )
00087
for ( cur = ctg . getReadTiling( ) .
begin( ); cur != end; ++ cur )
00088
if ( cur -> source !=
NULL_ID )
00089
insert (cur -> source, ctg .
getIID( ));
00090 }
00091
00092 ctg_bank . close( );
00093 }
00094
00095
00096
00097 void Index_t::buildReadLibrary (
const std::string bankname)
00098 {
00099
clear( );
00100
setType (Read_t::NCODE, Library_t::NCODE);
00101
00102
Read_t red;
00103
Fragment_t frg;
00104
Bank_t frg_bank (Fragment_t::NCODE);
00105
BankStream_t red_bank (Read_t::NCODE);
00106
00107 frg_bank . open (bankname,
B_READ);
00108 red_bank . open (bankname,
B_READ);
00109
00110
while ( red_bank >> red )
00111 {
00112 frg_bank . fetch (red . getFragment( ), frg);
00113
if ( red .
getIID( ) !=
NULL_ID && frg . getLibrary( ) !=
NULL_ID )
00114
insert (red .
getIID( ), frg . getLibrary( ));
00115 }
00116
00117 frg_bank . close( );
00118 red_bank . close( );
00119 }
00120
00121
00122
00123 void Index_t::buildReadMate (
const std::string bankname)
00124 {
00125
clear( );
00126
setType (Read_t::NCODE, Read_t::NCODE);
00127
00128
Fragment_t frg;
00129 pair<ID_t, ID_t> mtp;
00130
BankStream_t frg_bank (Fragment_t::NCODE);
00131
00132
while ( frg_bank >> frg )
00133 {
00134 mtp = frg . getMatePair( );
00135
if ( mtp . first !=
NULL_ID && mtp . second !=
NULL_ID )
00136 {
00137
insert (mtp . first, mtp . second);
00138
insert (mtp . second, mtp . first);
00139 }
00140 }
00141
00142 frg_bank . close( );
00143 }
00144
00145
00146
00147 void Index_t::buildScaffoldFeature (
const std::string bankname)
00148 {
00149
clear( );
00150
setType (Scaffold_t::NCODE, Feature_t::NCODE);
00151
00152
Feature_t fea;
00153 pair<NCode_t, ID_t> src;
00154
BankStream_t fea_bank (Feature_t::NCODE);
00155
00156 fea_bank . open (bankname,
B_READ);
00157
00158
while ( fea_bank >> fea )
00159 {
00160 src = fea . getSource( );
00161
if ( src . first !=
NULL_ID && src . second == Scaffold_t::NCODE )
00162
insert (src . first, fea .
getIID( ));
00163 }
00164
00165 fea_bank . close( );
00166 }
00167
00168
00169
00170 void Index_t::readMessage (
const Message_t & msg)
00171 {
00172
Universal_t::readMessage (msg);
00173
00174
try {
00175
Size_t size = -1;
00176 istringstream ss;
00177
00178
if ( msg . exists (
F_OBJECT) )
00179 {
00180 string str = msg . getField (
F_OBJECT);
00181
00182
if ( str . length( ) !=
NCODE_SIZE +
NCODE_SIZE + 1 )
00183
AMOS_THROW_ARGUMENT (
"Invalid object type format");
00184
00185 type_m . first =
Encode (str.substr (0,
NCODE_SIZE));
00186 type_m . second =
Encode (str.substr (
NCODE_SIZE + 1));
00187 }
00188
00189
if ( msg . exists (
F_SIZE) )
00190 {
00191 ss . str (msg . getField (
F_SIZE));
00192 ss >> size;
00193
if ( !ss )
00194
AMOS_THROW_ARGUMENT (
"Invalid size format");
00195 index_m . resize (size);
00196
00197 ss .
clear( );
00198 }
00199
00200
if ( msg . exists (
F_MAP) )
00201 {
00202 pair<ID_t, ID_t> iids;
00203 ss . str (msg . getField (
F_MAP));
00204
00205
while ( ss )
00206 {
00207 ss >> iids . first >> iids . second;
00208
if ( ! ss . fail( ) )
00209
insert (iids);
00210 }
00211
00212
if ( ! ss . eof( ) )
00213
AMOS_THROW_ARGUMENT (
"Invalid map format");
00214
00215
if ( size >= 0 && size !=
getSize( ) )
00216
AMOS_THROW_ARGUMENT (
"map and size fields do not agree");
00217
00218 ss .
clear( );
00219 }
00220 }
00221
catch (
ArgumentException_t) {
00222
00223
clear( );
00224
throw;
00225 }
00226 }
00227
00228
00229
00230 void Index_t::readRecord (istream & fix, istream & var)
00231 {
00232
Universal_t::readRecord (fix, var);
00233
00234
Size_t size;
00235
readLE (fix, &size);
00236
readLE (fix, &(type_m . first));
00237
readLE (fix, &(type_m . second));
00238
00239 pair<ID_t, ID_t> iids;
00240 index_m .
clear( );
00241 index_m . resize (size);
00242
for (
Pos_t i = 0; i < size; ++ i )
00243 {
00244
readLE (var, &(iids . first));
00245
readLE (var, &(iids . second));
00246
insert (iids);
00247 }
00248 }
00249
00250
00251
00252 void Index_t::writeMessage (
Message_t & msg)
const
00253
{
00254
Universal_t::writeMessage (msg);
00255
00256
try {
00257
Size_t size =
getSize( );
00258 ostringstream ss;
00259
00260 msg . setMessageCode (Index_t::NCODE);
00261
00262
if ( type_m . first !=
NULL_NCODE || type_m . second !=
NULL_NCODE )
00263 {
00264 ss <<
Decode (type_m . first) <<
',' <<
Decode (type_m . second);
00265 msg . setField (
F_OBJECT, ss . str( ));
00266 ss . str (
NULL_STRING);
00267 }
00268
00269
if ( size != 0 )
00270 {
00271 ss << size;
00272 msg . setField (
F_SIZE, ss . str( ));
00273 ss . str (
NULL_STRING);
00274
00275 string str;
00276
for (
const_iterator itr =
begin( ); itr !=
end( ); ++ itr )
00277 {
00278 ss << itr -> first <<
'\t' << itr -> second;
00279 str . append (ss . str( ));
00280 str . push_back (
NL_CHAR);
00281 ss . str (
NULL_STRING);
00282 }
00283
00284 msg . setField (
F_MAP, str);
00285 }
00286 }
00287
catch (
ArgumentException_t) {
00288
00289 msg .
clear( );
00290
throw;
00291 }
00292 }
00293
00294
00295
00296 void Index_t::writeRecord (ostream & fix, ostream & var)
const
00297
{
00298
Universal_t::writeRecord (fix, var);
00299
00300
Size_t size =
getSize( );
00301
writeLE (fix, &size);
00302
writeLE (fix, &(type_m . first));
00303
writeLE (fix, &(type_m . second));
00304
00305
for (
const_iterator itr =
begin( ); itr !=
end( ); ++ itr )
00306 {
00307
writeLE (var, &(itr -> first));
00308
writeLE (var, &(itr -> second));
00309 }
00310 }