Skip to content

Commit 2fafab5

Browse files
committed
A Jython script to run the detection with cellpose.
1 parent bb85840 commit 2fafab5

1 file changed

Lines changed: 175 additions & 0 deletions

File tree

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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( '\nRunning analysis on %s - %s' % ( file_path, dt_string ) )
172+
173+
run( file_path )
174+
175+
print( 'Finished!' )

0 commit comments

Comments
 (0)