<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def side_chain_environment(self, cutoff=4, include_neighbours=True, inter_chain=True, include_ligands=False, include_solvent=False):
 """Finds `Residues` with any atom within the cutoff distance of side-chain. Notes ----- Includes the parent residue in the list. Parameters cutoff : float, optional Maximum inter-atom distance for residue to be included. Defaults to 4. include_neighbours : bool, optional If `false`, does not return `Residue` at i-1, i+1 positions in same chain as `Residue`. inter_chain : bool, optional If `false`, only includes nearby `Residue` in the same chain as the `Residue`. include_ligands : bool, optional If `true`, `Residue` classed as ligands but not identified as solvent will be included in the environment. include_solvent : bool, optional If `true`, Monomers classed as categorised as solvent will be included in the environment. Returns ------- sc_environment : list List of monomers within cutoff distance of side-chain. """

        if self.mol_code == 'GLY':
            return [self]
        side_chain_dict = {x: {y: self.states[x][y]
                               for y in self.states[x] if self.states[x][y] in
                               self.side_chain} for x in self.states}
        side_chain_monomer = Monomer(
            atoms=side_chain_dict, monomer_id=self.id,
            ampal_parent=self.ampal_parent)
        sc_environment = side_chain_monomer.environment(
            cutoff=cutoff, include_ligands=include_ligands,
            include_neighbours=include_neighbours,
            include_solvent=include_solvent, inter_chain=inter_chain)
        return sc_environment