Beispiel #1
0
    def test_inputs_V21(self):
        """
        Test various inputs to BlackrockIO.read_block with version 2.3 file
        to check for parsing errors.
        """
        filename = self.get_local_path('blackrock/blackrock_2_1/l101210-001')
        reader = BlackrockIO(filename=filename, verbose=False, nsx_to_load=5)

        # Assert IOError is raised when no Blackrock files are available
        with self.assertRaises(IOError):
            reader2 = BlackrockIO(filename='nonexistent')
        # with self.assertRaises(IOError):
        #     reader2 = BlackrockIO(filename=filename, nev_override='nonexistent')

        # Load data to maximum extent, one None is not given as list
        block = reader.read_block(load_waveforms=False,
                                  signal_group_mode='split-all')
        lena = len(block.segments[0].analogsignals[0])
        numspa = len(block.segments[0].spiketrains[0])

        # Load data using a negative time and a time exceeding the end of the
        # recording
        too_large_tstop = block.segments[0].analogsignals[0].t_stop + 1 * pq.s
        buggy_slice = (-100 * pq.ms, too_large_tstop)

        # This is valid in read_segment
        seg = reader.read_segment(seg_index=0,
                                  time_slice=buggy_slice,
                                  strict_slicing=False)
        # this raise error
        with self.assertRaises(AssertionError):
            seg = reader.read_segment(seg_index=0,
                                      time_slice=buggy_slice,
                                      strict_slicing=True)

        lenb = len(seg.analogsignals[0])
        numspb = len(seg.spiketrains[0])

        # Same length of analog signal?
        # Both should have read the complete data set!
        self.assertEqual(lena, lenb)

        # Same length of spike train?
        # Both should have read the complete data set!
        self.assertEqual(numspa, numspb)

        # test 4 Units
        block = reader.read_block(
            load_waveforms=True,
            signal_group_mode='split-all',
        )  #units_group_mode='all-in-one')

        self.assertEqual(len(block.segments[0].analogsignals), 96)
        #self.assertEqual(len(block.channel_indexes[-1].units), 218)
        #self.assertEqual(len(block.channel_indexes[-1].units),
        #                 len(block.segments[0].spiketrains))
        anasig = block.segments[0].analogsignals[0]
        self.assertIsNotNone(anasig.file_origin)
    def test_segment_detection_reset(self):
        """
        This test makes sure segments are detected correctly when reset was used during recording.
        """

        # Path to nev that will fail
        filename_nev_fail = self.get_filename_path('segment/ResetFail/reset_fail')
        # Path to nsX and nev that will NOT fail
        filename = self.get_filename_path('segment/ResetCorrect/reset')

        # Warning filter needs to be set to always before first occurrence of this warning
        warnings.simplefilter("always", UserWarning)

        # This fails, because in the nev there is no way to separate two segments
        with self.assertRaises(AssertionError):
            reader = BlackrockIO(filename=filename, nsx_to_load=2, nev_override=filename_nev_fail)

        # The correct file will issue a warning because a reset has occurred
        # and could be detected, but was not explicitly documented in the file
        with warnings.catch_warnings(record=True) as w:
            reader = BlackrockIO(filename=filename, nsx_to_load=2)
            self.assertGreaterEqual(len(w), 1)
            messages = [str(warning.message) for warning in w if warning.category == UserWarning]
            self.assertIn("Detected 1 undocumented segments within nev data after "
                          "timestamps [5451].", messages)

        # Manually reset warning filter in order to not show too many warnings afterwards
        warnings.simplefilter("default")

        block = reader.read_block(load_waveforms=False, signal_group_mode="split-all")

        # 1 Segment at the beginning and 1 after reset
        self.assertEqual(len(block.segments), 2)
        # Checking all times are correct as read from file itself
        # (taking neo calculations into account)
        self.assertEqual(block.segments[0].t_start, 0.0)
        self.assertEqual(block.segments[0].t_stop, 4.02)
        # Clock is reset to 0
        self.assertEqual(block.segments[1].t_start, 0.0032)
        self.assertEqual(block.segments[1].t_stop, 3.9842)
        self.assertEqual(block.segments[0].analogsignals[0].t_start, 0.0)
        self.assertEqual(block.segments[0].analogsignals[0].t_stop, 4.02)
        self.assertEqual(block.segments[1].analogsignals[0].t_start, 0.0032)
        self.assertEqual(block.segments[1].analogsignals[0].t_stop, 3.9842)
        self.assertEqual(block.segments[0].spiketrains[0].t_start, 0.0)
        self.assertEqual(block.segments[0].spiketrains[0].t_stop, 4.02)
        self.assertEqual(block.segments[1].spiketrains[0].t_start, 0.0032)
        self.assertEqual(block.segments[1].spiketrains[0].t_stop, 3.9842)

        # Each segment must have the same number of analogsignals
        self.assertEqual(len(block.segments[0].analogsignals),
                         len(block.segments[1].analogsignals))

        # Length of analogsignals as created
        self.assertEqual(len(block.segments[0].analogsignals[0][:]), 4020)
        self.assertEqual(len(block.segments[1].analogsignals[0][:]), 3981)
Beispiel #3
0
def new_brio_load():
    newbrio_reader = BlackrockIO(dirname, nsx_to_load=2)#, nev_override='-')  # channels_to_load={1, 3, 5, 7, 95})#, nev_override='-'.join([dirname, '03']))
    newbrio_reader2 = BlackrockIO(dirname2, nsx_to_load=2)#, nev_override='-')  # channels_to_load={1, 3, 5, 7, 95})#, nev_override='-'.join([dirname, '03']))
    # new_block = newbrio_reader.read_block()
    # print(newbrio_reader)
    # newbrio_reader.parse_header()
    new_block = newbrio_reader.read_block(load_waveforms=False, signal_group_mode="split-all")#, nsx_to_load='all')#, time_slices=[(float('-inf'), float('inf')), (1*pq.s, 2*pq.s), (3*pq.s, 4 * pq.s)])#(1 *pq.s, 2 * pq.s)])
    new_block2 = newbrio_reader2.read_block(load_waveforms=False, signal_group_mode="split-all")#, nsx_to_load='all')#, time_slices=[(float('-inf'), float('inf')), (1*pq.s, 2*pq.s), (3*pq.s, 4 * pq.s)])#(1 *pq.s, 2 * pq.s)])
                                            #, signal_group_mode="group-by-same-units") #, time_slices=[(1.0, 40.0)])#, time_slices=[(0.001366667*pq.s, 2.0*pq.s)])  # signal_group_mode="group-by-same-units")#load_waveforms=True)
    # output(new_block)
    print ('Loading new IO done')
    return new_block, new_block2
