Skip to content

Commit 0f87fa2

Browse files
committed
Acquaint to TrackMate 8 API
1 parent 2435fd1 commit 0f87fa2

File tree

2 files changed

+78
-178
lines changed

2 files changed

+78
-178
lines changed

src/main/java/fiji/plugin/trackmate/detection/CSVImporterDetectorFactory.java

Lines changed: 71 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,22 @@
88
* it under the terms of the GNU General Public License as
99
* published by the Free Software Foundation, either version 3 of the
1010
* License, or (at your option) any later version.
11-
*
11+
*
1212
* This program is distributed in the hope that it will be useful,
1313
* but WITHOUT ANY WARRANTY; without even the implied warranty of
1414
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1515
* GNU General Public License for more details.
16-
*
16+
*
1717
* You should have received a copy of the GNU General Public
1818
* License along with this program. If not, see
1919
* <http://www.gnu.org/licenses/gpl-3.0.html>.
2020
* #L%
2121
*/
2222
package fiji.plugin.trackmate.detection;
2323

24-
import static fiji.plugin.trackmate.io.IOUtils.readDoubleAttribute;
25-
import static fiji.plugin.trackmate.io.IOUtils.writeAttribute;
26-
import static fiji.plugin.trackmate.io.IOUtils.writeRadius;
2724
import static fiji.plugin.trackmate.util.TMUtils.checkMapKeys;
2825
import static fiji.plugin.trackmate.util.TMUtils.checkParameter;
2926

30-
import java.io.IOException;
3127
import java.util.ArrayList;
3228
import java.util.Collections;
3329
import java.util.HashMap;
@@ -36,17 +32,12 @@
3632

3733
import javax.swing.ImageIcon;
3834

39-
import org.jdom2.Element;
4035
import org.scijava.plugin.Plugin;
4136

4237
import fiji.plugin.trackmate.Model;
4338
import fiji.plugin.trackmate.Settings;
4439
import fiji.plugin.trackmate.Spot;
45-
import fiji.plugin.trackmate.TrackMatePlugIn;
4640
import fiji.plugin.trackmate.gui.components.ConfigurationPanel;
47-
import ij.IJ;
48-
import ij.ImageJ;
49-
import ij.ImagePlus;
5041
import net.imagej.ImgPlus;
5142
import net.imglib2.Interval;
5243
import net.imglib2.type.NativeType;
@@ -237,10 +228,6 @@ public class CSVImporterDetectorFactory< T extends RealType< T > & NativeType< T
237228

238229
public static final Double DEFAULT_RADIUS = Double.valueOf( 1. );
239230

240-
private String errorMessage;
241-
242-
private Map< Integer, List< Spot > > spots;
243-
244231
@Override
245232
public String getInfoText()
246233
{
@@ -266,103 +253,11 @@ public String getName()
266253
}
267254

268255
@Override
269-
public SpotDetector< T > getDetector( final Interval interval, final int frame )
270-
{
271-
return new DummySpotDetector( frame );
272-
}
273-
274-
@Override
275-
public boolean setTarget( final ImgPlus< T > img, final Map< String, Object > settings )
276-
{
277-
final boolean ok = checkSettings( settings );
278-
if ( !ok )
279-
return false;
280-
281-
final String filePath = ( String ) settings.get( KEY_FILE_PATH );
282-
final double radius = ( Double ) settings.get( KEY_RADIUS );
283-
final String xColumnName = ( String ) settings.get( KEY_X_COLUMN_NAME );
284-
final String yColumnName = ( String ) settings.get( KEY_Y_COLUMN_NAME );
285-
final String zColumnName = ( String ) settings.get( KEY_Z_COLUMN_NAME );
286-
final String frameColumnName = ( String ) settings.get( KEY_FRAME_COLUMN_NAME );
287-
final String qualityColumn = ( String ) settings.get( KEY_QUALITY_COLUMN_NAME );
288-
final String nameColumn = ( String ) settings.get( KEY_NAME_COLUMN_NAME );
289-
final String idColumn = ( String ) settings.get( KEY_ID_COLUMN_NAME );
290-
final double xOrigin = ( ( Number ) settings.get( KEY_X_ORIGIN ) ).doubleValue();
291-
final double yOrigin = ( ( Number ) settings.get( KEY_Y_ORIGIN ) ).doubleValue();
292-
final double zOrigin = ( ( Number ) settings.get( KEY_Z_ORIGIN ) ).doubleValue();
293-
294-
final CSVImporter importer = new CSVImporter( filePath, radius,
295-
xColumnName, yColumnName, zColumnName, frameColumnName,
296-
qualityColumn, nameColumn, idColumn,
297-
xOrigin, yOrigin, zOrigin );
298-
299-
if ( !importer.checkInput() || !importer.process() )
300-
{
301-
this.errorMessage = importer.getErrorMessage();
302-
return false;
303-
}
304-
305-
this.spots = importer.getResult();
306-
307-
return true;
308-
}
309-
310-
@Override
311-
public String getErrorMessage()
256+
public SpotDetector< T > getDetector( final ImgPlus< T > img, final Map< String, Object > settings, final Interval interval, final int frame )
312257
{
313-
return errorMessage;
258+
return new DummySpotDetector( settings, frame );
314259
}
315260

