Commit in lcsim/src/org/lcsim/mc/fast on MAIN
cluster/ronan/ClusterResolutionTables.java+135-1051.1 -> 1.2
             /MCFastRonan.java+87-781.3 -> 1.4
             /ReconCluster.java+11-51.1 -> 1.2
             /ReconHADCluster.java-11.2 -> 1.3
reconstructedparticle/IDResolutionTables.java+48added 1.1
                     /MCFastParticleID.java+2-11.2 -> 1.3
                     /MCFastReconstructedParticle.java+24-191.5 -> 1.6
                     /MCFastReconstructedParticleDriver.java+76-161.5 -> 1.6
+383-225
1 added + 7 modified, total 8 files
Improvements to reconstructedparticle creation in MCFast. Added efficiencies for particle ID. Added turn on curve for efficiencies.

lcsim/src/org/lcsim/mc/fast/cluster/ronan
ClusterResolutionTables.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- ClusterResolutionTables.java	1 Feb 2005 19:50:33 -0000	1.1
+++ ClusterResolutionTables.java	15 Jul 2005 22:09:27 -0000	1.2
@@ -4,109 +4,139 @@
 
 public class  ClusterResolutionTables
 {
-   private double EMAlignmentError;
-   private double EMConstantTerm;
-   private double EMPositionError;
-   private double EMResolution;
-   private double EMmin;
-   private double HADAlignmentError;
-   private double HADConstantTerm;
-   private double HADPositionError;
-   private double HADResolution;
-   private double HADmin;
-   private double PolarEMInner;
-   private double PolarEMOuter;
-   private double PolarHADInner;
-   private double PolarHADOuter;
-
-   ClusterResolutionTables(ConditionsSet set)
-   {
-      EMmin = set.getDouble("EMmin");
-      PolarEMInner = set.getDouble("PolarEMInner");
-      PolarEMOuter = set.getDouble("PolarEMOuter");
-
-      EMResolution = set.getDouble("EMResolution");
-      EMConstantTerm = set.getDouble("EMConstantTerm");
-      EMPositionError = set.getDouble("EMPositionError");
-      EMAlignmentError = set.getDouble("EMAlignmentError");
-
-      HADmin = set.getDouble("HADmin");
-      PolarHADInner = set.getDouble("PolarHADInner");
-      PolarHADOuter = set.getDouble("PolarHADOuter");
-
-      HADResolution = set.getDouble("HADResolution");
-      HADConstantTerm = set.getDouble("HADConstantTerm");
-      HADPositionError = set.getDouble("HADPositionError");
-      HADAlignmentError = set.getDouble("HADAlignmentError");
-   }
-
-   public double getEMAlignmentError()
-   {
-      return EMAlignmentError;
-   }
-
-   public double getEMConstantTerm()
-   {
-      return EMConstantTerm;
-   }
-
-   public double getEMPositionError()
-   {
-      return EMPositionError;
-   }
-
-   public double getEMResolution()
-   {
-      return EMResolution;
-   }
-
-   public double getEMmin()
-   {
-      return EMmin;
-   }
-
-   public double getHADAlignmentError()
-   {
-      return HADAlignmentError;
-   }
-
-   public double getHADConstantTerm()
-   {
-      return HADConstantTerm;
-   }
-
-   public double getHADPositionError()
-   {
-      return HADPositionError;
-   }
-
-   public double getHADResolution()
-   {
-      return HADResolution;
-   }
-
-   public double getHADmin()
-   {
-      return HADmin;
-   }
-
-   public double getPolarEMInner()
-   {
-      return PolarEMInner;
-   }
-
-   public double getPolarEMOuter()
-   {
-      return PolarEMOuter;
-   }
-
-   public double getPolarHADInner()
-   {
-      return PolarHADInner;
-   }
-
-   public double getPolarHADOuter()
-   {
-      return PolarHADOuter;
-   }
+    private double EMAlignmentError;
+    private double EMConstantTerm;
+    private double EMPositionError;
+    private double EMResolution;
+    private double EMmin;
+    private double EMOnset;
+    private double EMSharpness;
+    
+    private double HADAlignmentError;
+    private double HADConstantTerm;
+    private double HADPositionError;
+    private double HADResolution;
+    private double HADmin;
+    private double HADOnset;
+    private double HADSharpness;
+    
+    private double PolarEMInner;
+    private double PolarEMOuter;
+    private double PolarHADInner;
+    private double PolarHADOuter;
+    
+    ClusterResolutionTables(ConditionsSet set)
+    {
+        EMmin = set.getDouble("EMmin");
+        EMOnset = set.getDouble("EMOnset");
+        EMSharpness = set.getDouble("EMSharpness");
+        PolarEMInner = set.getDouble("PolarEMInner");
+        PolarEMOuter = set.getDouble("PolarEMOuter");
+        
+        EMResolution = set.getDouble("EMResolution");
+        EMConstantTerm = set.getDouble("EMConstantTerm");
+        EMPositionError = set.getDouble("EMPositionError");
+        EMAlignmentError = set.getDouble("EMAlignmentError");
+        
+        HADmin = set.getDouble("HADmin");
+        HADOnset = set.getDouble("HADOnset");
+        HADSharpness = set.getDouble("HADSharpness");
+        PolarHADInner = set.getDouble("PolarHADInner");
+        PolarHADOuter = set.getDouble("PolarHADOuter");
+        
+        HADResolution = set.getDouble("HADResolution");
+        HADConstantTerm = set.getDouble("HADConstantTerm");
+        HADPositionError = set.getDouble("HADPositionError");
+        HADAlignmentError = set.getDouble("HADAlignmentError");
+    }
+    
+    public double getEMAlignmentError()
+    {
+        return EMAlignmentError;
+    }
+    
+    public double getEMConstantTerm()
+    {
+        return EMConstantTerm;
+    }
+    
+    public double getEMPositionError()
+    {
+        return EMPositionError;
+    }
+    
+    public double getEMResolution()
+    {
+        return EMResolution;
+    }
+    
+    public double getEMmin()
+    {
+        return EMmin;
+    }
+    
+    public double getEMOnset()
+    {
+        return EMOnset;
+    }
+    
+    public double getEMSharpness()
+    {
+        return EMSharpness;
+    }
+    
+    public double getHADAlignmentError()
+    {
+        return HADAlignmentError;
+    }
+    
+    public double getHADConstantTerm()
+    {
+        return HADConstantTerm;
+    }
+    
+    public double getHADPositionError()
+    {
+        return HADPositionError;
+    }
+    
+    public double getHADResolution()
+    {
+        return HADResolution;
+    }
+    
+    public double getHADmin()
+    {
+        return HADmin;
+    }
+    
+    public double getHADOnset()
+    {
+        return HADOnset;
+    }
+    
+    public double getHADSharpness()
+    {
+        return HADSharpness;
+    }
+    
+    public double getPolarEMInner()
+    {
+        return PolarEMInner;
+    }
+    
+    public double getPolarEMOuter()
+    {
+        return PolarEMOuter;
+    }
+    
+    public double getPolarHADInner()
+    {
+        return PolarHADInner;
+    }
+    
+    public double getPolarHADOuter()
+    {
+        return PolarHADOuter;
+    }
 }

