Author: [log in to unmask]
Date: Fri May 22 13:58:13 2015
New Revision: 3011
Log:
Add Driver for copying cluster collections. HPSJAVA-520
Added:
java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/CopyClusterCollectionDriver.java
Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/CopyClusterCollectionDriver.java
=============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/CopyClusterCollectionDriver.java (added)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/CopyClusterCollectionDriver.java Fri May 22 13:58:13 2015
@@ -0,0 +1,129 @@
+package org.hps.recon.ecal.cluster;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.base.BaseCluster;
+import org.lcsim.lcio.LCIOConstants;
+import org.lcsim.util.Driver;
+
+/**
+ * Copy a {@link org.lcsim.event.Cluster} collection to a new collection via the {@link org.lcsim.event.base.BaseCluster} class's
+ * copy constructor.
+ *
+ * @author Jeremy McCormick
+ */
+public class CopyClusterCollectionDriver extends Driver {
+
+ /**
+ * The input collection name.
+ */
+ private String inputCollectionName = null;
+
+ /**
+ * The output collection name.
+ */
+ private String outputCollectionName = null;
+
+ /**
+ * Set to <code>true</code> to store hits in the output clusters.
+ */
+ private boolean storeHits = true;
+
+ /**
+ * Basic no argument constructor.
+ */
+ public CopyClusterCollectionDriver() {
+ }
+
+ /**
+ * Start of data hook which will make sure required arguments are set properly.
+ */
+ public void startOfData() {
+ if (inputCollectionName == null) {
+ throw new RuntimeException("inputCollectionName was never set");
+ }
+ if (outputCollectionName == null) {
+ throw new RuntimeException("outputCollectionName was never set");
+ }
+ if (inputCollectionName.equals(outputCollectionName)) {
+ throw new IllegalArgumentException("inputCollectionName and outputCollectionName are the same");
+ }
+ }
+
+ /**
+ * Set the input collection name (source).
+ *
+ * @param inputCollectionName the input collection name
+ */
+ public void setInputCollectionName(String inputCollectionName) {
+ this.inputCollectionName = inputCollectionName;
+ }
+
+ /**
+ * Set the output collection name (target).
+ *
+ * @param outputCollectionName the output collection name
+ */
+ public void setOutputCollectionName(String outputCollectionName) {
+ this.outputCollectionName = outputCollectionName;
+ }
+
+ /**
+ * Set to <code>true</code> to store hits in the output clusters.
+ *
+ * @return <code>true</code> to store hits in the output clusters
+ */
+ public void setStoreHits(boolean storeHits) {
+ this.storeHits = storeHits;
+ }
+
+ /**
+ * Process an event, copying the input collection to the output collection.
+ *
+ * @param event the LCSim event
+ */
+ public void process(EventHeader event) {
+
+ // Check if output collection already exists in event which is an error.
+ if (event.hasItem(outputCollectionName)) {
+ throw new RuntimeException("collection " + outputCollectionName + " already exists in event");
+ }
+
+ // Get the input collection.
+ List<Cluster> inputClusterCollection = event.get(Cluster.class, inputCollectionName);
+
+ // Copy to the output collection.
+ List<Cluster> outputClusterCollection = copyClusters(inputClusterCollection);
+
+ // Copy input collection's flags.
+ int flags = event.getMetaData(inputClusterCollection).getFlags();
+
+ // Set the store hits bit from this Driver's settings.
+ if (storeHits) {
+ flags = flags | (1 << LCIOConstants.CLBIT_HITS);
+ } else {
+ flags = flags & (0 << LCIOConstants.CLBIT_HITS);
+ }
+
+ // Put the copied collection into the event.
+ event.put(outputCollectionName, outputClusterCollection, Cluster.class, flags);
+ }
+
+ /**
+ * Copy clusters to a new collection (list).
+ *
+ * @param clusters the input cluster list
+ * @return the output cluster collection from copying the input list
+ */
+ public List<Cluster> copyClusters(List<Cluster> clusters) {
+ List<Cluster> newCollection = new ArrayList<Cluster>();
+ for (Cluster cluster : clusters) {
+ // Use the base class's copy constructor to make a new cluster from the input.
+ newCollection.add(new BaseCluster(cluster));
+ }
+ return newCollection;
+ }
+}
|