37 , fWireReadoutGeom(wireReadoutGeom)
38 , fDelay(config.Delay())
39 , fG4ModuleLabel(config.G4ModuleLabel())
40 , fG4ModuleLabels(config.G4ModuleLabels())
41 , fOpHitLabel(config.OpHitLabel())
42 , fOpFlashLabel(config.OpFlashLabel())
43 , fMinOpHitEnergyFraction(config.MinOpHitEnergyFraction())
51 , fWireReadoutGeom(wireReadoutGeom)
52 , fDelay(pSet.
get<double>(
"Delay"))
54 , fG4ModuleLabels(pSet.
get<
std::
vector<
art::InputTag>>(
"G4ModuleLabels", {}))
56 , fOpFlashLabel(pSet.get<
art::InputTag>(
"OpFlashLabel",
"opflash"))
57 , fMinOpHitEnergyFraction(pSet.get<
double>(
"MinimumOpHitEnergyFraction", 0.1))
69 priv_OpDetBTRs.clear();
70 priv_OpFlashToOpHits.clear();
76 return !priv_OpDetBTRs.empty();
82 return !priv_OpFlashToOpHits.empty();
88 return priv_OpDetBTRs;
94 std::vector<const sim::SDP*> sdp_Ps;
95 for (
size_t odet = 0; odet < priv_OpDetBTRs.size(); ++odet) {
96 const auto& pdTimeSDPmap = priv_OpDetBTRs[odet]->timePDclockSDPsMap();
97 for (
auto mapitr = pdTimeSDPmap.begin(); mapitr != pdTimeSDPmap.end(); mapitr++) {
98 std::vector<sim::SDP>
const& sdpvec = (*mapitr).second;
99 for (
size_t iv = 0; iv < sdpvec.size(); ++iv) {
100 if (
abs(sdpvec[iv].trackID) == id) sdp_Ps.push_back(&(sdpvec[iv]));
111 for (
size_t sc = 0;
sc < priv_OpDetBTRs.size(); ++
sc) {
114 if (priv_OpDetBTRs.at(
sc)->OpDetNum() == opDetNum) opDet = priv_OpDetBTRs.at(
sc);
117 throw cet::exception(
"PhotonBackTracker2") <<
"No sim:: OpDetBacktrackerRecord corresponding " 118 <<
"to opDetNum: " << opDetNum <<
"\n";
125 double const opHit_start_time,
126 double const opHit_end_time)
const 128 std::vector<sim::TrackSDP> tSDPs;
132 std::vector<sim::SDP> simSDPs =
134 for (
size_t e = 0;
e < simSDPs.size(); ++
e)
136 if (totalE < 1.
e-5) totalE = 1.;
137 for (
size_t e = 0;
e < simSDPs.size(); ++
e) {
142 info.
energy = simSDPs[
e].energy;
143 tSDPs.push_back(info);
158 auto OpDetNum = fWireReadoutGeom->OpDetFromOpChannel(opHit_P->
OpChannel());
159 const double pTime = opHit_P->
PeakTime();
160 const double pWidth = opHit_P->
Width();
161 const double start = (pTime - pWidth) * 1000 - fDelay;
162 const double end = (pTime + pWidth) * 1000 - fDelay;
163 return OpDetToTrackSDPs(OpDetNum, start, end);
169 auto OpDetNum = fWireReadoutGeom->OpDetFromOpChannel(opHit.
OpChannel());
170 const double pTime = opHit.
PeakTime();
171 const double pWidth = opHit.
Width();
172 const double start = (pTime - pWidth) * 1000 - fDelay;
173 const double end = (pTime + pWidth) * 1000 - fDelay;
174 return OpDetToTrackSDPs(OpDetNum, start, end);
180 std::vector<int> retVec;
181 for (
auto const trackSDP : OpHitToTrackSDPs(opHit)) {
182 retVec.push_back(trackSDP.trackID);
190 return OpHitToTrackIds(*opHit);
196 std::vector<int> retVec;
197 for (
auto const trackSDP : OpHitToEveTrackSDPs(opHit)) {
198 retVec.push_back(trackSDP.trackID);
206 return OpHitToEveTrackIds(*opHit_P);
213 return OpHitToEveTrackSDPs(*opHit_P);
219 std::vector<sim::TrackSDP> trackSDPs = OpHitToTrackSDPs(opHit);
223 std::map<int, float> eveIDtoEfrac;
226 for (
size_t t = 0; t < trackSDPs.size(); ++t) {
227 eveIDtoEfrac[(fPartInv->ParticleList()).EveId(trackSDPs[t].trackID)] += trackSDPs[t].energy;
228 totalE += trackSDPs[t].energy;
232 std::vector<sim::TrackSDP> eveSDPs;
233 eveSDPs.reserve(eveIDtoEfrac.size());
234 for (
auto itr = eveIDtoEfrac.begin(); itr != eveIDtoEfrac.end(); itr++) {
238 temp.
energy = (*itr).second;
239 eveSDPs.push_back(std::move(temp));
254 std::vector<int> tkidFake(1, tkId);
255 return TrackIdsToOpHits_Ps(tkidFake, hitsIn).at(0);
260 std::vector<int>
const& tkIds,
263 std::vector<std::pair<int, art::Ptr<recob::OpHit>>> opHitList;
264 for (
auto itr = hitsIn.begin(); itr != hitsIn.end(); ++itr) {
266 auto OpDetNum = fWireReadoutGeom->OpDetFromOpChannel(opHit->
OpChannel());
267 const double pTime = opHit->
PeakTime(), pWidth = opHit->
Width();
268 const double start = (pTime - pWidth) * 1000.0 - fDelay,
269 end = (pTime + pWidth) * 1000.0 - fDelay;
270 std::vector<sim::TrackSDP> tids = OpDetToTrackSDPs(OpDetNum, start,
end);
271 for (
auto itid = tids.begin(); itid != tids.end(); ++itid) {
272 for (
auto itkid = tkIds.begin(); itkid != tkIds.end(); ++itkid) {
273 if (itid->trackID == *itkid and itid->energyFrac > fMinOpHitEnergyFraction)
274 opHitList.push_back(std::make_pair(*itkid, opHit));
279 std::vector<std::vector<art::Ptr<recob::OpHit>>> truOpHits;
281 std::vector<art::Ptr<recob::OpHit>> tmpOpHits;
282 for (
auto itkid = tkIds.begin(); itkid != tkIds.end(); ++itkid) {
284 for (
auto itr = opHitList.begin(); itr != opHitList.end(); ++itr) {
285 if (*itkid == (*itr).first) tmpOpHits.push_back((*itr).second);
287 truOpHits.push_back(tmpOpHits);
295 std::vector<const sim::SDP*> retVec;
296 double fPeakTime = opHit.
PeakTime();
297 double fWidth = opHit.
Width();
299 ((fPeakTime - fWidth) * 1000.0) - fDelay;
301 if (start_time > end_time) {
throw; }
303 auto const& timeSDPMap = FindOpDetBTR(fWireReadoutGeom->OpDetFromOpChannel(opHit.
OpChannel()))
304 ->timePDclockSDPsMap();
306 std::vector<const std::pair<double, std::vector<sim::SDP>>*> timePDclockSDPMap_SortedPointers;
307 for (
auto& pair : timeSDPMap) {
308 timePDclockSDPMap_SortedPointers.push_back(&pair);
310 auto pairSort = [](
auto& a,
auto& b) {
return a->first < b->first; };
311 if (!std::is_sorted(timePDclockSDPMap_SortedPointers.begin(),
312 timePDclockSDPMap_SortedPointers.end(),
315 timePDclockSDPMap_SortedPointers.begin(), timePDclockSDPMap_SortedPointers.end(), pairSort);
321 std::vector<sim::SDP> dummyVec;
322 std::pair<double, std::vector<sim::SDP>> start_timePair = std::make_pair(start_time, dummyVec);
323 std::pair<double, std::vector<sim::SDP>> end_timePair = std::make_pair(end_time, dummyVec);
324 auto start_timePair_P = &start_timePair;
325 auto end_timePair_P = &end_timePair;
328 auto mapFirst = std::lower_bound(timePDclockSDPMap_SortedPointers.begin(),
329 timePDclockSDPMap_SortedPointers.end(),
335 std::upper_bound(mapFirst, timePDclockSDPMap_SortedPointers.end(), end_timePair_P, pairSort);
337 for (
auto& mapitr = mapFirst; mapitr != mapLast; ++mapitr)
339 for (
auto& sdp : (*mapitr)->second)
340 retVec.push_back(&sdp);
349 return OpHitToSimSDPs_Ps(*opHit_P);
355 std::vector<double> xyz(3, -999.);
361 for (
auto const& sdp : sdps) {
362 double weight = sdp.numPhotons;
372 <<
"No sim::SDPs providing non-zero number of photons" 373 <<
" can't determine originating location from truth\n";
382 std::vector<const sim::SDP*>
const& sdps_Ps)
const&
384 std::vector<double> xyz(3, -999.);
390 for (
const sim::SDP* sdp_P : sdps_Ps) {
392 double weight = sdp.numPhotons;
402 <<
"No sim::SDPs providing non-zero number of photons" 403 <<
" can't determine originating location from truth\n";
413 return SimSDPsToXYZ(OpHitToSimSDPs_Ps(opHit));
419 return SimSDPsToXYZ(OpHitToSimSDPs_Ps(*opHit));
426 std::vector<const sim::SDP*> sdps_Ps;
427 for (
auto opHit_P : opHits_Ps) {
428 std::vector<const sim::SDP*> to_add_sdps_Ps = OpHitToSimSDPs_Ps(opHit_P);
429 sdps_Ps.insert(sdps_Ps.end(), to_add_sdps_Ps.begin(), to_add_sdps_Ps.end());
438 const std::vector<const sim::SDP*> SDPs_Ps = OpHitsToSimSDPs_Ps(opHits_Ps);
439 return SimSDPsToXYZ(SDPs_Ps);
446 const std::vector<int> ids = OpHitToEveTrackIds(opHit_P);
447 std::unordered_set<const sim::SDP*> sdps;
448 for (
auto const&
id : ids) {
449 std::vector<const sim::SDP*> tmp_sdps = TrackIdToSimSDPs_Ps(
id);
450 for (
const sim::SDP* tmp_sdp : tmp_sdps) {
451 sdps.insert(tmp_sdp);
461 const std::vector<int> ids = OpHitToEveTrackIds(opHit);
462 std::unordered_set<const sim::SDP*> sdps;
463 for (
auto const&
id : ids) {
464 std::vector<const sim::SDP*> tmp_sdps = TrackIdToSimSDPs_Ps(
id);
465 for (
const sim::SDP* tmp_sdp : tmp_sdps) {
466 sdps.insert(tmp_sdp);
475 return fPartInv->GetSetOfEveIds();
481 return fPartInv->GetSetOfTrackIds();
488 std::set<int> eveIds;
489 for (
auto const& opHit_P : opHits_Ps) {
490 const std::vector<sim::TrackSDP> sdps = OpHitToEveTrackSDPs(opHit_P);
491 for (
auto const& sdp : sdps) {
492 eveIds.insert(sdp.trackID);
501 std::set<int> eveIds;
502 for (
auto const& opHit : opHits) {
503 const std::vector<sim::TrackSDP> sdps = OpHitToEveTrackSDPs(opHit);
504 for (
auto const& sdp : sdps) {
505 eveIds.insert(sdp.trackID);
516 for (
auto const& opHit : opHits) {
517 for (
auto const& sdp : OpHitToTrackSDPs(opHit)) {
518 tids.insert(sdp.trackID);
528 for (
auto const& opHit : opHits) {
529 for (
auto const& sdp : OpHitToTrackSDPs(opHit)) {
530 tids.insert(sdp.trackID);
542 float total = 1. * opHits.size();
544 for (
size_t h = 0; h < opHits.size(); ++h) {
546 std::vector<sim::TrackSDP> opHitTrackSDPs = OpHitToTrackSDPs(opHit);
549 for (
size_t e = 0;
e < opHitTrackSDPs.size(); ++
e) {
550 if (tkIds.find(opHitTrackSDPs[
e].trackID) != tkIds.end()) {
557 if (total > 0) purity = desired / total;
563 std::set<int>
const& tkIds,
572 for (
size_t h = 0; h < opHits.size(); ++h) {
574 std::vector<sim::TrackSDP> opHitTrackIDs = OpHitToTrackSDPs(opHit);
575 total += opHit->
Area();
578 for (
size_t e = 0;
e < opHitTrackIDs.size(); ++
e) {
579 if (tkIds.find(opHitTrackIDs[
e].trackID) != tkIds.end()) {
580 desired += opHit->
Area();
586 if (total > 0) purity = desired / total;
592 std::set<int>
const& tkIds,
598 for (
size_t h = 0; h < opHits.size(); ++h) {
600 std::vector<sim::TrackSDP> opHitTrackSDPs = OpHitToTrackSDPs(opHit);
603 for (
size_t e = 0;
e < opHitTrackSDPs.size(); ++
e) {
604 if (tkIds.find(opHitTrackSDPs[
e].trackID) != tkIds.end() &&
605 opHitTrackSDPs[
e].energyFrac >= fMinOpHitEnergyFraction) {
612 for (
size_t h = 0; h < opHitsIn.size(); ++h) {
614 std::vector<sim::TrackSDP> opHitTrackSDPs = OpHitToTrackSDPs(opHit);
615 for (
size_t e = 0;
e < opHitTrackSDPs.size(); ++
e) {
619 if (tkIds.find(opHitTrackSDPs[
e].trackID) != tkIds.end() &&
620 opHitTrackSDPs[
e].energyFrac >= fMinOpHitEnergyFraction) {
626 double efficiency = 0.;
627 if (total > 0.) efficiency = desired / total;
633 std::set<int>
const& tkIds,
642 for (
size_t h = 0; h < opHits.size(); ++h) {
645 std::vector<sim::TrackSDP> opHitTrackIDs = OpHitToTrackSDPs(opHit);
650 for (
size_t e = 0;
e < opHitTrackIDs.size(); ++
e) {
651 if (tkIds.find(opHitTrackIDs[
e].trackID) != tkIds.end() &&
652 opHitTrackIDs[
e].energyFrac >= fMinOpHitEnergyFraction) {
653 desired += opHit->
Area();
658 for (
size_t h = 0; h < opHitsIn.size(); ++h) {
662 std::vector<sim::TrackSDP> opHitTrackIDs = OpHitToTrackSDPs(opHit);
663 for (
size_t e = 0;
e < opHitTrackIDs.size(); ++
e) {
667 if (tkIds.find(opHitTrackIDs[
e].trackID) != tkIds.end() &&
668 opHitTrackIDs[
e].energyFrac >= fMinOpHitEnergyFraction) {
669 total += opHit->
Area();
674 double efficiency = 0.;
675 if (total > 0.) efficiency = desired / total;
685 return priv_OpFlashToOpHits.at(flash_P);
691 return OpHitsToXYZ(OpFlashToOpHits_Ps(flash_P));
697 std::vector<art::Ptr<recob::OpHit>> opHits_Ps = OpFlashToOpHits_Ps(flash_P);
699 for (
auto& opHit_P : opHits_Ps) {
700 for (
const int&
id : OpHitToTrackIds(opHit_P)) {
std::vector< double > OpHitsToXYZ(std::vector< art::Ptr< recob::OpHit >> const &opHits_Ps) const
double OpHitLightCollectionPurity(std::set< int > const &tkIds, std::vector< art::Ptr< recob::OpHit >> const &opHits)
std::vector< double > OpHitToXYZ(art::Ptr< recob::OpHit > const &hit)
std::vector< double > OpFlashToXYZ(art::Ptr< recob::OpFlash > &flash_P) const
std::vector< sim::TrackSDP > OpDetToTrackSDPs(int OpDetNum, double opHit_start_time, double opHit_end_time) const
std::vector< const sim::SDP * > TrackIdToSimSDPs_Ps(int id) const
art::Ptr< sim::OpDetBacktrackerRecord > FindOpDetBTR(int opDetNum) const
std::vector< double > SimSDPsToXYZ(std::vector< sim::SDP > const &sdps)
constexpr auto abs(T v)
Returns the absolute value of the argument.
std::vector< int > OpHitToEveTrackIds(recob::OpHit const &opHit)
double OpHitLightCollectionEfficiency(std::set< int > const &tkIds, std::vector< art::Ptr< recob::OpHit >> const &opHits, std::vector< art::Ptr< recob::OpHit >> const &opHitsIn)
std::set< int > OpFlashToTrackIds(art::Ptr< recob::OpFlash > &flash_P) const
std::vector< art::Ptr< sim::OpDetBacktrackerRecord > > const & OpDetBTRs() const
decltype(auto) constexpr end(T &&obj)
ADL-aware version of std::end.
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
std::vector< const sim::SDP * > OpHitToSimSDPs_Ps(recob::OpHit const &opHit) const
int trackID
Geant4 supplied trackID.
std::vector< const sim::SDP * > OpHitsToSimSDPs_Ps(std::vector< art::Ptr< recob::OpHit >> const &opHits_Ps) const
static const int NoParticleId
Interface for a class providing readout channel mapping to geometry.
float energyFrac
fraction of OpHit energy from the particle with this trackID
double timePDclock_t
Type for iTimePDclock tick used in the interface.
std::set< int > GetSetOfTrackIds() const
back track the reconstruction to the simulation
art::InputTag fG4ModuleLabel
Ionization photons from a Geant4 track.
std::vector< sim::TrackSDP > OpHitToTrackSDPs(art::Ptr< recob::OpHit > const &hit)
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
PhotonBackTracker(fhicl::ParameterSet const &pset, art::ActivityRegistry ®)
code to link reconstructed objects back to the MC truth information
bool OpFlashToOpHitsReady() const
std::vector< int > OpHitToTrackIds(recob::OpHit const &opHit) const
double OpHitCollectionEfficiency(std::set< int > trackIDs, std::vector< art::Ptr< recob::OpHit >> const &hits, std::vector< art::Ptr< recob::OpHit >> const &allhits)
std::vector< std::vector< art::Ptr< recob::OpHit > > > TrackIdsToOpHits_Ps(std::vector< int > const &tkIds, std::vector< art::Ptr< recob::OpHit >> const &hitsIn) const
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
Header for the ParticleInvenotry Service Provider.
double OpHitCollectionPurity(std::set< int > trackIDs, std::vector< art::Ptr< recob::OpHit >> const &hits)
std::unordered_set< const sim::SDP * > OpHitToEveSimSDPs_Ps(recob::OpHit const &opHit)
std::vector< sim::SDP > TrackIDsAndEnergies(timePDclock_t startTimePDclock, timePDclock_t endTimePDclock) const
Return all the recorded energy deposition within a time interval.
std::set< int > GetSetOfEveIds() const
float energy
energy from the particle with this trackID [MeV]
std::vector< art::Ptr< recob::OpHit > > OpFlashToOpHits_Ps(art::Ptr< recob::OpFlash > &flash_P) const
std::vector< art::Ptr< recob::OpHit > > TrackIdToOpHits_Ps(int tkId, std::vector< art::Ptr< recob::OpHit >> const &hitsIn) const
std::vector< sim::TrackSDP > OpHitToEveTrackSDPs(art::Ptr< recob::OpHit > const &opHit_P) const
Tools and modules for checking out the basics of the Monte Carlo.
Interface to geometry for wire readouts .
cet::coded_exception< error, detail::translate > exception