void copyFromTopAlignment(AlignmentConstPtr topAlignment, AlignmentPtr mainAlignment, const string &genomeName) { Genome *mainReplacedGenome = mainAlignment->openGenome(genomeName); const Genome *topReplacedGenome = topAlignment->openGenome(genomeName); topReplacedGenome->copyTopDimensions(mainReplacedGenome); topReplacedGenome->copyTopSegments(mainReplacedGenome); mainReplacedGenome->fixParseInfo(); // Copy bot segments for the parent and top segments for the // siblings of the genome that's being replaced Genome *mainParent = mainReplacedGenome->getParent(); const Genome *topParent = topReplacedGenome->getParent(); topParent->copyBottomDimensions(mainParent); topParent->copyBottomSegments(mainParent); mainParent->fixParseInfo(); vector<string> siblings = mainAlignment->getChildNames(mainParent->getName()); for (size_t i = 0; i < siblings.size(); i++) { if (siblings[i] != genomeName) { Genome *mainChild = mainAlignment->openGenome(siblings[i]); const Genome *topChild = topAlignment->openGenome(siblings[i]); topChild->copyTopDimensions(mainChild); topChild->copyTopSegments(mainChild); mainChild->fixParseInfo(); } } }
void LodExtract::writeDimensions( const map<const Sequence*, hal_size_t>& segmentCounts, const string& parentName, const vector<string>& childNames) { // initialize a dimensions list for each (input) genome map<const Genome*, vector<Sequence::Info> > dimMap; map<const Genome*, vector<Sequence::Info> >::iterator dimMapIt; vector<string> newGenomeNames = childNames; newGenomeNames.push_back(parentName); for (size_t i = 0; i < newGenomeNames.size(); ++i) { const Genome* inGenome = _inAlignment->openGenome(newGenomeNames[i]); pair<const Genome*, vector<Sequence::Info> > newEntry; newEntry.first = inGenome; // it's important we keep the sequences in the output genome // in the same order as the sequences in the input genome since // we always use global coordinates! SequenceIteratorConstPtr seqIt = inGenome->getSequenceIterator(); SequenceIteratorConstPtr seqEnd = inGenome->getSequenceEndIterator(); for (; seqIt != seqEnd; seqIt->toNext()) { const Sequence* inSequence = seqIt->getSequence(); map<const Sequence*, hal_size_t>::const_iterator segMapIt; segMapIt = segmentCounts.find(inSequence); // we skip empty sequences for now with below check if (segMapIt != segmentCounts.end()) { vector<Sequence::Info>& segDims = newEntry.second; hal_size_t nTop = inGenome->getName() == parentName ? 0 : segMapIt->second; hal_size_t nBot = inGenome->getName() != parentName ? 0 : segMapIt->second; segDims.push_back(Sequence::Info(inSequence->getName(), inSequence->getSequenceLength(), nTop, nBot)); } } // note potential bug here for genome with no data dimMap.insert(newEntry); } // now that we have the dimensions for each genome, update them in // the output alignment for (dimMapIt = dimMap.begin(); dimMapIt != dimMap.end(); ++dimMapIt) { Genome* newGenome = _outAlignment->openGenome(dimMapIt->first->getName()); assert(newGenome != NULL); vector<Sequence::Info>& segDims = dimMapIt->second; // ROOT if (newGenome->getName() == _outAlignment->getRootName()) { assert(newGenome->getName() == parentName); newGenome->setDimensions(segDims, _keepSequences); } // LEAF else if (newGenome->getName() != parentName) { newGenome->setDimensions(segDims, _keepSequences); } // INTERNAL NODE else { vector<Sequence::UpdateInfo> updateInfo; for (size_t i = 0; i < segDims.size(); ++i) { updateInfo.push_back( Sequence::UpdateInfo(segDims[i]._name, segDims[i]._numBottomSegments)); } newGenome->updateBottomDimensions(updateInfo); } } }