code: def read_file(self, identifier, mfd_spacing=0.1, simple_mesh_spacing=1.0,
                    complex_mesh_spacing=4.0, area_discretization=10.):
          
          sm_node = node_from_xml(self.input_file)[0]
          if sm_node[0].tag.startswith('{http://openquake.org/xmlns/nrml/0.4}'):
              node_sets = [sm_node]
              sm_name = sm_node.get("name", "")
          else:  # format NRML 0.5+
              node_sets = sm_node
              sm_name = sm_node["name"]
          source_model = mtkSourceModel(identifier, name=sm_name)
          for node_set in node_sets:
              for node in node_set:
                  if "pointSource" in node.tag:
                      source_model.sources.append(
                          parse_point_source_node(node, mfd_spacing))
                  elif "areaSource" in node.tag:
                      source_model.sources.append(
                          parse_area_source_node(node, mfd_spacing))
                  elif "simpleFaultSource" in node.tag:
                      source_model.sources.append(
                          parse_simple_fault_node(node, mfd_spacing,
                                                  simple_mesh_spacing))
                  elif "complexFaultSource" in node.tag:
                      source_model.sources.append(
                          parse_complex_fault_node(node, mfd_spacing,
                                                   complex_mesh_spacing))
                  # TODO: multiPointSource are not supported
                  else:
                      print("Source typology %s not recognised - skipping!"
                            % node.tag)
          return source_model
docs: Reads in the source model in returns an instance of the :class:
          openquake.hmtk.sourcs.source_model.mtkSourceModel