Exemplo n.º 1
0
def setupMuonPreselection(MET, name, mode, less_than_3jets=False):
    a = Analysis(name)
    filters = []
    tree = Tree("Main")
    a += tree
    ## Add jet iD
    pfJetId = PFJetIDLoose()
    a.AddJetFilter("PreCC",pfJetId)
    filters += [pfJetId]

    # Add muon ID
    customMuID = CustomVBTFMuID(Mus.ps())
    a.AddMuonFilter("PreCC", customMuID)
    filters += [customMuID]

    # Muon-jet DR cut
    #    mu_jet_dr = MuonJetDRFilter(0.1, Mus.ps())
    mu_jet_dr = MuonJetDRFilterRA4Sync(0.1, Mus.ps())
    a.AddJetFilter("PreCC", mu_jet_dr)
    filters += [mu_jet_dr]

    # Add electron ID
    #    eleID = LooseEleId()
    eleID = CustomEleIdRA4Sync(Els_Sig.ps())
    a.AddElectronFilter("PreCC", eleID)
    filters += [eleID]

    # Electron-jet DR cut
    el_jet_dr = EleJetDRFilter(0.3)
#    el_jet_dr = EleJetDRFilterRA4Sync(0.3, Els_Sig.ps())
    a.AddJetFilter("PreCC", el_jet_dr)
    filters += [el_jet_dr]

    # this replaces typeI and uncorrected PFMET
    if MET == "typeI":
        met_typeI_filter = pfMETtopfMETtypeI()
        a.AddMETFilter("pfMET",met_typeI_filter)
        filters += [met_typeI_filter]


    # the residual JetCorrections are different from PF and Calo, so be careful
    # when adding them.
    if mode == "data39":
        JetCorrections = JESCorrections( corPset.ps() ,0)
        a.AddJetFilter("PreCC",JetCorrections)
        filters += [JetCorrections]
    # 311 MC needs to be reweighted accoring to vertex multiplicity
    # see onelepton/python/onelepton/filters.py
    if mode == "MC311" or mode == "MC42ttw_Z41" or mode == "MC42QCD" or mode == "MCskims":
        vert = reweightVertices(a)
        filters += [vert]



    tree.Attach(selection)
    tree.TAttach(selection,TwoMu)
    tree.TAttach( TwoMu,  ZPlots)
    
    return (a, tree, filters)
