Print

Print


Commit in lcsim/src/org/lcsim/recon/muon on MAIN
MuonCalSegmentFinder.java+82-381.2 -> 1.3
CM+GL: Comment Coil and Solenoid redifined + work on Matching

lcsim/src/org/lcsim/recon/muon
MuonCalSegmentFinder.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- MuonCalSegmentFinder.java	31 Oct 2005 22:31:25 -0000	1.2
+++ MuonCalSegmentFinder.java	6 Dec 2005 16:16:39 -0000	1.3
@@ -1,11 +1,19 @@
 package org.lcsim.recon.muon;
 
+import java.util.Vector;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
 import org.lcsim.geometry.*;
 import org.lcsim.util.step.TrackStepper;  //  C.M. Stepper
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.field.Solenoid;
 import org.lcsim.geometry.FieldMap;
-
+import org.lcsim.geometry.subdetector.MultiLayerTracker;
+import org.lcsim.geometry.layer.LayerStack;
+import org.lcsim.geometry.layer.LayerSlice;
+import org.lcsim.event.SimCalorimeterHit;
+import org.lcsim.recon.cluster.density.MyTools;
 
 /**
  * Muon Segment Finder for muon calorimeter
@@ -18,35 +26,42 @@
 final public class MuonCalSegmentFinder extends BarrelCalSegmentFinder
 {
     
-    public MuonCalSegmentFinder(Detector det, String name)
+    public MuonCalSegmentFinder(Detector det, String subdetectorName)
     {
-        super(det, name);
+        super(det, subdetectorName);
         
         // Set the nearest neighbor cuts to default values
         setPhiNNCut(3);
         setThetaNNCut(2);
        
+	// getting info from the coil
+	MultiLayerTracker coilsub = (MultiLayerTracker)det.getSubdetectors().get("SolenoidCoilBarrel");
 
-        // The following kludge is required to get inner radius of the
-        // solenoid because the Coil class does not implement the
-        // DetectorComponent interface. Hence we must look through all
-        // components to find the coil
-	coilRadius = 2500.0;
-	// FIXME: need to get coilRadius from some detector class...
-// 	if(detName.contains("SDJan03"))  coilRadius = 271.0;
-
-//         for (Enumeration e = det.getComponents(); e.hasMoreElements();)
-//         {
-//             Object detComp = (Object)e.nextElement();
-//             if (detComp.getClass().getName().equals(
-//             "org.lcsim.geometry.component.Coil"))
-//             {
-//                 Coil coil = (Coil)detComp;
-//                 coilRadius = coil.getDouble("r_inner");
-//                 breacoilk;
-//             }
-//         }
-
+        /** 
+         * Get materials from MultiLayerTracker class. 
+         *
+         * WARNING: This approach is prone to error, because the slices are
+         * not guaranteed to be the same thickness in every layer.
+         */
+	LayerStack layers = coilsub.getLayering().getLayers();
+	double[] rmin = coilsub.getInnerR();
+	double[] zmax = coilsub.getOuterZ();
+
+	int nsublayers = layers.getNumberOfLayers();
+        coilSlices = new Vector<CoilSubLayer>();
+ 	for(int i=0; i<nsublayers; ++i) {
+	  List<LayerSlice> slices
+	      = coilsub.getLayering().getLayers().getLayer(i).getSlices();
+	  double raux = rmin[i];
+	  for ( Object o : slices ) {
+	    LayerSlice ls = (LayerSlice) o;
+	    String matName = ls.getMaterial().getName();
+	    double thickness = ls.getThickness();
+	    double matdedx = dedx.getDeDx(matName)/10;  // Eloss this material
+	    coilSlices.add( new CoilSubLayer(matName, thickness, raux, zmax[i], matdedx) );
+	    raux += thickness;
+	  }
+	}
     }
      
     
@@ -65,7 +80,7 @@
         numLayersHit = 0;
         double rr=0.;
         double zmxCoil= 0.;
-         FieldMap fm = det.getFieldMap();
+	FieldMap fm = det.getFieldMap();
         if( fm instanceof Solenoid)
         {
            Solenoid sol = (Solenoid) fm;
@@ -73,16 +88,16 @@
            rr = Math.sqrt(sol.getOuterRadius2());
 	   System.out.println("MCSF: Coil outer_radius="+rr+" zmxCoil="+zmxCoil);
          }
-        //coilRadius = rr;
+
         // Forms a muon segment by looking for calorimeter hits that match
         // cells which the track passes through
         
         rpVect = stpr.getNewRp();        
-        //First in the Air Before the COIL
-        
+
+        //First in the Air Before the COIL        
         rNow = Math.sqrt(rpVect[0]*rpVect[0]+rpVect[1]*rpVect[1]);
