Example #1
0
    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()
Example #3
0
    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]
Example #4
0
 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()
Example #5
0
 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()
Example #6
0
 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()
Example #7
0
    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()
Example #8
0
    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()
Example #9
0
    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)