void SiteContainerTools::merge(SiteContainer& seqCont1, const SiteContainer& seqCont2, bool leavePositionAsIs) throw (AlphabetMismatchException, Exception) { if (seqCont1.getAlphabet()->getAlphabetType() != seqCont2.getAlphabet()->getAlphabetType()) throw AlphabetMismatchException("SiteContainerTools::merge.", seqCont1.getAlphabet(), seqCont2.getAlphabet()); vector<string> seqNames1 = seqCont1.getSequencesNames(); vector<string> seqNames2 = seqCont2.getSequencesNames(); const SiteContainer* seqCont2bis = 0; bool del = false; if (seqNames1 == seqNames2) { seqCont2bis = &seqCont2; } else { // We shall reorder sequences first: SiteContainer* seqCont2ter = new VectorSiteContainer(seqCont2.getAlphabet()); SequenceContainerTools::getSelectedSequences(seqCont2, seqNames1, *seqCont2ter); seqCont2bis = seqCont2ter; del = true; } if (leavePositionAsIs) { for (size_t i = 0; i < seqCont2bis->getNumberOfSites(); i++) { seqCont1.addSite(seqCont2bis->getSite(i), false); } } else { int offset = static_cast<int>(seqCont1.getNumberOfSites()); for (size_t i = 0; i < seqCont2bis->getNumberOfSites(); i++) { seqCont1.addSite(seqCont2bis->getSite(i), offset + seqCont2bis->getSite(i).getPosition(), false); } } if (del) delete seqCont2bis; }
VectorSiteContainer::VectorSiteContainer(const SiteContainer& sc) : AbstractSequenceContainer(sc), sites_(0), names_(sc.getSequencesNames()), comments_(sc.getNumberOfSequences()), sequences_(sc.getNumberOfSequences()) { // Now try to add each site: for (size_t i = 0; i < sc.getNumberOfSites(); i++) { addSite(sc.getSite(i), false); // We assume that positions are correct. } // Seq comments: for (size_t i = 0; i < sc.getNumberOfSequences(); i++) { comments_[i] = new Comments(sc.getComments(i)); } }