示例#1
0
    def __init__(self, **kwargs):
        self.configure_from_args(jet_R=0.4,
                                 jet_algorithm=fj.antikt_algorithm,
                                 particle_eta_max=0.9,
                                 jet_pt_min=0.0,
                                 particles=None,
                                 explicit_ghosts=False)
        super(JetAnalysis, self).__init__(**kwargs)

        self.particle_selector = fj.SelectorAbsEtaMax(self.particle_eta_max)

        self.jet_eta_max = self.particle_eta_max - self.jet_R * 1.05
        # self.jet_eta_max = self.particle_eta_max - 0.05
        self.jet_def = fj.JetDefinition(self.jet_algorithm, self.jet_R)
        self.jet_selector = fj.SelectorPtMin(
            self.jet_pt_min) & fj.SelectorAbsEtaMax(self.jet_eta_max)
        if self.explicit_ghosts:
            self.jet_area_def = fj.AreaDefinition(
                fj.active_area_explicit_ghosts,
                fj.GhostedAreaSpec(self.particle_eta_max))
        else:
            self.jet_area_def = fj.AreaDefinition(
                fj.active_area, fj.GhostedAreaSpec(self.particle_eta_max))

        if self.particles:
            self.analyze_event(self.particles)
示例#2
0
    def __init__(self, **kwargs):
        self.configure_from_args(jet_R=0.4,
                                 jet_algorithm=fj.antikt_algorithm,
                                 particle_eta_max=0.9,
                                 particles=None)
        super(JetAnalysis, self).__init__(**kwargs)

        self.bg_rho_range = fj.SelectorAbsEtaMax(self.particle_eta_max)
        self.bg_jet_def = fj.JetDefinition(fj.kt_algorithm, self.jet_R)
        self.bg_area_def = fj.AreaDefinition(
            fj.active_area_explicit_ghosts,
            fj.GhostedAreaSpec(self.particle_eta_max))
        self.bg_estimator = fj.JetMedianBackgroundEstimator(
            self.bg_rho_range, self.bg_jet_def, self.bg_area_def)
        self.rho = 0

        self.jet_eta_max = self.particle_eta_max - self.jet_R * 1.05
        self.jet_def = fj.JetDefinition(self.jet_algorithm, self.jet_R)
        self.jet_selector = fj.SelectorPtMin(0.0) & fj.SelectorAbsEtaMax(
            self.jet_eta_max)
        self.jet_area_def = fj.AreaDefinition(
            fj.active_area_explicit_ghosts,
            fj.GhostedAreaSpec(self.particle_eta_max))

        if self.particles:
            self.analyze_event(self.particles)
示例#3
0
def fj_example_02_area(event):
    # cluster the event
    jet_def = fj.JetDefinition(fj.antikt_algorithm, 0.4)
    area_def = fj.AreaDefinition(fj.active_area, fj.GhostedAreaSpec(5.0))
    cs = fj.ClusterSequenceArea(event, jet_def, area_def)
    jets = fj.SelectorPtMin(5.0)(fj.sorted_by_pt(cs.inclusive_jets()))
    print("jet def:", jet_def)
    print("area def:", area_def)
    print("#-------------------- initial jets --------------------")
    print_jets(jets)
    #----------------------------------------------------------------------
    # estimate the background
    maxrap = 4.0
    grid_spacing = 0.55
    gmbge = fj.GridMedianBackgroundEstimator(maxrap, grid_spacing)
    gmbge.set_particles(event)
    print("#-------------------- background properties --------------------")
    print("rho   = ", gmbge.rho())
    print("sigma = ", gmbge.sigma())
    print()
    #----------------------------------------------------------------------
    # subtract the jets
    subtractor = fj.Subtractor(gmbge)
    subtracted_jets = subtractor(jets)
    print("#-------------------- subtracted jets --------------------")
    print_jets(subtracted_jets)
