package edu.harvard.mcb.leschziner.particlesource; import java.awt.Rectangle; import java.util.concurrent.BlockingQueue; import edu.harvard.mcb.leschziner.analyze.BlobExtractor; import edu.harvard.mcb.leschziner.core.Particle; import edu.harvard.mcb.leschziner.core.ParticleFilter; import edu.harvard.mcb.leschziner.storage.DefaultStorageEngine; public class DoGPickingTask extends DistributedPickingTask { /** * */ private static final long serialVersionUID = 1262983259390203636L; private final ParticleFilter lowFilter; private final ParticleFilter highFilter; private final ParticleFilter thresholdFilter; private final BlobExtractor blobExtractor; public DoGPickingTask(Particle target, ParticleFilter lowFilter, ParticleFilter highFilter, ParticleFilter thresholdFilter, BlobExtractor blobExtractor, int boxSize, String particleQueueName, String executorName) { super(target, boxSize, particleQueueName, executorName); this.lowFilter = lowFilter; this.highFilter = highFilter; this.thresholdFilter = thresholdFilter; this.blobExtractor = blobExtractor; } @Override public void process() { outputCount = 0; BlockingQueue<Particle> particleQueue = DefaultStorageEngine.getStorageEngine() .getQueue(particleQueueName); System.out.println("[" + this + "]: Picking particles from " + target.getSourceId()); // Filter the image with each gaussian and then the threshold Particle lowFiltered = lowFilter.filter(target); Particle highFiltered = highFilter.filter(lowFiltered); // Particle subtracted = Particle.subtract(lowFiltered, highFiltered); Particle thresholded = thresholdFilter.filter(highFiltered); // Debug visualization // Find Blobs Rectangle[] blobs = blobExtractor.extract(thresholded); System.out.println("[DoGParticleSource]: Extracted " + blobs.length + " blobs from " + target.hashCode()); // Extract Particles from target micrograph // Pad the particles with a box double padding = boxSize / 2.0; for (Rectangle boundingBox : blobs) { // Check that we can actually extract this particle (Bounds) int xOffset = (int) (boundingBox.getCenterX() - padding); int yOffset = (int) (boundingBox.getCenterY() - padding); if (xOffset + boxSize < target.getSize() && yOffset + boxSize < target.getSize() && xOffset > 0 && yOffset > 0) { Particle extracted = target.subParticle(xOffset, yOffset, boxSize); // Queue the particle particleQueue.add(extracted); outputCount += 1; // Mark completed } } } }