docs: def convert_UCERFSource(self, node):
      """
      Converts the Ucerf Source node into an SES Control object
      """
      dirname = os.path.dirname(self.fname)  # where the source_model_file is
      source_file = os.path.join(dirname, node["filename"])
      if "startDate" in node.attrib and "investigationTime" in node.attrib:
          # Is a time-dependent model - even if rates were originally
          # poissonian
          # Verify that the source time span is the same as the TOM time span
          inv_time = float(node["investigationTime"])
          if inv_time != self.investigation_time:
              raise ValueError("Source investigation time (%s) is not "
                               "equal to configuration investigation time "
                               "(%s)" % (inv_time, self.investigation_time))
          start_date = datetime.strptime(node["startDate"], "%d/%m/%Y")
      else:
          start_date = None
      return UCERFSource(
          source_file,
          self.investigation_time,
          start_date,
          float(node["minMag"]),
          npd=self.convert_npdist(node),
          hdd=self.convert_hpdist(node),
          aspect=~node.ruptAspectRatio,
          upper_seismogenic_depth=~node.pointGeometry.upperSeismoDepth,
          lower_seismogenic_depth=~node.pointGeometry.lowerSeismoDepth,
          msr=valid.SCALEREL[~node.magScaleRel](),
          mesh_spacing=self.rupture_mesh_spacing,
          trt=node["tectonicRegion"])