示例#4
0
def analyze_file_list(file_inputs=[],
                      output_prefix='rg',
                      tree_name='tree_Particle'):

    anl = []

    bg_rho_range = fj.SelectorAbsRapMax(0.9)
    bg_jet_def = fj.JetDefinition(fj.kt_algorithm, 0.4)
    bg_area_def = fj.AreaDefinition(fj.active_area_explicit_ghosts,
                                    fj.GhostedAreaSpec(0.9))
    bg_estimator = fj.JetMedianBackgroundEstimator(bg_rho_range, bg_jet_def,
                                                   bg_area_def)
    print('[i]', bg_estimator.description())
    an_std = MPJetAnalysis(output_prefix=output_prefix,
                           name='std',
                           bg_estimator=bg_estimator)
    anl.append(an_std)

    g_bg_estimator = fj.GridMedianBackgroundEstimator(0.9, 0.4)
    print('[i]', g_bg_estimator.description())
    an_gbg = MPJetAnalysis(output_prefix=output_prefix,
                           name='bgb',
                           bg_estimator=g_bg_estimator)
    anl.append(an_gbg)

    cs004 = csubtractor.CEventSubtractor(alpha=0,
                                         max_distance=0.4,
                                         max_eta=0.9,
                                         bge_rho_grid_size=0.25,
                                         max_pt_correct=100)
    an_cs_004 = MPJetAnalysis(output_prefix=output_prefix,
                              name='cs004',
                              bg_estimator=cs004.bge_rho,
                              constit_subtractor=cs004)
    anl.append(an_cs_004)

    cs404 = csubtractor.CEventSubtractor(alpha=4,
                                         max_distance=0.4,
                                         max_eta=0.9,
                                         bge_rho_grid_size=0.25,
                                         max_pt_correct=100)
    an_cs_404 = MPJetAnalysis(output_prefix=output_prefix,
                              name='cs404',
                              bg_estimator=cs404.bge_rho,
                              constit_subtractor=cs404)
    anl.append(an_cs_404)

    ad = MPAnalysisDriver(file_list=file_inputs,
                          analyses_list=anl,
                          tree_name=tree_name)
    ad.run()

    print()
    print('    ---')
    print()
    print(ad)
    print('[i] done.')
示例#5
0
 def __init__(self, **kwargs):
     self.configure_constants(
         particle_eta_max=0.9,
         particle_pt_max=
         100,  # reject jets with constituent with pT > max_particle_pt
         jet_R=0.4,
         jet_algorithm=fj.antikt_algorithm,
         jet_pt_min=-200,
         bge_rho_grid_size=-1,  # no background subtraction for -1
         sd_z_cuts=[0.1],
         sd_betas=[0, 2],
         show_progress=False,
         name="MPJetAnalysis",
         output_prefix='./')
     self.jet_eta_max = self.particle_eta_max - self.jet_R * 1.05
     self.jet_def = fj.JetDefinition(self.jet_algorithm, self.jet_R)
     self.jet_selector = fj.SelectorPtMin(5.0) & fj.SelectorAbsRapMax(
         self.jet_eta_max)
     self.particle_selector = fj.SelectorPtMin(0.15) & fj.SelectorAbsRapMax(
         self.particle_eta_max)
     self.jet_area_def = fj.AreaDefinition(
         fj.active_area_explicit_ghosts,
         fj.GhostedAreaSpec(self.particle_eta_max))
     self.bg_estimator = None
     self.constit_subtractor = None
     self.jet_output = None
     self.event_output = None
     self.fout = None
     super(MPJetAnalysis, self).__init__(**kwargs)
     self.filename_output = '{}{}.root'.format(self.output_prefix,
                                               self.name)
     if self.fout is None:
         self.fout = ROOT.TFile(self.filename_output, 'recreate')
     if self.jet_output is None:
         self.jet_output = treewriter.RTreeWriter(tree_name='tjet',
                                                  fout=self.fout)
     if self.event_output is None:
         self.event_output = treewriter.RTreeWriter(tree_name='tev',
                                                    fout=self.fout)
     fj.ClusterSequence.print_banner()
     print()
     print(self)
     print(' . particle selector', self.particle_selector)
     print(' . jet selector', self.jet_selector)
     print(' . jet definition:', self.jet_def)
     # define softdrops
     self.sds = []
     for beta in self.sd_betas:
         for zcut in self.sd_z_cuts:
             _sd = fjcontrib.SoftDrop(beta, zcut, self.jet_R)
             self.sds.append(_sd)
     for _sd in self.sds:
         print(' . sd:', _sd.description())
