LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
PhotonBackTracker.tcc
Go to the documentation of this file.
1 #include "art/Framework/Principal/Handle.h"
2 #include "canvas/Persistency/Common/FindManyP.h"
3 #include "messagefacility/MessageLogger/MessageLogger.h"
4 
5 namespace cheat {
6 
7  //----------------------------------------------------------------
8  template <typename Evt>
9  bool PhotonBackTracker::CanRun(Evt const& evt)
10  {
11  return !evt.isRealData();
12  }
13 
14  //----------------------------------------------------------------
15  template <typename Evt>
16  void PhotonBackTracker::PrepOpDetBTRs(Evt const& evt)
17  {
18  if (BTRsReady()) { return; }
19  const std::vector<art::InputTag> G4ModuleLabels =
20  (fG4ModuleLabels.empty()) ? std::vector{fG4ModuleLabel} : fG4ModuleLabels;
21 
22  auto compareBTRlambda = [](art::Ptr<sim::OpDetBacktrackerRecord> const& a,
23  art::Ptr<sim::OpDetBacktrackerRecord> const& b) {
24  return a->OpDetNum() < b->OpDetNum();
25  };
26 
27  for (auto& G4ModuleLabel : G4ModuleLabels) {
28  auto const& btrHandle =
29  evt.template getValidHandle<std::vector<sim::OpDetBacktrackerRecord>>(G4ModuleLabel);
30  art::fill_ptr_vector(priv_OpDetBTRs, btrHandle);
31  if (!std::is_sorted(priv_OpDetBTRs.begin(), priv_OpDetBTRs.end(), compareBTRlambda))
32  std::sort(priv_OpDetBTRs.begin(), priv_OpDetBTRs.end(), compareBTRlambda);
33  }
34  }
35 
36  //----------------------------------------------------------------
37  //ToDo: Figure out why I get OpHit* out of here instead of art::Ptr.
38  template <typename Evt>
39  void PhotonBackTracker::PrepOpFlashToOpHits(Evt const& evt)
40  {
41  if (OpFlashToOpHitsReady()) { return; }
42  auto flashHandles = evt.template getMany<std::vector<recob::OpFlash>>();
43  for (const auto& handle : flashHandles) {
44  std::vector<art::Ptr<recob::OpFlash>> flash_vec;
45  if (handle.failedToGet()) {
46  mf::LogWarning("PhotonBackTracker")
47  << " failed to get handle to recob::OpFlash. Has reco run yet?";
48  return;
49  }
50  art::fill_ptr_vector(flash_vec, handle);
51  auto tag = art::InputTag(handle.provenance()->moduleLabel());
52  art::FindManyP<recob::OpHit> flash_hit_assn(flash_vec, evt, tag);
53  for (size_t i = 0; i < flash_vec.size(); ++i) {
54  art::Ptr<recob::OpFlash> flashp = flash_vec.at(i);
55  std::vector<art::Ptr<recob::OpHit>> ophits = flash_hit_assn.at(i);
56  auto check = priv_OpFlashToOpHits.emplace(flashp, ophits);
57  if (check.second == false) {
58  // loop ophit_ps
59  // push_back to vector.
60  for (auto& ophitp : ophits) {
61  check.first->second.push_back(ophitp);
62  }
63  }
64  }
65  }
66  }
67 
68  //----------------------------------------------------------------
69  template <typename Evt>
70  void PhotonBackTracker::PrepEvent(Evt const& evt)
71  {
72  if (!CanRun(evt)) {
73  throw cet::exception("PhotonBackTracker") << "PhotonBackTracker cannot function."
74  << "Is this file real data?";
75  }
76  priv_OpDetBTRs.clear();
77  PrepOpDetBTRs(evt);
78  PrepOpFlashToOpHits(evt);
79  }
80 }