12 #include <framework/core/HistoModule.h>
13 #include <top/modules/TOPWaveformQualityPlotter/TOPWaveformQualityPlotterModule.h>
19 #include "TDirectory.h"
21 #include "TGraphErrors.h"
36 setDescription(
"TOP DQM histogram module");
37 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
38 "histogram directory in ROOT file",
string(
"TOP"));
39 addParam(
"drawWaves", m_DRAWWAVES,
"option to draw waveforms",
true);
40 addParam(
"debugHistos", m_DEBUGGING,
"option to draw debug histograms",
true);
41 addParam(
"noisemaps", m_NOISE,
"option to draw noisemaps",
false);
45 void TOPWaveformQualityPlotterModule::defineHisto()
47 TDirectory* oldDir = gDirectory;
48 m_directory = oldDir->mkdir(m_histogramDirectoryName.c_str());
50 m_samples =
new TH1F(
"ADCvalues",
"ADC values ", 100, -50, 50);
51 m_samples->GetXaxis()->SetTitle(
"ADC Value");
52 m_samples->GetYaxis()->SetTitle(
"Number of Samples");
53 m_scrod_id =
new TH1F(
"scrodID",
"scrodID", 100, 0, 100);
54 m_asic =
new TH1F(
"IRSX",
"IRSX", 4, 0, 4);
55 m_carrier =
new TH1F(
"carrier",
"asic col", 4, 0, 4);
56 m_asic_ch =
new TH1F(
"asicCh",
"channel", 8, 0, 8);
57 m_errorFlag =
new TH1F(
"errorFlag",
"errorFlag", 1000, 0, 1000);
58 m_asic_win =
new TH1F(
"window",
"window", 4, 0, 4);
59 m_entries =
new TH1F(
"entries",
"entries", 100, 0, 2600);
60 m_moduleID =
new TH1F(
"moduleID",
"moduleID", 16, 1, 17);
61 m_pixelID =
new TH1F(
"pixelID",
"pixelID", 512, 1, 513);
66 void TOPWaveformQualityPlotterModule::initialize()
71 m_waveform.isRequired();
75 void TOPWaveformQualityPlotterModule::basicDebuggingPlots(
const TOPRawWaveform& v)
77 int scrodid = v.getScrodID();
78 int asicid = v.getASICNumber();
79 int channelid = v.getASICChannel();
80 int carrierid = v.getCarrierNumber();
81 m_scrod_id->Fill(scrodid);
82 m_asic_ch->Fill(channelid);
84 m_carrier->Fill(carrierid);
85 m_asic_win->Fill(v.getStorageWindow());
86 m_entries->Fill(v.getWaveform().size());
87 m_moduleID->Fill(v.getModuleID());
88 m_pixelID->Fill(v.getPixelID());
90 if (m_hitmap.find(scrodid) == m_hitmap.end()) {
91 m_hitmap[scrodid] =
new TH2F((
string(
"scrod ") + to_string(scrodid) +
string(
"Hitmap")).c_str(),
92 (
string(
"scrod ") + to_string(scrodid) +
string(
"carrier vs. asic;asic;carrier")).c_str(), 4, 0, 4, 4, 0, 4);
94 m_hitmap[scrodid]->Fill(asicid, carrierid);
95 const vector<short>& waveform = v.getWaveform();
96 if (waveform.empty()) {
99 for (
short adc : waveform) {
100 m_samples->Fill(adc);
107 vector<short> waveform = v.getWaveform();
108 if (waveform.empty()) {
111 int scrodid = v.getScrodID();
116 int asicNumber = v.getASICNumber();
117 int carrierNumber = v.getCarrierNumber();
118 int iChannel = v.getASICChannel();
119 string gname = string(
"scrod_") + to_string(scrodid) + string(
"_carrier") + to_string(carrierNumber) + string(
"_asic") + to_string(
120 asicNumber) + to_string(iChannel);
121 if (m_waveformHists[scrodid][carrierNumber][asicNumber].find(iChannel) ==
122 m_waveformHists[scrodid][carrierNumber][asicNumber].end()) {
124 auto h =
new TProfile(gname.c_str(), gname.c_str(), 256, 0, 256);
126 m_waveformHists[scrodid][carrierNumber][asicNumber][iChannel] = h;
129 for (
size_t i = 0; i < 256; ++i) {
131 if (i >= waveform.size()) {
134 m_waveformHists[scrodid][carrierNumber][asicNumber][iChannel]->Fill(i + 0.5, iChannel * 1500 + waveform[i]);
139 void TOPWaveformQualityPlotterModule::event()
141 if (not m_waveform) {
144 for (
auto evtwave : m_waveform) {
146 drawWaveforms(evtwave);
149 basicDebuggingPlots(evtwave);
152 auto channelID = evtwave.getChannel();
153 const vector<short> v_samples = evtwave.getWaveform();
154 size_t nsamples = v_samples.size();
155 if (m_channelNoiseMap.find(channelID) == m_channelNoiseMap.end()) {
156 string idName = string(
"noise_") + to_string(channelID);
157 m_channelNoiseMap.insert(make_pair(channelID,
new TH1F(idName.c_str(), idName.c_str(), 200, -100, 100)));
158 m_channelEventMap.insert(make_pair(channelID, m_iEvent));
160 TH1F* noise = m_channelNoiseMap[channelID];
162 for (
size_t s = 0; s < nsamples; s++) {
163 double adc = v_samples.at(s);
164 m_samples->Fill(adc);
165 if (s < nsamples - 1) {
166 noise->Fill(v_samples[s + 1] - adc);
175 void TOPWaveformQualityPlotterModule::endRun()
183 for (
auto scrod_it : m_waveformHists) {
184 int scrodid = scrod_it.first;
185 string name = string(
"scrod_") + to_string(scrodid);
186 TCanvas* c =
new TCanvas(name.c_str(), name.c_str());
189 for (
auto carrier_it : scrod_it.second) {
190 int carrierNumber = carrier_it.first;
191 for (
auto asic_it : carrier_it.second) {
192 int asicNumber = asic_it.first;
194 string gname = string(
"scrod_") + to_string(scrodid) + string(
"_carrier") + to_string(carrierNumber) + string(
"_asic") + to_string(
196 TMultiGraph* mg =
new TMultiGraph(gname.c_str(), gname.c_str());
197 for (
auto channel_it : asic_it.second) {
199 TGraphErrors* g =
new TGraphErrors(channel_it.second);
200 g->SetMarkerStyle(7);
204 TH2F* h =
new TH2F(gname.c_str(), gname.c_str(), 256, 0, 256, 8, -500, -500 + 8 * 1500);
205 for (
int ibin = 0; ibin < 8; ibin++) {
206 h->GetYaxis()->SetBinLabel(ibin + 1, to_string(ibin).c_str());
208 h->GetYaxis()->SetTickSize(0);
209 h->GetYaxis()->SetTickLength(0);
216 m_directory->WriteTObject(c);