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])); } } - */ }