class_docstr: For a concrete example::
  
      _input_sources define multiple modality mappings, e.g.,
      _input_sources {'image': ('T1', 'T2'), 'label': ('manual_map',)}
  
  means:
  
  'image' consists of two components, formed by
  concatenating 'T1' and 'T2' input source images.
  'label' consists of one component, loading from 'manual_map'
  
  :param self._names: a tuple of the output names of this reader.
      ``('image', 'labels')``
  
  :param self._shapes: the shapes after combining input sources
      ``{'image': (192, 160, 192, 1, 2), 'label': (192, 160, 192, 1, 1)}``
  
  :param self._dtypes: store the dictionary of tensorflow shapes
      ``{'image': tf.float32, 'label': tf.float32}``
  
  :param self.output_list: a list of dictionaries, with each item::
  
      {'image': <niftynet.io.image_type.SpatialImage4D object>,
      'label': <niftynet.io.image_type.SpatialImage3D object>}
docstr: Image shapes before any preprocessing.
  
  :return: tuple of integers as image shape
  
  
  .. caution::
  
      To have fast access, the spatial dimensions are not accurate
  
          1. only read from the first image in list
          2. not considering effects of random augmentation layers
              but time and modality dimensions should be correct
docstr_tok: ["Image","shapes","before","any","preprocessing",".",":","return",":","tuple","of","integers","as","image","shape","..","caution",":",":","To","have","fast","access",",","the","spatial","dimensions","are","not","accurate","1.","only","read","from","the","first","image","in","list","2.","not","considering","effects","of","random","augmentation","layers","but","time","and","modality","dimensions","should","be","correct"]
code: def shapes(self):
      """
      Image shapes before any preprocessing.
  
      :return: tuple of integers as image shape
  
  
      .. caution::
  
          To have fast access, the spatial dimensions are not accurate
  
              1. only read from the first image in list
              2. not considering effects of random augmentation layers
                  but time and modality dimensions should be correct
      """
      if not self.output_list:
          tf.logging.fatal("Please initialise the reader first.")
          raise RuntimeError
      if not self._shapes:
          first_image = self.output_list[0]
          self._shapes = {
              field: first_image[field].shape for field in self.names
          }
      return self._shapes
  
imports: from __future__ import absolute_import, division, print_function
  from copy import deepcopy
  import argparse
  import numpy
  import pandas
  import tensorflow
  from six import string_types
  from niftynet.io.misc_io import dtype_casting
  from niftynet.io.image_sets_partitioner import COLUMN_UNIQ_ID
  from niftynet.io.image_type import ImageFactory
  from niftynet.layer.base_layer import Layer, DataDependentLayer, RandomisedLayer
  from niftynet.utilities.user_parameters_helper import make_input_tuple
  from niftynet.utilities.util_common import print_progress_bar, ParserNamespace
  from niftynet.io.image_sets_partitioner import ImageSetsPartitioner
  from niftynet.utilities.util_common import look_up_operations
label_desc: Use image node_id 7 for calling the ImageReader obj's underlying member method code with example usage: obj.shapes() and returns: self