Esempio n. 1
0
def WriteTree(runSet):

    print 'Writing tree'

    # Make a tree
    froot = TFile('mu.root', 'RECREATE')
    tree = TTree("mu", "Flat ntuple for mu")
    tree.SetDirectory(froot)

    leaves = "run/F:lb/F:mu/F"

    leafValues = array("f", [0.0, 0.0, 0.0])

    newBranch = tree.Branch("mu_vars", leafValues, leaves)

    for r, lbs in runSet.iteritems():
        for i in range(lbs.FirstLB(), lbs.LastLB()):
            leafValues[2] = lbs.GetMeanPileUp(i)
            leafValues[0] = float(r)
            leafValues[1] = i

            print 'mu: %s run: %s lb: %s' % (leafValues[2], leafValues[0],
                                             leafValues[1])

            tree.Fill()

    tree.Write()
    #froot.Write()
    froot.Close()
Esempio n. 2
0
 def makesample(sample): # help function to create file with tree
   fname = "%s/%s_%s.root"%(outdir,sample,channel)
   file  = TFile(fname,'RECREATE')
   hist  = TH1D('cutflow','cutflow',20,0,20)
   tree  = TTree('tree','tree')
   tree.Branch('m_vis',      m_vis,      'm_vis/F')
   tree.Branch('pt_1',       pt_1,       'pt_1/F')
   tree.Branch('pt_2',       pt_2,       'pt_2/F')
   tree.Branch('dm_2',       dm_2,       'dm_2/I')
   tree.Branch('eta_1',      eta_1,      'eta_1/F')
   tree.Branch('eta_2',      eta_2,      'eta_2/F')
   tree.Branch('njets',      njets,      'njets/I')
   tree.Branch('genmatch_2', genmatch_2, 'genmatch_2/I')
   tree.Branch('NUP',        NUP,        'NUP/I')
   tree.Branch('weight',     weight,     'weight/F')
   tree.SetDirectory(file)
   hist.SetDirectory(file)
   hist.SetBinContent( 1,1)
   hist.SetBinContent(17,1)
   histdict[sample] = hist
   filedict[sample] = (file,tree)
Esempio n. 3
0
    tree_ds.SetBranchAddress(branchName, branches[branchName])
    tree_bu.SetBranchAddress(branchName, branches[branchName])
    tree_bd.SetBranchAddress(branchName, branches[branchName])
    tree_bkg.SetBranchAddress(branchName, branches[branchName])

branches['category'] = array('i', [-999])
tree_ds.SetBranchAddress('category', branches['category'])
tree_bu.SetBranchAddress('category', branches['category'])
tree_bd.SetBranchAddress('category', branches['category'])
tree_bkg.SetBranchAddress('category', branches['category'])

#Setup a new tree
T3MFMiniTree = TFile("T3MMiniTree" + "_" + args.weights_prefix + ".root",
                     "recreate")
T3MMiniTree = TTree('T3MMiniTree', 'T3MMiniTree')
T3MMiniTree.SetDirectory(T3MFMiniTree)

for branchName in branchList_miniTree:
    branches_miniTree[branchName] = array('f', [-999])
    T3MMiniTree.Branch(branchName, branches_miniTree[branchName],
                       branchName + '/F')

# Book methods
for reader in mvaReaderList:
    mvaReaders[reader].BookMVA('BDT', mvaWeights[reader])

print branches_miniTree

# print some example classifications
print('Classifying signal events (Ds)')
for i in range(tree_ds.GetEntriesFast()):
#root_file = sys.argv[1]
filename = sys.argv[1]

#filename = root_files_directory + root_file
file = TFile(filename, 'read')
tree = file.Get('t1')

nb_entries = tree.GetEntries()

#newfilename = root_files_directory
#newfile = TFile(root_files_directory + root_file[:-5] + '-t2.root', 'recreate')
newfilename = filename[:-5] + '-t2.root'
newfile = TFile(newfilename, 'recreate')
newtree = TTree('t2', '')

newtree.SetDirectory(newfile)

#che eto takoe??
max_size = 1000000

