Beispiel #1
0
 def test_model_db(self):
     from trait2d.analysis.models import ModelConfined
     from trait2d.analysis.models import ModelHop
     ModelDB().add_model(ModelConfined)
     ModelDB().add_model(ModelHop)
     self.assertTrue(
         isinstance(ModelDB().get_model(ModelConfined), ModelConfined))
     self.assertTrue(isinstance(ModelDB().get_model(ModelHop), ModelHop))
     ModelDB().remove_model(ModelConfined)
     with self.assertRaises(ValueError):
         ModelDB().get_model(ModelConfined)
     self.assertTrue(isinstance(ModelDB().get_model(ModelHop), ModelHop))
     ModelDB().cleanup()
     with self.assertRaises(ValueError):
         ModelDB().get_model(ModelHop)
Beispiel #2
0
def plot_adc_analysis_results(self):
    """Plot the ADC analysis results.

    Raises
    ------
    ValueError
        Track has not been analyzed using ADC analysis yet.
    """
    import matplotlib.pyplot as plt
    if self.get_adc_analysis_results() is None:
        raise ValueError(
            "Track has not been analyzed using adc_analysis yet!")

    dt = self._t[1] - self._t[0]
    N = self._t.size
    T = np.linspace(1, N, N-3,  endpoint=True) * dt

    fit_results = self.get_adc_analysis_results()["fit_results"]

    Dapp = self.get_adc_analysis_results()["Dapp"]
    Dapp_err = self.get_adc_analysis_results()["Dapp_err"]
    idxs = self.get_adc_analysis_results()["fit_indices"]

    n_points = idxs[-1]

    plt.figure(figsize=(8, 4))
    plt.grid(linestyle='dashed', color='grey')
    plt.semilogx(T, Dapp, label="Data", color='black')
    plt.fill_between(T, Dapp-Dapp_err, Dapp+Dapp_err, color='black', alpha=0.5)
    plt.semilogx(T[idxs], Dapp[idxs], label="Sampled Points", linestyle="", marker="|", markersize=15.0, color='red', zorder=-1)
    for model in fit_results:
        r = fit_results[model]["params"]
        rel_likelihood = fit_results[model]["rel_likelihood"]
        ks_p_value = fit_results[model]["KStestPValue"]
        m = None
        for c in ModelDB().models:
            if c.__class__.__name__ == model:
                m = c
                break
        if m is None:
            raise ValueError("Can't plot results for model {}; make sure the model is loaded in ModelDB()".format(model))
        pred = m(T, *r)
        plt.semilogx(T[0:n_points], pred[0:n_points],
                    label=f"{model}\nrel. likelihood={rel_likelihood:.2e}\nKS p-value={ks_p_value:.2e}")
    model = self.get_adc_analysis_results()["best_model"]

    plt.axvspan(T[0], T[n_points], alpha=0.25,
                color='gray', label="Fit region")
    plt.xlabel("Time in s")
    plt.ylabel("Normalized ADC")
    plt.title("Diffusion Category: {}".format(model))
    plt.xlim(T[0], T[-1])
    plt.legend(bbox_to_anchor=(1, 1), loc='upper left')
    plt.subplots_adjust(right=0.7)
    plt.show()
Beispiel #3
0
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        # Load .ui file
        dirname = os.path.dirname(__file__)
        uic.loadUi(os.path.join(dirname, 'gui_analysis.ui'), self)

        # Add widgets to tabs
        wid_msd = trait2d_analysis_gui.tab.msd.widgetMSD(self)
        wid_adc = trait2d_analysis_gui.tab.adc.widgetADC(self)

        self.layoutMSD.addWidget(wid_msd, 0, 0)
        self.layoutADC.addWidget(wid_adc, 0, 0)

        self.statusBar().setSizeGripEnabled(False)

        # Initialize with no track
        self.track = None

        self.pushButtonLoadTrack.clicked.connect(self.load_track_dialog)

        ModelDB().add_model(ModelBrownian)
        ModelDB().add_model(ModelConfined)
        ModelDB().add_model(ModelHop)
Beispiel #4
0
import numpy as np


class ModelBrownian(ModelBase):
    lower = [0.0, 0.0]
    upper = [np.inf, np.inf]
    initial = [0.5e-12, 2.0e-9]

    def __call__(self, t, D, delta):
        return D + delta**2 / (2 * t * (1 - 2 * self.R * self.dt / t))


# %%
# After we've defined the model, we can simply add it to the :class:`trait2d.analysis.ModelDB`.

from trait2d.analysis import ModelDB
ModelDB().add_model(ModelBrownian)

