Ignore:
Timestamp:
Sep 1, 2016, 8:33:13 PM (9 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Gui_Fixes
Children:
564621
Parents:
eb555b
git-author:
Frederik Heber <heber@…> (09/01/16 20:31:45)
git-committer:
Frederik Heber <heber@…> (09/01/16 20:33:13)
Message:

tempcommit: FIX: KeySetsContainer::insert(KeySetsContainer&) was not fully working.

  • sets were simply appended and according to their index sets.
  • this works for normal index sets but not for forceindexsets, which have the additional (excluded) hydrogens that take not part when counting the bond order.
  • As FragmentationResultsContainer relied on index and forceindex to have the same fragment order, this was no longer true.
  • TEMPCOMMIT: This needs a suitable unit test!
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/KeySetsContainer.cpp

    reb555b r2e31b5  
    247247void KeySetsContainer::insert(const KeySetsContainer &other)
    248248{
    249   KeySets.reserve(KeySets.size()+other.KeySets.size());
    250   AtomCounter.reserve(AtomCounter.size()+other.AtomCounter.size());
    251   for (ArrayOfIntVectors::const_iterator iter = other.KeySets.begin();
    252       iter != other.KeySets.end(); ++iter)
    253     insert(*iter, iter->size());
     249  // append sets and their atom count
     250  KeySets.insert(KeySets.end(), other.KeySets.begin(), other.KeySets.end());
     251  AtomCounter.insert(AtomCounter.end(), other.AtomCounter.begin(), other.AtomCounter.end());
     252
     253  // ASSUME: that the fragments inside other are number consecutively
     254
     255  // find the smallest number
     256  int smallest_index = std::numeric_limits<int>::max();
     257  for(size_t i=0;i<other.OrderSet.size();++i)
     258    for(IntVector::const_iterator iter = other.OrderSet[i].begin();
     259        iter != other.OrderSet[i].end(); ++iter)
     260      smallest_index = std::min(smallest_index, (*iter));
     261
     262  // renumber incoming fragments and insert into OrderSets
     263  int nr_fragments = 0;
     264  for(size_t i=0;i<other.OrderSet.size();++i) {
     265    for(IntVector::const_iterator iter = other.OrderSet[i].begin();
     266        iter != other.OrderSet[i].end(); ++iter) {
     267      if (i >= OrderSet.size() )
     268        OrderSet.resize(i+1);
     269      OrderSet[i].push_back((*iter)+FragmentCounter-smallest_index);
     270      if (i >= FragmentsPerOrder.size())
     271        FragmentsPerOrder.resize(i+1);
     272      ++(FragmentsPerOrder[i]);
     273    }
     274    nr_fragments += other.OrderSet[i].size();
     275  }
     276  FragmentCounter += nr_fragments;
    254277}
    255278
Note: See TracChangeset for help on using the changeset viewer.