Exemplo n.º 1
0
def AddIsolPlots(name_suffix,
                 doEtaSlices=True,
                 doClosure=False,
                 DoProbeMatchPlots=True,
                 ProduceEfficiencies=False):

    PlotTools = []
    # add plotting tools in slices
    if doEtaSlices:
        Slices = {
            "All": (0.0, 10.0),
            "noCrack": (0.1, 10.0),
            "Crack": (0.0, 0.1),
            "Barrel": (0.1, 1.1),
            "Transition": (1.1, 1.3),
            "Endcap": (1.3, 2.0),
            "CSC": (2.0, 2.7)
        }

        for etaslice, interval in Slices.iteritems():
            PlotTool = CommonMuonTPConfig.AddPlottingTool(
                name="JPsiTPIsoPlottingTool_%s_%s" % (name_suffix, etaslice),
                EffiFlag=name_suffix + "_" + etaslice,
                applySF=False,
                DoProbeMatchPlots=DoProbeMatchPlots,
                ProduceEfficiencies=ProduceEfficiencies)
            PlotTool.ProbeAbsEtaMin = interval[0]
            PlotTool.ProbeAbsEtaMax = interval[1]
            PlotTools.append(PlotTool)
            if doClosure:
                PlotToolCL = CommonMuonTPConfig.AddPlottingTool(
                    name="JPsiTPIsoPlottingToolClosure_%s_%s" %
                    (name_suffix, etaslice),
                    EffiFlag=name_suffix + "_" + etaslice + "_Closure",
                    applySF=True,
                    DoProbeMatchPlots=DoProbeMatchPlots,
                    ProduceEfficiencies=ProduceEfficiencies)
                PlotToolCL.ProbeAbsEtaMin = interval[0]
                PlotToolCL.ProbeAbsEtaMax = interval[1]
                PlotTools.append(PlotToolCL)

    else:
        PlotTools = [
            CommonMuonTPConfig.AddPlottingTool(
                name="JPsiTPIsoPlottingTool_%s_All" % name_suffix,
                EffiFlag=name_suffix + "_All",
                applySF=False,
                DoProbeMatchPlots=DoProbeMatchPlots,
                ProduceEfficiencies=ProduceEfficiencies)
        ]
        if doClosure:
            PlotTools.append(
                CommonMuonTPConfig.AddPlottingTool(
                    name="JPsiTPIsoPlottingToolClosure_%s_All" % name_suffix,
                    EffiFlag=name_suffix + "_All_Closure",
                    applySF=True,
                    DoProbeMatchPlots=DoProbeMatchPlots,
                    ProduceEfficiencies=ProduceEfficiencies))
    # config the plot tools for Zmm isolation
    for thetool in PlotTools:
        thetool.doJPsiKinematicPlots = True
        thetool.doFineEtaPhiPlots = True
        thetool.DoAsymmErrorGraphs = True
        thetool.doJPsiDileptonPlots = True

    return PlotTools
Exemplo n.º 2
0
def MuonTPConfig(outputFilename, doPlots=False, doEff=False):
    # outputFilename: name of the output file
    # doPlots: steers creation of probe/match histograms
    # doEff: steers additional creation of efficiency histograms if doPlots is true

    from AthenaCommon.AppMgr import ServiceMgr
    from AthenaCommon.AlgSequence import AlgSequence
    from MuonPerformanceAlgs import ZmumuTPRecoAnalysis
    from MuonPerformanceAlgs import ZmumuTPMuonAnalysis
    from MuonPerformanceAlgs import JPsiTPRecoAnalysis
    from MuonPerformanceAlgs import JPsiTPMuonAnalysis
    from MuonPerformanceAlgs import CommonMuonTPConfig

    # Full job is a list of algorithms
    job = AlgSequence()

    ############## Zmumu T&P Configuration ########################
    do_Zmumu_RecoEff_TagProbe = True  # this is for Z->mumu, reco eff. You can add your own analysis in a similar way.
    do_Zmumu_IsolationEff_TagProbe = True  # this is for Z->mumu, isolation eff. You can add your own analysis in a similar way.
    do_Zmumu_TriggerEff_TagProbe = True  # this is for Z->mumu, Trigger eff.

    ############## JPsi T&P Configuration ########################
    do_JPsi_RecoEff_TagProbe = True
    do_JPsi_IsolationEff_TagProbe = True
    do_JPsi_TriggerEff_TagProbe = True

    GRL_to_use = []
    #GRL_to_use  = ["/afs/cern.ch/user/a/atlasdqm/grlgen/All_Good/data15_13TeV.periodA_DetStatus-v62-pro18_DQDefects-00-01-02_PHYS_StandardGRL_All_Good.xml"]

    CommonMuonTPConfig.AddTrigDecisionTool()
    CommonMuonTPConfig.AddTrigMatchingTool()
    CommonMuonTPConfig.AddMuonSelectionTool()
    CommonMuonTPConfig.AddGoodRunsListSelectionTool(GRL_to_use)

    ##### Reco eff analysis options
    if do_Zmumu_RecoEff_TagProbe:
        ZmumuTPRecoAnalysis.AddZmumuTPRecoAnalysis(doEtaSlices=False,
                                                   writeNtuple=True,
                                                   doClosure=False,
                                                   doDRSys=True,
                                                   doValid=False,
                                                   DoProbeMatchPlots=doPlots,
                                                   ProduceEfficiencies=doPlots
                                                   and doEff)
    if do_JPsi_RecoEff_TagProbe:
        JPsiTPRecoAnalysis.AddJPsiTPRecoAnalysis(writeNtuple=True,
                                                 doValid=False,
                                                 doDRSys=True,
                                                 DoProbeMatchPlots=doPlots,
                                                 ProduceEfficiencies=doPlots
                                                 and doEff)

    if do_Zmumu_TriggerEff_TagProbe or do_Zmumu_IsolationEff_TagProbe:
        ZmumuTPMuonAnalysis.AddZmumuTPMuonAnalysis(
            doIso=do_Zmumu_IsolationEff_TagProbe,
            doTrig=do_Zmumu_TriggerEff_TagProbe,
            doTrigEtaSlices=True,
            doIsolEtaSlices=False,
            doIsolPlots=False,
            doTriggerPlots=True,
            writeNtuple=True,
            doClosure=False,
            doDRSys=True,
            doDPhiTPSys=True,
            doProbeCharSys=True,
            doLooseProbes=True,
            doMediumProbes=True,
            doTightProbes=True,
            doTruthProbes=True,
            doHighPtProbes=True,
            doL1=True,
            doL2=False,
            doEF=False,
            doHLT=True,
            DoProbeMatchPlots=False,
            ProduceEfficiencies=doPlots and doEff)

    if do_JPsi_TriggerEff_TagProbe or do_JPsi_IsolationEff_TagProbe:
        JPsiTPMuonAnalysis.AddJPsiTPMuonAnalysis(
            doIso=do_JPsi_IsolationEff_TagProbe,
            doTrig=do_JPsi_TriggerEff_TagProbe,
            doTrigEtaSlices=True,
            doIsolEtaSlices=False,
            doIsolPlots=False,
            doTriggerPlots=True,
            writeNtuple=True,
            doClosure=False,
            doDRSys=True,
            doDPhiTPSys=True,
            doProbeCharSys=True,
            doLooseProbes=True,
            doMediumProbes=True,
            doTightProbes=True,
            doTruthProbes=True,
            doHighPtProbes=True,
            doL1=True,
            doL2=False,
            doEF=False,
            doHLT=True,
            DoProbeMatchPlots=False,
            ProduceEfficiencies=doPlots and doEff)

    # Add HistSvc
    from GaudiSvc.GaudiSvcConf import THistSvc
    ServiceMgr += THistSvc()
    ServiceMgr.THistSvc.Output += [
        "MUONTP DATAFILE='{}' OPT='RECREATE'".format(outputFilename)
    ]
Exemplo n.º 3
0
def AddConfiguredJPsiTPAlg(name_suffix="myProbes",
                           ProbeKind = "CaloTag", # options: "CaloTag","MS", "Truth", "ID"
                           MatchContainer="Muons",
                           doID=False,
                           doCB=True,
                           doLoose=True,
                           doMedium=True,
                           doTight=True,
                           doHighPt=True,
                           doStandalone=False,
                           doCaloTag=False,
                           doIndividualAuthors=False,
                           writeNtuple=False,
                           useTrigger=True,
                           doDRSys = False,
                           doClosure=False,
                           DoProbeMatchPlots=True,
                           ProduceEfficiencies=False):

    from AthenaCommon.AlgSequence import AlgSequence
    from AthenaCommon.AppMgr import ToolSvc
    job = AlgSequence()

    MuonContainerToUse = "Muons"
    #if hasattr(job, "MuonQualityUpdater"):
        #MuonContainerToUse = "UpdatedMuons"

    ProbeContainer=MuonContainerToUse

    if ProbeKind == "MSTrackPart":
        ProbeContainer = "ExtrapolatedMuonTrackParticles"
        ProbeKind = "MS"
        
    if ProbeKind == "ID":
        ProbeContainer = "InDetTrackParticles"

    if ProbeKind == "Truth":
        ProbeContainer = "MuonTruthParticles"

    theAlg = CommonMuonTPConfig.AddTagProbeAlg(name="JPsiTPAlg_%s"%name_suffix,
                           ProbeCont=ProbeContainer,
                           MatchCont=MatchContainer)
    theAlg.TopLevelFolderName = "JPsiTPReco"

    #AddMuonSelectionTool()


    # add a plotting tool
    #PlotTool = AddPlottingTool(name="JPsiTPPlottingTool_%s"%name_suffix,EffiFlag=name_suffix)

    # add J/Psi TP selection tools
    SelectionTools = []
    SelectionTools += [CommonMuonTPConfig.AddJPsiTPSelectionTool(name="JPsiTPSelectionTool_OC_%s"%name_suffix,EffiFlag="%s_OC"%name_suffix, ProbeType = ProbeKind, UseTrigger = useTrigger)]


    PlotTools = []
    # add plotting tools in slices
    PlotTools = [CommonMuonTPConfig.AddPlottingTool(name="JPsiTPPlottingTool_%s_All"%name_suffix,EffiFlag=name_suffix+"_All",applySF = False,DoProbeMatchPlots=DoProbeMatchPlots,ProduceEfficiencies=ProduceEfficiencies)]
    for thetool in PlotTools:
        thetool.doJPsiKinematicPlots = True
        thetool.doJPsiDileptonPlots = True

    # add any desired matching tools

    MATCH_DR = 0.05
    
    MatchingTools = []

    if doID:
        thistoolID = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_ID"%name_suffix,EffiFlag="IDTracks")
        thistoolID.MatchToID = True
        thistoolID.ApplyScaleFactors = False
        thistoolID.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolID]
        
        if doDRSys:
            thistoolID_dRdown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_ID_dRdown"%name_suffix,EffiFlag="IDTracks_dRDown")
            thistoolID_dRdown.MatchToID = True
            thistoolID_dRdown.ApplyScaleFactors = False
            thistoolID_dRdown.IsNominal=False
            thistoolID_dRdown.MaximumDrCut = 0.5 *MATCH_DR
            MatchingTools += [thistoolID_dRdown]
            
            thistoolID_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_ID_dRUp"%name_suffix,EffiFlag="IDTracks_dRUp")
            thistoolID_dRUp.MatchToID = True
            thistoolID_dRUp.ApplyScaleFactors = False
            thistoolID_dRUp.IsNominal=False
            thistoolID_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolID_dRUp]
        
    if doLoose:
        thistoolLoose = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Loose"%name_suffix,EffiFlag="LooseMuons")
        thistoolLoose.MatchToLoose = True
        thistoolLoose.ApplyScaleFactors = False
        thistoolLoose.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolLoose]
        
        if doDRSys:
            thistoolLoose_dRdown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Loose_dRdown"%name_suffix,EffiFlag="LooseMuons_dRDown")
            thistoolLoose_dRdown.MatchToLoose = True
            thistoolLoose_dRdown.ApplyScaleFactors = False
            thistoolLoose_dRdown.IsNominal=False
            thistoolLoose_dRdown.MaximumDrCut = 0.5 *MATCH_DR
            MatchingTools += [thistoolLoose_dRdown]
            
            thistoolLoose_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Loose_dRUp"%name_suffix,EffiFlag="LooseMuons_dRUp")
            thistoolLoose_dRUp.MatchToLoose = True
            thistoolLoose_dRUp.ApplyScaleFactors = False
            thistoolLoose_dRUp.IsNominal=False
            thistoolLoose_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolLoose_dRUp]
            
        # also run a version without CaloTag
        thistoolLoose_noCaloTag = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Loose_noCaloTag"%name_suffix,EffiFlag="LooseMuons_noCaloTag")
        thistoolLoose_noCaloTag.MatchToLoose_noCaloTag = True
        thistoolLoose_noCaloTag.ApplyScaleFactors = False
        thistoolLoose_noCaloTag.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolLoose_noCaloTag]
        
        if doDRSys:
            thistoolLoose_noCaloTag_dRdown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Loose_noCaloTag_dRdown"%name_suffix,EffiFlag="LooseMuons_noCaloTag_dRDown")
            thistoolLoose_noCaloTag_dRdown.MatchToLoose_noCaloTag = True
            thistoolLoose_noCaloTag_dRdown.ApplyScaleFactors = False
            thistoolLoose_noCaloTag_dRdown.IsNominal=False
            thistoolLoose_noCaloTag_dRdown.MaximumDrCut = 0.5 *MATCH_DR
            MatchingTools += [thistoolLoose_noCaloTag_dRdown]
            
            thistoolLoose_noCaloTag_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Loose_noCaloTag_dRUp"%name_suffix,EffiFlag="LooseMuons_noCaloTag_dRUp")
            thistoolLoose_noCaloTag_dRUp.MatchToLoose_noCaloTag = True
            thistoolLoose_noCaloTag_dRUp.ApplyScaleFactors = False
            thistoolLoose_noCaloTag_dRUp.IsNominal=False
            thistoolLoose_noCaloTag_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolLoose_noCaloTag_dRUp]
        
    if doMedium:
        thistoolMed = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Medium"%name_suffix,EffiFlag="MediumMuons")
        thistoolMed.MatchToMedium = True
        thistoolMed.ApplyScaleFactors = False
        thistoolMed.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMed]
        
        if doDRSys:
            thistoolMedium_dRdown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Medium_dRdown"%name_suffix,EffiFlag="MediumMuons_dRDown")
            thistoolMedium_dRdown.MatchToMedium = True
            thistoolMedium_dRdown.IsNominal=False
            thistoolMedium_dRdown.ApplyScaleFactors = False
            thistoolMedium_dRdown.MaximumDrCut = 0.5 *MATCH_DR
            MatchingTools += [thistoolMedium_dRdown]
            
            thistoolMedium_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Medium_dRUp"%name_suffix,EffiFlag="MediumMuons_dRUp")
            thistoolMedium_dRUp.MatchToMedium = True
            thistoolMedium_dRUp.IsNominal=False
            thistoolMedium_dRUp.ApplyScaleFactors = False
            thistoolMedium_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolMedium_dRUp]
        
    if doTight:
        thistoolTight = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Tight"%name_suffix,EffiFlag="TightMuons")
        thistoolTight.MatchToTight = True
        thistoolTight.ApplyScaleFactors = False
        thistoolTight.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolTight]
        
        if doDRSys:
            thistoolTight_dRdown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Tight_dRdown"%name_suffix,EffiFlag="TightMuons_dRDown")
            thistoolTight_dRdown.MatchToTight = True
            thistoolTight_dRdown.ApplyScaleFactors = False
            thistoolTight_dRdown.IsNominal=False
            thistoolTight_dRdown.MaximumDrCut = 0.5 *MATCH_DR
            MatchingTools += [thistoolTight_dRdown]
            
            thistoolTight_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_Tight_dRUp"%name_suffix,EffiFlag="TightMuons_dRUp")
            thistoolTight_dRUp.MatchToTight = True
            thistoolTight_dRUp.IsNominal=False
            thistoolTight_dRUp.ApplyScaleFactors = False
            thistoolTight_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolTight_dRUp]

    if doHighPt:
        thistoolHighPt = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_HighPt"%name_suffix,
                                                                       EffiFlag="HighPtMuons")
        thistoolHighPt.MatchToHighPt = True
        thistoolHighPt.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors("Tight")  # UPDATE when SF available for high pt
        thistoolHighPt.ApplyScaleFactors=doClosure
        thistoolHighPt.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolHighPt]
        if doDRSys:
            thistoolHighPt_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_HighPt_dRDown"%name_suffix,
                                                                                  EffiFlag="HighPtMuons_dRDown")
            thistoolHighPt_dRDown.MatchToHighPt = True
            thistoolHighPt_dRDown.IsNominal=False
            thistoolHighPt_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors("HighPt")  # UPDATE when SF available for high pt
            #thistoolHighPt_dRDown.ApplyScaleFactors = True
            thistoolHighPt_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolHighPt_dRDown]
            
            thistoolHighPt_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="JPsiTPEfficiencyTool_%s_HighPt_dRUp"%name_suffix,
                                                                                EffiFlag="HighPtMuons_dRUp")
            thistoolHighPt_dRUp.MatchToHighPt = True
            thistoolHighPt_dRUp.IsNominal=False
            thistoolHighPt_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors("Tight")  # UPDATE when SF available for high pt
            #thistoolHighPt_dRUp.ApplyScaleFactors = True
            thistoolHighPt_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolHighPt_dRUp]
            
    ntuples = []
    if writeNtuple:
        ntuples.append(CommonMuonTPConfig.AddTreeTool(name="JPsiTPTreeTool_%s"%name_suffix, EffiFlag="Trees",WriteSFInfo=doClosure))

    # create the TP tool itself
    TheTPTool = CommonMuonTPConfig.AddMuonTPTool(name = "JPsiTPTool_%s"%name_suffix,EffiFlag=name_suffix)
    TheTPTool.MuonTPSelectionTools = SelectionTools
    TheTPTool.PlottingTools = PlotTools
    TheTPTool.MuonTPEfficiencyTools = MatchingTools
    TheTPTool.TreeTools = ntuples
    theAlg.MuonTPTools += [TheTPTool]
