AlcapDAQ  1
MMuPC1AnalysisC.cpp
Go to the documentation of this file.
1 /********************************************************************\
2 
3  Name: MMuPC1AnalysisC.cpp
4  Created by: Tom Banks
5 
6  Contents: Generates muPC1 histograms. The "successive tdiff"
7  histograms are particularly useful for determining
8  the afterpulse-clustering intervals in the subsequent
9  MQL module.
10 
11 \********************************************************************/
12 
13 /*-- Include files -------------------------------------------------*/
14 
15 /* Standard includes */
16 #include <stdio.h>
17 #include <stdlib.h>
18 
19 /* MIDAS includes */
20 #include "midas.h"
21 
22 /* ROOT includes */
23 #include "TH1.h"
24 #include "TH2.h"
25 #include "TH3.h"
26 
27 /* MuCap includes */
28 #include "common.h"
29 #include "ucb_common.h"
30 
31 /*-- Parameters ----------------------------------------------------*/
32 
33 /*-- Static parameters ---------------------------------------------*/
34 
35 // Declare histograms
40 
41 /*-- Module declaration --------------------------------------------*/
42 
43 INT MMuPC1AnalysisC_init(void);
44 INT MMuPC1AnalysisC(EVENT_HEADER*, void*);
45 
46 ANA_MODULE MMuPC1AnalysisC_module = {
47  "MMuPC1AnalysisC", /* module name */
48  "Tom Banks", /* author */
49  MMuPC1AnalysisC, /* event routine */
50  NULL, /* BOR routine */
51  NULL, /* EOR routine */
52  MMuPC1AnalysisC_init, /* init routine */
53  NULL, /* exit routine */
54  NULL, /* parameter structure */
55  0, /* structure size */
56  NULL, /* initial parameters */
57 };
58 
59 /*-- init routine --------------------------------------------------*/
60 
62 {
63  /****** Construct histograms ******/
64  char hist_name[256];
65  char hist_title[256];
66 
67  // muPC1 Xwire histograms
68  sprintf(hist_name, "muPC1_X_raw_successive_tdiffs");
69  sprintf(hist_title, "Tdiffs between successive raw #muPC1 Xwire hits");
70  muPC1_Xwire_successive_tdiffs = new TH2D(hist_name, hist_title, 1451, -252.5, 7002.5, kMuPC1NumXWires, 0.5, (kMuPC1NumXWires+0.5));
71  /*
72  sprintf(hist_name, "muPC1_XwireVStime_2D");
73  sprintf(hist_title, "#muPC1 raw Xwire hits vs.time 2D");
74  muPC1_XwireVStime_2D = new TH2D(hist_name, hist_title, 1000, 0, 50000000, kMuPC1NumXWires, 0.5, (kMuPC1NumXWires+0.5));
75  */
76 
77  // muPC1 Ywire histograms
78  sprintf(hist_name, "muPC1_Y_raw_successive_tdiffs");
79  sprintf(hist_title, "Tdiffs between successive raw #muPC1 Ywire hits");
80  muPC1_Ywire_successive_tdiffs = new TH2D(hist_name, hist_title, 1451, -252.5, 7002.5, kMuPC1NumYWires, 0.5, (kMuPC1NumYWires+0.5));
81  /*
82  sprintf(hist_name, "muPC1_YwireVStime_2D");
83  sprintf(hist_title, "#muPC1 raw Ywire hits vs.time 2D");
84  muPC1_YwireVStime_2D = new TH2D(hist_name, hist_title, 1000, 0, 50000000, kMuPC1NumYWires, 0.5, (kMuPC1NumYWires+0.5));
85  */
86 
87  return SUCCESS;
88 }
89 
90 /*-- event routine -------------------------------------------------*/
91 
92 INT MMuPC1AnalysisC(EVENT_HEADER *pheader, void *pevent)
93 {
94  /* ############################################### */
95  // Open up the bank "HITS" (contains CAEN & COMP hits by parameter #)
96  channel_hit *hit_bank;
97  int hit_bank_size = bk_locate(pevent, "HITS", (DWORD *) &hit_bank);
98  hit_bank_size = hit_bank_size * sizeof(DWORD) / sizeof(channel_hit);
99  if(hit_bank == NULL) {
100  fprintf(stderr, "MMuPC1AnalysisC: Could not find bank HITS.\n");
101  return !SUCCESS;
102  }
103 
104  /* ############################################### */
105 
106  // Initialize the "previous hit" indices
107  int prev_hit_index_muPC1_Xwire[kMuPC1NumXWires+1];
108  for (int j=1; j<=kMuPC1NumXWires; j++) {
109  prev_hit_index_muPC1_Xwire[j] = -1;
110  }
111  int prev_hit_index_muPC1_Ywire[kMuPC1NumYWires+1];
112  for (int j=1; j<=kMuPC1NumYWires; j++) {
113  prev_hit_index_muPC1_Ywire[j] = -1;
114  }
115 
116  // Loop over hits within hit_bank and fill muPC1 raw data histograms
117  for (int i=0; i<hit_bank_size; i++) {
118  int par = hit_bank[i].parameter;
119 
120  // Xwires
121  if ((par >= 4001) && (par <= (4000+kMuPC1NumXWires))) {
122  int wire = (par-4000);
123  // tdiffs between successive Xwire hits, per wire
124  if (prev_hit_index_muPC1_Xwire[wire] >= 0) {
125  muPC1_Xwire_successive_tdiffs->Fill((hit_bank[i].time -
126  hit_bank[prev_hit_index_muPC1_Xwire[wire]].time),
127  wire);
128  }
129  prev_hit_index_muPC1_Xwire[wire] = i;
130  // 2D Xwire hits vs. time
131  // muPC1_XwireVStime_2D->Fill(hit_bank[i].time, wire);
132  }
133 
134  // Ywires
135  if ((par >= 4051) && (par <= (4050+kMuPC1NumYWires))) {
136  int wire = (par-4050);
137  // tdiffs between successive Ywire hits, per wire
138  if (prev_hit_index_muPC1_Ywire[wire] >= 0) {
139  muPC1_Ywire_successive_tdiffs->Fill((hit_bank[i].time -
140  hit_bank[prev_hit_index_muPC1_Ywire[wire]].time),
141  wire);
142  }
143  prev_hit_index_muPC1_Ywire[wire] = i;
144  // 2D Ywire hits vs. time
145  // muPC1_YwireVStime_2D->Fill(hit_bank[i].time, wire);
146  }
147  }
148 
149  /* ############################################### */
150 
151  return SUCCESS;
152 }