LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
TTHitFinder_module.cc
Go to the documentation of this file.
1 
13 #include <math.h>
14 #include <string>
15 
16 // Framework includes
23 
24 // LArSoft Includes
30 
31 namespace hit {
32 
33  class TTHitFinder : public art::EDProducer {
34 
35  public:
36  explicit TTHitFinder(fhicl::ParameterSet const& pset);
37 
38  private:
39  void produce(art::Event& evt) override;
40 
41  std::string fCalDataModuleLabel;
46  int fIndWidth;
47  int fColWidth;
48 
49  float getTotalCharge(const float*, int, float);
50 
51  }; // class TTHitFinder
52 
53  //-------------------------------------------------
55  {
56  fCalDataModuleLabel = pset.get<std::string>("CalDataModuleLabel");
57  fMinSigPeakInd = pset.get<float>("MinSigPeakInd");
58  fMinSigPeakCol = pset.get<float>("MinSigPeakCol");
59  fMinSigTailInd = pset.get<float>("MinSigTailInd", -99); //defaulting to well-below zero
60  fMinSigTailCol = pset.get<float>("MinSigTailCol", -99); //defaulting to well-below zero
61  fIndWidth = pset.get<int>("IndWidth", 3); //defaulting to 3
62  fColWidth = pset.get<int>("ColWidth", 3); //defaulting to 3
63 
64  //enforce a minimum width
65  if (fIndWidth < 1) {
66  mf::LogWarning("TTHitFinder")
67  << "IndWidth must be 1 at minimum. Resetting width to one time tick";
68  fIndWidth = 1;
69  }
70  if (fColWidth < 1) {
71  mf::LogWarning("TTHitFinder")
72  << "ColWidth must be 1 at minimum. Resetting width to one time tick";
73  fColWidth = 1;
74  }
75 
76  // let HitCollectionCreator declare that we are going to produce
77  // hits and associations with wires and raw digits
81  }
82 
83  //-------------------------------------------------
85  {
86 
87  // these objects contain the hit collections
88  // and their associations to wires and raw digits:
89  recob::HitCollectionCreator hitCollection_U(evt, "uhits");
90  recob::HitCollectionCreator hitCollection_V(evt, "vhits");
91  recob::HitCollectionCreator hitCollection_Y(evt, "yhits");
92 
93  // Read in the wire List object(s).
95  evt.getByLabel(fCalDataModuleLabel, wireVecHandle);
96  std::vector<recob::Wire> const& wireVec(*wireVecHandle);
97 
98  // also get the raw digits associated with wires
99  art::FindOneP<raw::RawDigit> WireToRawDigits(wireVecHandle, evt, fCalDataModuleLabel);
100 
102 
103  //initialize some variables that will be in the loop.
104  float threshold_peak = 0;
105  float threshold_tail = -99;
106  int width = 3;
107 
108  //Loop over wires
109  for (unsigned int wireIter = 0; wireIter < wireVec.size(); wireIter++) {
110 
111  //get our wire
112  art::Ptr<recob::Wire> wire(wireVecHandle, wireIter);
113  art::Ptr<raw::RawDigit> const& rawdigits = WireToRawDigits.at(wireIter);
114 
115  std::vector<float> signal(wire->Signal());
116  std::vector<float>::iterator timeIter; // iterator for time bins
117  geo::WireID wire_id =
118  (geom->ChannelToWire(wire->Channel())).at(0); //just grabbing the first one
119 
120  //set the thresholds and widths based on wire type
121  geo::SigType_t sigType = geom->SignalType(wire->Channel());
122  if (sigType == geo::kInduction) {
123  threshold_peak = fMinSigPeakInd;
124  threshold_tail = fMinSigTailInd;
125  width = fIndWidth;
126  }
127  else if (sigType == geo::kCollection) {
128  threshold_peak = fMinSigPeakCol;
129  threshold_tail = fMinSigTailCol;
130  width = fColWidth;
131  }
132 
133  //make a half_width variable to be the search window around each time tick.
134  float half_width = ((float)width - 1) / 2.;
135 
136  //now do the loop over the time ticks on the wire
137  int time_bin = -1;
138  float peak_val = 0;
139  for (timeIter = signal.begin(); timeIter < signal.end(); timeIter++) {
140  time_bin++;
141 
142  //set the peak value, taking average between ticks if desired total width is even
143  if (width % 2 == 1)
144  peak_val = *timeIter;
145  else if (width % 2 == 0)
146  peak_val = 0.5 * (*timeIter + *(timeIter + 1));
147 
148  //continue immediately if we are not above the threshold
149  if (peak_val < threshold_peak) continue;
150 
151  //continue if we are too close to the edge
152  if (time_bin - half_width < 0) continue;
153  if (time_bin + half_width > signal.size()) continue;
154 
155  //if necessary, do loop over hit width, and check tail thresholds
156  int begin_tail_tick = std::floor(time_bin - half_width);
157  float totalCharge = getTotalCharge(&signal[begin_tail_tick], width, threshold_tail);
158  if (totalCharge == -999) {
159  MF_LOG_DEBUG("TTHitFinder")
160  << "Rejecting would be hit at (plane,wire,time_bin,first_bin,last_bin)=("
161  << wire_id.Plane << "," << wire_id.Wire << "," << time_bin << "," << begin_tail_tick
162  << "," << begin_tail_tick + width - 1 << "): " << signal.at(time_bin - 1) << " "
163  << signal.at(time_bin) << " " << signal.at(time_bin + 1);
164  continue;
165  }
166 
167  //OK, if we've passed all tests up to this point, we have a hit!
168 
169  float hit_time = time_bin;
170  if (width % 2 == 0) hit_time = time_bin + 0.5;
171 
172  // hit time region is 2 widths (4 RMS) wide
173  const raw::TDCtick_t start_tick = hit_time - width, end_tick = hit_time + width;
174 
175  // make the hit
176  recob::HitCreator hit(*wire, // wire
177  wire_id, // wireID
178  start_tick, // start_tick
179  end_tick, // end_tick
180  width / 2., // rms
181  hit_time, // peak_time
182  0., // sigma_peak_time
183  peak_val, // peak_amplitude
184  0., // sigma_peak_amplitude
185  totalCharge, // hit_integral
186  0., // hit_sigma_integral
187  totalCharge, // summedADC
188  1, // multiplicity (dummy value)
189  0, // local_index (dummy value)
190  1., // goodness_of_fit (dummy value)
191  0 // dof
192  );
193  if (wire_id.Plane == 0)
194  hitCollection_U.emplace_back(hit.move(), wire, rawdigits);
195  else if (wire_id.Plane == 1)
196  hitCollection_V.emplace_back(hit.move(), wire, rawdigits);
197  else if (wire_id.Plane == 2)
198  hitCollection_Y.emplace_back(hit.move(), wire, rawdigits);
199 
200  } //End loop over time ticks on wire
201 
202  MF_LOG_DEBUG("TTHitFinder") << "Finished wire " << wire_id.Wire << " (plane " << wire_id.Plane
203  << ")"
204  << "\tTotal hits (U,V,Y)= (" << hitCollection_U.size() << ","
205  << hitCollection_V.size() << "," << hitCollection_Y.size() << ")";
206 
207  } //End loop over all wires
208 
209  // put the hit collection and associations into the event
210  mf::LogInfo("TTHitFinder") << "Total TTHitFinder hits (U,V,Y)=(" << hitCollection_U.size()
211  << "," << hitCollection_V.size() << "," << hitCollection_Y.size()
212  << ")";
213  hitCollection_U.put_into(evt); // reminder: instance name was "uhits"
214  hitCollection_V.put_into(evt); // reminder: instance name was "vhits"
215  hitCollection_Y.put_into(evt); // reminder: instance name was "yhits"
216 
217  } // End of produce()
218 
219  //-------------------------------------------------
220  float TTHitFinder::getTotalCharge(const float* signal_vector,
221  int width = 3,
222  float threshold = -99)
223  {
224 
225  float totalCharge = 0;
226  for (int tick = 0; tick < width; tick++) {
227  if (signal_vector[tick] < threshold) {
228  totalCharge = -999; //special value for being below threshold
229  break;
230  }
231  totalCharge += signal_vector[tick];
232  }
233  return totalCharge;
234 
235  } //end getTotalCharge method
236 
238 
239 } // end of hit namespace
intermediate_table::iterator iterator
int fColWidth
Induction wire hit width (in time ticks)
float fMinSigTailInd
Collection wire signal height threshold at peak.
std::vector< WireID > ChannelToWire(raw::ChannelID_t const channel) const
Returns a list of wires connected to the specified TPC channel.
float fMinSigPeakCol
Induction wire signal height threshold at peak.
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
EDProducer(fhicl::ParameterSet const &pset)
Definition: EDProducer.cc:6
Definition of basic raw digits.
WireID_t Wire
Index of the wire within its plane.
Definition: geo_types.h:563
static void declare_products(art::ProducesCollector &collector, std::string instance_name="", bool doWireAssns=true, bool doRawDigitAssns=true)
Declares the hit products we are going to fill.
Definition: HitCreator.cxx:248
int TDCtick_t
Type representing a TDC tick.
Definition: RawTypes.h:25
Class managing the creation of a new recob::Hit object.
Definition: HitCreator.h:87
Helper functions to create a hit.
A class handling a collection of hits and its associations.
Definition: HitCreator.h:481
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
Signal from induction planes.
Definition: geo_types.h:151
raw::ChannelID_t Channel() const
Returns the ID of the channel (or InvalidChannelID)
Definition: Wire.h:223
enum geo::_plane_sigtype SigType_t
Enumerate the possible plane projections.
tick_as<> tick
Tick number, represented by std::ptrdiff_t.
Definition: electronics.h:73
void emplace_back(recob::Hit &&hit, art::Ptr< recob::Wire > const &wire=art::Ptr< recob::Wire >(), art::Ptr< raw::RawDigit > const &digits=art::Ptr< raw::RawDigit >())
Adds the specified hit to the data collection.
Definition: HitCreator.cxx:286
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:481
float fMinSigTailCol
Induction wire signal height threshold outside peak.
Definition of data types for geometry description.
void put_into(art::Event &)
Moves the data into an event.
Definition: HitCreator.h:614
Detector simulation of raw signals on wires.
std::vector< float > Signal() const
Return a zero-padded full length vector filled with RoI signal.
Definition: Wire.cxx:30
ProducesCollector & producesCollector() noexcept
std::string fCalDataModuleLabel
size_t size() const
Returns the number of hits currently in the collection.
Definition: HitCreator.h:597
SigType_t SignalType(PlaneID const &pid) const
Returns the type of signal on the channels of specified TPC plane.
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
float fMinSigPeakInd
Input caldata module name.
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
#define MF_LOG_DEBUG(id)
Declaration of basic channel signal object.
void produce(art::Event &evt) override
int fIndWidth
Collection wire signal height threshold outside peak.
TCEvent evt
Definition: DataStructs.cxx:8
TTHitFinder(fhicl::ParameterSet const &pset)
recob::Hit && move()
Prepares the constructed hit to be moved away.
Definition: HitCreator.h:330
Definition: fwd.h:26
art framework interface to geometry description
float getTotalCharge(const float *, int, float)
Collection wire hit width (in time ticks)
Signal from collection planes.
Definition: geo_types.h:152