Beispiel #4
0
    def load_blackrock_data_neo(base_fn):
        neo_io = BlackrockIO(filename=base_fn)
        neo_block = neo_io.read_block(lazy=False,
                                      cascade=True,
                                      n_starts=None,
                                      n_stops=None,
                                      channels='all',
                                      nsx_to_load=5,
                                      scaling='voltage',
                                      units='none',
                                      load_waveforms=False,
                                      load_events=True)

        return {
            'ana_times':
            neo_block.segments[0].analogsignals[0].times,
            'ana_data':
            np.asarray([x for x in neo_block.segments[0].analogsignals])[:, :,
                                                                         0],
            'samp_per_s':
            neo_block.segments[0].analogsignals[0].sampling_rate,
            'chan_labels': [
                x.name.decode('utf8')
                for x in neo_block.segments[0].analogsignals
            ],
            'ev_times':
            neo_block.segments[0].events[0].times,
            'ev_depths':
            np.asarray([
                float(x.split(':')[1])
                for x in neo_block.segments[0].events[0].labels
            ])
        }
Beispiel #5
0
    def test_inputs_V23(self):
        """
        Test various inputs to BlackrockIO.read_block with version 2.3 file
        to check for parsing errors.
        """
        filename = self.get_filename_path('FileSpec2.3001')
        reader = BlackrockIO(
            filename=filename,
            verbose=False,
            nsx_to_load=5,
        )

        # Load data to maximum extent, one None is not given as list
        block = reader.read_block(load_waveforms=False)
        lena = len(block.segments[0].analogsignals[0])
        numspa = len(block.segments[0].spiketrains[0])

        # Load data using a negative time and a time exceeding the end of the
        # recording
        too_large_tstop = block.segments[0].analogsignals[0].t_stop + 1 * pq.s
        buggy_slice = (-100 * pq.ms, too_large_tstop)

        # this is valid in read_segment because seg_index is specified
        seg = reader.read_segment(seg_index=0, time_slice=buggy_slice)

        lenb = len(seg.analogsignals[0])
        numspb = len(seg.spiketrains[0])

        # Same length of analog signal?
        # Both should have read the complete data set!
        self.assertEqual(lena, lenb)

        # Same length of spike train?
        # Both should have read the complete data set!
        self.assertEqual(numspa, numspb)

        # test 4 Units
        block = reader.read_block(load_waveforms=True,
                                  units_group_mode='all-in-one')

        self.assertEqual(len(block.segments[0].analogsignals), 10)
        self.assertEqual(len(block.channel_indexes[-1].units), 4)
        self.assertEqual(len(block.channel_indexes[-1].units),
                         len(block.segments[0].spiketrains))

        anasig = block.segments[0].analogsignals[0]
        self.assertIsNotNone(anasig.file_origin)
    def test_load_muliple_nsx(self):
        """
        Test if multiple nsx signals can be loaded at the same time.
        """
        filename = self.get_filename_path('blackrock_2_1/l101210-001')
        reader = BlackrockIO(filename=filename,
                             verbose=False,
                             nsx_to_load='all')

        # number of different sampling rates corresponds to number of nsx signals, because
        # single nsx contains only signals of identical sampling rate
        block = reader.read_block(load_waveforms=False)
        sampling_rates = np.unique([
            a.sampling_rate.rescale('Hz')
            for a in block.filter(objects='AnalogSignal')
        ])
        self.assertEqual(len(sampling_rates), 2)

        segment = reader.read_segment()
        sampling_rates = np.unique([
            a.sampling_rate.rescale('Hz')
            for a in segment.filter(objects='AnalogSignal')
        ])
        self.assertEqual(len(sampling_rates), 2)

        # load only ns5
        reader = BlackrockIO(filename=filename, nsx_to_load=5)
        seg = reader.read_segment()
        self.assertEqual(len(seg.analogsignals), 1)
        self.assertEqual(seg.analogsignals[0].shape, (109224, 96))

        # load only ns2
        reader = BlackrockIO(filename=filename, nsx_to_load=2)
        seg = reader.read_segment()
        self.assertEqual(len(seg.analogsignals), 1)
        self.assertEqual(seg.analogsignals[0].shape, (3640, 6))

        # load only ns2
        reader = BlackrockIO(filename=filename, nsx_to_load=[2])
        seg = reader.read_segment()
        self.assertEqual(len(seg.analogsignals), 1)

        # load ns2 + ns5
        reader = BlackrockIO(filename=filename, nsx_to_load=[2, 5])
        seg = reader.read_segment()
        self.assertEqual(len(seg.analogsignals), 2)
        self.assertEqual(seg.analogsignals[0].shape, (3640, 6))
        self.assertEqual(seg.analogsignals[1].shape, (109224, 96))

        # load only ns5
        reader = BlackrockIO(filename=filename, nsx_to_load='max')
        seg = reader.read_segment()
        self.assertEqual(len(seg.analogsignals), 1)
        self.assertEqual(seg.analogsignals[0].shape, (109224, 96))
    def test_load_muliple_nsx(self):
        """
        Test if multiple nsx signals can be loaded at the same time.
        """
        filename = self.get_filename_path('blackrock_2_1/l101210-001')
        reader = BlackrockIO(filename=filename, verbose=False, nsx_to_load='all')

        # number of different sampling rates corresponds to number of nsx signals, because
        # single nsx contains only signals of identical sampling rate
        block = reader.read_block(load_waveforms=False)
        sampling_rates = np.unique(
            [a.sampling_rate.rescale('Hz') for a in block.filter(objects='AnalogSignal')])
        self.assertEqual(len(sampling_rates), len(reader._selected_nsx))

        segment = reader.read_segment()
        sampling_rates = np.unique(
            [a.sampling_rate.rescale('Hz') for a in segment.filter(objects='AnalogSignal')])
        self.assertEqual(len(sampling_rates), len(reader._selected_nsx))
