Print

Print


Author: [log in to unmask]
Date: Thu Jan 22 15:40:20 2015
New Revision: 1971

Log:
Fix conditions setup based on previous changes to event builder.  Also initial support for getting run numbers from events during monitoring session.

Added:
    java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java
Modified:
    java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java
    java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java

Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java
 =============================================================================
--- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java	(original)
+++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java	Thu Jan 22 15:40:20 2015
@@ -60,7 +60,6 @@
 
 import javax.imageio.ImageIO;
 import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
@@ -70,7 +69,6 @@
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
 import javax.swing.JTable;
 import javax.swing.SwingUtilities;
 import javax.swing.table.DefaultTableModel;
@@ -97,6 +95,7 @@
 import org.hps.record.composite.EventProcessingThread;
 import org.hps.record.enums.DataSourceType;
 import org.hps.record.et.EtConnection;
+import org.hps.record.evio.EvioDetectorConditionsProcessor;
 import org.jlab.coda.jevio.EvioException;
 import org.jlab.coda.jevio.EvioReader;
 import org.lcsim.conditions.ConditionsManager;
@@ -985,7 +984,7 @@
             // Start thread which will trigger a disconnect if the event processing finishes.
             startSessionWatchdogThread();            
 
-            // Apparently, the visible plots won't draw without this!  (Unless the user clicks directly on the tab.)
+            // FIXME: Apparently, the visible plots won't draw without this!  (Unless the user clicks directly on the tab.)
             plotWindow.getPlotPane().requestFocusInWindow();            
 
             log(Level.INFO, "Successfully started the monitoring session.");
@@ -1036,6 +1035,7 @@
                 throw new IOException(e);
             }
         } else {
+            // This is when a direct file source is used and ET is not needed.
             this.setConnectionStatus(ConnectionStatus.CONNECTED);
         }
     }
@@ -1114,16 +1114,19 @@
         try {
             // Create and the job manager.  The conditions manager is instantiated from this call but not configured.
             jobManager = new JobManager();
+                        
+            // Setup the event builder to translate from EVIO to LCIO.
+            // This must happen before Driver setup so the builder's listeners are activated first!
+            createEventBuilder();
+            
+            // Configure the job manager for the XML steering.
             jobManager.setPerformDryRun(true);
             if (steeringType == SteeringType.RESOURCE) {
                 setupSteeringResource(steering);
             } else if (steeringType.equals(SteeringType.FILE)) {
                 setupSteeringFile(steering);
             }
-
-            // Setup the event builder to translate from EVIO to LCIO.
-            createEventBuilder();
-            
+           
             // Is there a user specified run number from the JobPanel?
             if (configurationModel.hasPropertyValue(ConfigurationModel.USER_RUN_NUMBER_PROPERTY)) {
                 int userRunNumber = configurationModel.getUserRunNumber();
@@ -1181,10 +1184,7 @@
             throw new RuntimeException("Failed to create LCSimEventBuilder.", e);
         }
 
-        // Set the detector name on the event builder so it can find conditions data.
-        // FIXME: This call should be made unnecessary by modifying the EventBuilder API to remove setDetectorName.
-        //eventBuilder.setDetectorName(configurationModel.getDetectorName());
-
+        // Add the builder as a listener so it is notified when conditions change.
         ConditionsManager.defaultInstance().addConditionsListener(eventBuilder);
 
         log(Level.CONFIG, "Successfully initialized event builder <" + eventBuilderClassName + ">");
@@ -1345,10 +1345,13 @@
 
         // RunPanel updater.
         loopConfig.add(runPanel.new RunModelUpdater());
+        
+        // Setup for conditions activation via EVIO events.
+        loopConfig.add(new EvioDetectorConditionsProcessor(configurationModel.getDetectorName()));
 
         // Create the CompositeLoop with the configuration.
         loop = new CompositeLoop(loopConfig);
-
+                
         // Create the processing thread.
         processingThread = new EventProcessingThread(loop);
 

Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java	Thu Jan 22 15:40:20 2015
@@ -293,9 +293,10 @@
             if (config.eventBuilder != null) {
                 if (config.detectorName != null) {
                     // Is LCSim ConditionsManager installed yet?
-                    if (!ConditionsManager.isSetup())
-                        // Setup LCSim conditions system if not already.
+                    if (!ConditionsManager.isSetup()) {
+                        // Setup default LCSim conditions system if not already.
                         LCSimConditionsManagerImplementation.register();
+                    }
                     //config.eventBuilder.setDetectorName(config.detectorName);
                 } else {
                     throw new IllegalArgumentException("Missing detectorName in configuration.");

Added: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java	(added)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java	Thu Jan 22 15:40:20 2015
@@ -0,0 +1,71 @@
+package org.hps.record.evio;
+
+import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.jevio.EvioEvent;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
+
+/**
+ * <p>
+ * This is an {@link EvioEventProcessor} for initializing the conditions system
+ * from EVIO events.
+ * <p>
+ * The {@link #startRun(EvioEvent)} method will setup conditions from the pre start
+ * events.
+ * <p>
+ * The {@link #process(EvioEvent)} method will setup conditions from a head bank
+ * if it is present in the event.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class EvioDetectorConditionsProcessor extends EvioEventProcessor {
+
+    private String detectorName;
+    
+    public EvioDetectorConditionsProcessor(String detectorName) {
+        if (detectorName == null) {
+            throw new IllegalArgumentException("The detectorName argument is null.");
+        }
+        this.detectorName = detectorName;
+    }
+    
+    @Override
+    public void process(EvioEvent evioEvent) throws Exception {
+        // Get the head head bank from event.
+        BaseStructure headBank = EvioEventUtilities.getHeadBank(evioEvent);
+        
+        // Is the head bank present?
+        if (headBank != null) { 
+                                
+            // Get the run number from the head bank.
+            int runNumber = headBank.getIntData()[1];                    
+
+            // Initialize the conditions system from the detector name and run number.
+            try {
+                ConditionsManager.defaultInstance().setDetector(detectorName, runNumber);
+            } catch (ConditionsNotFoundException e) {
+                throw new RuntimeException("Error setting up conditions from EVIO head bank.", e);
+            }                   
+        } 
+    }
+
+    @Override
+    public void startRun(EvioEvent evioEvent) {
+        System.out.println("EvioDetectorConditionsProcessor.startRun");
+        if (EvioEventUtilities.isPreStartEvent(evioEvent)) {
+            // Get the pre start event's data bank.
+            int[] data = EvioEventUtilities.getControlEventData(evioEvent);
+            
+            // Get the run number from the bank.
+            int runNumber = data[1];            
+            
+            // Initialize the conditions system from the detector name and run number.
+            try {
+                System.out.println("  setting up conditions from pre start: " + detectorName + " #" + runNumber);
+                ConditionsManager.defaultInstance().setDetector(detectorName, runNumber);
+            } catch (ConditionsNotFoundException e) {
+                throw new RuntimeException("Error setting up conditions from EVIO pre start event.", e);
+            }
+        }
+    }
+}