LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  October 2014

HPS-SVN October 2014

Subject:

r1336 - in /java/trunk/recon/src/main/java/org/hps/recon/particle: HpsReconParticleDriver.java ReconParticleDriver.java TestRunReconParticleDriver.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Thu, 30 Oct 2014 04:25:22 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1270 lines)

Author: mccaky
Date: Wed Oct 29 21:25:20 2014
New Revision: 1336

Log:
Added documentation to particle reconstruction drivers and improved code efficiency.

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

Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java	(original)
+++ java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java	Wed Oct 29 21:25:20 2014
@@ -20,147 +20,188 @@
 import org.hps.recon.vertexing.BilliorVertex;
 import org.hps.recon.vertexing.BilliorVertexer;
 
-
 /**
- * The Main HPS implementation of ReconParticleDriver...makes V0 candidates and does vertex fits
+ * The main HPS implementation of ReconParticleDriver. Method generates
+ * V0 candidates and does vertex fits.
+ * 
  * @author Omar Moreno <[log in to unmask]>
  * @version $Id$
  */
 public class HpsReconParticleDriver extends ReconParticleDriver {
-	
-	private enum Constraint { 
-		UNCONSTRAINED, 
-		BS_CONSTRAINED, 
-		TARGET_CONSTRAINED
-	}
-	
-	public HpsReconParticleDriver(){}		
-
-	@Override
-	protected void startOfData(){
-		
-//		unconstrainedV0CandidatesColName    = "UnconstrainedV0Candidates";
-//		beamConV0CandidatesColName   		= "BeamspotConstrainedV0Candidates";
-//		targetConV0CandidatesColName 		= "TargetConstrainedV0Candidates";	
-//		unconstrainedV0VerticesColName 		= "UnconstrainedV0Vertices";
-//		beamConV0VerticesColName 			= "BeamspotConstrainedV0Vertices";
-//		targetConV0VerticesColName			= "TargetConstrainedV0Vertices";
-	}
-
-	/**
-	 * 
-	 */
-	@Override
-	void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) {
-		
-		ReconstructedParticle candidate = null; 
-		BilliorVertex vtxFit = null;
-		// Loop through both electrons and positrons and try to find a common vertex
-		for(ReconstructedParticle positron : positrons){
-			for(ReconstructedParticle electron : electrons){
-				
-				// Get the tracks associated with the electron and the positron
-				Track electronTrack = electron.getTracks().get(0); 
-				Track positronTrack = positron.getTracks().get(0); 
-				
-				// Covert the tracks to BilliorTracks used by the vertexer
-				BilliorTrack electronBTrack = toBilliorTrack(electronTrack); 
-				BilliorTrack positronBTrack = toBilliorTrack(positronTrack);
-			
-				for(Constraint constraint : Constraint.values()){
-					
-					vtxFit = fitVertex(constraint, electronBTrack, positronBTrack);
-				
-					candidate = makeReconstructedParticle(electron, positron, vtxFit); 
-					
-					
-					switch(constraint){
-						case UNCONSTRAINED: 
-							unconstrainedV0Vertices.add(vtxFit);
-							unconstrainedV0Candidates.add(candidate); 
-							break;
-						case BS_CONSTRAINED:
-							beamConV0Vertices.add(vtxFit);
-							beamConV0Candidates.add(candidate);
-							break;
-						case TARGET_CONSTRAINED:
-							targetConV0Vertices.add(vtxFit);
-							targetConV0Candidates.add(candidate);
-							break;
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * 
-	 */
-	BilliorVertex fitVertex(Constraint constraint, BilliorTrack electron, BilliorTrack positron){
-		
-		BilliorVertexer vtxFitter = new BilliorVertexer(bField);
-		// TODO: The beam size should come from the conditions database
-		vtxFitter.setBeamSize(beamsize);
-		
-		switch(constraint){
-			case UNCONSTRAINED: 
-				vtxFitter.doBeamSpotConstraint(false); 
-				break;
-			case BS_CONSTRAINED:
-				vtxFitter.doBeamSpotConstraint(true); 
-				break;
-			case TARGET_CONSTRAINED:
-				vtxFitter.doTargetConstraint(true);
-				break;
-		}
-				
-		List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>();
-		billiorTracks.add(electron);
-		billiorTracks.add(positron);
-		
-		return vtxFitter.fitVertex(billiorTracks);
-	}
-	
-	/**
-	 * 
-	 */
-	ReconstructedParticle makeReconstructedParticle(ReconstructedParticle electron, ReconstructedParticle positron, BilliorVertex vtxFit){
-		
-		ReconstructedParticle candidate = new BaseReconstructedParticle();
-		((BaseReconstructedParticle) candidate).setStartVertex(vtxFit);
-		candidate.addParticle(electron);
-		candidate.addParticle(positron);
-					
-		// TODO: The calculation of the total fitted momentum should be done within 
-		// 		 BilloirVertex
-		((BaseReconstructedParticle) candidate).setMass(vtxFit.getParameters().get("invMass"));
-		Hep3Vector fittedMomentum = new BasicHep3Vector(vtxFit.getParameters().get("p1X"), 
-		   											    vtxFit.getParameters().get("p1Y"), 
-														vtxFit.getParameters().get("p1Z"));
-		fittedMomentum = VecOp.add(fittedMomentum, new BasicHep3Vector(vtxFit.getParameters().get("p2X"), 
-																   	   vtxFit.getParameters().get("p2Y"),
-																       vtxFit.getParameters().get("p2Z")));
-		this.printDebug("Fitted momentum in tracking frame: " + fittedMomentum.toString());
-		fittedMomentum = CoordinateTransformations.transformVectorToDetector(fittedMomentum);
-		this.printDebug("Fitted momentum in detector frame: " + fittedMomentum.toString());
-		HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); 
-		((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), fittedMomentum);
-		((BaseReconstructedParticle) candidate).set4Vector(fourVector);
-		
-		// Add the ReconstructedParticle to the Vertex 
-		vtxFit.setAssociatedParticle(candidate);
-		
-		return candidate;
-		
-	}
-	
-
-	/**
-	 * 
-	 */
+    /**
+     * Represents a type of constraint for vertex fitting.
+     * 
+     * @author Omar Moreno <[log in to unmask]>
+     */
+    private enum Constraint { 
+        /** Represents a fit with no constraints. */
+        UNCONSTRAINED, 
+        /** Represents a fit with beam spot constraints. */
+        BS_CONSTRAINED, 
+        /** Represents a fit with target constraints. */
+        TARGET_CONSTRAINED
+    }
+    
+    /**
+     * Creates reconstructed V0 candidate particles and vertices for
+     * electron positron pairs using no constraints, beam constraints,
+     * and target constraints. These are saved to the appropriate lists
+     * in the super class.
+     * @param electrons - The list of electrons.
+     * @param positrons - The list of positrons.
+     */
+    @Override
+    protected void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) {
+        // Iterate over the positrons and electrons to perform vertexing
+        // on the pairs.
+        for(ReconstructedParticle positron : positrons) {
+            for(ReconstructedParticle electron : electrons) {
+                // Get the tracks associated with the electron and
+                // the positron.
+                Track electronTrack = electron.getTracks().get(0); 
+                Track positronTrack = positron.getTracks().get(0); 
+                
+                // Covert the tracks to BilliorTracks.
+                BilliorTrack electronBTrack = toBilliorTrack(electronTrack); 
+                BilliorTrack positronBTrack = toBilliorTrack(positronTrack);
+                
+                // Create candidate particles for each constraint.
+                for(Constraint constraint : Constraint.values()) {
+                    // Generate a candidate vertex and particle.
+                    BilliorVertex vtxFit = fitVertex(constraint, electronBTrack, positronBTrack);
+                    ReconstructedParticle candidate = makeReconstructedParticle(electron, positron, vtxFit); 
+                    
+                    // Add the candidate vertex and particle to the
+                    // appropriate LCIO collection.
+                    switch(constraint){
+                        case UNCONSTRAINED: 
+                            unconstrainedV0Vertices.add(vtxFit);
+                            unconstrainedV0Candidates.add(candidate); 
+                            break;
+                        case BS_CONSTRAINED:
+                            beamConV0Vertices.add(vtxFit);
+                            beamConV0Candidates.add(candidate);
+                            break;
+                        case TARGET_CONSTRAINED:
+                            targetConV0Vertices.add(vtxFit);
+                            targetConV0Candidates.add(candidate);
+                            break;
+                    }
+                }
+            }
+        }
+    }
+    
+    /**
+     * Sets the default LCIO collection names if they are not already
+     * defined previously.
+     */
+    @Override
+    protected void startOfData(){
+        // If the LCIO collection names have not been defined, assign
+        // them to the default names.
+        if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; }
+        if(beamConV0CandidatesColName == null) { beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; }
+        if(targetConV0CandidatesColName == null) { targetConV0CandidatesColName = "TargetConstrainedV0Candidates";     }
+        if(unconstrainedV0VerticesColName == null) { unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; }
+        if(beamConV0VerticesColName == null) { beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; }
+        if(targetConV0VerticesColName == null) { targetConV0VerticesColName = "TargetConstrainedV0Vertices"; }
+    }
+    
+    /**
+     * Fits a vertex from an electron/positron track pair using the
+     * indicated constraint.
+     * @param constraint - The constraint type to use.
+     * @param electron - The electron track.
+     * @param positron - The positron track.
+     * @return Returns the reconstructed vertex as a <code>BilliorVertex
+     * </code> object.
+     */
+    private BilliorVertex fitVertex(Constraint constraint, BilliorTrack electron, BilliorTrack positron){
+        // Create a vertex fitter from the magnetic field.
+        BilliorVertexer vtxFitter = new BilliorVertexer(bField);
+        // TODO: The beam size should come from the conditions database.
+        vtxFitter.setBeamSize(beamSize);
+        
+        // Perform the vertexing based on the specified constraint.
+        switch(constraint){
+            case UNCONSTRAINED: 
+                vtxFitter.doBeamSpotConstraint(false); 
+                break;
+            case BS_CONSTRAINED:
+                vtxFitter.doBeamSpotConstraint(true); 
+                break;
+            case TARGET_CONSTRAINED:
+                vtxFitter.doTargetConstraint(true);
+                break;
+        }
+        
+        // Add the electron and positron tracks to a track list for
+        // the vertex fitter.
+        List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>();
+        billiorTracks.add(electron);
+        billiorTracks.add(positron);
+        
+        // Find and return a vertex based on the tracks.
+        return vtxFitter.fitVertex(billiorTracks);
+    }
+    
+    /**
+     * Creates a reconstructed V0 candidate particle from an electron,
+     * positron, and billior vertex.
+     * @param electron - The electron.
+     * @param positron - The positron.
+     * @param vtxFit - The billior vertex.
+     * @return Returns a reconstructed particle with properties generated
+     * from the child particles and vertex given as an argument.
+     */
+    private ReconstructedParticle makeReconstructedParticle(ReconstructedParticle electron, ReconstructedParticle positron, BilliorVertex vtxFit){
+        // Create a new reconstructed particle to represent the V0
+        // candidate and populate it with the electron and positron.
+        ReconstructedParticle candidate = new BaseReconstructedParticle();
+        ((BaseReconstructedParticle) candidate).setStartVertex(vtxFit);
+        candidate.addParticle(electron);
+        candidate.addParticle(positron);
+        
+        // TODO: The calculation of the total fitted momentum should be
+        //       done within BilloirVertex.
+        // Calculate the candidate particle momentum and associate it
+        // with the reconstructed candidate particle.
+        ((BaseReconstructedParticle) candidate).setMass(vtxFit.getParameters().get("invMass"));
+        Hep3Vector fittedMomentum = new BasicHep3Vector(vtxFit.getParameters().get("p1X"), 
+                                                           vtxFit.getParameters().get("p1Y"), 
+                                                        vtxFit.getParameters().get("p1Z"));
+        fittedMomentum = VecOp.add(fittedMomentum, new BasicHep3Vector(vtxFit.getParameters().get("p2X"), 
+                                                                          vtxFit.getParameters().get("p2Y"),
+                                                                       vtxFit.getParameters().get("p2Z")));
+        fittedMomentum = CoordinateTransformations.transformVectorToDetector(fittedMomentum);
+        HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); 
+        ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), fittedMomentum);
+        ((BaseReconstructedParticle) candidate).set4Vector(fourVector);
+        
+        // VERBOSE :: Output the fitted momentum data.
+        printDebug("Fitted momentum in tracking frame: " + fittedMomentum.toString());
+        printDebug("Fitted momentum in detector frame: " + fittedMomentum.toString());
+        
+        // Add the ReconstructedParticle to the vertex.
+        vtxFit.setAssociatedParticle(candidate);
+        
+        // Return the V0 candidate.
+        return candidate;
+    }
+    
+    /**
+     * Converts a <code>Track</code> object to a <code>BilliorTrack
+     * </code> object.
+     * @param track - The original track.
+     * @return Returns the original track as a <code>BilliorTrack
+     * </code> object.
+     */
     private BilliorTrack toBilliorTrack(Track track) {
-    	
-    	HelicalTrackFit trackFit = ((SeedTrack) track).getSeedCandidate().getHelix();
-    	return new BilliorTrack(trackFit);
+        // Convert the track to a helical track fit.
+        HelicalTrackFit trackFit = ((SeedTrack) track).getSeedCandidate().getHelix();
+        
+        // Generate and return the billior track.
+        return new BilliorTrack(trackFit);
     }
 }

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	Wed Oct 29 21:25:20 2014
@@ -21,150 +21,318 @@
 import org.hps.recon.tracking.TrackUtils;
 
 /**
- * Driver that matches SVT Tracks and Ecal Clusters and creates
- * ReconstructedParticles.
+ * Driver framework for generating reconstructed particles and matching
+ * clusters and tracks.
  *
  * @author Mathew Graham <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  * @version $Id$
  */
 public abstract class ReconParticleDriver extends Driver {
-
-    // Flags
-    boolean debug = false;
-
-    // Reconstructed particle collections
-    List<ReconstructedParticle> finalStateParticles;
-    List<ReconstructedParticle> unconstrainedV0Candidates;
-    List<ReconstructedParticle> beamConV0Candidates;
-    List<ReconstructedParticle> targetConV0Candidates;
-    List<ReconstructedParticle> electrons;
-    List<ReconstructedParticle> positrons;
-    List<Vertex> unconstrainedV0Vertices;
-    List<Vertex> beamConV0Vertices;
-    List<Vertex> targetConV0Vertices;
-
-    // Collections
-    String ecalClustersCollectionName = "EcalClusters";
-    String tracksCollectionName = "MatchedTracks";
-    String finalStateParticlesColName = "FinalStateParticles";
-    String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates";
-    String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates";
-    String targetConV0CandidatesColName = "TargetConstrainedV0Candidates";
-    String unconstrainedV0VerticesColName = "UnconstrainedV0Vertices";
-    String beamConV0VerticesColName = "BeamspotConstrainedV0Vertices";
-    String targetConV0VerticesColName = "TargetConstrainedV0Vertices";
-//    String unconstrainedV0CandidatesColName = null;
-//    String beamConV0CandidatesColName = null;
-//    String targetConV0CandidatesColName = null;
-//    String vertexCandidatesColName = null;
-//    String vertexBeamConsCandidatesName = null;
-//	String unconstrainedV0VerticesColName = null;
-//	String beamConV0VerticesColName = null;
-//	String targetConV0VerticesColName = null;
-
-    // The beamsize array is in the tracking frame
-    /* TODO  mg-May 14, 2014:  the the beam size from the conditions db...also beam position!  */
-    double[] beamsize = {0.001, 0.2, 0.02};
-    double maxTrackClusterDistance = 10000; // [mm] 
-    double bField;
-
-    //  flipSign is a kludge...
-    //  HelicalTrackFitter doesn't deal with B-fields in -ive Z correctly
-    //  so we set the B-field in +iveZ and flip signs of fitted tracks
-    //  
-    //  Note:  This should be -1 for test run configurations and +1 for 
-    //         prop-2014 configurations 
-    int flipSign = 1;
-
-    public ReconParticleDriver() {
-    }
-
-    public void setDebug(boolean debug) {
-        this.debug = debug;
-    }
-
-    public void setMaxTrackClusterDistance(double maxTrackClusterDistance) {
-        this.maxTrackClusterDistance = maxTrackClusterDistance;
-    }
-
-    public void setBeamSigmaX(double sigma_x) {
-        beamsize[1] = sigma_x;
-    }
-
-    public void setBeamSigmaY(double sigma_y) {
-        beamsize[2] = sigma_y;
-    }
-
+    /**
+     * Sets the name of the LCIO collection for beam spot constrained
+     * V0 candidate particles.
+     * @param beamConV0CandidatesColName - The LCIO collection name.
+     */
+    public void setBeamConV0CandidatesColName(String beamConV0CandidatesColName) {
+        this.beamConV0CandidatesColName = beamConV0CandidatesColName;
+    }
+    
+    /**
+     * Sets the name of the LCIO collection for beam spot constrained
+     * V0 candidate vertices.
+     * @param beamConV0VerticesColName - The LCIO collection name.
+     */
+    public void setBeamConV0VerticesColName(String beamConV0VerticesColName) {
+        this.beamConV0VerticesColName = beamConV0VerticesColName;
+    }
+    
+    /**
+     * Sets the beam size sigma in the x-direction.
+     * @param sigmaX - The standard deviation of the beam width in the
+     * x-direction.
+     */
+    public void setBeamSigmaX(double sigmaX) { beamSize[1] = sigmaX; }
+    
+    /**
+     * Sets the beam size sigma in the y-direction.
+     * @param sigmaY - The standard deviation of the beam width in the
+     * y-direction.
+     */
+    public void setBeamSigmaY(double sigmaY) { beamSize[2] = sigmaY; }
+    
+    /**
+     * Indicates whether verbose debug text should be written out during
+     * runtime or note. Defaults to <code>false</code>.
+     * @param debug - <code>true</code> indicates that debug text should
+     * be written and <code>false</code> that it should be suppressed.
+     */
+    public void setDebug(boolean debug) { this.debug = debug; }
+    
+    /**
+     * Sets the maximum allowed separation distance between a matched
+     * cluster and track pair.
+     * @param dxCut - The maximum separation distance in the x-direction.
+     */
+    public void setDxCut(double dxCut) {
+        this.dxCut = dxCut;
+    }
+    
+    /**
+     * Sets the maximum allowed separation distance between a matched
+     * cluster and track pair.
+     * @param dyCut - The maximum separation distance in the y-direction.
+     */
+    public void setDyCut(double dyCut) {
+        this.dyCut = dyCut;
+    }
+    
+    /**
+     * Sets the LCIO collection name for calorimeter cluster data.
+     * @param ecalClustersCollectionName - The LCIO collection name.
+     */
     public void setEcalClusterCollectionName(String ecalClustersCollectionName) {
         this.ecalClustersCollectionName = ecalClustersCollectionName;
     }
-
+    
+    /**
+     * Sets the name of the LCIO collection for reconstructed particles.
+     * @param finalStateParticlesColName - The LCIO collection name.
+     */
+    public void setFinalStateParticlesColName(String finalStateParticlesColName) {
+        this.finalStateParticlesColName = finalStateParticlesColName;
+    }
+    
+    /**
+     * Sets the name of the LCIO collection for target constrained V0
+     * candidate particles.
+     * @param targetConV0CandidatesColName - The LCIO collection name.
+     */
+    public void setTargetConV0CandidatesColName(String targetConV0CandidatesColName) {
+        this.targetConV0CandidatesColName = targetConV0CandidatesColName;
+    }
+    
+    /**
+     * Sets the name of the LCIO collection for target constrained V0
+     * candidate vertices.
+     * @param targetConV0VerticesColName - The LCIO collection name.
+     */
+    public void setTargetConV0VerticesColName(String targetConV0VerticesColName) {
+        this.targetConV0VerticesColName = targetConV0VerticesColName;
+    }
+    
+    /**
+     * Sets the LCIO collection name for particle track data.
+     * @param tracksCollectionName - The LCIO collection name.
+     */
     public void setTracksCollectionName(String tracksCollectionName) {
         this.tracksCollectionName = tracksCollectionName;
     }
     
-    public void setFinalStateParticlesColName(String finalStateParticlesColName) {
-        this.finalStateParticlesColName = finalStateParticlesColName;
-    }
-    
-     
+    /**
+     * Sets the name of the LCIO collection for unconstrained V0
+     * candidate particles.
+     * @param unconstrainedV0CandidatesColName - The LCIO collection name.
+     */
     public void setUnconstrainedV0CandidatesColName(String unconstrainedV0CandidatesColName) {
         this.unconstrainedV0CandidatesColName = unconstrainedV0CandidatesColName;
     }
     
-    
-    public void setBeamConV0CandidatesColName(String beamConV0CandidatesColName) {
-        this.beamConV0CandidatesColName = beamConV0CandidatesColName;
-    }
-    
-     
-    public void setTargetConV0CandidatesColName(String targetV0CandidatesColName) {
-        this.targetConV0CandidatesColName = targetConV0CandidatesColName;
-    }
-    
-    
+    /**
+     * Sets the name of the LCIO collection for unconstrained V0
+     * candidate vertices.
+     * @param unconstrainedV0VerticesColName - The LCIO collection name.
+     */
     public void setUnconstrainedV0VerticesColName(String unconstrainedV0VerticesColName) {
         this.unconstrainedV0VerticesColName = unconstrainedV0VerticesColName;
     }
     
-    
-    public void setBeamConV0VerticesColName(String beamConV0VerticesColName) {
-        this.beamConV0VerticesColName = beamConV0VerticesColName;
-    }
-    
-     
-    public void setTargetConV0VerticesColName(String targetV0VerticesColName) {
-        this.targetConV0VerticesColName = targetConV0VerticesColName;
-    }
-
+    /**
+     * Updates the magnetic field parameters to match the appropriate
+     * values for the current detector settings.
+     */
     @Override
     protected void detectorChanged(Detector detector) {
-
+        // Set the magnetic field parameters to the appropriate values.
         Hep3Vector ip = new BasicHep3Vector(0., 0., 1.);
         bField = detector.getFieldMap().getField(ip).y();
-        if (bField < 0)
-            flipSign = -1;
-
-    }
-
-    public void process(EventHeader event) {
-
-        // All events should have a collection of Ecal clusters.  If the event 
-        // doesn't have one, skip the event.
-        if (!event.hasCollection(Cluster.class, ecalClustersCollectionName))
+        if (bField < 0) { flipSign = -1; }
+    }
+    
+    /**
+     * Generates reconstructed V0 candidate particles and vertices from
+     * sets of positrons and electrons. Implementing methods should
+     * place the reconstructed vertices and candidate particles into the
+     * appropriate class variable lists in <code>ReconParticleDriver
+     * </code>.
+     * @param electrons - The list of electrons.
+     * @param positrons - The list of positrons.
+     */
+    protected abstract void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons);
+    
+    /**
+     * Create the set of final state particles from the event tracks
+     * and clusters. Clusters will be matched with tracks when this
+     * is possible.
+     * @param clusters - The list of event clusters.
+     * @param tracks - The list of event tracks.
+     * @return Returns a <code>List</code> collection containing all
+     * of the <code>ReconstructedParticle</code> objects generated from
+     * the argument data.
+     */
+    protected List<ReconstructedParticle> makeReconstructedParticles(List<Cluster> clusters, List<Track> tracks) {
+        // Create a list in which to store reconstructed particles.
+        List<ReconstructedParticle> particles = new ArrayList<ReconstructedParticle>();
+        
+        // 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);
+        
+        // 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);
+            
+            // Store the momentum derived from the track in the particle.
+            Hep3Vector momentum = new BasicHep3Vector(track.getTrackStates().get(0).getMomentum());
+            momentum = CoordinateTransformations.transformVectorToDetector(momentum);
+            ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), momentum);
+            
+            // Derive the charge of the particle from the track.
+            ((BaseReconstructedParticle) particle).setCharge(track.getCharge() * flipSign);
+            
+            // Extrapolate the particle ID from the track. Positively
+            // charged particles are assumed to be positrons and those
+            // with negative charges are assumed to be electrons.
+            if (particle.getCharge() > 0) {
+                ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(-11, 0, 0, 0));
+            }
+            else if (particle.getCharge() < 0) {
+                ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(11, 0, 0, 0));
+            }
+            
+            // Track the best matching cluster for the track. A null
+            // value indicates that no cluster matches the track to
+            // within the maximum displacement limits.
+            Cluster matchedCluster = null;
+            
+            // Loop through all the unmatched clusters and select the
+            // cluster, if any, that best fits with the track.
+            clusterLoop:
+            for (Cluster cluster : unmatchedClusters) {
+                // Check if the cluster and track are a valid match.
+                if (isMatch(cluster, track)) {
+                    // Store the matched cluster.
+                    matchedCluster = cluster;
+                    
+                    // Since a match has been found, the loop can be
+                    // terminated.
+                    break clusterLoop;
+                }
+            }
+            
+            // If a cluster was found that matches the track...
+            if (matchedCluster != null) {
+                // Update the reconstructed particle with the data from
+                // the cluster.
+                particle.addCluster(matchedCluster);
+                ((BasicHepLorentzVector) fourVector).setT(matchedCluster.getEnergy());
+                
+                // Remove the cluster from the set of unmatched clusters.
+                unmatchedClusters.remove(matchedCluster);
+            }
+            
+            // Store the momentum vector in the reconstructed particle.
+            ((BaseReconstructedParticle) particle).set4Vector(fourVector);
+            
+            // Add the particle to the list of reconstructed particles.
+            particles.add(particle);
+        }
+        
+        // If any cluster remain unmatched after the tracks are finished,
+        // they should be processed into additional reconstructed particles.
+        if (!unmatchedClusters.isEmpty())
+            // Iterate over the remaining unmatched clusters.
+            for (Cluster unmatchedCluster : unmatchedClusters) {
+                // Create a reconstructed particle to represent the
+                // unmatched cluster.
+                ReconstructedParticle particle = new BaseReconstructedParticle();
+                HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0);
+                
+                // Add the cluster to the particle.
+                particle.addCluster(unmatchedCluster);
+                
+                // Set the reconstructed particle properties based on
+                // the cluster properties.
+                ((BasicHepLorentzVector) fourVector).setT(unmatchedCluster.getEnergy());
+                ((BaseReconstructedParticle) particle).setCharge(0);
+                ((BaseReconstructedParticle) particle).set4Vector(fourVector);
+                
+                // The particle is assumed to be a photon, since it
+                // did not leave any track.
+                ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(22, 0, 0, 0));
+                
+                // Add the particle to the reconstructed particle list.
+                particles.add(particle);
+            }
+        
+        // Return the list of reconstructed particles.
+        return particles;
+    }
+
+    /**
+     * Prints a message as per <code>System.out.println</code> to the
+     * output stream if the verbose debug output option is enabled.
+     * @param debugMessage - The message to print.
+     */
+    protected void printDebug(String debugMessage) {
+        // If verbose debug mode is enabled, print out the message.
+        if(debug) { System.out.printf("%s :: %s%n", simpleName, debugMessage); }
+    }
+    
+    /**
+     * Processes the track and cluster collections in the event into
+     * reconstructed particles and V0 candidate particles and vertices.
+     * These reconstructed particles are then stored in the event.
+     * @param event - The event to process.
+     */
+    @Override
+    protected void process(EventHeader event) {
+        // All events are required to contain calorimeter clusters. If
+        // the event lacks these, then it should be skipped.
+        if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) {
             return;
-
-        // Get the collection of Ecal clusters from the event. A triggered 
-        // event should have Ecal clusters.  If it doesn't, skip the event.
+        }
+        
+        // VERBOSE :: Note that a new event is being read.
+        printDebug("\nProcessing Event...");
+        
+        // Otherwise, get the list of calorimeter clusters.
         List<Cluster> clusters = event.get(Cluster.class, ecalClustersCollectionName);
