示例#1
0
    def test_cut_arrays(self):
        print("MDF cut big array files")
        for input_file in Path(TestMDF.tempdir_array.name).iterdir():
            for whence in (0, 1):
                print(input_file, whence)

                outfile1 = MDF(input_file)
                outfile1.configure(read_fragment_size=8000)
                outfile1 = outfile1.cut(
                    stop=105.5, whence=whence, include_ends=False).save(
                        Path(TestMDF.tempdir.name) / "tmp1", overwrite=True)
                outfile2 = MDF(input_file)
                outfile2.configure(read_fragment_size=8000)
                outfile2 = outfile2.cut(start=105.5,
                                        stop=201.5,
                                        whence=whence,
                                        include_ends=False).save(
                                            Path(TestMDF.tempdir.name) /
                                            "tmp2",
                                            overwrite=True)
                outfile3 = MDF(input_file)
                outfile3.configure(read_fragment_size=8000)
                outfile3 = outfile3.cut(
                    start=201.5, whence=whence, include_ends=False).save(
                        Path(TestMDF.tempdir.name) / "tmp3", overwrite=True)

                outfile = MDF.concatenate(
                    [outfile1, outfile2, outfile3],
                    MDF(input_file).version).save(Path(TestMDF.tempdir.name) /
                                                  "tmp_cut",
                                                  overwrite=True)

                equal = True

                with MDF(outfile) as mdf:
                    mdf.configure(read_fragment_size=8000)

                    for i, group in enumerate(mdf.groups):

                        if i == 0:

                            samples = [
                                np.ones((cycles, 2, 3), dtype=np.uint64),
                                np.ones((cycles, 2), dtype=np.uint64),
                                np.ones((cycles, 3), dtype=np.uint64),
                            ]

                            for j in range(1, 20):

                                types = [
                                    ("Channel_{}".format(j), "(2, 3)<u8"),
                                    ("channel_{}_axis_1".format(j),
                                     "(2, )<u8"),
                                    ("channel_{}_axis_2".format(j),
                                     "(3, )<u8"),
                                ]
                                types = np.dtype(types)

                                vals = mdf.get(
                                    "Channel_{}".format(j),
                                    group=i,
                                    samples_only=True,
                                )[0]
                                target = [arr * j for arr in samples]
                                target = np.core.records.fromarrays(
                                    target, dtype=types)
                                if not np.array_equal(vals, target):
                                    equal = False
                                    print(
                                        i,
                                        j,
                                        len(target),
                                        len(vals),
                                        vals,
                                        target,
                                        sep="\n\n",
                                    )
                                    1 / 0

                        elif i == 1:

                            samples = np.ones((cycles, 2, 3), dtype=np.uint64)
                            axis_0 = np.ones((cycles, 2), dtype=np.uint64)
                            axis_1 = np.ones((cycles, 3), dtype=np.uint64)

                            for j in range(1, 20):

                                types = [("Channel_{}".format(j), "(2, 3)<u8")]
                                types = np.dtype(types)

                                vals = mdf.get(
                                    "Channel_{}".format(j),
                                    group=i,
                                    samples_only=True,
                                )[0]
                                target = [samples * j]
                                target = np.core.records.fromarrays(
                                    target, dtype=types)
                                if not np.array_equal(vals, target):
                                    equal = False
                                    1 / 0

                        elif i == 2:

                            samples = [
                                np.ones(cycles, dtype=np.uint8),
                                np.ones(cycles, dtype=np.uint16),
                                np.ones(cycles, dtype=np.uint32),
                                np.ones(cycles, dtype=np.uint64),
                                np.ones(cycles, dtype=np.int8),
                                np.ones(cycles, dtype=np.int16),
                                np.ones(cycles, dtype=np.int32),
                                np.ones(cycles, dtype=np.int64),
                            ]

                            for j in range(1, 20):

                                types = [
                                    ("struct_{}_channel_0".format(j),
                                     np.uint8),
                                    ("struct_{}_channel_1".format(j),
                                     np.uint16),
                                    ("struct_{}_channel_2".format(j),
                                     np.uint32),
                                    ("struct_{}_channel_3".format(j),
                                     np.uint64),
                                    ("struct_{}_channel_4".format(j), np.int8),
                                    ("struct_{}_channel_5".format(j),
                                     np.int16),
                                    ("struct_{}_channel_6".format(j),
                                     np.int32),
                                    ("struct_{}_channel_7".format(j),
                                     np.int64),
                                ]
                                types = np.dtype(types)

                                vals = mdf.get(
                                    "Channel_{}".format(j),
                                    group=i,
                                    samples_only=True,
                                )[0]
                                target = [arr * j for arr in samples]
                                target = np.core.records.fromarrays(
                                    target, dtype=types)
                                if not np.array_equal(vals, target):
                                    equal = False
                                    1 / 0

            self.assertTrue(equal)
示例#2
0
def open_mdf3():
    os.chdir(path)
    with Timer('asammdf {} mdfv3'.format(asammdf_version)):
        x = MDF(r'test.mdf')
示例#3
0
from asammdf import MDF, Signal
import numpy as np

cycles = 100
sigs = []

mdf = MDF()

t = np.arange(cycles, dtype=np.float64)

# no conversion
sig = Signal(
    np.ones(cycles, dtype=np.uint64),
    t,
    name="Channel_no_conversion",
    unit="s",
    conversion=None,
    comment="Unsigned 64 bit channel {}",
)
sigs.append(sig)

# linear
conversion = {
    "a": 2,
    "b": -0.5,
}
sig = Signal(
    np.ones(cycles, dtype=np.int64),
    t,
    name="Channel_linear_conversion",
    unit="Nm",
示例#4
0
def convert_v3_v4():
    os.chdir(path)
    with MDF(r'test.mdf') as x:
        with Timer('asammdf {} v3 to v4'.format(asammdf_version)):
            y = x.convert('4.10')
示例#5
0
def convert_v4_v3():
    os.chdir(path)
    with MDF(r'test.mf4') as x:
        with Timer('asammdf {} v4 to v3'.format(asammdf_version)):
            y = x.convert('3.30')
            y.close()
示例#6
0
    def test_cut(self):
        print("MDF cut big files tests")

        t = np.arange(cycles, dtype=np.float64)

        for mdfname in os.listdir('tmpdir'):
            for memory in MEMORY:
                input_file = os.path.join('tmpdir', mdfname)
                for whence in (0, 1):
                    print(input_file, memory)

                    outfile0 = MDF(input_file, memory=memory)
                    outfile0.configure(read_fragment_size=8000)
                    outfile0 = outfile0.cut(stop=-1,
                                            whence=whence).save('tmp0',
                                                                overwrite=True)

                    outfile1 = MDF(input_file, memory=memory)
                    outfile1.configure(read_fragment_size=8000)
                    outfile1 = outfile1.cut(stop=105,
                                            whence=whence).save('tmp1',
                                                                overwrite=True)
                    outfile2 = MDF(input_file, memory=memory)
                    outfile2.configure(read_fragment_size=8000)
                    outfile2 = outfile2.cut(start=105.1,
                                            stop=201,
                                            whence=whence).save('tmp2',
                                                                overwrite=True)
                    outfile3 = MDF(input_file, memory=memory)
                    outfile3.configure(read_fragment_size=8000)
                    outfile3 = outfile3.cut(start=201.1,
                                            whence=whence).save('tmp3',
                                                                overwrite=True)
                    outfile4 = MDF(input_file, memory=memory)
                    outfile4.configure(read_fragment_size=8000)
                    outfile4 = outfile4.cut(start=7000,
                                            whence=whence).save('tmp4',
                                                                overwrite=True)

                    outfile = MDF.merge(
                        [outfile0, outfile1, outfile2, outfile3, outfile4],
                        MDF(input_file, memory='minimum').version,
                        memory=memory,
                    ).save('tmp_cut', overwrite=True)

                    with MDF(outfile) as mdf:

                        for i, group in enumerate(mdf.groups):
                            if i == 0:
                                v = np.ones(cycles, dtype=np.uint64)
                                for j in range(1, 20):
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, v * (j - 1))
                                    if not cond:
                                        print(i, j, vals, v * (j - 1),
                                              len(vals), len(v))
                                    self.assertTrue(cond)
                            elif i == 1:
                                v = np.ones(cycles, dtype=np.int64)
                                for j in range(1, 20):
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    cond = np.array_equal(
                                        vals,
                                        v * (j - 1) - 0.5)
                                    if not cond:
                                        print(vals,
                                              v * (j - 1) - 0.5, len(vals),
                                              len(v))
                                    self.assertTrue(cond)
                            elif i == 2:
                                v = np.arange(cycles, dtype=np.int64) / 100.0
                                form = '{} * sin(v)'
                                for j in range(1, 20):
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    f = form.format(j - 1)
                                    cond = np.array_equal(
                                        vals, numexpr.evaluate(f))
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)
                            elif i == 3:
                                v = np.ones(cycles, dtype=np.int64)
                                form = '({} * v -0.5) / 1'
                                for j in range(1, 20):
                                    f = form.format(j - 1)
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    cond = np.array_equal(
                                        vals, numexpr.evaluate(f))
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)
                            elif i == 4:

                                for j in range(1, 20):
                                    target = np.array([
                                        'Channel {} sample {}'.format(
                                            j, k).encode('ascii')
                                        for k in range(cycles)
                                    ])
                                    vals = mdf.get(group=i,
                                                   index=j + 1,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, target)
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)

                            elif i == 5:
                                v = np.ones(cycles, dtype=np.dtype('(8,)u1'))
                                for j in range(1, 20):
                                    target = v * j
                                    vals = mdf.get(group=i,
                                                   index=j + 1,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, target)
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)

                            elif i == 6:
                                v = np.ones(cycles, dtype=np.uint64)
                                for j in range(1, 20):
                                    target = v * j
                                    vals = mdf.get(group=i,
                                                   index=j + 1,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, target)
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)
        cleanup_files()
