Commit 156e3fad authored by Paul Schütze's avatar Paul Schütze
Browse files

Merge branch 'add_rd50_models' into 'master'

Add Optimized Impact Ionization Models

See merge request allpix-squared/allpix-squared!977
parents 74b980ad 696c78f9
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1033,3 +1033,11 @@ keywords = {Gallium nitride, Low-field mobility}
  doi = {10.1016/j.nima.2022.166491},
  author = {R. Ballabriga and J. Braach and E. Buschmann and M. Campbell and D. Dannheim and K. Dort and L. Huth and I. Kremastiotis and J. Kröger and L. Linssen and M. Munker and P. Schütze and W. Snoeys and S. Spannagel and T. Vanat},
}
@article{rd50ionization,
  title={Study of impact ionization coefficients in silicon with Low Gain Avalanche Diodes},
  author={Esteban Curras Rivera and Michael Moll},
  year={2022},
  eprint={2211.16543},
  archivePrefix={arXiv},
  primaryClass={physics.ins-det}
}
 No newline at end of file
+78 −4
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ While $`A`$ is assumed to be temperature-independent, parameter $`B`$ exhibits a
B(T) = C + D \cdot T.
```

### Original publication

The parameter values implemented in Allpix Squared are taken from Section 3 of \[[@massey]\] as:

```math
@@ -57,6 +59,26 @@ for electrons and holes, respectively.

This model can be selected in the configuration file via the parameter `multiplication_model = "massey"`.

### Optimized parameters

An optimized parametrization of the Massey model based on measurements with an infrared laser is implemented in Allpix Squared, based on Table 2 of \[[@rd50ionization]\] with the values:

```math
\begin{aligned}
    A_{e} &= 1.186\times 10^{6} \,\text{/cm}\\
    C_{e} &= 1.020\times 10^{6} \,\text{V/cm}\\
    D_{e} &= 1.043\times 10^{3} \,\text{V/cm/K}\\
\\
    A_{h} &= 2.250\times 10^{6} \,\text{/cm}\\
    C_{h} &= 1.851\times 10^{6} \,\text{V/cm}\\
    D_{h} &= 1.828\times 10^{3} \,\text{V/cm/K}\\
\end{aligned}
```

for electrons and holes, respectively.

This model can be selected in the configuration file via the parameter `multiplication_model = "massey_optimized"`.


## Van Overstraeten-De Man Model

@@ -81,11 +103,15 @@ Temperature scaling of the ionization coefficient is performed via the $`\gamma(
Sentaurus TCAD user manual as:

```math
\gamma (T) = \tanh \left(\frac{0.063\times 10^{6} \,\text{eV}}{2 \times 8.6173\times 10^{-5} \,\text{eV/K} \cdot T_0} \right) \cdot \tanh \left(\frac{0.063\times 10^{6} \,\text{eV}}{2 \times 8.6173\times 10^{-5} \,\text{eV/K} \cdot T} \right)^{-1}
\gamma (T) = \tanh \left(\frac{\hbar \omega_{op}}{2 k_{\mathrm{B}} \cdot T_0} \right) \cdot \tanh \left(\frac{\hbar \omega_{op}}{2 k_{\mathrm{B}} \cdot T} \right)^{-1}
```

The value of the reference temperature $`T_0`$ is not entirely clear as it is never stated explicitly, a value of
$`T_0 = 300 \,\text{K}`$ is assumed. The other parameter values implemented in Allpix Squared are taken from the abstract
with $`\hbar \omega_{op} = 0.063 \,\text{eV}`$ and the Boltzmann constant $`k_{\mathrm{B}} = 8.6173\times 10^{-5} \,\text{eV/K}`$. The value of the reference temperature $`T_0`$ is not entirely clear as it is never
stated explicitly, a value of $`T_0 = 300 \,\text{K}`$ is assumed.

### Original publication

The other model parameter values implemented in Allpix Squared are taken from the abstract
of \[[@overstraeten]\] as:

```math
@@ -103,6 +129,29 @@ of \[[@overstraeten]\] as:

This model can be selected in the configuration file via the parameter `multiplication_model = "overstraeten"`.


### Optimized parameters

An optimized parametrization of the Van Overstraeten-De Man model based on measurements with an infrared laser is implemented in Allpix Squared, based on Table 3 of \[[@rd50ionization]\] with the following parameter values:

```math
\begin{aligned}
    a_{\infty, e} &= 1.149\times 10^{6} \,\text{/cm}\\
    b_{e} &= 1.325\times 10^{6} \,\text{V/cm}\\
    \\
    a_{\infty, h} &= 2.519\times 10^{6} \,\text{/cm}\\
    b_{h} &= 2.428\times 10^{6} \,\text{V/cm}\\
    \\
    \hbar \omega_{op} &= 0.0758 \,\text{eV}
\end{aligned}
```

