def setUp(self):
        # Set the source property

        self.src_mfd = mfdeven.EvenlyDiscretizedMFD(7.5, 1., [1.])
        self.src_msr = msr.BaseMSR
        self.src_tom = tom.PoissonTOM(50)
        self.sarea = WC1994()
        self.upper_seismogenic_depth = 0.
        self.lower_seismogenic_depth = 40.
        self.dip = 90.
        self.rake = 0.
        self.mesh_spacing = 1.
        self.fault_trace_start = Point(0.0, 0.0)
        self.fault_trace_end = Point(1.0, 0.0)
        self.fault_trace_nodes = [self.fault_trace_start, self.fault_trace_end]
        # Set the fault trace

        self.fault_trace = Line(self.fault_trace_nodes)
def df2nrml(df, model_name):
    '''
    Write pandas DataFrame of source models to NRML. Sources are twinned by
    magnitude to support alternative tectonic region types for large-magnitude
    events.
    '''
    if model_name.endswith('.xml'):
        model_name = model_name[:-4]
    nrml_file = model_name.replace(' ', '_') + '.xml'

    aseismic = df.a == 0
    if any(aseismic):
        print('Dropping zones with no seismicity from NRML: ' +
              ', '.join(str(item) for item in df.loc[aseismic].index))
        df = df.loc[~aseismic].copy()

    df = add_name_id(df)
    df = twin_source_by_magnitude(df)
    _check_columns(df)
    df = natural_sort(df, by='id')  # this may do nothing ...

    source_list = source_df_to_list(df)
    source_model = mtkSourceModel(name=model_name, sources=source_list)
    source_model = source_model.convert_to_oqhazardlib(tom.PoissonTOM(1.0))

    # apply per-zone discretization
    for item in source_model:
        try:
            item.area_discretization = df.loc[df.id == item.source_id,
                                              'discretization'].squeeze()
        except KeyError:
            pass

    print('Writing: %s' % os.path.abspath(nrml_file))
    write_source_model(nrml_file, source_model, name=model_name)

    return source_model