lcsim/src/org/lcsim/mc/fast/cluster/ronan
MCFastRonan.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- MCFastRonan.java	22 Feb 2005 06:37:41 -0000	1.3
+++ MCFastRonan.java	15 Jul 2005 22:09:27 -0000	1.4
@@ -13,98 +13,107 @@
 import org.lcsim.event.EventHeader;
 import org.lcsim.util.Driver;
 
+
+
+
 /**
  * Fast Monte Carlo cluster simulator
  * @author M.Ronan  Oct 2000 - Added "refined" cluster simulation
  */
 public class MCFastRonan extends Driver implements ConditionsListener
 {
-   private final static int NuEID = 12;
-   private final static int NuMuID = 14;
-   private final static int NuTauID = 16;
-   private final static int PhotonID = 22;
-   private ClusterResolutionTables clusterParm;
-   
-   public void process(EventHeader event)
-   {
-      if (clusterParm == null)
-      {
-         ConditionsSet conditions = getConditionsManager().getConditions("ClusterParameters");
-         conditions.addConditionsListener(this);
-         clusterParm = new ClusterResolutionTables(conditions);
-      }
-      List cl = new ArrayList();
-      boolean hist = getHistogramLevel() > 0;
-      
-      for (Iterator i = event.getMCParticles().iterator(); i.hasNext();)
-      {
-         Particle p = (Particle) i.next();
-         
-         // filter for FINALSTATE
-         if (p.getGeneratorStatus() != p.FINAL_STATE)
-         {
-            continue;
-         }
-         
-         ParticleType ptype = p.getType();
-         int PDGID = ptype.getPDGID();
-         double charge = p.getCharge();
-         
-         // filter neutrinos
-         boolean neutrino = (Math.abs(PDGID) == NuEID) || (Math.abs(PDGID) == NuMuID) || (Math.abs(PDGID) == NuTauID);
-         if (neutrino)
-         {
-            continue;
-         }
-         
-         double E = p.getEnergy();
-         double pt2 = (p.getPX() * p.getPX()) + (p.getPY() * p.getPY());
-         double pt = Math.sqrt(pt2);
-         double ptot = Math.sqrt(pt2 + (p.getPZ() * p.getPZ()));
-         double cosTheta = p.getPZ() / ptot;
-         
-         Random rand = getRandom();
-         
-         // Photons
-         if (PDGID == PhotonID)
-         {
-            // within acceptance
-            if (E < clusterParm.getEMmin())
+    private final static int NuEID = 12;
+    private final static int NuMuID = 14;
+    private final static int NuTauID = 16;
+    private final static int PhotonID = 22;
+    private ClusterResolutionTables clusterParm;
+    
+    public void process(EventHeader event)
+    {
+        if (clusterParm == null)
+        {
+            ConditionsSet conditions = getConditionsManager().getConditions("ClusterParameters");
+            conditions.addConditionsListener(this);
+            clusterParm = new ClusterResolutionTables(conditions);
+        }
+        List cl = new ArrayList();
+        List p1 = new ArrayList();
+        boolean hist = getHistogramLevel() > 0;
+        
+        for (Iterator i = event.getMCParticles().iterator(); i.hasNext();)
+        {
+            Particle p = (Particle) i.next();
+            
+            // filter for FINALSTATE
+            if (p.getGeneratorStatus() != p.FINAL_STATE)
             {
-               continue;
+                continue;
             }
-            if (Math.abs(cosTheta) > clusterParm.getPolarEMOuter())
+            
+            ParticleType ptype = p.getType();
+            int PDGID = ptype.getPDGID();
+            double charge = p.getCharge();
+            
+            // filter neutrinos
+            boolean neutrino = (Math.abs(PDGID) == NuEID) || (Math.abs(PDGID) == NuMuID) || (Math.abs(PDGID) == NuTauID);
+            if (neutrino)
             {
-               continue;
+                continue;
             }
             
-            cl.add(new ReconEMCluster(clusterParm, rand, p, hist));
-         }
-         
-         // Neutral hadrons
-         else if (charge == 0)
-         {
-            // within acceptance
-            if (E < clusterParm.getHADmin())
+            double E = p.getEnergy();
+            double pt2 = (p.getPX() * p.getPX()) + (p.getPY() * p.getPY());
+            double pt = Math.sqrt(pt2);
+            double ptot = Math.sqrt(pt2 + (p.getPZ() * p.getPZ()));
+            double cosTheta = p.getPZ() / ptot;
+            
+            Random rand = getRandom();
+            
+            // Photons
+            if (PDGID == PhotonID)
             {
-               continue;
+                // within acceptance
+                double t = clusterParm.getEMOnset();
+                double thing = (1 - 1 / ( 1 + Math.exp( (E-clusterParm.getEMOnset())*clusterParm.getEMSharpness() ) ));
+                if (rand.nextDouble() > thing)
+                {
+                    continue;
+                }
+                if (Math.abs(cosTheta) > clusterParm.getPolarEMOuter())
+                {
+                    continue;
+                }
+                
+                cl.add(new ReconEMCluster(clusterParm, rand, p, hist));
+                
             }
-            if (Math.abs(cosTheta) > clusterParm.getPolarHADOuter())
+            
+            // Neutral hadrons
+            else if (charge == 0)
             {
-               continue;
+                // within acceptance
+                
+                double thing = (1 - 1 / ( 1 + Math.exp( (E-clusterParm.getHADOnset())*clusterParm.getHADSharpness() ) ));
+                if (rand.nextDouble() > thing)
+                {
+                    continue;
+                }
+                if (Math.abs(cosTheta) > clusterParm.getPolarHADOuter())
+                {
+                    continue;
+                }
+                
+                cl.add(new ReconHADCluster(clusterParm, rand, p, hist));
             }
-            
-            cl.add(new ReconHADCluster(clusterParm, rand, p, hist));
-         }
-      }
-      event.put(EventHeader.CLUSTERS, cl, Cluster.class, 0);
-   }
-   
-   
-   public void conditionsChanged(ConditionsEvent event)
-   {
-      ConditionsSet conditions = getConditionsManager().getConditions("ClusterParameters");
-      clusterParm = new ClusterResolutionTables(conditions);
-   }
+        }
+        event.put(EventHeader.CLUSTERS, cl, Cluster.class, 0);
+    }
+    
+    
+    public void conditionsChanged(ConditionsEvent event)
+    {
+        ConditionsSet conditions = getConditionsManager().getConditions("ClusterParameters");
+        clusterParm = new ClusterResolutionTables(conditions);
+    }
 }
 

