Skip to content
Snippets Groups Projects
Commit b5370f77 authored by Stéphane  DALLONGEVILLE's avatar Stéphane DALLONGEVILLE
Browse files

Fixed MSD computation for partially clipped / enabled tracks

parent 10c3044a
No related branches found
No related tags found
No related merge requests found
......@@ -105,14 +105,19 @@ public class TrackProcessorMSD extends PluginTrackManagerProcessor implements Ac
{
XYSeries series = new XYSeries("Track " + trackPool.getTrackIndex(ts));
if (ts.isAllDetectionEnabled())
// Better to allow partially clipped tracks otherwise we cannot get MSD for them (Stephane)
// TODO: check that it doesn't bring any regression
// if (ts.isAllDetectionEnabled())
{
double[] msd = scaledMeanSquaredDisplacement(seq, ts);
for (int i = 0; i < msd.length; i++)
series.add(i * tScale, msd[i]);
if (msd.length > 0)
{
for (int i = 0; i < msd.length; i++)
series.add(i * tScale, msd[i]);
xyDataset.addSeries(series);
xyDataset.addSeries(series);
}
}
}
}
......@@ -122,14 +127,19 @@ public class TrackProcessorMSD extends PluginTrackManagerProcessor implements Ac
{
XYSeries series = new XYSeries("Track " + trackPool.getTrackIndex(ts));
if (ts.isAllDetectionEnabled())
// Better to allow partially clipped tracks otherwise we cannot get MSD for them (Stephane)
// TODO: check that it doesn't bring any regression
// if (ts.isAllDetectionEnabled())
{
double[] msd = scaledMeanSquaredDisplacement(null, ts);
for (int i = 0; i < msd.length; i++)
series.add(i, msd[i]);
if (msd.length > 0)
{
for (int i = 0; i < msd.length; i++)
series.add(i, msd[i]);
xyDataset.addSeries(series);
xyDataset.addSeries(series);
}
}
}
}
......@@ -203,9 +213,11 @@ public class TrackProcessorMSD extends PluginTrackManagerProcessor implements Ac
outputName = trackPool.getDisplaySequence().getFilename();
outputName += ".msd.xls";
}
else outputName = SaveDialog.chooseFileForResult("XLS MSD export", "tracks-msd", ".xls");
else
outputName = SaveDialog.chooseFileForResult("XLS MSD export", "tracks-msd", ".xls");
if (StringUtil.isEmpty(outputName)) return;
if (StringUtil.isEmpty(outputName))
return;
try
{
......@@ -229,25 +241,31 @@ public class TrackProcessorMSD extends PluginTrackManagerProcessor implements Ac
int row = 0;
for (TrackSegment ts : trackPool.getTrackSegmentList())
{
if (ts.isAllDetectionEnabled())
// Better to allow partially clipped tracks otherwise we cannot get MSD for them (Stephane)
// TODO: check that it doesn't bring any regression
// if (ts.isAllDetectionEnabled())
{
System.out.println("track " + cnt);
if (page != null)
XLSUtil.setCellString(page, 0, row, "track " + cnt);
double[] msd = scaledMeanSquaredDisplacement(seq, ts);
for (int i = 0; i < msd.length; i++)
if (msd.length > 0)
{
System.out.println((i * tScale) + "\t" + msd[i]);
// System.out.println(i + "\t" + msd[i]);
System.out.println("track " + cnt);
if (page != null)
XLSUtil.setCellNumber(page, i + 1, row, msd[i]);
}
XLSUtil.setCellString(page, 0, row, "track " + cnt);
for (int i = 0; i < msd.length; i++)
{
System.out.println((i * tScale) + "\t" + msd[i]);
// System.out.println(i + "\t" + msd[i]);
if (page != null)
XLSUtil.setCellNumber(page, i + 1, row, msd[i]);
}
cnt++;
row++;
cnt++;
row++;
}
}
}
}
......@@ -258,26 +276,30 @@ public class TrackProcessorMSD extends PluginTrackManagerProcessor implements Ac
for (TrackSegment ts : trackPool.getTrackSegmentList())
{
if (ts.isAllDetectionEnabled())
// Better to allow partially clipped tracks otherwise we cannot get MSD for them (Stephane)
// TODO: check that it doesn't bring any regression
// if (ts.isAllDetectionEnabled())
{
System.out.println("track " + cnt);
if (page != null)
XLSUtil.setCellString(page, 0, row, "track " + cnt);
double[] msd = scaledMeanSquaredDisplacement(null, ts);
// double[] msd = meanSquaredDisplacement(ts);
for (int i = 0; i < msd.length; i++)
if (msd.length > 0)
{
System.out.println(i + "\t" + msd[i]);
System.out.println("track " + cnt);
if (page != null)
XLSUtil.setCellNumber(page, i + 1, row, msd[i]);
}
XLSUtil.setCellString(page, 0, row, "track " + cnt);
for (int i = 0; i < msd.length; i++)
{
System.out.println(i + "\t" + msd[i]);
cnt++;
row++;
if (page != null)
XLSUtil.setCellNumber(page, i + 1, row, msd[i]);
}
cnt++;
row++;
}
}
}
}
......@@ -320,65 +342,96 @@ public class TrackProcessorMSD extends PluginTrackManagerProcessor implements Ac
sz = 1d;
}
int nMSD = ts.getDetectionList().size();
// double[] dt_n = new double[nMSD];
double[] msd = new double[nMSD];
final int numDetection = ts.getDetectionList().size();
int firstEnabledDetectionIndex = -1;
int numEnabledDetection = 0;
int lastFirstEnabledDetectionIndex = -1;
int lastNumEnabledDetection = 0;
for (int t = 1; t < nMSD; t++)
// Find partially enabled/clipped tracks otherwise we cannot get MSD for them (Stephane)
// TODO: check that it doesn't bring any regression
for (int i = 0; i < numDetection; i++)
{
msd[t] = 0d;
for (int j = 1; j <= t; j++)
msd[t] += scaledSquaredDistance(ts.getDetectionAt(0), ts.getDetectionAt(j), sx, sy, sz);
msd[t] /= t;
}
// for (int dt = 1; dt < nMSD; dt++)
// {
// for (int j = 0; (j + dt) < nMSD; j += dt)
// {
// msd[dt] += scaledSquaredDistance(ts.getDetectionAt(j), ts.getDetectionAt(j + dt), sx, sy, sz);
// dt_n[dt]++;
// }
// }
//
// for (int dt = 1; dt < nMSD; dt++)
// msd[dt] = (dt_n[dt] != 0) ? msd[dt] / dt_n[dt] : 0;
final Detection d = ts.getDetectionAt(i);
return msd;
}
// mean squared displacement
private double[] meanSquaredDisplacement(TrackSegment ts)
{
int nMSD = ts.getDetectionList().size();
if (d.isEnabled())
{
// start of track
if (lastFirstEnabledDetectionIndex == -1)
{
lastFirstEnabledDetectionIndex = i;
lastNumEnabledDetection = 1;
}
else
lastNumEnabledDetection++;
}
else
{
// check if last track is the longest found
if (lastNumEnabledDetection > numEnabledDetection)
{
numEnabledDetection = lastNumEnabledDetection;
firstEnabledDetectionIndex = lastFirstEnabledDetectionIndex;
}
double[] dt_n = new double[nMSD];
double[][] msd = new double[nMSD][2];
// reset track
lastFirstEnabledDetectionIndex = -1;
lastNumEnabledDetection = 0;
}
}
for (int dt = 1; dt < nMSD; dt++)
// check if last track is the longest found
if (lastNumEnabledDetection > numEnabledDetection)
{
msd[dt][0] = dt * 1;
for (int j = 0; j + dt < ts.getDetectionList().size(); j += dt)
{
msd[dt][1] += squaredDistance(ts.getDetectionAt(j), ts.getDetectionAt(j + dt));
dt_n[dt]++;
}
numEnabledDetection = lastNumEnabledDetection;
firstEnabledDetectionIndex = lastFirstEnabledDetectionIndex;
}
for (int dt = 1; dt < nMSD; dt++)
msd[dt][1] = (dt_n[dt] != 0) ? msd[dt][1] / dt_n[dt] : 0;
double[] msd = new double[numEnabledDetection];
double[] resultmsd = new double[nMSD];
resultmsd[0] = 0;
for (int dt = 1; dt < nMSD; dt++)
resultmsd[dt] = msd[dt][1];
for (int t = 1; t < numEnabledDetection; t++)
{
msd[t] = 0d;
for (int j = 1; j <= t; j++)
msd[t] += scaledSquaredDistance(ts.getDetectionAt(firstEnabledDetectionIndex), ts.getDetectionAt(firstEnabledDetectionIndex + j), sx, sy, sz);
return resultmsd;
msd[t] /= t;
}
return msd;
}
// mean squared displacement
// private double[] meanSquaredDisplacement(TrackSegment ts)
// {
// int nMSD = ts.getDetectionList().size();
//
// double[] dt_n = new double[nMSD];
// double[][] msd = new double[nMSD][2];
//
// for (int dt = 1; dt < nMSD; dt++)
// {
// msd[dt][0] = dt * 1;
//
// for (int j = 0; j + dt < ts.getDetectionList().size(); j += dt)
// {
// msd[dt][1] += squaredDistance(ts.getDetectionAt(j), ts.getDetectionAt(j + dt));
// dt_n[dt]++;
// }
// }
//
// for (int dt = 1; dt < nMSD; dt++)
// msd[dt][1] = (dt_n[dt] != 0) ? msd[dt][1] / dt_n[dt] : 0;
//
// double[] resultmsd = new double[nMSD];
// resultmsd[0] = 0;
// for (int dt = 1; dt < nMSD; dt++)
// resultmsd[dt] = msd[dt][1];
//
// return resultmsd;
//
// }
private static double squaredDistance(Detection d1, Detection d2)
{
return scaledSquaredDistance(d1, d2, 1d, 1d, 1d);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment