Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
JEventProcessor_TAGM_online.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: JEventProcessor_FCAL_online.cc
4 // Created: Fri Nov 9 11:58:09 EST 2012
5 // Creator: wolin (on Linux stan.jlab.org 2.6.32-279.11.1.el6.x86_64 x86_64)
6 
7 
8 #include <stdint.h>
9 #include <vector>
10 #include <TMath.h>
11 
12 
14 #include <JANA/JApplication.h>
15 
16 using namespace std;
17 using namespace jana;
18 
19 #include <TAGGER/DTAGMHit.h>
20 #include <TAGGER/DTAGMDigiHit.h>
21 #include <TAGGER/DTAGMTDCDigiHit.h>
22 #include <TDirectory.h>
23 #include <TH1.h>
24 #include <TH2.h>
25 
26 // Define some constants
27 //const uint32_t NROWS = 5;
28 const uint32_t NCOLUMNS = 102;
29 const uint32_t NSINGLES = 20;
30 
31 const float MIN_ADC_PINT_LOG10 = 0.;
32 const float MAX_ADC_PINT_LOG10 = 5.;
33 const uint32_t BINCOUNT_ADC_PINT = 200;
34 //const float ADC_PINT_PER_PIXEL = 6.5;
35 const float MIN_HIT_NPIX = 0.;
36 const float MAX_HIT_NPIX = 1000.;
37 const uint32_t BINCOUNT_HIT_NPIX = 200;
38 
39 const float MIN_ADC_TIME = 0.;
40 const float MAX_ADC_TIME = 16000.;
41 const uint32_t BINCOUNT_ADC_TIME = 16000;
42 const float_t ADC_NS_PER_COUNT = 0.0625;
43 const float MIN_HIT_TADC = 0.;
44 const float MAX_HIT_TADC = 1000.;
45 const uint32_t BINCOUNT_HIT_TADC = 16000;
46 const float MIN_HIT_TIME = 0.;
47 const float MAX_HIT_TIME = 4000.;
48 const uint32_t BINCOUNT_HIT_TIME = 65000;
49 
50 const float MIN_TDC_TIME = 0.;
51 const float MAX_TDC_TIME = 65000.;
52 const uint32_t BINCOUNT_TDC_TIME = 65000;
53 const float_t TDC_NS_PER_COUNT = 0.060;
54 
55 const float MIN_ADC_PED = 0.;
56 const float MAX_ADC_PED = 800.;
57 const uint32_t BINCOUNT_ADC_PED = 800;
58 
59 const float MIN_ADC_QF = 0.;
60 const float MAX_ADC_QF = 4.;
61 const uint32_t BINCOUNT_ADC_QF = 5;
62 
63 const float MIN_ADC_NSI = 0.;
64 const float MAX_ADC_NSI = 150.;
65 const uint32_t BINCOUNT_ADC_NSI = 151;
66 
67 const float MIN_ADC_NSP = 0.;
68 const float MAX_ADC_NSP = 20.;
69 const uint32_t BINCOUNT_ADC_NSP = 21;
70 
71 // DTAGDigiHit histogram pointers
77 static TH1F *tagm_adc_ped, *tagms_adc_ped;
79 static TH1F *tagm_adc_qf, *tagms_adc_qf;
81 static TH1F *tagm_adc_nsi, *tagms_adc_nsi;
83 static TH1F *tagm_adc_nsp, *tagms_adc_nsp;
87 
88 // DSCTDCDigiHit histogram pointers
92 
93 // DTAGMHit histogram pointers
102 
103 // Dynamic arrays of histogram pointers
104 TH1F** tagm_adc_pint_col = new TH1F*[NCOLUMNS];
105 TH1F** tagm_adc_time_col = new TH1F*[NCOLUMNS];
106 TH1F** tagm_adc_ped_col = new TH1F*[NCOLUMNS];
107 TH1F** tagm_adc_qf_col = new TH1F*[NCOLUMNS];
108 TH1F** tagm_tdc_time_col = new TH1F*[NCOLUMNS];
109 TH1F** tagm_adc_mult_col = new TH1F*[NCOLUMNS];
110 TH1F** tagm_tdc_mult_col = new TH1F*[NCOLUMNS];
111 TH1F** tagm_hit_time_col = new TH1F*[NCOLUMNS];
112 
113 TH1F** tagms_adc_pint_sng = new TH1F*[NSINGLES];
114 TH1F** tagms_adc_time_sng = new TH1F*[NSINGLES];
115 TH1F** tagms_adc_ped_sng = new TH1F*[NSINGLES];
116 TH1F** tagms_adc_qf_sng = new TH1F*[NSINGLES];
117 TH1F** tagms_tdc_time_sng = new TH1F*[NSINGLES];
118 TH1F** tagms_adc_mult_sng = new TH1F*[NSINGLES];
119 TH1F** tagms_tdc_mult_sng = new TH1F*[NSINGLES];
120 TH1F** tagms_hit_time_sng = new TH1F*[NSINGLES];
121 
122 // Number of events histogram pointer
123 static TH1F *tagm_num_events;
124 
125 // Time difference histograms
128 
129 // Multiplicity histograms
130 static TH1F *tagm_adc_mult;
131 static TH1F *tagm_tdc_mult;
134 static TH2F *tagm_adc_tdc_mult;
135 
136 
137 //----------------------------------------------------------------------------------
138 
139 
140 // Routine used to create our JEventProcessor
141 extern "C"{
142  void InitPlugin(JApplication *app) {
143  InitJANAPlugin(app);
144  app->AddProcessor(new JEventProcessor_TAGM_online());
145  }
146 }
147 
148 
149 //----------------------------------------------------------------------------------
150 
151 
153 }
154 
155 
156 //----------------------------------------------------------------------------------
157 
158 
160 }
161 
162 
163 //----------------------------------------------------------------------------------
164 
166 
167 
168  // create root folder for tagm and cd to it, store main dir
169  TDirectory *main = gDirectory;
170  TDirectory *tagmdir = gDirectory->mkdir("tagm");
171  tagmdir->cd();
172 
173  // Book DTAGMDigiHit histosgrams
174  tagm_adc_seen = new TH1F("tagm_adc_seen",
175  "TAGM FADC250 column occupancy",
176  NCOLUMNS, 0., NCOLUMNS + 1.);
177  tagm_adc_pint = new TH1F("tagm_adc_pint",
178  "TAGM FADC250 pulse integral (log10)",
181  tagm_adc_pint_2d = new TH2F("tagm_adc_pint_2d",
182  "TAGM FADC250 pulse integral (log10) vs column",
183  NCOLUMNS, 0., NCOLUMNS + 1.,
186  tagm_adc_time = new TH1F("tagm_adc_time",
187  "TAGM FADC250 pulse time counter",
189  tagm_adc_time_2d = new TH2F("tagm_adc_time_2d",
190  "TAGM FADC250 pulse time counter vs column",
191  NCOLUMNS, 0., NCOLUMNS + 1.,
193  tagm_adc_ped = new TH1F("tagm_adc_ped",
194  "TAGM FADC250 pulse pedestal",
196  tagm_adc_ped_2d = new TH2F("tagm_adc_ped_2d",
197  "TAGM FADC250 pulse pedestal vs column",
198  NCOLUMNS, 0., NCOLUMNS + 1.,
200  tagm_adc_qf = new TH1F("tagm_adc_qf",
201  "TAGM FADC250 quality factor",
203  MIN_ADC_QF - 0.5, MAX_ADC_QF + 0.5);
204  tagm_adc_qf_2d = new TH2F("tagm_adc_qf_2d",
205  "TAGM FADC250 quality factor vs column",
206  NCOLUMNS, 0., NCOLUMNS + 1.,
208  MIN_ADC_QF - 0.5, MAX_ADC_QF + 0.5);
209  tagm_adc_nsi = new TH1F("tagm_adc_nsi",
210  "TAGM number of samples used in pulse integral",
212  MIN_ADC_NSI - 0.5, MAX_ADC_NSI + 0.5);
213  tagm_adc_nsi_2d = new TH2F("tagm_adc_nsi_2d",
214  "TAGM samples used in pulse integral vs column",
215  NCOLUMNS, 0., NCOLUMNS + 1.0,
217  MIN_ADC_NSI - 0.5, MAX_ADC_NSI + 0.5);
218  tagm_adc_nsp = new TH1F("tagm_adc_nsp",
219  "TAGM number of samples used in pulse pedestal",
221  MIN_ADC_NSP - 0.5, MAX_ADC_NSP + 0.5);
222  tagm_adc_nsp_2d = new TH2F("tagm_adc_nsp_2d",
223  "TAGM samples used in pulse pedestal vs column",
224  NCOLUMNS, 0., NCOLUMNS + 1.,
226  MIN_ADC_NSP - 0.5, MAX_ADC_NSP + 0.5);
227  tagm_adc_pint_nsi = new TH2F("tagm_adc_pint_nsi",
228  "TAGM pulse integral (log10) vs number of samples",
230  MIN_ADC_NSI - 0.5, MAX_ADC_NSI + 0.5,
233  tagm_adc_ped_nsp = new TH2F("tagm_adc_ped_nsp",
234  "TAGM pulse pedestal vs pedestal samples",
236  MIN_ADC_NSP - 0.5, MAX_ADC_NSP + 0.5,
238 
239  // Book DTAGMTDCDigiHit histosgrams
240  tagm_tdc_seen = new TH1F("tagm_tdc_seen",
241  "TAGM F1TDC column occupancy",
242  NCOLUMNS, 0., NCOLUMNS + 1.);
243  tagm_tdc_time = new TH1F("tagm_tdc_time",
244  "TAGM F1TDC pulse time counter",
246  tagm_tdc_time_2d = new TH2F("tagm_tdc_time_2d",
247  "TAGM F1TDC pulse time counter vs column",
248  NCOLUMNS, 0., NCOLUMNS + 1.,
250 
251  // Book DTAGMHit histosgrams
252  tagm_hit_seen = new TH1F("tagm_hit_seen",
253  "TAGM hit column occupancy",
254  NCOLUMNS, 0., NCOLUMNS + 1.);
255  tagm_hit_npix = new TH1F("tagm_hit_npix",
256  "TAGM hit pulse height (pixels)",
258  tagm_hit_npix_2d = new TH2F("tagm_hit_npix_2d",
259  "TAGM hit pulse height (pixels) vs column",
260  NCOLUMNS, 0., NCOLUMNS + 1.,
262  tagm_hit_tadc = new TH1F("tagm_hit_tadc",
263  "TAGM hit pulse time (ns)",
265  tagm_hit_tadc_2d = new TH2F("tagm_hit_tadc_2d",
266  "TAGM hit pulse time (ns) vs column",
267  NCOLUMNS, 0., NCOLUMNS + 1.,
269  tagm_hit_time = new TH1F("tagm_hit_time",
270  "TAGM hit discriminator time (ns)",
272  tagm_hit_time_2d = new TH2F("tagm_hit_time_2d",
273  "TAGM hit discriminator time (ns) vs column",
274  NCOLUMNS, 0., NCOLUMNS + 1.,
276  tagm_hit_time_tadc = new TH2F("tagm_hit_time_tadc",
277  "TAGM pulse time vs discriminator time (ns)",
278  1000, MIN_HIT_TIME, MAX_HIT_TIME,
279  1000, MIN_HIT_TADC, MAX_HIT_TADC);
280 
281  // Book dynamic arrays of histograms
282  TDirectory *adc_pint_dir = gDirectory->mkdir("tagm_adc_pint_col");
283  TDirectory *adc_time_dir = gDirectory->mkdir("tagm_adc_time_col");
284  TDirectory *adc_ped_dir = gDirectory->mkdir("tagm_adc_ped_col");
285  TDirectory *adc_qf_dir = gDirectory->mkdir("tagm_adc_qf_col");
286  TDirectory *tdc_time_dir = gDirectory->mkdir("tagm_tdc_time_col");
287  TDirectory *adc_mult_dir = gDirectory->mkdir("tagm_adc_mult_col");
288  TDirectory *tdc_mult_dir = gDirectory->mkdir("tagm_tdc_mult_col");
289  TDirectory *hit_time_dir = gDirectory->mkdir("tagm_hit_time_col");
290  for (unsigned int i = 0; i < NCOLUMNS; i++) {
291  adc_pint_dir->cd();
292  tagm_adc_pint_col[i] = new TH1F(Form("tagm_adc_pint_col_%i", i+1),
293  Form("FADC250 pulse integral (log10)"
294  " for TAGM column %i", i+1),
297  adc_time_dir->cd();
298  tagm_adc_time_col[i] = new TH1F(Form("tagm_adc_time_col_%i", i+1),
299  Form("FADC250 pulse time counter"
300  " for TAGM column %i", i+1),
303  adc_ped_dir->cd();
304  tagm_adc_ped_col[i] = new TH1F(Form("tagm_adc_ped_col_%i", i+1),
305  Form("FADC250 pulse pedestal"
306  " for TAGM column %i", i+1),
309  adc_qf_dir->cd();
310  tagm_adc_qf_col[i] = new TH1F(Form("tagm_adc_qf_col_%i", i+1),
311  Form("FADC250 pulse QF"
312  " for TAGM column %i", i+1),
314  MIN_ADC_QF - 0.5, MAX_ADC_QF + 0.5);
315  tdc_time_dir->cd();
316  tagm_tdc_time_col[i] = new TH1F(Form("tagm_tdc_time_col_%i", i+1),
317  Form("F1TDC hit time counter"
318  " for TAGM column %i", i+1),
321  adc_mult_dir->cd();
322  tagm_adc_mult_col[i] = new TH1F(Form("tagm_adc_mult_col_%i", i+1),
323  Form("FADC250 pulse multiplicity"
324  " for TAGM column %i", i+1),
325  10, 0., 10.);
326  tdc_mult_dir->cd();
327  tagm_tdc_mult_col[i] = new TH1F(Form("tagm_tdc_mult_col_%i", i+1),
328  Form("F1TDC hit multiplicity"
329  " for TAGM column %i", i+1),
330  10, 0., 10.);
331  hit_time_dir->cd();
332  tagm_hit_time_col[i] = new TH1F(Form("tagm_hit_time_col_%i", i+1),
333  Form("hit time for TAGM column %i", i+1),
336  }
337  tagmdir->cd();
338 
339  // Book time difference histograms
340  tagm_hit_tdiff = new TH1F("tagm_hit_tdiff",
341  "TAGM TDC-ADC hit time difference, nearby pairs",
342  2*BINCOUNT_HIT_TIME/100,
343  -MAX_HIT_TIME/100., MAX_HIT_TIME/100.);
344  tagm_tdc_tdiff_all = new TH1F("tagm_tdc_tdiff_all",
345  "TAGM F1TDC time difference, all pairs",
348 
349  // Book multiplicity histograms
350  tagm_tdc_mult = new TH1F("tagm_tdc_mult",
351  "TAGM F1TDC multiplicity",
352  10, 0.5, 10.5);
353  tagm_adc_mult = new TH1F("tagm_adc_mult",
354  "TAGM FADC250 multiplicity",
355  10, 0.5, 10.5);
356  tagm_adc_mult_2d = new TH2F("tagm_adc_mult_2d",
357  "TAGM FADC250 multiplicity vs column",
358  NCOLUMNS, 0., NCOLUMNS + 1., 10, 0.5, 10.5);
359  tagm_tdc_mult_2d = new TH2F("tagm_tdc_mult_2d",
360  "TAGM F1TDC multiplicity vs column",
361  NCOLUMNS, 0., NCOLUMNS + 1., 10, 0.5, 10.5);
362  tagm_adc_tdc_mult = new TH2F("tagm_adc_tdc_mult",
363  "TAGM FADC250 vs. F1TDC multiplicity",
364  10, 0.5, 10.5, 10, 0.5, 10.5);
365 
366  // Book total number of events histogram
367  tagm_num_events = new TH1F("tagm_num_events",
368  "TAGM number of events", 1, 0.5, 1.5);
369 
370  // Book histograms for individual fiber channels
371  TDirectory *singles_dir = gDirectory->mkdir("singles (low-gain only)");
372  singles_dir->cd();
373  tagms_adc_seen = new TH1F("tagms_adc_seen",
374  "TAGM FADC250 singles occupancy",
375  NSINGLES, 0., NSINGLES + 1.);
376  tagms_adc_pint = new TH1F("tagms_adc_pint",
377  "TAGM FADC250 pulse integral (log10)",
380  tagms_adc_pint_2d = new TH2F("tagms_adc_pint_2d",
381  "TAGM FADC250 pulse integral (log10) vs fiber no.",
382  NSINGLES, 0., NSINGLES + 1.,
385  tagms_adc_time = new TH1F("tagms_adc_time",
386  "TAGM FADC250 pulse time counter",
388  tagms_adc_time_2d = new TH2F("tagms_adc_time_2d",
389  "TAGM FADC250 pulse time counter vs fiber no.",
390  NSINGLES, 0., NSINGLES + 1.,
392  tagms_adc_ped = new TH1F("tagms_adc_ped",
393  "TAGM FADC250 pulse pedestal",
395  tagms_adc_ped_2d = new TH2F("tagms_adc_ped_2d",
396  "TAGM FADC250 pulse pedestal vs fiber no.",
397  NSINGLES, 0., NSINGLES + 1.,
399  tagms_adc_qf = new TH1F("tagms_adc_qf",
400  "TAGM FADC250 quality factor",
402  MIN_ADC_QF - 0.5, MAX_ADC_QF + 0.5);
403  tagms_adc_qf_2d = new TH2F("tagms_adc_qf_2d",
404  "TAGM FADC250 quality factor vs fiber no.",
405  NSINGLES, 0., NSINGLES + 1.,
407  MIN_ADC_QF - 0.5, MAX_ADC_QF + 0.5);
408  tagms_adc_nsi = new TH1F("tagms_adc_nsi",
409  "TAGM number of samples used in pulse integral",
411  MIN_ADC_NSI - 0.5, MAX_ADC_NSI + 0.5);
412  tagms_adc_nsi_2d = new TH2F("tagms_adc_nsi_2d",
413  "TAGM samples used in pulse integral vs fiber no.",
414  NSINGLES, 0., NSINGLES + 1.0,
416  MIN_ADC_NSI - 0.5, MAX_ADC_NSI + 0.5);
417  tagms_adc_nsp = new TH1F("tagms_adc_nsp",
418  "TAGM number of samples used in pulse pedestal",
420  MIN_ADC_NSP - 0.5, MAX_ADC_NSP + 0.5);
421  tagms_adc_nsp_2d = new TH2F("tagms_adc_nsp_2d",
422  "TAGM samples used in pulse pedestal vs fiber no.",
423  NSINGLES, 0., NSINGLES + 1.,
425  MIN_ADC_NSP - 0.5, MAX_ADC_NSP + 0.5);
426  tagms_adc_pint_nsi = new TH2F("tagms_adc_pint_nsi",
427  "TAGM pulse integral (log10) vs number of samples",
429  MIN_ADC_NSI - 0.5, MAX_ADC_NSI + 0.5,
432  tagms_adc_ped_nsp = new TH2F("tagms_adc_ped_nsp",
433  "TAGM pulse pedestal vs pedestal samples",
435  MIN_ADC_NSP - 0.5, MAX_ADC_NSP + 0.5,
437 
438  // Book DTAGMTDCDigiHit histosgrams
439  tagms_tdc_seen = new TH1F("tagms_tdc_seen",
440  "TAGM F1TDC column occupancy",
441  NSINGLES, 0., NSINGLES + 1.);
442  tagms_tdc_time = new TH1F("tagms_tdc_time",
443  "TAGM F1TDC pulse time counter",
445  tagms_tdc_time_2d = new TH2F("tagms_tdc_time_2d",
446  "TAGM F1TDC pulse time counter vs fiber no.",
447  NSINGLES, 0., NSINGLES + 1.,
449 
450  // Book DTAGMHit histosgrams
451  tagms_hit_seen = new TH1F("tagms_hit_seen",
452  "TAGM hit fiber no. occupancy",
453  NSINGLES, 0., NSINGLES + 1.);
454  tagms_hit_npix = new TH1F("tagms_hit_npix",
455  "TAGM hit pulse height (pixels)",
457  tagms_hit_npix_2d = new TH2F("tagms_hit_npix_2d",
458  "TAGM hit pulse height (pixels) vs fiber no.",
459  NSINGLES, 0., NSINGLES + 1.,
461  tagms_hit_tadc = new TH1F("tagms_hit_tadc",
462  "TAGM hit pulse time (ns)",
464  tagms_hit_tadc_2d = new TH2F("tagms_hit_tadc_2d",
465  "TAGM hit pulse time (ns) vs fiber no.",
466  NSINGLES, 0., NSINGLES + 1.,
468  tagms_hit_time = new TH1F("tagms_hit_time",
469  "TAGM hit discriminator time (ns)",
471  tagms_hit_time_2d = new TH2F("tagms_hit_time_2d",
472  "TAGM hit discriminator time (ns) vs fiber no.",
473  NSINGLES, 0., NSINGLES + 1.,
475  tagms_hit_time_tadc = new TH2F("tagms_hit_time_tadc",
476  "TAGM pulse time vs discriminator time (ns)",
477  1000, MIN_HIT_TIME, MAX_HIT_TIME,
478  1000, MIN_HIT_TADC, MAX_HIT_TADC);
479 
480  // Book dynamic arrays of histograms
481  TDirectory *adc_pint_sdir = gDirectory->mkdir("tagms_adc_pint_sng");
482  TDirectory *adc_time_sdir = gDirectory->mkdir("tagms_adc_time_sng");
483  TDirectory *adc_ped_sdir = gDirectory->mkdir("tagms_adc_ped_sng");
484  TDirectory *adc_qf_sdir = gDirectory->mkdir("tagms_adc_qf_sng");
485  TDirectory *tdc_time_sdir = gDirectory->mkdir("tagms_tdc_time_sng");
486  TDirectory *adc_mult_sdir = gDirectory->mkdir("tagms_adc_mult_sng");
487  TDirectory *tdc_mult_sdir = gDirectory->mkdir("tagms_tdc_mult_sng");
488  TDirectory *hit_time_sdir = gDirectory->mkdir("tagms_hit_time_sng");
489  for (unsigned int i = 0; i < NSINGLES; i++) {
490  adc_pint_sdir->cd();
491  tagms_adc_pint_sng[i] = new TH1F(Form("tagms_adc_pint_sng_%i", i+1),
492  Form("FADC250 pulse integral (log10)"
493  " for TAGM fiber no. %i", i+1),
496  adc_time_sdir->cd();
497  tagms_adc_time_sng[i] = new TH1F(Form("tagms_adc_time_sng_%i", i+1),
498  Form("FADC250 pulse time counter"
499  " for TAGM fiber no. %i", i+1),
502  adc_ped_sdir->cd();
503  tagms_adc_ped_sng[i] = new TH1F(Form("tagms_adc_ped_sng_%i", i+1),
504  Form("FADC250 pulse pedestal"
505  " for TAGM fiber no. %i", i+1),
508  adc_qf_sdir->cd();
509  tagms_adc_qf_sng[i] = new TH1F(Form("tagms_adc_qf_sng_%i", i+1),
510  Form("FADC250 pulse QF"
511  " for TAGM fiber no. %i", i+1),
513  MIN_ADC_QF - 0.5, MAX_ADC_QF + 0.5);
514  tdc_time_sdir->cd();
515  tagms_tdc_time_sng[i] = new TH1F(Form("tagms_tdc_time_sng_%i", i+1),
516  Form("F1TDC hit time counter"
517  " for TAGM fiber no. %i", i+1),
520  adc_mult_sdir->cd();
521  tagms_adc_mult_sng[i] = new TH1F(Form("tagms_adc_mult_sng_%i", i+1),
522  Form("FADC250 pulse multiplicity"
523  " for TAGM fiber no. %i", i+1),
524  10, 0., 10.);
525  tdc_mult_sdir->cd();
526  tagms_tdc_mult_sng[i] = new TH1F(Form("tagms_tdc_mult_sng_%i", i+1),
527  Form("F1TDC hit multiplicity"
528  " for TAGM fiber no. %i", i+1),
529  10, 0., 10.);
530  hit_time_sdir->cd();
531  tagms_hit_time_sng[i] = new TH1F(Form("tagms_hit_time_sng_%i", i+1),
532  Form("hit time for TAGM fiber no. %i", i+1),
535  }
536  singles_dir->cd();
537 
538  // Book time difference histograms
539  tagms_hit_tdiff = new TH1F("tagms_hit_tdiff",
540  "TAGM TDC-ADC hit time difference, nearby pairs",
541  2*BINCOUNT_HIT_TIME/100,
542  -MAX_HIT_TIME/100., MAX_HIT_TIME/100.);
543  tagms_tdc_tdiff_all = new TH1F("tagms_tdc_tdiff_all",
544  "TAGM F1TDC time difference, all pairs",
547 
548  // Book multiplicity histograms
549  tagms_adc_mult_2d = new TH2F("tagms_adc_mult_2d",
550  "TAGM FADC250 multiplicity vs fiber no.",
551  NSINGLES, 0., NSINGLES + 1., 10, 0.5, 10.5);
552  tagms_tdc_mult_2d = new TH2F("tagms_tdc_mult_2d",
553  "TAGM F1TDC multiplicity vs fiber no.",
554  NSINGLES, 0., NSINGLES + 1., 10, 0.5, 10.5);
555 
556  // back to main dir
557  main->cd();
558 
559  return NOERROR;
560 }
561 
562 
563 //----------------------------------------------------------------------------------
564 
565 
566 jerror_t JEventProcessor_TAGM_online::brun(JEventLoop *eventLoop, int32_t runnumber) {
567  // This is called whenever the run number changes
568  return NOERROR;
569 }
570 
571 
572 //----------------------------------------------------------------------------------
573 
574 
575 jerror_t JEventProcessor_TAGM_online::evnt(JEventLoop *eventLoop, uint64_t eventnumber) {
576  // This is called for every event. Use of common resources like writing
577  // to a file or filling a histogram should be mutex protected. Using
578  // loop-Get(...) to get reconstructed objects (and thereby activating the
579  // reconstruction algorithm) should be done outside of any mutex lock
580  // since multiple threads may call this method at the same time.
581 
582  std::vector<const DTAGMDigiHit*> digihits; // FADC250 DigiHits
583  std::vector<const DTAGMTDCDigiHit*> tdcdigihits; // F1TDC DigiHits
584  std::vector<const DTAGMHit*> hits; // hits
585  eventLoop->Get(digihits);
586  eventLoop->Get(tdcdigihits);
587  eventLoop->Get(hits, "Calib");
588 
589  // FILL HISTOGRAMS
590  // Since we are filling histograms local to this plugin, it will not interfere with other ROOT operations: can use plugin-wide ROOT fill lock
591  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
592 
593  // Histogram the total number of events
594  if( (digihits.size()>0) || (tdcdigihits.size()>0) )
595  tagm_num_events->Fill(1);
596 
597  // Histogram the ADC and TDC multiplicities
598  tagm_adc_mult->Fill(digihits.size());
599  tagm_tdc_mult->Fill(tdcdigihits.size());
600  tagm_adc_tdc_mult->Fill(tdcdigihits.size(), digihits.size());
601 
602  // Prepare multiplicity counters
603  int column_adc_hits[NCOLUMNS];
604  int column_tdc_hits[NCOLUMNS];
605  for (unsigned int i=0; i < NCOLUMNS; ++i)
606  column_adc_hits[i] = column_tdc_hits[i] = 0;
607  int column_adc_hits_total = 0;
608  int column_tdc_hits_total = 0;
609 
610  // DTAGMDigiHits
611  std::vector<const DTAGMDigiHit*>::iterator iter;
612  for (iter = digihits.begin(); iter != digihits.end(); ++iter) {
613  int row = (*iter)->row;
614  int column = (*iter)->column;
615  uint32_t pedestal_avg;
616  if ((*iter)->nsamples_pedestal == 0)
617  pedestal_avg = (*iter)->pedestal;
618  else
619  pedestal_avg = (*iter)->pedestal / (*iter)->nsamples_pedestal;
620  if (row == 0) {
621 
622  // Fill 1D Histograms
623  tagm_adc_seen->Fill((*iter)->column);
624  tagm_adc_pint->Fill(log10((*iter)->pulse_integral));
625  tagm_adc_time->Fill((*iter)->pulse_time);
626  tagm_adc_ped->Fill(pedestal_avg);
627  tagm_adc_qf->Fill((*iter)->QF);
628  tagm_adc_nsi->Fill((*iter)->nsamples_integral);
629  tagm_adc_nsp->Fill((*iter)->nsamples_pedestal);
630 
631  // Fill 2D histograms
632  tagm_adc_pint_2d->Fill(column, log10((*iter)->pulse_integral));
633  tagm_adc_time_2d->Fill(column, (*iter)->pulse_time);
634  tagm_adc_ped_2d->Fill(column, pedestal_avg);
635  tagm_adc_qf_2d->Fill(column, (*iter)->QF);
636  tagm_adc_nsi_2d->Fill(column, (*iter)->nsamples_integral);
637  tagm_adc_nsp_2d->Fill(column, (*iter)->nsamples_pedestal);
638  tagm_adc_pint_nsi->Fill((*iter)->nsamples_integral,
639  log10((*iter)->pulse_integral));
640  tagm_adc_ped_nsp->Fill((*iter)->nsamples_pedestal,
641  pedestal_avg);
642 
643  // Fill dynamic array of histograms
644  tagm_adc_pint_col[column - 1]->Fill(log10((*iter)->pulse_integral));
645  tagm_adc_time_col[column - 1]->Fill((*iter)->pulse_time);
646  tagm_adc_ped_col[column - 1]->Fill(pedestal_avg);
647  tagm_adc_qf_col[column - 1]->Fill((*iter)->QF);
648 
649  // Calculate the FADC250 multiplicities for each channel
650  ++column_adc_hits[column - 1];
651  ++column_adc_hits_total;
652  }
653  }
654 
655  // DSCTDCDigiHits
656  std::vector<const DTAGMTDCDigiHit*>::iterator titer;
657  for (titer = tdcdigihits.begin(); titer != tdcdigihits.end(); ++titer) {
658  int row = (*titer)->row;
659  int column = (*titer)->column;
660  if (row == 0) {
661 
662  // Fill 1D histograms
663  tagm_tdc_seen->Fill((*titer)->column);
664  tagm_tdc_time->Fill((*titer)->time);
665 
666  // Fill 2D histograms
667  tagm_tdc_time_2d->Fill((*titer)->column, (*titer)->time);
668 
669  // Fill dynamic array of 1D histograms
670  tagm_tdc_time_col[column - 1]->Fill((*titer)->time);
671 
672  // Calculate the F1TDC multiplicities for each channel
673  ++column_tdc_hits[column - 1];
674  ++column_tdc_hits_total;
675  }
676  }
677 
678  // Fill the 2D multiplicity histograms for ADC and TDC
679  for (unsigned int col = 0; col < NCOLUMNS; ++col){
680  if (column_adc_hits[col] > 0) {
681  tagm_adc_mult_2d->Fill(col + 1, column_adc_hits[col]);
682  tagm_adc_mult_col[col]->Fill(column_adc_hits[col]);
683  }
684 
685  if (column_tdc_hits[col] > 0) {
686  tagm_tdc_mult_2d->Fill(col + 1, column_tdc_hits[col]);
687  tagm_tdc_mult_col[col]->Fill(column_tdc_hits[col]);
688  }
689  }
690 
691  // DTAGMHits
692  std::vector<const DTAGMHit*>::iterator hiter;
693  for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
694  int row = (*hiter)->row;
695  int column = (*hiter)->column;
696  if (row == 0) {
697 
698  // Fill 1D histograms
699  tagm_hit_seen->Fill((*hiter)->column);
700  tagm_hit_npix->Fill(log10((*hiter)->npix_fadc));
701  tagm_hit_tadc->Fill((*hiter)->time_fadc);
702  tagm_hit_time->Fill((*hiter)->t);
703  tagm_hit_time_tadc->Fill((*hiter)->t, (*hiter)->time_fadc);
704  tagm_hit_tdiff->Fill((*hiter)->t - (*hiter)->time_fadc);
705 
706  // Fill 2D histograms
707  tagm_hit_npix_2d->Fill((*hiter)->column, (*hiter)->npix_fadc);
708  tagm_hit_tadc_2d->Fill((*hiter)->column, (*hiter)->time_fadc);
709  tagm_hit_time_2d->Fill((*hiter)->column, (*hiter)->t);
710 
711  // Fill dynamic array of 1D histograms
712  tagm_hit_time_col[column - 1]->Fill((*hiter)->t);
713  }
714  }
715 
716  // Find all possible time differences for multiple TDC hits
717  if ((column_tdc_hits_total > 1) && (column_adc_hits_total > 1) ) {
718  for (titer = tdcdigihits.begin(); titer != tdcdigihits.end(); ++titer) {
719  for (iter = digihits.begin(); iter != digihits.end(); ++iter) {
720  if ((*iter)->column == (*titer)->column &&
721  (*iter)->row == 0 && (*titer)->row ==0)
722  {
723  tagm_tdc_tdiff_all->Fill((*titer)->time * TDC_NS_PER_COUNT -
724  (*iter)->pulse_time * ADC_NS_PER_COUNT);
725  }
726  }
727  }
728  }
729 
730  // Now repeat all of the above for single fiber channels
731 
732  // Prepare multiplicity counters
733  int single_adc_hits[NSINGLES];
734  int single_tdc_hits[NSINGLES];
735  for (unsigned int i=0; i < NSINGLES; ++i)
736  single_adc_hits[i] = single_tdc_hits[i] = 0;
737  int single_adc_hits_total = 0;
738  int single_tdc_hits_total = 0;
739 
740  // DTAGMDigiHits
741  for (iter = digihits.begin(); iter != digihits.end(); ++iter) {
742  int row = (*iter)->row;
743  int column = (*iter)->column;
744  uint32_t pedestal_avg = (*iter)->pedestal / (*iter)->nsamples_pedestal;
745  int fiberNo = (row < 1)? 0 :
746  (column == 7)? row :
747  (column == 25)? row + 5 :
748  (column == 79)? row + 10 :
749  (column == 97)? row + 15 : 0;
750  if (fiberNo > 0) {
751 
752  // Fill 1D Histograms
753  tagms_adc_seen->Fill(fiberNo);
754  tagms_adc_pint->Fill(log10((*iter)->pulse_integral));
755  tagms_adc_time->Fill((*iter)->pulse_time);
756  tagms_adc_ped->Fill(pedestal_avg);
757  tagms_adc_qf->Fill((*iter)->QF);
758  tagms_adc_nsi->Fill((*iter)->nsamples_integral);
759  tagms_adc_nsp->Fill((*iter)->nsamples_pedestal);
760 
761  // Fill 2D histograms
762  tagms_adc_pint_2d->Fill(fiberNo, log10((*iter)->pulse_integral));
763  tagms_adc_time_2d->Fill(fiberNo, (*iter)->pulse_time);
764  tagms_adc_ped_2d->Fill(fiberNo, pedestal_avg);
765  tagms_adc_qf_2d->Fill(fiberNo, (*iter)->QF);
766  tagms_adc_nsi_2d->Fill(fiberNo, (*iter)->nsamples_integral);
767  tagms_adc_nsp_2d->Fill(fiberNo, (*iter)->nsamples_pedestal);
768  tagms_adc_pint_nsi->Fill((*iter)->nsamples_integral,
769  log10((*iter)->pulse_integral));
770  tagms_adc_ped_nsp->Fill((*iter)->nsamples_pedestal,
771  pedestal_avg);
772 
773  // Fill dynamic array of histograms
774  tagms_adc_pint_sng[fiberNo - 1]->Fill(log10((*iter)->pulse_integral));
775  tagms_adc_time_sng[fiberNo - 1]->Fill((*iter)->pulse_time);
776  tagms_adc_ped_sng[fiberNo - 1]->Fill(pedestal_avg);
777  tagms_adc_qf_sng[fiberNo - 1]->Fill((*iter)->QF);
778 
779  // Calculate the FADC250 multiplicities for each channel
780  ++single_adc_hits[fiberNo - 1];
781  ++single_adc_hits_total;
782  }
783  }
784 
785  // DSCTDCDigiHits
786  for (titer = tdcdigihits.begin(); titer != tdcdigihits.end(); ++titer) {
787  int row = (*titer)->row;
788  int column = (*titer)->column;
789  int fiberNo = (row < 1)? 0 :
790  (column == 7)? row :
791  (column == 25)? row + 5 :
792  (column == 79)? row + 10 :
793  (column == 97)? row + 15 : 0;
794  if (fiberNo > 0) {
795 
796  // Fill 1D histograms
797  tagms_tdc_seen->Fill(fiberNo);
798  tagms_tdc_time->Fill((*titer)->time);
799 
800  // Fill 2D histograms
801  tagms_tdc_time_2d->Fill(fiberNo, (*titer)->time);
802 
803  // Fill dynamic array of 1D histograms
804  tagms_tdc_time_sng[fiberNo - 1]->Fill((*titer)->time);
805 
806  // Calculate the F1TDC multiplicities for each channel
807  ++single_tdc_hits[fiberNo - 1];
808  ++single_tdc_hits_total;
809  }
810  }
811 
812  // Fill the 2D multiplicity histograms for ADC and TDC
813  for (unsigned int fno = 0; fno < NSINGLES; ++fno){
814  if (single_adc_hits[fno] > 0) {
815  tagms_adc_mult_2d->Fill(fno + 1, single_adc_hits[fno]);
816  tagms_adc_mult_sng[fno]->Fill(single_adc_hits[fno]);
817  }
818 
819  if (single_tdc_hits[fno] > 0) {
820  tagms_tdc_mult_2d->Fill(fno + 1, single_tdc_hits[fno]);
821  tagms_tdc_mult_sng[fno]->Fill(single_tdc_hits[fno]);
822  }
823  }
824 
825  // DTAGMHits
826  for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
827  int row = (*hiter)->row;
828  int column = (*hiter)->column;
829  int fiberNo = (row < 1)? 0 :
830  (column == 7)? row :
831  (column == 25)? row + 5 :
832  (column == 79)? row + 10 :
833  (column == 97)? row + 15 : 0;
834  if (fiberNo > 0) {
835 
836  // Fill 1D histograms
837  tagms_hit_seen->Fill(fiberNo);
838  tagms_hit_npix->Fill(log10((*hiter)->npix_fadc));
839  tagms_hit_tadc->Fill((*hiter)->time_fadc);
840  tagms_hit_time->Fill((*hiter)->t);
841  tagms_hit_time_tadc->Fill((*hiter)->t, (*hiter)->time_fadc);
842  tagms_hit_tdiff->Fill((*hiter)->t - (*hiter)->time_fadc);
843 
844  // Fill 2D histograms
845  tagms_hit_npix_2d->Fill(fiberNo, (*hiter)->npix_fadc);
846  tagms_hit_tadc_2d->Fill(fiberNo, (*hiter)->time_fadc);
847  tagms_hit_time_2d->Fill(fiberNo, (*hiter)->t);
848 
849  // Fill dynamic array of 1D histograms
850  tagms_hit_time_sng[fiberNo - 1]->Fill((*hiter)->t);
851  }
852  }
853 
854  // Find all possible time differences for multiple TDC hits
855  if ((single_tdc_hits_total > 1) && (single_adc_hits_total > 1) ) {
856  for (titer = tdcdigihits.begin(); titer != tdcdigihits.end(); ++titer) {
857  for (iter = digihits.begin(); iter != digihits.end(); ++iter) {
858  if ((*iter)->row > 0 && (*iter)->column == (*titer)->column &&
859  (*iter)->row == (*titer)->row)
860  {
861  tagms_tdc_tdiff_all->Fill((*titer)->time * TDC_NS_PER_COUNT -
862  (*iter)->pulse_time * ADC_NS_PER_COUNT);
863  }
864  }
865  }
866  }
867 
868  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
869 
870  return NOERROR;
871 }
872 
873 
874 //----------------------------------------------------------------------------------
875 
876 
878  // This is called whenever the run number changes, before it is
879  // changed to give you a chance to clean up before processing
880  // events from the next run number.
881  return NOERROR;
882 }
883 
884 
885 //----------------------------------------------------------------------------------
886 
887 
889  // Called before program exit after event processing is finished.
890  return NOERROR;
891 }
892 
893 
894 //----------------------------------------------------------------------------------
895 //----------------------------------------------------------------------------------
static TH2F * tagms_adc_nsi_2d
static TH1F * tagms_hit_tdiff
const float MIN_ADC_NSP
const float MAX_ADC_NSP
TH1F ** tagms_adc_time_sng
static TH2F * tagm_adc_pint_2d
static TH2F * tagm_adc_mult_2d
TH1F ** tagm_adc_qf_col
TH1F ** tagm_tdc_mult_col
TH1F ** tagms_adc_ped_sng
static TH1F * tagms_tdc_tdiff_all
static TH1F * tagms_hit_npix
static TH1F * tagm_hit_tdiff
static TH1F * tagms_adc_nsp
const float MAX_HIT_TADC
static TH1F * tagm_tdc_tdiff_all
static TH2F * tagms_hit_time_tadc
const float_t TDC_NS_PER_COUNT
TH1F ** tagms_tdc_time_sng
static TH2F * tagm_tdc_mult_2d
const float MIN_HIT_TADC
static TH1F * tagm_adc_qf
const uint32_t BINCOUNT_HIT_TADC
const float MAX_TDC_TIME
const uint32_t BINCOUNT_ADC_PED
const float MIN_HIT_NPIX
static TH2F * tagm_adc_ped_nsp
TH1F ** tagm_adc_time_col
const uint32_t BINCOUNT_HIT_NPIX
static TH2F * tagm_adc_pint_nsi
static TH1F * tagm_num_events
const float MIN_ADC_PINT_LOG10
static TH2F * tagm_adc_tdc_mult
static TH1F * tagms_adc_time
JApplication * japp
static TH1F * tagms_adc_nsi
static TH2F * tagms_tdc_mult_2d
static TH1F * tagms_hit_seen
static TH2F * tagms_adc_ped_2d
static TH1F * tagm_adc_pint
const uint32_t BINCOUNT_ADC_TIME
static TH2F * tagm_adc_time_2d
const float MAX_ADC_PINT_LOG10
static TH1F * tagm_tdc_mult
jerror_t fini(void)
Called after last event of last event source has been processed.
static TH1F * tagm_adc_nsp
static TH2F * tagm_hit_time_tadc
TH1F ** tagm_adc_ped_col
InitPlugin_t InitPlugin
static TH1F * tagm_adc_mult
const uint32_t BINCOUNT_ADC_NSI
static TH1F * tagms_hit_time
const float MIN_TDC_TIME
static TH2F * tagm_tdc_time_2d
static TH1F * tagms_hit_tadc
static TH1F * tagm_hit_seen
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
static TH2F * tagm_hit_npix_2d
const float_t ADC_NS_PER_COUNT
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
static TH2F * tagms_adc_time_2d
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
static TH2F * tagm_adc_qf_2d
const uint32_t BINCOUNT_ADC_PINT
jerror_t init(void)
Called once at program start.
const uint32_t BINCOUNT_HIT_TIME
TH1F ** tagms_adc_mult_sng
const uint32_t NCOLUMNS
static TH2F * tagms_adc_pint_2d
static TH2F * tagms_hit_npix_2d
const float MIN_ADC_QF
const uint32_t BINCOUNT_ADC_QF
TH1F ** tagms_hit_time_sng
TH1F ** tagm_hit_time_col
static TH2F * tagms_adc_pint_nsi
TH1F ** tagms_tdc_mult_sng
static TH2F * tagms_tdc_time_2d
TH1F ** tagms_adc_pint_sng
const uint32_t BINCOUNT_ADC_NSP
static TH1F * tagm_tdc_seen
TH1F ** tagms_adc_qf_sng
static TH1F * tagms_adc_seen
static TH1F * tagm_hit_tadc
const float MAX_HIT_TIME
static TH2F * tagms_hit_tadc_2d
static TH2F * tagms_adc_qf_2d
TH1F ** tagm_adc_pint_col
static TH1F * tagm_hit_npix
static TH1F * tagm_hit_time
static TH1F * tagms_adc_qf
static TH2F * tagm_hit_tadc_2d
static TH1F * tagm_adc_nsi
static TH2F * tagms_adc_mult_2d
const float MAX_ADC_QF
static TH2F * tagm_hit_time_2d
const float MIN_ADC_NSI
static TH1F * tagms_tdc_time
TH1F ** tagm_adc_mult_col
const float MAX_ADC_TIME
static TH1F * tagms_tdc_seen
const float MIN_ADC_TIME
static TH2F * tagms_adc_ped_nsp
const uint32_t NSINGLES
static TH1F * tagm_adc_time
static TH1F * tagm_tdc_time
const float MIN_ADC_PED
static TH2F * tagm_adc_nsp_2d
const float MIN_HIT_TIME
const uint32_t BINCOUNT_TDC_TIME
const float MAX_ADC_NSI
static TH2F * tagms_adc_nsp_2d
static TH2F * tagms_hit_time_2d
const float MAX_ADC_PED
const float MAX_HIT_NPIX
TH1F ** tagm_tdc_time_col
static TH2F * tagm_adc_ped_2d
static TH1F * tagm_adc_ped
static TH1F * tagms_adc_ped
int main(int argc, char *argv[])
Definition: gendoc.cc:6
static TH2F * tagm_adc_nsi_2d
static TH1F * tagms_adc_pint
static TH1F * tagm_adc_seen