Skip to content
Merged

0.8.8 #555

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
8cbe1e2
add an extra plugin menu bar for all apps
rafalkowalewski1 Oct 1, 2025
f52fb91
extra plugin menu bar for all apps
rafalkowalewski1 Oct 1, 2025
ddece45
Merge branch 'development' of https://github.com/rafalkowalewski1/pic…
rafalkowalewski1 Oct 1, 2025
8f8c26a
update plugin docs
rafalkowalewski1 Oct 1, 2025
37b7f1f
update file types in the documentation
rafalkowalewski1 Oct 1, 2025
d5a0f4d
FIX: spinna batch analysis automatic reading of pixel size
rafalkowalewski1 Oct 2, 2025
65d5f91
average fix the transparent display on mac
rafalkowalewski1 Oct 2, 2025
3fe6367
unfolding groups (square) does not require picasso average
rafalkowalewski1 Oct 2, 2025
473b89d
update docs regarding unfolding groups, clean
rafalkowalewski1 Oct 2, 2025
08f6b33
attempt to fix the progress and status dialogs not closing
rafalkowalewski1 Oct 2, 2025
922f938
just a short prep for adding thresholds from scikit-image
rafalkowalewski1 Oct 2, 2025
b14a4ac
remove resources/icons since it's not used anywhere
rafalkowalewski1 Oct 3, 2025
e86b921
add thresholding methods (API only)
rafalkowalewski1 Oct 3, 2025
4869a54
Render - masking dialog changed - real-time rendering and different d…
rafalkowalewski1 Oct 5, 2025
bacfff5
masking now works in render
rafalkowalewski1 Oct 5, 2025
73754a7
add references to thresholding methods (from scikit image)
rafalkowalewski1 Oct 5, 2025
494cb67
clean
rafalkowalewski1 Oct 5, 2025
63fbfa9
masking - show histogram of image values
rafalkowalewski1 Oct 5, 2025
e92cb9f
clean docs
rafalkowalewski1 Oct 5, 2025
0144e18
FIX render by property conflicts for multi-channel data
rafalkowalewski1 Oct 5, 2025
015838a
Bump version: 0.8.7 → 0.8.8
rafalkowalewski1 Oct 5, 2025
e453eb7
Merge pull request #554 from rafalkowalewski1/development
rafalkowalewski1 Oct 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.8.7
current_version = 0.8.8
commit = True
tag = False
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\-(?P<release>[a-z]+)(?P<build>\d+))?
Expand Down
8 changes: 7 additions & 1 deletion changelog.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
Changelog
=========

Last change: 01-OCT-2025 CEST
Last change: 05-OCT-2025 CEST

0.8.8
-----
- Render - masking dialog changed - threshold methods implemented, histogram of values shown, real-time rendering and different dialog layout
- Render - unfolding groups works without the Picasso: Average step beforehand
- Other bug fixes and minor improvements

0.8.5-7
-------
Expand Down
4 changes: 2 additions & 2 deletions distribution/picasso.iss
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
AppName=Picasso
AppPublisher=Jungmann Lab, Max Planck Institute of Biochemistry

AppVersion=0.8.7
AppVersion=0.8.8
DefaultDirName={commonpf}\Picasso
DefaultGroupName=Picasso
OutputBaseFilename="Picasso-Windows-64bit-0.8.7"
OutputBaseFilename="Picasso-Windows-64bit-0.8.8"
ArchitecturesAllowed=x64
ArchitecturesInstallIn64BitMode=x64

Expand Down
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
# The short X.Y version
version = ""
# The full version, including alpha/beta/rc tags
release = "0.8.7"
release = "0.8.8"

# -- General configuration ---------------------------------------------------

Expand Down
11 changes: 10 additions & 1 deletion docs/files.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,16 @@ HDF5 Pick Property Files

When selecting ``File > Save pick properties`` in ``Picasso: Render``, the properties of picked regions are stored in an HDF5 file. Within the HDF5 file, the data table is stored in the path ``/groups``.
Each row in the “groups” table corresponds to one picked region. For each localization property (see Table 1), two columns are generated in the ``groups`` table: the mean and standard deviation of the respective column over the localizations in a pick region. For example, if the localization table contains a column ``len``, the “groups” table will contain a column ``len_mean`` and ``len_std``.
Furthermore, the following columns are included: ``group`` (the group identifier), ``n_events`` (the number of localizations in the region) and ``n_units`` (the number of units from a qPAINT measurement).

Furthermore, the following columns are included:

