diff --git a/bmos/__init__.py b/bmos/__init__.py
index 86844fca7a173a7abd077b8797d087621961e814..d83c957c18a435cd9d1488a3ecf6c79604c85a94 100644
--- a/bmos/__init__.py
+++ b/bmos/__init__.py
@@ -16,4 +16,15 @@ def main(kwargs):
     if label == 'GetSignal':
         from . import get_signal
         get_signal.get_signal()
+        
+    if label == 'histogram_signal':
+        from . import histogram_signal
+        histogram_signal.get_signal()
 
+    if label == 'one_histogram':
+        from . import histogram
+        histogram.main("one")
+
+    if label == 'all_histogram':
+        from . import histogram
+        histogram.main("all")
diff --git a/bmos/histogram.py b/bmos/histogram.py
new file mode 100644
index 0000000000000000000000000000000000000000..30b6c14066a43d233389ac8c5f0afe48ebd8c108
--- /dev/null
+++ b/bmos/histogram.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python3
+# -*- encoding: utf-8 -*-
+
+import sys
+import os
+import array
+import time
+import subprocess
+import re
+import json
+
+import ROOT
+ROOT.gROOT.SetBatch(True)
+import numpy
+
+from gen_signal import build_device as bdv
+from field import devsim_field as devfield
+from current import cal_current as ccrt
+from elec.set_pwl_input import set_pwl_input as pwlin
+from util.output import output
+from . import bmos
+import numpy as np
+
+def mkdir(folder_name):
+    try:
+        os.makedirs(folder_name)
+    except Exception as e:
+            pass
+
+def readfile(path, root_name): 
+    file = ROOT.TFile(os.path.join(path, root_name), "READ")
+    tree = file.Get("tree")
+
+    amplitudes = []
+    for i in range(tree.GetEntries()):       
+        tree.GetEntry(i)
+        amplitudes.append(tree.amplitude)
+
+    file.Close()
+    return amplitudes
+
+def data(root_path, root_name):
+    file_name = os.path.splitext(root_name)[0]
+    amplitudes = readfile(root_path, root_name)
+    mean = np.mean(amplitudes)
+    std = np.std(amplitudes)
+    # amplitudes = [amplitude*17.925/0.138*0.8847486018957982 for amplitude in amplitudes if amplitude > mean - 3*std and amplitude < mean + 3*std]
+    amplitudes = [amplitude*17.925/0.138 for amplitude in amplitudes if amplitude > mean - 3*std and amplitude < mean + 3*std]
+
+    return amplitudes, file_name
+
+
+def draw(amplitudes, file_name):
+    c = ROOT.TCanvas( 'c', 'c', 8000, 6000 )
+    c.cd()
+ 
+    minsignal = float(min(amplitudes))
+    maxsignal = float(max(amplitudes))
+    binnum = 50
+    binwidth = (maxsignal - minsignal)/binnum
+    wave_graph = ROOT.TH1F('','', binnum + 2, minsignal - binwidth, maxsignal + binwidth)
+    for amplitude in amplitudes:
+        wave_graph.Fill(amplitude)
+
+    f1 = ROOT.TF1("f1", "landau")
+    wave_graph.Fit(f1)
+
+    wave_graph.SetTitle(file_name)
+    wave_graph.SetLineColor(1)
+    wave_graph.SetLineWidth(2)
+
+    wave_graph.GetXaxis().SetTitle('mV')
+    wave_graph.GetXaxis().SetTitleSize(0.05)
+    wave_graph.GetXaxis().SetTitleOffset(0.9)
+    wave_graph.GetYaxis().SetTitle('events')
+    wave_graph.GetYaxis().SetTitleSize(0.05)
+    wave_graph.GetYaxis().SetTitleOffset(0.9)
+    # wave_graph.GetXaxis().SetRangeUser(0, 1300)
+    # wave_graph.GetXaxis().SetLimits(0, 1300)
+    wave_graph.Draw()
+    maxevent = wave_graph.GetMaximum()
+
+    latex = ROOT.TLatex(0.4*minsignal + 0.6*maxsignal, 0.7*maxevent, f"MPV:{round(f1.GetParameter(1), 3)}mV")
+    latex.SetTextSize(0.05)
+    latex.SetTextColor(1)
+    latex.SetTextFont(42)
+    latex.Draw()
+
+    mkdir(os.path.join("/scratchfs/atlas/xiekaibo/sicar/raser/bmos/output/", 'histogram', 'pdf'))
+
+    c.SaveAs(os.path.join("/scratchfs/atlas/xiekaibo/sicar/raser/bmos/output/", 'histogram', 'pdf', f"{file_name}.pdf"))
+
+    
+
+def main(choose):
+    tag = 'proton_80MeV'
+    # tag = ''
+    root_path = os.path.join("/scratchfs/atlas/xiekaibo/sicar/raser/bmos/output/histogram/root", tag)
+    root_names = os.listdir(root_path)
+
+    if choose == "all":
+        for root_name in root_names:
+            amplitudes, file_name = data(root_path, root_name)
+            draw(amplitudes, file_name)
+    elif choose == "one":
+        c = ROOT.TCanvas( 'c', 'c', 8000, 6000 )
+        his = []
+
+        for i in range(len(root_names)):
+            c.cd()
+
+            amplitudes, file_name = data(root_path, root_names[i])
+            # minsignal = float(min(amplitudes))
+            # maxsignal = float(max(amplitudes))
+            # binnum = 50
+            # binwidth = (maxsignal - minsignal)/binnum
+            # his.append(ROOT.TH1F('','', binnum + 2, minsignal - binwidth, maxsignal + binwidth))
+            his.append(ROOT.TH1F('','', 150, 0, 1500))
+
+            for amplitude in amplitudes:
+                his[i].Fill(amplitude)
+
+            his[i].Draw("same")
+            his[i].Fit("landau")
+
+            his[i].SetTitle(tag)
+            his[i].SetLineColor(1)
+            his[i].SetLineWidth(2)
+
+            his[i].GetXaxis().SetTitle('mV')
+            his[i].GetXaxis().SetTitleSize(0.05)
+            his[i].GetXaxis().SetTitleOffset(0.9)
+            # his[i].GetXaxis().SetRangeUser(0, 1300)
+            # his[i].GetXaxis().SetLimits(0, 1300)
+            his[i].GetYaxis().SetTitle('events')
+            his[i].GetYaxis().SetTitleSize(0.05)
+            his[i].GetYaxis().SetTitleOffset(0.9)
+            his[i].GetYaxis().SetRangeUser(0, 150)
+
+        mkdir(os.path.join("/scratchfs/atlas/xiekaibo/sicar/raser/bmos/output/", 'histogram', 'pdf', tag))
+        c.SaveAs(os.path.join("/scratchfs/atlas/xiekaibo/sicar/raser/bmos/output/", 'histogram', 'pdf', tag, f"{file_name}_all.pdf"))
+
+    
+    
\ No newline at end of file
diff --git a/bmos/histogram_signal.py b/bmos/histogram_signal.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a222f591145df68e3003e3ab23c2b87438780b3
--- /dev/null
+++ b/bmos/histogram_signal.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python3
+# -*- encoding: utf-8 -*-
+
+import sys
+import os
+import array
+import time
+import subprocess
+import re
+import json
+
+import ROOT
+ROOT.gROOT.SetBatch(True)
+import numpy
+
+from gen_signal import build_device as bdv
+from field import devsim_field as devfield
+from current import cal_current as ccrt
+from elec.set_pwl_input import set_pwl_input as pwlin
+from util.output import output
+from . import bmos
+
+def mkdir(folder_name):
+    try:
+        os.makedirs(folder_name)
+    except Exception as e:
+            pass
+    
+def get_signal():
+    signal = []
+
+    geant4_json = "./setting/absorber/bmos.json"
+    with open(geant4_json) as f:
+         g4_dic = json.load(f)
+
+    detector_json = "./setting/detector/"
+    with open(os.path.join(detector_json , g4_dic['DetModule'])) as q:
+         det_dic = json.load(q)
+
+    start = time.time()
+
+    det_name = det_dic['det_name']
+    my_d = bdv.Detector(det_name)
+    
+    voltage = det_dic['bias']['voltage']
+    amplifier = det_dic['amplifier']
+    
+    my_f = devfield.DevsimField(my_d.device, my_d.dimension, voltage, my_d.read_out_contact, my_d.irradiation_flux)
+
+    my_g4p = bmos.bmosG4Particles(my_d)
+
+    output_path = "raser/bmos/output/"
+    tag = f"{g4_dic['par_type']}_{g4_dic['par_energy']}MeV_{g4_dic['par_num']}particle"
+    dirname = f"{g4_dic['par_type']}_{g4_dic['par_energy']}MeV"
+    root_name = f"{g4_dic['CurrentName'].split('.')[0]}_{tag}.root"
+    pwl_name = f"pwl{g4_dic['CurrentName'].split('.')[0]}_{tag}.txt"
+    filename_after_ngspice = f"UCSC_output_{tag}.raw"
+    
+    for i in range(len(my_g4p.p_steps_current)):
+        my_current = ccrt.CalCurrentG4P(my_d, my_f, my_g4p, i)
+
+        save_current(my_current, output_path, root_name, pwl_name, 1)
+
+        pwlin(os.path.join(output_path, pwl_name), amplifier, output_path, filename_after_ngspice)
+        subprocess.run([f"ngspice -b -r ./xxx.raw raser/bmos/output/ucsc_tmp.cir"], shell=True)
+        time_v, volt = read_file_voltage(output_path, filename_after_ngspice)
+        signal.append(max(volt))
+
+    print(signal)
+    draw(output_path, signal, tag, dirname)
+
+    # draw(output_path, pwl_name, filename_after_ngspice, tag, totalengry)
+
+    end = time.time()
+    print("total_time:%s"%(end - start))
+
+def save_current(my_current, output_path, root_name, pwl_name, read_ele_num):
+    time = array.array('d', [999.])
+    current = array.array('d', [999.])
+
+    fout = ROOT.TFile(os.path.join(output_path, root_name), "RECREATE")
+    t_out = ROOT.TTree("tree", "signal")
+    t_out.Branch("time", time, "time/D")
+    for i in range(read_ele_num):
+        t_out.Branch("current"+str(i), current, "current"+str(i)+"/D")
+        for j in range(my_current.n_bin):
+            current[0]=my_current.sum_cu[i].GetBinContent(j)
+            time[0]=j*my_current.t_bin
+            t_out.Fill()
+    t_out.Write()
+    fout.Close()
+   
+    file = ROOT.TFile(os.path.join(output_path, root_name), "READ")
+    tree = file.Get("tree")
+
+    pwl_file = open(os.path.join(output_path, pwl_name), "w")
+
+    for i in range(tree.GetEntries()):       
+        tree.GetEntry(i)
+        time_pwl = tree.time
+        current_pwl = tree.current0
+        pwl_file.write(str(time_pwl) + " " + str(current_pwl) + "\n")
+    
+    pwl_file.close()
+    file.Close()
+
+def read_file_voltage(file_path, file_name):
+    with open(os.path.join(file_path, file_name)) as f:
+        lines = f.readlines()
+        time_v,volt = [],[]
+
+        for line in lines:
+            time_v.append(float(line.split()[0])*1e9)
+            volt.append(float(line.split()[1])*1e3)
+
+    time_v = numpy.array(time_v ,dtype='float64')
+    volt = numpy.array(volt,dtype='float64')
+
+    return time_v,volt
+
+def draw(output_path, signal, tag, dirname):
+    ROOT.gROOT.SetBatch(True)
+    c = ROOT.TCanvas( 'c', 'c', 8000, 6000 )
+    # c.SetCanvasSize(800, 600)
+    # c.SetWindowSize(800, 600)
+    c.cd()
+    minsignal = float(min(signal))
+    maxsignal = float(max(signal))
+    binnum = 50
+    binwidth = (maxsignal - minsignal)/binnum
+    wave_graph = ROOT.TH1F('','', binnum + 2, minsignal - binwidth, maxsignal + binwidth)
+
+    mkdir(os.path.join(output_path, 'histogram', 'root', dirname))
+    file = ROOT.TFile(os.path.join(output_path, 'histogram', 'root', dirname, f"Histogram_{tag}.root"), "RECREATE")
+    amplitude = ROOT.TTree("tree", "amplitude")
+    amp =array.array('d', [0.0])
+    amplitude.Branch("amplitude", dirname, "amplitude/D")
+    # amplitude.Write()
+    # file.Close()
+
+    for sig in signal:
+        amp[0] = sig
+        amplitude.Fill()
+        wave_graph.Fill(sig)
+
+    # if ifnoise(time, volt, noisestd):
+    #     num_noise += 1
+    #     continue
+    # num_signal += 1
+    wave_graph.Draw()
+    wave_graph.SetTitle(' ')
+    wave_graph.SetLineColor(1)
+    wave_graph.SetLineWidth(2)
+
+    wave_graph.GetXaxis().SetTitle('mV')
+    wave_graph.GetXaxis().SetTitleSize(0.05)
+    wave_graph.GetXaxis().SetTitleOffset(0.9)
+    wave_graph.GetYaxis().SetTitle('events')
+    wave_graph.GetYaxis().SetTitleSize(0.05)
+    wave_graph.GetYaxis().SetTitleOffset(0.9)
+    # wave_graph.Fit("gaus")
+    wave_graph.Fit("landau")
+
+    # c.SaveAs(os.path.join(output_path, f"Histogram_{tag}.root"))
+    c.SaveAs(os.path.join(output_path, 'histogram', 'pdf', f"Histogram_{tag}.pdf"))
+
+    amplitude.Write()
+    wave_graph.Write()
+    file.Close()
+
+