Low-Energy Muon (LEM) Experiment  0.5.1
pileup_ana_module.c
Go to the documentation of this file.
1 /********************************************************************\
2 
3  Name: pileup_ana_module.c
4  Created by: Thomas Prokscha
5  Date: 05-Oct-2005
6 
7  Contents: Analyzer module for LEM pileup data
8 
9 \********************************************************************/
10 
11 /*-- Include files -------------------------------------------------*/
12 
13 /* standard includes */
14 #include <stdio.h>
15 #include <time.h>
16 #include <string.h>
17 #include <math.h>
18 
19 /* midas includes */
20 #include "midas.h"
21 #include "rmidas.h"
22 #include "v1190.h"
23 #include "experim.h"
24 #include "nemu_experim.h"
25 
26 #ifdef HAVE_HBOOK
27 #include <cfortran.h>
28 #include <hbook.h>
29 #else
30 /* root includes */
31 #include <TH1F.h>
32 #include <TH2F.h>
33 #include <TTree.h>
34 #endif
35 
36 /*-- ODB Parameters ------------------------------------------------*/
37 //extern RUNINFO runinfo;
38 //extern EXP_PARAM exp_param;
39 extern RUNINFO runinfo;
41 PILEUPANAMODULE_PARAM_STR(pileup_ana_param_str);
42 
43 /*-- Module declaration --------------------------------------------*/
44 INT pileup_init(void);
45 INT pileup_ana(EVENT_HEADER*,void*);
46 INT pileup_bor(INT run_number);
47 INT pileup_eor(INT run_number);
48 
49 
50 ANA_MODULE pileup_ana_module = {
51  "PileUpAnaModule", /* module name */
52  "Thomas Prokscha", /* author */
53  pileup_ana, /* event routine */
54  pileup_bor, /* BOR routine */
55  pileup_eor, /* EOR routine */
56  pileup_init, /* init routine */
57  NULL, /* exit routine */
58  &pileup_ana_param, /* parameter structure */
59  sizeof(pileup_ana_param), /* structure size */
60  (const char **)pileup_ana_param_str, /* initial parameters */
61 };
62 
63 /*-- other global variables ----------------------------------------*/
64 #define N_PUHIST 4
65 #ifndef HAVE_HBOOK
66 static TH1F* hPUHist[N_PUHIST];
67 //the following objects are from mana.c
68 extern TFolder *gManaHistosFolder;
69 extern TObjArray *gHistoFolderStack;
70 #endif
71 
72 /*-- INIT routine --------------------------------------------------*/
73 INT pileup_init(void)
74 {
75 extern char runname[256];
76 char title[256], name[256];
77 int nbin, i, j;
78 float xlow, xhigh;
79 
80 
81  for (i=0; i<N_PUHIST; i++){
82  sprintf(name, "hPileUp%02d", i);
83  sprintf(title, "%s Run %s_%04d", pileup_ana_param.histotitles.pileuptitles[i], runname, runinfo.run_number);
84  nbin = pileup_ana_param.histobinning.histonbin[i];
85  xlow = pileup_ana_param.histobinning.histoxlow[i];
86  xhigh = pileup_ana_param.histobinning.histoxup[i];
87  hPUHist[i] = H1_BOOK(name, title, nbin, xlow, xhigh);
88  }
89 
90  return SUCCESS;
91 }
92 
93 /*-- BOR routine ---------------------------------------------------*/
94 
95 INT pileup_bor(INT run_number)
96 {
97 int i;
98 char title[256];
99 extern char runname[256];
100 
101  for (i=0; i<N_PUHIST; i++){
102  sprintf(title, "%s Run %s_%04d", pileup_ana_param.histotitles.pileuptitles[i], runname, run_number);
103  hPUHist[i]->SetTitle(title);
104  }
105 
106 return SUCCESS;
107 }
108 
109 /*-- EOR routine ---------------------------------------------------*/
110 
111 INT pileup_eor(INT run_number)
112 {
113 
114  return SUCCESS;
115 }
116 
117 /*-- event routine -------------------------------------------------*/
124 INT pileup_ana(EVENT_HEADER *pheader, void *pevent)
125 {
126 INT n, i, ind, counter[N_TDC_CHANNELS];
127 DWORD *ptdc;
128 float tdc_data[N_TDC_CHANNELS][DATA_N_HITS], pu_time;
129 LEM_DATA *lem_data;
130 
131  /* look for TDC0 bank */
132  n = bk_locate(pevent, "TDC0", &ptdc);
133  if (n == 0 )
134  return 1;
135 
136  memset(&counter, 0x00, sizeof(counter));
137  memset(&tdc_data, 0x00, sizeof(tdc_data));
138 
139  for (i = 1; i < n; i++){ // i=0 is a control word, including the event length
140  lem_data = (LEM_DATA *) &ptdc[i];
141 
142  switch ( lem_data->channel ){
143  case TD:
144  ind = TD;
145  tdc_data[ind][counter[ind]] = (float) lem_data->data;
146  if ( counter[ind] > 0 && counter[ind] < 3 ){ //use 1st and 2nd pile up hits
147  pu_time = tdc_data[ind][counter[ind]] - tdc_data[ind][0];
148  if ( pu_time < 0) pu_time = pu_time + TDC_BIT_RANGE;
149  hPUHist[counter[ind]-1]->Fill(pu_time,1.);
150  }
151  counter[ind]++;
152  break;
153 
154  case MCP2F:
155  ind = MCP2F;
156  tdc_data[ind][counter[ind]] = (float) lem_data->data;
157  if ( counter[ind] > 0 && counter[ind] < 3 ){//use 1st and 2nd pile up hits
158  pu_time = tdc_data[ind][counter[ind]] - tdc_data[ind][0];
159  if ( pu_time < 0) pu_time = pu_time + TDC_BIT_RANGE;
160  hPUHist[counter[ind]+1]->Fill(pu_time,1.);
161  }
162  counter[ind]++;
163  break;
164 
165  default:
166  break;
167  }
168  }
169 
170  return SUCCESS;
171 }
172 /* ----------------------------------------------------------------------------*\
173  EOF pileup_ana_module.c
174 \* ----------------------------------------------------------------------------*/
WORD channel
Definition: nemu_experim.h:93
INT pileup_bor(INT run_number)
static TH1F * hPUHist[N_PUHIST]
INT pileup_ana(EVENT_HEADER *, void *)
struct PILEUPANAMODULE_PARAM::@12 histotitles
char runname[256]
Definition: analyzer.c:92
RUNINFO runinfo
/Runinfo ODB key, defined in from midas.h
Definition: vme_fe.c:193
PILEUPANAMODULE_PARAM pileup_ana_param
#define TDC_BIT_RANGE
2^19 is the bit range of the TDC in 100ps and 200ps mode
Definition: nemu_experim.h:70
#define N_PUHIST
struct PILEUPANAMODULE_PARAM::@13 histobinning
INT pileup_eor(INT run_number)
#define MCP2F
Definition: nemu_experim.h:49
#define DATA_N_HITS
max. of DATA_N_HITS in data file
Definition: nemu_experim.h:66
char pileuptitles[4][32]
Definition: experim.h:368
TObjArray * gHistoFolderStack
INT pileup_init(void)
#define N_TDC_CHANNELS
number of TDC channels
Definition: nemu_experim.h:64
DWORD data
Definition: nemu_experim.h:92
#define TD
Definition: nemu_experim.h:17
ANA_MODULE pileup_ana_module
float histoxlow[4]
Definition: experim.h:372
PILEUPANAMODULE_PARAM_STR(pileup_ana_param_str)
TFolder * gManaHistosFolder