36 geo::Vector_t
ShowerPCAVector(
const detinfo::DetectorClocksData& clockData,
37 const detinfo::DetectorPropertiesData& detProp,
38 std::vector<art::Ptr<recob::SpacePoint>>& spacePoints_pfp,
39 const art::FindManyP<recob::Hit>& fmh,
40 geo::Point_t& ShowerCentre);
55 :
IShowerTool(pset.get<fhicl::ParameterSet>(
"BaseTools"))
56 , fPFParticleLabel(pset.get<
art::InputTag>(
"PFParticleLabel"))
57 , fHitModuleLabel(pset.get<
art::InputTag>(
"HitModuleLabel"))
58 , fVerbose(pset.get<int>(
"Verbose"))
59 , fChargeWeighted(pset.get<bool>(
"ChargeWeighted"))
60 , fMinPCAPoints(pset.get<unsigned int>(
"MinPCAPoints"))
61 , fShowerStartPositionInputLabel(pset.get<std::string>(
"ShowerStartPositionInputLabel"))
62 , fInitialTrackSpacePointsInputLabel(pset.get<std::string>(
"InitialTrackSpacePointsInputLabel"))
63 , fShowerDirectionOutputLabel(pset.get<std::string>(
"ShowerDirectionOutputLabel"))
73 mf::LogError(
"ShowerTrackPCA") <<
"Start Position not set. Stopping" << std::endl;
79 mf::LogError(
"ShowerTrackPCA") <<
"TrackSpacePoints not set, returning " << std::endl;
84 auto const spHandle = Event.getValidHandle<std::vector<recob::SpacePoint>>(
fPFParticleLabel);
86 const art::FindManyP<recob::Hit>& fmh =
89 std::vector<art::Ptr<recob::SpacePoint>> trackSpacePoints;
95 mf::LogError(
"ShowerTrackPCA") <<
"Not enough spacepoints for PCA, returning " << std::endl;
99 auto const clockData =
100 art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(Event);
102 art::ServiceHandle<detinfo::DetectorPropertiesService const>()->DataFor(Event, clockData);
105 geo::Point_t trackCentre;
106 auto Eigenvector =
ShowerPCAVector(clockData, detProp, trackSpacePoints, fmh, trackCentre);
109 geo::Point_t StartPositionVec = {-999, -999, -999};
111 auto const GeneralDir = (trackCentre - StartPositionVec).Unit();
114 double DotProduct = Eigenvector.Dot(GeneralDir);
117 if (DotProduct < 0) { Eigenvector *= -1.; }
119 geo::Vector_t EigenvectorErr = {-999, -999, -999};
127 const detinfo::DetectorClocksData& clockData,
128 const detinfo::DetectorPropertiesData& detProp,
129 std::vector<art::Ptr<recob::SpacePoint>>& sps,
130 const art::FindManyP<recob::Hit>& fmh,
131 geo::Point_t& ShowerCentre)
134 TPrincipal pca(3,
"");
136 float TotalCharge = 0;
143 for (
auto& sp : sps) {
148 auto const sp_position = sp->position() - ShowerCentre;
159 Charge *= std::exp((sampling_rate(clockData) * Time) / (detProp.ElectronLifetime() * 1e3));
162 wht *= std::sqrt(Charge / TotalCharge);
166 sp_coord[0] = sp_position.X() * wht;
167 sp_coord[1] = sp_position.Y() * wht;
168 sp_coord[2] = sp_position.Z() * wht;
171 pca.AddRow(sp_coord);
175 pca.MakePrincipals();
178 const TMatrixD* Eigenvectors = pca.GetEigenVectors();
180 return {(*Eigenvectors)[0][0], (*Eigenvectors)[1][0], (*Eigenvectors)[2][0]};