lcsim/src/org/lcsim/mc/fast/cluster/ronan
ReconCluster.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- ReconCluster.java	1 Feb 2005 19:50:34 -0000	1.1
+++ ReconCluster.java	15 Jul 2005 22:09:27 -0000	1.2
@@ -39,6 +39,7 @@
       double E = mcp.getEnergy();
 
       // Smear reconstructed energy
+      
       smearEnergy(rand, E, hist);
 
       // Smear reconstructed position
@@ -49,9 +50,9 @@
    {
       double sigma = ((a / Math.sqrt(E)) + b) * E;
       energy = E + (sigma * rand.nextGaussian());
-      if (energy < 0.)
+      if (energy < mcp.getMass())
       {
-         energy = 0.;
+         energy = mcp.getMass() + 0.05;
       }
    }
 
@@ -95,6 +96,11 @@
       cosTh = z / radius;
       theta = Math.acos(cosTh);
    }
+   
+   public Particle getMCParticle()
+   {
+       return mcp;
+   }
 
    abstract void smearPosition(Random rand, double E, boolean hist);
    
@@ -150,9 +156,9 @@
    
    public double[] getPosition()
    {
-      double x = radius * Math.sin(phi);
-      double y = radius + Math.cos(phi);
-      double z = 0; // Fixme: 
+      double x = radius * Math.sin(theta) * Math.cos(phi);
+      double y = radius * Math.sin(theta) * Math.sin(phi);
+      double z = radius * Math.cos(theta);
       return new double[] { x,y,z };
    }
    

