Print

Print


Author: [log in to unmask]
Date: Fri Mar 11 18:32:06 2016
New Revision: 4292

Log:
utility for guessing the phase

Added:
    java/trunk/users/src/main/java/org/hps/users/meeg/SVTPhaseOffsetReader.java
      - copied, changed from r4288, java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java

Copied: java/trunk/users/src/main/java/org/hps/users/meeg/SVTPhaseOffsetReader.java (from r4288, java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java)
 =============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/meeg/SVTPhaseOffsetReader.java	Fri Mar 11 18:32:06 2016
@@ -1,7 +1,12 @@
-package org.hps.evio;
+package org.hps.users.meeg;
 
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
 import java.io.File;
-import java.util.Date;
+import java.io.IOException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.HelpFormatter;
@@ -9,25 +14,22 @@
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.PosixParser;
+import org.hps.evio.SvtEvioReader;
 import org.hps.record.evio.EvioEventUtilities;
+import org.hps.record.svt.SvtEvioUtils;
 import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition;
-import org.hps.record.triggerbank.HeadBankData;
 import org.hps.record.triggerbank.TIData;
 import org.jlab.coda.jevio.BaseStructure;
-import org.jlab.coda.jevio.CompositeData;
-import org.jlab.coda.jevio.DataType;
 import org.jlab.coda.jevio.EvioEvent;
-import org.jlab.coda.jevio.EvioException;
+import org.lcsim.util.aida.AIDA;
 
