Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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_ =
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment