lcsim/src/org/lcsim/recon/cluster/util
diff -N DTCoreClusterer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ DTCoreClusterer.java 1 Apr 2008 01:11:18 -0000 1.1
@@ -0,0 +1,177 @@
+/*
+ * DTCoreClusterer.java
+ *
+ * Created on February 25, 2008, 9:15 AM, by Qingmin Zhang
+ *
+ * To split the overlap clusters with DT clusterer to avoid the misidentify them
+ */
+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;
+import org.lcsim.recon.cluster.directedtree.*;
+/**
+ *
+ * @author Qingmin Zhang
+ */
+public class DTCoreClusterer {
+
+ private AIDA aida = AIDA.defaultInstance();
+ int minNhitcore = 7;
+ double minEcore = .5;
+ double mipE = .000124;
+ double thrstepsize = 1.;
+ Clusterer clusterer;
+ /** Creates a new instance of DTCoreClusterer */
+ public DTCoreClusterer() {
+ clusterer = new DirectedTreeClusterer();
+ }
+
+ /** Creates a new instance of CoreReclusterer */
+ public void setMinNHitCore(int n)
+ {
+ minNhitcore = n;
+ }
+ 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;
+ }
+}