Exemple #1
0
def rm_Dpipi_fill(t, h, mode):
    for ientry in xrange(t.GetEntries()):
        t.GetEntry(ientry)
        if abs(t.m_rawm_D - 1.86965
               ) < width(ecms) / 2. and t.m_n_p == 0 and t.m_n_pbar == 0:
            if not (t.m_n_othertrks <= 3 and t.m_n_othershws <= 6):
                continue
            discarded = False
            for iTrk in range(3):
                if abs(t.m_Vxy_Dtrks[iTrk]) > 0.55:
                    discarded = True
                if abs(t.m_Vz_Dtrks[iTrk]) > 3.0:
                    discarded = True
                if abs(t.m_cos_theta_Dtrks[iTrk]) > 0.93:
                    discarded = True
            if abs(t.m_Vxy_pip) > 0.55: discarded = True
            if abs(t.m_Vxy_pim) > 0.55: discarded = True
            if abs(t.m_Vz_pip) > 3.: discarded = True
            if abs(t.m_Vz_pim) > 3.: discarded = True
            if abs(t.m_cos_theta_pip) > 0.93: discarded = True
            if abs(t.m_cos_theta_pim) > 0.93: discarded = True
            if mode == 'bkg':
                if discarded: h.Fill(t.m_rm_Dpipi)
            if mode == 'after':
                if not discarded: h.Fill(t.m_rm_Dpipi)
Exemple #2
0
def plot(path, pt_title, ecms):
    try:
        f_data = TFile(path[0])
        f_sigMC = TFile(path[1])
        t_data = f_data.Get('save')
        t_sigMC = f_sigMC.Get('save')
        entries_data = t_data.GetEntries()
        entries_sigMC = t_sigMC.GetEntries()
        logging.info('data entries :' + str(entries_data))
        logging.info('MC(DDPI) entries :' + str(entries_sigMC))
    except:
        logging.error('Files are invalid!')
        sys.exit()

    mbc = TCanvas('mbc', 'mbc', 800, 600)
    set_canvas_style(mbc)

    if not os.path.exists('./figs/'):
        os.makedirs('./figs/')

    h_FOM = cal_significance(t_data, t_sigMC)
    h_FOM.Draw('col')

    pt = TPaveText(0.6, 0.6, 0.85, 0.85, "BRNDC")
    set_pavetext(pt)
    pt.Draw()
    pt.AddText(pt_title)

    D0_W = width('D0')
    Dm_W = width('Dm')
    Arr_Dm = TArrow(Dm_W, 0, Dm_W, 0.35, 0.01, '')
    set_arrow(Arr_Dm, 1)
    Arr_Dm.Draw()
    Arr_D0 = TArrow(0, D0_W, 0.3, D0_W, 0.01, '')
    set_arrow(Arr_D0, 1)
    Arr_D0.Draw()

    mbc.RedrawAxis()
    mbc.Update()
    mbc.SaveAs('./figs/opt_' + str(ecms) + '_2D.pdf')

    raw_input('Enter anything to end...')
Exemple #3
0
def rm_Dpipi_fill(t, h, ecms, mode):
    for ientry in xrange(t.GetEntries()):
        t.GetEntry(ientry)
        if abs(t.m_rawm_D - 1.86965) < width(ecms) / 2.:
            if mode == 'bkg':
                if t.m_n_p == 0 and t.m_n_pbar == 0:
                    continue
            if mode == 'after':
                if not (t.m_n_p == 0 and t.m_n_pbar == 0):
                    continue
            h.Fill(t.m_rm_Dpipi)
Exemple #4
0
def m_Dm_fill(t, h, Dm_k, D0_k):
    D0_W = width('D0')
    D0_signal_low = 1.86483 - D0_W/2.
    D0_signal_up = 1.86483 + D0_W/2.
    count = 0
    for ientry in xrange(t.GetEntries()):
        t.GetEntry(ientry)
        if t.m_Dm_mode == Dm_k and t.m_D0_mode == D0_k: 
            if not (t.m_D0_mass > D0_signal_low and t.m_D0_mass < D0_signal_up): continue
            h.Fill(t.m_Dm_mass)
            count += 1
    return count
Exemple #5
0
def rm_Dpipi_fill(t, h, mode):
    for ientry in xrange(t.GetEntries()):
        t.GetEntry(ientry)
        if abs(t.m_rawm_D - 1.86965
               ) < width(ecms) / 2. and t.m_n_p == 0 and t.m_n_pbar == 0:
            if mode == 'bkg':
                if (t.m_n_othertrks <= 3 and t.m_n_othershws <= 6):
                    continue
                h.Fill(t.m_rm_Dpipi)
            if mode == 'after':
                if not (t.m_n_othertrks <= 3 and t.m_n_othershws <= 6):
                    continue
                h.Fill(t.m_rm_Dpipi)
