package edu.harvard.mcb.leschziner.test;
import java.io.IOException;
import edu.harvard.mcb.leschziner.classify.PCAClassifier;
import edu.harvard.mcb.leschziner.core.Particle;
import edu.harvard.mcb.leschziner.load.ImageDownloader;
import edu.harvard.mcb.leschziner.particlefilter.Binner;
import edu.harvard.mcb.leschziner.particlefilter.CircularMask;
import edu.harvard.mcb.leschziner.particlefilter.Cropper;
import edu.harvard.mcb.leschziner.particlefilter.LowPassFilter;
import edu.harvard.mcb.leschziner.particlegenerator.RotationGenerator;
import edu.harvard.mcb.leschziner.particlesource.DoGParticlePicker;
import edu.harvard.mcb.leschziner.pipe.ParticleFilteringPipe;
import edu.harvard.mcb.leschziner.pipe.ParticleGeneratingPipe;
public class TestPipeline {
public static final int POLL_RATE = 2000; // ms
private static ImageDownloader loader;
private static DoGParticlePicker picker;
private static ParticleFilteringPipe processor;
private static ParticleGeneratingPipe generator;
private static PCAClassifier classifier;
/**
* @param args
*/
public static void main(String[] args) {
try {
// Setup the pipeline
initPipeline();
// Wait for the particles to be picked, processed, and finally
// classified.
awaitCompletion();
classifyParticles();
// Get the class averages and write them to files
writeClassAverages();
System.out.println("[Main]: Complete");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void initPipeline() throws IOException {
System.out.println("[Main]: Preparing pipeline");
// Setup the image Loader
loader = new ImageDownloader();
// Setup the Particle picker
picker = new DoGParticlePicker(80, 20, 45, 71, 120, 200);
generator = new ParticleGeneratingPipe();
// Setup some particle generators
generator.addStage(new RotationGenerator(90));
// generator.addStage(new ShiftGenerator(6, 6));
// Setup a pipe full of filters to be applied to picked particles
processor = new ParticleFilteringPipe();
processor.addStage(new CircularMask(80));
processor.addStage(new LowPassFilter(3));
processor.addStage(new Cropper(160, 20, 20));
processor.addStage(new Binner(2));
// Setup a classifier to sort the picked, filtered particles
classifier = new PCAClassifier(12, 8, .001);
// Attach the picker to the loader
picker.addParticleSource(loader);
// Attach the generator to the picker
generator.addParticleSource(picker);
// Attach the processing pipe to the particle generator
processor.addParticleSource(generator);
// Have the classifier get particles from the processing pipe
classifier.addParticleSource(processor);
System.out.println("[Main]: Loading Images");
loader.addImagePath("http://www.filepicker.io/api/file/JIHhJ1NSR9SqOe2bAIGt");
loader.start();
}
private static void awaitCompletion() {
// Keep track of the last pending count to calculate rate
long lastPick = 1;
long lastProcessed = 1;
long lastClassfied = 1;
long prevUnpicked = 0;
long prevUnprocessed = 0;
long prevUnclassified = 0;
do {
long currentUnpicked = picker.getPendingCount();
long currentUnprocessed = processor.getPendingCount();
long currentUnclassified = classifier.getPendingCount();
// Log pending
System.out.println("[Main]: "
+ currentUnpicked
+ " micrographs, "
+ currentUnprocessed
+ " unprocessed particles, and "
+ currentUnclassified
+ " unclassified particles");
// Log rate
if (prevUnpicked > currentUnpicked) {
System.out.println("[Main]: Picking at "
+ (.001 * lastPick / (prevUnpicked - currentUnpicked))
+ " s/micrograph");
lastPick = POLL_RATE;
} else {
lastPick += POLL_RATE;
}
if (prevUnprocessed > currentUnprocessed) {
System.out.println("[Main]: Processing at "
+ (.001 * lastProcessed / (prevUnprocessed - currentUnprocessed))
+ " s/particle");
lastProcessed = POLL_RATE;
} else {
lastProcessed += POLL_RATE;
}
if (prevUnclassified > currentUnclassified) {
System.out.println("[Main]: Classifying at "
+ (.001 * lastClassfied / (prevUnclassified - currentUnclassified))
+ " s/particle");
lastClassfied = POLL_RATE;
} else {
lastClassfied += POLL_RATE;
}
prevUnpicked = currentUnpicked;
prevUnprocessed = currentUnprocessed;
prevUnclassified = currentUnclassified;
try {
Thread.sleep(POLL_RATE);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (loader.isActive()
|| picker.isActive()
|| processor.isActive()
|| generator.isActive()
|| classifier.isActive());
}
private static void classifyParticles() {
System.out.println("[Main]: "
+ classifier.getParticlesConsumed()
+ " particles consumed");
System.out.println("[Main]: Classifying...");
long startTime = System.currentTimeMillis();
// Execute the Mass Classification
classifier.classifyAll();
long runTime = System.currentTimeMillis() - startTime;
System.out.println("[Main]: Completed Classification in "
+ (runTime / 1000.0)
+ " s");
}
private static void writeClassAverages() throws IOException {
System.out.println("[Main]: Writing Class Averages");
for (long classId : classifier.getClassIds()) {
Particle average = classifier.getClassAverage(classId);
if (average != null) {
int matches = classifier.getClass(classId).size();
System.out.println("[Main]: Writing "
+ classId
+ " with "
+ matches
+ " matches");
average.toFile("processed/avg"
+ classId
+ "_"
+ matches
+ ".png");
}
}
}
}