def _get_improper_type_key(improper, epsilon_conversion_factor):
    """Get the improper_type key for the harmonic improper

    Parameters
    ----------
    improper : parmed.topologyobjects.Dihedral
        The improper information from the parmed.topologyobjects.Angle
    epsilon_conversion_factor : float or int
        The epsilon conversion factor

    Returns
    ----------
    tuple, (improper_k_constant, improper_psi_o, improper_atom_1_type,
        (improper_atom_2_type, improper_atom_3_type,  improper_atom_4_type), improper_atom_1_res_type,
        (improper_atom_2_res_type, improper_atom_3_res_type, improper_atom_4_res_type)
        improper_k_constant : float
            Harmonic k-constant or bond energy scaling factor
        improper_psi_o : float
            Harmonic equilbrium improper angle
        improper_atom_1_type : str
            The atom type for atom number 1 in the dihedral
        improper_atom_2_type : str
            The atom type for atom number 2 in the dihedral
        improper_atom_3_type : str
            The atom type for atom number 3 in the dihedral
        improper_atom_4_type : str
            The atom type for atom number 4 in the dihedral
        improper_atom_1_res_type : str
            The residue name for atom number 1 in the dihedral
        improper_atom_2_res_type : str
            The residue name for atom number 2 in the dihedral
        improper_atom_3_res_type : str
            The residue name for atom number 3 in the dihedral
        improper_atom_4_res_type : str
            The residue name for atom number 4 in the dihedral
    """
    lj_unit = 1 / epsilon_conversion_factor

    improper_k_constant = round(improper.type.psi_k * lj_unit, 8)
    improper_psi_o = round(improper.type.psi_eq, 8)
    improper_atom_1_type = improper.atom1.type
    improper_atom_2_type = improper.atom2.type
    improper_atom_3_type = improper.atom3.type
    improper_atom_4_type = improper.atom4.type
    improper_atom_1_res_type = improper.atom1.residue.name
    improper_atom_2_res_type = improper.atom2.residue.name
    improper_atom_3_res_type = improper.atom3.residue.name
    improper_atom_4_res_type = improper.atom4.residue.name

    return (
        improper_k_constant,
        improper_psi_o,
        improper_atom_1_type,
        (improper_atom_2_type, improper_atom_3_type, improper_atom_4_type),
        improper_atom_1_res_type,
        (
            improper_atom_2_res_type,
            improper_atom_3_res_type,
            improper_atom_4_res_type,
        ),
    )