示例#6
0
def do_cs_jet_by_jet(full_event, ptmin=100.):
    # clustering with ghosts and get the jets
    jet_def = fj.JetDefinition(fj.antikt_algorithm, 0.4)
    ghost_RapMax = 3.
    ghost_spec = fj.GhostedAreaSpec(ghost_RapMax, 1, ghost_area)
    area_def = fj.AreaDefinition(fj.active_area_explicit_ghosts, ghost_spec)
    clust_seq_full = fj.ClusterSequenceArea(full_event, jet_def, area_def)
    full_jets = clust_seq_full.inclusive_jets(ptmin)

    # background estimation
    jet_def_bge = fj.JetDefinition(fj.kt_algorithm, 0.4)
    area_def_bge = fj.AreaDefinition(fj.active_area_explicit_ghosts,
                                     ghost_spec)

    bge_range = fj.SelectorAbsRapMax(3.0)
    bge = fj.JetMedianBackgroundEstimator(bge_range, jet_def_bge, area_def_bge)
    bge.set_particles(full_event)

    # subtractor
    subtractor = cs.ConstituentSubtractor()
    subtractor.set_distance_type(0)
    subtractor.set_max_distance(max_distance)
    subtractor.set_alpha(alpha)
    subtractor.set_max_eta(3.0)
    subtractor.set_background_estimator(bge)
    subtractor.set_common_bge_for_rho_and_rhom()

    #sel_max_pt = fj.SelectorPtMax(10)
    #subtractor.set_particle_selector(sel_max_pt)

    # do subtraction
    corrected_jets = cs.PseudoJetVec()
    for jet in full_jets:
        subtracted_jet = subtractor.result(jet)
        corrected_jets.push_back(subtracted_jet)

    # pt cut
    selector = fj.SelectorPtMin(ptmin)
    return selector(corrected_jets), clust_seq_full
示例#7
0
def run(data, n_events = 1000000):
    
    out = []
    njets = []
    met = []
    rho = []
    jets_corr = []
    area = []

    # run jet clustering with AntiKt, R=1.0
    R = 1.0
    jet_def = fj.JetDefinition(fj.antikt_algorithm, R)

    # Area Definition
    ghost_maxrap = 4.7
    area_def = fj.AreaDefinition(fj.active_area, fj.GhostedAreaSpec(ghost_maxrap))

    # Background estimator
    select_rapidity = fj.SelectorAbsRapMax(ghost_maxrap)
    bge = fj.JetMedianBackgroundEstimator(select_rapidity, jet_def, area_def)

    # Loop over events
    for ievt in range(n_events):

        # Build a list of all particles and MET Information
        pjs = []
        pjmet = fj.PseudoJet()
        pjmets = fj.PseudoJet()

        for i in range(int(data.shape[1]/3)):

            pj = fj.PseudoJet()
            pj.reset_PtYPhiM(data.at[ievt, 3*i+0], data.at[ievt, 3*i+1], data.at[ievt, 3*i+2], 0)
            if pj.pt() > 1.0:
                pjs.append(pj)

            pjmet.reset_momentum(-pj.px(), -pj.py(), 0, pj.E())
            pjmets = pjmets + pjmet

        met.append(pjmets)

        # Cluster sequence
        clust_seq = fj.ClusterSequenceArea(pjs, jet_def, area_def)
        jets = fj.sorted_by_pt(clust_seq.inclusive_jets())
        jets = [j for j in jets if j.pt() > 30. and j.eta() < 4.7]
        area.append([jets[0].area(), jets[1].area()])

        # Save the two leading jets and njets
        jets_sel = (fj.SelectorNHardest(2))(jets)
        out.append(jets_sel)
        njets.append(len(jets))

        # Background estimator
        bge.set_particles(pjs)
        rho.append(bge.rho())

        # Correct Jets
        sub = fj.Subtractor(bge)
        sub_jets = sub(jets_sel)
        jets_corr.append(sub_jets)

    return out, area, met, njets, rho, jets_corr
