Print

Print


Author: [log in to unmask]
Date: Sat Aug 29 15:10:06 2015
New Revision: 3464

Log:
Require Moller candidates to be top/bottom.

Modified:
    java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.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	Sat Aug 29 15:10:06 2015
@@ -7,7 +7,9 @@
 import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.ReconstructedParticle;
@@ -90,8 +92,6 @@
      */
     protected List<Vertex> targetConMollerVertices;
 
-    
-    
     /**
      * Represents a type of constraint for vertex fitting.
      * 
@@ -123,7 +123,7 @@
         unconstrainedMollerVertices = new ArrayList<Vertex>();
         beamConMollerVertices = new ArrayList<Vertex>();
         targetConMollerVertices = new ArrayList<Vertex>();
-        
+       
         super.process(event);
         
         event.put(unconstrainedMollerCandidatesColName, unconstrainedMollerCandidates, ReconstructedParticle.class, 0);
@@ -162,19 +162,27 @@
         
         // Iterate over the collection of electrons and create e-e- pairs 
         for (int firstElectronN = 0; firstElectronN < electrons.size(); firstElectronN++) { 
+            ReconstructedParticle firstElectron = electrons.get(firstElectronN);
+            
             for (int secondElectronN = firstElectronN + 1; secondElectronN < electrons.size(); secondElectronN++) {
                
+                ReconstructedParticle secondElectron = electrons.get(secondElectronN);
+              
+                // Don't vertex the same particles.  This is needed when making
+                // Moller candidates.
+                if (firstElectron == secondElectron) continue;
+                
                 // Only vertex particles that are of the same type. This is
                 // only needed when using multiple track collections and 
                 // should be removed once all strategies are combined into one.
-                if (electrons.get(firstElectronN).getType() != electrons.get(secondElectronN).getType()) continue;
-            
-                // Don't vertex the same particles.  This is needed when making
-                // Moller candidates.
-                if (electrons.get(firstElectronN) == electrons.get(secondElectronN)) continue;
-           
+                if (firstElectron.getType() != secondElectron.getType()) continue;
+                
+                // Require the the mollers are in opposite volumes
+                if (firstElectron.getTracks().get(0).getTrackStates().get(0).getTanLambda()
+                                *secondElectron.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) continue;
+                
                 // Make Moller candidates
-                this.makeMollerCandidates(electrons.get(firstElectronN), electrons.get(secondElectronN));
+                this.makeMollerCandidates(firstElectron, secondElectron);
             }
         }
     }