LDMX Software
ReSimVerifier.cxx
1#include "DQM/ReSimVerifier.h"
2
3#include "SimCore/Event/SimParticle.h"
4namespace dqm {
5
7 sim_coll_name_ = parameters.get<std::string>("sim_coll_name");
8 sim_pass_name_ = parameters.get<std::string>("sim_pass_name");
9 re_sim_pass_name_ = parameters.get<std::string>("resim_pass_name");
10 stop_on_error_ = parameters.get<bool>("stop_on_error");
11 collections_ = parameters.get<std::vector<std::string>>("collections");
12}
13bool ReSimVerifier::verifySimCalorimeterHits(
14 const std::vector<ldmx::SimCalorimeterHit>& simHits,
15 const std::vector<ldmx::SimCalorimeterHit>& reSimHits) {
16 for (auto i{0}; i < simHits.size(); ++i) {
17 auto hit{simHits[i]};
18 auto rehit{reSimHits[i]};
19
20 if (hit.getEdep() != rehit.getEdep()) {
21 return false;
22 }
23 if (hit.getID() != rehit.getID()) {
24 return false;
25 }
26 if (hit.getTime() != rehit.getTime()) {
27 return false;
28 }
29 if (hit.getNumberOfContribs() != rehit.getNumberOfContribs()) {
30 return false;
31 }
32 auto pos{hit.getPosition()};
33 auto repos{rehit.getPosition()};
34 if (pos[0] != repos[0] || pos[1] != repos[1] || pos[2] != repos[2]) {
35 return false;
36 }
37 }
38 return true;
39}
40
41bool ReSimVerifier::verifySimParticles(const framework::Event& event) {
42 const auto& sim_particles{
43 event.getMap<int, ldmx::SimParticle>(sim_coll_name_, sim_pass_name_)};
44 const auto& re_sim_particles{
45 event.getMap<int, ldmx::SimParticle>(sim_coll_name_, re_sim_pass_name_)};
46 for (auto [id, simParticle] : sim_particles) {
47 if (!re_sim_particles.count(id)) {
48 return false;
49 }
50 auto re_sim_particle{re_sim_particles.at(id)};
51 if (simParticle.getEnergy() != re_sim_particle.getEnergy()) {
52 return false;
53 }
54 if (simParticle.getPdgID() != re_sim_particle.getPdgID()) {
55 return false;
56 }
57 if (simParticle.getTime() != re_sim_particle.getTime()) {
58 return false;
59 }
60 }
61 return true;
62}
64 std::stringstream ss;
65 bool passing{true};
66 bool skipped{false};
67 auto event_number{event.getEventNumber()};
68 for (auto collection : collections_) {
69 const auto sim_hits = event.getCollection<ldmx::SimCalorimeterHit>(
70 collection, sim_pass_name_);
71 const auto re_sim_hits = event.getCollection<ldmx::SimCalorimeterHit>(
72 collection, re_sim_pass_name_);
73 if (re_sim_hits.size() == 0) {
74 skipped = true;
75 continue;
76 } else {
77 skipped = false;
78 }
79
80 if (!verifySimCalorimeterHits(sim_hits, re_sim_hits)) {
81 passing = false;
82 ss << "Event " << event_number << " has different simhits for "
83 << collection << std::endl;
84 }
85 }
86 if (skipped) {
87 ldmx_log(info) << "Skipping event " << event_number
88 << "since it was not resimulated";
89 }
90 if (!verifySimParticles(event)) {
91 passing = false;
92 ss << "Event " << event_number
93 << " has different SimParticles between the two passes" << std::endl;
94 }
95 if (!passing) {
96 if (stop_on_error_) {
97 EXCEPTION_RAISE("ReSimVerify", ss.str());
98 } else {
99 ldmx_log(info) << ss.str();
100 }
101 }
102
103} // Analyze
104} // namespace dqm
#define DECLARE_ANALYZER(CLASS)
Macro which allows the framework to construct an analyzer given its name during configuration.
void analyze(const framework::Event &event) override
Process the event and make histograms or summaries.
void configure(framework::config::Parameters &parameters) override
Callback for the EventProcessor to configure itself from the given set of parameters.
Implements an event buffer system for storing event data.
Definition Event.h:40
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:26
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:75
Stores simulated calorimeter hit information.
Class representing a simulated particle.
Definition SimParticle.h:25