-public class BasicEvioFileReader {
+public class SVTPhaseOffsetReader {
 
     static public void main(String[] args) {
 
         Options options = new Options();
-        options.addOption(new Option("q", false, "quiet - don't print event contents"));
-        options.addOption(new Option("c", false, "print control events"));
-        options.addOption(new Option("t", false, "print event timestamps"));
-        options.addOption(new Option("s", false, "sequential read (not mem-mapped)"));
+        options.addOption(new Option("d", false, "debug"));
+        options.addOption(new Option("o", true, "output ROOT file name"));
 
         // Parse the command line options.
         if (args.length == 0) {
@@ -41,198 +43,124 @@
             throw new RuntimeException("Problem parsing command line options.", e);
         }
 
-        if (cl.getArgs().length < 1) {
-            throw new RuntimeException("Missing EVIO file name.");
+        if (cl.getArgs().length != 1) {
+            throw new RuntimeException("Need EVIO file name.");
         }
 
-        boolean quiet = cl.hasOption("q");
-        boolean printControlEvents = cl.hasOption("c");
-        boolean seqRead = cl.hasOption("s");
-        boolean printTimestamps = cl.hasOption("t");
+        AIDA aida = AIDA.defaultInstance();
+        IHistogram2D ratioVsPhase = aida.histogram2D("ratio vs phase", 200, -1.0, 2.0, 6, 0.0, 24.0);
+        IHistogram1D[] ratios = new IHistogram1D[6];
+        for (int i = 0; i < 6; i++) {
+            ratios[i] = aida.histogram1D("ratio, phase " + i, 200, -1.0, 2.0);
+        }
 
-        IntBankDefinition headBankDefinition = new IntBankDefinition(HeadBankData.class, new int[]{0x2e, 0xe10f});
+        boolean debug = cl.hasOption("d");
+        boolean seqRead = true;
+
         IntBankDefinition tiBankDefinition = new IntBankDefinition(TIData.class, new int[]{0x2e, 0xe10a});
 
-//        String evioFileName = args[0];
-        for (String evioFileName : cl.getArgs()) {
-            File evioFile = new File(evioFileName);
-            if (!evioFile.exists()) {
-                throw new RuntimeException("File " + evioFileName + " does not exist.");
-            }
-            System.out.println("Opened file " + evioFileName);
-            try {
-                org.jlab.coda.jevio.EvioReader reader = new org.jlab.coda.jevio.EvioReader(evioFile, true, seqRead);
-                int eventN = 1;
-                int badEvents = 0;
-                int[] lastData = new int[]{0, 0, 0, 0, 0};
-                long minDelta = 0, maxDelta = 0;
-                long lastTI = 0;
-                fileLoop:
-                while (true) {
-                    if (!quiet) {
-                        System.out.println("Reading event " + eventN);
+        String evioFileName = cl.getArgs()[0];
+        File evioFile = new File(evioFileName);
+        if (!evioFile.exists()) {
+            throw new RuntimeException("File " + evioFileName + " does not exist.");
+        }
+        System.out.println("Opened file " + evioFileName);
+        try {
+            org.jlab.coda.jevio.EvioReader reader = new org.jlab.coda.jevio.EvioReader(evioFile, true, seqRead);
+            int eventN = 1;
+            fileLoop:
+            while (true) {
+                if (debug) {
+                    System.out.println("Reading event " + eventN);
+                }
+                try {
+                    EvioEvent event = reader.nextEvent();
+                    if (event == null) {
+                        break fileLoop;
                     }
-                    try {
-                        EvioEvent event = reader.nextEvent();
-                        if (event == null) {
-                            break fileLoop;
-                        }
-                        reader.parseEvent(event);
-                        //printBytes(event.getRawBytes()); // DEBUG
-                        if (!quiet) {
-                            System.out.println("Successfully read event " + eventN);// + " which contains " + event.getTotalBytes() + " bytes.");
-                            printBank(event, "");
-                        }
-                        if (printControlEvents && EvioEventUtilities.isControlEvent(event) && !EvioEventUtilities.isEpicsEvent(event)) {
-                            int[] controlEventData = EvioEventUtilities.getControlEventData(event);
-                            if (controlEventData == null) {
-                                printBank(event, "");
+                    reader.parseEvent(event);
+                    //printBytes(event.getRawBytes()); // DEBUG
+                    if (EvioEventUtilities.isPhysicsEvent(event)) {
+                        BaseStructure tiBank = tiBankDefinition.findBank(event);
+                        TIData tiData = null;
+                        if (tiBank != null) {
+                            tiData = new TIData(tiBank.getIntData());
+                            if (debug) {
+                                System.out.format("%d %d\n", tiData.getTime(), tiData.getTime() % 24);
                             }
-                            System.out.print(event.getHeader().getTag() + "\t");
-
-                            for (int i = 0; i < controlEventData.length; i++) {
-                                System.out.print(controlEventData[i] + "\t");
-                            }
-                            Date timestamp = new Date(controlEventData[0] * 1000L);
-                            System.out.println(timestamp);
                         }
 
-                        if (printTimestamps) {
-                            int thisTimestamp = 0;
-                            BaseStructure headBank = headBankDefinition.findBank(event);
-                            if (headBank != null) {
-                                int[] data = headBank.getIntData();
-                                thisTimestamp = data[3];
-                                if (data[3] != 0) {
-                                    if (lastData[3] == 0) {
-                                        System.out.print("first_head\t");
-                                        printInts(data);
-                                    }
-                                    lastData = data;
+                        List<BassStructure> dataBanks = SvtEvioUtils.getDataBanks(event, SvtEvioReader.MIN_ROC_BANK_TAG, SvtEvioReader.MAX_ROC_BANK_TAG, SvtEvioReader.DATA_BANK_TAG, SvtEvioReader.DATA_BANK_TAG);
+                        for (BaseStructure data : dataBanks) {
+                            List<int[]> multisampleList = SvtEvioUtils.getMultisamples(data.getIntData(), data.getIntData().length - 2, 1);
+                            for (int[] multisample : multisampleList) {
+                                if (SvtEvioUtils.isMultisampleHeader(multisample) || SvtEvioUtils.isMultisampleTail(multisample)) {
+                                    continue;
                                 }
-                            }
-                            BaseStructure tiBank = tiBankDefinition.findBank(event);
-                            if (tiBank != null) {
-                                TIData tiData = new TIData(tiBank.getIntData());
-                                if (lastTI == 0) {
-                                    System.out.format("first_TItime\t%d\n", tiData.getTime());
-                                }
-                                lastTI = tiData.getTime();
-                                if (thisTimestamp != 0) {
-                                    long delta = thisTimestamp * 1000000000L - tiData.getTime();
-                                    if (minDelta == 0 || minDelta > delta) {
-                                        minDelta = delta;
-                                    }
-                                    if (maxDelta == 0 || maxDelta < delta) {
-                                        maxDelta = delta;
-                                    }
-//                                    System.out.format("%d %d %d %d %d %d\n", thisTimestamp, tiData.getTime(), delta, minDelta, maxDelta, maxDelta-minDelta);
+                                short[] samples = SvtEvioUtils.getSamples(multisample);
+//                                    System.out.format("%d %d %d %d %d %d\n", samples[0], samples[1], samples[2], samples[3], samples[4], samples[5]);
+
+                                if (tiData != null && samples[3] - samples[0] > 1000) {
+//                                        System.out.format("%f %f %f \n", ((double) (samples[4] - samples[0])), ((double) (samples[2] - samples[0])), ((double) (samples[4] - samples[0])) / ((double) (samples[2] - samples[0])));
+                                    ratioVsPhase.fill(((double) (samples[4] - samples[2])) / ((double) (samples[3] - samples[0])), tiData.getTime() % 24);
+                                    ratios[((int) (tiData.getTime() % 24)) / 4].fill(((double) (samples[4] - samples[2])) / ((double) (samples[3] - samples[0])));
                                 }
                             }
                         }
-                    } catch (Exception e) {
-                        System.out.println("Caught Exception processing event " + eventN + " which was...");
-                        e.printStackTrace();
-                        ++badEvents;
                     }
-                    ++eventN;
-                    if (!quiet) {
-                        System.out.println("-------");
+                } catch (Exception e) {
+                    System.out.println("Caught Exception processing event " + eventN + " which was...");
+                    e.printStackTrace();
+                }
+                ++eventN;
+                if (debug) {
+                    System.out.println("-------");
+                }
+            }
+            double[] peaks = new double[6];
+            double minPeak = Double.MIN_VALUE;
+            int minPhase = -1;
+            for (int i = 0; i < 6; i++) {
+                peaks[i] = -1;
+                double maxValue = Double.MIN_VALUE;
+                for (int j = 0; j <= ratios[i].axis().bins(); j++) {
+                    double value = ratios[i].binHeight(j);
+                    if (value > maxValue) {
+                        maxValue = value;
+                        peaks[i] = ratios[i].binMean(j);
                     }
                 }
-                System.out.println("There were " + badEvents + " bad events out of " + eventN + " total.");
-                if (printTimestamps) {
-                    System.out.print("last_head\t");
-                    printInts(lastData);
-                    System.out.format("last_TItime\t%d\n", lastTI);
-                    System.out.format("ti_offset\t%d\t%d\t%d\n", minDelta, maxDelta, maxDelta - minDelta);
+                if (peaks[i] < minPeak) {
+                    minPeak = peaks[i];
+                    minPhase = i;
                 }
-                reader.close();
-            } catch (Exception e) {
-//                throw new RuntimeException(e);
-                e.printStackTrace();
+            }
+            boolean isGood = true;
+            System.out.format("phase %d: peak at %f\n", (minPhase) % 6, peaks[(minPhase) % 6]);
+            for (int i = 0; i < 5; i++) {
+                System.out.format("phase %d: peak at %f\n", (minPhase + i + 1) % 6, peaks[(minPhase + i + 1) % 6]);
+                if (peaks[(minPhase + i) % 6] > peaks[(minPhase + i + 1) % 6]) {
+                    isGood = false;
+                }
+            }
+            System.out.format("offset phase %d, isGood = %b,\n", minPhase, isGood);
+            reader.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (cl.hasOption("o")) {
+            try {
+                aida.saveAs(cl.getOptionValue("o") + ".root");
+            } catch (IOException ex) {
+                Logger.getLogger(SVTPhaseOffsetReader.class.getName()).log(Level.SEVERE, null, ex);
             }
         }
     }
 
-    private static void printInts(int[] data) {
-        for (int i = 0; i < data.length; i++) {
-            System.out.format("%d\t", data[i]);
-        }
-        System.out.println();
-    }
-
     private static void printUsage(Options options) {
-        System.out.println("BasicEvioFileReader [options] [evioFiles]");
+        System.out.println("SVTPhaseOffsetReader [options] [evioFiles]");
         final HelpFormatter help = new HelpFormatter();
         help.printHelp(" ", options);
         System.exit(1);
     }
-
-    private static void printBank(BaseStructure bank, String indent) throws EvioException {
-        System.out.println(indent + "Bank contains " + bank.getTotalBytes() + " bytes.");
-        System.out.println(indent + "Bank has " + bank.getChildCount() + " sub-banks.");
-        System.out.format(indent + "Bank tag: 0x%x length: %d type: %s num: %d\n", bank.getHeader().getTag(), bank.getHeader().getLength(), bank.getHeader().getDataType(), bank.getHeader().getNumber());
-        if (bank.getChildCount() > 0) {
-            for (BaseStructure child : bank.getChildrenList()) {
-                printBank(child, indent + "\t");
-            }
-        }
-        if (bank.getHeader().getDataType() == DataType.COMPOSITE) {
-//            for (CompositeData cdata : bank.getCompositeData()) {
-            CompositeData cdatalist[] = bank.getCompositeData();
-            for (CompositeData cdata : cdatalist) {
-                switch (bank.getHeader().getTag()) {
-                    case 0xe101:
-                        printWindow(cdata, indent + "\t");
-                        break;
-                    case 0xe102:
-                        printComposite(cdata, indent + "\t");
-                        break;
-                    case 0xe103:
-                        printComposite(cdata, indent + "\t");
-                        break;
-                }
-            }
-//            }
-        }
-        if (bank.getHeader().getDataType() == DataType.UINT32) {
-            int[] data = bank.getIntData();
-            if (data.length < 100) {
-                for (int i = 0; i < data.length; i++) {
-                    System.out.format(indent + "0x%x\n", data[i]);
-                }
-            }
-        }
-    }
-
-    private static void printComposite(CompositeData cdata, String indent) {
-        System.out.println(indent + "Raw byte count: " + cdata.getRawBytes().length);
-        System.out.println(cdata.toString(indent));
-    }
-
-    private static void printWindow(CompositeData cdata, String indent) {
-        while (cdata.index() + 1 < cdata.getItems().size()) {
-            System.out.println(indent + "Byte count: " + cdata.getRawBytes().length);
-            System.out.println(indent + "Slot: " + cdata.getByte());
-            System.out.println(indent + "Trigger: " + cdata.getInt());
-            System.out.println(indent + "Timestamp: " + cdata.getLong());
-            int nchannels = cdata.getNValue();
-            System.out.println(indent + "NChannels: " + nchannels);
-            for (int j = 0; j < nchannels; j++) {
-                System.out.println(indent + "Channel: " + cdata.getByte());
-                int nSamples = cdata.getNValue();
-                System.out.println(indent + "NSamples: " + nSamples);
-                for (int i = 0; i < nSamples; i++) {
-                    cdata.getShort();
-                }
-            }
-        }
-    }
-
-    /*
-     * private static void printBytes(final byte[] bytes) { for (int i=0;
-     * i<bytes.length; i++) { if (i%4==0) System.out.println();
-     * System.out.println(Byte.toString(bytes[i])); } }
-     */
 }