def main():
    args = io_parse_arguments()
    input_file = args.i
    output_path = args.o
    filenames = open(input_file, "r")
    for index, i_filename in enumerate(filenames.readlines()):
        filename = i_filename.strip()

        date = filename.split("/")[-2]
        charge_file = output_path + "/{}_1400V_charges.txt".format(date)
        charge_plot_file = output_path + "/{}_1400V_charge.pdf".format(date)
        charge_fit_file = output_path + "/{}_1400V_charge_fit.pdf".format(date)
        template_file = output_path + "/{}_1400V_templates.txt".format(date)
        print("\n\n>>> Input file: {}".format(filename))

        if not test_file(template_file) or not test_file(charge_file):
            file = minidom.parse(filename)
            print(">>> Parsed file")
            traces = file.getElementsByTagName('trace')

            store_template(template_file, traces)
            template = get_template(template_file)
            print(">>> Got template")

            store_charges(charge_file, traces, template)

        charges = get_charges(charge_file)
        print(">>> Got Charges")

        plot_charge(charge_plot_file, charges)
        pars = plot_fit(charge_fit_file, charges)
    print(">>> Finished")
def main():
    plt.rcParams["figure.figsize"] = (20, 5)

    args = io_parse_arguments()
    directory = args.i
    output_filename = args.o

    try:
        filenames_file = open(directory + "filenames.txt", 'r')
    except FileNotFoundError as fnf_error:
        print(fnf_error)
        raise Exception("Error opening data file")

    file_names = np.loadtxt(directory + "filenames.txt",
                            delimiter=',',
                            dtype={
                                'names': ['filename'],
                                'formats': ['S100']
                            },
                            unpack=True)

    success_rate = [0, 0]
    num_average = 7
    re_bin = 10
    number_total_weeks = 60
    last_temp = [[], []]
    x_og = []
    num_in_week = [[0 for i in range(number_total_weeks + 1)],
                   [0 for i in range(number_total_weeks + 1)]]
    apulse_num_y = [[[] for i in range(10)], [[] for i in range(10)]]
    day_nums = [[], []]

    color = 'g-'
    #for i_file in tqdm.tqdm(range(file_names.size)):
    for i_file in range(file_names.size):
        #print(directory + "/" + file_names[i_file][0].decode("utf-8"))
        file = ROOT.TFile(directory + file_names[i_file][0].decode("utf-8"),
                          "READ")
        date = file_names[i_file][0].decode("utf-8").split("_")[0]
        exposure = process_exposure(np.array([int(date)]))[0]
        day_num = process_date(np.array([int(date)]))[0]
        week_num = int(day_num / num_average)
        time = file_names[i_file][0].decode("utf-8").split("_")[1]

        if i_file == 0:
            name = date + "_" + 'GAO607_apulse_times_1400V'
            hist = file.Get(name)
            temp = []
            the_bin = 0

            #print(hist.GetNbinsX())

            for i_bin in range(hist.GetNbinsX()):
                if the_bin == 0:
                    temp0 = 0

                temp0 += hist.GetBinContent(i_bin)

                the_bin += 1

                if the_bin == re_bin:
                    temp.append(temp0)
                    x_og.append(i_bin * hist.GetBinWidth(i_bin))
                    the_bin = 0

            for i in range(number_total_weeks + 1):
                last_temp[0].append(np.zeros_like(np.array(temp)))
                last_temp[1].append(np.zeros_like(np.array(temp)))

        if day_num < 0:
            continue

        for i_channel in range(2):
            #print(date + "_" + names[i_channel] + "_apulse_times_1400")
            hist = file.Get(date + "_" + names[i_channel] +
                            "_apulse_times_1400V")
            hist_0 = file.Get(date + "_" + names[i_channel] +
                              "_apulse_num_1400V")

            try:
                hist.GetNbinsX()
            except:
                del hist
                continue

            temp = []
            the_bin = 0
            x = []

            for i_bin in range(hist.GetNbinsX()):
                if the_bin == 0:
                    temp0 = 0

                temp0 += hist.GetBinContent(i_bin)

                the_bin += 1

                if the_bin == re_bin:
                    temp.append(temp0)
                    x.append(i_bin * hist.GetBinWidth(i_bin))
                    the_bin = 0
            if i_channel == 0:
                if 0 < day_num < 98:
                    color = 'b-'
                if day_num >= 98:
                    color = 'r-'
                plt.plot(x, 100 * np.array(temp) / hist_0.GetEntries(), color)
                plt.plot(0, 0, 'g-', label="Atmosphere He")
                plt.plot(0, 0, 'b-', label="1% He")
                plt.plot(0, 0, 'r-', label="10% He")
                plt.axvline(1580, ls='--', color='r', label=r"$He^+$")
                plt.axvline(2680, ls='--', color='g', label=r"$H_2O^+$")
                plt.axvline(1290, ls='--', color='k', label=r"$H_2^+ He^{2+}$")
                plt.axvline(2560, ls='--', color='b', label=r"$CH_4^+$")
                plt.axvline(3850, ls='--', color='c', label=r"$CO_2^+$")
                plt.legend(loc="upper right")
                plt.ylim(0, 15)
                plt.xlim(800, 7000)
                plt.xlabel("afterpulse time in waveform /ns")
                plt.ylabel("normalised counts /%")
                plt.title("Ch{} Date:{} Exposure:{} atm-day DayNUM:{}".format(
                    i_channel, date, round(exposure, 2), day_num))
                plt.grid()
                #plt.yscale('log')
                plt.show(block=False)
                plt.pause(0.001)
                plt.close()

            last_temp[i_channel][week_num] += 100 * np.array(
                temp) / hist.GetEntries()
            num_in_week[i_channel][week_num] += 1
            success_rate[i_channel] += 1
            del hist

        for i_channel in range(2):
            hist = file.Get(date + "_" + names[i_channel] +
                            "_apulse_num_1400V")

            try:
                hist.GetNbinsX()
            except:
                del hist
                continue

            for i_bin in range(len(apulse_num_y[i_channel])):
                if hist.GetEntries() > 0:
                    apulse_num_y[i_channel][i_bin].append(
                        hist.GetBinContent(i_bin) / hist.GetEntries())
                else:
                    pass

            day_nums[i_channel].append(day_num)
            del hist

        file.Close()
        del file

    for i_week in range(len(last_temp[0])):
        if i_week < 14:
            color = 'b-'
        elif i_week >= 14:
            color = 'r-'
        else:
            color = 'g-'
        plt.plot(x_og, last_temp[0][i_week] / num_in_week[0][i_week], color)
        plt.title("Ch:{} Week num:{}".format(0, i_week))
        plt.ylim(0, 6)
        plt.plot(0, 0, 'g-', label="Atmosphere He")
        plt.plot(0, 0, 'b-', label="1% He")
        plt.plot(0, 0, 'r-', label="10% He")
        plt.axvline(1580, ls='--', color='r', label=r"$He^+$")
        plt.axvline(2680, ls='--', color='g', label=r"$H_2O^+$")
        plt.axvline(1290, ls='--', color='k', label=r"$H_2^+ He^{2+}$")
        plt.axvline(2560, ls='--', color='b', label=r"$CH_4^+$")
        plt.axvline(3850, ls='--', color='c', label=r"$CO_2^+$")
        plt.xlim(800, 7000)
        plt.xlabel("afterpulse time in waveform /ns")
        plt.ylabel("normalised counts /%")
        plt.legend(loc="upper right")
        plt.grid()
        plt.show(block=False)
        plt.pause(0.01)
        plt.close()
    #plt.rcParams["figure.figsize"] = (20, 20)'''
    '''for i_bin in range(1,len(apulse_num_y[0])):
        ylim = 0
        if i_bin == 1:
            ylim = 100
        else:
            ylim = 100/ (i_bin*2)

        plt.subplot(3,1,1)
        plt.plot(day_nums[0],100*np.array(apulse_num_y[0][i_bin]), 'k.')
        plt.axvline(98, color='r', ls='--')
        plt.axvline(0, color='b', ls='--')
        plt.title("Apulse num:{}".format(i_bin-1))
        plt.grid()
        plt.ylim(0,ylim)

        plt.subplot(3,1,2)
        plt.plot(day_nums[1],100*np.array(apulse_num_y[1][i_bin]), 'k.')
        plt.axvline(98, color='r', ls='--')
        plt.axvline(0, color='b', ls='--')
        plt.ylabel("Percentage apulses /%")
        plt.grid()
        plt.ylim(0, ylim)

        plt.subplot(3,1,3)
        plt.plot(day_nums[0], np.array(apulse_num_y[0][i_bin])/np.array(apulse_num_y[1][i_bin]), 'k.')
        plt.axvline(98, color='r', ls='--')
        plt.axvline(0, color='b', ls='--')
        plt.xlabel("Exposure time /days")
        plt.grid()
        plt.ylabel("Ratio")
        plt.savefig('/Users/willquinn/Desktop/apulse_num_bin_'+str(i_bin))
        plt.close()'''

    print("Success rate: {} Ch0 {} Ch1".format(
        success_rate[0] / file_names.size, success_rate[1] / file_names.size))

    return