Exemple #6
0
def save(f_in, t, cms, mode):
    m_runNo = array('i', [0])
    m_evtNo = array('i', [0])
    m_indexmc = array('i', [0])
    m_trkidx = array('i', 100 * [0])
    m_motheridx = array('i', 100 * [0])
    m_motherid = array('i', 100 * [0])
    m_pdgid = array('i', 100 * [0])
    m_D0_mode = array('d', [0])
    m_D0_type = array('d', [0])
    m_D0_charge = array('i', [0])
    m_D0_charm = array('d', [0])
    m_D0_numofchildren = array('d', [0])
    m_D0_mass = array('d', [0])
    m_p_D0 = array('d', [0])
    m_E_D0 = array('d', [0])
    m_n_D0trks = array('i', [0])
    m_n_D0shws = array('i', [0])
    m_Dm_mode = array('d', [0])
    m_Dm_type = array('d', [0])
    m_Dm_charge = array('i', [0])
    m_Dm_charm = array('d', [0])
    m_Dm_numofchildren = array('d', [0])
    m_Dm_mass = array('d', [0])
    m_p_Dm = array('d', [0])
    m_E_Dm = array('d', [0])
    m_n_Dmtrks = array('i', [0])
    m_n_Dmshws = array('i', [0])
    m_chi2_4c = array('d', [0.])
    m_chi2_vf = array('d', [0.])
    m_m_D0 = array('d', [0])
    m_m_Dm = array('d', [0])
    m_chi2_6c = array('d', [0.])
    m_m_D0Dm = array('d', [0])
    m_m_D0pip = array('d', [0])
    m_m_Dmpip = array('d', [0])
    m_rm_D0pip = array('d', [0])
    m_rm_Dmpip = array('d', [0])
    m_p4_D0 = array('d', 4 * [0])
    m_p4_Dm = array('d', 4 * [0])
    m_p4_pip = array('d', 4 * [0])
    m_Rxy_D0trks = array('d', 10 * [999.])
    m_Rz_D0trks = array('d', 10 * [999.])
    m_cos_D0trks = array('d', 10 * [999.])
    m_E_D0shws = array('d', 10 * [999.])
    m_dang_D0shws = array('d', 10 * [999.])
    m_module_D0shws = array('d', 10 * [999.])
    m_T_D0shws = array('d', 10 * [999.])
    m_Rxy_Dmtrks = array('d', 10 * [999.])
    m_Rz_Dmtrks = array('d', 10 * [999.])
    m_cos_Dmtrks = array('d', 10 * [999.])
    m_E_Dmshws = array('d', 10 * [999.])
    m_dang_Dmshws = array('d', 10 * [999.])
    m_module_Dmshws = array('d', 10 * [999.])
    m_T_Dmshws = array('d', 10 * [999.])
    m_Rxy_pip = array('d', [999.])
    m_Rz_pip = array('d', [999.])
    m_cos_pip = array('d', [999.])
    m_n_pi0 = array('i', [0])
    m_n_othershws = array('i', [0])
    m_matched_D0trks = array('i', [999])
    m_matched_D0shws = array('i', [999])
    m_matched_Dmtrks = array('i', [999])
    m_matched_Dmshws = array('i', [999])
    m_matched_pip = array('i', [999])
    m_m_delta = array('d', [0])
    m_p_pip = array('d', [0])
    m_chi2_svf_D0 = array('d', [999.])
    m_ctau_svf_D0 = array('d', [999.])
    m_L_svf_D0 = array('d', [999.])
    m_Lerr_svf_D0 = array('d', [999.])
    m_Lxy_svf_D0 = array('d', [999.])
    m_chi2_svf_Dm = array('d', [999.])
    m_ctau_svf_Dm = array('d', [999.])
    m_L_svf_Dm = array('d', [999.])
    m_Lerr_svf_Dm = array('d', [999.])
    m_Lxy_svf_Dm = array('d', [999.])
    t.Branch('runNo', m_runNo, 'm_runNo/I')
    t.Branch('evtNo', m_evtNo, 'm_evtNo/I')
    t.Branch('indexmc', m_indexmc, 'indexmc/I')
    t.Branch('trkidx', m_trkidx, 'trkidx[100]/I')
    t.Branch('motheridx', m_motheridx, 'motheridx[100]/I')
    t.Branch('motherid', m_motherid, 'motherid[100]/I')
    t.Branch('pdgid', m_pdgid, 'pdgid[100]/I')
    t.Branch('D0_mode', m_D0_mode, 'm_D0_mode/D')
    t.Branch('D0_type', m_D0_type, 'm_D0_type/D')
    t.Branch('D0_charge', m_D0_charge, 'm_D0_charge/I')
    t.Branch('D0_charm', m_D0_charm, 'm_D0_charm/D')
    t.Branch('D0_numofchildren', m_D0_numofchildren, 'm_D0_numofchildren/D')
    t.Branch('D0_mass', m_D0_mass, 'm_D0_mass/D')
    t.Branch('p_D0', m_p_D0, 'm_p_D0/D')
    t.Branch('E_D0', m_E_D0, 'm_E_D0/D')
    t.Branch('n_D0trks', m_n_D0trks, 'm_n_D0trks/D')
    t.Branch('n_D0shws', m_n_D0shws, 'm_n_D0shws/D')
    t.Branch('Dm_mode', m_Dm_mode, 'm_Dm_mode/D')
    t.Branch('Dm_type', m_Dm_type, 'm_Dm_type/D')
    t.Branch('Dm_charge', m_Dm_charge, 'm_Dm_charge/I')
    t.Branch('Dm_charm', m_Dm_charm, 'm_Dm_charm/D')
    t.Branch('Dm_numofchildren', m_Dm_numofchildren, 'm_Dm_numofchildren/D')
    t.Branch('Dm_mass', m_Dm_mass, 'm_Dm_mass/D')
    t.Branch('p_Dm', m_p_Dm, 'm_p_Dm/D')
    t.Branch('E_Dm', m_E_Dm, 'm_E_Dm/D')
    t.Branch('n_Dmtrks', m_n_Dmtrks, 'm_n_Dmtrks/D')
    t.Branch('n_Dmshws', m_n_Dmshws, 'm_n_Dmshws/D')
    t.Branch('chi2_4c', m_chi2_4c, 'm_chi2_4c/D')
    t.Branch('chi2_vf', m_chi2_vf, 'm_chi2_vf/D')
    t.Branch('m_D0', m_m_D0, 'm_m_D0/D')
    t.Branch('m_Dm', m_m_Dm, 'm_m_Dm/D')
    t.Branch('chi2_6c', m_chi2_6c, 'm_chi2_6c/D')
    t.Branch('m_D0Dm', m_m_D0Dm, 'm_m_D0Dm/D')
    t.Branch('m_D0pip', m_m_D0pip, 'm_m_D0pip/D')
    t.Branch('m_Dmpip', m_m_Dmpip, 'm_m_Dmpip/D')
    t.Branch('rm_D0pip', m_rm_D0pip, 'm_rm_D0pip/D')
    t.Branch('rm_Dmpip', m_rm_Dmpip, 'm_rm_Dmpip/D')
    t.Branch('p4_D0', m_p4_D0, 'm_p4_D0[4]/D')
    t.Branch('p4_Dm', m_p4_Dm, 'm_p4_Dm[4]/D')
    t.Branch('p4_pip', m_p4_pip, 'm_p4_pip[4]/D')
    t.Branch('Rxy_D0trks', m_Rxy_D0trks, 'm_Rxy_D0trks[10]/D')
    t.Branch('Rz_D0trks', m_Rz_D0trks, 'm_Rz_D0trks[10]/D')
    t.Branch('cos_D0trks', m_cos_D0trks, 'm_cos_D0trks[10]/D')
    t.Branch('E_D0shws', m_E_D0shws, 'm_E_D0shws[10]/D')
    t.Branch('dang_D0shws', m_dang_D0shws, 'm_dang_D0shws[10]/D')
    t.Branch('module_D0shws', m_module_D0shws, 'm_module_D0shws[10]/D')
    t.Branch('T_D0shws', m_T_D0shws, 'm_T_D0shws[10]/D')
    t.Branch('Rxy_Dmtrks', m_Rxy_Dmtrks, 'm_Rxy_Dmtrks[10]/D')
    t.Branch('Rz_Dmtrks', m_Rz_Dmtrks, 'm_Rz_Dmtrks[10]/D')
    t.Branch('cos_Dmtrks', m_cos_Dmtrks, 'm_cos_Dmtrks[10]/D')
    t.Branch('E_Dmshws', m_E_Dmshws, 'm_E_Dmshws[10]/D')
    t.Branch('dang_Dmshws', m_dang_Dmshws, 'm_dang_Dmshws[10]/D')
    t.Branch('module_Dmshws', m_module_Dmshws, 'm_module_Dmshws[10]/D')
    t.Branch('T_Dmshws', m_T_Dmshws, 'm_T_Dmshws[10]/D')
    t.Branch('Rxy_pip', m_Rxy_pip, 'm_Rxy_pip/D')
    t.Branch('Rz_pip', m_Rz_pip, 'm_Rz_pip/D')
    t.Branch('cos_pip', m_cos_pip, 'm_cos_pip/D')
    t.Branch('n_pi0', m_n_pi0, 'm_n_pi0/I')
    t.Branch('n_othershws', m_n_othershws, 'm_n_othershws/I')
    t.Branch('matched_D0trks', m_matched_D0trks, 'm_matched_D0trks/I')
    t.Branch('matched_D0shws', m_matched_D0shws, 'm_matched_D0shws/I')
    t.Branch('matched_Dmtrks', m_matched_Dmtrks, 'm_matched_Dmtrks/I')
    t.Branch('matched_Dmshws', m_matched_Dmshws, 'm_matched_Dmshws/I')
    t.Branch('matched_pip', m_matched_pip, 'm_matched_pip/I')
    t.Branch('m_delta', m_m_delta, 'm_m_delta/D')
    t.Branch('p_pip', m_p_pip, 'm_p_pip/D')
    t.Branch('chi2_svf_D0', m_chi2_svf_D0, 'm_chi2_svf_D0/D')
    t.Branch('ctau_svf_D0', m_ctau_svf_D0, 'm_ctau_svf_D0/D')
    t.Branch('L_svf_D0', m_L_svf_D0, 'm_L_svf_D0/D')
    t.Branch('Lerr_svf_D0', m_Lerr_svf_D0, 'm_Lerr_svf_D0/D')
    t.Branch('Lxy_svf_D0', m_Lxy_svf_D0, 'm_Lxy_svf_D0/D')
    t.Branch('chi2_svf_Dm', m_chi2_svf_Dm, 'm_chi2_svf_Dm/D')
    t.Branch('ctau_svf_Dm', m_ctau_svf_Dm, 'm_ctau_svf_Dm/D')
    t.Branch('L_svf_Dm', m_L_svf_Dm, 'm_L_svf_Dm/D')
    t.Branch('Lerr_svf_Dm', m_Lerr_svf_Dm, 'm_Lerr_svf_Dm/D')
    t.Branch('Lxy_svf_Dm', m_Lxy_svf_Dm, 'm_Lxy_svf_Dm/D')
    M_Dm = 1.86965
    M_D0 = 1.86483
    if mode == 'signal': t_dtd = f_in.Get('DTD_signal')
    if mode == 'side1_low': t_dtd = f_in.Get('DTD_side1_low')
    if mode == 'side1_up': t_dtd = f_in.Get('DTD_side1_up')
    if mode == 'side2_low': t_dtd = f_in.Get('DTD_side2_low')
    if mode == 'side2_up': t_dtd = f_in.Get('DTD_side2_up')
    if mode == 'side3_low': t_dtd = f_in.Get('DTD_side3_low')
    if mode == 'side3_up': t_dtd = f_in.Get('DTD_side3_up')
    if mode == 'side4_low': t_dtd = f_in.Get('DTD_side4_low')
    if mode == 'side4_up': t_dtd = f_in.Get('DTD_side4_up')
    nentries = t_dtd.GetEntries()
    for ientry in range(nentries):
        t_dtd.GetEntry(ientry)
        if t_dtd.D0_mode != 0 and t_dtd.D0_mode != 1 and t_dtd.D0_mode != 3:
            continue
        if t_dtd.Dm_mode != 200 and t_dtd.Dm_mode != 201 and t_dtd.Dm_mode != 202 and t_dtd.Dm_mode != 203 and t_dtd.Dm_mode != 204:
            continue
        ppip_raw = TLorentzVector(0, 0, 0, 0)
        ppip_raw.SetPxPyPzE(t_dtd.rawp4_tagPi[0], t_dtd.rawp4_tagPi[1],
                            t_dtd.rawp4_tagPi[2], t_dtd.rawp4_tagPi[3])
        E_Dm = 0
        pDm_raw = TLorentzVector(0, 0, 0, 0)
        m_matched_Dmtrks[0] = 1
        for iTrk in range(t_dtd.n_Dmtrks):
            ptrack_raw = TLorentzVector(0, 0, 0, 0)
            ptrack_raw.SetPxPyPzE(t_dtd.rawp4_Dmtrks[iTrk * 8 + 0],
                                  t_dtd.rawp4_Dmtrks[iTrk * 8 + 1],
                                  t_dtd.rawp4_Dmtrks[iTrk * 8 + 2],
                                  t_dtd.rawp4_Dmtrks[iTrk * 8 + 3])
            pDm_raw += ptrack_raw
            E_Dm += t_dtd.rawp4_Dmtrks[iTrk * 8 + 3]
            if not t_dtd.rawp4_Dmtrks[iTrk * 8 + 6] == 1:
                m_matched_Dmtrks[0] = 0
        if t_dtd.n_Dmshws == 0: m_matched_Dmshws[0] = 0
        else: m_matched_Dmshws[0] = 1
        for iShw in range(t_dtd.n_Dmshws):
            pshower_raw = TLorentzVector(0, 0, 0, 0)
            pshower_raw.SetPxPyPzE(t_dtd.rawp4_Dmshws[iShw * 6 + 0],
                                   t_dtd.rawp4_Dmshws[iShw * 6 + 1],
                                   t_dtd.rawp4_Dmshws[iShw * 6 + 2],
                                   t_dtd.rawp4_Dmshws[iShw * 6 + 3])
            pDm_raw += pshower_raw
            E_Dm += t_dtd.rawp4_Dmshws[iShw * 6 + 3]
            if not t_dtd.rawp4_Dmshws[iShw * 6 + 4] == 1:
                m_matched_Dmshws[0] = 0
        E_D0 = 0
        pD0_raw = TLorentzVector(0, 0, 0, 0)
        m_matched_D0trks[0] = 1
        for iTrk in range(t_dtd.n_D0trks):
            ptrack_raw = TLorentzVector(0, 0, 0, 0)
            ptrack_raw.SetPxPyPzE(t_dtd.rawp4_D0trks[iTrk * 8 + 0],
                                  t_dtd.rawp4_D0trks[iTrk * 8 + 1],
                                  t_dtd.rawp4_D0trks[iTrk * 8 + 2],
                                  t_dtd.rawp4_D0trks[iTrk * 8 + 3])
            pD0_raw += ptrack_raw
            E_D0 += t_dtd.rawp4_D0trks[iTrk * 8 + 3]
            if not t_dtd.rawp4_D0trks[iTrk * 8 + 6] == 1:
                m_matched_D0trks[0] = 0
        if t_dtd.n_D0shws == 0: m_matched_D0shws[0] = 0
        else: m_matched_D0shws[0] = 1
        for iShw in range(t_dtd.n_D0shws):
            pshower_raw = TLorentzVector(0, 0, 0, 0)
            pshower_raw.SetPxPyPzE(t_dtd.rawp4_D0shws[iShw * 6 + 0],
                                   t_dtd.rawp4_D0shws[iShw * 6 + 1],
                                   t_dtd.rawp4_D0shws[iShw * 6 + 2],
                                   t_dtd.rawp4_D0shws[iShw * 6 + 3])
            pD0_raw += pshower_raw
            E_D0 += t_dtd.rawp4_D0shws[iShw * 6 + 3]
            if not t_dtd.rawp4_D0shws[iShw * 6 + 4] == 1:
                m_matched_D0shws[0] = 0
        m_matched_pip[0] = 1
        if not t_dtd.rawp4_tagPi[4] == 1:
            m_matched_pip[0] = 0
        pD0_4c = TLorentzVector(0, 0, 0, 0)
        pDm_4c = TLorentzVector(0, 0, 0, 0)
        ppip_4c = TLorentzVector(0, 0, 0, 0)
        ppip_raw = TLorentzVector(0, 0, 0, 0)
        ppip_raw.SetPxPyPzE(t_dtd.rawp4_tagPi[0], t_dtd.rawp4_tagPi[1],
                            t_dtd.rawp4_tagPi[2], t_dtd.rawp4_tagPi[3])
        pD0_4c.SetPxPyPzE(t_dtd.p4_D0_4c[0], t_dtd.p4_D0_4c[1],
                          t_dtd.p4_D0_4c[2], t_dtd.p4_D0_4c[3])
        pDm_4c.SetPxPyPzE(t_dtd.p4_Dm_4c[0], t_dtd.p4_Dm_4c[1],
                          t_dtd.p4_Dm_4c[2], t_dtd.p4_Dm_4c[3])
        ppip_4c.SetPxPyPzE(t_dtd.p4_pip_4c[0], t_dtd.p4_pip_4c[1],
                           t_dtd.p4_pip_4c[2], t_dtd.p4_pip_4c[3])
        m_runNo[0] = t_dtd.runNo
        m_evtNo[0] = t_dtd.evtNo
        m_indexmc[0] = t_dtd.indexmc
        for i in range(t_dtd.indexmc):
            m_motheridx[i] = t_dtd.motheridx[i]
            m_motherid[i] = t_dtd.motherid[i]
            m_pdgid[i] = t_dtd.pdgid[i]
            m_trkidx[i] = t_dtd.trkidx[i]
        m_D0_mode[0] = t_dtd.D0_mode
        m_D0_type[0] = t_dtd.D0_type
        m_D0_charge[0] = t_dtd.D0_dcharge
        m_D0_charm[0] = t_dtd.D0_charm
        m_D0_numofchildren[0] = t_dtd.D0_numofchildren
        m_D0_mass[0] = t_dtd.D0_mass
        m_p_D0[0] = pD0_raw.P()
        m_E_D0[0] = E_D0
        m_n_D0trks[0] = t_dtd.n_D0trks
        m_n_D0shws[0] = t_dtd.n_D0shws
        m_Dm_mode[0] = t_dtd.Dm_mode
        m_Dm_type[0] = t_dtd.Dm_type
        m_Dm_charge[0] = t_dtd.Dm_dcharge
        m_Dm_charm[0] = t_dtd.Dm_charm
        m_Dm_numofchildren[0] = t_dtd.Dm_numofchildren
        m_Dm_mass[0] = t_dtd.Dm_mass
        m_p_Dm[0] = pDm_raw.P()
        m_E_Dm[0] = E_Dm
        m_n_Dmtrks[0] = t_dtd.n_Dmtrks
        m_n_Dmshws[0] = t_dtd.n_Dmshws
        m_chi2_4c[0] = t_dtd.chisq_4c
        m_m_D0[0] = pD0_4c.M()
        m_m_Dm[0] = pDm_4c.M()
        m_rm_D0pip[0] = (cms - pD0_4c - ppip_4c).M()
        m_rm_Dmpip[0] = (cms - pDm_4c - ppip_4c).M()
        for i in range(4):
            m_p4_D0[i] = t_dtd.p4_D0_6c[i]
            m_p4_Dm[i] = t_dtd.p4_Dm_6c[i]
            m_p4_pip[i] = t_dtd.p4_pip_6c[i]
        m_Rxy_pip[0] = t_dtd.vtx_tagPi[0]
        m_Rz_pip[0] = t_dtd.vtx_tagPi[1]
        m_cos_pip[0] = t_dtd.vtx_tagPi[2]
        for itrk in xrange(t_dtd.n_D0trks):
            m_Rxy_D0trks[itrk] = abs(t_dtd.vtx_D0trks[itrk * 3 + 0])
            m_Rz_D0trks[itrk] = abs(t_dtd.vtx_D0trks[itrk * 3 + 1])
            m_cos_D0trks[itrk] = abs(t_dtd.vtx_D0trks[itrk * 3 + 2])
        for ishw in xrange(t_dtd.n_D0shws):
            m_E_D0shws[ishw] = abs(t_dtd.vtx_D0shws[ishw * 6 + 0])
            m_dang_D0shws[ishw] = abs(t_dtd.vtx_D0shws[ishw * 6 + 3])
            m_module_D0shws[ishw] = abs(t_dtd.vtx_D0shws[ishw * 6 + 4])
            m_T_D0shws[ishw] = abs(t_dtd.vtx_D0shws[ishw * 6 + 5])
        for itrk in xrange(t_dtd.n_Dmtrks):
            m_Rxy_Dmtrks[itrk] = abs(t_dtd.vtx_Dmtrks[itrk * 3 + 0])
            m_Rz_Dmtrks[itrk] = abs(t_dtd.vtx_Dmtrks[itrk * 3 + 1])
            m_cos_Dmtrks[itrk] = abs(t_dtd.vtx_Dmtrks[itrk * 3 + 2])
        for ishw in xrange(t_dtd.n_Dmshws):
            m_E_Dmshws[ishw] = abs(t_dtd.vtx_Dmshws[ishw * 6 + 0])
            m_dang_Dmshws[ishw] = abs(t_dtd.vtx_Dmshws[ishw * 6 + 3])
            m_module_Dmshws[ishw] = abs(t_dtd.vtx_Dmshws[ishw * 6 + 4])
            m_T_Dmshws[ishw] = abs(t_dtd.vtx_Dmshws[ishw * 6 + 5])
        m_n_pi0[0] = t_dtd.n_pi0
        shw_status = True
        n_othershws = 0
        for iShw in range(t_dtd.n_othershws):
            if abs(t_dtd.vtx_othershws[iShw * 6 + 3]) < 10.:
                shw_status = False
            if t_dtd.vtx_othershws[iShw * 6 +
                                   5] < 0. or t_dtd.vtx_othershws[iShw * 6 +
                                                                  5] > 14:
                shw_status = False
            if t_dtd.vtx_othershws[iShw * 6 +
                                   4] == 1 and t_dtd.vtx_othershws[iShw * 6 +
                                                                   0] < 0.025:
                shw_status = False
            if (t_dtd.vtx_othershws[iShw * 6 + 4] == 0
                    or t_dtd.vtx_othershws[iShw * 6 + 4]
                    == 2) and t_dtd.vtx_othershws[iShw * 6 + 0] < 0.05:
                shw_status = False
            if shw_status:
                n_othershws += 1
        m_n_othershws[0] = n_othershws
        D0_W = width('D0')
        Dm_W = width('Dm')
        D0_signal_low = 1.86483 - D0_W / 2.
        D0_signal_up = 1.86483 + D0_W / 2.
        D0_sidebandlow_up = D0_signal_low - D0_W
        D0_sidebandlow_low = D0_signal_low - 2. * D0_W
        D0_sidebandup_low = D0_signal_up + D0_W
        D0_sidebandup_up = D0_signal_up + 2. * D0_W
        Dm_signal_low = 1.86965 - Dm_W / 2.
        Dm_signal_up = 1.86965 + Dm_W / 2.
        Dm_sidebandlow_up = Dm_signal_low - Dm_W
        Dm_sidebandlow_low = Dm_signal_low - 2. * Dm_W
        Dm_sidebandup_low = Dm_signal_up + Dm_W
        Dm_sidebandup_up = Dm_signal_up + 2. * Dm_W
        if mode == 'signal':
            M_D0 = (D0_signal_low + D0_signal_up) / 2.
            M_Dm = (Dm_signal_low + Dm_signal_up) / 2.
        if mode == 'side1_low':
            M_D0 = (D0_signal_low + D0_signal_up) / 2.
            M_Dm = (Dm_sidebandlow_low + Dm_sidebandlow_up) / 2.
        if mode == 'side1_up':
            M_D0 = (D0_signal_low + D0_signal_up) / 2.
            M_Dm = (Dm_sidebandup_low + Dm_sidebandup_up) / 2.
        if mode == 'side2_low':
            M_D0 = (D0_sidebandlow_low + D0_sidebandlow_up) / 2.
            M_Dm = (Dm_signal_low + Dm_signal_up) / 2.
        if mode == 'side2_up':
            M_D0 = (D0_sidebandup_low + D0_sidebandup_up) / 2.
            M_Dm = (Dm_signal_low + Dm_signal_up) / 2.
        if mode == 'side3_low':
            M_D0 = (D0_sidebandlow_low + D0_sidebandlow_up) / 2.
            M_Dm = (Dm_sidebandlow_low + Dm_sidebandlow_up) / 2.
        if mode == 'side3_up':
            M_D0 = (D0_sidebandlow_low + D0_sidebandlow_up) / 2.
            M_Dm = (Dm_sidebandup_low + Dm_sidebandup_up) / 2.
        if mode == 'side4_low':
            M_D0 = (D0_sidebandup_low + D0_sidebandup_up) / 2.
            M_Dm = (Dm_sidebandlow_low + Dm_sidebandlow_up) / 2.
        if mode == 'side4_up':
            M_D0 = (D0_sidebandup_low + D0_sidebandup_up) / 2.
            M_Dm = (Dm_sidebandup_low + Dm_sidebandup_up) / 2.
        m_m_delta[0] = abs(t_dtd.D0_mass - M_D0) + abs(t_dtd.Dm_mass - M_Dm)
        pD0_6c = TLorentzVector(0, 0, 0, 0)
        pDm_6c = TLorentzVector(0, 0, 0, 0)
        ppip_6c = TLorentzVector(0, 0, 0, 0)
        pD0_6c.SetPxPyPzE(t_dtd.p4_D0_6c[0], t_dtd.p4_D0_6c[1],
                          t_dtd.p4_D0_6c[2], t_dtd.p4_D0_6c[3])
        pDm_6c.SetPxPyPzE(t_dtd.p4_Dm_6c[0], t_dtd.p4_Dm_6c[1],
                          t_dtd.p4_Dm_6c[2], t_dtd.p4_Dm_6c[3])
        ppip_6c.SetPxPyPzE(t_dtd.p4_pip_6c[0], t_dtd.p4_pip_6c[1],
                           t_dtd.p4_pip_6c[2], t_dtd.p4_pip_6c[3])
        m_chi2_6c[0] = t_dtd.chisq_6c
        m_chi2_vf[0] = t_dtd.chisq_vf
        m_m_D0Dm[0] = (pD0_6c + pDm_6c).M()
        m_m_D0pip[0] = (pD0_6c + ppip_6c).M()
        m_m_Dmpip[0] = (pDm_6c + ppip_6c).M()
        m_p_pip[0] = ppip_raw.P()
        m_chi2_svf_D0[0] = t_dtd.chisq_svf_D0
        m_ctau_svf_D0[0] = t_dtd.ctau_svf_D0
        m_L_svf_D0[0] = t_dtd.L_svf_D0
        m_Lerr_svf_D0[0] = t_dtd.Lerr_svf_D0
        m_Lxy_svf_D0[0] = sqrt((t_dtd.vtx[0] - t_dtd.cp_D0[0])**2 +
                               (t_dtd.vtx[1] - t_dtd.cp_D0[1])**2)
        m_chi2_svf_Dm[0] = t_dtd.chisq_svf_Dm
        m_ctau_svf_Dm[0] = t_dtd.ctau_svf_Dm
        m_L_svf_Dm[0] = t_dtd.L_svf_Dm
        m_Lerr_svf_Dm[0] = t_dtd.Lerr_svf_Dm
        m_Lxy_svf_Dm[0] = sqrt((t_dtd.vtx[0] - t_dtd.cp_Dm[0])**2 +
                               (t_dtd.vtx[1] - t_dtd.cp_Dm[1])**2)
        t.Fill()