lcsim/src/org/lcsim/mc/fast/cluster/ronan
ReconHADCluster.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- ReconHADCluster.java	14 Mar 2005 16:11:31 -0000	1.2
+++ ReconHADCluster.java	15 Jul 2005 22:09:27 -0000	1.3
@@ -23,7 +23,6 @@
 	double transSigma = c / Math.sqrt(E) + d;
 	transDist = transSigma * rand.nextGaussian();
 	if (hist) AIDA.defaultInstance().cloud1D("HAD: transDist").fill(transDist);
-
 	smearPosition(rand);
     }
 }

lcsim/src/org/lcsim/mc/fast/reconstructedparticle
IDResolutionTables.java added at 1.1
diff -N IDResolutionTables.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ IDResolutionTables.java	15 Jul 2005 22:09:29 -0000	1.1
@@ -0,0 +1,48 @@
+/*
+ * IDResolutionTables.java
+ *
+ * Created on July 6, 2005, 7:13 PM
+ *
+ * To change this template, choose Tools | Options and locate the template under
+ * the Source Creation and Management node. Right-click the template and choose
+ * Open. You can then make changes to the template in the Source Editor.
+ */
+
+package org.lcsim.mc.fast.reconstructedparticle;
+
+import org.lcsim.conditions.ConditionsSet;
+
+/**
+ *
+ * @author Daniel
+ */
+public class IDResolutionTables {
+    
+    private double  ElectronEff;
+    private double  MuonEff;
+    private double  NeutronEff;
+    
+    /** Creates a new instance of IDResolutionTables */
+    IDResolutionTables(ConditionsSet set)
+    {
+        ElectronEff = set.getDouble("Electron");
+        MuonEff = set.getDouble("Muon");
+        NeutronEff = set.getDouble("Neutron");        
+    }
+    
+    public double getElectronEff()
+    {
+        return ElectronEff;
+    }
+    
+    public double getMuonEff()
+    {
+        return ElectronEff;
+    }
+        
+    public double getNeutronEff()
+    {
+        return ElectronEff;
+    }
+    
+}

