Print

Print


Author: [log in to unmask]
Date: Fri Jun  5 18:29:41 2015
New Revision: 3105

Log:
Add option for running extra EVIO processor classes.

Modified:
    java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java

Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java	Fri Jun  5 18:29:41 2015
@@ -6,9 +6,11 @@
 import java.nio.file.Files;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -18,6 +20,7 @@
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.PosixParser;
+import org.hps.record.evio.EvioEventProcessor;
 import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
 
@@ -31,8 +34,9 @@
 // -database connections prop file
 // -writing Auger XML for crawl job (and don't actually execute job)
 // -writing out a summary EVIO file containing control events only (PRESTART, EPICS, scalars?, END)
-// -allow overwriting existing information in run table rather than inserting
 // -get supplementary information from run spreadsheet (including whether run was "JUNK" or not)
+// -allow running arbitrary EvioEventProcessor classes by giving fully qualified class names as args on command line
+//  e.g. -E org.hps.derp.MyEvioEventProcessor
 public final class EvioFileCrawler {
 
     /**
@@ -61,6 +65,7 @@
         OPTIONS.addOption("c", "cache-files", false, "automatically cache files from MSS (JLAB only)");
         OPTIONS.addOption("d", "directory", true, "root directory to start crawling (default is current dir)");
         OPTIONS.addOption("e", "epics", false, "process EPICS data found in EVIO files");
+        OPTIONS.addOption("E", "evio-processor", true, "class name of an additional EVIO processor to execute");
         OPTIONS.addOption("h", "help", false, "print help and exit");
         OPTIONS.addOption("m", "max-files", true, "max number of files to process per run (only for debugging)");
         OPTIONS.addOption("p", "print", true, "set event print interval during EVIO processing");
@@ -156,6 +161,8 @@
     private Long waitTime;
     
     private boolean allowUpdates = false;
+    
+    private List<EvioEventProcessor> processors = new ArrayList<EvioEventProcessor>();
 
     /**
      * Create the processor for a single run.
@@ -234,39 +241,46 @@
                 for (final String runString : cl.getOptionValues("a")) {
                     final Integer acceptRun = Integer.parseInt(runString);
                     this.acceptRuns.add(acceptRun);
-                    LOGGER.config("added accept run " + acceptRun);
+                    LOGGER.config("added run number filter " + acceptRun);
                 }
             }
 
             if (cl.hasOption("s")) {
+                LOGGER.config("print summary enabled");
                 this.printSummary = true;
             }
 
-            if (cl.hasOption("r")) {
+            if (cl.hasOption("r")) {                
                 this.updateRunLog = true;
-            }
-
-            if (cl.hasOption("e")) {
+                LOGGER.config("run db will be updated");
+            }
+
+            if (cl.hasOption("e")) {                
                 this.epics = true;
-            }
-
-            if (cl.hasOption("c")) {
+                LOGGER.config("EPICS processing enabled");
+            }
+
+            if (cl.hasOption("c")) {                
                 this.useFileCache = true;
+                LOGGER.config("using file cache");
             }
 
             if (cl.hasOption("w")) {
                 this.waitTime = Long.parseLong(cl.getOptionValue("w")) * MILLISECONDS;
                 if (this.waitTime > 0L) {
                     this.cacheManager.setWaitTime(this.waitTime);
+                    LOGGER.config("max wait time for caching set to " + this.waitTime);
                 }
             }
 
             if (cl.hasOption("m")) {
                 this.maxFiles = Integer.parseInt(cl.getOptionValue("m"));
+                LOGGER.config("max files set to " + this.maxFiles);
             }
 
             if (cl.hasOption("p")) {
                 this.eventPrintInterval = Integer.parseInt(cl.getOptionValue("p"));
+                LOGGER.config("event print interval set to " + this.eventPrintInterval);
             }
             
             if (cl.hasOption("u")) {
@@ -288,6 +302,18 @@
                 }
             }
             
+            
+            if (cl.hasOption("E")) {
+                String[] classNames = cl.getOptionValues("E");
+                for (String className : classNames) {
+                    try {
+                        processors.add(createEvioEventProcessor(className));
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            }
+            
         } catch (final ParseException e) {
             throw new RuntimeException("Error parsing options.", e);
         }
@@ -316,10 +342,15 @@
         this.cacheManager.clear();
 
         // Create a processor to process all the EVIO events in the run.
-        final RunProcessor processor = this.createRunProcessor(runSummary);
+        final RunProcessor runProcessor = this.createRunProcessor(runSummary);
+        
+        for (EvioEventProcessor processor : processors) {
+            runProcessor.addProcessor(processor);
+            LOGGER.config("added extra EVIO processor " + processor.getClass().getName());
+        }
 
         // Process all of the runs files.
-        processor.process();
+        runProcessor.process();
     }
 
     /**
@@ -398,4 +429,8 @@
         this.timestampFile.setLastModified(System.currentTimeMillis());
         LOGGER.info("set modified on timestamp file: " + new Date(this.timestampFile.lastModified()));
     }
+    
+    EvioEventProcessor createEvioEventProcessor(String className) throws Exception {
+        return EvioEventProcessor.class.cast(Class.forName(className).newInstance());
+    }
 }