Exemplo n.º 2
0
def setupElectronPreselection(MET, name, mode, less_than_3jets=False, qcd_antiselection=False):
    a = Analysis(name)
    filters = []

    ## Add jet iD
    pfJetId = PFJetIDLoose()
    a.AddJetFilter("PreCC", pfJetId)
    filters += [pfJetId]

    # Add muon ID
    customMuID = CustomVBTFMuID(Mus.ps())
    a.AddMuonFilter("PreCC", customMuID)
    filters += [customMuID]

    # Muon-jet DR cut
    #    mu_jet_dr = MuonJetDRFilter(0.1, Mus.ps())
    mu_jet_dr = MuonJetDRFilterRA4Sync(0.1, Mus.ps())
    a.AddJetFilter("PreCC", mu_jet_dr)
    filters += [mu_jet_dr]

    # Add electron ID
    #    eleID = LooseEleId()
    if qcd_antiselection:
        eleID = CustomEleIdRA4Sync(Els_QCD.ps())
    else:
        eleID = CustomEleIdRA4Sync(Els_Sig.ps())
    a.AddElectronFilter("PreCC", eleID)
    filters += [eleID]

    # Electron-jet DR cut
    el_jet_dr = EleJetDRFilter(0.3)
    #    el_jet_dr = EleJetDRFilterRA4Sync(0.3, Els_Sig.ps())
    a.AddJetFilter("PreCC", el_jet_dr)
    filters += [el_jet_dr]

    # the residual JetCorrections are different from PF and Calo, so be careful
    # when adding them.
    if mode == "data39":
        JetCorrections = JESCorrections(corPset.ps(), 0)
        a.AddJetFilter("PreCC", JetCorrections)
        filters += [JetCorrections]
    # 311 MC needs to be reweighted accoring to vertex multiplicity
    # see onelepton/python/onelepton/filters.py
    if mode == "MC311":
        vert = reweightVertices(a)
        filters += [vert]

    # Create analysis cut tree
    tree = Tree("Main")
    a += tree

    # Here we define the data triggers depending on the analysis mode to add a
    # different trigger mix simply add an entry here and they will automatically
    # be added to the tree below

    # Control region : not yet ready for electrons
    if less_than_3jets:
        dataTriggers = {
            "data4X": etriggerData42XCtrl_ReReco,
            "data42X_PromptReco": etriggerData42XCtrl_PromptReco,
            "data42X_ReReco": etriggerData42XCtrl_ReReco,
        }
    # Signal region
    else:
        dataTriggers = {
            "data4X": etriggerData42XCtrl_ReReco,
            "data42X_PromptReco": etriggerData42X_PromptReco,
            "data42X_ReReco": etriggerData42X_ReReco,
        }

    if mode == "data39":
        a.Attach(triggerData)
        a.TAttach(triggerData, selection)
    elif mode in dataTriggers:
        tree.Attach(json)
        tree.TAttach(json, dataTriggers[mode])
        tree.TAttach(dataTriggers[mode], selection)
    elif mode == "MCGrid":
        # Attach a BSM grid before any cuts have been applied so that we can
        # calculate signal efficiency for limit setting
        tree.Attach(bsmgrid_no_cuts)
        tree.TAttach(bsmgrid_no_cuts, selection)
    else:
        tree.Attach(selection)

    # Add cut flow common to signal/control
    tree.TAttach(selection, HBBEnoise)
    tree.TAttach(HBBEnoise, BeamHalo)
    tree.TAttach(BeamHalo, NoTracks)
    tree.TAttach(NoTracks, OneEl)
    tree.TAttach(OneEl, ZeroLooseEl)
    tree.TAttach(ZeroLooseEl, ZeroLooseMu)
    tree.TAttach(ZeroLooseMu, ZeroMu)

    if less_than_3jets:  # CONTROL REGION
        tree.TAttach(ZeroMu, AtLeast1Jts)
        tree.TAttach(AtLeast1Jts, LessThan3Jts)
    else:  # SIGNAL REGION
        tree.TAttach(ZeroMu, SecondJetEtCut60)
        tree.TAttach(SecondJetEtCut60, RECO_CommonHTCut500)
        #       tree.TAttach(RECO_CommonHTCut500, AtLeast2Jts)
        if mode == "data42X_ReReco":
            tree.TAttach(RECO_CommonHTCut500, ElHad_May10ReReco_Cut_BE)
            tree.TAttach(ElHad_May10ReReco_Cut_BE, ElHad_May10ReReco_Cut_TP)
            tree.TAttach(ElHad_May10ReReco_Cut_TP, AtLeast3Jts)
        elif mode == "data42X_PromptReco":
            tree.TAttach(RECO_CommonHTCut500, ElHad_Prompt_Cut_BE)
            tree.TAttach(ElHad_Prompt_Cut_BE, ElHad_Prompt_Cut_TP)
            tree.TAttach(ElHad_Prompt_Cut_TP, AtLeast3Jts)
        else:
            tree.TAttach(RECO_CommonHTCut500, AtLeast3Jts)

    return (a, tree, filters)
