Commit ff617198 authored by Håkan Wennlöf's avatar Håkan Wennlöf
Browse files

Added n-dopant parameter for Masetti mobility model

parent e2b9a52d
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -49,6 +49,14 @@ namespace allpix {
         * @return Mobility of the charge carrier
         */
        virtual double operator()(const CarrierType& type, double efield_mag, double doping) const = 0;

        /**
         * @brief Type of dopant
         */
        enum class Dopant {
            PHOSPHOROUS = 0,
            ARSENIC,
        };
    };

    /**
@@ -228,7 +236,7 @@ namespace allpix {
     */
    class Masetti : virtual public MobilityModel {
    public:
        Masetti(SensorMaterial material, double temperature, bool doping)
        Masetti(SensorMaterial material, double temperature, bool doping, MobilityModel::Dopant n_dopant)
            : electron_mu0_(Units::get(68.5, "cm*cm/V/s")),
              electron_mumax_(Units::get(1414, "cm*cm/V/s") * std::pow(temperature / 300, -2.5)),
              electron_cr_(Units::get(9.20e16, "/cm/cm/cm")), electron_alpha_(0.711),
@@ -240,6 +248,16 @@ namespace allpix {
            if(!doping) {
                throw ModelUnsuitable("No doping profile available");
            }
            if(n_dopant == MobilityModel::Dopant::PHOSPHOROUS) {
                LOG(WARNING) << "Phosphorous is used as n-dopant.";
                electron_mu0_ = Units::get(52.2, "cm*cm/V/s");
                electron_mumax_ = Units::get(1417, "cm*cm/V/s") * std::pow(temperature / 300, -2.5);
                electron_cr_ = Units::get(9.68e16, "/cm/cm/cm");
                electron_alpha_ = 0.68;
                electron_mu1_ = Units::get(43.4, "cm*cm/V/s");
                electron_cs_ = Units::get(3.43e20, "/cm/cm/cm");
                electron_beta_ = 2.0;
            }
            if(material != SensorMaterial::SILICON) {
                LOG(WARNING) << "Sensor material " << allpix::to_string(material) << " not valid for this model.";
            }
@@ -284,8 +302,9 @@ namespace allpix {
     */
    class MasettiCanali : public Canali, public Masetti {
    public:
        MasettiCanali(SensorMaterial material, double temperature, bool doping)
            : JacoboniCanali(material, temperature), Canali(material, temperature), Masetti(material, temperature, doping) {}
        MasettiCanali(SensorMaterial material, double temperature, bool doping, Dopant n_dopant)
            : JacoboniCanali(material, temperature), Canali(material, temperature),
              Masetti(material, temperature, doping, n_dopant) {}

        double operator()(const CarrierType& type, double efield_mag, double doping) const override {
            double masetti = Masetti::operator()(type, efield_mag, doping);
@@ -594,6 +613,7 @@ namespace allpix {
         * @param config    Configuration of the calling module
         * @param material  Material of the sensor in question
         * @param doping    Boolean to indicate presence of doping profile information
         * @param n_dopant  Enum to indicate the n-type dopant, defaults to phosphorus
         */
        explicit Mobility(const Configuration& config, SensorMaterial material, bool doping = false) {
            try {
@@ -610,9 +630,17 @@ namespace allpix {
                } else if(model == "hamburg_highfield") {
                    model_ = std::make_unique<HamburgHighField>(material, temperature);
                } else if(model == "masetti") {
                    model_ = std::make_unique<Masetti>(material, temperature, doping);
                    model_ = std::make_unique<Masetti>(
                        material,
                        temperature,
                        doping,
                        config.get<MobilityModel::Dopant>("n_dopant", MobilityModel::Dopant::ARSENIC));
                } else if(model == "masetti_canali") {
                    model_ = std::make_unique<MasettiCanali>(material, temperature, doping);
                    model_ = std::make_unique<MasettiCanali>(
                        material,
                        temperature,
                        doping,
                        config.get<MobilityModel::Dopant>("n_dopant", MobilityModel::Dopant::ARSENIC));
                } else if(model == "arora") {
                    model_ = std::make_unique<Arora>(material, temperature, doping);
                } else if(model == "ruch_kino") {