docstr: loading two modalities, grouping subject names only
code: def test_3d_concat_properties(self):
      """
      loading two modalities, grouping subject names only
      """
      data_param = {
          "mr": {
              "path_to_search": IMAGE_PATH_3D_1,
              "filename_contains": "x_y_z_1_1",
              "pixdim": (4, 3, 4),
              "axcodes": "RAS",
          },
          "ct": {
              "path_to_search": IMAGE_PATH_3D_1,
              "filename_contains": "x_y_z_1_1",
              "pixdim": (4, 3, 4),
              "axcodes": "RAS",
          },
      }
      grouping_param = {"image": ("mr", "ct")}
      reader = ImageReader().initialise(data_param, grouping_param)
      self.assertDictEqual(reader.spatial_ranks, {"image": 3})
      self.assertEqual(
          reader.output_list[0]["image"].output_pixdim,
          ((4.0, 3.0, 4.0),) * 2,
      )
      self.assertEqual(
          reader.output_list[0]["image"].output_axcodes,
          (("R", "A", "S"),) * 2,
      )
      idx, data, interp = reader()
  
      # test output
      self.assertTrue("image" in data)
      self.assertTrue(idx in range(len(reader.output_list)))
      self.assertDictEqual(interp, {"image": (1, 1)})
      # allows rounding error spatially
      self.assertAllClose(data["image"].shape[:3], (12, 8, 10), atol=1)
      self.assertAllClose(data["image"].shape[3:], (1, 2))
  
imports: from __future__ import absolute_import, print_function
  import os
  from PIL import Image
  import nibabel
  import numpy
  import tensorflow
  from niftynet.io.image_reader import ImageReader
  from tests.niftynet_testcase import NiftyNetTestCase
label_desc: Use image node_id 3 for calling the Read3D_1_1_Test obj's underlying member method code with example usage: obj.test_3d_concat_properties() without return types