1)) event_label_stream[target_indices[1]] = 1 clean_count += 1 started = False target_count = 0 target_indices = [] print('cleaned {0} event markers in {1} trials for label {2}'.format( clean_count, trial_count, target_label)) # extract the time when the target label - 4 is present figure(figsize=(40, 6), dpi=80) target_onset_em = np.logical_and( event_label_stream == 1, np.concatenate([np.array([0]), np.diff(event_label_stream)]) != 0) plt.scatter(timestamps_stream, target_onset_em, c='r') target_onset_em = np.logical_and( event_label_stream == target_label, np.concatenate([np.array([0]), np.diff(event_label_stream)]) != 0) plt.scatter(timestamps_stream, target_onset_em, c='b') plt.title('Event label: {0}'.format(target_label)) plt.show() assert np.count_nonzero(target_onset_em) == trial_count data[em_stream_name][0][-1, :] = event_label_stream rns = RNStream('{0} CLEANED.dats'.format(file_path.split('.')[0])) rns.stream_out(data)
class RecordingsTab(QtWidgets.QWidget): def __init__(self, parent): """ :param lsl_data_buffer: dict, passed by reference. Do not modify, as modifying it makes a copy. :rtype: object """ super().__init__() self.ui = uic.loadUi("ui/RecordingsTab.ui", self) self.recording_buffer = {} self.is_recording = False self.StartRecordingBtn.clicked.connect(self.start_recording_btn_ressed) self.StopRecordingBtn.clicked.connect(self.stop_recording_btn_pressed) self.SelectDataDirBtn.clicked.connect(self.select_data_dir_btn_pressed) self.StopRecordingBtn.setEnabled(False) self.parent = parent self.data_dir = config.DEFAULT_DATA_DIR self.save_path = '' self.save_stream = None self.saveRootTextEdit.setText(self.data_dir + '/') self.timer = QTimer() self.timer.setInterval(config.EVICTION_INTERVAL) self.timer.timeout.connect(self.evict_buffer) self.recording_byte_count = 0 def select_data_dir_btn_pressed(self): selected_data_dir = str(QFileDialog.getExistingDirectory(self.widget_3, "Select Directory")) if selected_data_dir != '': self.data_dir = selected_data_dir print("Selected data dir: ", self.data_dir) self.saveRootTextEdit.setText(self.data_dir + '/') def start_recording_btn_ressed(self): if not (len(self.parent.LSL_data_buffer_dicts.keys()) >= 1 or len(self.parent.cam_workers) >= 1): dialog_popup('You need at least one LSL Stream or Capture opened to start recording!') return self.save_path = self.generate_save_path() # get a new save path self.save_stream = RNStream(self.save_path) self.recording_buffer = {} # clear buffer self.is_recording = True self.StartRecordingBtn.setEnabled(False) self.StopRecordingBtn.setEnabled(True) self.recording_byte_count = 0 self.timer.start() def stop_recording_btn_pressed(self): self.is_recording = False self.StopRecordingBtn.setEnabled(False) self.StartRecordingBtn.setEnabled(True) self.evict_buffer() self.timer.stop() self.recording_byte_count = 0 self.update_file_size_label() dialog_popup('Saved to {0}'.format(self.save_path), title='Info') def update_buffers(self, data_dict: dict): if self.is_recording: lsl_data_type = data_dict['lsl_data_type'] # get the type of the newly-come data if lsl_data_type not in self.recording_buffer.keys(): self.recording_buffer[lsl_data_type] = [np.empty(shape=(data_dict['frames'].shape[0], 0)), np.empty(shape=(0,))] # data first, timestamps second buffered_data = self.recording_buffer[data_dict['lsl_data_type']][0] buffered_timestamps = self.recording_buffer[data_dict['lsl_data_type']][1] self.recording_buffer[lsl_data_type][0] = np.concatenate([buffered_data, data_dict['frames']], axis=-1) self.recording_buffer[lsl_data_type][1] = np.concatenate([buffered_timestamps, data_dict['timestamps']]) pass def update_camera_screen_buffer(self, cam_id, new_frame, timestamp): if self.is_recording: if cam_id not in self.recording_buffer.keys(): # note array data type is uint8 0~255 self.recording_buffer[cam_id] = [np.empty(shape=new_frame.shape + (0,), dtype=np.uint8), np.empty(shape=(0,)), np.empty(shape=(0,))] _new_frame = np.expand_dims(new_frame, axis=-1) buffered_data = self.recording_buffer[cam_id][0] buffered_timestamps = self.recording_buffer[cam_id][1] self.recording_buffer[cam_id][0] = np.concatenate([buffered_data, _new_frame.astype(np.uint8)], axis=-1) self.recording_buffer[cam_id][1] = np.concatenate([buffered_timestamps, [timestamp]]) self.recording_buffer[cam_id][2] = np.concatenate([self.recording_buffer[cam_id][2], [time.time()]]) pass def generate_save_path(self): os.makedirs(self.saveRootTextEdit.toPlainText(), exist_ok=True) # datetime object containing current date and time now = datetime.now() dt_string = now.strftime("%m_%d_%Y_%H_%M_%S") return os.path.join(self.saveRootTextEdit.toPlainText(), '{0}-Exp_{1}-Sbj_{2}-Ssn_{3}.dats'.format(dt_string, self.experimentNameTextEdit.toPlainText(), self.subjectTagTextEdit.toPlainText(), self.sessionTagTextEdit.toPlainText())) def evict_buffer(self): self.recording_byte_count += self.save_stream.stream_out(self.recording_buffer) self.recording_buffer = {} self.update_file_size_label() def update_file_size_label(self): self.parent.recordingFileSizeLabel. \ setText(' Recording file size: {0} Mb'.format(str(round(self.recording_byte_count / 10 ** 6, 2))))
from utils.data_utils import RNStream test_rns = RNStream('C:/Recordings/test.dats') test_reloaded_data = test_rns.stream_in() another_rns = RNStream( 'C:/Recordings/03_22_2021_00_00_55-Exp_myexperiment-Sbj_someone-Ssn_0.dats' ) another_reloaded_data = another_rns.stream_in() result_rns = RNStream('C:/Recordings/results.dats') result_rns.stream_out(test_reloaded_data) result_rns.stream_out(another_reloaded_data) results_reloaded_data = result_rns.stream_in()