View Javadoc

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  							// Set up SiStrips for the sensors
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) // inner sensor
108 							{
109 								p_side = inner_surface;
110 								n_side = outer_surface;
111 								side = 1;
112 							}
113 							else // outer sensor
114 							{
115 								p_side = outer_surface;
116 								n_side = inner_surface;
117 								side = -1;
118 							}
119 
120 							// Bias the sensor
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)));  // translate to outside of polygon
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 							// Free calculation of readout electrodes, sense electrodes determined thereon
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