diff --git a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java index 737a46ba1..6f527b121 100644 --- a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java +++ b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/arguments/GATKArgumentCollection.java @@ -52,6 +52,9 @@ public class GATKArgumentCollection { // the default value of the stop of the expanded window public static final int DEFAULT_REFERENCE_WINDOW_STOP = 0; + // the default time in seconds between progress meter calls + public final static long DEFAULT_SECONDS_BETWEEN_PROGRESS_UPDATES = 10; + /** the constructor */ public GATKArgumentCollection() { } @@ -354,6 +357,10 @@ public class GATKArgumentCollection { @Argument(fullName = "globalQScorePrior", shortName = "globalQScorePrior", doc = "Global Qscore Bayesian prior to use for BQSR", required = false) public double globalQScorePrior = -1.0; + @Advanced + @Argument(fullName="secondsBetweenProgressUpdates", shortName = "secondsBetweenProgressUpdates", doc = "Time interval for process meter information output (in seconds)", required=false) + public long secondsBetweenProgressUpdates = DEFAULT_SECONDS_BETWEEN_PROGRESS_UPDATES; + // -------------------------------------------------------------------------------------------------------------- // diff --git a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/executive/MicroScheduler.java b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/executive/MicroScheduler.java index e40edb760..5da39245e 100644 --- a/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/executive/MicroScheduler.java +++ b/public/gatk-engine/src/main/java/org/broadinstitute/gatk/engine/executive/MicroScheduler.java @@ -204,7 +204,8 @@ public abstract class MicroScheduler implements MicroSchedulerMBean { // Create the progress meter, and register it with the analysis engine engine.registerProgressMeter(new ProgressMeter(progressLogFile, availableTraversalEngines.peek().getTraversalUnits(), - engine.getRegionsOfGenomeBeingProcessed())); + engine.getRegionsOfGenomeBeingProcessed(), + engine.getArguments().secondsBetweenProgressUpdates)); // Now that we have a progress meter, go through and initialize the traversal engines for ( final TraversalEngine traversalEngine : allCreatedTraversalEngines ) diff --git a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeter.java b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeter.java index b68a5b9e0..b2fdbb8bc 100644 --- a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeter.java +++ b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeter.java @@ -170,22 +170,15 @@ public class ProgressMeter { /** * Create a new ProgressMeter * - * Note that progress meter isn't started until the client calls start() - * * @param performanceLogFile an optional performance log file where a table of performance logs will be written * @param processingUnitName the name of the unit type being processed, suitable for saying X seconds per processingUnitName * @param processingIntervals the intervals being processed + * @param secondsBetweenProgressUpdates how frequently (in seconds) to print progress */ public ProgressMeter(final File performanceLogFile, - final String processingUnitName, - final GenomeLocSortedSet processingIntervals) { - this(performanceLogFile, processingUnitName, processingIntervals, ProgressMeterDaemon.DEFAULT_POLL_FREQUENCY_MILLISECONDS); - } - - protected ProgressMeter(final File performanceLogFile, final String processingUnitName, final GenomeLocSortedSet processingIntervals, - final long pollingFrequency) { + final long secondsBetweenProgressUpdates) { if ( processingUnitName == null ) throw new IllegalArgumentException("processingUnitName cannot be null"); if ( processingIntervals == null ) throw new IllegalArgumentException("Target intervals cannot be null"); @@ -212,7 +205,7 @@ public class ProgressMeter { targetSizeInBP = processingIntervals.coveredSize(); // start up the timer - progressMeterDaemon = new ProgressMeterDaemon(this, pollingFrequency); + progressMeterDaemon = new ProgressMeterDaemon(this, secondsBetweenProgressUpdates); } public ProgressMeterDaemon getProgressMeterDaemon() { diff --git a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeterDaemon.java b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeterDaemon.java index eb18cb16c..6eb4d0954 100644 --- a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeterDaemon.java +++ b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/progressmeter/ProgressMeterDaemon.java @@ -25,6 +25,8 @@ package org.broadinstitute.gatk.utils.progressmeter; +import java.util.concurrent.TimeUnit; + /** * Daemon thread that periodically prints the progress of the progress meter * @@ -33,20 +35,10 @@ package org.broadinstitute.gatk.utils.progressmeter; * Time: 9:16 PM */ public final class ProgressMeterDaemon extends Thread { - public final static long DEFAULT_POLL_FREQUENCY_MILLISECONDS = 10 * 1000; - /** * How frequently should we poll and print progress? */ - private final long pollFrequencyMilliseconds; - - /** - * How long are we waiting between print progress calls are issued? - * @return the time in milliseconds between progress meter calls - */ - private long getPollFrequencyMilliseconds() { - return pollFrequencyMilliseconds; - } + private final long secondsBetweenProgressUpdates; /** * Are we to continue periodically printing status, or should we shut down? @@ -60,22 +52,19 @@ public final class ProgressMeterDaemon extends Thread { /** * Create a new ProgressMeterDaemon printing progress for meter - * @param meter the progress meter to print progress of + * @param meter the progress meter to print progress + * @param secondsBetweenProgressUpdates how frequently (in seconds) to print progress */ - public ProgressMeterDaemon(final ProgressMeter meter, final long pollFrequencyMilliseconds) { + public ProgressMeterDaemon(final ProgressMeter meter, final long secondsBetweenProgressUpdates) { if ( meter == null ) throw new IllegalArgumentException("meter cannot be null"); - if ( pollFrequencyMilliseconds <= 0 ) throw new IllegalArgumentException("pollFrequencyMilliseconds must be greater than 0 but got " + pollFrequencyMilliseconds); + if ( secondsBetweenProgressUpdates <= 0 ) throw new IllegalArgumentException("secondsBetweenProgressUpdates must be greater than 0 but got " + secondsBetweenProgressUpdates); this.meter = meter; - this.pollFrequencyMilliseconds = pollFrequencyMilliseconds; + this.secondsBetweenProgressUpdates = secondsBetweenProgressUpdates; setDaemon(true); setName("ProgressMeterDaemon"); } - public ProgressMeterDaemon(final ProgressMeter meter) { - this(meter, DEFAULT_POLL_FREQUENCY_MILLISECONDS); - } - /** * Tells this daemon thread to shutdown at the next opportunity, as the progress * metering is complete. @@ -102,7 +91,7 @@ public final class ProgressMeterDaemon extends Thread { meter.printProgress(false); meter.updateElapsedTimeInNanoseconds(); try { - Thread.sleep(getPollFrequencyMilliseconds()); + Thread.sleep(TimeUnit.SECONDS.toMillis(secondsBetweenProgressUpdates)); } catch (InterruptedException e) { throw new RuntimeException(e); }