eventid = array('i', [0])
etot_NR = array('f', [0.])
etot_ER = array('f', [0.])
ns_NR = array('i', [0])
ns_ER = array('i', [0])
ed_NR = array('f', max_size * [0.])
ed_ER = array('f', max_size * [0.])
xp_NR = array('f', max_size * [0.])
xp_ER = array('f', max_size * [0.])
yp_NR = array('f', max_size * [0.])
yp_ER = array('f', max_size * [0.])
Esempio n. 5
0
class JetIDAnalyzer(Analyzer):
    '''A simple jet analyzer.'''
    def declareHandles(self):
        super(JetIDAnalyzer, self).declareHandles()
        self.handles['jets'] = AutoHandle(*self.cfg_ana.jetCollection)
        if self.cfg_ana.useGenLeptons:
            self.mchandles['leptons2'] = AutoHandle(
                'genLeptonsStatus2', 'std::vector<reco::GenParticle>')
        else:
            self.mchandles['genParticles'] = AutoHandle(
                'prunedGen', 'std::vector<reco::GenParticle>')

        ### self.mchandles['genJets'] =  AutoHandle (
        ###     *self.cfg_ana.genJetsCollection
        ###    )
        self.handles['vertices'] = AutoHandle('offlinePrimaryVertices',
                                              'std::vector<reco::Vertex>')

# .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....

    def beginLoop(self):
        super(JetIDAnalyzer, self).beginLoop()
        self.file = TFile('/'.join([self.looperName, 'testJets.root']),
                          'recreate')

        if self.cfg_ana.applyPFLooseId:
            from ROOT import PFJetIDSelectionFunctor
            self.isPFLooseFunc = PFJetIDSelectionFunctor(
                0, PFJetIDSelectionFunctor.LOOSE)
            ## Workaround: for some reason PyROOT does not bind PFJetIDSelectionFunctor(Jet) nor PFJetIDSelectionFunctor.getBitsTemplates
            from ROOT import pat
            self.isPFLooseFunc.bits = pat.strbitset()
            for i in "CHF", "NHF", "CEF", "NEF", "NCH", "nConstituents":
                self.isPFLooseFunc.bits.push_back(i)
            ## /Workaround
            self.isPFLoose = lambda x: self.isPFLooseFunc(
                x, self.isPFLooseFunc.bits)
        else:
            self.isPFLoose = lambda x: True

        # general histograms
        self.jetHistos = JetHistograms('Jets')
        self.cleanJetHistos = JetHistograms('CleanJets')
        self.matchedCleanJetHistos = JetHistograms('MatchedCleanJets')
        self.unmatchedCleanJetHistos = JetHistograms('UnmatchedCleanJets')

        ## Pileup JetID
        if self.cfg_ana.jetIdMva:
            self.puidalgo = PileupJetIdNtupleAlgo(*self.cfg_ana.jetIdMva)
            self.runMva = True
        else:
            self.puidalgo = PileupJetIdNtupleAlgo()
            self.runMva = False

        self.vtxBins = (0, 10, 15, 20, 30)  ## (0,2,4,6,10,15,20,30,35)
        self.vtxBinLabels = mkBinLabels(self.vtxBins)
        self.ptBins = (20, 30, 50)  ## (20,30,40,50,100)
        self.etaBins = (0, 1.4, 2.5, 3.0)
        self.puEtaLables = ["_barrel", "_endtk", "_endNOtk", "_fwd"]
        reweight_f = TF1("f", "pol2(0)+expo(3)")
        reweight_f.SetParameters(0.1955298, -0.003830591, 1.944794e-05,
                                 4.649755, -0.1722024)
        self.reweight = ("pt", reweight_f)

        ## PileUp histograms
        if self.cfg_ana.doJetIdHisto:
            # histograms for pileup jet identification variables

            self.gluCleanHistosId = PileupJetHistograms(
                "GluonMatchedCleanHistosId",
                self.vtxBins,
                self.ptBins,
                self.etaBins,
                etalabels=self.puEtaLables,
                reweight=self.reweight)
            self.quarkCleanHistosId = PileupJetHistograms(
                "QuarkMatchedCleanHistosId",
                self.vtxBins,
                self.ptBins,
                self.etaBins,
                etalabels=self.puEtaLables,
                reweight=self.reweight)
            self.reweiMatchedCleanHistosId = PileupJetHistograms(
                "ReweiMatchedCleanHistosId",
                self.vtxBins,
                self.ptBins,
                self.etaBins,
                etalabels=self.puEtaLables,
                reweight=self.reweight)
            self.unmatchedCleanHistosId = PileupJetHistograms(
                "UnmatchedCleanHistosId",
                self.vtxBins,
                self.ptBins,
                self.etaBins,
                etalabels=self.puEtaLables)

        ### self.jetKin = []
        ### for vtx in self.vtxBinLabels:
        ###     self.jetKin.append([])
        ###     for eta in self.puEtaLables:
        ###         self.jetKin[-1].append( JetHistograms('Jets%s%s' % (vtx,eta) ) )

        if self.cfg_ana.dumpTree:
            self.tree = TTree("tree", "tree")
            self.tree.SetDirectory(self.file)

            self.puidalgo.bookBranches(self.tree)

            gROOT.ProcessLine(
                """struct MyTreeVars{ Int_t nvtx; Bool_t isMatched; Int_t jetFlavour; Float_t partonPt; Float_t genPt; Float_t genDr; }"""
            )
            from ROOT import MyTreeVars
            self.treevars = MyTreeVars()

            for i, j in ("nvtx", "I"), ("isMatched",
                                        "O"), ("jetFlavour",
                                               "I"), ("partonPt",
                                                      "F"), ("genPt",
                                                             "F"), ("genDr",
                                                                    "F"):
                self.tree.Branch(i, AddressOf(self.treevars, i),
                                 "%s/%s" % (i, j))

        self.h_nvtx = TH1F("h_nvtx", "", 50, 0, 50)
        self.h_genjetspt = TH1F("h_genjetspt", "", 500, 0, 500)

