Giter Club home page Giter Club logo

mastodon's Introduction

Build Status Image.sc Forum

Mastodon logo

Read the user and developer documentation here.

Mastodon – a large-scale tracking and track-editing framework for large, multi-view images.

Modern microscopy technologies such as light sheet microscopy allows live sample in toto 3D imaging with high spatial and temporal resolution. Such images will be 3D over time, possibly multi-channels and multi-view. Computational analysis of these images promises new insights in cellular, developmental and stem cells biology. However, a single image can amount to several terabytes, and in turn, the automated or semi-automated analysis of these large images can generate a vast amount of annotations. The challenges of big data are then met twice: first by dealing with a very large image, and second with generating large annotations from this image. They will make interacting and analyzing the data especially difficult.

Mastodon is our effort to provide a tool that can harness these challenges.

Warning.

Despite the naming of the artifacts and the apparent usability of the software, Mastodon is still in alpha stage, not released, not published and not supported at the present time.

Mastodon goals.

The goals of Mastodon are the following:

  • Interactive browsing, inspection and navigation through the image data. Fast and responsive.
  • Build tracking and lineage data from images.
  • User-friendly framework to navigate through this data. Easy to relate spatial information with hierarchical information. Easily orient the user in a possibly very large annotation.
  • "Point-wise" interactive editing of the tracking and lineage data. Manual curation.
  • Semi-automatic and fully automatic tracking.
  • Numerical features and statistics on tracking data. Tagging of this data. Tags and numerical features can then be used to to enrich the visualization.
  • Extensible: a 3rd party can build plugins for Mastodon:
    • Custom numerical feature analysers;
    • Custom tracking algorithms (detection and particle-linking algorithms);
    • General-use plugins.

Mastodon components.

BDV and TrackScheme

BDV windows.

Display image data and overlay the tracking data. Single objects (spots or links) can be individually edited.

Multi-view image in BDV

Single track in BDV

TrackScheme windows.

TrackScheme is used to display a hierarchical view of the lineage data. The tracks are arranged from left to right, and time is laid out from top to bottom.

TrackScheme example 2

TrackScheme example 3

Mastodon technologies.

Mastodon is a Java software that relies on several technologies to achieve these goals, specially developed for it.

