def theConfig(Nj, mcdir='', initFile='', mH=400, mvaCut=None, qgCut=None):
    if Nj == 3:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars3)
    else:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars2)

    mvaVarNames = optPars[1]
    mvaCutValues = optPars[2]
    HWWconfig.minMlvjj = optPars[3]
    HWWconfig.maxMlvjj = optPars[4]

    fitterPars = HWWconfig.theConfig(Nj, mcdir, initFile)
    fitterPars.includeMuons = False
    fitterPars.includeElectrons = True

    fitterPars.cuts += '&& (abs(JetPFCor_dphiMET[0])>0.8) ' + \
        '&& (W_electron_pt > 35) '
    fitterPars.QCDcuts = fitterPars.cuts + '&& (W_electron_pfIsoEA > 0.3) '

    if (mvaCut):
        mvaCutValues = mvaCut

    fitterPars.cuts += '&& (%s > %f) ' % (mvaVarNames,mvaCutValues) + \
                      '&& (fit_mlvjj > %0.1f) && (fit_mlvjj < %0.1f) ' % \
                      (optPars[3], optPars[4])

    # if not qgCut:
    #     qgCut = optPars[11]
    # fitterPars.cuts += '&& (%s > %f) ' % ("qgld_Summer11CHS[1]",qgCut)

    print '2-body cuts:', fitterPars.cuts

    return fitterPars
def the4BodyConfig(twoBodyConfig, mH=400, syst=0, alphaOverride = None):
    if twoBodyConfig.njets == 3:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars3)
    else:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars2)
    HWWconfig.minMlvjj = optPars[3]
    HWWconfig.maxMlvjj = optPars[4]
    alpha = optPars[6+syst]
    alphaDown = optPars[6+1]
    alphaUp = optPars[6+2]
    if alphaOverride:
        alpha = alphaOverride
        alphaDown = alphaOverride
        alphaUp = alphaOverride
    fitterPars = HWWconfig.the4BodyConfig(twoBodyConfig, alpha, optPars[9],
                                          optPars[10],
                                          alphaRange = (alphaDown,alphaUp))
    fitterPars.nbins = optPars[5]
    fitterPars.model = 1
    if (mH >= 500) and (twoBodyConfig.njets == 2):
        fitterPars.model = 1
    if (mH <= 200): # and (twoBodyConfig.njets == 2):
        fitterPars.model = 7
    if (mH <= 170):
        fitterPars.model = 7
    if (mH <= 250) and (twoBodyConfig.njets == 3):
        fitterPars.model = 5
    return fitterPars
def the4BodyConfig(twoBodyConfig, mH=400, syst=0, alphaOverride=None):
    if twoBodyConfig.njets == 3:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars3)
    else:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars2)
    HWWconfig.minMlvjj = optPars[3]
    HWWconfig.maxMlvjj = optPars[4]
    alpha = optPars[6 + syst]
    alphaDown = optPars[6 + 1]
    alphaUp = optPars[6 + 2]
    if alphaOverride:
        alpha = alphaOverride
        alphaDown = alphaOverride
        alphaUp = alphaOverride
    fitterPars = HWWconfig.the4BodyConfig(twoBodyConfig,
                                          alpha,
                                          optPars[9],
                                          optPars[10],
                                          alphaRange=(alphaDown, alphaUp))
    fitterPars.nbins = optPars[5]
    fitterPars.model = 1
    if (mH <= 200):  # and (twoBodyConfig.njets == 2):
        fitterPars.model = 7
    if (mH <= 170):
        fitterPars.model = 7
    if (mH <= 180) and (twoBodyConfig.njets == 2):
        fitterPars.model = 5
    if (mH <= 250) and (twoBodyConfig.njets == 3):
        fitterPars.model = 5

    return fitterPars
def theConfig(Nj, mcdir = '', initFile = '', mH=400, mvaCut = None,
              qgCut = None):

    if Nj == 3:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars3)
    else:
        optPars = HWWconfig.getOptimalPars(mH, optimalPars2)
    
    mvaVarNames  = optPars[1]
    mvaCutValues = optPars[2]
    HWWconfig.minMlvjj = optPars[3]
    HWWconfig.maxMlvjj = optPars[4]

    fitterPars = HWWconfig.theConfig(Nj, mcdir, initFile)
    fitterPars.includeMuons = True
    fitterPars.includeElectrons = False

    if (mH == 500) and (len(initFile) > 0):
        fitterPars.constraintParamsFile = initFile
        fitterPars.constrainWpJShape = True
    fitterPars.cuts += '&& (abs(JetPFCor_dphiMET[0])>0.4) ' + \
        '&& (abs(W_muon_eta) < 2.1) '
    fitterPars.QCDcuts = fitterPars.cuts #+ '&& (W_muon_pfIsoEA > 0.3) '

    if mvaCut:
        mvaCutValues = mvaCut
    
    fitterPars.cuts += '&& (%s > %f) ' % (mvaVarNames,mvaCutValues) + \
                      '&& (fit_mlvjj > %0.1f) && (fit_mlvjj < %0.1f) ' % \
                      (optPars[3], optPars[4])

    # if not qgCut:
    #     qgCut = optPars[11]
    # fitterPars.cuts += '&& (%s > %f) ' % ("qgld_Summer11CHS[1]",qgCut)

    print '2-body cuts:', fitterPars.cuts
    
    return fitterPars