Commit in hps-java/src/main on MAIN | |||
java/org/lcsim/hps/monitoring/SensorOccupancyPlotsDriver.java | +56 | -17 | 1.2 -> 1.3 |
/MonitoringConsumer.java | +50 | -27 | 1.1 -> 1.2 |
/MonitoringGui.java | +60 | -15 | 1.1 -> 1.2 |
resources/org/lcsim/hps/steering/EtSensorOccupancy.lcsim | +8 | -10 | 1.1 -> 1.2 |
+174 | -69 |
monitoring updates
diff -u -r1.2 -r1.3 --- SensorOccupancyPlotsDriver.java 23 Mar 2012 23:47:05 -0000 1.2 +++ SensorOccupancyPlotsDriver.java 25 Mar 2012 07:23:20 -0000 1.3 @@ -12,6 +12,7 @@
import org.lcsim.detector.tracker.silicon.SiSensor; import org.lcsim.event.EventHeader; import org.lcsim.event.RawTrackerHit;
+import org.lcsim.detector.identifier.*;
import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA;
@@ -27,10 +28,16 @@
private String trackerName = "Tracker"; private int eventCount = 0; private int eventRefreshRate = 1;
+ private boolean debug = true; + Map<SiSensor,Integer> sensorRegionMap;
public SensorOccupancyPlotsDriver() {}
+ public void setDebug(boolean debug) { + this.debug = debug; + } +
public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) { this.rawTrackerHitCollectionName = rawTrackerHitCollectionName; }
@@ -38,7 +45,23 @@
public void setEventRefreshRate(int eventRefreshRate) { this.eventRefreshRate = eventRefreshRate; }
-
+ /*
+ private int computeRegion(SiSensor sensor, IIdentifierHelper helper) {
+ IIdentifier id = sensor.getIdentifier();
+ int layer = sensor.getIdentifierHelper().getValue(id, "layer"); // 1-10; axial layers are odd layers; stereo layers are even
+ int module = sensor.getIdentifierHelper().getValue(id, "module"); // 0-1; module number is top or bottom
+ int ix = (layer - 1) / 2;
+ int iy = 0;
+ if (module > 0) {
+ iy += 2;
+ }
+ if (layer % 2 == 0) {
+ iy += 1;
+ }
+ int region = iy * 4 + ix;
+ return region;
+ }
+ */
protected void detectorChanged(Detector detector) { // If called > 1 then destroy plots that might be currently up.
@@ -63,46 +86,65 @@
// Make a list of SiSensors in the SVT. sensors = this.detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
-
+
// For now throw an error if there are "too many" sensors. if (sensors.size() > 20) { throw new RuntimeException("Can't handle > 20 sensors at a time."); }
- - // Reset or setup the data structure for occupancy calculations by sensor.
+ + // Map a map of sensors to their region numbers in the plotter. + IIdentifierHelper helper = sensors.get(0).getIdentifierHelper(); + sensorRegionMap = new HashMap<SiSensor,Integer>(); + for (SiSensor sensor : sensors) { + + IIdentifier id = sensor.getIdentifier(); + + int layer = helper.getValue(id, "layer"); // 1-10; axial layers are odd layers; stereo layers are even + int module = helper.getValue(id, "module"); // 0-1; module number is top or bottom + + int ix = (layer - 1) / 2; + int iy = 0; + if (module > 0) { + iy += 2; + } + if (layer % 2 == 0) { + iy += 1; + } + int region = ix * 4 + iy; + + System.out.println(sensor.getName() + "; lyr=" + layer + "; mod=" + module + " -> xy[" + ix + "][" + iy + "] -> reg="+region); + sensorRegionMap.put(sensor,region); + } +
resetOccupancyMap(); // Setup the occupancy plots.
- int region = 0;
aida.tree().cd("/"); for (SiSensor sensor : sensors) { IHistogram1D occupancyPlot = aida.histogram1D(sensor.getName(), 640, 0, 639);
- occuPlotter.region(region).plot(occupancyPlot); - ++region;
+ occuPlotter.region(sensorRegionMap.get(sensor)).plot(occupancyPlot);
} occuPlotter.show(); } public void process(EventHeader event) {
+ if (debug) + System.out.println("SensorOccupancyPlots.process"); +
// Increment event counter. ++eventCount; // Get RawTrackerHit collection from event. List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
- // Loop over RawTrackerHit collection and increment occupancies.
+ // Increment hit count of each strip.
for (RawTrackerHit hit : rawTrackerHits) {
- // Increment hit counts for each strip.
int[] strips = occupancyMap.get((SiSensor) hit.getDetectorElement()); strips[hit.getIdentifierFieldValue("strip")] += 1; } if (eventCount % this.eventRefreshRate == 0) {
- - // Occupancy plots are redrawn each time. - occuPlotter.clearRegions(); - int region = 0;
for (SiSensor sensor : sensors) { IHistogram1D sensorHist = aida.histogram1D(sensor.getName()); sensorHist.reset();
@@ -113,15 +155,12 @@
sensorHist.fill(i, stripOccupancy); } }
- occuPlotter.region(region).plot(aida.histogram1D(sensor.getName())); - ++region;
}
- occuPlotter.show();
+ //occuPlotter.show();
} } private void resetOccupancyMap() {
- // Data structure for occupancy calculations by sensor.
occupancyMap = new HashMap<SiSensor,int[]>(); for (SiSensor sensor : sensors) { occupancyMap.put(sensor, new int[640]);
diff -u -r1.1 -r1.2 --- MonitoringConsumer.java 22 Mar 2012 22:03:35 -0000 1.1 +++ MonitoringConsumer.java 25 Mar 2012 07:23:20 -0000 1.2 @@ -35,12 +35,13 @@
// TODO Integrate the ConnectionPanel so that it can be used for changing connection parameters. public class MonitoringConsumer {
- // TODO Next two should be job options.
+ // TODO Next two should be job options or at least CL options.
private static final String detectorName = "HPS-Test-JLAB-v4pt0";
- private static final String lcsimXml = "/org/lcsim/hps/steering/EtTest.lcsim"; -
+ //private static final String lcsimXml = "/org/lcsim/hps/steering/EtTest.lcsim"; + private static final String lcsimXml = "/org/lcsim/hps/steering/EtSensorOccupancy.lcsim"; +
private MonitoringGui gui;
- private int eventCount;
+ //private int eventCount;
private JobControlManager jobMgr;
@@ -53,7 +54,9 @@
} public void run(String[] args) {
-
+ + boolean debug = false; +
// Create ET system connection parameters. ConnectionParameters cn = new ConnectionParameters(); try {
@@ -87,9 +90,6 @@
// attach to new station EtAttachment att = sys.attach(stat);
- - // array of events - EtEvent[] mevs = null;
// Job manager to run LCSim. jobMgr = new JobControlManager();
@@ -112,7 +112,7 @@
// Make the builder for creating LCSim events from EVIO data. LCSimEventBuilder eventBuilder = new LCSimEventBuilder(detectorName);
- eventBuilder.setDebug(true);
+ eventBuilder.setDebug(false);
// Show GUI. MonitoringGui.main(new String[]{});
@@ -120,28 +120,36 @@
gui = MonitoringGui.getMonitoringGui(); gui.setJobControlManager(jobMgr);
- ConnectionPanel.main(new String[]{});
+ //ConnectionPanel.main(new String[]{});
// Start job timer. gui.updateJobStartTime();
-
// Event loop.
+ // array of events + EtEvent[] mevs = null; + int eventCount = 0;
while (true) {
- - // Use these arguments for unlimited wait time. - //mevs = sys.getEvents(att, Mode.SLEEP, null, 0, chunk); - boolean timedOut = false;
+ //System.out.println("top of EtEvent loop"); + //boolean timedOut = false;
try {
- mevs = sys.getEvents(att, Mode.TIMED, Modify.NOTHING, 10000000, cn.chunk);
+ if (debug) + System.out.println("waiting for EtEvents"); + //mevs = sys.getEvents(att, Mode.SLEEP, Modify.NOTHING, 0, cn.chunk); + mevs = sys.getEvents(att, Mode.TIMED, Modify.NOTHING, 20000000, cn.chunk); + eventCount += mevs.length; + if (debug) { + System.out.println("event count <" + eventCount + ">"); + System.out.println("got " + mevs.length + " EtEvents"); + }
} catch (EtTimeoutException e) {
- timedOut = true; - }
+ // timedOut = true; + //}
// When timeout occurs, do cleanup and exit.
- if (timedOut) { -
+ //if (timedOut) { + //System.out.println("timed out");
// Call wrapper to Driver.endOfData() on DriverAdapter. driverAdapter.finish(null);
-
+ //System.exit(0);
// Exit after user presses enter. System.out.println("Press ENTER to exit ..."); System.console().readLine();
@@ -150,9 +158,10 @@
// Loop over retrieved EtEvents. for (EtEvent mev : mevs) {
-
+ gui.updateEventCount();
// Increment GUI event count.
- gui.incrEventCount();
+ //if (gui.) + //
// Get EvioEvent and check for errors. ByteBuffer buf = mev.getDataBuffer();
@@ -161,21 +170,34 @@
try { evioEvent = reader.parseNextEvent(); } catch (java.nio.BufferUnderflowException e) {
- System.out.println("Caught underflow!");
+ if (debug) + System.out.println("Caught underflow!");
} if (evioEvent == null) {
- System.out.println("Failed to build EVIO event <" + eventCount + ">. Skipping this EtEvent!");
+ if (debug) + System.out.println("Failed to build EVIO event. Skipping this EtEvent!");
continue; }
-
+
// Create LCSim event from EVIO data.
+ if (debug) + System.out.println("building lcsim event"); + long lcsimStartTime = System.nanoTime();
EventHeader lcsimEvent = eventBuilder.makeLCSimEvent(evioEvent); // Make a new event for DriverAdapter. RecordSuppliedEvent loopEvent = new RecordSuppliedEvent(new Object(), lcsimEvent); // Call process methods via Driver Adapter.
+ if (debug) + System.out.println("running lcsim");
driverAdapter.recordSupplied(loopEvent);
+ long lcsimEndTime = System.nanoTime(); + long lcsimEventTime = lcsimEndTime - lcsimStartTime; + if (debug) + System.out.println("lcsim proc time [ns]: " + lcsimEventTime); + + //System.out.println("done running lcsim");
// Update elapsed time. gui.updateElapsedTime();
@@ -183,7 +205,8 @@
// Update the average event rate in the GUI. gui.updateAverageEventRate(); }
-
+ if (debug) + System.out.println("putting events back");
// Put events back into the ET system. sys.putEvents(att, mevs); }
diff -u -r1.1 -r1.2 --- MonitoringGui.java 22 Mar 2012 22:03:35 -0000 1.1 +++ MonitoringGui.java 25 Mar 2012 07:23:20 -0000 1.2 @@ -23,19 +23,25 @@
public class MonitoringGui extends JPanel implements ActionListener {
- private JButton resetButton; - private JButton saveButton; - private JButton quitButton;
private JTextField eventCounterField; private JTextField elapsedTimeField; //private JTextField eventRateField; private JTextField avgEventRateField;
+ private JTextField refreshField;
private DecimalFormat rateFormat = new DecimalFormat("#.##");
-
+ + private JButton resetButton; + private JButton saveButton; + private JButton quitButton; +
private static JobControlManager jobMgr; private static MonitoringGui monitoringGui;
+ // Refresh every 1000 events by default. + private int eventRefresh = 1000; +
private long jobStartTime;
+ private int eventCount;
MonitoringGui() {
@@ -131,6 +137,24 @@
avgEventRateField.setEditable(false); avgEventRateField.setBackground(Color.WHITE); fieldsPanel.add(avgEventRateField, c);
+ + c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 3; + c.anchor = GridBagConstraints.WEST; + JLabel refreshLabel = new JLabel("Event Refresh:"); + refreshLabel.setHorizontalAlignment(JLabel.LEFT); + fieldsPanel.add(refreshLabel, c); + + c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = 3; + c.anchor = GridBagConstraints.EAST; + refreshField = new JTextField(Integer.toString(eventRefresh), 4); + refreshField.setHorizontalAlignment(JTextField.RIGHT); + + fieldsPanel.add(refreshField, c); +
// Button padding. Insets buttonInsets = new Insets(1, 1, 1, 1);
@@ -168,7 +192,7 @@
quitButton.setToolTipText("Quit the job."); buttonsPanel.add(quitButton, c); }
-
+
public static MonitoringGui getMonitoringGui() { return MonitoringGui.monitoringGui; }
@@ -177,27 +201,48 @@
MonitoringGui.jobMgr = jobMgr; }
- public void incrEventCount() { - int e = Integer.parseInt(eventCounterField.getText()); - e += 1; - eventCounterField.setText(Integer.toString(e));
+ public int getEventCount() { + return eventCount; + } + + public int getEventRefresh() { + return Integer.parseInt(refreshField.getText()); + } + + public void updateEventCount() { + ++eventCount; + if (updateEvent()) { + eventCounterField.setText(Integer.toString(eventCount)); + }
} public void updateJobStartTime() { this.jobStartTime = System.currentTimeMillis(); }
- public void updateAverageEventRate() { - double avgProcTime = (System.currentTimeMillis() - jobStartTime) / Double.parseDouble(eventCounterField.getText()); - double avgEventRate = 1000 / avgProcTime; - avgEventRateField.setText(rateFormat.format(avgEventRate));
+ public boolean updateEvent() { + return (eventCount % getEventRefresh()) == 0;
}
+ public void updateAverageEventRate() { + if (updateEvent()) { + double jobTime = System.currentTimeMillis() - jobStartTime; + if (jobTime > 0) { + double avgProcTime = jobTime / eventCount; + double avgEventRate = 10e3 / avgProcTime; + avgEventRateField.setText(rateFormat.format(avgEventRate)); + } + } + } +
public void updateElapsedTime() {
- this.elapsedTimeField.setText(Long.toString(System.currentTimeMillis() - jobStartTime));
+ if (updateEvent()) { + this.elapsedTimeField.setText(Long.toString(System.currentTimeMillis() - jobStartTime)); + }
}
-
+
private void resetEventCount() {
+ eventCount = 0;
eventCounterField.setText("0"); }
diff -u -r1.1 -r1.2 --- EtSensorOccupancy.lcsim 24 Mar 2012 00:06:49 -0000 1.1 +++ EtSensorOccupancy.lcsim 25 Mar 2012 07:23:21 -0000 1.2 @@ -11,19 +11,17 @@
<execute> <driver name="SVTSetupDriver"/> <driver name="EventMarkerDriver"/>
- <driver name="OccupancyPlots"
+ <driver name="OccupancyPlots"/>
</execute> <drivers>
- <driver name="SVTSetupDriver" - type="org.lcsim.hps.recon.tracking.HPSSVTSensorSetup">
+ <driver name="SVTSetupDriver" type="org.lcsim.hps.recon.tracking.HPSSVTSensorSetup">
</driver>
- <driver name="EventMarkerDriver" - type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>1</eventInterval>
+ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> + <eventInterval>10000</eventInterval>
</driver>
- <driver name="OccupancyPlots"> - type="org.lcsim.hps.monitoring.SensorOccupancyPlotsDriver"> - <eventRefreshRate>10</eventRefreshRate>
+ <driver name="OccupancyPlots" type="org.lcsim.hps.monitoring.SensorOccupancyPlotsDriver"> + <debug>false</debug> + <eventRefreshRate>4000</eventRefreshRate>
</driver> </drivers>
-</lcsim>
+</lcsim>
\ No newline at end of file
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1