Commit in lcsim/src/org/lcsim/recon/cluster/util on MAIN
DTCoreClusterer.java+177added 1.1
Split overlap clusters based on DT Clusterer

lcsim/src/org/lcsim/recon/cluster/util
DTCoreClusterer.java added at 1.1
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;
+    }
+}
CVSspam 0.2.8