def main():
    args = io_parse_arguments()
    input_data_filename = args.i
    output_filename = args.o

    name = input_data_filename.split("/")[-1]
    name = name.split(".root")[0]

    gveto_num = 0
    xwall_num = 0
    mw_8i_num = 0
    mw_5i_num = 0
    mwall_num = 0

    x_array_gveto = []
    y_array_gveto = []
    z_array_gveto = []

    x_array_xwall = []
    y_array_xwall = []
    z_array_xwall = []

    x_array_mw_8i = []
    y_array_mw_8i = []
    z_array_mw_8i = []

    x_array_mw_5i = []
    y_array_mw_5i = []
    z_array_mw_5i = []

    gveto_om_list = [[[0 for i in range(16)], [0 for i in range(16)]],
                     [[0 for i in range(16)], [0 for i in range(16)]]]
    xwall_om_list = [[[[0 for i in range(16)], [0 for i in range(16)]],
                      [[0 for i in range(16)], [0 for i in range(16)]]],
                     [[[0 for i in range(16)], [0 for i in range(16)]],
                      [[0 for i in range(16)], [0 for i in range(16)]]]]
    mwall_om_list = [[[0 for i in range(13)] for j in range(20)],
                     [[0 for i in range(13)] for j in range(20)]]

    file = ROOT.TFile(input_data_filename, "READ")
    output = ROOT.TFile(output_filename, "RECREATE")

    xy_hist = ROOT.TH2I("xy", "xy", 8000, -4000, 4000, 8000, -4000, 4000)
    yz_hist = ROOT.TH2I("yz", "yz", 8000, -4000, 4000, 8000, -4000, 4000)
    xz_hist = ROOT.TH2I("xz", "xz", 8000, -4000, 4000, 8000, -4000, 4000)

    gveto_event_rate = ROOT.TH1I("gveto_rate", "gveto_rate", 1000000, 0,
                                 1000000)
    xwall_event_rate = ROOT.TH1I("xwall_rate", "xwall_rate", 1000000, 0,
                                 1000000)
    mwall_event_rate_8inch = ROOT.TH1I("mwall_rate_8inch", "mwall_rate_8inch",
                                       1000000, 0, 1000000)
    mwall_event_rate_5inch = ROOT.TH1I("mwall_rate_5inch", "mwall_rate_5inch",
                                       1000000, 0, 1000000)

    om_2d_hist = ROOT.TH2I(name, name, 24, 0, 24, 36, 0, 36)

    for event in file.T:
        x = event.x
        y = event.y
        z = event.z

        xy_hist.Fill(x, y)
        yz_hist.Fill(y, z)
        xz_hist.Fill(x, z)

        # Cuts on xy

        # Isolate XW and MW OMs
        if (-1700 < z < 1700):
            # XW
            if (-550 < x < 550):
                x_array_xwall.append(x)
                y_array_xwall.append(y)
                z_array_xwall.append(z)
                xwall_num += 1
                # End 1
                if y > 0:
                    e = 1
                    # Side 1
                    if x < 0:
                        s = 1
                    # Side 0
                    else:
                        s = 0

                # End  0
                else:
                    e = 0
                    # Side 1
                    if x < 0:
                        s = 1
                    # Side 0
                    else:
                        s = 0
                c = get_xwall_col_num(x)
                fill_xwall_om(xwall_om_list, s, e, c, z)
            # MW
            else:
                mwall_num += 1
                # Side 1
                if x > 0:
                    s = 1
                # Side 0
                else:
                    s = 0
                type = fill_mwall_om(mwall_om_list, s, y, z)
                if type == 5:
                    mw_5i_num += 1
                    x_array_mw_5i.append(x)
                    y_array_mw_5i.append(y)
                    z_array_mw_5i.append(z)
                else:
                    mw_8i_num += 1
                    x_array_mw_8i.append(x)
                    y_array_mw_8i.append(y)
                    z_array_mw_8i.append(z)
        # The rest are the GV OMs
        else:
            gveto_num += 1
            x_array_gveto.append(x)
            y_array_gveto.append(y)
            z_array_gveto.append(z)
            # Top
            if z > 0:
                t = 1
                # Side 1
                if x > 0:
                    s = 1
                # Side 0
                else:
                    s = 0
            # Bottom
            else:
                t = 0
                # Side 1
                if x > 0:
                    s = 1
                # Side 0
                else:
                    s = 0
            fill_gveto_om(gveto_om_list, s, t, y)

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    ax.scatter(np.array(x_array_mw_5i),
               np.array(y_array_mw_5i),
               np.array(z_array_mw_5i),
               c='g',
               marker='.',
               label='MW 5\"')
    ax.scatter(np.array(x_array_mw_8i),
               np.array(y_array_mw_8i),
               np.array(z_array_mw_8i),
               c='k',
               marker='.',
               label='MW 8\"')
    ax.scatter(np.array(x_array_gveto),
               np.array(y_array_gveto),
               np.array(z_array_gveto),
               c='r',
               marker='.',
               label='GVeto')
    ax.scatter(np.array(x_array_xwall),
               np.array(y_array_xwall),
               np.array(z_array_xwall),
               c='b',
               marker='.',
               label='XWall')

    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    plt.legend()
    plt.savefig('/Users/willquinn/Desktop/pmt_glass_sim_test/' + name)

    plt.close(fig)

    gveto_oms = []
    xwall_oms = []
    mw_5i_oms = []
    mw_8i_oms = []

    for i_side in range(2):
        if i_side == 0:
            s = -1
        else:
            s = 1
        for i_end in range(2):
            for i_col in range(2):
                for i_om in range(len(xwall_om_list[i_side][i_end][i_col])):
                    if i_end == 1:
                        x = 23 - i_col
                        if i_side == 0:
                            y = i_om + 1
                        else:
                            y = i_om + 19
                    else:
                        x = 0 + i_col
                        if i_side == 0:
                            y = i_om + 1
                        else:
                            y = i_om + 19
                    xwall_event_rate.Fill(
                        xwall_om_list[i_side][i_end][i_col][i_om])
                    xwall_oms.append(xwall_om_list[i_side][i_end][i_col][i_om])
                    for i in range(xwall_om_list[i_side][i_end][i_col][i_om]):
                        om_2d_hist.Fill(x, y)

            for i_om in range(len(gveto_om_list[i_side][i_end])):
                if i_side == 0:
                    if i_end == 1:
                        y = 17
                    else:
                        y = 0
                else:
                    if i_end == 1:
                        y = 35
                    else:
                        y = 18
                x = i_om + 4
                gveto_event_rate.Fill(gveto_om_list[i_side][i_end][i_om])
                gveto_oms.append(gveto_om_list[i_side][i_end][i_om])
                for i in range(gveto_om_list[i_side][i_end][i_om]):
                    om_2d_hist.Fill(x, y)

        for i_col in range(len(mwall_om_list[i_side])):
            for i_row in range(len(mwall_om_list[i_side][i_col])):
                if i_side == 0:
                    y = 2 + i_row
                else:
                    y = 20 + i_row
                x = 2 + i_col
                if i_row == 12 or i_row == 0:
                    mwall_event_rate_5inch.Fill(
                        mwall_om_list[i_side][i_col][i_row])
                    mw_5i_oms.append(mwall_om_list[i_side][i_col][i_row])
                else:
                    mwall_event_rate_8inch.Fill(
                        mwall_om_list[i_side][i_col][i_row])
                    mw_8i_oms.append(mwall_om_list[i_side][i_col][i_row])
                for i in range(mwall_om_list[i_side][i_col][i_row]):
                    om_2d_hist.Fill(x, y)

    gveto_oms_array = np.array(gveto_oms)
    g_x = []
    for i in range(gveto_oms_array.size):
        g_x.append(i)
    g_x = np.array(g_x)

    xwall_oms_array = np.array(xwall_oms)
    x_x = []
    for i in range(xwall_oms_array.size):
        x_x.append(i)
    x_x = np.array(x_x)

    mw_5i_oms_array = np.array(mw_5i_oms)
    m_x_5 = []
    for i in range(mw_5i_oms_array.size):
        m_x_5.append(i)
    m_x_5 = np.array(m_x_5)

    mw_8i_oms_array = np.array(mw_8i_oms)
    m_x_8 = []
    for i in range(mw_8i_oms_array.size):
        m_x_8.append(i)
    m_x_8 = np.array(m_x_8)

    g_test = 0
    x_test = 0
    m_test_5 = 0
    m_test_8 = 0

    if gveto_num > 0:
        g_test = 1
    if xwall_num > 0:
        x_test = 1
    if mw_5i_num > 0:
        m_test_5 = 1
    if mw_8i_num > 0:
        m_test_8 = 1

    num_gveto_expected = (gveto_num + xwall_num + mw_8i_num + mw_5i_num) / (
        g_test * 64 + x_test * 128 + m_test_5 * 80 + m_test_8 *
        (189.444 / 101.832) * 440)
    g_sig = np.sqrt(num_gveto_expected)
    num_xwall_expected = (gveto_num + xwall_num + mw_8i_num + mw_5i_num) / (
        g_test * 64 + x_test * 128 + m_test_5 * 80 + m_test_8 *
        (189.444 / 101.832) * 440)
    x_sig = np.sqrt(num_xwall_expected)
    num_mw_5i_expected = (gveto_num + xwall_num + mw_8i_num + mw_5i_num) / (
        g_test * 64 + x_test * 128 + m_test_5 * 80 + m_test_8 *
        (189.444 / 101.832) * 440)
    m_sig_5 = np.sqrt(num_mw_5i_expected)
    num_mw_8i_expected = (gveto_num + xwall_num + mw_8i_num + mw_5i_num) / (
        g_test * (101.832 / 189.444) * 64 + x_test *
        (101.832 / 189.444) * 128 + m_test_5 *
        (101.832 / 189.444) * 80 + m_test_8 * 440)
    m_sig_8 = np.sqrt(num_mw_8i_expected)

    if g_test == 1:
        plt.errorbar(g_x,
                     gveto_oms_array,
                     yerr=np.sqrt(gveto_oms_array),
                     fmt='k.',
                     ecolor='k')
        plt.plot([], [], 'k.', label="GVeto Num of Vertexes")
        plt.plot(g_x,
                 np.ones_like(g_x) * num_gveto_expected,
                 "r-",
                 label="Expected = {:.3f}".format(num_gveto_expected))
        plt.plot(g_x,
                 np.ones_like(g_x) * (num_gveto_expected + g_sig),
                 "b-",
                 label="+/- 1 $\sigma$")
        plt.plot(g_x, np.ones_like(g_x) * (num_gveto_expected - g_sig), "b-")
        plt.ylabel("Number of vertexes")
        plt.legend()
        plt.savefig('/Users/willquinn/Desktop/pmt_glass_sim_test/' + name +
                    "_gvet")
        plt.close()

    if x_test == 1:
        plt.errorbar(x_x,
                     xwall_oms_array,
                     yerr=np.sqrt(xwall_oms_array),
                     fmt='k.',
                     ecolor='k')
        plt.plot([], [], 'k.', label="XWall Num of Vertexes")
        plt.plot(x_x,
                 np.ones_like(x_x) * num_xwall_expected,
                 "r-",
                 label="Expected = {:.3f}".format(num_xwall_expected))
        plt.plot(x_x,
                 np.ones_like(x_x) * (num_xwall_expected + x_sig),
                 "b-",
                 label="+/- 1 $\sigma$")
        plt.plot(x_x, np.ones_like(x_x) * (num_xwall_expected - x_sig), "b-")
        plt.ylabel("Number of vertexes")
        plt.legend()
        plt.savefig('/Users/willquinn/Desktop/pmt_glass_sim_test/' + name +
                    "_xwal")
        plt.close()

    if m_test_5 == 1:
        plt.errorbar(m_x_5,
                     mw_5i_oms_array,
                     yerr=np.sqrt(mw_5i_oms_array),
                     fmt='k.',
                     ecolor='k')
        plt.plot([], [], 'k.', label="MWall 5\" Num of Vertexes")
        plt.plot(m_x_5,
                 np.ones_like(m_x_5) * num_mw_5i_expected,
                 "r-",
                 label="Expected = {:.3f}".format(num_mw_5i_expected))
        plt.plot(m_x_5,
                 np.ones_like(m_x_5) * (num_mw_5i_expected + m_sig_5),
                 "b-",
                 label="+/- 1 $\sigma$")
        plt.plot(m_x_5,
                 np.ones_like(m_x_5) * (num_mw_5i_expected - m_sig_5), "b-")
        plt.ylabel("Number of vertexes")
        plt.legend()
        plt.savefig('/Users/willquinn/Desktop/pmt_glass_sim_test/' + name +
                    "_mw5i")
        plt.close()

    if m_test_8 == 1:
        plt.errorbar(m_x_8,
                     mw_8i_oms_array,
                     yerr=np.sqrt(mw_8i_oms_array),
                     fmt='k.',
                     ecolor='k')
        plt.plot([], [], 'k.', label="MWall 8\" Num of Vertexes")
        plt.plot(m_x_8,
                 np.ones_like(m_x_8) * num_mw_8i_expected,
                 "r-",
                 label="Expected = {:.3f}".format(num_mw_8i_expected))
        plt.plot(m_x_8,
                 np.ones_like(m_x_8) * (num_mw_8i_expected + m_sig_8),
                 "b-",
                 label="+/- 1 $\sigma$")
        plt.plot(m_x_8,
                 np.ones_like(m_x_8) * (num_mw_8i_expected - m_sig_8), "b-")
        plt.ylabel("Number of vertexes")
        plt.legend()
        plt.savefig('/Users/willquinn/Desktop/pmt_glass_sim_test/' + name +
                    "_mw8i")
        plt.close()

    c1 = ROOT.TCanvas(name)
    c1.cd()
    c1.SetGrid()
    om_2d_hist.Draw("colztext")
    ROOT.gStyle.SetOptStat(0)
    c1.SaveAs("~/Desktop/pmt_glass_sim_test/" + name + ".pdf")

    print(">>> Number of simulated vertexes:          ",
          gveto_num + xwall_num + mw_8i_num + mw_5i_num)
    print(">>> Percentage of GVeto vertexes:          ",
          gveto_num / (gveto_num + xwall_num + mw_8i_num + mw_5i_num) * 100)
    print(">>> Mean number of vertexes per GVeto OM:  ",
          gveto_event_rate.GetMean())
    print(">>> StdDev of vertexes over GVeto OMs:     ",
          gveto_event_rate.GetStdDev())
    if gveto_event_rate.GetMean() == 0:
        pass
    else:
        print(">>> Resolution of GVeto vertexes:          ",
              gveto_event_rate.GetStdDev() / gveto_event_rate.GetMean() * 100)
    print(">>> Percentage of XWall vertexes:          ",
          xwall_num / (gveto_num + xwall_num + mw_8i_num + mw_5i_num) * 100)
    print(">>> Mean number of vertexes per XWall OM:  ",
          xwall_event_rate.GetMean())
    print(">>> StdDev of vertexes over XWall OMs:     ",
          xwall_event_rate.GetStdDev())
    if xwall_event_rate.GetMean() == 0:
        pass
    else:
        print(">>> Resolution of XWall vertexes:          ",
              xwall_event_rate.GetStdDev() / xwall_event_rate.GetMean() * 100)
    print(">>> Percentage of MWall 8\" vertexes:       ",
          mw_8i_num / (gveto_num + xwall_num + mw_8i_num + mw_5i_num) * 100)
    print(">>> Mean number of vertexes per MW 8\" OM:  ",
          mwall_event_rate_8inch.GetMean())
    print(">>> StdDev of vertexes over MW 8\" OMs:     ",
          mwall_event_rate_8inch.GetStdDev())
    if mwall_event_rate_8inch.GetMean() == 0:
        pass
    else:
        print(
            ">>> Resolution of MW \8"
            " vertexes:          ",
            mwall_event_rate_8inch.GetStdDev() /
            mwall_event_rate_8inch.GetMean() * 100)
    print(">>> Percentage of MWall 5\" vertexes:       ",
          mw_5i_num / (gveto_num + xwall_num + mw_8i_num + mw_5i_num) * 100)
    print(">>> Mean number of vertexes per MW 5\" OM:  ",
          mwall_event_rate_5inch.GetMean())
    print(">>> StdDev of vertexes over MW 5\" OMs:     ",
          mwall_event_rate_5inch.GetStdDev())
    if mwall_event_rate_5inch.GetMean() == 0:
        pass
    else:
        print(
            ">>> Resolution of MW 5\" vertexes:          ",
            mwall_event_rate_8inch.GetStdDev() /
            mwall_event_rate_5inch.GetMean() * 100)

    file.Close()
    output.cd()
    output.Write()
    output.Close()