Interactive visualization and navigation of large images thanks to the BigDataViewer (BDV. Any file that can be opened in the BDV will work in Mastodon (BDV HDF5 file format, KLB, Keller-Lab Blocks file format, N5 file format, ...). These file formats enable interactive visualization of multi-view TB dataset at the one-time cost of a file conversion. Also, they can be exploited for efficient image processing in special cases, taking advantage of multi-scale pyramidal representation and blocks decomposition.

Mastodon-collection: a high performance framework to manipulate collections of data. Mastodon-collection was developed specifically for this project. It offers an in-memory compact layout storage of objects. Mastodon collections have a much smaller memory footprint. Objects in a mastodon collection are contiguous in memory. Thanks to CPU cache and data locality, iterating these collections is much faster than classical object collections. Mastodon-collection also offers techniques to do garbage-collection-free manipulations in Java, considerably improving the responsiveness of applications based on it.

Mastodon-graph: a data structure based on mastodon-collection, and optimized for lineage and tracking data. Mastodon-graph is a graph library based on mastodon-collections, that underlies the data model of Mastodon.

Efficient retrieval of objects in space and time. User interactions with tracking objects rely on Kd-tree search on convex polytopes.

Level of detail to display large number of objects. TrackScheme automatically adapts the level of detail while displaying data at varying scales.

Usage.

Actions and keyboard shortcuts.

The keyboard shortcuts listed below are valid for the default key-map.

BigDataViewer (BDV) windows.

Moving around and display in BDV windows.
Action Key
View.
Move in X & Y. Right-click and drag.
Move in Z. Mouse-wheel. Press and hold shift to move faster, control to move slower.
Rotate. Click and drag. The view will rotate around the location you clicked.
Align view with X / Y / Z axes. - Align with XY plane: Shift-Z
- Align with YZ plane: Shift-X
- Align with XZ plane: Shift-C or Shift-Y
The view will rotate around the location you clicked.
Zoom / Unzoom. Control-shift mouse-wheel or Command-mouse-wheel.
The view will zoom and unzoom around the mouse location.
Time-points.
Next time-point. ] or M
Previous time-point. [ or N
Bookmarks.
Store a bookmark. Shift-B then press any key to store a bookmark with this key as name. A bookmark stores the position, zoom and orientation in the view but not the time-point. Bookmarks are saved in display settings file.
Recall a bookmark. Press B then the key of the bookmark.
Recall a bookmark orientation. Press O then the key of the bookmark. Only the orientation of the bookmark will be restored.
Image display.
Select source 1, 2, ... Press 1, 2, ...
Brightness and color dialog. Press S. In this dialog you can adjust the min & max for each source, select to what sources these min & max apply and pick a color for each source.
Toggle fused mode. Press F. In fused mode, several sources are overlaid. Press Shift-1, Shift-2, … to add / remove the source to the view. In single-source mode, only one source is shown.
Visibility and grouping dialog. Press F6. In this dialog you can define what sources are visible in fused mode, and define groups of sources for use in the grouping mode.
Save / load display settings. F11 / F12. This will create a XYZ_settings.xml file in which the display settings will be saved.
Manual editing and navigation in BDV windows.
Action Key
Editing spots.
Add a new spot. Press A with the mouse over the desired location.
Remove a spot. Press D with the mouse inside the spot to remove.
Increase / Decrease the radius of a spot. Press E / Q with the mouse inside the spot.
Shift-E / Q increase / decrease the spot radius by larger steps.
Control-E / Q enlarges the spot radius by finer steps.
Move a spot. Press and hold space with mouse inside the spot to move, and move it around.
Creating links between spots.
Create a link between two spots. Press and hold L with the mouse inside the source spot. The BDV moves to the next frame. Release L when inside the target spot.
Press and hold Shift-L to do the same, but linking to the previous frame.
Remove a link. Press D with the mouse on the link to remove.
Create a spot linked to a spot. Press and hold A with the mouse inside the source spot. The BDV moves to the next frame. Release A at the desired position. A new spot is created, linked to the source spot.
Press and hold Shift-A to do the same, but linking to the previous frame.
Selection editing.
Add a spot / link to the selection. Shift-click on a spot or a link to add / remove it to / from the selection.
Clearing the selection. Click on an empty place of the image.
Remove selection content. Shift-delete.
Undo / redo.
Undo. Control-Z.
Redo. Control-shift-Z.

TrackScheme windows.

Navigation through lineages in BDV and TrackScheme windows.
Action Key
Navigation.
Navigate to parent / child in time. / . Select and move to the spot linked to this one in the previous / next time-point.
Press shift to also add it to the current selection.
Navigate to sibling. / . Select and move to the sibling of this spot. A sibling is another spot from the same lineage in the same time-point.
Press Shift to also add it to the current selection.
Navigate to branch parent / child in time. Alt + ↑ / . Select and move to the parent / child branch. A branch starts and ends with a division or fork in the lineage. Press Shift to also add it to the current selection.
Navigate to spot / link. Double-click on the spot / link.
Selection.
Select all parents. Shift + ⇞. Select all the parents of this spots, that is all the spots in its lineage backward in time.
Select all children. Shift + ⇟. Select all the children of this spots, that is all the spots in its lineage forward in time.
Select all lineage. Shift + space. Select all the spots of this spot lineage.
Moving around in TrackScheme windows.
Action Key
View.
Move around. Right-click and drag or mouse-wheel.
Zoom / unzoom in X. Shift mouse-wheel.
Zoom / unzoom in Y. Control-mouse-wheel.
Zoom / unzoom in X & Y. Control-shift-mouse-wheel.
Full zoom, full unzoom. Press Z. The view zoom at max level to the mouse location. Pressing Z again to unzoom fully.
Zoom in a box. Press and hold Z, then drag a box. The view will zoom to the box.

TrackScheme box zoom: Drag a rectangle with the Z key pressed. TrackScheme will zoom to this rectangle. A press of Z fully zoom to designated location. If TrackScheme is fully zoomed, a tap of Z unzoom fully. TrackScheme_ZoomBox

Manual track editing in TrackScheme windows.
Action Key
Editing spots.
Remove a spot. Press D with the mouse inside the spot to remove.
Edit the label of a spot. Press Enter when a spot is focused, then enter its label and press Enter to validate.
Creating links between spots.
Create a link between two spots. Press and hold L with the mouse inside the source spot. Release L when inside the target spot.
Remove a link. Press D with the mouse on the link to remove.
Selection editing.
Add a spot / link to the selection. Shift-click on a spot or a link to add / remove it to / from the selection.
Select all in a box. Click and drag a box.
Shift-click and drag to add the content of the box to the current selection.
Clearing the selection. Click on an empty place of the image.
Remove selection content. Shift-delete.
Undo / redo.
Undo. Control-Z.
Redo. Control-shift-Z.

mastodon's People

Contributors

ctrueden avatar imagejan avatar kant avatar ksugar avatar maarzt avatar stefanhahmann avatar tinevez avatar tpietzsch avatar xulman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mastodon's Issues

sharing strategy for TrackScheme and BDV overlay settings

Currently it is a messy/undefined, how the settings are configured and applied with multiple trackscheme or BDV windows.

For example, if I open two TrackScheme windows each has it's own display settings and seetings dialog. If I change the definition of a custom style "mystyle" in one of the settings dialogs, this is not changed in the other dialog, and actually the only way to make this accessible in the other window is to save the settings to disk and close and re-open the window.

We need a central management of trackscheme styles.
Then, we need to decide, whether we want to
a) choose one style that applies for all windows, or
b) choose one style per window.
I think (a) makes more sense.