Beispiel #8
0
    def load_blackrock_data_neo(base_fn):
        neo_io = BlackrockIO(filename=base_fn, nsx_to_load=5)
        neo_block = neo_io.read_block(lazy=False, load_waveforms=False)
        comments = neo_io.nev_data['Comments']

        return {
            'ana_times':
            neo_block.segments[0].analogsignals[0].times,
            'ana_data':
            np.asarray([x for x in neo_block.segments[0].analogsignals])[:, :,
                                                                         0],
            'samp_per_s':
            neo_block.segments[0].analogsignals[0].sampling_rate,
            'chan_labels':
            [x.name for x in neo_block.segments[0].analogsignals],
            'ev_times':
            pq.s * comments['timestamp'] / 30000,
            'ev_depths':
            np.asarray([
                float(x.decode('utf8').split(':')[1])
                for x in comments['comment']
            ])
        }
    def test_load_waveforms(self):
        filename = self.get_filename_path('FileSpec2.3001')
        reader = BlackrockIO(filename=filename, verbose=False)

        bl = reader.read_block(load_waveforms=True)
        assert_neo_object_is_compliant(bl)
Beispiel #10
0
    def test_segment_detection_pause(self):
        """
        This test makes sure segments are detected correctly when pause was used during recording.
        """

        # Path to nev that has spikes that don't fit nsX segment
        filename_nev_outside_seg = self.get_filename_path(
            'segment/PauseSpikesOutside/pause_spikes_outside_seg')
        # Path to nsX and nev that are correct
        filename = self.get_filename_path('segment/PauseCorrect/pause_correct')

        # This issues a warning, because there are spikes a long time after the last segment
        # And another one because there are spikes between segments
        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter("always")
            reader = BlackrockIO(filename=filename,
                                 nsx_to_load=2,
                                 nev_override=filename_nev_outside_seg)
            self.assertGreaterEqual(len(w), 2)

            # Check that warnings are correct
            messages = [
                str(warning.message) for warning in w
                if warning.category == UserWarning
            ]
            self.assertIn('Spikes outside any segment. Detected on segment #1',
                          messages)
            self.assertIn('Spikes 0.0776s after last segment.', messages)

        block = reader.read_block(load_waveforms=False,
                                  signal_group_mode="split-all")

        # 2 segments
        self.assertEqual(len(block.segments), 2)

        # Checking all times are correct as read from file itself
        # (taking neo calculations into account)
        self.assertEqual(block.segments[0].t_start, 0.0)
        # This value is so high, because a spike occurred right before the second segment
        # And thus is added to the first segment
        # This is not normal behavior and occurs because of the way the files were cut
        # into test files
        self.assertAlmostEqual(block.segments[0].t_stop.magnitude, 15.83916667)
        # Clock is not reset
        self.assertEqual(block.segments[1].t_start.magnitude, 31.0087)
        # Segment time is longer here as well because of spikes after second segment
        self.assertEqual(block.segments[1].t_stop.magnitude, 35.0863)
        self.assertEqual(block.segments[0].analogsignals[0].t_start, 0.0)
        # The AnalogSignal is only 4 seconds long, as opposed to the segment
        # whose length is caused by the additional spike
        self.assertEqual(block.segments[0].analogsignals[0].t_stop, 4.0)
        self.assertEqual(block.segments[1].analogsignals[0].t_start, 31.0087)
        self.assertAlmostEqual(
            block.segments[1].analogsignals[0].t_stop.magnitude,
            35.0087,
            places=6)
        self.assertEqual(block.segments[0].spiketrains[0].t_start, 0.0)
        self.assertAlmostEqual(
            block.segments[0].spiketrains[0].t_stop.magnitude,
            15.83916667,
            places=8)
        self.assertEqual(block.segments[1].spiketrains[0].t_start, 31.0087)
        self.assertEqual(block.segments[1].spiketrains[0].t_stop, 35.0863)

        # Each segment has same number of analogsignals
        self.assertEqual(len(block.segments[0].analogsignals),
                         len(block.segments[1].analogsignals))

        # Analogsignals have exactly 4000 samples
        self.assertEqual(len(block.segments[0].analogsignals[0][:]), 4000)
        self.assertEqual(len(block.segments[1].analogsignals[0][:]), 4000)

        # This case is correct, no spikes outside segment or anything
        reader = BlackrockIO(filename=filename, nsx_to_load=2)
        block = reader.read_block(load_waveforms=False,
                                  signal_group_mode="split-all")

        # 2 segments
        self.assertEqual(len(block.segments), 2)

        # Checking all times are correct as read from file itself
        # (taking neo calculations into account)
        self.assertEqual(block.segments[0].t_start, 0.0)
        # Now segment time is only 4 seconds, because there were no additional spikes
        self.assertEqual(block.segments[0].t_stop, 4.0)
        self.assertEqual(block.segments[1].t_start, 31.0087)
        self.assertAlmostEqual(block.segments[1].t_stop.magnitude,
                               35.0087,
                               places=6)
        self.assertEqual(block.segments[0].analogsignals[0].t_start, 0.0)
        self.assertEqual(block.segments[0].analogsignals[0].t_stop, 4.0)
        self.assertEqual(block.segments[1].analogsignals[0].t_start, 31.0087)
        self.assertAlmostEqual(
            block.segments[1].analogsignals[0].t_stop.magnitude,
            35.0087,
            places=6)
        self.assertEqual(block.segments[0].spiketrains[0].t_start, 0.0)
        self.assertEqual(block.segments[0].spiketrains[0].t_stop, 4.0)
        self.assertEqual(block.segments[1].spiketrains[0].t_start, 31.0087)
        self.assertAlmostEqual(
            block.segments[1].spiketrains[0].t_stop.magnitude,
            35.0087,
            places=6)

        # Each segment has same number of analogsignals
        self.assertEqual(len(block.segments[0].analogsignals),
                         len(block.segments[1].analogsignals))

        # ns2 was created in such a way that all analogsignals have 4000 samples
        self.assertEqual(len(block.segments[0].analogsignals[0][:]), 4000)
        self.assertEqual(len(block.segments[1].analogsignals[0][:]), 4000)