- ``group``: the group identifier;
- ``n_events``: the number of binding events in the region;
- ``n_units``: the number of units from a qPAINT measurement;
- ``len_cdf`` and ``dark_cdf``: estimates of mean bright and dark times, respectively, obtained by fitting the distributions to the CDF of the exponential distribution. Units: frames;
- ``locs``: the number of localizations in the region;
- ``len_mean`` and ``dark_mean``: mean bright and dark times, respectively, obtained by averaging over all binding events, rather than fitting to the CDF. Units: frames;
- ``len_std`` and ``dark_std``: standard deviation of bright and dark times,respectively;

YAML Metadata Files
-------------------
Expand Down
Binary file removed docs/plugins.png
Binary file not shown.
8 changes: 1 addition & 7 deletions docs/plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,4 @@ If you cloned the GitHub repository, you can add plugins by following these step

For developers
--------------
To create a plugin, you can use the template provided in ``picasso/plugin_template.py``, see below.

.. image:: ../docs/plugins.png
:scale: 70 %
:alt: Plugins

As an example, please see any of the plugins in the `GitHub repo <https://github.com/rafalkowalewski1/picasso_plugins>`_.
To create a plugin, you can use the template provided in `picasso/plugin_template.py <https://github.com/jungmannlab/picasso/blob/master/plugin_template.py>`_. For more examples of Plugins, please see the `GitHub repo <https://github.com/rafalkowalewski1/picasso_plugins>`_.
6 changes: 4 additions & 2 deletions docs/render.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ Picking of regions of interest
7. (Optional) Statistics about each pick region can be saved by selecting ``File > Save pick properties``. The resulting HDF5 file is not a localization file. Instead, it holds a data set called ``groups`` in which the rows show statistical values for each pick region.
8. (Optional) The picked positions and diameter itself can be saved by selecting ``File > Save pick regions``. Such saved pick information can also be loaded into ``Picasso: Render`` by selecting ``File > Load pick regions``.

**NOTE**: Rectangular picks can be used to generate the projections of localizations onto the rectangle's axes. To do so, select rectangular picks and save picked localizations (``File > Save picked localizations``). The resulting ``hdf5`` files will contain columns ``x_pick_rot`` and ``y_pick_rot``, which are the projections of localizations onto and against the "drawing" axis of the rectangle, respectively.

3D rotation window
------------------

Expand Down Expand Up @@ -391,11 +393,11 @@ Removes the group information when loading a dataset that contains group informa

Unfold / Refold groups
^^^^^^^^^^^^^^^^^^^^^^
Allows to "unfold" an average to display each structure individually in a line. Also works with picks.
Allows to "unfold" an average to display each structure individually in a line.Note that the structures need to be grouped and processed with Picasso: Average beforehand.

Unfold groups (square)
^^^^^^^^^^^^^^^^^^^^^^
Arranges an average in a square so that each structure is displayed individually
Arranges an average in a square so that each structure is displayed individually. This function does not require Picasso: Average beforehand. Instead, grouped or picked (circular picks) localizations are accepted.

Link localizations
^^^^^^^^^^^^^^^^^^
Expand Down
13 changes: 8 additions & 5 deletions docs/table01.csv
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@ lpy ,"The localization precision in y direction, in camera pixels, as estimated
net_gradient ,"The net gradient of this spot which is defined by the sum of gradient vector magnitudes within the fitting box, projected to the spot center. ",float
z,(Optional) The z coordinate fitted in 3D in nm. Please note the units are different for x and y coordinates.,float
d_zcalib,"(Optional) The value of the D function used for z fitting with astigmatism, see the supplement to Huang et al. 2008.",float
likelihood ,The log-likelihood of the fit. Only available for MLE fitting.,float
iterations ,The number of iterations of the fit procedure. Only available for MLE fitting.,long
group ,"(Optional) An identifier to assign multiple localizations to groups, for example by picking regions of interest .",long
len ,"(Optional) The length of the event, if localizations from consecutive frames have been linked.",long
likelihood ,(Optional) The log-likelihood of the fit. Only available for MLE fitting.,float
iterations ,(Optional) The number of iterations of the fit procedure. Only available for MLE fitting.,long
group ,"(Optional) An identifier to assign multiple localizations to groups, for example by picking regions of interest or clustering. ",long
group_input, "(Optional) Assigned after clustering if the input localizations had a “group” column. This allows to trace back which input group a clustered group originated from.",long
len ,"(Optional) The length of the event in frames, if localizations from consecutive frames have been linked.",long
n ,"(Optional) The number of localizations in this event, if localizations from consecutive frames have been linked, potentially diverging from the “len” column due to a transient dark time tolerance.",long
photon_rate ,"(Optional) The mean number of photons per frame, if localizations from consecutive frames have been linked. The total number of photons is set in the “photons” column. ",float
photon_rate ,"(Optional) The mean number of photons per frame, if localizations from consecutive frames have been linked. The total number of photons is set in the “photons” column. ",float
x_pick_rot ,"(Optional) Projection of localizations onto the axis of the rectangular pick. Only available after saving rectangular pick(s). ",float
y_pick_rot ,"(Optional) Projection of localizations against the axis of the rectangular pick. Only available after saving rectangular pick(s). ",float
2 changes: 1 addition & 1 deletion picasso/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import os.path
import yaml as yaml

