LDMX Software
QIEAnalyzer.cxx
Go to the documentation of this file.
1
9
10namespace trigscint {
11
12QIEAnalyzer::QIEAnalyzer(const std::string& name, framework::Process& process)
13 : Analyzer(name, process) {}
14
15void QIEAnalyzer::configure(framework::config::Parameters& parameters) {
16 input_col_ = parameters.get<std::string>("inputCollection");
17 input_pass_name_ = parameters.get<std::string>("inputPassName");
18 peds_ = parameters.get<std::vector<double> >("pedestals");
19 gain_ = parameters.get<std::vector<double> >("gain");
20 start_sample_ = parameters.get<int>("startSample");
21
22 ldmx_log(trace) << "In configure(), got parameters "
23 << "\n\t inputCollection = " << input_col_
24 << "\n\t inputPassName = " << input_pass_name_
25 << "\n\t startSample = " << start_sample_
26 << "\n\t pedestals[0] = " << peds_[0]
27 << "\n\t gain[0] = " << gain_[0] << "\t.";
28
29 return;
30}
31
32void QIEAnalyzer::analyze(const framework::Event& event) {
33 const auto channels{event.getCollection<trigscint::EventReadout>(
34 input_col_, input_pass_name_)};
35
36 int ev_nb = event.getEventNumber();
37 // while (evNb < 0 ) {
38 // ldmx_log(debug) << "event number = " << evNb << " < 0; incrementing event
39 // number "; evNb++;
40 //}
41 int num_chan = channels.size();
42 ldmx_log(debug) << "in event " << ev_nb << "; num_channels = " << num_chan;
43
44 for (auto chan : channels) {
45 std::vector<float> q = chan.getQ();
46 std::vector<float> q_err = chan.getQError();
47 std::vector<int> tdc = chan.getTDC();
48 // int nTimeSamp = q.size();
49 int bar = chan.getChanID();
50 float q_tot = 0;
51 float q_ped_subtracted_avg = 0;
52 int first_t = start_sample_ - 1;
53 int n_samp_above = 0;
54 int n_samp_above_event_ped = 0;
55 float subtr_pe = 0;
56 float subtr_q = 0;
57 float ped = chan.getPedestal();
58 for (int i_t = 0; i_t < q.size(); i_t++) {
59 ldmx_log(debug) << "in event " << ev_nb << "; channel " << bar
60 << ", got charge[" << i_t << "] = " << q.at(i_t);
61 if (ev_nb < n_ev_ && bar < n_channels_) {
62 // stick within the predefined histogram array
63 // h_out_[evNb][bar]->Fill(iT+start_sample_, q.at(iT));
64 h_out_[ev_nb][bar]->SetBinContent(i_t + start_sample_, q.at(i_t));
65 h_out_[ev_nb][bar]->SetBinError(i_t + start_sample_,
66 fabs(q_err.at(i_t)));
67 if (tdc.at(i_t) < 63) {
68 ldmx_log(info) << "Found fired TDC = " << tdc.at(i_t)
69 << " at time sample " << i_t << " in channel " << bar
70 << " and event " << ev_nb;
71 // for some reason, the style settings are washed out later...
72 h_out_[ev_nb][bar]->SetLineColor(kRed + 1);
73 h_out_[ev_nb][bar]->SetMarkerColor(
74 h_out_[ev_nb][bar]->GetLineColor());
75 h_out_[ev_nb][bar]->SetMarkerSize(0.2);
76
77 if (i_t + start_sample_ > 0)
78 h_tdc_fire_chan_vs_event_->Fill(bar, ev_nb, i_t + start_sample_);
79 else
80 h_tdc_fire_chan_vs_event_->Fill(bar, ev_nb);
81 }
82 } // if within the number of events to plot individually
83 if (q.at(i_t) > 2 * fabs(peds_[bar])) {
84 // integrate all charge well above
85 // ped to convert to a PE count
86 q_tot += q.at(i_t);
87 q_ped_subtracted_avg += q.at(i_t) - chan.getPedestal();
88 // peds_[ bar ];
89 n_samp_above++;
90 ldmx_log(debug) << " above channel overall pedestal: " << q.at(i_t)
91 << " > " << 2 * fabs(peds_[bar]);
92
93 // keep track of first time sample above threshold
94 if (first_t == start_sample_ - 1) first_t = start_sample_ + i_t;
95 } // if above threshold
96 if (q.at(i_t) > ped) {
97 subtr_q += q.at(i_t) - peds_[bar];
98 n_samp_above_event_ped++;
99 ldmx_log(debug) << " above channel event pedestal: " << q.at(i_t)
100 << " > " << ped;
101 } // if above channel event pedestal
102 } // over time samples
103 float pe = q_tot * 6250. / gain_[bar];
104 subtr_pe = subtr_q * 6250. / gain_[bar];
105 h_tot_q_vs_ped_[bar]->Fill(ped, q_tot);
106 h_pe_[bar]->Fill(pe);
107 h_pe_vs_t_[bar]->Fill(first_t, pe);
108 if (n_samp_above > 0) {
109 q_ped_subtracted_avg /= n_samp_above;
110 h_ped_subtracted_avg_q_vs_t_[bar]->Fill(first_t, q_ped_subtracted_avg);
111 h_avg_q_vs_t_[bar]->Fill(first_t, q_tot / n_samp_above);
112 }
113 // if (chan.getPedestal() < 40. ) {
114 // subtrQ = subtrPE/(6250./4.e6); //undo conversion
115 ldmx_log(debug) << "filling qTot histograms";
116 h_ped_subtracted_tot_q_vs_ped_[bar]->Fill(ped, subtr_q);
117 if (ped < 40) // avoid case where we have saturation and a plateau as much
118 // as possible
119 h_ped_subtracted_tot_q_vs_n_[bar]->Fill(n_samp_above_event_ped, subtr_q);
120 h_ped_subtracted_pe_vs_n_[bar]->Fill(n_samp_above_event_ped, subtr_pe);
121 h_ped_subtracted_pe_vs_t_[bar]->Fill(first_t, subtr_pe);
122 ldmx_log(debug) << " done filling qTot histograms";
123 // }
124 } // over channels
125
126 return;
127}
128
129void QIEAnalyzer::onProcessStart() {
130 ldmx_log(trace)
131 << "\n\n Process starts! My analyzer should do something -- like "
132 "print this \n\n";
133 getHistoDirectory();
134
135 int n_time_samp = 68; // 40
136 int p_emax = 100;
137 int n_p_ebins = 5 * p_emax;
138 float qmax = p_emax / (6250. / 4.e6);
139 float qmin = -10;
140 int n_qbins = (qmax - qmin) / 4;
141
142 ldmx_log(debug) << "Setting up histograms... ";
143
144 for (int i_b = 0; i_b < n_channels_; i_b++) {
145 h_pe_[i_b] = new TH1F(Form("h_pe_chan%i", i_b), Form(";PE, chan%i", i_b),
146 n_p_ebins, 0, p_emax);
147 h_pe_vs_t_[i_b] = new TH2F(
148 Form("h_pe_vs_t__chan%i", i_b),
149 Form(";First time sample above summing threshold;PE, chan%i", i_b),
150 n_time_samp + 1, -1.5, n_time_samp - 0.5, n_p_ebins, 0, p_emax);
151 h_ped_subtracted_avg_q_vs_t_[i_b] = new TH2F(
152 Form("hPedSubtrAvgQvsT_chan%i", i_b),
153 Form(";First time sample above threshold;Pedestal subtracted average "
154 "Q, chan%i [fC]",
155 i_b),
156 n_time_samp + 1, -1.5, n_time_samp - 0.5, n_qbins / 10, qmin,
157 qmax / 10.);
158 h_ped_subtracted_tot_q_vs_ped_[i_b] =
159 new TH2F(Form("hPedSubtrTotQvsPed_chan%i", i_b),
160 Form(";Channel event pedestal [fC];Event pedestal subtracted "
161 "total Q, chan%i [fC]",
162 i_b),
163 1010, qmin, 1000, 10010, -10,
164 10000); // nQbins/2,Qmin,Qmax/5., nQbins,Qmin,2*Qmax);
165 h_ped_subtracted_tot_q_vs_n_[i_b] =
166 new TH2F(Form("hPedSubtrTotQvsN_chan%i", i_b),
167 Form(";Number of time samples added; Event pedestal "
168 "subtracted total Q, chan%i [fC]",
169 i_b),
170 n_time_samp + 1, -1.5, n_time_samp - 0.5, 10010, -10, 10000);
171 h_tot_q_vs_ped_[i_b] = new TH2F(
172 Form("h_tot_q_vs_ped__chan%i", i_b),
173 Form(";Channel event pedestal [fC];Event total Q, chan%i [fC]", i_b),
174 1010, qmin, 1000, 10010, -10,
175 10000); // nQbins/2,Qmin,Qmax/5., nQbins,Qmin,2*Qmax);
176 h_ped_subtracted_pe_vs_n_[i_b] = new TH2F(
177 Form("hPedSubtrPEvsN_chan%i", i_b),
178 Form(";Number of time samples above threshold;Pedestal "
179 "subtracted PE, chan%i [fC]",
180 i_b),
181 n_time_samp + 1, -1.5, n_time_samp - 0.5, n_p_ebins, 0, p_emax);
182 h_ped_subtracted_pe_vs_t_[i_b] = new TH2F(
183 Form("hPedSubtrPEvsT_chan%i", i_b),
184 Form(";First time sample above threshold;Pedestal subtracted "
185 "PE, chan%i [fC]",
186 i_b),
187 n_time_samp + 1, -1.5, n_time_samp - 0.5, n_p_ebins, 0, p_emax);
188 h_avg_q_vs_t_[i_b] = new TH2F(
189 Form("h_avg_q_vs_t_chan%i", i_b),
190 Form(";First time sample above threshold;Average Q, chan%i [fC]", i_b),
191 n_time_samp + 1, -1.5, n_time_samp - 0.5, n_qbins / 10, qmin,
192 qmax / 10);
193 }
194
195 for (int i_e = 0; i_e < n_ev_; i_e++) {
196 for (int i_b = 0; i_b < n_channels_; i_b++) {
197 h_out_[i_e][i_b] =
198 new TH1F(Form("hCharge_chan%i_ev%i", i_b, i_e),
199 Form(";time sample; Q, channel %i, event %i [fC]", i_b, i_e),
200 n_time_samp, -0.5, n_time_samp - 0.5);
201 }
202 }
203
204 h_tdc_fire_chan_vs_event_ = new TH2F(
205 "h_tdc_fire_chan_vs_event", ";channel with TDC < 63;event number",
206 n_channels_, -0.5, n_channels_ - 0.5, n_ev_, 0, n_ev_);
207
208 ldmx_log(debug) << "done setting up histograms";
209
210 return;
211}
212
213void QIEAnalyzer::onProcessEnd() { return; }
214
215} // namespace trigscint
216
#define DECLARE_ANALYZER(CLASS)
Macro which allows the framework to construct an analyzer given its name during configuration.
Implements an event buffer system for storing event data.
Definition Event.h:42
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
This class represents the linearised QIE output from the trigger scintillator, in charge (fC).