lcsim/src/org/lcsim/mc/fast/reconstructedparticle
MCFastParticleID.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- MCFastParticleID.java	13 Jul 2005 05:56:16 -0000	1.2
+++ MCFastParticleID.java	15 Jul 2005 22:09:29 -0000	1.3
@@ -56,4 +56,5 @@
     /** Constant to be used if the PDG code is not known or undefined.
      */
     public final static int UnknownPDG = 999999;
-}
\ No newline at end of file
+    
+}

lcsim/src/org/lcsim/mc/fast/reconstructedparticle
MCFastReconstructedParticle.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- MCFastReconstructedParticle.java	13 Jul 2005 05:56:16 -0000	1.5
+++ MCFastReconstructedParticle.java	15 Jul 2005 22:09:29 -0000	1.6
@@ -4,20 +4,24 @@
 import hep.physics.vec.BasicHepLorentzVector;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.HepLorentzVector;
+import hep.physics.particle.Particle;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
+import org.lcsim.event.MCParticle;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.ParticleID;
 import org.lcsim.event.ReconstructedParticle;
 import org.lcsim.event.Track;
 
 import static java.lang.Math.sqrt;
+import static java.lang.Math.pow;
 import org.lcsim.particle.ParticleType;
 import org.lcsim.spacegeom.CartesianPoint;
 import org.lcsim.spacegeom.SpacePoint;
 
 /**
- * AN implementation of ReconstructedParticle appropriate for the fast Monte Carlo
+ *
  * @author ngraf
  */
 public class MCFastReconstructedParticle implements ReconstructedParticle
@@ -26,7 +30,7 @@
     private double[] _covMatrix = new double[10];
     private double _mass;
     private double _charge;
-    private Hep3Vector _referencePoint = new BasicHep3Vector();
+    private Hep3Vector _referencePoint;
     private List<ParticleID> _particleIds = new ArrayList<ParticleID>();
     private ParticleID _particleIdUsed;
     private double _goodnessOfPid;
@@ -35,8 +39,7 @@
     private List<Track> _tracks = new ArrayList<Track>();
     private BasicHepLorentzVector _fourVec = new BasicHepLorentzVector();
     
-    
-    public MCFastReconstructedParticle(Track t, ParticleType type)
+    public MCFastReconstructedParticle(Track t, ParticleType type, Particle p)
     {
         _mass = type.mass();
         addTrack(t);
@@ -44,29 +47,32 @@
         _fourVec.setV3(e, t.getPX(), t.getPY(), t.getPZ());
         _charge = t.getCharge();
         
+        _referencePoint = new BasicHep3Vector(t.getReferencePointX(), t.getReferencePointY(), t.getReferencePointZ());
+        
         addParticleID(new MCFastParticleID(type));
     }
     
