Loading src/physics/Mobility.hpp +33 −5 Original line number Diff line number Diff line Loading @@ -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, }; }; /** Loading Loading @@ -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), Loading @@ -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."; } Loading Loading @@ -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); Loading Loading @@ -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 { Loading @@ -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") { Loading Loading
src/physics/Mobility.hpp +33 −5 Original line number Diff line number Diff line Loading @@ -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, }; }; /** Loading Loading @@ -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), Loading @@ -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."; } Loading Loading @@ -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); Loading Loading @@ -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 { Loading @@ -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") { Loading