Script

Batch Spot Tracking with Auto Parameter Estimation

Publication ID: ICY-Y6I7C1

Short Description

Use the Spot Detector and Spot Tracking plugin in a batch way (multiple movies directly loaded from a local location). The parameters of the Spot Tracking plugin are estimated automatically. Results are saved in XLS and XML files compatible with the Track Manager plugin.

Versions

  • Version 2 • Released on: 2015-10-28 22:35:24
    Download
    Description:

    Added min size parameters for spot detection.

    importClass(Packages.plugins.nchenouard.particletracking.SpotTrackingPlugin)
    importClass(Packages.icy.type.DataType)
    importClass(Packages.java.util.ArrayList)
    importClass(Packages.java.util.Vector)
    importClass(Packages.java.awt.geom.Point2D)
    importClass(Packages.java.io.File)
    importClass(Packages.java.awt.image.BufferedImage)
    
    importClass(Packages.icy.file.Loader)
    importClass(Packages.icy.gui.dialog.MessageDialog)
    importClass(Packages.icy.sequence.Sequence)
    importClass(Packages.icy.file.xls.XlsManager)
    importClass(Packages.icy.file.FileUtil)
    importClass(Packages.icy.file.Saver)
    importClass(Packages.icy.type.DataType)
    importClass(Packages.icy.image.IcyBufferedImage)
    importClass(Packages.icy.gui.viewer.Viewer)
    importClass(Packages.icy.canvas.Canvas2D)
    
    importClass(Packages.org.w3c.dom.Document)
    importClass(Packages.org.w3c.dom.Element)
    
    importClass(Packages.plugins.tprovoost.scripteditor.uitools.filedialogs.FileDialog)
    importClass(Packages.icy.util.XMLUtil)
    
    importClass(Packages.plugins.fab.spotDetector.detector.UDWTWavelet)
    importClass(Packages.plugins.fab.spotDetector.GlobalDetectionToken)
    importClass(Packages.plugins.fab.spotDetector.DetectionSpot)
    importClass(Packages.plugins.fab.trackmanager.TrackGroup)
    importClass(Packages.plugins.fab.trackmanager.TrackSegment)
    
    
    importClass(Packages.plugins.nchenouard.spot.DetectionResult)
    importClass(Packages.plugins.nchenouard.spot.Spot)
    importClass(Packages.plugins.nchenouard.particletracking.SpotTrackingPlugin)
    
    
    
      /////////////////////////////
     // USER DEFINED PARAMETERS //
    /////////////////////////////
    
    // detection parameters
    
    // scale threshold parameters
    parameterForScale1 = 0; // 0 means that the scale is not used
    parameterForScale2 = 40;
    parameterForScale3 = 0;
    scaleParameters = [parameterForScale1, parameterForScale2, parameterForScale3]; 
    
    detectNegative = false; // SET TO true IF DETECTION OF DARK PIXELS, false FOR BRIGHT PIXELS
    useROIforWATComputation = false; // SET TO TRUE IF USE A ROI FOR WAT COMPUTATION, FALSE OTHERWISE
    
    minSize = 2; // MINIMUM SIZE OF THE DETECTED SPOTS
    
    // tracking parameter estimation
    isDirectedMotion = true; // true FOR DIRECTED MOTION 
    isSingleMotion = false; // true FOR SINGLE MOTION MODEL, false FOR MULTIPLE MOTION MODELS
    isUpdateMotion = false; // true IF PARAMETERS OF MOTION MODELS ARE REEVALUATED ONLINE
    
    // create a detector
    detector = new UDWTWavelet()
    
    
    // build the tracker
    tracker = new SpotTrackingPlugin();
    tracker.run()
    
      ////////////////////////////////////////
     // let the user select multiple files //
    ////////////////////////////////////////
    
    var files = FileDialog.openMulti() 
    if (files == null) throw "User cancelled!"
    
     ///////////////////////////////////////////
    // iterate over the selected image files //
    //////////////////////////////////////////
    for (j = 0; j < files.length; ++j) {
        var f = files[j]
          ///////////////////////
         // load the sequence //
        ///////////////////////
        sequence = Loader.loadSequence(f)
        println("loaded sequence: "+ sequence.getName());
    
          ////////////////////////
         // perform detection ///
        ////////////////////////
        detectionResult = new DetectionResult();
        for ( frameNumber = 0 ; frameNumber < sequence.getSizeT() ; frameNumber++ )
        {
        	image = sequence.getImage( frameNumber , 0 ) // get image at t and z=0	
    	tmpSequence = new Sequence();
    	tmpSequence.addImage( 0 , image );
        	detector.detect(tmpSequence, detectNegative, useROIforWATComputation, scaleParameters)
        	detections = detector.getDetectionResult();
        	spotVector =  new Vector(detections.size());
        	for (k = 0; k < detections.size(); k++)
        	{
        		d = detections.get(k);
        		if (d.points.size() >= minSize){
      	  		spotVector.add(new Spot(d.getMassCenter().x, d.getMassCenter().y, d.getMassCenter().z));
        		}
        	}
        	detectionResult.setResult(frameNumber,spotVector)
        }
          ////////////////////////////////////////////////////
         // estimate the tracking parameters automatically //
        ////////////////////////////////////////////////////
      
        tracker.estimateParameters(isDirectedMotion, isSingleMotion, isUpdateMotion)
    
    
          //////////////////////
         // Perform tracking //
        //////////////////////
        mhtracker = tracker.mhTrackerManager.buildMHTracker(detectionResult);
        for (t = detectionResult.getFirstFrameTime(); t <= detectionResult.getLastFrameTime(); t++)
        {
        	mhtracker.track(t, detectionResult.getDetectionsAtT(t));
        }
        tracks = mhtracker.getCompleteTracks();
        tg = new TrackGroup(detectionResult.getSequence());
        for (i = 0; i < tracks.size(); i++)
        {
        	tg.addTrackSegment(tracks.get(i));
        }
        tg.setDescription("Bacth particle tracking");
    
    
          /////////////////////////////
         // Save tracks in XLS file //
        /////////////////////////////
    
        // copied from the track processor for tack export of Fabrice de Chaumont
    
        folder = f.getAbsolutePath().substring( 0 , f.getAbsolutePath().length() - f.getName().length() );
        // create a XLS file to output results
        trackXLSFile = new File ( folder + FileUtil.separator + f.getName()+"-tracksXLS.xls" );
        
        xls = new XlsManager( trackXLSFile );
        xls.createNewPage("Tracks");
        
        cursorY = 0;
        
        for ( k =  0; k < tracks.size(); k++ )
        {
    	ts = tracks.get(k)
    	cursorY++;
    	xls.setLabel( 0 , cursorY, "track #");
    	xls.setNumber( 1 , cursorY, tracks.indexOf( ts ) );
    	cursorY++;
    		
    	xls.setLabel( 2 , cursorY, "t");
    	xls.setLabel( 3 , cursorY, "x");
    	xls.setLabel( 4 , cursorY, "y");
    	xls.setLabel( 5 , cursorY, "z");
    	cursorY++;
    		
    	detectionList = ts.getDetectionList();
    		
    	for (i = 0;  i < detectionList.size() ; i++  )
    	{
    		d = detectionList.get( i );
    		xls.setNumber( 2 , cursorY , d.getT() );
    		xls.setNumber( 3 , cursorY , d.getX() );
    		xls.setNumber( 4 , cursorY , d.getY() );
    		xls.setNumber( 5 , cursorY , d.getZ() );
    
    		cursorY++;
    	}
        }
        xls.SaveAndClose();
    
          ///////////////////////////////////////////////////////
         // Save tracks in TrackManager compatible xml format //
        ///////////////////////////////////////////////////////
    
        trackXMLFile = new File ( folder + FileUtil.separator + f.getName()+"-tracksXML.xml" );
        
        document = XMLUtil.createDocument( true );
        versionElement = XMLUtil.addElement( document.getDocumentElement() , "trackfile" ); 
        versionElement.setAttribute("version", "1");
        trackGroupElement = XMLUtil.addElement( document.getDocumentElement() , "trackgroup" );
        trackGroupElement.setAttribute("description", tg.getDescription() );
        for ( k = 0; k < tg.getTrackSegmentList().size(); k++ ){
        	trackSegment = tg.getTrackSegmentList().get(k)
        	trackElement = XMLUtil.addElement( trackGroupElement , "track" );				
        	trackElement.setAttribute( "id", ""+trackSegment.getId() );
    	for ( m = 0; m < trackSegment.getDetectionList().size(); m++ ){					
    		detection = trackSegment.getDetectionList().get(m);
    		detectionElement = XMLUtil.addElement( trackElement , "detection" );
    		detectionElement.setAttribute( "classname", detection.getClass().getName() );
    		detection.saveToXML( detectionElement );
    	}			
    	}
        linklistElement = XMLUtil.addElement( document.getDocumentElement() , "linklist" );
        XMLUtil.saveDocument( document , trackXMLFile );
    }
    
  • Version 1 • Released on: 2015-10-28 22:15:16
    Download
    Description:

    initial version

    importClass(Packages.plugins.nchenouard.particletracking.SpotTrackingPlugin)
    importClass(Packages.icy.type.DataType)
    importClass(Packages.java.util.ArrayList)
    importClass(Packages.java.util.Vector)
    importClass(Packages.java.awt.geom.Point2D)
    importClass(Packages.java.io.File)
    importClass(Packages.java.awt.image.BufferedImage)
    
    importClass(Packages.icy.file.Loader)
    importClass(Packages.icy.gui.dialog.MessageDialog)
    importClass(Packages.icy.sequence.Sequence)
    importClass(Packages.icy.file.xls.XlsManager)
    importClass(Packages.icy.file.FileUtil)
    importClass(Packages.icy.file.Saver)
    importClass(Packages.icy.type.DataType)
    importClass(Packages.icy.image.IcyBufferedImage)
    importClass(Packages.icy.gui.viewer.Viewer)
    importClass(Packages.icy.canvas.Canvas2D)
    
    importClass(Packages.org.w3c.dom.Document)
    importClass(Packages.org.w3c.dom.Element)
    
    importClass(Packages.plugins.tprovoost.scripteditor.uitools.filedialogs.FileDialog)
    importClass(Packages.icy.util.XMLUtil)
    
    importClass(Packages.plugins.fab.spotDetector.detector.UDWTWavelet)
    importClass(Packages.plugins.fab.spotDetector.GlobalDetectionToken)
    importClass(Packages.plugins.fab.spotDetector.DetectionSpot)
    importClass(Packages.plugins.fab.trackmanager.TrackGroup)
    importClass(Packages.plugins.fab.trackmanager.TrackSegment)
    
    
    importClass(Packages.plugins.nchenouard.spot.DetectionResult)
    importClass(Packages.plugins.nchenouard.spot.Spot)
    importClass(Packages.plugins.nchenouard.particletracking.SpotTrackingPlugin)
    
    
    
      /////////////////////////////
     // USER DEFINED PARAMETERS //
    /////////////////////////////
    
    // detection parameters
    
    // scale threshold parameters
    parameterForScale1 = 0; // 0 means that the scale is not used
    parameterForScale2 = 80;
    parameterForScale3 = 0;
    scaleParameters = [parameterForScale1, parameterForScale2, parameterForScale3]; 
    
    detectNegative = false; // SET TO true IF DETECTION OF DARK PIXELS, false FOR BRIGHT PIXELS
    useROIforWATComputation = false; // SET TO TRUE IF USE A ROI FOR WAT COMPUTATION, FALSE OTHERWISE
    
    // tracking parameter estimation
    isDirectedMotion = true; // true FOR DIRECTED MOTION 
    isSingleMotion = false; // true FOR SINGLE MOTION MODEL, false FOR MULTIPLE MOTION MODELS
    isUpdateMotion = false; // true IF PARAMETERS OF MOTION MODELS ARE REEVALUATED ONLINE
    
    // create a detector
    detector = new UDWTWavelet()
    
    
    // build the tracker
    tracker = new SpotTrackingPlugin();
    tracker.run()
    
      ////////////////////////////////////////
     // let the user select multiple files //
    ////////////////////////////////////////
    
    var files = FileDialog.openMulti() 
    if (files == null) throw "User cancelled!"
    
     ///////////////////////////////////////////
    // iterate over the selected image files //
    //////////////////////////////////////////
    for (j = 0; j < files.length; ++j) {
        var f = files[j]
          ///////////////////////
         // load the sequence //
        ///////////////////////
        sequence = Loader.loadSequence(f)
        println("loaded sequence: "+ sequence.getName());
    
          ////////////////////////
         // perform detection ///
        ////////////////////////
        detectionResult = new DetectionResult();
        for ( frameNumber = 0 ; frameNumber < sequence.getSizeT() ; frameNumber++ )
        {
        	image = sequence.getImage( frameNumber , 0 ) // get image at t and z=0	
    	tmpSequence = new Sequence();
    	tmpSequence.addImage( 0 , image );
        	detector.detect(tmpSequence, detectNegative, useROIforWATComputation, scaleParameters)
        	detections = detector.getDetectionResult();
        	spotVector =  new Vector(detections.size());
        	for (k = 0; k < detections.size(); k++)
        	{
        		d = detections.get(k);
        		spotVector.add(new Spot(d.getMassCenter().x, d.getMassCenter().y, d.getMassCenter().z));
        	}
        	detectionResult.setResult(frameNumber,spotVector)
        }
          ////////////////////////////////////////////////////
         // estimate the tracking parameters automatically //
        ////////////////////////////////////////////////////
      
        tracker.estimateParameters(isDirectedMotion, isSingleMotion, isUpdateMotion)
    
    
          //////////////////////
         // Perform tracking //
        //////////////////////
        mhtracker = tracker.mhTrackerManager.buildMHTracker(detectionResult);
        for (t = detectionResult.getFirstFrameTime(); t <= detectionResult.getLastFrameTime(); t++)
        {
        	mhtracker.track(t, detectionResult.getDetectionsAtT(t));
        }
        tracks = mhtracker.getCompleteTracks();
        tg = new TrackGroup(detectionResult.getSequence());
        for (i = 0; i < tracks.size(); i++)
        {
        	tg.addTrackSegment(tracks.get(i));
        }
        tg.setDescription("Bacth particle tracking");
    
    
          /////////////////////////////
         // Save tracks in XLS file //
        /////////////////////////////
    
        // copied from the track processor for tack export of Fabrice de Chaumont
    
        folder = f.getAbsolutePath().substring( 0 , f.getAbsolutePath().length() - f.getName().length() );
        // create a XLS file to output results
        trackXLSFile = new File ( folder + FileUtil.separator + f.getName()+"-tracksXLS.xls" );
        
        xls = new XlsManager( trackXLSFile );
        xls.createNewPage("Tracks");
        
        cursorY = 0;
        
        for ( k =  0; k < tracks.size(); k++ )
        {
    	ts = tracks.get(k)
    	cursorY++;
    	xls.setLabel( 0 , cursorY, "track #");
    	xls.setNumber( 1 , cursorY, tracks.indexOf( ts ) );
    	cursorY++;
    		
    	xls.setLabel( 2 , cursorY, "t");
    	xls.setLabel( 3 , cursorY, "x");
    	xls.setLabel( 4 , cursorY, "y");
    	xls.setLabel( 5 , cursorY, "z");
    	cursorY++;
    		
    	detectionList = ts.getDetectionList();
    		
    	for (i = 0;  i < detectionList.size() ; i++  )
    	{
    		d = detectionList.get( i );
    		xls.setNumber( 2 , cursorY , d.getT() );
    		xls.setNumber( 3 , cursorY , d.getX() );
    		xls.setNumber( 4 , cursorY , d.getY() );
    		xls.setNumber( 5 , cursorY , d.getZ() );
    
    		cursorY++;
    	}
        }
        xls.SaveAndClose();
    
          ///////////////////////////////////////////////////////
         // Save tracks in TrackManager compatible xml format //
        ///////////////////////////////////////////////////////
    
        trackXMLFile = new File ( folder + FileUtil.separator + f.getName()+"-tracksXML.xml" );
        
        document = XMLUtil.createDocument( true );
        versionElement = XMLUtil.addElement( document.getDocumentElement() , "trackfile" ); 
        versionElement.setAttribute("version", "1");
        trackGroupElement = XMLUtil.addElement( document.getDocumentElement() , "trackgroup" );
        trackGroupElement.setAttribute("description", tg.getDescription() );
        for ( k = 0; k < tg.getTrackSegmentList().size(); k++ ){
        	trackSegment = tg.getTrackSegmentList().get(k)
        	trackElement = XMLUtil.addElement( trackGroupElement , "track" );				
        	trackElement.setAttribute( "id", ""+trackSegment.getId() );
    	for ( m = 0; m < trackSegment.getDetectionList().size(); m++ ){					
    		detection = trackSegment.getDetectionList().get(m);
    		detectionElement = XMLUtil.addElement( trackElement , "detection" );
    		detectionElement.setAttribute( "classname", detection.getClass().getName() );
    		detection.saveToXML( detectionElement );
    	}			
    	}
        linklistElement = XMLUtil.addElement( document.getDocumentElement() , "linklist" );
        XMLUtil.saveDocument( document , trackXMLFile );
    }
    

Leave a Review