Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
bundle = NSBundle.mainBundle()
if bundle:
info = (bundle.localizedInfoDictionary() or
bundle.infoDictionary())
if info:
info["CFBundleName"] = app_name
matplotlib.use("Qt5Agg")
app = QApplication(sys.argv)
app.setApplicationName(app_name)
app.setOrganizationName("cbrnr")
if sys.platform.startswith("darwin"):
app.setAttribute(Qt.AA_DontShowIconsInMenus, True)
app.setAttribute(Qt.AA_UseHighDpiPixmaps)
model = Model()
model.view = MainWindow(model)
if len(sys.argv) > 1: # open files from command line arguments
for f in sys.argv[1:]:
model.load(f)
model.view.show()
sys.exit(app.exec_())
else:
bundle = NSBundle.mainBundle()
if bundle:
info = (bundle.localizedInfoDictionary() or
bundle.infoDictionary())
if info:
info["CFBundleName"] = app_name
matplotlib.use("Qt5Agg")
app = QApplication(sys.argv)
app.setApplicationName(app_name)
app.setOrganizationName("cbrnr")
if sys.platform.startswith("darwin"):
app.setAttribute(Qt.AA_DontShowIconsInMenus, True)
app.setAttribute(Qt.AA_UseHighDpiPixmaps)
model = Model()
model.view = MainWindow(model)
if len(sys.argv) > 1: # open files from command line arguments
for f in sys.argv[1:]:
model.load(f)
model.view.show()
sys.exit(app.exec_())
def import_annotations(self, fname):
"""Import annotations from a CSV file."""
descs, onsets, durations = [], [], []
fs = self.current["data"].info["sfreq"]
with open(fname) as f:
f.readline() # skip header
for line in f:
ann = line.split(",")
if len(ann) == 3: # type, onset, duration
onset = float(ann[1].strip())
duration = float(ann[2].strip())
if onset > self.current["data"].n_times / fs:
msg = ("One or more annotations are outside of the "
"data range.")
raise InvalidAnnotationsError(msg)
else:
descs.append(ann[0].strip())
onsets.append(onset)
durations.append(duration)
annotations = mne.Annotations(onsets, durations, descs)
self.current["data"].set_annotations(annotations)
def import_bads(self, fname):
"""Import bad channels info from a CSV file."""
with open(fname) as f:
bads = f.read().replace(" ", "").strip().split(",")
unknown = set(bads) - set(self.current["data"].info["ch_names"])
if unknown:
msg = ("The following imported channel labels are not " +
"present in the data: " + ",".join(unknown))
raise LabelsNotFoundError(msg)
else:
self.current["data"].info["bads"] = bads
append = bool(self.model.get_compatibles())
self.actions["append_data"].setEnabled(
enabled and append and
(self.model.current["dtype"] in ("raw", "epochs")))
self.actions["meta_info"].setEnabled(
enabled and
self.model.current["ftype"] in ["XDF", "XDFZ", "XDF.GZ"])
self.actions["convert_od"].setEnabled(
len(mne.pick_types(self.model.current["data"].info,
fnirs="fnirs_raw")))
self.actions["convert_bl"].setEnabled(
len(mne.pick_types(self.model.current["data"].info,
fnirs="fnirs_od")))
# disable unsupported exporters for epochs (all must support raw)
if self.model.current["dtype"] == "epochs":
for ext, description in writers.items():
action = "export_data" + ext.replace(".", "_")
if "epoch" in description[2]:
self.actions[action].setEnabled(True)
else:
self.actions[action].setEnabled(False)
# add to recent files
if len(self.model) > 0:
self._add_recent(self.model.current["fname"])
for name, action in self.actions.items(): # toggle
if name not in self.always_enabled:
action.setEnabled(enabled)
if self.model.data: # toggle if specific conditions are met
bads = bool(self.model.current["data"].info["bads"])
self.actions["export_bads"].setEnabled(enabled and bads)
events = self.model.current["events"] is not None
self.actions["export_events"].setEnabled(enabled and events)
if self.model.current["dtype"] == "raw":
annot = bool(self.model.current["data"].annotations)
else:
annot = False
self.actions["export_annotations"].setEnabled(enabled and annot)
self.actions["annotations"].setEnabled(enabled and annot)
locations = has_locations(self.model.current["data"].info)
self.actions["plot_locations"].setEnabled(enabled and locations)
ica = bool(self.model.current["ica"])
self.actions["apply_ica"].setEnabled(enabled and ica)
self.actions["export_ica"].setEnabled(enabled and ica)
self.actions["plot_ica_components"].setEnabled(enabled and ica and
locations)
self.actions["plot_ica_sources"].setEnabled(enabled and ica)
self.actions["interpolate_bads"].setEnabled(enabled and
locations and bads)
self.actions["events"].setEnabled(enabled and events)
self.actions["events_from_annotations"].setEnabled(enabled and
annot)
self.actions["find_events"].setEnabled(
enabled and self.model.current["dtype"] == "raw")
self.actions["epoch_data"].setEnabled(
enabled and events and self.model.current["dtype"] == "raw")
def get_info(self):
"""Get basic information on current data set.
Returns
-------
info : dict
Dictionary with information on current data set.
"""
data = self.current["data"]
fname = self.current["fname"]
ftype = self.current["ftype"]
fsize = self.current["fsize"]
dtype = self.current["dtype"].capitalize()
reference = self.current["reference"]
events = self.current["events"]
locations = has_locations(self.current["data"].info)
ica = self.current["ica"]
length = f"{len(data.times) / data.info['sfreq']:.6g} s"
samples = f"{len(data.times)}"
if self.current["dtype"] == "epochs": # add epoch count
length = f"{self.current['data'].events.shape[0]} x {length}"
samples = f"{self.current['data'].events.shape[0]} x {samples}"
if data.info["bads"]:
nbads = len(data.info["bads"])
nchan = f"{data.info['nchan']} ({nbads} bad)"
else:
nchan = data.info["nchan"]
chans = Counter([mne.io.pick.channel_type(data.info, i)
for i in range(data.info["nchan"])])
# sort by channel type (always move "stim" to end of list)
def add_event(self):
current_row = self.table.selectedIndexes()[0].row()
pos = int(self.table.item(current_row, 0).data(Qt.DisplayRole))
self.table.setSortingEnabled(False)
self.table.insertRow(current_row)
self.table.setItem(current_row, 0, IntTableWidgetItem(pos))
self.table.setItem(current_row, 1, IntTableWidgetItem(0))
self.table.setItem(current_row, 2, QTableWidgetItem("New Annotation"))
self.table.setSortingEnabled(True)
def __init__(self, parent, onset, duration, description):
super().__init__(parent)
self.setWindowTitle("Edit Annotations")
self.table = QTableWidget(len(onset), 3)
for row, annotation in enumerate(zip(onset, duration, description)):
self.table.setItem(row, 0, IntTableWidgetItem(annotation[0]))
self.table.setItem(row, 1, IntTableWidgetItem(annotation[1]))
self.table.setItem(row, 2, QTableWidgetItem(annotation[2]))
self.table.setHorizontalHeaderLabels(["Onset", "Duration", "Type"])
self.table.horizontalHeader().setStretchLastSection(True)
self.table.verticalHeader().setVisible(False)
self.table.setShowGrid(False)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.table.setSortingEnabled(True)
self.table.sortByColumn(0, Qt.AscendingOrder)
vbox = QVBoxLayout(self)
vbox.addWidget(self.table)
hbox = QHBoxLayout()
self.add_button = QPushButton("+")
self.remove_button = QPushButton("-")
buttonbox = QDialogButtonBox(QDialogButtonBox.Ok |
def __init__(self, parent, pos, desc):
super().__init__(parent)
self.setWindowTitle("Edit Events")
self.table = QTableWidget(len(pos), 2)
for row, (p, d) in enumerate(zip(pos, desc)):
self.table.setItem(row, 0, IntTableWidgetItem(p))
self.table.setItem(row, 1, IntTableWidgetItem(d))
self.table.setHorizontalHeaderLabels(["Position", "Type"])
self.table.horizontalHeader().setStretchLastSection(True)
self.table.verticalHeader().setVisible(False)
self.table.setShowGrid(False)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.table.setSortingEnabled(True)
self.table.sortByColumn(0, Qt.AscendingOrder)
vbox = QVBoxLayout(self)
vbox.addWidget(self.table)
hbox = QHBoxLayout()
self.add_button = QPushButton("+")
self.remove_button = QPushButton("-")
buttonbox = QDialogButtonBox(QDialogButtonBox.Ok |
QDialogButtonBox.Cancel)