Commit in lcsim/src/org/lcsim/mc/CCDSim on MAIN
CCD.java+7-71.1 -> 1.2
CCDClustFinder.java+142-1401.1 -> 1.2
CCDClusterCenter.java+15-41.1 -> 1.2
CCDSim.java+10-61.2 -> 1.3
FullCCDSimulation.java+3-31.2 -> 1.3
+177-160
5 modified files
Added handling of CCD wrapping for cylindrical CCDs.
Improved cluster finding algorithm.

lcsim/src/org/lcsim/mc/CCDSim
CCD.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- CCD.java	30 Sep 2005 18:31:48 -0000	1.1
+++ CCD.java	4 Oct 2005 18:53:41 -0000	1.2
@@ -158,18 +158,18 @@
       {
        NColumns = (int) ((maxPhi-minPhi)*getSurfRad() /(pixToL*PixelSizeX));
        PixelSizeX = (1./pixToL) * ((maxPhi-minPhi)*getSurfRad())/NColumns;
-       System.out.println("Making cylindrical CCD with min radius "+minRad+" max rad"+maxRad);
-       System.out.println("Pixel size x = "+PixelSizeX+" Pixel size y = "+PixelSizeY);
-       System.out.println("N rows = "+NRows+" N columns = "+NColumns);
+//       System.out.println("Making cylindrical CCD with min radius "+minRad+" max rad"+maxRad);
+//       System.out.println("Pixel size x = "+PixelSizeX+" Pixel size y = "+PixelSizeY);
+//       System.out.println("N rows = "+NRows+" N columns = "+NColumns);
       }
      }
 	 if(isEndcap)
 	 {
 	  NRows = (int) ((2.*maxRad)/(pixToL*PixelSizeY));
 	  NColumns = (int) ((2.*maxRad)/(pixToL*PixelSizeX));
-      System.out.println("Making endcap CCD with min radius "+minRad+" max rad"+maxRad+" Z "+minZ);
-      System.out.println("Pixel size x = "+PixelSizeX+" Pixel size y = "+PixelSizeY);
-      System.out.println("N rows = "+NRows+" N columns = "+NColumns);
+//      System.out.println("Making endcap CCD with min radius "+minRad+" max rad"+maxRad+" Z "+minZ);
+//      System.out.println("Pixel size x = "+PixelSizeX+" Pixel size y = "+PixelSizeY);
+//      System.out.println("N rows = "+NRows+" N columns = "+NColumns);
 	 } 
      Rlist = new int[NRows];
      RDlist = new int[NRows];