For the BDV overlays it is a different story. I think there users definitely could want to use different settings for different windows. Probably it would make sense to split the settings into two parts. One part is the same for all windows, e.g., colors and strokes. How long the edge "tails" are, etc, can change per window. Still, a style could set defaults for these but can be overridden per window?

User-selectable set of tags to be auto-tagging newly added spots

this was motivated in the context of collaborative tracking: a user wanted to auto-tag spots that he/she has added,
this is an extension of the original idea (which was: added linked spots inherit tags from the source spot)

the auto-tagging set is empty by default

Animate time in `navigateTo`.

Animate time in navigateTo.

In BDV window do not jump to destination timepoint, but smoothly interpolate just like spatial coordinates are interpolated.

TrackMate 3 should ship branch features natively.

In TrackMate 2 you can only get features for spots, edges and tracks.

But a track is a connected component of a graph (a sub-graph). For instance, a cell followed up through all its divisions makes a single track. End users desire features to be calculated for branches, because they typically match a biological object (e.g. a daughter cell before it divides).

For this, we need a way to access, store and compute branches, which is another issue.

BDV render settings improvements.

Several improvements to be made to the BDV overlay for the lineage data.

  • Option to show links also ahead in time in BDV.
  • Option to show arrow-heads.
  • BDV style preview like for the TrackScheme settings.
  • Configurable colors in Bdv window (probably more complicated than it sounds because of the depth-fading and color-fading on links, etc. Also a UI design challenge...)

from the I2K, feature request:

  • there could be a settings for in which corner the color legend (tags) in TS should appear
  • reset the view on BDV
  • importing your own segmentations as an alternative to using the detector

Redirect "save" to "save as..." on a new project?

Summary