Beispiel #11
0
    def test_compare_blackrockio_with_matlabloader_v21(self):
        """
        This test compares the output of BlackrockIO.read_block() with the
        output generated by a Matlab implementation of a Blackrock file reader
        provided by the company. The output for comparison is provided in a
        .mat file created by the script create_data_matlab_blackrock.m.
        The function tests LFPs, spike times, and digital events.
        """

        dirname = get_test_file_full_path(ioclass=BlackrockIO,
                                          filename='blackrock_2_1/l101210-001',
                                          directory=self.local_test_dir,
                                          clean=False)
        # First run with parameters for ns5, then run with correct parameters for ns2
        parameters = [('blackrock_2_1/l101210-001_nev-02_ns5.mat', {
            'nsx_to_load': 5,
            'nev_override': '-'.join([dirname, '02'])
        }), ('blackrock_2_1/l101210-001.mat', {
            'nsx_to_load': 2
        })]
        for index, param in enumerate(parameters):
            # Load data from matlab generated files
            ml = scipy.io.loadmat(
                get_test_file_full_path(ioclass=BlackrockIO,
                                        filename=param[0],
                                        directory=self.local_test_dir,
                                        clean=False))
            lfp_ml = ml['lfp']  # (channel x time) LFP matrix
            ts_ml = ml['ts']  # spike time stamps
            elec_ml = ml['el']  # spike electrodes
            unit_ml = ml['un']  # spike unit IDs
            wf_ml = ml['wf']  # waveforms
            mts_ml = ml['mts']  # marker time stamps
            mid_ml = ml['mid']  # marker IDs

            # Load data from original data files using the Neo BlackrockIO
            session = BlackrockIO(dirname, verbose=False, **param[1])
            block = session.read_block(load_waveforms=True,
                                       signal_group_mode='split-all')
            # Check if analog data are equal
            self.assertGreater(len(block.channel_indexes), 0)
            for i, chidx in enumerate(block.channel_indexes):
                # Break for ChannelIndexes for Units that don't contain any Analogsignals
                if len(chidx.analogsignals) == 0 and len(chidx.units) >= 1:
                    break
                # Should only have one AnalogSignal per ChannelIndex
                self.assertEqual(len(chidx.analogsignals), 1)

                # Find out channel_id in order to compare correctly
                idx = chidx.analogsignals[0].annotations['channel_id']
                # Get data of AnalogSignal without pq.units
                anasig = np.squeeze(chidx.analogsignals[0].base[:].magnitude)
                # Test for equality of first nonzero values of AnalogSignal
                #                                   and matlab file contents
                # If not equal test if hardcoded gain is responsible for this
                # See BlackrockRawIO ll. 1420 commit 77a645655605ae39eca2de3ee511f3b522f11bd7
                j = 0
                while anasig[j] == 0:
                    j += 1
                if lfp_ml[i, j] != np.squeeze(
                        chidx.analogsignals[0].base[j].magnitude):
                    anasig = anasig / 152.592547
                    anasig = np.round(anasig).astype(int)

                # Special case because id 142 is not included in ns2 file
                if idx == 143:
                    idx -= 1
                if idx > 128:
                    idx = idx - 136

                assert_equal(anasig, lfp_ml[idx - 1, :])

            # Check if spikes are equal
            self.assertEqual(len(block.segments), 1)
            for st_i in block.segments[0].spiketrains:
                channelid = st_i.annotations['channel_id']
                unitid = st_i.annotations['unit_id']

                # Compare waveforms
                matlab_wf = wf_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml ==
                                   unitid)), :][0]
                # Atleast_2d as correction for waveforms that are saved
                # in single dimension in SpikeTrain
                # because only one waveform is available
                assert_equal(
                    np.atleast_2d(np.squeeze(st_i.waveforms).magnitude),
                    matlab_wf)

                # Compare spike timestamps
                matlab_spikes = ts_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml == unitid))]
                # Going sure that unit is really seconds and not 1/30000 seconds
                if (not st_i.units == pq.CompoundUnit("1.0/{0} * s".format(30000))) and \
                        st_i.units == pq.s:
                    st_i = np.round(st_i.base * 30000).astype(int)
                assert_equal(st_i, matlab_spikes)

            # Check if digital input port events are equal
            self.assertGreater(len(block.segments[0].events), 0)
            for ea_i in block.segments[0].events:
                if ea_i.name == 'digital_input_port':
                    # Get all digital event IDs in this recording
                    marker_ids = set(ea_i.labels)
                    for marker_id in marker_ids:
                        python_digievents = np.round(
                            ea_i.times.base[ea_i.labels == marker_id] *
                            30000).astype(int)
                        matlab_digievents = mts_ml[np.nonzero(
                            mid_ml == int(marker_id))]
                        assert_equal(python_digievents, matlab_digievents)
    def test_inputs_V23(self):
        """
        Test various inputs to BlackrockIO.read_block with version 2.3 file
        to check for parsing errors.
        """

        try:
            b = BlackrockIO(get_test_file_full_path(
                ioclass=BlackrockIO,
                filename='FileSpec2.3001',
                directory=self.local_test_dir,
                clean=False),
                            verbose=False)
        except:
            self.fail()

        # Load data to maximum extent, one None is not given as list
        block = b.read_block(n_starts=[None],
                             n_stops=None,
                             channels=range(1, 9),
                             nsx_to_load=5,
                             units='all',
                             load_events=True,
                             load_waveforms=False)
        lena = len(block.segments[0].analogsignals[0])
        numspa = len(block.segments[0].spiketrains[0])

        # Load data using a negative time and a time exceeding the end of the
        # recording
        too_large_tstop = block.segments[0].analogsignals[0].t_stop + 1 * pq.s
        block = b.read_block(n_starts=[-100 * pq.ms],
                             n_stops=[too_large_tstop],
                             channels=range(1, 9),
                             nsx_to_load=[5],
                             units='all',
                             load_events=False,
                             load_waveforms=False)
        lenb = len(block.segments[0].analogsignals[0])
        numspb = len(block.segments[0].spiketrains[0])

        # Same length of analog signal?
        # Both should have read the complete data set!
        self.assertEqual(lena, lenb)

        # Same length of spike train?
        # Both should have read the complete data set!
        self.assertEqual(numspa, numspb)

        # n_starts and n_stops not given as list
        # verifies identical length of returned signals given equal durations
        # as input
        ns5_unit = block.segments[0].analogsignals[0].sampling_period
        block = b.read_block(n_starts=100 * ns5_unit,
                             n_stops=200 * ns5_unit,
                             channels=range(1, 9),
                             nsx_to_load=5,
                             units='all',
                             load_events=False,
                             load_waveforms=False)
        lena = len(block.segments[0].analogsignals[0])

        block = b.read_block(n_starts=301 * ns5_unit,
                             n_stops=401 * ns5_unit,
                             channels=range(1, 9),
                             nsx_to_load=5,
                             units='all',
                             load_events=False,
                             load_waveforms=False)
        lenb = len(block.segments[0].analogsignals[0])

        # Same length?
        self.assertEqual(lena, lenb)
        # Length should be 100 samples exactly
        self.assertEqual(lena, 100)

        # Load partial data types and check if this is selection is made
        block = b.read_block(n_starts=None,
                             n_stops=None,
                             channels=range(1, 9),
                             nsx_to_load=5,
                             units='none',
                             load_events=False,
                             load_waveforms=True)

        self.assertEqual(len(block.segments), 1)
        self.assertEqual(len(block.segments[0].analogsignals), 8)
        self.assertEqual(len(block.channel_indexes), 8)
        self.assertEqual(len(block.channel_indexes[0].units), 0)
        self.assertEqual(len(block.segments[0].events), 0)
        self.assertEqual(len(block.segments[0].spiketrains), 0)

        # NOTE: channel 6 does not contain any unit
        block = b.read_block(n_starts=[None, 3000 * pq.ms],
                             n_stops=[1000 * pq.ms, None],
                             channels=range(1, 9),
                             nsx_to_load='none',
                             units={
                                 1: 0,
                                 5: 0,
                                 6: 0
                             },
                             load_events=True,
                             load_waveforms=True)

        self.assertEqual(len(block.segments), 2)
        self.assertEqual(len(block.segments[0].analogsignals), 0)
        self.assertEqual(len(block.channel_indexes), 8)
        self.assertEqual(len(block.channel_indexes[0].units), 1)
        self.assertEqual(len(block.segments[0].events), 0)
        self.assertEqual(len(block.segments[0].spiketrains), 2)
    def test_compare_blackrockio_with_matlabloader(self):
        """
        This test compares the output of BlackRockIO.read_block() with the
        output generated by a Matlab implementation of a Blackrock file reader
        provided by the company. The output for comparison is provided in a
        .mat file created by the script create_data_matlab_blackrock.m.
        The function tests LFPs, spike times, and digital events on channels
        80-83 and spike waveforms on channel 82, unit 1.
        For details on the file contents, refer to FileSpec2.3.txt
        """

        # Load data from Matlab generated files
        ml = scipy.io.loadmat(
            get_test_file_full_path(ioclass=BlackrockIO,
                                    filename='FileSpec2.3001.mat',
                                    directory=self.local_test_dir,
                                    clean=False))
        lfp_ml = ml['lfp']  # (channel x time) LFP matrix
        ts_ml = ml['ts']  # spike time stamps
        elec_ml = ml['el']  # spike electrodes
        unit_ml = ml['un']  # spike unit IDs
        wf_ml = ml['wf']  # waveform unit 1 channel 1
        mts_ml = ml['mts']  # marker time stamps
        mid_ml = ml['mid']  # marker IDs

        # Load data in channels 1-3 from original data files using the Neo
        # BlackrockIO
        session = BlackrockIO(get_test_file_full_path(
            ioclass=BlackrockIO,
            filename='FileSpec2.3001',
            directory=self.local_test_dir,
            clean=False),
                              verbose=False)
        block = session.read_block(channels=range(1, 9),
                                   units='all',
                                   nsx_to_load='all',
                                   scaling='raw',
                                   load_waveforms=True,
                                   load_events=True)

        # Check if analog data on channels 1-8 are equal
        self.assertGreater(len(block.channel_indexes), 0)
        for chidx in block.channel_indexes:
            # Should only have one AnalogSignal per ChannelIndex
            self.assertEqual(len(chidx.analogsignals), 1)

            idx = chidx.analogsignals[0].annotations['channel_id']
            if idx in range(1, 9):
                # We ignore the last sample of the Analogsignal returned by the
                # Python implementation, since due to an error in the
                # corresponding matlab loader the last sample was ignored and
                # not saved to the test file
                assert_equal(np.squeeze(chidx.analogsignals[0].base[:-1]),
                             lfp_ml[idx - 1, :])

        # Check if spikes in channels 1,3,5,7 are equal
        self.assertEqual(len(block.segments), 1)
        for st_i in block.segments[0].spiketrains:
            channelid = st_i.annotations['channel_id']
            if channelid in range(1, 7, 2):
                unitid = st_i.annotations['unit_id']
                matlab_spikes = ts_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml == unitid))]
                assert_equal(st_i.base, matlab_spikes)

                # Check waveforms of channel 1, unit 0
                if channelid == 1 and unitid == 0:
                    assert_equal(np.squeeze(st_i.waveforms), wf_ml)

        # Check if digital input port events are equal
        self.assertGreater(len(block.segments[0].events), 0)
        for ea_i in block.segments[0].events:
            if ea_i.name == 'digital_input_port':
                # Get all digital event IDs in this recording
                marker_ids = set(ea_i.labels)
                for marker_id in marker_ids:
                    python_digievents = ea_i.times.base[ea_i.labels ==
                                                        marker_id]
                    matlab_digievents = mts_ml[np.nonzero(
                        mid_ml == int(marker_id))]
                    assert_equal(python_digievents, matlab_digievents)
