LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
RFFHitFinderAlg.cxx
Go to the documentation of this file.
1 
13 #include "fhiclcpp/ParameterSet.h"
16 
17 #include "RFFHitFinderAlg.h"
18 
19 #include <numeric>
20 
22 {
23  fMatchThresholdVec = p.get<std::vector<float>>("MeanMatchThreshold");
24  fMergeMultiplicityVec = p.get<std::vector<unsigned int>>("MinMergeMultiplicity");
25  fAmpThresholdVec = p.get<std::vector<float>>("AmplitudeThreshold", std::vector<float>(1, 0.0));
26 }
27 
28 void hit::RFFHitFinderAlg::SetFitterParamsVectors(unsigned int const n_planes)
29 {
30  //If size zero, throw. If size one, assume same for all planes.
31  //If size > 1 but < n_planes, throw. If size = n_plane, good.
32 
33  if (fMatchThresholdVec.size() == 0 || fMergeMultiplicityVec.size() == 0 ||
34  fAmpThresholdVec.size() == 0)
35  throw std::runtime_error("Error in RFFHitFinderAlg: Configured with zero planes.");
36 
37  if ((fMatchThresholdVec.size() > 1 && fMatchThresholdVec.size() < n_planes) ||
38  (fMergeMultiplicityVec.size() > 1 && fMergeMultiplicityVec.size() < n_planes) ||
39  (fAmpThresholdVec.size() > 1 && fAmpThresholdVec.size() < n_planes))
40  throw std::runtime_error("Error in RFFHitFinderAlg: Configured with incorrect n_planes.");
41 
42  if (fMatchThresholdVec.size() == 1) fMatchThresholdVec.resize(n_planes, fMatchThresholdVec[0]);
43 
44  if (fMergeMultiplicityVec.size() == 1)
45  fMergeMultiplicityVec.resize(n_planes, fMergeMultiplicityVec[0]);
46 
47  if (fAmpThresholdVec.size() == 1) fAmpThresholdVec.resize(n_planes, fAmpThresholdVec[0]);
48 }
49 
51 {
53 }
54 
55 void hit::RFFHitFinderAlg::Run(std::vector<recob::Wire> const& wireVector,
56  std::vector<recob::Hit>& hitVector,
57  geo::WireReadoutGeom const& wireReadoutGeom)
58 {
59  hitVector.reserve(wireVector.size());
60  for (auto const& wire : wireVector) {
61  geo::SigType_t const& sigtype = wireReadoutGeom.SignalType(wire.Channel());
62  geo::WireID const wireID = wireReadoutGeom.ChannelToWire(wire.Channel()).at(0);
63 
64  SetFitterParams(wire.View());
65 
66  for (auto const& roi : wire.SignalROI().get_ranges()) {
67  fFitter.RunFitter(roi.data());
68 
69  const float summedADCTotal = std::accumulate(roi.data().begin(), roi.data().end(), 0.0);
70  const raw::TDCtick_t startTick = roi.begin_index();
71  const raw::TDCtick_t endTick = roi.begin_index() + roi.size();
72 
73  EmplaceHit(hitVector, wire, summedADCTotal, startTick, endTick, sigtype, wireID);
74  } //end loop over ROIs on wire
75 
76  } //end loop over wires
77 }
78 
79 void hit::RFFHitFinderAlg::EmplaceHit(std::vector<recob::Hit>& hitVector,
80  recob::Wire const& wire,
81  float const& summedADCTotal,
82  raw::TDCtick_t const& startTick,
83  raw::TDCtick_t const& endTick,
84  geo::SigType_t const& sigtype,
85  geo::WireID const& wireID)
86 {
87 
88  float totalArea = 0.0;
89  std::vector<float> areaVector(fFitter.NHits());
90  std::vector<float> areaErrorVector(fFitter.NHits());
91  std::vector<float> areaFracVector(fFitter.NHits());
92 
93  for (size_t ihit = 0; ihit < fFitter.NHits(); ihit++) {
94  areaVector[ihit] = fFitter.AmplitudeVector()[ihit] * fFitter.SigmaVector()[ihit] * SQRT_TWO_PI;
95  areaErrorVector[ihit] =
96  SQRT_TWO_PI * std::sqrt(fFitter.AmplitudeVector()[ihit] * fFitter.SigmaErrorVector()[ihit] *
100  totalArea += areaVector[ihit];
101  }
102 
103  for (size_t ihit = 0; ihit < fFitter.NHits(); ihit++) {
104  areaFracVector[ihit] = areaVector[ihit] / totalArea;
105 
106  hitVector.emplace_back(wire.Channel(),
107  startTick,
108  endTick,
109  fFitter.MeanVector()[ihit] + (float)startTick,
110  fFitter.MeanErrorVector()[ihit],
111  fFitter.SigmaVector()[ihit],
112  fFitter.AmplitudeVector()[ihit],
114  summedADCTotal * areaFracVector[ihit],
115  summedADCTotal * areaFracVector[ihit], //NOT CORRECTLY FILLED
116  areaVector[ihit],
117  areaErrorVector[ihit],
118  fFitter.NHits(),
119  ihit,
120  -999.,
121  -999,
122  wire.View(),
123  sigtype,
124  wireID);
125  }
126 }
void EmplaceHit(std::vector< recob::Hit > &, recob::Wire const &, float const &, raw::TDCtick_t const &, raw::TDCtick_t const &, geo::SigType_t const &, geo::WireID const &)
const std::vector< float > & AmplitudeVector()
Definition: RFFHitFitter.h:48
void RunFitter(const std::vector< float > &signal)
const std::vector< float > & MeanVector()
Definition: RFFHitFitter.h:44
void SetFitterParams(float, unsigned int, float)
const std::vector< float > & SigmaVector()
Definition: RFFHitFitter.h:45
SigType_t SignalType(PlaneID const &pid) const
Returns the type of signal on the channels of specified TPC plane.
int TDCtick_t
Type representing a TDC tick.
Definition: RawTypes.h:25
geo::View_t View() const
Returns the view the channel belongs to.
Definition: Wire.h:219
raw::ChannelID_t Channel() const
Returns the ID of the channel (or InvalidChannelID)
Definition: Wire.h:223
void SetFitterParamsVectors(unsigned int num_planes)
enum geo::_plane_sigtype SigType_t
Enumerate the possible plane projections.
Interface for a class providing readout channel mapping to geometry.
std::vector< float > fAmpThresholdVec
std::vector< float > fMatchThresholdVec
T get(std::string const &key) const
Definition: ParameterSet.h:314
const std::vector< float > & MeanErrorVector()
Definition: RFFHitFitter.h:46
RFFHitFinderAlg(fhicl::ParameterSet const &)
virtual std::vector< WireID > ChannelToWire(raw::ChannelID_t channel) const =0
std::vector< unsigned int > fMergeMultiplicityVec
void SetFitterParams(unsigned int)
Class holding the regions of interest of signal from a channel.
Definition: Wire.h:116
unsigned int NHits()
Definition: RFFHitFitter.h:50
void Run(std::vector< recob::Wire > const &, std::vector< recob::Hit > &, geo::WireReadoutGeom const &)
const std::vector< float > & AmplitudeErrorVector()
Definition: RFFHitFitter.h:49
Interface to geometry for wire readouts .
const std::vector< float > & SigmaErrorVector()
Definition: RFFHitFitter.h:47