64 const fhicl::ParameterSet& pset)
65 :
IShowerTool(pset.get<fhicl::ParameterSet>(
"BaseTools"))
66 , fNfitpass(pset.get<unsigned int>(
"Nfitpass"))
67 , fNfithits(pset.get<std::vector<unsigned int>>(
"Nfithits"))
68 , fToler(pset.get<std::vector<double>>(
"Toler"))
69 , fApplyChargeWeight(pset.get<bool>(
"ApplyChargeWeight"))
70 , fPFParticleLabel(pset.get<
art::InputTag>(
"PFParticleLabel"))
71 , fVerbose(pset.get<int>(
"Verbose"))
72 , fHitLabel(pset.get<
art::InputTag>(
"HitsModuleLabel"))
73 , fShowerStartPositionInputLabel(pset.get<std::string>(
"ShowerStartPositionInputLabel"))
74 , fShowerDirectionInputLabel(pset.get<std::string>(
"ShowerDirectionInputLabel"))
75 , fInitialTrackHitsOutputLabel(pset.get<std::string>(
"InitialTrackHitsOutputLabel"))
76 , fInitialTrackSpacePointsOutputLabel(
77 pset.get<std::string>(
"InitialTrackSpacePointsOutputLabel"))
80 throw art::Exception(art::errors::Configuration)
81 <<
"Shower2DLinearRegressionTrackHitFinderEMShower: fNfithits and fToler need to have size "
87 const art::Ptr<recob::PFParticle>& pfparticle,
95 mf::LogError(
"Shower2DLinearRegressionTrackHitFinder")
96 <<
"Start position not set, returning " << std::endl;
101 mf::LogError(
"Shower2DLinearRegressionTrackHitFinder")
102 <<
"Direction not set, returning " << std::endl;
106 geo::Point_t ShowerStartPosition{-999, -999, -999};
109 geo::Vector_t ShowerDirection = {-999, -999, -999};
113 auto const pfpHandle = Event.getValidHandle<std::vector<recob::PFParticle>>(
fPFParticleLabel);
116 auto const clusHandle = Event.getValidHandle<std::vector<recob::Cluster>>(
fPFParticleLabel);
118 const art::FindManyP<recob::Cluster>& fmc =
120 std::vector<art::Ptr<recob::Cluster>> clusters = fmc.at(pfparticle.key());
122 if (clusters.size() < 2) {
124 mf::LogError(
"Shower2DLinearRegressionTrackHitFinder")
125 <<
"Not enough clusters: " << clusters.size() << std::endl;
130 const art::FindManyP<recob::Hit>& fmhc =
132 std::map<geo::PlaneID, std::vector<art::Ptr<recob::Hit>>> plane_clusters;
134 for (
auto const&
cluster : clusters) {
137 std::vector<art::Ptr<recob::Hit>> hits = fmhc.at(
cluster.key());
139 for (
auto hit : hits) {
140 geo::WireID wire = hit->WireID();
141 geo::PlaneID plane = wire.asPlaneID();
142 plane_clusters[plane].push_back(hit);
150 auto const clockData =
151 art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(Event);
153 art::ServiceHandle<detinfo::DetectorPropertiesService const>()->DataFor(Event, clockData);
155 std::vector<art::Ptr<recob::Hit>> InitialTrackHits;
157 for (
auto const&
cluster : plane_clusters) {
160 std::vector<art::Ptr<recob::Hit>> hits =
cluster.second;
164 detProp, hits, ShowerStartPosition, ShowerDirection);
169 InitialTrackHits.insert(InitialTrackHits.end(), trackhits.begin(), trackhits.end());
177 auto const hitHandle = Event.getValidHandle<std::vector<recob::Hit>>(
fHitLabel);
180 const art::FindManyP<recob::SpacePoint>& fmsp =
184 std::vector<art::Ptr<recob::SpacePoint>> intitaltrack_sp;
185 for (
auto const& hit : InitialTrackHits) {
186 std::vector<art::Ptr<recob::SpacePoint>> sps = fmsp.at(hit.key());
187 for (
auto const sp : sps) {
188 intitaltrack_sp.push_back(sp);
197 const detinfo::DetectorPropertiesData& detProp,
198 std::vector<art::Ptr<recob::Hit>>& hits)
201 std::vector<art::Ptr<recob::Hit>> trackHits;
205 std::vector<double> wfit;
206 std::vector<double> tfit;
207 std::vector<double> cfit;
212 unsigned int nhits = 0;
213 for (
auto& hit : hits) {
220 (std::abs((coord.Y() - (parm[0] + coord.X() * parm[1])) *
221 std::cos(std::atan(parm[1]))) <
fToler[i - 1]) ||
225 wfit.push_back(coord.X());
226 tfit.push_back(coord.Y());
232 if (i ==
fNfitpass - 1) { trackHits.push_back(hit); }
237 fitok =
WeightedFit(wfit.size(), &wfit[0], &tfit[0], &cfit[0], &parm[0]);
267 for (Int_t i = 0; i < n; i++) {
269 sumx2 += x[i] * x[i] * w[i];
271 sumxy += x[i] * y[i] * w[i];
275 if (sumx2 * sumw - sumx * sumx == 0.)
return 1;
276 if (sumx2 - sumx * sumx / sumw == 0.)
return 1;
278 parm[0] = (sumy * sumx2 - sumx * sumxy) / (sumx2 * sumw - sumx * sumx);
279 parm[1] = (sumxy - sumx * sumy / sumw) / (sumx2 - sumx * sumx / sumw);
281 eparm[0] = sumx2 * (sumx2 * sumw - sumx * sumx);
282 eparm[1] = (sumx2 - sumx * sumx / sumw);
284 if (eparm[0] < 0. || eparm[1] < 0.)
return 1;
286 eparm[0] = sqrt(eparm[0]) / (sumx2 * sumw - sumx * sumx);
287 eparm[1] = sqrt(eparm[1]) / (sumx2 - sumx * sumx / sumw);