1+ from fiji .plugin .trackmate import Model
2+ from fiji .plugin .trackmate import Settings
3+ from fiji .plugin .trackmate import TrackMate
4+ from fiji .plugin .trackmate import Logger
5+ from fiji .plugin .trackmate .io import TmXmlWriter
6+ from fiji .plugin .trackmate .util import LogRecorder ;
7+ from fiji .plugin .trackmate .tracking .sparselap import SparseLAPTrackerFactory
8+ from fiji .plugin .trackmate .tracking import LAPUtils
9+ from fiji .plugin .trackmate .util import TMUtils
10+ from fiji .plugin .trackmate .visualization .hyperstack import HyperStackDisplayer
11+ from fiji .plugin .trackmate import SelectionModel
12+ from fiji .plugin .trackmate .cellpose import CellposeDetectorFactory
13+ import fiji .plugin .trackmate .features .FeatureFilter as FeatureFilter
14+ from fiji .plugin .trackmate .gui .displaysettings import DisplaySettings
15+ from fiji .plugin .trackmate .gui .displaysettings import DisplaySettings
16+ from fiji .plugin .trackmate .gui .displaysettings import DisplaySettingsIO
17+ from fiji .plugin .trackmate .action import CaptureOverlayAction
18+ from fiji .plugin .trackmate .cellpose .CellposeSettings import PretrainedModel
19+
20+ from ij import IJ
21+
22+
23+ from datetime import datetime as dt
24+ import sys
25+
26+ reload (sys )
27+ sys .setdefaultencoding ('utf-8' )
28+
29+ # ------------------------------------------------------
30+ # EDIT FILE PATHS BELOW.
31+ # ------------------------------------------------------
32+
33+ # Shall we display the results each time?
34+ show_output = True
35+
36+ # Channel to process?
37+ channel_to_process = 1
38+
39+ # Image files to analyse.
40+ file_paths = []
41+ file_paths .append ( '/Users/tinevez/Desktop/BreastCancerCells_multiC.tif' )
42+
43+
44+
45+ # ------------------------------------------------------
46+ # ACTUAL CODE.
47+ # ------------------------------------------------------
48+ def run ( image_file ):
49+
50+ # Open image.
51+ imp = IJ .openImage ( image_file )
52+ cal = imp .getCalibration ()
53+
54+ # Logger -> content will be saved in the XML file.
55+ logger = LogRecorder ( Logger .VOID_LOGGER )
56+
57+ logger .log ( 'TrackMate-Cellpose analysis script\n ' )
58+
59+ dt_string = dt .now ().strftime ("%d/%m/%Y %H:%M:%S" )
60+ logger .log ( dt_string + '\n \n ' )
61+
62+ #------------------------
63+ # Prepare settings object
64+ #------------------------
65+
66+ settings = Settings (imp )
67+ setup = settings .toStringImageInfo ()
68+
69+ # Configure Cellpose default detector.
70+
71+ settings .detectorFactory = CellposeDetectorFactory ()
72+
73+ settings .detectorSettings ['TARGET_CHANNEL' ] = 1
74+ settings .detectorSettings ['OPTIONAL_CHANNEL_2' ] = 0
75+ settings .detectorSettings ['CELLPOSE_PYTHON_FILEPATH' ] = '/opt/anaconda3/envs/cellpose/bin/python'
76+ settings .detectorSettings ['CELLPOSE_MODEL' ] = PretrainedModel .CYTO2
77+ settings .detectorSettings ['CELL_DIAMETER' ] = 40.0
78+ settings .detectorSettings ['USE_GPU' ] = True
79+ settings .detectorSettings ['SIMPLIFY_CONTOURS' ] = False
80+
81+
82+ # Configure tracker
83+ settings .trackerFactory = SparseLAPTrackerFactory ()
84+ settings .trackerSettings = LAPUtils .getDefaultLAPSettingsMap ()
85+ settings .trackerSettings [ 'LINKING_MAX_DISTANCE' ] = 5.0
86+ settings .trackerSettings [ 'GAP_CLOSING_MAX_DISTANCE' ] = 5.0
87+ settings .trackerSettings [ 'MAX_FRAME_GAP' ] = 2
88+ settings .initialSpotFilterValue = - 1.
89+
90+ # Analyzers
91+ settings .addAllAnalyzers ()
92+
93+ # Add some filters for tracks/spots
94+
95+ # filter on track duration = keep tracks > 75% of total duration
96+ duration_threshold = 75
97+ maxduration = (duration_threshold / 100.0 ) * (imp .getNFrames () * cal .frameInterval )
98+ filter1_track = FeatureFilter ('TRACK_DURATION' , maxduration , True )
99+ settings .addTrackFilter (filter1_track )
100+
101+ # filter on spot = keep spots having radius > 1.6 um, and circularity > 0.7
102+ #filter1_spot = FeatureFilter('RADIUS', 1.6, True)
103+ #filter2_spot = FeatureFilter('CIRCULARITY', 0.7, True)
104+ #settings.addSpotFilter(filter1_spot)
105+ #settings.addSpotFilter(filter2_spot)
106+
107+ print "Spot filters added = " , settings .getSpotFilters ()
108+ print "Track filters added = " , settings .getTrackFilters (), "\n "
109+
110+ #-------------------
111+ # Instantiate plugin
112+ #-------------------
113+
114+ trackmate = TrackMate ( settings )
115+ trackmate .computeSpotFeatures ( True )
116+ trackmate .computeTrackFeatures ( True )
117+ trackmate .getModel ().setLogger ( logger )
118+
119+ #--------
120+ # Process
121+ #--------
122+
123+ ok = trackmate .checkInput ()
124+ if not ok :
125+ print ( str ( trackmate .getErrorMessage () ) )
126+ return
127+
128+ ok = trackmate .process ()
129+ if not ok :
130+ print ( str ( trackmate .getErrorMessage () ) )
131+ return
132+
133+ #----------------
134+ # Save results
135+ #----------------
136+
137+ saveFile = TMUtils .proposeTrackMateSaveFile ( settings , logger )
138+
139+ writer = TmXmlWriter ( saveFile , logger )
140+ writer .appendLog ( logger .toString () )
141+ writer .appendModel ( trackmate .getModel () )
142+ writer .appendSettings ( trackmate .getSettings () )
143+ writer .writeToFile ();
144+ print ( "Results saved to: " + saveFile .toString () + '\n ' );
145+
146+ #----------------
147+ # Display results
148+ #----------------
149+
150+ if show_output :
151+ model = trackmate .getModel ()
152+ selectionModel = SelectionModel ( model )
153+ ds = DisplaySettings ()
154+ ds = DisplaySettingsIO .readUserDefault ()
155+ ds .spotDisplayedAsRoi = True
156+ displayer = HyperStackDisplayer ( model , selectionModel , imp , ds )
157+ displayer .render ()
158+ displayer .refresh ()
159+
160+ # capture overlay - RGB file
161+ image = trackmate .getSettings ().imp
162+ capture = CaptureOverlayAction .capture (image , - 1 , imp .getNFrames (), logger )
163+ capture .setTitle ("TracksOverlay" )
164+ capture .show ()
165+
166+ # ------------------------------------------------------
167+
168+ for file_path in file_paths :
169+
170+ dt_string = dt .now ().strftime ("%d/%m/%Y %H:%M:%S" )
171+ print ( '\n Running analysis on %s - %s' % ( file_path , dt_string ) )
172+
173+ run ( file_path )
174+
175+ print ( 'Finished!' )
0 commit comments