1 package org.lcsim.recon.tracking.vsegment.geom.segmenters;
2
3 import java.util.*;
4
5 import hep.physics.vec.BasicHep3Vector;
6 import org.lcsim.event.SimTrackerHit;
7 import org.lcsim.geometry.Detector;
8 import org.lcsim.geometry.Subdetector;
9 import org.lcsim.detector.IDetectorElement;
10 import org.lcsim.detector.IGeometryInfo;
11 import org.lcsim.detector.ILogicalVolume;
12 import org.lcsim.detector.IPhysicalVolume;
13 import org.lcsim.detector.solids.Tube;
14 import org.lcsim.units.clhep.SystemOfUnits;
15
16 import org.lcsim.recon.tracking.vsegment.geom.AbstractSegmenter;
17 import org.lcsim.recon.tracking.vsegment.geom.RegionSegmenter;
18 import org.lcsim.recon.tracking.vsegment.geom.Sensor;
19 import org.lcsim.recon.tracking.vsegment.geom.SensorType;
20 import org.lcsim.recon.tracking.vsegment.geom.sensortypes.Cylinder;
21 import org.lcsim.recon.tracking.vsegment.transform.CartesianToCylindrical;
22
23
24
25
26
27
28
29
30
31
32
33 public class CylindricalBarrelSegmenter extends RegionSegmenter {
34
35
36
37
38
39
40
41
42 public CylindricalBarrelSegmenter(String subdetectorName) {
43 _sdName = subdetectorName;
44 if (_sdName == "TrackerBarrel") {
45 _stripWidth = 25. * SystemOfUnits.micrometer;
46 _stripLength = 10. * SystemOfUnits.cm;
47 } else if (_sdName == "VertexBarrel") {
48 _stripWidth = 25. * SystemOfUnits.micrometer;
49 _stripLength = 25. * SystemOfUnits.micrometer;
50 }
51 }
52
53
54
55
56 public void detectorChanged(Detector detector) {
57 super.detectorChanged(detector);
58 Subdetector sub = detector.getSubdetector(_sdName);
59 if (sub == null) return;
60 _detElts = AbstractSegmenter.getLeaves(sub.getDetectorElement());
61 for (IDetectorElement de : _detElts) {
62 if (!(de.getGeometry().getLogicalVolume().getSolid() instanceof Tube)) {
63 throw new RuntimeException("You are trying to apply CylindricalBarrelSegmenter to detector whose barrel is not made of Tubes");
64 }
65 }
66 Collections.sort(_detElts, new Comparator<IDetectorElement>() {
67 public int compare(IDetectorElement s1, IDetectorElement s2) {
68 return (int)Math.signum(((Tube)(s1.getGeometry().getLogicalVolume().getSolid())).getInnerRadius()
69 - ((Tube)(s2.getGeometry().getLogicalVolume().getSolid())).getInnerRadius());
70 }
71 });
72 _nLayers = _detElts.size();
73 _radius = new double[_nLayers];
74 _length = new double[_nLayers];
75 _thickness = new double[_nLayers];
76 int postfix = 0;
77 for (IDetectorElement del : _detElts) {
78 IGeometryInfo gInfo = del.getGeometry();
79 Tube solid = (Tube) gInfo.getLogicalVolume().getSolid();
80 double rInner = solid.getInnerRadius();
81 double rOuter = solid.getOuterRadius();
82 _radius[postfix] = (rInner + rOuter)/2.;
83 _length[postfix] = solid.getZHalfLength()*2.;
84 _thickness[postfix] = (rOuter - rInner);
85 postfix++;
86 }
87 }
88
89
90
91
92 public void setStripWidth(double pitch) {
93 _stripWidth = pitch;
94 }
95
96
97 public void setStripLength(double length) {
98 _stripLength = length;
99 }
100
101
102
103
104
105
106
107
108 public int makePostfix(SimTrackerHit hit) {
109 return hit.getLayer();
110 }
111
112
113
114
115
116 public int getMaxPostfix() {
117 return _nLayers-1;
118 }
119
120
121 public Sensor makeSensor(int postfix) {
122 SensorType type = new Cylinder(_radius[postfix], _length[postfix], _thickness[postfix], _stripWidth, _stripLength);
123 return new Sensor(_detElts.get(postfix), postfixToID(postfix), type, _trans, _rot);
124 }
125
126
127
128
129 public List<Integer> getStereoPartners(int sensorID) {
130 return null;
131 }
132
133
134
135 String _sdName;
136
137 List<IDetectorElement> _detElts;
138
139 private int _nLayers;
140 private double[] _radius;
141 private double[] _length;
142 private double[] _thickness;
143 private double _stripLength;
144 private double _stripWidth;
145
146 private CartesianToCylindrical _rot = new CartesianToCylindrical();
147 private BasicHep3Vector _trans = new BasicHep3Vector();
148
149 }