Beispiel #14
0
    def test_compare_blackrockio_with_matlabloader(self):
        """
        This test compares the output of ReachGraspIO.read_block() with the
        output generated by a Matlab implementation of a Blackrock file reader
        provided by the company. The output for comparison is provided in a
        .mat file created by the script create_data_matlab_blackrock.m.
        The function tests LFPs, spike times, and digital events on channels
        80-83 and spike waveforms on channel 82, unit 1.
        For details on the file contents, refer to FileSpec2.3.txt
        """

        # Load data from Matlab generated files
        ml = scipy.io.loadmat(
            get_test_file_full_path(
                ioclass=BlackrockIO,
                filename='FileSpec2.3001.mat',
                directory=self.local_test_dir, clean=False))
        lfp_ml = ml['lfp']  # (channel x time) LFP matrix
        ts_ml = ml['ts']  # spike time stamps
        elec_ml = ml['el']  # spike electrodes
        unit_ml = ml['un']  # spike unit IDs
        wf_ml = ml['wf']  # waveform unit 1 channel 1
        mts_ml = ml['mts']  # marker time stamps
        mid_ml = ml['mid']  # marker IDs

        # Load data in channels 1-3 from original data files using the neo
        # framework
        session = BlackrockIO(
            get_test_file_full_path(
                ioclass=BlackrockIO,
                filename='FileSpec2.3001',
                directory=self.local_test_dir, clean=False),
            verbose=False)
        block = session.read_block(load_waveforms=True)

        # Check if analog data on channels 1-8 are equal
        for rcg_i in block.channel_indexes:
            # Should only have one recording channel per group
            self.assertEqual(rcg_i.size, 1)

            idx = rcg_i[0]
            if idx in range(1, 9):
                assert_equal(rcg_i.analogsignal.base, lfp_ml[idx - 1, :])

        # Should only have one segment
        self.assertEqual(len(block.segments), 1)

        # Check if spikes in channels 1,3,5,7 are equal
        for st_i in block.segments[0].spiketrains:
            channelid = st_i.annotations['channel_id']
            if channelid in range(1, 7, 2):
                unitid = st_i.annotations['unit_id']
                matlab_spikes = ts_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml == unitid))]
                assert_equal(st_i.base, matlab_spikes)

                # Check waveforms of channel 1, unit 0
                if channelid == 1 and unitid == 0:
                    assert_equal(st_i.waveforms, wf_ml)

        # Check if digital marker events are equal
        for ea_i in block.segments[0].events:
            if ('digital_marker' in ea_i.annotations.keys()) and (
                    ea_i.annotations['digital_marker'] is True):
                markerid = ea_i.annotations['marker_id']
                matlab_digievents = mts_ml[np.nonzero(mid_ml == markerid)]
                assert_equal(ea_i.times.base, matlab_digievents)

        # Check if analog marker events are equal
        # Currently not implemented by the Matlab loader
        for ea_i in block.segments[0].events:
            if ('analog_marker' in ea_i.annotations.keys()) and (
                    ea_i.annotations['analog_marker'] is True):
                markerid = ea_i.annotations['marker_id']
                matlab_anaevents = mts_ml[np.nonzero(mid_ml == markerid)]
                assert_equal(ea_i.times.base, matlab_anaevents)
    def test_compare_blackrockio_with_matlabloader_V23(self):
        """
        This test compares the output of BlackrockIO.read_block() with the
        output generated by a Matlab implementation of a Blackrock file reader
        provided by the company. The output for comparison is provided in a .mat
        file created by the script create_data_matlab_blackrock.m.

        The function tests LFPs, spike times, and digital events on channels
        1-8 and spike waveforms on channel 1, unit 0.
        
        For details on the file contents, refer to FileSpec2.3.txt
        """

        # Turns false on error
        allok = True

        # Load data from Matlab generated files
        ml = scipy.io.loadmat(
            os.path.join(tempfile.gettempdir(), 'files_for_testing_neo',
                         'blackrock', 'FileSpec2.3001.mat'))
        lfp_ml = ml['lfp']  # (channel x time) LFP matrix
        ts_ml = ml['ts']  # spike time stamps
        elec_ml = ml['el']  # spike electrodes
        unit_ml = ml['un']  # spike unit IDs
        wf_ml = ml['wf']  # waveform unit 1 channel 1
        mts_ml = ml['mts']  # marker time stamps
        mid_ml = ml['mid']  # marker IDs

        # Load data in channels 1-3 from original data files using neo framework
        try:
            session = BlackrockIO(os.path.join(tempfile.gettempdir(),
                                               'files_for_testing_neo',
                                               'blackrock', 'FileSpec2.3001'),
                                  print_diagnostic=False)
            block = session.read_block(n_starts=[None],
                                       n_stops=[None],
                                       channel_list=range(1, 9),
                                       nsx=5,
                                       units=[],
                                       events=True,
                                       waveforms=True)
        except:
            allok = False

        # Check if analog data on channels 1-8 are equal
        for rcg_i in block.recordingchannelgroups:
            # Should only have one recording channel per group
            if len(rcg_i.recordingchannels) != 1:
                allok = False

            rc = rcg_i.recordingchannels[0]
            idx = rc.index
            if idx in range(1, 9):
                if np.any(rc.analogsignals[0].base - lfp_ml[idx - 1, :]):
                    allok = False

        # Should only have one segment
        if len(block.segments) != 1:
            allok = False

        # Check if spikes in channels 1,3,5,7 are equal
        for st_i in block.segments[0].spiketrains:
            channelid = st_i.annotations['channel_id']
            if channelid in range(1, 7, 2):
                unitid = st_i.annotations['unit_id']
                matlab_spikes = ts_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml == unitid))]
                if np.any(st_i.base - matlab_spikes):
                    allok = False

                # Check waveforms of channel 1, unit 0
                if channelid == 1 and unitid == 0:
                    if np.any(st_i.waveforms - wf_ml):
                        allok = False

        # Check if digital marker events are equal
        for ea_i in block.segments[0].eventarrays:
            if 'digital_marker' in ea_i.annotations.keys(
            ) and ea_i.annotations['digital_marker'] == True:
                markerid = ea_i.annotations['marker_id']
                matlab_digievents = mts_ml[np.nonzero(mid_ml == markerid)]
                if np.any(ea_i.times.base - matlab_digievents):
                    allok = False

        # Check if analog marker events are equal
        # Currently not implemented by the Matlab loader
        for ea_i in block.segments[0].eventarrays:
            if 'analog_marker' in ea_i.annotations.keys(
            ) and ea_i.annotations['analog_marker'] == True:
                markerid = ea_i.annotations['marker_id']
                matlab_anaevents = mts_ml[np.nonzero(mid_ml == markerid)]
                if np.any(ea_i.times.base - matlab_anaevents):
                    allok = False

        # Final result
        self.assertTrue(allok)
    def test_inputs_V23(self):
        """
        Test various inputs to BlackrockIO.read_block with version 2.3 file to check for parsing errors.
        """

        # Turns false on error
        allok = True

        try:
            b = BlackrockIO(os.path.join(tempfile.gettempdir(),
                                         'files_for_testing_neo', 'blackrock',
                                         'FileSpec2.3001'),
                            print_diagnostic=False)

            # Load data to maximum extent, one None is not given as list
            block = b.read_block(n_starts=[None],
                                 n_stops=None,
                                 channel_list=range(1, 9),
                                 nsx=5,
                                 units=[],
                                 events=True,
                                 waveforms=False)
            lena = len(block.segments[0].analogsignals[0])
            numspa = len(block.segments[0].spiketrains[0])

            # Load data with very long extent using a negative time and the get_max_time() method
            block = b.read_block(n_starts=[-100 * pq.ms],
                                 n_stops=[b.get_max_time()],
                                 channel_list=range(1, 9),
                                 nsx=[5],
                                 units=[],
                                 events=False,
                                 waveforms=False)
            lenb = len(block.segments[0].analogsignals[0])
            numspb = len(block.segments[0].spiketrains[0])

            # Same length of analog signal? Both should have read the complete data set!
            if lena != lenb:
                allok = False
            # Same length of spike train? Both should have read the complete data set!
            if numspa != numspb:
                allok = False

            # Load data with very long extent, n_starts and n_stops not given as list
            block = b.read_block(n_starts=100 * b.nsx_unit[5],
                                 n_stops=200 * b.nsx_unit[5],
                                 channel_list=range(1, 9),
                                 nsx=5,
                                 units=[],
                                 events=False,
                                 waveforms=False)
            lena = len(block.segments[0].analogsignals[0])

            block = b.read_block(n_starts=301 * b.nsx_unit[5],
                                 n_stops=401 * b.nsx_unit[5],
                                 channel_list=range(1, 9),
                                 nsx=5,
                                 units=[],
                                 events=False,
                                 waveforms=False)
            lenb = len(block.segments[0].analogsignals[0])

            # Same length?
            if lena != lenb:
                allok = False

            # Length should be 100 samples exactly
            if lena != 100:
                allok = False

            # Load partial data types and check if this is selection is made
            block = b.read_block(n_starts=None,
                                 n_stops=None,
                                 channel_list=range(1, 9),
                                 nsx=5,
                                 units=None,
                                 events=False,
                                 waveforms=True)
            if len(block.segments) != 1:
                allok = False
            if len(block.segments[0].analogsignals) != 8:
                allok = False
            if len(block.recordingchannelgroups) != 8:
                allok = False
            if len(block.recordingchannelgroups[0].units) != 0:
                allok = False
            if len(block.segments[0].eventarrays) != 0:
                allok = False
            if len(block.segments[0].spiketrains) != 0:
                allok = False

            block = b.read_block(n_starts=[None, 3000 * pq.ms],
                                 n_stops=[1000 * pq.ms, None],
                                 channel_list=range(1, 9),
                                 nsx=None,
                                 units={
                                     1: 0,
                                     5: 0,
                                     6: 0
                                 },
                                 events=True,
                                 waveforms=True)
            if len(block.segments) != 2:
                allok = False
            if len(block.segments[0].analogsignals) != 0:
                allok = False
            if len(block.recordingchannelgroups) != 8:
                allok = False
            if len(block.recordingchannelgroups[0].units) != 1:
                allok = False
            # if len(block.recordingchannelgroups[4].units) != 0:  # only one of two neurons on channel 78, and only one unit for two segments!
            #    allok = False
            if len(block.segments[0].eventarrays) == 0:
                allok = False
            if len(block.segments[0].spiketrains[0].waveforms) == 0:
                allok = False

        except:
            allok = False

        self.assertTrue(allok)
