lcsim/src/org/lcsim/recon/particle
diff -N CheatParticleDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CheatParticleDriver.java 15 Feb 2007 18:31:18 -0000 1.1
@@ -0,0 +1,125 @@
+/*
+ * CheatParticleDriver.java
+ *
+ */
+
+package org.lcsim.recon.particle.cheat;
+import org.lcsim.util.Driver;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.base.*;
+import org.lcsim.event.Track;
+import org.lcsim.event.Cluster;
+import org.lcsim.recon.cluster.cheat.CheatCluster;
+
+/**
+ *
+ * @author cassell
+ */
+public class CheatParticleDriver extends Driver
+{
+ String Clusters;
+ String Tracks;
+ String FSParticles;
+ String outName;
+ /** Creates a new instance of CheatTrackDriver */
+ public CheatParticleDriver(String Cl, String Tr, String FS)
+ {
+ Clusters = Cl;
+ Tracks = Tr;
+ FSParticles = FS;
+ outName = "CheatReconstructedParticles";
+ }
+ public CheatParticleDriver(String Cl, String Tr)
+ {
+ Clusters = Cl;
+ Tracks = Tr;
+ FSParticles = "default";
+ outName = "PerfectReconstructedParticles";
+ }
+ public void setOutputName(String s)
+ {
+ outName = s;
+ }
+
+ protected void process(EventHeader event)
+ {
+ List<CheatCluster> cl = event.get(CheatCluster.class,Clusters);
+ List<BaseTrackMC> tl = event.get(BaseTrackMC.class,Tracks);
+ Map<MCParticle,MCReconstructedParticle> rl = new HashMap<MCParticle,MCReconstructedParticle>();
+ if(FSParticles.compareTo("default") == 0)
+ {
+ for(CheatCluster cc:cl)
+ {
+ MCParticle p = cc.getMCParticle();
+ MCReconstructedParticle rp = new MCReconstructedParticle(p);
+ rp.addCluster(cc);
+ rl.put(p, rp);
+ }
+ for(BaseTrackMC t:tl)
+ {
+ MCParticle p = t.getMCParticle();
+ MCReconstructedParticle rp = rl.get(p);
+ if(rp == null)rl.put(p,rp = new MCReconstructedParticle(p));
+ rp.addTrack(t);
+ }
+ }
+ else
+ {
+ List<MCParticle> fs = event.get(MCParticle.class,FSParticles);
+ for(CheatCluster cc:cl)
+ {
+ MCParticle p = traceit(cc.getMCParticle(),fs);
+ if(p != null)
+ {
+ MCReconstructedParticle rp = rl.get(p);
+ if(rp == null)rl.put(p,rp = new MCReconstructedParticle(p));
+ rp.addCluster(cc);
+ }
+ }
+ for(BaseTrackMC t:tl)
+ {
+ MCParticle p = traceit(t.getMCParticle(),fs);
+ if(p != null)
+ {
+ MCReconstructedParticle rp = rl.get(p);
+ if(rp == null)rl.put(p,rp = new MCReconstructedParticle(p));
+ rp.addTrack(t);
+ }
+ }
+
+ }
+ event.put(outName,new ArrayList(rl.values()));
+ }
+
+ public String toString()
+ {
+ return "CheatParticleDriver";
+ }
+ public MCParticle traceit(MCParticle p, List<MCParticle> fs)
+ {
+ MCParticle rp = null;
+//
+// If the particle is in the final state list, we're done
+//
+ if(fs.contains(p))return p;
+//
+// If not, check its parent. No need to go farther than single parent case
+//
+ MCParticle pp = p;
+ while( pp.getParents().size() == 1)
+ {
+ pp = pp.getParents().get(0);
+ if(fs.contains(pp))return pp;
+ }
+//
+// Didn't find one, return null
+//
+ return rp;
+ }
+
+}