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:24DownloadDescription:
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:16DownloadDescription:
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 ); }