Пример #4
0
def main():
    args = io_parse_arguments()
    input_file = args.i
    template_file = args.t

    if input_file is None:
        input_file = "/Users/willquinn/Desktop/test.root"
    if template_file is None:
        template_file = "/Users/willquinn/Desktop/templates.root"

    #t emplates, comparison_template = get_templates(template_file, comparison=1)
    # draw_template_quality(comparison_template, templates)

    om_hvs = load_HV(
        "/Users/willquinn/Desktop/calorimeter_equalized_04Mar2020.txt")
    # draw_HVs(om_hvs)

    root_file = ROOT.TFile(input_file, "READ")
    tree = root_file.T

    charges = [[] for i in range(712)]
    apulse_nums = [[] for i in range(712)]
    apulse_times = [[] for i in range(712)]
    apulse_amplitudes = [[] for i in range(712)]
    n_events = [0 for i in range(712)]

    i_event = 0
    for event in tree:
        # baseline = event.baseline
        # waveform = np.array(event.waveform)
        OM_ID = event.OM_ID

        n_events[OM_ID] += 1

        # print(event.charge)
        # charges[OM_ID].append(event.charge)

        main_pulse_time = event.main_pulse_time
        for i_pulse in list(event.apulse_times):
            apulse_times[OM_ID].append(i_pulse - main_pulse_time)
            #print((i_pulse - main_pulse_time)/0.64)

        for i_pulse in list(event.apulse_amplitudes):
            apulse_amplitudes[OM_ID].append(i_pulse)

        apulse_nums[OM_ID].append(event.apulse_num)
        '''if event.apulse_num > 4:
            sweep_example(om_id_string(OM_ID), templates[OM_ID], waveform-baseline)
            break'''
        # mf_example(waveform-baseline, [np.array(event.mf_shapes), np.array(event.mf_amplitudes)],
        #            list(event.apulse_times))
        i_event += 1
        if not i_event % 100000:
            print(f">>> processed {i_event}/{tree.GetEntries()}")

    # draw_AAN(apulse_nums)
    # draw_PAR(apulse_nums)
    draw_ATD(apulse_times)
    # draw_AAD(apulse_amplitudes)
    # draw_event_map(n_events)
    draw_HV_ATD(om_hvs, apulse_times)
    # draw_charges(charges)

    root_file.Close()
