75 const art::Handle<std::vector<recob::PFParticle>>& pfpHandle,
76 const art::Handle<std::vector<recob::Track>>& trackHandle,
85 ,
fSCE(lar::providerFrom<spacecharge::SpaceChargeService>())
89 ,
fPFPLabel(p.get<std::string>(
"PFPLabel"))
91 ,
fT0Labels(p.get<std::vector<std::string>>(
"T0Labels"))
94 produces<std::vector<anab::T0>>();
95 produces<std::vector<recob::Slice>>();
96 produces<std::vector<recob::PFParticle>>();
97 produces<std::vector<recob::SpacePoint>>();
98 produces<std::vector<recob::Cluster>>();
99 produces<std::vector<recob::Vertex>>();
100 produces<std::vector<larpandoraobj::PFParticleMetadata>>();
102 produces<art::Assns<anab::T0, recob::PFParticle>>();
103 produces<art::Assns<recob::Slice, recob::Hit>>();
105 produces<art::Assns<recob::PFParticle, recob::Slice>>();
106 produces<art::Assns<recob::PFParticle, recob::SpacePoint>>();
107 produces<art::Assns<recob::PFParticle, recob::Vertex>>();
108 produces<art::Assns<recob::PFParticle, recob::Cluster>>();
109 produces<art::Assns<recob::PFParticle, larpandoraobj::PFParticleMetadata>>();
110 produces<art::Assns<recob::SpacePoint, recob::Hit>>();
111 produces<art::Assns<recob::Cluster, recob::Hit>>();
117 auto t0Collection = std::make_unique<std::vector<anab::T0>>();
118 auto pfpCollection = std::make_unique<std::vector<recob::PFParticle>>();
119 auto clusterCollection = std::make_unique<std::vector<recob::Cluster>>();
120 auto spCollection = std::make_unique<std::vector<recob::SpacePoint>>();
121 auto vtxCollection = std::make_unique<std::vector<recob::Vertex>>();
122 auto sliceCollection = std::make_unique<std::vector<recob::Slice>>();
123 auto pfpMetaCollection = std::make_unique<std::vector<larpandoraobj::PFParticleMetadata>>();
125 auto t0PFPAssn = std::make_unique<art::Assns<anab::T0, recob::PFParticle>>();
126 auto sliceHitAssn = std::make_unique<art::Assns<recob::Slice, recob::Hit>>();
127 auto pfpSliceAssn = std::make_unique<art::Assns<recob::PFParticle, recob::Slice>>();
128 auto pfpVtxAssn = std::make_unique<art::Assns<recob::PFParticle, recob::Vertex>>();
129 auto pfpSPAssn = std::make_unique<art::Assns<recob::PFParticle, recob::SpacePoint>>();
130 auto pfpClusterAssn = std::make_unique<art::Assns<recob::PFParticle, recob::Cluster>>();
132 std::make_unique<art::Assns<recob::PFParticle, larpandoraobj::PFParticleMetadata>>();
133 auto spHitAssn = std::make_unique<art::Assns<recob::SpacePoint, recob::Hit>>();
134 auto clusterHitAssn = std::make_unique<art::Assns<recob::Cluster, recob::Hit>>();
146 std::vector<art::Ptr<recob::Slice>> allSlices;
151 std::vector<art::Ptr<recob::Cluster>> allClusters;
156 std::vector<art::Ptr<recob::SpacePoint>> allSpacePoints;
161 std::vector<art::Ptr<recob::PFParticle>> allPFParticles;
166 std::vector<art::Ptr<recob::Track>> allTracks;
181 if (!fmSlicePFP.isValid()) {
182 throw cet::exception(
"SCECorrection") <<
"FindMany Slice-PFP is not Valid" << std::endl;
184 if (!fmPFPSP.isValid()) {
185 throw cet::exception(
"SCECorrection") <<
"FindMany PFP-SpacePoint is not Valid" << std::endl;
187 if (!fmSPHit.isValid()) {
188 throw cet::exception(
"SCECorrection") <<
"FindMany SpacePoint-Hit is not Valid" << std::endl;
196 for (
auto const& slice : allSlices) {
200 sliceCollection->push_back(newSlice);
204 const std::vector<art::Ptr<recob::PFParticle>> slicePFPs = fmSlicePFP.at(slice.key());
206 const std::map<art::Ptr<anab::T0>,
bool> sliceT0CorrectMap =
207 getSliceT0s(evt, slicePFPs, pfpHandle, trackHandle, fmPFPTrack);
209 const std::pair<art::Ptr<anab::T0>,
bool> sliceT0CorrectPair =
212 if (sliceT0CorrectPair.first.isNull() && !
fCorrectNoT0Tag) {
continue; }
216 if (!sliceT0CorrectPair.first.isNull()) {
218 t0Offset = detProp.DriftVelocity() * sliceT0CorrectPair.first->Time() / 1e3;
220 t0Collection->push_back(*sliceT0CorrectPair.first);
221 newT0Ptr = t0PtrMaker(t0Collection->size() - 1);
225 if (fmSliceHit.isValid()) {
226 const std::vector<art::Ptr<recob::Hit>> sliceHits = fmSliceHit.at(slice.key());
228 sliceHitAssn->addSingle(newSlicePtr, hitPtr);
233 for (
auto const& pfp : slicePFPs) {
237 pfpCollection->push_back(newPFP);
239 pfpSliceAssn->addSingle(newPFPPtr, newSlicePtr);
241 if (!newT0Ptr.
isNull()) { t0PFPAssn->addSingle(newT0Ptr, newPFPPtr); }
243 std::vector<art::Ptr<recob::SpacePoint>> pfpSPs = fmPFPSP.at(pfp.key());
245 if (fmPFPVertex.isValid()) {
246 std::vector<art::Ptr<recob::Vertex>> pfpVertices = fmPFPVertex.at(pfp.key());
247 for (
auto const& pfpVertex : pfpVertices) {
252 std::vector<art::Ptr<recob::SpacePoint>> vtxSPs = pfpSPs.size() ? pfpSPs : allSpacePoints;
254 double minVtxSPDist = std::numeric_limits<double>::max();
256 for (
auto const& sp : vtxSPs) {
257 geo::Point_t spPos(sp->XYZ()[0], sp->XYZ()[1], sp->XYZ()[2]);
259 if (vtxSPDiff.Mag2() < minVtxSPDist) {
261 minVtxSPDist = vtxSPDiff.Mag2();
265 if (spPtr.
isNull())
continue;
271 if (!sliceT0CorrectPair.first.isNull() && sliceT0CorrectPair.second) {
284 vtxPos, pfpVertex->covariance(), pfpVertex->chi2(), pfpVertex->ndof(), pfpVertex->ID());
285 vtxCollection->push_back(newVtx);
287 pfpVtxAssn->addSingle(newPFPPtr, newVtxPtr);
291 for (
auto const& sp : pfpSPs) {
294 geo::Point_t spPos(sp->XYZ()[0], sp->XYZ()[1], sp->XYZ()[2]);
300 geo::TPCID tpcId = spHitPtr->WireID().asTPCID();
302 if (!sliceT0CorrectPair.first.isNull() && sliceT0CorrectPair.second) {
314 Double32_t spXYZ[3] = {spPos.X(), spPos.Y(), spPos.Z()};
317 spCollection->push_back(correctedSP);
319 pfpSPAssn->addSingle(newPFPPtr, spPtr);
320 spHitAssn->addSingle(spPtr, spHitPtr);
324 if (fmPFPCluster.isValid() && fmClusterHit.isValid()) {
325 std::vector<art::Ptr<recob::Cluster>> pfpClusters = fmPFPCluster.at(pfp.key());
326 for (
auto const& pfpCluster : pfpClusters) {
328 clusterCollection->push_back(newCluster);
331 std::vector<art::Ptr<recob::Hit>> clusterHits = fmClusterHit.at(pfpCluster.key());
332 pfpClusterAssn->addSingle(newPFPPtr, newClusterPtr);
333 for (
auto const& clusterHit : clusterHits) {
334 clusterHitAssn->addSingle(newClusterPtr, clusterHit);
340 if (fmPFPMeta.isValid()) {
341 const std::vector<art::Ptr<larpandoraobj::PFParticleMetadata>> pfpMetas =
342 fmPFPMeta.at(pfp.key());
345 pfpMetaCollection->push_back(newPFPMeta);
347 pfpMetaPtrMaker(pfpMetaCollection->size() - 1);
348 pfpMetaAssn->addSingle(newPFPPtr, newPFPMetaPtr);
355 evt.
put(std::move(t0Collection));
356 evt.
put(std::move(sliceCollection));
357 evt.
put(std::move(clusterCollection));
358 evt.
put(std::move(pfpCollection));
359 evt.
put(std::move(spCollection));
360 evt.
put(std::move(vtxCollection));
361 evt.
put(std::move(pfpMetaCollection));
363 evt.
put(std::move(t0PFPAssn));
364 evt.
put(std::move(sliceHitAssn));
365 evt.
put(std::move(pfpSPAssn));
366 evt.
put(std::move(spHitAssn));
367 evt.
put(std::move(pfpVtxAssn));
368 evt.
put(std::move(pfpSliceAssn));
369 evt.
put(std::move(pfpClusterAssn));
370 evt.
put(std::move(clusterHitAssn));
371 evt.
put(std::move(pfpMetaAssn));
389 const art::Handle<std::vector<recob::PFParticle>>& pfpHandle,
390 const art::Handle<std::vector<recob::Track>>& trackHandle,
394 std::map<art::Ptr<anab::T0>,
bool> pfpT0CorrectMap;
396 for (
auto const& pfp : slicePFPs) {
400 for (
unsigned int i = 0; i <
fT0Labels.size(); i++) {
405 if (fmPFPT0.isValid()) {
406 std::vector<art::Ptr<anab::T0>> pfpT0s = fmPFPT0.at(pfp.key());
407 if (pfpT0s.size() == 1) {
413 if (!fmPFPTrack.isValid())
continue;
414 std::vector<art::Ptr<recob::Track>> pfpTracks = fmPFPTrack.at(pfp.key());
415 if (pfpTracks.size() != 1) {
continue; }
420 if (fmTrackT0.isValid()) {
421 std::vector<art::Ptr<anab::T0>> trackT0s = fmTrackT0.at(pfpTrack.
key());
422 if (trackT0s.size() == 1) {
429 return pfpT0CorrectMap;
436 if (!sliceT0CorrectMap.size()) {
return std::pair<art::Ptr<anab::T0>,
bool>(); }
438 double minT0 = std::numeric_limits<double>::max();
439 std::pair<art::Ptr<anab::T0>,
bool> sliceT0CorrectPair;
440 for (
auto const& sliceT0CorrectIter : sliceT0CorrectMap) {
441 double t0Time =
abs(sliceT0CorrectIter.first->Time());
442 if (t0Time < minT0) {
444 sliceT0CorrectPair = sliceT0CorrectIter;
447 return sliceT0CorrectPair;
code to link reconstructed objects back to the MC truth information
SCECorrection(fhicl::ParameterSet const &p)
Utilities related to art service access.
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space.
virtual geo::Vector_t GetCalPosOffsets(geo::Point_t const &point, int const &TPCid) const =0
Declaration of signal hit object.
geo::Vector_t applyT0Shift(const double &t0, const geo::TPCID &tpcId) const
EDProducer(fhicl::ParameterSet const &pset)
constexpr auto abs(T v)
Returns the absolute value of the argument.
Set of hits with a 2D structure.
geo::WireID const & WireID() const
Initial tdc tick for hit.
DriftAxis DriftAxisWithSign() const
Returns the expected drift direction based on geometry.
Definition of vertex object for LArSoft.
void produce(art::Event &evt) override
spacecharge::SpaceCharge const * fSCE
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
std::map< art::Ptr< anab::T0 >, bool > getSliceT0s(const art::Event &evt, const std::vector< art::Ptr< recob::PFParticle >> &slicePFPs, const art::Handle< std::vector< recob::PFParticle >> &pfpHandle, const art::Handle< std::vector< recob::Track >> &trackHandle, const art::FindManyP< recob::Track > &fmPFPTrack) const
#define DEFINE_ART_MODULE(klass)
Metadata associated to PFParticles.
const std::string fPFPLabel
const std::vector< bool > fT0LabelsCorrectT0
key_type key() const noexcept
bool isNull() const noexcept
constexpr int to_int(Coordinate const coord) noexcept
Enumerate the possible plane projections.
std::pair< art::Ptr< anab::T0 >, bool > getSliceBestT0(const std::map< art::Ptr< anab::T0 >, bool > &sliceT0CorrectMap) const
The data type to uniquely identify a TPC.
Declaration of cluster object.
const std::string fTrackLabel
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
virtual bool EnableCalSpatialSCE() const =0
Hierarchical representation of particle flow.
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Utility object to perform functions of association.
Provides recob::Track data product.
art::ServiceHandle< geo::Geometry > fGeom
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
TPCID_t TPC
Index of the TPC within its cryostat.
TPCGeo const & TPC(TPCID const &tpcid=details::tpc_zero) const
Returns the specified TPC.
const bool fCorrectNoT0Tag
art framework interface to geometry description
const std::vector< std::string > fT0Labels
cet::coded_exception< error, detail::translate > exception
SCECorrection & operator=(SCECorrection const &)=delete
constexpr TPCID const & asTPCID() const
Conversion to PlaneID (for convenience of notation).