Commit a3a0e6b5 authored by Simon Spannagel's avatar Simon Spannagel
Browse files

Merge branch 'CSADigitizer' into 'master'

Introducing and changing name of parameters in the [CSADigitizer]

See merge request allpix-squared/allpix-squared!1051
parents ba3278de 079eab92
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ The following authors, in alphabetical order, have developed or contributed to A
* Sabita Rao, GSDocs2020 Student, [srao](https://gitlab.cern.ch/srao)
* Daniil Rastorguev, DESY, [drastorg](https://gitlab.cern.ch/drastorg)
* Edoardo Rossi, DESY, [edrossi](https://gitlab.cern.ch/edrossi)
* Sara Ruiz Daza, DESY, [ruizdaza](https://gitlab.cern.ch/ruizdaza)
* Jihad Saidi, Université de Genève, [jisaidi](https://gitlab.cern.ch/jisaidi)
* Andre Sailer, CERN, [sailer](https://gitlab.cern.ch/sailer)
* Tasneem Saleem, Synchrotron SOLEIL, [TasneemSaleem](https://github.com/TasneemSaleem)
+14 −7
Original line number Diff line number Diff line
@@ -35,6 +35,9 @@ CSADigitizerModule::CSADigitizerModule(Configuration& config, Messenger* messeng
    // Read model
    model_ = config_.get<DigitizerType>("model");

    // Allow to use detector_capacitance as input_capacitance
    config_.setAlias("input_capacitance", "detector_capacitance", true);

    // Set defaults for config variables
    config_.setDefault<double>("integration_time", Units::get(500, "ns"));
    config_.setDefault<double>("threshold", Units::get(10e-3, "V"));
@@ -56,9 +59,10 @@ CSADigitizerModule::CSADigitizerModule(Configuration& config, Messenger* messeng
        // and for the "advanced" csa
        config_.setDefault<double>("feedback_capacitance", Units::get(5e-15, "C/V"));
        config_.setDefault<double>("krummenacher_current", Units::get(20e-9, "C/s"));
        config_.setDefault<double>("detector_capacitance", Units::get(100e-15, "C/V"));
        config_.setDefault<double>("input_capacitance", Units::get(100e-15, "C/V"));
        config_.setDefault<double>("amp_output_capacitance", Units::get(20e-15, "C/V"));
        config_.setDefault<double>("transconductance", Units::get(50e-6, "C/s/V"));
        config_.setDefault<double>("weak_inversion_slope", 1.5);
        config_.setDefault<double>("temperature", 293.15);
    }

@@ -101,20 +105,23 @@ CSADigitizerModule::CSADigitizerModule(Configuration& config, Messenger* messeng
                config_, "krummenacher_current", "The Krummenacher feedback current has to be positive definite.");
        }

        auto capacitance_detector = config_.get<double>("detector_capacitance");
        auto capacitance_input =
            config_.get<double>("input_capacitance"); // C_input = C_detector + C_feedback + C_parasitics
        auto capacitance_feedback = config_.get<double>("feedback_capacitance");
        auto capacitance_output = config_.get<double>("amp_output_capacitance");
        auto gm = config_.get<double>("transconductance");
        auto n_wi = config_.get<double>("weak_inversion_slope");
        auto boltzmann_kT = Units::get(8.6173333e-5, "eV/K") * config_.get<double>("temperature");

        // helper variables: transconductance and resistance in the feedback loop
        // weak inversion: gf = I/(n V_t) (e.g. Binkley "Tradeoff and Optimisation in Analog CMOS design")
        // n is the weak inversion slope factor (degradation of exponential MOS drain current compared to bipolar transistor
        // collector current) n_wi typically 1.5, for circuit described in  Kleczek 2016 JINST11 C12001: I->I_krumm/2
        auto transconductance_feedback = ikrum / (2.0 * 1.5 * boltzmann_kT);
        // collector current) and it is process specific
        // n_wi typically 1.5, for circuit described in  Kleczek 2016 JINST11 C12001: I->I_krumm/2
        auto transconductance_feedback = ikrum / (2.0 * n_wi * boltzmann_kT);
        auto resistance_feedback = 2. / transconductance_feedback; // feedback resistor
        auto tauF = resistance_feedback * capacitance_feedback;
        auto tauR = (capacitance_detector * capacitance_output) / (gm * capacitance_feedback);
        auto tauR = (capacitance_input * capacitance_output) / (gm * capacitance_feedback);

        calculate_impulse_response_ =
            std::make_unique<TFormula>("response_function", "[0]*(TMath::Exp(-x/[1])-TMath::Exp(-x/[2]))/([1]-[2])");
@@ -122,11 +129,11 @@ CSADigitizerModule::CSADigitizerModule(Configuration& config, Messenger* messeng

        LOG(DEBUG) << "Parameters: rf = " << Units::display(resistance_feedback, "V*s/C")
                   << ", capacitance_feedback = " << Units::display(capacitance_feedback, {"C/V", "fC/mV"})
                   << ", capacitance_detector = " << Units::display(capacitance_detector, {"C/V", "fC/mV"})
                   << ", capacitance_input = " << Units::display(capacitance_input, {"C/V", "fC/mV"})
                   << ", capacitance_output = " << Units::display(capacitance_output, {"C/V", "fC/mV"})
                   << ", gm = " << Units::display(gm, "C/s/V")
                   << ", tauF = " << Units::display(tauF, {"ns", "us", "ms", "s"})
                   << ", tauR = " << Units::display(tauR, {"ns", "us", "ms", "s"})
                   << ", tauR = " << Units::display(tauR, {"ns", "us", "ms", "s"}) << ", weak_inversion_slope = " << n_wi
                   << ", temperature = " << Units::display(config_.get<double>("temperature"), "K");
    } else if(model_ == DigitizerType::CUSTOM) {
        calculate_impulse_response_ =
+5 −3
Original line number Diff line number Diff line
@@ -61,9 +61,10 @@ If this behavior is not desired, the `ignore_polarity` parameter can be set to c

* `feedback_capacitance`: The feedback capacity to the amplifier circuit. Defaults to 5e-15 F.
* `krummenacher_current`: The feedback current setting of the CSA. Defaults to 20 nA.
* `detector_capacitance`: The detector capacitance. Defaults to 100 e-15 F.
* `input_capacitance`: The input capacitance which comprises the capacitance of the detector, the capacitance of the feedback circuit, and any additional capacitance caused by parasitic effects. Defaults to 100 e-15 F.
* `amp_output_capacitance`: The capacitance at the amplifier output. Defaults to 20 e-15 F.
* `transconductance`: The transconductance of the CSA feedback circuit. Defaults to 50e-6 C/s/V.
* `transconductance`: The transconductance of the input transistor of the CSA core amplifier. Defaults to 50e-6 C/s/V.
* `weak_inversion_slope`: The weak inversion slope. Defaults to 1.5.
* `temperature`: Defaults to 293.15K.

### Parameters for the custom model
@@ -85,10 +86,11 @@ Example how to use the `csa` model in this module:
[CSADigitizer]
model = "csa"
feedback_capacitance = 10e-15C/V
detector_capacitance = 100e-15C/V
input_capacitance = 100e-15C/V
krummenacher_current = 25e-9C/s
amp_output_capacitance = 15e-15C/V
transconductance = 50e-6C/s/V
weak_inversion_slope = 1.15
temperature = 298
integration_time = 0.5e-6s
threshold = 10e-3V