# .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....

    def process(self, iEvent, event):
        #read all the handles defined beforehand
        self.readCollections(iEvent)

        jetEtaCut = 4.5

        # get the vertexes
        event.vertices = self.handles['vertices'].product()
        self.h_nvtx.Fill(len(event.vertices))
        event.vertexBin = int(len(event.vertices))

        # get the jets in the jets variable
        jets = self.handles['jets'].product()
        # filter jets with some selections
        event.jets = [
            jet for jet in jets
            if (abs(jet.eta()) < jetEtaCut and jet.pt() > self.cfg_ana.ptCut
                and self.isPFLoose(jet))
        ]
        self.jetHistos.fillEvent(event.jets)

        try:
            # get status 2 leptons
            if 'leptons2' in self.mchandles:
                event.genLeptons = map(GenParticle,
                                       self.mchandles['leptons2'].product())
            else:
                event.genLeptons = [
                    lep for lep in self.mchandles['genParticles'].product()
                    if lep.status() == 3 and (abs(lep.pdgId()) == 11 or abs(
                        lep.pdgId()) == 13 or abs(lep.pdgId()) == 15)
                ]
        except:
            event.genLeptons = None

        if event.genLeptons:
            #FIXME why are there cases in which there's 4 or 6 leptons?
            if len(event.genLeptons) != 2:
                return
            # in case I want to filter out taus
            # 11, 13, 15 : e, u, T
            # remove leptons from jets if closer than 0.2
            event.cleanJets = cleanObjectCollection(event.jets,
                                                    event.genLeptons, 0.2)
        else:
            event.cleanJets = event.jets

        ### event.matchingCleanJets = matchObjectCollection2 (event.cleanJets, event.selGenJets, 0.25)
        # assign to each jet its gen match (easy life :))
        event.selGenJets = []
        for jet in event.cleanJets:
            try:
                jet.gen = jet.genJet()
                jet.gen.pt()
                event.selGenJets.append(jet.gen)
            except:
                jet.gen = None

        for jet in event.selGenJets:
            self.h_genjetspt.Fill(jet.pt())
        self.jetHistos.fillStats(len(event.selGenJets), len(event.jets))

        ### try:
        ###     # get genJets
        ###     event.genJets = map (GenJet, self.mchandles['genJets'].product ())
        ###     event.selGenJets = event.genJets
        ###     for jet in event.selGenJets :
        ###         self.h_genjetspt.Fill (jet.pt ())
        ###
        ###     # first stats plots
        ###     self.jetHistos.fillStats (len (event.selGenJets), len (event.jets))
        ### except:
        ###     pass

        ## run the PileupJetIdAlgo and attach the id to the jet
        ijet = 0
        for jet in event.cleanJets:
            try:
                jet.puIdentifier = self.puidalgo.computeIdVariables(
                    jet.sourcePtr().get(), 0., event.vertices[0], self.runMva)
            except:
                jet.puIdentifier = self.puidalgo.computeIdVariables(
                    jet, 0., event.vertices[0], self.runMva)
            if self.cfg_ana.dumpTree:
                ## self.puidalgo.fillJet(jet.puIdentifier,ijet,0)
                self.puidalgo.setIJetIEvent(ijet, 0)
                self.treevars.nvtx = len(event.vertices)
                self.treevars.isMatched = False
                self.treevars.jetFlavour = -999
                self.treevars.genPt = 0.
                self.treevars.partonPt = 0.
                self.treevars.genDr = -100.
                if jet.gen:
                    self.treevars.isMatched = True
                    self.treevars.jetFlavour = jet.partonFlavour()
                    self.treevars.genPt = jet.gen.pt()
                    self.treevars.genDr = deltaR(jet.gen.eta(), jet.gen.phi(),
                                                 jet.eta(), jet.phi())
                    try:
                        self.treevars.partonPt = jet.genParton.pt()
                    except:
                        pass
                self.tree.Fill()
            ijet += 1

        self.cleanJetHistos.fillEvent(event.cleanJets)

        event.matchedCleanJets = [
            jet for jet in event.cleanJets if jet.gen != None
        ]

        event.unmatchedCleanJets = [
            jet for jet in event.cleanJets if jet.gen == None
        ]
        self.matchedCleanJetHistos.fillEvent(event.matchedCleanJets)
        self.unmatchedCleanJetHistos.fillEvent(event.unmatchedCleanJets)

        event.cleanGluJets = []
        event.cleanQuarkJets = []
        vtxbin = findBin(self.vtxBinLabels, len(event.vertices))
        for jet in event.matchedCleanJets:
            flav = abs(jet.partonFlavour())
            if flav == 21:
                event.cleanGluJets.append(jet)
            elif flav > 0 and flav <= 3:
                event.cleanQuarkJets.append(jet)
            jet.weight = self.reweight[1](getattr(jet, self.reweight[0])())
            etabin = findBin(self.etaBins, jet.eta())
            ### self.jetKin[vtxbin][etabin].fillJet(jet)

        if self.cfg_ana.doJetIdHisto:
            self.gluCleanHistosId.fillEvent(event.cleanGluJets, event.vertices)
            self.quarkCleanHistosId.fillEvent(event.cleanQuarkJets,
                                              event.vertices)
            ### self.matchedCleanHistosId.fillEvent(event.matchedCleanJets,event.vertices)
            self.reweiMatchedCleanHistosId.fillEvent(event.matchedCleanJets,
                                                     event.vertices)
            self.unmatchedCleanHistosId.fillEvent(event.unmatchedCleanJets,
                                                  event.vertices)

