code: def partial_transform(self, traj):
          
          # The result vector
          fingerprints = np.zeros((traj.n_frames, self.n_features))
          atom_pairs = np.zeros((len(self.solvent_indices), 2))
          sigma = self.sigma
  
          for i, solute_i in enumerate(self.solute_indices):
              # For each solute atom, calculate distance to all solvent
              # molecules
              atom_pairs[:, 0] = solute_i
              atom_pairs[:, 1] = self.solvent_indices
  
              distances = md.compute_distances(traj, atom_pairs, periodic=True)
              distances = np.exp(-distances / (2 * sigma * sigma))
  
              # Sum over water atoms for all frames
              fingerprints[:, i] = np.sum(distances, axis=1)
  
          return fingerprints
docs: Featurize an MD trajectory into a vector space via calculation
          of solvent fingerprints
  
          Parameters
          ----------
          traj : mdtraj.Trajectory
              A molecular dynamics trajectory to featurize.
  
          Returns
          -------
          features : np.ndarray, dtype=float, shape=(n_samples, n_features)
              A featurized trajectory is a 2D array of shape
              `(length_of_trajectory x n_features)` where each `features[i]`
              vector is computed by applying the featurization function
              to the `i`th snapshot of the input trajectory.
  
          See Also
          --------
          transform : simultaneously featurize a collection of MD trajectories