1 #include "art/Framework/Principal/Handle.h"
2 #include "canvas/Persistency/Common/FindManyP.h"
3 #include "messagefacility/MessageLogger/MessageLogger.h"
7 //----------------------------------------------------------------
8 template <typename Evt>
9 bool PhotonBackTracker::CanRun(Evt const& evt)
11 return !evt.isRealData();
14 //----------------------------------------------------------------
15 template <typename Evt>
16 void PhotonBackTracker::PrepOpDetBTRs(Evt const& evt)
18 if (BTRsReady()) { return; }
19 const std::vector<art::InputTag> G4ModuleLabels =
20 (fG4ModuleLabels.empty()) ? std::vector{fG4ModuleLabel} : fG4ModuleLabels;
22 auto compareBTRlambda = [](art::Ptr<sim::OpDetBacktrackerRecord> const& a,
23 art::Ptr<sim::OpDetBacktrackerRecord> const& b) {
24 return a->OpDetNum() < b->OpDetNum();
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);
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)
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?";
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) {
59 // push_back to vector.
60 for (auto& ophitp : ophits) {
61 check.first->second.push_back(ophitp);
68 //----------------------------------------------------------------
69 template <typename Evt>
70 void PhotonBackTracker::PrepEvent(Evt const& evt)
73 throw cet::exception("PhotonBackTracker") << "PhotonBackTracker cannot function."
74 << "Is this file real data?";
76 priv_OpDetBTRs.clear();
78 PrepOpFlashToOpHits(evt);