Beispiel #17
0
    def test_inputs_V23(self):
        """
        Test various inputs to BlackrockIO.read_block with version 2.3 file
        to check for parsing errors.
        """
        filename = self.get_filename_path('FileSpec2.3001')
        reader = BlackrockIO(
            filename=filename,
            verbose=False,
            nsx_to_load=5,
        )

        # Load data to maximum extent, one None is not given as list
        block = reader.read_block(time_slices=None, load_waveforms=False)
        lena = len(block.segments[0].analogsignals[0])
        numspa = len(block.segments[0].spiketrains[0])

        # Load data using a negative time and a time exceeding the end of the
        # recording raise an error
        too_large_tstop = block.segments[0].analogsignals[0].t_stop + 1 * pq.s
        buggy_slice = (-100 * pq.ms, too_large_tstop)

        #this raise error in read_block
        with self.assertRaises(ValueError):
            block = reader.read_block(time_slices=[buggy_slice])

        #but this is valid in read_segment because seg_index is specified
        seg = reader.read_segment(seg_index=0, time_slice=buggy_slice)

        lenb = len(seg.analogsignals[0])
        numspb = len(seg.spiketrains[0])

        # Same length of analog signal?
        # Both should have read the complete data set!
        self.assertEqual(lena, lenb)

        # Same length of spike train?
        # Both should have read the complete data set!
        self.assertEqual(numspa, numspb)

        # n_starts and n_stops not given as list
        # verifies identical length of returned signals given equal durations
        # as input
        ns5_unit = block.segments[0].analogsignals[0].sampling_period
        time_slice = (100 * ns5_unit, 200 * ns5_unit)
        block = reader.read_block(time_slices=[time_slice])
        lena = len(block.segments[0].analogsignals[0])

        time_slice = (100 * ns5_unit, 200 * ns5_unit)
        block = reader.read_block(time_slices=[time_slice])
        lenb = len(block.segments[0].analogsignals[0])

        # Same length?
        self.assertEqual(lena, lenb)
        # Length should be 100 samples exactly
        self.assertEqual(lena, 100)

        # test 4 Units
        time_slices = [(0, 1000 * pq.ms), (3000 * pq.ms, 4000 * pq.ms)]
        block = reader.read_block(time_slices=time_slices,
                                  load_waveforms=True,
                                  units_group_mode='all-in-one')

        self.assertEqual(len(block.segments), 2)
        self.assertEqual(len(block.segments[0].analogsignals), 10)
        self.assertEqual(len(block.channel_indexes[-1].units), 4)
        self.assertEqual(len(block.channel_indexes[-1].units),
                         len(block.segments[0].spiketrains))

        anasig = block.segments[0].analogsignals[0]
        self.assertIsNotNone(anasig.file_origin)
    def test_compare_blackrockio_with_matlabloader_v21(self):
        """
        This test compares the output of BlackrockIO.read_block() with the
        output generated by a Matlab implementation of a Blackrock file reader
        provided by the company. The output for comparison is provided in a
        .mat file created by the script create_data_matlab_blackrock.m.
        The function tests LFPs, spike times, and digital events.
        """

        dirname = self.get_local_path('blackrock/blackrock_2_1/l101210-001')
        # First run with parameters for ns5, then run with correct parameters for ns2
        parameters = [('blackrock/blackrock_2_1/l101210-001_nev-02_ns5.mat', {
            'nsx_to_load': 5,
            'nev_override': '-'.join([dirname, '02'])
        }), ('blackrock/blackrock_2_1/l101210-001.mat', {
            'nsx_to_load': 2
        })]
        for index, param in enumerate(parameters):
            # Load data from matlab generated files
            ml = scipy.io.loadmat(self.get_local_path(param[0]))
            lfp_ml = ml['lfp']  # (channel x time) LFP matrix
            ts_ml = ml['ts']  # spike time stamps
            elec_ml = ml['el']  # spike electrodes
            unit_ml = ml['un']  # spike unit IDs
            wf_ml = ml['wf']  # waveforms
            mts_ml = ml['mts']  # marker time stamps
            mid_ml = ml['mid']  # marker IDs

            # Load data from original data files using the Neo BlackrockIO
            session = BlackrockIO(dirname, verbose=False, **param[1])
            block = session.read_block(load_waveforms=True,
                                       signal_group_mode='split-all')
            # Check if analog data are equal
            self.assertGreater(len(block.groups), 0)

            # Check if spikes are equal
            self.assertEqual(len(block.segments), 1)
            for st_i in block.segments[0].spiketrains:
                channelid = st_i.annotations['channel_id']
                unitid = st_i.annotations['unit_id']

                # Compare waveforms
                matlab_wf = wf_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml ==
                                   unitid)), :][0]
                # Atleast_2d as correction for waveforms that are saved
                # in single dimension in SpikeTrain
                # because only one waveform is available
                assert_equal(
                    np.atleast_2d(np.squeeze(st_i.waveforms).magnitude),
                    matlab_wf)

                # Compare spike timestamps
                matlab_spikes = ts_ml[np.nonzero(
                    np.logical_and(elec_ml == channelid, unit_ml == unitid))]
                # Going sure that unit is really seconds and not 1/30000 seconds
                if (not st_i.units == pq.CompoundUnit("1.0/{} * s".format(30000))) and \
                        st_i.units == pq.s:
                    st_i = np.round(st_i.base * 30000).astype(int)
                assert_equal(st_i, matlab_spikes)

            # Check if digital input port events are equal
            self.assertGreater(len(block.segments[0].events), 0)
            for ea_i in block.segments[0].events:
                if ea_i.name == 'digital_input_port':
                    # Get all digital event IDs in this recording
                    marker_ids = set(ea_i.labels)
                    for marker_id in marker_ids:
                        python_digievents = np.round(
                            ea_i.times.base[ea_i.labels == marker_id] *
                            30000).astype(int)
                        matlab_digievents = mts_ml[np.nonzero(
                            mid_ml == int(marker_id))]
                        assert_equal(python_digievents, matlab_digievents)