code: def describe_features(self, traj):
          
  
          feature_descs = []
          for dihed_type in self.types:
              # TODO: Don't recompute dihedrals, just get the indices
              func = getattr(md, 'compute_%s' % dihed_type)
              # ainds is a list of four-tuples of atoms participating
              # in each dihedral
              aind_tuples, _ = func(traj)
              top = traj.topology
              zippy = zippy_maker(aind_tuples, top)
  
              if self.sincos:
                  zippy = itertools.product(['Dihedral'],[dihed_type], ['sin', 'cos'], zippy)
              else:
                  zippy = itertools.product(['Dihedral'],[dihed_type], ['nosincos'], zippy)
  
              feature_descs.extend(dict_maker(zippy))
  
          return feature_descs
docs: Return a list of dictionaries describing the dihderal features.
  
          Parameters
          ----------
          traj : mdtraj.Trajectory
              The trajectory to describe
  
          Returns
          -------
          feature_descs : list of dict
              Dictionary describing each feature with the following information
              about the atoms participating in each dihedral
                  - resnames: unique names of residues
                  - atominds: the four atom indicies
                  - resseqs: unique residue sequence ids (not necessarily
                    0-indexed)
                  - resids: unique residue ids (0-indexed)
                  - featurizer: Dihedral
                  - featuregroup: the type of dihedral angle and whether sin or
                    cos has been applied.