Commit 26ae74fa authored by Rafaella Eleni Kotitsa's avatar Rafaella Eleni Kotitsa Committed by Simon Spannagel
Browse files

DefaultDigitizer possibility of change of the gain function!

parent c82bf132
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -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"));

@@ -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");
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

#include "tools/ROOT.h"

#include <TF1.h>
#include <TH1D.h>
#include <TH2D.h>

@@ -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_{};