Exemple #7
0
def main():
    args = sys.argv[1:]
    if len(args) < 8:
        return usage()

    dst_path = args[0]
    sample = args[1]
    decay = args[2]
    mode = args[3]
    type = args[4]
    ecms = args[5]
    cms = args[6]
    dst_num = args[7]
    sys.stdout.write('Scanning %s...\n' % dst_path)

    dst_list = []
    print '***************************************start to search***************************************'
    dst_list = search(dst_list, dst_path, '.dst')
    print '***************************************searching ending**************************************'
    dst_list_groups = group_files_by_num(dst_list, dst_num)
    i = 0
    for dst_list_fill in dst_list_groups:
        file_name = sample + '_' + decay + '_' + mode + '_' + ecms + '_' + str(
            i) + '.txt'
        f = open(file_name, 'w')
        f.write('#include "$ROOTIOROOT/share/jobOptions_ReadRec.txt"\n')
        f.write('#include "$MAGNETICFIELDROOT/share/MagneticField.txt"\n')
        f.write('#include "$DTAGALGROOT/share/jobOptions_dTag.txt"\n')
        f.write('#include "$DDECAYALGROOT/share/jobOptions_DDecay.txt"\n')
        f.write('#include "$MEASUREDECMSSVCROOT/share/anaOptions.txt"\n')
        f.write('DDecay.IsMonteCarlo = true;\n')
        f.write('DDecay.Ecms = ' + str(float(cms) / 1000.) + ';\n')
        f.write('DDecay.W_m_Kpipi = ' + str(width(ecms[0:4])) + ';\n')
        f.write('DDecay.W_rm_Dpipi = ' + str(window(ecms[0:4])) + ';\n')
        f.write('\n')
        f.write('DTag.NeutralDReconstruction  = true;\n')
        f.write('DTag.ChargedDReconstruction  = true;\n')
        f.write('DTag.DsReconstruction        = true;\n')
        f.write('\n')
        f.write('NeutralDSelector.UseMbcCuts       = false;\n')
        f.write('eutralDSelector.UseDeltaECuts     = false;\n')
        f.write('NeutralDSelector.UseDeltaMassCuts = true;\n')
        f.write('\n')
        f.write('ChargedDSelector.UseMbcCuts       = false;\n')
        f.write('ChargedDSelector.UseDeltaECuts    = false;\n')
        f.write('ChargedDSelector.UseDeltaMassCuts = true;\n')
        f.write('\n')
        f.write('DsSelector.UseMbcCuts       = false;\n')
        f.write('DsSelector.UseDeltaECuts    = false;\n')
        f.write('DsSelector.UseDeltaMassCuts = true;\n')
        f.write('\n')
        f.write('// Input REC or DST file name\n')
        f.write('EventCnvSvc.digiRootInputFile = {\n')
        for dst in dst_list_fill:
            if dst != dst_list_fill[-1]:
                temp = '"' + dst + '",\n'
                f.write(temp)
            if dst == dst_list_fill[-1]:
                temp = '"' + dst + '"\n'
                f.write(temp)
        f.write('};\n')
        f.write('\n')
        f.write(
            '// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )\n'
        )
        f.write('MessageSvc.OutputLevel =6;\n')
        f.write('\n')
        f.write('// Number of events to be processed (default is 10)\n')
        f.write('ApplicationMgr.EvtMax = -1;\n')
        f.write('\n')
        f.write('ApplicationMgr.HistogramPersistency = "ROOT";\n')
        f.write(
            'NTupleSvc.Output = {\"FILE1 DATAFILE=\'/scratchfs/bes/$USER/bes/DDPIPI/v0.2/'
            + sample + '/' + type + '/' + ecms +
            '/sys_err/psipp_shape/rootfile/' + sample + '_' + decay + '_' +
            mode + '_' + ecms + '_' + str(i) + '.root' +
            '\' OPT=\'NEW\' TYP=\'ROOT\'\"};\n')
        f.close()
        i = i + 1
    print 'All done!'
