15void TrigScintQIEDigiProducer::configure(
18 strips_per_array_ = parameters.
get<
int>(
"number_of_strips");
20 mean_noise_ = parameters.
get<
double>(
"mean_noise");
21 mev_per_mip_ = parameters.
get<
double>(
"mev_per_mip");
22 pe_per_mip_ = parameters.
get<
double>(
"pe_per_mip");
23 input_collection_ = parameters.
get<std::string>(
"input_collection");
24 input_pass_name_ = parameters.
get<std::string>(
"input_pass_name");
25 output_collection_ = parameters.
get<std::string>(
"output_collection");
28 maxts_ = parameters.
get<
int>(
"maxts");
29 toff_overall_ = parameters.
get<
double>(
"toff_overall");
30 input_pulse_shape_ = parameters.
get<std::string>(
"input_pulse_shape");
31 tdc_thr_ = parameters.
get<
double>(
"tdc_thr");
32 pedestal_ = parameters.
get<
double>(
"pedestal");
33 elec_noise_ = parameters.
get<
double>(
"elec_noise");
34 sipm_gain_ = parameters.
get<
double>(
"sipm_gain");
35 s_freq_ = parameters.
get<
double>(
"qie_sf");
36 zero_supp_cut_ = parameters.
get<
double>(
"zeroSupp_in_pe");
38 if (input_pulse_shape_ ==
"Expo") {
39 pulse_params_.clear();
40 pulse_params_.push_back(parameters.
get<
double>(
"expo_k"));
41 pulse_params_.push_back(parameters.
get<
double>(
"expo_tmax"));
43 ldmx_log(debug) <<
"expo_k =" << pulse_params_[0];
44 ldmx_log(debug) <<
"expo_tmax =" << pulse_params_[1];
48 ldmx_log(debug) <<
"maxts_ =" << maxts_;
49 ldmx_log(debug) <<
"toff_overall_ =" << toff_overall_;
50 ldmx_log(debug) <<
"input_pulse_shape_ =" << input_pulse_shape_;
51 ldmx_log(debug) <<
"tdc_thr =" << tdc_thr_;
52 ldmx_log(debug) <<
"pedestal =" << pedestal_;
53 ldmx_log(debug) <<
"elec_noise =" << elec_noise_;
54 ldmx_log(debug) <<
"sipm_gain =" << sipm_gain_;
55 ldmx_log(debug) <<
"qie_sf =" << s_freq_;
56 ldmx_log(debug) <<
"zeroSupp_in_pe =" << zero_supp_cut_;
57 ldmx_log(debug) <<
"pe_per_mip =" << pe_per_mip_;
58 ldmx_log(debug) <<
"mev_per_mip =" << mev_per_mip_;
63 if (random_.get() ==
nullptr) {
64 const auto& rseed = getCondition<framework::RandomNumberSeedService>(
66 const auto& rseed2 = getCondition<framework::RandomNumberSeedService>(
69 random_ = std::make_unique<TRandom3>(rseed.getSeed(output_collection_));
73 smq_ =
new SimQIE(pedestal_, elec_noise_,
74 rseed2.getSeed(output_collection_ +
"SimQIE"));
76 smq_->setGain(sipm_gain_);
77 smq_->setFreq(s_freq_);
78 smq_->setNTimeSamples(maxts_);
79 smq_->setTDCThreshold(tdc_thr_);
84 std::vector<float> true_edep(strips_per_array_, 0.);
87 std::vector<Expo*> ex(strips_per_array_,
nullptr);
88 for (
int i = 0; i < strips_per_array_; i++) {
90 ex[i] =
new Expo(pulse_params_[0], pulse_params_[1]);
96 input_collection_, input_pass_name_)};
98 for (
const auto& sim_hit : sim_hits) {
101 ldmx_log(debug) <<
"Processing sim hit with bar ID: " <<
id.bar();
107 random_->Poisson(sim_hit.getEdep() / mev_per_mip_ * pe_per_mip_);
111 ex[
id.bar()]->addPulse(toff_overall_ + sim_hit.getTime(), pulse_amp);
114 true_edep[
id.bar()] += sim_hit.getEdep();
118 std::vector<trigscint::TrigScintQIEDigis> q_digis;
120 double total_noise = mean_noise_ * maxts_;
123 double sampling_time = 1000 / s_freq_;
126 for (
int bar_id = 0; bar_id < strips_per_array_; bar_id++) {
132 int n_noise_pulses = random_->Poisson(total_noise);
133 for (
int i = 0; i < n_noise_pulses; i++) {
134 ex[bar_id]->addPulse(random_->Uniform(0, maxts_ * sampling_time), 1);
138 if (smq_->pulseCut(ex[bar_id], zero_supp_cut_)) {
142 qie_info.
setADC(smq_->outAdc(ex[bar_id]));
143 qie_info.
setTDC(smq_->outTdc(ex[bar_id]));
144 qie_info.
setCID(smq_->capId(ex[bar_id]));
146 q_digis.push_back(qie_info);
149 event.add(output_collection_, q_digis);