Пример #5
0
def main():
    args = io_parse_arguments()
    data_file_Ch0_name = args.i + "resolution_vs_date_Ch0.txt"
    data_file_Ch1_name = args.i + "resolution_vs_date_Ch1.txt"

    try:
        data_file_Ch0 = open(data_file_Ch0_name, 'r')
        data_file_Ch1 = open(data_file_Ch1_name, 'r')
    except FileNotFoundError as fnf_error:
        print(fnf_error)
        raise Exception("Error opening data file")

    data_Ch0 = np.loadtxt(data_file_Ch0_name, delimiter=',', dtype={
        'names': ('unix', 'date', 'timestamp', 'mu', 'mu_err', 'sigma', 'sigma_err', 'res', 'chi_err'),
        'formats': ('i4', 'i4', 'i4', 'f4', 'f4', 'f4', 'f4', 'f4', 'f4')}, unpack=True)

    data_Ch1 = np.loadtxt(data_file_Ch1_name, delimiter=',',
                          dtype={'names': (
                              'unix', 'date', 'timestamp', 'mu', 'mu_err', 'sigma', 'sigma_err', 'res', 'chi_err'),
                              'formats': ('i4', 'i4', 'i4', 'f4', 'f4', 'f4', 'f4', 'f4', 'f4')}, unpack=True)

    data = [data_Ch0, data_Ch1]
    dates = [data_Ch0[1], data_Ch1[1]]
    day_nums = [process_date(data_Ch0[1]), process_date(data_Ch1[1])]
    exposures = [process_exposure(data_Ch0[1]), process_exposure(data_Ch1[1])]
    mus = [data_Ch0[3], data_Ch1[3]]
    mu_errs = [data_Ch0[4], data_Ch1[4]]
    sigs = [data_Ch0[5], data_Ch1[5]]
    sig_errs = [data_Ch0[6], data_Ch1[6]]
    res = [data_Ch0[7], data_Ch1[7]]
    res_errs = [res[0] * np.sqrt((sig_errs[0] / sigs[0]) ** 2 + (mu_errs[0] / mus[0]) ** 2),
               res[1] * np.sqrt((sig_errs[1] / sigs[1]) ** 2 + (mu_errs[1] / mus[1]) ** 2)]
    chis = [data_Ch0[8], data_Ch1[8]]

    p_guess = [0.02420914, 3]
    p_bounds = [[0, 0], [1, 4]]

    filter_lists = [[], []]

    for i in range(2):
        x = day_nums[i]
        filter_list = []
        for chi_2 in chis[i]:
            if chi_2 < 10:
                filter_list.append(True)
            else:
                filter_list.append(False)
        for index,element in enumerate(x):
            if element < 0:
                filter_list[index] = False
            else:
                pass
        filter_lists[i] = filter_list
        x_array = np.linspace(np.amin(x[filter_list]), np.amax(x[filter_list]), 10000)

        popt, pcov = curve_fit(linear, x[filter_list], res[i][filter_list],
                               sigma=res_errs[i][filter_list],
                               p0=p_guess, bounds=p_bounds, maxfev=5000)

        chi_2 = chi2(linear(x[filter_list], *popt),
                     res_errs[i][filter_list],
                     res[i][filter_list],
                     2)

        print(popt, pcov, chi_2)

        fig, ax1 = plt.subplots()
        ax1.set_title("1MeV PMT Resolution Ch{}".format(i))
        ax1.grid(True)
        color = 'tab:red'
        plt.errorbar(x[filter_list],res[i][filter_list],
                     res_errs[i][filter_list],
                     fmt='.',
                     color=color)
        plt.plot(x_array, linear(x_array, *popt), 'g')
        if i ==0:
            plt.axvline(98, color='r', ls='--')
            plt.axvline(0, color='b', ls='--')
        ax1.text(0, 3, 'linear fit: y = ({:.4f}±{:.4f})*x + ({:.3f}±{:.3f}) chi2R: {:.3f}'.format(popt[0],
                                                                                                      np.sqrt(
                                                                                                          pcov[0][0]),
                                                                                                      popt[1],
                                                                                                      np.sqrt(
                                                                                                          pcov[1][1]),
                                                                                                      chi_2))

        ax1.set_xlabel("Exposure Time /days")
        ax1.set_ylabel("1Mev Resolution /%", color=color)
        ax1.set_ylim(2, 4.25)
        ax1.tick_params(axis='y', labelcolor=color)

        color = 'tab:blue'
        ax2 = ax1.twinx()
        ax2.plot(x[filter_list], chis[i][filter_list], '.', color=color)
        ax2.set_ylabel('Chi2 of bismuth 1MeV fit', color=color)  # we already handled the x-label with ax1
        ax2.tick_params(axis='y', labelcolor=color)
        ax2.set_ylim(0, 10)
        fig.tight_layout()

        plt.savefig("/Users/willquinn/Desktop/resolution_vs_date_time_" + str(i))
        plt.close()

    for i in range(2):
        x = exposures[i]
        filter_list = []
        for chi_2 in chis[i]:
            if chi_2 < 10:
                filter_list.append(True)
            else:
                filter_list.append(False)
        for index,element in enumerate(x):
            if element < 0.01:
                filter_list[index] = False
            else:
                pass
        filter_lists[i] = filter_list
        x_array = np.linspace(np.amin(x[filter_list]), np.amax(x[filter_list]), 10000)

        popt, pcov = curve_fit(linear, x[filter_list], res[i][filter_list],
                               sigma=res_errs[i][filter_list],
                               p0=p_guess, bounds=p_bounds, maxfev=5000)

        chi_2 = chi2(linear(x[filter_list], *popt),
                     res_errs[i][filter_list],
                     res[i][filter_list],
                     2)

        print(popt, pcov, chi_2)

        fig, ax1 = plt.subplots()
        ax1.set_title("1MeV PMT Resolution Ch{}".format(i))
        ax1.grid(True)
        color = 'tab:red'
        plt.errorbar(x[filter_list],res[i][filter_list],
                     res_errs[i][filter_list],
                     fmt='.',
                     color=color)
        plt.plot(x_array, linear(x_array, *popt), 'g')
        if i == 0:
            plt.axvline(1/10 + 97/100, color='r', ls='--')
            plt.axvline(29/1000000, color='b', ls='--')
        ax1.text(0, 3, 'linear fit: y = ({:.4f}±{:.4f})*x + ({:.3f}±{:.3f}) chi2R: {:.3f}'.format(popt[0],
                                                                                                      np.sqrt(
                                                                                                          pcov[0][0]),
                                                                                                      popt[1],
                                                                                                      np.sqrt(
                                                                                                          pcov[1][1]),
                                                                                                      chi_2))

        ax1.set_xlabel("Exposure Time /atm-days")
        ax1.set_ylabel("1Mev Resolution /%", color=color)
        ax1.set_ylim(2, 4.25)
        ax1.tick_params(axis='y', labelcolor=color)

        color = 'tab:blue'
        ax2 = ax1.twinx()
        ax2.plot(x[filter_list], chis[i][filter_list], '.', color=color)
        ax2.set_ylabel('Chi2 of bismuth 1MeV fit', color=color)  # we already handled the x-label with ax1
        ax2.tick_params(axis='y', labelcolor=color)
        ax2.set_ylim(0, 10)
        fig.tight_layout()

        plt.savefig("/Users/willquinn/Desktop/resolution_vs_date_exp_" + str(i))
        plt.close()

    x_t = []
    x_e = []
    y = []
    y_err = []
    for i in range(day_nums[0].size):
        for j in range(day_nums[1].size):
            if day_nums[0][i] == day_nums[1][j]:
                x_t.append(day_nums[0][i])
                x_e.append(exposures[0][i])
                y.append(res[0][i]/res[1][j])
                y_err.append(res[0][i]/res[1][j] * np.sqrt( (res_errs[0][i]/res[0][i])**2 + (res_errs[1][j]/res[1][j])**2 ))
                break

    plt.errorbar(x_t, y, yerr=y_err, fmt="k.")
    plt.axvline(98, color="r", ls="--")
    plt.axvline(0, color="b", ls="--")
    plt.xlabel("Exposure /days")
    plt.ylabel("Ratio res_Ch0/res_Ch1")
    plt.title("Ratio of resolution of CH 0 & 1 vs time")
    plt.grid()
    plt.xlim(np.amin(np.array(x_t)), np.amax(np.array(x_t)))
    plt.ylim(0,2)
    plt.savefig("/Users/willquinn/Desktop/resolution_ratio_time")


    '''x_ch0 = process_date(data_Ch0[1])
    x_ch1 = process_date(data_Ch1[1])
    x_array = np.linspace(-30, 145, 10000)'''

    '''plt.errorbar(x_ch0, data_Ch0[3], data_Ch0[4], fmt='.', color='b')
    plt.title("1MeV PMT Charge Ch0")
    plt.xlabel("Exposure Time atm-days")
    plt.ylabel("1Mev Charge /pC")
    plt.ylim(32, 42)
    #plt.xscale('log')
    plt.grid(True)
    plt.show()

    plt.errorbar(x_ch1, data_Ch1[3], data_Ch1[4], fmt='.', color='b')
    plt.title("1MeV PMT Charge Ch1")
    plt.xlabel("Exposure Time /days")
    plt.ylabel("1Mev Charge /pC")
    plt.ylim(32, 42)
    #plt.xscale('log')
    plt.grid(True)
    plt.show()'''

    '''popt_0, pcov_0 = curve_fit(linear, x_ch0, data_Ch0[7],
def main():
    args = io_parse_arguments()
    input_file = args.i
    template_file = args.t
    run_num = args.o

    if input_file is None:
        input_file = "/Users/willquinn/Desktop/test.root"
    if template_file is None:
        template_file = "/Users/willquinn/Desktop/templates.root"

    print(">>> input file: ", input_file)

    # templates, comparison_template = get_templates(template_file, comparison=1)
    # draw_template(1, om_id_string(1), comparison_template)
    # draw_template_quality(comparison_template, templates)

    # om_hvs = load_HV("/Users/willquinn/Desktop/SNEMO/calorimeter_equalized_04Mar2020.txt")
    # draw_HVs(om_hvs)

    gains = get_gain("/Users/williamquinn/Desktop/SNEMO/gains.txt")
    # draw_gains(gains)

    root_file = ROOT.TFile(input_file, "READ")
    tree = root_file.T

    raw_charges = [[] for i in range(712)]
    amplitudes = [[] for i in range(712)]
    raw_amplitudes = [[] for i in range(712)]
    charges = [[] for i in range(712)]
    baselines = [[] for i in range(712)]
    apulse_nums = [[] for i in range(712)]
    apulse_times = [[] for i in range(712)]
    apulse_amplitudes = [[] for i in range(712)]
    n_events = [0 for i in range(712)]

    i_event = 0
    for event in tree:
        baseline = event.baseline
        # waveform = np.array(event.waveform)
        # plt.plot(waveform)
        # plt.show()
        OM_ID = event.OM_ID
        baselines[OM_ID].append(baseline)

        n_events[OM_ID] += 1

        #print(-event.charge)
        raw_charges[OM_ID].append(-event.raw_charge)
        charges[OM_ID].append(-event.charge)
        amplitudes[OM_ID].append(-event.amplitude)
        raw_amplitudes[OM_ID].append(-event.raw_amplitude)

        '''if -event.charge > 1000:
            plot_waveform(waveform, baseline, OM_ID)
            break'''

        '''if event.is_fr and event.is_gveto and OM_ID > 700:
            # plot_waveform(waveform, baseline, OM_ID)
            #print(baseline, len(np.array(event.mf_shapes)))
            mf_example(OM_ID, waveform - baseline, [np.array(event.mf_shapes), np.array(event.mf_amplitudes)],
                       list(event.apulse_times))'''

        main_pulse_time = event.main_pulse_time
        for i_pulse in list(event.apulse_times):
            apulse_times[OM_ID].append(i_pulse - main_pulse_time)
            # print((i_pulse - main_pulse_time)/0.64)

        for i_pulse in list(event.apulse_amplitudes):
            apulse_amplitudes[OM_ID].append(i_pulse)

        apulse_nums[OM_ID].append(event.apulse_num)
        '''if event.apulse_num > 4:
            print(event.apulse_num)
            sweep_example(om_id_string(OM_ID), templates[OM_ID], waveform-baseline)
            break'''
        # mf_example(waveform-baseline, [np.array(event.mf_shapes), np.array(event.mf_amplitudes)],
        #            list(event.apulse_times))
        i_event += 1
        if not i_event % 100000:
            print(f">>> processed {i_event}/{tree.GetEntries()}")

    # draw_AAN(apulse_nums, run_num)
    # draw_PAR(apulse_nums, run_num)
    # draw_ATD(apulse_times, run_num)
    # draw_AAD(apulse_amplitudes, run_num)
    # draw_event_map(n_events, run_num)
    # draw_HV_ATD(om_hvs, apulse_times, run_num)
    # draw_raw_charges(raw_charges, run_num)
    draw_charges(charges, run_num)
    # draw_amplitudes(amplitudes, run_num)
    # draw_raw_amplitudes(raw_amplitudes, run_num)
    # draw_baselines(baselines, run_num)
    # draw_baselines_tots(baselines, run_num)
    # draw_charge_apulse(charges, apulse_nums, run_num)
    # draw_npe_apulse(charges, apulse_nums, gains, run_num)
    draw_npe_apulse_tots(charges, apulse_nums, gains, run_num)

    root_file.Close()