LDMX Software
BeamElectronLocator.cxx
1#include "Recon/BeamElectronLocator.h"
2
3namespace recon {
4
6 framework::Process &process)
7 : framework::Producer(name, process) {}
8
10
12 input_coll_ = parameters.get<std::string>("input_collection");
13 input_pass_name_ = parameters.get<std::string>("input_pass_name");
14 output_coll_ = parameters.get<std::string>("output_collection");
15 granularity_xmm_ = parameters.get<double>("granularity_X_mm");
16 granularity_ymm_ = parameters.get<double>("granularity_Y_mm");
17 tolerance_ = parameters.get<double>("min_granularity_mm");
18 min_xmm_ = parameters.get<double>("min_X_mm");
19 max_xmm_ = parameters.get<double>("max_X_mm");
20 min_ymm_ = parameters.get<double>("min_Y_mm");
21 max_ymm_ = parameters.get<double>("max_Y_mm");
22 verbose_ = parameters.get<bool>("verbose");
23}
25 ldmx_log(debug) << "BeamElectronLocator is using parameters: "
26 << " \n\tinput_collection = " << input_coll_
27 << " \n\tinput_pass_name = " << input_pass_name_
28 << " \n\toutput_collection = " << output_coll_
29 << " \n\tgranularity_X_mm = " << granularity_xmm_
30 << " \n\tgranularity_Y_mm = " << granularity_ymm_
31 << " \n\tmin_granularity_mm = " << tolerance_
32 << " \n\tmin_X_mm = " << min_xmm_
33 << " \n\tmax_X_mm = " << max_xmm_
34 << " \n\tmin_Y_mm = " << min_ymm_
35 << " \n\tmax_Y_mm = " << max_ymm_
36 << " \n\tverbose = " << verbose_;
37}
38
40 // Check if the input collection exists. If not,
41 // don't bother processing the event.
42 if (!event.exists(input_coll_, input_pass_name_)) {
43 ldmx_log(fatal) << "Attemping to use non-existing input collection "
44 << input_coll_ << "_" << input_pass_name_
45 << " to locate electrons! Exiting.";
46 return;
47 }
48
49 std::vector<ldmx::BeamElectronTruth> beam_electron_info;
50 const auto sim_hits{event.getCollection<ldmx::SimCalorimeterHit>(
52
53 if (verbose_) {
54 ldmx_log(info) << "Looping through simhits in event "
55 << event.getEventNumber() << ".";
56 }
57
58 for (const auto &sim_hit : sim_hits) {
59 // check if we already caught this position, else, add it
60 bool is_matched = false;
61 std::vector<float> pos = sim_hit.getPosition();
62 for (auto found_electrons : beam_electron_info) {
63 // this check makes it square rather than a dR circle
64 if (fabs(pos[0] - found_electrons.getX()) < tolerance_ &&
65 fabs(pos[1] - found_electrons.getY()) < tolerance_) {
66 if (verbose_) {
67 ldmx_log(debug) << "\tHit at (x_ = " << pos[0] << ", y_ = " << pos[1]
68 << " matches electron found at (x_ = "
69 << found_electrons.getX()
70 << ", y_ = " << found_electrons.getY()
71 << "); skip this simhit";
72 }
73 is_matched = true;
74 break; // finding a match means Move on
75 } // if coordinates match something we already found
76 } // over found electrons
77 if (!is_matched) {
78 if (verbose_) {
79 ldmx_log(info) << "\tHit at (x_ = " << pos[0] << ", y_ = " << pos[1]
80 << " not formerly matched. Adding to collection.";
81 }
82 ldmx::BeamElectronTruth electron_info;
83 electron_info.setXYZ(pos[0], pos[1], pos[2]);
84 // find a way to do this later
85 // electronInfo.setThreeMomentum(simHit.getPx(), simHit.getPy(),
86 // simHit.getPz());
87
88 electron_info.setBarX(bin(pos[0], granularity_xmm_, min_xmm_, max_xmm_));
89 electron_info.setBarY(bin(pos[1], granularity_ymm_, min_ymm_, max_ymm_));
90 // set coordinates to bin center
91 electron_info.setBinnedX(min_xmm_ + (electron_info.getBarX() + 0.5) *
93 electron_info.setBinnedY(min_ymm_ + (electron_info.getBarY() + 0.5) *
95
96 beam_electron_info.push_back(electron_info);
97 }
98 } // over simhits in the collection
99
100 event.add(output_coll_, beam_electron_info);
101}
102
103int BeamElectronLocator::bin(float coordinate, double binWidth, double min,
104 double max) {
105 int n = 0;
106 while (coordinate > min + n * binWidth) {
107 n++;
108 if (min + n * binWidth > max) {
109 // don't go out of bounds, but, still indicate overflow by increasing n
110 // before breaking
111 break;
112 }
113 }
114 // the n we have now is the first bin beyond our coordinate.
115 // better aligned with conventions to return the lower edge.
116 return n - 1;
117}
118
119} // namespace recon
120
#define DECLARE_PRODUCER(CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Implements an event buffer system for storing event data.
Definition Event.h:42
bool exists(const std::string &name, const std::string &passName, bool unique=true) const
Check for the existence of an object or collection with the given name and pass name in the event.
Definition Event.cxx:92
Class which represents the process under execution.
Definition Process.h:36
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:29
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
Represents the truth information on beam electrons at the target.
void setBarX(double x)
Set x bar number of the found beam electron.
void setBinnedY(double y)
SetBinned y coordinate of the found beam electron.
double getBarX()
Get x bar number of the found beam electron.
double getBarY()
Get y_ bar number of the found beam electron.
void setXYZ(double x, double y, double z)
Set all three spatial coordinates at once.
void setBarY(double y)
Set y_ bar number of the found beam electron.
void setBinnedX(double x)
SetBinned x coordinate of the found beam electron.
Stores simulated calorimeter hit information.
Electron counting processor.
std::string input_coll_
The name of the input collection used for counting electrons.
double max_ymm_
The max value measured by the system (edge) in Y, in mm.
double granularity_ymm_
The granularity of the detector (e.g.
void onProcessStart() override
Prints the configuration to log in debug mode.
void configure(framework::config::Parameters &parameters) override
Configure the processor using the given user specified parameters.
double tolerance_
The tolerance within which simhits are considered to belong to the same electron.
double min_xmm_
The min value measured by the system (edge) in X, in mm.
virtual ~BeamElectronLocator()
Destructor.
BeamElectronLocator(const std::string &name, framework::Process &process)
Constructor.
std::string input_pass_name_
The pass name of the input collection used for counting electrons.
bool verbose_
Indicate verbose printout to log according to log level.
double min_ymm_
The min value measured by the system (edge) in Y, in mm.
double max_xmm_
The max value measured by the system (edge) in X, in mm.
std::string output_coll_
The name of the output collection used to save some electron counting variables.
double granularity_xmm_
The granularity of the detector (e.g.
int bin(float coordinate, double binWidth, double min, double max)
Bins coordinates according to some given granularity (passed as argument).
void produce(framework::Event &event) override
Process the event and put new data products into it.
All classes in the ldmx-sw project use this namespace.