Author: [log in to unmask] Date: Fri Dec 19 20:49:16 2014 New Revision: 3468 Log: Add setter for log level. Modified: projects/lcsim/trunk/event-processing/src/main/java/org/lcsim/util/Driver.java Modified: projects/lcsim/trunk/event-processing/src/main/java/org/lcsim/util/Driver.java ============================================================================= --- projects/lcsim/trunk/event-processing/src/main/java/org/lcsim/util/Driver.java (original) +++ projects/lcsim/trunk/event-processing/src/main/java/org/lcsim/util/Driver.java Fri Dec 19 20:49:16 2014 @@ -16,367 +16,347 @@ import org.lcsim.geometry.Detector; /** - * A driver is a steering routine which can deal with event processing, and/or - * call any number of child drivers. When used as a child driver all parameters such as - * histogramLevel and logger are inherited from the parent driver. + * A driver is a steering routine which can deal with event processing, and/or call any number of child drivers. When used as a child driver all parameters such as histogramLevel and logger are + * inherited from the parent driver. * <p> - * It also allows controlling the histogram level of the processors being called - * and handles coordination of random numbers between Monte Carlo processors. + * It also allows controlling the histogram level of the processors being called and handles coordination of random numbers between Monte Carlo processors. * * @author Tony Johnson * @version $Id: Driver.java,v 1.14 2007/09/11 00:21:00 tonyj Exp $ */ -public class Driver -{ - // We dont use an enum, because we want to be able to test for level>some value. - // and because drivers can use special values for special purposes. - public final static int HLEVEL_DEFAULT = -1; - public final static int HLEVEL_OFF = 0; - public final static int HLEVEL_NORMAL=1; - public final static int HLEVEL_HIGH=3; - public final static int HLEVEL_FULL=5; - - private static Driver mother = new MotherOfAllDrivers(); - private final List<Driver> subDrivers = new ArrayList<Driver>(); - private Driver parent = mother; - private int histogramLevel = HLEVEL_DEFAULT; - private Random random; - private final String driverName; - private int nEvents; - private long nNanos; - - /** Creates a driver - */ - public Driver() - { - this(null); - } - - Driver(String name) - { - if (name == null || name.length() == 0) - { - String id = getClass().getName(); - int pos = id.lastIndexOf('.'); - driverName = id.substring(pos < 0 ? 0 : pos+1); - } - else - { - driverName = name; - } - } - - /** - * Add a sub-Driver to this Driver. Sub-drivers are automatically - * called from the process method. - * @param driver The Driver to be added - */ - public void add(Driver driver) - { - subDrivers.add(driver); - driver.parent = this; - } - /** - * Removes a sub-Driver from this Driver - * @param driver The Driver to be removed - */ - public void remove(Driver driver) - { - subDrivers.remove(driver); - driver.parent = mother; - } - /** - * Returns a List of all the drivers added to this Driver - */ - public List<Driver> drivers() - { - return subDrivers; - } - /** - * Tests to see if a given Driver is already a child of this Driver - * @param driver Driver to be checked - */ - public boolean contains(Driver driver) - { - return subDrivers.contains(driver); - } - /** - * Returns a logger for logging diagnostic messages from this driver - */ - public Logger getLogger() - { - return Logger.getLogger(pathToMother()); - } - - /** - * Get the name of this driver. Normally this will be the class name of the - * driver (without the packaging information). - */ - public String getName() - { - return driverName; - } - - String pathToMother() - { - return parent.pathToMother() + "." + driverName; - } - - /** - * Get the default histogram level for this driver - */ - public int getHistogramLevel() - { - return histogramLevel <= HLEVEL_DEFAULT ? parent.getHistogramLevel() : histogramLevel; - } - /** - * Set the histogram level for this driver (and its child drivers) - */ - public void setHistogramLevel(int level) - { - histogramLevel = level; - } - - public ConditionsManager getConditionsManager() - { - return parent.getConditionsManager(); - } - - /** - * Called by the framework when event processing is suspended. - */ - protected void suspend() - { - for (Driver driver : subDrivers) driver.suspend(); - } - /** - * Called by the framework when event processing is resumed. - */ - protected void resume() - { - for (Driver driver : subDrivers) driver.resume(); - } - /** - * Called when all data processing is finished. - */ - protected void endOfData() - { - for (Driver driver : subDrivers) driver.endOfData(); - } - /** - * Called before the first event is processed, or after a rewind. - */ - protected void startOfData() - { - for (Driver driver : subDrivers) driver.startOfData(); - } - - /** Called by the framework before process method when the detector geometry changes. - * This method is gauranteed to be called once before the first call to process. - * @param Detector The new detector - */ - protected void detectorChanged(Detector detector) - { - for (Driver driver : subDrivers) driver.detectorChanged(detector); - } - /** - * Called by the framework to process an event. Don't forget to call - * <code>super.process(event)</code> to cause the child processes to - * be executed. In addition the process event can call throw some special - * exceptions: - * <ul> - * <li>NextEventException - aborts further processing of this event</li> - * <li>StopRunException - causes event processing to be stopped</li> - * </ul> - * @param event The event to be processed - * @see Driver.NextEventException - * @see Driver.AbortRunException - */ - protected void process(EventHeader event) - { - processChildren(event); - } - /** - * Clear statistics - */ - public void clearStatistics() - { - nEvents = 0; - nNanos = 0; - } - /** - * Print statistics for this driver and its children - */ - public void printStatistics(PrintStream out) - { - printStatistics(out,0,0); - } - private void printStatistics(PrintStream out, int indent, long parentNanos) - { - printStatisticsLine(out,indent,getName(), nEvents, nNanos, parentNanos); - if (!subDrivers.isEmpty()) - { - int nIndent = indent+1; - long self = nNanos; - for (Driver driver : subDrivers) - { - driver.printStatistics(out,nIndent,nNanos); - self -= driver.nNanos; - } - printStatisticsLine(out,nIndent,"*self", nEvents, self, nNanos); - } - } - private static void printStatisticsLine(PrintStream out, int indent, String name, int nEvents, long time, long parentTime) - { - out.print(formatName(indent, name, 40)); - out.print(' '); - out.print(nEvents); - out.print(' '); - out.printf(formatTime(time)); - if (parentTime > 0) - { - out.print(' '); - out.printf("%3.1f",100.*time/parentTime); - out.print('%'); - } - out.println(); - } - private static String formatName(int indent, String name, int width) - { - StringBuilder builder = new StringBuilder(); - for (int i=0; i<indent; i++) builder.append(" "); - builder.append(name); - if (builder.length() > width) builder.setLength(width); - else for (int i=builder.length(); i<width; i++) builder.append(' '); - return builder.toString(); - } - private static String formatTime(long nanos) - { - String unit = "ms"; - double time = nanos/1000000.; - if (time > 1000) - { - time /= 1000; - unit = "s"; - } - java.util.Formatter formatter = new java.util.Formatter(); - formatter.format("%3.3g",time); - formatter.format("%s",unit); - return formatter.toString(); - } - - void doProcess(EventHeader event) - { - nEvents++; - long start = System.nanoTime(); - process(event); - long stop = System.nanoTime(); - nNanos += (stop-start); - } - /** - * Calls the sub-Drivers process() method. - * <b>Note:</b> This method is only public so that it can be called from - * Jython, see LCSIM-30 - */ - public void processChildren(EventHeader event) - { - for (Driver driver : subDrivers) driver.doProcess(event); - } - public Random getRandom() - { - return random == null ? parent.getRandom() : random; - } - /** Set default random number generator for this driver and all child drivers. - * @param random The random number generator, or <code>null</code> to reset to default - */ - public void setRandom(Random random) - { - this.random = random; - } - - - // The only driver that does not have a parent - // This is used to set defaults for "inherited" items - private static class MotherOfAllDrivers extends Driver - { - private Random random = new Random(); - MotherOfAllDrivers() - { - super("TOP"); - StreamHandler handler = new StreamHandler(System.out,new DriverFormatter()); - handler.setLevel(Level.ALL); - getLogger().setUseParentHandlers(false); - getLogger().addHandler(handler); - getLogger().setLevel(Level.WARNING); - } - - public Random getRandom() - { - return random; - } - public int getHistogramLevel() - { - return 0; - } - public ConditionsManager getConditionsManager() - { - return ConditionsManager.defaultInstance(); - } - String pathToMother() - { - return getName(); - } - } - private static class DriverFormatter extends Formatter - { - public synchronized String format(LogRecord record) - { - StringBuilder sb = new StringBuilder(); - sb.append(record.getLoggerName().substring("TOP".length()+1)); - sb.append(": "); - sb.append(record.getLevel().getLocalizedName()); - sb.append(": "); - sb.append(formatMessage(record)); - sb.append('\n'); - if (record.getThrown() != null) - { - try - { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - record.getThrown().printStackTrace(pw); - pw.close(); - sb.append(sw.toString()); +public class Driver { + // We dont use an enum, because we want to be able to test for level>some value. + // and because drivers can use special values for special purposes. + public final static int HLEVEL_DEFAULT = -1; + public final static int HLEVEL_OFF = 0; + public final static int HLEVEL_NORMAL = 1; + public final static int HLEVEL_HIGH = 3; + public final static int HLEVEL_FULL = 5; + + private static Driver mother = new MotherOfAllDrivers(); + private final List<Driver> subDrivers = new ArrayList<Driver>(); + private Driver parent = mother; + private int histogramLevel = HLEVEL_DEFAULT; + private Random random; + private final String driverName; + private int nEvents; + private long nNanos; + + /** + * Creates a driver + */ + public Driver() { + this(null); + } + + Driver(String name) { + if (name == null || name.length() == 0) { + String id = getClass().getName(); + int pos = id.lastIndexOf('.'); + driverName = id.substring(pos < 0 ? 0 : pos + 1); + } else { + driverName = name; + } + } + + /** + * Add a sub-Driver to this Driver. Sub-drivers are automatically called from the process method. + * @param driver The Driver to be added + */ + public void add(Driver driver) { + subDrivers.add(driver); + driver.parent = this; + } + + /** + * Removes a sub-Driver from this Driver + * @param driver The Driver to be removed + */ + public void remove(Driver driver) { + subDrivers.remove(driver); + driver.parent = mother; + } + + /** + * Returns a List of all the drivers added to this Driver + */ + public List<Driver> drivers() { + return subDrivers; + } + + /** + * Tests to see if a given Driver is already a child of this Driver + * @param driver Driver to be checked + */ + public boolean contains(Driver driver) { + return subDrivers.contains(driver); + } + + /** + * Returns a logger for logging diagnostic messages from this driver + */ + public Logger getLogger() { + return Logger.getLogger(pathToMother()); + } + + /** + * Get the name of this driver. Normally this will be the class name of the driver (without the packaging information). + */ + public String getName() { + return driverName; + } + + String pathToMother() { + return parent.pathToMother() + "." + driverName; + } + + /** + * Get the default histogram level for this driver + */ + public int getHistogramLevel() { + return histogramLevel <= HLEVEL_DEFAULT ? parent.getHistogramLevel() : histogramLevel; + } + + /** + * Set the histogram level for this driver (and its child drivers) + */ + public void setHistogramLevel(int level) { + histogramLevel = level; + } + + public ConditionsManager getConditionsManager() { + return parent.getConditionsManager(); + } + + /** + * Called by the framework when event processing is suspended. + */ + protected void suspend() { + for (Driver driver : subDrivers) + driver.suspend(); + } + + /** + * Called by the framework when event processing is resumed. + */ + protected void resume() { + for (Driver driver : subDrivers) + driver.resume(); + } + + /** + * Called when all data processing is finished. + */ + protected void endOfData() { + for (Driver driver : subDrivers) + driver.endOfData(); + } + + /** + * Called before the first event is processed, or after a rewind. + */ + protected void startOfData() { + for (Driver driver : subDrivers) + driver.startOfData(); + } + + /** + * Called by the framework before process method when the detector geometry changes. This method is gauranteed to be called once before the first call to process. + * + * @param Detector The new detector + */ + protected void detectorChanged(Detector detector) { + for (Driver driver : subDrivers) + driver.detectorChanged(detector); + } + + /** + * Called by the framework to process an event. Don't forget to call <code>super.process(event)</code> to cause the child processes to be executed. In addition the process event can call throw + * some special exceptions: + * <ul> + * <li>NextEventException - aborts further processing of this event</li> + * <li>StopRunException - causes event processing to be stopped</li> + * </ul> + * + * @param event The event to be processed + * @see Driver.NextEventException + * @see Driver.AbortRunException + */ + protected void process(EventHeader event) { + processChildren(event); + } + + /** + * Clear statistics + */ + public void clearStatistics() { + nEvents = 0; + nNanos = 0; + } + + /** + * Print statistics for this driver and its children + */ + public void printStatistics(PrintStream out) { + printStatistics(out, 0, 0); + } + + private void printStatistics(PrintStream out, int indent, long parentNanos) { + printStatisticsLine(out, indent, getName(), nEvents, nNanos, parentNanos); + if (!subDrivers.isEmpty()) { + int nIndent = indent + 1; + long self = nNanos; + for (Driver driver : subDrivers) { + driver.printStatistics(out, nIndent, nNanos); + self -= driver.nNanos; } - catch (Exception ex) - { + printStatisticsLine(out, nIndent, "*self", nEvents, self, nNanos); + } + } + + private static void printStatisticsLine(PrintStream out, int indent, String name, int nEvents, long time, long parentTime) { + out.print(formatName(indent, name, 40)); + out.print(' '); + out.print(nEvents); + out.print(' '); + out.printf(formatTime(time)); + if (parentTime > 0) { + out.print(' '); + out.printf("%3.1f", 100. * time / parentTime); + out.print('%'); + } + out.println(); + } + + private static String formatName(int indent, String name, int width) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < indent; i++) + builder.append(" "); + builder.append(name); + if (builder.length() > width) + builder.setLength(width); + else + for (int i = builder.length(); i < width; i++) + builder.append(' '); + return builder.toString(); + } + + private static String formatTime(long nanos) { + String unit = "ms"; + double time = nanos / 1000000.; + if (time > 1000) { + time /= 1000; + unit = "s"; + } + java.util.Formatter formatter = new java.util.Formatter(); + formatter.format("%3.3g", time); + formatter.format("%s", unit); + return formatter.toString(); + } + + void doProcess(EventHeader event) { + nEvents++; + long start = System.nanoTime(); + process(event); + long stop = System.nanoTime(); + nNanos += (stop - start); + } + + /** + * Calls the sub-Drivers process() method. <b>Note:</b> This method is only public so that it can be called from Jython, see LCSIM-30 + */ + public void processChildren(EventHeader event) { + for (Driver driver : subDrivers) + driver.doProcess(event); + } + + public Random getRandom() { + return random == null ? parent.getRandom() : random; + } + + /** + * Set default random number generator for this driver and all child drivers. + * + * @param random The random number generator, or <code>null</code> to reset to default + */ + public void setRandom(Random random) { + this.random = random; + } + + public void setLogLevel(String logLevel) { + this.getLogger().setLevel(Level.parse(logLevel)); + } + + // The only driver that does not have a parent + // This is used to set defaults for "inherited" items + private static class MotherOfAllDrivers extends Driver { + private Random random = new Random(); + + MotherOfAllDrivers() { + super("TOP"); + StreamHandler handler = new StreamHandler(System.out, new DriverFormatter()); + handler.setLevel(Level.ALL); + getLogger().setUseParentHandlers(false); + getLogger().addHandler(handler); + getLogger().setLevel(Level.WARNING); + } + + public Random getRandom() { + return random; + } + + public int getHistogramLevel() { + return 0; + } + + public ConditionsManager getConditionsManager() { + return ConditionsManager.defaultInstance(); + } + + String pathToMother() { + return getName(); + } + } + + private static class DriverFormatter extends Formatter { + public synchronized String format(LogRecord record) { + StringBuilder sb = new StringBuilder(); + sb.append(record.getLoggerName().substring("TOP".length() + 1)); + sb.append(": "); + sb.append(record.getLevel().getLocalizedName()); + sb.append(": "); + sb.append(formatMessage(record)); + sb.append('\n'); + if (record.getThrown() != null) { + try { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + record.getThrown().printStackTrace(pw); + pw.close(); + sb.append(sw.toString()); + } catch (Exception ex) { + } } - } - return sb.toString(); - } - } - /** - * If thrown during the process method of a driver, causes - * processing of the current event to be aborted. Event procssing skips - * immediately to the next event. - */ - public static class NextEventException extends RuntimeException - { - public NextEventException() - { - super("Next Event"); - } - } - /** - * If thrown during the process method of a driver, causes - * processing of events to be aborted. - */ - public static class AbortRunException extends RuntimeException - { - public AbortRunException() - { - super("Abort Run"); - } - } + return sb.toString(); + } + } + + /** + * If thrown during the process method of a driver, causes processing of the current event to be aborted. Event procssing skips immediately to the next event. + */ + public static class NextEventException extends RuntimeException { + public NextEventException() { + super("Next Event"); + } + } + + /** + * If thrown during the process method of a driver, causes processing of events to be aborted. + */ + public static class AbortRunException extends RuntimeException { + public AbortRunException() { + super("Abort Run"); + } + } } ######################################################################## Use REPLY-ALL to reply to list To unsubscribe from the LCDET-SVN list, click the following link: https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1