class_docstr: Object to hold operation, object type and object identifier
  
  An atom represents an element in an expression.  For example::
  
      a.b[0].c
  
  has four elements.  We call these elements "atoms".
  
  We represent objects (like ``a``) as dicts for convenience.
  
  The last element (``.c``) is an ``op = ast.Attribute`` operation where the
  object type (`obj_type`) of ``c`` is not constrained (we can't tell from
  the operation what type it is).  The `obj_id` is the name of the object --
  "c".
  
  The second to last element ``[0]``, is ``op = ast.Subscript``, with object type
  dict (we know from the subsequent operation ``.c`` that this must be an
  object, we represent the object by a dict).  The `obj_id` is the index 0.
  
  Parameters
  ----------
  op : {'name', 'attr', 'list'}
      Assignment type.  Assignment to name (root namespace), attribute or
      list element.
  obj_type : {list, dict, other}
      Object type being assigned to.
  obj_id : str or int
      Key (``obj_type is dict``) or index (``obj_type is list``)
code: def __init__(self, op, obj_type, obj_id):
      self.op = op
      self.obj_type = obj_type
      self.obj_id = obj_id
  
file_path: nibabel/nibabel/nicom/ascconv.py
imports: import ast
  import re
  from collections import OrderedDict
label_desc: Use image node_id 1 to create a new Atom object  with example: obj = Atom(op, obj_type, obj_id)