The save button and Save Project command fail with the following error when the project is created from .h5/.xml.
The save as... button works.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at org.mastodon.mamut.project.MamutProject.openForWriting(MamutProject.java:170)
	at org.mastodon.mamut.ProjectManager.saveProject(ProjectManager.java:317)
	at org.mastodon.mamut.ProjectManager.saveProject(ProjectManager.java:303)
	at org.scijava.ui.behaviour.util.RunnableAction.actionPerformed(RunnableAction.java:47)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:842)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:886)
	at java.awt.Component.processMouseEvent(Component.java:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

How to reproduce

  1. Create a new Mastodon project from .h5/.xml
  2. Run Save Project

Environment

The latest version of Mastodon on Fiji running on Ubuntu 18.04 (64-bit)
Version on the launcher panel: 1.0.0-beta-18-SNAPSHOT-11121b463e1d7c1221dab58642b973882df8ea7f

Investigation

projectRoot at org.mastodon.mamut.project.MamutProject.openForWriting(MamutProject.java:170) is null

Suggestioin

Redirect to save as... when the project is newly created.

Fiji integration

@tinevez said you wanted more issues to be filed https://twitter.com/jytinevez/status/1329023718190931968

It would be wonderful if it would be possible to use Mastodon directly on the currently open Fiji image instead of needing to export the image first to BDV format. This would make it much easier for me to switch workflows to Mastodon from TrackMate, especially for the cases when Mastodon will scale better.

Thank you!

JavaFX

Do you consider switching to JavaFX at some point or not at all ?

I am asking because of a current project on which I won't have a lot of time to work on anytime soon : trackmate-sc/TrackMate#89

So I could consider to develop it directly for the TM v3.

idea: disable cmd+Q

Hi,
don't remembering all shortcuts by heart (and being lazy and irresponsible -- by just trying keystrokes), happened to me a couple of times that I've killed completely Mastodon (and Fiji) by pressing Cmd+Q. I did that in an attempt to increase radius of a spot, which is decreased with Q and I did too much, and I was hoping that something like alt+q, shift+q, cmd+q might do the opposite...

BTW: Cmd+, opens also the Preference dialog of Fiji (the single check-box one with "Clear preferences").

Was on Mac.
Vlado

TrackScheme branch edge painting problem.

In TrackScheme, edges are not painted correctly if the source or target vertex is "away" from the painted area. For instance, this is what is correctly painted with an edge for which source and target are in the rendered area:

awat

If we zoom in a little bit so as to put some target vertices out of the rendered area, they loose their edge (in a literal way):

closer

Mastodon plugins as Jython scripts.

It would be great if Mastodon plugins could be scripts. As a proof of concept for that, a FeatureComputer in Jython or so would be awesome.

TS adds new timepoint beyond the dataset timepoints span

  • while annotating a dataset, move to the last timepoint,
  • move mouse over some spot in BDV,
  • press A (add linked spot) and it gets a bit crazy... would expect nothing to happen actually

TS seems to add another time point (a new line appears in TS) but does allow to see it (to scroll over it). BDV shows ellipses from the last time point and also from the new just-beyond time point. At least, this is what it looks like from outside.

How can I help?

MIN_RADIUS is sometimes too large

Issue

MIN_RADIUS can prevent us from adjusting the spot size to a tiny object.

Investigation

Currently, MIN_RADIUS is hard-coded here to 1.0, which can be too large sometimes.

Suggestion

  • make it customizable from Preferences
  • change the value of MIN_RADIUS to 0.0 or very small value

Frames not advancing for linked-add spot operations...

... when commit 2d42d4b is considered.

It seems to have something to do with the recent upgrade to bigdata-core-9.X because

  • I couldn't trace any recent change in the AddSpotAndLinkIt class
  • an especially the here it does not advance the view
  • and a bit below the wrong time point is read out

As a consequence, it creates new linked spots in the same timepoint... breaking all assumptions and making TrackScheme behave funky in result

Besides, at least on my (updated, recent) Linux the shortcuts work lazily... not every shortcut seems to be processed/captured. And when I change them in Preferences->Keymap, the change does not seem to become effective at all..
(the Mastodon shipped with Fiji works well on my box)

Intermediate "new project" dialog.

It is at the moment probably unclear to new users that the File Dialog popping up when "new project" is clicked means "Select a BDV file with image data". It would be good to instead have a dialog open, with a (appropriately) file field for the BDV file, and then once a fitting file was selected enabling "OK"/"Create project" button on the dialog.

Allow for empty but non-null `appModel`.

MastodonPlugin.setAppModel(MastodonPluginAppModel appModel) is called when a new project is opened.

When no project is open, it is called with appModel == null.
This should be changed, so that is is called with a non-null appModel. Some plugins (e.g., now the Merging-Plugin don't need open projects)

Feature computation for branch graph.

  • Feature computation system.
  • Integration into the UI.
  • [ ]
    A few feature examples:

for branch links:

  • Branch duration.
  • Branch displacement.

for branch spots:

  • Number of incoming / outgoing / total branches.
  • Hierarchy level (root = 0, children of root = 1, etc) so that we can build the hierarchy graph.

Feature "Spot intensity" calculation error

Spot intensity calculation error

I analyze a two-channel dataset (20 timepoints, 3D images 20x1024x1024) with Mastodon (Fiji v1.53o, everything updated). It works fine to extract spots and links. But when I run "compute features" I get a java error for feature "Spot intensity" and only for this feature.

Exception in thread "Feature computation thread" java.lang.ArrayIndexOutOfBoundsException: 76
at org.mastodon.mamut.feature.SpotIntensityFeatureComputer.run(SpotIntensityFeatureComputer.java:200)
at org.mastodon.feature.DefaultFeatureComputerService.compute(DefaultFeatureComputerService.java:253)
at org.mastodon.mamut.feature.MamutFeatureComputerService.compute(MamutFeatureComputerService.java:79)
at org.mastodon.mamut.MamutFeatureComputation$MyFeatureComputerService.compute(MamutFeatureComputation.java:138)
at org.mastodon.feature.ui.FeatureComputationController$2.run(FeatureComputationController.java:128)

I did analyze a few other dataset earlier whithout getting this error. Were there some changes in the feature calculation part recently?

missing 0th frame in .xml after "Export mamut"

Hi,
this dataset consists of frames t1.tif till t9.tif with timepoints 1 till 9 (according to its DBV's dataset.xml. However, when opened as "New project" in Mastodon, the timepoints are treated 0 till 8 (in BDV as well as in TS). Now, when exporting into Mamut's .xml, the spot definitions are with timepoints 1 till 9, e.g.
<SpotsInFrame frame="9" />,
and definitions of spots from the first frame are missing (but their ID's are referenced from definitions of tracks). Also the
<AllSpots nspots="154">
counts all spots and is larger than number of lines with individual spot definitions in the created Mamut's .xml.

Numerical feature system should allow heterogeneous features.

In TrackMate 2, a spot feature can depend only on a spot feature. It cannot depend on an edge feature, because edges are always generated later, and their features are calculated once the spot features are already there.

This is why for instance a spot cannot have a feature that state to what track number it belongs to.

In TrackMate 3 we want the feature dependencies to be heterogenous, so that a spot feature can depend on anything.

This implies that there should be a way to deal with required features that are not here (for instance, you can compute the track a spot belongs to if the tracks have not been generated yet). This particular sub-issue is then probably linked to issue #1.

Imported TGMM data does not respond properly to zoom in the BigDataViewer panel

Hello,

I noticed that upon importing some TGMM data into a Mastodon project, the number of green dots (where each green dot is a gaussian) appears to change if you zoom in and out -- this is probably a bug, since the number of gaussians should stay constant!
I attach a figure showing this occurrence at three different zoom levels for the same time point.
threezoomlevels
For your reference, my OS is Ubuntu 18.04. Thank you!

The feature list to deserialize is specified at compile time.

Though features can be defined any time in an application, only those defined at compile time are deserialized properly.

I had a hard time understanding what was going on, and I think that this is linked to the fact that some features are handled in static initializers and in static methods

Here is roughly the code flow for deserialization of a Model:

This happens for all features created after the model was instantiated or/and loaded.

Make the tagging of vertices and edges undoable.

As of now, only properties of the Model are undoable because the recorder are created at model construction time.
TagSets are based on PropertyMaps so they could be made undoable, but right now it does not work because they are not registered in the GraphUndoRecorder

There should be a Kd-tree to search spot neighbors.

This is important for performance (e.g. GUI responsivity: we need to quickly retrieve the spot closest to a click location).

This is tricky, because we allow for incremental model changes. The Kd-tree cannot be recomputed for each single change, otherwise the performance will degrade quickly, which is not the desired effect. A system to cache changes must be implemented, which is another issue.

JVM crashes after modifying the graph in TrackScheme.

It can happen that the Mastodon crashes when modifying the graph several times via its highlight or focus.

The diagnosis is as follow (based on the unify-views branch):

A graphChanged event ends up in calling the paint() method of the TrackSchemePanel.

The paint() method does mainly two things, in the following order:

  • It recompute the graph layout: All TrackScheme vertices get a new value for X. This calls the layout() method of the LineageTreeLayout class.
  • It regenerates the ScreenEntities for the new layout. This involves creating new ScreenVertexes and ScreenEdges properly linked to the TrackScheme items currently displayed. This calls the cropAndScale() method of the LineageTreeLayout class.

Between the call of layout() and cropAndScale(), the ScreenEntities are invalid. They may correspond to TrackScheme items that moved or disappeared because of the graph change event.

This issue is caused by the fact that several classes are notified when the layout() method is finished, and interrogate the ScreenEntities. For instance for this bug:

  1. A graphChanged event ends up in calling the paint() method of the TrackSchemePanel.

  2. The paint() method calls the layout() method of the LineageTreeLayout class.

  3. When the layout is done, The LayoutListener of the class are notified (via `layoutChanged()).

  4. One of these listener is the InertialScreenTransformListener. It notifies its TransformListener (via transformChanged()).

  5. This transform listener is the InteractiveDisplayCanvasComponent`. It has several listeners it forward this event to.

  6. One of them is the MouseHighlightHandler. Calling its transformChanged() method causes it to try an grab the currently highlighted edge or vertex.

  7. To do so, it calls the getEdgeAt() or getVertexAt() method of the AbstractTrackSchemeOverlay class.

  8. These two methods rely on ScreenEntities to retrieve the desired TrackScheme item, but at this time, they are not valid. They link to TrackScheme items that may have been deleted or moved. Calling a second graph modification event with these items is what causes the crash.

Travis CI fails all the time since feature PR.

From @tpietzsch:

The failed tests on Travis are probably all due to AWT being used.
I modified one of the "erroring" tests to explicitly catch all exceptions and print to stdout.
ec34e21

Travis says:

Running org.mastodon.feature.update.UpdateStackSerializationSeriesTest
WARNING: Creating property map for a collection/pool that does not manage PropertyMaps!
WARNING: Creating property map for a collection/pool that does not manage PropertyMaps!
WARNING: Creating property map for a collection/pool that does not manage PropertyMaps!
WARNING: Creating property map for a collection/pool that does not manage PropertyMaps!
Jul 18, 2019 11:21:37 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
TrackScheme style file /home/travis/.mastodon/trackschemestyles.yaml not found. Using builtin styles.
Bdv style file /home/travis/.mastodon/rendersettings.yaml not found. Using builtin styles.
ColorMap file /home/travis/.mastodon/colormaps.yaml not found. Using builtin colormaps.
Feature color mode file /home/travis/.mastodon/colormodes.yaml not found. Using builtin styles.
Keymap list file /home/travis/.mastodon/keymaps//keymaps.yaml not found. Using builtin styles.
java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
	at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
	at java.awt.Window.<init>(Window.java:536)
	at java.awt.Frame.<init>(Frame.java:420)
	at java.awt.Frame.<init>(Frame.java:385)
	at javax.swing.SwingUtilities$SharedOwnerFrame.<init>(SwingUtilities.java:1763)
	at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1838)
	at javax.swing.JDialog.<init>(JDialog.java:272)
	at javax.swing.JDialog.<init>(JDialog.java:206)
	at org.mastodon.revised.mamut.TgmmImportDialog.<init>(TgmmImportDialog.java:62)
	at org.mastodon.revised.mamut.ProjectManager.<init>(ProjectManager.java:112)
	at org.mastodon.revised.mamut.WindowManager.<init>(WindowManager.java:163)
	at org.mastodon.feature.update.UpdateStackSerializationSeriesTest.createProjectWithPendingChanges(UpdateStackSerializationSeriesTest.java:96)
	at org.mastodon.feature.update.UpdateStackSerializationSeriesTest.test(UpdateStackSerializationSeriesTest.java:75)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:115)
	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:102)
	at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
	at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.043 sec <<< FAILURE!
A simple workaround is disabling these tests on Travis, something like this
https://github.com/bigdataviewer/bigdataviewer-vistools/blob/d6479aef7e4994e94b68d9c3aee6f160a188d6e4/src/test/java/bdv/util/BdvHandlePanelGarbageCollectionTest.java#L22

A better fix would be to fix ProjectManager etc to be able to run headless.

MaMuT-like feature requests.

Behaviour to implement.

  • Jump between cell divisions with “v" (forward) and “b" (backwards) - in already traced cell lineages.
  • Selection behaviours to select
    • a whole track
    • track upward in time
    • track downward in time
      from a selection.

Action framework.

  • Generate missing spots across a gap over several frames by interpolating new spot positions.
  • Automatic cell naming within tracks. To complete this one, we require a documented naming scheme.

Feature framework.

  • Maintain a set of manual labels (10 or so) for each spot. Should be manually editable, ideally a bit like an enum type (you can have 1000 cells but their 'state' label has only 5 values).
  • Generate spot colouring from feature.
  • Store, make editable and display a manual color for spots.

PoolObject collections and equality

Currently, for example PoolObjectList.contains(obj) checks whether an object with the same internal id as obj is contained in the list:

    public boolean contains( final Object obj )
    {
        return ( obj instanceof PoolObject )
                ? indices.contains( ( ( PoolObject< ?, ? > ) obj ).getInternalPoolIndex() )
                : false;
    }

This should work sufficiently well for now and for TrackMate3 use case but it's not really correct.
There are two problems:

  • obj might be from a different pool.
  • the equals() method of the concrete PoolObject instance might be overridden.

In both cases, contains() will do the wrong thing.

PoolObjectList.contains() is just an example of the general problem. We will have to decide on a consistent way to handle equality and then implement it everywhere...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.