316-
@Override
317-
public boolean marshall( final Map< String, Object > settings, final Element element )
318-
{
319-
final StringBuilder errorHolder = new StringBuilder();
320-
final boolean ok =
321-
writeRadius( settings, element, errorHolder )
322-
&& writeAttribute( settings, element, KEY_FILE_PATH, String.class, errorHolder )
323-
&& writeAttribute( settings, element, KEY_X_COLUMN_NAME, String.class, errorHolder )
324-
&& writeAttribute( settings, element, KEY_Y_COLUMN_NAME, String.class, errorHolder )
325-
&& writeAttribute( settings, element, KEY_Z_COLUMN_NAME, String.class, errorHolder )
326-
&& writeAttribute( settings, element, KEY_FRAME_COLUMN_NAME, String.class, errorHolder )
327-
&& writeAttribute( settings, element, KEY_QUALITY_COLUMN_NAME, String.class, errorHolder )
328-
&& writeAttribute( settings, element, KEY_NAME_COLUMN_NAME, String.class, errorHolder )
329-
&& writeAttribute( settings, element, KEY_ID_COLUMN_NAME, String.class, errorHolder )
330-
&& writeAttribute( settings, element, KEY_X_ORIGIN, Double.class, errorHolder )
331-
&& writeAttribute( settings, element, KEY_Y_ORIGIN, Double.class, errorHolder )
332-
&& writeAttribute( settings, element, KEY_Z_ORIGIN, Double.class, errorHolder );
333-
334-
if ( !ok )
335-
errorMessage = errorHolder.toString();
336-
337-
return ok;
338-
}
339-
340-
@Override
341-
public boolean unmarshall( final Element element, final Map< String, Object > settings )
342-
{
343-
settings.clear();
344-
final StringBuilder errorHolder = new StringBuilder();
345-
boolean ok = true;
346-
ok = ok & readDoubleAttribute( element, settings, KEY_RADIUS, errorHolder );
347-
ok = ok & readStringAttribute( element, settings, KEY_FILE_PATH, errorHolder );
348-
ok = ok & readStringAttribute( element, settings, KEY_X_COLUMN_NAME, errorHolder );
349-
ok = ok & readStringAttribute( element, settings, KEY_Y_COLUMN_NAME, errorHolder );
350-
ok = ok & readStringAttribute( element, settings, KEY_Z_COLUMN_NAME, errorHolder );
351-
ok = ok & readStringAttribute( element, settings, KEY_FRAME_COLUMN_NAME, errorHolder );
352-
ok = ok & readStringAttribute( element, settings, KEY_QUALITY_COLUMN_NAME, errorHolder );
353-
ok = ok & readStringAttribute( element, settings, KEY_NAME_COLUMN_NAME, errorHolder );
354-
ok = ok & readStringAttribute( element, settings, KEY_ID_COLUMN_NAME, errorHolder );
355-
ok = ok & readDoubleAttribute( element, settings, KEY_X_ORIGIN, errorHolder );
356-
ok = ok & readDoubleAttribute( element, settings, KEY_Y_ORIGIN, errorHolder );
357-
ok = ok & readDoubleAttribute( element, settings, KEY_Z_ORIGIN, errorHolder );
358-
359-
if ( !ok )
360-
{
361-
errorMessage = errorHolder.toString();
362-
return false;
363-
}
364-
return checkSettings( settings );
365-
}
366261

367262
@Override
368263
public ConfigurationPanel getDetectorConfigurationPanel( final Settings settings, final Model model )
@@ -391,39 +286,6 @@ public Map< String, Object > getDefaultSettings()
391286
return map;
392287
}
393288

