class_docstr: Computes SPLIF Fingerprints for a macromolecular complex.
  
  SPLIF fingerprints are based on a technique introduced in the
  following paper.
  
  Da, C., and D. Kireev. "Structural protein–ligand interaction
  fingerprints (SPLIF) for structure-based virtual screening:
  method and benchmark study." Journal of chemical information
  and modeling 54.9 (2014): 2555-2561.
  
  SPLIF fingerprints are a subclass of `ComplexFeaturizer`. It
  requires 3D coordinates for a molecular complex. For each ligand
  atom, it identifies close pairs of atoms from different molecules.
  These atom pairs are expanded to 2D circular fragments and a
  fingerprint for the union is turned on in the bit vector. Note that
  we slightly generalize the original paper by not requiring the
  interacting molecules to be proteins or ligands.
  
  This is conceptually pretty similar to
  `ContactCircularFingerprint` but computes ECFP fragments only
  for direct contacts instead of the entire contact region.
  
  For a macromolecular complex, returns a vector of shape
  `(len(contact_bins)*size,)`
docstr: Compute featurization for a molecular complex
  
  Parameters
  ----------
  datapoint: Tuple[str, str]
      Filenames for molecule and protein.
docstr_tok: ["Compute","featurization","for","a","molecular","complex","Parameters","--","--","--","--","--","datapoint",":","Tuple","[","str",",","str","]","Filenames","for","molecule","and","protein","."]
code: def _featurize(self, datapoint, **kwargs):
      """
      Compute featurization for a molecular complex
  
      Parameters
      ----------
      datapoint: Tuple[str, str]
          Filenames for molecule and protein.
      """
      if "complex" in kwargs:
          datapoint = kwargs.get("complex")
          raise DeprecationWarning(
              'Complex is being phased out as a parameter, please pass "datapoint" instead.'
          )
  
      try:
          fragments = load_complex(datapoint, add_hydrogens=False)
  
      except MoleculeLoadException:
          logger.warning(
              "This molecule cannot be loaded by Rdkit. Returning None"
          )
          return None
      pairwise_features = []
      # We compute pairwise contact fingerprints
      for frag1, frag2 in itertools.combinations(fragments, 2):
          # Get coordinates
          distances = compute_pairwise_distances(frag1[0], frag2[0])
          # distances = compute_pairwise_distances(prot_xyz, lig_xyz)
          vectors = [
              vectorize(
                  hash_ecfp_pair,
                  feature_dict=splif_dict,
                  size=self.size,
              )
              for splif_dict in featurize_splif(
                  frag1,
                  frag2,
                  self.contact_bins,
                  distances,
                  self.radius,
              )
          ]
          pairwise_features += vectors
      pairwise_features = np.concatenate(pairwise_features)
      return pairwise_features
  
imports: import logging
  import itertools
  import numpy
  from deepchem.utils.hash_utils import hash_ecfp_pair
  from deepchem.utils.rdkit_utils import load_complex
  from deepchem.utils.rdkit_utils import compute_all_ecfp
  from deepchem.utils.rdkit_utils import MoleculeLoadException
  from deepchem.utils.rdkit_utils import compute_contact_centroid
  from deepchem.feat import ComplexFeaturizer
  from deepchem.utils.hash_utils import vectorize
  from deepchem.utils.voxel_utils import voxelize
  from deepchem.utils.voxel_utils import convert_atom_pair_to_voxel
  from deepchem.utils.geometry_utils import compute_pairwise_distances
  from deepchem.utils.geometry_utils import subtract_centroid
  from typing import Optional, Tuple, Dict, List
label_desc: Use image node_id 2 for calling the SplifFingerprint obj's underlying member method code with example usage: obj._featurize(datapoint) and returns: pairwise_features, None