Print

Print


Author: [log in to unmask]
Date: Tue Jan 26 18:30:27 2016
New Revision: 4140

Log:
Add utility class for combining histograms from AIDA files.

Added:
    java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/plots/AddPlots.java

Added: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/plots/AddPlots.java
 =============================================================================
--- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/plots/AddPlots.java	(added)
+++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/plots/AddPlots.java	Tue Jan 26 18:30:27 2016
@@ -0,0 +1,126 @@
+package org.hps.analysis.plots;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IBaseHistogram;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IHistogram3D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IManagedObject;
+import hep.aida.ITree;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * Command line tool to add together histograms from multiple AIDA files.
+ * 
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public class AddPlots {
+    
+    private static Logger LOGGER = Logger.getLogger(AddPlots.class.getPackage().getName());
+        
+    private static final Options OPTIONS = new Options();
+    static {
+        OPTIONS.addOption("o", "output", true, "output file name");
+        OPTIONS.addOption("h", "help", false, "print help and exit");
+    }
+    
+    public static void printUsage() {
+        final HelpFormatter help = new HelpFormatter();
+        help.printHelp("AddPlots [-o outputFile] file1.aida file2.aida [...]", "", OPTIONS, "");
+        System.exit(1);
+    }
+    
+    public static void main(String[] args) throws Exception {
+        CommandLine cl = new DefaultParser().parse(OPTIONS, args);        
+        if (cl.getArgList().isEmpty()) {
+            throw new RuntimeException("No input AIDA files to add.");
+        }        
+        if (cl.getArgList().size() < 2) {
+            throw new RuntimeException("Not enough AIDA input files.");
+        }
+        
+        String outputFile = "combined_plots.aida";
+        if (cl.hasOption("o")) {
+            outputFile = cl.getOptionValue("o");
+        }
+        
+        if (new File(outputFile).exists()) {
+            throw new RuntimeException("The output file already exists.");
+        }
+        
+        List<File> inputFiles = new ArrayList<File>();
+        for (String arg : cl.getArgList()) {
+            File inputFile = new File(arg);
+            if (!inputFile.exists()) {
+                throw new RuntimeException("The input file " + inputFile.getPath() + " does not exist.");
+            }
+            inputFiles.add(inputFile);
+        }
+        
+        AIDA aida = AIDA.defaultInstance();
+        IAnalysisFactory af = aida.analysisFactory();
+        IHistogramFactory hf = aida.histogramFactory();
+        ITree tree = af.createTreeFactory().create(inputFiles.get(0).getAbsolutePath());
+                        
+        List<String> histogramNames = new ArrayList<String>();
+        
+        String[] objectTypes = tree.listObjectTypes("/", true);
+        String[] objectNames = tree.listObjectNames("/", true);
+        for (int pathIndex = 0; pathIndex < objectNames.length; pathIndex++) {
+            if (objectTypes[pathIndex].startsWith("IHistogram")) {
+                histogramNames.add(objectNames[pathIndex]);
+            }
+            LOGGER.fine(objectNames[pathIndex] + ":" + objectTypes[pathIndex]);
+        }
+        
+        LOGGER.info("found " + histogramNames.size() + " histograms in " + inputFiles.get(0).getPath());
+
+        for (int fileIndex = 1; fileIndex < inputFiles.size(); fileIndex++) {            
+            File file = inputFiles.get(fileIndex);
+            LOGGER.info("processing " + file.getPath());
+            ITree srcTree = af.createTreeFactory().create(file.getAbsolutePath());
+            for (String histogramName : histogramNames) {                
+                String path = histogramName.substring(0, histogramName.lastIndexOf('/'));
+                aida.tree().mkdirs(path);
+                IManagedObject object = srcTree.find(histogramName);
+                if (object != null) {
+                    IBaseHistogram src = (IBaseHistogram) srcTree.find(histogramName);
+                    IBaseHistogram target = (IBaseHistogram) tree.find(histogramName);
+                    LOGGER.fine("Adding " + histogramName + " from " + file.getPath());
+                    add(hf, histogramName, src, target);
+                } else {
+                    LOGGER.warning("The object " + histogramName + " was not found in " + file.getPath() + ".");
+                }
+            }
+        }
+
+        if (inputFiles.size() == 1) {
+            aida.tree().mount("/", tree, "/");
+        }
+        
+        aida.saveAs(outputFile);
+        LOGGER.info("wrote plots to " + outputFile);
+    }
+    
+    private static void add(IHistogramFactory factory, String path, IBaseHistogram src, IBaseHistogram target) {
+        if (src instanceof IHistogram1D) {
+            factory.add(path, (IHistogram1D) src, (IHistogram1D) target);
+        } else if (src instanceof IHistogram2D) {
+            factory.add(path, (IHistogram2D) src, (IHistogram2D) target);
+        } else if (src instanceof IHistogram3D) {
+            factory.add(path, (IHistogram3D) src, (IHistogram3D) target);
+        }
+    }
+}