BlockReaderList NxsReader::FindAllBlocksByTitleNoPrioritization(const BlockReaderList & chosenBlockList, const char *title) { BlockReaderList found; if (chosenBlockList.empty() || title == NULL) { found = chosenBlockList; } else { bool emptyTitle = strlen(title) == 0; for (BlockReaderList::const_iterator cblIt = chosenBlockList.begin(); cblIt != chosenBlockList.end(); ++cblIt) { NxsBlock * b = *cblIt; std::vector<std::string> v = this->GetAllTitlesForBlock(b); for (std::vector<std::string>::const_iterator vIt = v.begin(); vIt != v.end(); ++vIt) { const std::string & n = *vIt; if ((emptyTitle && n.empty()) || (NxsString::case_insensitive_equals(title, n.c_str()))) { found.push_back(b); break; } } } } return found; }
void writeAsNexus(PublicNexusReader & nexusReader, ostream & os) { BlockReaderList blocks = nexusReader.GetUsedBlocksInOrder(); os << "#NEXUS\n"; for (BlockReaderList::const_iterator bIt = blocks.begin(); bIt != blocks.end(); ++bIt) { NxsBlock * b = *bIt; if (b) b->WriteAsNexus(os); } }
void NxsReader::DemoteBlocks(int priorityLevel) { BlockReaderList brl = GetUsedBlocksInOrder(); BlockReaderList::iterator brlIt = brl.begin(); for (; brlIt != brl.end(); ++brlIt) { NxsBlock * b = *brlIt; AssignBlockPriority(b, priorityLevel); } }
//////////////////////////////////////////////////////////////////////////////// // Takes NxsReader that has successfully read a file, and processes the // information stored in the reader. // // The caller is responsibel for calling DeleteBlocksFromFactories() to clean // up (if the reader uses the factory API). //////////////////////////////////////////////////////////////////////////////// void processContent(PublicNexusReader & nexusReader, ostream *out) { if (!out) return; BlockReaderList blocks = nexusReader.GetUsedBlocksInOrder(); *out << "#NEXUS\n"; for (BlockReaderList::const_iterator bIt = blocks.begin(); bIt != blocks.end(); ++bIt) { NxsBlock * b = *bIt; if (b->GetID() == "TAXA") b->WriteAsNexus(*out); } TreesToSplits::TaxaBlockToSplitsMap::const_iterator tbtsm = gTreesToSplitsB->taxaBlockToSplitsMap.begin(); for (; tbtsm != gTreesToSplitsB->taxaBlockToSplitsMap.end(); ++tbtsm) { *out << "Begin Trees;\n"; NxsTaxaBlockAPI * tb = tbtsm->first; if (tb && gTreesToSplitsB->taxaBlockToSplitsMap.size() > 1) *out << "Link Taxa = " << NxsString::GetEscaped(tb->GetTitle()) << ";\n"; writeTranslateCommand(tb, *out); const TreesToSplits::NTreesSplitsMap & ntsm = tbtsm->second; const unsigned nt = ntsm.first; const TreesToSplits::SplitsMap & sm = ntsm.second; unsigned n = 1; writeStarTreeCommand(tb, *out); for (TreesToSplits::SplitsMap::const_iterator smIt = sm.begin(); smIt != sm.end(); ++smIt, ++n) { const SplitInfo & si = smIt->second; *out << "Tree split_" << n << " = " << " [&"; *out << (gTreesToSplitsB->treatAsRooted ? 'R' : 'U'); *out << "] ["; if (gTreesToSplitsB->trackFreq || gTreesToSplitsB->trackEdgeLenSummary || gTreesToSplitsB->trackEdgeLen) *out << "&W " << ((double)si.nTimes)/((double)nt) << " ] ["; if (gTreesToSplitsB->trackHeightSummary) { *out << "meanH =" << ((double)si.heightSum)/((double)si.nTimes); } *out << "] "; if (gTreesToSplitsB->trackEdgeLenSummary) smIt->first.writeNewick(*out, si.edgeLenSum/((double)si.nTimes), true); else smIt->first.writeNewick(*out, true); *out << ";\n"; } *out << "End;\n"; } }
BlockReaderList NxsReader::FindAllBlocksByTitle(const BlockReaderList & chosenBlockList, const char *title) { BlockReaderList found = FindAllBlocksByTitleNoPrioritization(chosenBlockList, title); if (found.empty()) { return found; } map<int, BlockReaderList> byPriority; for (BlockReaderList::const_iterator fIt = found.begin(); fIt != found.end(); ++fIt) { NxsBlock * b = *fIt; int priority = GetBlockPriority(b); byPriority[priority].push_back(b); } NCL_ASSERT(!byPriority.empty()); return byPriority.rbegin()->second; }
//////////////////////////////////////////////////////////////////////////////// // Takes NxsReader that has successfully read a file, and processes the // information stored in the reader. // // The caller is responsibel for calling DeleteBlocksFromFactories() to clean // up (if the reader uses the factory API). //////////////////////////////////////////////////////////////////////////////// void processContent(PublicNexusReader & nexusReader, ostream *out) { if (!out) return; BlockReaderList blocks = nexusReader.GetUsedBlocksInOrder(); *out << "#NEXUS\n"; for (BlockReaderList::const_iterator bIt = blocks.begin(); bIt != blocks.end(); ++bIt) { NxsBlock * b = *bIt; if (b->GetID() == "TAXA") b->WriteAsNexus(*out); else if (b->GetID() == "CHARACTERS" || b->GetID() == "DATA" ) { NxsCharactersBlock * charactersBPtr = (NxsCharactersBlock *) b; writeCharactersAsGapped(*out, charactersBPtr); } } }
void BullShell::ExecGetTrees(const GetTreesOpts & gto) { errormsg.clear(); BlockReaderList blocks = getBlocksFromFile(gto.filename, true); if (blocks.empty()) { errormsg << "No Trees Block found in " << gto.filename; throw XBull(errormsg); } unsigned ntreesInFile = 0; const unsigned ntreesBlocks = blocks.size(); vector<NxsTreesBlockAPI *> trBlocks; for (BlockReaderList::iterator b = blocks.begin(); b != blocks.end(); ++b) { NxsTreesBlockAPI *tb = (NxsTreesBlockAPI *)(*b); trBlocks.push_back(tb); assert(tb); ntreesInFile += tb->GetNumTrees(); } if (ntreesInFile < 1) { errormsg << "No Trees found in " << gto.filename; throw XBull(errormsg); } const unsigned toTree = (unsigned) (gto.toTree < 0 ? 0 : gto.toTree); const unsigned fromTree = (unsigned) (gto.fromTree < 0 ? ntreesInFile - 1 : gto.fromTree); if (fromTree > toTree) { errormsg << "Cant get Trees from " << fromTree << " to " << toTree; throw XBull( errormsg); } // Store the specified trees // these trees are deleted in the for loop if there is an error, otherwise // they are put under the control of the kernel vector<Tree *> treesToBeAdded; vector<NxsTreesBlockAPI *>::const_iterator tbIt = trBlocks.begin(); NxsTreesBlockAPI * currTB = *tbIt; unsigned nTreesInThisBlock = currTB->GetNumTrees(); int nleftInThisBlock = (int) nTreesInThisBlock; for (unsigned i = 0; i < toTree; i++, --nleftInThisBlock) { while (nleftInThisBlock < 1) { ++tbIt; assert(tbIt != trBlocks.end()); currTB = *tbIt; nTreesInThisBlock = currTB->GetNumTrees(); nleftInThisBlock = (int) nTreesInThisBlock; } if (i >= fromTree) { const std::string newick = currTB->GetTranslatedTreeDescription((unsigned)(nTreesInThisBlock - nleftInThisBlock)); Tree * temptree = new Tree(newick, gto.storeBrLensFromFile); if (!temptree->IsGood()) { for (unsigned j = 0; j < i - fromTree; j++) delete treesToBeAdded[j]; errormsg << "Problem Reading Tree Description of " << currTB->GetTreeName(i); delete temptree; throw XBull(errormsg); } std::string s = currTB->GetTreeName(i); ToUpper(s); temptree->SetName(s); treesToBeAdded.push_back(temptree); } } ioObject.message.clear(); ioObject.message << (int)(toTree - fromTree) << " trees read from " << ntreesBlocks << " TREES block(s) in " << gto.filename; ioObject.printMessage(BullIO::STATUS_MSG_LEVEL); assert(gto.mode <= 7 && gto.mode >= 0); kernel.updateTrees(treesToBeAdded, UpdateMode(gto.mode)); for (BlockReaderList::iterator b = blocks.begin(); b != blocks.end(); ++b) { if (*b != this) delete *b; } }