Loading src/modules/DefaultDigitizer/DefaultDigitizerModule.cpp +30 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ DefaultDigitizerModule::DefaultDigitizerModule(Configuration& config, config_.setDefault<int>("electronics_noise", Units::get(110, "e")); config_.setDefault<double>("gain", 1.0); config_.setDefault<double>("gain_smearing", 0.0); config_.setDefault<int>("threshold", Units::get(600, "e")); config_.setDefault<int>("threshold_smearing", Units::get(30, "e")); Loading Loading @@ -71,6 +72,34 @@ DefaultDigitizerModule::DefaultDigitizerModule(Configuration& config, gain_ = config_.get<double>("gain"); gain_smearing_ = config_.get<double>("gain_smearing"); if(config_.has("gain_function")) { gain_function_ = std::make_unique<TF1>("gain_function", (config_.get<std::string>("gain_function")).c_str(), 0., 100e3); if(!gain_function_->IsValid()) { throw InvalidValueError( config_, "gain_function", "The response function is not a valid ROOT::TFormula expression."); } auto parameters = config_.getArray<double>("gain_parameters"); // check if number of parameters match up if(static_cast<size_t>(gain_function_->GetNumberFreeParameters()) != parameters.size()) { throw InvalidValueError( config_, "gain_parameters", "The number of function parameters does not line up with the number of parameters in the function."); } for(size_t n = 0; n < parameters.size(); ++n) { gain_function_->SetParameter(static_cast<int>(n), parameters[n]); } LOG(DEBUG) << "Gain response function successfully initialized with " << parameters.size() << " parameters"; } else { gain_function_ = std::make_unique<TF1>("gain_function", "[0]*x", 0., 100e3); gain_function_->SetParameter(0, gain_); } saturation_ = config_.get<bool>("saturation"); saturation_mean_ = config_.get<unsigned int>("saturation_mean"); saturation_width_ = config_.get<unsigned int>("saturation_width"); Loading Loading @@ -212,7 +241,7 @@ void DefaultDigitizerModule::run(Event* event) { } // Apply the gain to the charge: charge *= gain; charge = gain_function_->Eval(charge); LOG(DEBUG) << "Charge after amplifier (gain): " << Units::display(charge, "e"); if(output_plots_) { h_pxq_gain->Fill(charge / 1e3); Loading src/modules/DefaultDigitizer/DefaultDigitizerModule.hpp +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include "tools/ROOT.h" #include <TF1.h> #include <TH1D.h> #include <TH2D.h> Loading Loading @@ -79,6 +80,7 @@ namespace allpix { unsigned int electronics_noise_{}; double gain_{}, gain_smearing_{}; std::unique_ptr<TF1> gain_function_{}; bool saturation_{}; unsigned int saturation_mean_{}, saturation_width_{}; Loading Loading
src/modules/DefaultDigitizer/DefaultDigitizerModule.cpp +30 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ DefaultDigitizerModule::DefaultDigitizerModule(Configuration& config, config_.setDefault<int>("electronics_noise", Units::get(110, "e")); config_.setDefault<double>("gain", 1.0); config_.setDefault<double>("gain_smearing", 0.0); config_.setDefault<int>("threshold", Units::get(600, "e")); config_.setDefault<int>("threshold_smearing", Units::get(30, "e")); Loading Loading @@ -71,6 +72,34 @@ DefaultDigitizerModule::DefaultDigitizerModule(Configuration& config, gain_ = config_.get<double>("gain"); gain_smearing_ = config_.get<double>("gain_smearing"); if(config_.has("gain_function")) { gain_function_ = std::make_unique<TF1>("gain_function", (config_.get<std::string>("gain_function")).c_str(), 0., 100e3); if(!gain_function_->IsValid()) { throw InvalidValueError( config_, "gain_function", "The response function is not a valid ROOT::TFormula expression."); } auto parameters = config_.getArray<double>("gain_parameters"); // check if number of parameters match up if(static_cast<size_t>(gain_function_->GetNumberFreeParameters()) != parameters.size()) { throw InvalidValueError( config_, "gain_parameters", "The number of function parameters does not line up with the number of parameters in the function."); } for(size_t n = 0; n < parameters.size(); ++n) { gain_function_->SetParameter(static_cast<int>(n), parameters[n]); } LOG(DEBUG) << "Gain response function successfully initialized with " << parameters.size() << " parameters"; } else { gain_function_ = std::make_unique<TF1>("gain_function", "[0]*x", 0., 100e3); gain_function_->SetParameter(0, gain_); } saturation_ = config_.get<bool>("saturation"); saturation_mean_ = config_.get<unsigned int>("saturation_mean"); saturation_width_ = config_.get<unsigned int>("saturation_width"); Loading Loading @@ -212,7 +241,7 @@ void DefaultDigitizerModule::run(Event* event) { } // Apply the gain to the charge: charge *= gain; charge = gain_function_->Eval(charge); LOG(DEBUG) << "Charge after amplifier (gain): " << Units::display(charge, "e"); if(output_plots_) { h_pxq_gain->Fill(charge / 1e3); Loading
src/modules/DefaultDigitizer/DefaultDigitizerModule.hpp +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include "tools/ROOT.h" #include <TF1.h> #include <TH1D.h> #include <TH2D.h> Loading Loading @@ -79,6 +80,7 @@ namespace allpix { unsigned int electronics_noise_{}; double gain_{}, gain_smearing_{}; std::unique_ptr<TF1> gain_function_{}; bool saturation_{}; unsigned int saturation_mean_{}, saturation_width_{}; Loading