Exemplo n.º 4
0
def AddConfiguredMuonTPAlg(name_suffix="MuonProbe_JPsi",
                           MatchContainer="Muons",
                           doIso=True,
                           doTrig=True,
                           doTrigEtaSlices=True,
                           doIsolEtaSlices=False,
                           doIsolPlots=False,
                           doTriggerPlots=True,
                           writeNtuple=False,
                           doClosure=False,
                           doDRSys=False,
                           doDPhiTPSys=False,
                           doProbeCharSys=False,
                           doVeryLooseProbes=False,
                           doLooseProbes=False,
                           doMediumProbes=False,
                           doTightProbes=False,
                           doHighPtProbes=False,
                           doTruthProbes=False,
                           DoProbeMatchPlots=True,
                           ProduceEfficiencies=False,
                           doL1=False,
                           doL2=False,
                           doEF=False,
                           doHLT=False):

    from AthenaCommon.AlgSequence import AlgSequence
    from AthenaCommon.AppMgr import ToolSvc
    job = AlgSequence()

    MuonContainerToUse = "Muons"
    if hasattr(job, "MuonQualityUpdater"):
        MuonContainerToUse = "UpdatedMuons"

    ProbeContainer = MuonContainerToUse
    theAlg = CommonMuonTPConfig.AddTagProbeAlg(name="JPsiTPMuonAlg_%s" %
                                               name_suffix,
                                               ProbeCont=ProbeContainer,
                                               MatchCont=MatchContainer)
    theAlg.TopLevelFolderName = "JPsiTPMuon"

    SelectionTools = []

    if doLooseProbes:
        SelecToolsOC_LooseProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_OC_LooseProbes_%s" % name_suffix,
            EffiFlag="%s_OC_LooseProbes" % name_suffix,
            ProbeType="Loose")
        SelecToolsOC_LooseProbes.UseLooseProbes = True
        SelectionTools.append(SelecToolsOC_LooseProbes)

        SelecToolsSC_LooseProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_SC_LooseProbes_%s" % name_suffix,
            EffiFlag="%s_SC_LooseProbes" % name_suffix,
            ProbeType="Loose",
            SameSign=True)
        SelecToolsSC_LooseProbes.UseLooseProbes = True
        SelectionTools.append(SelecToolsSC_LooseProbes)

        if doDPhiTPSys:
            SelecToolsOC_LooseProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_LooseProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_OC_LooseProbesDPhiCut" % name_suffix,
                ProbeType="Loose")
            SelecToolsOC_LooseProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsOC_LooseProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsOC_LooseProbesDPhiCut)

            SelecToolsSC_LooseProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_LooseProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_SC_LooseProbesDPhiCut" % name_suffix,
                ProbeType="Loose",
                SameSign=True)
            SelecToolsSC_LooseProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsSC_LooseProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsSC_LooseProbesDPhiCut)

        if doProbeCharSys:
            SelecToolsOC_LooseProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_LooseProbesPos_%s" % name_suffix,
                EffiFlag="%s_OC_LooseProbesPos" % name_suffix,
                ProbeType="Loose")
            SelecToolsOC_LooseProbesPos.doProbeChargeSys = True
            SelecToolsOC_LooseProbesPos.ProbeCharge = "positive"
            SelecToolsOC_LooseProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsOC_LooseProbesPos)

            SelecToolsOC_LooseProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_LooseProbesNeg_%s" % name_suffix,
                EffiFlag="%s_OC_LooseProbesNeg" % name_suffix,
                ProbeType="Loose")
            SelecToolsOC_LooseProbesNeg.doProbeChargeSys = True
            SelecToolsOC_LooseProbesNeg.IsNominal = False
            SelecToolsOC_LooseProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsOC_LooseProbesNeg)

            SelecToolsSC_LooseProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_LooseProbesPos_%s" % name_suffix,
                EffiFlag="%s_SC_LooseProbesPos" % name_suffix,
                ProbeType="Loose",
                SameSign=True)
            SelecToolsSC_LooseProbesPos.doProbeChargeSys = True
            SelecToolsSC_LooseProbesPos.ProbeCharge = "positive"
            SelecToolsSC_LooseProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsSC_LooseProbesPos)

            SelecToolsSC_LooseProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_LooseProbesNeg_%s" % name_suffix,
                EffiFlag="%s_SC_LooseProbesNeg" % name_suffix,
                ProbeType="Loose",
                SameSign=True)
            SelecToolsSC_LooseProbesNeg.doProbeChargeSys = True
            SelecToolsSC_LooseProbesNeg.IsNominal = False
            SelecToolsSC_LooseProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsSC_LooseProbesNeg)

    if doMediumProbes:
        SelecToolsOC_MediumProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_OC_MediumProbes_%s" % name_suffix,
            EffiFlag="%s_OC_MediumProbes" % name_suffix,
            ProbeType="Medium")
        SelecToolsOC_MediumProbes.UseMediumProbes = True
        SelectionTools.append(SelecToolsOC_MediumProbes)

        SelecToolsSC_MediumProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_SC_MediumProbes_%s" % name_suffix,
            EffiFlag="%s_SC_MediumProbes" % name_suffix,
            ProbeType="Medium",
            SameSign=True)
        SelecToolsSC_MediumProbes.UseMediumProbes = True
        SelectionTools.append(SelecToolsSC_MediumProbes)

        if doDPhiTPSys:
            SelecToolsOC_MediumProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_MediumProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_OC_MediumProbesDPhiCut" % name_suffix,
                ProbeType="Medium")
            SelecToolsOC_MediumProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsOC_MediumProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsOC_MediumProbesDPhiCut)

            SelecToolsSC_MediumProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_MediumProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_SC_MediumProbesDPhiCut" % name_suffix,
                ProbeType="Medium",
                SameSign=True)
            SelecToolsSC_MediumProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsSC_MediumProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsSC_MediumProbesDPhiCut)

        if doProbeCharSys:
            SelecToolsOC_MediumProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_MediumProbesPos_%s" % name_suffix,
                EffiFlag="%s_OC_MediumProbesPos" % name_suffix,
                ProbeType="Medium")
            SelecToolsOC_MediumProbesPos.doProbeChargeSys = True
            SelecToolsOC_MediumProbesPos.ProbeCharge = "positive"
            SelecToolsOC_MediumProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsOC_MediumProbesPos)

            SelecToolsOC_MediumProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_MediumProbesNeg_%s" % name_suffix,
                EffiFlag="%s_OC_MediumProbesNeg" % name_suffix,
                ProbeType="Medium")
            SelecToolsOC_MediumProbesNeg.doProbeChargeSys = True
            SelecToolsOC_MediumProbesNeg.IsNominal = False
            SelecToolsOC_MediumProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsOC_MediumProbesNeg)

            SelecToolsSC_MediumProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_MediumProbesPos_%s" % name_suffix,
                EffiFlag="%s_SC_MediumProbesPos" % name_suffix,
                ProbeType="Medium",
                SameSign=True)
            SelecToolsSC_MediumProbesPos.doProbeChargeSys = True
            SelecToolsSC_MediumProbesPos.ProbeCharge = "positive"
            SelecToolsSC_MediumProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsSC_MediumProbesPos)

            SelecToolsSC_MediumProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_MediumProbesNeg_%s" % name_suffix,
                EffiFlag="%s_SC_MediumProbesNeg" % name_suffix,
                ProbeType="Medium",
                SameSign=True)
            SelecToolsSC_MediumProbesNeg.doProbeChargeSys = True
            SelecToolsSC_MediumProbesNeg.IsNominal = False
            SelecToolsSC_MediumProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsSC_MediumProbesNeg)

    if doTightProbes:
        SelecToolsOC_TightProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_OC_TightProbes_%s" % name_suffix,
            EffiFlag="%s_OC_TightProbes" % name_suffix,
            ProbeType="Tight")
        SelecToolsOC_TightProbes.UseTightProbes = True
        SelectionTools.append(SelecToolsOC_TightProbes)

        SelecToolsSC_TightProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_SC_TightProbes_%s" % name_suffix,
            EffiFlag="%s_SC_TightProbes" % name_suffix,
            ProbeType="Tight",
            SameSign=True)
        SelecToolsSC_TightProbes.UseTightProbes = True
        SelectionTools.append(SelecToolsSC_TightProbes)

        if doDPhiTPSys:
            SelecToolsOC_TightProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_TightProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_OC_TightProbesDPhiCut" % name_suffix,
                ProbeType="Tight")
            SelecToolsOC_TightProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsOC_TightProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsOC_TightProbesDPhiCut)

            SelecToolsSC_TightProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_TightProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_SC_TightProbesDPhiCut" % name_suffix,
                ProbeType="Tight",
                SameSign=True)
            SelecToolsSC_TightProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsSC_TightProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsSC_TightProbesDPhiCut)

        if doProbeCharSys:
            SelecToolsOC_TightProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_TightProbesPos_%s" % name_suffix,
                EffiFlag="%s_OC_TightProbesPos" % name_suffix,
                ProbeType="Tight")
            SelecToolsOC_TightProbesPos.doProbeChargeSys = True
            SelecToolsOC_TightProbesPos.ProbeCharge = "positive"
            SelecToolsOC_TightProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsOC_TightProbesPos)

            SelecToolsOC_TightProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_TightProbesNeg_%s" % name_suffix,
                EffiFlag="%s_OC_TightProbesNeg" % name_suffix,
                ProbeType="Tight")
            SelecToolsOC_TightProbesNeg.doProbeChargeSys = True
            SelecToolsOC_TightProbesNeg.IsNominal = False
            SelecToolsOC_TightProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsOC_TightProbesNeg)

            SelecToolsSC_TightProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_TightProbesPos_%s" % name_suffix,
                EffiFlag="%s_SC_TightProbesPos" % name_suffix,
                ProbeType="Tight",
                SameSign=True)
            SelecToolsSC_TightProbesPos.doProbeChargeSys = True
            SelecToolsSC_TightProbesPos.ProbeCharge = "positive"
            SelecToolsSC_TightProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsSC_TightProbesPos)

            SelecToolsSC_TightProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_TightProbesNeg_%s" % name_suffix,
                EffiFlag="%s_SC_TightProbesNeg" % name_suffix,
                ProbeType="Tight",
                SameSign=True)
            SelecToolsSC_TightProbesNeg.doProbeChargeSys = True
            SelecToolsSC_TightProbesNeg.IsNominal = False
            SelecToolsSC_TightProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsSC_TightProbesNeg)

    if doHighPtProbes:
        SelecToolsOC_HighPtProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_OC_HighPtProbes_%s" % name_suffix,
            EffiFlag="%s_OC_HighPtProbes" % name_suffix,
            ProbeType="HighPt")
        SelecToolsOC_HighPtProbes.UseHighPtProbes = True
        SelectionTools.append(SelecToolsOC_HighPtProbes)

        SelecToolsSC_HighPtProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_SC_HighPtProbes_%s" % name_suffix,
            EffiFlag="%s_SC_HighPtProbes" % name_suffix,
            ProbeType="HighPt",
            SameSign=True)
        SelecToolsSC_HighPtProbes.UseHighPtProbes = True
        SelectionTools.append(SelecToolsSC_HighPtProbes)

        if doDPhiTPSys:
            SelecToolsOC_HighPtProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_HighPtProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_OC_HighPtProbesDPhiCut" % name_suffix,
                ProbeType="HighPt")
            SelecToolsOC_HighPtProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsOC_HighPtProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsOC_HighPtProbesDPhiCut)

            SelecToolsSC_HighPtProbesDPhiCut = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_HighPtProbesDPhiCut_%s" %
                name_suffix,
                EffiFlag="%s_SC_HighPtProbesDPhiCut" % name_suffix,
                ProbeType="HighPt",
                SameSign=True)
            SelecToolsSC_HighPtProbesDPhiCut.DeltaPhiCut = 3.04
            SelecToolsSC_HighPtProbesDPhiCut.IsNominal = False
            SelectionTools.append(SelecToolsSC_HighPtProbesDPhiCut)

        if doProbeCharSys:
            SelecToolsOC_HighPtProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_HighPtProbesPos_%s" % name_suffix,
                EffiFlag="%s_OC_HighPtProbesPos" % name_suffix,
                ProbeType="HighPt")
            SelecToolsOC_HighPtProbesPos.doProbeChargeSys = True
            SelecToolsOC_HighPtProbesPos.ProbeCharge = "positive"
            SelecToolsOC_HighPtProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsOC_HighPtProbesPos)

            SelecToolsOC_HighPtProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_OC_HighPtProbesNeg_%s" % name_suffix,
                EffiFlag="%s_OC_HighPtProbesNeg" % name_suffix,
                ProbeType="HighPt")
            SelecToolsOC_HighPtProbesNeg.doProbeChargeSys = True
            SelecToolsOC_HighPtProbesNeg.IsNominal = False
            SelecToolsOC_HighPtProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsOC_HighPtProbesNeg)

            SelecToolsSC_HighPtProbesPos = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_HighPtProbesPos_%s" % name_suffix,
                EffiFlag="%s_SC_HighPtProbesPos" % name_suffix,
                ProbeType="HighPt",
                SameSign=True)
            SelecToolsSC_HighPtProbesPos.doProbeChargeSys = True
            SelecToolsSC_HighPtProbesPos.ProbeCharge = "positive"
            SelecToolsSC_HighPtProbesPos.IsNominal = False
            SelectionTools.append(SelecToolsSC_HighPtProbesPos)

            SelecToolsSC_HighPtProbesNeg = CommonMuonTPConfig.AddJPsiTPSelectionTool(
                name="JPsiTPSelectionTool_SC_HighPtProbesNeg_%s" % name_suffix,
                EffiFlag="%s_SC_HighPtProbesNeg" % name_suffix,
                ProbeType="HighPt",
                SameSign=True)
            SelecToolsSC_HighPtProbesNeg.doProbeChargeSys = True
            SelecToolsSC_HighPtProbesNeg.IsNominal = False
            SelecToolsSC_HighPtProbesNeg.ProbeCharge = "negative"
            SelectionTools.append(SelecToolsSC_HighPtProbesNeg)

    from AthenaCommon.GlobalFlags import globalflags
    if doTruthProbes and not globalflags.DataSource() == 'data':
        SelecToolsOC_TruthProbes = CommonMuonTPConfig.AddJPsiTPSelectionTool(
            name="JPsiTPSelectionTool_OC_TruthProbes_%s" % name_suffix,
            EffiFlag="%s_TruthProbes" % name_suffix,
            ProbeType="TruthMatchedMuons")
        SelectionTools.append(SelecToolsOC_TruthProbes)

    for thetool in SelectionTools:
        thetool.ProbeTrackIsoCut = -1
        thetool.ProbeTrackAntiIsoCut = -1
        thetool.ProbeCaloIsoCut = -1
        thetool.ProbeCaloAntiIsoCut = -1
        # also accept high eta muons
        thetool.ProbeEtaCut = 4.5

    PlotTools = []

    # first the trigger plots
    if doTrig and doTriggerPlots:
        PlotTools += JPsiTPTrigAnalysis.AddTrigPlots(
            name_suffix=name_suffix,
            doEtaSlices=doTrigEtaSlices,
            doClosure=doClosure,
            DoProbeMatchPlots=DoProbeMatchPlots,
            ProduceEfficiencies=ProduceEfficiencies)
    # then the isolation plots
    if doIso and doIsolPlots:
        PlotTools += JPsiTPIsolAnalysis.AddIsolPlots(
            name_suffix=name_suffix,
            doEtaSlices=doIsolEtaSlices,
            doClosure=doClosure,
            DoProbeMatchPlots=DoProbeMatchPlots,
            ProduceEfficiencies=ProduceEfficiencies)

    MatchingTools = []
    if doTrig:
        MatchingTools += JPsiTPTrigAnalysis.AddTrigMatchTools(
            name_suffix=name_suffix,
            doL1=doL1,
            doL2=doL2,
            doEF=doEF,
            doHLT=doHLT,
            doDRSys=doDRSys)
    if doIso:
        MatchingTools += JPsiTPIsolAnalysis.AddIsolMatchTools(name_suffix)

    ntuples = []
    if writeNtuple:
        ntuples.append(
            CommonMuonTPConfig.AddTreeTool(name="JPsiTPMuonTreeTool_%s" %
                                           name_suffix,
                                           EffiFlag="Trees",
                                           WriteSFInfo=doClosure))

    for ntuple in ntuples:
        if doIso:
            ntuple.AddExtendedIsolation = True

    # create the TP tool itself
    TheTPTool = CommonMuonTPConfig.AddMuonTPTool(name="MuonProbeTPTool_%s" %
                                                 name_suffix,
                                                 EffiFlag=name_suffix)
    TheTPTool.MuonTPSelectionTools = SelectionTools
    TheTPTool.PlottingTools = PlotTools
    TheTPTool.MuonTPEfficiencyTools = MatchingTools
    TheTPTool.TreeTools = ntuples
    theAlg.MuonTPTools += [TheTPTool]
