SingleFileTrackingAdv.py
from ij import IJ, Prefs | |
from ij.gui import Roi | |
from pta import PTA | |
from pta.gui import ShowPdata | |
from pta.track import DetectParticle | |
from pta.data import PtaParam | |
from java.util import ArrayList | |
from ij.plugin.frame import ThresholdAdjuster | |
from ij.process import ImageProcessor | |
import os, csv | |
from ij.plugin.filter import BackgroundSubtracter | |
from fiji.threshold import Auto_Threshold | |
from loci.plugins import BF | |
''' | |
a function for writing CSV files, | |
1. XY coordinates and sigma_x, sigma_y for each track | |
2. timescale and MSD for each track. | |
''' | |
def CSVwrite(srcpath, msddata): | |
parentdirectory = os.path.dirname(srcpath) | |
filename = os.path.basename(srcpath) | |
basename = os.path.splitext(filename)[0] | |
for msd in msddata: | |
thisid = msd.getID() | |
coordsPath = os.path.join(parentdirectory, basename + "_" + str(int(thisid)) +"_coords.csv") | |
msdPath = os.path.join(parentdirectory, basename + "_" + str(int(thisid)) + "_msd.csv") | |
print coordsPath | |
print msdPath | |
f1 = open(coordsPath, 'wb') | |
writer = csv.writer(f1) | |
track = msd.getTrack() | |
for node in track: | |
writer.writerow([node.getCx(), node.getCy(), node.getParam()[1],node.getParam()[2]]) | |
f1.close() | |
f2 = open(msdPath, 'wb') | |
writer = csv.writer(f2) | |
dtA = msd.getFullDFrames() | |
msdA = msd.getFullMSD() | |
for i in range(len(dtA)): | |
writer.writerow([dtA[i], msdA[i]]) | |
f2.close() | |
datafilepath = "/Users/miura/Dropbox/20130805_Osaka/data/transferrin-movement/tconc10_16.tif" | |
#datafilepath = "/Users/araiyoshiyuki/Desktop/spool-tub_2-2.tif" | |
# load data as an ImagePlus object | |
#imp = IJ.openImage(datafilepath) | |
imp = BF.openImagePlus(datafilepath)[0] | |
# default ROI = full frame | |
scanAreaRoi = Roi(0,0,imp.getWidth(),imp.getHeight()) | |
# ip = imp.getProcessor() | |
IJ.run(imp,"Subtract Background...", "rolling=10 stack") | |
# above IJ.run method could be written in a lower way like the following. | |
#bs = BackgroundSubtracter() | |
#for frame in range(imp.getStackSize()): | |
# ip = imp.getStack().getProcessor(frame + 1) | |
# bs.rollingBallBackground(ip, 10.0, False, False, False, False, False) | |
ip = imp.getProcessor() | |
iphist = ip.getHistogram() | |
Prefs.blackBackground = True | |
# **** Auto Threshold Algorithm should be examined before running the script. | |
#lt = Auto_Threshold.Intermodes(iphist) | |
#lt = Auto_Threshold.Triangle(iphist) | |
lt = Auto_Threshold.Moments(iphist) | |
ip.setThreshold(lt, ip.getMax(), ImageProcessor.RED_LUT) | |
PTA.setDetectionState(True) | |
#PTA.setDebugMode() | |
# set no GUI mode | |
PTA.setNoGUI(True) | |
# set Detection Parameters | |
ptap = PtaParam.Builder(12,12, False).build() | |
### paramter customizations | |
#ptap.setDo2dGaussfit(False) | |
#ptap.setDo2dGaussfit(True) | |
#ptap.setMinIntensity(100.0) | |
#ptap.setSearchPointIncrement(1) | |
# instantiate a DetectParticle object | |
dp = DetectParticle(ptap,imp,scanAreaRoi, True) | |
# set range of frames to analyze | |
dp.setStackRange(1, imp.getStackSize()) | |
# start threads. | |
dp.start() | |
# wait till the processing finishes | |
dp.join() | |
# stop the thread. | |
dp.interrupt() | |
PTA.setDetectionState(False) | |
# show detection results | |
imp.show() | |
# Particle lists | |
#ll = dp.getalldplist() | |
#print ll | |
# track lists | |
tracks = dp.getLinkedPointList() | |
for t in tracks: | |
print t | |
# MSD analysis | |
msds = dp.getMSDres(5.0, True) | |
print "msd data size", msds.size() | |
for msd in msds: | |
print msd.getID(), msd.getA(), msd.getB(), msd.getR() | |
# TODO: write MSD values in a csv file. | |
# http://cmci.embl.de/documents/120206pyip_cooking/python_imagej_cookbook#saving_csv_file_data_table | |
CSVwrite(datafilepath, msds) | |
# discard the DetextParticle Object | |
dp = None | |
##Back to the GUI mode: without this line, PTA GUI will not showup from next time. | |
PTA.setNoGUI(False) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment