Print

Print


Author: [log in to unmask]
Date: Mon May 11 03:11:42 2015
New Revision: 2942

Log:
testing some changes

Modified:
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	Mon May 11 03:11:42 2015
@@ -10,12 +10,17 @@
 import hep.aida.IHistogramFactory;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterRegion;
 import hep.aida.IPlotterStyle;
 import hep.aida.ITree;
 import hep.aida.jfree.plotter.Plotter;
 import hep.aida.jfree.plotter.PlotterRegion;
 import hep.aida.ref.rootwriter.RootFileStore;
 import hep.physics.vec.Hep3Vector;
+import org.hps.monitoring.subsys.StatusCode;
+import org.hps.monitoring.subsys.Subsystem;
+import org.hps.monitoring.subsys.SystemStatus;
+import org.hps.monitoring.subsys.SystemStatusImpl;
 
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.detector.tracker.silicon.ChargeCarrier;
@@ -81,7 +86,21 @@
     private boolean filterPair0Triggers = false;
     private boolean filterPair1Triggers = false;
 
+    SystemStatus maxSampleStatus;
+    private int maxSampleMonitorStart = 1000;
+    private int maxSampleMonitorPeriod = 100;
+
+    SystemStatus occupancyStatus;
+    private int occupancyMonitorStart = 2500;
+    private int occupancyMonitorPeriod = 100;
+    private double minPeakOccupancy = 0.0001;
+    private double maxPeakOccupancy = 0.01;
+
     public SensorOccupancyPlotsDriver() {
+        maxSampleStatus = new SystemStatusImpl(Subsystem.SVT, "Checks that SVT is timed in (max sample plot)", true);
+        maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Status is unknown.");
+        occupancyStatus = new SystemStatusImpl(Subsystem.SVT, "Checks SVT occupancy", true);
+        occupancyStatus.setStatus(StatusCode.UNKNOWN, "Status is unknown.");
     }
 
     public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
@@ -134,6 +153,30 @@
 
     public void setTimeWindowWeight(int timeWindowWeight) {
         this.timeWindowWeight = timeWindowWeight;
+    }
+
+    public void setMaxSampleMonitorStart(int maxSampleMonitorStart) {
+        this.maxSampleMonitorStart = maxSampleMonitorStart;
+    }
+
+    public void setMaxSampleMonitorPeriod(int maxSampleMonitorPeriod) {
+        this.maxSampleMonitorPeriod = maxSampleMonitorPeriod;
+    }
+
+    public void setOccupancyMonitorStart(int occupancyMonitorStart) {
+        this.occupancyMonitorStart = occupancyMonitorStart;
+    }
+
+    public void setOccupancyMonitorPeriod(int occupancyMonitorPeriod) {
+        this.occupancyMonitorPeriod = occupancyMonitorPeriod;
+    }
+
+    public void setMinPeakOccupancy(double minPeakOccupancy) {
+        this.minPeakOccupancy = minPeakOccupancy;
+    }
+
+    public void setMaxPeakOccupancy(double maxPeakOccupancy) {
+        this.maxPeakOccupancy = maxPeakOccupancy;
     }
 
     /**
@@ -186,7 +229,7 @@
      * @return plotter style
      */
     // TODO: Move this to a utilities class