示例#7
0
def open_mdf4_nodata():
    os.chdir(path)
    with Timer('asammdf {} nodata mdfv4'.format(asammdf_version)):
        x = MDF(r'test.mf4', load_measured_data=False)
示例#8
0
def open_mdf4(output, fmt):

    with Timer('Open file', f'asammdf {asammdf_version} mdfv4', fmt) as timer:
        MDF(r'test.mf4')
    output.send([timer.output, timer.error])
示例#9
0
def save_mdf4(output, fmt):

    x = MDF(r'test.mf4')
    with Timer('Save file', f'asammdf {asammdf_version} mdfv4', fmt) as timer:
        x.save(r'x.mf4', overwrite=True)
    output.send([timer.output, timer.error])
示例#10
0
def main(text_output, fmt):
    if os.path.dirname(__file__):
        os.chdir(os.path.dirname(__file__))
    for version in ('3.30', '4.10'):
        generate_test_files(version)

    mdf = MDF('test.mdf', 'minimum')
    v3_size = os.path.getsize('test.mdf') // 1024 // 1024
    v3_groups = len(mdf.groups)
    v3_channels = sum(len(gp['channels']) for gp in mdf.groups)
    v3_version = mdf.version

    mdf = MDF('test.mf4', 'minimum')
    v4_size = os.path.getsize('test.mf4') // 1024 // 1024
    v4_groups = len(mdf.groups)
    v4_channels = sum(len(gp['channels']) for gp in mdf.groups)
    v4_version = mdf.version

    listen, send = multiprocessing.Pipe()
    output = MyList()
    errors = []

    installed_ram = round(psutil.virtual_memory().total / 1024 / 1024 / 1024)

    output.append('\n\nBenchmark environment\n')
    output.append('* {}'.format(sys.version))
    output.append('* {}'.format(platform.platform()))
    output.append('* {}'.format(platform.processor()))
    output.append('* numpy {}'.format(np.__version__))
    output.append('* {}GB installed RAM\n'.format(installed_ram))
    output.append('Notations used in the results\n')
    output.append(('* compress = mdfreader mdf object created with '
                   'compression=blosc'))
    output.append(('* nodata = mdfreader mdf object read with '
                   'no_data_loading=True'))
    output.append('\nFiles used for benchmark:\n')
    output.append('* mdf version {}'.format(v3_version))
    output.append('    * {} MB file size'.format(v3_size))
    output.append('    * {} groups'.format(v3_groups))
    output.append('    * {} channels'.format(v3_channels))
    output.append('* mdf version {}'.format(v4_version))
    output.append('    * {} MB file size'.format(v4_size))
    output.append('    * {} groups'.format(v4_groups))
    output.append('    * {} channels\n\n'.format(v4_channels))

    OPEN, SAVE, GET, CONVERT, MERGE, FILTER, CUT = 1, 0, 0, 0, 0, 0, 0

    tests = (
        #          open_mdf3,
        #          open_reader3,
        #          open_reader3_compression,
        #          open_reader3_nodata,
        open_mdf4,
        #          open_reader4,
        #          open_reader4_compression,
        open_reader4_nodata,
    )

    if tests and OPEN:
        output.extend(table_header('Open file', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        save_mdf3,
        save_reader3,
        save_reader3_nodata,
        save_reader3_compression,
        save_mdf4,
        save_reader4,
        save_reader4_nodata,
        save_reader4_compression,
    )

    if tests and SAVE:
        output.extend(table_header('Save file', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        get_all_mdf3,
        get_all_reader3,
        get_all_reader3_nodata,
        get_all_reader3_compression,
        get_all_mdf4,
        get_all_reader4,
        get_all_reader4_compression,
        get_all_reader4_nodata,
    )

    if tests and GET:
        output.extend(table_header('Get all channels (36424 calls)', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        convert_v3_v4,
        convert_v4_v3,
    )

    if tests and CONVERT:
        output.extend(table_header('Convert file', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        merge_v3,
        merge_reader_v3,
        merge_reader_v3_compress,
        merge_reader_v3_nodata,
        merge_v4,
        merge_reader_v4,
        merge_reader_v4_nodata,
        merge_reader_v4_compress,
    )

    if tests and MERGE:
        output.extend(table_header('Merge 3 files', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        filter_asam,
        filter_reader4,
        filter_reader4_compression,
        filter_reader4_nodata,
    )

    if tests and FILTER:
        output.extend(table_header('Filter 200 channels', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        cut_asam,
        cut_reader4,
        cut_reader4_compression,
        cut_reader4_nodata,
    )

    if tests and CUT:
        output.extend(table_header('Cut file from 20% to 80%', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    errors = [err for err in errors if err]
    if errors:
        print('\n\nERRORS\n', '\n'.join(errors))

    if text_output:
        arch = 'x86' if platform.architecture()[0] == '32bit' else 'x64'
        file = '{}_asammdf_{}_mdfreader_{}.{}'.format(arch, asammdf_version,
                                                      mdfreader_version, fmt)
        with open(file, 'w') as out:
            out.write('\n'.join(output))

    for file in ('x.mdf', 'x.mf4'):
        if PYVERSION >= 3:
            try:
                os.remove(file)
            except FileNotFoundError:
                pass
        else:
            try:
                os.remove(file)
            except IOError:
                pass
    return graph_

#def read_df():
dfs = {}
for datFile in datFiles:
    baseName = os.path.basename(datFile)[:-4]
    KS_filename = baseName + '_KS.xlsx'
    KS_filepath = os.path.join(folderPath, KS_filename)
    xlsx_KS_file = pd.ExcelFile(KS_filepath)
    df_KS = xlsx_KS_file.parse('Sheet1')
    df_KS.drop(([0]),axis=0,inplace=True)
    sl_no = list(range(1,12))
    df_KS['sl_no'] = sl_no
    df_KS.set_index(df_KS['sl_no'])
    
    mdf = MDF(datFile)
    allSignals = list(mdf.channels_db.keys())
    measuredSignals = []
    #remove signals with CPP in it
    for signal in allSignals:
        if not(("CCP" in signal) or ("_sword" in signal) or "$" in signal):
            measuredSignals.append(signal)
        #creating an empty list of important signals
    impSignals = ['cps_n_engine', 'egr_b_operate_valve', 
                     'egr_T_exhaust_temperature', 'egr_T_oil_temperature',
                     'egr_T_limiting_temp_low', 'egr_T_limiting_temp_high',
                     'egr_P_exhaustp','egr_P_intakep_min','egr_P_intakep']
    df = mdf.to_dataframe(
            channels=impSignals,
            raster= 'egr_b_operate_valve',
            time_from_zero=True,
示例#12
0
def generate_test_file(tmpdir, version="4.10"):
    mdf = MDF(version=version)

    if version <= "3.30":
        filename = Path(tmpdir) / f"big_test_{version}.mdf"
    else:
        filename = Path(tmpdir) / f"big_test_{version}.mf4"

    if filename.exists():
        return filename

    t = np.arange(cycles, dtype=np.float64)

    cls = v4b.ChannelConversion if version >= "4.00" else v3b.ChannelConversion

    # no conversion
    sigs = []
    for i in range(channels_count):
        sig = Signal(
            np.ones(cycles, dtype=np.uint64) * i,
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=None,
            comment="Unsigned int 16bit channel {}".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # linear
    sigs = []
    for i in range(channels_count):
        conversion = {
            "conversion_type": v4c.CONVERSION_TYPE_LIN
            if version >= "4.00"
            else v3c.CONVERSION_TYPE_LINEAR,
            "a": float(i),
            "b": -0.5,
        }
        sig = Signal(
            np.ones(cycles, dtype=np.int64),
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=cls(**conversion),
            comment="Signed 16bit channel {} with linear conversion".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # algebraic
    sigs = []
    for i in range(channels_count):
        conversion = {
            "conversion_type": v4c.CONVERSION_TYPE_ALG
            if version >= "4.00"
            else v3c.CONVERSION_TYPE_FORMULA,
            "formula": "{} * sin(X)".format(i),
        }
        sig = Signal(
            np.arange(cycles, dtype=np.int32) / 100.0,
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=cls(**conversion),
            comment="Sinus channel {} with algebraic conversion".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # rational
    sigs = []
    for i in range(channels_count):
        conversion = {
            "conversion_type": v4c.CONVERSION_TYPE_RAT
            if version >= "4.00"
            else v3c.CONVERSION_TYPE_RAT,
            "P1": 0,
            "P2": i,
            "P3": -0.5,
            "P4": 0,
            "P5": 0,
            "P6": 1,
        }
        sig = Signal(
            np.ones(cycles, dtype=np.int64),
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=cls(**conversion),
            comment="Channel {} with rational conversion".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # string
    sigs = []
    encoding = "latin-1" if version < "4.00" else "utf-8"
    for i in range(channels_count):
        sig = [
            "Channel {} sample {}".format(i, j).encode(encoding) for j in range(cycles)
        ]
        sig = Signal(
            np.array(sig),
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            comment="String channel {}".format(i),
            raw=True,
            encoding=encoding,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # byte array
    sigs = []
    ones = np.ones(cycles, dtype=np.dtype("(8,)u1"))
    for i in range(channels_count):
        sig = Signal(
            ones * i,
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            comment="Byte array channel {}".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # value to text
    sigs = []
    ones = np.ones(cycles, dtype=np.uint64)
    conversion = {
        "raw": np.arange(255, dtype=np.float64),
        "phys": np.array(["Value {}".format(i).encode("ascii") for i in range(255)]),
        "conversion_type": v4c.CONVERSION_TYPE_TABX
        if version >= "4.00"
        else v3c.CONVERSION_TYPE_TABX,
        "links_nr": 260,
        "ref_param_nr": 255,
    }

    for i in range(255):
        conversion["val_{}".format(i)] = conversion[
            "param_val_{}".format(i)
        ] = conversion["raw"][i]
        conversion["text_{}".format(i)] = conversion["phys"][i]
    conversion["text_{}".format(255)] = "Default"

    for i in range(channels_count):
        sig = Signal(
            ones * i,
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            comment="Value to text channel {}".format(i),
            conversion=cls(**conversion),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    name = mdf.save(filename, overwrite=True)
    mdf.close()
示例#13
0
def generate_arrays_test_file(tmpdir):
    version = "4.10"
    mdf = MDF(version=version)
    filename = Path(tmpdir) / f"arrays_test_{version}.mf4"

    if filename.exists():
        return filename

    t = np.arange(cycles, dtype=np.float64)

    # lookup tabel with axis
    sigs = []
    for i in range(array_channels_count):
        samples = [
            np.ones((cycles, 2, 3), dtype=np.uint64) * i,
            np.ones((cycles, 2), dtype=np.uint64) * i,
            np.ones((cycles, 3), dtype=np.uint64) * i,
        ]

        types = [
            ("Channel_{}".format(i), "(2, 3)<u8"),
            ("channel_{}_axis_1".format(i), "(2, )<u8"),
            ("channel_{}_axis_2".format(i), "(3, )<u8"),
        ]

        sig = Signal(
            np.core.records.fromarrays(samples, dtype=np.dtype(types)),
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=None,
            comment="Array channel {}".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # lookup tabel with default axis
    sigs = []
    for i in range(array_channels_count):
        samples = [np.ones((cycles, 2, 3), dtype=np.uint64) * i]

        types = [("Channel_{}".format(i), "(2, 3)<u8")]

        sig = Signal(
            np.core.records.fromarrays(samples, dtype=np.dtype(types)),
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=None,
            comment="Array channel {} with default axis".format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # structure channel composition
    sigs = []
    for i in range(array_channels_count):
        samples = [
            np.ones(cycles, dtype=np.uint8) * i,
            np.ones(cycles, dtype=np.uint16) * i,
            np.ones(cycles, dtype=np.uint32) * i,
            np.ones(cycles, dtype=np.uint64) * i,
            np.ones(cycles, dtype=np.int8) * i,
            np.ones(cycles, dtype=np.int16) * i,
            np.ones(cycles, dtype=np.int32) * i,
            np.ones(cycles, dtype=np.int64) * i,
        ]

        types = [
            ("struct_{}_channel_0".format(i), np.uint8),
            ("struct_{}_channel_1".format(i), np.uint16),
            ("struct_{}_channel_2".format(i), np.uint32),
            ("struct_{}_channel_3".format(i), np.uint64),
            ("struct_{}_channel_4".format(i), np.int8),
            ("struct_{}_channel_5".format(i), np.int16),
            ("struct_{}_channel_6".format(i), np.int32),
            ("struct_{}_channel_7".format(i), np.int64),
        ]

        sig = Signal(
            np.core.records.fromarrays(samples, dtype=np.dtype(types)),
            t,
            name="Channel_{}".format(i),
            unit="unit_{}".format(i),
            conversion=None,
            comment="Structure channel composition {}".format(i),
            raw=True,
        )
        sigs.append(sig)

    mdf.append(sigs, common_timebase=True)

    name = mdf.save(filename, overwrite=True)

    mdf.close()
示例#14
0
    def test_read(self):
        print("MDF read big files")
        for input_file in Path(TestMDF.tempdir_general.name).iterdir():
            print(input_file)

            equal = True

            for inp in (input_file, BytesIO(input_file.read_bytes())):

                with MDF(inp) as mdf:

                    for i, group in enumerate(mdf.groups):
                        if i == 0:
                            v = np.ones(cycles, dtype=np.uint64)
                            for j in range(1, 20):
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)[0]
                                if not np.array_equal(vals, v * (j - 1)):
                                    equal = False
                        elif i == 1:
                            v = np.ones(cycles, dtype=np.int64)
                            for j in range(1, 20):
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)[0]
                                if not np.array_equal(vals, v * (j - 1) - 0.5):
                                    equal = False
                        elif i == 2:
                            v = np.arange(cycles, dtype=np.int64) / 100.0
                            form = "{} * sin(v)"
                            for j in range(1, 20):
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)[0]
                                f = form.format(j - 1)
                                if not np.array_equal(vals,
                                                      numexpr.evaluate(f)):
                                    equal = False
                        elif i == 3:
                            v = np.ones(cycles, dtype=np.int64)
                            form = "({} * v -0.5) / 1"
                            for j in range(1, 20):
                                f = form.format(j - 1)
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)[0]
                                if not np.array_equal(vals,
                                                      numexpr.evaluate(f)):
                                    equal = False
                        elif i == 4:

                            for j in range(1, 20):
                                target = np.array([
                                    "Channel {} sample {}".format(
                                        j, k).encode("ascii")
                                    for k in range(cycles)
                                ])
                                vals = mdf.get(group=i,
                                               index=j + 1,
                                               samples_only=True)[0]
                                cond = np.array_equal(vals, target)
                                if not cond:
                                    print(i, j, vals, target, len(vals),
                                          len(target))
                                self.assertTrue(cond)

                        elif i == 5:
                            v = np.ones(cycles, dtype=np.dtype("(8,)u1"))
                            for j in range(1, 20):
                                target = v * j
                                vals = mdf.get(group=i,
                                               index=j + 1,
                                               samples_only=True)[0]
                                cond = np.array_equal(vals, target)
                                if not cond:
                                    print(i, j, vals, target, len(vals),
                                          len(target))
                                self.assertTrue(cond)

                        elif i == 6:
                            for j in range(1, 20):
                                target = np.array(
                                    [b'Value %d' % j for _ in range(cycles)])
                                vals = mdf.get(group=i,
                                               index=j + 1,
                                               samples_only=True)[0]
                                cond = np.array_equal(vals, target)
                                if not cond:
                                    print(i, j, vals, target, len(vals),
                                          len(target))
                                self.assertTrue(cond)
            self.assertTrue(equal)
示例#15
0
    def test_read_arrays(self):
        print("MDF read big array files")
        for mdfname in os.listdir('tmpdir_array'):
            for memory in MEMORY:
                input_file = os.path.join('tmpdir_array', mdfname)
                print(input_file, memory)

                equal = True

                with MDF(input_file, memory=memory) as mdf:
                    mdf.configure(read_fragment_size=8000)

                    for i, group in enumerate(mdf.groups):

                        if i == 0:

                            samples = [
                                np.ones((cycles, 2, 3), dtype=np.uint64),
                                np.ones((cycles, 2), dtype=np.uint64),
                                np.ones((cycles, 3), dtype=np.uint64),
                            ]

                            for j in range(1, 20):

                                types = [
                                    ('Channel_{}'.format(j), '(2, 3)<u8'),
                                    ('channel_{}_axis_1'.format(j),
                                     '(2, )<u8'),
                                    ('channel_{}_axis_2'.format(j),
                                     '(3, )<u8'),
                                ]
                                types = np.dtype(types)

                                vals = mdf.get('Channel_{}'.format(j),
                                               group=i,
                                               samples_only=True)
                                target = [arr * j for arr in samples]
                                target = np.core.records.fromarrays(
                                    target,
                                    dtype=types,
                                )
                                if not np.array_equal(vals, target):
                                    equal = False

                        elif i == 1:

                            samples = np.ones((cycles, 2, 3), dtype=np.uint64)
                            axis_0 = np.ones((cycles, 2), dtype=np.uint64)
                            axis_1 = np.ones((cycles, 3), dtype=np.uint64)

                            for j in range(1, 20):

                                types = [
                                    ('Channel_{}'.format(j), '(2, 3)<u8'),
                                ]
                                types = np.dtype(types)

                                vals = mdf.get('Channel_{}'.format(j),
                                               group=i,
                                               samples_only=True)
                                target = [
                                    samples * j,
                                ]
                                target = np.core.records.fromarrays(
                                    target,
                                    dtype=types,
                                )
                                if not np.array_equal(vals, target):
                                    equal = False

                        elif i == 2:

                            samples = [
                                np.ones(cycles, dtype=np.uint8),
                                np.ones(cycles, dtype=np.uint16),
                                np.ones(cycles, dtype=np.uint32),
                                np.ones(cycles, dtype=np.uint64),
                                np.ones(cycles, dtype=np.int8),
                                np.ones(cycles, dtype=np.int16),
                                np.ones(cycles, dtype=np.int32),
                                np.ones(cycles, dtype=np.int64),
                            ]

                            for j in range(1, 20):

                                types = [
                                    ('struct_{}_channel_0'.format(j),
                                     np.uint8),
                                    ('struct_{}_channel_1'.format(j),
                                     np.uint16),
                                    ('struct_{}_channel_2'.format(j),
                                     np.uint32),
                                    ('struct_{}_channel_3'.format(j),
                                     np.uint64),
                                    ('struct_{}_channel_4'.format(j), np.int8),
                                    ('struct_{}_channel_5'.format(j),
                                     np.int16),
                                    ('struct_{}_channel_6'.format(j),
                                     np.int32),
                                    ('struct_{}_channel_7'.format(j),
                                     np.int64),
                                ]
                                types = np.dtype(types)

                                vals = mdf.get('Channel_{}'.format(j),
                                               group=i,
                                               samples_only=True)
                                target = [arr * j for arr in samples]
                                target = np.core.records.fromarrays(
                                    target,
                                    dtype=types,
                                )
                                if not np.array_equal(vals, target):
                                    equal = False

                self.assertTrue(equal)
        cleanup_files()
示例#16
0
                 name='Uint8_Signal',
                 unit='u1')
# int32
s_int32 = Signal(samples=np.array([-20, -10, 0, 10, 20], dtype=np.int32),
                 timestamps=timestamps,
                 name='Int32_Signal',
                 unit='i4')

# float64
s_float64 = Signal(samples=np.array([-20, -10, 0, 10, 20], dtype=np.int32),
                   timestamps=timestamps,
                   name='Float64_Signal',
                   unit='f8')

# create empty MDf version 4.00 file
mdf4 = MDF(version='4.00')

# append the 3 signals to the new file
signals = [s_uint8, s_int32, s_float64]
mdf4.append(signals, 'Created by Python')

# save new file
mdf4.save('my_new_file.mf4')

# convert new file to mdf version 3.10 with load_measured_data=False
mdf3 = mdf4.convert(to='3.10', load_measured_data=False)
print(mdf3.version)
# prints >>> 3.10

# get the float signal
sig = mdf3.get('Float64_Signal')
示例#17
0
    def test_convert(self):
        print("MDF convert big files tests")

        t = np.arange(cycles, dtype=np.float64)

        for out in ('3.30', '4.10'):
            for mdfname in os.listdir('tmpdir'):
                for memory in MEMORY:
                    input_file = os.path.join('tmpdir', mdfname)
                    print(input_file, memory, out)
                    with MDF(input_file, memory=memory) as mdf:
                        mdf.configure(read_fragment_size=8000)
                        outfile = mdf.convert(out, memory=memory).save(
                            'tmp_convert_{}_{}'.format(out, memory),
                            overwrite=True,
                        )

                    equal = True

                    with MDF(outfile) as mdf:
                        mdf.configure(read_fragment_size=8000)

                        for i, group in enumerate(mdf.groups):
                            if i == 0:
                                v = np.ones(cycles, dtype=np.uint64)
                                for j in range(1, 20):
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    if not np.array_equal(vals, v * (j - 1)):
                                        equal = False
                            elif i == 1:
                                v = np.ones(cycles, dtype=np.int64)
                                for j in range(1, 20):
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    if not np.array_equal(
                                            vals,
                                            v * (j - 1) - 0.5):
                                        equal = False
                            elif i == 2:
                                v = np.arange(cycles, dtype=np.int64) / 100.0
                                form = '{} * sin(v)'
                                for j in range(1, 20):
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    f = form.format(j - 1)
                                    if not np.array_equal(
                                            vals, numexpr.evaluate(f)):
                                        equal = False
                            elif i == 3:
                                v = np.ones(cycles, dtype=np.int64)
                                form = '({} * v -0.5) / 1'
                                for j in range(1, 20):
                                    f = form.format(j - 1)
                                    vals = mdf.get(group=i,
                                                   index=j,
                                                   samples_only=True)
                                    if not np.array_equal(
                                            vals, numexpr.evaluate(f)):
                                        equal = False
                            elif i == 4:

                                for j in range(1, 20):
                                    target = np.array([
                                        'Channel {} sample {}'.format(
                                            j, k).encode('ascii')
                                        for k in range(cycles)
                                    ])
                                    vals = mdf.get(group=i,
                                                   index=j + 1,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, target)
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)

                            elif i == 5:
                                v = np.ones(cycles, dtype=np.dtype('(8,)u1'))
                                for j in range(1, 20):
                                    target = v * j
                                    vals = mdf.get(group=i,
                                                   index=j + 1,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, target)
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)

                            elif i == 6:
                                v = np.ones(cycles, dtype=np.uint64)
                                for j in range(1, 20):
                                    target = v * j
                                    vals = mdf.get(group=i,
                                                   index=j + 1,
                                                   samples_only=True)
                                    cond = np.array_equal(vals, target)
                                    if not cond:
                                        print(i, j, vals, target, len(vals),
                                              len(target))
                                    self.assertTrue(cond)

                    self.assertTrue(equal)
        cleanup_files()
示例#18
0
class Window_test(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window_test, self).__init__()
        uic.loadUi("version_2.ui", self)
        self.condition_combox.addItems(["step", "range", ">"])
        self.condition_combox.setItemText(0, "step")
        self.condition_combox_2.addItems(["step", "range", ">"])
        self.condition_combox_2.setItemText(0, "step")

        self.condition_combox.activated[str].connect(self.condition_select)
        self.condition_combox_2.activated[str].connect(self.condition_select)

        self.file_open_button.clicked.connect(self.openfiles)
        self.lower_range.setText("0")
        self.upper_range.setText("0")
        self.lower_range_2.setText("0")
        self.upper_range_2.setText("0")
        # self.export_csv_button.clicked.connect(self.delete_all_signals)
        self.export_csv_button.clicked.connect(self.to_csv)

        self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(
            self.select_signal)
        self.selected_sig = set()  # 选中的信号,不可重复选
        self.selected_signals.itemDoubleClicked.connect(self.deselect_signal)
        self.all_signals.addItem("hello")

        self.add_condition_combox.addItem("")
        self.add_condition_combox.setItemText(0, "信号")
        self.add_condition_combox_2.addItem("")
        self.add_condition_combox_2.setItemText(0, "信号")
        # 等价于 self.add_condition_combox.addItem("信号")

        self.checkbox_1.stateChanged.connect(self.check)
        self.checkbox_2.stateChanged.connect(self.check)
        self.check_flag_1 = 0
        self.check_flag_2 = 0

        self.show()

    def openfiles(self):
        # 打开单个mdf文件
        self.all_signals.clear()
        filename, filetype = QtWidgets.QFileDialog.getOpenFileName()
        if filename == "":
            return
        elif filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]:
            QtWidgets.QMessageBox.about(self, "Message", "文件类型错误")
            return
        self.mdf_file = MDF(filename, memory="minimum")
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        self.all_signals.addItems(channel_list)

    def check(self, state):
        # checkbox选中才出现信号选项
        source = self.sender()
        try:
            self.mdf_file
        except:
            if self.checkbox_1.checkState() == 2:  # 0 表示未选中, 2表示选中
                QtWidgets.QMessageBox.about(self, "Message", "请先打开mdf文件")
            self.checkbox_1.setCheckState(0)
            self.checkbox_2.setCheckState(0)
            return
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        if source == self.checkbox_1 and state == QtCore.Qt.Checked:
            self.add_condition_combox.addItems(channel_list)
            self.check_flag_1 = 1

        if source == self.checkbox_2 and state == QtCore.Qt.Checked:
            self.add_condition_combox_2.addItems(channel_list)
            self.check_flag_2 = 1

    def select_signal(self, item):
        # print(item.text())  # QtWidgets.QListWidgetItem.text()
        # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.
        if item.text() not in self.selected_sig:
            self.selected_signals.addItem(item.text())
            self.selected_sig.add(item.text())

    def deselect_signal(self):
        text = self.selected_signals.takeItem(
            self.selected_signals.currentRow())
        self.selected_sig.remove(text.text())

    def delete_all_signals(self):
        self.selected_signals.clear()

    def condition_select(self, item):
        source = self.sender()
        if source == self.condition_combox:
            if item in ["step", "range"]:
                self.upper_range.show()
                self.label_2.show()
            elif item in [">", "="]:
                self.upper_range.hide()
                self.label_2.hide()
            else:
                pass
        if source == self.condition_combox_2:
            if item in ["step", "range"]:
                self.upper_range_2.show()
                self.label_3.show()
            elif item in [">", "="]:
                self.upper_range_2.hide()
                self.label_3.hide()
            else:
                pass
        else:
            pass

    def to_csv(self):
        condition = self.condition_combox.currentText()
        condition_2 = self.condition_combox_2.currentText()
        condition_channels = []
        condition_channels_2 = []
        end_indexes_1 = []
        start_indexes_1 = []
        end_indexes_2 = []
        start_indexes_2 = []
        if self.check_flag_1 == 1:
            if condition == "step":
                if not (self.lower_range.text().isdigit()
                        and self.upper_range.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range = float(self.lower_range.text())
                upper_range = float(self.upper_range.text())
                print("___________")
                condition_channels.append(
                    self.add_condition_combox.currentText())
                signal_samples = self.mdf_file.select(
                    condition_channels)[0].samples
                print("-------------")
                start_flag = 0
                end_flag = 0

                for i, signal_sample in enumerate(signal_samples):
                    if signal_sample == lower_range and start_flag == 0:
                        start_indexes_1.append(i)
                        start_flag = 1
                    if signal_sample == upper_range and start_flag == 1:
                        start_flag = 0
                        end_flag = 1
                    if signal_sample != upper_range and end_flag == 1:
                        end_flag = 0
                        end_indexes_1.append(i)
                    if signal_sample == upper_range and start_flag == 1 and i == len(
                            signal_samples) - 1:
                        end_indexes_1.append(i + 1)

            elif condition == "range":
                if not (self.lower_range.text().isdigit()
                        and self.upper_range.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range = float(self.lower_range.text())
                upper_range = float(self.upper_range.text())
                print("___________")
                condition_channels.append(
                    self.add_condition_combox.currentText())
                signal_samples = self.mdf_file.select(
                    condition_channels)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples):
                    if upper_range > signal_sample > lower_range and start_flag == 0:
                        start_indexes_1.append(i)
                        start_flag = 1
                    if (signal_sample > upper_range or
                            signal_sample < lower_range) and start_flag == 1:
                        start_flag = 0
                        end_indexes_1.append(i)
                    if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(
                            signal_samples) - 1:
                        end_indexes_1.append(i + 1)

            elif condition == ">":
                if not self.lower_range.text().isdigit():
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range = float(self.lower_range.text())
                condition_channels.append(
                    self.add_condition_combox.currentText())
                signal_samples = self.mdf_file.select(
                    condition_channels)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples):
                    if signal_sample > lower_range and start_flag == 0:
                        start_indexes_1.append(i)
                        start_flag = 1
                    if signal_sample < lower_range and start_flag == 1:
                        start_flag = 0
                        end_indexes_1.append(i)
                    if signal_sample > lower_range and start_flag == 1 and i == len(
                            signal_samples) - 1:
                        end_indexes_1.append(i + 1)

            else:
                pass
        if self.check_flag_2 == 1:
            if condition_2 == "step":
                if not (self.lower_range_2.text().isdigit()
                        and self.upper_range_2.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range_2 = float(self.lower_range_2.text())
                upper_range_2 = float(self.upper_range_2.text())
                print("___________")
                condition_channels_2.append(
                    self.add_condition_combox_2.currentText())
                signal_samples_2 = self.mdf_file.select(
                    condition_channels_2)[0].samples
                print("-------------")
                start_flag = 0
                end_flag = 0

                for i, signal_sample in enumerate(signal_samples_2):
                    if signal_sample == lower_range_2 and start_flag == 0:
                        start_indexes_2.append(i)
                        start_flag = 1
                    if signal_sample == upper_range_2 and start_flag == 1:
                        start_flag = 0
                        end_flag = 1
                    if signal_sample != upper_range_2 and end_flag == 1:
                        end_flag = 0
                        end_indexes_2.append(i)
                    if signal_sample == upper_range_2 and start_flag == 1 and i == len(
                            signal_samples_2) - 1:
                        end_indexes_2.append(i + 1)

            elif condition_2 == "range":
                if not (self.lower_range_2.text().isdigit()
                        and self.upper_range_2.text().isdigit()):
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range_2 = float(self.lower_range_2.text())
                upper_range_2 = float(self.upper_range_2.text())
                print("___________")
                condition_channels_2.append(
                    self.add_condition_combox_2.currentText())
                signal_samples_2 = self.mdf_file.select(
                    condition_channels_2)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples_2):
                    if upper_range_2 > signal_sample > lower_range_2 and start_flag == 0:
                        start_indexes_2.append(i)
                        start_flag = 1
                    if (signal_sample > upper_range_2 or
                            signal_sample < lower_range_2) and start_flag == 1:
                        start_flag = 0
                        end_indexes_2.append(i)
                    if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(
                            signal_samples_2) - 1:
                        end_indexes_2.append(i + 1)

            elif condition_2 == ">":
                if not self.lower_range_2.text().isdigit():
                    QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                    return
                lower_range_2 = float(self.lower_range_2.text())
                condition_channels_2.append(
                    self.add_condition_combox_2.currentText())
                signal_samples_2 = self.mdf_file.select(
                    condition_channels_2)[0].samples
                print("-------------")
                start_flag = 0

                for i, signal_sample in enumerate(signal_samples_2):
                    if signal_sample > lower_range_2 and start_flag == 0:
                        start_indexes_2.append(i)
                        start_flag = 1
                    if signal_sample < lower_range_2 and start_flag == 1:
                        start_flag = 0
                        end_indexes_2.append(i)
                    if signal_sample > lower_range_2 and start_flag == 1 and i == len(
                            signal_samples_2) - 1:
                        end_indexes_2.append(i + 1)
            else:
                pass

        print(start_indexes_1, start_indexes_2, sep="\n")
        print(end_indexes_1, end_indexes_2, sep="\n")
        if self.check_flag_1 == 1 and self.check_flag_2 == 0:
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i, j in zip(start_indexes_1, end_indexes_1):
                    try:
                        data_dict[signal.name] += signal.interp(
                            timestamps[i:j]).samples.tolist()
                        if idx == 0:
                            data_dict["timestamps"] += timestamps[i:j].tolist()
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)

        elif self.check_flag_1 == 1 and self.check_flag_2 == 1:
            # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集
            index_1 = set()
            index_2 = set()
            for i, j in zip(start_indexes_1, end_indexes_1):
                for n in range(i, j + 1):
                    index_1.add(n)
            for i, j in zip(start_indexes_2, end_indexes_2):
                for n in range(i, j + 1):
                    index_2.add(n)
            indexes = index_1 and index_2
            # 获取需要导出的信号名
            count = self.selected_signals.count()
            items = []
            data_dict = {"timestamps": []}
            for i in range(count):
                items.append(self.selected_signals.item(i).text())
            selected_signals = self.mdf_file.select(items)
            timestamps = self.mdf_file.select(condition_channels)[0].timestamps
            # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值
            for idx, signal in enumerate(selected_signals):
                data_dict[signal.name] = []
                for i in indexes:
                    # data_dict.update({signal.name: signal.samples[i:j]})
                    try:
                        data_dict[signal.name].append(
                            signal.interp(timestamps[i]).samples)
                        if idx == 0:
                            data_dict["timestamps"].append(timestamps[i])
                    except:
                        print("error")
            print(data_dict)
            self.write_csv(data_dict)
        else:
            QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框")
            return

    def write_csv(self, data_dict):
        print("writing to csv..\n")
        df = pd.DataFrame(data=data_dict)
        timestamps = df['timestamps']
        df.drop(labels=['timestamps'], axis=1, inplace=True)
        df.insert(0, 'timestamps', timestamps)
        f_name = str(datetime.now()).split(".")[0].replace(":", "_",
                                                           2) + ".csv"
        f = open(f_name, "w")
        f.close()
        df.to_csv(f_name, index=False)
        print("finished")
示例#19
0
    def test_cut_arrays(self):
        print("MDF cut big array files")
        for mdfname in os.listdir('tmpdir_array'):
            for memory in MEMORY:
                for whence in (0, 1):
                    input_file = os.path.join('tmpdir_array', mdfname)
                    print(input_file, memory, whence)

                    outfile1 = MDF(input_file, memory=memory)
                    outfile1.configure(read_fragment_size=8000)
                    outfile1 = outfile1.cut(stop=105,
                                            whence=whence).save('tmp1',
                                                                overwrite=True)
                    outfile2 = MDF(input_file, memory=memory)
                    outfile2.configure(read_fragment_size=8000)
                    outfile2 = outfile2.cut(start=105, stop=201,
                                            whence=whence).save('tmp2',
                                                                overwrite=True)
                    outfile3 = MDF(input_file, memory=memory)
                    outfile3.configure(read_fragment_size=8000)
                    outfile3 = outfile3.cut(start=201,
                                            whence=whence).save('tmp3',
                                                                overwrite=True)

                    outfile = MDF.merge(
                        [outfile1, outfile2, outfile3],
                        MDF(input_file, memory='minimum').version,
                        memory=memory,
                    ).save('tmp_cut', overwrite=True)

                    equal = True

                    with MDF(input_file, memory=memory) as mdf:
                        mdf.configure(read_fragment_size=8000)

                        for i, group in enumerate(mdf.groups):

                            if i == 0:

                                samples = [
                                    np.ones((cycles, 2, 3), dtype=np.uint64),
                                    np.ones((cycles, 2), dtype=np.uint64),
                                    np.ones((cycles, 3), dtype=np.uint64),
                                ]

                                for j in range(1, 20):

                                    types = [
                                        ('Channel_{}'.format(j), '(2, 3)<u8'),
                                        ('channel_{}_axis_1'.format(j),
                                         '(2, )<u8'),
                                        ('channel_{}_axis_2'.format(j),
                                         '(3, )<u8'),
                                    ]
                                    types = np.dtype(types)

                                    vals = mdf.get('Channel_{}'.format(j),
                                                   group=i,
                                                   samples_only=True)
                                    target = [arr * j for arr in samples]
                                    target = np.core.records.fromarrays(
                                        target,
                                        dtype=types,
                                    )
                                    if not np.array_equal(vals, target):
                                        equal = False

                            elif i == 1:

                                samples = np.ones((cycles, 2, 3),
                                                  dtype=np.uint64)
                                axis_0 = np.ones((cycles, 2), dtype=np.uint64)
                                axis_1 = np.ones((cycles, 3), dtype=np.uint64)

                                for j in range(1, 20):

                                    types = [
                                        ('Channel_{}'.format(j), '(2, 3)<u8'),
                                    ]
                                    types = np.dtype(types)

                                    vals = mdf.get('Channel_{}'.format(j),
                                                   group=i,
                                                   samples_only=True)
                                    target = [
                                        samples * j,
                                    ]
                                    target = np.core.records.fromarrays(
                                        target,
                                        dtype=types,
                                    )
                                    if not np.array_equal(vals, target):
                                        equal = False

                            elif i == 2:

                                samples = [
                                    np.ones(cycles, dtype=np.uint8),
                                    np.ones(cycles, dtype=np.uint16),
                                    np.ones(cycles, dtype=np.uint32),
                                    np.ones(cycles, dtype=np.uint64),
                                    np.ones(cycles, dtype=np.int8),
                                    np.ones(cycles, dtype=np.int16),
                                    np.ones(cycles, dtype=np.int32),
                                    np.ones(cycles, dtype=np.int64),
                                ]

                                for j in range(1, 20):

                                    types = [
                                        ('struct_{}_channel_0'.format(j),
                                         np.uint8),
                                        ('struct_{}_channel_1'.format(j),
                                         np.uint16),
                                        ('struct_{}_channel_2'.format(j),
                                         np.uint32),
                                        ('struct_{}_channel_3'.format(j),
                                         np.uint64),
                                        ('struct_{}_channel_4'.format(j),
                                         np.int8),
                                        ('struct_{}_channel_5'.format(j),
                                         np.int16),
                                        ('struct_{}_channel_6'.format(j),
                                         np.int32),
                                        ('struct_{}_channel_7'.format(j),
                                         np.int64),
                                    ]
                                    types = np.dtype(types)

                                    vals = mdf.get('Channel_{}'.format(j),
                                                   group=i,
                                                   samples_only=True)
                                    target = [arr * j for arr in samples]
                                    target = np.core.records.fromarrays(
                                        target,
                                        dtype=types,
                                    )
                                    if not np.array_equal(vals, target):
                                        equal = False

                self.assertTrue(equal)
        cleanup_files()
示例#20
0
class Ui_Form(QtWidgets.QWidget):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(599, 468)

        self.file_open_button = QtWidgets.QPushButton(Form)
        self.file_open_button.setGeometry(QtCore.QRect(60, 20, 75, 23))
        self.file_open_button.setObjectName("file_open_button")
        self.file_open_button.clicked.connect(self.openfiles)

        self.condition_combox = QtWidgets.QComboBox(Form)
        self.condition_combox.setGeometry(QtCore.QRect(290, 70, 70, 20))
        self.condition_combox.setObjectName("condition_combox")
        self.condition_combox.addItems(["step", "range", ">", "="])
        self.condition_combox.activated[str].connect(self.condition_select)

        self.lower_range = QtWidgets.QLineEdit(Form)
        self.lower_range.setGeometry(QtCore.QRect(372, 70, 61, 20))
        self.lower_range.setObjectName("lower_range")
        self.lower_range.setText("0")

        self.upper_range = QtWidgets.QLineEdit(Form)
        self.upper_range.setGeometry(QtCore.QRect(460, 70, 61, 20))
        self.upper_range.setObjectName("upper_range")
        self.upper_range.setText("0")

        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(440, 70, 16, 16))
        self.label_2.setObjectName("label_2")

        self.add_condition_combox = QtWidgets.QComboBox(Form)
        self.add_condition_combox.setGeometry(QtCore.QRect(50, 70, 200, 23))
        self.add_condition_combox.setObjectName("add_condition_combox")
        self.add_condition_combox.addItem("")

        self.export_csv_button = QtWidgets.QPushButton(Form)
        self.export_csv_button.setGeometry(QtCore.QRect(270, 410, 75, 23))
        self.export_csv_button.setObjectName("export_csv_button")
        # self.export_csv_button.clicked.connect(self.delete_all_signals)
        self.export_csv_button.clicked.connect(self.to_csv)

        self.all_signals = QtWidgets.QListWidget(Form)
        self.all_signals.setGeometry(QtCore.QRect(10, 150, 256, 192))
        self.all_signals.setObjectName("all_signals")
        self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(
            self.select_signal)
        self.selected_sig = set()  # 选中的信号,不可重复选

        self.selected_signals = QtWidgets.QListWidget(Form)
        self.selected_signals.setGeometry(QtCore.QRect(320, 150, 256, 192))
        self.selected_signals.setObjectName("selected_signals")
        self.selected_signals.itemDoubleClicked.connect(self.deselect_signal)

        self.all_signals.addItem("hello")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.file_open_button.setText(_translate("Form", "打开MDF"))
        # self.condition_combox.setItemText(0, _translate("Form", "step"))
        self.add_condition_combox.setItemText(0, _translate("Form", "信号"))
        self.label_2.setText(_translate("Form", "-"))
        self.export_csv_button.setText(_translate("Form", "导出csv"))

    def openfiles(self):
        # 打开单个mdf文件
        self.all_signals.clear()
        filename, filetype = QtWidgets.QFileDialog.getOpenFileName()
        if filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]:
            QtWidgets.QMessageBox.about(self, "Message", "文件类型错误")
            return
        self.mdf_file = MDF(filename, memory="minimum")
        channel_list = list(self.mdf_file.channels_db.keys())
        channel_list.remove("time")
        channel_list.sort()
        self.add_condition_combox.addItems(channel_list)
        self.all_signals.addItems(channel_list)

        # 打开多个mdf文件
        # filenames, filetype= QtWidgets.QFileDialog.getOpenFileNames()
        # for filename in filenames:
        #     file = MDF(filename, memory="minimum")
        #     channel_list = list(file.channels_db.keys())
        #     channel_list.remove("time")                   # 多个文件时间可能不同,因此该程序肯定有问题,不管。
        #     channel_list.sort()
        #     self.data += file.select(channel_list)
        #     for channel in channel_list:
        #         self.all_signals.addItem(channel)

        # 打开一个文件夹下的所有mdf文件。但具体是否可行未知,或者把上面程序多运行几遍
        # dir = os.listdir(QtWidgets.QFileDialog.getExistingDirectory())
        # mdf_files = [mdf_file for mdf_file in dir if mdf_file[-3:] in ["dat", "mdf", "DAT", "MDF"]]
        # mdf = MDF()
        # mdf.stack(mdf_files, memory='minimum')
        # signals = mdf.iter_channels()  # generator that yields a Signal for each non-master channel
        # for signal in signals:
        #     self.all_signals.addItem(signal)

    def select_signal(self, item):
        # print(item.text())  # QtWidgets.QListWidgetItem.text()
        # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.
        if item.text() not in self.selected_sig:
            self.selected_signals.addItem(item.text())
            self.selected_sig.add(item.text())

    def deselect_signal(self):
        self.selected_signals.takeItem(self.selected_signals.currentRow())

    def delete_all_signals(self):
        self.selected_signals.clear()

    def condition_select(self, item):
        if item in ["step", "range"]:
            self.upper_range.show()
            self.label_2.show()
        elif item in [">", "="]:
            self.upper_range.hide()
            self.label_2.hide()
        else:
            pass

    def to_csv(self):
        condition = self.condition_combox.currentText()
        channels = []  # 条件信号
        if not (self.lower_range.text().isdigit()
                and self.upper_range.text().isdigit()):
            QtWidgets.QMessageBox.about(self, "Message", "范围错误")
            return
        lower_range = float(self.lower_range.text())
        upper_range = float(self.upper_range.text())
        if condition == "step":
            signal_samples = self.mdf_file.select(
                self.add_condition_combox.currentText()).samples
            signal_time = self.mdf_file.select(
                self.add_condition_combox.currentText()).time
            print(signal_samples)
            print(signal_time)

        elif condition == "range":
            print(self.lower_range.text())
            print(self.upper_range.text())

        elif condition == ">":
            print(">")
            start_time = []
            channels.append(self.add_condition_combox.currentText())
            try:
                signal_samples = self.mdf_file.select(channels)[0].samples
                signal_time = self.mdf_file.select(channels)[0].timestamps
            except:
                print("信号错误")
            for i, signal_sample in enumerate(signal_samples):
                if signal_sample > lower_range:
                    start_time.append(i)
        elif condition == "=":
            print("=")
        else:
            pass
        count = self.selected_signals.count()
        items = []
        data_dict = {}
        for i in range(count):
            items.append(self.selected_signals.item(i).text())
        signals = self.mdf_file.select(items)  # 当存在空数据时,会出错
        try:
            for signal in signals:
                for i in start_time:
                    data_dict.update({signal.name: signal.samples[i]})
            print(data_dict)
            for i in start_time:
                data_dict.update({"timestamps": signals[0].timestamps[i]})
            print(data_dict)
            df = pd.DataFrame(data=data_dict)
            print("-" * 20)
            df.to_csv("11.csv", index=False)
        except:
            print("write error")
示例#21
0
def save_mdf4_nodata():
    os.chdir(path)
    x = MDF(r'test.mf4', load_measured_data=False)
    with Timer('asammdf {} nodata mdfv4'.format(asammdf_version)):
        x.save(r'x.mf4', overwrite=True)
示例#22
0
def generate_test_files(version='4.10'):
    cycles = 3000
    channels_count = 2000
    mdf = MDF(version=version, memory='minimum')

    if version <= '3.30':
        filename = r'test.mdf'
    else:
        filename = r'test.mf4'

    if os.path.exists(filename):
        return filename

    t = np.arange(cycles, dtype=np.float64)

    cls = v4b.ChannelConversion if version >= '4.00' else v3b.ChannelConversion

    # no conversion
    sigs = []
    for i in range(channels_count):
        sig = Signal(
            np.ones(cycles, dtype=np.uint64) * i,
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            conversion=None,
            comment='Unsigned int 16bit channel {}'.format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # linear
    sigs = []
    for i in range(channels_count):
        conversion = {
            'conversion_type':
            v4c.CONVERSION_TYPE_LIN
            if version >= '4.00' else v3c.CONVERSION_TYPE_LINEAR,
            'a':
            float(i),
            'b':
            -0.5,
        }
        sig = Signal(
            np.ones(cycles, dtype=np.int64),
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            conversion=cls(**conversion),
            comment='Signed 16bit channel {} with linear conversion'.format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # algebraic
    sigs = []
    for i in range(channels_count):
        conversion = {
            'conversion_type':
            v4c.CONVERSION_TYPE_ALG
            if version >= '4.00' else v3c.CONVERSION_TYPE_FORMULA,
            'formula':
            '{} * sin(X)'.format(i),
        }
        sig = Signal(
            np.arange(cycles, dtype=np.int32) / 100.0,
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            conversion=cls(**conversion),
            comment='Sinus channel {} with algebraic conversion'.format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # rational
    sigs = []
    for i in range(channels_count):
        conversion = {
            'conversion_type':
            v4c.CONVERSION_TYPE_RAT
            if version >= '4.00' else v3c.CONVERSION_TYPE_RAT,
            'P1':
            0,
            'P2':
            i,
            'P3':
            -0.5,
            'P4':
            0,
            'P5':
            0,
            'P6':
            1,
        }
        sig = Signal(
            np.ones(cycles, dtype=np.int64),
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            conversion=cls(**conversion),
            comment='Channel {} with rational conversion'.format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # string
    sigs = []
    for i in range(channels_count):
        sig = [
            'Channel {} sample {}'.format(i, j).encode('ascii')
            for j in range(cycles)
        ]
        sig = Signal(
            np.array(sig),
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            comment='String channel {}'.format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # byte array
    sigs = []
    ones = np.ones(cycles, dtype=np.dtype('(8,)u1'))
    for i in range(channels_count):
        sig = Signal(
            ones * (i % 255),
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            comment='Byte array channel {}'.format(i),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    # value to text
    sigs = []
    ones = np.ones(cycles, dtype=np.uint64)
    conversion = {
        'raw':
        np.arange(255, dtype=np.float64),
        'phys':
        np.array(['Value {}'.format(i).encode('ascii') for i in range(255)]),
        'conversion_type':
        v4c.CONVERSION_TYPE_TABX
        if version >= '4.00' else v3c.CONVERSION_TYPE_TABX,
        'links_nr':
        260,
        'ref_param_nr':
        255,
    }

    for i in range(255):
        conversion['val_{}'.format(i)] = conversion['param_val_{}'.format(
            i)] = conversion['raw'][i]
        conversion['text_{}'.format(i)] = conversion['phys'][i]
    conversion['text_{}'.format(255)] = 'Default'

    for i in range(channels_count):
        sig = Signal(
            ones * i,
            t,
            name='Channel_{}'.format(i),
            unit='unit_{}'.format(i),
            comment='Value to text channel {}'.format(i),
            conversion=cls(**conversion),
            raw=True,
        )
        sigs.append(sig)
    mdf.append(sigs, common_timebase=True)

    mdf.save(filename, overwrite=True)
示例#23
0
def convert_v3_v4_nodata():
    os.chdir(path)
    with MDF(r'test.mdf', load_measured_data=False) as x:
        with Timer('asammdf {} v3 to v4 nodata'.format(asammdf_version)):
            y = x.convert(to='4.10', load_measured_data=False)
            y.close()
示例#24
0
def main(text_output, fmt):
    if os.path.dirname(__file__):
        os.chdir(os.path.dirname(__file__))
    for version in ('3.30', '4.10'):
        generate_test_files(version)

    mdf = MDF('test.mdf', 'minimum')
    v3_size = os.path.getsize('test.mdf') // 1024 // 1024
    v3_groups = len(mdf.groups)
    v3_channels = sum(len(gp['channels']) for gp in mdf.groups)
    v3_version = mdf.version

    mdf = MDF('test.mf4', 'minimum')
    v4_size = os.path.getsize('test.mf4') // 1024 // 1024
    v4_groups = len(mdf.groups)
    v4_channels = sum(len(gp['channels']) for gp in mdf.groups)
    v4_version = mdf.version

    listen, send = multiprocessing.Pipe()
    output = MyList()
    errors = []

    installed_ram = round(psutil.virtual_memory().total / 1024 / 1024 / 1024)

    output.append('\n\nBenchmark environment\n')
    output.append('* {}'.format(sys.version))
    output.append('* {}'.format(platform.platform()))
    output.append('* {}'.format(platform.processor()))
    output.append('* {}GB installed RAM\n'.format(installed_ram))
    output.append('Notations used in the results\n')
    output.append(('* full =  asammdf MDF object created with '
                   'memory=full '
                   '(everything loaded into RAM)'))
    output.append(('* low =  asammdf MDF object created with '
                   'memory=low '
                   '(raw channel data not loaded into RAM, '
                   'but metadata loaded to RAM)'))
    output.append(('* minimum =  asammdf MDF object created with '
                   'memory=full '
                   '(lowest possible RAM usage)'))
    output.append(('* compress = mdfreader mdf object created with '
                   'compression=blosc'))
    output.append(('* noDataLoading = mdfreader mdf object read with '
                   'noDataLoading=True'))
    output.append('\nFiles used for benchmark:\n')
    output.append('* mdf version {}'.format(v3_version))
    output.append('    * {} MB file size'.format(v3_size))
    output.append('    * {} groups'.format(v3_groups))
    output.append('    * {} channels'.format(v3_channels))
    output.append('* mdf version {}'.format(v4_version))
    output.append('    * {} MB file size'.format(v4_size))
    output.append('    * {} groups'.format(v4_groups))
    output.append('    * {} channels\n\n'.format(v4_channels))

    tests = (
        partial(open_mdf3, memory='full'),
        partial(open_mdf3, memory='low'),
        partial(open_mdf3, memory='minimum'),
        # open_reader3,
        # open_reader3_compression,
        # open_reader3_nodata,
        partial(open_mdf4, memory='full'),
        partial(open_mdf4, memory='low'),
        partial(open_mdf4, memory='minimum'),
        # open_reader4,
        # open_reader4_compression,
        # open_reader4_nodata,
    )

    if tests:
        output.extend(table_header('Open file', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        partial(save_mdf3, memory='full'),
        partial(save_mdf3, memory='low'),
        partial(save_mdf3, memory='minimum'),
        # save_reader3,
        # save_reader3_nodata,
        # save_reader3_compression,
        partial(save_mdf4, memory='full'),
        partial(save_mdf4, memory='low'),
        partial(save_mdf4, memory='minimum'),
        # save_reader4,
        # save_reader4_nodata,
        # save_reader4_compression,
    )

    if tests:
        output.extend(table_header('Save file', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        #  partial(get_all_mdf3, memory='full'),
        #  partial(get_all_mdf3, memory='low'),
        #  partial(get_all_mdf3, memory='minimum'),
        #  get_all_reader3,
        #  get_all_reader3_nodata,
        #  get_all_reader3_compression,
        #
        # partial(get_all_mdf4, memory='full'),
        # partial(get_all_mdf4, memory='low'),
        # partial(get_all_mdf4, memory='minimum'),
        #
        # get_all_reader4,
        # get_all_reader4_compression,
        # get_all_reader4_nodata,
    )

    if tests:
        output.extend(table_header('Get all channels (36424 calls)', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        partial(convert_v3_v4, memory='full'),
        partial(convert_v3_v4, memory='low'),
        partial(convert_v3_v4, memory='minimum'),
        partial(convert_v4_v3, memory='full'),
        partial(convert_v4_v3, memory='low'),
        partial(convert_v4_v3, memory='minimum'),
    )

    if tests:
        output.extend(table_header('Convert file', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    tests = (
        partial(merge_v3, memory='full'),
        partial(merge_v3, memory='low'),
        partial(merge_v3, memory='minimum'),
        # merge_reader_v3,
        # merge_reader_v3_compress,
        # merge_reader_v3_nodata,
        partial(merge_v4, memory='full'),
        partial(merge_v4, memory='low'),
        partial(merge_v4, memory='minimum'),
        # merge_reader_v4,
        # merge_reader_v4_nodata,
        # merge_reader_v4_compress,
    )

    if tests:
        output.extend(table_header('Merge 3 files', fmt))
        for func in tests:
            thr = multiprocessing.Process(target=func, args=(send, fmt))
            thr.start()
            thr.join()
            result, err = listen.recv()
            output.append(result)
            errors.append(err)
        output.extend(table_end(fmt))

    errors = [err for err in errors if err]
    if errors:
        print('\n\nERRORS\n', '\n'.join(errors))

    if text_output:
        arch = 'x86' if platform.architecture()[0] == '32bit' else 'x64'
        file = '{}_asammdf_{}_mdfreader_{}.{}'.format(arch, asammdf_version,
                                                      mdfreader_version, fmt)
        with open(file, 'w') as out:
            out.write('\n'.join(output))

    for file in ('x.mdf', 'x.mf4'):
        if PYVERSION >= 3:
            try:
                os.remove(file)
            except FileNotFoundError:
                pass
        else:
            try:
                os.remove(file)
            except IOError:
                pass
示例#25
0
def convert_v4_v3_nodata():
    os.chdir(path)
    with MDF(r'test.mf4', load_measured_data=False) as x:
        with Timer('asammdf {} v4 to v3 nodata'.format(asammdf_version)):
            y = x.convert('3.30', load_measured_data=False)
            y.close()
示例#26
0
                 name='Uint8_Signal',
                 unit='u1')
# int32
s_int32 = Signal(samples=np.array([-20, -10, 0, 10, 20], dtype=np.int32),
                 timestamps=timestamps,
                 name='Int32_Signal',
                 unit='i4')

# float64
s_float64 = Signal(samples=np.array([-20, -10, 0, 10, 20], dtype=np.int32),
                   timestamps=timestamps,
                   name='Float64_Signal',
                   unit='f8')

# create empty MDf version 4.00 file
mdf4 = MDF(version='4.00')

# append the 3 signals to the new file
signals = [s_uint8, s_int32, s_float64]
mdf4.append(signals, 'Created by Python')

# save new file
mdf4.save('my_new_file.mf4')

# convert new file to mdf version 3.10 with compression of raw channel data
mdf3 = mdf4.convert(to='3.10', compression=True)
print(mdf3.version)
# prints >>> 3.10

# get the float signal
sig = mdf3.get('Float64_Signal')
示例#27
0
def save_mdf3():
    os.chdir(path)
    x = MDF(r'test.mdf')
    with Timer('asammdf {} mdfv3'.format(asammdf_version)):
        x.save(r'x.mdf', overwrite=True)
示例#28
0
    def test_read(self):
        print("MDF read big files")
        for mdfname in os.listdir('tmpdir'):
            for memory in MEMORY:
                input_file = os.path.join('tmpdir', mdfname)
                print(input_file, memory)

                equal = True

                with MDF(input_file, memory=memory) as mdf:

                    for i, group in enumerate(mdf.groups):
                        if i == 0:
                            v = np.ones(cycles, dtype=np.uint64)
                            for j in range(1, 20):
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)
                                if not np.array_equal(vals, v * (j - 1)):
                                    equal = False
                        elif i == 1:
                            v = np.ones(cycles, dtype=np.int64)
                            for j in range(1, 20):
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)
                                if not np.array_equal(vals, v * (j - 1) - 0.5):
                                    equal = False
                        elif i == 2:
                            v = np.arange(cycles, dtype=np.int64) / 100.0
                            form = '{} * sin(v)'
                            for j in range(1, 20):
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)
                                f = form.format(j - 1)
                                if not np.array_equal(vals,
                                                      numexpr.evaluate(f)):
                                    equal = False
                        elif i == 3:
                            v = np.ones(cycles, dtype=np.int64)
                            form = '({} * v -0.5) / 1'
                            for j in range(1, 20):
                                f = form.format(j - 1)
                                vals = mdf.get(group=i,
                                               index=j,
                                               samples_only=True)
                                if not np.array_equal(vals,
                                                      numexpr.evaluate(f)):
                                    equal = False
                        elif i == 4:

                            for j in range(1, 20):
                                target = np.array([
                                    'Channel {} sample {}'.format(
                                        j, k).encode('ascii')
                                    for k in range(cycles)
                                ])
                                vals = mdf.get(group=i,
                                               index=j + 1,
                                               samples_only=True)
                                cond = np.array_equal(vals, target)
                                if not cond:
                                    print(i, j, vals, target, len(vals),
                                          len(target))
                                self.assertTrue(cond)

                        elif i == 5:
                            v = np.ones(cycles, dtype=np.dtype('(8,)u1'))
                            for j in range(1, 20):
                                target = v * j
                                vals = mdf.get(group=i,
                                               index=j + 1,
                                               samples_only=True)
                                cond = np.array_equal(vals, target)
                                if not cond:
                                    print(i, j, vals, target, len(vals),
                                          len(target))
                                self.assertTrue(cond)

                        elif i == 6:
                            v = np.ones(cycles, dtype=np.uint64)
                            for j in range(1, 20):
                                target = v * j
                                vals = mdf.get(group=i,
                                               index=j + 1,
                                               samples_only=True)
                                cond = np.array_equal(vals, target)
                                if not cond:
                                    print(i, j, vals, target, len(vals),
                                          len(target))
                                self.assertTrue(cond)
                self.assertTrue(equal)

        cleanup_files()
示例#29
0
    def to_csv(self):
        data_dict = {"timestamps": [], "filename": []}
        if self.check_flag_1 == 1 and self.check_flag_2 == 0:
            data_dict["duration"] = []
        for filename in self.filenames:
            condition = self.condition_combox.currentText()
            condition_2 = self.condition_combox_2.currentText()
            condition_channels = []
            condition_channels_2 = []
            end_indexes_1 = []
            start_indexes_1 = []
            end_indexes_2 = []
            start_indexes_2 = []
            if self.check_flag_1 == 1:
                if condition == "step":
                    if not (self.lower_range.text().isdigit()
                            and self.upper_range.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.lineEdit.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    for i in range(len(signal_samples) - 1):
                        if signal_samples[i] == lower_range and signal_samples[
                                i + 1] == upper_range:
                            start_indexes_1.append(i)
                            end_indexes_1.append(i + 1)
                    # for i, signal_sample in enumerate(signal_samples):
                    #     if signal_sample == lower_range and start_flag == 0:
                    #         start_indexes_1.append(i)
                    #         start_flag = 1
                    #     if signal_sample == upper_range and start_flag == 1:
                    #         start_flag = 0
                    #         end_flag = 1
                    #     if signal_sample != upper_range and end_flag == 1:
                    #         end_flag = 0
                    #         end_indexes_1.append(i)
                    #     if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1:
                    #         end_indexes_1.append(i+1)

                elif condition == "range":
                    if not (self.lower_range.text().isdigit()
                            and self.upper_range.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.lineEdit.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if upper_range >= signal_sample >= lower_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if (signal_sample > upper_range or signal_sample <
                                lower_range) and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(
                                signal_samples) - 1:
                            end_indexes_1.append(i + 1)

                elif condition == ">":
                    if not self.lower_range.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range = float(self.lower_range.text())
                    condition_channels.append(self.lineEdit.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if signal_sample > lower_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if signal_sample < lower_range and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if signal_sample > lower_range and start_flag == 1 and i == len(
                                signal_samples) - 1:
                            end_indexes_1.append(i + 1)

                elif condition == "<":
                    if not self.upper_range.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    upper_range = float(self.upper_range.text())
                    condition_channels.append(self.lineEdit.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples = mdf.select(condition_channels)[0].samples
                    self.statusBar().showMessage("处理第一个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples):
                        if signal_sample < upper_range and start_flag == 0:
                            start_indexes_1.append(i)
                            start_flag = 1
                        if signal_sample > upper_range and start_flag == 1:
                            start_flag = 0
                            end_indexes_1.append(i)
                        if signal_sample < upper_range and start_flag == 1 and i == len(
                                signal_samples) - 1:
                            end_indexes_1.append(i + 1)

                else:
                    pass
            if self.check_flag_2 == 1:
                if condition_2 == "step":
                    if not (self.lower_range_2.text().isdigit()
                            and self.upper_range_2.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.lineEdit_2.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(
                        condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    for i in range(len(signal_samples_2) - 1):
                        if signal_samples_2[
                                i] == lower_range_2 and signal_samples_2[
                                    i + 1] == upper_range_2:
                            start_indexes_2.append(i)
                            end_indexes_2.append(i + 1)

                elif condition_2 == "range":
                    if not (self.lower_range_2.text().isdigit()
                            and self.upper_range_2.text().isdigit()):
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.lineEdit_2.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(
                        condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if upper_range_2 >= signal_sample >= lower_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if (signal_sample > upper_range_2 or signal_sample <
                                lower_range_2) and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(
                                signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)

                elif condition_2 == ">":
                    if not self.lower_range_2.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    lower_range_2 = float(self.lower_range_2.text())
                    condition_channels_2.append(self.lineEdit_2.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(
                        condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if signal_sample > lower_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if signal_sample < lower_range_2 and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if signal_sample > lower_range_2 and start_flag == 1 and i == len(
                                signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)
                elif condition_2 == "<":
                    if not self.upper_range_2.text().isdigit():
                        QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字")
                        return
                    upper_range_2 = float(self.upper_range_2.text())
                    condition_channels_2.append(self.lineEdit_2.text())
                    mdf = MDF(filename, "minimum")
                    signal_samples_2 = mdf.select(
                        condition_channels_2)[0].samples
                    self.statusBar().showMessage("处理第二个筛选条件")
                    start_flag = 0

                    for i, signal_sample in enumerate(signal_samples_2):
                        if signal_sample > upper_range_2 and start_flag == 0:
                            start_indexes_2.append(i)
                            start_flag = 1
                        if signal_sample < upper_range_2 and start_flag == 1:
                            start_flag = 0
                            end_indexes_2.append(i)
                        if signal_sample > upper_range_2 and start_flag == 1 and i == len(
                                signal_samples_2) - 1:
                            end_indexes_2.append(i + 1)

                else:
                    pass
            if self.check_flag_1 == 1 and self.check_flag_2 == 0:
                self.statusBar().showMessage("getting selected signal")
                mdf = MDF(filename, "minimum")
                timestamps = mdf.select(condition_channels)[0].timestamps
                count = self.selected_signals.count()
                for i in range(count):
                    signal_name = self.selected_signals.item(i).text()
                    selected_signal = mdf.select(
                        [signal_name])[0]  # mdf的select方法参数必须为list
                    if self.selected_signals.item(
                            i).text() not in data_dict.keys():
                        data_dict[self.selected_signals.item(i).text()] = []
                    for k, j in zip(start_indexes_1, end_indexes_1):
                        try:
                            data_dict[self.selected_signals.item(
                                i).text()] += selected_signal.interp(
                                    timestamps[k:j]).samples.tolist()
                        except:
                            self.statusBar().showMessage("error")
                for i, j in zip(start_indexes_1, end_indexes_1):
                    try:
                        data_dict["timestamps"] += timestamps[i:j].tolist()
                        duration = timestamps[
                            j - 1].tolist() - timestamps[i].tolist()
                        for _ in range(i, j):
                            data_dict["filename"].append(filename)
                            data_dict["duration"].append(duration)
                    except:
                        self.statusBar().showMessage("error")

            elif self.check_flag_1 == 1 and self.check_flag_2 == 1:
                self.statusBar().showMessage("生成最终索引")
                # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集
                index_1 = set()
                index_2 = set()
                for i, j in zip(start_indexes_1, end_indexes_1):
                    for n in range(i, j):
                        index_1.add(n)
                for i, j in zip(start_indexes_2, end_indexes_2):
                    for n in range(i, j):
                        index_2.add(n)
                indexes = index_1 & index_2
                mdf = MDF(filename, "minimum")
                timestamps = mdf.select(condition_channels)[0].timestamps
                # 获取需要导出的信号名
                self.statusBar().showMessage("提取数据中...")
                count = self.selected_signals.count()
                for i in range(count):
                    signal_name = self.selected_signals.item(i).text()
                    selected_signal = mdf.select([signal_name])[0]
                    if self.selected_signals.item(
                            i).text() not in data_dict.keys():
                        data_dict[self.selected_signals.item(i).text()] = []
                # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值
                    for k in indexes:
                        try:
                            # data_dict[self.selected_signals.item(i).text()].append(selected_signal.interp([timestamps[k]]).samples.tolist())
                            data_dict[self.selected_signals.item(
                                i).text()] += selected_signal.interp(
                                    [timestamps[k]]).samples.tolist()
                        except:
                            # print("k=", k)
                            self.statusBar().showMessage("error??")
                for i in indexes:
                    try:

                        data_dict["timestamps"].append(timestamps[i])
                        data_dict["filename"].append(filename)
                    except:
                        # print("i=", i)
                        self.statusBar().showMessage("error")
            else:
                QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框")
                print(self.check_flag_1, self.check_flag_2)
                return
        self.write_csv(data_dict)
示例#30
0
 def test_wrong_header_version(self):
     mdf = BytesIO(
         b'MDF     AAAA    amdf500d\x00\x00\x00\x00\x9f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
     )
     with self.assertRaises(MdfException):
         MDF(mdf)