Print

Print


Author: [log in to unmask]
Date: Mon Aug 31 17:42:25 2015
New Revision: 3477

Log:
Add sample Drivers for calculating integrated luminosity for a job.

Added:
    java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityAnalysisDriver.java
    java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityDriver.java
    java/trunk/users/src/test/java/org/hps/users/jeremym/LuminosityAnalysisDriverTest.java
Modified:
    java/trunk/users/pom.xml

Modified: java/trunk/users/pom.xml
 =============================================================================
--- java/trunk/users/pom.xml	(original)
+++ java/trunk/users/pom.xml	Mon Aug 31 17:42:25 2015
@@ -14,6 +14,19 @@
         <connection>scm:svn:svn://svn.freehep.org/hps/java/trunk/users/</connection>
         <developerConnection>scm:svn:svn://svn.freehep.org/hps/java/trunk/users/</developerConnection>
     </scm>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>org/hps/users/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
     <dependencies>
         <dependency>
             <groupId>org.hps</groupId>

Added: java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityAnalysisDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityAnalysisDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityAnalysisDriver.java	Mon Aug 31 17:42:25 2015
@@ -0,0 +1,46 @@
+package org.hps.users.jeremym;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+/**
+ * Parent <code>Driver</code> showing how to use the {@link LuminosityDriver}.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+public class LuminosityAnalysisDriver extends Driver {
+
+    /**
+     * Reference to the <code>Driver</code> which will perform the calculation.
+     */
+    private final LuminosityDriver lumiDriver;
+
+    /**
+     * Class constructor.
+     * <p>
+     * Adds an instance of this <code>Driver</code>.
+     */
+    public LuminosityAnalysisDriver() {
+        lumiDriver = new LuminosityDriver();
+        this.add(lumiDriver);
+    }
+
+    /**
+     * End of job hook.
+     */
+    @Override
+    public void endOfData() {
+        super.endOfData();
+        System.out.println("luminosity for job was " + lumiDriver.getLuminosity() + "C");
+    }
+
+    /**
+     * Event processing hook.
+     *
+     * @param eventHeader the event to process
+     */
+    @Override
+    public void process(final EventHeader eventHeader) {
+        super.process(eventHeader);
+    }
+}

Added: java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/jeremym/LuminosityDriver.java	Mon Aug 31 17:42:25 2015
@@ -0,0 +1,115 @@
+package org.hps.users.jeremym;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hps.record.epics.EpicsData;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+/**
+ * Calculate integrated luminosity using EPICS data.
+ * <p>
+ * This does not calculate luminosity for time period before there is any EPICS data processed in the job, and the time
+ * period between the last EPICS event and the end of the job is also ignored.
+ * <p>
+ * This <code>Driver</code> would be easiest to use as a child of an analysis <code>Driver</code> so that the calculated
+ * luminosity can be easily retrieved in the parent's {@link org.lcsim.util.Driver#endOfData()} method.
+ *
+ * @author Jeremy McCormick, SLAC
+ * @see LuminosityAnalysisDriver
+ */
+public class LuminosityDriver extends Driver {
+
+    /**
+     * EPICS variable to use for current measurement.
+     */
+    private static final String EPICS_VARIABLE = "scaler_calc1";
+
+    /**
+     * Calculate the luminosity in coulomb given a list of EPICS data.
+     *
+     * @param epicsData the list of EPICS data
+     * @return the calculated luminosity
+     */
+    private static double calculateLuminosity(final List<EpicsData> epicsDataList) {
+        if (epicsDataList.isEmpty()) {
+            throw new RuntimeException("The EPICS data list is empty.");
+        }
+        double integratedLuminosity = 0;
+        for (int i = 0; i < epicsDataList.size(); i++) {
+            if (i != epicsDataList.size() - 1) {
+
+                // Get a pair of EPICS records.
+                final EpicsData epicsDataStart = epicsDataList.get(i);
+                final EpicsData epicsDataEnd = epicsDataList.get(i + 1);
+
+                // Calculate elapsed time between the EPICS events.
+                int timeLength = epicsDataEnd.getEpicsHeader().getTimestamp()
+                        - epicsDataStart.getEpicsHeader().getTimestamp();
+
+                if (timeLength == 0) {
+                    // Force at least 1 second time resolution.
+                    timeLength = 1;
+                }
+
+                // Get average current over the time period.
+                final double averageCurrent = (epicsDataStart.getValue(EPICS_VARIABLE) + epicsDataEnd
+                        .getValue(EPICS_VARIABLE)) / 2.;
+
+                // Add the current for the time period to the integrated luminosity total.
+                integratedLuminosity += timeLength * averageCurrent;
+            }
+        }
+        // Convert from nano coulomb to coulomb.
+        integratedLuminosity *= 10e-9;
+        return integratedLuminosity;
+    }
+
+    /**
+     * The list of EPICS data accumulated during the job.
+     */
+    private final List<EpicsData> epicsDataList = new ArrayList<EpicsData>();
+
+    /**
+     * The final measurement of integrated
+     */
+    private double luminosity;
+
+    /**
+     * End of data hook which performs luminosity calculation.
+     */
+    @Override
+    public void endOfData() {
+        if (epicsDataList.isEmpty()) {
+            throw new RuntimeException("The EPICS data list is empty.");
+        }
+        luminosity = calculateLuminosity(this.epicsDataList);
+    }
+
+    /**
+     * Get the calculated luminosity for the job.
+     *
+     * @return the calculated luminosity for the job
+     */
+    public double getLuminosity() {
+        return luminosity;
+    }
+
+    /**
+     * Process an event.
+     *
+     * @param eventHeader the event header
+     */
+    @Override
+    public void process(final EventHeader eventHeader) {
+        final EpicsData epicsData = EpicsData.read(eventHeader);
+        if (epicsData != null) {
+            if (epicsData.hasKey(EPICS_VARIABLE)) {
+                System.out.println("adding EPICS data with timestamp " + epicsData.getEpicsHeader().getTimestamp()
+                        + " and Faraday cup current " + epicsData.getValue(EPICS_VARIABLE));
+                epicsDataList.add(epicsData);
+            }
+        }
+    }
+}

Added: java/trunk/users/src/test/java/org/hps/users/jeremym/LuminosityAnalysisDriverTest.java
 =============================================================================
--- java/trunk/users/src/test/java/org/hps/users/jeremym/LuminosityAnalysisDriverTest.java	(added)
+++ java/trunk/users/src/test/java/org/hps/users/jeremym/LuminosityAnalysisDriverTest.java	Mon Aug 31 17:42:25 2015
@@ -0,0 +1,28 @@
+package org.hps.users.jeremym;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.lcsim.util.loop.LCSimLoop;
+
+/**
+ * Basic test of {@link LuminosityAnalysisDriver}.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+public class LuminosityAnalysisDriverTest extends TestCase {
+
+    /**
+     * Run the test.
+     *
+     * @throws Exception if any error occurs
+     */
+    public void testLuminosityAnalysisDriver() throws Exception {
+        final LCSimLoop loop = new LCSimLoop();
+        loop.add(new LuminosityAnalysisDriver());
+        loop.setLCIORecordSource(new File("/u1/test/hps/recon/hps_005772_data_only.slcio"));
+        loop.loop(-1);
+    }
+
+}