Print

Print


Author: [log in to unmask]
Date: Thu Aug 27 15:37:55 2015
New Revision: 3422

Log:
Allow processing of multiple track collections. Set the recon particle type based on the track type.

Modified:
    java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java

Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	(original)
+++ java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	Thu Aug 27 15:37:55 2015
@@ -7,13 +7,14 @@
 import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.hps.recon.ecal.cluster.ClusterType;
 import org.hps.recon.ecal.cluster.ClusterUtilities;
 import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.recon.utils.TrackClusterMatcher;
-
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.ReconstructedParticle;
@@ -198,19 +199,24 @@
 
         // Create a list of unmatched clusters. A cluster should be
         // removed from the list if a matching track is found.
-        //List<Cluster> unmatchedClusters = new ArrayList<Cluster>(clusters);
-        java.util.Set<Cluster> unmatchedClusters = new java.util.HashSet<Cluster>(clusters);
+        Set<Cluster> unmatchedClusters = new HashSet<Cluster>(clusters);
 
         // Iterate over all of the tracks and generate reconstructed
         // particles for each one. If possible, match a cluster to the
         // track as well.
         for (Track track : tracks) {
+            
             // Create a reconstructed particle to represent the track.
             ReconstructedParticle particle = new BaseReconstructedParticle();
             HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0);
 
             // Store the track in the particle.
             particle.addTrack(track);
+            
+            // Set the type of the particle.  This is used to identify
+            // the tracking strategy used in finding the track associated with
+            // this particle.
+            ((BaseReconstructedParticle) particle).setType(track.getType());
 
             // Store the momentum derived from the track in the particle.
             Hep3Vector momentum = new BasicHep3Vector(track.getTrackStates().get(0).getMomentum());
@@ -343,32 +349,34 @@
      */
     @Override
     protected void process(EventHeader event) {
-        // All events are required to contain calorimeter clusters. If
+        
+        // All events are required to contain Ecal clusters. If
         // the event lacks these, then it should be skipped.
-        if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) {
-            return;
-        }
+        if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) return;
 
         // VERBOSE :: Note that a new event is being read.
         printDebug("\nProcessing Event...");
 
-        // Otherwise, get the list of calorimeter clusters.
+        // Get the list of Ecal clusters from an event.
         List<Cluster> clusters = event.get(Cluster.class, ecalClustersCollectionName);
 
         // VERBOSE :: Output the number of clusters in the event.
         printDebug("Clusters :: " + clusters.size());
-
-        // Get the set of tracks from the event. If no such collection
-        // exists, initialize an empty list instead.
-        List<Track> tracks;
-        if (event.hasCollection(Track.class, trackCollectionName)) {
-            tracks = event.get(Track.class, trackCollectionName);
+        
+        // Get all collections of the type Track from the event. This is
+        // required in case an event contains different track collection
+        // for each of the different tracking strategies.  If the event
+        // doesn't contain any track collections, intialize an empty 
+        // collection and add it to the list of collections.  This is 
+        // needed in order to create final state particles from the the 
+        // Ecal clusters in the event.
+        List<List<Track>> trackCollections;
+        if (event.hasCollection(Track.class)) {
+            trackCollections = event.get(Track.class);
         } else {
-            tracks = new ArrayList<Track>(0);
-        }
-
-        // VERBOSE :: Output the number of tracks in the event.
-        printDebug("Tracks :: " + tracks.size());
+            trackCollections = new ArrayList<List<Track>>(0);
+            trackCollections.add(new ArrayList<Track>(0));
+        }
 
         // Instantiate new lists to store reconstructed particles and
         // V0 candidate particles and vertices.
@@ -382,13 +390,16 @@
         beamConV0Vertices = new ArrayList<Vertex>();
         targetConV0Vertices = new ArrayList<Vertex>();
 
-        // Generate the reconstructed particles.
-        finalStateParticles = makeReconstructedParticles(clusters, tracks);
+        // Loop through all of the track collections present in the event and 
+        // create final state particles.
+        for (List<Track> tracks : trackCollections) { 
+            finalStateParticles.addAll(makeReconstructedParticles(clusters, tracks));
+        }
 
         // VERBOSE :: Output the number of reconstructed particles.
         printDebug("Final State Particles :: " + finalStateParticles.size());
 
-        // Store the reconstructed particles collection.
+        // Add the final state ReconstructedParticles to the event
         event.put(finalStateParticlesColName, finalStateParticles, ReconstructedParticle.class, 0);
 
         // Separate the reconstructed particles into electrons and