-        r=coilRadius;
-        xNSteps=((r-rNow)>1.)? ((r-rNow)*10.):10.;           //C.M. step 1/10 of the range
+        r = coilSlices.get(0).getRmin();
+        xNSteps=((r-rNow)>1.)? ((r-rNow)*10.):10.; //C.M. step 1/10 of the range
 
 	pos = new double[]{rpVect[0], rpVect[1], rpVect[2]};
 	field = det.getFieldMap().getField(pos); // C.M.-June-03
@@ -108,11 +123,38 @@
         }
         
         // In the COIL
-        
-        r = r + 50.;                                           // Coil Thickness 50cm
+	int islice = 0;
+
+	for(int ii=0; ii<coilSlices.size(); ++ii) {
+	    CoilSubLayer slice = coilSlices.get(ii);
+	    if(stpr.getStopTkELow()) break; // C.M.
+	    double zmax = slice.getZmax();
+	    double rmin = slice.getRmin();
+	    dr = slice.getThickness();
+	    double totalDedx = slice.getdEdx() * dr;
+
+	    if( Math.abs(rpVect[2])>zmax ) break;
+	    // Go on to the next layer
+	    r = r + dr;
+	    xNSteps=(r-Math.sqrt(rpVect[0]*rpVect[0]+rpVect[1]*rpVect[1]))*10.;
+
+	    field = det.getFieldMap().getField( rpVect );  // C.M.-June-03
+	    double radius = Math.sqrt(rpVect[0]*rpVect[0]+rpVect[1]*rpVect[1]);
+// 	    System.out.println("slice "+islice+", mat="+slice.getMaterial()
+// 			       +", r="+r
+// 			       +", zmax="+zmax+", rmin="+rmin
+// 			       +", dr="+dr
+// 			       +", totalDedx="+totalDedx
+// 			       +", field="+field[2]
+// 			       +", rad="+radius+", z="+rpVect[2] );
+
+	    stepConditions = steprConditions(xNSteps, field[2], totalDedx);
+	    stpr.tkSteps(r,zmax,stepConditions);
+	    rpVect   = stpr.getNewRp();
+	    ++islice;
+	}
 
-	double[] posmu = new double[]{rpVect[0], rpVect[1], rpVect[2]};
-	field = det.getFieldMap().getField(posmu);	     // C.M.-June-03
+	field = det.getFieldMap().getField(rpVect);	     // C.M.-June-03
 	System.out.println("MuonCalSegFinder: muonRadius="+rmin+", field="+muField);
 
 	muField = field[2];
@@ -145,7 +187,7 @@
         rNow=Math.sqrt(rpVect[0]*rpVect[0]+rpVect[1]*rpVect[1]);
         xNSteps = (r-rNow)*10.;
         double muFieldNorm = 0.;
-        stepConditions = steprConditions(xNSteps,muFieldNorm,meanDEdxPerLay(aname));
+        stepConditions = steprConditions(xNSteps,muFieldNorm,meanDEdxPerLay(subdetName));
         stpr.tkSteps(r,zmax,stepConditions);
         rpVect          = stpr.getNewRp();
         // Get intersections with succesive layers as long as track is
@@ -163,6 +205,7 @@
 	    encoder.setValue("theta", itheta);
 	    encoder.setValue("phi", iphi);
 	    Long cellid = encoder.getID();
+ 	    System.out.println("adding to cellList: cellid="+MyTools.printID(cellid));
 	    cellList.add(cellid);
 
 	    if(stpr.getStopTkELow())break; // C.M.
@@ -170,7 +213,7 @@
 	    if(nr!=(activLayers-1)) r = r + dr;
 	    else                    {r=r+0.5*dr;}
 	    xNSteps=(r-Math.sqrt(rpVect[0]*rpVect[0]+rpVect[1]*rpVect[1]))*10.;
-	    stepConditions = steprConditions(xNSteps,muFieldNorm,meanDEdxPerLay(aname));
+	    stepConditions = steprConditions(xNSteps,muFieldNorm,meanDEdxPerLay(subdetName));
 	    stpr.tkSteps(r,zmax,stepConditions);
 	    rpVect   = stpr.getNewRp();
 	    nr++;
@@ -184,13 +227,14 @@
         
         //		HistogramFolder.setDefaultFolder("/MUDet");		// C.M.-27Jan03- Folder
         
-        
-            matchHitsFast(segm, dataMgr.getCollHitMap(muonName) );
+        Map<Long,SimCalorimeterHit> muhits = dataMgr.getCollHitMap(muonName);
+	System.out.println("# muon hits: "+muhits.size());
+	matchHitsFast(segm, dataMgr.getCollHitMap(muonName), true );
         //		HistogramFolder.setDefaultFolder("..");			// C.M.-27Jan03- Folder
     }
    
     private double coilRadius;
     private  static double materDedxMudet;  // C.M. get the dEdx
     private String muonName = "MuonBarrHits";
+    private Vector<CoilSubLayer> coilSlices;
 }
-
CVSspam 0.2.8