# %%
# We can now run ADC analysis with the model.

from trait2d.analysis import Track
track = Track.from_file("track1.csv", unit_length='micrometres')
track.adc_analysis(fraction_fit_points=0.15)
track.plot_adc_analysis_results()

# %%
# It is a good idea to use `ModelDB().cleanup()` at the end of your notebooks to remove all models again. Otherwise they may carry over into other open notebooks.

ModelDB().cleanup()
Beispiel #5
0
# %%
# The tracks are now imported and can be used for analysis.
# The representation of the ``ListOfTracks`` instance holds some information about it.
tracks

# %%
# To get an overview, we can use :meth:`trait2d.analysis.ListOfTracks.plot_trajectories`

tracks.plot_trajectories()

# %% In order to run an analysis, we need to load models first.

from trait2d.analysis.models import ModelBrownian, ModelConfined, ModelHop
from trait2d.analysis import ModelDB

ModelDB().add_model(ModelBrownian)
ModelDB().add_model(ModelConfined)
ModelDB().add_model(ModelHop)

# %%
# For analysis, :class:`trait2d.analysis.ListOfTracks` uses the same semantics as :class:`Track` for analysis. You can get a summary of the analysis results using :meth:`trait2d.analysis.ListOfTracks.adc_summary`.

tracks.adc_analysis(fraction_fit_points=0.15)
tracks.adc_summary(plot_dapp=True, plot_pie_chart=True)

# %%
# Single tracks can also be retrieved and viewed easily. It is also possible to run individual analysis on these tracks.

tracks.get_track(0).plot_adc_analysis_results()

