diff --git a/elec/readout.py b/elec/readout.py index cf07c0454c4d0a22f61d7d80e6eea7849e3e2f76..1085dc4cf9d8e50fc63929d13903bf01e7d0c955 100644 --- a/elec/readout.py +++ b/elec/readout.py @@ -21,6 +21,8 @@ ROOT.gROOT.SetBatch(True) from util.math import signal_convolution from util.output import output +TIME_BIN_WIDTH = 50e-12 # need to be consistent with the bin width in CalCurrent + class Amplifier: """Get current after amplifier with convolution, for each reading electrode @@ -123,7 +125,7 @@ class Amplifier: elif self.amplifier_parameters['ele_name'] == 'Broad_Band': """ Broad Bandwidth Amplifier (Charge Sensitive Amplifier) parameter initialization""" - mode = "scope" + mode = "RC" def pulse_responce_Broad_Band(t): if t < 0: # step function @@ -154,12 +156,13 @@ class Amplifier: """ Broad Bandwidth Amplifier (Charge Sensitive Amplifier) scale function""" if mode == "scope": - R_in = 50 - return R_in + Broad_Band_Gain = self.amplifier_parameters['Broad_Band_Gain'] + return Broad_Band_Gain elif mode == "RC": - Broad_Band_Gain = self.amplifier_parameters['Broad_Band_Gain'] # kOhm ? - return Broad_Band_Gain * 1e3 + Broad_Band_Gain = self.amplifier_parameters['Broad_Band_Gain'] + R_in = 50 + return Broad_Band_Gain * R_in self.pulse_responce_list = [pulse_responce_Broad_Band] self.scale = scale_Broad_Band @@ -202,7 +205,7 @@ class Amplifier: def set_scope_output(self, currents: list[ROOT.TH1F]): for i in range(self.read_ele_num): cu = currents[i] - input_Q_tot = cu.Integral() + input_Q_tot = cu.Integral()*TIME_BIN_WIDTH output_Q_max = self.amplified_current[i].GetMaximum() self.amplified_current[i].Scale(self.scale(output_Q_max, input_Q_tot)) diff --git a/gen_signal/build_device.py b/gen_signal/build_device.py index 28285211f315c758eb160880e52ca2d0c1bd2241..8f190362fd059bb924bd3f5ea30d144fdc89fec4 100644 --- a/gen_signal/build_device.py +++ b/gen_signal/build_device.py @@ -31,7 +31,7 @@ class Detector: self.l_y = self.device_dict['ly'] self.l_z = self.device_dict['lz'] - self.voltage = self.device_dict['bias']['voltage'] + self.voltage = float(self.device_dict['bias']['voltage']) self.temperature = self.device_dict['temperature'] self.material = self.device_dict['material'] diff --git a/gen_signal/draw_save.py b/gen_signal/draw_save.py index dcd84e580f41738445520c7d3e3dcd522fc5c04e..cab118e3bde26c4264e7918fb8c23583828e53b0 100644 --- a/gen_signal/draw_save.py +++ b/gen_signal/draw_save.py @@ -14,6 +14,8 @@ ROOT.gROOT.SetBatch(True) from util.output import output +TIME_BIN_WIDTH = 50e-12 # need to be consistent with the bin width in CalCurrent + def energy_deposition(my_g4v): """ @description: @@ -346,13 +348,13 @@ def save_signal_time_resolution(my_d,batch_number,sum_cu,ele_current,my_g4p,star output_path = output(__file__, my_d.det_name, 'batch') for k in range(ele_current.read_ele_num): - charge = sum_cu[k].Integral() + charge = sum_cu[k].Integral()*TIME_BIN_WIDTH charge_str = "_charge=%.2f_"%(charge*1e15) #fc e_dep = "dep=%.5f_"%(my_g4p.edep_devices[batch_number-start_n]) #mv output_file = output_path + "/t_" +str(batch_number)+charge_str+e_dep+"events.csv" f1 = open(output_file,"w") - f1.write("time[ns], Amplitude [mV] \n") + f1.write("time [ns], Amplitude [mV] \n") for i in range(ele_current.amplified_current[k].GetNbinsX()): f1.write("%s,%s \n"%(i*ele_current.amplified_current[k].GetBinWidth(0), ele_current.amplified_current[k][i])) diff --git a/timeres/add_noise.py b/timeres/add_noise.py index 72f2235b3eefc39ec8056529208fe6ea6a9676a7..b594633bf22d8b0ee5ceaa2719a641106bd46534 100644 --- a/timeres/add_noise.py +++ b/timeres/add_noise.py @@ -58,7 +58,7 @@ h_noise_height.clear() # The judge parameter configuration and read data class NoiseSetting: - def __init__(self): + def __init__(self, ele_name): """ @description: The judge parameter configuration @@ -70,7 +70,6 @@ class NoiseSetting: @Modify: 2021/08/31 """ - self.thre_vth=18 # mv self.CFD=0.5 self.effective_event_number=0 self.CFD_time=[] @@ -78,6 +77,12 @@ class NoiseSetting: self.max_voltage=[] self.current_integral=[] + + self.ele_name=ele_name + ele_json = "./setting/electronics/" + self.ele_name + ".json" + with open(ele_json) as f: + amplifier_parameters = json.load(f) + self.thre_vth=amplifier_parameters["threshold"] # mv def create_outpath(self,path): """ @@ -349,9 +354,13 @@ def judge_threshold(addNoise,rset,tree_class): @Modify: 2021/08/31 """ - #if (addNoise.ampl_paras[max_height]>rset.thre_vth and addNoise.ampl_paras[max_time]<80): - get_CFD_time(addNoise,addNoise.ampl_paras,rset) - tree_class.fill_ampl(addNoise,rset,"max_nps_height","max_pulse_time") + if (addNoise.ampl_paras["max_s_height"]>rset.thre_vth and addNoise.ampl_paras["max_pulse_time"]<80): + # temp set + get_CFD_time(addNoise,addNoise.ampl_paras,rset) + tree_class.fill_ampl(addNoise,rset,"max_nps_height","max_pulse_time") + return True + else: + return False def get_CFD_time(addNoise,Ampl_paras,rset): """ @@ -531,7 +540,8 @@ def draw_2D_CFD_time(CFD_time,out_put,model): if CFD_time[i]< 9000: histo.Fill(CFD_time[i]) else: - step = 0.05 + #step = 0.05 + step = 0.025 x2_min = 4.8 x2_max = 5.6 n2_bin = int((x2_max-x2_min)/step) @@ -769,7 +779,7 @@ def save_gain_efficiency(input_file, max_voltage, error_max_voltage, current_int + str(current_integral) + ","+ str(error_current_integral) + "\n") # Loop and add noise in the raser -def loop_addNoise(input_file,rset,tree_class,ele_name): +def loop_add_noise(input_file,rset,tree_class,ele_name): for root,dirs,files in os.walk(input_file): for file in files: if 'strip' in input_file: @@ -784,12 +794,12 @@ def loop_addNoise(input_file,rset,tree_class,ele_name): rset.write_list(path,addNoise.list_c) if len(addNoise.list_c)>5: addNoise.add_n(addNoise.list_c) - judge_threshold(addNoise,rset,tree_class) - tree_class.fill_vector(rset,addNoise) - #if addNoise.CFD_time_r>0: - tree_class.tree_out.Fill() - rset.effective_event_number += 1 - tree_class.init_parameter() + if judge_threshold(addNoise,rset,tree_class): + tree_class.fill_vector(rset,addNoise) + #if addNoise.CFD_time_r>0: + tree_class.tree_out.Fill() + rset.effective_event_number += 1 + tree_class.init_parameter() else: break else: @@ -804,12 +814,12 @@ def loop_addNoise(input_file,rset,tree_class,ele_name): rset.write_list(path,addNoise.list_c) if len(addNoise.list_c)>5: addNoise.add_n(addNoise.list_c) - judge_threshold(addNoise,rset,tree_class) - tree_class.fill_vector(rset,addNoise) - #if addNoise.CFD_time_r>0: - tree_class.tree_out.Fill() - rset.effective_event_number += 1 - tree_class.init_parameter() + if judge_threshold(addNoise,rset,tree_class): + tree_class.fill_vector(rset,addNoise) + #if addNoise.CFD_time_r>0: + tree_class.tree_out.Fill() + rset.effective_event_number += 1 + tree_class.init_parameter() else: break efficiency = rset.effective_event_number / Events[0] @@ -823,7 +833,7 @@ def main(kwargs): ele_name = device_dict['amplifier'] det_model = device_dict['det_model'] # Outfilename and init_parameter - rset = NoiseSetting() + rset = NoiseSetting(ele_name) output_path = output(__file__, det_name) input_file = "output/gen_signal/" + det_name + "/batch" #input_file = "output/tct/" + det_name + "/top_TCT" @@ -832,7 +842,7 @@ def main(kwargs): tree_class=RootFile() tree_class.root_define() # Add noise - efficiency = loop_addNoise(input_file,rset,tree_class,ele_name) + efficiency = loop_add_noise(input_file,rset,tree_class,ele_name) # Draw time resolution for constant CFD sigma, error=draw_2D_CFD_time(rset.CFD_time,output_path,'time_resolution') sigma_jit, error_jit=draw_2D_CFD_time(rset.CFD_jitter,output_path,'jitter')