__version__ = "0.8.7"
__version__ = "0.8.8"

_this_file = os.path.abspath(__file__)
_this_dir = os.path.dirname(_this_file)
Expand Down
5 changes: 4 additions & 1 deletion picasso/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1539,7 +1539,10 @@ def _spinna_batch_analysis(
locs, info = io.load_locs(str(row[f"exp_data_{target}"]))
pixelsize = 130
for element in info:
if "Picasso Localize" in element.values():
if (
"Picasso" in element.values()
and "Localize" in element.values()
): # in newer versions it's Picasso vX.Y.Z Localize
if "Pixelsize" in element:
pixelsize = element["Pixelsize"]
break
Expand Down
2 changes: 1 addition & 1 deletion picasso/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION_NO = "0.8.7"
VERSION_NO = "0.8.8"
2 changes: 2 additions & 0 deletions picasso/gui/average.py
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,7 @@ def set_image(self, image: np.ndarray) -> None:
self._bgra[..., 0] = cmap[:, 2][image]
self._bgra[..., 1] = cmap[:, 1][image]
self._bgra[..., 2] = cmap[:, 0][image]
self._bgra[..., 3] = 255
qimage = QtGui.QImage(self._bgra.data, X, Y, QtGui.QImage.Format_RGB32)
self._pixmap = QtGui.QPixmap.fromImage(qimage)
self.set_pixmap(self._pixmap)
Expand Down Expand Up @@ -541,6 +542,7 @@ def __init__(self) -> None:
average_action = process_menu.addAction("Average")
average_action.setShortcut("Ctrl+A")
average_action.triggered.connect(self.view.average)
self.plugin_menu = menu_bar.addMenu("Plugins") # do not delete

def open(self) -> None:
"""Open the dialog for opening a file to load."""
Expand Down
3 changes: 3 additions & 0 deletions picasso/gui/design.py
Original file line number Diff line number Diff line change
Expand Up @@ -1789,6 +1789,9 @@ def initUI(self):
palette.setColor(QtGui.QPalette.Background, QtCore.Qt.white)
self.setPalette(palette)

menu_bar = QtWidgets.QMenuBar(self)
self.plugin_menu = menu_bar.addMenu("Plugins") # do not delete


def main():
app = QtWidgets.QApplication(sys.argv)
Expand Down
2 changes: 2 additions & 0 deletions picasso/gui/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,8 @@ def __init__(self) -> None:
pwd = []
self.pwd = pwd

self.plugin_menu = menu_bar.addMenu("Plugins") # do not delete

def open_file_dialog(self) -> None:
if self.pwd == []:
path, exe = QtWidgets.QFileDialog.getOpenFileName(
Expand Down
2 changes: 2 additions & 0 deletions picasso/gui/localize.py
Original file line number Diff line number Diff line change
Expand Up @@ -1510,6 +1510,8 @@ def init_menu_bar(self) -> None:
calibrate_z_action = threed_menu.addAction("Calibrate 3D")
calibrate_z_action.triggered.connect(self.calibrate_z)

self.plugin_menu = menu_bar.addMenu("Plugins") # do not delete

@property
def camera_info(self) -> dict[str, float]:
"""Camera information, baseline, EM gain, sensitivity and QE."""
Expand Down
2 changes: 2 additions & 0 deletions picasso/gui/nanotron.py
Original file line number Diff line number Diff line change
Expand Up @@ -1162,6 +1162,8 @@ def __init__(self, parent=None):
mainWidget.setLayout(self.grid)
self.setCentralWidget(mainWidget)

self.plugin_menu = menu_bar.addMenu("Plugins") # do not delete

def predict(self):

if (self.predicting is False) and (self.model_loaded is True):
Expand Down
Loading