EventImageData.cxx
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////////////////////
2 // Class: EventImageData
3 // Author: P.Plonski, R.Sulej (Robert.Sulej@cern.ch), D.Stefan (Dorota.Stefan@cern.ch), May 2016
4 // Stripped from SPMultiTpcDump by Leigh Whitehead (leigh.howard.whitehead@cern.ch)
5 //
6 // Produces "global image" of events in multi-tpc detector, could be FD workspace or ProtoDUNE (SP).
7 // Projections of ADC are saved to 1-byte / pixel (TH1C) format, int-size (TH2I) projection of PDG
8 // truth and float-size (TH2F) projection of true charge deposits can be saved as well. We use this
9 // to dump deconvoluted ADC images for preparation of various classifiers and CNN based pattern reco.
10 //
11 // Moved from larreco/RecoAlg/ImagePatternAlgs since it became specific to DUNE geometries.
12 //
13 //////////////////////////////////////////////////////////////////////////////////////////////////////
14 
16 
21 
24 
25 // Framework includes
32 #include "art_root_io/TFileService.h"
34 #include "fhiclcpp/types/Atom.h"
35 #include "fhiclcpp/types/Table.h"
37 
38 // C++ Includes
39 #include <vector>
40 #include <string>
41 #include <cmath>
42 #include <fstream>
43 
44 #include "TFile.h"
45 #include "TTree.h"
46 #include "TH2C.h" // ADC map
47 #include "TH2I.h" // PDG+vertex info map
48 #include "TH2F.h" // deposit map
49 
50 
51 nnet::EventImageData::EventImageData(size_t w, size_t d, bool saveDep) :
52  fVtxX(-9999), fVtxY(-9999),
53  fProjX(-9999), fProjY(-9999),
54  fSaveDep(saveDep)
55 {
56  fAdc.resize(w, std::vector<float>(d, 0));
57  if (saveDep) { fDeposit.resize(w, std::vector<float>(d, 0)); }
58  fPdg.resize(w, std::vector<int>(d, 0));
59 }
60 
61 
62 void nnet::EventImageData::setProjXY(const TrainingDataAlg & dataAlg, float x, float y, size_t gw, bool flipw, size_t gd, bool flipd)
63 {
64  if (flipw) { fProjX = gw + dataAlg.NWires() - x - 1; }
65  else { fProjX = gw + x; }
66 
67  if (flipd) { fProjY = gd + dataAlg.NScaledDrifts() - y/dataAlg.DriftWindow() - 1; }
68  else { fProjY = gd + y/dataAlg.DriftWindow(); }
69 }
70 
71 void nnet::EventImageData::addTpc(const TrainingDataAlg & dataAlg, size_t gw, bool flipw, size_t gd, bool flipd)
72 {
73  float zero = dataAlg.ZeroLevel();
74  for (size_t w = 0; w < dataAlg.NWires(); ++w)
75  {
76  size_t drift_size = dataAlg.NScaledDrifts();
77  std::vector<float> & dstAdc = fAdc[gw + w];
78  std::vector<float> & dstDep = fDeposit[gw + w];
79  std::vector<int> & dstPdg = fPdg[gw + w];
80  const float* srcAdc = 0;
81  const float* srcDep = 0;
82  const int* srcPdg = 0;
83  if (flipw)
84  {
85  srcAdc = dataAlg.wireData(dataAlg.NWires() - w - 1).data();
86  srcDep = dataAlg.wireEdep(dataAlg.NWires() - w - 1).data();
87  srcPdg = dataAlg.wirePdg(dataAlg.NWires() - w - 1).data();
88  }
89  else
90  {
91  srcAdc = dataAlg.wireData(w).data();
92  srcDep = dataAlg.wireEdep(w).data();
93  srcPdg = dataAlg.wirePdg(w).data();
94  }
95  if (flipd)
96  {
97  for (size_t d = 0; d < drift_size; ++d) { dstAdc[gd + d] += srcAdc[drift_size - d - 1] - zero; }
98  if (fSaveDep) { for (size_t d = 0; d < drift_size; ++d) { dstDep[gd + d] += srcDep[drift_size - d - 1]; } }
99  for (size_t d = 0; d < drift_size; ++d)
100  {
101  int code = srcPdg[drift_size - d - 1];
102  int best_pdg = code & nnet::TrainingDataAlg::kPdgMask;
103  int vtx_flags = (dstPdg[gd + d] | code) & nnet::TrainingDataAlg::kVtxMask;
104  dstPdg[gd + d] = vtx_flags | best_pdg; // now just overwrite pdg and keep all vtx flags
105 
106  if (code & nnet::TrainingDataAlg::kNuPri) { fVtxX = gw + w; fVtxY = gd + d; } // dstAdc[gd + d] = 127; }
107  }
108  }
109  else
110  {
111  for (size_t d = 0; d < drift_size; ++d) { dstAdc[gd + d] += srcAdc[d] - zero; }
112  if (fSaveDep) { for (size_t d = 0; d < drift_size; ++d) { dstDep[gd + d] += srcDep[d]; } }
113  for (size_t d = 0; d < drift_size; ++d)
114  {
115  int code = srcPdg[d];
116  int best_pdg = code & nnet::TrainingDataAlg::kPdgMask;
117  int vtx_flags = (dstPdg[gd + d] | code) & nnet::TrainingDataAlg::kVtxMask;
118  dstPdg[gd + d] = vtx_flags | best_pdg; // now just overwrite pdg and keep all vtx flags
119 
120  if (code & nnet::TrainingDataAlg::kNuPri) { fVtxX = gw + w; fVtxY = gd + d; } // dstAdc[gd + d] = 127; }
121  }
122  }
123  }
124 }
125 
126 bool nnet::EventImageData::findCrop(size_t max_area_cut, unsigned int & w0, unsigned int & w1, unsigned int & d0, unsigned int & d1) const
127 {
128  size_t max_cut = max_area_cut / 4;
129  float adcThr = 10;
130 
131  w0 = 0;
132  size_t cut = 0;
133  while (w0 < fAdc.size())
134  {
135  for (auto const d : fAdc[w0]) { if (d > adcThr) cut++; }
136  if (cut < max_cut) w0++;
137  else break;
138  }
139  w1 = fAdc.size() - 1;
140  cut = 0;
141  while (w1 > w0)
142  {
143  for (auto const d : fAdc[w1]) { if (d > adcThr) cut++; }
144  if (cut < max_cut) w1--;
145  else break;
146  }
147  w1++;
148 
149  d0 = 0;
150  cut = 0;
151  while (d0 < fAdc.front().size())
152  {
153  for (size_t i = w0; i < w1; ++i) { if (fAdc[i][d0] > adcThr) cut++; }
154  if (cut < max_cut) d0++;
155  else break;
156  }
157  d1 = fAdc.front().size() - 1;
158  cut = 0;
159  while (d1 > d0)
160  {
161  for (size_t i = w0; i < w1; ++i) { if (fAdc[i][d1] > adcThr) cut++; }
162  if (cut < max_cut) d1--;
163  else break;
164  }
165  d1++;
166 
167  unsigned int margin = 32;
168  if ((w1 - w0 > 8) && (d1 - d0 > 8))
169  {
170  if (w0 < margin) w0 = 0;
171  else w0 -= margin;
172 
173  if (w1 > fAdc.size() - margin) w1 = fAdc.size();
174  else w1 += margin;
175 
176  if (d0 < margin) d0 = 0;
177  else d0 -= margin;
178 
179  if (d1 > fAdc.front().size() - margin) d1 = fAdc.front().size();
180  else d1 += margin;
181 
182  return true;
183  }
184  else return false;
185 }
186 
std::vector< std::vector< float > > fAdc
std::vector< float > const & wireEdep(size_t widx) const
Definition: PointIdAlg.h:298
unsigned int DriftWindow() const
bool findCrop(size_t max_area_cut, unsigned int &w0, unsigned int &w1, unsigned int &d0, unsigned int &d1) const
art framework interface to geometry description
std::vector< std::vector< float > > fDeposit
unsigned int NWires() const
std::vector< std::vector< int > > fPdg
EventImageData(size_t w, size_t d, bool saveDep)
CodeOutputInterface * code
Definition of data types for geometry description.
void setProjXY(const TrainingDataAlg &dataAlg, float x, float y, size_t gw, bool flipw, size_t gd, bool flipd)
Implementation of the Projection Matching Algorithm.
void addTpc(const TrainingDataAlg &dataAlg, size_t gw, bool flipw, size_t gd, bool flipd)
unsigned int NScaledDrifts() const
Access the description of detector geometry.
float ZeroLevel() const
Level of zero ADC after scaling.
list x
Definition: train.py:276
std::vector< int > const & wirePdg(size_t widx) const
Definition: PointIdAlg.h:303
std::vector< float > const & wireData(size_t widx) const