-    public MCFastReconstructedParticle(Cluster c,  ParticleType type)
+    public MCFastReconstructedParticle(Cluster c,  ParticleType type, Particle p)
     {
         _mass = type.mass();
         addCluster(c);
         double e = c.getEnergy();
-        double p = sqrt(e*e-_mass*_mass);
+        double pm = sqrt(e*e-_mass*_mass);
         // get direction from position of cluster and assume it comes from the origin
         double[] point = c.getPosition();
-        SpacePoint pos = new CartesianPoint(point[0], point[1], point[2]);
-        double px = p*pos.cosPhi()*pos.cosTheta();
-        double py = p*pos.sinPhi()*pos.cosTheta();
-        double pz = p*pos.cosTheta();
+        double len = sqrt(point[0]*point[0] + point[1]*point[1] + point[2]*point[2]);
+
+        _referencePoint = new BasicHep3Vector(0, 0, 0);
+        
+        double px = (pm/len)*(point[0]);
+        double py = (pm/len)*(point[1]);
+        double pz = (pm/len)*(point[2]);
         _fourVec.setV3(e, px, py, pz);
-        // fastMC only creates clusters for neutral particles.
-        // will need to fix if this changes.
         _charge = 0.;
         
-        addParticleID(new MCFastParticleID(type));
+        addParticleID(new MCFastParticleID(type));        
     }
-    
+  
     // ReconstructedParticle interface
     
     /** Type of reconstructed particle.
@@ -83,7 +89,7 @@
         return _fourVec.v3();
     }
     
-    /** Energy of the reconstructed particle
+    /** Energy of the  reconstructed particle
      */
     public double getEnergy()
     {
@@ -99,11 +105,11 @@
         return _covMatrix;
     }
     
-    /** Mass of the  reconstructed particle
+    /** Mass of the  reconstructed particle, set independently from four vector quantities
      */
     public double getMass()
     {
-        return _fourVec.magnitude();
+        return _mass;
     }
     
     /** Charge of the reconstructed particle.
@@ -114,7 +120,6 @@
     }
     
     /** Reference point of the reconstructedParticle parameters.
-     * currently returns the origin.
      */
     public Hep3Vector getReferencePoint()
     {
@@ -208,4 +213,4 @@
         sb.append("E: "+getEnergy());
         return sb.toString();
     }
-}
\ No newline at end of file
+}

lcsim/src/org/lcsim/mc/fast/reconstructedparticle
MCFastReconstructedParticleDriver.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- MCFastReconstructedParticleDriver.java	13 Jul 2005 05:56:16 -0000	1.5
+++ MCFastReconstructedParticleDriver.java	15 Jul 2005 22:09:30 -0000	1.6
@@ -1,8 +1,19 @@
+/*
+ * MCFastReconstructedParticleDriver.java
+ *
+ * Created on July 1, 2005, 2:55 PM
+ *
+ * To change this template, choose Tools | Options and locate the template under
+ * the Source Creation and Management node. Right-click the template and choose
+ * Open. You can then make changes to the template in the Source Editor.
+ */
+
 package org.lcsim.mc.fast.reconstructedparticle;
 
 import hep.physics.particle.Particle;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.ReconstructedParticle;
@@ -11,6 +22,10 @@
 import org.lcsim.mc.fast.tracking.ReconTrack;
 import org.lcsim.particle.ParticleType;
 import org.lcsim.util.Driver;
+import org.lcsim.mc.fast.reconstructedparticle.IDResolutionTables;
+import org.lcsim.conditions.ConditionsEvent;
+import org.lcsim.conditions.ConditionsListener;
+import org.lcsim.conditions.ConditionsSet;
 
 import static java.lang.Math.abs;
 import org.lcsim.mc.fast.cluster.ronan.ReconEMCluster;
@@ -19,13 +34,19 @@
 import org.lcsim.particle.Neutron;
 import org.lcsim.particle.Photon;
 import org.lcsim.particle.Pion;
+import org.lcsim.particle.KLong;
+
+import org.lcsim.util.aida.AIDA;
 /**
  *
  * @author ngraf
  */
