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 */
2222package 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 ;
2724import static fiji .plugin .trackmate .util .TMUtils .checkMapKeys ;
2825import static fiji .plugin .trackmate .util .TMUtils .checkParameter ;
2926
30- import java .io .IOException ;
3127import java .util .ArrayList ;
3228import java .util .Collections ;
3329import java .util .HashMap ;
3632
3733import javax .swing .ImageIcon ;
3834
39- import org .jdom2 .Element ;
4035import org .scijava .plugin .Plugin ;
4136
4237import fiji .plugin .trackmate .Model ;
4338import fiji .plugin .trackmate .Settings ;
4439import fiji .plugin .trackmate .Spot ;
45- import fiji .plugin .trackmate .TrackMatePlugIn ;
4640import fiji .plugin .trackmate .gui .components .ConfigurationPanel ;
47- import ij .IJ ;
48- import ij .ImageJ ;
49- import ij .ImagePlus ;
5041import net .imagej .ImgPlus ;
5142import net .imglib2 .Interval ;
5243import 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}
0 commit comments