def _repopulate(self): self._clear() for structure_idx, structure in enumerate(self._structures): self._grid.addWidget(QtGui.QLabel(structure.display_name), 0, structure_idx + 1) for param_idx, param in enumerate(self._params): self._grid.addWidget(QtGui.QLabel(param.display_name), param_idx + 1, 0) for structure_idx, structure in enumerate(self._structures): # The initial value for a parameter in a structure is the previous value set (if any), # the default value for that structure (if any), the default value for the parent # structure (if any), the generic parameter default (if any), and if none of the above, zero. if structure.name in self._values and param.name in self._values[ structure.name]: initial = self._values[structure.name][param.name] elif structure.name in param.kwargs.get("struc_defaults", {}): initial = param.kwargs["struc_defaults"][structure.name] elif structure.kwargs.get("parent_struc", "") in param.kwargs.get( "struc_defaults", {}): initial = param.kwargs["struc_defaults"][ structure.kwargs.get("parent_struc", "")] else: initial = [param.kwargs.get("default", 0.0)] if isinstance(initial, (int, float)): initial = [initial] self._grid.addWidget( NumberListOption(initial=initial, intonly=param.kwargs.get( "intonly", False), load_btn=False), param_idx + 1, structure_idx + 1)
def _refresh_gui(self): options = dict(self.model.options) self.gui.clear() for struc in self.model.default_strucs: data_opt = self.gui.add("%s map" % struc.name.upper(), DataOption(self.model._ivm, explicit=True), checked=True, enabled=struc.name in options["pvmaps"], key=struc.name) data_opt.value = options["pvmaps"].get(struc.name, None) for struc in options["additional"].values(): del_btn = self._struc_delete_btn(struc) display_type = {"add" : "map", "embed" : "embedding", "act" : "mask"}.get(struc["struc_type"], "map") data_opt = self.gui.add("%s %s" % (struc["name"], display_type), DataOption(self.model._ivm, explicit=True, rois=True), del_btn, key=struc["name"]) data_opt.value = struc.get("pvmap", None) res_opts = options.get("resampling", {}) self.gui.add("Resampling", ChoiceOption(["Downsample", "From another data set", "Specified resolution"], ["down", "data", "res"], default=res_opts.get("type", "res")), checked=True, enabled="type" in res_opts, key="type") self.gui.add("Output space from", DataOption(self.ivm), key="grid") self.gui.add("Output resample factor", NumericOption(intonly=True, minval=1, maxval=10, default=2), key="factor") self.gui.add("Voxel sizes (mm)", NumberListOption(load_btn=False), key="voxel-sizes") for opt in ("grid", "factor", "voxel-sizes"): if opt in res_opts: self.gui.option(opt).value = res_opts[opt] self.gui.add(None, RunButton("Add user-defined structure", callback=self._add_embedding), key="add_embedding") self._update_resamp_visibility()
def _update_params(self): FabberWidget._update_params(self) self.param_values_box.clear() for param in self._fabber_params: current_values = self._param_test_values.get(param, [1.0]) self.param_values_box.add(param, NumberListOption(initial=current_values)) self._param_test_values[param] = current_values # Remove references to parameters which no longer exist for param in list(self._param_test_values.keys()): if param not in self._fabber_params: del self._param_test_values[param]
def __init__(self, ivm): self.model = DceDataModel(ivm) self.gui = OptionBox() self.gui.add( "Model", ChoiceOption([ "Standard Tofts model", "Extended Tofts model (ETM)", "2 Compartment exchange model", "Compartmental Tissue Update (CTU) model", "Adiabatic Approximation to Tissue Homogeneity (AATH) Model" ], ["dce_tofts", "dce_ETM", "dce_2CXM", "dce_CTU", "dce_AATH"]), key="model") self.gui.add("Contrast agent R1 relaxivity (l/mmol s)", NumericOption(minval=0, maxval=10, default=3.7), key="r1") self.gui.add("Flip angle (\N{DEGREE SIGN})", NumericOption(minval=0, maxval=90, default=12), key="fa") self.gui.add("TR (ms)", NumericOption(minval=0, maxval=10, default=4.108), key="tr") self.gui.add("Time between volumes (s)", NumericOption(minval=0, maxval=30, default=12), key="delt") self.gui.add("AIF", ChoiceOption([ "Population (Orton 2008)", "Population (Parker)", "Measured DCE signal", "Measured concentration curve" ], ["orton", "parker", "signal", "conc"]), key="aif") self.gui.add("Number of volumes", NumericOption(minval=0, maxval=100, default=20, intonly=True), key="nt") self.gui.add("Bolus injection time (s)", NumericOption(minval=0, maxval=60, default=30), key="tinj") self.gui.add("AIF data values", NumberListOption([ 0, ]), key="aif-data") self.gui.add("Arterial transit time (s)", NumericOption(minval=0, maxval=1.0, default=0), key="delay") self.gui.option("model").sig_changed.connect(self._model_changed) self.gui.option("aif").sig_changed.connect(self._aif_changed) self._aif_changed() self._model_changed() self.gui.sig_changed.connect(self._update_options) self._update_options()
def __init__(self, ivm): self.model = DscDataModel(ivm) self.gui = OptionBox() self.gui.add("Time between volumes (s)", NumericOption(minval=0, maxval=5, default=1.0), key="delt") self.gui.add("TE (s)", NumericOption(minval=0, maxval=5, default=1.0), key="te") self.gui.add("AIF", NumberListOption(), key="aif") self.gui.sig_changed.connect(self._update_options) self._update_options()
def __init__(self, ivm): self.model = AslDataModel(ivm) self.gui = OptionBox() self.gui.add("Bolus duration", NumericOption(minval=0, maxval=5, default=1.8), key="tau") self.gui.add("Labelling", ChoiceOption(["CASL/pCASL", "PASL"], [True, False], default=True), key="casl") self.gui.add("PLDs", NumberListOption([0.25, 0.5, 0.75, 1.0, 1.25, 1.5]), key="plds") self.gui.add("Time per slice (ms)", NumericOption(minval=0, maxval=1000, default=0, intonly=True), key="slicedt") self.gui.add("Data format", ChoiceOption(["Differenced data", "Label/Control pairs"], ["diff", "tc"]), key="iaf") self.gui.add("Repeats", NumericOption(minval=1, maxval=100, default=1, intonly=True), key="repeats") self.gui.add("Group by", ChoiceOption(["PLDs", "Repeats"], ["tis", "rpt"]), key="ibf") self.gui.add("Inversion efficiency", NumericOption(minval=0.5, maxval=1.0, default=0.85), key="alpha") self.gui.add("M0", NumericOption(minval=0, maxval=2000, default=1000), key="m0") self.gui.add("TR (s)", NumericOption(minval=0, maxval=10, default=4), key="tr") self.gui.add("TE (ms)", NumericOption(minval=0, maxval=1000, default=13), key="te") self.gui.add("Tissue/arterial partition coefficient", NumericOption(minval=0, maxval=1, default=0.9), key="pct") #self.gui.add("Arterial component", BoolOption(), key="incart") self.gui.sig_changed.connect(self._update_options) self._update_options()
def __init__(self, ivm): QtGui.QWidget.__init__(self) self.ivm = ivm vbox = QtGui.QVBoxLayout() self.setLayout(vbox) self.optbox = OptionBox() self.optbox.add( "AIF source", ChoiceOption(["Global sequence of values", "Voxelwise image"], ["global", "voxelwise"]), key="aif_source") self.optbox.option("aif_source").sig_changed.connect( self._aif_source_changed) self.optbox.add("AIF", NumberListOption(), key="aif") self.optbox.add("AIF image", DataOption(self.ivm), key="suppdata") self.optbox.add("AIF type", ChoiceOption(["DSC signal", "Concentration"], [False, True]), key="aifconc") vbox.addWidget(self.optbox) vbox.addStretch() self._aif_source_changed()
def __init__(self, ivm=None): QtGui.QWidget.__init__(self) self._ivm = ivm vbox = QtGui.QVBoxLayout() self.setLayout(vbox) self.optbox = OptionBox() vbox.addWidget(self.optbox) self.optbox.add("CEST data", DataOption(self._ivm), key="data") self.optbox.add("ROI", DataOption(self._ivm, rois=True, data=False), key="mask") self.optbox.add("Frequency offsets", NumberListOption(), key="freqs") self.optbox.add("B0", ChoiceOption(B0_DEFAULTS), key="b0") self.optbox.add("Custom B0 (T)", NumericOption(minval=0.0, maxval=15, default=3.0, decimals=3), key="b0_custom") # FIXME multiple B1 values self.optbox.add("B1 (\u03bcT)", NumericOption(minval=0.0, maxval=2, default=0.55, decimals=6), key="b1") self.optbox.add( "Saturation", ChoiceOption(["Continuous Saturation", "Pulsed Saturation"], ["continuous", "pulsed"]), key="sat") self.optbox.add("Saturation time (s)", NumericOption(minval=0.0, maxval=5, default=2, decimals=2), key="sat_time") self.optbox.add("Pulse Magnitudes", NumberListOption(), key="pulse_mag") self.optbox.add("Pulse Durations (s)", NumberListOption(), key="pulse_dur") self.optbox.add("Pulse Repeats", NumberListOption(), key="pulse_repeats") self.optbox.option("b0").sig_changed.connect(self._b0_changed) self.optbox.option("b0_custom").sig_changed.connect(self._b0_changed) self.optbox.option("sat").sig_changed.connect(self._sat_changed) self.warn_box = WarningBox() vbox.addWidget(self.warn_box) # B1 field #hbox = QtGui.QHBoxLayout() #self.unsat_cb = QtGui.QCheckBox("Unsaturated") #self.unsat_cb.stateChanged.connect(self.update_ui) #hbox.addWidget(self.unsat_cb) #self.unsat_combo = QtGui.QComboBox() #self.unsat_combo.addItem("first") #self.unsat_combo.addItem("last") #self.unsat_combo.addItem("first and last ") #hbox.addWidget(self.unsat_combo) #hbox.addStretch(1) #grid.addLayout(hbox, 2, 2) vbox.addStretch(1) self._sat_changed() self._b0_changed()
def init_ui(self): vbox = QtGui.QVBoxLayout() self.setLayout(vbox) try: self.FabberProcess = get_plugins("processes", "FabberProcess")[0] except IndexError: self.FabberProcess = None if self.FabberProcess is None: vbox.addWidget( QtGui.QLabel( "Fabber core library not found.\n\n You must install Fabber to use this widget" )) return title = TitleWidget( self, help="fabber-dsc", subtitle="DSC modelling using the Fabber process %s" % __version__) vbox.addWidget(title) cite = Citation(FAB_CITE_TITLE, FAB_CITE_AUTHOR, FAB_CITE_JOURNAL) vbox.addWidget(cite) self.input = OptionBox("Input data") self.input.add("DCE data", DataOption(self.ivm, include_3d=False, include_4d=True), key="data") self.input.add("ROI", DataOption(self.ivm, data=False, rois=True), key="roi", checked=True) self.input.add("T1 map", DataOption(self.ivm, include_3d=True, include_4d=False), key="t1", checked=True) self.input.option("t1").sig_changed.connect(self._t1_map_changed) vbox.addWidget(self.input) self.acquisition = OptionBox("Acquisition") self.acquisition.add("Contrast agent R1 relaxivity (l/mmol s)", NumericOption(minval=0, maxval=10, default=3.7), key="r1") self.acquisition.add("Flip angle (\N{DEGREE SIGN})", NumericOption(minval=0, maxval=90, default=12), key="fa") self.acquisition.add("TR (ms)", NumericOption(minval=0, maxval=10, default=4.108), key="tr") self.acquisition.add("Time between volumes (s)", NumericOption(minval=0, maxval=30, default=12), key="delt") vbox.addWidget(self.acquisition) self.model = OptionBox("Model options") self.model.add( "Model", ChoiceOption([ "Standard Tofts model", "Extended Tofts model (ETM)", "2 Compartment exchange model", "Compartmental Tissue Update (CTU) model", "Adiabatic Approximation to Tissue Homogeneity (AATH) Model" ], ["dce_tofts", "dce_ETM", "dce_2CXM", "dce_CTU", "dce_AATH"]), key="model") self.model.add( "AIF", ChoiceOption([ "Population (Orton 2008)", "Population (Parker)", "Measured DCE signal", "Measured concentration curve" ], ["orton", "parker", "signal", "conc"]), key="aif") self.model.add("Bolus injection time (s)", NumericOption(minval=0, maxval=60, default=30), key="tinj") self.model.add("AIF data values", NumberListOption([ 0, ]), key="aif-data") self.model.add("T1 (s)", NumericOption(minval=0.0, maxval=5.0, default=1.0), key="t10") self.model.add("Allow T1 to vary", BoolOption(default=False), key="infer-t10") self.model.add("Bolus arrival time (s)", NumericOption(minval=0, maxval=2.0, default=0), key="delay") self.model.add("Allow bolus arrival time to vary", BoolOption(default=False), key="infer-delay") self.model.add("Infer kep rather than ve", BoolOption(default=False), key="infer-kep") self.model.add("Infer flow", BoolOption(default=True), key="infer-fp") self.model.add("Infer permeability-surface area", BoolOption(default=False), key="infer-ps") self.model.add("Spatial regularization", BoolOption(default=False), key="spatial") self.model.option("model").sig_changed.connect(self._model_changed) self.model.option("aif").sig_changed.connect(self._aif_changed) vbox.addWidget(self.model) # Run button and progress vbox.addWidget(RunWidget(self, title="Run modelling")) vbox.addStretch(1) self._aif_changed() self._model_changed()
def __init__(self, opt, **kwargs): OptionWidget.__init__(self, opt, **kwargs) self.edit = NumberListOption(intonly=opt["type"] == "INT") self.edit.sig_changed.connect(self.update_options) self.widgets.append(self.edit)