00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "bamFile.h"
00016 #include "config_pgraph.h"
00017
00018 #include "bam.h"
00019 #include "bamCacheRecord.h"
00020 #include "config_util.h"
00021 #include "bamReader.h"
00022 #include "bamWriter.h"
00023 #include "filename.h"
00024 #include "config_express.h"
00025 #include "virtualFileSystem.h"
00026 #include "dcast.h"
00027
00028
00029
00030
00031
00032
00033 BamFile::
00034 BamFile() {
00035 _reader = NULL;
00036 _writer = NULL;
00037 }
00038
00039
00040
00041
00042
00043
00044 BamFile::
00045 ~BamFile() {
00046 close();
00047 }
00048
00049
00050
00051
00052
00053
00054
00055 bool BamFile::
00056 open_read(const Filename &bam_filename, bool report_errors) {
00057 close();
00058
00059 if (!_din.open(bam_filename)) {
00060 return false;
00061 }
00062
00063 loader_cat.info()
00064 << "Reading " << bam_filename << "\n";
00065
00066 return continue_open_read(bam_filename, report_errors);
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076 bool BamFile::
00077 open_read(istream &in, const string &bam_filename, bool report_errors) {
00078 close();
00079
00080 if (!_din.open(in)) {
00081 return false;
00082 }
00083
00084 return continue_open_read(bam_filename, report_errors);
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 TypedWritable *BamFile::
00099 read_object() {
00100 if (_reader == (BamReader *)NULL) {
00101 return NULL;
00102 }
00103
00104 return _reader->read_object();
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114 bool BamFile::
00115 is_eof() const {
00116 return _reader != (BamReader *)NULL && _reader->is_eof();
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 bool BamFile::
00131 resolve() {
00132 if (_reader == (BamReader *)NULL) {
00133 return false;
00134 }
00135
00136 return _reader->resolve();
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 PT(PandaNode) BamFile::
00161 read_node(bool report_errors) {
00162 PT(PandaNode) result;
00163
00164 TypedWritable *object = read_object();
00165
00166 if (object != (TypedWritable *)NULL &&
00167 object->is_exact_type(BamCacheRecord::get_class_type())) {
00168
00169
00170
00171
00172 object = read_object();
00173 }
00174
00175 if (object == TypedWritable::Null) {
00176 if (report_errors) {
00177 loader_cat.error() << "Bam file " << _bam_filename << " is empty.\n";
00178 }
00179
00180 } else if (!object->is_of_type(PandaNode::get_class_type())) {
00181 if (report_errors) {
00182 loader_cat.error()
00183 << "Bam file " << _bam_filename
00184 << " contains a " << object->get_type() << ", not a PandaNode.\n";
00185 }
00186
00187 } else {
00188 result = DCAST(PandaNode, object);
00189
00190 if (report_errors) {
00191 read_object();
00192 if (!is_eof()) {
00193 loader_cat.warning()
00194 << "Ignoring extra objects in " << _bam_filename << "\n";
00195 }
00196 }
00197 }
00198
00199 if (!resolve()) {
00200 if (report_errors) {
00201 loader_cat.error()
00202 << "Unable to resolve Bam file.\n";
00203 }
00204 result = (PandaNode *)NULL;
00205 }
00206
00207 return result;
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219 bool BamFile::
00220 open_write(const Filename &bam_filename, bool report_errors) {
00221 close();
00222
00223 loader_cat.info() << "Writing " << bam_filename << "\n";
00224
00225 bam_filename.unlink();
00226 if (!_dout.open(bam_filename)) {
00227 if (report_errors) {
00228 loader_cat.error() << "Unable to open " << bam_filename << "\n";
00229 }
00230 return false;
00231 }
00232
00233 return continue_open_write(bam_filename, report_errors);
00234 }
00235
00236
00237
00238
00239
00240
00241
00242
00243 bool BamFile::
00244 open_write(ostream &out, const string &bam_filename, bool report_errors) {
00245 close();
00246
00247 if (!_dout.open(out)) {
00248 loader_cat.error() << "Could not write bam: " << bam_filename << "\n";
00249 return false;
00250 }
00251
00252 return continue_open_write(bam_filename, report_errors);
00253 }
00254
00255
00256
00257
00258
00259
00260
00261 bool BamFile::
00262 write_object(const TypedWritable *object) {
00263 if (_writer == (BamWriter *)NULL) {
00264 return false;
00265 }
00266
00267 if (!_writer->write_object(object)) {
00268 close();
00269 return false;
00270 }
00271
00272 return true;
00273 }
00274
00275
00276
00277
00278
00279
00280 void BamFile::
00281 close() {
00282 if (_reader != (BamReader *)NULL) {
00283
00284 delete _reader;
00285 _reader = NULL;
00286 }
00287 if (_writer != (BamWriter *)NULL) {
00288 delete _writer;
00289 _writer = NULL;
00290 }
00291 _din.close();
00292 _dout.close();
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 int BamFile::
00305 get_file_major_ver() {
00306 if (_reader == (BamReader *)NULL) {
00307 return _bam_major_ver;
00308 }
00309 return _reader->get_file_major_ver();
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 int BamFile::
00321 get_file_minor_ver() {
00322 if (_reader == (BamReader *)NULL) {
00323 return _bam_minor_ver;
00324 }
00325 return _reader->get_file_minor_ver();
00326 }
00327
00328
00329
00330
00331
00332
00333
00334 BamFile::BamEndian BamFile::
00335 get_file_endian() const {
00336 if (_writer != (BamWriter *)NULL) {
00337 return _writer->get_file_endian();
00338 }
00339 if (_reader != (BamReader *)NULL) {
00340 return _reader->get_file_endian();
00341 }
00342
00343 return bam_endian;
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353 int BamFile::
00354 get_current_major_ver() {
00355 return _bam_major_ver;
00356 }
00357
00358
00359
00360
00361
00362
00363
00364
00365 int BamFile::
00366 get_current_minor_ver() {
00367 return _bam_minor_ver;
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377 BamReader *BamFile::
00378 get_reader() {
00379 return _reader;
00380 }
00381
00382
00383
00384
00385
00386
00387
00388
00389 BamWriter *BamFile::
00390 get_writer() {
00391 return _writer;
00392 }
00393
00394
00395
00396
00397
00398
00399
00400
00401 bool BamFile::
00402 continue_open_read(const string &bam_filename, bool report_errors) {
00403 _bam_filename = bam_filename;
00404
00405 string head;
00406 if (!_din.read_header(head, _bam_header.size())) {
00407 if (report_errors) {
00408 loader_cat.error() << _bam_filename << " is not a valid BAM file.\n";
00409 }
00410 return false;
00411 }
00412
00413 if (head != _bam_header) {
00414 if (report_errors) {
00415 loader_cat.error() << _bam_filename << " is not a valid BAM file.\n";
00416 }
00417 return false;
00418 }
00419
00420 _reader = new BamReader(&_din, _bam_filename);
00421 if (!_reader->init()) {
00422 close();
00423 return false;
00424 }
00425
00426 return true;
00427 }
00428
00429
00430
00431
00432
00433
00434
00435
00436 bool BamFile::
00437 continue_open_write(const string &bam_filename, bool report_errors) {
00438 _bam_filename = bam_filename;
00439
00440 if (!_dout.write_header(_bam_header)) {
00441 if (report_errors) {
00442 loader_cat.error() << "Unable to write to " << _bam_filename << "\n";
00443 }
00444 return false;
00445 }
00446
00447 _writer = new BamWriter(&_dout, _bam_filename);
00448
00449 if (!_writer->init()) {
00450 close();
00451 return false;
00452 }
00453
00454 return true;
00455 }