-public class MCFastReconstructedParticleDriver extends Driver
+public class MCFastReconstructedParticleDriver extends Driver implements ConditionsListener
 {
     
+    private IDResolutionTables IDEff;
+    private AIDA aida = AIDA.defaultInstance();
+    
     /** Creates a new instance of MCFastReconstructedParticleDriver */
     public MCFastReconstructedParticleDriver()
     {
@@ -33,57 +54,96 @@
     
     public void process(EventHeader event)
     {
-        // create the list of ReconstructedParticles to add back to the event.
+        
+        if (IDEff == null)
+        {
+           ConditionsSet conditions = getConditionsManager().getConditions("IDEfficiency");
+           conditions.addConditionsListener(this);
+           IDEff = new IDResolutionTables(conditions);
+        }
+        
+        Random rand = getRandom();
+        
         List<ReconstructedParticle> rpList = new ArrayList<ReconstructedParticle>();
         // start with the smeared tracks...
         List<Track> tracks = event.getTracks();
         for(Track t : tracks)
         {
             ParticleType type = null;
-            // Track does not have link to MCParticle, so cast to MCFast track
             if(t instanceof ReconTrack)
             {
                 ReconTrack rt = (ReconTrack) t;
                 Particle p = rt.getMCParticle();
                 int pdgid = p.getPDGID();
                 
+                
                 // electrons and muons are special
-                if(abs(pdgid)== 11)
+                if((abs(pdgid)== 11) && (rand.nextDouble() < IDEff.getElectronEff()))
                 {
                     type = new Electron((int)Math.signum(pdgid));
                 }
-                else if(abs(pdgid)== 13)
+                else if((abs(pdgid)== 13) && (rand.nextDouble() < IDEff.getMuonEff()))
                 {
                     type = new Muon((int)Math.signum(pdgid));
                 }
-                else // assume pion for remaining charged tracks
+                else
                 {
                     type = new Pion(rt.getCharge());
                 }
-            }
-            MCFastReconstructedParticle rp = new MCFastReconstructedParticle(t, type);
+                
+                aida.histogram1D("track-particle", 150, -10, 10).fill( (t.getPX()*t.getPX() + t.getPY()*t.getPY() + t.getPZ()*t.getPZ() + type.mass()*type.mass()) - p.getEnergy());
+                
+                // assume pion for remaining charged tracks
+            MCFastReconstructedParticle rp = new MCFastReconstructedParticle(t, type, p);
             rpList.add(rp);
-        }
+            aida.histogram1D("recon-particle", 150, -10, 10).fill(rp.getEnergy()-p.getEnergy());
+            }
+       }
         
-        // now loop over clusters...
+        // loop over clusters...
         List<Cluster> clusters = event.getClusters();
         for(Cluster c : clusters)
         {
             ParticleType type = null;
-            // assume photon for EM cluster
+            Particle p = null;
+            // photons for EM
             if( c instanceof ReconEMCluster)
             {
+                ReconEMCluster emc = (ReconEMCluster) c;
+                p = emc.getMCParticle();
                 type = new Photon();
+                aida.histogram1D("cluster-particle", 150, -10, 10).fill(emc.getEnergy()-emc.getMCParticle().getEnergy());
             }
-            // assume neutron here for had cluster, could also use K0L
+            // assume a KZeroLong here for had cluster
             else if(c instanceof ReconHADCluster)
             {
-                type = new Neutron();
+                ReconHADCluster emc = (ReconHADCluster) c;
+                p = emc.getMCParticle();
+                int pdgid = p.getPDGID();
+                aida.histogram1D("cluster-particle", 150, -10, 10).fill(emc.getEnergy()-emc.getMCParticle().getEnergy());
+                
+                if ((abs(pdgid)==2112) && (rand.nextDouble() < IDEff.getNeutronEff()))
+                {
+                    type = new Neutron();
+                }
+                else
+                {
+                    type = new KLong();
+                }               
             }
-            MCFastReconstructedParticle rp = new MCFastReconstructedParticle(c, type);
+            MCFastReconstructedParticle rp = new MCFastReconstructedParticle(c, type, p);
             rpList.add(rp);
+            aida.histogram1D("recon-particle", 150, -10, 10).fill(rp.getEnergy()-p.getEnergy());
         }
         // add the reconstructedparticles to the event
-        event.put("MCFastReconstructedParticles", rpList, ReconstructedParticle.class, 0);
+        event.put(event.RECONSTRUCTEDPARTICLES, rpList, ReconstructedParticle.class, 0);
+        
+    }
+    
+    public void conditionsChanged(ConditionsEvent event)
+    {
+        ConditionsSet conditions = getConditionsManager().getConditions("IDEfficiency");
+        IDEff = new IDResolutionTables(conditions);
     }
-}
\ No newline at end of file
+    
+}
CVSspam 0.2.8