lcsim/src/org/lcsim/recon/cluster/util
diff -N CoreReclusterDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CoreReclusterDriver.java 8 Nov 2007 23:16:00 -0000 1.1
@@ -0,0 +1,52 @@
+/*
+ * CoreReclusterDriver.java
+ *
+ * Created on November 6, 2007, 10:01 AM
+ *
+ * Driver to break up clusters
+ */
+
+package org.lcsim.recon.cluster.util;
+import org.lcsim.util.Driver;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Cluster;
+import java.util.List;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ *
+ * @author cassell
+ */
+public class CoreReclusterDriver extends Driver
+{
+ String in;
+ String out;
+ CoreReclusterer cr;
+ /** Creates a new instance of CoreReclusterDriver */
+ public CoreReclusterDriver(String inlist, String outlist)
+ {
+ in = inlist;
+ out = outlist;
+ cr = new CoreReclusterer();
+ }
+ public void setMinNHitCore(int n)
+ {
+ cr.setMinNHitCore(n);
+ }
+ public void setMinECore(double E)
+ {
+ cr.setMinECore(E);
+ }
+ public void setThresholdStep(double s)
+ {
+ cr.setThresholdStep(s);
+ }
+ protected void process(EventHeader event)
+ {
+ List<Cluster> incl = event.get(Cluster.class,in);
+ List<Cluster> outl = cr.reclusterList(incl);
+ int flag = 1 << LCIOConstants.CLBIT_HITS;
+ event.put(out,outl,Cluster.class,flag);
+ }
+
+}
lcsim/src/org/lcsim/recon/cluster/util
diff -N CoreReclusterer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CoreReclusterer.java 8 Nov 2007 23:16:00 -0000 1.1
@@ -0,0 +1,179 @@
+/*
+ * CoreReclusterer.java
+ *
+ * Created on November 2, 2007, 5:46 AM
+ *
+ * Reclusters by raising hit threshold to find cores and then adds hits back to
+ * nearest core.
+ */
+
+package org.lcsim.recon.cluster.util;
+import java.util.List;
+import java.util.ArrayList;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.recon.cluster.util.Clusterer;
+import org.lcsim.recon.cluster.util.BasicCluster;
+import org.lcsim.recon.cluster.nn.NearestNeighborClusterer;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.BasicHep3Vector;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author cassell
+ */
+public class CoreReclusterer
+{
+ private AIDA aida = AIDA.defaultInstance();
+ int minNhitcore = 7;
+ double minEcore = .5;
+ double mipE = .000124;
+ double thrstepsize = 1.;
+ Clusterer clusterer;
+ /** Creates a new instance of CoreReclusterer */
+ public CoreReclusterer()
+ {
+ clusterer = new NearestNeighborClusterer(1,1,1,minNhitcore-1,0.);
+ }
+ public void setMinNHitCore(int n)
+ {
+ minNhitcore = n;
+ clusterer = new NearestNeighborClusterer(1,1,1,minNhitcore-1,0.);
+ }
+ public void setMinECore(double E)
+ {
+ minEcore = E;
+ }
+ public void setThresholdStep(double s)
+ {
+ thrstepsize = s;
+ }
+ public List<Cluster> reclusterList(List<Cluster> cl)
+ {
+ List<Cluster> out = new ArrayList<Cluster>();
+ for(Cluster c:cl)
+ {
+ out.addAll(reclusterCluster(c));
+ }
+ return out;
+ }
+ public List<Cluster> reclusterCluster(Cluster c)
+ {
+ List<Cluster> out = new ArrayList<Cluster>();
+ if((c.getEnergy() < 2.*minEcore)||(c.getCalorimeterHits().size() < 2*minNhitcore))
+ {
+ out.add(c);
+ return out;
+ }
+ List<Cluster> active = new ArrayList<Cluster>();
+ out.add(c);
+ active.add(c);
+ int i = 0;
+ int nactive = active.size();
+ int fls = -1;
+ int lls = -1;
+ while(nactive > 0)
+ {
+ double hitth = i*thrstepsize*mipE;
+ List<Cluster> add = new ArrayList<Cluster>();
+ List<Cluster> remove = new ArrayList<Cluster>();
+ for(Cluster cc:active)
+ {
+ List<CalorimeterHit> hl = new ArrayList<CalorimeterHit>();
+ for(CalorimeterHit h:cc.getCalorimeterHits())
+ {
+ if(h.getRawEnergy() > hitth)hl.add(h);
+ }
+ List<Cluster> split = clusterer.createClusters(hl);
+ for(int j=0;j<split.size();j++)
+ {
+ if(split.get(j).getEnergy() < minEcore)split.remove(j);
+ }
+ if(split.size() == 0)
+ {
+ remove.add(cc);
+ continue;
+ }
+ else if(split.size() == 1)
+ {
+ Cluster c1 = split.get(0);
+ if((c1.getEnergy() < 2.*minEcore)||(c1.getCalorimeterHits().size() < 2*minNhitcore))
+ {
+ remove.add(cc);
+ }
+ }
+ else
+ {
+ if(fls < 0)fls = i;
+ else lls = i;
+ remove.add(cc);
+ out.remove(cc);
+//
+// Now build the new clusters from the cores
+//
+ BasicCluster[] newcl = new BasicCluster[split.size()];
+ Hep3Vector[] pos = new Hep3Vector[split.size()];
+ for(int j=0;j<split.size();j++)
+ {
+ newcl[j] = new BasicCluster();
+ newcl[j].addCluster(split.get(j));
+ pos[j] = new BasicHep3Vector(newcl[j].getPosition());
+ }
+ for(CalorimeterHit h:cc.getCalorimeterHits())
+ {
+ boolean used = false;
+ for(int j=0;j<split.size();j++)
+ {
+ if(newcl[j].getCalorimeterHits().contains(h))
+ {
+ used = true;
+ break;
+ }
+ }
+ if(!used)
+ {
+ double[] hpos = h.getPosition();
+ double mindis = 9999.;
+ int minc = 0;
+ for(int j=0;j<split.size();j++)
+ {
+ double dissq = getMinDist(hpos,newcl[j]);
+ if(dissq < mindis)
+ {
+ mindis = dissq;
+ minc = j;
+ }
+ }
+ newcl[minc].addHit(h);
+ }
+ }
+ for(int j=0;j<split.size();j++)
+ {
+ out.add(newcl[j]);
+ if((split.get(j).getEnergy() >= 2.*minEcore)&&(split.get(j).getCalorimeterHits().size() >= 2*minNhitcore))
+ {
+ add.add(newcl[j]);
+ }
+ }
+ }
+ }
+ for(Cluster rc:remove){active.remove(rc);}
+ for(Cluster ac:add){active.add(ac);}
+ i++;
+ nactive = active.size();
+ }
+ return out;
+ }
+ public double getMinDist(double[] pos,Cluster c)
+ {
+ double mindist = 9999.;
+ for(CalorimeterHit h:c.getCalorimeterHits())
+ {
+ double[] hp = h.getPosition();
+ double d = (hp[0]-pos[0])*(hp[0]-pos[0]) +(hp[1]-pos[1])*(hp[1]-pos[1]) +(hp[2]-pos[2])*(hp[2]-pos[2]);
+ if(d < mindist)mindist = d;
+ }
+ return mindist;
+ }
+}