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
15
16
17
18
19
20
21
22 abstract public class DiskTrackerSegmenter extends ForwardingSegmenter {
23
24
25
26 public DiskTrackerSegmenter(String subdetectorName) {
27 _subdName = subdetectorName;
28 }
29
30
31
32
33
34
35 public AbstractSegmenter chooseSegmenter(SimTrackerHit hit) {
36 return _deToSegmenter.get(hit.getDetectorElement());
37 }
38
39
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
62
63
64 abstract public AbstractSegmenter assignSegmenter(IDetectorElement de);
65
66
67
68
69
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
79
80
81 public int getSuperlayer(IDetectorElement de) {
82 return getLayer(de)/2;
83 }
84
85
86
87
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
98
99 protected String _subdName;
100 protected List<IDetectorElement> _dElements;
101
102 protected HashMap<IDetectorElement,AbstractSegmenter> _deToSegmenter;
103 }