code: def compute_hbonds_in_range(
      frag1,
      frag2,
      pairwise_distances,
      hbond_dist_bin,
      hbond_angle_cutoff,
  ):
      """
      Find all pairs of (frag1_index_i, frag2_index_j) that hydrogen bond
      given a distance bin and an angle cutoff.
  
      Parameters
      ----------
      frag1: tuple
          Tuple of (coords, rdkit mol / MolecularFragment
      frag2: tuple
          Tuple of (coords, rdkit mol / MolecularFragment
      pairwise_distances:
          Matrix of shape `(N, M)` with pairwise distances between frag1/frag2.
      hbond_dist_bin: tuple
          Tuple of floats `(min_dist, max_dist)` in angstroms.
      hbond_angle_cutoffs: list[float]
          List of angles of deviances allowed for hbonds
      """
  
      contacts = np.nonzero(
          (pairwise_distances > hbond_dist_bin[0])
          & (pairwise_distances < hbond_dist_bin[1])
      )
      contacts = zip(contacts[0], contacts[1])
      hydrogen_bond_contacts = []
      for contact in contacts:
          if is_hydrogen_bond(
              frag1, frag2, contact, hbond_angle_cutoff
          ):
              hydrogen_bond_contacts.append(contact)
      return hydrogen_bond_contacts
  
file_path: deepchem/deepchem/utils/noncovalent_utils.py
imports: import numpy
  from collections import Counter
  from deepchem.utils.fragment_utils import get_partial_charge
  from deepchem.utils.rdkit_utils import compute_ring_center
  from deepchem.utils.rdkit_utils import compute_ring_normal
  from deepchem.utils.geometry_utils import angle_between
  from deepchem.utils.geometry_utils import is_angle_within_cutoff
label_desc: Use image node_id 4 for calling a global function with example usage: compute_hbonds_in_range(frag1, frag2, pairwise_distances, hbond_dist_bin, hbond_angle_cutoff) and returns: hydrogen_bond_contacts