47 std::vector<std::pair<double, double>> &arriving_pulses,
48 std::vector<ldmx::HgcrocDigiCollection::Sample> &digiToAdd)
const {
54 double pad_capacitance =
getCondition(channelID,
"PAD_CAPACITANCE");
57 double toa_threshold =
getCondition(channelID,
"TOA_THRESHOLD");
58 double tot_threshold =
getCondition(channelID,
"TOT_THRESHOLD");
63 double drain_rate =
getCondition(channelID,
"DRAIN_RATE");
65 int readout_threshold = int(readout_threshold_float);
70 arriving_pulses.begin(), arriving_pulses.end(),
71 [](
const std::pair<double, double> &a,
72 const std::pair<double, double> &b) { return a.first > b.first; });
87 for (
int i_adc = 0; i_adc <
n_ad_cs_; i_adc++) {
89 ldmx_log(trace) <<
" iADC = " << i_adc <<
" at startBX = " << start_bx;
93 bool start_tot =
false;
94 bool over_toa =
false;
95 double tover_toa = -1;
96 double tover_tot = -1;
97 for (
auto hit : pulse.
hits()) {
100 if (hit_bx != i_adc) {
104 double vpeak = pulse(hit.second);
106 if (vpeak > tot_threshold) {
109 if (tover_tot < hit.second) {
110 tover_tot = hit.second;
114 if (vpeak > toa_threshold) {
115 if (!over_toa || hit.second < tover_toa) tover_toa = hit.second;
122 if (!over_toa && pulse(start_bx +
clock_cycle_) > toa_threshold) {
123 if (pulse(start_bx) < toa_threshold) {
137 double charge_deposited =
149 double tot = charge_deposited / drain_rate;
150 ldmx_log(trace) <<
" we are in TOT read-out mode, TOT = " << tot;
155 int tdc_counts = int(tot * 4096 / tot_max) +
pedestal;
162 toa = digiToAdd.back().toa();
167 toa = int((timecross - start_bx) *
ns_);
169 if (toa == 0) toa = 1;
170 if (toa > 1023) toa = 1023;
172 ldmx_log(trace) <<
" Adding TOT hit with toa = " << toa
173 <<
", tdc_counts = " << tdc_counts
174 <<
" adcT at prev iADC = "
175 << digiToAdd.at(i_adc - 1).adcT();
177 auto adc_at_tminus1 =
178 (i_adc > 0) ? digiToAdd.at(i_adc - 1).adcT() :
pedestal;
179 auto i_tot_sample = digiToAdd.size();
181 digiToAdd.emplace_back(
false,
true, adc_at_tminus1, tdc_counts, toa);
186 <<
" Adding further hits_ with ADC [t-1] = 0x3FF, toa = "
187 "0x3FF, until digiToAdd.size() = "
188 << digiToAdd.size() <<
" < n_ad_cs_(" <<
n_ad_cs_ <<
")";
189 while (digiToAdd.size() <
n_ad_cs_) {
191 digiToAdd.emplace_back(
true,
false, 0x3FF, 0x3FF, 0);
194 return (i_tot_sample <=
i_soi_ + 1);
201 int adc = bxvolts /
gain;
202 ldmx_log(trace) <<
" we are in ADC read-out mode, adc = " << adc;
203 if (adc < 0) adc = 0;
204 if (adc > 1023) adc = 1023;
208 if (pulse(start_bx) < toa_threshold && over_toa) {
211 toa = int((timecross - start_bx) *
ns_);
213 if (toa == 0) toa = 1;
214 if (toa > 1023) toa = 1023;
221 (i_adc > 0) ? digiToAdd.at(i_adc - 1).adcT() :
pedestal;
223 digiToAdd.emplace_back(
false,
false, adc_t_minus1, adc, toa);
227 if (save_pulse_truth_info_)
232 ldmx_log(trace) <<
" we are adding the hit IFF iSOI= " <<
i_soi_
233 <<
"'s adc_t = " << digiToAdd.at(
i_soi_).adcT()
234 <<
" >= thresh (" << readout_threshold <<
")";
235 return digiToAdd.at(
i_soi_).adcT() >= readout_threshold;
bool digitize(const int &channelID, std::vector< std::pair< double, double > > &arriving_pulses, std::vector< ldmx::HgcrocDigiCollection::Sample > &digiToAdd) const
Digitize the signals from the simulated hits_.