-        //if(clusters.isEmpty()) return;  
-        this.printDebug("Number of Ecal clusters: " + clusters.size());
-
-        // Get the collection of tracks from the event
-        List<Track> tracks = event.get(Track.class, tracksCollectionName);
-        this.printDebug("Number of Tracks in "+tracksCollectionName+" : " + tracks.size());
-
+        
+        // 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, tracksCollectionName)) {
+            tracks = event.get(Track.class, tracksCollectionName);
+        }
+        else { tracks = new ArrayList<Track>(0); }
+        
+        // VERBOSE :: Output the number of tracks in the event.
+        printDebug("Tracks :: " + tracks.size());
+        
+        // Instantiate new lists to store reconstructed particles and
+        // V0 candidate particles and vertices.
         finalStateParticles = new ArrayList<ReconstructedParticle>();
         electrons = new ArrayList<ReconstructedParticle>();
         positrons = new ArrayList<ReconstructedParticle>();
@@ -174,193 +342,227 @@
         unconstrainedV0Vertices = new ArrayList<Vertex>();
         beamConV0Vertices = new ArrayList<Vertex>();
         targetConV0Vertices = new ArrayList<Vertex>();
-
-        // 
-        finalStateParticles = this.makeReconstructedParticles(clusters, tracks);
-        this.printDebug("Total number of Final State Particles: " + finalStateParticles.size());
-
-        // Put all the reconstructed particles in the event
+        
+        // Generate the reconstructed particles.
+        finalStateParticles = makeReconstructedParticles(clusters, tracks);
+        
+        // VERBOSE :: Output the number of reconstructed particles.
+        printDebug("Final State Particles :: " + finalStateParticles.size());
+        
+        // Store the reconstructed particles collection.
         event.put(finalStateParticlesColName, finalStateParticles, ReconstructedParticle.class, 0);
