3434#include " sbndaq-artdaq-core/Overlays/SBND/NevisTPCFragment.hh"
3535#include " sbndaq-artdaq-core/Overlays/SBND/NevisTPC/NevisTPCTypes.hh"
3636#include " sbndaq-artdaq-core/Overlays/SBND/NevisTPC/NevisTPCUtilities.hh"
37+ #include " sbnobj/Common/Analysis/TPCChannelInfo.hh"
3738
3839
3940DEFINE_ART_MODULE (daq::SBNDTPCDecoder)
@@ -77,6 +78,7 @@ daq::SBNDTPCDecoder::SBNDTPCDecoder(fhicl::ParameterSet const & param):
7778 produces<RawDigits>();
7879 produces<RDTimeStamps>();
7980 produces<RDTsAssocs>();
81+ produces<std::vector<anab::TPCChannelInfo>>();
8082 if (_config.produce_header ) {
8183 produces<std::vector<tpcAnalysis::TPCDecodeAna>>();
8284 }
@@ -113,6 +115,7 @@ void daq::SBNDTPCDecoder::produce(art::Event & event)
113115 std::unique_ptr<RawDigits> rawdigit_collection (new RawDigits);
114116 std::unique_ptr<RDTimeStamps> rdts_collection (new RDTimeStamps);
115117 std::unique_ptr<RDTsAssocs> rdtsassoc_collection (new RDTsAssocs);
118+ std::unique_ptr<std::vector<anab::TPCChannelInfo>> channeldata_collection (new std::vector<anab::TPCChannelInfo>);
116119 std::unique_ptr<std::vector<tpcAnalysis::TPCDecodeAna>> header_collection (new std::vector<tpcAnalysis::TPCDecodeAna>);
117120
118121 if ( daq_handle.isValid () ) {
@@ -125,10 +128,16 @@ void daq::SBNDTPCDecoder::produce(art::Event & event)
125128 mf::LogWarning (" SBNDTPCDecoder_module" ) << " Invalid fragment handle: Skipping TPC digit decoding" ;
126129 }
127130
131+ for (const raw::RawDigit &r: *rawdigit_collection) {
132+ anab::TPCChannelInfo i {r.Channel (), r.GetPedestal (), r.GetSigma (), getEvenFraction (r.ADCs ()), getxBADFraction (r.ADCs ())};
133+ channeldata_collection->push_back (i);
134+ }
135+
128136
129137 event.put (std::move (rawdigit_collection));
130138 event.put (std::move (rdts_collection));
131139 event.put (std::move (rdtsassoc_collection));
140+ event.put (std::move (channeldata_collection));
132141
133142 if (_config.produce_header ) {
134143 event.put (std::move (header_collection));
@@ -219,6 +228,23 @@ uint32_t daq::SBNDTPCDecoder::compute_checksum(sbndaq::NevisTPCFragment &fragmen
219228
220229}
221230
231+ float daq::SBNDTPCDecoder::getxBADFraction (const std::vector<int16_t > &v_adc) const {
232+ int n_bad = 0 ;
233+ for (int16_t s: v_adc) {
234+ if (s == 0xBAD ) n_bad += 1 ;
235+ }
236+ return ((float )n_bad) / v_adc.size ();
237+
238+ }
239+
240+ float daq::SBNDTPCDecoder::getEvenFraction (const std::vector<int16_t > &v_adc) const {
241+ int n_even = 0 ;
242+ for (int16_t s: v_adc) {
243+ if (s % 2 == 0 ) n_even += 1 ;
244+ }
245+ return ((float )n_even) / v_adc.size ();
246+
247+ }
222248
223249
224250void daq::SBNDTPCDecoder::getMedianSigma (const std::vector<int16_t > &v_adc, float &median,
0 commit comments