Exemplo n.º 3
0
def setupElectronPreselection(MET, name, mode, less_than_3jets=False, qcd_antiselection=False):
    a = Analysis(name)
    filters = []

    ## Add jet iD
    pfJetId = PFJetIDLoose()
    a.AddJetFilter("PreCC",pfJetId)
    filters += [pfJetId]

    # Add muon ID
    customMuID = CustomVBTFMuID(Mus.ps())
    a.AddMuonFilter("PreCC", customMuID)
    filters += [customMuID]

    # Muon-jet DR cut
    #    mu_jet_dr = MuonJetDRFilter(0.1, Mus.ps())
    mu_jet_dr = MuonJetDRFilterRA4Sync(0.3, Mus.ps())
    a.AddJetFilter("PreCC", mu_jet_dr)
    filters += [mu_jet_dr]


    # Add electron ID
    #    eleID = LooseEleId()
    if qcd_antiselection: eleID = CustomEleIdRA4Sync(Els_QCD.ps())
    else: eleID = CustomEleIdRA4Sync(Els_Sig.ps())
    a.AddElectronFilter("PreCC", eleID)
    filters += [eleID]

    # Electron-jet DR cut
    el_jet_dr = EleJetDRFilter(0.3)
    #    el_jet_dr = EleJetDRFilterRA4Sync(0.3, Els_Sig.ps())
    a.AddJetFilter("PreCC", el_jet_dr)
    filters += [el_jet_dr]


    # this replaces typeI and uncorrected PFMET
    if MET == "typeI":
        met_typeI_filter = pfMETtopfMETtypeI()
        a.AddMETFilter("pfMET",met_typeI_filter)
        filters += [met_typeI_filter]



    # the residual JetCorrections are different from PF and Calo, so be careful
    # when adding them.
    if mode == "data39":
        JetCorrections = JESCorrections( corPset.ps() ,0)
        a.AddJetFilter("PreCC",JetCorrections)
        filters += [JetCorrections]
    # 311 MC needs to be reweighted accoring to vertex multiplicity
    # see onelepton/python/onelepton/filters.py
    if mode == "MC311" or mode == "MC42ttw_Z41" or mode == "MC42QCD" or mode == "MCskims" or mode == "MC_Summer11" or mode == "MC_Fall11" or mode == "MCGrid" or mode == "SMS":
        vert = reweightVertices(a,mode)
        filters += [vert]

    if mode == "MCGrid": filters += setupSUSYWeighting(a)

    # Create analysis cut tree
    tree = Tree("Main")
    a += tree

    # Here we define the data triggers depending on the analysis mode to add a
    # different trigger mix simply add an entry here and they will automatically
    # be added to the tree below

    # Control region : not yet ready for electrons
    if less_than_3jets:
        dataTriggers = {
            "data4X" : etriggerData42XCtrl_ReReco,
            "data42X_PromptReco" : etriggerData42XCtrl_PromptReco,
            "data42X_ReReco" : etriggerData42XCtrl_ReReco
            }
    # Signal region
    else:
        dataTriggers = {
            "data4X" : etriggerData42XCtrl_ReReco,
            "data42X_PromptReco" : etriggerData42X_PromptReco,
            "data42X_ReReco" : etriggerData42X_ReReco,
            "data42X_Run2011Full" : etriggerData42X_2011Full,
            "data42X_Sync" : etrigger_RA4sync_May10
            }

    if mode == "data39":
        a.Attach(triggerData)
        a.TAttach(triggerData, selection)
    elif mode in dataTriggers:
        tree.Attach(json)
        tree.TAttach(json,myCountsAndBSMGrids_Json)
        tree.TAttach(myCountsAndBSMGrids_Json,dataTriggers[mode])
        tree.TAttach(dataTriggers[mode],myCountsAndBSMGrids_Trigger)
        tree.TAttach(myCountsAndBSMGrids_Trigger,selection)
    elif mode == "MCGrid" or mode == "SMS":
        # Attach a BSM grid before any cuts have been applied so that we can
        # calculate signal efficiency for limit setting
        (bsmgrid, store) = tripleScale(cutTree = tree, label = "NoCuts", SM=False)
        tree.TAttach(bsmgrid, selection)
        filters += store
    else:
        tree.Attach(selection)

    # Add cut flow common to signal/control
    tree.TAttach(selection,myCountsAndBSMGrids_Sel)
    tree.TAttach(myCountsAndBSMGrids_Sel,HBBEnoise)
    tree.TAttach(HBBEnoise,myCountsAndBSMGrids_Noise)
    tree.TAttach(myCountsAndBSMGrids_Noise,BeamHalo)
    tree.TAttach(BeamHalo,myCountsAndBSMGrids_beam)
    tree.TAttach(myCountsAndBSMGrids_beam,RA2TrackingFailureFilterCut)
    tree.TAttach(RA2TrackingFailureFilterCut,myCountsAndBSMGrids_track)
    tree.TAttach(myCountsAndBSMGrids_track,RA2ecaldeadcellfilterflagCut)
    tree.TAttach(RA2ecaldeadcellfilterflagCut,myCountsAndBSMGrids_RA2TPflag)
    tree.TAttach(myCountsAndBSMGrids_RA2TPflag,ElHad_Cut_TP)
    tree.TAttach(ElHad_Cut_TP,myCountsAndBSMGrids_TP)
    tree.TAttach(myCountsAndBSMGrids_TP,ElHad_Cut_BE)
    tree.TAttach(ElHad_Cut_BE,myCountsAndBSMGrids_BE)
    tree.TAttach(myCountsAndBSMGrids_BE,AtLeast2Jts)
    tree.TAttach(AtLeast2Jts,myCountsAndBSMGrids_2jets)
    
    ### FOR SYCHRONIZATION######################################
    # tree.TAttach(myCountsAndBSMGrids_2jets,AtLeast3JtsSync)
    # tree.TAttach(AtLeast3JtsSync,myCountsAndBSMGrids_3jets)
    # tree.TAttach(myCountsAndBSMGrids_3jets,AtLeast4Jts)
    # tree.TAttach(AtLeast4Jts,myCountsAndBSMGrids_4jets)
    # tree.TAttach(myCountsAndBSMGrids_4jets,OneEl)
    # tree.TAttach(OneEl,myCountsAndBSMGrids_1el)
    # tree.TAttach(myCountsAndBSMGrids_1el,ZeroMu)
    # tree.TAttach(ZeroMu,myCountsAndBSMGrids_0Mu)
    # tree.TAttach(myCountsAndBSMGrids_0Mu,ZeroLooseEl)
    # tree.TAttach(ZeroLooseEl,myCountsAndBSMGrids_0Eloose)
    # tree.TAttach(myCountsAndBSMGrids_0Eloose,ZeroLooseMu)
    # tree.TAttach(ZeroLooseMu,myCountsAndBSMGrids_0loosemu)
    # tree.TAttach(myCountsAndBSMGrids_0loosemu,RECO_CommonHTCut300)
    # tree.TAttach(RECO_CommonHTCut300,myCountsAndBSMGrids_300HT)
    # tree.TAttach(myCountsAndBSMGrids_300HT,PFMET100)
    # tree.TAttach(PFMET100,myCountsAndBSMGrids_150PFMET)
    #    tree.TAttach(myCountsAndBSMGrids_150PFMET,PrintRunLSEvent)
    #    tree.TAttach(myCountsAndBSMGrids_150PFMET,skim)
    ################################################################


    tree.TAttach(myCountsAndBSMGrids_2jets,OneEl)
    if qcd_antiselection:
        tree.TAttach(OneEl,ZeroLooseMu)
        tree.TAttach(ZeroLooseMu,ZeroMu)
    else:
        tree.TAttach(OneEl,ZeroLooseEl)
        tree.TAttach(ZeroLooseEl,ZeroLooseMu)
        tree.TAttach(ZeroLooseMu,ZeroMu)

    if less_than_3jets: # CONTROL REGION
        tree.TAttach(ZeroMu, AtLeast1Jts)
        tree.TAttach(AtLeast1Jts, LessThan3Jts)
    else: # SIGNAL REGION
        tree.TAttach(ZeroMu,RECO_CommonHTCut500)
        #        tree.TAttach(RECO_CommonHTCut500, AtLeast2Jts)
        if  mode == "data42X_ReReco":
            tree.TAttach(RECO_CommonHTCut500,ElHad_May10ReReco_Cut_BE)
            tree.TAttach(ElHad_May10ReReco_Cut_BE,ElHad_May10ReReco_Cut_TP)
            tree.TAttach(ElHad_May10ReReco_Cut_TP,AtLeast3Jts)
            #   tree.TAttach(AtLeast3Jts,AnalysisTree_El_Data)
            #  tree.TAttach(ElHad_May10ReReco_Cut_TP,AtLeast4Jts)
            
        elif  mode == "data42X_PromptReco":
            tree.TAttach(RECO_CommonHTCut500,ElHad_Prompt_Cut_BE)
            tree.TAttach(ElHad_Prompt_Cut_BE,ElHad_Prompt_Cut_TP)
            tree.TAttach(ElHad_Prompt_Cut_TP,ElHad_Aug5ReReco_v1_Cut_BE)
            tree.TAttach(ElHad_Aug5ReReco_v1_Cut_BE,ElHad_Aug5ReReco_v1_Cut_TP)
            tree.TAttach(ElHad_Aug5ReReco_v1_Cut_TP,ElHad_Prompt_v6_Cut_BE)
            tree.TAttach(ElHad_Prompt_v6_Cut_BE,ElHad_Prompt_v6_Cut_TP)
            tree.TAttach(ElHad_Prompt_v6_Cut_TP,ElHad_PromptB_v1_Cut_BE)
            tree.TAttach(ElHad_PromptB_v1_Cut_BE,ElHad_PromptB_v1_Cut_TP)
            tree.TAttach(ElHad_PromptB_v1_Cut_TP,AtLeast3Jts)
            #            tree.TAttach(AtLeast3Jts,AnalysisTree_El_Data)
            # tree.TAttach(ElHad_PromptB_v1_Cut_TP,AtLeast4Jts)
            
        elif mode == "data42X_Run2011Full":
            tree.TAttach(RECO_CommonHTCut500,AtLeast3Jts)
            #            tree.TAttach(RECO_CommonHTCut500,ElHad_Cut_TPandBE)
            #            tree.TAttach(ElHad_Cut_TPandBE,myCountsAndBSMGrids_TP)
            #            tree.TAttach(myCountsAndBSMGrids_TP,AtLeast3Jts)
            #            tree.TAttach(AtLeast3Jts,AnalysisTree_El_Data)
            # tree.TAttach(ElHad_allBE_deadecal_Cut,AtLeast4Jts)
            
        else:
            tree.TAttach(RECO_CommonHTCut500, AtLeast3Jts)
            #            tree.TAttach(AtLeast3Jts, NumOfGenLeptons)
            #            tree.TAttach(AtLeast3Jts , AnalysisTree_El)
            # tree.TAttach(RECO_CommonHTCut500, AtLeast4Jts)
            
    return (a, tree, filters)