def plot(path, leg_title, ecms, xmin, xmax, ymin, ymax, bins):
    try:
        f_data = TFile(path[0])
        t_data = f_data.Get('save')
        entries_data = t_data.GetEntries()
        logging.info('data entries :'+str(entries_data))
    except:
        logging.error(path[0] + ' is invalid!')
        sys.exit()

    set_pub_style()
    set_prelim_style()
    from ROOT import gStyle
    colors = array('i', 7*[0])
    for i in range(7): colors[i] = 18 - i
    gStyle.SetPalette(7, colors)

    mbc = TCanvas('mbc', 'mbc', 800, 600)
    xtitle = 'M(K^{-}#pi^{+}#pi^{+}) (GeV)/c^{2}'
    ytitle = 'RM(D^{+}#pi_{d}^{+}#pi_{d}^{-}) (GeV)/c^{2}'

    h_data = TH2F('scatter_data', 'scatter plot of M(Kpipi) and Rm(Dpipi)', bins, xmin, xmax, bins, ymin, ymax)
    format_data_hist(h_data)
    name_axis(h_data, xtitle, ytitle)
    fill(t_data, h_data)
    h_data.SetMarkerSize(0.2)
    # h_data.Draw('box')
    h_data.Draw('COLZ')

    x_move = width(ecms)
    y_move = window(ecms)
    x_offset = width(ecms)
    y_offset = window(ecms)
    x0 = 1.86965 - 5/2. * x_move
    y0 = 1.86965 + 5/2. * y_move
    mats = make_matrix(3, 3, (x0, y0), x_move, x_offset, y_move, y_offset)
    VarsManager = locals()
    for i, mat in enumerate(mats):
        x_list = []
        y_list = []
        for point in mat:
            x, y = point
            x_list.append(x)
            y_list.append(y)
        x, y = array('d', x_list), array('d', y_list)
        VarsManager['box_' + str(i)] = TPolyLine(5, x, y)
        if i == 4: color = ROOT.kRed
        else: color = ROOT.kBlue
        VarsManager['box_' + str(i)].SetLineColor(color)
        VarsManager['box_' + str(i)].SetLineWidth(4)
        if i == 1 or i == 3 or i == 5 or i == 7: VarsManager['box_' + str(i)].SetLineStyle(9)
        if i == 0 or i == 2 or i == 6 or i == 8: VarsManager['box_' + str(i)].SetLineStyle(2)
        VarsManager['box_' + str(i)].Draw('same')
        # if i == 0: left, right, bottom, top = position_convert(min(x), xmin, xmax) + 0.0045, position_convert(max(x), xmin, xmax) + 0.025, position_convert(min(y), ymin, ymax) + 0.0045, position_convert(max(y), ymin, ymax) + 0.025
        # elif i == 1 or i == 2: left, right, bottom, top = position_convert(min(x), xmin, xmax), position_convert(max(x), xmin, xmax) + 0.025, position_convert(min(y), ymin, ymax), position_convert(max(y), ymin, ymax) + 0.025
        # elif i == 3: left, right, bottom, top = position_convert(min(x), xmin, xmax) + 0.0045, position_convert(max(x), xmin, xmax), position_convert(min(y), ymin, ymax) + 0.0045, position_convert(max(y), ymin, ymax)
        # elif i == 6: left, right, bottom, top = position_convert(min(x), xmin, xmax) + 0.0045, position_convert(max(x), xmin, xmax) - 0.025, position_convert(min(y), ymin, ymax) + 0.0045, position_convert(max(y), ymin, ymax) - 0.025
        # elif i == 6 or i == 7 or i == 8: left, right, bottom, top = position_convert(min(x), xmin, xmax), position_convert(max(x), xmin, xmax) - 0.025, position_convert(min(y), ymin, ymax), position_convert(max(y), ymin, ymax) - 0.025
        # else: left, right, bottom, top = position_convert(min(x), xmin, xmax), position_convert(max(x), xmin, xmax), position_convert(min(y), ymin, ymax), position_convert(max(y), ymin, ymax)
        # VarsManager['pt_' + str(i)] = TPaveText(left, bottom, right, top, "BRNDC")
        # set_pavetext(VarsManager['pt_' + str(i)])
        # VarsManager['pt_' + str(i)].SetTextSize(0.06)
        # VarsManager['pt_' + str(i)].Draw()
        # if i == 0: VarsManager['pt_' + str(i)].AddText('(-1, 1)')
        # if i == 1: VarsManager['pt_' + str(i)].AddText(' (0, 1) ')
        # if i == 2: VarsManager['pt_' + str(i)].AddText(' (1, 1) ')
        # if i == 3: VarsManager['pt_' + str(i)].AddText('(-1, 0)')
        # if i == 4: VarsManager['pt_' + str(i)].AddText(' (0, 0) ')
        # if i == 5: VarsManager['pt_' + str(i)].AddText(' (1, 0) ')
        # if i == 6: VarsManager['pt_' + str(i)].AddText('(-1, -1)')
        # if i == 7: VarsManager['pt_' + str(i)].AddText(' (0, -1)')
        # if i == 8: VarsManager['pt_' + str(i)].AddText(' (1, -1)')
        # VarsManager['pt_' + str(i)].SetTextColor(color)

    pt = TPaveText(0.75, 0.77, 0.85, 0.87, "BRNDC")
    set_pavetext(pt)
    pt.Draw()
    pt.AddText(leg_title)

    if not os.path.exists('./figs/'):
        os.makedirs('./figs/')
    mbc.SaveAs('./figs/scatter_m_Kpipi_rm_Dpipi_'+str(ecms)+'.pdf')

    raw_input('Press <Enter> to end...')
