trackmate-sc / TrackMate

TrackMate is your buddy for your everyday tracking.
https://imagej.net/plugins/trackmate
GNU General Public License v3.0
169 stars 76 forks source link

LINKING_FEATURE_PENALTIES null pointer exception #248

Open NicoKiaru opened 1 year ago

NicoKiaru commented 1 year ago

Hello!

I wrote a script to automate trackmate that uses a SparseLAPTracker and Stardist Trackmate.

When running:

def writer = new TmXmlWriter(new File(fileTrackMate))
writer.appendModel(model)
writer.appendSettings(settings)

I get a Null Pointer Exception in writer.appendSettings(settings), that I can avoid by adding this line:

settings.trackerSettings['LINKING_FEATURE_PENALTIES'] = new HashMap() //'None'

This seems weird.

Full groovy macro:

#@File(label = "File with cell to track") f
#@boolean showOutput
#@int channel_to_track

imp = IJ.openImage(f.getAbsolutePath());

model = new Model()

// Send all messages to ImageJ log window.
model.setLogger(Logger.IJ_LOGGER)

// Settings (voxel size, time delay), set up from the ImagePlus
def settings = new Settings(imp)

// ------------- Channel 1: Spot detection

// Configure detector - We use the Strings for the keys
settings.detectorFactory = new StarDistDetectorFactory()  // Laplacian of gaussian detector, 
settings.detectorSettings = [
    'TARGET_CHANNEL' : channel_to_track
] 

// qualityFilter = new FeatureFilter('QUALITY', 5.5, true) // Configure spot filters - Classical filter on quality, here : 9
// settings.addSpotFilter(qualityFilter)

// -------------- Channel 1: Tracking
// Configure tracker - We do not allow merges and fusions

settings.trackerFactory = new SparseLAPTrackerFactory()
settings.trackerSettings = LAPUtils.getDefaultSegmentSettingsMap() 
settings.trackerSettings['LINKING_MAX_DISTANCE'] = 15 as double      // 0.5 microns displacement may between each timeframe
settings.trackerSettings['GAP_CLOSING_MAX_DISTANCE'] = 1 as double  // 0.4 microns displacement before and after gap
settings.trackerSettings['MAX_FRAME_GAP'] =  2 as int                 // 2 frames gap max allowed during tracking
settings.trackerSettings['LINKING_FEATURE_PENALTIES'] = new HashMap() //'None'

// Add ALL the feature analyzers known to TrackMate. They will 
// yield numerical features for the results, such as speed, mean intensity etc.
settings.addAllAnalyzers()

trackmate = new TrackMate(model, settings)

ok = trackmate.checkInput()
if (!ok) IJ.log(trackmate.getErrorMessage());

ok = trackmate.process() // Actually performs the tracking
if (!ok) IJ.log(trackmate.getErrorMessage());

// ---- To display the result:
if (showOutput) {
    // A selection.
    selectionModel = new SelectionModel( model )

    // Read the default display settings.
    ds = DisplaySettingsIO.readUserDefault()
    // With the line below, we state that we want to color tracks using
    // a numerical feature defined for TRACKS, and that has they key 'TRACK_INDEX'.
    ds.setTrackColorBy( TrackMateObject.TRACKS, 'TRACK_INDEX' )

    displayer =  new HyperStackDisplayer( model, selectionModel, imp, ds )
    displayer.render()
    displayer.refresh()
}

// Echo results with the logger we set at start:
model.getLogger().log(  model.toString() )

def fileTrackMate = FilenameUtils.removeExtension(f.getAbsolutePath())+"-Channel_"+channel_to_track+".xml"
def writer = new TmXmlWriter(new File(fileTrackMate))
writer.appendModel(model)
writer.appendSettings(settings)
writer.writeToFile()

IJ.log("Trackmate file written: "+fileTrackMate)

//ExportTracksToXML.export(model, settings, new File(fileTrackMateTerraTracks))

//def fileTrackMateTracks = FilenameUtils.removeExtension(f.getAbsolutePath())+"-Channel_"+channel_to_track+"-Tracks.csv"
//def tableView = ExportStatsTablesAction.createTrackTables(model, selectionModel, new DisplaySettings())
//tableView.trackTable.exportToCsv(new File(fileTrackMateTracks))
//IJ.log("Exported tracks")

import fiji.plugin.trackmate.tracking.jaqaman.SparseLAPTrackerFactory
import fiji.plugin.trackmate.tracking.jaqaman.LAPUtils
import ij.IJ

import org.apache.commons.io.FilenameUtils

import fiji.plugin.trackmate.Model
import fiji.plugin.trackmate.Settings
import fiji.plugin.trackmate.TrackMate
import fiji.plugin.trackmate.SelectionModel
import fiji.plugin.trackmate.Logger
import fiji.plugin.trackmate.gui.displaysettings.DisplaySettingsIO
import fiji.plugin.trackmate.visualization.hyperstack.HyperStackDisplayer

import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings

import fiji.plugin.trackmate.io.TmXmlWriter

import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings.TrackMateObject
import fiji.plugin.trackmate.action.ExportStatsTablesAction

import fiji.plugin.trackmate.stardist.StarDistDetectorFactory

// Configure track filters - We want to get rid of the two immobile spots at
// the bottom right of the image. Track displacement must be above 10 pixels.
// filter2 = FeatureFilter('TRACK_DISPLACEMENT', 10, True)
// settings.addTrackFilter(filter2)

(It's a quick and dirty bug report, but I can give more details)