LArOpenCV  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
LArImageWire.cxx
Go to the documentation of this file.
1 #ifndef __LARLITE_LARIMAGEWIRE_CXX__
2 #define __LARLITE_LARIMAGEWIRE_CXX__
3 
4 #include "LArImageWire.h"
5 #include "LArUtil/Geometry.h"
6 #include "DataFormat/wire.h"
7 namespace larlite {
8 
9  void LArImageWire::_Configure_(const ::fcllite::PSet &pset)
10  {
11  _charge_to_gray_scale = pset.get<double>("Q2Gray");
12  }
13 
14  void LArImageWire::store_clusters(storage_manager* storage)
15  {
16  static bool warn_once = false;
17  if(!warn_once) {
18  print(msg::kWARNING,__FUNCTION__,"Cluster storage is not implemented...");
19  warn_once = true;
20  }
21  }
22 
23  void LArImageWire::extract_image(storage_manager* storage)
24  {
25  auto const& geom = ::larutil::Geometry::GetME();
26  const size_t nplanes = geom->Nplanes();
27 
28  auto ev_wire = storage->get_data<event_wire>(producer());
29 
30  if(!ev_wire) throw DataFormatException("Could not locate Wire data product!");
31 
32  std::vector< std::pair<size_t,size_t> > wire_range_v(nplanes,std::pair<size_t,size_t>(1e12,0));
33  std::vector< std::pair<size_t,size_t> > tick_range_v(nplanes,std::pair<size_t,size_t>(1e12,0));
34 
35  for(auto const& wire_data : *ev_wire) {
36 
37  auto const& wid = geom->ChannelToWireID(wire_data.Channel());
38 
39  auto& wire_range = wire_range_v[wid.Plane];
40  if(wire_range.first > wid.Wire) wire_range.first = wid.Wire;
41  if(wire_range.second < wid.Wire) wire_range.second = wid.Wire;
42 
43  auto& tick_range = tick_range_v[wid.Plane];
44 
45  auto const& roi_v = wire_data.SignalROI();
46 
47  for(auto const& roi : roi_v.get_ranges()) {
48  size_t start_tick = roi.begin_index();
49  size_t last_tick = start_tick + roi.size() - 1;
50  if(tick_range.first > start_tick) tick_range.first = start_tick;
51  if(tick_range.second < last_tick) tick_range.second = last_tick;
52  }
53  }
54 
55  for(size_t plane=0; plane<nplanes; ++plane) {
56  auto const& wire_range = wire_range_v[plane];
57  auto const& tick_range = tick_range_v[plane];
58  size_t nticks = tick_range.second - tick_range.first + 2;
59  size_t nwires = wire_range.second - wire_range.first + 2;
60  ::larcv::ImageMeta meta((double)nwires,(double)nticks,nwires,nticks,wire_range.first,tick_range.first);
61 
62  if(!nticks || !nwires)
63  _img_mgr.push_back(cv::Mat(),meta);
64  else
65  _img_mgr.push_back(::cv::Mat(nwires, nticks, CV_8UC1, cvScalar(0.)),meta);
66  }
67 
68  for(auto const& wire_data : *ev_wire) {
69 
70  auto const& wid = geom->ChannelToWireID(wire_data.Channel());
71 
72  auto& mat = _img_mgr.img_at(wid.Plane);
73 
74  auto const& roi_v = wire_data.SignalROI();
75 
76  auto const& wire_range = wire_range_v[wid.Plane];
77  auto const& tick_range = tick_range_v[wid.Plane];
78 
79  for(auto const& roi : roi_v.get_ranges()) {
80  size_t start_tick = roi.begin_index();
81  for(size_t adc_index=0; adc_index < roi.size(); ++adc_index) {
82  size_t x = wid.Wire - wire_range.first;
83  size_t y = start_tick + adc_index - tick_range.first;
84  double q = roi[adc_index] / _charge_to_gray_scale;
85  q += (double)(mat.at<unsigned char>(x,y));
86  if(q<0) q=0.;
87  if(q>255) q=255;
88  mat.at<unsigned char>(x,y) = (unsigned char)((int)q);
89  }
90  }
91  }
92 
93  }
94 
95 }
96 #endif