-
-        // Loop through the list of final state particles and separate the
-        // charged particles to either electrons or positrons.  These lists
-        // will be used for vertexing purposes.
-        for (ReconstructedParticle finalStateParticle : finalStateParticles)
-            if (finalStateParticle.getCharge() > 0)
-                positrons.add(finalStateParticle);
-            else if (finalStateParticle.getCharge() < 0)
-                electrons.add(finalStateParticle);
-        this.printDebug("Number of Electrons: " + electrons.size());
-        this.printDebug("Number of Positrons: " + positrons.size());
-
-        // Vertex electron and positron candidates 
+        
+        // Separate the reconstructed particles into electrons and
+        // positrons so that V0 candidates can be generated from them.
+        for (ReconstructedParticle finalStateParticle : finalStateParticles) {
+            // If the charge is positive, assume an electron.
+            if(finalStateParticle.getCharge() > 0) { positrons.add(finalStateParticle); }
+            
+            // Otherwise, assume the particle is a positron.
+            else if(finalStateParticle.getCharge() < 0) { electrons.add(finalStateParticle); }
+        }
+        
+        // VERBOSE :: Output the number of reconstructed positrons
+        // and electrons.
+        printDebug("Number of Electrons: " + electrons.size());
+        printDebug("Number of Positrons: " + positrons.size());
+        
+        // Form V0 candidate particles and vertices from the electron
+        // and positron reconstructed particles.
         findVertices(electrons, positrons);