Exemplo n.º 4
0
def setupMuonPreselection(MET, name, mode, less_than_3jets=False):
    a = Analysis(name)
    filters = []

    ## Add jet iD
    #  pfJetId = PFJetIDLoose()
    #  a.AddJetFilter("PreCC",pfJetId)
    #  filters += [pfJetId]

    # Add muon ID
    customMuID = CustomVBTFMuID(Mus.ps())
    a.AddMuonFilter("PreCC", customMuID)
    filters += [customMuID]

    # Muon-jet DR cut
    #    mu_jet_dr = MuonJetDRFilter(0.1, Mus.ps())
    ##    mu_jet_dr = MuonJetDRFilterRA4Sync(0.1, Mus.ps())
    ##    a.AddJetFilter("PreCC", mu_jet_dr)
    ##    filters += [mu_jet_dr]

    # Add electron ID
    #    eleID = LooseEleId()
    eleID = CustomEleIdRA4Sync(Els_Sig.ps())
    a.AddElectronFilter("PreCC", eleID)
    filters += [eleID]

    # Electron-jet DR cut
    ##    el_jet_dr = EleJetDRFilter(0.3)
    ##    #    el_jet_dr = EleJetDRFilterRA4Sync(0.3, Els_Sig.ps())
    ##    a.AddJetFilter("PreCC", el_jet_dr)
    ##    filters += [el_jet_dr]

    # this replaces typeI and uncorrected PFMET
    if MET == "typeI":
        met_typeI_filter = pfMETtopfMETtypeI()
        a.AddMETFilter("pfMET", met_typeI_filter)
        filters += [met_typeI_filter]

    # the residual JetCorrections are different from PF and Calo, so be careful
    # when adding them.
    if mode == "data39":
        JetCorrections = JESCorrections(corPset.ps(), 0)
        a.AddJetFilter("PreCC", JetCorrections)
        filters += [JetCorrections]
    # 311 MC needs to be reweighted accoring to vertex multiplicity
    # see onelepton/python/onelepton/filters.py
    if mode == "MC311" or mode == "MC42ttw_Z41" or mode == "MC42QCD" or mode == "MCskims":
        vert = reweightVertices(a)
        filters += [vert]

    # Create analysis cut tree
    tree = Tree("Main")
    a += tree

    # Here we define the data triggers depending on the analysis mode to add a
    # different trigger mix simply add an entry here and they will automatically
    # be added to the tree below

    # Control region
    if less_than_3jets:
        dataTriggers = {
            "data4X": triggerData4XCtrl,
            "data42X_PromptReco": triggerData42XCtrl_PromptReco,
            "data42X_ReReco": triggerData42XCtrl_ReReco,
        }
    # Signal region
    else:
        dataTriggers = {
            "data4X": triggerData4X,
            "data42X_PromptReco": triggerData42X_PromptReco,
            "data42X_ReReco": triggerData42X_ReReco,
        }

    if mode == "data39":
        a.Attach(triggerData)
        a.TAttach(triggerData, selection)
    elif mode in dataTriggers:
        tree.Attach(json)
        #        tree.TAttach(json, skim)
        #        tree.TAttach(skim,dataTriggers[mode])
        tree.Attach(json, myCountsAndBSMGrids_Init)
        tree.Attach(myCountsAndBSMGrids_InitdataTriggers[mode])
        tree.TAttach(dataTriggers[mode], HBBEnoise)
        tree.TAttach(HBBEnoise, BeamHalo)
        tree.TAttach(BeamHalo, NoTracks)
        tree.TAttach(NoTracks, MonsterFilter)
        tree.TAttach(MonsterFilter, selection)

    elif mode == "MCGrid":
        # Attach a BSM grid before any cuts have been applied so that we can
        # calculate signal efficiency for limit setting
        tree.Attach(bsmgrid_no_cuts)
        tree.TAttach(bsmgrid_no_cuts, selection)
    else:
        tree.Attach(selection)

    #    tree.TAttach(selection,OneMu)
    #    tree.TAttach(OneMu, ZeroLooseMu)
    #    tree.TAttach(ZeroLooseMu,PFMuonCheck)
    #    tree.TAttach(PFMuonCheck,RECO_CommonHTCut200)
    #    tree.TAttach(RECO_CommonHTCut200,ZeroLooseEl)
    #    tree.TAttach(ZeroLooseEl,ZeroEl)

    tree.TAttach(selection, MuHad_Prompt_Cut_BE)
    tree.TAttach(MuHad_Prompt_Cut_BE, MuHad_Prompt_Cut_TP)
    tree.TAttach(MuHad_Prompt_Cut_TP, triggerData4XCtrl)
    tree.TAttach(triggerData4XCtrl, myCountsAndBSMGrids_Clean)
    tree.TAttach(myCountsAndBSMGrids_Clean, AtLeast2Jts)
    tree.TAttach(AtLeast2Jts, myCountsAndBSMGrids_2jets)
    tree.TAttach(myCountsAndBSMGrids_2jets, AtLeast3Jts)
    tree.TAttach(AtLeast3Jts, myCountsAndBSMGrids_3jets)
    tree.TAttach(myCountsAndBSMGrids_3jets, AtLeast4Jts)
    tree.TAttach(AtLeast4Jts, OneMu)
    tree.TAttach(OneMu, myCountsAndBSMGrids_1mu)
    tree.TAttach(myCountsAndBSMGrids_1mu, ZeroEl)
    tree.TAttach(ZeroEl, myCountsAndBSMGrids_0Eli)
    tree.TAttach(myCountsAndBSMGrids_0Eli, ZeroLooseMu)
    tree.TAttach(ZeroLooseMu, ZeroLooseEl)
    tree.TAttach(ZeroLooseEl, RECO_CommonHTCut300)
    tree.TAttach(RECO_CommonHTCut300, myCountsAndBSMGrids_300HT)
    tree.TAttach(myCountsAndBSMGrids_300HT, PFMETCut150)
    tree.TAttach(PFMETCut150, myCountsAndBSMGrids_150PFMET)

    #                 PFMuonCheck)
    #    tree.TAttach(PFMuonCheck,RECO_CommonHTCut200)
    #    tree.TAttach(RECO_CommonHTCut200,ZeroLooseEl)
    #    tree.TAttach(ZeroLooseEl,ZeroEl)

    return (a, tree, filters)