Exemple #9
0
def write_file(ecms, cms, runNo, dst_list, file_num=-1):
    if file_num == -1: file_name = 'data' + str(runNo) + '.txt'
    else: file_name = 'data' + str(runNo) + '-' + str(file_num) + '.txt'
    f = open(file_name, 'w')
    f.write('#include "$ROOTIOROOT/share/jobOptions_ReadRec.txt"\n')
    f.write('#include "$MAGNETICFIELDROOT/share/MagneticField.txt"\n')
    f.write('#include "$DTAGALGROOT/share/jobOptions_dTag.txt"\n')
    f.write('#include "$DDECAYALGROOT/share/jobOptions_DDecay.txt"\n')
    f.write('#include "$MEASUREDECMSSVCROOT/share/anaOptions.txt"\n')
    f.write('DDecay.IsMonteCarlo = false;\n')
    f.write('DDecay.Ecms = ' + str(float(cms) / 1000.) + ';\n')
    f.write('DDecay.W_m_Kpipi = ' + str(width(ecms[0:4])) + ';\n')
    f.write('DDecay.W_rm_Dpipi = ' + str(window(ecms[0:4])) + ';\n')
    f.write('\n')
    f.write('DTag.NeutralDReconstruction  = true;\n')
    f.write('DTag.ChargedDReconstruction  = true;\n')
    f.write('DTag.DsReconstruction        = true;\n')
    f.write('\n')
    f.write('NeutralDSelector.UseMbcCuts       = false;\n')
    f.write('eutralDSelector.UseDeltaECuts     = false;\n')
    f.write('NeutralDSelector.UseDeltaMassCuts = true;\n')
    f.write('\n')
    f.write('ChargedDSelector.UseMbcCuts       = false;\n')
    f.write('ChargedDSelector.UseDeltaECuts    = false;\n')
    f.write('ChargedDSelector.UseDeltaMassCuts = true;\n')
    f.write('\n')
    f.write('DsSelector.UseMbcCuts       = false;\n')
    f.write('DsSelector.UseDeltaECuts    = false;\n')
    f.write('DsSelector.UseDeltaMassCuts = true;\n')
    f.write('\n')
    f.write('// Input REC or DST file name\n')
    f.write('EventCnvSvc.digiRootInputFile = {\n')
    print 'processing runNo: ' + str(runNo) + ' with ' + str(
        len(dst_list)) + ' dst files(' + str(file_num) + ')...'
    for dst in dst_list:
        if dst != dst_list[-1]:
            temp = '"' + dst + '",\n'
            f.write(temp)
        if dst == dst_list[-1]:
            temp = '"' + dst + '"\n'
            f.write(temp)
    f.write('};\n')
    f.write('\n')
    f.write(
        '// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )\n'
    )
    f.write('MessageSvc.OutputLevel =6;\n')
    f.write('\n')
    f.write('// Number of events to be processed (default is 10)\n')
    f.write('ApplicationMgr.EvtMax = -1;\n')
    f.write('\n')
    f.write('ApplicationMgr.HistogramPersistency = "ROOT";\n')
    if file_num == -1:
        f.write(
            'NTupleSvc.Output = {\"FILE1 DATAFILE=\'/scratchfs/bes/$USER/bes/DDPIPI/v0.2/data/'
            + ecms + '/' + 'data' + str(runNo) +
            '.root\' OPT=\'NEW\' TYP=\'ROOT\'\"};\n')
    else:
        f.write(
            'NTupleSvc.Output = {\"FILE1 DATAFILE=\'/scratchfs/bes/$USER/bes/DDPIPI/v0.2/data/'
            + ecms + '/' + 'data' + str(runNo) + '_' + str(file_num) +
            '.root\' OPT=\'NEW\' TYP=\'ROOT\'\"};\n')
    f.close()
