<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def backbone(self):
 """Returns a new `Residue` containing only the backbone atoms. Returns ------- bb_monomer : Residue `Residue` containing only the backbone atoms of the original `Monomer`. Raises ------ IndexError Raise if the `atoms` dict does not contain the backbone atoms (N, CA, C, O). """

        try:
            backbone = OrderedDict([('N', self.atoms['N']),
                                    ('CA', self.atoms['CA']),
                                    ('C', self.atoms['C']),
                                    ('O', self.atoms['O'])])
        except KeyError:
            missing_atoms = filter(lambda x: x not in self.atoms.keys(),
                                   ('N', 'CA', 'C', 'O')
                                   )
            raise KeyError('Error in residue {} {} {}, missing ({}) atoms. '
                           '`atoms` must be an `OrderedDict` with coordinates '
                           'defined for the backbone (N, CA, C, O) atoms.'
                           .format(self.ampal_parent.id, self.mol_code,
                                   self.id, ', '.join(missing_atoms)))
        bb_monomer = Residue(backbone, self.mol_code, monomer_id=self.id,
                             insertion_code=self.insertion_code,
                             is_hetero=self.is_hetero)
        return bb_monomer