164 const unsigned int n_channels = inputWaveforms.size();
167 const double tick = detectorProperties.SamplingRate();
168 const size_t nsamples = inputWaveforms.at(0).NADC();
172 std::vector<int> uchans(geometry.
Nwires(0)), vchans(geometry.
Nwires(1)), wchans(geometry.
Nwires(2));
173 const int nchans = uchans.size() + vchans.size() + wchans.size();
174 std::iota(uchans.begin(), uchans.end(), 0);
175 std::iota(vchans.begin(), vchans.end(), vchans.size());
176 std::iota(wchans.begin(), wchans.end(), vchans.size() + uchans.size());
179 const double unombl=2048.0, vnombl=2048.0, wnombl=400.0;
182 std::vector<int> miscfgchan;
183 for(
int channelIdx=0; channelIdx<nchans; channelIdx++) {
184 if (elec_provider.ExtraInfo(channelIdx).GetBoolData(
"is_misconfigured")) {
185 miscfgchan.push_back(channelIdx);
189 const double from_gain_mVfC=4.7, to_gain_mVfC=14.0,from_shaping=1.0*units::microsecond, to_shaping=2.0*units::microsecond;
192 std::vector<int> bad_channels;
193 for(
int channelIdx=0; channelIdx<nchans; channelIdx++)
if (channelStatus.IsBad(channelIdx)) bad_channels.push_back(channelIdx);
196 const double rcrc = 1.0*units::millisecond;
197 std::vector<int> rcrcchans(nchans);
198 std::iota(rcrcchans.begin(), rcrcchans.end(), 0);
201 std::vector<int> harmonicchans(uchans.size() + vchans.size());
202 std::iota(harmonicchans.begin(), harmonicchans.end(), 0);
204 std::vector<int> special_chans;
205 special_chans.push_back(2240);
207 WireCell::SigProc::SimpleChannelNoiseDB::mask_t h36kHz(0,169,173);
208 WireCell::SigProc::SimpleChannelNoiseDB::mask_t h108kHz(0,513,516);
209 WireCell::SigProc::SimpleChannelNoiseDB::mask_t hspkHz(0,17,19);
210 WireCell::SigProc::SimpleChannelNoiseDB::multimask_t hharmonic;
211 hharmonic.push_back(h36kHz);
212 hharmonic.push_back(h108kHz);
213 WireCell::SigProc::SimpleChannelNoiseDB::multimask_t hspecial;
214 hspecial.push_back(h36kHz);
215 hspecial.push_back(h108kHz);
216 hspecial.push_back(hspkHz);
218 float u_resp_array[120]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.364382, 0.387949, 0.411053, 0.433979, 0.456863, 0.479746, 0.502641, 0.52554, 0.548441, 0.57134, 0.591765, 0.609448, 0.626848, 0.644094, 0.661364, 0.678859, 0.695231, 0.710462, 0.726147, 0.742373, 0.761332, 0.783313, 0.806325, 0.830412, 0.857676, 0.888412, 0.920705, 0.954624, 0.990242, 1.02766, 1.06121, 1.09027, 1.12037, 1.15157, 1.18392, 1.21748, 1.25229, 1.28824, 1.32509, 1.36256, 1.40051, 1.43907, 1.47857, 1.51933, 1.56134, 1.60404, 1.72665, 1.94005, 2.16994, 2.42041, 2.69475, 3.07222, 3.67375, 4.60766, 5.91864, 7.30178, 8.3715, 8.94736, 8.93705, 8.40339, 7.2212, 5.76382, 3.8931, 1.07893, -3.52481, -11.4593, -20.4011, -29.1259, -34.9544, -36.9358, -35.3303, -31.2068, -25.8614, -20.3613, -15.3794, -11.2266, -7.96091, -5.50138, -3.71143, -2.44637, -1.57662, -0.99733, -0.62554, -0.393562, -0.249715, -0.15914, -0.100771, -0.062443, -0.037283, -0.0211508, -0.0112448, -0.00552085, -0.00245133, -0.000957821, -0.000316912, -8.51679e-05, -2.21299e-05, -1.37496e-05, -1.49806e-05, -1.36935e-05, -9.66758e-06, -5.20773e-06, -7.4787e-07, 3.71199e-06, 8.17184e-06, 1.26317e-05, 1.70916e-05, 2.15514e-05, 2.60113e-05, 3.04711e-05};
219 float v_resp_array[120]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0865303, 0.0925559, 0.0983619, 0.104068, 0.109739, 0.115403, 0.121068, 0.126735, 0.132403, 0.138072, 0.143739, 0.149408, 0.155085, 0.160791, 0.166565, 0.172454, 0.178514, 0.184795, 0.191341, 0.198192, 0.205382, 0.212944, 0.220905, 0.229292, 0.238129, 0.247441, 0.257256, 0.267601, 0.278502, 0.28999, 0.298745, 0.304378, 0.310105, 0.315921, 0.321818, 0.327796, 0.333852, 0.339967, 0.346098, 0.352169, 0.358103, 0.363859, 0.36945, 0.374915, 0.380261, 0.385401, 0.39016, 0.394378, 0.39804, 0.401394, 0.405145, 0.410714, 0.4205, 0.437951, 0.467841, 0.516042, 0.587738, 0.694157, 0.840763, 1.01966, 1.22894, 1.5612, 2.12348, 3.31455, 5.59355, 9.10709, 14.1756, 18.4603, 19.9517, 17.4166, 10.6683, 1.40656, -10.0638, -19.034, -23.654, -24.0558, -21.4418, -17.3229, -12.9485, -9.08912, -6.05941, -3.86946, -2.38669, -1.43678, -0.853335, -0.503951, -0.296551, -0.173029, -0.0990099, -0.0547172, -0.0287882, -0.0142758, -0.00661815, -0.00284757, -0.00115702, -0.000456456, -0.000183439, -8.04214e-05, -4.20533e-05, -2.62903e-05, -1.64098e-05, -6.68039e-06, 3.04903e-06, 1.27784e-05, 2.25079e-05, 3.22373e-05, 4.19667e-05, 5.16961e-05, 6.14255e-05, 7.11549e-05};
220 WireCell::Waveform::realseq_t u_resp(nsamples);
221 WireCell::Waveform::realseq_t v_resp(nsamples);
222 for (
int i=0;i!=120;i++){
223 u_resp.at(i) = u_resp_array[i];
224 v_resp.at(i) = v_resp_array[i];
226 WireCell::Waveform::compseq_t u_resp_freq = WireCell::Waveform::dft(u_resp);
227 WireCell::Waveform::compseq_t v_resp_freq = WireCell::Waveform::dft(v_resp);
229 int uplane_time_shift = 79;
230 int vplane_time_shift = 82;
233 std::vector< std::vector<int> > channel_groups;
234 for (
unsigned int i=0;i!=172;i++){
236 std::vector<int> channel_group;
237 for (
int j=0;j!=48;j++){
238 channel_group.push_back(i*48+j);
240 channel_groups.push_back(channel_group);
243 auto noise =
new WireCell::SigProc::SimpleChannelNoiseDB;
245 noise->set_sampling(tick, nsamples);
247 noise->set_nominal_baseline(uchans, unombl);
248 noise->set_nominal_baseline(vchans, vnombl);
249 noise->set_nominal_baseline(wchans, wnombl);
251 noise->set_response(uchans,u_resp_freq);
252 noise->set_response(vchans,v_resp_freq);
254 noise->set_response_offset(uchans,uplane_time_shift);
255 noise->set_response_offset(vchans,vplane_time_shift);
257 noise->set_pad_window_front(uchans,20);
258 noise->set_pad_window_back(uchans,10);
259 noise->set_pad_window_front(vchans,10);
260 noise->set_pad_window_back(vchans,10);
261 noise->set_pad_window_front(wchans,10);
262 noise->set_pad_window_back(wchans,10);
265 noise->set_gains_shapings(miscfgchan, from_gain_mVfC, to_gain_mVfC, from_shaping, to_shaping);
267 noise->set_rcrc_constant(rcrcchans, rcrc);
269 noise->set_bad_channels(bad_channels);
271 noise->set_filter(harmonicchans,hharmonic);
272 noise->set_filter(special_chans,hspecial);
273 noise->set_channel_groups(channel_groups);
275 for (
unsigned int i=0;i!=uchans.size();i++){
276 if (uchans.at(i)<100){
277 noise->set_min_rms_cut_one(uchans.at(i),1);
278 noise->set_max_rms_cut_one(uchans.at(i),5);
279 }
else if (uchans.at(i)<2000){
280 noise->set_min_rms_cut_one(uchans.at(i),1.9);
281 noise->set_max_rms_cut_one(uchans.at(i),11);
283 noise->set_min_rms_cut_one(uchans.at(i),0.9);
284 noise->set_max_rms_cut_one(uchans.at(i),5);
287 for (
unsigned int i=0;i!=vchans.size();i++){
288 if (vchans.at(i)<290+ (int) uchans.size()){
289 noise->set_min_rms_cut_one(vchans.at(i),1);
290 noise->set_max_rms_cut_one(vchans.at(i),5);
291 }
else if (vchans.at(i)<2200+(int) uchans.size()){
292 noise->set_min_rms_cut_one(vchans.at(i),1.9);
293 noise->set_max_rms_cut_one(vchans.at(i),11);
295 noise->set_min_rms_cut_one(vchans.at(i),1);
296 noise->set_max_rms_cut_one(vchans.at(i),5);
302 for (
unsigned int i=0;i!=uchans.size();i++){
303 if (uchans.at(i)<600){
304 noise->set_min_rms_cut_one(uchans.at(i),1+(1.7-1)/600.*i);
305 noise->set_max_rms_cut_one(uchans.at(i),5);
306 }
else if (uchans.at(i)<1800){
307 noise->set_min_rms_cut_one(uchans.at(i),1.7);
308 noise->set_max_rms_cut_one(uchans.at(i),11);
310 noise->set_min_rms_cut_one(uchans.at(i),1+ (1.7-1)/600.*(2399-i));
311 noise->set_max_rms_cut_one(uchans.at(i),5);
314 for (
unsigned int i=0;i!=vchans.size();i++){
315 if (vchans.at(i)<600+(int)uchans.size()){
316 noise->set_min_rms_cut_one(vchans.at(i),0.8+(1.7-0.8)/600.*i);
317 noise->set_max_rms_cut_one(vchans.at(i),5);
318 }
else if (vchans.at(i)<1800+(int)uchans.size()){
319 noise->set_min_rms_cut_one(vchans.at(i),1.7);
320 noise->set_max_rms_cut_one(vchans.at(i),11);
322 noise->set_min_rms_cut_one(vchans.at(i),0.8+ (1.7-0.8)/600.*(2399-i));
323 noise->set_max_rms_cut_one(vchans.at(i),5);
328 noise->set_min_rms_cut(wchans,1.3);
329 noise->set_max_rms_cut(wchans,8.0);
332 std::shared_ptr<WireCell::IChannelNoiseDatabase> noise_sp(
noise);
334 auto one =
new WireCell::SigProc::Microboone::OneChannelNoise;
335 one->set_channel_noisedb(noise_sp);
336 std::shared_ptr<WireCell::IChannelFilter> one_sp(one);
337 auto many =
new WireCell::SigProc::Microboone::CoherentNoiseSub;
338 many->set_channel_noisedb(noise_sp);
339 std::shared_ptr<WireCell::IChannelFilter> many_sp(many);
342 WireCell::SigProc::OmnibusNoiseFilter bus;
343 bus.set_channel_filters({one_sp});
344 bus.set_grouped_filters({many_sp});
345 bus.set_channel_noisedb(noise_sp);
349 size_t stopBin(startBin + windowSize);
353 for(
unsigned int ich=0; ich<n_channels; ich++)
355 if( inputWaveforms.at(ich).NADC() < windowSize )
continue;
359 WireCell::ITrace::ChargeSequence charges;
361 charges.resize(nsamples);
363 std::transform(rawAdcVec.begin(), rawAdcVec.end(), charges.begin(), [](
auto& adcVal){
return float(adcVal);});
365 unsigned int chan = inputWaveforms.at(ich).Channel();
366 WireCell::SimpleTrace* st =
new WireCell::SimpleTrace(chan, 0.0, charges);
367 traces.push_back(WireCell::ITrace::pointer(st));
371 WireCell::SimpleFrame* sf =
new WireCell::SimpleFrame(0, 0, traces);
372 WireCell::IFrame::pointer frame = WireCell::IFrame::pointer(sf);
373 WireCell::IFrame::pointer quiet = NULL;
384 std::vector< short > waveform(windowSize);
386 auto quiet_traces = quiet->traces();
387 for (
auto quiet_trace : *quiet_traces.get()) {
389 unsigned int channel = quiet_trace->channel();
391 auto& quiet_charges = quiet_trace->charge();
394 float pedestal = pedestalValues.PedMean(channel);
396 std::transform(quiet_charges.begin() + startBin, quiet_charges.begin() + stopBin, waveform.begin(), [pedestal](
auto charge){
return std::round(charge+pedestal);});
399 outputWaveforms.back().SetPedestal(pedestal,1.75);
Collection of charge vs time digitized from a single readout channel.
size_t fNumTicksToDropFront
std::vector< short > ADCvector_t
Type representing a (compressed) vector of ADC counts.
unsigned int Nwires(unsigned int p, unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wires in the specified plane.
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Description of geometry of one entire detector.