00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "FWCore/FWLite/interface/BranchMapReader.h"
00017
00018 #include "DataFormats/Provenance/interface/BranchIDList.h"
00019 #include "DataFormats/Provenance/interface/BranchListIndex.h"
00020 #include "DataFormats/Provenance/interface/BranchType.h"
00021 #include "DataFormats/Provenance/interface/EventEntryInfo.h"
00022 #include "DataFormats/Provenance/interface/EventSelectionID.h"
00023 #include "DataFormats/Provenance/interface/FileFormatVersion.h"
00024 #include "DataFormats/Provenance/interface/History.h"
00025 #include "DataFormats/Provenance/interface/ProductIDToBranchID.h"
00026 #include "DataFormats/Provenance/interface/ProductRegistry.h"
00027 #include "FWCore/Utilities/interface/EDMException.h"
00028
00029 #include "TBranch.h"
00030 #include "TFile.h"
00031 #include "TTree.h"
00032
00033 namespace fwlite {
00034 namespace internal {
00035
00036 static const edm::BranchDescription kDefaultBranchDescription;
00037
00038 BMRStrategy::BMRStrategy(TFile* file, int fileVersion)
00039 : currentFile_(file), eventTree_(0), luminosityBlockTree_(0), runTree_(0),
00040 eventEntry_(-1), luminosityBlockEntry_(-1), runEntry_(-1), fileVersion_(fileVersion) {
00041
00042
00043 }
00044
00045 BMRStrategy::~BMRStrategy() {
00046 }
00047
00048 class Strategy : public BMRStrategy {
00049 public:
00050 typedef std::map<edm::BranchID, edm::BranchDescription> bidToDesc;
00051
00052 Strategy(TFile* file, int fileVersion);
00053 virtual ~Strategy();
00054 virtual bool updateFile(TFile* file);
00055 virtual bool updateEvent(Long_t eventEntry) { eventEntry_ = eventEntry; return true; }
00056 virtual bool updateLuminosityBlock(Long_t luminosityBlockEntry) {
00057 luminosityBlockEntry_ = luminosityBlockEntry;
00058 return true;
00059 }
00060 virtual bool updateRun(Long_t runEntry) {
00061 runEntry_ = runEntry;
00062 return true;
00063 }
00064 virtual bool updateMap() { return true; }
00065 virtual edm::BranchID productToBranchID(edm::ProductID const& pid);
00066 virtual edm::BranchDescription const& productToBranch(edm::ProductID const& pid);
00067 virtual std::vector<edm::BranchDescription> const& getBranchDescriptions();
00068
00069 TBranch* getBranchRegistry(edm::ProductRegistry** pReg);
00070
00071 bidToDesc branchDescriptionMap_;
00072 std::vector<edm::BranchDescription> bDesc_;
00073 bool mapperFilled_;
00074 };
00075
00076 Strategy::Strategy(TFile* file, int fileVersion)
00077 : BMRStrategy(file, fileVersion), mapperFilled_(false) {
00078
00079
00080 }
00081
00082 Strategy::~Strategy() {
00083
00084 }
00085
00086 bool Strategy::updateFile(TFile* file) {
00087 currentFile_ = file;
00088 eventTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventTreeName().c_str()));
00089 luminosityBlockTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::luminosityBlockTreeName().c_str()));
00090 runTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::runTreeName().c_str()));
00091 fileUUID_ = currentFile_->GetUUID();
00092 branchDescriptionMap_.clear();
00093 bDesc_.clear();
00094 return 0 != eventTree_;
00095 }
00096
00097 TBranch* Strategy::getBranchRegistry(edm::ProductRegistry** ppReg) {
00098 TBranch* bReg(0);
00099
00100 TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
00101 if(0 != metaDataTree) {
00102 bReg = metaDataTree->GetBranch(edm::poolNames::productDescriptionBranchName().c_str());
00103 bReg->SetAddress(ppReg);
00104 bReg->GetEntry(0);
00105 (*ppReg)->setFrozen(false);
00106 }
00107 return bReg;
00108 }
00109
00110 std::vector<edm::BranchDescription> const&
00111 Strategy::getBranchDescriptions() {
00112 if(bDesc_.empty()) {
00113 for(bidToDesc::const_iterator i = branchDescriptionMap_.begin(); i != branchDescriptionMap_.end(); ++i) {
00114 bDesc_.push_back(i->second);
00115 }
00116 }
00117 return bDesc_;
00118 }
00119
00120 edm::BranchID
00121 Strategy::productToBranchID(edm::ProductID const&) {
00122 throw edm::Exception(edm::errors::UnimplementedFeature) << "Unsupported EDM file version";
00123 }
00124
00125 edm::BranchDescription const &
00126 Strategy::productToBranch(edm::ProductID const& pid) {
00127 edm::BranchID bid = productToBranchID(pid);
00128 bidToDesc::const_iterator bdi = branchDescriptionMap_.find(bid);
00129 if(branchDescriptionMap_.end() == bdi) {
00130 return kDefaultBranchDescription;
00131 }
00132 return bdi->second;
00133 }
00134
00135 class BranchMapReaderStrategyV1 : public Strategy {
00136 public:
00137 BranchMapReaderStrategyV1(TFile* file, int fileVersion);
00138 virtual bool updateFile(TFile* file);
00139 virtual bool updateMap();
00140 virtual edm::BranchListIndexes const& branchListIndexes() const {return dummyBranchListIndexes_;}
00141 private:
00142 edm::BranchListIndexes dummyBranchListIndexes_;
00143 };
00144
00145 BranchMapReaderStrategyV1::BranchMapReaderStrategyV1(TFile* file, int fileVersion)
00146 : Strategy(file, fileVersion) {
00147 updateFile(file);
00148 }
00149
00150 bool BranchMapReaderStrategyV1::updateFile(TFile* file) {
00151 if(Strategy::updateFile(file)) {
00152 mapperFilled_ = false;
00153 return true;
00154 }
00155 return false;
00156 }
00157
00158 bool BranchMapReaderStrategyV1::updateMap() {
00159 if(mapperFilled_) {
00160 return true;
00161 }
00162
00163 branchDescriptionMap_.clear();
00164 bDesc_.clear();
00165
00166 edm::ProductRegistry reg;
00167 edm::ProductRegistry* pReg = ®
00168 TBranch* br = getBranchRegistry(&pReg);
00169
00170 if(0 != br) {
00171 edm::ProductRegistry::ProductList const& prodList = reg.productList();
00172
00173 for(edm::ProductRegistry::ProductList::const_iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd; ++it) {
00174 if(edm::InEvent == it->second.branchType()) {
00175
00176 it->second.init();
00177 branchDescriptionMap_.insert(bidToDesc::value_type(it->second.branchID(), it->second));
00178 }
00179 }
00180 mapperFilled_ = true;
00181 }
00182 return 0 != br;
00183 }
00184
00185
00186 class BranchMapReaderStrategyV7 : public BranchMapReaderStrategyV1 {
00187 public:
00188 BranchMapReaderStrategyV7(TFile* file, int fileVersion);
00189 virtual edm::BranchListIndexes const& branchListIndexes() const {return dummyBranchListIndexes_;}
00190 private:
00191 edm::BranchListIndexes dummyBranchListIndexes_;
00192 };
00193
00194 BranchMapReaderStrategyV7::BranchMapReaderStrategyV7(TFile* file, int fileVersion)
00195 : BranchMapReaderStrategyV1(file, fileVersion) {
00196 updateFile(file);
00197 }
00198
00199 class BranchMapReaderStrategyV8 : public Strategy {
00200 public:
00201 BranchMapReaderStrategyV8(TFile* file, int fileVersion);
00202 virtual bool updateFile(TFile* file);
00203 virtual bool updateEvent(Long_t eventEntry);
00204 virtual bool updateLuminosityBlock(Long_t luminosityBlockEntry);
00205 virtual bool updateRun(Long_t runEntry);
00206 virtual bool updateMap();
00207 virtual edm::BranchListIndexes const& branchListIndexes() const {return dummyBranchListIndexes_;}
00208 private:
00209 TBranch* entryInfoBranch_;
00210 edm::EventEntryInfoVector eventEntryInfoVector_;
00211 edm::EventEntryInfoVector* pEventEntryInfoVector_;
00212 edm::BranchListIndexes dummyBranchListIndexes_;
00213 };
00214
00215 BranchMapReaderStrategyV8::BranchMapReaderStrategyV8(TFile* file, int fileVersion)
00216 : Strategy(file, fileVersion),
00217 eventEntryInfoVector_(), pEventEntryInfoVector_(&eventEntryInfoVector_) {
00218 updateFile(file);
00219 }
00220
00221 bool BranchMapReaderStrategyV8::updateEvent(Long_t newevent) {
00222
00223 if(newevent != eventEntry_) {
00224 eventEntry_ = newevent;
00225 mapperFilled_ = false;
00226 }
00227 return true;
00228 }
00229
00230 bool BranchMapReaderStrategyV8::updateLuminosityBlock(Long_t newLumi) {
00231 if(newLumi != luminosityBlockEntry_) {
00232 luminosityBlockEntry_ = newLumi;
00233 mapperFilled_ = false;
00234 }
00235 return true;
00236 }
00237
00238 bool BranchMapReaderStrategyV8::updateRun(Long_t newRun) {
00239 if(newRun != runEntry_) {
00240 runEntry_ = newRun;
00241 mapperFilled_ = false;
00242 }
00243 return true;
00244 }
00245
00246 bool BranchMapReaderStrategyV8::updateFile(TFile* file) {
00247 Strategy::updateFile(file);
00248 mapperFilled_ = false;
00249 entryInfoBranch_ = 0;
00250 TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventMetaDataTreeName().c_str()));
00251 if(0 != metaDataTree) {
00252 entryInfoBranch_ = metaDataTree->GetBranch(BranchTypeToBranchEntryInfoBranchName(edm::InEvent).c_str());
00253
00254 } else {
00255 return false;
00256 }
00257 pEventEntryInfoVector_ = &eventEntryInfoVector_;
00258 entryInfoBranch_->SetAddress(&pEventEntryInfoVector_);
00259
00260 branchDescriptionMap_.clear();
00261 bDesc_.clear();
00262
00263 edm::ProductRegistry reg;
00264 edm::ProductRegistry* pReg = ®
00265 TBranch *br = getBranchRegistry(&pReg);
00266
00267 if(0 != br) {
00268 edm::ProductRegistry::ProductList const& prodList = reg.productList();
00269
00270 for(edm::ProductRegistry::ProductList::const_iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd; ++it) {
00271 if(edm::InEvent == it->second.branchType()) {
00272
00273 it->second.init();
00274 branchDescriptionMap_.insert(bidToDesc::value_type(it->second.branchID(), it->second));
00275 }
00276 }
00277 }
00278 return 0 != br;
00279 }
00280
00281 bool BranchMapReaderStrategyV8::updateMap() {
00282 if(mapperFilled_) {
00283 return true;
00284 }
00285
00286 assert(entryInfoBranch_);
00287
00288 entryInfoBranch_->GetEntry(eventEntry_);
00289
00290 for(std::vector<edm::EventEntryInfo>::const_iterator it = pEventEntryInfoVector_->begin(),
00291 itEnd = pEventEntryInfoVector_->end();
00292 it != itEnd; ++it) {
00293
00294 }
00295 mapperFilled_ = true;
00296 return true;
00297 }
00298
00299 class BranchMapReaderStrategyV11 : public Strategy {
00300 public:
00301 BranchMapReaderStrategyV11(TFile* file, int fileVersion);
00302 virtual bool updateFile(TFile* file);
00303 virtual bool updateEvent(Long_t eventEntry);
00304 virtual bool updateLuminosityBlock(Long_t luminosityBlockEntry);
00305 virtual bool updateRun(Long_t runEntry);
00306 virtual bool updateMap();
00307 virtual edm::BranchID productToBranchID(edm::ProductID const& pid);
00308 virtual edm::BranchListIndexes const& branchListIndexes() const {return history_.branchListIndexes();}
00309 private:
00310 std::auto_ptr<edm::BranchIDLists> branchIDLists_;
00311 TTree* eventHistoryTree_;
00312 edm::History history_;
00313 edm::History* pHistory_;
00314 };
00315
00316 BranchMapReaderStrategyV11::BranchMapReaderStrategyV11(TFile* file, int fileVersion)
00317 : Strategy(file, fileVersion), eventHistoryTree_(0), pHistory_(&history_) {
00318 updateFile(file);
00319 }
00320
00321 bool BranchMapReaderStrategyV11::updateEvent(Long_t newevent) {
00322
00323 if(newevent != eventEntry_) {
00324 eventEntry_ = newevent;
00325 mapperFilled_ = false;
00326 }
00327 return true;
00328 }
00329
00330 bool BranchMapReaderStrategyV11::updateLuminosityBlock(Long_t newlumi) {
00331 if(newlumi != luminosityBlockEntry_) {
00332 luminosityBlockEntry_ = newlumi;
00333 mapperFilled_ = false;
00334 }
00335 return true;
00336 }
00337
00338 bool BranchMapReaderStrategyV11::updateRun(Long_t newRun) {
00339 if(newRun != runEntry_) {
00340 runEntry_ = newRun;
00341 mapperFilled_ = false;
00342 }
00343 return true;
00344 }
00345
00346 bool BranchMapReaderStrategyV11::updateFile(TFile* file) {
00347 Strategy::updateFile(file);
00348 mapperFilled_ = false;
00349 TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
00350
00351 if(0 == metaDataTree) {
00352 throw edm::Exception(edm::errors::EventCorruption)
00353 <<"No "<<edm::poolNames::metaDataTreeName()<<" TTree in file";
00354 }
00355 branchIDLists_.reset(new edm::BranchIDLists);
00356 edm::BranchIDLists* branchIDListsPtr = branchIDLists_.get();
00357 if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != 0) {
00358 TBranch* b = metaDataTree->GetBranch(edm::poolNames::branchIDListBranchName().c_str());
00359 b->SetAddress(&branchIDListsPtr);
00360 b->GetEntry(0);
00361
00362 } else {
00363 throw edm::Exception(edm::errors::EventCorruption)
00364 << "FindBranch of branchIDList failed";
00365 return false;
00366 }
00367
00368 eventHistoryTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventHistoryTreeName().c_str()));
00369
00370 branchDescriptionMap_.clear();
00371 bDesc_.clear();
00372
00373 edm::ProductRegistry reg;
00374 edm::ProductRegistry* pReg = ®
00375 TBranch *br = getBranchRegistry(&pReg);
00376
00377 if(0 != br) {
00378 edm::ProductRegistry::ProductList const& prodList = reg.productList();
00379
00380 for(edm::ProductRegistry::ProductList::const_iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd; ++it) {
00381 if(edm::InEvent == it->second.branchType()) {
00382
00383 it->second.init();
00384 branchDescriptionMap_.insert(bidToDesc::value_type(it->second.branchID(), it->second));
00385
00386 }
00387 }
00388 }
00389 return 0 != br;
00390 }
00391
00392 bool BranchMapReaderStrategyV11::updateMap() {
00393 if(!mapperFilled_) {
00394 TBranch* eventHistoryBranch = eventHistoryTree_->GetBranch(edm::poolNames::eventHistoryBranchName().c_str());
00395 if(!eventHistoryBranch) {
00396 throw edm::Exception(edm::errors::EventCorruption)
00397 << "Failed to find history branch in event history tree";
00398 return false;
00399 }
00400
00401 eventHistoryBranch->SetAddress(&pHistory_);
00402 eventHistoryTree_->GetEntry(eventEntry_);
00403 mapperFilled_ = true;
00404 }
00405 return true;
00406 }
00407
00408 edm::BranchID
00409 BranchMapReaderStrategyV11::productToBranchID(edm::ProductID const& pid) {
00410 updateMap();
00411 return edm::productIDToBranchID(pid, *branchIDLists_, history_.branchListIndexes());
00412 }
00413
00414 class BranchMapReaderStrategyV17 : public Strategy {
00415 public:
00416 BranchMapReaderStrategyV17(TFile* file, int fileVersion);
00417 virtual bool updateFile(TFile* file);
00418 virtual bool updateEvent(Long_t eventEntry);
00419 virtual bool updateLuminosityBlock(Long_t luminosityBlockEntry);
00420 virtual bool updateRun(Long_t runEntry);
00421 virtual bool updateMap();
00422 virtual edm::BranchID productToBranchID(edm::ProductID const& pid);
00423 virtual edm::BranchListIndexes const& branchListIndexes() const {return branchListIndexes_;}
00424 private:
00425 std::auto_ptr<edm::BranchIDLists> branchIDLists_;
00426 TTree* eventsTree_;
00427 edm::BranchListIndexes branchListIndexes_;
00428 edm::BranchListIndexes* pBranchListIndexes_;
00429 };
00430
00431 BranchMapReaderStrategyV17::BranchMapReaderStrategyV17(TFile* file, int fileVersion)
00432 : Strategy(file, fileVersion), eventsTree_(0), pBranchListIndexes_(&branchListIndexes_) {
00433 updateFile(file);
00434 }
00435
00436 bool BranchMapReaderStrategyV17::updateEvent(Long_t newevent) {
00437
00438 if(newevent != eventEntry_) {
00439 eventEntry_ = newevent;
00440 mapperFilled_ = false;
00441 }
00442 return true;
00443 }
00444
00445 bool BranchMapReaderStrategyV17::updateLuminosityBlock(Long_t newlumi) {
00446 if(newlumi != luminosityBlockEntry_) {
00447 luminosityBlockEntry_ = newlumi;
00448 mapperFilled_ = false;
00449 }
00450 return true;
00451 }
00452
00453 bool BranchMapReaderStrategyV17::updateRun(Long_t newRun) {
00454 if(newRun != runEntry_) {
00455 runEntry_ = newRun;
00456 mapperFilled_ = false;
00457 }
00458 return true;
00459 }
00460
00461 bool BranchMapReaderStrategyV17::updateFile(TFile* file) {
00462 Strategy::updateFile(file);
00463 mapperFilled_ = false;
00464 TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
00465 if(0==metaDataTree) {
00466 throw edm::Exception(edm::errors::EventCorruption) <<"No "<<edm::poolNames::metaDataTreeName()<<" TTree in file";
00467 }
00468 branchIDLists_.reset(new edm::BranchIDLists);
00469 edm::BranchIDLists* branchIDListsPtr = branchIDLists_.get();
00470 if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != 0) {
00471 TBranch* b = metaDataTree->GetBranch(edm::poolNames::branchIDListBranchName().c_str());
00472 b->SetAddress(&branchIDListsPtr);
00473 b->GetEntry(0);
00474
00475 } else {
00476 throw edm::Exception(edm::errors::EventCorruption)
00477 << "FindBranch of branchIDList failed";
00478 return false;
00479 }
00480
00481 eventsTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventTreeName().c_str()));
00482
00483 branchDescriptionMap_.clear();
00484 bDesc_.clear();
00485
00486 edm::ProductRegistry reg;
00487 edm::ProductRegistry* pReg = ®
00488 TBranch *br = getBranchRegistry(&pReg);
00489
00490 if(0 != br) {
00491 edm::ProductRegistry::ProductList const& prodList = reg.productList();
00492
00493 for(edm::ProductRegistry::ProductList::const_iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd; ++it) {
00494 if(edm::InEvent == it->second.branchType()) {
00495
00496 it->second.init();
00497 branchDescriptionMap_.insert(bidToDesc::value_type(it->second.branchID(), it->second));
00498
00499 }
00500 }
00501 }
00502 return 0 != br;
00503 }
00504
00505 bool BranchMapReaderStrategyV17::updateMap() {
00506 if(!mapperFilled_) {
00507 TBranch* branchListIndexesBranch = eventsTree_->GetBranch(edm::poolNames::branchListIndexesBranchName().c_str());
00508 if(!branchListIndexesBranch) {
00509 throw edm::Exception(edm::errors::EventCorruption)
00510 << "Failed to find branch list indexes branch in event tree";
00511 return false;
00512 }
00513
00514 branchListIndexesBranch->SetAddress(&pBranchListIndexes_);
00515 branchListIndexesBranch->GetEntry(eventEntry_);
00516 mapperFilled_ = true;
00517 }
00518 return true;
00519 }
00520
00521 edm::BranchID
00522 BranchMapReaderStrategyV17::productToBranchID(edm::ProductID const& pid) {
00523 updateMap();
00524 return edm::productIDToBranchID(pid, *branchIDLists_, branchListIndexes_);
00525 }
00526 }
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 BranchMapReader::BranchMapReader(TFile* file) :
00541 fileVersion_(-1) {
00542 if(0==file) {
00543 throw cms::Exception("NoFile")<<"The TFile pointer is null";
00544 }
00545 strategy_ = newStrategy(file, getFileVersion(file));
00546 }
00547
00548
00549
00550
00551
00552 int BranchMapReader::getFileVersion(TFile* file) {
00553 TTree* metaDataTree = dynamic_cast<TTree*>(file->Get(edm::poolNames::metaDataTreeName().c_str()));
00554 if(0==metaDataTree) {
00555 return 0;
00556 }
00557
00558 edm::FileFormatVersion v;
00559 edm::FileFormatVersion* pV=&v;
00560 TBranch* bVer = metaDataTree->GetBranch(edm::poolNames::fileFormatVersionBranchName().c_str());
00561 bVer->SetAddress(&pV);
00562 bVer->GetEntry(0);
00563 fileVersion_ = v.value();
00564 return v.value();
00565 }
00566
00567 bool BranchMapReader::updateEvent(Long_t newevent) {
00568 return strategy_->updateEvent(newevent);
00569 }
00570
00571 bool BranchMapReader::updateLuminosityBlock(Long_t newlumi) {
00572 return strategy_->updateLuminosityBlock(newlumi);
00573 }
00574
00575 bool BranchMapReader::updateRun(Long_t newRun) {
00576 return strategy_->updateRun(newRun);
00577 }
00578
00579 bool BranchMapReader::updateFile(TFile* file) {
00580 if(0 == strategy_.get()) {
00581 strategy_ = newStrategy(file, getFileVersion(file));
00582 return true;
00583 }
00584
00585 TFile* currentFile(strategy_->currentFile_);
00586 bool isNew(file != currentFile);
00587
00588 if(!isNew) {
00589
00590
00591
00592 TTree* eventTreeTemp = dynamic_cast<TTree*>(currentFile->Get(edm::poolNames::eventTreeName().c_str()));
00593 isNew = eventTreeTemp != strategy_->eventTree_ || strategy_->fileUUID_ != currentFile->GetUUID();
00594 }
00595 if(isNew) {
00596 int fileVersion = getFileVersion(file);
00597 if(fileVersion != strategy_->fileVersion_) {
00598 strategy_ = newStrategy(file, fileVersion);
00599 } else {
00600 strategy_->updateFile(file);
00601 }
00602 }
00603 return isNew;
00604 }
00605
00606 edm::BranchDescription const &
00607 BranchMapReader::productToBranch(edm::ProductID const& pid) {
00608 return strategy_->productToBranch(pid);
00609 }
00610
00611 std::vector<edm::BranchDescription> const&
00612 BranchMapReader::getBranchDescriptions() {
00613 return strategy_->getBranchDescriptions();
00614 }
00615
00616
00617 std::auto_ptr<internal::BMRStrategy>
00618 BranchMapReader::newStrategy(TFile* file, int fileVersion) {
00619 std::auto_ptr<internal::BMRStrategy> s;
00620
00621 if(fileVersion >= 17) {
00622 s = std::auto_ptr<internal::BMRStrategy>(new internal::BranchMapReaderStrategyV17(file, fileVersion));
00623 } else if(fileVersion >= 11) {
00624 s = std::auto_ptr<internal::BMRStrategy>(new internal::BranchMapReaderStrategyV11(file, fileVersion));
00625 } else if(fileVersion >= 8) {
00626 s = std::auto_ptr<internal::BMRStrategy>(new internal::BranchMapReaderStrategyV8(file, fileVersion));
00627 } else if(fileVersion >= 7) {
00628 s = std::auto_ptr<internal::BMRStrategy>(new internal::BranchMapReaderStrategyV7(file, fileVersion));
00629 } else {
00630 s = std::auto_ptr<internal::BMRStrategy>(new internal::BranchMapReaderStrategyV1(file, fileVersion));
00631 }
00632 return s;
00633 }
00634 }