use of uk.ac.sussex.gdsc.core.utils.DoubleRollingArray in project GDSC-SMLM by aherbert.
the class DiffusionRateTest method msdAnalysis.
/**
* Tabulate the observed MSD for different jump distances.
*
* @param points the points
*/
private void msdAnalysis(ArrayList<Point> points) {
if (myMsdAnalysisSteps == 0) {
return;
}
IJ.showStatus("MSD analysis ...");
IJ.showProgress(1, myMsdAnalysisSteps);
// This will only be fast if the list is an array
final Point[] list = points.toArray(new Point[0]);
// Compute the base MSD
final Point origin = new Point(0, 0, 0);
double sum = origin.distance2(list[0]);
int count = 1;
for (int i = 1; i < list.length; i++) {
final Point last = list[i - 1];
final Point current = list[i];
if (last.id == current.id) {
sum += last.distance2(current);
} else {
sum += origin.distance2(current);
}
count++;
}
// Create a new set of points that have coordinates that
// are the rolling average over the number of aggregate steps
final DoubleRollingArray x = new DoubleRollingArray(pluginSettings.aggregateSteps);
final DoubleRollingArray y = new DoubleRollingArray(pluginSettings.aggregateSteps);
int id = 0;
int length = 0;
for (final Point p : points) {
if (p.id != id) {
x.clear();
y.clear();
}
id = p.id;
x.add(p.x);
y.add(p.y);
// Only create a point if the full aggregation size is reached
if (x.isFull()) {
list[length++] = new Point(id, x.getAverage(), y.getAverage());
}
}
// Q - is this useful?
final double p = myPrecision / settings.getPixelPitch();
final UniformRandomProvider rng = UniformRandomProviders.create();
final NormalizedGaussianSampler gauss = SamplerUtils.createNormalizedGaussianSampler(rng);
final int totalSteps = (int) Math.ceil(settings.getSeconds() * settings.getStepsPerSecond() - pluginSettings.aggregateSteps);
final int limit = Math.min(totalSteps, myMsdAnalysisSteps);
final Ticker ticker = ImageJUtils.createTicker(limit, 1);
final TextWindow msdTable = createMsdTable((sum / count) * settings.getStepsPerSecond() / conversionFactor);
try (BufferedTextWindow bw = new BufferedTextWindow(msdTable)) {
bw.setIncrement(0);
for (int step = 1; step <= myMsdAnalysisSteps; step++) {
sum = 0;
count = 0;
for (int i = step; i < length; i++) {
final Point last = list[i - step];
final Point current = list[i];
if (last.id == current.id) {
if (p == 0) {
sum += last.distance2(current);
count++;
} else {
// is the same if enough samples are present
for (int ii = 1; ii-- > 0; ) {
sum += last.distance2(current, p, gauss);
count++;
}
}
}
}
if (count == 0) {
break;
}
bw.append(addResult(step, sum, count));
ticker.tick();
}
}
IJ.showProgress(1);
}
Aggregations