-    IPlotterStyle createOccupancyPlotStyle(String xAxisTitle, HpsSiSensor sensor) {
+    IPlotterStyle createOccupancyPlotStyle(String xAxisTitle, HpsSiSensor sensor, boolean isAlarming) {
         // Create a default style
         IPlotterStyle style = this.plotterFactory.createPlotterStyle();
 
@@ -222,11 +265,19 @@
         style.legendBoxStyle().setVisible(false);
 
         style.regionBoxStyle().backgroundStyle().setOpacity(.20);
-        if (sensor.isAxial()) {
+        setBackgroundColor(style, sensor.isAxial(), isAlarming);
+
+        return style;
+    }
+
+    private void setBackgroundColor(IPlotterStyle style, boolean isAxial, boolean isAlarming) {
+        if (isAlarming) {
+            style.regionBoxStyle().backgroundStyle().setColor("246, 34, 34, 1");
+            return;
+        }
+        if (isAxial) {
             style.regionBoxStyle().backgroundStyle().setColor("246, 246, 34, 1");
         }
-
-        return style;
     }
 
     /**
@@ -261,13 +312,14 @@
         return (int) Math.ceil(((double) sensor.getLayerNumber()) / 2);
     }
 
+    @Override
     protected void detectorChanged(Detector detector) {
 
         // Get the HpsSiSensor objects from the geometry
         sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
 
         // If there were no sensors found, throw an exception
-        if (sensors.size() == 0) {
+        if (sensors.isEmpty()) {
             throw new RuntimeException("There are no sensors associated with this detector");
         }
 
@@ -289,6 +341,8 @@
         plotters.put("Occupancy", plotterFactory.create("Occupancy"));
         plotters.get("Occupancy").createRegions(6, 6);
 
+        occupancyStatus.setStatus(StatusCode.UNKNOWN, "Not enough statistics yet.");
+
         if (enablePositionPlots) {
             plotters.put("Occupancy vs Position", plotterFactory.create("Occupancy vs Position"));
             plotters.get("Occupancy vs Position").createRegions(6, 6);
@@ -297,12 +351,15 @@
         if (enableMaxSamplePlots) {
             plotters.put("Max Sample Number", plotterFactory.create("Max Sample Number"));
             plotters.get("Max Sample Number").createRegions(6, 6);
+            maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Not enough statistics yet.");
+        } else {
+            maxSampleStatus.setStatus(StatusCode.UNKNOWN, "Monitor disabled in steering file.");
         }
 
         for (HpsSiSensor sensor : sensors) {
             occupancyPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy", 640, 0, 640));
             plotters.get("Occupancy").region(SvtPlotUtils.computePlotterRegion(sensor))
-                    .plot(occupancyPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Physical Channel", sensor));
+                    .plot(occupancyPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Physical Channel", sensor, false));
 
             if (enablePositionPlots) {
                 if (sensor.isTopLayer()) {
@@ -314,7 +371,7 @@
                 }
 
                 plotters.get("Occupancy vs Position").region(SvtPlotUtils.computePlotterRegion(sensor))
-                        .plot(positionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor));
+                        .plot(positionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor, false));
             }
             occupancyMap.put(sensor.getName(), new int[640]);
 
@@ -322,14 +379,14 @@
                 maxSamplePositionPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Max Sample Number", 6, 0, 6));
                 plotters.get("Max Sample Number").region(SvtPlotUtils.computePlotterRegion(sensor))
                         .plot(maxSamplePositionPlots.get(sensor.getName()),
-                                this.createOccupancyPlotStyle("Max Sample Number", sensor));
+                                this.createOccupancyPlotStyle("Max Sample Number", sensor, false));
             }
         }
 
         for (IPlotter plotter : plotters.values()) {
             for (int regionN = 0; regionN < plotter.numberOfRegions(); regionN++) {
                 PlotterRegion region = ((PlotterRegion) ((Plotter) plotter).region(regionN));
-                if (region.getPlottedObjects().size() == 0) {
+                if (region.getPlottedObjects().isEmpty()) {
                     continue;
                 }
                 region.getPanel().addMouseListener(new PopupPlotterListener(region));
@@ -364,6 +421,7 @@
         return true;
     }
 
+    @Override
     public void process(EventHeader event) {
 
         // Get the run number from the event and store it.  This will be used 
@@ -390,14 +448,13 @@
         // Get RawTrackerHit collection from event.
         List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
 
+        if (resetPeriod > 0 && eventCount > resetPeriod) { //reset occupancy numbers after resetPeriod events
+            eventCount = 0;
+            resetPlots();
+        }
+
         eventCount++;
 
-        if (resetPeriod > 0 && eventCount > resetPeriod) { //reset occupancy numbers after resetPeriod events
-            eventCount = 1;
-            for (HpsSiSensor sensor : sensors) {
-                occupancyMap.put(sensor.getName(), new int[640]);
-            }
-        }
         // Increment strip hit count.
         for (RawTrackerHit rawHit : rawHits) {
 
@@ -426,6 +483,14 @@
             }
         }
 
+        if (enableMaxSamplePlots && eventCount > maxSampleMonitorStart && eventCount % maxSampleMonitorPeriod == 0) {
+            checkMaxSample();
+        }
+
+        if (eventCount > occupancyMonitorStart && eventCount % occupancyMonitorPeriod == 0) {
+            checkOccupancy();
+        }
+
         // Plot strip occupancies.
         if (eventCount % eventRefreshRate == 0) {
             for (HpsSiSensor sensor : sensors) {
@@ -448,6 +513,122 @@
         }
     }
 
+    private void checkMaxSample() {
+        StatusCode oldStatus = maxSampleStatus.getStatusCode();
+        boolean isSystemOK = true;
+        for (HpsSiSensor sensor : sensors) {
+            IHistogram1D maxSamplePlot = maxSamplePositionPlots.get(sensor.getName());
+            IPlotterRegion region = plotters.get("Max Sample Number").region(SvtPlotUtils.computePlotterRegion(sensor));
+
+            boolean isSensorOK = maxSamplePlot.binEntries(maxSamplePosition) > maxSamplePlot.binEntries(maxSamplePosition - 1)
+                    && maxSamplePlot.binEntries(maxSamplePosition) > maxSamplePlot.binEntries(maxSamplePosition + 1);
+            if (!isSensorOK) {
+                isSystemOK = false;
+                if (oldStatus != StatusCode.ALARM) {
+                    maxSampleStatus.setStatus(StatusCode.ALARM, "Sensor " + sensor.getName() + " looks out of time.");
+                }
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, true);
+//                region.clear();
+//                region.plot(maxSamplePlot, plotterStyle);
+                region.applyStyle(plotterStyle);
+//                region.style().regionBoxStyle().backgroundStyle().setColor("246, 34, 34, 1");
+//                setBackgroundColor(region.style(),sensor.isAxial(),true);
+
+            } else {
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, false);
+//                region.clear();
+//                region.plot(maxSamplePlot, plotterStyle);
+                region.applyStyle(plotterStyle);
+//                setBackgroundColor(region.style(),sensor.isAxial(),false);
+            }
+        }
+        if (isSystemOK) {
+            if (oldStatus != StatusCode.OKAY) {
+                maxSampleStatus.setStatus(StatusCode.OKAY, "All sensors are timed in.");
+            }
+        }
+    }
+
+    private void checkOccupancy() {
+        StatusCode oldStatus = occupancyStatus.getStatusCode();
+        boolean isSystemOK = true;
+        for (HpsSiSensor sensor : sensors) {
+            IHistogram1D occupancyPlot = occupancyPlots.get(sensor.getName());
+            IPlotterRegion region = plotters.get("Occupancy").region(SvtPlotUtils.computePlotterRegion(sensor));
+
+            double apvOccupancy[] = new double[5];
+            for (int i = 0; i < occupancyPlot.axis().bins(); i++) {
+                apvOccupancy[i / 128] += occupancyPlot.binHeight(i);
+            }
+            for (int i = 0; i < 5; i++) {
+                apvOccupancy[i] /= 128.0;
+            }
+
+            boolean isSensorOK = isOccupancyOK(apvOccupancy);
+            if (!isSensorOK) {
+                System.out.format("%s: %f %f %f %f %f\n", sensor.getName(), apvOccupancy[0], apvOccupancy[1], apvOccupancy[2], apvOccupancy[3], apvOccupancy[4]);
+                isSystemOK = false;
+                if (oldStatus != StatusCode.ALARM) {
+                    occupancyStatus.setStatus(StatusCode.ALARM, "Sensor " + sensor.getName() + " occupancy abnormal.");
+                }
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, true);
+                region.applyStyle(plotterStyle);
+
+            } else {
+                IPlotterStyle plotterStyle = createOccupancyPlotStyle("Max Sample Number", sensor, false);
+                region.applyStyle(plotterStyle);
+            }
+        }
+        if (isSystemOK) {
+            if (oldStatus != StatusCode.OKAY) {
+                occupancyStatus.setStatus(StatusCode.OKAY, "Occupancy looks OK.");
+            }
+        }
+    }
+
+    private boolean isOccupancyOK(double[] apvOccupancy) {
+        double peakOccupancy = 0;
+        int highestApv = -1;
+        for (int i = 0; i < 5; i++) {
+            if (apvOccupancy[i] > peakOccupancy) {
+                peakOccupancy = apvOccupancy[i];
+                highestApv = i;
+            }
+        }
+        if (highestApv != 0 && highestApv != 4) {
+            System.out.println("peak occupancy not at edge");
+            return false;
+        }
+        if (peakOccupancy > maxPeakOccupancy || peakOccupancy < minPeakOccupancy) {
+            System.out.println("peak occupancy out of range");
+            return false;
+        }
+        if (highestApv == 0) {
+            for (int i = 4; i > 0; i--) {
+                if (apvOccupancy[i] < 0.1 * peakOccupancy || apvOccupancy[i] < minPeakOccupancy) {
+                    continue; //skip through the tail end of the sensor
+                }
+                if (apvOccupancy[i] > apvOccupancy[i - 1]) {
+                    System.out.println("occupancy not monotonic");
+                    return false;
+                }
+            }
+        } else if (highestApv == 4) {
+            for (int i = 0; i < 4; i++) {
+                if (apvOccupancy[i] < 0.1 * peakOccupancy || apvOccupancy[i] < minPeakOccupancy) {
+                    continue; //skip through the tail end of the sensor
+                }
+                if (apvOccupancy[i] > apvOccupancy[i + 1]) {
+                    System.out.println("occupancy not monotonic");
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    @Override
     public void endOfData() {
 
         rootFile = "run" + runNumber + "_occupancy.root";
@@ -469,20 +650,20 @@
         int[] bottomActiveEdgeStripOccupancy = new int[6];
         for (HpsSiSensor sensor : sensors) {
             if (sensor.isTopLayer() && sensor.isAxial()) {
-                if (sensor.getSide() == sensor.ELECTRON_SIDE) {
-                    System.out.println("% Top Layer " + this.getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[1]);
-                    topActiveEdgeStripOccupancy[this.getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[1];
+                if (sensor.getSide().equals(HpsSiSensor.ELECTRON_SIDE)) {
+                    System.out.println("% Top Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[1]);
+                    topActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[1];
                 } else {
-                    System.out.println("% Top Layer " + this.getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[638]);
-                    topActiveEdgeStripOccupancy[this.getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[638];
+                    System.out.println("% Top Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[638]);
+                    topActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[638];
                 }
             } else if (sensor.isBottomLayer() && sensor.isAxial()) {
-                if (sensor.getSide() == sensor.ELECTRON_SIDE) {
-                    System.out.println("% Bottom Layer " + this.getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[1]);
-                    bottomActiveEdgeStripOccupancy[this.getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[1];
+                if (sensor.getSide().equals(HpsSiSensor.ELECTRON_SIDE)) {
+                    System.out.println("% Bottom Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[1]);
+                    bottomActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[1];
                 } else {
-                    System.out.println("% Bottom Layer " + this.getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[638]);
-                    bottomActiveEdgeStripOccupancy[this.getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[638];
+                    System.out.println("% Bottom Layer " + getLayerNumber(sensor) + " Hit Counts: " + occupancyMap.get(sensor.getName())[638]);
+                    bottomActiveEdgeStripOccupancy[getLayerNumber(sensor) - 1] += occupancyMap.get(sensor.getName())[638];
                 }
             }
         }