Commit in lcsim/src/org/lcsim/mc/CCDSim on MAIN
BuildCCDs.java+21-81.4 -> 1.5
CCD.java+4-41.5 -> 1.6
CCDSim.java+33-251.7 -> 1.8
FullCCDSimulation.java+188-1391.7 -> 1.8
RawTrackSegment.java+14-21.2 -> 1.3
+260-178
5 modified files
Added ability to consider forward tracker as pixel detector

lcsim/src/org/lcsim/mc/CCDSim
BuildCCDs.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- BuildCCDs.java	17 Feb 2007 02:00:18 -0000	1.4
+++ BuildCCDs.java	9 May 2008 00:35:32 -0000	1.5
@@ -13,16 +13,19 @@
 /**
  * creates vector of CCD objects according to particular detector geometry
  * @author sinev  U of Oregon; [log in to unmask]; SLAC x2970;
- * @version $Id: BuildCCDs.java,v 1.4 2007/02/17 02:00:18 sinev Exp $
+ * @version $Id: BuildCCDs.java,v 1.5 2008/05/09 00:35:32 sinev Exp $
  * @see CCD
  */
 public class BuildCCDs
 {
+  private boolean debug = false;
   private Vector ccds= new Vector();
-  private final int MaxLayers = 20;
+  private final int MaxLayers = 30;
   private double[] lrsrad = new double[MaxLayers];
   private int NLayers = 0;
   private int NBarrels = 0;
+  private String[] bar_sdnms = {"VertexBarrel","BarrelVertex" };
+  private String[] ec_sdnms = {"VertexEndcap","EndcapVertex" };
 
   /**
    * default constructor creates BuildCCDs object and clears Vector of built CCDs.
@@ -30,6 +33,13 @@
   public BuildCCDs()
   {
    ccds.clear();
+   }
+
+  public BuildCCDs(String[] bnames, String[] enames)
+  {
+   bar_sdnms = bnames;
+   ec_sdnms = enames;
+   ccds.clear();
   }
   
   /**
@@ -69,11 +79,14 @@
    double actthk = 0.;
    for(Subdetector subDet : subDets)
    {
-    String sdnam = subDet.getName();
     cyl = false;
     eca=false;
-    if(sdnam.equals("VertexBarrel")||sdnam.equals("VertexEndcap")||(sdnam.equals("BarrelVertex"))
-    ||(sdnam.equals("EndcapVertex")))
+    boolean vsbd = false; 
+    String sdnam = subDet.getName();
+    if(debug) System.out.println("Found subdetector with name: "+sdnam);
+    for(String bvnm:bar_sdnms) if(sdnam.equals(bvnm)) {vsbd=true; eca=false;}
+    for(String evnm:ec_sdnms) if(sdnam.equals(evnm)) {vsbd=true; eca=true;}
+    if(vsbd)
     {
      if(subDet instanceof MultiLayerTracker)
      { 
@@ -126,13 +139,13 @@
        if(eca)
        {
         ccd = new CCD(rmin[i],rdef,zdef[i],eca,spec,esp);
+        if(debug) System.out.println("Building Disk CCD, lr "+i+" with radius "+rdef+" at Z  "+zdef[i]);  
         ccdmi = new CCD(rmin[i],rdef,-zdef[i],eca,spec,esp);
+        if(debug) System.out.println("Building Disk CCD, lr "+i+" with radius "+rdef+" at Z  "+(-zdef[i]));
        }
        if(ccd != null)
        {
-        if(cyl) System.out.println("Building cylindrical CCD, lr "+i+" with radius "+rdef+" and Z max "+zdef[i]);
-        if(eca) System.out.println("Building Disk CCD, lr "+i+" with radius "+rdef+" at Z  "+zdef[i]);
-        if(eca) System.out.println("Building Disk CCD, lr "+i+" with radius "+rdef+" at Z  "+(-zdef[i]));
+        if((cyl) && debug) System.out.println("Building cylindrical CCD, lr "+i+" with radius "+rdef+" and Z max "+zdef[i]);
         ccd.setLayerNumber(i);
         ccds.addElement(ccd);
         if(ccdmi != null)

lcsim/src/org/lcsim/mc/CCDSim
CCD.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- CCD.java	3 Mar 2007 02:45:58 -0000	1.5
+++ CCD.java	9 May 2008 00:35:32 -0000	1.6
@@ -8,7 +8,7 @@
  * including CCD parameters and all signal parameters, including digitized signals
  * in each CCD pixel
  * @author sinev U of Oregon; [log in to unmask] ; SLAC x2970 
- * @version $Id: CCD.java,v 1.5 2007/03/03 02:45:58 sinev Exp $
+ * @version $Id: CCD.java,v 1.6 2008/05/09 00:35:32 sinev Exp $
  */
 public class CCD
 {
@@ -175,9 +175,9 @@
 	 {
 	  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];

lcsim/src/org/lcsim/mc/CCDSim
CCDSim.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- CCDSim.java	18 Dec 2007 01:08:10 -0000	1.7
+++ CCDSim.java	9 May 2008 00:35:32 -0000	1.8
@@ -18,7 +18,7 @@
  *                 November 2006 - Nick Sinev - added diffusion in depleted region,
  *                                 Lorentz Angle, output TrackerHit, not SimTrackerHit
  * @author  sinev  U of Oregon, SLAC. x2970 <BR>
- * @version $Id: CCDSim.java,v 1.7 2007/12/18 01:08:10 sinev Exp $
+ * @version $Id: CCDSim.java,v 1.8 2008/05/09 00:35:32 sinev Exp $
 *    
 */
 public class CCDSim
@@ -556,6 +556,11 @@
  */    
     public int simTrack(CCD ccd, RawTrackSegment ts)
 	{
+           MCParticle mcp = ts.getMCParticle();
+           Hep3Vector mcpm = mcp.getMomentum();
+           double mcPt = Math.sqrt(mcpm.x()*mcpm.x()+mcpm.y()*mcpm.y()); 
+           double tlm = mcpm.z()/mcPt;
+           double cothe = tlm/Math.sqrt(tlm*tlm+1.); 
 	   double x = ts.getCenter()[0];
 	   double y = ts.getCenter()[1];
 	   double z = ts.getCenter()[2];
@@ -576,12 +581,14 @@
 	    cy = y/vs;
 	    cz = z/vs;
           } 
-           if(ccd.isEndcap() && (Math.abs(cz) < 0.2))
+           if(ccd.isEndcap() && (Math.abs(cz) < Math.abs(cothe)) && (!(ts.getHits().size()==1)))
            {
 	    double vs = Math.sqrt(x*x+y*y+z*z);
 	    cx = x/vs;
 	    cy = y/vs;
 	    cz = z/vs;
+            Hep3Vector nd = new BasicHep3Vector(cx,cy,cz);
+            ts.setDirection(nd); 
            } 
 	   parent = ts;
            if(debug)
@@ -593,10 +600,6 @@
            }
            if((doHist) && (dir != null) && (!ccd.isEndcap()))
            {
-            MCParticle mcp = ts.getMCParticle();
-            Hep3Vector mcpm = mcp.getMomentum();
-            double mcPt = Math.sqrt(mcpm.x()*mcpm.x()+mcpm.y()*mcpm.y()); 
-            double tlm = mcpm.z()/mcPt;
             double tls = cz/Math.sqrt(cx*cx+cy*cy);
             double deltl = tls-tlm;
             if((tlm>0.) && (Math.abs(deltl)<0.2)) aida.cloud1D("CCDsim/ diff ts tl and MC tl, pos tl").fill(deltl); 
@@ -607,16 +610,17 @@
            int status =  0;
            if(!ccd.isEndcap() && Math.abs(cdr) < 0.01) status = simBlob(ccd,ts); 
            if((ts.isBlob() || (ts.getHits().size() < 3))&&(status!=1)) status = simBlob(ccd,ts);
-           if(!ts.isBlob() && (status != 1)) 
-             status = simTrack(ccd,x,y,z,cx,cy,cz);
-           if(status != 1)
+           if((!ts.isBlob()) && (status != 1)) 
+             status = simTrack(ccd,x,y,z,cx,cy,cz); 
+           if(debug && (status != 1))
            {
-            if(!ts.isBlob()) System.out.println("Failed to simulate track segment consisting of hits with r,z: ");
-            if(ts.isBlob()) System.out.println("Failed to simulate blob of hits consisting of hits with r,z: ");
+            if(!ts.isBlob()) System.out.println("Failed to simulate track segment consisting of hits with coordinates: ");
+            if(ts.isBlob()) System.out.println("Failed to simulate blob of hits consisting of hits with coordinates,energy deposit and depth:");
             List<SimTrackerHit> hits = ts.getHits();
             for(SimTrackerHit hit:hits)
             {
-             System.out.println(Math.sqrt(hit.getPoint()[0]*hit.getPoint()[0]+hit.getPoint()[1]*hit.getPoint()[1])+"  "+hit.getPoint()[2]);
+             System.out.println(hit.getPoint()[0]+"  "+hit.getPoint()[1]+"  "+hit.getPoint()[2]+"  "+hit.getdEdx()*1.E9+
+              " eV "+(ccd.getDepDir()*(hit.getPoint()[2] - ccd.getMinZ()) * 1000.)+" microns");
             } 
            }  
 	   return status;
@@ -684,10 +688,10 @@
          }
          if(ccd.isEndcap())
          {
-          if(ccd.getStype() == 0) return -1;
+          if(ccd.getStype() == 0) {System.out.println("Wrong surface type in endcap CCD!"); return -1;}
           depth = (float) (ddep * (zc - minz) * 1000.);
-//          System.out.println("CCD is endcap, depth: "+depth+" ddep= "+ddep+" zc= "+zc+" r "+hr);
-          if((depth > 0.) && (depth < EPIDEP))
+          if(depth < 0.)  System.out.println("CCD is endcap, depth: "+depth+" ddep= "+ddep+" zc= "+zc+" r "+hr);
+          if((depth >= 0.) && (depth < EPIDEP))
           {
            if(firstht)
            {  
@@ -729,7 +733,8 @@
         if(napad == 0) 
         {
          if(debug) System.out.println("No signal was generated by blob started in CCD lr "+ccd.getLayerNumber()+" col "+coln+" row "+rown);
-        } 
+
+        }
       return -1;
      }  
     
@@ -968,17 +973,20 @@
         }
         if(napad > 0) { ccd.incPartCount(); return 1;}
         if(napad == 0)
-        {  
-         if(!ccd.isEndcap())
-         { 
-          System.out.println("Failed hit on barr. lr "+ccd.getLayerNumber()+" col. offs. "+
+        {
+         if(debug)
+         {    
+          if(!ccd.isEndcap())
+          { 
+           System.out.println("Failed hit on barr. lr "+ccd.getLayerNumber()+" col. offs. "+
                 ofsx+" row offs. "+ofsy);
-          System.out.println(" x0,y0,z0 "+x0+" "+y0+" "+z0+" original x,y,z "+x+" "+y+" "+z);
-          System.out.println(" local dir: "+il+" "+jl+" "+kl+" original dir: "+ic+" "+jc+" "+kc);
-          System.out.println(" or. hit r: "+r+" rref "+rref+" cdr: "+cdr+" dL "+dL);
-         }
-         if(ccd.isEndcap()) System.out.println("Failed hit on ec lr "+ccd.getLayerNumber()+" col. offs. "+
+           System.out.println(" x0,y0,z0 "+x0+" "+y0+" "+z0+" original x,y,z "+x+" "+y+" "+z);
+           System.out.println(" local dir: "+il+" "+jl+" "+kl+" original dir: "+ic+" "+jc+" "+kc);
+           System.out.println(" or. hit r: "+r+" rref "+rref+" cdr: "+cdr+" dL "+dL);
+          }
+          if(ccd.isEndcap()) System.out.println("Failed hit on ec lr "+ccd.getLayerNumber()+" col. offs. "+
                 ofsx+" row offs. "+ofsy+", x0,y0,z0 "+x0+" "+y0+" "+z0+" local dir: "+il+" "+jl+" "+kl);
+         }  
           return -1;
         }
         System.out.println("How do we get here !?");

lcsim/src/org/lcsim/mc/CCDSim
FullCCDSimulation.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- FullCCDSimulation.java	18 Dec 2007 01:08:10 -0000	1.7
+++ FullCCDSimulation.java	9 May 2008 00:35:32 -0000	1.8
@@ -31,7 +31,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 $Id: FullCCDSimulation.java,v 1.7 2007/12/18 01:08:10 sinev Exp $
+ * @version $Id: FullCCDSimulation.java,v 1.8 2008/05/09 00:35:32 sinev Exp $
  */
 public class FullCCDSimulation extends Driver
 {
@@ -51,12 +51,18 @@
         private double brlRspn = 0.02;
         private double brlAspn = 0.1;
         private double brlTspn = 0.05;
-        private double ecZspn = 0.02;
+        private double ecZspn = 0.3;
         private double ecAspn = 0.1;
-        private double ecTspn = 0.05;
+        private double ecTspn = 0.1;
         private double Bfield = 5.;
         private boolean simEveryColl = false;
- 
+        private String[] bar_sdets = {"VertexBarrel","BarrelVertex"};
+        private String[] ec_sdets = {"VertexEndcap","EndcapVertex"};
+        private String[] bar_data = {"VtxBarrHits"};
+        private String[] ec_data = {"VtxEndcapHits"};
+
+
+
 /*.................................................................................
 |  here are resolution tables parametrized as function of tan of angle btw track and Z
 |  axis (_resalf) and track and axis perpendicular to B and R (_rescrfp and _rescrfn)
@@ -88,6 +94,26 @@
          _tinitd = false;
         }
 
+       public void defineBarrelSDNames(String[] names)
+       {
+        bar_sdets = names;
+       } 
+ 
+       public void defineBarrelHitNames(String[] names)
+       {
+        bar_data = names;
+       }
+  
+       public void defineEndcapSDNames(String[] names)
+       {
+        ec_sdets = names;
+       }  
+
+       public void defineEndcapHitNames(String[] names)
+       {
+        ec_data = names;
+       }
+  
         public void setBField(double B)
         {
          Bfield = B;
@@ -114,13 +140,14 @@
 	  simhits = new Vector();
           if(event.getDetector() != d)
           {
+           bccd=new BuildCCDs(bar_sdets,ec_sdets);
            d = event.getDetector();
            ccds=bccd.build(d,sp,esp);
 	   nbarrels = bccd.getNVxBrls();
            ccdsim = new CCDSim(sp,esp);
            ccdsim.setBField(Bfield);
            ccdsim.simulateEveryCollision(simEveryColl); 
-           System.out.println("Full CCD sim. has build "+ccds.size()+" CCDs for detector "+d.getName());
+           System.out.println("Full CCD sim. has build "+ccds.size()+" CCDs for detector "+d.getName()+", "+nbarrels+" of them-barrels");
            cfn.setPixelThreshold(esp.getSinglePixThr());
            cfn.setClusterThreshold(esp.getClustThr());
            if(!_tinitd) initResTables();
@@ -133,154 +160,166 @@
 	  }
           Vector svbrts = new Vector();
           Vector sverts = new Vector();
-          List<SimTrackerHit> hits = event.get(SimTrackerHit.class,"VtxBarrHits");
-          double pax = 0.;
-          double pay = 0.;
-          double paz = 0.;
-          double clx = 0.;
-          double cly = 0.;
-          double clz = 0.;
-          double dxy = 0.;
-          double dz = 0.;
-          LCMetaData meta = event.getMetaData(hits);
-          IDDecoder decoder = meta.getIDDecoder();
-	  for (SimTrackerHit th : hits )
-	  {
-	   double point[] = th.getPoint();
-           decoder.setID(th.getCellID());
- 	   int lnmb = decoder.getLayer();
-           boolean newcl = true;
-           if(svbrts.size()>0)
-           {
-            for(int i=0; i<svbrts.size(); i++)
-            {
-             RawTrackSegment rts = (RawTrackSegment) svbrts.get(i);
-             MCParticle mcpc = rts.getMCParticle();
-             MCParticle mcph = th.getMCParticle();
-             double[] rtsc = rts.getCenter();
-             int cllr = rts.getLayer();
-             if(lnmb == cllr)
+          List<List<SimTrackerHit>> evhits = event.get(SimTrackerHit.class);
+          for(List<SimTrackerHit> hits:evhits)
+          {
+           boolean bar_col = false;
+           boolean ec_col = false;
+           EventHeader.LCMetaData md = event.getMetaData(hits);
+           String cname = md.getName();
+           for(int nhc=0; nhc < bar_data.length; nhc++) if(cname.equals(bar_data[nhc])) bar_col=true; 
+           for(int nhc=0; nhc < ec_data.length; nhc++) if(cname.equals(ec_data[nhc])) ec_col=true; 
+           if(bar_col) 
+           { 
+            double pax = 0.;
+            double pay = 0.;
+            double paz = 0.;
+            double clx = 0.;
+            double cly = 0.;
+            double clz = 0.;
+            double dxy = 0.;
+            double dz = 0.;
+            IDDecoder decoder = md.getIDDecoder();
+	    for (SimTrackerHit th : hits )
+	    {
+	     double point[] = th.getPoint();
+             decoder.setID(th.getCellID());
+ 	     int lnmb = decoder.getLayer();
+             boolean newcl = true;
+             if(svbrts.size()>0)
              {
-              if(mcph == mcpc)
+              for(int i=0; i<svbrts.size(); i++)
               {
-               double rcl = Math.sqrt(rtsc[0]*rtsc[0]+rtsc[1]*rtsc[1]);
-               double rht = Math.sqrt(point[0]*point[0]+point[1]*point[1]);
-               if(Math.abs(rcl-rht) < brlRspn)
+               RawTrackSegment rts = (RawTrackSegment) svbrts.get(i);
+               MCParticle mcpc = rts.getMCParticle();
+               MCParticle mcph = th.getMCParticle();
+               double[] rtsc = rts.getCenter();
+               int cllr = rts.getLayer();
+               if(lnmb == cllr)
                {
-                double[] prhc = new double[3];
-                for(int j=0; j<3; j++)
-                 prhc[j]=point[j]*rcl/rht;
-                double dx = prhc[0]-rtsc[0];
-                double dy = prhc[1]-rtsc[1];
-                dz = prhc[2]-rtsc[2];
-                double sdist = Math.sqrt(dx*dx+dy*dy+dz*dz);  
-                if(sdist < brlTspn)
+                if(mcph == mcpc)
                 {
-                 newcl = false;
-                 rts.addHit(th,lnmb);
-                }
-               } 
-              } 
+                 double rcl = Math.sqrt(rtsc[0]*rtsc[0]+rtsc[1]*rtsc[1]);
+                 double rht = Math.sqrt(point[0]*point[0]+point[1]*point[1]);
+                 if(Math.abs(rcl-rht) < brlRspn)
+                 {
+                  double[] prhc = new double[3];
+                  for(int j=0; j<3; j++)
+                   prhc[j]=point[j]*rcl/rht;
+                  double dx = prhc[0]-rtsc[0];
+                  double dy = prhc[1]-rtsc[1];
+                  dz = prhc[2]-rtsc[2];
+                  double sdist = Math.sqrt(dx*dx+dy*dy+dz*dz);  
+                  if(sdist < brlTspn)
+                  {
+                   newcl = false;
+                   rts.addHit(th,lnmb);
+                  }
+                 }  
+                } 
+               }
+              }
+             } 
+             if(newcl)
+             {
+              RawTrackSegment nrts = new RawTrackSegment(lnmb);
+              nrts.addHit(th,lnmb);
+              svbrts.add(nrts);
+             }
+            }  
+            if(svbrts.size() != 0)
+            {                  
+             for(int i=0; i<svbrts.size(); i++)
+             {
+              RawTrackSegment rts = (RawTrackSegment) svbrts.get(i);
+              int lnmb = rts.getLayer();   
+              for(int j=0; j<ccds.size(); j++)
+              {    
+	       CCD c = (CCD) ccds.get(j);
+	       if(!c.isEndcap() && (c.getLayerNumber() == lnmb))
+	       {
+	        int stat = ccdsim.simTrack(c,rts);
+                if(debug)
+                {
+                 double[] cohc = rts.getCenter();
+                 System.out.println("Processing raw track segm in CCD "+j+" lr "+lnmb+" with center coord: "+cohc[0]+" "+cohc[1]+" "+cohc[2]); 
+                }  
+                if(stat == -1) System.out.println("Error in processing Barr hit!");
+	       }
+              }
              }
-            }
-           } 
-           if(newcl)
-           {
-            RawTrackSegment nrts = new RawTrackSegment(lnmb);
-            nrts.addHit(th,lnmb);
-            svbrts.add(nrts);
-           }
-          }  
-          if(svbrts.size() != 0)
-          {                  
-           for(int i=0; i<svbrts.size(); i++)
-           {
-            RawTrackSegment rts = (RawTrackSegment) svbrts.get(i);
-            int lnmb = rts.getLayer();   
-            for(int j=0; j<ccds.size(); j++)
-            {    
-	     CCD c = (CCD) ccds.get(j);
-	     if(!c.isEndcap() && (c.getLayerNumber() == lnmb))
-	     {
-	      int stat = ccdsim.simTrack(c,rts);
-              if(debug)
-              {
-               double[] cohc = rts.getCenter();
-               System.out.println("Processing raw track segm in CCD "+j+" lr "+lnmb+" with center coord: "+cohc[0]+" "+cohc[1]+" "+cohc[2]); 
-              }  
-              if(stat == -1) System.out.println("Error in processing Barr hit!");
-	     }
             }
            }
-          }
-          hits = event.get(SimTrackerHit.class,"VtxEndcapHits");
-          meta = event.getMetaData(hits);
-          decoder = meta.getIDDecoder();
-	  for (SimTrackerHit th : hits )
-	  {
-	   double point[] = th.getPoint();
-           decoder.setID(th.getCellID());
- 	   int lnmb = decoder.getLayer();
-           boolean newcl = true;
-           if(sverts.size()>0)
+           if(ec_col)
            {
-            for(int i=0; i<sverts.size(); i++)
-            {
-             RawTrackSegment rts = (RawTrackSegment) sverts.get(i);
-             MCParticle mcpc = rts.getMCParticle();
-             MCParticle mcph = th.getMCParticle();
-             double[] rtsc = rts.getCenter();
-             int cllr = rts.getLayer();
-             if(lnmb == cllr)
+            IDDecoder decoder = md.getIDDecoder();
+	    for (SimTrackerHit th : hits )
+	    {
+	     double point[] = th.getPoint();
+             decoder.setID(th.getCellID());
+ 	     int lnmb = decoder.getLayer();
+             boolean newcl = true;
+             if(sverts.size()>0)
              {
-              if(mcph == mcpc)
+              for(int i=0; i<sverts.size(); i++)
               {
-               if(Math.abs(rtsc[2]-point[2]) < ecZspn)
+               RawTrackSegment rts = (RawTrackSegment) sverts.get(i);
+               MCParticle mcpc = rts.getMCParticle();
+               MCParticle mcph = th.getMCParticle();
+               double[] rtsc = rts.getCenter();
+               int cllr = rts.getLayer();
+               if(lnmb == cllr)
                {
-                double[] prhc = new double[3];
-                for(int j=0; j<3; j++)
-                 prhc[j]=point[j]*Math.abs(rtsc[2])/Math.abs(point[2]);
-                double dx = prhc[0]-rtsc[0];
-                double dy = prhc[1]-rtsc[1];
-                dz = prhc[2]-rtsc[2];
-                double sdist = Math.sqrt(dx*dx+dy*dy+dz*dz);  
-                if(sdist < ecTspn)
+                if(Math.abs(rtsc[2]-point[2]) < ecZspn)
                 {
-                 newcl = false;
-                 rts.addHit(th,lnmb);
-                }
-               } 
-              } 
+                 if(mcph == mcpc)
+                 {
+                  double[] prhc = new double[3];
+                  for(int j=0; j<3; j++)
+                   prhc[j]=point[j]*Math.abs(rtsc[2])/Math.abs(point[2]);
+                  double dx = prhc[0]-rtsc[0];
+                  double dy = prhc[1]-rtsc[1];
+                  double dz = prhc[2]-rtsc[2];
+                  double sdist = Math.sqrt(dx*dx+dy*dy+dz*dz);  
+                  if(sdist < ecTspn)
+                  {
+                   newcl = false;
+                   rts.addHit(th,lnmb);
+                  }
+                 } 
+                } 
+               }
+              }
+             } 
+             if(newcl)
+             {
+              RawTrackSegment nrts = new RawTrackSegment(lnmb);
+              nrts.addHit(th,lnmb);
+              sverts.add(nrts);
+              double[] clcntr = nrts.getCenter();
+             }
+            }  
+            if(sverts.size() != 0)
+            {                  
+             for(int i=0; i<sverts.size(); i++)
+             {
+              RawTrackSegment rts = (RawTrackSegment) sverts.get(i);
+              double[] ccnt = rts.getCenter();
+              int lnmb = rts.getLayer();
+              for(int j=0; j<ccds.size(); j++)
+              {    
+	       CCD c = (CCD) ccds.get(j);
+               double ccdz = c.getMinZ(); 
+	       if(c.isEndcap() && (c.getLayerNumber() == lnmb) &&(Math.abs(ccdz-ccnt[2]) < ecZspn))
+	       {
+	        int stat = ccdsim.simTrack(c,rts);
+//                if(stat == -1) System.out.println("Error in processing EC hit in layer "+lnmb+" X "+ccnt[0]+" Y "+ccnt[1]+" Z "+ccnt[2]);
+	       }
+              }
              }
-            }
-           } 
-           if(newcl)
-           {
-            RawTrackSegment nrts = new RawTrackSegment(lnmb);
-            nrts.addHit(th,lnmb);
-            sverts.add(nrts);
-           }
-          }  
-          if(sverts.size() != 0)
-          {                  
-           for(int i=0; i<sverts.size(); i++)
-           {
-            RawTrackSegment rts = (RawTrackSegment) sverts.get(i);
-            double[] ccnt = rts.getCenter();
-            int lnmb = rts.getLayer();   
-            for(int j=0; j<ccds.size(); j++)
-            {    
-	     CCD c = (CCD) ccds.get(j);
-             double ccdz = c.getMinZ(); 
-	     if(c.isEndcap() && (c.getLayerNumber() == lnmb) &&(ccdz*ccnt[2] > 0.))
-	     {
-	      int stat = ccdsim.simTrack(c,rts);
-              if(stat == -1) System.out.println("Error in processing EC hit in layer "+lnmb+" X "+ccnt[0]+" Y "+ccnt[1]+" Z "+ccnt[2]);
-	     }
             }
            }
           }
-
 	  for(int i=0; i<ccds.size(); i++) 
 	  {
 	   CCD c = (CCD) ccds.get(i);
@@ -334,6 +373,7 @@
             { 
              double[] point=sht.getPosition();
              double shr= Math.sqrt(point[0]*point[0]+point[1]*point[1]);
+             double shp = Math.atan2(point[1],point[0]);
              double tl = shr/Math.abs(point[2]);
              int ti=0;
              for(int k=0; k<20; k++)
@@ -349,10 +389,19 @@
              double over = tl-_tangs[ti-1];
              double resy = re1+over*slo;
              double resx = _rescrfp[0];
+             int npix = sht.getClusterSize();   
              double[] V = new double[3];
-             V[0]=resx;
-             V[1]=resy;
+             V[0]=resx*npix;
+             V[1]=resy*npix;
              V[2]=0.;
+             if(npix > 8)
+             {
+              double pszx = sp.getPixelSizeX() * 0.001;
+              double pszy = sp.getPixelSizeY() * 0.001;
+              double psz = Math.sqrt(pszx*pszx+pszy*pszy);
+              V[0]+=0.5*npix*psz;
+              V[1]+=0.5*npix*psz;
+             }   
              double[] cm = _cmt.disk2Cart(V,point);
              sht.setCovarianceMatrix(cm);
              ecsimhits.addElement((Object) sht);

lcsim/src/org/lcsim/mc/CCDSim
RawTrackSegment.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- RawTrackSegment.java	3 Mar 2007 02:45:58 -0000	1.2
+++ RawTrackSegment.java	9 May 2008 00:35:32 -0000	1.3
@@ -20,7 +20,7 @@
 
 /**
  * @author sinev U of Oregon; SLAC x2970; [log in to unmask]
- * @version $Id: RawTrackSegment.java,v 1.2 2007/03/03 02:45:58 sinev Exp $
+ * @version $Id: RawTrackSegment.java,v 1.3 2008/05/09 00:35:32 sinev Exp $
  */
 
            public class RawTrackSegment
@@ -58,12 +58,23 @@
 	    {
              if(lrn != layer)
              {
-              System.out.println("ClusterOfHits.addHit: attempt to add hit into wrong layer");
+              System.out.println("RawTrackSegment.addHit: attempt to add hit into wrong layer");
               return;  
              } 
 	     hits.add(hit);
 	     dedx+=hit.getdEdx();
 	     atime+=hit.getTime();
+             if(nhits == 0)
+             {
+              double[] epnt = hit.getEndPoint();
+              double[] spnt = hit.getStartPoint();
+              double dx = epnt[0]-spnt[0];
+              double dy = epnt[1]-spnt[1];
+              double dz = epnt[2]-spnt[2];
+              Hep3Vector hvec = new BasicHep3Vector(dx,dy,dz);
+              Hep3Vector ndir = VecOp.unit(hvec);
+              dir = new BasicHep3Vector(ndir.x(),ndir.y(),ndir.z());
+             }
 	     nhits++;
              double[] pnt = hit.getPoint();
              double rht = Math.sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]);
@@ -140,6 +151,7 @@
 	     time = atime/nhits;
 	    }
             
+            public void setDirection(Hep3Vector d) { dir = d; }
             public boolean isBlob() { return _isblob; }  
 	    public double getdEdx() {return dedx;}
 	    public double getTime() {return time;}
CVSspam 0.2.8