@@ -250,7 +250,7 @@
      **/
     public boolean rowIsActiveD(int rn)
     {
-     if(rn < NRows)
+     if((rn < NRows)&&(rn > -1))
      {
       return(RDlist[rn] != -1);
      }

lcsim/src/org/lcsim/mc/CCDSim
CCDClustFinder.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- CCDClustFinder.java	30 Sep 2005 18:31:48 -0000	1.1
+++ CCDClustFinder.java	4 Oct 2005 18:53:41 -0000	1.2
@@ -76,82 +76,9 @@
        CCDPixel pix = ar.getPixel(j);
 	   if(pix.getADC() < PTHR) continue;
        if(pix.isAttached()) continue;
-   //    System.out.println("processing pixel r: "+pix.getRowNumber()+" c: "+
-   //     pix.getColumnNumber());
-       boolean attached = false;
-       int attachedto =-1;
-       for(int k=0; k<Candidates.size(); k++)
-       {
-        ClusterCandidate cc = (ClusterCandidate) Candidates.get(k);
-   //     System.out.println("Trying cl "+k);
-        if(cc.tryAttach(pix))
-        {
-         attached = true;
-         pix.setAttachedTo(k);
-//         System.out.println("Attaching pix r: "+pix.getRowNumber()+" c: "+
-//          pix.getColumnNumber()+" to cl: "+k); 
-         int nxr = i+1;
-         int dnx = 1;
-         while((ccd.rowIsActiveD(nxr)) && (nxr > i))
-         {
- //         System.out.println("checking row: "+nxr);
-          boolean rowhas = false;
-          CCDActiveRow nar = ccd.getActiveDRow(nxr);
-          for(int m=0; m<nar.getNpixels(); m++)
-          {
-           CCDPixel pt = nar.getPixel(m);
-		   if(pt.getADC() < PTHR) continue;
-           if(pt.isAttached()) continue;
-           if(cc.tryAttach(pt))
-           {
-            rowhas = true;
-            pt.setAttachedTo(k); 
- //           System.out.println("Attaching pix r: "+pt.getRowNumber()+" c: "+
- //            pt.getColumnNumber()+" to cl: "+k); 
-           }
-          }
-          if(!rowhas) dnx = -1;
-          if(!ccd.rowIsActiveD(nxr+1)) dnx=-1;
-          nxr = nxr + dnx;
-         }
-         break;
-        }
-       }
-       if(!attached)
-       {
-        if(!pix.isAttached())
-        {        
-//         System.out.println("Creating cluster candidate");
-         ClusterCandidate cc = new ClusterCandidate(ccd,pix);
-         int k = Candidates.size();
-         pix.setAttachedTo(k);
-//         System.out.println("Attaching pix r: "+pix.getRowNumber()+" c: "+
-//          pix.getColumnNumber()+" to cl: "+k); 
-         Candidates.addElement(cc);
-         int nxr = i+1;
-         int dnx = 1;
-         while((ccd.rowIsActiveD(nxr)) && (nxr > i))
-         {
-          boolean rowhas = false;
-          CCDActiveRow nar = ccd.getActiveDRow(nxr);
-          for(int m=0; m<nar.getNpixels(); m++)
-          {
-           CCDPixel pt = nar.getPixel(m);
-           if(pt.isAttached()) continue;
-           if(cc.tryAttach(pt))
-           {
-            rowhas = true;
-            pt.setAttachedTo(k); 
- //           System.out.println("Attaching pix r: "+pt.getRowNumber()+" c: "+
- //            pt.getColumnNumber()+" to cl: "+k); 
-           }
-          }
-          if(!rowhas) dnx = -1;
-          if(!ccd.rowIsActiveD(nxr+1)) dnx=-1;
-          nxr = nxr + dnx;
-         }
-        }
-       }
+       int cind = Candidates.size();
+       ClusterCandidate ncc = new ClusterCandidate(ccd, pix,cind);
+       Candidates.addElement(ncc);
       }
      }
     }
@@ -186,9 +113,10 @@
    private int maxc = -1;
    private CCD ccd;
   
-   ClusterCandidate(CCD c,CCDPixel pix)
+   ClusterCandidate(CCD c,CCDPixel pix,int ind)
    {
     ccd = c;
+    pix.setAttachedTo(ind);
     CCDActiveRow ar = new CCDActiveRow(pix.getRowNumber(),c.getNColumns());
     ar.addPixel(pix);
     Rows.addElement(ar);
@@ -198,69 +126,116 @@
     maxr = pr;
     minc = pc;
     maxc = pc;
+    build(pix, ind);
    }
