18 #include "art_root_io/TFileService.h" 19 #include "art_root_io/TFileDirectory.h" 37 #include "TMultiGraph.h" 91 case 0:
return 8 +
id.Channel;
92 case 1:
return 12 +
id.Channel;
93 case 2:
return 4 +
id.Channel;
94 default:
return 99999;
112 fDumpChannels = pset.
get<std::vector<std::pair<unsigned int, std::string>>>(
"DumpChannels");
118 for (
auto ch : fDumpChannels)
dumpChannelMap[ch.first] = ch.second;
123 art::TFileDirectory
dir =
tfs->mkdir(
"Persistence");
125 hPersistence[ch.first] = dir.make<TH2D>(Form(
"hPersistence_channel%d",ch.first),
126 Form(
"Persistence (Channel %d);Time [ticks];ADC;",ch.first),
136 std::vector<art::Ptr<rawdata::RawBeamlineDigit>> digits;
137 std::vector<art::Ptr<rawdata::RawBeamlineDigit>> tofDigits;
138 std::vector<art::Ptr<rawdata::RawBeamlineDigit>> cherenkovDigits;
140 std::vector<art::Ptr<brb::BeamlineDigit>> recoDigits;
141 std::vector<art::Ptr<brb::BeamlineDigit>> recoToFDigits;
142 std::vector<art::Ptr<brb::BeamlineDigit>> recoCherenkovDigits;
153 digits.reserve(tofDigits.size() + cherenkovDigits.size());
154 digits.insert(digits.end(), tofDigits.begin(), tofDigits.end());
155 digits.insert(digits.end(), cherenkovDigits.begin(), cherenkovDigits.end());
166 recoDigits.reserve(recoToFDigits.size() + recoCherenkovDigits.size());
167 recoDigits.insert(recoDigits.end(), recoToFDigits.begin(), recoToFDigits.end());
168 recoDigits.insert(recoDigits.end(), recoCherenkovDigits.begin(), recoCherenkovDigits.end());
172 std::vector<art::Ptr<brb::ToF>> tofs;
177 if (digits.size() < 1)
return;
179 bool haveChannels =
false;
180 for (
auto d : digits) {
187 if (!haveChannels)
return;
189 for (
auto digit : digits) {
190 unsigned int signalchannel =
onlineChannel(digit->ChannelID());
194 for (
unsigned int i=0;
i<digit->NADC();
i++) {
200 art::TFileDirectory
dir =
tfs->mkdir(Form(
"Run%dSubRun%dEvent%d",e.
run(),e.
subRun(),e.
event()));
201 art::TFileDirectory hdir = dir.mkdir(
"Histograms");
203 TLegend *
leg =
new TLegend(0.70,0.20,0.88,0.60);
205 std::vector<TH1D*> waveforms;
206 std::vector<TGraph*> markers;
212 for (
auto digit : digits) {
213 unsigned int signalchannel =
onlineChannel(digit->ChannelID());
218 TH1D *waveform = hdir.make<TH1D>(Form(
"hr%ds%de%d_ch%d",e.
run(),e.
subRun(),e.
event(),signalchannel),
";Time [ticks];ADC;", digit->NADC(), 0, digit->NADC());
223 for (
unsigned int i=0;
i<digit->NADC();
i++) {
225 waveform->Fill(
i, digit->ADC(
i));
232 waveform->GetYaxis()->SetRangeUser(0,5000);
233 waveform->SetLineWidth(2);
234 leg->AddEntry(waveform, Form(
"Channel %d %s", signalchannel,
dumpChannelMap[signalchannel].c_str()),
"l");
235 waveforms.push_back(waveform);
238 std::vector<art::Ptr<brb::BeamlineDigit>> rds;
239 for (
auto rd : recoDigits) {
if (
onlineChannel(rd->ChannelID()) == signalchannel) rds.push_back(rd); }
240 if (rds.size() > 0) {
241 TGraph *
g =
new TGraph(rds.size() * 2);
242 for (
size_t i = 0;
i<rds.size();
i++) {
247 unsigned int startidx =
std::min((
unsigned int)1023, (
unsigned int)
std::max(0.0, (starttime/0.4)));
248 unsigned int peakidx =
std::min((
unsigned int)1023, (
unsigned int)
std::max(0.0, (peaktime/0.4)));
252 double startADC = digit->ADC(startidx);
253 double peakADC = digit->ADC(peakidx);
254 g->SetPoint(2*
i+0, starttime/0.4, startADC);
255 g->SetPoint(2*
i+1, peaktime/0.4, peakADC);
257 g->SetMarkerColor(1);
258 g->SetMarkerStyle(3);
260 markers.push_back(g);
266 TCanvas *
canvas = dir.make<TCanvas>(Form(
"cRun%dSubRun%dEvent%d",e.
run(),e.
subRun(),e.
event()),
"", 800, 600);
269 THStack *stack =
new THStack(Form(
"hsRun%dSubRun%dEvent%d",e.
run(),e.
subRun(),e.
event()), Form(
"hsRun%dSubRun%dEvent%d",e.
run(),e.
subRun(),e.
event()));
270 for (
auto w : waveforms) stack->Add(
w,
"hist");
271 stack->Draw(
"nostack hist PLC");
274 for (
auto g : markers)
g->Draw(
"same p");
278 for (
size_t i=0;
i<tofs.size();
i++) {
280 TLine *
l =
new TLine(tof->Timestamps().first/0.4, 4900 - 200*
i, tof->Timestamps().second/0.4, 4900 - 200*
i);
285 double tx = (tof->Timestamps().first + tof->Timestamps().second)/2.0/0.4;
286 double ty = 4900 - 200*
i + 50;
287 TText *
t =
new TText(tx, ty, Form(
"tof = %f ns", tof->Time()));
289 t->SetTextSize(0.02);
T max(const caf::Proxy< T > &a, T b)
EventNumber_t event() const
TCanvas * canvas(const char *nm, const char *ti, const char *a)
EDAnalyzer(fhicl::ParameterSet const &pset)
DEFINE_ART_MODULE(TestTMapFile)
double TimeCorrection(ChannelID channel) const
Relative timing calibrations between individual digitizer channels.
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Encapsulation of reconstructed digitizer 'hits'. Used for ToF PMTs and SiPMs, and Cherenkov and Muon ...
T get(std::string const &key) const
Encapsulation of reconstructed Time-of-Flight (ToF) information. Part of beamline reconstruction for ...
SubRunNumber_t subRun() const
Calibration service to provide specific externally-measured values to the relevant reconstruction/ana...
Raw data definitions for beamline data used in NOvA test beam experiment.
T min(const caf::Proxy< T > &a, T b)
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Encapsulation of reconstructed PID information from detectors in the beamline (ToF, WCs, Cherenkov). Part of beamline reconstruction for NOvA test beam.
Channel mapping service which may be used to interpret the channels which are read out by the various...