Exemple #1
0
    def select(self, selection):
        """
    Modifies the selections of master and copies according the "selection"
    - Keep the order of selected atoms
    - Keep only atoms that appear in master and ALL copies
    Also modify "selection" to include ncs related atoms only if selected in
    both master and ALL ncs copies (The modified selection is not returned in
    current version)

    Args:
      selection (flex.bool): atom selection
    """
        from mmtbx.ncs.ncs_utils import selected_positions, remove_items_from_selection
        assert isinstance(selection, flex.bool)

        iselection = selection.iselection(True)
        sel_set = set(iselection)
        m = set(self.master_iselection)
        m_list = [(pos, indx)
                  for pos, indx in enumerate(list(self.master_iselection))]
        m_in_sel = m.intersection(sel_set)
        common_selection_pos = {
            pos
            for (pos, indx) in m_list if indx in m_in_sel
        }
        for ncs in self.copies:
            c = set(ncs.iselection)
            c_list = [(pos, indx)
                      for pos, indx in enumerate(list(ncs.iselection))]
            copy_in_sel = c.intersection(sel_set)
            include_set = {
                pos
                for (pos, indx) in c_list if indx in copy_in_sel
            }
            common_selection_pos.intersection_update(include_set)
            if not bool(common_selection_pos): break
        # use the common_selection_pos to update all selections
        self.master_iselection, not_included = selected_positions(
            self.master_iselection, common_selection_pos)
        iselection = remove_items_from_selection(iselection, not_included)
        for ncs in self.copies:
            ncs.iselection, not_included = selected_positions(
                ncs.iselection, common_selection_pos)
            iselection = remove_items_from_selection(iselection, not_included)
        for c in self.copies:
            assert self.master_iselection.size() == c.iselection.size(
            ), "%s\n%s" % (list(self.master_iselection), list(c.iselection))

        # This is to handle renumbering properly
        self.master_iselection = iselection_select(self.master_iselection,
                                                   selection)
        self.master_str_selection = None
        for c in self.copies:
            c.select(selection)
  def test_selected_positions(self):
    # print sys._getframe().f_code.co_name

    a=flex.size_t([1,2,5,6,4])
    pos={0,3,4}
    s, d = nu.selected_positions(a,pos)
    assert list(s) == [1,6,4]
    assert list(d) == [2,5]
  def test_selected_positions(self):
    # print sys._getframe().f_code.co_name

    a=flex.size_t([1,2,5,6,4])
    pos={0,3,4}
    s, d = nu.selected_positions(a,pos)
    assert list(s) == [1,6,4]
    assert list(d) == [2,5]