1 package org.lcsim.detector.tracker.silicon;
2
3
4
5
6
7
8
9
10
11
12
13
14 import java.util.*;
15
16
17
18
19
20 public class DopedSilicon
21 {
22
23
24
25
26
27 static public double K_BOLTZMANN = 8.617385E-5;
28 static public double ENERGY_EHPAIR = 3.62E-9;
29
30
31 private double _temperature = 293.0;
32 private double _doping_concentration = 6.0E+11;
33 private EnumMap<ChargeCarrier, Double> _carrier_concentration = new EnumMap<ChargeCarrier,Double>(ChargeCarrier.class);
34
35
36
37 public DopedSilicon()
38 {
39 setElectronConcentration(1.0E+14);
40 setHoleConcentration(1.0E+14);
41 }
42
43
44
45 public void setTemperature(double temperature){_temperature = temperature;}
46 public void setDopingConcentration(double doping_concentration)
47 {
48 _doping_concentration = doping_concentration;
49 }
50 public void setElectronConcentration(double electron_concentration)
51 {
52 _carrier_concentration.put(ChargeCarrier.ELECTRON,electron_concentration);
53 }
54 public void setHoleConcentration(double hole_concentration)
55 {
56 _carrier_concentration.put(ChargeCarrier.HOLE,hole_concentration);
57 }
58
59 public double getTemperature(){return _temperature;}
60 public double getCarrierConcentration(ChargeCarrier charge_carrier)
61 {
62 return _carrier_concentration.get(charge_carrier);
63 }
64
65
66
67
68
69 public double tanLorentzAngle(double b_field, ChargeCarrier charge_carrier)
70 {
71 return b_field * mobility(charge_carrier) * 1.0E-4;
72 }
73
74
75 public double mobility(ChargeCarrier charge_carrier)
76 {
77 return charge_carrier.muMin(_temperature) + charge_carrier.mu0(_temperature) /
78 (1.0 + Math.pow(_carrier_concentration.get(charge_carrier)/charge_carrier.nRef(_temperature),
79 charge_carrier.alpha(_temperature)));
80 }
81
82
83 public boolean isNtype(){return _doping_concentration > 0.0;}
84
85
86 }