Exemplo n.º 5
0
def setupMuonPreselection(MET, name, mode, less_than_3jets=False):
    a = Analysis(name)
    filters = []

    ## Add jet iD
    pfJetId = PFJetIDLoose()
    a.AddJetFilter("PreCC",pfJetId)
    filters += [pfJetId]

    # Add muon ID
    customMuID = CustomVBTFMuID(Mus.ps())
    a.AddMuonFilter("PreCC", customMuID)
    filters += [customMuID]

    # Muon-jet DR cut
    #    mu_jet_dr = MuonJetDRFilter(0.1, Mus.ps())
    mu_jet_dr = MuonJetDRFilter(0.3, Mus.ps())
    a.AddJetFilter("PreCC", mu_jet_dr)
    filters += [mu_jet_dr]

    # Add electron ID
    #    eleID = LooseEleId()
    eleID = CustomEleIdRA4Sync(Els_Sig.ps())
    a.AddElectronFilter("PreCC", eleID)
    filters += [eleID]

    # Electron-jet DR cut
    el_jet_dr = EleJetDRFilter(0.3)
    #    el_jet_dr = EleJetDRFilterRA4Sync(0.3, Els_Sig.ps())
    a.AddJetFilter("PreCC", el_jet_dr)
    filters += [el_jet_dr]

    # this replaces typeI and uncorrected PFMET
    if MET == "typeI":
        met_typeI_filter = pfMETtopfMETtypeI()
        a.AddMETFilter("pfMET",met_typeI_filter)
        filters += [met_typeI_filter]

    # 311 MC needs to be reweighted accoring to vertex multiplicity
    # see onelepton/python/onelepton/filters.py
    if mode == "MC311" or mode == "MC42ttw_Z41" or mode == "MC42QCD" or mode == "MCskims" or mode == "MC_Summer11" or mode == "MC_Fall11" or mode == "MCGrid" or mode == "SMS":
        vert = reweightVertices(a,mode)
        filters += [vert]

    if mode == "MCGrid": filters += setupSUSYWeighting(a)

    # Create analysis cut tree
    tree = Tree("Main")
    a += tree

    # Here we define the data triggers depending on the analysis mode to add a
    # different trigger mix simply add an entry here and they will automatically
    # be added to the tree below

    # Control region
    if less_than_3jets:
        dataTriggers = {
            "data4X" : triggerData4XCtrl,
            "data42X_PromptReco" : triggerData42XCtrl_PromptReco,
            "data42X_ReReco" : triggerData42XCtrl_ReReco
            }
    # Signal region
    else:
        dataTriggers = {
            "data4X" : triggerData4X,
            "data42X_PromptReco" : triggerData42X_PromptReco,
            "sample_Fall11_data" : triggerData42X_PromptReco,
            "data42X_ReReco" : triggerData42X_ReReco
            }

    if mode in dataTriggers:
        tree.Attach(json)
        tree.TAttach(json,myCountsAndBSMGrids_Json)
        tree.TAttach(myCountsAndBSMGrids_Json,dataTriggers[mode])
        tree.TAttach(dataTriggers[mode],myCountsAndBSMGrids_Trigger)
        tree.TAttach(myCountsAndBSMGrids_Trigger,selection)
        
    elif mode == "MCGrid" or mode == "SMS":
        # Attach a BSM grid before any cuts have been applied so that we can
        # calculate signal efficiency for limit setting
        (bsmgrid, store) = tripleScale(cutTree = tree, label = "NoCuts", SM=False)
        #tree.Attach(bsmgrid)
        tree.TAttach(bsmgrid, selection)
        filters += store
    else:
        tree.Attach(myCountsAndBSMGrids_Json)
        tree.TAttach(myCountsAndBSMGrids_Json,myCountsAndBSMGrids_Trigger)
        tree.TAttach(myCountsAndBSMGrids_Trigger,myCountsAndBSMGrids_pythiabug)
        tree.TAttach(myCountsAndBSMGrids_pythiabug,selection)



    # Add cut flow common to signal/control
    tree.TAttach(selection,myCountsAndBSMGrids_Sel)
    tree.TAttach(myCountsAndBSMGrids_Sel,HBBEnoise)
    tree.TAttach(HBBEnoise,myCountsAndBSMGrids_Noise)
    tree.TAttach(myCountsAndBSMGrids_Noise,BeamHalo)
    tree.TAttach(BeamHalo,myCountsAndBSMGrids_beam)
    tree.TAttach(myCountsAndBSMGrids_beam,RA2TrackingFailureFilterCut)
    tree.TAttach(RA2TrackingFailureFilterCut,myCountsAndBSMGrids_track)
    tree.TAttach(myCountsAndBSMGrids_track,RA2ecaldeadcellfilterflagCut)

    if  mode == "data42X_ReReco":
        tree.TAttach(myCountsAndBSMGrids_track,MuHad_May10ReReco_Cut_BE)
        tree.TAttach(MuHad_May10ReReco_Cut_BE,MuHad_May10ReReco_Cut_TP)
        tree.TAttach(MuHad_May10ReReco_Cut_TP,myCountsAndBSMGrids_TPBE)
    elif mode == "data42X_PromptReco":
        tree.TAttach(myCountsAndBSMGrids_track,MuHad_Prompt_Cut_BE)
        tree.TAttach(MuHad_Prompt_Cut_BE,MuHad_Prompt_Cut_TP)
        tree.TAttach(MuHad_Prompt_Cut_TP,myCountsAndBSMGrids_TPBE)
    elif mode == "sample_Fall11_data": 
        tree.TAttach(RA2ecaldeadcellfilterflagCut,MuHad_allBE_deadecal_Cut)
        tree.TAttach(MuHad_allBE_deadecal_Cut,myCountsAndBSMGrids_TPBE)
    else:
        tree.TAttach(RA2ecaldeadcellfilterflagCut,myCountsAndBSMGrids_TPBE)
 
    tree.TAttach(myCountsAndBSMGrids_TPBE,AtLeast2Jts)
    tree.TAttach(AtLeast2Jts,myCountsAndBSMGrids_2jets)
    tree.TAttach(myCountsAndBSMGrids_2jets,AtLeast3JtsSync)
    tree.TAttach(AtLeast3JtsSync,myCountsAndBSMGrids_3jets)