示例#8
0
def main(args):
    fname = args.fname
    file = uproot.open(fname)
    all_ttrees = dict(
        file.allitems(
            filterclass=lambda cls: issubclass(cls, uproot.tree.TTreeMethods)))
    tracks = all_ttrees[b'PWGHF_TreeCreator/tree_Particle;1']
    pds_trks = tracks.pandas.df()  # entrystop=10)
    events = all_ttrees[b'PWGHF_TreeCreator/tree_event_char;1']
    pds_evs = events.pandas.df()

    # print the banner first
    fj.ClusterSequence.print_banner()

    # signal jet definition
    maxrap = 0.9
    jet_R0 = args.jetR
    jet_def = fj.JetDefinition(fj.antikt_algorithm, jet_R0)
    jet_selector = fj.SelectorPtMin(0.0) & fj.SelectorAbsEtaMax(1)
    jet_area_def = fj.AreaDefinition(fj.active_area,
                                     fj.GhostedAreaSpec(maxrap))
    print(jet_def)

    # background estimation
    grid_spacing = maxrap / 10.
    gmbge = fj.GridMedianBackgroundEstimator(maxrap, grid_spacing)

    print()

    output_columns = ['evid', 'pt', 'eta', 'phi', 'area', 'ptsub']
    e_jets = pd.DataFrame(columns=output_columns)

    for i, e in pds_evs.iterrows():
        iev_id = int(e['ev_id'])
        run_number = int(e['run_number'])
        _ts = pds_trks.loc[pds_trks['ev_id'] == iev_id].loc[
            pds_trks['run_number'] == run_number]
        _tpsj = fjext.vectorize_pt_eta_phi(_ts['ParticlePt'].values,
                                           _ts['ParticleEta'].values,
                                           _ts['ParticlePhi'].values)
        # print('maximum particle rapidity:', max([psj.rap() for psj in _tpsj]))
        _cs = fj.ClusterSequenceArea(_tpsj, jet_def, jet_area_def)
        _jets = jet_selector(fj.sorted_by_pt(_cs.inclusive_jets()))
        gmbge.set_particles(_tpsj)
        # print("rho   = ", gmbge.rho(), "sigma = ", gmbge.sigma())
        _jets_df = pd.DataFrame([[
            iev_id,
            j.perp(),
            j.eta(),
            j.phi(),
            j.area(),
            j.perp() - gmbge.rho() * j.area()
        ] for j in _jets],
                                columns=output_columns)
        e_jets = e_jets.append(_jets_df, ignore_index=True)
        # print('event', i, 'number of parts', len(_tpsj), 'number of jets', len(_jets))
        # print(_jets_df.describe())
        if args.fjsubtract:
            fj_example_02_area(_tpsj)

    # print(e_jets.describe())
    joblib.dump(e_jets, args.output)
示例#9
0
def main(args):
    fname = args.fname
    file = uproot.open(fname)
    all_ttrees = dict(
        file.allitems(
            filterclass=lambda cls: issubclass(cls, uproot.tree.TTreeMethods)))
    tracks = all_ttrees[b'PWGHF_TreeCreator/tree_Particle;1']
    pds_trks = tracks.pandas.df()  # entrystop=10)
    events = all_ttrees[b'PWGHF_TreeCreator/tree_event_char;1']
    pds_evs = events.pandas.df()

    # print the banner first
    fj.ClusterSequence.print_banner()

    # signal jet definition
    maxrap = 0.9
    jet_R0 = args.jetR
    jet_def = fj.JetDefinition(fj.antikt_algorithm, jet_R0)
    jet_selector = fj.SelectorPtMin(0.0) & fj.SelectorPtMax(
        1000.0) & fj.SelectorAbsEtaMax(1)
    jet_area_def = fj.AreaDefinition(fj.active_area,
                                     fj.GhostedAreaSpec(maxrap))
    print(jet_def)

    # background estimation
    grid_spacing = maxrap / 10.
    gmbge = fj.GridMedianBackgroundEstimator(maxrap, grid_spacing)

    print()

    output_columns = ['evid', 'pt', 'eta', 'phi', 'area', 'ptsub']
    e_jets = pd.DataFrame(columns=output_columns)

    for i, e in pds_evs.iterrows():
        iev_id = int(e['ev_id'])
        _ts = pds_trks.loc[pds_trks['ev_id'] == iev_id]

        start = time.time()
        _tpsj = fj_parts_from_tracks_numpy(_ts)
        end = time.time()
        dt_swig = end - start

        start = time.time()
        _tpsj_for = fj_parts_from_tracks(_ts)
        end = time.time()
        dt_for = end - start

        # print ('len {} =?= {}'.format(len(_tpsj_for), len(_tpsj)))
        print(
            '[i] timing (ntracks={}): dt_for: {} dt_swig: {} ratio: {}'.format(
                len(_tpsj), dt_for, dt_swig, dt_for / dt_swig))

        # print('maximum particle rapidity:', max([psj.rap() for psj in _tpsj]))
        _cs = fj.ClusterSequenceArea(_tpsj, jet_def, jet_area_def)
        _jets = jet_selector(fj.sorted_by_pt(_cs.inclusive_jets()))
        gmbge.set_particles(_tpsj)
        # print("rho   = ", gmbge.rho())
        # print("sigma = ", gmbge.sigma())

        # _jets = jet_selector(jet_def(_tpsj))
        # _jets_a = [[iev_id, j.perp(), j.eta(), j.phi()] for j in _jets]
        # _jets_a = pd.DataFrame(np.array([[iev_id, j.perp(), j.eta(), j.phi()] for j in _jets]), columns=['evid', 'pt', 'eta', 'phi'])
        _jets_a = pd.DataFrame([[
            iev_id,
            j.perp(),
            j.eta(),
            j.phi(),
            j.area(),
            j.perp() - gmbge.rho() * j.area()
        ] for j in _jets],
                               columns=output_columns)
        # , columns=['evid, pt, eta, phi']
        e_jets = e_jets.append(_jets_a, ignore_index=True)
        # print('event', i, 'number of parts', len(_tpsj), 'number of jets', len(_jets))
        # print(_jets_a.describe())
        if args.fjsubtract:
            fj_example_02_area(_tpsj)

    # print(e_jets.describe())
    joblib.dump(e_jets, args.output)