394-
@Override
395-
public boolean checkSettings( final Map< String, Object > settings )
396-
{
397-
boolean ok = true;
398-
final StringBuilder errorHolder = new StringBuilder();
399-
ok = ok & checkParameter( settings, KEY_FILE_PATH, String.class, errorHolder );
400-
ok = ok & checkParameter( settings, KEY_RADIUS, Double.class, errorHolder );
401-
ok = ok & checkParameter( settings, KEY_X_COLUMN_NAME, String.class, errorHolder );
402-
ok = ok & checkParameter( settings, KEY_Y_COLUMN_NAME, String.class, errorHolder );
403-
ok = ok & checkParameter( settings, KEY_Z_COLUMN_NAME, String.class, errorHolder );
404-
ok = ok & checkParameter( settings, KEY_FRAME_COLUMN_NAME, String.class, errorHolder );
405-
ok = ok & checkParameter( settings, KEY_RADIUS, Double.class, errorHolder );
406-
final List< String > mandatoryKeys = new ArrayList<>();
407-
mandatoryKeys.add( KEY_FILE_PATH );
408-
mandatoryKeys.add( KEY_RADIUS );
409-
mandatoryKeys.add( KEY_X_COLUMN_NAME );
410-
mandatoryKeys.add( KEY_Y_COLUMN_NAME );
411-
mandatoryKeys.add( KEY_Z_COLUMN_NAME );
412-
mandatoryKeys.add( KEY_FRAME_COLUMN_NAME );
413-
mandatoryKeys.add( KEY_X_ORIGIN );
414-
mandatoryKeys.add( KEY_Y_ORIGIN );
415-
mandatoryKeys.add( KEY_Z_ORIGIN );
416-
final List< String > optionalKeys = new ArrayList<>();
417-
optionalKeys.add( KEY_ID_COLUMN_NAME );
418-
optionalKeys.add( KEY_NAME_COLUMN_NAME );
419-
optionalKeys.add( KEY_QUALITY_COLUMN_NAME );
420-
ok = ok & checkMapKeys( settings, mandatoryKeys, optionalKeys, errorHolder );
421-
if ( !ok )
422-
errorMessage = errorHolder.toString();
423-
424-
return ok;
425-
}
426-
427289
@Override
428290
public CSVImporterDetectorFactory< T > copy()
429291
{
@@ -439,8 +301,17 @@ private class DummySpotDetector implements SpotDetector< T >
439301

440302
private final int frame;
441303

442-
public DummySpotDetector( final int frame )
304+
private final Map< String, Object > settings;
305+
306+
private String errorMessage;
307+
308+
private Map< Integer, List< Spot > > spots;
309+
310+
private long processingTime;
311+
312+
public DummySpotDetector( final Map< String, Object > settings, final int frame )
443313
{
314+
this.settings = settings;
444315
this.frame = frame;
445316
}
446317

@@ -456,52 +327,79 @@ public List< Spot > getResult()
456327
@Override
457328
public boolean checkInput()
458329
{
459-
return true;
330+
boolean ok = true;
331+
final StringBuilder errorHolder = new StringBuilder();
332+
ok = ok & checkParameter( settings, KEY_FILE_PATH, String.class, errorHolder );
333+
ok = ok & checkParameter( settings, KEY_RADIUS, Double.class, errorHolder );
334+
ok = ok & checkParameter( settings, KEY_X_COLUMN_NAME, String.class, errorHolder );
335+
ok = ok & checkParameter( settings, KEY_Y_COLUMN_NAME, String.class, errorHolder );
336+
ok = ok & checkParameter( settings, KEY_Z_COLUMN_NAME, String.class, errorHolder );
337+
ok = ok & checkParameter( settings, KEY_FRAME_COLUMN_NAME, String.class, errorHolder );
338+
ok = ok & checkParameter( settings, KEY_RADIUS, Double.class, errorHolder );
339+
final List< String > mandatoryKeys = new ArrayList<>();
340+
mandatoryKeys.add( KEY_FILE_PATH );
341+
mandatoryKeys.add( KEY_RADIUS );
342+
mandatoryKeys.add( KEY_X_COLUMN_NAME );
343+
mandatoryKeys.add( KEY_Y_COLUMN_NAME );
344+
mandatoryKeys.add( KEY_Z_COLUMN_NAME );
345+
mandatoryKeys.add( KEY_FRAME_COLUMN_NAME );
346+
mandatoryKeys.add( KEY_X_ORIGIN );
347+
mandatoryKeys.add( KEY_Y_ORIGIN );
348+
mandatoryKeys.add( KEY_Z_ORIGIN );
349+
final List< String > optionalKeys = new ArrayList<>();
350+
optionalKeys.add( KEY_ID_COLUMN_NAME );
351+
optionalKeys.add( KEY_NAME_COLUMN_NAME );
352+
optionalKeys.add( KEY_QUALITY_COLUMN_NAME );
353+
ok = ok & checkMapKeys( settings, mandatoryKeys, optionalKeys, errorHolder );
354+
if ( !ok )
355+
errorMessage = errorHolder.toString();
356+
357+
return ok;
460358
}
461359

462360
@Override
463361
public boolean process()
464362
{
363+
final String filePath = ( String ) settings.get( KEY_FILE_PATH );
364+
final double radius = ( Double ) settings.get( KEY_RADIUS );
365+
final String xColumnName = ( String ) settings.get( KEY_X_COLUMN_NAME );
366+
final String yColumnName = ( String ) settings.get( KEY_Y_COLUMN_NAME );
367+
final String zColumnName = ( String ) settings.get( KEY_Z_COLUMN_NAME );
368+
final String frameColumnName = ( String ) settings.get( KEY_FRAME_COLUMN_NAME );
369+
final String qualityColumn = ( String ) settings.get( KEY_QUALITY_COLUMN_NAME );
370+
final String nameColumn = ( String ) settings.get( KEY_NAME_COLUMN_NAME );
371+
final String idColumn = ( String ) settings.get( KEY_ID_COLUMN_NAME );
372+
final double xOrigin = ( ( Number ) settings.get( KEY_X_ORIGIN ) ).doubleValue();
373+
final double yOrigin = ( ( Number ) settings.get( KEY_Y_ORIGIN ) ).doubleValue();
374+
final double zOrigin = ( ( Number ) settings.get( KEY_Z_ORIGIN ) ).doubleValue();
375+
376+
final CSVImporter importer = new CSVImporter( filePath, radius,
377+
xColumnName, yColumnName, zColumnName, frameColumnName,
378+
qualityColumn, nameColumn, idColumn,
379+
xOrigin, yOrigin, zOrigin );
380+
381+
final long start = System.currentTimeMillis();
382+
if ( !importer.checkInput() || !importer.process() )
383+
{
384+
this.errorMessage = importer.getErrorMessage();
385+
return false;
386+
}
387+
this.spots = importer.getResult();
388+
final long end = System.currentTimeMillis();
389+
this.processingTime = end - start;
465390
return true;
466391
}
467392

468393
@Override
469394
public String getErrorMessage()
470395
{
471-
return "";
396+
return errorMessage;
472397
}
473398

474399
@Override
475400
public long getProcessingTime()
476401
{
477-
return 0;
478-
}
479-
480-
}
481-
482-
/*
483-
* STATIC UTILITIES
484-
*/
485-
486-
private static final boolean readStringAttribute( final Element element, final Map< String, Object > settings, final String parameterKey, final StringBuilder errorHolder )
487-
{
488-
final String str = element.getAttributeValue( parameterKey );
489-
if ( null == str )
490-
{
491-
errorHolder.append( "Attribute " + parameterKey + " could not be found in XML element.\n" );
492-
return false;
402+
return processingTime;
493403
}
494-
settings.put( parameterKey, str );
495-
return true;
496-
}
497-
498-
public static void main( final String[] args ) throws IOException
499-
{
500-
ImageJ.main( args );
501-
final ImagePlus imp = IJ.openImage( "samples/test_DH1_670_100x_1_49_Microtubules_001-1.30x30.tif" );
502-
imp.show();
503-
// final Roi roi = new RoiDecoder( "samples/SN4_GEMS1_016_ROI_001.roi" ).getRoi();
504-
// imp.setRoi( roi );
505-
new TrackMatePlugIn().run( "" );
506404
}
507405
}

