Belle II Software  release-06-00-14
eclComputePulseTemplates_Step2.py
1 
8 import numpy as np
9 from scipy.fftpack import fft, ifft
10 import ROOT
11 from ROOT import TFile
12 import sys
13 from array import array
14 #
15 # See eclComputePulseTemplates_Step0.cc for README instructions.
16 #
17 
18 
19 def EvalGamComp(tin, ttrg):
20  if tin < ttrg:
21  return 0
22  Ratio = 0.56936
23  FastTau = 851.28 * (0.88348588) # Converting to sample number time scale
24  SlowTau = 5802.0 * (0.88348588) # Converting to sample number time scale
25  val = Ratio * ((1. / FastTau) * np.exp(-(tin - ttrg) / FastTau)) + \
26  (1 - Ratio) * ((1. / SlowTau) * np.exp(-(tin - ttrg) / SlowTau))
27  return val
28 
29 
30 def EvalHadronComp(tin, ttrg):
31  HadronTau = 630. * (0.88348588) # Converting to sample number time scale
32  if tin < ttrg:
33  return 0
34  val = ((1. / HadronTau) * np.exp(-(tin - ttrg) / HadronTau))
35  return val
36 
37 
38 def EvalAnyComp(tin, ttrg, TauIn):
39  TauIn *= (0.88348588) # Converting to sample number time scale
40  if tin < ttrg:
41  return 0
42  val = ((1. / TauIn) * np.exp(-(tin - ttrg) / TauIn))
43  return val
44 
45 
46 def CalcShaperOutput(muonShaper, muonInitial, inputPreShaper, ITER):
47  impulse = ((ifft((fft(muonShaper) / fft(muonInitial)))))
48  outputShaper = np.real(ifft(fft(impulse) * fft(inputPreShaper)))
49  base = outputShaper[ITER]
50  i = 0
51  while i < len(outputShaper):
52  outputShaper[i] -= base
53  i = i + 1
54  outputShaper[0] = 0
55  print(outputShaper.max())
56  return outputShaper
57 
58 
59 def GetShaperOutput(ratio, flg, shaperMuonFunc):
60 
61  Ns = 100000
62  TLen = 100000.
63  to_ns = TLen/Ns
64  #
65  PMT_trigger_time = 1000. * to_ns
66  #
67  Time = []
68  TimeShp = []
69  ShaperDSP_output_muon_array = []
70  PMT_output_muon_array = []
71  PMT_output_array = []
72  #
73  for i in range(0, Ns):
74  t = i * to_ns
75  Time.append(t)
76  TimeShp.append(t)
77  ShaperDSP_output_muon_array.append(shaperMuonFunc[i])
78  PMT_output_muon_array.append(EvalGamComp(t, PMT_trigger_time))
79  if ratio <= 1.:
80  PMT_output_array.append((1 - ratio) * EvalGamComp(t, PMT_trigger_time) + ratio * (EvalHadronComp(t, PMT_trigger_time)))
81  else:
82  PMT_output_array.append((2 - ratio) * EvalGamComp(t, PMT_trigger_time) +
83  (ratio - 1) * (EvalAnyComp(t, PMT_trigger_time, 10)))
84  #
85  if(flg == 0):
86  return Time, PMT_output_array
87  if(flg == 1):
88  return Time, PMT_output_muon_array
89  if(flg == 2):
90  return Time, ShaperDSP_output_muon_array
91  if(flg == 3):
92  ShaperDSP_output_array = []
93  if(ratio <= 1.):
94  ShaperDSP_output_array = CalcShaperOutput(ShaperDSP_output_muon_array, PMT_output_muon_array, PMT_output_array, 0)
95  else:
96  ShaperDSP_output_array = CalcShaperOutput(ShaperDSP_output_muon_array, PMT_output_muon_array, PMT_output_array, 30)
97  j = 0
98  Time_us = []
99  while j < len(Time):
100  Time_us.append(Time[j] / (1000.))
101  j = j + 1
102  return Time_us, ShaperDSP_output_array
103 
104 
105 OutputDirectory = ""
106 if(OutputDirectory == ""):
107  print("Error set ouput directory")
108  sys.exit()
109 #
110 Low = int(sys.argv[1])
111 High = int(sys.argv[2])
112 #
113 f1 = ROOT.TFile(OutputDirectory + "PhotonShapes_Low" + str(Low) + "_High" + str(High) + ".root", "update")
114 f1.cd()
115 mt = f1.Get("mtree")
116 entries = mt.GetEntries()
117 print(entries)
118 #
119 TFactor = 30
120 #
121 outFile = TFile(OutputDirectory + "HadronShapes_Low" + str(Low) + "_High" + str(High) + ".root", "RECREATE")
122 outTree = ROOT.TTree("HadronTree", "")
123 TimeAll_A = array('d', 1000 * [0.])
124 ValuePhoton_A = array('d', 1000 * [0.])
125 ValueHadron_A = array('d', 1000 * [0.])
126 ValueDiode_A = array('d', 1000 * [0.])
127 outTree.Branch("TimeAll_A", TimeAll_A, 'TimeAll_A[1000]/D')
128 outTree.Branch("ValuePhoton_A", ValuePhoton_A, 'ValuePhoton_A[1000]/D')
129 outTree.Branch("ValueHadron_A", ValueHadron_A, 'ValueHadron_A[1000]/D')
130 outTree.Branch("ValueDiode_A", ValueDiode_A, 'ValueDiode_A[1000]/D')
131 #
132 i = 0
133 for i in range(entries):
134  mt.GetEntry(i)
135  if(mt.PhotonArray[1] < -100):
136  for j in range(1000):
137  ValuePhoton_A[j] = -999
138  TimeAll_A[j] = -999
139  ValueHadron_A[j] = -999
140  ValueDiode_A[j] = -999
141  else:
142  flag = 3
143  Time3, ValuesHadron_A = GetShaperOutput(1, flag, mt.PhotonArray)
144  Time4, ValuesDiode_A = GetShaperOutput(2, flag, mt.PhotonArray)
145  Time6, ValuesPhoton_A = GetShaperOutput(0, flag, mt.PhotonArray)
146  #
147  factor = TFactor
148  for j in range(1000):
149  if(flag == 3):
150  ValuePhoton_A[j] = mt.PhotonArray[j * factor]
151  else:
152  ValuePhoton_A[j] = ValuesPhoton_A[j * factor]
153  TimeAll_A[j] = Time3[j * factor]
154  ValueHadron_A[j] = ValuesHadron_A[j * factor]
155  ValueDiode_A[j] = ValuesDiode_A[j * factor]
156  outTree.Fill()
157 outFile.cd()
158 outTree.Write()
159 outFile.Write()
160 sys.exit()