Belle II Software  release-08-01-10
studyTBCResolution.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 # ------------------------------------------------------------------------
13 # Module to study the features of the double pulse used for the TOP calibration.
14 # To be used to determine the TBC quality and precision
15 #
16 # usage: basf2 studyTBCResolution.py dbaddress (path|none) type (local|pocket) output_name.root path_to_files run1 run2 ... runN
17 # The run number accepts wildcards
18 # ------------------------------------------------------------------------
19 
20 import basf2 as b2
21 import sys
22 import glob
23 from ROOT import Belle2
24 from ROOT import TH1F, TH2F, TF1, TFile, TGraphErrors
25 
26 
27 class TOPTBCResolution(b2.Module):
28 
29  ''' Module to study resolution and performances of the TOP Time Base Calibration.'''
30 
31 
32  h_WidthVSAmplitude_1 = TH2F(
33  'WidthVSAmplitude_1',
34  'Width VS amplidute of the TOPDigits, first calibration pulse',
35  2000, 0., 2000, 100, 0., 10.)
36 
37  h_WidthVSAmplitude_2 = TH2F(
38  'WidthVSAmplitude_2',
39  'Width VS amplidute of the TOPDigits, second calibration pulse',
40  2000, 0., 2000, 100, 0., 10.)
41 
42 
43  h_dVdtRising_1 = TH1F('dVdtRising_1', ' dV/dt of the TOPRawDigits (rising edge), first calibration pulse', 1000, 0, 1000)
44 
45  h_dVdtRising_2 = TH1F('dVdtRising_2', ' dV/dt of the TOPRawDigits (rising edge), second calibration pulse', 1000, 0, 1000)
46 
47  h_dVdtFalling_1 = TH1F('dVdtFalling_1', ' dV/dt of the TOPRawDigits (falling edge), first calibration pulse', 1000, 0, 1000)
48 
49  h_dVdtFalling_2 = TH1F('dVdtFalling_2', ' dV/dt of the TOPRawDigits (falling edge), second calibration pulse', 1000, 0, 1000)
50 
51  h_dVdtRisingVSdVdtFalling_1 = TH2F(
52  'dVdtRisingVSdVdtFalling_1',
53  ' dV/dt of the TOPRawDigit: rising edge VS falling edge, first calibration pulse ',
54  1000, 0, 1000, 1000, 0., 1000.)
55 
56  h_dVdtRisingVSdVdtFalling_2 = TH2F(
57  'dVdtRisingVSdVdtFalling_2',
58  ' dV/dt of the TOPRawDigit: rising edge VS falling edge, second calibration pulse ',
59  1000, 0, 1000, 1000, 0., 1000.)
60 
61  h_dVdtRisingDifference = TH1F(
62  'dVdtRisingDifference', ' difference between the rising edge dV/dt of the first and the second pulse', 1000, -500, 500)
63 
64  h_dVdtFallingDifference = TH1F(
65  'dVdtFallingDifference', ' difference between the falling edge dV/dt of the first and the second pulse', 1000, -500, 500)
66 
67 
68  h_DeltaT_RR = TH1F('DeltaT_RR', ' DeltaT bewteen the rising edges', 4000, 10, 30)
69 
70  h_DeltaT_FF = TH1F('DeltaT_FF', ' DeltaT bewteen the falling edges', 4000, 10, 30)
71 
72  h_DeltaT_FR = TH1F('DeltaT_FR', ' DeltaT bewteen falling and rising edges', 4000, 10, 30)
73 
74  h_DeltaT_RF = TH1F('DeltaT_RF', ' DeltaT bewteen rising and falling edges', 4000, 10, 30)
75 
76 
77  h_DeltaTVSChannel_RR = TH2F(
78  'DeltaTVSChannel_RR',
79  ' DeltaT bewteen the rising edges, as function of the channel number',
80  512 * 16, 0, 512 * 16, 4000, 10., 30.)
81 
82  h_DeltaTVSChannel_FF = TH2F(
83  'DeltaTVSChannel_FF',
84  ' DeltaT bewteen the falling edges, as function of the channel number',
85  512 * 16, 0, 512 * 16, 4000, 10., 30.)
86 
87  h_DeltaTVSChannel_FR = TH2F(
88  'DeltaTVSChannel_FR',
89  ' DeltaT bewteen falling (pulse 1) and rising (pulse 2) edge, as function of the channel number',
90  512 * 16, 0, 512 * 16, 4000, 10., 30.)
91 
92  h_DeltaTVSChannel_RF = TH2F(
93  'DeltaTVSChannel_RF',
94  ' DeltaT bewteen rising (pulse 1) and falling (pulse 2) edge, as function of the channel number',
95  512 * 16, 0, 512 * 16, 4000, 10., 30.)
96 
97  h_DeltaTVSdVdt_RR = TH2F(
98  'DeltaTVSdVdt_RR',
99  'DeltaT bewteen the rising edges VS average of dV/dt on the first and second pulser',
100  1000, 0., 1000., 4000, 10., 30.)
101 
102  h_DeltaTVSdVdt_FF = TH2F(
103  'DeltaTVSdVdt_FF',
104  'DeltaT bewteen the rising edges VS average of dV/dt on the first and second pulser',
105  1000, 0., 1000., 4000, 10., 30.)
106 
107 
108  h_ResolutionVSdVdt_FF = TGraphErrors()
109 
110  h_ResolutionVSdVdt_RR = TGraphErrors()
111 
112 
113  outname = 'outStudyTBCResolution.root'
114 
115  m_calpulseMaxWidth = 3.
116 
117  m_calpulseMinWidth = 0.5
118 
119  m_calpulseMaxAmp = 700.
120 
121  m_calpulseMinAmp = 250.
122 
123  m_ignoreNotCalibrated = True
124 
125  def setOutputName(self, outputname):
126  ''' Sets the output file name '''
127 
128  self.outnameoutnameoutname = outputname
129 
130  def setMaxWidth(self, maxWidth):
131  ''' Sets the maximum calpulse width '''
132 
133  self.m_calpulseMaxWidthm_calpulseMaxWidthm_calpulseMaxWidth = maxWidth
134 
135  def setMinWidth(self, minWidth):
136  ''' Sets the minimum calpulse width '''
137 
138  self.m_calpulseMinWidthm_calpulseMinWidthm_calpulseMinWidth = minWidth
139 
140  def setMaxAmp(self, maxAmp):
141  ''' Sets the maximum calpulse amplitude '''
142 
143  self.m_calpulseMaxAmpm_calpulseMaxAmpm_calpulseMaxAmp = maxAmp
144 
145  def setMinAmp(self, minAmp):
146  ''' Sets the minimum calpulse amplitude '''
147 
148  self.m_calpulseMinAmpm_calpulseMinAmpm_calpulseMinAmp = minAmp
149 
150  def ignoreNotCalibrated(self, ignoreNotCal):
151  ''' Sets the flag to ingore the hits without calibration '''
152 
153  self.m_ignoreNotCalibratedm_ignoreNotCalibratedm_ignoreNotCalibrated = ignoreNotCal
154 
155  def event(self):
156  ''' Event processor: fill histograms '''
157 
158  digits = Belle2.PyStoreArray('TOPDigits')
159 
160  for ipulse1, digit1 in enumerate(digits):
161  if(self.ignoreNotCalibratedignoreNotCalibrated and not digit1.isTimeBaseCalibrated()):
162  continue
163  if (digit1.getHitQuality() != 0 and
164  digit1.getPulseHeight() > self.m_calpulseMinAmpm_calpulseMinAmpm_calpulseMinAmp and
165  digit1.getPulseHeight() < self.m_calpulseMaxAmpm_calpulseMaxAmpm_calpulseMaxAmp and
166  digit1.getPulseWidth() > self.m_calpulseMinWidthm_calpulseMinWidthm_calpulseMinWidth and
167  digit1.getPulseWidth() < self.m_calpulseMaxWidthm_calpulseMaxWidthm_calpulseMaxWidth):
168 
169  slotID = digit1.getModuleID()
170  hwchan = digit1.getChannel()
171  for ipulse2, digit2 in enumerate(digits, start=ipulse1 + 1):
172  if(self.ignoreNotCalibratedignoreNotCalibrated and not digit2.isTimeBaseCalibrated()):
173  continue
174 
175  if (digit2.getHitQuality() != 0 and
176  digit2.getPulseHeight() > self.m_calpulseMinAmpm_calpulseMinAmpm_calpulseMinAmp and
177  digit2.getPulseHeight() < self.m_calpulseMaxAmpm_calpulseMaxAmpm_calpulseMaxAmp and
178  digit2.getPulseWidth() > self.m_calpulseMinWidthm_calpulseMinWidthm_calpulseMinWidth and
179  digit2.getPulseWidth() < self.m_calpulseMaxWidthm_calpulseMaxWidthm_calpulseMaxWidth and
180  slotID == digit2.getModuleID() and
181  hwchan == digit2.getChannel()):
182 
183  # finds which one is the first calpulse
184  rawDigitFirst = digit1.getRelated('TOPRawDigits')
185  rawDigitSecond = digit2.getRelated('TOPRawDigits')
186  if digit1.getTime() > digit2.getTime():
187  rawDigitFirst = digit2.getRelated('TOPRawDigits')
188  rawDigitSecond = digit1.getRelated('TOPRawDigits')
189  digitFirst = rawDigitFirst.getRelated('TOPDigits')
190  digitSecond = rawDigitSecond.getRelated('TOPDigits')
191 
192  globalCh = hwchan + 512 * (slotID - 1)
193  dV1_R = rawDigitFirst.getLeadingSlope()
194  dV1_F = -rawDigitFirst.getFallingSlope()
195  dV2_R = rawDigitSecond.getLeadingSlope()
196  dV2_F = -rawDigitSecond.getFallingSlope()
197  t1_R = digitFirst.getTime()
198  t1_F = digitFirst.getTime() + digitFirst.getPulseWidth()
199  t2_R = digitSecond.getTime()
200  t2_F = digitSecond.getTime() + digitSecond.getPulseWidth()
201  amp1 = digitFirst.getPulseHeight()
202  amp2 = digitSecond.getPulseHeight()
203  w1 = digitFirst.getPulseWidth()
204  w2 = digitSecond.getPulseWidth()
205 
206  self.h_WidthVSAmplitude_1h_WidthVSAmplitude_1.Fill(amp1, w1)
207  self.h_WidthVSAmplitude_2h_WidthVSAmplitude_2.Fill(amp2, w2)
208  self.h_dVdtRising_1h_dVdtRising_1.Fill(dV1_R)
209  self.h_dVdtRising_2h_dVdtRising_2.Fill(dV2_R)
210  self.h_dVdtFalling_1h_dVdtFalling_1.Fill(dV1_F)
211  self.h_dVdtFalling_2h_dVdtFalling_2.Fill(dV2_F)
212  self.h_dVdtRisingVSdVdtFalling_1h_dVdtRisingVSdVdtFalling_1.Fill(dV1_F, dV1_R)
213  self.h_dVdtRisingVSdVdtFalling_2h_dVdtRisingVSdVdtFalling_2.Fill(dV2_F, dV2_R)
214  self.h_dVdtRisingDifferenceh_dVdtRisingDifference.Fill(dV1_R - dV2_R)
215  self.h_dVdtFallingDifferenceh_dVdtFallingDifference.Fill(dV1_F - dV2_F)
216  self.h_DeltaT_RRh_DeltaT_RR.Fill(t2_R - t1_R)
217  self.h_DeltaT_FFh_DeltaT_FF.Fill(t2_F - t1_F)
218  self.h_DeltaT_FRh_DeltaT_FR.Fill(t2_F - t1_R)
219  self.h_DeltaT_RFh_DeltaT_RF.Fill(t2_R - t1_F)
220  self.h_DeltaTVSChannel_RRh_DeltaTVSChannel_RR.Fill(globalCh, t2_R - t1_R)
221  self.h_DeltaTVSChannel_FFh_DeltaTVSChannel_FF.Fill(globalCh, t2_F - t1_F)
222  self.h_DeltaTVSChannel_FRh_DeltaTVSChannel_FR.Fill(globalCh, t2_F - t1_R)
223  self.h_DeltaTVSChannel_RFh_DeltaTVSChannel_RF.Fill(globalCh, t2_R - t1_F)
224  self.h_DeltaTVSdVdt_RRh_DeltaTVSdVdt_RR.Fill(0.5 * (dV1_R + dV2_R), t2_R - t1_R)
225  self.h_DeltaTVSdVdt_FFh_DeltaTVSdVdt_FF.Fill(0.5 * (dV1_F + dV2_F), t2_F - t1_F)
226 
227  def terminate(self):
228  ''' Write histograms to file, fills and fits the resolution plots'''
229 
230  self.h_ResolutionVSdVdt_RRh_ResolutionVSdVdt_RR.SetName('ResolutionVSdVdt_RR')
231  self.h_ResolutionVSdVdt_RRh_ResolutionVSdVdt_RR.SetTitle('Resolution VS dV/dt (rising-rising)')
232  self.h_ResolutionVSdVdt_FFh_ResolutionVSdVdt_FF.SetName('ResolutionVSdVdt_FF')
233  self.h_ResolutionVSdVdt_FFh_ResolutionVSdVdt_FF.SetTitle('Resolution VS dV/dt (falling-falling)')
234 
235  for ibin in range(0, 10):
236  projection = self.h_DeltaTVSdVdt_RRh_DeltaTVSdVdt_RR.ProjectionY("tmpProj", ibin * 100 + 1, (ibin + 1) * 100)
237  gaussFit = TF1("gaussFit", "[0]*exp(-0.5*((x-[1])/[2])**2)", 10., 30.)
238  gaussFit.SetParameter(0, 1.)
239  gaussFit.SetParameter(1, projection.GetMean())
240  gaussFit.SetParameter(2, projection.GetRMS())
241  gaussFit.SetParLimits(2, 0., 3. * projection.GetRMS())
242 
243  projection.Fit("gaussFit")
244  self.h_ResolutionVSdVdt_RRh_ResolutionVSdVdt_RR.SetPoint(ibin, ibin * 100. + 50., gaussFit.GetParameter(2))
245  self.h_ResolutionVSdVdt_RRh_ResolutionVSdVdt_RR.SetPointError(ibin, 50., gaussFit.GetParError(2))
246 
247  tfile = TFile(self.outnameoutnameoutname, 'recreate')
248  self.h_WidthVSAmplitude_1h_WidthVSAmplitude_1.GetXaxis().SetTitle("TOPDigit amplitude [ADC counts]")
249  self.h_WidthVSAmplitude_1h_WidthVSAmplitude_1.GetYaxis().SetTitle("TOPDigit width [ns]")
250  self.h_WidthVSAmplitude_1h_WidthVSAmplitude_1.Write()
251  self.h_WidthVSAmplitude_2h_WidthVSAmplitude_2.GetXaxis().SetTitle("TOPDigit amplitude [ADC counts]")
252  self.h_WidthVSAmplitude_2h_WidthVSAmplitude_2.GetYaxis().SetTitle("TOPDigit width [ns]")
253  self.h_WidthVSAmplitude_2h_WidthVSAmplitude_2.Write()
254 
255  self.h_dVdtRising_1h_dVdtRising_1.GetXaxis().SetTitle("dV/dt [ADC counts / sample]")
256  self.h_dVdtRising_1h_dVdtRising_1.Write()
257  self.h_dVdtRising_2h_dVdtRising_2.GetXaxis().SetTitle("dV/dt [ADC counts / sample]")
258  self.h_dVdtRising_2h_dVdtRising_2.Write()
259  self.h_dVdtFalling_1h_dVdtFalling_1.GetXaxis().SetTitle("dV/dt [ADC counts / sample]")
260  self.h_dVdtFalling_1h_dVdtFalling_1.Write()
261  self.h_dVdtFalling_2h_dVdtFalling_2.GetXaxis().SetTitle("dV/dt [ADC counts / sample]")
262  self.h_dVdtFalling_2h_dVdtFalling_2.Write()
263 
264  self.h_dVdtRisingVSdVdtFalling_1h_dVdtRisingVSdVdtFalling_1.GetXaxis().SetTitle("dV/dt on the falling edge [ADC counts / sample]")
265  self.h_dVdtRisingVSdVdtFalling_1h_dVdtRisingVSdVdtFalling_1.GetYaxis().SetTitle("dV/dt on the rising edge [ADC counts / sample]")
266  self.h_dVdtRisingVSdVdtFalling_1h_dVdtRisingVSdVdtFalling_1.Write()
267 
268  self.h_dVdtRisingVSdVdtFalling_2h_dVdtRisingVSdVdtFalling_2.GetXaxis().SetTitle("dV/dt on the falling edge [ADC counts / sample]")
269  self.h_dVdtRisingVSdVdtFalling_2h_dVdtRisingVSdVdtFalling_2.GetYaxis().SetTitle("dV/dt on the rising edge [ADC counts / sample]")
270  self.h_dVdtRisingVSdVdtFalling_2h_dVdtRisingVSdVdtFalling_2.Write()
271 
272  self.h_dVdtFallingDifferenceh_dVdtFallingDifference.GetXaxis().SetTitle("dV/dt_1 - dV/dt_2 [ADC counts / sample]")
273  self.h_dVdtFallingDifferenceh_dVdtFallingDifference.Write()
274 
275  self.h_dVdtRisingDifferenceh_dVdtRisingDifference.GetXaxis().SetTitle("dV/dt_1 - dV/dt_2 [ADC counts / sample]")
276  self.h_dVdtRisingDifferenceh_dVdtRisingDifference.Write()
277 
278  self.h_DeltaT_RRh_DeltaT_RR.GetXaxis().SetTitle("#Delta t [ns]")
279  self.h_DeltaT_RRh_DeltaT_RR.Write()
280  self.h_DeltaT_FFh_DeltaT_FF.GetXaxis().SetTitle("#Delta t [ns]")
281  self.h_DeltaT_FFh_DeltaT_FF.Write()
282  self.h_DeltaT_FRh_DeltaT_FR.GetXaxis().SetTitle("#Delta t [ns]")
283  self.h_DeltaT_FRh_DeltaT_FR.Write()
284  self.h_DeltaT_RFh_DeltaT_RF.GetXaxis().SetTitle("#Delta t [ns]")
285  self.h_DeltaT_RFh_DeltaT_RF.Write()
286 
287  self.h_DeltaTVSChannel_RRh_DeltaTVSChannel_RR.GetXaxis().SetTitle("Global channel number [hwChannel + 512*(slotID-1)]")
288  self.h_DeltaTVSChannel_RRh_DeltaTVSChannel_RR.GetYaxis().SetTitle("#Delta t [ns]")
289  self.h_DeltaTVSChannel_RRh_DeltaTVSChannel_RR.Write()
290  self.h_DeltaTVSChannel_FFh_DeltaTVSChannel_FF.GetXaxis().SetTitle("Global channel number [hwChannel + 512*(slotID-1)]")
291  self.h_DeltaTVSChannel_FFh_DeltaTVSChannel_FF.GetYaxis().SetTitle("#Delta t [ns]")
292  self.h_DeltaTVSChannel_FFh_DeltaTVSChannel_FF.Write()
293  self.h_DeltaTVSChannel_FRh_DeltaTVSChannel_FR.GetXaxis().SetTitle("Global channel number [hwChannel + 512*(slotID-1)]")
294  self.h_DeltaTVSChannel_FRh_DeltaTVSChannel_FR.GetYaxis().SetTitle("#Delta t [ns]")
295  self.h_DeltaTVSChannel_FRh_DeltaTVSChannel_FR.Write()
296  self.h_DeltaTVSChannel_RFh_DeltaTVSChannel_RF.GetXaxis().SetTitle("Global channel number [hwChannel + 512*(slotID-1)]")
297  self.h_DeltaTVSChannel_RFh_DeltaTVSChannel_RF.GetYaxis().SetTitle("#Delta t [ns]")
298  self.h_DeltaTVSChannel_RFh_DeltaTVSChannel_RF.Write()
299 
300  self.h_DeltaTVSdVdt_RRh_DeltaTVSdVdt_RR.GetXaxis().SetTitle("Average of dV/dt on first and second pulse [ACD counts / sample]")
301  self.h_DeltaTVSdVdt_RRh_DeltaTVSdVdt_RR.GetYaxis().SetTitle("#Delta t [ns]")
302  self.h_DeltaTVSdVdt_RRh_DeltaTVSdVdt_RR.Write()
303 
304  self.h_DeltaTVSdVdt_FFh_DeltaTVSdVdt_FF.GetXaxis().SetTitle("Average of dV/dt on first and second pulse [ACD counts / sample]")
305  self.h_DeltaTVSdVdt_FFh_DeltaTVSdVdt_FF.GetYaxis().SetTitle("#Delta t [ns]")
306  self.h_DeltaTVSdVdt_FFh_DeltaTVSdVdt_FF.Write()
307 
308  self.h_ResolutionVSdVdt_RRh_ResolutionVSdVdt_RR.Write()
309  tfile.Close()
310 
311 
312 argvs = sys.argv
313 
314 print('usage: basf2', argvs[0], 'runNumber outfileName')
315 
316 dbaddress = argvs[1] # path to the calibration DB (absolute path or 'none')
317 datatype = argvs[2] # data type ('pocket' or 'local')
318 outfile = argvs[3] # output name
319 folder = argvs[4] # folder containing input files
320 runnumbers = sys.argv[5:] # run numbers
321 
322 files = []
323 for runnumber in runnumbers:
324  files += [f for f in glob.glob(str(folder) + '/*' + str(runnumber) + '*.sroot')]
325 sroot = True
326 if len(files) == 0:
327  sroot = False
328  for runnumber in runnumbers:
329  files += [f for f in glob.glob(str(folder) + '/*' + str(runnumber) + '*.root')]
330 
331 for fname in files:
332  print("file: " + fname)
333 
334 if dbaddress != 'none':
335  print("using local DB " + dbaddress)
336  b2.conditions.append_testing_payloads(dbaddress + "/localDB.txt")
337 else:
338  print("database not set. Continuing without calibrations")
339 
340 # Suppress messages and warnings during processing
341 b2.set_log_level(b2.LogLevel.ERROR)
342 
343 # Define a global tag (note: the one given bellow can be out-dated!)
344 b2.conditions.override_globaltags()
345 b2.conditions.append_globaltag('online')
346 
347 # Create path
348 main = b2.create_path()
349 
350 # input
351 if sroot:
352  roinput = b2.register_module('SeqRootInput') # sroot files
353 else:
354  roinput = b2.register_module('RootInput') # root files
355 roinput.param('inputFileNames', files)
356 main.add_module(roinput)
357 
358 # conversion from RawCOPPER or RawDataBlock to RawDetector objects
359 if datatype == 'pocket':
360  print('pocket DAQ data assumed')
361  converter = b2.register_module('Convert2RawDet')
362  main.add_module(converter)
363 
364 # Initialize TOP geometry parameters (creation of Geant geometry is not needed)
365 main.add_module('TOPGeometryParInitializer')
366 
367 # Unpacking (format auto detection works now)
368 unpack = b2.register_module('TOPUnpacker')
369 main.add_module(unpack)
370 
371 # Add multiple hits by running feature extraction offline
372 featureExtractor = b2.register_module('TOPWaveformFeatureExtractor')
373 main.add_module(featureExtractor)
374 
375 # Convert to TOPDigits
376 converter = b2.register_module('TOPRawDigitConverter')
377 if dbaddress == 'none':
378  print("Not using TBC")
379  converter.param('useSampleTimeCalibration', False)
380 else:
381  print("Using TBC")
382  converter.param('useSampleTimeCalibration', True)
383 converter.param('useAsicShiftCalibration', False)
384 converter.param('useChannelT0Calibration', False)
385 converter.param('useModuleT0Calibration', False)
386 converter.param('useCommonT0Calibration', False)
387 converter.param('calibrationChannel', -1) # do not specify the calpulse channel
388 converter.param('lookBackWindows', 28) # in number of windows
389 main.add_module(converter)
390 
391 # resolution plotter
392 resolutionModule = TOPTBCResolution()
393 resolutionModule.setOutputName(outfile)
394 resolutionModule.setMinWidth(0.5) # calpluse candidate selection
395 resolutionModule.setMaxWidth(3.5) # calpluse candidate selection
396 resolutionModule.setMinAmp(150) # calpluse candidate selection
397 resolutionModule.setMaxAmp(999) # calpluse candidate selection
398 if dbaddress == 'none':
399  resolutionModule.ignoreNotCalibrated(False)
400 else:
401  resolutionModule.ignoreNotCalibrated(True)
402 main.add_module(resolutionModule)
403 
404 # Show progress of processing
405 progress = b2.register_module('Progress')
406 main.add_module(progress)
407 
408 # Process events
409 b2.process(main)
410 
411 # Print call statistics
412 print(b2.statistics)
413 print(b2.statistics(b2.statistics.TERM))
A (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:72
bool m_ignoreNotCalibrated
ignores the hits wthout calibration
h_DeltaTVSChannel_RF
DeltaT rising-falling VS channel.
int m_calpulseMinAmp
minimum amplitude to flag a calpulse candidate
h_WidthVSAmplitude_1
Width VS amplitude, first calibration pulse.
def ignoreNotCalibrated(self, ignoreNotCal)
h_DeltaTVSdVdt_RR
DeltaT rising-rising VS average of dV/dt on the first and second pulse.
h_ResolutionVSdVdt_RR
DeltaT resolution VS average of dV/dt (rising-rising)
h_dVdtFallingDifference
Difference between the dV/dt of the first and the second calpulse, using the rising edges.
h_dVdtFalling_1
dV/dt on the falling edge, first calibration pulse
h_dVdtFalling_2
dV/dt on the falling edge, second calibration pulse
h_dVdtRisingVSdVdtFalling_2
dV/dt on the rising edge VS dV/dt on the falling edge, first calibration pulse
h_DeltaTVSChannel_RR
DeltaT rising-rising VS channel.
h_dVdtRising_2
dV/dt on the rising edge, second calibration pulse
int m_calpulseMaxAmp
minimum amplitude to flag a calpulse candidate
h_dVdtRisingDifference
Difference between the dV/dt of the first and the second calpulse, using the rising edges.
h_DeltaTVSdVdt_FF
DeltaT falling-falling VS average of dV/dt on the first and second pulse.
h_dVdtRising_1
dV/dt on the rising edge, first calibration pulse
h_ResolutionVSdVdt_FF
DeltaT resolution VS average of dV/dt (falling-falling)
float m_calpulseMinWidth
minimum width to flag a calpulse candidate
h_DeltaTVSChannel_FF
DeltaT falling-falling VS channel.
h_dVdtRisingVSdVdtFalling_1
dV/dt on the rising edge VS dV/dt on the falling edge, first calibration pulse
int m_calpulseMaxWidth
maximum width to flag a calpulse candidate
h_DeltaTVSChannel_FR
DeltaT falling-rising VS channel.
h_WidthVSAmplitude_2
Width VS amplitude, second calibration pulse.