# %%
Beispiel #6
0
    def analyze(self):
        if self.parent.track == None:
            self.parent.statusbar.showMessage("Load a track first!")
            mb = QMessageBox()
            mb.setText("Load a track first!")
            mb.setWindowTitle("Error")
            mb.setIcon(QMessageBox.Warning)
            mb.exec()
            return

        T = self.parent.track.get_t()[0:-3]
        fit_max_time = self.plot.get_range()
        if fit_max_time <= 0.0:
            fit_max_time = None

        maxfev = int(self.lineEditMaxIt.text())

        model_hop = ModelDB().get_model(ModelHop)
        model_brownian = ModelDB().get_model(ModelBrownian)
        model_confined = ModelDB().get_model(ModelConfined)

        if self.checkBoxUseInitial.checkState():
            if (self.lineEditParam1_1.text() != ""):
                model_brownian.initial[0] = float(self.lineEditParam1_1.text())
            if (self.lineEditParam2_1.text() != ""):
                model_brownian.initial[1] = float(self.lineEditParam2_1.text())

            if (self.lineEditParam1_2.text() != ""):
                model_confined.initial[0] = float(self.lineEditParam1_2.text())
            if (self.lineEditParam2_2.text() != ""):
                model_confined.initial[1] = float(self.lineEditParam2_2.text())
            if (self.lineEditParam3_2.text() != ""):
                model_confined.initial[2] = float(self.lineEditParam3_2.text())

            if (self.lineEditParam1_3.text() != ""):
                model_hop.initial[0] = float(self.lineEditParam1_3.text())
            if (self.lineEditParam2_3.text() != ""):
                model_hop.initial[1] = float(self.lineEditParam2_3.text())
            if (self.lineEditParam3_3.text() != ""):
                model_hop.initial[2] = float(self.lineEditParam3_3.text())
            if (self.lineEditParam4_3.text() != ""):
                model_hop.initial[3] = float(self.lineEditParam4_3.text())

        R = float(self.doubleSpinBoxInputParam1.value())

        try:
            results = self.parent.track.adc_analysis(R=R,
                                                     fit_max_time=fit_max_time,
                                                     maxfev=maxfev)
        except RuntimeError:
            mb = QMessageBox()
            mb.setText(
                "A model fit failed! Try raising the maximum iterations or different initial values."
            )
            mb.setWindowTitle("Fit Error")
            mb.setIcon(QMessageBox.Warning)
            mb.exec()
            return

        fit_results = results["fit_results"]

        # Show results for brownian model in GUI
        self.lineEditParam1_1.setText("{:5e}".format(
            fit_results["ModelBrownian"]["params"][0]))
        self.lineEditParam1Error_1.setText("{:5e}".format(
            fit_results["ModelBrownian"]["errors"][0]))
        self.lineEditParam2_1.setText("{:5e}".format(
            fit_results["ModelBrownian"]["params"][1]))
        self.lineEditParam2Error_1.setText("{:5e}".format(
            fit_results["ModelBrownian"]["errors"][1]))
        self.lineEditRelLikelihood_1.setText("{:5f}".format(
            fit_results["ModelBrownian"]["rel_likelihood"]))
        self.lineEditBIC_1.setText("{:5f}".format(
            fit_results["ModelBrownian"]["bic"]))

        # Show results for confined model in GUI
        self.lineEditParam1_2.setText("{:5e}".format(
            fit_results["ModelConfined"]["params"][0]))
        self.lineEditParam1Error_2.setText("{:5e}".format(
            fit_results["ModelConfined"]["errors"][0]))
        self.lineEditParam2_2.setText("{:5e}".format(
            fit_results["ModelConfined"]["params"][1]))
        self.lineEditParam2Error_2.setText("{:5e}".format(
            fit_results["ModelConfined"]["errors"][1]))
        self.lineEditParam3_2.setText("{:5e}".format(
            fit_results["ModelConfined"]["params"][2]))
        self.lineEditParam3Error_2.setText("{:5e}".format(
            fit_results["ModelConfined"]["errors"][2]))
        self.lineEditRelLikelihood_2.setText("{:5f}".format(
            fit_results["ModelConfined"]["rel_likelihood"]))
        self.lineEditBIC_2.setText("{:5f}".format(
            fit_results["ModelConfined"]["bic"]))

        # Show results for hopping in GUI
        self.lineEditParam1_3.setText("{:5e}".format(
            fit_results["ModelHop"]["params"][0]))
        self.lineEditParam1Error_3.setText("{:5e}".format(
            fit_results["ModelHop"]["errors"][0]))
        self.lineEditParam2_3.setText("{:5e}".format(
            fit_results["ModelHop"]["params"][1]))
        self.lineEditParam2Error_3.setText("{:5e}".format(
            fit_results["ModelHop"]["errors"][1]))
        self.lineEditParam3_3.setText("{:5e}".format(
            fit_results["ModelHop"]["params"][2]))
        self.lineEditParam3Error_3.setText("{:5e}".format(
            fit_results["ModelHop"]["errors"][2]))
        self.lineEditParam4_3.setText("{:5e}".format(
            fit_results["ModelHop"]["params"][3]))
        self.lineEditParam4Error_3.setText("{:5e}".format(
            fit_results["ModelHop"]["errors"][3]))
        self.lineEditRelLikelihood_3.setText("{:5f}".format(
            fit_results["ModelHop"]["rel_likelihood"]))
        self.lineEditBIC_3.setText("{:5f}".format(
            fit_results["ModelHop"]["bic"]))

        dt = T[1] - T[0]

        Dapp = self.parent.track.get_adc_analysis_results()["Dapp"]
        reg1 = fit_results["ModelBrownian"]["params"]
        reg2 = fit_results["ModelConfined"]["params"]
        reg3 = fit_results["ModelHop"]["params"]
        m1 = model_brownian(T, *reg1)
        m2 = model_confined(T, *reg2)
        m3 = model_hop(T, *reg3)

        self.plot.reset()
        self.plot.setup()

        indexes = results["fit_indices"]

        self.plot_dapp.setData(T, Dapp)
        self.plot_brownian.setData(T[indexes], m1[indexes])
        self.plot_confined.setData(T[indexes], m2[indexes])
        self.plot_hopping.setData(T[indexes], m3[indexes])

        self.plot.set_range(T[indexes[-1]])
        self.plot.autoRange()
Beispiel #7
0
simulator_hop.plot_trajectory()

# %%
# It is also possible to export the simulated tracks as videos using the ``trait2d.simulators.iscat_movie`` class. Currently, the tracks need first to be saved e.g. as a ``.csv`` using ``BrownianDiffusion.save()`` (or any other Diffusion model) and then load them again using ``iscat_movie.load_tracks()``. You also need to load a PSF with ``iscat_movie.load_psf()``.

# %%
# Analyse tracks
# --------------

# %%
# Before we start fitting our data, we need to add some models. ``trait2d.analysis.models`` contains a few models that we can add to ``ModelDB``. All models added this way will be used during analysis.

from trait2d.analysis import ModelDB
from trait2d.analysis.models import ModelBrownian, ModelConfined, ModelHop

ModelDB().add_model(ModelBrownian)
ModelDB().add_model(ModelConfined)
ModelDB().add_model(ModelHop)

# %%
# Single tracks are stored in a ``Track`` object.

from trait2d.analysis import Track

# %%
# We can create a single track from our last simulation:

single_track = Track.from_dict(simulator_brownian.trajectory)

# %%
# We can now do ADC analysis on the track: