Author: [log in to unmask] Date: Mon Aug 3 17:39:28 2015 New Revision: 3329 Log: add event flags for SVT Added: java/trunk/evio/src/main/java/org/hps/evio/SvtEventFlagger.java Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtMotorPosition.java java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtMotorPosition.java ============================================================================= --- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtMotorPosition.java (original) +++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtMotorPosition.java Mon Aug 3 17:39:28 2015 @@ -1,5 +1,6 @@ package org.hps.conditions.svt; +import java.util.Date; import org.hps.conditions.api.BaseConditionsObject; import org.hps.conditions.api.BaseConditionsObjectCollection; import org.hps.conditions.database.Field; @@ -7,21 +8,38 @@ /** * Represents the SVT motor position as a time-based condition. - * + * * @author Jeremy McCormick, SLAC */ -@Table(names = "svt_motor_positions") +@Table(names = "svt_motor_positions") public class SvtMotorPosition extends BaseConditionsObject { - + /** * Collection implementation. */ - public static class SvtMotorPositionCollection extends BaseConditionsObjectCollection<SvtMotorPosition> { + public static class SvtMotorPositionCollection extends BaseConditionsObjectCollection<SvtMotorPosition> { + + /** + * Find position constant by date. + * + * @param date the search date + * @return the constant containing the date or <code>null</code> + * otherwise. + * + */ + public SvtMotorPosition find(Date date) { + for (SvtMotorPosition constant : this) { + if (date.getTime() >= constant.getStart() && date.getTime() <= constant.getEnd()) { + return constant; + } + } + return null; + } } - + /** - * The start date as a Unix timestamp in milliseconds (GMT). - * + * The start date as a Unix timestamp in milliseconds (GMT). + * * @return the start date as a Unix timestamp */ @Field(names = {"start"}) @@ -30,8 +48,8 @@ } /** - * The end date as a Unix timestamp in milliseconds (GMT). - * + * The end date as a Unix timestamp in milliseconds (GMT). + * * @return the end date as a Unix timestamp */ @Field(names = {"end"}) @@ -41,17 +59,17 @@ /** * The top position. - * + * * @return the top motor position */ @Field(names = {"top"}) public Double getTop() { return getFieldValue("top"); } - + /** * The bottom position. - * + * * @return the bottom motor position */ @Field(names = {"bottom"}) Modified: 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/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java Mon Aug 3 17:39:28 2015 @@ -11,6 +11,7 @@ import org.apache.commons.cli.PosixParser; import org.hps.evio.LCSimTestRunEventBuilder.IntBankDefinition; import org.hps.recon.ecal.triggerbank.HeadBankData; +import org.hps.recon.ecal.triggerbank.TIData; import org.hps.record.evio.EvioEventUtilities; import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.CompositeData; @@ -50,6 +51,7 @@ boolean printTimestamps = cl.hasOption("t"); IntBankDefinition headBankDefinition = new LCSimTestRunEventBuilder.IntBankDefinition(HeadBankData.class, new int[]{0x2e, 0xe10f}); + IntBankDefinition tiBankDefinition = new LCSimTestRunEventBuilder.IntBankDefinition(TIData.class, new int[]{0x2e, 0xe10a}); // String evioFileName = args[0]; for (String evioFileName : cl.getArgs()) { @@ -58,11 +60,13 @@ throw new RuntimeException("File " + evioFileName + " does not exist."); } System.out.println("Opened file " + evioFileName); - int[] lastData = new int[]{0, 0, 0, 0, 0}; 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) { @@ -94,15 +98,35 @@ } 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; + } + } + 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); } } } @@ -120,6 +144,8 @@ 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); } reader.close(); } catch (Exception e) { Modified: java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java Mon Aug 3 17:39:28 2015 @@ -17,18 +17,21 @@ import org.hps.record.scalers.ScalerParameters; import org.hps.record.scalers.ScalersEvioProcessor; import org.jlab.coda.jevio.EvioEvent; +import org.lcsim.conditions.ConditionsEvent; import org.lcsim.event.EventHeader; import org.lcsim.util.log.DefaultLogFormatter; import org.lcsim.util.log.LogUtil; /** - * This is the {@link org.hps.record.LCSimEventBuilder} implementation for the Engineering Run and the Commissioning Run - * for converting EVIO to LCIO events. + * This is the {@link org.hps.record.LCSimEventBuilder} implementation for the + * Engineering Run and the Commissioning Run for converting EVIO to LCIO events. * <p> - * It has several modifications from the Test Run builder including different values for certain bank tags. + * It has several modifications from the Test Run builder including different + * values for certain bank tags. * <p> - * Additionally, this builder will write DAQ config information, EPICS control data, and scalar bank data into the - * output LCSim events if these banks are present in the EVIO data. + * Additionally, this builder will write DAQ config information, EPICS control + * data, and scalar bank data into the output LCSim events if these banks are + * present in the EVIO data. * * @author Sho Uemura, SLAC * @author Jeremy McCormick, SLAC @@ -45,7 +48,7 @@ * EVIO processor for extracting EPICS data. */ private final EpicsEvioProcessor epicsProcessor = new EpicsEvioProcessor(); - + /** * Scaler parameters for lcsim event parameters. */ @@ -60,6 +63,11 @@ * Reads trigger config. */ private TriggerConfigEvioReader triggerConfigReader = null; + + /** + * Writes event flags describing the SVT state. + */ + private final SvtEventFlagger svtEventFlagger; /** * Class constructor. @@ -73,17 +81,18 @@ sspCrateBankTag = 0x2E; // A.C. modification after Sergey's confirmation sspBankTag = 0xe10c; intBanks = new ArrayList<IntBankDefinition>(); - intBanks.add(new IntBankDefinition(SSPData.class, new int[] {sspCrateBankTag, sspBankTag})); - intBanks.add(new IntBankDefinition(TIData.class, new int[] {sspCrateBankTag, 0xe10a})); - intBanks.add(new IntBankDefinition(HeadBankData.class, new int[] {sspCrateBankTag, 0xe10f})); - intBanks.add(new IntBankDefinition(TDCData.class, new int[] {0x3a, 0xe107})); + intBanks.add(new IntBankDefinition(SSPData.class, new int[]{sspCrateBankTag, sspBankTag})); + intBanks.add(new IntBankDefinition(TIData.class, new int[]{sspCrateBankTag, 0xe10a})); + intBanks.add(new IntBankDefinition(HeadBankData.class, new int[]{sspCrateBankTag, 0xe10f})); + intBanks.add(new IntBankDefinition(TDCData.class, new int[]{0x3a, 0xe107})); // ecalReader = new ECalEvioReader(0x25, 0x27); triggerConfigReader = new TriggerConfigEvioReader(); + svtEventFlagger = new SvtEventFlagger(); } /** * Get the time from the TI data. - * + * * @param triggerList the TI data list */ @Override @@ -99,7 +108,7 @@ /** * Make an lcsim event from EVIO data. - * + * * @param evioEvent the input EVIO event */ @Override @@ -142,12 +151,14 @@ // Write out current ScalerParameters to event header. this.scalerParameters.write(lcsimEvent); + this.svtEventFlagger.writeFlags(lcsimEvent); + return lcsimEvent; } /** * Pre-read an EVIO event. - * + * * @param evioEvent the EVIO event */ @Override @@ -167,20 +178,20 @@ * @param lcsimEvent the lcsim event */ private void writeEpicsData(final EventHeader lcsimEvent) { - + // Get EpicsData from processor that was already activated (usually it is null). EpicsData epicsData = epicsProcessor.getEpicsData(); - + // Was new EpicsData created? if (epicsData != null) { LOGGER.fine("writing EPICS data to lcsim event " + lcsimEvent.getEventNumber()); - + // Write to the collection in the lcsim event. - epicsData.write(lcsimEvent); - + epicsData.write(lcsimEvent); + // Update the ScalerParameters. scalerParameters.readEpicsData(epicsData); - + // Reset the processor. epicsProcessor.reset(); } @@ -199,7 +210,7 @@ // Get ScalerData from the processor. ScalerData scalerData = scalerProcessor.getScalerData(); - + // Was new ScalerData created? if (scalerData != null) { @@ -212,5 +223,11 @@ // Update current ScalerParameters. scalerParameters.readScalerData(scalerData); } - } + } + + @Override + public void conditionsChanged(ConditionsEvent conditionsEvent) { + super.conditionsChanged(conditionsEvent); + svtEventFlagger.initialize(); + } } Added: java/trunk/evio/src/main/java/org/hps/evio/SvtEventFlagger.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/SvtEventFlagger.java (added) +++ java/trunk/evio/src/main/java/org/hps/evio/SvtEventFlagger.java Mon Aug 3 17:39:28 2015 @@ -0,0 +1,148 @@ +package org.hps.evio; + +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.svt.SvtAlignmentConstant; +import org.hps.conditions.svt.SvtBiasConstant; +import org.hps.conditions.svt.SvtMotorPosition; +import org.hps.recon.ecal.triggerbank.AbstractIntData; +import org.hps.recon.ecal.triggerbank.HeadBankData; +import org.lcsim.detector.tracker.silicon.HpsSiSensor; +import org.lcsim.event.EventHeader; +import org.lcsim.event.GenericObject; +import org.lcsim.event.RawTrackerHit; + +/** + * + * @author Sho Uemura <[log in to unmask]> + * @version $Id: $ + */ +public class SvtEventFlagger { + + private static final double angleTolerance = 0.0001; + SvtBiasConstant.SvtBiasConstantCollection svtBiasConstants = null; + SvtMotorPosition.SvtMotorPositionCollection svtPositionConstants = null; + private boolean biasGood = false; + private boolean positionGood = false; + private boolean burstmodeNoiseGood = false; + private double nominalAngleTop = 0; + private double nominalAngleBottom = 0; + + public void writeFlags(EventHeader event) { + Date eventDate = getEventTimeStamp(event); + if (eventDate != null) { + biasGood = false; + if (svtBiasConstants != null) { + SvtBiasConstant biasConstant = svtBiasConstants.find(eventDate); + if (biasConstant != null) { + biasGood = true; + } + } + + positionGood = false; + if (svtPositionConstants != null) { + SvtMotorPosition positionConstant = svtPositionConstants.find(eventDate); + if (positionConstant != null) { +// System.out.format("%f %f %f %f\n", positionConstant.getBottom(), nominalAngleBottom, positionConstant.getTop(), nominalAngleTop); + if (Math.abs(positionConstant.getBottom() - nominalAngleBottom) < angleTolerance && Math.abs(positionConstant.getTop() - nominalAngleTop) < angleTolerance) { + positionGood = true; + } + } + } + } + + burstmodeNoiseGood = isBurstmodeNoiseGood(event); + + event.getIntegerParameters().put("svt_bias_good", new int[]{biasGood ? 1 : 0}); + event.getIntegerParameters().put("svt_position_good", new int[]{positionGood ? 1 : 0}); + event.getIntegerParameters().put("svt_burstmode_noise_good", new int[]{burstmodeNoiseGood ? 1 : 0}); + } + + private Date getEventTimeStamp(EventHeader event) { + List<GenericObject> intDataCollection = event.get(GenericObject.class, "TriggerBank"); + for (GenericObject data : intDataCollection) { + if (AbstractIntData.getTag(data) == HeadBankData.BANK_TAG) { + Date date = HeadBankData.getDate(data); + if (date != null) { + return date; + } + } + } + return null; + } + + public void initialize() { + svtBiasConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtBiasConstant.SvtBiasConstantCollection.class, "svt_bias_constants").getCachedData(); + svtPositionConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtMotorPosition.SvtMotorPositionCollection.class, "svt_motor_positions").getCachedData(); + + SvtAlignmentConstant.SvtAlignmentConstantCollection alignmentConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtAlignmentConstant.SvtAlignmentConstantCollection.class, "svt_alignments").getCachedData(); + + for (final SvtAlignmentConstant constant : alignmentConstants) { + switch (constant.getParameter()) { + case 13100: + System.out.format("nominal top angle: %f\n", constant.getValue()); + nominalAngleTop = constant.getValue(); + break; + case 23100: + System.out.format("nominal bottom angle: %f\n", constant.getValue()); + nominalAngleBottom = -constant.getValue(); + break; + } + } + + } + + private static boolean isBurstmodeNoiseGood(EventHeader event) { + if (event.hasCollection(RawTrackerHit.class, "SVTRawTrackerHits")) { + // Get RawTrackerHit collection from event. + List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, "SVTRawTrackerHits"); + return countSmallHits(rawTrackerHits) <= 3; + } + return false; + } + + private static int countSmallHits(List<RawTrackerHit> rawHits) { + int smallHitCount = 0; + Map<HpsSiSensor, Set<Integer>> hitMap = new HashMap<HpsSiSensor, Set<Integer>>(); + + for (RawTrackerHit hit : rawHits) { + HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement(); + Set<Integer> hitStrips = hitMap.get(sensor); + if (hitStrips == null) { + hitStrips = new HashSet<Integer>(); + hitMap.put(sensor, hitStrips); + } + int strip = hit.getIdentifierFieldValue("strip"); + hitStrips.add(strip); + } + + for (RawTrackerHit hit : rawHits) { + if (isSmallHit(hitMap, hit)) { + smallHitCount++; + } + } + return smallHitCount; + } + + private static boolean isSmallHit(Map<HpsSiSensor, Set<Integer>> hitMap, RawTrackerHit hit) { + HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement(); + int strip = hit.getIdentifierFieldValue("strip"); + double pedestal = sensor.getPedestal(strip, 0); + double noise = sensor.getNoise(strip, 0); + + if (hitMap.get(sensor) != null && (hitMap.get(sensor).contains(strip - 1) || hitMap.get(sensor).contains(strip + 1))) { + return false; + } + for (int i = 0; i < 6; i++) { + if (hit.getADCValues()[i] > pedestal + 4.0 * noise) { + return false; + } + } + return true; + } +} Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java Mon Aug 3 17:39:28 2015 @@ -99,8 +99,9 @@ private String myaDumpPath; private double epicsBiasValue = -1; private boolean hvOnEpics = false; - private boolean hvOn = false; + private boolean hvOnMya = false; private boolean hvOnConditions = false; + private boolean hvOnEventFlag = false; private EpicsData epicsData = null; private int eventCountEpicsDisagree = 0; SvtBiasConstantCollection svtBiasConstants = null; @@ -248,6 +249,19 @@ @Override public void process(EventHeader event) { + Map<String, int[]> params = event.getIntegerParameters(); + + int[] biasGood = params.get("svt_bias_good"); +// int[] positionGood = params.get("svt_position_good"); +// int[] burstmodeNoiseGood = params.get("svt_burstmode_noise_good"); + +// System.out.format("%d %d %d\n", biasGood[0], positionGood[0], burstmodeNoiseGood[0]); + if (biasGood == null) { + hvOnEventFlag = false; + } else { + hvOnEventFlag = biasGood[0] == 1; + } + if (allHitCountVsNum == null) { allHitCountVsNum = AIDA.defaultInstance().histogram2D("all hit count vs. event num", 1000, event.getEventNumber(), event.getEventNumber() + eventNumRange, 50, 0, 200); } @@ -267,8 +281,9 @@ if (epicsBiasValue > 178.0) { hvOnEpics = true; - } - + } else { + hvOnEpics = false; + } } } else { logger.fine("no epics information in this event"); @@ -284,7 +299,7 @@ hvOnConditions = svtBiasConstants.find(newEventDate) != null; if (eventDate == null || !eventDate.equals(newEventDate)) { System.out.format("event %d with new timestamp %s\n", event.getEventNumber(), newEventDate.toString()); - System.out.println("hvOn is " + (hvOn ? "ON" : "OFF") + " hvOnEpics " + (hvOnEpics ? "ON" : "OFF") + " hvOnConditions " + (hvOnConditions ? "ON" : "OFF") + " for Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + newEventDate.toString() + " epoch " + newEventDate.getTime()); + System.out.println("hvOnMya is " + (hvOnMya ? "ON" : "OFF") + " hvOnEpics " + (hvOnEpics ? "ON" : "OFF") + " hvOnConditions " + (hvOnConditions ? "ON" : "OFF") + " hvOnEventFlag " + (hvOnEventFlag ? "ON" : "OFF") + " for Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + newEventDate.toString() + " epoch " + newEventDate.getTime()); // check what the DB has if (svtBiasConstants != null) { logger.info("there are " + svtBiasConstants.size() + " constants to search"); @@ -321,23 +336,23 @@ } } - hvOn = runRange.includes(eventDate); + hvOnMya = runRange.includes(eventDate); // print the cases where epics and run range do not agree - if (hvOn != hvOnEpics && epicsBiasValue > 0.) { + if (hvOnMya != hvOnEpics && epicsBiasValue > 0.) { if (debug) { - logger.warning("hvOn is " + (hvOn ? "ON" : "OFF") + " hvOnEpics " + (hvOnEpics ? "ON" : "OFF") + " for Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO")); - } - pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO")); + logger.warning("hvOnMya is " + (hvOnMya ? "ON" : "OFF") + " hvOnEpics " + (hvOnEpics ? "ON" : "OFF") + " for Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOnMya ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO")); + } + pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOnMya ? "YES" : "NO")); eventCountEpicsDisagree++; } // print the cases where the HV is OFF - if (!hvOn) { + if (!hvOnMya) { if (debug) { - logger.info("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO")); - } - pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO")); + logger.info("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOnMya " + (hvOnMya ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO")); + } + pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOnMya " + (hvOnMya ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO")); eventCountHvOff++; } if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) { @@ -368,7 +383,7 @@ } if (maxSample >= 4) { hists_rawadcnoise.get(sensor).fill(hit.getADCValues()[0] - pedestal); - if (hvOn) { + if (hvOnMya) { hists_rawadcnoiseON.get(sensor).fill(hit.getADCValues()[0] - pedestal); } else { hists_rawadcnoiseOFF.get(sensor).fill(hit.getADCValues()[0] - pedestal); @@ -381,7 +396,7 @@ // if (dropSmallHitEvents && SvtPlotUtils.countSmallHits(rawTrackerHits) > 3) { // return; // } - if (hvOn) { + if (hvOnMya) { allHitCountON.fill(rawTrackerHits.size()); } else { allHitCountOFF.fill(rawTrackerHits.size()); @@ -396,7 +411,7 @@ count = 0; } hists_hitCounts.get(sensor).fill(count); - if (hvOn) { + if (hvOnMya) { hists_hitCountsON.get(sensor).fill(count); } else { hists_hitCountsOFF.get(sensor).fill(count);