-
-   Vector getClusters() { return Clust; }
-
-   boolean tryAttach(CCDPixel pix)
+   
+   void build(CCDPixel pix,int ind)
    {
-    int pr = pix.getRowNumber();
-    int pc = pix.getColumnNumber(); 
-    if((pr < (minr-1)) || (pr > (maxr+1)))
-    {
-//      System.out.println(pr + "not in "+(minr-1)+"..."+(maxr+1)); 
-      return false;
-    }
-    if((pc < (minc-1)) || (pc > (maxc+1)))
-    {
-//      System.out.println(pc + "not in "+(minc-1)+"..."+(maxc+1));
-      return false;
-    } 
-    boolean belongs = false;
-    for(int k=0; k<Rows.size(); k++)
-    {
-     CCDActiveRow lr = (CCDActiveRow) Rows.get(k);
-     int trn = lr.getRowNumber();
-//     System.out.print("row: "+trn+" : "); 
-     for(int i=0; i<lr.getNpixels(); i++)
-     {
-      int tcn = (lr.getPixel(i)).getColumnNumber();
- //     System.out.print(tcn+" ");  
-      if((Math.abs(tcn - pc) < 2) && (Math.abs(trn - pr) <2)) 
-       belongs = true;
-     }
- //    System.out.println("");
-    }
-    if(belongs) 
-    {
-     if((pr >= minr) && (pr <= maxr))
-     {
-      for(int k=0; k<Rows.size(); k++)
-      {
-       CCDActiveRow lr = (CCDActiveRow) Rows.get(k);
-       int trn = lr.getRowNumber();
-       if(trn == pr) lr.addPixel(pix);
-      }
-     }  
-     if((pr < minr) || (pr > maxr))
-     {
-      CCDActiveRow nr = new CCDActiveRow(pix.getRowNumber(),ccd.getNColumns());
-      nr.addPixel(pix);
-      Rows.addElement(nr);
-     }
-     if(pr < minr) minr = pr;
-     if(pr > maxr) maxr = pr;
-     if(pc < minc) minc = pc;
-     if(pc > maxc) maxc = pc;
-//     System.out.println("rows "+minr+":"+maxr+" col "+minc+":"+maxc); 
-     return true;
-    }
-//    System.out.println("does not belong");
-    return false;
+       int cwrp = ccd.getNColumns();
+       boolean cleanbor = false;
+       int maxsr = minr+1;
+       int minsr = minr-1;
+       int maxsc = minc+1;
+       int minsc = minc-1;
+       int ring = 0;
+       while((!cleanbor)&&(ring<100))
+       {
+           cleanbor = true;
+           for(int crow = minsr; crow < maxsr+1; crow++)
+           {
+            if(ccd.rowIsActiveD(crow))
+            {
+             CCDActiveRow ar = ccd.getActiveDRow(crow);
+             if(ar != null)
+             {
+              for(int j=0; j<ar.getNpixels(); j++)
+              {
+               CCDPixel cpi = ar.getPixel(j);
+               if(cpi.isAttached()) continue;
+               int ccol = cpi.getColumnNumber();
+               boolean ofint=false;
+               if((ccol>=minsc) && (ccol <= maxsc)&&((crow==minsr)||(crow==maxsr))) ofint = true;
+               if((ccol==minsc)||(ccol==maxsc)) ofint=true;
+               if(!ccd.isEndcap())
+               {
+                if((crow==minsr)||(crow==maxsr))
+                {    
+                 if((ccol+cwrp>=minsc)&&(ccol+cwrp<=maxsc)) ofint=true;   
+                 if((ccol-cwrp>=minsc)&&(ccol-cwrp<=maxsc)) ofint=true;
+                }
+                if((ccol+cwrp==minsc)||(ccol+cwrp==maxsc)) ofint=true;   
+                if((ccol-cwrp==minsc)||(ccol-cwrp==maxsc)) ofint=true;
+               }    
+               if(ofint)
+               {
+                boolean belongs = false;
+                for(int ii=crow-1; ii<crow+2; ii++)
+                {
+                 if(ccd.rowIsActiveD(ii))
+                 {
+                  CCDActiveRow nar = ccd.getActiveRow(ii);
+                  if(nar != null)
+                  {
+                   for(int jj=0; jj<nar.getNpixels(); jj++)
+                   {    
+                    CCDPixel npi = nar.getPixel(jj);
+                    int ncn = npi.getColumnNumber();
+                    boolean consider = false;
+                    if((ncn >= ccol-1) && (ncn <= ccol+1)) consider = true;
+                    if(!ccd.isEndcap())
+                    {
+                     if((ncn+cwrp>=ccol-1)&&(ncn+cwrp<=ccol+1)) consider=true;   
+                     if((ncn-cwrp>=ccol-1)&&(ncn-cwrp<=ccol+1)) consider=true;   
+                    }
+                    if((npi.isAttachedTo()==ind )&&consider)
+                    {
+                     belongs = true;
+                     cpi.setAttachedTo(ind);
+                    }    
+                   }
+                  }    
+                 }    
+                }
+                if(belongs)
+                {
+                 cleanbor = false;   
+                 boolean newr = true;   
+                 for(int k=0; k<Rows.size(); k++)
+                 {
+                  CCDActiveRow lr = (CCDActiveRow) Rows.get(k);
+                  int trn = lr.getRowNumber();
+                  if(trn == crow)
+                  {    
+                   lr.addPixel(cpi);
+                   newr = false;
+                  }
+                 }
+                 if(newr)
+                 {
+                  CCDActiveRow nacr = new CCDActiveRow(crow,ccd.getNColumns());
+                  nacr.addPixel(cpi);
+                  Rows.addElement(nacr);
+                 }    
+                }
+               }  
+              }
+             }
+            }
+           }
+           ring++;
+           minsr--;
+           minsc--;
+           maxsr++;
+           maxsc++;
+       }
    }