-
-        // If the list exist, put the vertexed candidates and vertices into the event
+        
+        // Store the V0 candidate particles and vertices for each type
+        // of constraint in the appropriate collection in the event,
+        // as long as a collection name is defined.
         if (unconstrainedV0CandidatesColName != null) {
-            this.printDebug("Total number of unconstrained V0 candidates: " + unconstrainedV0Candidates.size());
+            printDebug("Unconstrained V0 Candidates: " + unconstrainedV0Candidates.size());
             event.put(unconstrainedV0CandidatesColName, unconstrainedV0Candidates, ReconstructedParticle.class, 0);
         }
         if (beamConV0CandidatesColName != null) {
-            this.printDebug("Total number of beam constrained V0 candidates: " + unconstrainedV0Candidates.size());
+            printDebug("Beam-Constrained V0 Candidates: " + unconstrainedV0Candidates.size());
             event.put(beamConV0CandidatesColName, beamConV0Candidates, ReconstructedParticle.class, 0);
         }
         if (targetConV0CandidatesColName != null) {
-            this.printDebug("Total number of target constrained V0 candidates: " + unconstrainedV0Candidates.size());
+            printDebug("Target-Constrained V0 Candidates: " + unconstrainedV0Candidates.size());
             event.put(targetConV0CandidatesColName, targetConV0Candidates, ReconstructedParticle.class, 0);
         }
         if (unconstrainedV0VerticesColName != null) {
-            this.printDebug("Total number of unconstrained V0 vertices: " + unconstrainedV0Vertices.size());
+            printDebug("Unconstrained V0 Vertices: " + unconstrainedV0Vertices.size());
             event.put(unconstrainedV0VerticesColName, unconstrainedV0Vertices, Vertex.class, 0);
         }
         if (beamConV0VerticesColName != null) {
-            this.printDebug("Total number of beam constrained V0 vertices: " + beamConV0Vertices.size());
+            printDebug("Beam-Constrained V0 Vertices: " + beamConV0Vertices.size());
             event.put(beamConV0VerticesColName, beamConV0Vertices, Vertex.class, 0);
         }
         if (targetConV0VerticesColName != null) {
-            this.printDebug("Total number of target constrained V0 vertices: " + beamConV0Vertices.size());
+            printDebug("Target-Constrained V0 Vertices: " + beamConV0Vertices.size());
             event.put(targetConV0VerticesColName, targetConV0Vertices, Vertex.class, 0);
         }
     }
