def compose_atom_list(*args):
if len(args) == <NUM_LIT:2>:<EOL><INDENT>atom_list = [[<EOL>i[<NUM_LIT:0>],<EOL>round(float(i[<NUM_LIT:1>]), <NUM_LIT:8>),<EOL>round(float(i[<NUM_LIT:2>]), <NUM_LIT:8>),<EOL>round(float(i[<NUM_LIT:3>]), <NUM_LIT:8>),<EOL>] for i in np.concatenate(<EOL>(args[<NUM_LIT:0>].reshape(-<NUM_LIT:1>, <NUM_LIT:1>), args[<NUM_LIT:1>]), axis=<NUM_LIT:1>)]<EOL><DEDENT>elif len(args) == <NUM_LIT:3>:<EOL><INDENT>atom_list = [<EOL>[<EOL>i[<NUM_LIT:0>],<EOL>i[<NUM_LIT:1>],<EOL>round(float(i[<NUM_LIT:2>]), <NUM_LIT:8>),<EOL>round(float(i[<NUM_LIT:3>]), <NUM_LIT:8>),<EOL>round(float(i[<NUM_LIT:4>]), <NUM_LIT:8>),<EOL>]<EOL>for i in np.concatenate(<EOL>(np.concatenate(<EOL>(args[<NUM_LIT:0>].reshape(-<NUM_LIT:1>, <NUM_LIT:1>), args[<NUM_LIT:1>].reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>), axis=<NUM_LIT:1>), args[<NUM_LIT:2>]),<EOL>axis=<NUM_LIT:1>)<EOL>]<EOL><DEDENT>else:<EOL><INDENT>raise _FunctionError(<EOL>"<STR_LIT>")<EOL><DEDENT>return atom_list<EOL>
Return an `atom list` from elements and/or atom ids and coordinates.

An `atom list` is a special object that some pywindowfunctions uses.
It is a nested list of lists with each individual list containing:

    1. [[element, coordinates (x, y, z)], ...]

    2. [[element, atom key, coordinates (x, y, z)], ...]

They work better for molecular re-building than two separate arrays for
elements and coordinates do.

Parameters
----------
elements : :class:`numpy.ndarray`
    An array of all elements (type: str) in a molecule.

coordinates : :class:`numpy.ndarray`
    An array containing molecule's coordinates.

atom_ids : :class:`numpy.ndarray`, optional
    An array of all forcfield dependent atom keys (type:str) in a molecule.


Returns
-------
list
    Version 1 or version 2 atom list depending on input parameters.

Raises
------
_FunctionError : :class:`Exception`
    Raised when wrong number of parameters is passed to the function.