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.Polygon3D;
16 import org.lcsim.detector.solids.Trd;
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.SiTrackerEndcap2;
24 import org.lcsim.util.Driver;
25
26 public class SiTrackerEndcap2SensorSetup 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 SiTrackerEndcap2SensorSetup()
34 {}
35
36 public SiTrackerEndcap2SensorSetup(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 SiTrackerEndcap2)
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 for ( IDetectorElement wedge : layer.getChildren() )
85 {
86 for ( IDetectorElement module : wedge.getChildren() )
87 {
88 List<SiSensor> sensors = module.findDescendants(SiSensor.class);
89
90 if (sensors.size() == 0)
91 throw new RuntimeException("No sensors found in module.");
92
93 for (SiSensor sensor : sensors)
94 {
95 Trd sensor_solid = (Trd)sensor.getGeometry().getLogicalVolume().getSolid();
96
97 Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
98 Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
99
100
101 sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
102 sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
103
104 double strip_angle = Math.atan2(sensor_solid.getXHalfLength2() - sensor_solid.getXHalfLength1(), sensor_solid.getZHalfLength() * 2);
105
106 ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1)));
107 IRotation3D electrodes_rotation = new RotationPassiveXYZ(-Math.PI/2,0,strip_angle);
108 Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
109
110
111 SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,this.readoutPitch,sensor,electrodes_transform);
112 SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,this.sensePitch,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
113
114 sensor.setSenseElectrodes(sense_electrodes);
115 sensor.setReadoutElectrodes(readout_electrodes);
116
117 double[][] transfer_efficiencies = { transferEfficiencies };
118 sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
119 }
120 }
121 }
122 }
123 }
124 }
125 }
126
127