Exemplo n.º 5
0
def AddConfiguredZmumuTPAlg(
        name_suffix="myProbes",
        ProbeKind="CaloTag",  # options: "CaloTag","MS", "Truth", "ID"
        MatchContainer="Muons",
        doID=False,
        doCB=True,
        doLoose=True,
        doMedium=True,
        doTight=True,
        doHighPt=True,
        doStandalone=False,
        doCaloTag=False,
        doIndividualAuthors=False,
        doEtaSlices=False,
        writeNtuple=False,
        doClosure=False,
        doDRSys=False,
        DoProbeMatchPlots=True,
        ProduceEfficiencies=False):

    from AthenaCommon.AlgSequence import AlgSequence
    from AthenaCommon.AppMgr import ToolSvc
    job = AlgSequence()

    MuonContainerToUse = "Muons"
    #if hasattr(job, "MuonQualityUpdater"):
    #MuonContainerToUse = "UpdatedMuons"

    ProbeContainer = MuonContainerToUse

    if ProbeKind == "MSTrackPart":
        ProbeContainer = "ExtrapolatedMuonTrackParticles"
        ProbeKind = "MS"

    if ProbeKind == "ID":
        ProbeContainer = "InDetTrackParticles"
    if ProbeKind == "Truth":
        ProbeContainer = "MuonTruthParticles"

    theAlg = CommonMuonTPConfig.AddTagProbeAlg(name="ZmumuTPAlg_%s" %
                                               name_suffix,
                                               ProbeCont=ProbeContainer,
                                               MatchCont=MatchContainer)
    theAlg.TopLevelFolderName = "ZmumuTPReco"

    #AddMuonSelectionTool()

    # add a plotting tool
    #PlotTool = AddPlottingTool(name="ZmumuTPPlottingTool_%s"%name_suffix,EffiFlag=name_suffix)

    # add four TP selection tools (iso and antiiso OC and SC)
    SelectionTools = []
    SelectionTools += [
        CommonMuonTPConfig.AddZmumuTPSelectionTool(
            name="ZmumuTPSelectionTool_OC_%s" % name_suffix,
            EffiFlag="%s_OC" % name_suffix,
            ProbeType=ProbeKind)
    ]
    SelectionTools += [
        CommonMuonTPConfig.AddZmumuTPSelectionTool(
            name="ZmumuTPSelectionTool_SC_%s" % name_suffix,
            EffiFlag="%s_SC" % name_suffix,
            ProbeType=ProbeKind,
            SameSign=True)
    ]
    SelectionTools += [
        CommonMuonTPConfig.AddZmumuTPSelectionTool(
            name="ZmumuTPSelectionTool_OCAntiIso_%s" % name_suffix,
            EffiFlag="%s_OCAntiIso" % name_suffix,
            ProbeType=ProbeKind,
            AntiIso=True)
    ]
    SelectionTools += [
        CommonMuonTPConfig.AddZmumuTPSelectionTool(
            name="ZmumuTPSelectionTool_SCAntiIso_%s" % name_suffix,
            EffiFlag="%s_SCAntiIso" % name_suffix,
            ProbeType=ProbeKind,
            SameSign=True,
            AntiIso=True)
    ]

    PlotTools = []
    # add plotting tools in slices
    if doEtaSlices:
        Slices = {
            "All": (0.0, 10.0),
            "noCrack": (0.1, 10.0),
            "Crack": (0.0, 0.1),
            "Barrel": (0.1, 1.1),
            "Transition": (1.1, 1.3),
            "Endcap": (1.3, 2.0),
            "CSC": (2.0, 2.7)
        }

        for etaslice, interval in Slices.iteritems():
            PlotTool = CommonMuonTPConfig.AddPlottingTool(
                name="ZmumuTPPlottingTool_%s_%s" % (name_suffix, etaslice),
                EffiFlag=name_suffix + "_" + etaslice,
                applySF=False,
                DoProbeMatchPlots=DoProbeMatchPlots,
                ProduceEfficiencies=ProduceEfficiencies)
            PlotTool.ProbeAbsEtaMin = interval[0]
            PlotTool.ProbeAbsEtaMax = interval[1]
            PlotTools.append(PlotTool)
            if doClosure:
                PlotToolCL = CommonMuonTPConfig.AddPlottingTool(
                    name="ZmumuTPPlottingToolClosure_%s_%s" %
                    (name_suffix, etaslice),
                    EffiFlag=name_suffix + "_" + etaslice + "_Closure",
                    applySF=True,
                    DoProbeMatchPlots=DoProbeMatchPlots,
                    ProduceEfficiencies=ProduceEfficiencies)
                PlotToolCL.ProbeAbsEtaMin = interval[0]
                PlotToolCL.ProbeAbsEtaMax = interval[1]
                PlotTools.append(PlotToolCL)

    else:
        PlotTools = [
            CommonMuonTPConfig.AddPlottingTool(
                name="ZmumuTPPlottingTool_%s_All" % name_suffix,
                EffiFlag=name_suffix + "_All",
                applySF=False,
                DoProbeMatchPlots=DoProbeMatchPlots,
                ProduceEfficiencies=ProduceEfficiencies)
        ]
        if doClosure:
            PlotTools.append(
                CommonMuonTPConfig.AddPlottingTool(
                    name="ZmumuTPPlottingToolClosure_%s_All" % name_suffix,
                    EffiFlag=name_suffix + "_All_Closure",
                    applySF=True,
                    DoProbeMatchPlots=DoProbeMatchPlots,
                    ProduceEfficiencies=ProduceEfficiencies))

    # Config the plot tools
    for thetool in PlotTools:
        thetool.doZmumuKinematicPlots = False
        thetool.doFineEtaPhiPlots = True
        thetool.doDetectorRegionPlots = True

    # add any desired matching tools
    MATCH_DR = 0.05

    MatchingTools = []
    if doCB:
        thistoolCB = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_CB" % name_suffix,
            EffiFlag="CombinedMuons")
        thistoolCB.MatchToCB = True
        thistoolCB.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Medium")
        thistoolCB.ApplyScaleFactors = doClosure
        thistoolCB.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolCB]
        if doDRSys:
            thistoolCB_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_CB_dRDown" % name_suffix,
                EffiFlag="CombinedMuons_dRDown")
            thistoolCB_dRDown.IsNominal = False
            thistoolCB_dRDown.MatchToCB = True
            thistoolCB_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Medium")
            #thistoolCB_dRDown.ApplyScaleFactors = True
            thistoolCB_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolCB_dRDown]

            thistoolCB_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_CB_dRUp" % name_suffix,
                EffiFlag="CombinedMuons_dRUp")
            thistoolCB_dRUp.MatchToCB = True
            thistoolCB_dRUp.IsNominal = False
            thistoolCB_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Medium")
            #thistoolCB_dRUp.ApplyScaleFactors = True
            thistoolCB_dRUp.MaximumDrCut = 2. * MATCH_DR
            MatchingTools += [thistoolCB_dRUp]

    if doLoose:
        thistoolLoose = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_Loose" % name_suffix,
            EffiFlag="LooseMuons")
        thistoolLoose.MatchToLoose = True
        thistoolLoose.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Loose")
        thistoolLoose.ApplyScaleFactors = doClosure
        #thistoolLoose.ApplyScaleFactors = True
        thistoolLoose.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolLoose]
        if doDRSys:
            thistoolLoose_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Loose_dRDown" % name_suffix,
                EffiFlag="LooseMuons_dRDown")
            thistoolLoose_dRDown.MatchToLoose = True
            thistoolLoose_dRDown.IsNominal = False
            thistoolLoose_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Loose")
            #thistoolLoose_dRDown.ApplyScaleFactors = True
            thistoolLoose_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolLoose_dRDown]

            thistoolLoose_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Loose_dRUp" % name_suffix,
                EffiFlag="LooseMuons_dRUp")
            thistoolLoose_dRUp.MatchToLoose = True
            thistoolLoose_dRUp.IsNominal = False
            thistoolLoose_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Loose")
            #thistoolLoose_dRUp.ApplyScaleFactors = True
            thistoolLoose_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolLoose_dRUp]

        # also run a version without CaloTag
        thistoolLoose_noCaloTag = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_Loose_noCaloTag" % name_suffix,
            EffiFlag="LooseMuons_noCaloTag")
        thistoolLoose_noCaloTag.MatchToLoose_noCaloTag = True
        thistoolLoose_noCaloTag.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Loose")
        thistoolLoose_noCaloTag.ApplyScaleFactors = doClosure
        #thistoolLoose_noCaloTag.ApplyScaleFactors = True
        thistoolLoose_noCaloTag.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolLoose_noCaloTag]
        if doDRSys:
            thistoolLoose_noCaloTag_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Loose_noCaloTag_dRDown" %
                name_suffix,
                EffiFlag="LooseMuons_noCaloTag_dRDown")
            thistoolLoose_noCaloTag_dRDown.MatchToLoose_noCaloTag = True
            thistoolLoose_noCaloTag_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Loose")
            #thistoolLoose_noCaloTag_dRDown.ApplyScaleFactors = True
            thistoolLoose_noCaloTag_dRDown.IsNominal = False
            thistoolLoose_noCaloTag_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolLoose_noCaloTag_dRDown]

            thistoolLoose_noCaloTag_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Loose_noCaloTag_dRUp" %
                name_suffix,
                EffiFlag="LooseMuons_noCaloTag_dRUp")
            thistoolLoose_noCaloTag_dRUp.MatchToLoose_noCaloTag = True
            thistoolLoose_noCaloTag_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Loose")
            #thistoolLoose_noCaloTag_dRUp.ApplyScaleFactors = True
            thistoolLoose_noCaloTag_dRUp.IsNominal = False
            thistoolLoose_noCaloTag_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolLoose_noCaloTag_dRUp]

    if doMedium:
        thistoolMed = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_Medium" % name_suffix,
            EffiFlag="MediumMuons")
        thistoolMed.MatchToMedium = True
        thistoolMed.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Medium")
        thistoolMed.ApplyScaleFactors = doClosure
        thistoolMed.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMed]
        if doDRSys:
            thistoolMed_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Medium_dRDown" % name_suffix,
                EffiFlag="MediumMuons_dRDown")
            thistoolMed_dRDown.MatchToMedium = True
            thistoolMed_dRDown.IsNominal = False
            thistoolMed_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Medium")
            #thistoolMed_dRDown.ApplyScaleFactors = True
            thistoolMed_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolMed_dRDown]

            thistoolMed_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Medium_dRUp" % name_suffix,
                EffiFlag="MediumMuons_dRUp")
            thistoolMed_dRUp.MatchToMedium = True
            thistoolMed_dRUp.IsNominal = False
            thistoolMed_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Medium")
            #thistoolMed_dRUp.ApplyScaleFactors = True
            thistoolMed_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolMed_dRUp]

        thistoolMed_PtrMatch = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_PtrMatch_%s_Medium" % name_suffix,
            EffiFlag="MediumMuons_PtrMatching")
        thistoolMed_PtrMatch.MatchToMedium = True
        thistoolMed_PtrMatch.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Medium")
        thistoolMed_PtrMatch.ApplyScaleFactors = doClosure
        #thistoolMed_PtrMatch.ApplyScaleFactors = True
        thistoolMed_PtrMatch.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMed_PtrMatch]

    if doTight:
        thistoolTight = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_Tight" % name_suffix,
            EffiFlag="TightMuons")
        thistoolTight.MatchToTight = True
        thistoolTight.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Tight")
        thistoolTight.ApplyScaleFactors = doClosure
        #thistoolTight.ApplyScaleFactors = True
        thistoolTight.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolTight]
        if doDRSys:
            thistoolTight_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Tight_dRDown" % name_suffix,
                EffiFlag="TightMuons_dRDown")
            thistoolTight_dRDown.MatchToTight = True
            thistoolTight_dRDown.IsNominal = False
            thistoolTight_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Tight")
            #thistoolTight_dRDown.ApplyScaleFactors = True
            thistoolTight_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolTight_dRDown]

            thistoolTight_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_Tight_dRUp" % name_suffix,
                EffiFlag="TightMuons_dRUp")
            thistoolTight_dRUp.MatchToTight = True
            thistoolTight_dRUp.IsNominal = False
            thistoolTight_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Tight")
            #thistoolTight_dRUp.ApplyScaleFactors = True
            thistoolTight_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolTight_dRUp]

    if doHighPt:
        thistoolHighPt = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_HighPt" % name_suffix,
            EffiFlag="HighPtMuons")
        thistoolHighPt.MatchToHighPt = True
        thistoolHighPt.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Tight")  # UPDATE when SF available for high pt
        thistoolHighPt.ApplyScaleFactors = doClosure
        #thistoolHighPt.ApplyScaleFactors = True
        thistoolHighPt.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolHighPt]
        if doDRSys:
            thistoolHighPt_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_HighPt_dRDown" % name_suffix,
                EffiFlag="HighPtMuons_dRDown")
            thistoolHighPt_dRDown.MatchToHighPt = True
            thistoolHighPt_dRDown.IsNominal = False
            thistoolHighPt_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "HighPt")  # UPDATE when SF available for high pt
            #thistoolHighPt_dRDown.ApplyScaleFactors = True
            thistoolHighPt_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolHighPt_dRDown]

            thistoolHighPt_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_HighPt_dRUp" % name_suffix,
                EffiFlag="HighPtMuons_dRUp")
            thistoolHighPt_dRUp.MatchToHighPt = True
            thistoolHighPt_dRUp.IsNominal = False
            thistoolHighPt_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Tight")  # UPDATE when SF available for high pt
            #thistoolHighPt_dRUp.ApplyScaleFactors = True
            thistoolHighPt_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolHighPt_dRUp]

    if doStandalone:
        thistoolSA = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_SA" % name_suffix,
            EffiFlag="StandaloneMuons")
        thistoolSA.MatchToAnyMS = True
        thistoolSA.IDhitCut = False
        thistoolSA.ApplyScaleFactors = doClosure
        thistoolSA.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolSA]
        if doDRSys:
            thistoolSA_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_SA_dRDown" % name_suffix,
                EffiFlag="StandaloneMuons_dRDown")
            thistoolSA_dRDown.MatchToAnyMS = True
            thistoolSA_dRDown.IDhitCut = False
            thistoolSA_dRDown.IsNominal = False
            thistoolSA_dRDown.ApplyScaleFactors = doClosure
            thistoolSA_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolSA_dRDown]

            thistoolSA_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_SA_dRUp" % name_suffix,
                EffiFlag="StandaloneMuons_dRUp")
            thistoolSA_dRUp.MatchToAnyMS = True
            thistoolSA_dRUp.IDhitCut = False
            thistoolSA_dRUp.IsNominal = False
            thistoolSA_dRUp.ApplyScaleFactors = doClosure
            thistoolSA_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolSA_dRUp]

    if doCaloTag:
        thistoolCT = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_CT" % name_suffix,
            EffiFlag="CaloTaggedMuons")
        thistoolCT.MatchToCaloTag = True
        thistoolCT.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
            "Loose")
        thistoolCT.ApplyScaleFactors = doClosure
        #thistoolCT.ApplyScaleFactors = True
        thistoolCT.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolCT]
        if doDRSys:
            thistoolCT_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_CT_dRDown" % name_suffix,
                EffiFlag="CaloTaggedMuons_dRDown")
            thistoolCT_dRDown.MatchToCaloTag = True
            thistoolCT_dRDown.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Loose")
            #thistoolCT_dRDown.ApplyScaleFactors = True
            thistoolCT_dRDown.IsNominal = False
            thistoolCT_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolCT_dRDown]

            thistoolCT_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_CT_dRUp" % name_suffix,
                EffiFlag="CaloTaggedMuons_dRUp")
            thistoolCT_dRUp.MatchToCaloTag = True
            thistoolCT_dRUp.ScaleFactorTool = CommonMuonTPConfig.AddMuonEfficiencyScaleFactors(
                "Loose")
            #thistoolCT_dRUp.ApplyScaleFactors = True
            thistoolCT_dRUp.IsNominal = False
            thistoolCT_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolCT_dRUp]

    if doID:
        thistoolID = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_ID" % name_suffix,
            EffiFlag="IDTracks")
        thistoolID.MatchToID = True
        thistoolID.ApplyScaleFactors = doClosure
        thistoolID.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolID]
        if doDRSys:
            thistoolID_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_ID_dRUp" % name_suffix,
                EffiFlag="IDTracks_dRUp")
            thistoolID_dRUp.MatchToID = True
            thistoolID_dRUp.ApplyScaleFactors = doClosure
            thistoolID_dRUp.MaximumDrCut = 2 * MATCH_DR
            thistoolID_dRUp.IsNominal = False
            MatchingTools += [thistoolID_dRUp]

            thistoolID_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_ID_dRDown" % name_suffix,
                EffiFlag="IDTracks_dRDown")
            thistoolID_dRDown.MatchToID = True
            thistoolID_dRDown.ApplyScaleFactors = doClosure
            thistoolID_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            thistoolID_dRDown.IsNominal = False
            MatchingTools += [thistoolID_dRDown]

        #thistoolID_noMCPcuts = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="ZmumuTPEfficiencyTool_%s_ID_noMCP"%name_suffix,EffiFlag="IDTracks_noMCP")
        #thistoolID_noMCPcuts.MatchToID = True
        #thistoolID_noMCPcuts.IDhitCut = False
        #thistoolID_noMCPcuts.ApplyScaleFactors = doClosure
        #thistoolID_noMCPcuts.MaximumDrCut = MATCH_DR
        #MatchingTools += [thistoolID_noMCPcuts]
        #if doDRSys:
        #thistoolID_noMCPcuts_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="ZmumuTPEfficiencyTool_%s_ID_noMCP_dRUp"%name_suffix,EffiFlag="IDTracks_noMCP_dRUp")
        #thistoolID_noMCPcuts_dRUp.MatchToID = True
        #thistoolID_noMCPcuts_dRUp.ApplyScaleFactors = doClosure
        #thistoolID_noMCPcuts_dRUp.MaximumDrCut = 2 * MATCH_DR
        #MatchingTools += [thistoolID_noMCPcuts_dRUp]

        #thistoolID_noMCPcuts_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(name="ZmumuTPEfficiencyTool_%s_ID_noMCP_dRDown"%name_suffix,EffiFlag="IDTracks_noMCP_dRDown")
        #thistoolID_noMCPcuts_dRDown.MatchToID = True
        #thistoolID_noMCPcuts_dRDown.ApplyScaleFactors = doClosure
        #thistoolID_noMCPcuts_dRDown.MaximumDrCut = 0.5 * MATCH_DR
        #MatchingTools += [thistoolID_noMCPcuts_dRDown]

    if doIndividualAuthors:
        thistoolMuidCB = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_MuidCB" % name_suffix,
            EffiFlag="MuidCB")
        thistoolMuidCB.MatchToMuidCB = True
        thistoolMuidCB.ApplyScaleFactors = doClosure
        thistoolMuidCB.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMuidCB]
        if doDRSys:
            thistoolMuidCB_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuidCB_dRDown" % name_suffix,
                EffiFlag="MuidCB_dRDown")
            thistoolMuidCB_dRDown.MatchToMuidCB = True
            thistoolMuidCB_dRDown.ApplyScaleFactors = doClosure
            thistoolMuidCB_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            thistoolMuidCB_dRDown.IsNominal = False
            MatchingTools += [thistoolMuidCB_dRDown]

            thistoolMuidCB_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuidCB_dRUp" % name_suffix,
                EffiFlag="MuidCB_dRUp")
            thistoolMuidCB_dRUp.MatchToMuidCB = True
            thistoolMuidCB_dRUp.ApplyScaleFactors = doClosure
            thistoolMuidCB_dRUp.MaximumDrCut = 2 * MATCH_DR
            thistoolMuidCB_dRUp.IsNominal = False
            MatchingTools += [thistoolMuidCB_dRUp]

        thistoolSTACO = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_STACO" % name_suffix,
            EffiFlag="STACO")
        thistoolSTACO.MatchToSTACO = True
        thistoolSTACO.ApplyScaleFactors = doClosure
        thistoolSTACO.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolSTACO]
        if doDRSys:
            thistoolSTACO_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_STACO_dRDown" % name_suffix,
                EffiFlag="STACO_dRDown")
            thistoolSTACO_dRDown.MatchToSTACO = True
            thistoolSTACO_dRDown.ApplyScaleFactors = doClosure
            thistoolSTACO_dRDown.IsNominal = False
            thistoolSTACO_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolSTACO_dRDown]

            thistoolSTACO_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_STACO_dRUp" % name_suffix,
                EffiFlag="STACO_dRUp")
            thistoolSTACO_dRUp.MatchToSTACO = True
            thistoolSTACO_dRUp.ApplyScaleFactors = doClosure
            thistoolSTACO_dRUp.IsNominal = False
            thistoolSTACO_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolSTACO_dRUp]

        thistoolMuTag = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_MuTag" % name_suffix,
            EffiFlag="MuTag")
        thistoolMuTag.MatchToMuTag = True
        thistoolMuTag.ApplyScaleFactors = doClosure
        thistoolMuTag.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMuTag]
        if doDRSys:
            thistoolMuTag_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuTag_dRDown" % name_suffix,
                EffiFlag="MuTag_dRDown")
            thistoolMuTag_dRDown.MatchToMuTag = True
            thistoolMuTag_dRDown.ApplyScaleFactors = doClosure
            thistoolMuTag_dRDown.IsNominal = False
            thistoolMuTag_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolMuTag_dRDown]

            thistoolMuTag_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuTag_dRUp" % name_suffix,
                EffiFlag="MuTag_dRUp")
            thistoolMuTag_dRUp.MatchToMuTag = True
            thistoolMuTag_dRUp.ApplyScaleFactors = doClosure
            thistoolMuTag_dRUp.IsNominal = False
            thistoolMuTag_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolMuTag_dRUp]

        thistoolMuTagIMO = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_MuTagIMO" % name_suffix,
            EffiFlag="MuTagIMO")
        thistoolMuTagIMO.MatchToMuTagIMO = True
        thistoolMuTagIMO.ApplyScaleFactors = doClosure
        thistoolMuTagIMO.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMuTagIMO]
        if doDRSys:
            thistoolMuTagIMO_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuTagIMO_dRDown" % name_suffix,
                EffiFlag="MuTagIMO_dRDown")
            thistoolMuTagIMO_dRDown.MatchToMuTagIMO = True
            thistoolMuTagIMO_dRDown.ApplyScaleFactors = doClosure
            thistoolMuTagIMO_dRDown.IsNominal = False
            thistoolMuTagIMO_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolMuTagIMO_dRDown]

            thistoolMuTagIMO_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuTagIMO_dRUp" % name_suffix,
                EffiFlag="MuTagIMO_dRUp")
            thistoolMuTagIMO_dRUp.MatchToMuTagIMO = True
            thistoolMuTagIMO_dRUp.ApplyScaleFactors = doClosure
            thistoolMuTagIMO_dRUp.IsNominal = False
            thistoolMuTagIMO_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolMuTagIMO_dRUp]

        thistoolMuidSA = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_MuidSA" % name_suffix,
            EffiFlag="MuidSA")
        thistoolMuidSA.MatchToMuidSA = True
        thistoolMuidSA.ApplyScaleFactors = doClosure
        thistoolMuidSA.IDhitCut = False
        thistoolMuidSA.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMuidSA]
        if doDRSys:
            thistoolMuidSA_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuidSA_dRDown" % name_suffix,
                EffiFlag="MuidSA_dRDown")
            thistoolMuidSA_dRDown.MatchToMuidSA = True
            thistoolMuidSA_dRDown.ApplyScaleFactors = doClosure
            thistoolMuidSA_dRDown.IsNominal = False
            thistoolMuidSA_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolMuidSA_dRDown]

            thistoolMuidSA_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuidSA_dRUp" % name_suffix,
                EffiFlag="MuidSA_dRUp")
            thistoolMuidSA_dRUp.MatchToMuidSA = True
            thistoolMuidSA_dRUp.ApplyScaleFactors = doClosure
            thistoolMuidSA_dRUp.IsNominal = False
            thistoolMuidSA_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolMuidSA_dRUp]

        thistoolMuGirl = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
            name="ZmumuTPEfficiencyTool_%s_MuidGirl" % name_suffix,
            EffiFlag="MuGirl")
        thistoolMuGirl.MatchToMuGirl = True
        thistoolMuGirl.ApplyScaleFactors = doClosure
        thistoolMuGirl.MaximumDrCut = MATCH_DR
        MatchingTools += [thistoolMuGirl]
        if doDRSys:
            thistoolMuGirl_dRDown = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuidGirl_dRDown" % name_suffix,
                EffiFlag="MuGirl_dRDown")
            thistoolMuGirl_dRDown.MatchToMuGirl = True
            thistoolMuGirl_dRDown.ApplyScaleFactors = doClosure
            thistoolMuGirl_dRDown.IsNominal = False
            thistoolMuGirl_dRDown.MaximumDrCut = 0.5 * MATCH_DR
            MatchingTools += [thistoolMuGirl_dRDown]

            thistoolMuGirl_dRUp = CommonMuonTPConfig.AddMuonRecoTPEfficiencyTool(
                name="ZmumuTPEfficiencyTool_%s_MuidGirl_dRUp" % name_suffix,
                EffiFlag="MuGirl_dRUp")
            thistoolMuGirl_dRUp.MatchToMuGirl = True
            thistoolMuGirl_dRUp.IsNominal = False
            thistoolMuGirl_dRUp.ApplyScaleFactors = doClosure
            thistoolMuGirl_dRUp.MaximumDrCut = 2 * MATCH_DR
            MatchingTools += [thistoolMuGirl_dRUp]

    ntuples = []
    if writeNtuple:
        ntuples.append(
            CommonMuonTPConfig.AddTreeTool(name="ZmumuTPTreeTool_%s" %
                                           name_suffix,
                                           EffiFlag="Trees",
                                           WriteSFInfo=doClosure))

    # create the TP tool itself
    TheTPTool = CommonMuonTPConfig.AddMuonTPTool(name="ZmumuTPTool_%s" %
                                                 name_suffix,
                                                 EffiFlag=name_suffix)
    TheTPTool.MuonTPSelectionTools = SelectionTools
    TheTPTool.PlottingTools = PlotTools
    TheTPTool.MuonTPEfficiencyTools = MatchingTools
    TheTPTool.TreeTools = ntuples
    theAlg.MuonTPTools += [TheTPTool]