LDMX Software
dqm::SampleValidation Class Reference

Public Member Functions

 SampleValidation (const std::string &name, framework::Process &process)
 
virtual void configure (framework::config::Parameters &ps) override
 Callback for the EventProcessor to configure itself from the given set of parameters.
 
virtual void analyze (const framework::Event &event) override
 Process the event and make histograms or summaries.
 
float pdgidLabel (const int pdgid)
 
- Public Member Functions inherited from framework::Analyzer
 Analyzer (const std::string &name, Process &process)
 Class constructor.
 
virtual void process (Event &event) final
 Processing an event for an Analyzer is calling analyze.
 
virtual void beforeNewRun (ldmx::RunHeader &run_header) final
 Don't allow Analyzers to add parameters to the run header.
 
- Public Member Functions inherited from framework::EventProcessor
 DECLARE_FACTORY (EventProcessor, EventProcessor *, const std::string &, Process &)
 declare that we have a factory for this class
 
 EventProcessor (const std::string &name, Process &process)
 Class constructor.
 
virtual ~EventProcessor ()=default
 Class destructor.
 
virtual void onNewRun (const ldmx::RunHeader &run_header)
 Callback for the EventProcessor to take any necessary action when the run being processed changes.
 
virtual void onFileOpen (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a new event input ROOT file is opened.
 
virtual void onFileClose (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a event input ROOT file is closed.
 
virtual void onProcessStart ()
 Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.
 
virtual void onProcessEnd ()
 Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.
 
template<class T >
const T & getCondition (const std::string &condition_name)
 Access a conditions object for the current event.
 
TDirectory * getHistoDirectory ()
 Access/create a directory in the histogram file for this event processor to create histograms and analysis tuples.
 
void setStorageHint (framework::StorageControl::Hint hint)
 Mark the current event as having the given storage control hint from this module_.
 
void setStorageHint (framework::StorageControl::Hint hint, const std::string &purposeString)
 Mark the current event as having the given storage control hint from this module and the given purpose string.
 
int getLogFrequency () const
 Get the current logging frequency from the process.
 
int getRunNumber () const
 Get the run number from the process.
 
std::string getName () const
 Get the processor name.
 
void createHistograms (const std::vector< framework::config::Parameters > &histos)
 Internal function which is used to create histograms passed from the python configuration @parma histos vector of Parameters that configure histograms to create.
 

Private Attributes

std::string target_scoring_plane_coll_name_
 
std::string target_scoring_plane_passname_
 
std::string sim_particles_coll_name_
 
std::string sim_particles_passname_
 

Additional Inherited Members

- Protected Member Functions inherited from framework::EventProcessor
void abortEvent ()
 Abort the event immediately.
 
- Protected Attributes inherited from framework::EventProcessor
HistogramPool histograms_
 helper object for making and filling histograms
 
NtupleManagerntuple_ {NtupleManager::getInstance()}
 Manager for any ntuples.
 
logging::logger the_log_
 The logger for this EventProcessor.
 

Detailed Description

Definition at line 16 of file SampleValidation.h.

Constructor & Destructor Documentation

◆ SampleValidation()

dqm::SampleValidation::SampleValidation ( const std::string & name,
framework::Process & process )
inline

Definition at line 18 of file SampleValidation.h.

19 : Analyzer(name, process) {}
virtual void process(Event &event) final
Processing an event for an Analyzer is calling analyze.
Analyzer(const std::string &name, Process &process)
Class constructor.

Member Function Documentation

◆ analyze()

void dqm::SampleValidation::analyze ( const framework::Event & event)
overridevirtual

Process the event and make histograms or summaries.

Parameters
eventThe Event to analyze

Implements framework::Analyzer.

Definition at line 22 of file SampleValidation.cxx.

22 {
23 // Grab the SimParticle Map and Target Scoring Plane Hits
24 auto target_sp_hits(event.getCollection<ldmx::SimTrackerHit>(
25 target_scoring_plane_coll_name_, target_scoring_plane_passname_));
26 auto particle_map{event.getMap<int, ldmx::SimParticle>(
27 sim_particles_coll_name_, sim_particles_passname_)};
28
29 std::vector<int> primary_daughters;
30
31 double hard_thresh{9999.0};
32
33 // Loop over all SimParticles
34 for (auto const& it : particle_map) {
35 ldmx::SimParticle p = it.second;
36 std::vector<int> parents_track_ids = p.getParents();
37 std::vector<int> daughters = p.getDaughters();
38 const auto& pdgid = p.getPdgID();
39 const auto& vertex = p.getVertex();
40 const auto& energy = p.getEnergy();
41 const auto& momentum = p.getMomentum();
42 for (auto const& parent_track_id : parents_track_ids) {
43 if (parent_track_id == 0) {
44 ROOT::Math::XYZVector momentum_vec(momentum[0], momentum[1],
45 momentum[2]);
46 histograms_.fill("primaries_pdgid", pdgidLabel(pdgid));
47 histograms_.fill("primaries_energy", energy);
48 histograms_.fill("primaries_theta",
49 momentum_vec.Theta() * (180 / 3.14159));
50 histograms_.fill("primaries_pt", std::sqrt(momentum_vec.Perp2()));
51 hard_thresh = (2500. / 4000.) * energy;
52 primary_daughters = daughters;
53 for (const ldmx::SimTrackerHit& sphit : target_sp_hits) {
54 if (sphit.getTrackID() == it.first && sphit.getPosition()[2] < 0) {
55 histograms_.fill("beam_smear", vertex[0], vertex[1]);
56 }
57 }
58 }
59 } // end loop over parents
60 } // end loop over SimParticles (1st time)
61
62 std::vector<std::vector<int>> hardbrem_daughters;
63
64 for (auto const& it : particle_map) {
65 int trackid = it.first;
66 ldmx::SimParticle p = it.second;
67 const auto& momentum = p.getMomentum();
68 ROOT::Math::XYZVector momentum_vec(momentum[0], momentum[1], momentum[2]);
69 for (auto const& primary_daughter : primary_daughters) {
70 if (trackid == primary_daughter) {
71 histograms_.fill("primarydaughters_pdgid", pdgidLabel(p.getPdgID()));
72 if (p.getPdgID() == 22) {
73 histograms_.fill("daughterphoton_energy", p.getEnergy());
74 }
75 if (p.getEnergy() >= hard_thresh) {
76 histograms_.fill("harddaughters_pdgid", pdgidLabel(p.getPdgID()));
77 histograms_.fill("harddaughters_startZ", p.getVertex()[2]);
78 histograms_.fill("harddaughters_endZ", p.getEndPoint()[2]);
79 histograms_.fill("harddaughters_energy", p.getEnergy());
80 histograms_.fill("harddaughters_theta",
81 momentum_vec.Theta() * (180 / 3.14159));
82 histograms_.fill("harddaughters_pt", std::sqrt(momentum_vec.Perp2()));
83 hardbrem_daughters.push_back(p.getDaughters());
84 }
85 }
86 } // end loop over primary daughters
87 } // end loop over SimParticles (2nd time)
88
89 for (auto const& it : particle_map) {
90 int trackid = it.first;
91 ldmx::SimParticle p = it.second;
92 const auto& momentum = p.getMomentum();
93 ROOT::Math::XYZVector momentum_vec(momentum[0], momentum[1], momentum[2]);
94 for (const std::vector<int>& daughter_track_id : hardbrem_daughters) {
95 for (const int& daughter_id : daughter_track_id) {
96 if (trackid == daughter_id) {
97 histograms_.fill("hardbremdaughters_pdgid", pdgidLabel(p.getPdgID()));
98 histograms_.fill("hardbremdaughters_startZ", p.getVertex()[2]);
99 histograms_.fill("hardbremdaughters_endZ", p.getEndPoint()[2]);
100 histograms_.fill("hardbremdaughters_energy", p.getEnergy());
101 histograms_.fill("hardbremdaughters_theta",
102 momentum_vec.Theta() * (180 / 3.14159));
103 histograms_.fill("hardbremdaughters_pt",
104 std::sqrt(momentum_vec.Perp2()));
105 }
106 }
107 } // end loop over hardbrem daughters
108 } // end loop over SimParticles (3x time)
109
110 return;
111}
HistogramPool histograms_
helper object for making and filling histograms
const std::vector< ContentType > & getCollection(const std::string &collectionName, const std::string &passName) const
Get a collection (std::vector) of objects from the event bus.
Definition Event.h:400
void fill(const std::string &name, const T &val)
Fill a 1D histogram.
Class representing a simulated particle.
Definition SimParticle.h:23
double getEnergy() const
Get the energy of this particle [MeV].
Definition SimParticle.h:72
std::vector< int > getParents() const
Get a vector containing the track IDs of the parent particles.
std::vector< double > getVertex() const
Get a vector containing the vertex of this particle in mm.
std::vector< int > getDaughters() const
Get a vector containing the track IDs of all daughter particles.
int getPdgID() const
Get the PDG ID of this particle.
Definition SimParticle.h:85
std::vector< double > getEndPoint() const
Get the end_point of this particle where it was destroyed or left the world volume [mm].
std::vector< double > getMomentum() const
Get a vector containing the momentum of this particle [MeV].
Represents a simulated tracker hit in the simulation.

References framework::HistogramPool::fill(), framework::Event::getCollection(), ldmx::SimParticle::getDaughters(), ldmx::SimParticle::getEndPoint(), ldmx::SimParticle::getEnergy(), ldmx::SimParticle::getMomentum(), ldmx::SimParticle::getParents(), ldmx::SimParticle::getPdgID(), ldmx::SimParticle::getVertex(), and framework::EventProcessor::histograms_.

◆ configure()

void dqm::SampleValidation::configure ( framework::config::Parameters & parameters)
overridevirtual

Callback for the EventProcessor to configure itself from the given set of parameters.

The parameters a processor has access to are the member variables of the python class in the sequence that has class_name equal to the EventProcessor class name.

For an example, look at MyProcessor.

Parameters
parametersParameters for configuration.

Reimplemented from framework::EventProcessor.

Definition at line 13 of file SampleValidation.cxx.

13 {
14 target_scoring_plane_coll_name_ =
15 ps.get<std::string>("target_scoring_plane_coll_name");
16 target_scoring_plane_passname_ =
17 ps.get<std::string>("target_scoring_plane_passname");
18 sim_particles_coll_name_ = ps.get<std::string>("sim_particles_coll_name");
19 sim_particles_passname_ = ps.get<std::string>("sim_particles_passname");
20}

References framework::config::Parameters::get().

◆ pdgidLabel()

float dqm::SampleValidation::pdgidLabel ( const int pdgid)

Definition at line 113 of file SampleValidation.cxx.

113 {
114 // initially assign label as "anything else"/overflow value,
115 // only change if the pdg id is something of interest
116 int label = 18;
117 if (pdgid == -11) label = 0; // e+
118 if (pdgid == 11) label = 1; // e-
119 if (pdgid == -13) label = 2; // μ+
120 if (pdgid == 13) label = 3; // μ-
121 if (pdgid == 22) label = 4; // γ
122 if (pdgid == 2212) label = 5; // proton
123 if (pdgid == 2112) label = 6; // neutron
124 if (pdgid == 211) label = 7; // π+
125 if (pdgid == -211) label = 8; // π-
126 if (pdgid == 111) label = 9; // π0
127 if (pdgid == 321) label = 10; // K+
128 if (pdgid == -321) label = 11; // K-
129 if (pdgid == 130) label = 12; // K-Long
130 if (pdgid == 310) label = 13; // K-Short
131 if (pdgid == 3122 || pdgid == 3222 || pdgid == 3212 || pdgid == 3112 ||
132 pdgid == 3322 || pdgid == 3312) {
133 label = 16; // strange baryons
134 }
135 /*
136 * Nuclear PDG codes are given by ±10LZZZAAAI so to find the atomic
137 * number, we divide by 10 (to lose I) and then take the modulo
138 * with 1000.
139 */
140 if (pdgid > 1000000000) { // nuclei
141 if (((pdgid / 10) % 1000) <= 4) {
142 label = 14; // light nuclei
143 } else {
144 label = 15; // heavy nuclei
145 }
146 }
147 // dark photon, need pdg id for other models like ALPs and SIMPs
148 if (pdgid == 622) label = 17;
149
150 if (label == 18) {
151 ldmx_log(debug) << "Unrecognized PDG ID: " << pdgid
152 << ", assigning to 'else'";
153 }
154
155 return label + 0.5;
156}

Member Data Documentation

◆ sim_particles_coll_name_

std::string dqm::SampleValidation::sim_particles_coll_name_
private

Definition at line 27 of file SampleValidation.h.

◆ sim_particles_passname_

std::string dqm::SampleValidation::sim_particles_passname_
private

Definition at line 28 of file SampleValidation.h.

◆ target_scoring_plane_coll_name_

std::string dqm::SampleValidation::target_scoring_plane_coll_name_
private

Definition at line 25 of file SampleValidation.h.

◆ target_scoring_plane_passname_

std::string dqm::SampleValidation::target_scoring_plane_passname_
private

Definition at line 26 of file SampleValidation.h.


The documentation for this class was generated from the following files: