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