-
-    /**
-     *
-     */
-    abstract void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons);
-
-    /**
-     * make the final state particles from clusters & tracks
-     * loop over the tracks first and try to match with clusters
-     */
-    protected List<ReconstructedParticle> makeReconstructedParticles(List<Cluster> clusters, List<Track> tracks) {
-
-        // Instantiate the list of reconstructed particles
-        List<ReconstructedParticle> particles = new ArrayList<ReconstructedParticle>();
-
-        // Instantiate the list of unmatched  clusters.  Remove if we find track match
-        List<Cluster> unmatchedClusters = new ArrayList<Cluster>(clusters);
-
-        for (Track track : tracks) {
-
-            ReconstructedParticle particle = new BaseReconstructedParticle();
-            HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0);
-
-            //
-            // Add all track information to the ReconstructedParticle
-            //
-            particle.addTrack(track);
-
-            // Set the momentum of the ReconstructedParticle
-            Hep3Vector momentum = new BasicHep3Vector(track.getTrackStates().get(0).getMomentum());
-            momentum = CoordinateTransformations.transformVectorToDetector(momentum);
-            ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), momentum);
-            // Set the charge of the ReconstructedParticle
-            ((BaseReconstructedParticle) particle).setCharge(track.getCharge() * flipSign);
-            // Set the particle ID
-            if (particle.getCharge() > 0)
-                ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(-11, 0, 0, 0));
-            else if (particle.getCharge() < 0)
-                ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(11, 0, 0, 0));
-
-            Cluster matchedCluster = null;
-            // Loop through all of the clusters and find the one that best matches
-            // the track.
-            for (Cluster cluster : unmatchedClusters) {
-
-                // Get the position of the Ecal cluster
-                Hep3Vector clusterPosition = new BasicHep3Vector(cluster.getPosition());
-
-                // Extrapolate the track to the Ecal cluster position
-                Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track, clusterPosition.z());
-                this.printDebug("Ecal cluster position: " + clusterPosition.toString());
-
-                double rMax = Double.MAX_VALUE;
-
-                // Check if any of the extrapolated values are invalid.
-                // TODO: There are some track whose extrapolated coordinates
-                //        are NaN. The problem seems to be that the y-coordinate
-                //        of the extrapolated helix is found to be non-real. This
-                //        needs to be fixed.
-                if (Double.isNaN(trackPosAtEcal.x()) || Double.isNaN(trackPosAtEcal.y()))
-                    continue;
-                this.printDebug("Track position at shower max: " + trackPosAtEcal.toString());
-
-//                double r = VecOp.sub(trackPosAtEcal, clusterPosition).magnitude();
-                // Don't trust extrapolation...just do y-difference for now
-                double r = Math.abs(clusterPosition.y() - trackPosAtEcal.y());
-                this.printDebug("Distance between Ecal cluster and track position: " + r + " mm");
-
-                // Check if the Ecal cluster and track are within the same 
-                // detector volume i.e. both top or bottom
-                if (clusterPosition.y() * trackPosAtEcal.y() < 0) {
-                    this.printDebug("Track and Ecal cluster are in opposite volumes. Track Y @ ECAL = " + trackPosAtEcal.z());
-                    continue;
-                }
-
-                // TODO: Checking whether r < rMax should be occuring within isMatch.  isMatch 
-                // 		 is basically repeating a lot of the same code as above.
-                if (r < rMax && isMatch(cluster, track)) {
-                    rMax = r;
-                    matchedCluster = cluster;
-                }
-            }
-
-            if (matchedCluster != null) {
-                particle.addCluster(matchedCluster);
-                ((BasicHepLorentzVector) fourVector).setT(matchedCluster.getEnergy());
-                unmatchedClusters.remove(matchedCluster);
-            }
-            ((BaseReconstructedParticle) particle).set4Vector(fourVector);
-            particles.add(particle);
-        }
-
-        if (!unmatchedClusters.isEmpty())
-            for (Cluster unmatchedCluster : unmatchedClusters) {
-                // Create a reconstructed particle and add it to the 
-                // collection of particles
-                ReconstructedParticle particle = new BaseReconstructedParticle();
-                HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0);
-
-                particle.addCluster(unmatchedCluster);
-                ((BasicHepLorentzVector) fourVector).setT(unmatchedCluster.getEnergy());
-                ((BaseReconstructedParticle) particle).setCharge(0);
-                ((BaseReconstructedParticle) particle).set4Vector(fourVector);
-                ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(22, 0, 0, 0));
-                particles.add(particle);
-            }
-
-        return particles;
-    }
-
-    /**
-     *
-     * @param debugMessage
-     */
-    protected void printDebug(String debugMessage) {
-        if (debug)
-            System.out.println(this.getClass().getSimpleName() + ": " + debugMessage);
-    }
-
-    /**
-     *
-     */
-    boolean isMatch(Cluster cluster, Track track) {
-
-        // Get the position of the Ecal cluster
+    
+    /**
+     * Sets the LCIO collection names to their default values if they
+     * are not already defined.
+     */
+    @Override
+    protected void startOfData() {
+        // If any of the LCIO collection names are not properly defined, define them now.
+        if(ecalClustersCollectionName == null) { ecalClustersCollectionName = "EcalClusters"; }
+        if(tracksCollectionName == null) { tracksCollectionName = "MatchedTracks"; }
+        if(finalStateParticlesColName == null) { finalStateParticlesColName = "FinalStateParticles"; }
+        if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; }
+        if(beamConV0CandidatesColName == null) { beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; }
+        if(targetConV0CandidatesColName == null) { targetConV0CandidatesColName = "TargetConstrainedV0Candidates"; }
+        if(unconstrainedV0VerticesColName == null) { unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; }
+        if(beamConV0VerticesColName == null) { beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; }
+        if(targetConV0VerticesColName == null) { targetConV0VerticesColName = "TargetConstrainedV0Vertices"; }
+    }
+    
+    /**
+     * Determines if a cluster is a potential match for a given track.
+     * If it is, returns the distance between the extrapolation of the
+     * track to the z-position of the cluster and the cluster position.
+     * Otherwise, returns <code>null</code> to indicate that the pair
+     * is not a valid match.
+     * @param cluster - The cluster to check.
+     * @param track - The track to check.
+     * @return Returns the distance between the cluster and extrapolated
+     * track position in millimeters as a <code>Double</code> if the
+     * pair is a potential match. Returns <code>null</code> otherwise.
+     */
+    private boolean isMatch(Cluster cluster, Track track) {
+        // Get the position of the cluster and extrapolate the position
+        // of the track at the z-position of the cluster.
         Hep3Vector clusterPosition = new BasicHep3Vector(cluster.getPosition());
-
-        // Extrapolate the track to the Ecal cluster position
         Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track, clusterPosition.z());
