def partVirtualHelixAddedSlot(self, sender, id_num, virtual_helix,
                                  neighbors):
        """Summary

        Args:
            sender (obj): Model object that emitted the signal.
            id_num (int): VirtualHelix ID number. See `NucleicAcidPart` for description and related methods.
            neighbors (TYPE): Description

        Args:
            TYPE: Description
        """
        #        print('[NAPI] ADDED SLOT CALLED ON VH %s; called by %s' % (id_num, sender))
        vhi = SliceVirtualHelixItem(virtual_helix, self)
        self._virtual_helix_item_hash[id_num] = vhi
        self._refreshVirtualHelixItemGizmos(id_num, vhi)
        for neighbor_id in neighbors:
            nvhi = self._virtual_helix_item_hash.get(neighbor_id, False)
            if nvhi:
                self._refreshVirtualHelixItemGizmos(neighbor_id, nvhi)
        self.enlargeRectToFit()

        position = sender.locationQt(id_num=id_num,
                                     scale_factor=self.scale_factor)

        if self.griditem.grid_type is GridType.HONEYCOMB:
            coordinates = HoneycombDnaPart.positionModelToLatticeCoord(
                DEFAULT_RADIUS,
                position[0],
                position[1],
                scale_factor=self.scale_factor)
        else:
            coordinates = SquareDnaPart.positionModelToLatticeCoord(
                DEFAULT_RADIUS,
                position[0],
                position[1],
                scale_factor=self.scale_factor)

        assert id_num not in self.coordinates_to_vhid.values()
        if coordinates in self.coordinates_to_vhid.values():
            print('COORDINATES DUPLICATE %s in %s' %
                  (coordinates, self.coordinates_to_vhid.values()))

        self.coordinates_to_vhid[coordinates] = id_num

        assert len(self.coordinates_to_vhid.keys()) == len(
            set(self.coordinates_to_vhid.keys()))
        assert len(self.coordinates_to_vhid.values()) == len(
            set(self.coordinates_to_vhid.values()))
    def createToolHoverMove(self, tool, event):
        """Summary

        Args:
            tool (TYPE): Description
            event (TYPE): Description

        Returns:
            TYPE: Description
        """
        is_alt = True if event.modifiers() & Qt.AltModifier else False
        mapped_position = self.griditem.mapFromScene(event.scenePos())
        event_xy = (mapped_position.x(), mapped_position.y())
        if self.griditem.grid_type is GridType.HONEYCOMB:
            event_coord = HoneycombDnaPart.positionModelToLatticeCoord(
                DEFAULT_RADIUS,
                event_xy[0],
                event_xy[1],
                scale_factor=self.scale_factor,
                strict=True)
        elif self.griditem.grid_type is GridType.SQUARE:
            event_coord = SquareDnaPart.positionModelToLatticeCoord(
                DEFAULT_RADIUS,
                event_xy[0],
                event_xy[1],
                scale_factor=self.scale_factor,
                strict=True)
        else:
            event_coord = None

        self.last_mouse_position = event_xy

        if event_coord:
            try:
                grid_point = self.griditem.points_dict[(event_coord)]
                self.setLastHoveredItem(grid_point)
            except KeyError:
                pass

        # Un-highlight GridItems if necessary by calling createToolHoverLeave
        if len(self._highlighted_path) > 1 or (
                self._highlighted_path
                and self._highlighted_path[0] != event_coord):
            self.removeAllCreateHints()

        self._highlighted_grid_point = event_coord
        if event_coord:
            self.griditem.highlightGridPoint(row=event_coord[0],
                                             column=event_coord[1],
                                             on=True)

        # Highlight GridItems if alt is being held down
        if is_alt and self.shortest_path_add_mode and event_coord is not None:
            self._previewSpa(event_xy)
        else:
            if is_alt and event_coord is not None:
                self.highlightOneGridPoint(self.getLastHoveredCoordinates(),
                                           styles.SPA_START_HINT_COLOR)
            elif not is_alt and event_coord is not None:
                part = self._model_part
                next_idnums = (part._getNewIdNum(0), part._getNewIdNum(1))
                self.griditem.showCreateHint(event_coord,
                                             next_idnums=next_idnums)
                self._highlighted_path.append(event_coord)

        tool.hoverMoveEvent(self, event)
        return QGraphicsItem.hoverMoveEvent(self, event)