LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
WaveformRoiFinder_module.cc
Go to the documentation of this file.
1 // Class: WaveformRoiFinder
3 // Plugin Type: producer (art v3_05_00)
4 // File: WaveformRoiFinder_module.cc
5 //
6 // Authors: Mike Wang (mwang@fnal.gov)
7 // Lorenzo Uboldi (uboldi.lorenzo@gmail.com)
8 // Tingjun Yang (tjyang@fnal.gov)
9 // Wanwei Wu (wwu@fnal.gov)
10 //
11 // Generated at Fri Apr 10 23:30:12 2020 by Tingjun Yang using cetskelgen
12 // from cetlib version v3_10_00.
13 // Based on the Analyzer module written by Mike Wang.
15 
18 #include "lardataobj/RawData/raw.h"
20 #include "larrecodnn/ImagePatternAlgs/ToolInterfaces/IWaveformRecog.h"
21 
29 #include "cetlib_except/exception.h"
30 #include "fhiclcpp/ParameterSet.h"
31 
32 #include <memory>
33 #include <utility> // std::move()
34 #include <vector>
35 
36 namespace nnet {
37  class WaveformRoiFinder;
38 }
39 
41 public:
42  explicit WaveformRoiFinder(fhicl::ParameterSet const& p);
43  // The compiler-generated destructor is fine for non-base
44  // classes without bare pointers or other resource use.
45 
46  // Plugins should not be copied or assigned.
47  WaveformRoiFinder(WaveformRoiFinder const&) = delete;
51 
52  // Required functions.
53  void produce(art::Event& e) override;
54 
55 private:
58 
59  std::vector<std::unique_ptr<wavrec_tool::IWaveformRecog>> fWaveformRecogToolVec;
60 
61  int fNPlanes;
62  unsigned int fWaveformSize; // Full waveform size
63 };
64 
66  : EDProducer{p}
67  , fRawProducerLabel(p.get<art::InputTag>("RawProducerLabel", ""))
68  , fWireProducerLabel(p.get<art::InputTag>("WireProducerLabel", ""))
69 {
70  // use either raw waveform or recob waveform
72  throw cet::exception("WaveformRoiFinder")
73  << "Both RawProducerLabel and WireProducerLabel are empty";
74  }
75 
77  throw cet::exception("WaveformRoiFinder")
78  << "Only one of RawProducerLabel and WireProducerLabel should be set";
79  }
80 
81  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout const>()->Get();
82  fNPlanes = wireReadoutGeom.Nplanes();
83 
84  // Signal/Noise waveform recognition tool
86  auto const tool_psets = p.get<std::vector<fhicl::ParameterSet>>("WaveformRecogs");
87  fWaveformSize = tool_psets[0].get<unsigned int>("WaveformSize");
88  for (auto const& pset : tool_psets) {
89  fWaveformRecogToolVec.push_back(art::make_tool<wavrec_tool::IWaveformRecog>(pset));
90  }
91 
92  produces<std::vector<recob::Wire>>();
93 }
94 
96 {
98  std::vector<art::Ptr<raw::RawDigit>> rawlist;
99  if (e.getByLabel(fRawProducerLabel, rawListHandle)) art::fill_ptr_vector(rawlist, rawListHandle);
100 
101  art::Handle<std::vector<recob::Wire>> wireListHandle;
102  std::vector<art::Ptr<recob::Wire>> wirelist;
103  if (e.getByLabel(fWireProducerLabel, wireListHandle))
104  art::fill_ptr_vector(wirelist, wireListHandle);
105 
106  std::unique_ptr<std::vector<recob::Wire>> outwires(new std::vector<recob::Wire>);
107 
108  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout const>()->Get();
109 
110  //##############################
111  //### Looping over the wires ###
112  //##############################
113  for (unsigned int ich = 0; ich < (rawlist.empty() ? wirelist.size() : rawlist.size()); ++ich) {
114 
115  std::vector<float> inputsignal(fWaveformSize);
116 
117  int view = -1;
118 
119  if (!wirelist.empty()) {
120  const auto& wire = wirelist[ich];
121  const auto& signal = wire->Signal();
122 
123  view = wire->View();
124 
125  for (size_t itck = 0; itck < inputsignal.size(); ++itck) {
126  inputsignal[itck] = signal[itck];
127  }
128  }
129  else if (!rawlist.empty()) {
130  const auto& digitVec = rawlist[ich];
131 
132  view = wireReadoutGeom.View(rawlist[ich]->Channel());
133 
134  std::vector<short> rawadc(fWaveformSize);
135  raw::Uncompress(digitVec->ADCs(), rawadc, digitVec->GetPedestal(), digitVec->Compression());
136  for (size_t itck = 0; itck < rawadc.size(); ++itck) {
137  inputsignal[itck] = rawadc[itck] - digitVec->GetPedestal();
138  }
139  }
140 
141  // ... use waveform recognition CNN to perform inference on each window
142  std::vector<bool> inroi(fWaveformSize, false);
143  inroi = fWaveformRecogToolVec[view]->findROI(inputsignal);
144 
145  std::vector<float> sigs;
146  int lastsignaltick = -1;
147  int roistart = -1;
148  bool hasROI = false;
149 
151 
152  for (size_t i = 0; i < fWaveformSize; ++i) {
153  if (inroi[i]) {
154  hasROI = true;
155  if (sigs.empty()) {
156  sigs.push_back(inputsignal[i]);
157  lastsignaltick = i;
158  roistart = i;
159  }
160  else {
161  if (int(i) != lastsignaltick + 1) {
162  rois.add_range(roistart, std::move(sigs));
163  sigs.clear();
164  sigs.push_back(inputsignal[i]);
165  lastsignaltick = i;
166  roistart = i;
167  }
168  else {
169  sigs.push_back(inputsignal[i]);
170  lastsignaltick = i;
171  }
172  }
173  }
174  }
175  if (!sigs.empty()) { rois.add_range(roistart, std::move(sigs)); }
176  if (!wirelist.empty() && hasROI) {
177  outwires->emplace_back(rois, wirelist[ich]->Channel(), wirelist[ich]->View());
178  }
179  else if (!rawlist.empty() && hasROI) {
180  outwires->emplace_back(
181  rois, rawlist[ich]->Channel(), wireReadoutGeom.View(rawlist[ich]->Channel()));
182  }
183  }
184 
185  e.put(std::move(outwires));
186 }
187 
std::vector< std::unique_ptr< wavrec_tool::IWaveformRecog > > fWaveformRecogToolVec
EDProducer(fhicl::ParameterSet const &pset)
Definition: EDProducer.cc:6
const datarange_t & add_range(size_type offset, ITER first, ITER last)
Adds a sequence of elements as a range with specified offset.
Definition of basic raw digits.
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
Definition: AddMC.C:8
bool empty() const noexcept
Definition: InputTag.cc:73
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
Definition: Event.h:77
WaveformRoiFinder(fhicl::ParameterSet const &p)
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
Collect all the RawData header files together.
Definition: EmTrack.h:40
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Declaration of basic channel signal object.
WaveformRoiFinder & operator=(WaveformRoiFinder const &)=delete
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Definition: Ptr.h:306
void Uncompress(const std::vector< short > &adc, std::vector< short > &uncompressed, raw::Compress_t compress)
Uncompresses a raw data buffer.
Definition: raw.cxx:744
Float_t e
Definition: plot.C:35
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void produce(art::Event &e) override