-
-        double dxCut = 20.0;
-        double dyCut = 20.0;
-
-        if (Math.abs(trackPosAtEcal.x() - clusterPosition.x()) > dxCut)
+        
+        // TODO: There are some track whose extrapolated coordinates
+        //       are NaN. The problem seems to be that the y-coordinate
+        //       of the extrapolated helix is found to be non-real. This
+        //       needs to be fixed.
+        // There is an issue with track extrapolation that sometimes
+        // yields NaN for extrapolated track parameters. Tracks with
+        // this issue are not usable and thusly the check should be
+        // skipped.
+        if (Double.isNaN(trackPosAtEcal.x()) || Double.isNaN(trackPosAtEcal.y())) {
+            // VERBOSE :: Indicate the reason for the match failing.
+            printDebug("\tFailure :: Track extrapolation error.");
+
+            // Return false to indicate that the pair do not match.
             return false;
-
-        if (Math.abs(trackPosAtEcal.y() - clusterPosition.y()) > dyCut)
+        }
+        
+        // VERBOSE :: Output the position of the extrapolated track
+        //            and the cluster.
+        printDebug("\tCluster Position :: " + clusterPosition.toString());
+        printDebug("\tTrack Position   :: " + trackPosAtEcal.toString());
+        
+        // If one of either the cluster or extrapolated track fall on
+        // one volume of the detector and the other is in the other
+        // volume, then they can not be a match. (i.e. both parts of
+        // the pair must be on the top or bottom of the detector.)
+        if (clusterPosition.y() * trackPosAtEcal.y() < 0) {
+            // VERBOSE :: Indicate the reason for the match failing.
+            printDebug("\tFailure :: Cluster/Track pair in opposite volumes.");
+
+            // Return false to indicate that the pair do not match.
             return false;
-
+        }
+        
+        // Check to make sure that the x and y displacements between
+        // the extrapolated track position and cluster position are
+        // within the allowed bounds. If they are not, this pair is
+        // not a match.
+        if (Math.abs(trackPosAtEcal.x() - clusterPosition.x()) > dxCut) {
+            // VERBOSE :: Indicate the reason for the match failing.
+            printDebug("\tFailure :: Pair x-displacement exceeds allowed threshold.");
+
+            // Return false to indicate that the pair do not match.
+            return false;
+        }
+        
+        if (Math.abs(trackPosAtEcal.y() - clusterPosition.y()) > dyCut) {
+            // VERBOSE :: Indicate the reason for the match failing.
+            printDebug("\tFailure :: Pair y-displacement exceeds allowed threshold.");
+            
+            // Return false to indicate that the pair do not match.
+            return false;
+        }
+        
+        // VERBOSE :: Indicate the reason for the match failing.
+        printDebug("\tSuccess :: Cluster/track pair match!.");
+        
+        // A pair that has reached this point is a potential match.
+        // Return true to indicate a match.
         return true;
     }
