use of us.hebi.matlab.mat.format.Mat5 in project GDSC-SMLM by aherbert.
the class TraceExporter method exportVbSpt.
@SuppressWarnings("resource")
private void exportVbSpt(MemoryPeakResults results) {
// vbSPT file format:
// https://sourceforge.net/projects/vbspt/
// Matlab matrix file (.mat) containing at least one variable that is a cell
// array where each element, representing a trajectory, is a matrix
// where the rows define the coordinates in one, two or three dimensions
// in subsequent timesteps. The number of dimensions to be used for the
// analysis will be set by the runinputfile.
// The units are arbitrary but vbSPT starting estimates must be in the same
// units. Either nm or μm are recommended.
// 3 columns for n rows of localisations
// 1. x coordinate (μm)
// 2. y coordinate (μm)
// 3. z coordinate (μm)
//
// Note: An extra column is added containing the frame. This allows results to
// be uniquely identified using frame,x,y,z
// Count the IDs. Each new result ID will increment the count.
final FrameCounter idCounter = new FrameCounter(results.getFirst().getId() - 1);
results.forEach((PeakResultProcedure) result -> {
if (idCounter.advance(result.getId())) {
idCounter.increment();
}
});
// Create the cell array as 1xN
final Cell out = Mat5.newCell(1, idCounter.getCount());
// This will reset the counter to zero and ensure the current frame does not match
// in the event of a single track
idCounter.advanceAndReset(idCounter.currentFrame() + 1);
final boolean is3d = results.is3D();
// Write the tracks
final LocalList<double[]> list = new LocalList<>();
results.forEach(DistanceUnit.UM, (XyzrResultProcedure) (x, y, z, result) -> {
if (idCounter.advance(result.getId())) {
addTrack(out, idCounter.getCount() - 1, list, is3d);
idCounter.increment();
list.clear();
}
list.add(new double[] { x, y, z, result.getFrame() });
});
addTrack(out, idCounter.getCount() - 1, list, is3d);
try (MatFile matFile = Mat5.newMatFile()) {
matFile.addArray("tracks", out);
Mat5.writeToFile(matFile, Paths.get(settings.directory, results.getName() + ".mat").toFile());
} catch (final IOException ex) {
handleException(ex);
}
}
use of us.hebi.matlab.mat.format.Mat5 in project GDSC-SMLM by aherbert.
the class TraceExporter method exportAnaDda.
@SuppressWarnings("resource")
private void exportAnaDda(MemoryPeakResults results) {
// anaDDA list of tracked localisations file format:
// https://github.com/HohlbeinLab/anaDDA
// Matlab matrix file.
// 5 columns for n rows of localisations
// 1. x coordinate (μm)
// 2. y coordinate (μm)
// 3. frame number
// 4. track id
// 5. frame time (s)
// Count the number of localisations including start/end frames
final Counter row = new Counter();
results.forEach((PeakResultProcedure) result -> {
row.increment(getLength(result));
});
// Create the matrix
final int rows = row.getCount();
final Matrix out = Mat5.newMatrix(rows, 5);
// Set up column offsets
final int col1 = rows * 1;
final int col2 = rows * 2;
final int col3 = rows * 3;
final int col4 = rows * 4;
// Frame time in seconds. This is not the frame time point converted to seconds
// but the exposure duration of the frame.
final double frameTime = results.getCalibrationReader().getExposureTime() / 1000;
row.reset();
results.forEach(DistanceUnit.UM, (XyrResultProcedure) (x, y, result) -> {
if (result.hasEndFrame()) {
for (int t = result.getFrame(); t <= result.getEndFrame(); t++) {
final int index = row.getAndIncrement();
out.setDouble(index, x);
out.setDouble(index + col1, y);
out.setDouble(index + col2, t);
out.setDouble(index + col3, result.getId());
out.setDouble(index + col4, frameTime);
}
} else {
// Column major index: row + rows * col
final int index = row.getAndIncrement();
out.setDouble(index, x);
out.setDouble(index + col1, y);
out.setDouble(index + col2, result.getFrame());
out.setDouble(index + col3, result.getId());
out.setDouble(index + col4, frameTime);
}
});
try (MatFile matFile = Mat5.newMatFile()) {
matFile.addArray("tracks", out);
Mat5.writeToFile(matFile, Paths.get(settings.directory, results.getName() + ".mat").toFile());
} catch (final IOException ex) {
handleException(ex);
}
}
Aggregations