Exemple #10
0
def rm_Dpipi_fill(t, h, window_low, window_up):
    for ientry in xrange(int(t.GetEntries())):
        t.GetEntry(ientry)
        if fabs(t.m_rawm_D - 1.86965) < width(ecms) / 2.:
            h.Fill(t.m_rm_Dpipi)
Exemple #11
0
def plot(data_path, pt_title, ecms, xmin, xmax, xbins):
    try:
        f_data = TFile(data_path)
        t_data = f_data.Get('save')
        entries_data = t_data.GetEntries()
        logging.info('data entries :' + str(entries_data))
    except:
        logging.error('File paths are invalid!')
        sys.exit()

    set_pub_style()
    set_prelim_style()

    width_low = 1.86965 - width(ecms) / 2.
    width_up = 1.86965 + width(ecms) / 2.
    width_side_low_up = width_low - (width_up - width_low)
    width_side_low_low = width_side_low_up - (width_up - width_low)
    width_side_up_low = width_up + (width_up - width_low)
    width_side_up_up = width_side_up_low + (width_up - width_low)

    mbc = TCanvas('mbc', 'mbc', 800, 600)
    content = (xmax - xmin) / xbins * 1000
    ytitle = 'Events/%.1f MeV/c^{2}' % content
    xtitle = 'M(K^{-}#pi^{+}#pi^{+}) (GeV/c^{2})'
    h_data = TH1F('data', 'data', xbins, xmin, float(xmax))

    format_data_hist(h_data)
    if ecms == 4420 or ecms == 4680: h_data.GetYaxis().SetTitleOffset(1.15)
    name_axis(h_data, xtitle, ytitle)
    rawm_D_fill(t_data, h_data, width_low, width_up)

    if not os.path.exists('./figs/'):
        os.makedirs('./figs/')

    h_data.Draw('E1')

    if ecms == 4420: low = 100
    elif ecms == 4230: low = 0
    elif ecms == 4680: low = 400
    else: low = 0
    top = h_data.GetMaximum()

    arrow1 = TArrow(width_low, low, width_low, 0.8 * top, 0.02, '<-')
    set_arrow(arrow1, ROOT.kRed)
    arrow1.SetLineStyle(2)
    arrow1.Draw()

    arrow2 = TArrow(width_up, low, width_up, 0.8 * top, 0.02, '<-')
    set_arrow(arrow2, ROOT.kRed)
    arrow2.SetLineStyle(2)
    arrow2.Draw()

    arrow3 = TArrow(width_side_low_low, low, width_side_low_low, 0.8 * top,
                    0.02, '<-')
    set_arrow(arrow3, ROOT.kBlue)
    arrow3.Draw()

    arrow4 = TArrow(width_side_low_up, low, width_side_low_up, 0.8 * top, 0.02,
                    '<-')
    set_arrow(arrow4, ROOT.kBlue)
    arrow4.Draw()

    arrow5 = TArrow(width_side_up_low, low, width_side_up_low, 0.8 * top, 0.02,
                    '<-')
    set_arrow(arrow5, ROOT.kBlue)
    arrow5.Draw()

    arrow6 = TArrow(width_side_up_up, low, width_side_up_up, 0.8 * top, 0.02,
                    '<-')
    set_arrow(arrow6, ROOT.kBlue)
    arrow6.Draw()

    leg = TLegend(position_convert(0.8 * (xmax - xmin) + xmin, xmin, xmax),
                  position_convert(0.8 * (top - low) + low, low, top),
                  position_convert(0.95 * (xmax - xmin) + xmin, xmin, xmax),
                  position_convert((top - low) + low, low, top), 'BRNDC')
    set_legend(leg, h_data, 'Data', pt_title)
    leg.Draw()

    h_data.Draw('sameE1')
    mbc.SaveAs('./figs/m_Kpipi_' + str(ecms) + '.pdf')

    raw_input('Enter anything to end...')
