def test_iso1(self):
        p4 = TLorentzVector()
        p4.SetPtEtaPhiM(10, 0, 0, 0.105)
        lepton = Particle(13, 1, p4)

        p4 = TLorentzVector()
        p4.SetPtEtaPhiM(1, 0, 0, 0.105)
        ptc = Particle(211, 1, p4)

        # test iso calc
        computer = IsolationComputer([EtaPhiCircle(0.4)])
        iso = computer.compute(lepton, [ptc,ptc])
        self.assertEqual(iso.sumpt, 2*ptc.pt())
        self.assertEqual(iso.sume, 2*ptc.e())
        self.assertEqual(iso.num, 2)

        # test IsolationInfo addition
        iso2 = copy.copy(iso)
        iso2 += iso
        self.assertEqual(iso2.sumpt, 4*ptc.pt())
        self.assertEqual(iso2.sume, 4*ptc.e())
        self.assertEqual(iso2.num, 4)
       
        # test veto
        computer = IsolationComputer([EtaPhiCircle(0.4)], [EtaPhiCircle(0.1)])
        iso = computer.compute(lepton, [ptc])
        self.assertEqual(iso.sumpt, 0.)
Beispiel #2
0
    def process(self, event):
        #sqrts = self.cfg_ana.sqrts
        sqrts = 240.
        #sqrts = random.gauss(240.,240.*0.0012)
        #sqrts = random.gauss(240.,10.)
        jets = getattr(event, self.cfg_ana.input_jets)
        misenergy = getattr(event, self.cfg_ana.misenergy)
        #        solving the equation

        vis_p4 = TLorentzVector(0, 0, 0, 0)
        for jet in jets:
            vis_p4 += jet.p4()
        vis = Recoil(0, 0, vis_p4, 1)
        #         m=m_Z constrain
        a = vis.e() * sqrts / (vis.m()**2)
        b = a**2 - (sqrts**2 - 91.**2) / (vis.m()**2)

        #      sf stands for scaling factor

        if b < 0:
            sf = 1
            setattr(event, self.cfg_ana.det, 1)
        else:
            #sf2 corresponds to the solution where the missing energy is negative therefore sf is the scaling factor that makes sense from a physics pov.
            sf = a - math.sqrt(b)
            sf2 = a + math.sqrt(b)
            setattr(event, self.cfg_ana.det, 2)

######test
#visscaled1=TLorentzVector(0,0,0,0)
#visscaled2=TLorentzVector(0,0,0,0)
#for jet in jets:
#    visscaled1+=jet.p4()*sf
#    visscaled2+=jet.p4()*sf2
#cms=TLorentzVector(0,0,0,240)
#v1=cms-visscaled1
#v2=cms-visscaled2
#print v1.E(),v2.E()

        setattr(event, self.cfg_ana.scalingfac, sf)

        setattr(event, self.cfg_ana.scalingfac2, sf2)

        scale_factors = [sf] * 2
        output = []
        for jet, factor in zip(jets, scale_factors):
            # the jets should not be deepcopied
            # as they are heavy objects containing
            # in particular a list of consistuent particles
            scaled_jet = copy.copy(jet)
            scaled_jet._tlv = copy.deepcopy(jet._tlv)
            scaled_jet._tlv *= factor
            output.append(scaled_jet)

        setattr(event, self.cfg_ana.output_jets, output)