1 package org.lcsim.recon.tracking.digitization.sisim.config;
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.SiSensor;
19 import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
20 import org.lcsim.detector.tracker.silicon.SiStrips;
21 import org.lcsim.geometry.Detector;
22 import org.lcsim.geometry.compact.Subdetector;
23 import org.lcsim.geometry.subdetector.SiTrackerEndcap;
24 import org.lcsim.util.Driver;
25
26 public class SiTrackerEndcapSensorSetup extends Driver
27 {
28 String subdetectorName;
29 double readoutPitch = 0.050;
30 double sensePitch = 0.025;
31 double transferEfficiencies[] = {0.986,0.419};
32
33 public SiTrackerEndcapSensorSetup()
34 {}
35
36 public SiTrackerEndcapSensorSetup(String subdetectorName)
37 {
38 this.subdetectorName = subdetectorName;
39 }
40
41 public void setSubdetectorName(String subdetectorName)
42 {
43 this.subdetectorName = subdetectorName;
44 }
45
46 public void detectorChanged(Detector detector)
47 {
48 if (subdetectorName == null)
49 throw new RuntimeException("The subdetectorName was not set.");
50
51 Subdetector subdetector = detector.getSubdetector(subdetectorName);
52 if (subdetector instanceof SiTrackerEndcap)
53 setupSensorDetectorElements(subdetector);
54 else
55 throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerEndcap.");
56 }
57
58 public void setReadoutPitch(double p)
59 {
60 this.readoutPitch = p;
61 }
62
63 public void setSensePitch(double p)
64 {
65 this.sensePitch = p;
66 }
67
68 public void setTransferEfficiencies(double transferEfficiencies[])
69 {
70 if (transferEfficiencies.length < 2)
71 {
72 throw new IllegalArgumentException("Not enough values in transferEfficiencies array.");
73 }
74 this.transferEfficiencies[0] = transferEfficiencies[0];
75 this.transferEfficiencies[1] = transferEfficiencies[1];
76 }
77
78 private void setupSensorDetectorElements(Subdetector subdet)
79 {
80 for ( IDetectorElement endcap : subdet.getDetectorElement().getChildren() )
81 {
82 for ( IDetectorElement layer : endcap.getChildren() )
83 {
84 int nwedges = layer.getChildren().size();
85 for ( IDetectorElement wedge : layer.getChildren() )
86 {
87 for ( IDetectorElement module : wedge.getChildren() )
88 {
89 List<SiSensor> sensors = module.findDescendants(SiSensor.class);
90
91 if (sensors.size() == 0)
92 throw new RuntimeException("No sensors found in module.");
93
94 int sensorId = 0;
95 for (SiSensor sensor : sensors)
96 {
97
98 IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
99
100 Polygon3D inner_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
101 Polygon3D outer_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
102
103 Polygon3D p_side;
104 Polygon3D n_side;
105 int side;
106
107 if (sensorId == 0)
108 {
109 p_side = inner_surface;
110 n_side = outer_surface;
111 side = 1;
112 }
113 else
114 {
115 p_side = outer_surface;
116 n_side = inner_surface;
117 side = -1;
118 }
119
120
121 sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
122 sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
123
124 double strip_angle = Math.PI/nwedges;
125
126 ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1)));
127 IRotation3D electrodes_rotation = new RotationPassiveXYZ(side*(Math.PI/2),0,strip_angle);
128 Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
129
130
131 SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,this.readoutPitch,sensor,electrodes_transform);
132 SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,this.sensePitch,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
133
134 sensor.setSenseElectrodes(sense_electrodes);
135 sensor.setReadoutElectrodes(readout_electrodes);
136
137 double[][] transfer_efficiencies = { transferEfficiencies };
138 sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
139
140 ++sensorId;
141 }
142 }
143 }
144 }
145 }
146 }
147 }
148