def _new_roi(self): dialog = QtGui.QDialog(self) dialog.setWindowTitle("New ROI") vbox = QtGui.QVBoxLayout() dialog.setLayout(vbox) optbox = OptionBox() optbox.add("ROI name", TextOption(), key="name") optbox.add("Data space from", DataOption(self.ivm), key="grid") vbox.addWidget(optbox) buttons = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) buttons.accepted.connect(dialog.accept) buttons.rejected.connect(dialog.reject) vbox.addWidget(buttons) ok = dialog.exec_() if ok: roiname = optbox.option("name").value grid = self.ivm.data[optbox.option("grid").value].grid roidata = np.zeros(grid.shape, dtype=np.int) self.ivm.add(NumpyData(roidata, grid=grid, roi=True, name=roiname), make_current=True) # Throw away old history. FIXME is this right, should we keep existing data and history? # Also should we cache old history in case we go back to this ROI? self._history = [] self._undo_btn.setEnabled(False) self.options.option("roi").value = roiname
def __init__(self, ivm, parent, acq_options): OptionsWidget.__init__(self, ivm, parent) self.acq_options = acq_options vbox = QtWidgets.QVBoxLayout() self.setLayout(vbox) cite = Citation(FAB_CITE_TITLE, FAB_CITE_AUTHOR, FAB_CITE_JOURNAL) vbox.addWidget(cite) self._optbox = OptionBox() self._optbox.add("<b>Model options</b>") self._optbox.add("Infer constant signal offset", BoolOption(default=True), key="infer-sig0") self._optbox.add("Infer delay", BoolOption(default=True), key="infer-delay") #self._optbox.add("<b>Model fitting options</b>") #self._optbox.add("Spatial regularization", BoolOption(default=True), key="spatial") self._optbox.add("<b>Output options</b>") self._optbox.add("Output data name suffix", TextOption(), checked=True, key="output-suffix") vbox.addWidget(self._optbox) vbox.addWidget(RunWidget(self, save_option=True)) vbox.addStretch(1)
def init_ui(self): vbox = QtGui.QVBoxLayout() self.setLayout(vbox) title = TitleWidget(self) vbox.addWidget(title) self._options = OptionBox("Options") self._options.add("Signal data", DataOption(self.ivm), key="data") self._clear_btn = QtGui.QPushButton("Clear points") self._options.add("Method", ChoiceOption(["Pick points", "Use existing ROI"], ["points", "roi"]), self._clear_btn, key="method") self._options.add("ROI", DataOption(self.ivm, data=False, rois=True), key="roi") self._view_btn = QtGui.QPushButton("View") self._view_btn.setEnabled(False) self._save_btn = QtGui.QPushButton("Save") self._save_btn.setEnabled(False) self._options.add("AIF name", TextOption("aif"), self._view_btn, self._save_btn, key="output-name") self._options.option("method").sig_changed.connect(self._method_changed) self._options.option("data").sig_changed.connect(self._recalc_aif) self._options.option("roi").sig_changed.connect(self._recalc_aif) self._clear_btn.clicked.connect(self._clear_btn_clicked) self._save_btn.clicked.connect(self._save_btn_clicked) self._view_btn.clicked.connect(self._view_btn_clicked) vbox.addWidget(self._options) self._plot = Plot(qpo=None, parent=self, title="AIF", display_mode=False) self._plot.set_xlabel("Volume") self._plot.set_ylabel("Signal") vbox.addWidget(self._plot) vbox.addStretch(1)
def __init__(self, ivm, parent, acq_options): OptionsWidget.__init__(self, ivm, parent) self.acq_options = acq_options vbox = QtWidgets.QVBoxLayout() self.setLayout(vbox) self._optbox = OptionBox() self._optbox.add("<b>Model options</b>") self._optbox.add("Delay minimum (s)", NumericOption(minval=-100, maxval=100, default=0), key="delay-min") self._optbox.add("Delay maximum (s)", NumericOption(minval=-100, maxval=100, default=0), key="delay-max") self._optbox.add("Delay step (s)", NumericOption(minval=-5, maxval=5, default=1), key="delay-step") self._optbox.add("<b>Output options</b>") self._optbox.add("Output data name suffix", TextOption(), checked=True, key="output-suffix") vbox.addWidget(self._optbox) vbox.addWidget(RunWidget(self, save_option=True)) vbox.addStretch(1)
def init_ui(self): layout = QtGui.QVBoxLayout() self.setLayout(layout) title = TitleWidget(self, help="simple_maths") layout.addWidget(title) info = QtGui.QLabel(MATHS_INFO) info.setWordWrap(True) layout.addWidget(info) self.optbox = OptionBox() self.optbox.add("Data space from", DataOption(self.ivm), key="grid") self.optbox.add("Command", TextOption(), key="cmd") self.optbox.add("Output name", OutputNameOption(src_data=self.optbox.option("grid")), key="output-name") self.optbox.add("Output is an ROI", BoolOption(), key="output-is-roi") layout.addWidget(self.optbox) hbox = QtGui.QHBoxLayout() self.go_btn = RunButton(self) hbox.addWidget(self.go_btn) hbox.addStretch(1) layout.addLayout(hbox) layout.addStretch(1)
def __init__(self, parent, ivm, existing_strucs): super(AddEmbeddingDialog, self).__init__(parent) self.ivm = ivm self.sel_text = None self.sel_data = None self.existing_names = [struc.name for struc in existing_strucs] self.setWindowTitle("Add embedding") vbox = QtGui.QVBoxLayout() self.setLayout(vbox) self._opts = OptionBox() pvmap = self._opts.add("PV map / mask", DataOption(ivm, data=True, rois=True), key="pvmap") pvmap.sig_changed.connect(self._pvmap_changed) self._opts.add("ROI region", ChoiceOption([]), key="region") name = self._opts.add("Name of embedded structure", TextOption(), key="name") name.textChanged.connect(self._name_changed) self._opts.add("Structure type", ChoiceOption(["Embedding", "Activation mask", "Additional PVE"], return_values=["embed", "act", "add"]), key="type") self._opts.add("Parent structure", ChoiceOption([s.display_name for s in existing_strucs], [s.name for s in existing_strucs]), key="parent") self._opts.add("Edge smoothing sigma (mm)", NumericOption(minval=0, maxval=10, default=1, decimals=2), checked=True, enabled=False, key="sigma") vbox.addWidget(self._opts) self._warning = QtWidgets.QLabel(parent=self) self._warning.setStyleSheet("color: red;") vbox.addWidget(self._warning) self.button_box = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) self.button_box.accepted.connect(self.accept) self.button_box.rejected.connect(self.reject) self.button_box.button(QtGui.QDialogButtonBox.Ok).setEnabled(False) vbox.addWidget(self.button_box) self._pvmap_changed()
def init_ui(self): layout = QtGui.QVBoxLayout() title = TitleWidget(self, help="roibuilder", batch_btn=False) layout.addWidget(title) self.options = OptionBox("Options") btn = QtGui.QPushButton("New") btn.clicked.connect(self._new_roi) self.options.add("ROI", DataOption(self.ivm, rois=True, data=False), btn, key="roi") self.options.add("Current label", NumericOption(minval=1, slider=False, intonly=True), key="label") self.options.add("Label description", TextOption(), key="label_text") self.options.option("roi").sig_changed.connect(self._roi_changed) self.options.option("label").sig_changed.connect(self._label_changed) self.options.option("label_text").sig_changed.connect(self._label_text_changed) layout.addWidget(self.options) # Add toolbox buttons in a grid hbox = QtGui.QHBoxLayout() self._toolbox = QtGui.QGroupBox() self._toolbox.setTitle("Toolbox") self.tools_grid = QtGui.QGridLayout() self._toolbox.setLayout(self.tools_grid) x, y, cols = 0, 0, 4 for tool in TOOLS: self._add_tool(tool, y, x) x += 1 if x == cols: y += 1 x = 0 self._undo_btn = QtGui.QPushButton() self._undo_btn.clicked.connect(self.undo) self._undo_btn.setEnabled(False) undo_icon = QtGui.QIcon(get_icon("undo")) self._undo_btn.setIcon(undo_icon) self._undo_btn.setToolTip("Undo last action") self._undo_btn.setFixedSize(32, 32) self.tools_grid.addWidget(self._undo_btn, y, x) hbox.addWidget(self._toolbox) self._toolbox.setEnabled(False) hbox.addStretch(1) layout.addLayout(hbox) # Tool options box - initially invisible hbox = QtGui.QHBoxLayout() self._tool_options = QtGui.QGroupBox() self._tool_options.setVisible(False) hbox.addWidget(self._tool_options) hbox.addStretch(1) layout.addLayout(hbox) layout.addStretch(1) self.setLayout(layout)
def __init__(self, ivm, parent): OptionsWidget.__init__(self, ivm, parent) main_vbox = QtGui.QVBoxLayout() self.setLayout(main_vbox) self.options = OptionBox() self.options.add("Output name", TextOption("sim_data"), key="output") self.options.add("Output parameter maps", BoolOption(), default=False, key="output-param-maps") self.options.add("Output clean data (no noise/motion)", TextOption("sim_data_clean"), checked=True, default=True, key="output-clean") main_vbox.addWidget(self.options) main_vbox.addStretch(1)
def init_ui(self): FslWidget.init_ui(self, run_box=False) run_btn = QtGui.QPushButton("Run") run_btn.clicked.connect(self._run) self.options.add("Command string", TextOption(), run_btn, key="cmd") doc = QtGui.QLabel( "Enter the fslmaths command line string as you would normally. Use the names of the Quantiphyse data sets you want to use as filenames" ) doc.setWordWrap(True) self.vbox.insertWidget(self.vbox.count() - 1, doc)
def init_ui(self): layout = QtGui.QVBoxLayout() self.setLayout(layout) title = TitleWidget(self, title="Registration and Motion Correction", help="reg") layout.addWidget(title) if not self.reg_methods: layout.addWidget(QtGui.QLabel("No registration methods found")) layout.addStretch(1) return self.options = OptionBox("General Options") self.options.add("Mode", ChoiceOption(["Registration", "Motion Correction"], ["reg", "moco"]), key="mode") self.options.add("Method", ChoiceOption([method.display_name for method in self.reg_methods], self.reg_methods), key="method") self.options.add("Registration data", DataOption(self.ivm), key="reg") self.options.add("Reference data", DataOption(self.ivm), key="ref") self.options.add("Reference volume", ChoiceOption(["Middle volume", "Mean volume", "Specified volume"], ["median", "mean", "idx"]), key="ref-vol") self.options.add("Reference volume index", NumericOption(intonly=True), key="ref-idx") self.options.add("Output space", ChoiceOption(["Reference", "Registration", "Transformed"], ["ref", "reg", "trans"]), key="output-space") self.options.add("Output name", OutputNameOption(src_data=self.options.option("reg"), suffix="_reg"), key="output-name", checked=True) self.options.add("Also apply transform to", DataOption(self.ivm, multi=True), key="add-reg") self.options.add("Save transformation", TextOption(), key="save-transform", checked=True, default=False) self.options.option("mode").sig_changed.connect(self._update_option_visibility) self.options.option("method").sig_changed.connect(self._method_changed) self.options.option("ref").sig_changed.connect(self._update_option_visibility) self.options.option("ref-vol").sig_changed.connect(self._update_option_visibility) self.options.option("reg").sig_changed.connect(self._update_option_visibility) layout.addWidget(self.options) # Create the options boxes for reg methods - only one visible at a time! self.opt_boxes = {} for method in self.reg_methods: hbox = QtGui.QHBoxLayout() opt_box = QtGui.QGroupBox() opt_box.setTitle(method.display_name) vbox = QtGui.QVBoxLayout() opt_box.setLayout(vbox) vbox.addWidget(method.interface()) hbox.addWidget(opt_box) opt_box.setVisible(False) layout.addLayout(hbox) self.opt_boxes[method.name] = opt_box layout.addWidget(RunWidget(self)) layout.addStretch(1) self._method_changed()
def __init__(self, parent): super(NewPoolDialog, self).__init__(parent) self.setWindowTitle("New Pool") vbox = QtGui.QVBoxLayout() self.optbox = OptionBox() vbox.addWidget(self.optbox) self.optbox.add("Name", TextOption(), key="name") self.optbox.add("PPM", NumericOption(minval=0, maxval=20, default=0, decimals=3, slider=False), key="ppm") self.optbox.add("Exchange rate", NumericOption(minval=0, maxval=1000, default=0, decimals=1, slider=False), key="exch") self.optbox.add("T1 (s)", NumericOption(minval=0, maxval=10, default=1.0, decimals=2, slider=False), key="t1") self.optbox.add("T2 (s)", NumericOption(minval=0, maxval=1.0, default=0.07, decimals=6, slider=False), key="t2") self.optbox.option("name").sig_changed.connect(self._validate) self.button_box = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) self.button_box.accepted.connect(self.accept) self.button_box.rejected.connect(self.reject) vbox.addWidget(self.button_box) self.setLayout(vbox) self._validate()
def _init_ui(self): self.optbox.add("<b>Default outputs</b>") self.optbox.add("Prefix for output data names", TextOption(), key="output-prefix", checked=True) self.optbox.add("Output in native (ASL) space", BoolOption(default=True), key="output_native") self.optbox.add("Output in structural space", BoolOption(), key="output_struc") self.optbox.add("Output in standard (MNI) space", BoolOption(), key="output_mni") self.optbox.add("") self.optbox.add("<b>Additional outputs</b>") self.optbox.add("Output parameter variance maps", BoolOption(), key="output_var") self.optbox.add("Output mask", BoolOption(default=True), key="save_mask") self.optbox.add("Output calibration data", BoolOption(), key="save_calib") self.optbox.add("Output corrected input data", BoolOption(), key="save_corrected") self.optbox.add("Output registration data", BoolOption(), key="save_reg") self.optbox.add("Output structural segmentation", BoolOption(), key="save_struc") self.optbox.add("Output model fitting data", BoolOption(), key="save_basil") self.optbox.add("") self.optbox.add("<b>Summary report</b>") self.optbox.add("Save HTML report", FileOption(dirs=True), key="report", checked=True)
def __init__(self, ivm=None): QtGui.QWidget.__init__(self) self._ivm = ivm self._poolvals_edited = False vbox = QtGui.QVBoxLayout() self.setLayout(vbox) self.optbox = OptionBox() vbox.addWidget(self.optbox) self.optbox.add("<b>Output options</b>") self.optbox.add("CEST R*", BoolOption(default=True), key="save-model-extras") self.optbox.add("Parameter maps", BoolOption(default=False), key="save-mean") #self.optbox.add("Parameter variance", BoolOption(default=False), key="var") self.optbox.add("Model fit", BoolOption(default=False), key="save-model-fit") self.optbox.add("Prefix for output", TextOption(), checked=True, key="output-prefix") self.optbox.add(" ") self.optbox.add("<b>Analysis options</b>") self.optbox.add("Spatial Regularization", BoolOption(), key="spatial") self.optbox.add("Allow uncertainty in T1/T2 values", BoolOption(), key="t12prior") self.optbox.add("Prior T1 map", DataOption(self._ivm), key="t1img", checked=True) self.optbox.add("Prior T2 map", DataOption(self._ivm), key="t2img", checked=True) self.optbox.add("Tissue PV map (GM+WM)", DataOption(self._ivm), key="pvimg", checked=True) self.optbox.option("t12prior").sig_changed.connect(self._update_ui) self.optbox.add("Use steady state solution for MT bias reduction", BoolOption(default=False), key="new-ss") self.optbox.option("new-ss").sig_changed.connect(self._update_ui) self.optbox.add("TR (s)", NumericOption(default=3.0, minval=0, maxval=5, digits=3, step=0.1), key="tr") self.optbox.add("Excitation flip angle (\N{DEGREE SIGN})", NumericOption(default=12.0, minval=0, maxval=25, digits=3, step=1.0), key="fa") self.optbox.add( "MT pool Line shape", ChoiceOption( ["None", "Gaussian", "Lorentzian", "Super Lorentzian"], ["none", "gaussian", "lorentzian", "superlorentzian"]), key="lineshape") self.alexmt_cite = Citation(ALEXMT_CITE_TITLE, ALEXMT_CITE_AUTHOR, ALEXMT_CITE_JOURNAL) vbox.addWidget(self.alexmt_cite) vbox.addStretch(1) self._update_ui()
def __init__(self, ivm): QtGui.QWidget.__init__(self) self.ivm = ivm vbox = QtGui.QVBoxLayout() self.setLayout(vbox) self.optbox = OptionBox() self.optbox.add("DSC Data", DataOption(self.ivm), key="data") self.optbox.add("ROI", DataOption(self.ivm, rois=True, data=False), key="mask") self.optbox.add( "Model choice", ChoiceOption(["Standard", "Control point interpolation"], ["dsc", "dsc_cpi"]), key="model") self.optbox.add("TE (s)", NumericOption(minval=0, maxval=0.1, default=0.065), key="te") self.optbox.add("Time interval between volumes (s)", NumericOption(minval=0, maxval=10, default=1.5), key="delt") self.optbox.add("Apply dispersion to AIF", BoolOption(), key="disp") self.optbox.add("Infer delay parameter", BoolOption(default=True), key="inferdelay") self.optbox.add("Infer arterial component", BoolOption(), key="inferart") self.optbox.add("Log transform on rCBF", BoolOption(), key="log-cbf") self.optbox.add("Output residue function", BoolOption(), key="save-model-extras") self.optbox.add("Spatial regularization", ChoiceOption(("None", "Standard", "Full"), default="Standard"), key="spatial") self.optbox.add("Output data suffix", TextOption(), checked=True, key="output-suffix") self.optbox.option("model").sig_changed.connect(self._model_changed) vbox.addWidget(self.optbox) hbox = QtGui.QHBoxLayout() self.classic_options = OptionBox("Standard model") self.classic_options.add("Infer MTT", BoolOption(default=True), key="infermtt") self.classic_options.add("Infer lambda", BoolOption(default=True), key="inferlambda") hbox.addWidget(self.classic_options) hbox.addStretch(1) vbox.addLayout(hbox) hbox = QtGui.QHBoxLayout() self.cpi_options = OptionBox("CPI model") self.cpi_options.setVisible(False) self.cpi_options.add("Number of control points", NumericOption(minval=3, maxval=20, default=5, intonly=True), key="num-cps") self.cpi_options.add("Infer control point time position", BoolOption(), key="infer-cpt") hbox.addWidget(self.cpi_options) hbox.addStretch(1) vbox.addLayout(hbox) vbox.addStretch()
def __init__(self, parent, registry): super(AtlasDescription, self).__init__(parent) self._registry = registry self.ivm = parent.ivm self._desc = None grid = QtGui.QGridLayout() self.setLayout(grid) grid.addWidget(QtGui.QLabel("Name"), 0, 0) self._name = QtGui.QLabel() grid.addWidget(self._name, 0, 1) grid.addWidget(QtGui.QLabel("Type"), 1, 0) self._type = QtGui.QLabel() grid.addWidget(self._type, 1, 1) grid.addWidget(QtGui.QLabel("Resolutions"), 2, 0) self._imgs = QtGui.QComboBox() grid.addWidget(self._imgs, 2, 1) self._label_table = QtGui.QTableView() self._label_model = QtGui.QStandardItemModel() self._label_table.setModel(self._label_model) self._label_table.setSelectionBehavior( QtGui.QAbstractItemView.SelectRows) self._label_table.setSelectionMode( QtGui.QAbstractItemView.SingleSelection) self._label_table.setEditTriggers( QtGui.QAbstractItemView.NoEditTriggers) self._label_table.selectionModel().selectionChanged.connect( self._region_changed) self._label_table.setStyleSheet( "font-size: 10px; alternate-background-color: #6c6c6c;") self._label_table.setShowGrid(False) self._label_table.setTextElideMode(QtCore.Qt.ElideLeft) self._label_table.setAlternatingRowColors(True) self._label_table.ensurePolished() fm = QtGui.QFontMetrics(self._label_table.font()) self._label_table.verticalHeader().setVisible(False) self._label_table.verticalHeader().setSectionResizeMode( QtGui.QHeaderView.Fixed) self._label_table.verticalHeader().setDefaultSectionSize(fm.height() + 2) grid.addWidget(self._label_table, 3, 0, 1, 2) grid.setRowStretch(3, 1) self._load_options = OptionBox() self._load_options.add("Regions", ChoiceOption(["Selected region", "All regions"], ["sel", "all"]), key="regions") self._load_options.add( "Load as", ChoiceOption(["New dataset", "Add to existing dataset"], ["new", "add"]), key="add") self._load_options.add("Dataset name", TextOption("atlas"), key="name") self._load_options.add("Existing dataset", DataOption(self.ivm), key="data") self._load_options.option("regions").sig_changed.connect( self._load_regions_changed) self._load_options.option("add").sig_changed.connect(self._add_changed) grid.addWidget(self._load_options, 4, 0, 1, 2) hbox = QtGui.QHBoxLayout() btn = QtGui.QPushButton("Load") btn.clicked.connect(self._load) hbox.addWidget(btn) hbox.addStretch(1) grid.addLayout(hbox, 5, 0, 1, 2) self._add_changed()