docstr: :return: pos_chip2boxes_idx, dict: chipid->[box_id, ...]
docstr_tok: [":","return",":","pos_chip2boxes_idx",",","dict",":","chipid-",">","[","box_id",",","...","]"]
code: def _find_pos_chips(
      self, chips: "Cx4", valid_boxes: "Bx4", valid_boxes_idx: "B"
  ):
      """
      :return: pos_chip2boxes_idx, dict: chipid->[box_id, ...]
      """
      iob = intersection_over_box(chips, valid_boxes)  # overlap, CxB
  
      iob_threshold_to_find_chips = 1.0
      pos_chip_ids, _ = self._find_chips_to_cover_overlaped_boxes(
          iob, iob_threshold_to_find_chips
      )
      pos_chip_ids = set(pos_chip_ids)
  
      iob_threshold_to_assign_box = 0.5
      pos_chip2boxes_idx = self._assign_boxes_to_pos_chips(
          iob,
          iob_threshold_to_assign_box,
          pos_chip_ids,
          valid_boxes_idx,
      )
      return pos_chip2boxes_idx
  
imports: import copy
  import math
  import random
  import numpy
  from copy import deepcopy
  from typing import List, Tuple
  from collections import defaultdict
  from .chip_box_utils import nms, transform_chip_boxes2image_boxes
  from .chip_box_utils import find_chips_to_cover_overlaped_boxes
  from .chip_box_utils import transform_chip_box
  from .chip_box_utils import intersection_over_box
label_desc: Use image node_id 13 for calling the AnnoCropper obj's underlying member method code with example usage: obj._find_pos_chips(chips, valid_boxes, valid_boxes_idx) and returns: pos_chip2boxes_idx