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.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                             // Bias the sensor
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)));  // translate to outside of polygon
107                             IRotation3D electrodes_rotation = new RotationPassiveXYZ(-Math.PI/2,0,strip_angle);
108                             Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);                                
109                             
110                             // Free calculation of readout electrodes, sense electrodes determined thereon
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