+   
+   Vector getClusters() { return Clust; }
+
 
    void findLocalMax()
    {
+    int cwrp = ccd.getNColumns();
     Vector TMpix = new Vector();
     for(int i=0; i<Rows.size(); i++)
     {
@@ -279,7 +254,15 @@
          for(int n=0; n<nr.getNpixels(); n++)
          {
           CCDPixel np = nr.getPixel(n);
-          if(Math.abs(np.getColumnNumber()-pix.getColumnNumber())<2)
+          int npcn = np.getColumnNumber();
+          boolean compet = false;
+          if(Math.abs(npcn-pix.getColumnNumber())<2) compet = true;
+          if(!ccd.isEndcap())
+          {
+           if(Math.abs(npcn+cwrp-pix.getColumnNumber())<2) compet=true;   
+           if(Math.abs(npcn-cwrp-pix.getColumnNumber())<2) compet=true;   
+          }    
+          if(compet)
           {
            if(np.getADC() > pix.getADC()) lmax = false;
           }
@@ -298,9 +281,18 @@
      for(int j=i+1; j<TMpix.size(); j++)
      {
       CCDPixel p2 = (CCDPixel) TMpix.get(j);
-      if(p1.getADC() == p2.getADC())
+      if((p1.getADC() == p2.getADC())&&(!remove[j]))
       {
-       if(Math.abs(p1.getColumnNumber()-p2.getColumnNumber())<2)
+       boolean compet = false;
+       int p1cn = p1.getColumnNumber();
+       int p2cn = p2.getColumnNumber();
+       if(Math.abs(p1cn-p2cn)<2) compet = true;
+       if(!ccd.isEndcap())
+       {
+        if(Math.abs(p1cn+cwrp-p2cn)<2) compet = true;   
+        if(Math.abs(p1cn-cwrp-p2cn)<2) compet = true;   
+       }    
+       if(compet)
        {
         if(Math.abs(p1.getRowNumber()-p2.getRowNumber())<2)
         {
@@ -315,6 +307,7 @@
 
    void makeClusters()
    {
+    int cwrp = ccd.getNColumns();
     findLocalMax();
     int nm = Mpix.size();
 //    System.out.println("Making clusters from "+nm+"  local maximum pixels");
@@ -367,7 +360,7 @@
         CCDPixel smp = (CCDPixel) Mpix.get(l);
         int c1 = smp.getColumnNumber();
         int r1 = smp.getRowNumber();
-        boolean inshadow = false;
+/*        boolean inshadow = false;
         for(int k=0; k<nm; k++)
         {
          if(k != l)
@@ -385,8 +378,17 @@
            || ((c1<=cp) && (c2<=cp) && (c2>=c1))))) inshadow = true;
          }
         }
-        if(inshadow) continue;
-        double dx = p.getColumnNumber() - smp.getColumnNumber();
+        if(inshadow) continue; */
+        int pcn = p.getColumnNumber();
+        int smpcn = smp.getColumnNumber();
+        double dx = Math.abs(pcn-smpcn);
+        if(!ccd.isEndcap())
+        {
+          double dx1 = Math.abs(pcn+cwrp-smpcn);
+          if(dx1 < dx) dx = dx1;
+          dx1 = Math.abs(pcn-cwrp-smpcn);
+          if(dx1 < dx) dx = dx1;
+        }    
         double dy = p.getRowNumber() - smp.getRowNumber();
         double wt = ((double) smp.getADC())/(dx*dx+dy*dy);
         weights[l] = wt;

lcsim/src/org/lcsim/mc/CCDSim
CCDClusterCenter.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- CCDClusterCenter.java	30 Sep 2005 18:31:48 -0000	1.1
+++ CCDClusterCenter.java	4 Oct 2005 18:53:41 -0000	1.2
@@ -13,6 +13,7 @@
     private int CenterMethod = 0;
     private int totalAmp;
     private double NONDFR = 0.3;
+    private final double maxcfr = 0.1; // allowed maximum size of a cluster as fraction of CCD width 
     private SimTrackerHit parent = null;
     private final double _ctab[] = {6.29,3.48,2.76,2.21,1.87,1.62,1.44,1.28,1.15,1.}; 
     
@@ -47,16 +48,20 @@
     public void findCenter(CCDCluster cls)
     {
      double avr,avc,dep;
-     int am,ta,mri,mpi,ma,dec;
+     int am,ta,mri,mpi,ma,dec,ncc;
      double r,c,acr,acc;
      CCDActiveRow ar;
      CCDPixel p;
      CCD ccd;
      ccd = cls.getCCD();
+     ncc = ccd.getNColumns();
+     double wrp = (double) ncc;
+     double maxcd = ncc*maxcfr;
      dep = 0.0005 * (ccd.getDepDepth() + ccd.getEpiDepth());
      // note: factor 10E-3 is due to micron - mm convertion 
      acr = 0.;
      acc = 0.;
+     avc = 0.;
      ta = 0;
      ma = 0;
      mri = 0;
@@ -74,11 +79,15 @@
        r = (double) p.getRowNumber();
        c = (double) p.getColumnNumber();
        am = p.getADC();
+       if(i==0) avc = c+0.5;
        if(am < 0) System.out.println("pixel row "+r+" column "+c+" has ADC count "+am+" !");
        if(am > 1000) System.out.println("Signal from single pixel "+am+" !");
        acr = acr + (r+0.5)*am;
-       acc = acc + (c+0.5)*am;
+       if(Math.abs(c-avc) < maxcd) acc = acc + (c+0.5)*am;
+       if(((c-avc)>maxcd) && (Math.abs(c-wrp-avc) < maxcd)) acc = acc +(c-wrp+0.5)*am;
+       if(((avc-c)>maxcd) && (Math.abs(c+wrp-avc) < maxcd)) acc = acc +(c+wrp+0.5)*am;
        ta = ta+am;
+       if(ta > 0.) avc = acc/ta;
        if(am > ma)
        {
         ma = am;
@@ -94,7 +103,7 @@
      {
       if(CenterMethod == 0)
       {
-       cls.setCenterCol(acc/ta);
+       cls.setCenterCol(avc);
        cls.setCenterRow(acr/ta);
       }
       if((CenterMethod == 1) || (CenterMethod == 3))
@@ -107,7 +116,9 @@
        dec = (int) (totalAmp * NONDFR);
        if(dec > (int) (0.75*am)) dec = (int) (0.75 *am);
        System.out.println("acr= "+acr+" dec= "+dec+" ta= "+ta); 
-       acc = acc - (c+0.5)*dec;
+       if((c-avc)<maxcd) acc = acc - (c+0.5)*dec;
+       if(((c-avc)>maxcd) && (Math.abs(c-wrp-avc) < maxcd)) acc = acc -(c-wrp+0.5)*dec;
+       if(((avc-c)>maxcd) && (Math.abs(c+wrp-avc) < maxcd)) acc = acc -(c+wrp+0.5)*dec;
        acr = acr - (r+0.5)*dec;
        ta = ta -  dec;
        if(CenterMethod == 1)

lcsim/src/org/lcsim/mc/CCDSim
CCDSim.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- CCDSim.java	30 Sep 2005 22:41:23 -0000	1.2
+++ CCDSim.java	4 Oct 2005 18:53:41 -0000	1.3
@@ -12,7 +12,7 @@
  *                 Dec. 3, 2003 - Java version N. A. Graf (stand alone) <BR> 
  *                 March 5,2004 - Nick Sinev, JAS version (hep.lcd....) <BR>
  *                 September 2005 - Nick Sinev, org.lcsim version <BR>
- *
+ * @version $Id: CCDSim.java,v 1.3 2005/10/04 18:53:41 sinev Exp $
 *    
 */
 public class CCDSim
@@ -737,22 +737,26 @@
         int napad = 0;
         for(i=0; i<NPXMAXX; i++)
         {
+            int ig = i+ofsx;
             for(j=0; j<NPXMAXY; j++)
             {
+                int jg =j+ofsy;
                 exsv = pxls[i][j] * lfact;
                 exss = (float) (Math.sqrt((double)exsv));
                 pxls[i][j]= exsv + exss * (float) _ran.nextGaussian();
-                if((pxls[i][j] > 1.)&&((i+ofsx) > 0)&&((i+ofsx)<ccd.getNColumns())
-                 &&((j+ofsy) > 0)&&((j+ofsy)<ccd.getNRows()))
+                if((ig >= ccd.getNColumns()) && !ccd.isEndcap()) ig-=ccd.getNColumns();
+                if((ig < 0) && !ccd.isEndcap()) ig+=ccd.getNColumns();
+                if((pxls[i][j] > 1.)&&(ig >= 0)&&(ig < ccd.getNColumns())
+                 &&(jg >= 0)&&(jg < ccd.getNRows()))
                 {   
-                  ccd.addSignal(j+ofsy,i+ofsx,pxls[i][j],parent);
+                  ccd.addSignal(jg,ig,pxls[i][j],parent);
                   napad++;
                 }
             }
         }
         if(napad > 0) { ccd.incPartCount(); return 1;}
-        if(napad == 0) System.out.println("Failed hit lr "+ccd.getLayerNumber()+" col. offs. "+
-                ofsx+" row offs. "+ofsy);
+//        if(napad == 0) System.out.println("Failed hit lr "+ccd.getLayerNumber()+" col. offs. "+
+//                ofsx+" row offs. "+ofsy);
         return -1;
     }
     

lcsim/src/org/lcsim/mc/CCDSim
FullCCDSimulation.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- FullCCDSimulation.java	30 Sep 2005 21:33:26 -0000	1.2
+++ FullCCDSimulation.java	4 Oct 2005 18:53:41 -0000	1.3
@@ -28,7 +28,7 @@
  * objects, which emplement SimTrackerHit interface, so can be used instead
  * of original Simulated Tracker Hits generated by Geant4.  
  * @author sinev U of Oregon; SLAC x2970; [log in to unmask]
- * @version "%I%,%G%"
+ * @version $Id: FullCCDSimulation.java,v 1.3 2005/10/04 18:53:41 sinev Exp $
  */
 public class FullCCDSimulation extends Driver
 {
@@ -108,7 +108,7 @@
 	    if(c.getLayerNumber() == lnmb)
 	    {
 	     int stat = ccdsim.simTrack(c,th);
-             if(stat == -1) System.out.println("Error in processing Barr hit!");
+//             if(stat == -1) System.out.println("Error in processing Barr hit!");
 	    }
            }
           }
@@ -125,7 +125,7 @@
 	    if((c.getLayerNumber() == eln)&&(point[2]*c.getMinZ() >= 0.))
 	    {
 	     int stat = ccdsim.simTrack(c,th);	 
-             if(stat == -1) System.out.println("Error in processing EC hit!");
+//             if(stat == -1) System.out.println("Error in processing EC hit!");
 	    }
            }
           }
CVSspam 0.2.8