Generator for daisy chains (complementary kihs) associated with a knob.

        Notes
        -----
        Daisy chain graph is the directed graph with edges from knob residue to each hole residue for each KnobIntoHole
         in self.
        Given a KnobIntoHole, the daisy chains are non-trivial paths in this graph (walks along the directed edges)
        that begin and end at the knob.
        These paths must be of length  <= max_path_length

        Parameters
        ----------
        kih : KnobIntoHole interaction.
        max_path_length : int or None
            Maximum length of a daisy chain.
            Defaults to number of chains in self.ampal_parent.
            This is the maximum sensible value. Larger values than this will cause slow running of this function.

def daisy_chains(self, kih, max_path_length=None):
        """ Generator for daisy chains (complementary kihs) associated with a knob.

        Notes
        -----
        Daisy chain graph is the directed graph with edges from knob residue to each hole residue for each KnobIntoHole
         in self.
        Given a KnobIntoHole, the daisy chains are non-trivial paths in this graph (walks along the directed edges)
        that begin and end at the knob.
        These paths must be of length  <= max_path_length

        Parameters
        ----------
        kih : KnobIntoHole interaction.
        max_path_length : int or None
            Maximum length of a daisy chain.
            Defaults to number of chains in self.ampal_parent.
            This is the maximum sensible value. Larger values than this will cause slow running of this function.
        """
        if max_path_length is None:
            max_path_length = len(self.ampal_parent)
        g = self.daisy_chain_graph
        paths = networkx.all_simple_paths(g, source=kih.knob, target=kih.knob, cutoff=max_path_length)
        return paths