LDMX Software
RawSiStripDQM.cxx
1#include "Tracking/dqm/RawSiStripDQM.h"
2
3#include "Tracking/Event/FittedSiStripHit.h"
4#include "Tracking/Event/RawSiStripHit.h"
5#include "Tracking/Event/SiStripWaveform.h"
6
7namespace tracking::dqm {
8
10 raw_hits_collection_ = parameters.get<std::string>("raw_hits_collection");
11 subtracted_hits_collection_ =
12 parameters.get<std::string>("subtracted_hits_collection");
13 waveforms_collection_ = parameters.get<std::string>("waveforms_collection");
14 fitted_hits_collection_ =
15 parameters.get<std::string>("fitted_hits_collection");
16 input_pass_name_ = parameters.get<std::string>("input_pass_name");
17 n_hybrids_ = parameters.get<int>("n_hybrids");
18 const auto layer_ids{parameters.get<std::vector<int>>("layer_ids")};
19
20 for (int h{0}; h < n_hybrids_; ++h) {
21 const std::string suffix{"_h" + std::to_string(h)};
22 raw_adc_names_.push_back("raw_adc" + suffix);
23 subtracted_adc_names_.push_back("subtracted_adc" + suffix);
24 pchannel_names_.push_back("waveform_pchannel" + suffix);
25 peak_names_.push_back("waveform_peak" + suffix);
26 }
27 for (int layer : layer_ids) {
28 fit_amplitude_names_[layer] = "fit_amplitude_l" + std::to_string(layer);
29 }
30}
31
32std::vector<TH1*> RawSiStripDQM::getHists(
33 const std::vector<std::string>& names) {
34 std::vector<TH1*> hists;
35 for (const auto& name : names) hists.push_back(histograms_.get(name));
36 return hists;
37}
38
40 // direct fills, ~1e5 samples per event
41 if (event.exists(raw_hits_collection_, input_pass_name_)) {
42 const auto& hits{event.getCollection<ldmx::RawSiStripHit>(
43 raw_hits_collection_, input_pass_name_)};
44 histograms_.fill("n_raw_hits", hits.size());
45 auto* read_error{histograms_.get("raw_read_error")};
46 const auto raw_adc{getHists(raw_adc_names_)};
47 for (const auto& hit : hits) {
48 read_error->Fill(hit.getReadError());
49 if (hit.getHybridId() >= n_hybrids_) continue;
50 for (short adc : hit.getSamples()) {
51 raw_adc[hit.getHybridId()]->Fill(adc);
52 }
53 }
54 }
55
56 if (event.exists(subtracted_hits_collection_, input_pass_name_)) {
57 const auto& hits{event.getCollection<ldmx::RawSiStripHit>(
58 subtracted_hits_collection_, input_pass_name_)};
59 const auto subtracted_adc{getHists(subtracted_adc_names_)};
60 for (const auto& hit : hits) {
61 if (hit.getHybridId() >= n_hybrids_) continue;
62 for (short adc : hit.getSamples()) {
63 subtracted_adc[hit.getHybridId()]->Fill(adc);
64 }
65 }
66 }
67
68 if (event.exists(waveforms_collection_, input_pass_name_)) {
69 const auto& waveforms{event.getCollection<ldmx::SiStripWaveform>(
70 waveforms_collection_, input_pass_name_)};
71 histograms_.fill("n_waveforms", waveforms.size());
72 for (const auto& waveform : waveforms) {
73 histograms_.fill("waveform_n_triggers", waveform.getNTriggers());
74 histograms_.fill("waveform_peak_trigger", waveform.peakTrigger());
75 if (waveform.getHybridId() >= n_hybrids_) continue;
76 histograms_.fill(pchannel_names_[waveform.getHybridId()],
77 waveform.getPchannel());
78 histograms_.fill(peak_names_[waveform.getHybridId()],
79 waveform.peakAmplitude());
80 }
81 }
82
83 // fit results live in their own collection, converged fits only
84 if (!event.exists(fitted_hits_collection_, input_pass_name_)) return;
85 const auto& fitted_hits{event.getCollection<ldmx::FittedSiStripHit>(
86 fitted_hits_collection_, input_pass_name_)};
87 histograms_.fill("n_fitted_hits", fitted_hits.size());
88 for (const auto& hit : fitted_hits) {
89 histograms_.fill("fit_t0", hit.getT0());
90 if (hit.getNDF() > 0) {
91 histograms_.fill("fit_chi2_ndf", hit.getReducedChi2());
92 }
93 auto name{fit_amplitude_names_.find(hit.getLayerID())};
94 if (name != fit_amplitude_names_.end()) {
95 histograms_.fill(name->second, hit.getAmplitude());
96 }
97 }
98}
99} // namespace tracking::dqm
100
#define DECLARE_ANALYZER(CLASS)
Macro which allows the framework to construct an analyzer given its name during configuration.
HistogramPool histograms_
helper object for making and filling histograms
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:105
void fill(const std::string &name, const T &val)
Fill a 1D histogram.
TH1 * get(const std::string &name)
get a histogram from this pool by name
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
Result of fitting a pulse shape to the ADC samples of a single readout strip.
Implementation of a raw digitized hit from a silicon strip detector.
Full multi-trigger waveform for one silicon strip channel.
DQM for silicon strip data read from the DAQ: raw hits, pedestal subtracted hits, the waveforms assem...
void configure(framework::config::Parameters &parameters) override
Callback for the EventProcessor to configure itself from the given set of parameters.
void analyze(const framework::Event &event) override
Process the event and make histograms or summaries.
std::map< int, std::string > fit_amplitude_names_
fit amplitude histogram name by layer id
std::vector< TH1 * > getHists(const std::vector< std::string > &names)
histograms by name, looked up once per event
std::vector< std::string > raw_adc_names_
per-hybrid histogram names, built once