Print

Print


Author: [log in to unmask]
Date: Thu Apr 30 15:07:20 2015
New Revision: 2868

Log:
Add EVIO file scanning tool (work in progress).

Added:
    java/trunk/users/src/main/java/org/hps/users/jeremym/EvioFileScanner.java

Added: java/trunk/users/src/main/java/org/hps/users/jeremym/EvioFileScanner.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/EvioFileScanner.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/EvioFileScanner.java	Thu Apr 30 15:07:20 2015
@@ -0,0 +1,276 @@
+package org.hps.users.jeremym;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+import org.hps.record.evio.EvioEventUtilities;
+import org.jlab.coda.jevio.EvioEvent;
+import org.jlab.coda.jevio.EvioException;
+import org.jlab.coda.jevio.EvioReader;
+import org.lcsim.util.log.LogUtil;
+
+// TODO:
+//
+// Info from files:
+// -run number
+// -list of files
+// -start date (from PRESTART)
+// -end date (from END)
+// -total number of events
+//
+// Command line args:
+// -start and end run number filter (outside range will be excluded)
+// -list of run numbers (not in list will be excluded)
+// -output timestamp file (when dir walk ends)
+// -list of "tasks" to execute for each EVIO file (register run data, put into file catalog, etc.)
+// -caching to cache first/last files or all files for run
+public class EvioFileScanner {
+
+    static class EvioFileList extends ArrayList<File> {
+
+        public File first() {
+            return get(0);
+        }
+
+        public File last() {
+            return get(size() - 1);
+        }
+
+        public void sort() {
+            final List<File> fileList = new ArrayList<File>(this);
+            Collections.sort(fileList, new EvioFileSequenceComparator());
+            this.clear();
+            this.addAll(fileList);
+        }
+    }
+
+    static class EvioFileSequenceComparator implements Comparator<File> {
+
+        @Override
+        public int compare(final File o1, final File o2) {
+            final Integer sequenceNumber1 = getSequenceNumber(o1);
+            final Integer sequenceNumber2 = getSequenceNumber(o2);
+            return sequenceNumber1.compareTo(sequenceNumber2);
+        }
+    }
+
+    // hps_005077.evio.20
+    static class EvioFileVisitor extends SimpleFileVisitor<Path> {
+
+        static SimpleEvioFileFilter FILTER = new SimpleEvioFileFilter();
+
+        FileRunMap runMap = new FileRunMap();
+
+        FileRunMap getRunMap() {
+            return this.runMap;
+        }
+
+        @Override
+        public FileVisitResult visitFile(final Path path, final BasicFileAttributes attrs) {
+
+            final File file = path.toFile();
+            if (FILTER.accept(file)) {
+                LOGGER.info("found EVIO file " + file.getPath());
+
+                final Integer runNumber = getRunNumber(file);
+                final Integer sequenceNumber = getSequenceNumber(file);
+
+                LOGGER.info("run number " + runNumber);
+                LOGGER.info("sequence number " + sequenceNumber);
+
+                this.runMap.get(runNumber).add(file);
+            }
+            return FileVisitResult.CONTINUE;
+        }
+
+    }
+
+    static class FileRunMap extends HashMap<Integer, EvioFileList> {
+
+        @Override
+        public EvioFileList get(final Object key) {
+            if (!this.containsKey(key)) {
+                if (!(key instanceof Integer)) {
+                    throw new IllegalArgumentException("The key argument has bad type.");
+                }
+                if (super.get(key) == null) {
+                    this.put(Integer.class.cast(key), new EvioFileList());
+                }
+            }
+            return super.get(key);
+        }
+
+        List<Integer> getSortedRunNumbers() {
+            final List<Integer> runList = new ArrayList<Integer>(this.keySet());
+            Collections.sort(runList);
+            return runList;
+        }
+
+        void sortFiles() {
+            for (final Integer run : keySet()) {
+                get(run).sort();
+            }
+        }
+    }
+
+    static class SimpleEvioFileFilter implements FileFilter {
+
+        @Override
+        public boolean accept(final File pathname) {
+            return pathname.getName().contains(".evio");
+        }
+    }
+
+    private static final Logger LOGGER = LogUtil.create(EvioFileVisitor.class);
+
+    static final long MILLISECONDS = 1000L;
+
+    private static final Options OPTIONS = new Options();
+
+    static {
+        OPTIONS.addOption("t", "timestamp", true, "timestamp file");
+        OPTIONS.addOption("d", "dir", true, "starting directory");
+    }
+
+    static Integer getRunNumber(final File file) {
+        final String name = file.getName();
+        return Integer.parseInt(name.substring(0, name.indexOf(".")).replace("hps_", ""));
+    }
+
+    static Integer getSequenceNumber(final File file) {
+        final String name = file.getName();
+        return Integer.parseInt(name.substring(name.lastIndexOf(".") + 1));
+    }
+
+    public static void main(final String[] args) {
+        new EvioFileScanner().parse(args).run();
+    }
+
+    final PosixParser parser = new PosixParser();
+
+    File rootDir = new File(System.getProperty("user.dir"));
+
+    Date getRunEnd(final File file) {
+        Date date = null;
+        EvioReader reader = null;
+        try {
+            reader = new EvioReader(file.getPath(), false);
+            EvioEvent event;
+            while ((event = reader.parseNextEvent()) != null) {
+                if (EvioEventUtilities.isEndEvent(event)) {
+                    final int[] data = EvioEventUtilities.getControlEventData(event);
+                    long seconds = (long)data[0];
+                    //System.out.printf("END control: %d %d %d", data[0], data[1], data[2]);
+                    date = new Date(seconds * MILLISECONDS);
+                    //System.out.println("END date: " + date);
+                    break;
+                }
+            }
+        } catch (EvioException | IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (final IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return date;
+    }
+
+    Date getRunStart(final File file) {
+        Date date = null;
+        EvioReader reader = null;
+        try {
+            reader = new EvioReader(file.getPath(), false);
+            EvioEvent event;
+            while ((event = reader.parseNextEvent()) != null) {
+                if (EvioEventUtilities.isPreStartEvent(event)) {
+                    final int[] data = EvioEventUtilities.getControlEventData(event);
+                    //System.out.printf("PRESTART control: %d %d %d%n", data[0], data[1], data[2]);
+                    long seconds = (long)data[0];
+                    date = new Date(seconds * MILLISECONDS);
+                    //System.out.println("PRESTART date: " + date);
+                    break;
+                }
+            }
+        } catch (EvioException | IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (final IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return date;
+    }
+
+    public EvioFileScanner parse(final String args[]) {
+
+        try {
+            final CommandLine cl = this.parser.parse(OPTIONS, args);
+
+            if (cl.hasOption("d")) {
+                this.rootDir = new File(cl.getOptionValue("d"));
+                if (!this.rootDir.exists()) {
+                    throw new IllegalArgumentException("The directory does not exist.");
+                }
+                if (!this.rootDir.isDirectory()) {
+                    throw new IllegalArgumentException("The specified path is not a directory.");
+                }
+            }
+
+        } catch (final ParseException e) {
+            throw new RuntimeException("Error parsing options.", e);
+        }
+
+        return this;
+    }
+
+    public void run() {
+        final EnumSet<FileVisitOption> options = EnumSet.noneOf(FileVisitOption.class);
+        final EvioFileVisitor visitor = new EvioFileVisitor();
+        try {
+            Files.walkFileTree(this.rootDir.toPath(), options, Integer.MAX_VALUE, visitor);
+        } catch (final IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        final FileRunMap runMap = visitor.getRunMap();
+        runMap.sortFiles();
+        System.out.println("found files...");
+        for (final Integer run : runMap.getSortedRunNumbers()) {
+            System.out.println();
+            System.out.println("run " + run + " has " + runMap.get(run).size() + " files");
+            final EvioFileList files = runMap.get(run);
+            System.out.println("first file " + files.first());
+            System.out.println("last file " + files.last());
+            System.out.println("started at " + getRunStart(files.first()));
+            System.out.println("ended at " + getRunEnd(files.last()));
+        }
+    }
+}