src/main/java/fiji/plugin/trackmate/importer/csv/TrackMateImporter.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
* it under the terms of the GNU General Public License as
99
* published by the Free Software Foundation, either version 3 of the
1010
* License, or (at your option) any later version.
11-
*
11+
*
1212
* This program is distributed in the hope that it will be useful,
1313
* but WITHOUT ANY WARRANTY; without even the implied warranty of
1414
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1515
* GNU General Public License for more details.
16-
*
16+
*
1717
* You should have received a copy of the GNU General Public
1818
* License along with this program. If not, see
1919
* <http://www.gnu.org/licenses/gpl-3.0.html>.
@@ -212,7 +212,7 @@ public Settings getSettings()
212212
settings.detectorFactory = new ManualDetectorFactory<>();
213213
settings.detectorSettings = settings.detectorFactory.getDefaultSettings();
214214
settings.trackerFactory = new ManualTrackerFactory();
215-
settings.trackerSettings = settings.trackerFactory.getDefaultSettings();
215+
settings.trackerSettings = new HashMap<>();
216216

217217
if ( declareAllFeatures )
218218
{
@@ -288,8 +288,10 @@ public Model getModel( final double frameInterval, final String spaceUnit, final
288288
try
289289
{
290290
final CSVFormat csvFormat = CSVFormat.EXCEL
291-
.withHeader()
292-
.withCommentMarker( '#' );
291+
.builder()
292+
.setHeader()
293+
.setCommentMarker( '#' )
294+
.get();
293295
records = csvFormat.parse( in );
294296
}
295297
catch ( final IOException e )

0 commit comments

Comments
 (0)