In contrast to the original model, this publication uses a parametrization without differentiating between low and high field regions, hence only one parameter value is provided for each of $`a_{\infty, h}`$ and $`b_{h}`$.

This model can be selected in the configuration file via the parameter `multiplication_model = "overstraeten_optimized"`.



## Okuto-Crowell Model

The Okuto-Crowell model \[[@okuto]\] defines the impact ionization coefficient similarly to the above models but in addition
@@ -122,6 +171,8 @@ $`T_0 = 300 \,\text{K}`$ as:
\end{aligned}
```

## Original publication

The parameter values implemented in Allpix Squared are taken from Table 1 of \[[@okuto]\], using the values for silicon, as:

```math
@@ -131,7 +182,7 @@ The parameter values implemented in Allpix Squared are taken from Table 1 of \[[
    b_{300, e} &= 4.81\times 10^{5} \,\text{V/cm}\\
    d_{e} &= 6.86\times 10^{-4}\\
\\
    a_{300, h} &= 0.243 \,\text{/cm}\\
    a_{300, h} &= 0.243 \,\text{/V}\\
    c_{h} &= 5.35\times 10^{-4}\\
    b_{300, h} &= 6.53\times 10^{5} \,\text{V/cm}\\
    d_{h} &= 5.67\times 10^{-4}\\
@@ -140,6 +191,28 @@ The parameter values implemented in Allpix Squared are taken from Table 1 of \[[

This model can be selected in the configuration file via the parameter `multiplication_model = "okuto"`.

### Optimized parameters

An optimized parametrization of the Okuto-Crowell model based on measurements with an infrared laser is implemented in Allpix Squared, based on Table 4 of \[[@rd50ionization]\] with the following parameter values:

```math
\begin{aligned}
    a_{300, e} &= 0.289 \,\text{/V}\\
    c_{e} &= 9.03\times 10^{-4}\\
    b_{300, e} &= 4.01\times 10^{5} \,\text{V/cm}\\
    d_{e} &= 1.11\times 10^{-3}\\
\\
    a_{300, h} &= 0.202 \,\text{/V}\\
    c_{h} &= -2.20\times 10^{-3}\\
    b_{300, h} &= 6.40\times 10^{5} \,\text{V/cm}\\
    d_{h} &= 8.25\times 10^{-4}\\
\end{aligned}
```

This model can be selected in the configuration file via the parameter `multiplication_model = "okuto_optimized"`.



## Bologna Model

The Bologna model \[[@bologna]\] describes impact ionization for experimental data in an electric field range from
@@ -233,6 +306,7 @@ supports all corresponding features, mathematical expressions and constants.


[@massey]: https://doi.org/10.1109/TED.2006.881010
[@rd50ionization]: https://arxiv.org/abs/2211.16543
[@overstraeten]: https://doi.org/10.1016/0038-1101(70)90139-5
[@okuto]: https://doi.org/10.1016/0038-1101(75)90099-4
[@bologna]: https://doi.org/10.1109/SISPAD.1999.799251
+76 −2
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ namespace allpix {
            }
        };

    protected:
        double electron_a_;
        double electron_b_;

@@ -109,6 +110,25 @@ namespace allpix {
        double hole_b_;
    };

    /**
     * @ingroup Models
     * @brief Massey model for impact ionization with optimized parameters
     *
     * This is the Massey impact ionization model with updated parameters from fits to measurements performed at CERN within
     * the RD50 collaboration and the CERN EP R&D programme on technologies for future experiments. Values from Table 2 in
     * https://arxiv.org/abs/2211.16543
     */
    class MasseyOptimized : virtual public Massey {
    public:
        MasseyOptimized(double temperature, double threshold)
            : ImpactIonizationModel(threshold), Massey(temperature, threshold) {
            electron_a_ = Units::get(1.186e6, "/cm");
            electron_b_ = Units::get(1.020e6, "V/cm") + Units::get(1.043e3, "V/cm/K") * temperature;
            hole_a_ = Units::get(2.250e6, "/cm");
            hole_b_ = Units::get(1.851e6, "V/cm") + Units::get(1.828e3, "V/cm/K") * temperature;
        };
    };

    /**
     * @ingroup Models
     * @brief van Overstraeten de Man model for impact ionization
@@ -123,8 +143,8 @@ namespace allpix {
    public:
        VanOverstraetenDeMan(double temperature, double threshold)
            : ImpactIonizationModel(threshold),
              gamma_(std::tanh(Units::get(0.063e6, "eV") / (2. * Units::get(8.6173333e-5, "eV/K") * 300.)) /
                     std::tanh(Units::get(0.063e6, "eV") / (2. * Units::get(8.6173333e-5, "eV/K") * temperature))),
              gamma_(std::tanh(Units::get(0.063, "eV") / (2. * Units::get(8.6173333e-5, "eV/K") * 300.)) /
                     std::tanh(Units::get(0.063, "eV") / (2. * Units::get(8.6173333e-5, "eV/K") * temperature))),
              e_zero_(Units::get(4.0e5, "V/cm")), electron_a_(Units::get(7.03e5, "/cm")),
              electron_b_(Units::get(1.231e6, "V/cm")), hole_a_low_(Units::get(1.582e6, "/cm")),
              hole_a_high_(Units::get(6.71e5, "/cm")), hole_b_low_(Units::get(2.036e6, "V/cm")),
@@ -141,6 +161,7 @@ namespace allpix {
            }
        };

    protected:
        double gamma_;
        double e_zero_;

@@ -153,6 +174,33 @@ namespace allpix {
        double hole_b_high_;
    };

    /**
     * @ingroup Models
     * @brief van Overstraeten de Man model for impact ionization with optimized parameters
     *
     * This is the van Overstraeten de Man impact ionization model with updated parameters from fits to measurements
     * performed at CERN within the RD50 collaboration and the CERN EP R&D programme on technologies for future experiments.
     * Values from Table 3 in https://arxiv.org/abs/2211.16543
     *
     * In contrast to the original model from van Overstraeten de Man, this publication uses a parametrization without
     * differentiating between low and high field regions.
     */
    class VanOverstraetenDeManOptimized : virtual public VanOverstraetenDeMan {
    public:
        VanOverstraetenDeManOptimized(double temperature, double threshold)
            : ImpactIonizationModel(threshold), VanOverstraetenDeMan(temperature, threshold) {
            gamma_ = std::tanh(Units::get(0.0758, "eV") / (2. * Units::get(8.6173333e-5, "eV/K") * 300.)) /
                     std::tanh(Units::get(0.0758, "eV") / (2. * Units::get(8.6173333e-5, "eV/K") * temperature));
            electron_a_ = Units::get(1.149e6, "/cm");
            electron_b_ = Units::get(1.325e6, "V/cm");
            hole_a_low_ = Units::get(2.519e6, "/cm");
            hole_b_low_ = Units::get(2.428e6, "V/cm");
            // The publication uses the same parameters for low and high electric field regions:
            hole_a_high_ = Units::get(2.519e6, "/cm");
            hole_b_high_ = Units::get(2.428e6, "V/cm");
        };
    };

    /**
     * @ingroup Models
     * @brief Okuto Crowell model for impact ionization
@@ -177,12 +225,32 @@ namespace allpix {
            }
        };

    protected:
        double electron_ac_;
        double electron_bd_;
        double hole_ac_;
        double hole_bd_;
    };

    /**
     * @ingroup Models
     * @brief Okuto Crowell model for impact ionization with optimized parameters
     *
     * This is the Okuto Crowell impact ionization model with updated parameters from fits to measurements
     * performed at CERN within the RD50 collaboration and the CERN EP R&D programme on technologies for future experiments.
     * Values from Table 4 in https://arxiv.org/abs/2211.16543
     */
    class OkutoCrowellOptimized : virtual public OkutoCrowell {
    public:
        OkutoCrowellOptimized(double temperature, double threshold)
            : ImpactIonizationModel(threshold), OkutoCrowell(temperature, threshold) {
            electron_ac_ = Units::get(0.289, "/V") * (1. + 9.03e-4 * (temperature - 300));
            electron_bd_ = Units::get(4.01e5, "V/cm") * (1. + 1.11e-3 * (temperature - 300));
            hole_ac_ = Units::get(0.202, "/V") * (1. - 2.20e-3 * (temperature - 300));
            hole_bd_ = Units::get(6.40e5, "V/cm") * (1. + 8.25e-4 * (temperature - 300));
        };
    };

    /**
     * @ingroup Models
     * @brief Bologna model for impact ionization
@@ -303,10 +371,16 @@ namespace allpix {

                if(model == "massey") {
                    model_ = std::make_unique<Massey>(temperature, threshold);
                } else if(model == "massey_optimized") {
                    model_ = std::make_unique<MasseyOptimized>(temperature, threshold);
                } else if(model == "overstraeten") {
                    model_ = std::make_unique<VanOverstraetenDeMan>(temperature, threshold);
                } else if(model == "overstraeten_optimized") {
                    model_ = std::make_unique<VanOverstraetenDeManOptimized>(temperature, threshold);
                } else if(model == "okuto") {
                    model_ = std::make_unique<OkutoCrowell>(temperature, threshold);
                } else if(model == "okuto_optimized") {
                    model_ = std::make_unique<OkutoCrowellOptimized>(temperature, threshold);
                } else if(model == "bologna") {
                    model_ = std::make_unique<Bologna>(temperature, threshold);
                } else if(model == "none") {