### FOR SYCHRONIZATION######################################
  #  tree.TAttach(myCountsAndBSMGrids_3jets,AtLeast4Jts)
  #  tree.TAttach(AtLeast4Jts,myCountsAndBSMGrids_4jets)
  #  tree.TAttach(myCountsAndBSMGrids_4jets,OneMu)
############################################################
    tree.TAttach(myCountsAndBSMGrids_3jets,OneMu)
    tree.TAttach(OneMu,myCountsAndBSMGrids_1mu)
    tree.TAttach(myCountsAndBSMGrids_1mu,myCountsAndBSMGrids_1muPF)
    tree.TAttach(myCountsAndBSMGrids_1muPF,ZeroEl)
    tree.TAttach(ZeroEl,myCountsAndBSMGrids_0El)
    tree.TAttach(myCountsAndBSMGrids_0El,ZeroLooseMu)
    tree.TAttach(ZeroLooseMu,myCountsAndBSMGrids_0loosemu)
   # tree.TAttach(myCountsAndBSMGrids_0loosemu,DphiPTW_muCut)
   # tree.TAttach(DphiPTW_muCut,ZeroLooseEl)
    tree.TAttach( myCountsAndBSMGrids_0loosemu,ZeroLooseEl)
    tree.TAttach(ZeroLooseEl,myCountsAndBSMGrids_0Eloose)
    #### FOR SYCHRONIZATION #################################################
    tree.TAttach(myCountsAndBSMGrids_0Eloose,RECO_CommonHTCut300)
    tree.TAttach(RECO_CommonHTCut300,myCountsAndBSMGrids_300HT)
    tree.TAttach(myCountsAndBSMGrids_300HT,PFMET100)
    tree.TAttach(PFMET100,myCountsAndBSMGrids_150PFMET)
    ########################################################################
    # Example to SKIM
    # tree.TAttach(ZeroEl,SumLepPT125)
    # tree.TAttach(SumLepPT125,skim)
    ###########################################################################
    if less_than_3jets: # CONTROL REGION
        tree.TAttach(ZeroLooseEl, AtLeast1Jts)
        if  mode == "data42X_ReReco":
            tree.TAttach(ZeroLooseEl,MuHad_May10ReReco_Cut_BE)
            tree.TAttach(MuHad_May10ReReco_Cut_BE,MuHad_May10ReReco_Cut_TP)
            tree.TAttach(MuHad_May10ReReco_Cut_TP,LessThan3Jts)
        elif  mode == "data42X_PromptReco":
            tree.TAttach(ZeroLooseEl,MuHad_Prompt_Cut_BE)
            tree.TAttach(MuHad_Prompt_Cut_BE,MuHad_Prompt_Cut_TP)
            tree.TAttach(MuHad_Prompt_Cut_TP,LessThan3Jts)
        else:
            tree.TAttach(AtLeast1Jts, LessThan3Jts)

    else: # SIGNAL REGION
        tree.TAttach(ZeroLooseEl,RECO_CommonHTCut500)
        tree.TAttach(RECO_CommonHTCut500,AtLeast3Jts)
  
    return (a, tree, filters)