+    
+    // ==============================================================
+    // ==== Class Variables =========================================
+    // ==============================================================
+    // Local variables.
+    /** The maximum separation distance in the x-direction beyond which
+     * a cluster and track will be rejected for pairing. */
+    private double dxCut = 20.0;
+    /** The maximum separation distance in the y-direction beyond which
+     * a cluster and track will be rejected for pairing. */
+    private double dyCut = 20.0;
+    /** Indicates whether debug text should be output or not. */
+    private boolean debug = false;
+    /** The simple name of the class used for debug print statements. */
+    private final String simpleName = getClass().getSimpleName();
+    
+    // Reconstructed Particle Lists
+    /** Stores reconstructed electron particles. */
+    private List<ReconstructedParticle> electrons;
+    /** Stores reconstructed positron particles. */
+    private List<ReconstructedParticle> positrons;
+    /** Stores particles reconstructed from an event. */
+    protected List<ReconstructedParticle> finalStateParticles;
+    /** Stores reconstructed V0 candidate particles generated without constraints. */
+    protected List<ReconstructedParticle> unconstrainedV0Candidates;
+    /** Stores reconstructed V0 candidate particles generated with beam spot constraints. */
+    protected List<ReconstructedParticle> beamConV0Candidates;
+    /** Stores reconstructed V0 candidate particles generated with target constraints. */
+    protected List<ReconstructedParticle> targetConV0Candidates;
+    /** Stores reconstructed V0 candidate vertices generated without constraints. */
+    protected List<Vertex> unconstrainedV0Vertices;
+    /** Stores reconstructed V0 candidate vertices generated with beam spot constraints. */
+    protected List<Vertex> beamConV0Vertices;
+    /** Stores reconstructed V0 candidate vertices generated with target constraints. */
+    protected List<Vertex> targetConV0Vertices;
+    
+    // LCIO Collection Names
+    /** LCIO collection name for calorimeter clusters. */
+    private String ecalClustersCollectionName = "EcalClusters";
+    /** LCIO collection name for tracks. */
+    private String tracksCollectionName = "MatchedTracks";
+    /** LCIO collection name for reconstructed particles. */
+    private String finalStateParticlesColName = "FinalStateParticles";
+    /** LCIO collection name for V0 candidate particles generated without constraints. */
+    protected String unconstrainedV0CandidatesColName = null;
+    /** LCIO collection name for V0 candidate particles generated with beam spot constraints. */
+    protected String beamConV0CandidatesColName = null;
+    /** LCIO collection name for V0 candidate particles generated with target constraints. */
+    protected String targetConV0CandidatesColName = null;
+    /** LCIO collection name for V0 candidate vertices generated without constraints. */
+    protected String unconstrainedV0VerticesColName = null;
+    /** LCIO collection name for V0 candidate vertices generated with beam spot constraints. */
+    protected String beamConV0VerticesColName = null;
+    /** LCIO collection name for V0 candidate vertices generated with target constraints. */
+    protected String targetConV0VerticesColName = null;
+    
+    // Beam size variables.
+    // The beamsize array is in the tracking frame
+    /* TODO  mg-May 14, 2014:  the the beam size from the conditions db...also beam position!  */
+    protected double[] beamSize = {0.001, 0.2, 0.02};
+    protected double bField;
+    
+    //  flipSign is a kludge...
+    //  HelicalTrackFitter doesn't deal with B-fields in -ive Z correctly
+    //  so we set the B-field in +iveZ and flip signs of fitted tracks
+    //  
+    //  Note:  This should be -1 for test run configurations and +1 for 
+    //         prop-2014 configurations 
+    private int flipSign = 1;
 }

Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java	(original)
+++ java/trunk/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java	Wed Oct 29 21:25:20 2014
@@ -10,41 +10,59 @@
 import org.hps.recon.vertexing.TwoTrackVertexer;
 
 /**
+ * Method creates reconstructed particles from tracks and clusters for
+ * test run data. Also generates candidate A' reconstructed particles.
+ * This method does not generate a separate vertex collection.
  * 
  * @author Omar Moreno <[log in to unmask]>
  * @version $Id$
  */
 public class TestRunReconParticleDriver extends ReconParticleDriver {
-
-	public TestRunReconParticleDriver(){}; 
-	
-	@Override
-	protected void startOfData(){
-		unconstrainedV0CandidatesColName = "V0Candidates";
-	}
-	
-	@Override
-	void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) {
-		
-		TwoTrackVertexer vtxFitter = new TwoTrackVertexer(); 
-	
-		// Loop through both electrons and positrons and try to vertex them
-		for(ReconstructedParticle positron : positrons){
-			for(ReconstructedParticle electron : electrons){
-				
-				// Get the tracks associated with the electrons and positrons
-				Track electronTrack = electron.getTracks().get(0); 
-				Track positronTrack = positron.getTracks().get(0); 
-				vtxFitter.setTracks(electronTrack, positronTrack);
-				vtxFitter.fitVertex();
-				Vertex vertex = vtxFitter.getFittedVertex();
-				
-				ReconstructedParticle candidate = new BaseReconstructedParticle(); 
-				((BaseReconstructedParticle) candidate).setStartVertex(vertex);
-				candidate.addParticle(electron);
-				candidate.addParticle(positron);
-				unconstrainedV0Candidates.add(candidate); 
-			}
-		}
-	}
+    /**
+     * Generates reconstructed V0 candidate particles from electron
+     * and positron pairs.
+     * @param electrons - The list of electrons.
+     * @param positrons - The list of positrons.
+     */
+    @Override
+    protected void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) {
+        // Create a vertex fitter.
+        TwoTrackVertexer vtxFitter = new TwoTrackVertexer();
+        
+        // Iterate over the electrons and positrons and try to generate
+        // an A' candidate from them.
+        for(ReconstructedParticle positron : positrons){
+            for(ReconstructedParticle electron : electrons){
+                // Get the electron and positron tracks.
+                Track electronTrack = electron.getTracks().get(0);
+                Track positronTrack = positron.getTracks().get(0);
+                
+                // Feed the tracks to the vertex fitter.
+                vtxFitter.setTracks(electronTrack, positronTrack);
+                vtxFitter.fitVertex();
+                
+                // Get the reconstructed vertex.
+                Vertex vertex = vtxFitter.getFittedVertex();
+                
+                // Create a reconstructed particle for the candidate
+                // particle generated from the electron/positron pair.
+                ReconstructedParticle candidate = new BaseReconstructedParticle(); 
+                ((BaseReconstructedParticle) candidate).setStartVertex(vertex);
+                candidate.addParticle(electron);
+                candidate.addParticle(positron);
+                
+                // Add the candidate particle to list.
+                unconstrainedV0Candidates.add(candidate); 
+            }
+        }
+    }
+    
+    /**
+     * Sets the unconstrained A' candidate particle collection name if
+     * it has not already been defined.
+     */
+    @Override
+    protected void startOfData(){
+        if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "V0Candidates"; }
+    }
 }

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use