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.
 
int 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_passname_
 
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 19 of file SampleValidation.cxx.

19 {
20 // Grab the SimParticle Map and Target Scoring Plane Hits
21 auto target_sp_hits(event.getCollection<ldmx::SimTrackerHit>(
22 "TargetScoringPlaneHits", target_scoring_plane_passname_));
23 auto particle_map{event.getMap<int, ldmx::SimParticle>(
24 "SimParticles", sim_particles_passname_)};
25
26 std::vector<int> primary_daughters;
27
28 double hard_thresh{9999.0};
29
30 // Loop over all SimParticles
31 for (auto const& it : particle_map) {
32 ldmx::SimParticle p = it.second;
33 std::vector<int> parents_track_ids = p.getParents();
34 std::vector<int> daughters = p.getDaughters();
35 const auto& pdgid = p.getPdgID();
36 const auto& vertex = p.getVertex();
37 const auto& energy = p.getEnergy();
38 const auto& momentum = p.getMomentum();
39 for (auto const& parent_track_id : parents_track_ids) {
40 if (parent_track_id == 0) {
41 ROOT::Math::XYZVector momentum_vec(momentum[0], momentum[1],
42 momentum[2]);
43 histograms_.fill("primaries_pdgid", pdgidLabel(pdgid));
44 histograms_.fill("primaries_energy", energy);
45 histograms_.fill("primaries_theta",
46 momentum_vec.Theta() * (180 / 3.14159));
47 histograms_.fill("primaries_pt", std::sqrt(momentum_vec.Perp2()));
48 hard_thresh = (2500. / 4000.) * energy;
49 primary_daughters = daughters;
50 for (const ldmx::SimTrackerHit& sphit : target_sp_hits) {
51 if (sphit.getTrackID() == it.first && sphit.getPosition()[2] < 0) {
52 histograms_.fill("beam_smear", vertex[0], vertex[1]);
53 }
54 }
55 }
56 } // end loop over parents
57 } // end loop over SimParticles (1st time)
58
59 std::vector<std::vector<int>> hardbrem_daughters;
60
61 for (auto const& it : particle_map) {
62 int trackid = it.first;
63 ldmx::SimParticle p = it.second;
64 const auto& momentum = p.getMomentum();
65 ROOT::Math::XYZVector momentum_vec(momentum[0], momentum[1], momentum[2]);
66 for (auto const& primary_daughter : primary_daughters) {
67 if (trackid == primary_daughter) {
68 histograms_.fill("primarydaughters_pdgid", pdgidLabel(p.getPdgID()));
69 if (p.getPdgID() == 22) {
70 histograms_.fill("daughterphoton_energy", p.getEnergy());
71 }
72 if (p.getEnergy() >= hard_thresh) {
73 histograms_.fill("harddaughters_pdgid", pdgidLabel(p.getPdgID()));
74 histograms_.fill("harddaughters_startZ", p.getVertex()[2]);
75 histograms_.fill("harddaughters_endZ", p.getEndPoint()[2]);
76 histograms_.fill("harddaughters_energy", p.getEnergy());
77 histograms_.fill("harddaughters_theta",
78 momentum_vec.Theta() * (180 / 3.14159));
79 histograms_.fill("harddaughters_pt", std::sqrt(momentum_vec.Perp2()));
80 hardbrem_daughters.push_back(p.getDaughters());
81 }
82 }
83 } // end loop over primary daughters
84 } // end loop over SimParticles (2nd time)
85
86 for (auto const& it : particle_map) {
87 int trackid = it.first;
88 ldmx::SimParticle p = it.second;
89 const auto& momentum = p.getMomentum();
90 ROOT::Math::XYZVector momentum_vec(momentum[0], momentum[1], momentum[2]);
91 for (const std::vector<int>& daughter_track_id : hardbrem_daughters) {
92 for (const int& daughter_id : daughter_track_id) {
93 if (trackid == daughter_id) {
94 histograms_.fill("hardbremdaughters_pdgid", pdgidLabel(p.getPdgID()));
95 histograms_.fill("hardbremdaughters_startZ", p.getVertex()[2]);
96 histograms_.fill("hardbremdaughters_endZ", p.getEndPoint()[2]);
97 histograms_.fill("hardbremdaughters_energy", p.getEnergy());
98 histograms_.fill("hardbremdaughters_theta",
99 momentum_vec.Theta() * (180 / 3.14159));
100 histograms_.fill("hardbremdaughters_pt",
101 std::sqrt(momentum_vec.Perp2()));
102 }
103 }
104 } // end loop over hardbrem daughters
105 } // end loop over SimParticles (3x time)
106
107 return;
108}
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 className 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_passname_ =
15 ps.get<std::string>("target_scoring_plane_passname");
16 sim_particles_passname_ = ps.get<std::string>("sim_particles_passname");
17}

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

◆ pdgidLabel()

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

Definition at line 110 of file SampleValidation.cxx.

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

Member Data Documentation

◆ sim_particles_passname_

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

Definition at line 26 of file SampleValidation.h.

◆ target_scoring_plane_passname_

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

Definition at line 25 of file SampleValidation.h.


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