# .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....

    def write(self):
        from ROOT import gROOT
        gROOT.SetBatch(True)

        self.jetHistos.Write(self.file)
        self.cleanJetHistos.Write(self.file)

        self.matchedCleanJetHistos.Write(self.file)
        self.unmatchedCleanJetHistos.Write(self.file)

        if self.cfg_ana.doJetIdHisto:
            self.gluCleanHistosId.summary()
            self.gluCleanHistosId.Write(self.file)

            self.quarkCleanHistosId.summary()
            self.quarkCleanHistosId.Write(self.file)

            self.reweiMatchedCleanHistosId.summary()
            self.reweiMatchedCleanHistosId.Write(self.file)

            ### self.matchedCleanHistosId.Write(self.file)
            self.unmatchedCleanHistosId.Write(self.file)

        ### for j in self.jetKin:
        ###     for h in j:
        ###         h.Write(self.file)

        self.file.cd()
        self.h_nvtx.Write()
        self.h_genjetspt.Write()

        if self.cfg_ana.dumpTree:
            self.tree.Write()

        self.file.Close()
Esempio n. 6
0
def selectEvents(fileName,saveProbes=False,saveSummary=False,outputDir='./',xsec=-1,correctionsMap={}):

    gSystem.ExpandPathName(fileName)
    file=TFile.Open(fileName)

    #exclusivity of triggers per PD
    eTriggersOnly  = ('SingleEle' in fileName)
    muTriggersOnly = ('SingleMu'  in fileName)

    #normalizations and corrections
    origEvents=1.0
    puWeightsGr=None
    if xsec>0 :
        origEvents=file.Get('smDataAnalyzer/cutflow').GetBinContent(1)
        if origEvents==0 :
            print '[Warning] 0 initial events ?'

        #derive pileup weights
        origPileup=file.Get('smDataAnalyzer/pileup')
        try:
            dataPileupFile=TFile.Open(correctionsMap['pu'])
            dataPileup=dataPileupFile.Get('pileup')
            normF=origPileup.Integral()/dataPileup.Integral()
            if normF>0 :
                puWeightsGr=TGraph()
                for xbin in xrange(1,origPileup.GetXaxis().GetNbins()+1) :
                    iweight=1.0
                    if origPileup.GetBinContent(xbin)>0 :
                        iweight=normF*dataPileup.GetBinContent(xbin)/origPileup.GetBinContent(xbin)
                        puWeightsGr.SetPoint( puWeightsGr.GetN(), origPileup.GetXaxis().GetBinCenter(xbin), iweight )
            dataPileupFile.Close()
        except :
            print 'No data pileup file provided or other error occurred. If you wish add -w pu,pu_file.root'

    jecCorrector=None
    jecUncertainty=None
    try:
        prefix='Data'
        if xsec>0 : prefix='MC'
        jecDir=correctionsMap['jec']

        gSystem.ExpandPathName(jecDir)
        jetCorLevels='L1FastJet'
        jetCorFiles=jecDir+'/'+prefix+'_L1FastJet_AK5PFchs.txt'
        jetCorLevels=jetCorLevels+':L2Relative'
        jetCorFiles=jetCorFiles+':'+jecDir+'/'+prefix+'_L2Relative_AK5PFchs.txt'
        jetCorLevels=jetCorLevels+':L3Absolute'
        jetCorFiles=jetCorFiles+':'+jecDir+'/'+prefix+'_L3Absolute_AK5PFchs.txt'
        #if prefix=='Data':
        #    jetCorLevels=jetCorLevels+':L2L3Residual'
        #    jetCorFiles=jetCorFiles+':'+jecDir+'/'+prefix+'_L2L3Residual_AK5PFchs.txt'
        jecCorrector=FactorizedJetCorrector(jetCorLevels,jetCorFiles)
        print 'Jet energy corrector initialized with levels ',jetCorLevels,' for ',prefix

        if prefix=='MC':
            jecUncertainty=JetCorrectionUncertainty(jecDir+"/"+prefix+"_Uncertainty_AK5PFchs.txt")
            print 'Jet uncertainty is ',jecUncertainty

    except Exception as e:
        print '[Error]',e



    tree=file.Get("smDataAnalyzer/data")
    nev = tree.GetEntries()

    outUrl=outputDir+'/'+os.path.basename(fileName)
    monitor=Monitor(outUrl)

    #same the initial normalization and cross section
    monitor.addValue(origEvents,'iniEvents')
    monitor.addValue(xsec,'crossSection')

    #some basic histograms
    monitor.addHisto('nvtx',    ';Vertices;Events',                       50,0,50)
    monitor.addHisto('nvtxraw', ';Vertices;Events',                       50,0,50)
    monitor.addHisto('vmass',   ';Mass [GeV];Events',                     50,0,250)
    monitor.addHisto('vmt',     ';Transverse mass [GeV];Events',          50,0,250)
    monitor.addHisto('vpt',     ';Boson transverse momentum [GeV];Events',50,0,250)
    monitor.addHisto('leg1pt',  ';Transverse momentum [GeV];Events',      50,0,250)
    monitor.addHisto('leg2pt',  ';Transverse momentum [GeV];Events',      50,0,250)
    monitor.addHisto('leg1iso', ';Relative isolation;Events',             50,0,0.5)
    monitor.addHisto('leg2iso', ';Relative isolation;Events',             50,0,0.5)

    #save a summary ntuple for analysis
    summaryTuple=None
    if saveSummary :
        varList='cat:weight:nvtx:njets'
        varList=varList+':v_mass:v_mt:v_pt:genv_mass:genv_pt'
        varList=varList+':leg1_pt:leg1_eta:leg1_phi:genleg1_pt:leg1_relIso'
        varList=varList+':leg2_pt:leg2_eta:leg2_phi:genleg2_pt:leg2_relIso'
        varList=varList+':sumEt:ht'
        varList=varList+':met_lesup:met_lesdown:met_jesup:met_jesdown:met_jerup:met_jerdown:met_umetup:met_umetdown'
        summaryTuple=TNtuple('data','summary',varList)
        summaryTuple.SetDirectory(0)
        monitor.addObject(summaryTuple)

    #save a dedicated ntuple for Tag and Probe
    probesTuple=None
    probesId   = array.array( 'f', [ 0 ] )
    probesPt   = array.array( 'f', [ 0 ] )
    probesEta  = array.array( 'f', [ 0 ] )
    probesPhi  = array.array( 'f', [ 0 ] )
    probesNvtx = array.array( 'f', [ 0 ] )
    probesMass = array.array( 'f', [ 0 ] )
    probesIsMatched = array.array( 'i', [0] )
    probesPassLoose = array.array( 'i', [ 0 ] )
    probesPassTight = array.array( 'i', [ 0 ] )
    probesFireTrigger = array.array( 'i', [ 0 ] )
    if saveProbes :
        probesTuple=TTree('tandp','summary for tandp')
        probesTuple.Branch( 'id', probesId, 'id/F' )
        probesTuple.Branch( 'pt', probesPt, 'pt/F' )
        probesTuple.Branch( 'eta', probesEta, 'eta/F' )
        probesTuple.Branch( 'phi', probesPhi, 'phi/F' )
        probesTuple.Branch( 'nvtx', probesNvtx, 'nvtx/F' )
        probesTuple.Branch( 'mass', probesMass, 'mass/F' )
        probesTuple.Branch( 'isMatched', probesIsMatched, 'isMatched/I' )
        probesTuple.Branch( 'passLoose', probesPassLoose, 'passLoose/I' )
        probesTuple.Branch( 'passTight', probesPassTight, 'passTight/I' )
        probesTuple.Branch( 'fireTrigger', probesFireTrigger, 'fireTrigger/I' )
        probesTuple.SetDirectory(0)
        monitor.addObject(probesTuple)

    #
    # LOOP OVER THE EVENTS
    #
    for iev in xrange(0,nev):
        tree.GetEntry(iev)
        if iev%10000 == 0 :
            sys.stdout.write("\r[ %d/100 ] completed" %(100.*iev/nev))
            sys.stdout.flush()

        #check mc truth (select V bosons from the hard process
        genBosonP4=TLorentzVector(0,0,0,0)
        genNeutP4=TLorentzVector(0,0,0,0)
        for g in xrange(0,tree.mcn):
            if tree.mc_status[g]!=3 : continue
            genP4=TLorentzVector(tree.mc_px[g],tree.mc_py[g],tree.mc_pz[g],tree.mc_en[g])
            if abs(tree.mc_id[g])==12 or abs(tree.mc_id[g])==14 or abs(tree.mc_id[g])==14 : genNeutP4=genNeutP4+genP4
            if abs(tree.mc_id[g])!=23 and abs(tree.mc_id[g])!=24 : continue
            genBosonP4=genP4
        
        #get triggers that fired
        eFire,mFire,emFire=decodeTriggerWord(tree.tbits)
        if eTriggersOnly :  mFire=False
        if muTriggersOnly : eFire=False

        #select the leptons
        leptonCands=[]
        validTags=[]
        lepSums=[TLorentzVector(0,0,0,0)]*3
        lepFlux=TLorentzVector(0,0,0,0)
        for l in xrange(0,tree.ln) :
            lep=LeptonCand(tree.ln_id[l],tree.ln_px[l],tree.ln_py[l],tree.ln_pz[l],tree.ln_en[l])
            if lep.p4.Pt()<20 : continue
            if abs(tree.ln_id[l])==11 :
                if math.fabs(lep.p4.Eta())>2.5 : continue
                if math.fabs(lep.p4.Eta())>1.4442 and math.fabs(lep.p4.Eta())<1.566 : continue
            if abs(tree.ln_id[l])==13 :
                if math.fabs(lep.p4.Eta())>2.1 : continue
            relIso, isLoose, isLooseIso, isTight, isTightIso = selectLepton(tree.ln_id[l],tree.ln_idbits[l],tree.ln_gIso[l],tree.ln_chIso[l],tree.ln_nhIso[l],tree.ln_puchIso[l],lep.p4.Pt())
            lep.selectionInfo(relIso,isLoose, isLooseIso, isTight, isTightIso)
            lep.triggerInfo(tree.ln_Tbits[l])

            #check the generator level information
            genMatchIdx=tree.ln_genid[l]
            if genMatchIdx < tree.mcn :
                lep.genMatch(tree.mc_id[genMatchIdx],tree.mc_px[genMatchIdx],tree.mc_py[genMatchIdx],tree.mc_pz[genMatchIdx],tree.mc_en[genMatchIdx])
            else :
                lep.genMatch(0,0,0,0,0)
            leptonCands.append(lep)

            if not saveProbes: continue
            if not isTight or not isTightIso or lep.Tbits==0 : continue
            if abs(lep.id)==11 and not eFire: continue
            if abs(lep.id)==13 and not mFire: continue

            validTags.append( len(leptonCands)-1 )
            lepSums[1]=lepSums[1]+lep.getP4('lesup')-lep.p4
            lepSums[2]=lepSums[2]+lep.getP4('lesdown')-lep.p4
            lepFlux=lepFlux+lep.p4

        #check if probes tree should be saved
        if saveProbes and len(validTags)>0:

            # choose a random tag
            tagIdx=random.choice(validTags)
            tag=leptonCands[tagIdx]

            #find probe
            probe=None
            for l in xrange(0,len(leptonCands)) :
                if l==tagIdx: continue
                if abs(tag.id)!=abs(leptonCands[l].id) : continue
                probe=leptonCands[l]
                break

            #for electrons save superclusters if probe is not found
            matchToEle=1
            #if abs(tag.id)==11 and probe is None :
            #    matchToEle=0
            #    for sc in xrange(0,tree.scn) :
            #        sc_en=tree.scn_e[sc]
            #        sc_eta=tree.scn_eta[sc]
            #        sc_phi=tree.scn_phi[sc]
            #        sc_pt=sc_en/math.cosh(sc_eta)
            #        sc_p4=TLorentzVector(0,0,0,0)
            #        sc_p4.SetPtEtaPhiE(sc_pt,sc_eta,sc_phi,sc_en)
            #        lscp4=tag.p4+sc_p4
            #        if math.fabs(lscp4.M()-91)>30 : continue
            #        scCand=LeptonCand(tag.id,sc_p4.Px(),sc_p4.Py(),sc_p4.Pz(),sc_p4.E())
            #        scCand.selectionInfo(0,0,0,0,0)
            #        scCand.triggerInfo(0)
            #        probe=scCand
            #        break
            if abs(tag.id)==13 : matchToEle=0

            #save info
            if probe is not None:
                tpp4=tag.p4+probe.p4
                if math.fabs(tpp4.M()-91)<30 :
                    probesId[0]=probe.id
                    probesPt[0]=probe.p4.Pt()
                    probesEta[0]=probe.p4.Eta()
                    probesPhi[0]=probe.p4.Phi()
                    probesNvtx[0]=tree.nvtx
                    probesMass[0]=tpp4.M()
                    probesIsMatched[0]=(probe.genId!=0)
                    probesPassLoose[0]=(probe.passLoose and probe.passLooseIso)
                    probesPassTight[0]=(probe.passTight and probe.passTightIso)
                    probesFireTrigger[0]=(probe.Tbits>0)
                    probesTuple.Fill()

        #jets
        selJets=[]
        jetSums=[TLorentzVector(0,0,0,0)]*5
        jetFlux=TLorentzVector(0,0,0,0)
        ht=0
        for j in xrange(0,tree.jn) :
            jet=JetCand(tree.jn_px[j],tree.jn_py[j],tree.jn_pz[j],tree.jn_en[j],tree.jn_area[j],tree.jn_torawsf[j])

            #cross clean with loose isolated leptons
            overlapFound=False
            for l in leptonCands:
                if not l.passLoose or not l.passLooseIso : continue
                dR=jet.p4.DeltaR(l.p4)
                if dR>0.4 : continue
                overlapFound=True
                break
            if overlapFound: continue

            #very loose kinematics cuts
            if math.fabs(jet.p4.Eta())>4.7 or jet.p4.Pt()<10 : continue

            #save it
            jet.genMatch(tree.jn_genpx[j],tree.jn_py[j],tree.jn_pz[j],tree.jn_en[j],tree.jn_genid[j],tree.jn_genflav[j])
            jet.updateJEC(jecCorrector,jecUncertainty,tree.rho,tree.nvtx)
            selJets.append(jet)

            #account for all the corrections you have applied
            jetSums[0]=jetSums[0] + jet.getCorrectedJet()          - jet.getCorrectedJet('raw')
            jetSums[1]=jetSums[1] + jet.getCorrectedJet('jesup')   - jet.getCorrectedJet()
            jetSums[2]=jetSums[2] + jet.getCorrectedJet('jesdown') - jet.getCorrectedJet()
            jetSums[3]=jetSums[3] + jet.getCorrectedJet('jerup')   - jet.getCorrectedJet()
            jetSums[4]=jetSums[4] + jet.getCorrectedJet('jerdown') - jet.getCorrectedJet()
            jetFlux=jetFlux+jet.p4
            ht=ht+jet.p4.Pt()

        # met
        metCand=METCand(tree.met_pt[0]*math.cos(tree.met_phi[0]),tree.met_pt[0]*math.sin(tree.met_phi[0]),0,tree.met_pt[0])
        metCand.genMatch(genNeutP4.Px(),genNeutP4.Py(),genNeutP4.Pz(),genNeutP4.E())
        metCand.addSumEts(tree.met_sumet[0], tree.met_chsumet[0])
        metCand.addJetCorrections(jetSums)
        metCand.addLeptonCorrections(lepSums)
        unclFlux=-(metCand.p4+lepFlux+jetFlux)
        unclSums=[TLorentzVector(0,0,0,0),unclFlux*0.10,unclFlux*(-0.10)]
        metCand.addUnclusteredCorrections(unclSums)

        #build the candidate
        vCand=buildVcand(eFire,mFire,emFire,leptonCands,metCand)
        if vCand is None : continue

        #prepare to save
        weight=1.0
        if puWeightsGr is not None:
            weight=puWeightsGr.Eval(tree.ngenITpu)

        #show isolations
        for ileg in [0,1]:
            hname='leg'+str(ileg+1)+'iso'
            lid=''
            if abs(vCand.m_legs[ileg].id)==11 :   lid='e'
            elif abs(vCand.m_legs[ileg].id)==13 : lid='mu'
            else : continue
            monitor.fill(hname,[lid],vCand.m_legs[ileg].relIso,weight)

        tags=[vCand.tag]
        monitor.fill('nvtxraw',tags, tree.nvtx,               1.0)
        monitor.fill('nvtx',   tags, tree.nvtx,               weight)
        monitor.fill('vmass',  tags, vCand.p4.M(),            weight)
        monitor.fill('vpt',    tags, vCand.p4.Pt(),           weight)
        monitor.fill('leg1pt', tags, vCand.m_legs[0].p4.Pt(), weight)
        monitor.fill('leg2pt', tags, vCand.m_legs[1].p4.Pt(), weight)

        for var in ['','lesup','lesdown','jesup','jesdown','jerup','jerdown','umetup','umetdown']:
            mtVar=vCand.computeMt(var)
            monitor.fill('vmt', [vCand.tag+var], mtVar, weight)


        if saveSummary :
            values=[
                vCand.id, weight, tree.nvtx, len(selJets),
                vCand.p4.M(), vCand.mt, vCand.p4.Pt(), genBosonP4.M(), genBosonP4.Pt(),
                vCand.m_legs[0].p4.Pt(),vCand.m_legs[0].p4.Eta(),vCand.m_legs[0].p4.Phi(), vCand.m_legs[0].genP4.Pt(), vCand.m_legs[0].relIso,
                vCand.m_legs[1].p4.Pt(),vCand.m_legs[1].p4.Eta(),vCand.m_legs[1].p4.Phi(), vCand.m_legs[1].genP4.Pt(), vCand.m_legs[1].relIso,
                metCand.sumet, ht,
                metCand.p4Vars['lesup'].Pt(),metCand.p4Vars['lesdown'].Pt(),metCand.p4Vars['jesup'].Pt(),metCand.p4Vars['jesdown'].Pt(),metCand.p4Vars['jerup'].Pt(),metCand.p4Vars['jerdown'].Pt(),metCand.p4Vars['umetup'].Pt(),metCand.p4Vars['umetdown'].Pt()
                ]
            summaryTuple.Fill(array.array("f",values))

    file.Close()
    monitor.close()