<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def knob_end(self):
 """ Coordinates of the end of the knob residue (atom in side-chain furthest from CB atom. Returns CA coordinates for GLY. """

        side_chain_atoms = self.knob_residue.side_chain
        if not side_chain_atoms:
            return self.knob_residue['CA']
        distances = [distance(self.knob_residue['CB'], x) for x in side_chain_atoms]
        max_d = max(distances)
        knob_end_atoms = [atom for atom, d in zip(side_chain_atoms, distances) if d == max_d]
        if len(knob_end_atoms) == 1:
            return knob_end_atoms[0]._vector
        else:
            return numpy.mean([x._vector for x in knob_end_atoms], axis=0)