Exemple #12
0
def save(file_in, file_out, sample, mode):
    try:
        chain = TChain('save')
        chain.Add(file_in)
    except:
        logging.error(file_in + ' is invalid!')
        sys.exit()

    cut = ''
    D0_W = width('D0')
    Dm_W = width('Dm')
    D0_signal_low = 1.86483 - D0_W/2.
    D0_signal_up = 1.86483 + D0_W/2.
    D0_sidebandlow_up = D0_signal_low - D0_W
    D0_sidebandlow_low = D0_signal_low - 2. * D0_W
    D0_sidebandup_low = D0_signal_up + D0_W
    D0_sidebandup_up = D0_signal_up + 2. * D0_W
    Dm_signal_low = 1.86965 - Dm_W/2.
    Dm_signal_up = 1.86965 + Dm_W/2.
    Dm_sidebandlow_up = Dm_signal_low - Dm_W
    Dm_sidebandlow_low = Dm_signal_low - 2. * Dm_W
    Dm_sidebandup_low = Dm_signal_up + Dm_W
    Dm_sidebandup_up = Dm_signal_up + 2. * Dm_W
    if mode == 'after_mass':
        if sample == 'signal':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_signal_low) + ' && m_m_D0 < ' + str(D0_signal_up) + ' && m_m_Dm > ' + str(Dm_signal_low) + ' && m_m_Dm < ' + str(Dm_signal_up) + ')'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side1_low':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_signal_low) + ' && m_m_D0 < ' + str(D0_signal_up) + ' && (m_m_Dm > ' + str(Dm_sidebandlow_low) + ' && m_m_Dm < ' + str(Dm_sidebandlow_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side1_up':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_signal_low) + ' && m_m_D0 < ' + str(D0_signal_up) + ' && (m_m_Dm > ' + str(Dm_sidebandup_low) + ' && m_m_Dm < ' + str(Dm_sidebandup_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side2_low':
            cut_D0Dm = '(m_m_Dm > ' + str(Dm_signal_low) + ' && m_m_Dm < ' + str(Dm_signal_up) + ' && (m_m_D0 > ' + str(D0_sidebandlow_low) + ' && m_m_D0 < ' + str(D0_sidebandlow_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side2_up':
            cut_D0Dm = '(m_m_Dm > ' + str(Dm_signal_low) + ' && m_m_Dm < ' + str(Dm_signal_up) + ' && (m_m_D0 > ' + str(D0_sidebandup_low) + ' && m_m_D0 < ' + str(D0_sidebandup_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side3_low':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_sidebandlow_low) + ' && m_m_D0 < ' + str(D0_sidebandlow_up) + ' && (m_m_Dm > ' + str(Dm_sidebandlow_low) + ' && m_m_Dm < ' + str(Dm_sidebandlow_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side3_up':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_sidebandlow_low) + ' && m_m_D0 < ' + str(D0_sidebandlow_up) + ' && (m_m_Dm > ' + str(Dm_sidebandup_low) + ' && m_m_Dm < ' + str(Dm_sidebandup_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side4_low':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_sidebandup_low) + ' && m_m_D0 < ' + str(D0_sidebandup_up) + ' && (m_m_Dm > ' + str(Dm_sidebandlow_low) + ' && m_m_Dm < ' + str(Dm_sidebandlow_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
        if sample == 'side4_up':
            cut_D0Dm = '(m_m_D0 > ' + str(D0_sidebandup_low) + ' && m_m_D0 < ' + str(D0_sidebandup_up) + ' && (m_m_Dm > ' + str(Dm_sidebandup_low) + ' && m_m_Dm < ' + str(Dm_sidebandup_up) + '))'
            cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
            cut_chi2 = '(m_chi2_4c < 60)'
            cut = cut_D0Dm + ' && ' + cut_DstD + ' && ' + cut_chi2
    if mode == 'before_mass':
        cut_DstD = '(m_m_D0pip - m_m_D0 + 1.86483 > 2.030)'
        cut_chi2 = '(m_chi2_4c < 60)'
        cut = cut_DstD + ' && ' + cut_chi2

    t = chain.CopyTree(cut)
    t.SaveAs(file_out)