LArSoft  v10_04_05
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 
101  //initialize some variables that will be in the loop.
102  float threshold_peak = 0;
103  float threshold_tail = -99;
104  int width = 3;
105 
106  //Loop over wires
107  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout const>()->Get();
108  for (unsigned int wireIter = 0; wireIter < wireVec.size(); wireIter++) {
109 
110  //get our wire
111  art::Ptr<recob::Wire> wire(wireVecHandle, wireIter);
112  art::Ptr<raw::RawDigit> const& rawdigits = WireToRawDigits.at(wireIter);
113 
114  std::vector<float> signal(wire->Signal());
115  std::vector<float>::iterator timeIter; // iterator for time bins
116  geo::WireID wire_id =
117  wireReadoutGeom.ChannelToWire(wire->Channel()).at(0); //just grabbing the first one
118 
119  //set the thresholds and widths based on wire type
120  geo::SigType_t sigType = wireReadoutGeom.SignalType(wire->Channel());
121  if (sigType == geo::kInduction) {
122  threshold_peak = fMinSigPeakInd;
123  threshold_tail = fMinSigTailInd;
124  width = fIndWidth;
125  }
126  else if (sigType == geo::kCollection) {
127  threshold_peak = fMinSigPeakCol;
128  threshold_tail = fMinSigTailCol;
129  width = fColWidth;
130  }
131 
132  //make a half_width variable to be the search window around each time tick.
133  float half_width = ((float)width - 1) / 2.;
134 
135  //now do the loop over the time ticks on the wire
136  int time_bin = -1;
137  float peak_val = 0;
138  for (timeIter = signal.begin(); timeIter < signal.end(); timeIter++) {
139  time_bin++;
140 
141  //set the peak value, taking average between ticks if desired total width is even
142  if (width % 2 == 1)
143  peak_val = *timeIter;
144  else if (width % 2 == 0)
145  peak_val = 0.5 * (*timeIter + *(timeIter + 1));
146 
147  //continue immediately if we are not above the threshold
148  if (peak_val < threshold_peak) continue;
149 
150  //continue if we are too close to the edge
151  if (time_bin - half_width < 0) continue;
152  if (time_bin + half_width > signal.size()) continue;
153 
154  //if necessary, do loop over hit width, and check tail thresholds
155  int begin_tail_tick = std::floor(time_bin - half_width);
156  float totalCharge = getTotalCharge(&signal[begin_tail_tick], width, threshold_tail);
157  if (totalCharge == -999) {
158  MF_LOG_DEBUG("TTHitFinder")
159  << "Rejecting would be hit at (plane,wire,time_bin,first_bin,last_bin)=("
160  << wire_id.Plane << "," << wire_id.Wire << "," << time_bin << "," << begin_tail_tick
161  << "," << begin_tail_tick + width - 1 << "): " << signal.at(time_bin - 1) << " "
162  << signal.at(time_bin) << " " << signal.at(time_bin + 1);
163  continue;
164  }
165 
166  //OK, if we've passed all tests up to this point, we have a hit!
167 
168  float hit_time = time_bin;
169  if (width % 2 == 0) hit_time = time_bin + 0.5;
170 
171  // hit time region is 2 widths (4 RMS) wide
172  const raw::TDCtick_t start_tick = hit_time - width, end_tick = hit_time + width;
173 
174  // make the hit
175  recob::HitCreator hit(*wire, // wire
176  wire_id, // wireID
177  start_tick, // start_tick
178  end_tick, // end_tick
179  width / 2., // rms
180  hit_time, // peak_time
181  0., // sigma_peak_time
182  peak_val, // peak_amplitude
183  0., // sigma_peak_amplitude
184  totalCharge, // hit_integral
185  0., // hit_sigma_integral
186  totalCharge, // summedADC
187  1, // multiplicity (dummy value)
188  0, // local_index (dummy value)
189  1., // goodness_of_fit (dummy value)
190  0 // dof
191  );
192  if (wire_id.Plane == 0)
193  hitCollection_U.emplace_back(hit.move(), wire, rawdigits);
194  else if (wire_id.Plane == 1)
195  hitCollection_V.emplace_back(hit.move(), wire, rawdigits);
196  else if (wire_id.Plane == 2)
197  hitCollection_Y.emplace_back(hit.move(), wire, rawdigits);
198 
199  } //End loop over time ticks on wire
200 
201  MF_LOG_DEBUG("TTHitFinder") << "Finished wire " << wire_id.Wire << " (plane " << wire_id.Plane
202  << ")"
203  << "\tTotal hits (U,V,Y)= (" << hitCollection_U.size() << ","
204  << hitCollection_V.size() << "," << hitCollection_Y.size() << ")";
205 
206  } //End loop over all wires
207 
208  // put the hit collection and associations into the event
209  mf::LogInfo("TTHitFinder") << "Total TTHitFinder hits (U,V,Y)=(" << hitCollection_U.size()
210  << "," << hitCollection_V.size() << "," << hitCollection_Y.size()
211  << ")";
212  hitCollection_U.put_into(evt); // reminder: instance name was "uhits"
213  hitCollection_V.put_into(evt); // reminder: instance name was "vhits"
214  hitCollection_Y.put_into(evt); // reminder: instance name was "yhits"
215 
216  } // End of produce()
217 
218  //-------------------------------------------------
219  float TTHitFinder::getTotalCharge(const float* signal_vector,
220  int width = 3,
221  float threshold = -99)
222  {
223 
224  float totalCharge = 0;
225  for (int tick = 0; tick < width; tick++) {
226  if (signal_vector[tick] < threshold) {
227  totalCharge = -999; //special value for being below threshold
228  break;
229  }
230  totalCharge += signal_vector[tick];
231  }
232  return totalCharge;
233 
234  } //end getTotalCharge method
235 
237 
238 } // 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.
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.
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
Definition: AddMC.C:8
WireID_t Wire
Index of the wire within its plane.
Definition: geo_types.h:430
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:261
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:489
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
Signal from induction planes.
Definition: geo_types.h:147
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:299
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:373
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:622
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:605
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:338
Definition: fwd.h:26
float getTotalCharge(const float *, int, float)
Collection wire hit width (in time ticks)
Signal from collection planes.
Definition: geo_types.h:148