View Javadoc

1   package org.lcsim.recon.tracking.vsegment.geom.segmenters;
2   
3   import java.util.*;
4   
5   import org.lcsim.detector.IDetectorElement;
6   import org.lcsim.event.SimTrackerHit;
7   import org.lcsim.geometry.Detector;
8   import org.lcsim.geometry.Subdetector;
9   
10  import org.lcsim.recon.tracking.vsegment.geom.AbstractSegmenter;
11  import org.lcsim.recon.tracking.vsegment.geom.ForwardingSegmenter;
12  
13  /**
14   * Forwarding segmenter that chooses daughter segmenter based on the {@link IDetectorElement}
15   * associated with the hit. Daughter segmenters are prefixed in the order of increasing Z
16   * of the disks they handle. Subclasses should implement {@link #assignSegmenter(IDetectorElement)}
17   * method that assigns segmenters to disks.
18   *
19   * @author D. Onoprienko
20   * @version $Id: DiskTrackerSegmenter.java,v 1.1 2008/12/06 21:53:43 onoprien Exp $
21   */
22  abstract public class DiskTrackerSegmenter extends ForwardingSegmenter {
23    
24  // -- Constructors :  ----------------------------------------------------------
25    
26    public DiskTrackerSegmenter(String subdetectorName) {
27      _subdName = subdetectorName;
28    }
29    
30  // -- Choosing daughter Segmenter :  -------------------------------------------
31  
32    /**
33     * Returns daughter <tt>Segmenter</tt> that can handle the given hit.
34     */
35    public AbstractSegmenter chooseSegmenter(SimTrackerHit hit) {
36      return _deToSegmenter.get(hit.getDetectorElement());
37    }
38    
39  // -- Initialization :  --------------------------------------------------------
40    
41    public void detectorChanged(Detector detector) {
42      Subdetector sub = detector.getSubdetector(_subdName);
43      if (sub == null) return;
44      _dElements = AbstractSegmenter.getLeaves(sub.getDetectorElement());
45      Collections.sort(_dElements, new Comparator<IDetectorElement>() {
46        public int compare(IDetectorElement s1, IDetectorElement s2) {
47          return (int)Math.signum(s1.getGeometry().getPosition().z()-s2.getGeometry().getPosition().z());
48        }
49      });
50      _deToSegmenter = new HashMap<IDetectorElement,AbstractSegmenter>();
51      removeAllDaughterSegmenters();
52      for (IDetectorElement de : _dElements) {
53        AbstractSegmenter segmenter = assignSegmenter(de);
54        addDaughterSegmenter(segmenter);
55        _deToSegmenter.put(de, segmenter);
56      }
57      updateDaughterSegmenters(detector);
58    }
59    
60    /**
61     * Subclasses should implement this method to return <tt>Segmenter</tt> that 
62     * handles hits in the given <tt>DetectorElement</tt>.
63     */
64    abstract public AbstractSegmenter assignSegmenter(IDetectorElement de);
65    
66  // -- Utility methods :  -------------------------------------------------------
67    
68    /**
69     * Returns layer number for the disk.
70     */
71    public int getLayer(IDetectorElement de) {
72      int index = _dElements.indexOf(de);
73      int nLayers = _dElements.size()/2;
74      return (index < nLayers) ? nLayers-index-1 : index - nLayers;
75    }
76    
77    /**
78     * Returns superlayer number for the disk.
79     * Superlayer is a pair of sensor disks on opposite sides of the same support disk.
80     */
81    public int getSuperlayer(IDetectorElement de) {
82      return getLayer(de)/2;
83    }
84    
85    /**
86     * Returns <tt>true</tt> if the disk is on the side of a superlayer that faces 
87     * the center of the detector.
88     */
89    public boolean isInner(IDetectorElement de) {
90      return (getLayer(de) % 2) == 0;
91    }
92    
93    protected int getOtherSideIndex(int daughterIndex) {
94      return (daughterIndex % 2 == 0) ? daughterIndex + 1 : daughterIndex - 1 ;
95    }
96  
97  // -- Private parts :  ---------------------------------------------------------
98    
99    protected String _subdName;
100   protected List<IDetectorElement> _dElements;
101   
102   protected HashMap<IDetectorElement,AbstractSegmenter> _deToSegmenter;
103 }