1 package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2;
2
3 import hep.physics.matrix.BasicMatrix;
4 import hep.physics.vec.BasicHep3Vector;
5 import hep.physics.vec.VecOp;
6
7 import java.util.List;
8
9 import org.lcsim.detector.IDetectorElement;
10 import org.lcsim.detector.IRotation3D;
11 import org.lcsim.detector.ITranslation3D;
12 import org.lcsim.detector.RotationPassiveXYZ;
13 import org.lcsim.detector.Transform3D;
14 import org.lcsim.detector.Translation3D;
15 import org.lcsim.detector.solids.IPolyhedron;
16 import org.lcsim.detector.solids.Polygon3D;
17 import org.lcsim.detector.tracker.silicon.ChargeCarrier;
18 import org.lcsim.detector.tracker.silicon.SiPixels;
19 import org.lcsim.detector.tracker.silicon.SiSensor;
20 import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
21 import org.lcsim.geometry.Detector;
22 import org.lcsim.geometry.compact.Subdetector;
23 import org.lcsim.geometry.subdetector.SiTrackerEndcap;
24 import org.lcsim.geometry.subdetector.SiTrackerEndcap2;
25 import org.lcsim.util.Driver;
26
27 public class SiVertexEndcapSensorSetup extends Driver
28 {
29
30 String subdetectorName;
31 double readoutPitchX = 0.025;
32 double readoutPitchY = 0.025;
33 double sensePitchX = 0.025;
34 double sensePitchY = 0.025;
35 double transferEfficiency = 1.0;
36
37 public SiVertexEndcapSensorSetup()
38 {}
39
40 public SiVertexEndcapSensorSetup(String subdetectorName)
41 {
42 this.subdetectorName = subdetectorName;
43 }
44
45 public void setSubdetectorName(String subdetectorName)
46 {
47 this.subdetectorName = subdetectorName;
48 }
49
50 public void detectorChanged(Detector detector)
51 {
52 if (subdetectorName == null)
53 throw new RuntimeException("The subdetectorName was not set.");
54
55 Subdetector subdetector = detector.getSubdetector(subdetectorName);
56 if (subdetector instanceof SiTrackerEndcap || subdetector instanceof SiTrackerEndcap2)
57 setupSensorDetectorElements(subdetector);
58 else
59 throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerBarrel.");
60 }
61
62 public void setReadoutPitchX(double x)
63 {
64 this.readoutPitchX = x;
65 }
66
67 public void setReadoutPitchY(double y)
68 {
69 this.readoutPitchY = y;
70 }
71
72 public void setSensePitchX(double x)
73 {
74 this.sensePitchX = x;
75 }
76
77 public void setSensePitchY(double y)
78 {
79 this.sensePitchY = y;
80 }
81
82 public void setTransferEfficiency(double t)
83 {
84 this.transferEfficiency = t;
85 }
86
87 private void setupSensorDetectorElements(Subdetector subdet)
88 {
89 for (IDetectorElement endcap : subdet.getDetectorElement().getChildren()) {
90 for (IDetectorElement layer : endcap.getChildren())
91 {
92 int nwedges = layer.getChildren().size();
93 for (IDetectorElement wedge : layer.getChildren())
94 {
95 for (IDetectorElement module : wedge.getChildren())
96 {
97
98 List<SiSensor> sensors = module.findDescendants(SiSensor.class);
99
100
101 if (sensors.size() == 0)
102 throw new RuntimeException("No sensors found in module.");
103
104
105 for (SiSensor sensor : sensors)
106 {
107
108 int sensorId = sensor.getIdentifierHelper().getValue(sensor.getIdentifier(), "sensor");
109
110
111 IPolyhedron sensor_solid = (IPolyhedron) sensor.getGeometry().getLogicalVolume().getSolid();
112
113
114 Polygon3D inner_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0, -1, 0)).get(0);
115 Polygon3D outer_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0, 1, 0)).get(0);
116
117
118
119
120
121 Polygon3D n_side = inner_surface;
122 Polygon3D p_side = outer_surface;
123
124
125
126 ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(), new BasicHep3Vector(0, 0, 1)));
127 IRotation3D electrodes_rotation = new RotationPassiveXYZ(-Math.PI / 2., 0., 0.);
128 Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
129
130
131
132
133
134
135 sensor.setBiasSurface(ChargeCarrier.HOLE, p_side);
136 sensor.setBiasSurface(ChargeCarrier.ELECTRON, n_side);
137
138
139 SiSensorElectrodes readout_electrodes = new SiPixels(ChargeCarrier.HOLE, readoutPitchX, readoutPitchY, sensor, electrodes_transform);
140 SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.HOLE, sensePitchX, sensePitchY, sensor, electrodes_transform);
141
142
143 sensor.setSenseElectrodes(sense_electrodes);
144 sensor.setReadoutElectrodes(readout_electrodes);
145
146
147
148 double[][] transfer_efficiencies = {{transferEfficiency}};
149 sensor.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transfer_efficiencies));
150 }
151 }
152 }
153 }
154 }
155 }
156 }