示例#10
0
def main():
	parser = argparse.ArgumentParser(description='test the TennGen', prog=os.path.basename(__file__))
	pyconf.add_standard_pythia_args(parser)
	parser.add_argument('--ignore-mycfg', help="ignore some settings hardcoded here", default=False, action='store_true')
	parser.add_argument('--cent-bin', help="centraility bin 0 is the  0-5 % most central bin", type=int, default=0)
	parser.add_argument('--seed', help="pr gen seed", type=int, default=1111)
	parser.add_argument('--harmonics', help="set harmonics flag (0 : v1 - v5) , (1 : v2 - v5) , (2: v3 - v5) , (3: v1 - v4) , (4: v1 - v3) , (5: uniform dN/dphi no harmonics) , (6 : v1 - v2 , v4 - v5) , (7 : v1 - v3 , v5) , (8 : v1 , v3 - v5) , (9 : v1 only) , (10 : v2 only) , (11 : v3 only) , (12 : v4 only) , (13 : v5 only)", 
						type=int, default=5)
	parser.add_argument('--eta', help="set eta range must be uniform (e.g. |eta| < 0.9, which is ALICE TPC fiducial acceptance)",
						type=float, default=0.9)
	parser.add_argument('--qa', help="PrintOutQAHistos", default=False, action='store_true')

	args = parser.parse_args()

	args.py_pthatmin = 100
	mycfg = ['PhaseSpace:pThatMin = {}'.format(args.py_pthatmin)]
	if args.ignore_mycfg:
		mycfg = []
	pythia = pyconf.create_and_init_pythia_from_args(args, mycfg)
	if not pythia:
		perror("pythia initialization failed.")
		return

	tgbkg = ROOT.TennGen() # //constructor
	tgbkg.SetCentralityBin(args.cent_bin) # //centraility bin 0 is the  0-5 % most central bin
	tgbkg.SetRandomSeed(args.seed) # //setting the seed
	tgbkg.SetHarmonics(args.harmonics) # // set harmonics flag (0 : v1 - v5) , (1 : v2 - v5) , (2: v3 - v5) , (3: v1 - v4) , (4: v1 - v3) , (5: uniform dN/dphi no harmonics) , (6 : v1 - v2 , v4 - v5) , (7 : v1 - v3 , v5) , (8 : v1 , v3 - v5) , (9 : v1 only) , (10 : v2 only) , (11 : v3 only) , (12 : v4 only) , (13 : v5 only)
	tgbkg.SetEtaRange(args.eta) # //set eta range must be uniform (e.g. |eta| < 0.9, which is ALICE TPC fiducial acceptance)
	tgbkg.PrintOutQAHistos(args.qa) #
	tgbkg.InitializeBackground() #

	jet_R0 = 0.4
	jet_def = fj.JetDefinition(fj.antikt_algorithm, jet_R0)
	jet_selector_pythia = fj.SelectorPtMin(args.py_pthatmin) & fj.SelectorPtMax(1000.0) &fj.SelectorAbsEtaMax(args.eta - jet_R0)
	jet_selector_hybrid = fj.SelectorPtMin(10) & fj.SelectorPtMax(1000.0) &fj.SelectorAbsEtaMax(args.eta - jet_R0)
	# jet_selector = fj.SelectorPtMin(40.0) & fj.SelectorPtMax(200.0) &fj.SelectorAbsEtaMax(1)
	parts_selector = fj.SelectorAbsEtaMax(args.eta)
	print(jet_def)

	tw = treewriter.RTreeWriter(name = 'tparts', file_name = 'test_TennGen.root')

	if args.nev < 100:
		args.nev = 100
	pbar = tqdm.tqdm(total = args.nev)
	while pbar.n < args.nev:
		if not pythia.next():
			continue

		# get pythia particles
		# parts = pythiafjext.vectorize_select(pythia, [pythiafjext.kFinal, pythiafjext.kCharged], 0, False)
		_py_fj_parts = parts_selector(pythiafjext.vectorize_select(pythia, [pythiafjext.kFinal], 0, False))
		# get jets w/o area determination
		# pythia_jets = jet_selector_pythia(jet_def(_py_fj_parts))

		# with area determination
		jet_area_def = fj.AreaDefinition(fj.active_area, fj.GhostedAreaSpec(args.eta))
		cs = fj.ClusterSequenceArea(_py_fj_parts, jet_def, jet_area_def)
		pythia_jets = jet_selector_pythia(cs.inclusive_jets())

		if len(pythia_jets) < 1:
			continue
		pbar.update(1)
		tw.fill_branches(pyj = pythia_jets)

		# now generate bg
		bg_tclones = tgbkg.GetBackground()
		# tgbkg.GetRandomSeed()
		nParticles = bg_tclones.GetEntries();
		# pinfo('event', pbar.n, 'number of parts', nParticles)
		# _parts = { 'pt' : [], 'eta' : [], 'phi' : [], 'kf' : []}
		_parts = [[], [], [], []]
		_ = [[_parts[0].append(p[0].Pt()), _parts[1].append(p[0].Eta()), _parts[2].append(p[0].Phi()), _parts[3].append(p[1])] for p in [[tlv_from_tmcparticle(_p), _p.GetKF()] for _p in bg_tclones if _p.GetEnergy()>0]]
		_bg_fj_parts = fjext.vectorize_pt_eta_phi(_parts[0], _parts[1], _parts[2], 1000) #bg particles with index > 1000

		# add background and pythia 
		_fj_parts = []
		_ = [_fj_parts.append(_p) for _p in _py_fj_parts]
		_ = [_fj_parts.append(_p) for _p in _bg_fj_parts]

		# stream all particles
		_ = [tw.fill_branches(part_pt = _pfj.perp(), part_eta = _pfj.eta(), part_phi = _pfj.phi(), part_idx=_pfj.user_index()) for _pfj in _fj_parts]

		# find jets in the hybrid event
		# w/o area
		# jets = jet_selector_hybrid(jet_def(_fj_parts))
		# w/area
		cs_hybrid = fj.ClusterSequenceArea(_fj_parts, jet_def, jet_area_def)
		jets = jet_selector_hybrid(cs_hybrid.inclusive_jets())
		# stream jets from the hybrid event
		tw.fill_branches(j = jets)

		# estimate the background
		bg_rho_range = fj.SelectorAbsEtaMax(args.eta * 1.1)
		bg_jet_def = fj.JetDefinition(fj.kt_algorithm, jet_R0)
		bg_area_def = fj.AreaDefinition(fj.active_area_explicit_ghosts, fj.GhostedAreaSpec(args.eta))
		# bg_area_def = fj.AreaDefinition(fj.active_area, fj.GhostedAreaSpec(args.eta)) #active area defunct for bg estim
		bg_estimator = fj.JetMedianBackgroundEstimator(bg_rho_range, bg_jet_def, bg_area_def)
		bg_estimator.set_particles(_fj_parts)
		if len(_fj_parts) < 0:
			perror('no particles in the hybrid event?')
			continue
		rho = bg_estimator.rho()
		sigma = bg_estimator.sigma()
		corr_jet_pt = [j.pt() - j.area() * rho for j in jets]
		# matches = [j.perp(), matched_jet(j, pythia_jets) for j in jets]
		delta_pt = [delta_pt_matched(j, pythia_jets, rho) for j in jets]
		tw.fill_branches(j_corr_pt = corr_jet_pt, dpt = delta_pt)
		tw.fill_branches(rho = rho, rho_sigma = sigma)

		tw.fill_tree()
		bg_tclones.Clear()

	pbar.close()

	tgbkg.CloserFunction()
	tw.write_and_close()